WXL
4 天以前 3bd962a6d7f61239c020e2dbbeb7341e5b842dd1
node_modules/webpack/lib/dependencies/HarmonyExportExpressionDependency.js
@@ -6,9 +6,10 @@
"use strict";
const ConcatenationScope = require("../ConcatenationScope");
const InitFragment = require("../InitFragment");
const RuntimeGlobals = require("../RuntimeGlobals");
const makeSerializable = require("../util/makeSerializable");
const propertyAccess = require("../util/propertyAccess");
const { propertyAccess } = require("../util/property");
const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
const NullDependency = require("./NullDependency");
@@ -21,9 +22,11 @@
/** @typedef {import("../javascript/JavascriptParser").Range} Range */
/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
/** @typedef {import("./HarmonyExportInitFragment").ExportMap} ExportMap */
class HarmonyExportExpressionDependency extends NullDependency {
   /**
    * Creates an instance of HarmonyExportExpressionDependency.
    * @param {Range} range range
    * @param {Range} rangeStatement range statement
    * @param {string} prefix prefix
@@ -35,6 +38,7 @@
      this.rangeStatement = rangeStatement;
      this.prefix = prefix;
      this.declarationId = declarationId;
      this.isAnonymousDefault = false;
   }
   get type() {
@@ -56,6 +60,7 @@
   }
   /**
    * Gets module evaluation side effects state.
    * @param {ModuleGraph} moduleGraph the module graph
    * @returns {ConnectionState} how this dependency connects the module to referencing modules
    */
@@ -65,6 +70,7 @@
   }
   /**
    * Serializes this instance into the provided serializer context.
    * @param {ObjectSerializerContext} context context
    */
   serialize(context) {
@@ -73,10 +79,12 @@
      write(this.rangeStatement);
      write(this.prefix);
      write(this.declarationId);
      write(this.isAnonymousDefault);
      super.serialize(context);
   }
   /**
    * Restores this instance from the provided deserializer context.
    * @param {ObjectDeserializerContext} context context
    */
   deserialize(context) {
@@ -85,6 +93,7 @@
      this.rangeStatement = read();
      this.prefix = read();
      this.declarationId = read();
      this.isAnonymousDefault = read();
      super.deserialize(context);
   }
}
@@ -98,6 +107,7 @@
   NullDependency.Template
) {
   /**
    * Applies the plugin by registering its hooks on the compiler.
    * @param {Dependency} dependency the dependency for which the template should be applied
    * @param {ReplaceSource} source the current replace source which can be modified
    * @param {DependencyTemplateContext} templateContext the context object
@@ -120,6 +130,7 @@
      const { declarationId } = dep;
      const exportsName = module.exportsArgument;
      if (declarationId) {
         /** @type {string} */
         let name;
         if (typeof declarationId === "string") {
            name = declarationId;
@@ -139,6 +150,7 @@
               .getExportsInfo(module)
               .getUsedName("default", runtime);
            if (used) {
               /** @type {ExportMap} */
               const map = new Map();
               map.set(used, `/* export default binding */ ${name}`);
               initFragments.push(new HarmonyExportInitFragment(exportsName, map));
@@ -150,10 +162,22 @@
            dep.range[0] - 1,
            `/* harmony default export */ ${dep.prefix}`
         );
         if (typeof declarationId !== "string" && dep.isAnonymousDefault) {
            // Fix .name for anonymous default export function declarations
            // see test/test262-cases/test/language/module-code/instn-named-bndng-dflt-fun-anon.js cspell:disable-line
            initFragments.push(
               new InitFragment(
                  `Object.defineProperty(${name}, "name", { value: "default", configurable: true });\n`,
                  InitFragment.STAGE_HARMONY_EXPORTS,
                  2
               )
            );
         }
      } else {
         /** @type {string} */
         let content;
         const name = ConcatenationScope.DEFAULT_EXPORT;
         let name = ConcatenationScope.DEFAULT_EXPORT;
         if (runtimeTemplate.supportsConst()) {
            content = `/* harmony default export */ const ${name} = `;
            if (concatenationScope) {
@@ -164,6 +188,7 @@
                  .getUsedName("default", runtime);
               if (used) {
                  runtimeRequirements.add(RuntimeGlobals.exports);
                  /** @type {ExportMap} */
                  const map = new Map();
                  map.set(used, name);
                  initFragments.push(new HarmonyExportInitFragment(exportsName, map));
@@ -181,9 +206,13 @@
            if (used) {
               runtimeRequirements.add(RuntimeGlobals.exports);
               // This is a little bit incorrect as TDZ is not correct, but we can't use const.
               content = `/* harmony default export */ ${exportsName}${propertyAccess(
               // No local `__WEBPACK_DEFAULT_EXPORT__` binding is created in this path,
               // so the anonymous-default `.name` fix-up below must reference the actual
               // assignment target instead. See issue #20793.
               name = `${exportsName}${propertyAccess(
                  typeof used === "string" ? [used] : used
               )} = `;
               )}`;
               content = `/* harmony default export */ ${name} = `;
            } else {
               content = `/* unused harmony default export */ var ${name} = `;
            }
@@ -195,7 +224,17 @@
               dep.range[0] - 1,
               `${content}(${dep.prefix}`
            );
            if (dep.isAnonymousDefault) {
               // Fix .name for anonymous default export expressions
               // see test/test262-cases/test/language/module-code/eval-export-dflt-cls-anon.js cspell:disable-line
               source.replace(
                  dep.range[1],
                  dep.rangeStatement[1] - 0.5,
                  `);\n(Object.getOwnPropertyDescriptor(${name}, "name") || {}).writable || Object.defineProperty(${name}, "name", { value: "default", configurable: true });`
               );
            } else {
            source.replace(dep.range[1], dep.rangeStatement[1] - 0.5, ");");
            }
            return;
         }