WXL
4 天以前 3bd962a6d7f61239c020e2dbbeb7341e5b842dd1
node_modules/webpack/lib/javascript/JavascriptParser.js
@@ -94,11 +94,26 @@
/** @typedef {import("estree").MaybeNamedFunctionDeclaration} MaybeNamedFunctionDeclaration */
/** @typedef {import("estree").MaybeNamedClassDeclaration} MaybeNamedClassDeclaration */
/**
 * Defines the shared type used by this module.
 * @template T
 * @typedef {import("tapable").AsArray<T>} AsArray<T>
 */
/** @typedef {import("../Parser").ParserState} ParserState */
/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
/** @typedef {import("../dependencies/LocalModule")} LocalModule */
/** @typedef {import("../dependencies/HarmonyExportImportedSpecifierDependency").HarmonyStarExportsList} HarmonyStarExportsList */
/**
 * Defines the known javascript parser state type used by this module.
 * @typedef {object} KnownJavascriptParserState
 * @property {Set<string>=} harmonyNamedExports
 * @property {HarmonyStarExportsList=} harmonyStarExports
 * @property {number=} lastHarmonyImportOrder
 * @property {LocalModule[]=} localModules
 */
/** @typedef {ParserState & KnownJavascriptParserState} JavascriptParserState */
/** @typedef {import("../Compilation")} Compilation */
/** @typedef {import("../Module")} Module */
@@ -112,7 +127,7 @@
/** @typedef {Set<DestructuringAssignmentProperty>} DestructuringAssignmentProperties */
// TODO remove cast when @types/estree has been updated to import assertions
/** @typedef {import("estree").ImportExpression & { phase?: "defer" }} ImportExpression */
/** @typedef {import("estree").ImportExpression & { phase?: "defer" | "source" }} ImportExpression */
/** @type {string[]} */
const EMPTY_ARRAY = [];
@@ -126,6 +141,7 @@
const importAssertions = (Parser) =>
   class extends Parser {
      /**
       * Parses with clause.
       * @this {InstanceType<AcornParser>}
       * @returns {ImportAttribute[]} import attributes
       */
@@ -191,6 +207,7 @@
/** @typedef {Record<string, string> & { _isLegacyAssert?: boolean }} ImportAttributes */
/**
 * Gets import attributes.
 * @param {ImportDeclaration | ExportNamedDeclaration | ExportAllDeclaration | ImportExpression} node node with assertions
 * @returns {ImportAttributes | undefined} import attributes
 */
@@ -274,6 +291,7 @@
class VariableInfo {
   /**
    * Creates an instance of VariableInfo.
    * @param {ScopeInfo} declaredScope scope in which the variable is declared
    * @param {string | undefined} name which name the variable use, defined name or free name or tagged name
    * @param {VariableInfoFlagsType} flags how the variable is created
@@ -287,6 +305,7 @@
   }
   /**
    * Checks whether this variable info is free.
    * @returns {boolean} the variable is free or not
    */
   isFree() {
@@ -294,6 +313,7 @@
   }
   /**
    * Checks whether this variable info is tagged.
    * @returns {boolean} the variable is tagged by tagVariable or not
    */
   isTagged() {
@@ -305,13 +325,15 @@
/** @typedef {Literal | string | null | undefined} ImportSource */
/**
 * @typedef {Omit<ParseOptions, "sourceType"> & {sourceType: "module" | "script" | "auto"}} InternalParseOptions
 * Defines the internal parse options type used by this module.
 * @typedef {Omit<ParseOptions, "sourceType" | "ecmaVersion"> & { sourceType: "module" | "script" | "auto" }} InternalParseOptions
 */
/**
 * Defines the parse options type used by this module.
 * @typedef {object} ParseOptions
 * @property {"module" | "script"} sourceType
 * @property {EcmaVersion=} ecmaVersion
 * @property {EcmaVersion} ecmaVersion
 * @property {boolean=} locations
 * @property {boolean=} comments
 * @property {boolean=} ranges
@@ -321,6 +343,7 @@
 */
/**
 * Defines the parse result type used by this module.
 * @typedef {object} ParseResult
 * @property {Program} ast
 * @property {Comment[]} comments
@@ -328,21 +351,24 @@
 */
/**
 * Defines the parse function type used by this module.
 * @typedef {(code: string, options: ParseOptions) => ParseResult} ParseFunction
 */
/** @typedef {symbol} Tag */
/** @typedef {import("../dependencies/HarmonyImportDependencyParserPlugin").HarmonySettings} HarmonySettings */
/** @typedef {import("../dependencies/HarmonyImportDependencyParserPlugin").HarmonySpecifierGuards} HarmonySpecifierGuards */
/** @typedef {import("../dependencies/ImportParserPlugin").ImportSettings} ImportSettings */
/** @typedef {import("../dependencies/CommonJsImportsParserPlugin").CommonJsImportSettings} CommonJsImportSettings */
/** @typedef {import("../CompatibilityPlugin").CompatibilitySettings} CompatibilitySettings */
/** @typedef {import("../optimize/InnerGraph").TopLevelSymbol} TopLevelSymbol */
/** @typedef {HarmonySettings | ImportSettings | CommonJsImportSettings | TopLevelSymbol | CompatibilitySettings} KnownTagData */
/** @typedef {HarmonySettings | ImportSettings | CommonJsImportSettings | TopLevelSymbol | CompatibilitySettings | HarmonySpecifierGuards} KnownTagData */
/** @typedef {KnownTagData | Record<string, EXPECTED_ANY>} TagData */
/**
 * Defines the tag info type used by this module.
 * @typedef {object} TagInfo
 * @property {Tag} tag
 * @property {TagData=} data
@@ -358,6 +384,7 @@
const SCOPE_INFO_TERMINATED_THROW = 2;
/**
 * Defines the scope info type used by this module.
 * @typedef {object} ScopeInfo
 * @property {StackedMap<string, VariableInfo | ScopeInfo>} definitions
 * @property {boolean | "arrow"} topLevelScope
@@ -372,6 +399,7 @@
/** @typedef {[number, number]} Range */
/**
 * Defines the destructuring assignment property type used by this module.
 * @typedef {object} DestructuringAssignmentProperty
 * @property {string} id
 * @property {Range} range
@@ -465,6 +493,7 @@
class JavascriptParser extends Parser {
   /**
    * Creates an instance of JavascriptParser.
    * @param {"module" | "script" | "auto"=} sourceType default source type
    * @param {{ parse?: ParseFunction }=} options parser options
    */
@@ -506,6 +535,8 @@
         statement: new SyncBailHook(["statement"]),
         /** @type {SyncBailHook<[IfStatement], boolean | void>} */
         statementIf: new SyncBailHook(["statement"]),
         /** @type {SyncBailHook<[Expression], ((walk: () => void) => void) | void>} */
         collectGuards: new SyncBailHook(["expression"]),
         /** @type {SyncBailHook<[Expression, ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration], boolean | void>} */
         classExtendsExpression: new SyncBailHook([
            "expression",
@@ -666,7 +697,7 @@
      /** @type {ScopeInfo} */
      this.scope = /** @type {EXPECTED_ANY} */ (undefined);
      /** @type {ParserState} */
      /** @type {JavascriptParserState} */
      this.state = /** @type {EXPECTED_ANY} */ (undefined);
      /** @type {Comment[] | undefined} */
      this.comments = undefined;
@@ -734,6 +765,7 @@
            return;
         }
         /** @type {undefined | string} */
         let regExp;
         const arg1 = expr.arguments[0];
@@ -756,6 +788,7 @@
            );
         }
         /** @type {undefined | string} */
         let flags;
         const arg2 = expr.arguments[1];
@@ -938,6 +971,7 @@
            (a === true && b === false) || (a === false && b === true);
         /**
          * Handle template string compare.
          * @param {BasicEvaluatedExpression} left left
          * @param {BasicEvaluatedExpression} right right
          * @param {BasicEvaluatedExpression} res res
@@ -946,6 +980,7 @@
          */
         const handleTemplateStringCompare = (left, right, res, eql) => {
            /**
             * Returns value.
             * @param {BasicEvaluatedExpression[]} parts parts
             * @returns {string} value
             */
@@ -959,6 +994,7 @@
               return value;
            };
            /**
             * Returns value.
             * @param {BasicEvaluatedExpression[]} parts parts
             * @returns {string} value
             */
@@ -1442,6 +1478,7 @@
         }
      });
      /**
       * Tap evaluate with variable info.
       * @param {"Identifier" | "ThisExpression" | "MemberExpression"} exprType expression type name
       * @param {(node: Expression | SpreadElement) => GetInfoResult | undefined} getInfo get info
       * @returns {void}
@@ -1584,7 +1621,7 @@
            const arg1Eval = this.evaluateExpression(arg1);
            if (!arg1Eval.isString()) return;
            const arg1Value = /** @type {string} */ (arg1Eval.string);
            /** @type {number} */
            let result;
            if (arg2) {
               if (arg2.type === "SpreadElement") return;
@@ -1629,7 +1666,9 @@
            .for(fn)
            .tap(CLASS_NAME, (expr, param) => {
               if (!param.isString()) return;
               /** @type {BasicEvaluatedExpression} */
               let arg1;
               /** @type {string} */
               let result;
               const str = /** @type {string} */ (param.string);
               switch (expr.arguments.length) {
@@ -1667,9 +1706,10 @@
      }
      /**
       * Gets simplified template result.
       * @param {"cooked" | "raw"} kind kind of values to get
       * @param {TemplateLiteral} templateLiteralExpr TemplateLiteral expr
       * @returns {{quasis: BasicEvaluatedExpression[], parts: BasicEvaluatedExpression[]}} Simplified template
       * @returns {{ quasis: BasicEvaluatedExpression[], parts: BasicEvaluatedExpression[] }} Simplified template
       */
      const getSimplifiedTemplateResult = (kind, templateLiteralExpr) => {
         /** @type {BasicEvaluatedExpression[]} */
@@ -1751,7 +1791,8 @@
         .for("concat")
         .tap(CLASS_NAME, (expr, param) => {
            if (!param.isString() && !param.isWrapped()) return;
            let stringSuffix = null;
            /** @type {undefined | BasicEvaluatedExpression} */
            let stringSuffix;
            let hasUnknownParams = false;
            /** @type {BasicEvaluatedExpression[]} */
            const innerExpressions = [];
@@ -1827,6 +1868,7 @@
            if (!param.isString()) return;
            if (expr.arguments.length !== 1) return;
            if (expr.arguments[0].type === "SpreadElement") return;
            /** @type {string[]} */
            let result;
            const arg = this.evaluateExpression(expr.arguments[0]);
            if (arg.isString()) {
@@ -1852,6 +1894,7 @@
            const condition = this.evaluateExpression(expr.test);
            const conditionValue = condition.asBool();
            /** @type {BasicEvaluatedExpression} */
            let res;
            if (conditionValue === undefined) {
               const consequent = this.evaluateExpression(expr.consequent);
@@ -1898,7 +1941,7 @@
         const expr = /** @type {ChainExpression} */ (_expr);
         /** @type {Expression[]} */
         const optionalExpressionsStack = [];
         /** @type {Expression|Super} */
         /** @type {Expression | Super} */
         let next = expr.expression;
         while (
@@ -1939,6 +1982,7 @@
   }
   /**
    * Destructuring assignment properties for.
    * @param {Expression} node node
    * @returns {DestructuringAssignmentProperties | undefined} destructured identifiers
    */
@@ -1948,6 +1992,7 @@
   }
   /**
    * Gets rename identifier.
    * @param {Expression | SpreadElement} expr expression
    * @returns {string | VariableInfo | undefined} identifier
    */
@@ -1959,6 +2004,7 @@
   }
   /**
    * Processes the provided classy.
    * @param {ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration} classy a class node
    * @returns {void}
    */
@@ -1970,6 +2016,7 @@
         this.walkExpression(classy.superClass);
      }
      if (classy.body && classy.body.type === "ClassBody") {
         /** @type {Identifier[]} */
         const scopeParams = [];
         // Add class name in scope for recursive calls
         if (classy.id) {
@@ -2142,6 +2189,7 @@
   }
   /**
    * Block pre walk statement.
    * @param {Statement | ModuleDeclaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration} statement statement
    */
   blockPreWalkStatement(statement) {
@@ -2175,6 +2223,7 @@
   }
   /**
    * Processes the provided statement.
    * @param {Statement | ModuleDeclaration | MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration} statement statement
    */
   walkStatement(statement) {
@@ -2263,6 +2312,7 @@
   // Real Statements
   /**
    * Pre walk block statement.
    * @param {BlockStatement} statement block statement
    */
   preWalkBlockStatement(statement) {
@@ -2270,6 +2320,7 @@
   }
   /**
    * Walk block statement.
    * @param {BlockStatement | StaticBlock} statement block statement
    */
   walkBlockStatement(statement) {
@@ -2283,6 +2334,7 @@
   }
   /**
    * Walk expression statement.
    * @param {ExpressionStatement} statement expression statement
    */
   walkExpressionStatement(statement) {
@@ -2290,6 +2342,7 @@
   }
   /**
    * Pre walk if statement.
    * @param {IfStatement} statement if statement
    */
   preWalkIfStatement(statement) {
@@ -2300,13 +2353,22 @@
   }
   /**
    * Processes the provided statement.
    * @param {IfStatement} statement if statement
    */
   walkIfStatement(statement) {
      const result = this.hooks.statementIf.call(statement);
      if (result === undefined) {
         this.walkExpression(statement.test);
         this.walkNestedStatement(statement.consequent);
         const inGuard = this.hooks.collectGuards.call(statement.test);
         if (inGuard) {
            inGuard(() => {
               this.walkExpression(statement.test);
               this.walkNestedStatement(statement.consequent);
            });
         } else {
            this.walkExpression(statement.test);
            this.walkNestedStatement(statement.consequent);
         }
         const consequentTerminated = this.scope.terminated;
         this.scope.terminated = undefined;
@@ -2329,6 +2391,7 @@
   }
   /**
    * Pre walk labeled statement.
    * @param {LabeledStatement} statement with statement
    */
   preWalkLabeledStatement(statement) {
@@ -2336,6 +2399,7 @@
   }
   /**
    * Walk labeled statement.
    * @param {LabeledStatement} statement with statement
    */
   walkLabeledStatement(statement) {
@@ -2350,6 +2414,7 @@
   }
   /**
    * Pre walk with statement.
    * @param {WithStatement} statement with statement
    */
   preWalkWithStatement(statement) {
@@ -2357,6 +2422,7 @@
   }
   /**
    * Walk with statement.
    * @param {WithStatement} statement with statement
    */
   walkWithStatement(statement) {
@@ -2367,6 +2433,7 @@
   }
   /**
    * Pre walk switch statement.
    * @param {SwitchStatement} statement switch statement
    */
   preWalkSwitchStatement(statement) {
@@ -2374,6 +2441,7 @@
   }
   /**
    * Walk switch statement.
    * @param {SwitchStatement} statement switch statement
    */
   walkSwitchStatement(statement) {
@@ -2382,6 +2450,7 @@
   }
   /**
    * Walk terminating statement.
    * @param {ReturnStatement | ThrowStatement} statement return or throw statement
    */
   walkTerminatingStatement(statement) {
@@ -2397,6 +2466,7 @@
   }
   /**
    * Walk return statement.
    * @param {ReturnStatement} statement return statement
    */
   walkReturnStatement(statement) {
@@ -2404,6 +2474,7 @@
   }
   /**
    * Walk throw statement.
    * @param {ThrowStatement} statement return statement
    */
   walkThrowStatement(statement) {
@@ -2411,6 +2482,7 @@
   }
   /**
    * Pre walk try statement.
    * @param {TryStatement} statement try statement
    */
   preWalkTryStatement(statement) {
@@ -2420,6 +2492,7 @@
   }
   /**
    * Walk try statement.
    * @param {TryStatement} statement try statement
    */
   walkTryStatement(statement) {
@@ -2457,6 +2530,7 @@
   }
   /**
    * Pre walk while statement.
    * @param {WhileStatement} statement while statement
    */
   preWalkWhileStatement(statement) {
@@ -2464,6 +2538,7 @@
   }
   /**
    * Walk while statement.
    * @param {WhileStatement} statement while statement
    */
   walkWhileStatement(statement) {
@@ -2474,6 +2549,7 @@
   }
   /**
    * Pre walk do while statement.
    * @param {DoWhileStatement} statement do while statement
    */
   preWalkDoWhileStatement(statement) {
@@ -2481,6 +2557,7 @@
   }
   /**
    * Walk do while statement.
    * @param {DoWhileStatement} statement do while statement
    */
   walkDoWhileStatement(statement) {
@@ -2491,6 +2568,7 @@
   }
   /**
    * Pre walk for statement.
    * @param {ForStatement} statement for statement
    */
   preWalkForStatement(statement) {
@@ -2501,6 +2579,7 @@
   }
   /**
    * Walk for statement.
    * @param {ForStatement} statement for statement
    */
   walkForStatement(statement) {
@@ -2536,6 +2615,7 @@
   }
   /**
    * Pre walk for in statement.
    * @param {ForInStatement} statement for statement
    */
   preWalkForInStatement(statement) {
@@ -2546,6 +2626,7 @@
   }
   /**
    * Walk for in statement.
    * @param {ForInStatement} statement for statement
    */
   walkForInStatement(statement) {
@@ -2574,6 +2655,7 @@
   }
   /**
    * Pre walk for of statement.
    * @param {ForOfStatement} statement statement
    */
   preWalkForOfStatement(statement) {
@@ -2587,6 +2669,7 @@
   }
   /**
    * Walk for of statement.
    * @param {ForOfStatement} statement for statement
    */
   walkForOfStatement(statement) {
@@ -2615,6 +2698,7 @@
   }
   /**
    * Pre walk function declaration.
    * @param {FunctionDeclaration | MaybeNamedFunctionDeclaration} statement function declaration
    */
   preWalkFunctionDeclaration(statement) {
@@ -2624,6 +2708,7 @@
   }
   /**
    * Walk function declaration.
    * @param {FunctionDeclaration | MaybeNamedFunctionDeclaration} statement function declaration
    */
   walkFunctionDeclaration(statement) {
@@ -2646,6 +2731,7 @@
   }
   /**
    * Block pre walk expression statement.
    * @param {ExpressionStatement} statement expression statement
    */
   blockPreWalkExpressionStatement(statement) {
@@ -2657,6 +2743,7 @@
   }
   /**
    * Pre walk assignment expression.
    * @param {AssignmentExpression} expression assignment expression
    */
   preWalkAssignmentExpression(expression) {
@@ -2664,6 +2751,7 @@
   }
   /**
    * Enter destructuring assignment.
    * @param {Pattern} pattern pattern
    * @param {Expression} expression assignment expression
    * @returns {Expression | undefined} destructuring expression
@@ -2705,6 +2793,7 @@
   }
   /**
    * Module pre walk import declaration.
    * @param {ImportDeclaration} statement statement
    */
   modulePreWalkImportDeclaration(statement) {
@@ -2750,6 +2839,7 @@
   }
   /**
    * Processes the provided declaration.
    * @param {Declaration} declaration declaration
    * @param {OnIdent} onIdent on ident callback
    */
@@ -2775,6 +2865,7 @@
   }
   /**
    * Module pre walk export named declaration.
    * @param {ExportNamedDeclaration} statement statement
    */
   modulePreWalkExportNamedDeclaration(statement) {
@@ -2815,6 +2906,7 @@
   }
   /**
    * Block pre walk export named declaration.
    * @param {ExportNamedDeclaration} statement statement
    */
   blockPreWalkExportNamedDeclaration(statement) {
@@ -2866,6 +2958,7 @@
   }
   /**
    * Walk export named declaration.
    * @param {ExportNamedDeclaration} statement the statement
    */
   walkExportNamedDeclaration(statement) {
@@ -2875,6 +2968,7 @@
   }
   /**
    * Block pre walk export default declaration.
    * @param {ExportDefaultDeclaration} statement statement
    */
   blockPreWalkExportDefaultDeclaration(statement) {
@@ -2910,6 +3004,7 @@
   }
   /**
    * Walk export default declaration.
    * @param {ExportDefaultDeclaration} statement statement
    */
   walkExportDefaultDeclaration(statement) {
@@ -2944,6 +3039,7 @@
   }
   /**
    * Module pre walk export all declaration.
    * @param {ExportAllDeclaration} statement statement
    */
   modulePreWalkExportAllDeclaration(statement) {
@@ -2959,6 +3055,7 @@
   }
   /**
    * Pre walk variable declaration.
    * @param {VariableDeclaration} statement variable declaration
    */
   preWalkVariableDeclaration(statement) {
@@ -2967,6 +3064,7 @@
   }
   /**
    * Block pre walk variable declaration.
    * @param {VariableDeclaration} statement variable declaration
    */
   blockPreWalkVariableDeclaration(statement) {
@@ -2982,6 +3080,7 @@
   }
   /**
    * Pre walk variable declaration.
    * @param {VariableDeclaration} statement variable declaration
    * @param {HookMap<SyncBailHook<[Identifier], boolean | void>>} hookMap map of hooks
    */
@@ -3008,6 +3107,7 @@
   }
   /**
    * Pre walk object pattern.
    * @param {ObjectPattern} objectPattern object pattern
    * @returns {DestructuringAssignmentProperties | undefined} set of names or undefined if not all keys are identifiers
    */
@@ -3072,6 +3172,7 @@
   }
   /**
    * Pre walk array pattern.
    * @param {ArrayPattern} arrayPattern array pattern
    * @returns {Set<DestructuringAssignmentProperty> | undefined} set of names or undefined if not all keys are identifiers
    */
@@ -3102,6 +3203,7 @@
   }
   /**
    * Pre walk variable declarator.
    * @param {VariableDeclarator} declarator variable declarator
    */
   preWalkVariableDeclarator(declarator) {
@@ -3111,6 +3213,7 @@
   }
   /**
    * Walk variable declaration.
    * @param {VariableDeclaration} statement variable declaration
    */
   walkVariableDeclaration(statement) {
@@ -3147,6 +3250,7 @@
   }
   /**
    * Block pre walk class declaration.
    * @param {ClassDeclaration | MaybeNamedClassDeclaration} statement class declaration
    */
   blockPreWalkClassDeclaration(statement) {
@@ -3156,6 +3260,7 @@
   }
   /**
    * Walk class declaration.
    * @param {ClassDeclaration | MaybeNamedClassDeclaration} statement class declaration
    */
   walkClassDeclaration(statement) {
@@ -3163,6 +3268,7 @@
   }
   /**
    * Pre walk switch cases.
    * @param {SwitchCase[]} switchCases switch statement
    */
   preWalkSwitchCases(switchCases) {
@@ -3173,6 +3279,7 @@
   }
   /**
    * Processes the provided switch case.
    * @param {SwitchCase[]} switchCases switch statement
    */
   walkSwitchCases(switchCases) {
@@ -3213,6 +3320,7 @@
   }
   /**
    * Pre walk catch clause.
    * @param {CatchClause} catchClause catch clause
    */
   preWalkCatchClause(catchClause) {
@@ -3220,6 +3328,7 @@
   }
   /**
    * Processes the provided catch clause.
    * @param {CatchClause} catchClause catch clause
    */
   walkCatchClause(catchClause) {
@@ -3239,6 +3348,7 @@
   }
   /**
    * Processes the provided pattern.
    * @param {Pattern} pattern pattern
    */
   walkPattern(pattern) {
@@ -3262,6 +3372,7 @@
   }
   /**
    * Walk assignment pattern.
    * @param {AssignmentPattern} pattern assignment pattern
    */
   walkAssignmentPattern(pattern) {
@@ -3270,6 +3381,7 @@
   }
   /**
    * Walk object pattern.
    * @param {ObjectPattern} pattern pattern
    */
   walkObjectPattern(pattern) {
@@ -3286,6 +3398,7 @@
   }
   /**
    * Walk array pattern.
    * @param {ArrayPattern} pattern array pattern
    */
   walkArrayPattern(pattern) {
@@ -3296,6 +3409,7 @@
   }
   /**
    * Processes the provided pattern.
    * @param {RestElement} pattern rest element
    */
   walkRestElement(pattern) {
@@ -3303,6 +3417,7 @@
   }
   /**
    * Processes the provided expression.
    * @param {(Expression | SpreadElement | null)[]} expressions expressions
    */
   walkExpressions(expressions) {
@@ -3314,6 +3429,7 @@
   }
   /**
    * Processes the provided expression.
    * @param {Expression | SpreadElement | PrivateIdentifier | Super} expression expression
    */
   walkExpression(expression) {
@@ -3397,6 +3513,7 @@
   }
   /**
    * Walk await expression.
    * @param {AwaitExpression} expression await expression
    */
   walkAwaitExpression(expression) {
@@ -3407,6 +3524,7 @@
   }
   /**
    * Walk array expression.
    * @param {ArrayExpression} expression array expression
    */
   walkArrayExpression(expression) {
@@ -3416,6 +3534,7 @@
   }
   /**
    * Walk spread element.
    * @param {SpreadElement} expression spread element
    */
   walkSpreadElement(expression) {
@@ -3425,6 +3544,7 @@
   }
   /**
    * Walk object expression.
    * @param {ObjectExpression} expression object expression
    */
   walkObjectExpression(expression) {
@@ -3439,6 +3559,7 @@
   }
   /**
    * Processes the provided prop.
    * @param {Property | SpreadElement} prop property or spread element
    */
   walkProperty(prop) {
@@ -3462,6 +3583,7 @@
   }
   /**
    * Walk function expression.
    * @param {FunctionExpression} expression arrow function expression
    */
   walkFunctionExpression(expression) {
@@ -3491,6 +3613,7 @@
   }
   /**
    * Walk arrow function expression.
    * @param {ArrowFunctionExpression} expression arrow function expression
    */
   walkArrowFunctionExpression(expression) {
@@ -3514,6 +3637,7 @@
   }
   /**
    * Walk sequence expression.
    * @param {SequenceExpression} expression the sequence
    */
   walkSequenceExpression(expression) {
@@ -3552,6 +3676,7 @@
   }
   /**
    * Walk update expression.
    * @param {UpdateExpression} expression the update expression
    */
   walkUpdateExpression(expression) {
@@ -3559,6 +3684,7 @@
   }
   /**
    * Walk unary expression.
    * @param {UnaryExpression} expression the unary expression
    */
   walkUnaryExpression(expression) {
@@ -3582,6 +3708,7 @@
   }
   /**
    * Walk left right expression.
    * @param {LogicalExpression | BinaryExpression} expression the expression
    */
   walkLeftRightExpression(expression) {
@@ -3590,6 +3717,7 @@
   }
   /**
    * Walk binary expression.
    * @param {BinaryExpression} expression the binary expression
    */
   walkBinaryExpression(expression) {
@@ -3599,6 +3727,7 @@
   }
   /**
    * Walk logical expression.
    * @param {LogicalExpression} expression the logical expression
    */
   walkLogicalExpression(expression) {
@@ -3611,6 +3740,7 @@
   }
   /**
    * Walk assignment expression.
    * @param {AssignmentExpression} expression assignment expression
    */
   walkAssignmentExpression(expression) {
@@ -3686,13 +3816,22 @@
   }
   /**
    * Walk conditional expression.
    * @param {ConditionalExpression} expression conditional expression
    */
   walkConditionalExpression(expression) {
      const result = this.hooks.expressionConditionalOperator.call(expression);
      if (result === undefined) {
         this.walkExpression(expression.test);
         this.walkExpression(expression.consequent);
         const inGuard = this.hooks.collectGuards.call(expression.test);
         if (inGuard) {
            inGuard(() => {
               this.walkExpression(expression.test);
               this.walkExpression(expression.consequent);
            });
         } else {
            this.walkExpression(expression.test);
            this.walkExpression(expression.consequent);
         }
         if (expression.alternate) {
            this.walkExpression(expression.alternate);
@@ -3705,6 +3844,7 @@
   }
   /**
    * Walk new expression.
    * @param {NewExpression} expression new expression
    */
   walkNewExpression(expression) {
@@ -3721,6 +3861,7 @@
   }
   /**
    * Walk yield expression.
    * @param {YieldExpression} expression yield expression
    */
   walkYieldExpression(expression) {
@@ -3730,6 +3871,7 @@
   }
   /**
    * Walk template literal.
    * @param {TemplateLiteral} expression template literal
    */
   walkTemplateLiteral(expression) {
@@ -3739,6 +3881,7 @@
   }
   /**
    * Walk tagged template expression.
    * @param {TaggedTemplateExpression} expression tagged template expression
    */
   walkTaggedTemplateExpression(expression) {
@@ -3753,6 +3896,7 @@
   }
   /**
    * Walk class expression.
    * @param {ClassExpression} expression the class expression
    */
   walkClassExpression(expression) {
@@ -3760,6 +3904,7 @@
   }
   /**
    * Walk chain expression.
    * @param {ChainExpression} expression expression
    */
   walkChainExpression(expression) {
@@ -3775,6 +3920,7 @@
   }
   /**
    * Processes the provided function expression.
    * @private
    * @param {FunctionExpression | ArrowFunctionExpression} functionExpression function expression
    * @param {(Expression | SpreadElement)[]} options options
@@ -3782,6 +3928,7 @@
    */
   _walkIIFE(functionExpression, options, currentThis) {
      /**
       * Returns var info.
       * @param {Expression | SpreadElement} argOrThis arg or this
       * @returns {string | VariableInfo | undefined} var info
       */
@@ -3850,6 +3997,7 @@
   }
   /**
    * Walk import expression.
    * @param {ImportExpression} expression import expression
    */
   walkImportExpression(expression) {
@@ -3860,10 +4008,12 @@
   }
   /**
    * Walk call expression.
    * @param {CallExpression} expression expression
    */
   walkCallExpression(expression) {
      /**
       * Checks whether this javascript parser is simple function.
       * @param {FunctionExpression | ArrowFunctionExpression} fn function
       * @returns {boolean} true when simple function
       */
@@ -3979,6 +4129,7 @@
   }
   /**
    * Walk member expression.
    * @param {MemberExpression} expression member expression
    */
   walkMemberExpression(expression) {
@@ -4045,6 +4196,7 @@
   }
   /**
    * Walk member expression with expression name.
    * @template R
    * @param {MemberExpression} expression member expression
    * @param {string} name name
@@ -4088,6 +4240,7 @@
   }
   /**
    * Walk this expression.
    * @param {ThisExpression} expression this expression
    */
   walkThisExpression(expression) {
@@ -4095,6 +4248,7 @@
   }
   /**
    * Processes the provided expression.
    * @param {Identifier} expression identifier
    */
   walkIdentifier(expression) {
@@ -4102,6 +4256,7 @@
   }
   /**
    * Walk meta property.
    * @param {MetaProperty} metaProperty meta property
    */
   walkMetaProperty(metaProperty) {
@@ -4109,6 +4264,7 @@
   }
   /**
    * Call hooks for expression.
    * @template T
    * @template R
    * @param {HookMap<SyncBailHook<T, R>>} hookMap hooks the should be called
@@ -4127,6 +4283,7 @@
   }
   /**
    * Call hooks for expression with fallback.
    * @template T
    * @template R
    * @param {HookMap<SyncBailHook<T, R>>} hookMap hooks the should be called
@@ -4161,6 +4318,7 @@
   }
   /**
    * Call hooks for name.
    * @template T
    * @template R
    * @param {HookMap<SyncBailHook<T, R>>} hookMap hooks the should be called
@@ -4179,6 +4337,7 @@
   }
   /**
    * Call hooks for info.
    * @template T
    * @template R
    * @param {HookMap<SyncBailHook<T, R>>} hookMap hooks that should be called
@@ -4197,6 +4356,7 @@
   }
   /**
    * Call hooks for info with fallback.
    * @template T
    * @template R
    * @param {HookMap<SyncBailHook<T, R>>} hookMap hooks the should be called
@@ -4207,6 +4367,7 @@
    * @returns {R | undefined} result of hook
    */
   callHooksForInfoWithFallback(hookMap, info, fallback, defined, ...args) {
      /** @type {string} */
      let name;
      if (typeof info === "string") {
         name = info;
@@ -4234,7 +4395,7 @@
            }
            return;
         }
         name = info.name;
         name = /** @type {string} */ (info.name);
      }
      const hook = hookMap.get(name);
      if (hook !== undefined) {
@@ -4242,11 +4403,12 @@
         if (result !== undefined) return result;
      }
      if (fallback !== undefined) {
         return fallback(/** @type {string} */ (name));
         return fallback(name);
      }
   }
   /**
    * Call hooks for name with fallback.
    * @template T
    * @template R
    * @param {HookMap<SyncBailHook<T, R>>} hookMap hooks the should be called
@@ -4267,6 +4429,7 @@
   }
   /**
    * Processes the provided param.
    * @deprecated
    * @param {(string | Pattern | Property)[]} params scope params
    * @param {() => void} fn inner function
@@ -4297,6 +4460,7 @@
   }
   /**
    * Processes the provided has thi.
    * @param {boolean} hasThis true, when this is defined
    * @param {Identifier[]} params scope params
    * @param {() => void} fn inner function
@@ -4329,6 +4493,7 @@
   }
   /**
    * Processes the provided has thi.
    * @param {boolean} hasThis true, when this is defined
    * @param {(Pattern | string)[]} params scope params
    * @param {() => void} fn inner function
@@ -4361,6 +4526,7 @@
   }
   /**
    * Processes the provided fn.
    * @param {() => void} fn inner function
    * @param {boolean} inExecutedPath executed state
    * @returns {void}
@@ -4390,6 +4556,7 @@
   }
   /**
    * Processes the provided statement.
    * @param {(Directive | Statement | ModuleDeclaration)[]} statements statements
    */
   detectMode(statements) {
@@ -4416,6 +4583,7 @@
   }
   /**
    * Processes the provided pattern.
    * @param {(string | Pattern | Property)[]} patterns patterns
    * @param {OnIdentString} onIdent on ident callback
    */
@@ -4430,6 +4598,7 @@
   }
   /**
    * Processes the provided pattern.
    * @param {Pattern | Property} pattern pattern
    * @param {OnIdent} onIdent on ident callback
    */
@@ -4464,6 +4633,7 @@
   }
   /**
    * Processes the provided pattern.
    * @param {Identifier} pattern identifier pattern
    * @param {OnIdent} onIdent callback
    */
@@ -4474,6 +4644,7 @@
   }
   /**
    * Enter object pattern.
    * @param {ObjectPattern} pattern object pattern
    * @param {OnIdent} onIdent callback
    */
@@ -4489,6 +4660,7 @@
   }
   /**
    * Enter array pattern.
    * @param {ArrayPattern} pattern object pattern
    * @param {OnIdent} onIdent callback
    */
@@ -4507,6 +4679,7 @@
   }
   /**
    * Enter rest element.
    * @param {RestElement} pattern object pattern
    * @param {OnIdent} onIdent callback
    */
@@ -4515,6 +4688,7 @@
   }
   /**
    * Enter assignment pattern.
    * @param {AssignmentPattern} pattern object pattern
    * @param {OnIdent} onIdent callback
    */
@@ -4523,6 +4697,7 @@
   }
   /**
    * Evaluate expression.
    * @param {Expression | SpreadElement | PrivateIdentifier | Super} expression expression node
    * @returns {BasicEvaluatedExpression} evaluation result
    */
@@ -4547,6 +4722,7 @@
   }
   /**
    * Returns parsed string.
    * @param {Expression} expression expression
    * @returns {string} parsed string
    */
@@ -4571,6 +4747,7 @@
   /** @typedef {{ range?: Range, value: string, code: boolean, conditional: false | CalculatedStringResult[] }} CalculatedStringResult */
   /**
    * Parses calculated string.
    * @param {Expression} expression expression
    * @returns {CalculatedStringResult} result
    */
@@ -4660,6 +4837,7 @@
   }
   /**
    * Parses the provided source and updates the parser state.
    * @param {string | Buffer | PreparsedAst} source the source to parse
    * @param {ParserState} state the parser state
    * @returns {ParserState} the parser state
@@ -4748,6 +4926,7 @@
   }
   /**
    * Returns evaluation result.
    * @param {string} source source code
    * @returns {BasicEvaluatedExpression} evaluation result
    */
@@ -4764,6 +4943,7 @@
   }
   /**
    * Checks whether this javascript parser is pure.
    * @param {Expression | Declaration | PrivateIdentifier | MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration | null | undefined} expr an expression
    * @param {number} commentsStartPos source position from which annotation comments are checked
    * @returns {boolean} true, when the expression is pure
@@ -4827,13 +5007,15 @@
               return true;
            });
         }
         case "TemplateLiteral":
            return expr.expressions.every((expr) =>
               this.isPure(expr, /** @type {Range} */ (expr.range)[0])
            );
         case "FunctionDeclaration":
         case "FunctionExpression":
         case "ArrowFunctionExpression":
         case "ThisExpression":
         case "Literal":
         case "TemplateLiteral":
         case "Identifier":
         case "PrivateIdentifier":
            return true;
@@ -4878,7 +5060,7 @@
               ]).some(
                  (comment) =>
                     comment.type === "Block" &&
                     /^\s*(#|@)__PURE__\s*$/.test(comment.value)
                     /^\s*(?:#|@)__PURE__\s*$/.test(comment.value)
               );
            if (!pureFlag) return false;
            commentsStartPos = /** @type {Range} */ (expr.callee.range)[1];
@@ -4895,12 +5077,14 @@
   }
   /**
    * Returns comments in the range.
    * @param {Range} range range
    * @returns {Comment[]} comments in the range
    */
   getComments(range) {
      const [rangeStart, rangeEnd] = range;
      /**
       * Returns compared.
       * @param {Comment} comment comment
       * @param {number} needle needle
       * @returns {number} compared
@@ -4923,6 +5107,7 @@
   }
   /**
    * Checks whether this javascript parser is asi position.
    * @param {number} pos source code position
    * @returns {boolean} true when a semicolon has been inserted before this position, false if not
    */
@@ -4953,6 +5138,7 @@
   }
   /**
    * Updates asi position using the provided po.
    * @param {number} pos source code position
    * @returns {void}
    */
@@ -4961,6 +5147,7 @@
   }
   /**
    * Unset asi position.
    * @param {number} pos source code position
    * @returns {void}
    */
@@ -4969,6 +5156,7 @@
   }
   /**
    * Checks whether this javascript parser is statement level expression.
    * @param {Expression} expr expression
    * @returns {boolean} true, when the expression is a statement level expression
    */
@@ -4987,6 +5175,7 @@
   }
   /**
    * Returns tag data.
    * @param {string} name name
    * @param {Tag} tag tag info
    * @returns {TagData | undefined} tag data
@@ -5003,6 +5192,7 @@
   }
   /**
    * Processes the provided name.
    * @param {string} name name
    * @param {Tag} tag tag info
    * @param {TagData=} data data
@@ -5040,6 +5230,7 @@
   }
   /**
    * Processes the provided name.
    * @param {string} name variable name
    */
   defineVariable(name) {
@@ -5055,6 +5246,7 @@
   }
   /**
    * Processes the provided name.
    * @param {string} name variable name
    */
   undefineVariable(name) {
@@ -5062,6 +5254,7 @@
   }
   /**
    * Checks whether this javascript parser is variable defined.
    * @param {string} name variable name
    * @returns {boolean} true, when variable is defined
    */
@@ -5075,6 +5268,7 @@
   }
   /**
    * Gets variable info.
    * @param {string} name variable name
    * @returns {ExportedVariableInfo} info for this variable
    */
@@ -5087,6 +5281,7 @@
   }
   /**
    * Updates variable using the provided name.
    * @param {string} name variable name
    * @param {ExportedVariableInfo} variableInfo new info for this variable
    * @returns {void}
@@ -5112,6 +5307,7 @@
   }
   /**
    * Evaluated variable.
    * @param {TagInfo} tagInfo tag info
    * @returns {VariableInfo} variable info
    */
@@ -5125,6 +5321,7 @@
   }
   /**
    * Parses comment options.
    * @param {Range} range range of the comment
    * @returns {{ options: Record<string, EXPECTED_ANY> | null, errors: (Error & { comment: Comment })[] | null }} result
    */
@@ -5133,7 +5330,7 @@
      if (comments.length === 0) {
         return EMPTY_COMMENT_OPTIONS;
      }
      /** @type {Record<string, EXPECTED_ANY> } */
      /** @type {Record<string, EXPECTED_ANY>} */
      const options = {};
      /** @type {(Error & { comment: Comment })[]} */
      const errors = [];
@@ -5168,14 +5365,18 @@
   }
   /**
    * Extract member expression chain.
    * @param {Expression | Super} expression a member expression
    * @returns {{ members: Members, object: Expression | Super, membersOptionals: MembersOptionals, memberRanges: MemberRanges }} member names (reverse order) and remaining object
    */
   extractMemberExpressionChain(expression) {
      /** @type {Node} */
      let expr = expression;
      /** @type {Members} */
      const members = [];
      /** @type {MembersOptionals} */
      const membersOptionals = [];
      /** @type {MemberRanges} */
      const memberRanges = [];
      while (expr.type === "MemberExpression") {
         if (expr.computed) {
@@ -5200,11 +5401,13 @@
   }
   /**
    * Gets free info from variable.
    * @param {string} varName variable name
    * @returns {{name: string, info: VariableInfo | string} | undefined} name of the free variable and variable info for that
    * @returns {{ name: string, info: VariableInfo | string } | undefined} name of the free variable and variable info for that
    */
   getFreeInfoFromVariable(varName) {
      const info = this.getVariableInfo(varName);
      /** @type {string} */
      let name;
      if (info instanceof VariableInfo && info.name) {
         if (!info.isFree()) return;
@@ -5218,11 +5421,13 @@
   }
   /**
    * Gets name info from variable.
    * @param {string} varName variable name
    * @returns {{name: string, info: VariableInfo | string} | undefined} name of the free variable and variable info for that
    * @returns {{ name: string, info: VariableInfo | string } | undefined} name of the free variable and variable info for that
    */
   getNameInfoFromVariable(varName) {
      const info = this.getVariableInfo(varName);
      /** @type {string} */
      let name;
      if (info instanceof VariableInfo && info.name) {
         if (!info.isFree() && !info.isTagged()) return;
@@ -5235,10 +5440,11 @@
      return { info, name };
   }
   /** @typedef {{ type: "call", call: CallExpression, calleeName: string, rootInfo: string | VariableInfo, getCalleeMembers: () => CalleeMembers, name: string, getMembers: () => Members, getMembersOptionals: () => MembersOptionals, getMemberRanges: () => MemberRanges}} CallExpressionInfo */
   /** @typedef {{ type: "expression", rootInfo: string | VariableInfo, name: string, getMembers: () => Members, getMembersOptionals: () => MembersOptionals, getMemberRanges: () => MemberRanges}} ExpressionExpressionInfo */
   /** @typedef {{ type: "call", call: CallExpression, calleeName: string, rootInfo: string | VariableInfo, getCalleeMembers: () => CalleeMembers, name: string, getMembers: () => Members, getMembersOptionals: () => MembersOptionals, getMemberRanges: () => MemberRanges }} CallExpressionInfo */
   /** @typedef {{ type: "expression", rootInfo: string | VariableInfo, name: string, getMembers: () => Members, getMembersOptionals: () => MembersOptionals, getMemberRanges: () => MemberRanges }} ExpressionExpressionInfo */
   /**
    * Gets member expression info.
    * @param {Expression | Super} expression a member expression
    * @param {number} allowedTypes which types should be returned, presented in bit mask
    * @returns {CallExpressionInfo | ExpressionExpressionInfo | undefined} expression info
@@ -5296,8 +5502,9 @@
   }
   /**
    * Gets name for expression.
    * @param {Expression} expression an expression
    * @returns {{ name: string, rootInfo: ExportedVariableInfo, getMembers: () => Members} | undefined} name info
    * @returns {{ name: string, rootInfo: ExportedVariableInfo, getMembers: () => Members } | undefined} name info
    */
   getNameForExpression(expression) {
      return this.getMemberExpressionInfo(
@@ -5307,6 +5514,7 @@
   }
   /**
    * Get module parse function.
    * @param {Compilation} compilation compilation
    * @param {Module} module module
    * @returns {ParseFunction | undefined} parser
@@ -5327,6 +5535,7 @@
   }
   /**
    * Returns parse result.
    * @param {string} code source code
    * @param {InternalParseOptions} options parsing options
    * @param {ParseFunction=} customParse custom function to parse
@@ -5342,6 +5551,7 @@
         sourceType: type === "auto" ? "module" : type
      };
      /**
       * Returns parse result.
       * @param {string} code source code
       * @param {ParseOptions} options parsing options
       * @returns {ParseResult} parse result
@@ -5410,6 +5620,7 @@
   }
   /**
    * Returns parser.
    * @param {((BaseParser: typeof AcornParser) => typeof AcornParser)[]} plugins parser plugin
    * @returns {typeof JavascriptParser} parser
    */