diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2023-10-31 15:37:35 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2023-10-31 15:37:35 +0800 |
| commit | d5f14083061f2ce6a42313188443a42e30796320 (patch) | |
| tree | cc6a9889e08b29595a76a33b9e7b4ef84866468b /node_modules/webpack/lib/dependencies/ImportMetaPlugin.js | |
| parent | b1a6ea021f29f182b62f9f81024a3d8ac8621b7f (diff) | |
added make browserlist(autoprefixer) work fixed
Diffstat (limited to 'node_modules/webpack/lib/dependencies/ImportMetaPlugin.js')
| -rw-r--r-- | node_modules/webpack/lib/dependencies/ImportMetaPlugin.js | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/dependencies/ImportMetaPlugin.js b/node_modules/webpack/lib/dependencies/ImportMetaPlugin.js new file mode 100644 index 00000000..27d3b60c --- /dev/null +++ b/node_modules/webpack/lib/dependencies/ImportMetaPlugin.js @@ -0,0 +1,255 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Ivan Kopeykin @vankop +*/ + +"use strict"; + +const { pathToFileURL } = require("url"); +const ModuleDependencyWarning = require("../ModuleDependencyWarning"); +const { + JAVASCRIPT_MODULE_TYPE_AUTO, + JAVASCRIPT_MODULE_TYPE_ESM +} = require("../ModuleTypeConstants"); +const Template = require("../Template"); +const BasicEvaluatedExpression = require("../javascript/BasicEvaluatedExpression"); +const { + evaluateToIdentifier, + toConstantDependency, + evaluateToString, + evaluateToNumber +} = require("../javascript/JavascriptParserHelpers"); +const memoize = require("../util/memoize"); +const propertyAccess = require("../util/propertyAccess"); +const ConstDependency = require("./ConstDependency"); + +/** @typedef {import("estree").MemberExpression} MemberExpression */ +/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */ +/** @typedef {import("../Compiler")} Compiler */ +/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */ +/** @typedef {import("../NormalModule")} NormalModule */ +/** @typedef {import("../javascript/JavascriptParser")} Parser */ +/** @typedef {import("../javascript/JavascriptParser").Range} Range */ + +const getCriticalDependencyWarning = memoize(() => + require("./CriticalDependencyWarning") +); + +const PLUGIN_NAME = "ImportMetaPlugin"; + +class ImportMetaPlugin { + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.compilation.tap( + PLUGIN_NAME, + (compilation, { normalModuleFactory }) => { + /** + * @param {NormalModule} module module + * @returns {string} file url + */ + const getUrl = module => { + return pathToFileURL(module.resource).toString(); + }; + /** + * @param {Parser} parser parser parser + * @param {JavascriptParserOptions} parserOptions parserOptions + * @returns {void} + */ + const parserHandler = (parser, { importMeta }) => { + if (importMeta === false) { + const { importMetaName } = compilation.outputOptions; + if (importMetaName === "import.meta") return; + + parser.hooks.expression + .for("import.meta") + .tap(PLUGIN_NAME, metaProperty => { + const dep = new ConstDependency( + /** @type {string} */ (importMetaName), + /** @type {Range} */ (metaProperty.range) + ); + dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc); + parser.state.module.addPresentationalDependency(dep); + return true; + }); + return; + } + + /// import.meta direct /// + const webpackVersion = parseInt( + require("../../package.json").version, + 10 + ); + const importMetaUrl = () => + JSON.stringify(getUrl(parser.state.module)); + const importMetaWebpackVersion = () => JSON.stringify(webpackVersion); + /** + * @param {string[]} members members + * @returns {string} error message + */ + const importMetaUnknownProperty = members => + `${Template.toNormalComment( + "unsupported import.meta." + members.join(".") + )} undefined${propertyAccess(members, 1)}`; + parser.hooks.typeof + .for("import.meta") + .tap( + PLUGIN_NAME, + toConstantDependency(parser, JSON.stringify("object")) + ); + parser.hooks.expression + .for("import.meta") + .tap(PLUGIN_NAME, metaProperty => { + const referencedPropertiesInDestructuring = + parser.destructuringAssignmentPropertiesFor(metaProperty); + if (!referencedPropertiesInDestructuring) { + const CriticalDependencyWarning = + getCriticalDependencyWarning(); + parser.state.module.addWarning( + new ModuleDependencyWarning( + parser.state.module, + new CriticalDependencyWarning( + "Accessing import.meta directly is unsupported (only property access or destructuring is supported)" + ), + /** @type {DependencyLocation} */ (metaProperty.loc) + ) + ); + const dep = new ConstDependency( + `${ + parser.isAsiPosition( + /** @type {Range} */ (metaProperty.range)[0] + ) + ? ";" + : "" + }({})`, + /** @type {Range} */ (metaProperty.range) + ); + dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc); + parser.state.module.addPresentationalDependency(dep); + return true; + } + + let str = ""; + for (const prop of referencedPropertiesInDestructuring) { + switch (prop) { + case "url": + str += `url: ${importMetaUrl()},`; + break; + case "webpack": + str += `webpack: ${importMetaWebpackVersion()},`; + break; + default: + str += `[${JSON.stringify( + prop + )}]: ${importMetaUnknownProperty([prop])},`; + break; + } + } + const dep = new ConstDependency( + `({${str}})`, + /** @type {Range} */ (metaProperty.range) + ); + dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc); + parser.state.module.addPresentationalDependency(dep); + return true; + }); + parser.hooks.evaluateTypeof + .for("import.meta") + .tap(PLUGIN_NAME, evaluateToString("object")); + parser.hooks.evaluateIdentifier.for("import.meta").tap( + PLUGIN_NAME, + evaluateToIdentifier("import.meta", "import.meta", () => [], true) + ); + + /// import.meta.url /// + parser.hooks.typeof + .for("import.meta.url") + .tap( + PLUGIN_NAME, + toConstantDependency(parser, JSON.stringify("string")) + ); + parser.hooks.expression + .for("import.meta.url") + .tap(PLUGIN_NAME, expr => { + const dep = new ConstDependency( + importMetaUrl(), + /** @type {Range} */ (expr.range) + ); + dep.loc = /** @type {DependencyLocation} */ (expr.loc); + parser.state.module.addPresentationalDependency(dep); + return true; + }); + parser.hooks.evaluateTypeof + .for("import.meta.url") + .tap(PLUGIN_NAME, evaluateToString("string")); + parser.hooks.evaluateIdentifier + .for("import.meta.url") + .tap(PLUGIN_NAME, expr => { + return new BasicEvaluatedExpression() + .setString(getUrl(parser.state.module)) + .setRange(/** @type {Range} */ (expr.range)); + }); + + /// import.meta.webpack /// + parser.hooks.typeof + .for("import.meta.webpack") + .tap( + PLUGIN_NAME, + toConstantDependency(parser, JSON.stringify("number")) + ); + parser.hooks.expression + .for("import.meta.webpack") + .tap( + PLUGIN_NAME, + toConstantDependency(parser, importMetaWebpackVersion()) + ); + parser.hooks.evaluateTypeof + .for("import.meta.webpack") + .tap(PLUGIN_NAME, evaluateToString("number")); + parser.hooks.evaluateIdentifier + .for("import.meta.webpack") + .tap(PLUGIN_NAME, evaluateToNumber(webpackVersion)); + + /// Unknown properties /// + parser.hooks.unhandledExpressionMemberChain + .for("import.meta") + .tap(PLUGIN_NAME, (expr, members) => { + const dep = new ConstDependency( + importMetaUnknownProperty(members), + /** @type {Range} */ (expr.range) + ); + dep.loc = /** @type {DependencyLocation} */ (expr.loc); + parser.state.module.addPresentationalDependency(dep); + return true; + }); + parser.hooks.evaluate + .for("MemberExpression") + .tap(PLUGIN_NAME, expression => { + const expr = /** @type {MemberExpression} */ (expression); + if ( + expr.object.type === "MetaProperty" && + expr.object.meta.name === "import" && + expr.object.property.name === "meta" && + expr.property.type === + (expr.computed ? "Literal" : "Identifier") + ) { + return new BasicEvaluatedExpression() + .setUndefined() + .setRange(/** @type {Range} */ (expr.range)); + } + }); + }; + + normalModuleFactory.hooks.parser + .for(JAVASCRIPT_MODULE_TYPE_AUTO) + .tap(PLUGIN_NAME, parserHandler); + normalModuleFactory.hooks.parser + .for(JAVASCRIPT_MODULE_TYPE_ESM) + .tap(PLUGIN_NAME, parserHandler); + } + ); + } +} + +module.exports = ImportMetaPlugin; |
