| | |
| | | const Template = require("../Template"); |
| | | const AwaitDependenciesInitFragment = require("../async-modules/AwaitDependenciesInitFragment"); |
| | | const { filterRuntime, mergeRuntime } = require("../util/runtime"); |
| | | const { ImportPhaseUtils } = require("./ImportPhase"); |
| | | const { ImportPhase, ImportPhaseUtils } = require("./ImportPhase"); |
| | | const ModuleDependency = require("./ModuleDependency"); |
| | | |
| | | /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */ |
| | | /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */ |
| | | /** @typedef {import("../Dependency").ReferencedExports} ReferencedExports */ |
| | | /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */ |
| | | /** @typedef {import("../ExportsInfo")} ExportsInfo */ |
| | |
| | | /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */ |
| | | /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */ |
| | | |
| | | /** @typedef {0 | 1 | 2 | 3 | false} ExportPresenceMode */ |
| | | /** @typedef {0 | 1 | 2 | 3} ExportPresenceMode */ |
| | | |
| | | const ExportPresenceModes = { |
| | | NONE: /** @type {ExportPresenceMode} */ (0), |
| | |
| | | AUTO: /** @type {ExportPresenceMode} */ (2), |
| | | ERROR: /** @type {ExportPresenceMode} */ (3), |
| | | /** |
| | | * Returns result. |
| | | * @param {string | false} str param |
| | | * @returns {ExportPresenceMode} result |
| | | */ |
| | |
| | | default: |
| | | throw new Error(`Invalid export presence value ${str}`); |
| | | } |
| | | }, |
| | | /** |
| | | * Resolve export presence mode from parser options with a specific key and shared fallbacks. |
| | | * @param {string | false | undefined} specificValue the type-specific option value (e.g. importExportsPresence or reexportExportsPresence) |
| | | * @param {JavascriptParserOptions} options parser options |
| | | * @returns {ExportPresenceMode} resolved mode |
| | | */ |
| | | resolveFromOptions(specificValue, options) { |
| | | if (specificValue !== undefined) { |
| | | return ExportPresenceModes.fromUserOption(specificValue); |
| | | } |
| | | if (options.exportsPresence !== undefined) { |
| | | return ExportPresenceModes.fromUserOption(options.exportsPresence); |
| | | } |
| | | return options.strictExportPresence |
| | | ? ExportPresenceModes.ERROR |
| | | : ExportPresenceModes.AUTO; |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * Get the non-optional leading part of a member chain. |
| | | * @param {string[]} members members |
| | | * @param {boolean[]} membersOptionals optionality for each member |
| | | * @returns {string[]} the non-optional prefix |
| | | */ |
| | | const getNonOptionalPart = (members, membersOptionals) => { |
| | | let i = 0; |
| | | while (i < members.length && membersOptionals[i] === false) i++; |
| | | return i !== members.length ? members.slice(0, i) : members; |
| | | }; |
| | | |
| | | /** @typedef {string[]} Ids */ |
| | | |
| | | class HarmonyImportDependency extends ModuleDependency { |
| | | /** |
| | | * Creates an instance of HarmonyImportDependency. |
| | | * @param {string} request request string |
| | | * @param {number} sourceOrder source order |
| | | * @param {ImportPhaseType} phase import phase |
| | | * @param {ImportPhaseType=} phase import phase |
| | | * @param {ImportAttributes=} attributes import attributes |
| | | */ |
| | | constructor(request, sourceOrder, phase, attributes) { |
| | | constructor( |
| | | request, |
| | | sourceOrder, |
| | | phase = ImportPhase.Evaluation, |
| | | attributes = undefined |
| | | ) { |
| | | super(request, sourceOrder); |
| | | this.phase = phase; |
| | | this.attributes = attributes; |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns an identifier to merge equal requests. |
| | | * @returns {string | null} an identifier to merge equal requests |
| | | */ |
| | | getResourceIdentifier() { |
| | | let str = super.getResourceIdentifier(); |
| | | if (ImportPhaseUtils.isDefer(this.phase)) { |
| | | str += "|defer"; |
| | | // We specifically use this check to avoid writing the default (`evaluation` or `0`) value and save memory |
| | | if (this.phase) { |
| | | str += `|phase${ImportPhaseUtils.stringify(this.phase)}`; |
| | | } |
| | | if (this.attributes) { |
| | | str += `|importAttributes${JSON.stringify(this.attributes)}`; |
| | | str += `|attributes${JSON.stringify(this.attributes)}`; |
| | | } |
| | | return str; |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns name of the variable for the import. |
| | | * @param {ModuleGraph} moduleGraph the module graph |
| | | * @returns {string} name of the variable for the import |
| | | */ |
| | |
| | | |
| | | let importVar = importVarMap.get(importedModule); |
| | | if (importVar) return importVar; |
| | | importVar = `${Template.toIdentifier( |
| | | `${this.userRequest}` |
| | | )}__WEBPACK_${isDeferred ? "DEFERRED_" : ""}IMPORTED_MODULE_${importVarMap.size}__`; |
| | | importVar = `${Template.toIdentifier(`${this.userRequest}`)}__WEBPACK_${ |
| | | isDeferred ? "DEFERRED_" : "" |
| | | }IMPORTED_MODULE_${importVarMap.size}__`; |
| | | importVarMap.set(importedModule, importVar); |
| | | return importVar; |
| | | } |
| | | |
| | | /** |
| | | * Gets module exports. |
| | | * @param {DependencyTemplateContext} context the template context |
| | | * @returns {string} the expression |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Gets import statement. |
| | | * @param {boolean} update create new variables or update existing one |
| | | * @param {DependencyTemplateContext} templateContext the template context |
| | | * @returns {[string, string]} the import statement and the compat statement |
| | |
| | | } |
| | | |
| | | /** |
| | | * Gets linking errors. |
| | | * @param {ModuleGraph} moduleGraph module graph |
| | | * @param {Ids} ids imported ids |
| | | * @param {string} additionalMessage extra info included in the error message |
| | | * @returns {WebpackError[] | undefined} errors |
| | | */ |
| | | getLinkingErrors(moduleGraph, ids, additionalMessage) { |
| | | // Source phase imports don't have exports to check |
| | | if (ImportPhaseUtils.isSource(this.phase)) { |
| | | return; |
| | | } |
| | | |
| | | const importedModule = moduleGraph.getModule(this); |
| | | // ignore errors for missing or failed modules |
| | | if (!importedModule || importedModule.getNumberOfErrors() > 0) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * Serializes this instance into the provided serializer context. |
| | | * @param {ObjectSerializerContext} context context |
| | | */ |
| | | serialize(context) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * Restores this instance from the provided deserializer context. |
| | | * @param {ObjectDeserializerContext} context context |
| | | */ |
| | | deserialize(context) { |
| | |
| | | ModuleDependency.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 moduleKey = referencedModule |
| | | ? referencedModule.identifier() |
| | | : dep.request; |
| | | const key = `${ImportPhaseUtils.isDefer(dep.phase) ? "deferred " : ""}harmony import ${moduleKey}`; |
| | | const key = `${ |
| | | ImportPhaseUtils.isDefer(dep.phase) |
| | | ? "deferred " |
| | | : ImportPhaseUtils.isSource(dep.phase) |
| | | ? "source " |
| | | : "" |
| | | }harmony import ${moduleKey}`; |
| | | |
| | | const runtimeCondition = dep.weak |
| | | ? false |
| | |
| | | } |
| | | |
| | | /** |
| | | * Gets import emitted runtime. |
| | | * @param {Module} module the module |
| | | * @param {Module} referencedModule the referenced module |
| | | * @returns {RuntimeSpec | boolean} runtimeCondition in which this import has been emitted |
| | |
| | | }; |
| | | |
| | | module.exports.ExportPresenceModes = ExportPresenceModes; |
| | | module.exports.getNonOptionalPart = getNonOptionalPart; |