@eriche/webpack 4.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +784 -0
- package/SECURITY.md +9 -0
- package/bin/webpack.js +171 -0
- package/buildin/amd-define.js +3 -0
- package/buildin/amd-options.js +2 -0
- package/buildin/global.js +20 -0
- package/buildin/harmony-module.js +24 -0
- package/buildin/module.js +22 -0
- package/buildin/system.js +7 -0
- package/declarations/WebpackOptions.d.ts +1466 -0
- package/declarations/plugins/BannerPlugin.d.ts +49 -0
- package/declarations/plugins/DllPlugin.d.ts +32 -0
- package/declarations/plugins/DllReferencePlugin.d.ts +126 -0
- package/declarations/plugins/HashedModuleIdsPlugin.d.ts +24 -0
- package/declarations/plugins/IgnorePlugin.d.ts +27 -0
- package/declarations/plugins/LoaderOptionsPlugin.d.ts +27 -0
- package/declarations/plugins/ProgressPlugin.d.ts +42 -0
- package/declarations/plugins/SourceMapDevToolPlugin.d.ts +94 -0
- package/declarations/plugins/WatchIgnorePlugin.d.ts +10 -0
- package/declarations/plugins/debug/ProfilingPlugin.d.ts +12 -0
- package/declarations/plugins/optimize/AggressiveSplittingPlugin.d.ts +24 -0
- package/declarations/plugins/optimize/LimitChunkCountPlugin.d.ts +16 -0
- package/declarations/plugins/optimize/MinChunkSizePlugin.d.ts +12 -0
- package/declarations/plugins/optimize/OccurrenceOrderChunkIdsPlugin.d.ts +12 -0
- package/declarations/plugins/optimize/OccurrenceOrderModuleIdsPlugin.d.ts +12 -0
- package/hot/dev-server.js +61 -0
- package/hot/emitter.js +2 -0
- package/hot/log-apply-result.js +44 -0
- package/hot/log.js +59 -0
- package/hot/only-dev-server.js +102 -0
- package/hot/poll.js +37 -0
- package/hot/signal.js +62 -0
- package/lib/APIPlugin.js +84 -0
- package/lib/AbstractMethodError.js +43 -0
- package/lib/AmdMainTemplatePlugin.js +106 -0
- package/lib/AsyncDependenciesBlock.js +110 -0
- package/lib/AsyncDependencyToInitialChunkError.js +31 -0
- package/lib/AutomaticPrefetchPlugin.js +57 -0
- package/lib/BannerPlugin.js +122 -0
- package/lib/BasicEvaluatedExpression.js +248 -0
- package/lib/CachePlugin.js +100 -0
- package/lib/CaseSensitiveModulesWarning.js +67 -0
- package/lib/Chunk.js +875 -0
- package/lib/ChunkGroup.js +513 -0
- package/lib/ChunkRenderError.js +32 -0
- package/lib/ChunkTemplate.js +87 -0
- package/lib/CommentCompilationWarning.js +32 -0
- package/lib/CommonJsStuffPlugin.js +116 -0
- package/lib/CompatibilityPlugin.js +70 -0
- package/lib/Compilation.js +2327 -0
- package/lib/Compiler.js +735 -0
- package/lib/ConcurrentCompilationError.js +19 -0
- package/lib/ConstPlugin.js +348 -0
- package/lib/ContextExclusionPlugin.js +28 -0
- package/lib/ContextModule.js +872 -0
- package/lib/ContextModuleFactory.js +262 -0
- package/lib/ContextReplacementPlugin.js +133 -0
- package/lib/DefinePlugin.js +289 -0
- package/lib/DelegatedModule.js +114 -0
- package/lib/DelegatedModuleFactoryPlugin.js +95 -0
- package/lib/DelegatedPlugin.js +39 -0
- package/lib/DependenciesBlock.js +124 -0
- package/lib/DependenciesBlockVariable.js +72 -0
- package/lib/Dependency.js +89 -0
- package/lib/DllEntryPlugin.js +54 -0
- package/lib/DllModule.js +60 -0
- package/lib/DllModuleFactory.js +29 -0
- package/lib/DllPlugin.js +49 -0
- package/lib/DllReferencePlugin.js +156 -0
- package/lib/DynamicEntryPlugin.js +94 -0
- package/lib/EntryModuleNotFoundError.js +21 -0
- package/lib/EntryOptionPlugin.js +46 -0
- package/lib/Entrypoint.js +64 -0
- package/lib/EnvironmentPlugin.js +72 -0
- package/lib/ErrorHelpers.js +60 -0
- package/lib/EvalDevToolModulePlugin.js +27 -0
- package/lib/EvalDevToolModuleTemplatePlugin.js +61 -0
- package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +120 -0
- package/lib/EvalSourceMapDevToolPlugin.js +41 -0
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -0
- package/lib/ExtendedAPIPlugin.js +88 -0
- package/lib/ExternalModule.js +179 -0
- package/lib/ExternalModuleFactoryPlugin.js +110 -0
- package/lib/ExternalsPlugin.js +23 -0
- package/lib/FlagAllModulesAsUsedPlugin.js +38 -0
- package/lib/FlagDependencyExportsPlugin.js +174 -0
- package/lib/FlagDependencyUsagePlugin.js +116 -0
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -0
- package/lib/FunctionModulePlugin.js +19 -0
- package/lib/FunctionModuleTemplatePlugin.js +102 -0
- package/lib/Generator.js +60 -0
- package/lib/GraphHelpers.js +65 -0
- package/lib/HarmonyLinkingError.js +17 -0
- package/lib/HashedModuleIdsPlugin.js +63 -0
- package/lib/HotModuleReplacement.runtime.js +721 -0
- package/lib/HotModuleReplacementPlugin.js +425 -0
- package/lib/HotUpdateChunk.js +17 -0
- package/lib/HotUpdateChunkTemplate.js +78 -0
- package/lib/IgnorePlugin.js +91 -0
- package/lib/JavascriptGenerator.js +229 -0
- package/lib/JavascriptModulesPlugin.js +185 -0
- package/lib/JsonGenerator.js +57 -0
- package/lib/JsonModulesPlugin.js +30 -0
- package/lib/JsonParser.js +27 -0
- package/lib/LibManifestPlugin.js +90 -0
- package/lib/LibraryTemplatePlugin.js +186 -0
- package/lib/LoaderOptionsPlugin.js +58 -0
- package/lib/LoaderTargetPlugin.js +24 -0
- package/lib/MainTemplate.js +568 -0
- package/lib/MemoryOutputFileSystem.js +5 -0
- package/lib/Module.js +435 -0
- package/lib/ModuleBuildError.js +52 -0
- package/lib/ModuleDependencyError.js +35 -0
- package/lib/ModuleDependencyWarning.js +25 -0
- package/lib/ModuleError.js +36 -0
- package/lib/ModuleFilenameHelpers.js +179 -0
- package/lib/ModuleNotFoundError.js +23 -0
- package/lib/ModuleParseError.js +67 -0
- package/lib/ModuleReason.js +48 -0
- package/lib/ModuleTemplate.js +93 -0
- package/lib/ModuleWarning.js +36 -0
- package/lib/MultiCompiler.js +290 -0
- package/lib/MultiEntryPlugin.js +80 -0
- package/lib/MultiModule.js +87 -0
- package/lib/MultiModuleFactory.js +23 -0
- package/lib/MultiStats.js +92 -0
- package/lib/MultiWatching.js +50 -0
- package/lib/NamedChunksPlugin.js +29 -0
- package/lib/NamedModulesPlugin.js +58 -0
- package/lib/NoEmitOnErrorsPlugin.js +20 -0
- package/lib/NoModeWarning.js +23 -0
- package/lib/NodeStuffPlugin.js +118 -0
- package/lib/NormalModule.js +582 -0
- package/lib/NormalModuleFactory.js +528 -0
- package/lib/NormalModuleReplacementPlugin.js +51 -0
- package/lib/NullFactory.js +12 -0
- package/lib/OptionsApply.js +10 -0
- package/lib/OptionsDefaulter.js +141 -0
- package/lib/Parser.js +2454 -0
- package/lib/ParserHelpers.js +103 -0
- package/lib/PrefetchPlugin.js +37 -0
- package/lib/ProgressPlugin.js +307 -0
- package/lib/ProvidePlugin.js +86 -0
- package/lib/RawModule.js +56 -0
- package/lib/RecordIdsPlugin.js +236 -0
- package/lib/RemovedPluginError.js +11 -0
- package/lib/RequestShortener.js +83 -0
- package/lib/RequireJsStuffPlugin.js +66 -0
- package/lib/ResolverFactory.js +74 -0
- package/lib/RuleSet.js +567 -0
- package/lib/RuntimeTemplate.js +336 -0
- package/lib/SetVarMainTemplatePlugin.js +69 -0
- package/lib/SingleEntryPlugin.js +63 -0
- package/lib/SizeFormatHelpers.js +24 -0
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -0
- package/lib/SourceMapDevToolPlugin.js +418 -0
- package/lib/Stats.js +1685 -0
- package/lib/SystemMainTemplatePlugin.js +137 -0
- package/lib/Template.js +291 -0
- package/lib/TemplatedPathPlugin.js +188 -0
- package/lib/UmdMainTemplatePlugin.js +305 -0
- package/lib/UnsupportedFeatureWarning.js +30 -0
- package/lib/UseStrictPlugin.js +54 -0
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -0
- package/lib/WarnNoModeSetPlugin.js +17 -0
- package/lib/WatchIgnorePlugin.js +106 -0
- package/lib/Watching.js +211 -0
- package/lib/WebpackError.js +31 -0
- package/lib/WebpackOptionsApply.js +546 -0
- package/lib/WebpackOptionsDefaulter.js +391 -0
- package/lib/WebpackOptionsValidationError.js +390 -0
- package/lib/buildChunkGraph.js +712 -0
- package/lib/compareLocations.js +52 -0
- package/lib/debug/ProfilingPlugin.js +442 -0
- package/lib/dependencies/AMDDefineDependency.js +137 -0
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +336 -0
- package/lib/dependencies/AMDPlugin.js +249 -0
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -0
- package/lib/dependencies/AMDRequireContextDependency.js +20 -0
- package/lib/dependencies/AMDRequireDependenciesBlock.js +47 -0
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +274 -0
- package/lib/dependencies/AMDRequireDependency.js +135 -0
- package/lib/dependencies/AMDRequireItemDependency.js +22 -0
- package/lib/dependencies/CommonJsPlugin.js +158 -0
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -0
- package/lib/dependencies/CommonJsRequireDependency.js +22 -0
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +138 -0
- package/lib/dependencies/ConstDependency.js +33 -0
- package/lib/dependencies/ContextDependency.js +68 -0
- package/lib/dependencies/ContextDependencyHelpers.js +232 -0
- package/lib/dependencies/ContextDependencyTemplateAsId.js +43 -0
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +39 -0
- package/lib/dependencies/ContextElementDependency.js +21 -0
- package/lib/dependencies/CriticalDependencyWarning.js +20 -0
- package/lib/dependencies/DelegatedExportsDependency.js +33 -0
- package/lib/dependencies/DelegatedSourceDependency.js +18 -0
- package/lib/dependencies/DependencyReference.js +64 -0
- package/lib/dependencies/DllEntryDependency.js +20 -0
- package/lib/dependencies/HarmonyAcceptDependency.js +48 -0
- package/lib/dependencies/HarmonyAcceptImportDependency.js +23 -0
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -0
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +96 -0
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +154 -0
- package/lib/dependencies/HarmonyExportExpressionDependency.js +58 -0
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -0
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +659 -0
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +54 -0
- package/lib/dependencies/HarmonyImportDependency.js +109 -0
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -0
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -0
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +163 -0
- package/lib/dependencies/HarmonyInitDependency.js +60 -0
- package/lib/dependencies/HarmonyModulesPlugin.js +143 -0
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -0
- package/lib/dependencies/ImportContextDependency.js +23 -0
- package/lib/dependencies/ImportDependenciesBlock.js +18 -0
- package/lib/dependencies/ImportDependency.js +34 -0
- package/lib/dependencies/ImportEagerDependency.js +32 -0
- package/lib/dependencies/ImportParserPlugin.js +248 -0
- package/lib/dependencies/ImportPlugin.js +79 -0
- package/lib/dependencies/ImportWeakDependency.js +34 -0
- package/lib/dependencies/JsonExportsDependency.js +26 -0
- package/lib/dependencies/LoaderDependency.js +21 -0
- package/lib/dependencies/LoaderPlugin.js +115 -0
- package/lib/dependencies/LocalModule.js +23 -0
- package/lib/dependencies/LocalModuleDependency.js +28 -0
- package/lib/dependencies/LocalModulesHelpers.js +52 -0
- package/lib/dependencies/ModuleDependency.js +23 -0
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -0
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -0
- package/lib/dependencies/ModuleHotAcceptDependency.js +23 -0
- package/lib/dependencies/ModuleHotDeclineDependency.js +23 -0
- package/lib/dependencies/MultiEntryDependency.js +25 -0
- package/lib/dependencies/NullDependency.js +20 -0
- package/lib/dependencies/PrefetchDependency.js +18 -0
- package/lib/dependencies/RequireContextDependency.js +22 -0
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -0
- package/lib/dependencies/RequireContextPlugin.js +143 -0
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -0
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -0
- package/lib/dependencies/RequireEnsureDependency.js +58 -0
- package/lib/dependencies/RequireEnsureItemDependency.js +21 -0
- package/lib/dependencies/RequireEnsurePlugin.js +74 -0
- package/lib/dependencies/RequireHeaderDependency.js +26 -0
- package/lib/dependencies/RequireIncludeDependency.js +39 -0
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -0
- package/lib/dependencies/RequireIncludePlugin.js +61 -0
- package/lib/dependencies/RequireResolveContextDependency.js +23 -0
- package/lib/dependencies/RequireResolveDependency.js +22 -0
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +86 -0
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -0
- package/lib/dependencies/SingleEntryDependency.js +21 -0
- package/lib/dependencies/SystemPlugin.js +122 -0
- package/lib/dependencies/UnsupportedDependency.js +27 -0
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +31 -0
- package/lib/dependencies/WebAssemblyImportDependency.js +54 -0
- package/lib/dependencies/WebpackMissingModule.js +20 -0
- package/lib/dependencies/getFunctionExpression.js +52 -0
- package/lib/formatLocation.js +75 -0
- package/lib/logging/Logger.js +128 -0
- package/lib/logging/createConsoleLogger.js +210 -0
- package/lib/logging/runtime.js +36 -0
- package/lib/logging/truncateArgs.js +76 -0
- package/lib/node/NodeChunkTemplatePlugin.js +31 -0
- package/lib/node/NodeEnvironmentPlugin.js +44 -0
- package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -0
- package/lib/node/NodeMainTemplate.runtime.js +32 -0
- package/lib/node/NodeMainTemplateAsync.runtime.js +50 -0
- package/lib/node/NodeMainTemplatePlugin.js +321 -0
- package/lib/node/NodeOutputFileSystem.js +22 -0
- package/lib/node/NodeSourcePlugin.js +141 -0
- package/lib/node/NodeTargetPlugin.js +19 -0
- package/lib/node/NodeTemplatePlugin.js +31 -0
- package/lib/node/NodeWatchFileSystem.js +109 -0
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -0
- package/lib/node/nodeConsole.js +135 -0
- package/lib/optimize/AggressiveMergingPlugin.js +87 -0
- package/lib/optimize/AggressiveSplittingPlugin.js +294 -0
- package/lib/optimize/ChunkModuleIdRangePlugin.js +66 -0
- package/lib/optimize/ConcatenatedModule.js +1477 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -0
- package/lib/optimize/FlagIncludedChunksPlugin.js +99 -0
- package/lib/optimize/LimitChunkCountPlugin.js +231 -0
- package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -0
- package/lib/optimize/MinChunkSizePlugin.js +82 -0
- package/lib/optimize/MinMaxSizeWarning.js +29 -0
- package/lib/optimize/ModuleConcatenationPlugin.js +485 -0
- package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
- package/lib/optimize/OccurrenceChunkOrderPlugin.js +66 -0
- package/lib/optimize/OccurrenceModuleOrderPlugin.js +112 -0
- package/lib/optimize/OccurrenceOrderPlugin.js +135 -0
- package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -0
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -0
- package/lib/optimize/RuntimeChunkPlugin.js +41 -0
- package/lib/optimize/SideEffectsFlagPlugin.js +352 -0
- package/lib/optimize/SplitChunksPlugin.js +971 -0
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -0
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -0
- package/lib/performance/NoAsyncChunksWarning.js +21 -0
- package/lib/performance/SizeLimitsPlugin.js +125 -0
- package/lib/util/LazyBucketSortedSet.js +235 -0
- package/lib/util/Queue.js +46 -0
- package/lib/util/Semaphore.js +53 -0
- package/lib/util/SetHelpers.js +48 -0
- package/lib/util/SortableSet.js +140 -0
- package/lib/util/StackedSetMap.js +142 -0
- package/lib/util/TrackingSet.js +35 -0
- package/lib/util/cachedMerge.js +35 -0
- package/lib/util/cleverMerge.js +77 -0
- package/lib/util/createHash.js +174 -0
- package/lib/util/deterministicGrouping.js +274 -0
- package/lib/util/hash/BatchedHash.js +71 -0
- package/lib/util/hash/md4.js +25 -0
- package/lib/util/hash/wasm-hash.js +174 -0
- package/lib/util/identifier.js +127 -0
- package/lib/util/objectToMap.js +16 -0
- package/lib/validateSchema.js +67 -0
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -0
- package/lib/wasm/WasmFinalizeExportsPlugin.js +69 -0
- package/lib/wasm/WasmMainTemplatePlugin.js +341 -0
- package/lib/wasm/WebAssemblyGenerator.js +458 -0
- package/lib/wasm/WebAssemblyInInitialChunkError.js +88 -0
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +152 -0
- package/lib/wasm/WebAssemblyModulesPlugin.js +128 -0
- package/lib/wasm/WebAssemblyParser.js +175 -0
- package/lib/wasm/WebAssemblyUtils.js +59 -0
- package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -0
- package/lib/web/JsonpChunkTemplatePlugin.js +71 -0
- package/lib/web/JsonpExportMainTemplatePlugin.js +50 -0
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -0
- package/lib/web/JsonpMainTemplate.runtime.js +71 -0
- package/lib/web/JsonpMainTemplatePlugin.js +615 -0
- package/lib/web/JsonpTemplatePlugin.js +23 -0
- package/lib/web/WebEnvironmentPlugin.js +18 -0
- package/lib/webpack.js +206 -0
- package/lib/webpack.web.js +31 -0
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -0
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -0
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +73 -0
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +192 -0
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -0
- package/package.json +211 -0
- package/schemas/WebpackOptions.json +2285 -0
- package/schemas/ajv.absolutePath.js +57 -0
- package/schemas/plugins/BannerPlugin.json +101 -0
- package/schemas/plugins/DllPlugin.json +36 -0
- package/schemas/plugins/DllReferencePlugin.json +205 -0
- package/schemas/plugins/HashedModuleIdsPlugin.json +26 -0
- package/schemas/plugins/IgnorePlugin.json +37 -0
- package/schemas/plugins/LoaderOptionsPlugin.json +27 -0
- package/schemas/plugins/ProgressPlugin.json +52 -0
- package/schemas/plugins/SourceMapDevToolPlugin.json +185 -0
- package/schemas/plugins/WatchIgnorePlugin.json +18 -0
- package/schemas/plugins/debug/ProfilingPlugin.json +13 -0
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +23 -0
- package/schemas/plugins/optimize/LimitChunkCountPlugin.json +16 -0
- package/schemas/plugins/optimize/MinChunkSizePlugin.json +12 -0
- package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +11 -0
- package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +11 -0
- package/web_modules/node-libs-browser.js +0 -0
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const Generator = require("../Generator");
|
|
8
|
+
const Template = require("../Template");
|
|
9
|
+
const WebAssemblyUtils = require("./WebAssemblyUtils");
|
|
10
|
+
const { RawSource } = require("webpack-sources");
|
|
11
|
+
|
|
12
|
+
const { editWithAST, addWithAST } = require("@webassemblyjs/wasm-edit");
|
|
13
|
+
const { decode } = require("@webassemblyjs/wasm-parser");
|
|
14
|
+
const t = require("@webassemblyjs/ast");
|
|
15
|
+
const {
|
|
16
|
+
moduleContextFromModuleAST
|
|
17
|
+
} = require("@webassemblyjs/helper-module-context");
|
|
18
|
+
|
|
19
|
+
const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency");
|
|
20
|
+
|
|
21
|
+
/** @typedef {import("../Module")} Module */
|
|
22
|
+
/** @typedef {import("./WebAssemblyUtils").UsedWasmDependency} UsedWasmDependency */
|
|
23
|
+
/** @typedef {import("../NormalModule")} NormalModule */
|
|
24
|
+
/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
|
|
25
|
+
/** @typedef {import("webpack-sources").Source} Source */
|
|
26
|
+
/** @typedef {import("../Dependency").DependencyTemplate} DependencyTemplate */
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @typedef {(ArrayBuffer) => ArrayBuffer} ArrayBufferTransform
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @template T
|
|
34
|
+
* @param {Function[]} fns transforms
|
|
35
|
+
* @returns {Function} composed transform
|
|
36
|
+
*/
|
|
37
|
+
const compose = (...fns) => {
|
|
38
|
+
return fns.reduce(
|
|
39
|
+
(prevFn, nextFn) => {
|
|
40
|
+
return value => nextFn(prevFn(value));
|
|
41
|
+
},
|
|
42
|
+
value => value
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// TODO replace with @callback
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Removes the start instruction
|
|
50
|
+
*
|
|
51
|
+
* @param {Object} state unused state
|
|
52
|
+
* @returns {ArrayBufferTransform} transform
|
|
53
|
+
*/
|
|
54
|
+
const removeStartFunc = state => bin => {
|
|
55
|
+
return editWithAST(state.ast, bin, {
|
|
56
|
+
Start(path) {
|
|
57
|
+
path.remove();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get imported globals
|
|
64
|
+
*
|
|
65
|
+
* @param {Object} ast Module's AST
|
|
66
|
+
* @returns {Array<t.ModuleImport>} - nodes
|
|
67
|
+
*/
|
|
68
|
+
const getImportedGlobals = ast => {
|
|
69
|
+
const importedGlobals = [];
|
|
70
|
+
|
|
71
|
+
t.traverse(ast, {
|
|
72
|
+
ModuleImport({ node }) {
|
|
73
|
+
if (t.isGlobalType(node.descr)) {
|
|
74
|
+
importedGlobals.push(node);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
return importedGlobals;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Get the count for imported func
|
|
84
|
+
*
|
|
85
|
+
* @param {Object} ast Module's AST
|
|
86
|
+
* @returns {Number} - count
|
|
87
|
+
*/
|
|
88
|
+
const getCountImportedFunc = ast => {
|
|
89
|
+
let count = 0;
|
|
90
|
+
|
|
91
|
+
t.traverse(ast, {
|
|
92
|
+
ModuleImport({ node }) {
|
|
93
|
+
if (t.isFuncImportDescr(node.descr)) {
|
|
94
|
+
count++;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
return count;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Get next type index
|
|
104
|
+
*
|
|
105
|
+
* @param {Object} ast Module's AST
|
|
106
|
+
* @returns {t.Index} - index
|
|
107
|
+
*/
|
|
108
|
+
const getNextTypeIndex = ast => {
|
|
109
|
+
const typeSectionMetadata = t.getSectionMetadata(ast, "type");
|
|
110
|
+
|
|
111
|
+
if (typeSectionMetadata === undefined) {
|
|
112
|
+
return t.indexLiteral(0);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return t.indexLiteral(typeSectionMetadata.vectorOfSize.value);
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Get next func index
|
|
120
|
+
*
|
|
121
|
+
* The Func section metadata provide informations for implemented funcs
|
|
122
|
+
* in order to have the correct index we shift the index by number of external
|
|
123
|
+
* functions.
|
|
124
|
+
*
|
|
125
|
+
* @param {Object} ast Module's AST
|
|
126
|
+
* @param {Number} countImportedFunc number of imported funcs
|
|
127
|
+
* @returns {t.Index} - index
|
|
128
|
+
*/
|
|
129
|
+
const getNextFuncIndex = (ast, countImportedFunc) => {
|
|
130
|
+
const funcSectionMetadata = t.getSectionMetadata(ast, "func");
|
|
131
|
+
|
|
132
|
+
if (funcSectionMetadata === undefined) {
|
|
133
|
+
return t.indexLiteral(0 + countImportedFunc);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const vectorOfSize = funcSectionMetadata.vectorOfSize.value;
|
|
137
|
+
|
|
138
|
+
return t.indexLiteral(vectorOfSize + countImportedFunc);
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Creates an init instruction for a global type
|
|
143
|
+
* @param {t.GlobalType} globalType the global type
|
|
144
|
+
* @returns {t.Instruction} init expression
|
|
145
|
+
*/
|
|
146
|
+
const createDefaultInitForGlobal = globalType => {
|
|
147
|
+
if (globalType.valtype[0] === "i") {
|
|
148
|
+
// create NumberLiteral global initializer
|
|
149
|
+
return t.objectInstruction("const", globalType.valtype, [
|
|
150
|
+
t.numberLiteralFromRaw(66)
|
|
151
|
+
]);
|
|
152
|
+
} else if (globalType.valtype[0] === "f") {
|
|
153
|
+
// create FloatLiteral global initializer
|
|
154
|
+
return t.objectInstruction("const", globalType.valtype, [
|
|
155
|
+
t.floatLiteral(66, false, false, "66")
|
|
156
|
+
]);
|
|
157
|
+
} else {
|
|
158
|
+
throw new Error("unknown type: " + globalType.valtype);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Rewrite the import globals:
|
|
164
|
+
* - removes the ModuleImport instruction
|
|
165
|
+
* - injects at the same offset a mutable global of the same type
|
|
166
|
+
*
|
|
167
|
+
* Since the imported globals are before the other global declarations, our
|
|
168
|
+
* indices will be preserved.
|
|
169
|
+
*
|
|
170
|
+
* Note that globals will become mutable.
|
|
171
|
+
*
|
|
172
|
+
* @param {Object} state unused state
|
|
173
|
+
* @returns {ArrayBufferTransform} transform
|
|
174
|
+
*/
|
|
175
|
+
const rewriteImportedGlobals = state => bin => {
|
|
176
|
+
const additionalInitCode = state.additionalInitCode;
|
|
177
|
+
const newGlobals = [];
|
|
178
|
+
|
|
179
|
+
bin = editWithAST(state.ast, bin, {
|
|
180
|
+
ModuleImport(path) {
|
|
181
|
+
if (t.isGlobalType(path.node.descr)) {
|
|
182
|
+
const globalType = path.node.descr;
|
|
183
|
+
|
|
184
|
+
globalType.mutability = "var";
|
|
185
|
+
|
|
186
|
+
const init = [
|
|
187
|
+
createDefaultInitForGlobal(globalType),
|
|
188
|
+
t.instruction("end")
|
|
189
|
+
];
|
|
190
|
+
|
|
191
|
+
newGlobals.push(t.global(globalType, init));
|
|
192
|
+
|
|
193
|
+
path.remove();
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
// in order to preserve non-imported global's order we need to re-inject
|
|
198
|
+
// those as well
|
|
199
|
+
Global(path) {
|
|
200
|
+
const { node } = path;
|
|
201
|
+
const [init] = node.init;
|
|
202
|
+
|
|
203
|
+
if (init.id === "get_global") {
|
|
204
|
+
node.globalType.mutability = "var";
|
|
205
|
+
|
|
206
|
+
const initialGlobalidx = init.args[0];
|
|
207
|
+
|
|
208
|
+
node.init = [
|
|
209
|
+
createDefaultInitForGlobal(node.globalType),
|
|
210
|
+
t.instruction("end")
|
|
211
|
+
];
|
|
212
|
+
|
|
213
|
+
additionalInitCode.push(
|
|
214
|
+
/**
|
|
215
|
+
* get_global in global initializer only works for imported globals.
|
|
216
|
+
* They have the same indices as the init params, so use the
|
|
217
|
+
* same index.
|
|
218
|
+
*/
|
|
219
|
+
t.instruction("get_local", [initialGlobalidx]),
|
|
220
|
+
t.instruction("set_global", [t.indexLiteral(newGlobals.length)])
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
newGlobals.push(node);
|
|
225
|
+
|
|
226
|
+
path.remove();
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Add global declaration instructions
|
|
231
|
+
return addWithAST(state.ast, bin, newGlobals);
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Rewrite the export names
|
|
236
|
+
* @param {Object} state state
|
|
237
|
+
* @param {Object} state.ast Module's ast
|
|
238
|
+
* @param {Module} state.module Module
|
|
239
|
+
* @param {Set<string>} state.externalExports Module
|
|
240
|
+
* @returns {ArrayBufferTransform} transform
|
|
241
|
+
*/
|
|
242
|
+
const rewriteExportNames = ({ ast, module, externalExports }) => bin => {
|
|
243
|
+
return editWithAST(ast, bin, {
|
|
244
|
+
ModuleExport(path) {
|
|
245
|
+
const isExternal = externalExports.has(path.node.name);
|
|
246
|
+
if (isExternal) {
|
|
247
|
+
path.remove();
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const usedName = module.isUsed(path.node.name);
|
|
251
|
+
if (!usedName) {
|
|
252
|
+
path.remove();
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
path.node.name = usedName;
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Mangle import names and modules
|
|
262
|
+
* @param {Object} state state
|
|
263
|
+
* @param {Object} state.ast Module's ast
|
|
264
|
+
* @param {Map<string, UsedWasmDependency>} state.usedDependencyMap mappings to mangle names
|
|
265
|
+
* @returns {ArrayBufferTransform} transform
|
|
266
|
+
*/
|
|
267
|
+
const rewriteImports = ({ ast, usedDependencyMap }) => bin => {
|
|
268
|
+
return editWithAST(ast, bin, {
|
|
269
|
+
ModuleImport(path) {
|
|
270
|
+
const result = usedDependencyMap.get(
|
|
271
|
+
path.node.module + ":" + path.node.name
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
if (result !== undefined) {
|
|
275
|
+
path.node.module = result.module;
|
|
276
|
+
path.node.name = result.name;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Add an init function.
|
|
284
|
+
*
|
|
285
|
+
* The init function fills the globals given input arguments.
|
|
286
|
+
*
|
|
287
|
+
* @param {Object} state transformation state
|
|
288
|
+
* @param {Object} state.ast Module's ast
|
|
289
|
+
* @param {t.Identifier} state.initFuncId identifier of the init function
|
|
290
|
+
* @param {t.Index} state.startAtFuncOffset index of the start function
|
|
291
|
+
* @param {t.ModuleImport[]} state.importedGlobals list of imported globals
|
|
292
|
+
* @param {t.Instruction[]} state.additionalInitCode list of addition instructions for the init function
|
|
293
|
+
* @param {t.Index} state.nextFuncIndex index of the next function
|
|
294
|
+
* @param {t.Index} state.nextTypeIndex index of the next type
|
|
295
|
+
* @returns {ArrayBufferTransform} transform
|
|
296
|
+
*/
|
|
297
|
+
const addInitFunction = ({
|
|
298
|
+
ast,
|
|
299
|
+
initFuncId,
|
|
300
|
+
startAtFuncOffset,
|
|
301
|
+
importedGlobals,
|
|
302
|
+
additionalInitCode,
|
|
303
|
+
nextFuncIndex,
|
|
304
|
+
nextTypeIndex
|
|
305
|
+
}) => bin => {
|
|
306
|
+
const funcParams = importedGlobals.map(importedGlobal => {
|
|
307
|
+
// used for debugging
|
|
308
|
+
const id = t.identifier(`${importedGlobal.module}.${importedGlobal.name}`);
|
|
309
|
+
|
|
310
|
+
return t.funcParam(importedGlobal.descr.valtype, id);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
const funcBody = importedGlobals.reduce((acc, importedGlobal, index) => {
|
|
314
|
+
const args = [t.indexLiteral(index)];
|
|
315
|
+
const body = [
|
|
316
|
+
t.instruction("get_local", args),
|
|
317
|
+
t.instruction("set_global", args)
|
|
318
|
+
];
|
|
319
|
+
|
|
320
|
+
return [...acc, ...body];
|
|
321
|
+
}, []);
|
|
322
|
+
|
|
323
|
+
if (typeof startAtFuncOffset === "number") {
|
|
324
|
+
funcBody.push(t.callInstruction(t.numberLiteralFromRaw(startAtFuncOffset)));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
for (const instr of additionalInitCode) {
|
|
328
|
+
funcBody.push(instr);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
funcBody.push(t.instruction("end"));
|
|
332
|
+
|
|
333
|
+
const funcResults = [];
|
|
334
|
+
|
|
335
|
+
// Code section
|
|
336
|
+
const funcSignature = t.signature(funcParams, funcResults);
|
|
337
|
+
const func = t.func(initFuncId, funcSignature, funcBody);
|
|
338
|
+
|
|
339
|
+
// Type section
|
|
340
|
+
const functype = t.typeInstruction(undefined, funcSignature);
|
|
341
|
+
|
|
342
|
+
// Func section
|
|
343
|
+
const funcindex = t.indexInFuncSection(nextTypeIndex);
|
|
344
|
+
|
|
345
|
+
// Export section
|
|
346
|
+
const moduleExport = t.moduleExport(
|
|
347
|
+
initFuncId.value,
|
|
348
|
+
t.moduleExportDescr("Func", nextFuncIndex)
|
|
349
|
+
);
|
|
350
|
+
|
|
351
|
+
return addWithAST(ast, bin, [func, moduleExport, funcindex, functype]);
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Extract mangle mappings from module
|
|
356
|
+
* @param {Module} module current module
|
|
357
|
+
* @param {boolean} mangle mangle imports
|
|
358
|
+
* @returns {Map<string, UsedWasmDependency>} mappings to mangled names
|
|
359
|
+
*/
|
|
360
|
+
const getUsedDependencyMap = (module, mangle) => {
|
|
361
|
+
/** @type {Map<string, UsedWasmDependency>} */
|
|
362
|
+
const map = new Map();
|
|
363
|
+
for (const usedDep of WebAssemblyUtils.getUsedDependencies(module, mangle)) {
|
|
364
|
+
const dep = usedDep.dependency;
|
|
365
|
+
const request = dep.request;
|
|
366
|
+
const exportName = dep.name;
|
|
367
|
+
map.set(request + ":" + exportName, usedDep);
|
|
368
|
+
}
|
|
369
|
+
return map;
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
class WebAssemblyGenerator extends Generator {
|
|
373
|
+
constructor(options) {
|
|
374
|
+
super();
|
|
375
|
+
this.options = options;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* @param {NormalModule} module module for which the code should be generated
|
|
380
|
+
* @param {Map<Function, DependencyTemplate>} dependencyTemplates mapping from dependencies to templates
|
|
381
|
+
* @param {RuntimeTemplate} runtimeTemplate the runtime template
|
|
382
|
+
* @param {string} type which kind of code should be generated
|
|
383
|
+
* @returns {Source} generated code
|
|
384
|
+
*/
|
|
385
|
+
generate(module, dependencyTemplates, runtimeTemplate, type) {
|
|
386
|
+
let bin = module.originalSource().source();
|
|
387
|
+
|
|
388
|
+
const initFuncId = t.identifier(
|
|
389
|
+
Array.isArray(module.usedExports)
|
|
390
|
+
? Template.numberToIdentifer(module.usedExports.length)
|
|
391
|
+
: "__webpack_init__"
|
|
392
|
+
);
|
|
393
|
+
|
|
394
|
+
// parse it
|
|
395
|
+
const ast = decode(bin, {
|
|
396
|
+
ignoreDataSection: true,
|
|
397
|
+
ignoreCodeSection: true,
|
|
398
|
+
ignoreCustomNameSection: true
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
const moduleContext = moduleContextFromModuleAST(ast.body[0]);
|
|
402
|
+
|
|
403
|
+
const importedGlobals = getImportedGlobals(ast);
|
|
404
|
+
const countImportedFunc = getCountImportedFunc(ast);
|
|
405
|
+
const startAtFuncOffset = moduleContext.getStart();
|
|
406
|
+
const nextFuncIndex = getNextFuncIndex(ast, countImportedFunc);
|
|
407
|
+
const nextTypeIndex = getNextTypeIndex(ast);
|
|
408
|
+
|
|
409
|
+
const usedDependencyMap = getUsedDependencyMap(
|
|
410
|
+
module,
|
|
411
|
+
this.options.mangleImports
|
|
412
|
+
);
|
|
413
|
+
const externalExports = new Set(
|
|
414
|
+
module.dependencies
|
|
415
|
+
.filter(d => d instanceof WebAssemblyExportImportedDependency)
|
|
416
|
+
.map(d => {
|
|
417
|
+
const wasmDep = /** @type {WebAssemblyExportImportedDependency} */ (d);
|
|
418
|
+
return wasmDep.exportName;
|
|
419
|
+
})
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
/** @type {t.Instruction[]} */
|
|
423
|
+
const additionalInitCode = [];
|
|
424
|
+
|
|
425
|
+
const transform = compose(
|
|
426
|
+
rewriteExportNames({
|
|
427
|
+
ast,
|
|
428
|
+
module,
|
|
429
|
+
externalExports
|
|
430
|
+
}),
|
|
431
|
+
|
|
432
|
+
removeStartFunc({ ast }),
|
|
433
|
+
|
|
434
|
+
rewriteImportedGlobals({ ast, additionalInitCode }),
|
|
435
|
+
|
|
436
|
+
rewriteImports({
|
|
437
|
+
ast,
|
|
438
|
+
usedDependencyMap
|
|
439
|
+
}),
|
|
440
|
+
|
|
441
|
+
addInitFunction({
|
|
442
|
+
ast,
|
|
443
|
+
initFuncId,
|
|
444
|
+
importedGlobals,
|
|
445
|
+
additionalInitCode,
|
|
446
|
+
startAtFuncOffset,
|
|
447
|
+
nextFuncIndex,
|
|
448
|
+
nextTypeIndex
|
|
449
|
+
})
|
|
450
|
+
);
|
|
451
|
+
|
|
452
|
+
const newBin = transform(bin);
|
|
453
|
+
|
|
454
|
+
return new RawSource(newBin);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
module.exports = WebAssemblyGenerator;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
*/
|
|
4
|
+
"use strict";
|
|
5
|
+
|
|
6
|
+
const WebpackError = require("../WebpackError");
|
|
7
|
+
|
|
8
|
+
/** @typedef {import("../Module")} Module */
|
|
9
|
+
/** @typedef {import("../RequestShortener")} RequestShortener */
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {Module} module module to get chains from
|
|
13
|
+
* @param {RequestShortener} requestShortener to make readable identifiers
|
|
14
|
+
* @returns {string[]} all chains to the module
|
|
15
|
+
*/
|
|
16
|
+
const getInitialModuleChains = (module, requestShortener) => {
|
|
17
|
+
const queue = [
|
|
18
|
+
{ head: module, message: module.readableIdentifier(requestShortener) }
|
|
19
|
+
];
|
|
20
|
+
/** @type {Set<string>} */
|
|
21
|
+
const results = new Set();
|
|
22
|
+
/** @type {Set<string>} */
|
|
23
|
+
const incompleteResults = new Set();
|
|
24
|
+
/** @type {Set<Module>} */
|
|
25
|
+
const visitedModules = new Set();
|
|
26
|
+
|
|
27
|
+
for (const chain of queue) {
|
|
28
|
+
const { head, message } = chain;
|
|
29
|
+
let final = true;
|
|
30
|
+
/** @type {Set<Module>} */
|
|
31
|
+
const alreadyReferencedModules = new Set();
|
|
32
|
+
for (const reason of head.reasons) {
|
|
33
|
+
const newHead = reason.module;
|
|
34
|
+
if (newHead) {
|
|
35
|
+
if (!newHead.getChunks().some(c => c.canBeInitial())) continue;
|
|
36
|
+
final = false;
|
|
37
|
+
if (alreadyReferencedModules.has(newHead)) continue;
|
|
38
|
+
alreadyReferencedModules.add(newHead);
|
|
39
|
+
const moduleName = newHead.readableIdentifier(requestShortener);
|
|
40
|
+
const detail = reason.explanation ? ` (${reason.explanation})` : "";
|
|
41
|
+
const newMessage = `${moduleName}${detail} --> ${message}`;
|
|
42
|
+
if (visitedModules.has(newHead)) {
|
|
43
|
+
incompleteResults.add(`... --> ${newMessage}`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
visitedModules.add(newHead);
|
|
47
|
+
queue.push({
|
|
48
|
+
head: newHead,
|
|
49
|
+
message: newMessage
|
|
50
|
+
});
|
|
51
|
+
} else {
|
|
52
|
+
final = false;
|
|
53
|
+
const newMessage = reason.explanation
|
|
54
|
+
? `(${reason.explanation}) --> ${message}`
|
|
55
|
+
: message;
|
|
56
|
+
results.add(newMessage);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (final) {
|
|
60
|
+
results.add(message);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const result of incompleteResults) {
|
|
64
|
+
results.add(result);
|
|
65
|
+
}
|
|
66
|
+
return Array.from(results);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
module.exports = class WebAssemblyInInitialChunkError extends WebpackError {
|
|
70
|
+
/**
|
|
71
|
+
* @param {Module} module WASM module
|
|
72
|
+
* @param {RequestShortener} requestShortener request shortener
|
|
73
|
+
*/
|
|
74
|
+
constructor(module, requestShortener) {
|
|
75
|
+
const moduleChains = getInitialModuleChains(module, requestShortener);
|
|
76
|
+
const message = `WebAssembly module is included in initial chunk.
|
|
77
|
+
This is not allowed, because WebAssembly download and compilation must happen asynchronous.
|
|
78
|
+
Add an async splitpoint (i. e. import()) somewhere between your entrypoint and the WebAssembly module:
|
|
79
|
+
${moduleChains.map(s => `* ${s}`).join("\n")}`;
|
|
80
|
+
|
|
81
|
+
super(message);
|
|
82
|
+
this.name = "WebAssemblyInInitialChunkError";
|
|
83
|
+
this.hideStack = true;
|
|
84
|
+
this.module = module;
|
|
85
|
+
|
|
86
|
+
Error.captureStackTrace(this, this.constructor);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const Generator = require("../Generator");
|
|
8
|
+
const Template = require("../Template");
|
|
9
|
+
const { RawSource } = require("webpack-sources");
|
|
10
|
+
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
|
|
11
|
+
const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency");
|
|
12
|
+
|
|
13
|
+
/** @typedef {import("../NormalModule")} NormalModule */
|
|
14
|
+
/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
|
|
15
|
+
/** @typedef {import("webpack-sources").Source} Source */
|
|
16
|
+
/** @typedef {import("../Dependency").DependencyTemplate} DependencyTemplate */
|
|
17
|
+
|
|
18
|
+
class WebAssemblyJavascriptGenerator extends Generator {
|
|
19
|
+
/**
|
|
20
|
+
* @param {NormalModule} module module for which the code should be generated
|
|
21
|
+
* @param {Map<Function, DependencyTemplate>} dependencyTemplates mapping from dependencies to templates
|
|
22
|
+
* @param {RuntimeTemplate} runtimeTemplate the runtime template
|
|
23
|
+
* @param {string} type which kind of code should be generated
|
|
24
|
+
* @returns {Source} generated code
|
|
25
|
+
*/
|
|
26
|
+
generate(module, dependencyTemplates, runtimeTemplate, type) {
|
|
27
|
+
const initIdentifer = Array.isArray(module.usedExports)
|
|
28
|
+
? Template.numberToIdentifer(module.usedExports.length)
|
|
29
|
+
: "__webpack_init__";
|
|
30
|
+
|
|
31
|
+
let needExportsCopy = false;
|
|
32
|
+
const importedModules = new Map();
|
|
33
|
+
const initParams = [];
|
|
34
|
+
let index = 0;
|
|
35
|
+
for (const dep of module.dependencies) {
|
|
36
|
+
const depAsAny = /** @type {any} */ (dep);
|
|
37
|
+
if (dep.module) {
|
|
38
|
+
let importData = importedModules.get(dep.module);
|
|
39
|
+
if (importData === undefined) {
|
|
40
|
+
importedModules.set(
|
|
41
|
+
dep.module,
|
|
42
|
+
(importData = {
|
|
43
|
+
importVar: `m${index}`,
|
|
44
|
+
index,
|
|
45
|
+
request:
|
|
46
|
+
"userRequest" in depAsAny ? depAsAny.userRequest : undefined,
|
|
47
|
+
names: new Set(),
|
|
48
|
+
reexports: []
|
|
49
|
+
})
|
|
50
|
+
);
|
|
51
|
+
index++;
|
|
52
|
+
}
|
|
53
|
+
if (dep instanceof WebAssemblyImportDependency) {
|
|
54
|
+
importData.names.add(dep.name);
|
|
55
|
+
if (dep.description.type === "GlobalType") {
|
|
56
|
+
const exportName = dep.name;
|
|
57
|
+
const usedName = dep.module && dep.module.isUsed(exportName);
|
|
58
|
+
|
|
59
|
+
if (dep.module) {
|
|
60
|
+
if (usedName) {
|
|
61
|
+
initParams.push(
|
|
62
|
+
runtimeTemplate.exportFromImport({
|
|
63
|
+
module: dep.module,
|
|
64
|
+
request: dep.request,
|
|
65
|
+
importVar: importData.importVar,
|
|
66
|
+
originModule: module,
|
|
67
|
+
exportName: dep.name,
|
|
68
|
+
asiSafe: true,
|
|
69
|
+
isCall: false,
|
|
70
|
+
callContext: null
|
|
71
|
+
})
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (dep instanceof WebAssemblyExportImportedDependency) {
|
|
78
|
+
importData.names.add(dep.name);
|
|
79
|
+
const usedName = module.isUsed(dep.exportName);
|
|
80
|
+
if (usedName) {
|
|
81
|
+
const exportProp = `${module.exportsArgument}[${JSON.stringify(
|
|
82
|
+
usedName
|
|
83
|
+
)}]`;
|
|
84
|
+
const defineStatement = Template.asString([
|
|
85
|
+
`${exportProp} = ${runtimeTemplate.exportFromImport({
|
|
86
|
+
module: dep.module,
|
|
87
|
+
request: dep.request,
|
|
88
|
+
importVar: importData.importVar,
|
|
89
|
+
originModule: module,
|
|
90
|
+
exportName: dep.name,
|
|
91
|
+
asiSafe: true,
|
|
92
|
+
isCall: false,
|
|
93
|
+
callContext: null
|
|
94
|
+
})};`,
|
|
95
|
+
`if(WebAssembly.Global) ${exportProp} = ` +
|
|
96
|
+
`new WebAssembly.Global({ value: ${JSON.stringify(
|
|
97
|
+
dep.valueType
|
|
98
|
+
)} }, ${exportProp});`
|
|
99
|
+
]);
|
|
100
|
+
importData.reexports.push(defineStatement);
|
|
101
|
+
needExportsCopy = true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const importsCode = Template.asString(
|
|
107
|
+
Array.from(
|
|
108
|
+
importedModules,
|
|
109
|
+
([module, { importVar, request, reexports }]) => {
|
|
110
|
+
const importStatement = runtimeTemplate.importStatement({
|
|
111
|
+
module,
|
|
112
|
+
request,
|
|
113
|
+
importVar,
|
|
114
|
+
originModule: module
|
|
115
|
+
});
|
|
116
|
+
return importStatement + reexports.join("\n");
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
// create source
|
|
122
|
+
const source = new RawSource(
|
|
123
|
+
[
|
|
124
|
+
'"use strict";',
|
|
125
|
+
"// Instantiate WebAssembly module",
|
|
126
|
+
"var wasmExports = __webpack_require__.w[module.i];",
|
|
127
|
+
|
|
128
|
+
!Array.isArray(module.usedExports)
|
|
129
|
+
? `__webpack_require__.r(${module.exportsArgument});`
|
|
130
|
+
: "",
|
|
131
|
+
|
|
132
|
+
// this must be before import for circular dependencies
|
|
133
|
+
"// export exports from WebAssembly module",
|
|
134
|
+
Array.isArray(module.usedExports) && !needExportsCopy
|
|
135
|
+
? `${module.moduleArgument}.exports = wasmExports;`
|
|
136
|
+
: "for(var name in wasmExports) " +
|
|
137
|
+
`if(name != ${JSON.stringify(initIdentifer)}) ` +
|
|
138
|
+
`${module.exportsArgument}[name] = wasmExports[name];`,
|
|
139
|
+
"// exec imports from WebAssembly module (for esm order)",
|
|
140
|
+
importsCode,
|
|
141
|
+
"",
|
|
142
|
+
"// exec wasm module",
|
|
143
|
+
`wasmExports[${JSON.stringify(initIdentifer)}](${initParams.join(
|
|
144
|
+
", "
|
|
145
|
+
)})`
|
|
146
|
+
].join("\n")
|
|
147
|
+
);
|
|
148
|
+
return source;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
module.exports = WebAssemblyJavascriptGenerator;
|