diff --git a/declarations/LoaderContext.d.ts b/declarations/LoaderContext.d.ts index f93a0890d2d..23baff0f885 100644 --- a/declarations/LoaderContext.d.ts +++ b/declarations/LoaderContext.d.ts @@ -187,6 +187,7 @@ export interface LoaderRunnerLoaderContext { data: object | undefined; pitchExecuted: boolean; normalExecuted: boolean; + type?: "commonjs" | "module" | undefined; }[]; /** diff --git a/lib/NormalModuleFactory.js b/lib/NormalModuleFactory.js index f02e5712849..9eb4437fbd5 100644 --- a/lib/NormalModuleFactory.js +++ b/lib/NormalModuleFactory.js @@ -994,7 +994,7 @@ If changing the source code is not an option there is also a resolve options cal context, item.loader, resolveContext, - (err, result) => { + (err, result, resolveRequest) => { if ( err && /^[^/]*$/.test(item.loader) && @@ -1021,8 +1021,18 @@ If changing the source code is not an option there is also a resolve options cal if (err) return callback(err); const parsedResult = this._parseResourceWithoutFragment(result); + + const type = /\.mjs$/i.test(parsedResult.path) + ? "module" + : /\.cjs$/i.test(parsedResult.path) + ? "commonjs" + : resolveRequest.descriptionFileData === undefined + ? undefined + : resolveRequest.descriptionFileData.type; + const resolved = { loader: parsedResult.path, + type, options: item.options === undefined ? parsedResult.query diff --git a/test/cases/loaders/_esm-loader-type/index.js b/test/cases/loaders/_esm-loader-type/index.js new file mode 100644 index 00000000000..5545f1b4ff5 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/index.js @@ -0,0 +1,9 @@ +it("should pass package.json type to loader", function () { + expect(require("esm/loader.js!")).toBe("module"); +}); + +it("should pass 'module' type to loader for .mjs", function () { + expect(require("cjs/loader.mjs!")).toBe("module"); + expect(require("esm/loader.mjs!")).toBe("module"); + expect(require("./loader.mjs!")).toBe("module"); +}); diff --git a/test/cases/loaders/_esm-loader-type/loader.mjs b/test/cases/loaders/_esm-loader-type/loader.mjs new file mode 100644 index 00000000000..58914cd70e5 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/loader.mjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +export default function loader() { + return `export default "${this.loaders[this.loaderIndex].type}";`; +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/cjs/loader.mjs b/test/cases/loaders/_esm-loader-type/node_modules/cjs/loader.mjs new file mode 100644 index 00000000000..35c1f17332d --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/cjs/loader.mjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +export default function loader() { + return `export default "${this.loaders[this.loaderIndex].type}";`; +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/cjs/package.json b/test/cases/loaders/_esm-loader-type/node_modules/cjs/package.json new file mode 100644 index 00000000000..5b56c70baa3 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/cjs/package.json @@ -0,0 +1,4 @@ +{ + "name": "cjs-package", + "type": "commonjs" +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.js b/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.js new file mode 100644 index 00000000000..58914cd70e5 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +export default function loader() { + return `export default "${this.loaders[this.loaderIndex].type}";`; +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.mjs b/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.mjs new file mode 100644 index 00000000000..35c1f17332d --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.mjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +export default function loader() { + return `export default "${this.loaders[this.loaderIndex].type}";`; +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/esm/package.json b/test/cases/loaders/_esm-loader-type/node_modules/esm/package.json new file mode 100644 index 00000000000..64069d2b941 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/esm/package.json @@ -0,0 +1,4 @@ +{ + "name": "esm-package", + "type": "module" +} diff --git a/test/cases/loaders/_esm-loader-type/test.filter.js b/test/cases/loaders/_esm-loader-type/test.filter.js new file mode 100644 index 00000000000..7cc1b5dd3d5 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/test.filter.js @@ -0,0 +1,5 @@ +module.exports = function (config) { + // TODO need fix in v8 https://github.com/nodejs/node/issues/35889 + // TODO otherwise this test case cause segment fault + return false; +}; diff --git a/test/cases/loaders/cjs-loader-type/index.js b/test/cases/loaders/cjs-loader-type/index.js new file mode 100644 index 00000000000..9bda36284e3 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/index.js @@ -0,0 +1,12 @@ +it("should pass package.json type to loader", function () { + expect(require("cjs/loader.js!")).toBe("commonjs"); + expect(require("./loader.js!")).toBe("undefined"); +}); + +it("should pass 'commonjs' type to loader for .cjs", function () { + expect(require("cjs/loader.cjs!")).toBe("commonjs"); + expect(require("./loader.cjs!")).toBe("commonjs"); + // TODO need fix in v8 https://github.com/nodejs/node/issues/35889 + // TODO otherwise this test case cause segment fault + // expect(require("esm/loader.cjs!")).toBe("commonjs"); +}); diff --git a/test/cases/loaders/cjs-loader-type/loader.cjs b/test/cases/loaders/cjs-loader-type/loader.cjs new file mode 100644 index 00000000000..94974dcfad5 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/loader.cjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/loader.js b/test/cases/loaders/cjs-loader-type/loader.js new file mode 100644 index 00000000000..94974dcfad5 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.cjs b/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.cjs new file mode 100644 index 00000000000..b47e68eb16c --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.cjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.js b/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.js new file mode 100644 index 00000000000..b47e68eb16c --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/node_modules/cjs/package.json b/test/cases/loaders/cjs-loader-type/node_modules/cjs/package.json new file mode 100644 index 00000000000..5b56c70baa3 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/cjs/package.json @@ -0,0 +1,4 @@ +{ + "name": "cjs-package", + "type": "commonjs" +} diff --git a/test/cases/loaders/cjs-loader-type/node_modules/esm/loader.cjs b/test/cases/loaders/cjs-loader-type/node_modules/esm/loader.cjs new file mode 100644 index 00000000000..b47e68eb16c --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/esm/loader.cjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/node_modules/esm/package.json b/test/cases/loaders/cjs-loader-type/node_modules/esm/package.json new file mode 100644 index 00000000000..64069d2b941 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/esm/package.json @@ -0,0 +1,4 @@ +{ + "name": "esm-package", + "type": "module" +} diff --git a/types.d.ts b/types.d.ts index 44cd3b9f841..d26c5659ac5 100644 --- a/types.d.ts +++ b/types.d.ts @@ -6570,6 +6570,7 @@ declare interface LoaderRunnerLoaderContext { data?: object; pitchExecuted: boolean; normalExecuted: boolean; + type?: "module" | "commonjs"; }[]; /**