Skip to content

Commit

Permalink
Merge pull request #15198 from stefanprobst/fix/pass-package-type-to-…
Browse files Browse the repository at this point in the history
…loader-runner

fix: pass package type to loader runner
  • Loading branch information
TheLarkInn committed Apr 19, 2023
2 parents 8ce07a1 + 65d1742 commit 06d5e56
Show file tree
Hide file tree
Showing 19 changed files with 91 additions and 1 deletion.
1 change: 1 addition & 0 deletions declarations/LoaderContext.d.ts
Expand Up @@ -187,6 +187,7 @@ export interface LoaderRunnerLoaderContext<OptionsType> {
data: object | undefined;
pitchExecuted: boolean;
normalExecuted: boolean;
type?: "commonjs" | "module" | undefined;
}[];

/**
Expand Down
12 changes: 11 additions & 1 deletion lib/NormalModuleFactory.js
Expand Up @@ -1020,7 +1020,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) &&
Expand All @@ -1047,8 +1047,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
Expand Down
9 changes: 9 additions & 0 deletions 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");
});
4 changes: 4 additions & 0 deletions 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}";`;
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions 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;
};
12 changes: 12 additions & 0 deletions 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");
});
4 changes: 4 additions & 0 deletions 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}";`;
};
4 changes: 4 additions & 0 deletions 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}";`;
};

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions types.d.ts
Expand Up @@ -6589,6 +6589,7 @@ declare interface LoaderRunnerLoaderContext<OptionsType> {
data?: object;
pitchExecuted: boolean;
normalExecuted: boolean;
type?: "module" | "commonjs";
}[];

/**
Expand Down

0 comments on commit 06d5e56

Please sign in to comment.