@@ -20,6 +20,7 @@ const propertyAccess = require("../util/propertyAccess");
2020const ConstDependency = require ( "./ConstDependency" ) ;
2121
2222/** @typedef {import("estree").MemberExpression } MemberExpression */
23+ /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions } JavascriptParserOptions */
2324/** @typedef {import("../Compiler") } Compiler */
2425/** @typedef {import("../NormalModule") } NormalModule */
2526/** @typedef {import("../javascript/JavascriptParser") } Parser */
@@ -29,18 +30,10 @@ const getCriticalDependencyWarning = memoize(() =>
2930) ;
3031
3132class ImportMetaPlugin {
32- /**
33- * @param {import("../../declarations/WebpackOptions").ImportMeta } options options
34- */
35- constructor ( options ) {
36- this . options = options ;
37- }
38-
3933 /**
4034 * @param {Compiler } compiler compiler
4135 */
4236 apply ( compiler ) {
43- const options = this . options ;
4437 compiler . hooks . compilation . tap (
4538 "ImportMetaPlugin" ,
4639 ( compilation , { normalModuleFactory } ) => {
@@ -52,12 +45,38 @@ class ImportMetaPlugin {
5245 return pathToFileURL ( module . resource ) . toString ( ) ;
5346 } ;
5447 /**
55- * @param {Parser } parser parser
56- * @param {Object } parserOptions parserOptions
48+ * @param {Parser } parser parser parser
49+ * @param {JavascriptParserOptions } parserOptions parserOptions
5750 * @returns {void }
5851 */
59- const parserHandler = ( parser , parserOptions ) => {
60- if ( options === false ) return ;
52+ const parserHandler = ( parser , { importMeta } ) => {
53+ if ( importMeta === false ) {
54+ const { importMetaName } = compilation . outputOptions ;
55+
56+ parser . hooks . expression
57+ . for ( "import.meta" )
58+ . tap ( "ImportMetaPlugin" , metaProperty => {
59+ const dep = new ConstDependency (
60+ importMetaName ,
61+ metaProperty . range
62+ ) ;
63+ dep . loc = metaProperty . loc ;
64+ parser . state . module . addPresentationalDependency ( dep ) ;
65+ return true ;
66+ } ) ;
67+ parser . hooks . unhandledExpressionMemberChain
68+ . for ( "import.meta" )
69+ . tap ( "ImportMetaPlugin" , ( expr , members ) => {
70+ const dep = new ConstDependency (
71+ `${ importMetaName } ${ propertyAccess ( members , 0 ) } ` ,
72+ expr . range
73+ ) ;
74+ dep . loc = expr . loc ;
75+ parser . state . module . addPresentationalDependency ( dep ) ;
76+ return true ;
77+ } ) ;
78+ return ;
79+ }
6180
6281 /// import.meta direct ///
6382 parser . hooks . typeof
@@ -105,27 +124,25 @@ class ImportMetaPlugin {
105124 parser . hooks . expression
106125 . for ( "import.meta.url" )
107126 . tap ( "ImportMetaPlugin" , expr => {
108- if ( options . url ) {
109- const dep = new ConstDependency (
110- JSON . stringify ( getUrl ( parser . state . module ) ) ,
111- expr . range
112- ) ;
113- dep . loc = expr . loc ;
114- parser . state . module . addPresentationalDependency ( dep ) ;
115- }
127+ const dep = new ConstDependency (
128+ JSON . stringify ( getUrl ( parser . state . module ) ) ,
129+ expr . range
130+ ) ;
131+ dep . loc = expr . loc ;
132+ parser . state . module . addPresentationalDependency ( dep ) ;
116133 return true ;
117134 } ) ;
118135 parser . hooks . evaluateTypeof
119136 . for ( "import.meta.url" )
120137 . tap ( "ImportMetaPlugin" , evaluateToString ( "string" ) ) ;
121-
122138 parser . hooks . evaluateIdentifier
123139 . for ( "import.meta.url" )
124140 . tap ( "ImportMetaPlugin" , expr => {
125141 return new BasicEvaluatedExpression ( )
126142 . setString ( getUrl ( parser . state . module ) )
127143 . setRange ( expr . range ) ;
128144 } ) ;
145+
129146 /// import.meta.webpack ///
130147 const webpackVersion = parseInt (
131148 require ( "../../package.json" ) . version ,
0 commit comments