Merge pull request #15246 from pavelsavara/import_meta_url

Disable compile time evaluation of import.meta.url
This commit is contained in:
Tobias Koppers 2022-01-28 15:38:19 +01:00 committed by GitHub
commit 46e8639a6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 132 additions and 4 deletions

View File

@ -2949,6 +2949,10 @@ export interface JavascriptParserOptions {
* Specifies the behavior of invalid export names in "import ... from ...". * Specifies the behavior of invalid export names in "import ... from ...".
*/ */
importExportsPresence?: "error" | "warn" | "auto" | false; importExportsPresence?: "error" | "warn" | "auto" | false;
/**
* Enable/disable evaluating import.meta.
*/
importMeta?: boolean;
/** /**
* Include polyfills or mocks for various node stuff. * Include polyfills or mocks for various node stuff.
*/ */

View File

@ -469,6 +469,7 @@ const applyJavascriptParserOptionsDefaults = (
D(parserOptions, "wrappedContextRecursive", true); D(parserOptions, "wrappedContextRecursive", true);
D(parserOptions, "wrappedContextCritical", false); D(parserOptions, "wrappedContextCritical", false);
D(parserOptions, "strictThisContextOnImports", false); D(parserOptions, "strictThisContextOnImports", false);
D(parserOptions, "importMeta", true);
if (futureDefaults) D(parserOptions, "exportsPresence", "error"); if (futureDefaults) D(parserOptions, "exportsPresence", "error");
}; };

View File

@ -20,6 +20,7 @@ const propertyAccess = require("../util/propertyAccess");
const ConstDependency = require("./ConstDependency"); const ConstDependency = require("./ConstDependency");
/** @typedef {import("estree").MemberExpression} MemberExpression */ /** @typedef {import("estree").MemberExpression} MemberExpression */
/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
/** @typedef {import("../Compiler")} Compiler */ /** @typedef {import("../Compiler")} Compiler */
/** @typedef {import("../NormalModule")} NormalModule */ /** @typedef {import("../NormalModule")} NormalModule */
/** @typedef {import("../javascript/JavascriptParser")} Parser */ /** @typedef {import("../javascript/JavascriptParser")} Parser */
@ -44,11 +45,29 @@ class ImportMetaPlugin {
return pathToFileURL(module.resource).toString(); return pathToFileURL(module.resource).toString();
}; };
/** /**
* @param {Parser} parser parser * @param {Parser} parser parser parser
* @param {Object} parserOptions parserOptions * @param {JavascriptParserOptions} parserOptions parserOptions
* @returns {void} * @returns {void}
*/ */
const parserHandler = (parser, parserOptions) => { const parserHandler = (parser, { importMeta }) => {
if (importMeta === false) {
const { importMetaName } = compilation.outputOptions;
if (importMetaName === "import.meta") return;
parser.hooks.expression
.for("import.meta")
.tap("ImportMetaPlugin", metaProperty => {
const dep = new ConstDependency(
importMetaName,
metaProperty.range
);
dep.loc = metaProperty.loc;
parser.state.module.addPresentationalDependency(dep);
return true;
});
return;
}
/// import.meta direct /// /// import.meta direct ///
parser.hooks.typeof parser.hooks.typeof
.for("import.meta") .for("import.meta")

File diff suppressed because one or more lines are too long

View File

@ -1608,6 +1608,10 @@
"description": "Specifies the behavior of invalid export names in \"import ... from ...\".", "description": "Specifies the behavior of invalid export names in \"import ... from ...\".",
"enum": ["error", "warn", "auto", false] "enum": ["error", "warn", "auto", false]
}, },
"importMeta": {
"description": "Enable/disable evaluating import.meta.",
"type": "boolean"
},
"node": { "node": {
"$ref": "#/definitions/Node" "$ref": "#/definitions/Node"
}, },

View File

@ -218,6 +218,7 @@ describe("Defaults", () => {
"exprContextRecursive": true, "exprContextRecursive": true,
"exprContextRegExp": false, "exprContextRegExp": false,
"exprContextRequest": ".", "exprContextRequest": ".",
"importMeta": true,
"strictExportPresence": undefined, "strictExportPresence": undefined,
"strictThisContextOnImports": false, "strictThisContextOnImports": false,
"unknownContextCritical": true, "unknownContextCritical": true,

View File

@ -1612,6 +1612,19 @@ Object {
"multiple": false, "multiple": false,
"simpleType": "string", "simpleType": "string",
}, },
"module-parser-javascript-auto-import-meta": Object {
"configs": Array [
Object {
"description": "Enable/disable evaluating import.meta.",
"multiple": false,
"path": "module.parser.javascript/auto.importMeta",
"type": "boolean",
},
],
"description": "Enable/disable evaluating import.meta.",
"multiple": false,
"simpleType": "boolean",
},
"module-parser-javascript-auto-node": Object { "module-parser-javascript-auto-node": Object {
"configs": Array [ "configs": Array [
Object { Object {
@ -2163,6 +2176,19 @@ Object {
"multiple": false, "multiple": false,
"simpleType": "string", "simpleType": "string",
}, },
"module-parser-javascript-dynamic-import-meta": Object {
"configs": Array [
Object {
"description": "Enable/disable evaluating import.meta.",
"multiple": false,
"path": "module.parser.javascript/dynamic.importMeta",
"type": "boolean",
},
],
"description": "Enable/disable evaluating import.meta.",
"multiple": false,
"simpleType": "boolean",
},
"module-parser-javascript-dynamic-node": Object { "module-parser-javascript-dynamic-node": Object {
"configs": Array [ "configs": Array [
Object { Object {
@ -2675,6 +2701,19 @@ Object {
"multiple": false, "multiple": false,
"simpleType": "string", "simpleType": "string",
}, },
"module-parser-javascript-esm-import-meta": Object {
"configs": Array [
Object {
"description": "Enable/disable evaluating import.meta.",
"multiple": false,
"path": "module.parser.javascript/esm.importMeta",
"type": "boolean",
},
],
"description": "Enable/disable evaluating import.meta.",
"multiple": false,
"simpleType": "boolean",
},
"module-parser-javascript-esm-node": Object { "module-parser-javascript-esm-node": Object {
"configs": Array [ "configs": Array [
Object { Object {
@ -3132,6 +3171,19 @@ Object {
"multiple": false, "multiple": false,
"simpleType": "string", "simpleType": "string",
}, },
"module-parser-javascript-import-meta": Object {
"configs": Array [
Object {
"description": "Enable/disable evaluating import.meta.",
"multiple": false,
"path": "module.parser.javascript.importMeta",
"type": "boolean",
},
],
"description": "Enable/disable evaluating import.meta.",
"multiple": false,
"simpleType": "boolean",
},
"module-parser-javascript-node": Object { "module-parser-javascript-node": Object {
"configs": Array [ "configs": Array [
Object { Object {

View File

@ -1,7 +1,13 @@
import imported from "./imported.mjs"; import imported from "./imported.mjs";
import value from "./module"; import value from "./module";
import { metaUrl } from "./meta";
const localMetaUrl = import.meta.url;
it("should allow to use externals in concatenated modules", () => { it("should allow to use externals in concatenated modules", () => {
expect(imported).toBe(42); expect(imported).toBe(42);
expect(value).toBe(40); expect(value).toBe(40);
}); });
it("all bundled files should have same url, when parser.javascript.importMeta === false", () => {
expect(localMetaUrl).toBe(metaUrl)
});

View File

@ -0,0 +1 @@
export const metaUrl = import.meta.url;

View File

@ -1,5 +1,12 @@
/** @type {import("../../../../").Configuration} */ /** @type {import("../../../../").Configuration} */
module.exports = { module.exports = {
module: {
parser: {
javascript: {
importMeta: false
}
}
},
entry: { entry: {
main: "./index.js", main: "./index.js",
imported: { imported: {

View File

@ -0,0 +1 @@
export const url = import.meta.url;

View File

@ -0,0 +1,9 @@
import { url } from "./a";
it("should evaluate import.meta to pseudoImport.meta", () => {
expect(url).toBe("http://test.co/path/index.js");
});
it("should evaluate import.meta in runtime", () => {
expect(url).toBe(import.meta.url);
});

View File

@ -0,0 +1,5 @@
module.exports = {
moduleScope(scope) {
scope.pseudoImport = { meta: { url: "http://test.co/path/index.js" } };
}
};

View File

@ -0,0 +1,13 @@
/** @type {import("../../../../").Configuration} */
module.exports = {
output: {
importMetaName: "pseudoImport.meta"
},
module: {
parser: {
javascript: {
importMeta: false
}
}
}
};

5
types.d.ts vendored
View File

@ -5472,6 +5472,11 @@ declare interface JavascriptParserOptions {
*/ */
importExportsPresence?: false | "auto" | "error" | "warn"; importExportsPresence?: false | "auto" | "error" | "warn";
/**
* Enable/disable evaluating import.meta.
*/
importMeta?: boolean;
/** /**
* Include polyfills or mocks for various node stuff. * Include polyfills or mocks for various node stuff.
*/ */