| | |
| | | "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"); |
| | | |
| | |
| | | /** @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 |
| | |
| | | this.rangeStatement = rangeStatement; |
| | | this.prefix = prefix; |
| | | this.declarationId = declarationId; |
| | | this.isAnonymousDefault = false; |
| | | } |
| | | |
| | | get type() { |
| | |
| | | } |
| | | |
| | | /** |
| | | * Gets module evaluation side effects state. |
| | | * @param {ModuleGraph} moduleGraph the module graph |
| | | * @returns {ConnectionState} how this dependency connects the module to referencing modules |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Serializes this instance into the provided serializer context. |
| | | * @param {ObjectSerializerContext} context context |
| | | */ |
| | | serialize(context) { |
| | |
| | | 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) { |
| | |
| | | this.rangeStatement = read(); |
| | | this.prefix = read(); |
| | | this.declarationId = read(); |
| | | this.isAnonymousDefault = read(); |
| | | super.deserialize(context); |
| | | } |
| | | } |
| | |
| | | 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 |
| | |
| | | const { declarationId } = dep; |
| | | const exportsName = module.exportsArgument; |
| | | if (declarationId) { |
| | | /** @type {string} */ |
| | | let name; |
| | | if (typeof declarationId === "string") { |
| | | name = declarationId; |
| | |
| | | .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)); |
| | |
| | | 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) { |
| | |
| | | .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)); |
| | |
| | | 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} = `; |
| | | } |
| | |
| | | dep.range[0] - 1, |
| | | `${content}(${dep.prefix}` |
| | | ); |
| | | source.replace(dep.range[1], dep.rangeStatement[1] - 0.5, ");"); |
| | | 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; |
| | | } |
| | | |