@@ -14,6 +14,7 @@ const {
1414 expressionIsUnsupported,
1515 toConstantDependency
1616} = require ( "../javascript/JavascriptParserHelpers" ) ;
17+ const traverseDestructuringAssignmentProperties = require ( "../util/traverseDestructuringAssignmentProperties" ) ;
1718const CommonJsFullRequireDependency = require ( "./CommonJsFullRequireDependency" ) ;
1819const CommonJsRequireContextDependency = require ( "./CommonJsRequireContextDependency" ) ;
1920const CommonJsRequireDependency = require ( "./CommonJsRequireDependency" ) ;
@@ -31,6 +32,7 @@ const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency
3132/** @typedef {import("estree").NewExpression } NewExpression */
3233/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions } JavascriptParserOptions */
3334/** @typedef {import("../Dependency").DependencyLocation } DependencyLocation */
35+ /** @typedef {import("../Dependency").RawReferencedExports } RawReferencedExports */
3436/** @typedef {import("../javascript/JavascriptParser") } JavascriptParser */
3537/** @typedef {import("../javascript/BasicEvaluatedExpression") } BasicEvaluatedExpression */
3638/** @typedef {import("../javascript/JavascriptParser").ImportSource } ImportSource */
@@ -47,6 +49,48 @@ const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency
4749
4850const PLUGIN_NAME = "CommonJsImportsParserPlugin" ;
4951
52+ /**
53+ * @param {Expression } expression expression
54+ * @returns {boolean } true, when expression is `require(...)` or `module.require(...)`
55+ */
56+ const isRequireCallExpression = ( expression ) => {
57+ if ( expression . type !== "CallExpression" ) return false ;
58+ const { callee } = expression ;
59+ if ( callee . type === "Identifier" ) {
60+ return callee . name === "require" ;
61+ }
62+ if ( callee . type === "MemberExpression" && ! callee . computed ) {
63+ const object = callee . object ;
64+ const property = callee . property ;
65+ return (
66+ object . type === "Identifier" &&
67+ object . name === "module" &&
68+ property . type === "Identifier" &&
69+ property . name === "require"
70+ ) ;
71+ }
72+ return false ;
73+ } ;
74+
75+ /**
76+ * @param {JavascriptParser } parser parser
77+ * @param {CallExpression | NewExpression } expr expression
78+ * @returns {RawReferencedExports | null } referenced exports from destructuring
79+ */
80+ const getRequireReferencedExportsFromDestructuring = ( parser , expr ) => {
81+ const referencedPropertiesInDestructuring =
82+ parser . destructuringAssignmentPropertiesFor ( expr ) ;
83+ if ( ! referencedPropertiesInDestructuring ) return null ;
84+
85+ /** @type {RawReferencedExports } */
86+ const referencedExports = [ ] ;
87+ traverseDestructuringAssignmentProperties (
88+ referencedPropertiesInDestructuring ,
89+ ( stack ) => referencedExports . push ( stack . map ( ( p ) => p . id ) )
90+ ) ;
91+ return referencedExports ;
92+ } ;
93+
5094/**
5195 * @param {JavascriptParser } parser parser
5296 * @returns {(expr: Expression) => boolean } handler
@@ -101,10 +145,15 @@ const createRequireCallHandler = (parser, options, getContext) => {
101145 */
102146 const processRequireItem = ( expr , param ) => {
103147 if ( param . isString ( ) ) {
148+ const referencedExports = getRequireReferencedExportsFromDestructuring (
149+ parser ,
150+ expr
151+ ) ;
104152 const dep = new CommonJsRequireDependency (
105153 /** @type {string } */ ( param . string ) ,
106154 /** @type {Range } */ ( param . range ) ,
107- getContext ( )
155+ getContext ( ) ,
156+ referencedExports
108157 ) ;
109158 dep . loc = /** @type {DependencyLocation } */ ( expr . loc ) ;
110159 dep . optional = Boolean ( parser . scope . inTry ) ;
@@ -118,14 +167,19 @@ const createRequireCallHandler = (parser, options, getContext) => {
118167 * @returns {boolean | void } true when handled
119168 */
120169 const processRequireContext = ( expr , param ) => {
170+ const referencedExports = getRequireReferencedExportsFromDestructuring (
171+ parser ,
172+ expr
173+ ) ;
121174 const dep = ContextDependencyHelpers . create (
122175 CommonJsRequireContextDependency ,
123176 /** @type {Range } */ ( expr . range ) ,
124177 param ,
125178 expr ,
126179 options ,
127180 {
128- category : "commonjs"
181+ category : "commonjs" ,
182+ referencedExports
129183 } ,
130184 parser ,
131185 undefined ,
@@ -353,6 +407,13 @@ class CommonJsImportsParserPlugin {
353407 */
354408 apply ( parser ) {
355409 const options = this . options ;
410+ parser . hooks . collectDestructuringAssignmentProperties . tap (
411+ PLUGIN_NAME ,
412+ ( expr ) => {
413+ if ( isRequireCallExpression ( expr ) ) return true ;
414+ }
415+ ) ;
416+
356417 const getContext = ( ) => {
357418 if ( parser . currentTagData ) {
358419 const { context } =
0 commit comments