webpack 4.15.0 → 4.16.2
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 -20
- package/README.md +761 -758
- package/SECURITY.md +9 -9
- package/buildin/amd-define.js +3 -3
- package/buildin/amd-options.js +2 -2
- package/buildin/global.js +20 -20
- package/buildin/harmony-module.js +24 -24
- package/buildin/module.js +22 -22
- package/buildin/system.js +7 -7
- package/hot/dev-server.js +61 -61
- package/hot/emitter.js +2 -2
- package/hot/log-apply-result.js +44 -44
- package/hot/log.js +45 -45
- package/hot/only-dev-server.js +105 -105
- package/hot/poll.js +40 -37
- package/hot/signal.js +62 -62
- package/lib/APIPlugin.js +84 -84
- package/lib/AmdMainTemplatePlugin.js +87 -87
- package/lib/AsyncDependencyToInitialChunkError.js +31 -31
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +117 -117
- package/lib/BasicEvaluatedExpression.js +211 -211
- package/lib/CachePlugin.js +102 -102
- package/lib/CaseSensitiveModulesWarning.js +67 -67
- package/lib/Chunk.js +833 -811
- package/lib/ChunkGroup.js +4 -4
- package/lib/ChunkRenderError.js +32 -32
- package/lib/CommentCompilationWarning.js +2 -2
- package/lib/CompatibilityPlugin.js +70 -70
- package/lib/Compilation.js +46 -15
- package/lib/ConcurrentCompilationError.js +19 -19
- package/lib/ConstPlugin.js +258 -258
- package/lib/ContextExclusionPlugin.js +28 -17
- package/lib/ContextModule.js +844 -739
- package/lib/ContextModuleFactory.js +262 -256
- package/lib/ContextReplacementPlugin.js +133 -133
- package/lib/DefinePlugin.js +49 -0
- package/lib/DelegatedModule.js +5 -0
- package/lib/DelegatedModuleFactoryPlugin.js +95 -89
- package/lib/DelegatedPlugin.js +39 -39
- package/lib/DependenciesBlock.js +1 -1
- package/lib/Dependency.js +10 -4
- package/lib/DllModule.js +60 -54
- package/lib/DllModuleFactory.js +29 -29
- package/lib/DllPlugin.js +44 -44
- package/lib/DllReferencePlugin.js +132 -84
- package/lib/EntryModuleNotFoundError.js +21 -21
- package/lib/Entrypoint.js +54 -54
- package/lib/EnvironmentPlugin.js +72 -65
- package/lib/ErrorHelpers.js +60 -60
- package/lib/EvalDevToolModulePlugin.js +27 -27
- package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +115 -115
- package/lib/EvalSourceMapDevToolPlugin.js +41 -41
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -53
- package/lib/ExternalModule.js +165 -159
- package/lib/ExternalsPlugin.js +23 -23
- package/lib/FlagDependencyExportsPlugin.js +146 -146
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
- package/lib/FunctionModuleTemplatePlugin.js +100 -100
- package/lib/Generator.js +60 -52
- package/lib/HarmonyLinkingError.js +17 -17
- package/lib/HashedModuleIdsPlugin.js +53 -53
- package/lib/HotModuleReplacementPlugin.js +411 -413
- package/lib/IgnorePlugin.js +90 -90
- package/lib/JavascriptGenerator.js +229 -229
- package/lib/JavascriptModulesPlugin.js +179 -179
- package/lib/JsonGenerator.js +55 -55
- package/lib/JsonModulesPlugin.js +30 -30
- package/lib/JsonParser.js +27 -27
- package/lib/LibManifestPlugin.js +86 -86
- package/lib/LibraryTemplatePlugin.js +153 -153
- package/lib/LoaderOptionsPlugin.js +53 -53
- package/lib/LoaderTargetPlugin.js +24 -24
- package/lib/MemoryOutputFileSystem.js +5 -5
- package/lib/Module.js +431 -391
- package/lib/ModuleBuildError.js +52 -52
- package/lib/ModuleDependencyError.js +35 -35
- package/lib/ModuleDependencyWarning.js +25 -25
- package/lib/ModuleError.js +36 -36
- package/lib/ModuleFilenameHelpers.js +178 -178
- package/lib/ModuleNotFoundError.js +23 -23
- package/lib/ModuleParseError.js +57 -57
- package/lib/ModuleTemplate.js +93 -93
- package/lib/ModuleWarning.js +36 -36
- package/lib/MultiCompiler.js +283 -283
- package/lib/MultiModule.js +87 -81
- package/lib/MultiModuleFactory.js +23 -23
- package/lib/MultiStats.js +92 -92
- package/lib/MultiWatching.js +38 -38
- package/lib/NamedChunksPlugin.js +29 -29
- package/lib/NamedModulesPlugin.js +57 -57
- package/lib/NoEmitOnErrorsPlugin.js +20 -20
- package/lib/NoModeWarning.js +23 -23
- package/lib/NodeStuffPlugin.js +197 -179
- package/lib/NormalModule.js +542 -536
- package/lib/NormalModuleFactory.js +526 -526
- package/lib/NormalModuleReplacementPlugin.js +51 -51
- package/lib/NullFactory.js +12 -12
- package/lib/OptionsApply.js +10 -10
- package/lib/OptionsDefaulter.js +84 -84
- package/lib/Parser.js +2202 -2193
- package/lib/ParserHelpers.js +103 -103
- package/lib/PrefetchPlugin.js +37 -37
- package/lib/ProgressPlugin.js +246 -246
- package/lib/ProvidePlugin.js +86 -86
- package/lib/RawModule.js +56 -56
- package/lib/RecordIdsPlugin.js +230 -230
- package/lib/RemovedPluginError.js +11 -11
- package/lib/RequestShortener.js +83 -83
- package/lib/RequireJsStuffPlugin.js +69 -69
- package/lib/ResolverFactory.js +64 -64
- package/lib/RuntimeTemplate.js +12 -0
- package/lib/SetVarMainTemplatePlugin.js +69 -69
- package/lib/SingleEntryPlugin.js +6 -1
- package/lib/SizeFormatHelpers.js +24 -24
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
- package/lib/SourceMapDevToolPlugin.js +301 -301
- package/lib/Stats.js +28 -5
- package/lib/TemplatedPathPlugin.js +173 -173
- package/lib/UnsupportedFeatureWarning.js +22 -22
- package/lib/UseStrictPlugin.js +54 -54
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -37
- package/lib/WarnNoModeSetPlugin.js +17 -17
- package/lib/WatchIgnorePlugin.js +100 -100
- package/lib/Watching.js +194 -194
- package/lib/WebpackOptionsApply.js +92 -10
- package/lib/WebpackOptionsDefaulter.js +368 -354
- package/lib/debug/ProfilingPlugin.js +430 -430
- package/lib/dependencies/AMDPlugin.js +250 -250
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
- package/lib/dependencies/AMDRequireContextDependency.js +20 -20
- package/lib/dependencies/AMDRequireDependency.js +135 -135
- package/lib/dependencies/AMDRequireItemDependency.js +22 -22
- package/lib/dependencies/CommonJsPlugin.js +161 -161
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
- package/lib/dependencies/CommonJsRequireDependency.js +22 -22
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +6 -0
- package/lib/dependencies/ConstDependency.js +33 -33
- package/lib/dependencies/ContextDependency.js +68 -68
- package/lib/dependencies/ContextDependencyHelpers.js +142 -142
- package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
- package/lib/dependencies/ContextElementDependency.js +21 -21
- package/lib/dependencies/CriticalDependencyWarning.js +20 -20
- package/lib/dependencies/DelegatedSourceDependency.js +18 -18
- package/lib/dependencies/DllEntryDependency.js +20 -20
- package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -92
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +2 -1
- package/lib/dependencies/HarmonyImportDependency.js +109 -109
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -222
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +167 -167
- package/lib/dependencies/HarmonyInitDependency.js +60 -60
- package/lib/dependencies/HarmonyModulesPlugin.js +146 -146
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -26
- package/lib/dependencies/ImportContextDependency.js +23 -23
- package/lib/dependencies/ImportDependenciesBlock.js +18 -18
- package/lib/dependencies/ImportDependency.js +34 -34
- package/lib/dependencies/ImportEagerDependency.js +32 -32
- package/lib/dependencies/ImportParserPlugin.js +263 -263
- package/lib/dependencies/ImportPlugin.js +82 -82
- package/lib/dependencies/ImportWeakDependency.js +34 -34
- package/lib/dependencies/LoaderPlugin.js +18 -1
- package/lib/dependencies/LocalModule.js +23 -23
- package/lib/dependencies/LocalModulesHelpers.js +52 -52
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
- package/lib/dependencies/ModuleHotAcceptDependency.js +23 -23
- package/lib/dependencies/ModuleHotDeclineDependency.js +23 -23
- package/lib/dependencies/NullDependency.js +20 -20
- package/lib/dependencies/PrefetchDependency.js +18 -18
- package/lib/dependencies/RequireContextDependency.js +22 -22
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
- package/lib/dependencies/RequireContextPlugin.js +143 -143
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -116
- package/lib/dependencies/RequireEnsureDependency.js +58 -58
- package/lib/dependencies/RequireEnsureItemDependency.js +21 -21
- package/lib/dependencies/RequireEnsurePlugin.js +74 -74
- package/lib/dependencies/RequireHeaderDependency.js +26 -26
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
- package/lib/dependencies/RequireIncludePlugin.js +61 -61
- package/lib/dependencies/RequireResolveContextDependency.js +23 -23
- package/lib/dependencies/RequireResolveDependency.js +22 -22
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
- package/lib/dependencies/SystemPlugin.js +125 -125
- package/lib/dependencies/UnsupportedDependency.js +27 -27
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +29 -29
- package/lib/dependencies/WebAssemblyImportDependency.js +48 -48
- package/lib/dependencies/WebpackMissingModule.js +20 -20
- package/lib/formatLocation.js +75 -61
- package/lib/node/NodeChunkTemplatePlugin.js +31 -31
- package/lib/node/NodeEnvironmentPlugin.js +28 -28
- package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -36
- package/lib/node/NodeMainTemplate.runtime.js +27 -27
- package/lib/node/NodeMainTemplatePlugin.js +323 -323
- package/lib/node/NodeOutputFileSystem.js +22 -22
- package/lib/node/NodeSourcePlugin.js +144 -144
- package/lib/node/NodeTargetPlugin.js +18 -18
- package/lib/node/NodeTemplatePlugin.js +31 -31
- package/lib/node/NodeWatchFileSystem.js +99 -99
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -61
- package/lib/optimize/AggressiveMergingPlugin.js +87 -87
- package/lib/optimize/AggressiveSplittingPlugin.js +287 -287
- package/lib/optimize/ConcatenatedModule.js +5 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -70
- package/lib/optimize/FlagIncludedChunksPlugin.js +99 -99
- package/lib/optimize/LimitChunkCountPlugin.js +66 -66
- package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -78
- package/lib/optimize/MinChunkSizePlugin.js +77 -77
- package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
- package/lib/optimize/OccurrenceChunkOrderPlugin.js +61 -0
- package/lib/optimize/OccurrenceModuleOrderPlugin.js +103 -0
- package/lib/optimize/OccurrenceOrderPlugin.js +135 -133
- package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -42
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -127
- package/lib/optimize/RuntimeChunkPlugin.js +41 -41
- package/lib/optimize/SideEffectsFlagPlugin.js +168 -168
- package/lib/optimize/SplitChunksPlugin.js +866 -850
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -30
- package/lib/performance/NoAsyncChunksWarning.js +21 -21
- package/lib/performance/SizeLimitsPlugin.js +105 -105
- package/lib/util/SortableSet.js +1 -0
- package/lib/util/StackedSetMap.js +144 -135
- package/lib/util/TrackingSet.js +35 -35
- package/lib/util/cachedMerge.js +35 -35
- package/lib/util/deterministicGrouping.js +251 -251
- package/lib/util/identifier.js +103 -103
- package/lib/util/objectToMap.js +16 -16
- package/lib/validateSchema.js +67 -67
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -17
- package/lib/wasm/WasmFinalizeExportsPlugin.js +1 -1
- package/lib/wasm/WebAssemblyGenerator.js +16 -2
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +147 -133
- package/lib/wasm/WebAssemblyParser.js +174 -174
- package/lib/wasm/WebAssemblyUtils.js +59 -59
- package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -37
- package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
- package/lib/web/JsonpMainTemplate.runtime.js +65 -65
- package/lib/web/JsonpMainTemplatePlugin.js +1 -1
- package/lib/web/JsonpTemplatePlugin.js +23 -23
- package/lib/web/WebEnvironmentPlugin.js +18 -18
- package/lib/webpack.js +5 -0
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -65
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +196 -196
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
- package/package.json +22 -13
- package/schemas/WebpackOptions.json +2062 -2036
- package/schemas/ajv.absolutePath.js +55 -55
- package/schemas/plugins/BannerPlugin.json +96 -96
- package/schemas/plugins/DllPlugin.json +32 -32
- package/schemas/plugins/DllReferencePlugin.json +99 -99
- package/schemas/plugins/HashedModuleIdsPlugin.json +24 -24
- package/schemas/plugins/LoaderOptionsPlugin.json +26 -26
- package/schemas/plugins/SourceMapDevToolPlugin.json +187 -187
- package/schemas/plugins/WatchIgnorePlugin.json +16 -16
- package/schemas/plugins/debug/ProfilingPlugin.json +12 -12
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +22 -22
- package/schemas/plugins/optimize/LimitChunkCountPlugin.json +15 -15
- package/schemas/plugins/optimize/MinChunkSizePlugin.json +13 -13
- package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +10 -0
- package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +10 -0
@@ -1,133 +1,147 @@
|
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
if (
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
}
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
"//
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
",
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
module.
|
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 defineStatement = Template.asString([
|
82
|
+
`${module.exportsArgument}[${JSON.stringify(
|
83
|
+
usedName
|
84
|
+
)}] = ${runtimeTemplate.exportFromImport({
|
85
|
+
module: dep.module,
|
86
|
+
request: dep.request,
|
87
|
+
importVar: importData.importVar,
|
88
|
+
originModule: module,
|
89
|
+
exportName: dep.name,
|
90
|
+
asiSafe: true,
|
91
|
+
isCall: false,
|
92
|
+
callContext: null
|
93
|
+
})};`
|
94
|
+
]);
|
95
|
+
importData.reexports.push(defineStatement);
|
96
|
+
needExportsCopy = true;
|
97
|
+
}
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
const importsCode = Template.asString(
|
102
|
+
Array.from(
|
103
|
+
importedModules,
|
104
|
+
([module, { importVar, request, reexports }]) => {
|
105
|
+
const importStatement = runtimeTemplate.importStatement({
|
106
|
+
module,
|
107
|
+
request,
|
108
|
+
importVar,
|
109
|
+
originModule: module
|
110
|
+
});
|
111
|
+
return importStatement + reexports.join("\n");
|
112
|
+
}
|
113
|
+
)
|
114
|
+
);
|
115
|
+
|
116
|
+
// create source
|
117
|
+
const source = new RawSource(
|
118
|
+
[
|
119
|
+
'"use strict";',
|
120
|
+
"// Instantiate WebAssembly module",
|
121
|
+
"var wasmExports = __webpack_require__.w[module.i];",
|
122
|
+
|
123
|
+
!Array.isArray(module.usedExports)
|
124
|
+
? `__webpack_require__.r(${module.exportsArgument});`
|
125
|
+
: "",
|
126
|
+
|
127
|
+
// this must be before import for circular dependencies
|
128
|
+
"// export exports from WebAssembly module",
|
129
|
+
Array.isArray(module.usedExports) && !needExportsCopy
|
130
|
+
? `${module.moduleArgument}.exports = wasmExports;`
|
131
|
+
: "for(var name in wasmExports) " +
|
132
|
+
`if(name != ${JSON.stringify(initIdentifer)}) ` +
|
133
|
+
`${module.exportsArgument}[name] = wasmExports[name];`,
|
134
|
+
"// exec imports from WebAssembly module (for esm order)",
|
135
|
+
importsCode,
|
136
|
+
"",
|
137
|
+
"// exec wasm module",
|
138
|
+
`wasmExports[${JSON.stringify(initIdentifer)}](${initParams.join(
|
139
|
+
", "
|
140
|
+
)})`
|
141
|
+
].join("\n")
|
142
|
+
);
|
143
|
+
return source;
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
147
|
+
module.exports = WebAssemblyJavascriptGenerator;
|
@@ -1,174 +1,174 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Tobias Koppers @sokra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const t = require("@webassemblyjs/ast");
|
8
|
-
const { decode } = require("@webassemblyjs/wasm-parser");
|
9
|
-
const {
|
10
|
-
moduleContextFromModuleAST
|
11
|
-
} = require("@webassemblyjs/helper-module-context");
|
12
|
-
|
13
|
-
const { Tapable } = require("tapable");
|
14
|
-
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
|
15
|
-
const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency");
|
16
|
-
|
17
|
-
/** @typedef {import("../Module")} Module */
|
18
|
-
|
19
|
-
const JS_COMPAT_TYPES = new Set(["i32", "f32", "f64"]);
|
20
|
-
|
21
|
-
/**
|
22
|
-
* @param {t.Signature} signature the func signature
|
23
|
-
* @returns {null | string} the type incompatible with js types
|
24
|
-
*/
|
25
|
-
const getJsIncompatibleType = signature => {
|
26
|
-
for (const param of signature.params) {
|
27
|
-
if (!JS_COMPAT_TYPES.has(param.valtype)) {
|
28
|
-
return `${param.valtype} as parameter`;
|
29
|
-
}
|
30
|
-
}
|
31
|
-
for (const type of signature.results) {
|
32
|
-
if (!JS_COMPAT_TYPES.has(type)) return `${type} as result`;
|
33
|
-
}
|
34
|
-
return null;
|
35
|
-
};
|
36
|
-
|
37
|
-
/**
|
38
|
-
* TODO why are there two different Signature types?
|
39
|
-
* @param {t.FuncSignature} signature the func signature
|
40
|
-
* @returns {null | string} the type incompatible with js types
|
41
|
-
*/
|
42
|
-
const getJsIncompatibleTypeOfFuncSignature = signature => {
|
43
|
-
for (const param of signature.args) {
|
44
|
-
if (!JS_COMPAT_TYPES.has(param)) {
|
45
|
-
return `${param} as parameter`;
|
46
|
-
}
|
47
|
-
}
|
48
|
-
for (const type of signature.result) {
|
49
|
-
if (!JS_COMPAT_TYPES.has(type)) return `${type} as result`;
|
50
|
-
}
|
51
|
-
return null;
|
52
|
-
};
|
53
|
-
|
54
|
-
const decoderOpts = {
|
55
|
-
ignoreCodeSection: true,
|
56
|
-
ignoreDataSection: true,
|
57
|
-
|
58
|
-
// this will avoid having to lookup with identifiers in the ModuleContext
|
59
|
-
ignoreCustomNameSection: true
|
60
|
-
};
|
61
|
-
|
62
|
-
class WebAssemblyParser extends Tapable {
|
63
|
-
constructor(options) {
|
64
|
-
super();
|
65
|
-
this.hooks = {};
|
66
|
-
this.options = options;
|
67
|
-
}
|
68
|
-
|
69
|
-
parse(binary, state) {
|
70
|
-
// flag it as ESM
|
71
|
-
state.module.buildMeta.exportsType = "namespace";
|
72
|
-
|
73
|
-
// parse it
|
74
|
-
const program = decode(binary, decoderOpts);
|
75
|
-
const module = program.body[0];
|
76
|
-
|
77
|
-
const moduleContext = moduleContextFromModuleAST(module);
|
78
|
-
|
79
|
-
// extract imports and exports
|
80
|
-
const exports = (state.module.buildMeta.providedExports = []);
|
81
|
-
const jsIncompatibleExports = (state.module.buildMeta.jsIncompatibleExports = []);
|
82
|
-
|
83
|
-
const importedGlobals = [];
|
84
|
-
t.traverse(module, {
|
85
|
-
ModuleExport({ node }) {
|
86
|
-
const descriptor = node.descr;
|
87
|
-
|
88
|
-
if (descriptor.exportType === "Func") {
|
89
|
-
const funcidx = descriptor.id.value;
|
90
|
-
|
91
|
-
/** @type {t.FuncSignature} */
|
92
|
-
const funcSignature = moduleContext.getFunction(funcidx);
|
93
|
-
|
94
|
-
const incompatibleType = getJsIncompatibleTypeOfFuncSignature(
|
95
|
-
funcSignature
|
96
|
-
);
|
97
|
-
|
98
|
-
if (incompatibleType) {
|
99
|
-
jsIncompatibleExports[node.name] = incompatibleType;
|
100
|
-
}
|
101
|
-
}
|
102
|
-
|
103
|
-
exports.push(node.name);
|
104
|
-
|
105
|
-
if (node.descr && node.descr.exportType === "Global") {
|
106
|
-
const refNode = importedGlobals[node.descr.id.value];
|
107
|
-
if (refNode) {
|
108
|
-
const dep = new WebAssemblyExportImportedDependency(
|
109
|
-
node.name,
|
110
|
-
refNode.module,
|
111
|
-
refNode.name
|
112
|
-
);
|
113
|
-
|
114
|
-
state.module.addDependency(dep);
|
115
|
-
}
|
116
|
-
}
|
117
|
-
},
|
118
|
-
|
119
|
-
Global({ node }) {
|
120
|
-
const init = node.init[0];
|
121
|
-
|
122
|
-
let importNode = null;
|
123
|
-
|
124
|
-
if (init.id === "get_global") {
|
125
|
-
const globalIdx = init.args[0].value;
|
126
|
-
|
127
|
-
if (globalIdx < importedGlobals.length) {
|
128
|
-
importNode = importedGlobals[globalIdx];
|
129
|
-
}
|
130
|
-
}
|
131
|
-
|
132
|
-
importedGlobals.push(importNode);
|
133
|
-
},
|
134
|
-
|
135
|
-
ModuleImport({ node }) {
|
136
|
-
/** @type {false | string} */
|
137
|
-
let onlyDirectImport = false;
|
138
|
-
|
139
|
-
if (t.isMemory(node.descr) === true) {
|
140
|
-
onlyDirectImport = "Memory";
|
141
|
-
} else if (t.isTable(node.descr) === true) {
|
142
|
-
onlyDirectImport = "Table";
|
143
|
-
} else if (t.isFuncImportDescr(node.descr) === true) {
|
144
|
-
const incompatibleType = getJsIncompatibleType(node.descr.signature);
|
145
|
-
if (incompatibleType) {
|
146
|
-
onlyDirectImport = `Non-JS-compatible Func Sigurature (${incompatibleType})`;
|
147
|
-
}
|
148
|
-
} else if (t.isGlobalType(node.descr) === true) {
|
149
|
-
const type = node.descr.valtype;
|
150
|
-
if (!JS_COMPAT_TYPES.has(type)) {
|
151
|
-
onlyDirectImport = `Non-JS-compatible Global Type (${type})`;
|
152
|
-
}
|
153
|
-
}
|
154
|
-
|
155
|
-
const dep = new WebAssemblyImportDependency(
|
156
|
-
node.module,
|
157
|
-
node.name,
|
158
|
-
node.descr,
|
159
|
-
onlyDirectImport
|
160
|
-
);
|
161
|
-
|
162
|
-
state.module.addDependency(dep);
|
163
|
-
|
164
|
-
if (t.isGlobalType(node.descr)) {
|
165
|
-
importedGlobals.push(node);
|
166
|
-
}
|
167
|
-
}
|
168
|
-
});
|
169
|
-
|
170
|
-
return state;
|
171
|
-
}
|
172
|
-
}
|
173
|
-
|
174
|
-
module.exports = WebAssemblyParser;
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const t = require("@webassemblyjs/ast");
|
8
|
+
const { decode } = require("@webassemblyjs/wasm-parser");
|
9
|
+
const {
|
10
|
+
moduleContextFromModuleAST
|
11
|
+
} = require("@webassemblyjs/helper-module-context");
|
12
|
+
|
13
|
+
const { Tapable } = require("tapable");
|
14
|
+
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
|
15
|
+
const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency");
|
16
|
+
|
17
|
+
/** @typedef {import("../Module")} Module */
|
18
|
+
|
19
|
+
const JS_COMPAT_TYPES = new Set(["i32", "f32", "f64"]);
|
20
|
+
|
21
|
+
/**
|
22
|
+
* @param {t.Signature} signature the func signature
|
23
|
+
* @returns {null | string} the type incompatible with js types
|
24
|
+
*/
|
25
|
+
const getJsIncompatibleType = signature => {
|
26
|
+
for (const param of signature.params) {
|
27
|
+
if (!JS_COMPAT_TYPES.has(param.valtype)) {
|
28
|
+
return `${param.valtype} as parameter`;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
for (const type of signature.results) {
|
32
|
+
if (!JS_COMPAT_TYPES.has(type)) return `${type} as result`;
|
33
|
+
}
|
34
|
+
return null;
|
35
|
+
};
|
36
|
+
|
37
|
+
/**
|
38
|
+
* TODO why are there two different Signature types?
|
39
|
+
* @param {t.FuncSignature} signature the func signature
|
40
|
+
* @returns {null | string} the type incompatible with js types
|
41
|
+
*/
|
42
|
+
const getJsIncompatibleTypeOfFuncSignature = signature => {
|
43
|
+
for (const param of signature.args) {
|
44
|
+
if (!JS_COMPAT_TYPES.has(param)) {
|
45
|
+
return `${param} as parameter`;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
for (const type of signature.result) {
|
49
|
+
if (!JS_COMPAT_TYPES.has(type)) return `${type} as result`;
|
50
|
+
}
|
51
|
+
return null;
|
52
|
+
};
|
53
|
+
|
54
|
+
const decoderOpts = {
|
55
|
+
ignoreCodeSection: true,
|
56
|
+
ignoreDataSection: true,
|
57
|
+
|
58
|
+
// this will avoid having to lookup with identifiers in the ModuleContext
|
59
|
+
ignoreCustomNameSection: true
|
60
|
+
};
|
61
|
+
|
62
|
+
class WebAssemblyParser extends Tapable {
|
63
|
+
constructor(options) {
|
64
|
+
super();
|
65
|
+
this.hooks = {};
|
66
|
+
this.options = options;
|
67
|
+
}
|
68
|
+
|
69
|
+
parse(binary, state) {
|
70
|
+
// flag it as ESM
|
71
|
+
state.module.buildMeta.exportsType = "namespace";
|
72
|
+
|
73
|
+
// parse it
|
74
|
+
const program = decode(binary, decoderOpts);
|
75
|
+
const module = program.body[0];
|
76
|
+
|
77
|
+
const moduleContext = moduleContextFromModuleAST(module);
|
78
|
+
|
79
|
+
// extract imports and exports
|
80
|
+
const exports = (state.module.buildMeta.providedExports = []);
|
81
|
+
const jsIncompatibleExports = (state.module.buildMeta.jsIncompatibleExports = []);
|
82
|
+
|
83
|
+
const importedGlobals = [];
|
84
|
+
t.traverse(module, {
|
85
|
+
ModuleExport({ node }) {
|
86
|
+
const descriptor = node.descr;
|
87
|
+
|
88
|
+
if (descriptor.exportType === "Func") {
|
89
|
+
const funcidx = descriptor.id.value;
|
90
|
+
|
91
|
+
/** @type {t.FuncSignature} */
|
92
|
+
const funcSignature = moduleContext.getFunction(funcidx);
|
93
|
+
|
94
|
+
const incompatibleType = getJsIncompatibleTypeOfFuncSignature(
|
95
|
+
funcSignature
|
96
|
+
);
|
97
|
+
|
98
|
+
if (incompatibleType) {
|
99
|
+
jsIncompatibleExports[node.name] = incompatibleType;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
exports.push(node.name);
|
104
|
+
|
105
|
+
if (node.descr && node.descr.exportType === "Global") {
|
106
|
+
const refNode = importedGlobals[node.descr.id.value];
|
107
|
+
if (refNode) {
|
108
|
+
const dep = new WebAssemblyExportImportedDependency(
|
109
|
+
node.name,
|
110
|
+
refNode.module,
|
111
|
+
refNode.name
|
112
|
+
);
|
113
|
+
|
114
|
+
state.module.addDependency(dep);
|
115
|
+
}
|
116
|
+
}
|
117
|
+
},
|
118
|
+
|
119
|
+
Global({ node }) {
|
120
|
+
const init = node.init[0];
|
121
|
+
|
122
|
+
let importNode = null;
|
123
|
+
|
124
|
+
if (init.id === "get_global") {
|
125
|
+
const globalIdx = init.args[0].value;
|
126
|
+
|
127
|
+
if (globalIdx < importedGlobals.length) {
|
128
|
+
importNode = importedGlobals[globalIdx];
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
importedGlobals.push(importNode);
|
133
|
+
},
|
134
|
+
|
135
|
+
ModuleImport({ node }) {
|
136
|
+
/** @type {false | string} */
|
137
|
+
let onlyDirectImport = false;
|
138
|
+
|
139
|
+
if (t.isMemory(node.descr) === true) {
|
140
|
+
onlyDirectImport = "Memory";
|
141
|
+
} else if (t.isTable(node.descr) === true) {
|
142
|
+
onlyDirectImport = "Table";
|
143
|
+
} else if (t.isFuncImportDescr(node.descr) === true) {
|
144
|
+
const incompatibleType = getJsIncompatibleType(node.descr.signature);
|
145
|
+
if (incompatibleType) {
|
146
|
+
onlyDirectImport = `Non-JS-compatible Func Sigurature (${incompatibleType})`;
|
147
|
+
}
|
148
|
+
} else if (t.isGlobalType(node.descr) === true) {
|
149
|
+
const type = node.descr.valtype;
|
150
|
+
if (!JS_COMPAT_TYPES.has(type)) {
|
151
|
+
onlyDirectImport = `Non-JS-compatible Global Type (${type})`;
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
155
|
+
const dep = new WebAssemblyImportDependency(
|
156
|
+
node.module,
|
157
|
+
node.name,
|
158
|
+
node.descr,
|
159
|
+
onlyDirectImport
|
160
|
+
);
|
161
|
+
|
162
|
+
state.module.addDependency(dep);
|
163
|
+
|
164
|
+
if (t.isGlobalType(node.descr)) {
|
165
|
+
importedGlobals.push(node);
|
166
|
+
}
|
167
|
+
}
|
168
|
+
});
|
169
|
+
|
170
|
+
return state;
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
module.exports = WebAssemblyParser;
|