@@ -13,8 +13,11 @@ const {
1313const RuntimeGlobals = require ( "./RuntimeGlobals" ) ;
1414const ConstDependency = require ( "./dependencies/ConstDependency" ) ;
1515
16+ /** @typedef {import("estree").CallExpression } CallExpression */
1617/** @typedef {import("./Compiler") } Compiler */
18+ /** @typedef {import("./Dependency").DependencyLocation } DependencyLocation */
1719/** @typedef {import("./javascript/JavascriptParser") } JavascriptParser */
20+ /** @typedef {import("./javascript/JavascriptParser").Range } Range */
1821
1922const nestedWebpackIdentifierTag = Symbol ( "nested webpack identifier" ) ;
2023const PLUGIN_NAME = "CompatibilityPlugin" ;
@@ -43,31 +46,41 @@ class CompatibilityPlugin {
4346 )
4447 return ;
4548
46- parser . hooks . call . for ( "require" ) . tap ( PLUGIN_NAME , expr => {
47- // support for browserify style require delegator: "require(o, !0)"
48- if ( expr . arguments . length !== 2 ) return ;
49- const second = parser . evaluateExpression ( expr . arguments [ 1 ] ) ;
50- if ( ! second . isBoolean ( ) ) return ;
51- if ( second . asBool ( ) !== true ) return ;
52- const dep = new ConstDependency ( "require" , expr . callee . range ) ;
53- dep . loc = expr . loc ;
54- if ( parser . state . current . dependencies . length > 0 ) {
55- const last =
56- parser . state . current . dependencies [
57- parser . state . current . dependencies . length - 1
58- ] ;
59- if (
60- last . critical &&
61- last . options &&
62- last . options . request === "." &&
63- last . userRequest === "." &&
64- last . options . recursive
65- )
66- parser . state . current . dependencies . pop ( ) ;
49+ parser . hooks . call . for ( "require" ) . tap (
50+ PLUGIN_NAME ,
51+ /**
52+ * @param {CallExpression } expr call expression
53+ * @returns {boolean | void } true when need to handle
54+ */
55+ expr => {
56+ // support for browserify style require delegator: "require(o, !0)"
57+ if ( expr . arguments . length !== 2 ) return ;
58+ const second = parser . evaluateExpression ( expr . arguments [ 1 ] ) ;
59+ if ( ! second . isBoolean ( ) ) return ;
60+ if ( second . asBool ( ) !== true ) return ;
61+ const dep = new ConstDependency (
62+ "require" ,
63+ /** @type {Range } */ ( expr . callee . range )
64+ ) ;
65+ dep . loc = /** @type {DependencyLocation } */ ( expr . loc ) ;
66+ if ( parser . state . current . dependencies . length > 0 ) {
67+ const last =
68+ parser . state . current . dependencies [
69+ parser . state . current . dependencies . length - 1
70+ ] ;
71+ if (
72+ last . critical &&
73+ last . options &&
74+ last . options . request === "." &&
75+ last . userRequest === "." &&
76+ last . options . recursive
77+ )
78+ parser . state . current . dependencies . pop ( ) ;
79+ }
80+ parser . state . module . addPresentationalDependency ( dep ) ;
81+ return true ;
6782 }
68- parser . state . module . addPresentationalDependency ( dep ) ;
69- return true ;
70- } ) ;
83+ ) ;
7184 } ) ;
7285
7386 /**
@@ -82,7 +95,9 @@ class CompatibilityPlugin {
8295 statement . id &&
8396 statement . id . name === RuntimeGlobals . require
8497 ) {
85- const newName = `__nested_webpack_require_${ statement . range [ 0 ] } __` ;
98+ const newName = `__nested_webpack_require_${
99+ /** @type {Range } */ ( statement . range ) [ 0 ]
100+ } __`;
86101 parser . tagVariable (
87102 statement . id . name ,
88103 nestedWebpackIdentifierTag ,
@@ -101,7 +116,9 @@ class CompatibilityPlugin {
101116 parser . hooks . pattern
102117 . for ( RuntimeGlobals . require )
103118 . tap ( PLUGIN_NAME , pattern => {
104- const newName = `__nested_webpack_require_${ pattern . range [ 0 ] } __` ;
119+ const newName = `__nested_webpack_require_${
120+ /** @type {Range } */ ( pattern . range ) [ 0 ]
121+ } __`;
105122 parser . tagVariable ( pattern . name , nestedWebpackIdentifierTag , {
106123 name : newName ,
107124 declaration : {
@@ -135,8 +152,11 @@ class CompatibilityPlugin {
135152 parser . state . module . addPresentationalDependency ( dep ) ;
136153 declaration . updated = true ;
137154 }
138- const dep = new ConstDependency ( name , expr . range ) ;
139- dep . loc = expr . loc ;
155+ const dep = new ConstDependency (
156+ name ,
157+ /** @type {Range } */ ( expr . range )
158+ ) ;
159+ dep . loc = /** @type {DependencyLocation } */ ( expr . loc ) ;
140160 parser . state . module . addPresentationalDependency ( dep ) ;
141161 return true ;
142162 } ) ;
@@ -145,11 +165,11 @@ class CompatibilityPlugin {
145165 parser . hooks . program . tap ( PLUGIN_NAME , ( program , comments ) => {
146166 if ( comments . length === 0 ) return ;
147167 const c = comments [ 0 ] ;
148- if ( c . type === "Line" && c . range [ 0 ] === 0 ) {
168+ if ( c . type === "Line" && /** @type { Range } */ ( c . range ) [ 0 ] === 0 ) {
149169 if ( parser . state . source . slice ( 0 , 2 ) . toString ( ) !== "#!" ) return ;
150170 // this is a hashbang comment
151171 const dep = new ConstDependency ( "//" , 0 ) ;
152- dep . loc = c . loc ;
172+ dep . loc = /** @type { DependencyLocation } */ ( c . loc ) ;
153173 parser . state . module . addPresentationalDependency ( dep ) ;
154174 }
155175 } ) ;
0 commit comments