webpack 4.9.1 → 4.10.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/README.md +755 -755
- package/SECURITY.md +9 -9
- package/buildin/global.js +20 -20
- package/buildin/harmony-module.js +24 -24
- package/buildin/module.js +22 -22
- package/hot/dev-server.js +61 -61
- 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 +37 -37
- package/hot/signal.js +62 -62
- package/lib/APIPlugin.js +84 -84
- package/lib/AmdMainTemplatePlugin.js +87 -75
- package/lib/AsyncDependenciesBlock.js +66 -66
- package/lib/AsyncDependencyToInitialChunkError.js +31 -21
- package/lib/AutomaticPrefetchPlugin.js +50 -50
- package/lib/BannerPlugin.js +3 -1
- package/lib/BasicEvaluatedExpression.js +211 -208
- package/lib/CachePlugin.js +102 -95
- package/lib/CaseSensitiveModulesWarning.js +71 -53
- package/lib/Chunk.js +750 -722
- package/lib/ChunkGroup.js +13 -5
- package/lib/ChunkRenderError.js +32 -32
- package/lib/CompatibilityPlugin.js +63 -63
- package/lib/Compilation.js +1947 -1905
- package/lib/Compiler.js +508 -496
- package/lib/ConcurrentCompilationError.js +19 -19
- package/lib/ConstPlugin.js +258 -242
- package/lib/ContextExclusionPlugin.js +17 -17
- package/lib/ContextModule.js +749 -710
- package/lib/ContextModuleFactory.js +256 -245
- package/lib/ContextReplacementPlugin.js +133 -126
- package/lib/DefinePlugin.js +206 -197
- package/lib/DelegatedModule.js +101 -101
- package/lib/DelegatedModuleFactoryPlugin.js +89 -89
- package/lib/DelegatedPlugin.js +39 -39
- package/lib/DependenciesBlock.js +89 -87
- package/lib/DependenciesBlockVariable.js +52 -51
- package/lib/Dependency.js +51 -51
- package/lib/DllEntryPlugin.js +51 -51
- package/lib/DllModule.js +54 -54
- package/lib/DllModuleFactory.js +29 -29
- package/lib/DllPlugin.js +44 -42
- package/lib/DllReferencePlugin.js +84 -84
- package/lib/DynamicEntryPlugin.js +73 -71
- package/lib/EntryOptionPlugin.js +33 -33
- package/lib/EnvironmentPlugin.js +65 -65
- package/lib/ErrorHelpers.js +60 -57
- package/lib/EvalDevToolModulePlugin.js +27 -27
- package/lib/EvalDevToolModuleTemplatePlugin.js +61 -61
- package/lib/EvalSourceMapDevToolPlugin.js +41 -40
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -40
- package/lib/ExtendedAPIPlugin.js +84 -84
- package/lib/ExternalModule.js +159 -159
- package/lib/ExternalModuleFactoryPlugin.js +110 -110
- package/lib/ExternalsPlugin.js +23 -23
- package/lib/FlagDependencyExportsPlugin.js +146 -146
- package/lib/FlagDependencyUsagePlugin.js +110 -104
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
- package/lib/FunctionModulePlugin.js +19 -19
- package/lib/FunctionModuleTemplatePlugin.js +100 -98
- package/lib/GraphHelpers.js +64 -64
- package/lib/HarmonyLinkingError.js +18 -18
- package/lib/HashedModuleIdsPlugin.js +53 -53
- package/lib/HotModuleReplacement.runtime.js +7 -3
- package/lib/HotModuleReplacementPlugin.js +413 -406
- package/lib/HotUpdateChunk.js +16 -16
- package/lib/HotUpdateChunkTemplate.js +78 -78
- package/lib/IgnorePlugin.js +71 -71
- package/lib/JavascriptGenerator.js +229 -228
- package/lib/JavascriptModulesPlugin.js +179 -184
- package/lib/JsonGenerator.js +42 -42
- package/lib/JsonModulesPlugin.js +30 -30
- package/lib/JsonParser.js +27 -26
- package/lib/LibManifestPlugin.js +86 -86
- package/lib/LibraryTemplatePlugin.js +153 -119
- package/lib/LoaderOptionsPlugin.js +53 -52
- package/lib/LoaderTargetPlugin.js +24 -24
- package/lib/MainTemplate.js +34 -9
- package/lib/Module.js +381 -377
- package/lib/ModuleBuildError.js +42 -42
- package/lib/ModuleDependencyError.js +35 -25
- package/lib/ModuleDependencyWarning.js +25 -25
- package/lib/ModuleError.js +28 -28
- package/lib/ModuleFilenameHelpers.js +178 -166
- package/lib/ModuleParseError.js +44 -44
- package/lib/ModuleReason.js +40 -40
- package/lib/ModuleTemplate.js +84 -84
- package/lib/ModuleWarning.js +30 -30
- package/lib/MultiCompiler.js +283 -271
- package/lib/MultiEntryPlugin.js +58 -58
- package/lib/MultiModule.js +81 -78
- 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 +179 -178
- package/lib/NormalModule.js +497 -490
- package/lib/NormalModuleFactory.js +501 -483
- package/lib/NormalModuleReplacementPlugin.js +51 -51
- package/lib/OptionsDefaulter.js +84 -80
- package/lib/Parser.js +2164 -2086
- package/lib/ParserHelpers.js +103 -100
- package/lib/PrefetchPlugin.js +37 -37
- package/lib/ProgressPlugin.js +231 -231
- package/lib/ProvidePlugin.js +86 -86
- package/lib/RawModule.js +56 -54
- package/lib/RecordIdsPlugin.js +166 -162
- package/lib/RemovedPluginError.js +13 -13
- package/lib/RequestShortener.js +81 -74
- package/lib/RequireJsStuffPlugin.js +69 -69
- package/lib/ResolverFactory.js +64 -64
- package/lib/RuleSet.js +555 -534
- package/lib/RuntimeTemplate.js +320 -277
- package/lib/SetVarMainTemplatePlugin.js +69 -57
- package/lib/SingleEntryPlugin.js +44 -44
- package/lib/SizeFormatHelpers.js +24 -24
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
- package/lib/SourceMapDevToolPlugin.js +301 -300
- package/lib/Stats.js +1408 -1367
- package/lib/Template.js +4 -2
- package/lib/TemplatedPathPlugin.js +173 -170
- package/lib/UmdMainTemplatePlugin.js +304 -264
- package/lib/UseStrictPlugin.js +48 -48
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -36
- package/lib/WarnNoModeSetPlugin.js +17 -17
- package/lib/WatchIgnorePlugin.js +100 -100
- package/lib/Watching.js +194 -193
- package/lib/WebpackError.js +25 -19
- package/lib/WebpackOptionsApply.js +421 -405
- package/lib/WebpackOptionsDefaulter.js +347 -344
- package/lib/WebpackOptionsValidationError.js +345 -316
- package/lib/compareLocations.js +56 -56
- package/lib/dependencies/AMDDefineDependency.js +137 -137
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +336 -327
- package/lib/dependencies/AMDPlugin.js +250 -250
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
- package/lib/dependencies/AMDRequireContextDependency.js +20 -20
- package/lib/dependencies/AMDRequireDependenciesBlock.js +43 -43
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +273 -270
- package/lib/dependencies/AMDRequireDependency.js +135 -135
- package/lib/dependencies/CommonJsPlugin.js +161 -161
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +130 -130
- package/lib/dependencies/ConstDependency.js +33 -33
- package/lib/dependencies/ContextDependency.js +68 -68
- package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
- package/lib/dependencies/ContextElementDependency.js +21 -21
- package/lib/dependencies/DelegatedExportsDependency.js +33 -33
- package/lib/dependencies/DependencyReference.js +18 -18
- package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
- package/lib/dependencies/HarmonyAcceptImportDependency.js +23 -23
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -90
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
- package/lib/dependencies/HarmonyExportExpressionDependency.js +53 -53
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +620 -603
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +54 -54
- package/lib/dependencies/HarmonyImportDependency.js +104 -94
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +217 -214
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +166 -156
- 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 +233 -232
- package/lib/dependencies/ImportPlugin.js +82 -82
- package/lib/dependencies/ImportWeakDependency.js +34 -34
- package/lib/dependencies/JsonExportsDependency.js +26 -26
- package/lib/dependencies/LoaderPlugin.js +98 -93
- package/lib/dependencies/LocalModuleDependency.js +28 -28
- package/lib/dependencies/LocalModulesHelpers.js +52 -45
- package/lib/dependencies/ModuleDependency.js +20 -20
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
- package/lib/dependencies/MultiEntryDependency.js +20 -20
- package/lib/dependencies/NullDependency.js +20 -20
- package/lib/dependencies/RequireContextDependency.js +22 -22
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
- package/lib/dependencies/RequireContextPlugin.js +143 -141
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -112
- package/lib/dependencies/RequireEnsureDependency.js +58 -58
- package/lib/dependencies/RequireEnsurePlugin.js +74 -74
- package/lib/dependencies/RequireHeaderDependency.js +26 -26
- package/lib/dependencies/RequireIncludeDependency.js +39 -39
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
- package/lib/dependencies/RequireIncludePlugin.js +61 -61
- package/lib/dependencies/RequireResolveContextDependency.js +23 -23
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
- package/lib/dependencies/SingleEntryDependency.js +18 -18
- package/lib/dependencies/SystemPlugin.js +125 -125
- package/lib/dependencies/UnsupportedDependency.js +27 -27
- package/lib/dependencies/WebAssemblyImportDependency.js +48 -44
- package/lib/dependencies/WebpackMissingModule.js +20 -20
- package/lib/dependencies/getFunctionExpression.js +52 -52
- package/lib/formatLocation.js +61 -53
- 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/NodeMainTemplateAsync.runtime.js +44 -44
- package/lib/node/NodeMainTemplatePlugin.js +323 -320
- package/lib/node/NodeSourcePlugin.js +144 -140
- package/lib/node/NodeTargetPlugin.js +18 -18
- package/lib/node/NodeTemplatePlugin.js +31 -31
- package/lib/node/NodeWatchFileSystem.js +99 -82
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +52 -52
- package/lib/optimize/AggressiveMergingPlugin.js +87 -87
- package/lib/optimize/AggressiveSplittingPlugin.js +287 -281
- package/lib/optimize/ChunkModuleIdRangePlugin.js +68 -68
- package/lib/optimize/ConcatenatedModule.js +1420 -1413
- 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 -75
- package/lib/optimize/MinChunkSizePlugin.js +77 -77
- package/lib/optimize/ModuleConcatenationPlugin.js +470 -457
- package/lib/optimize/OccurrenceOrderPlugin.js +133 -126
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -117
- package/lib/optimize/RuntimeChunkPlugin.js +41 -41
- package/lib/optimize/SideEffectsFlagPlugin.js +158 -156
- package/lib/optimize/SplitChunksPlugin.js +709 -696
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +31 -31
- package/lib/performance/NoAsyncChunksWarning.js +21 -21
- package/lib/performance/SizeLimitsPlugin.js +105 -105
- package/lib/util/Semaphore.js +41 -41
- package/lib/util/SortableSet.js +5 -2
- package/lib/util/StackedSetMap.js +12 -5
- package/lib/util/TrackingSet.js +35 -35
- package/lib/util/cachedMerge.js +35 -35
- package/lib/util/createHash.js +77 -77
- package/lib/util/identifier.js +76 -76
- package/lib/validateSchema.js +67 -67
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +18 -18
- package/lib/wasm/WasmMainTemplatePlugin.js +310 -304
- package/lib/wasm/WebAssemblyGenerator.js +143 -19
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +90 -107
- package/lib/wasm/WebAssemblyModulesPlugin.js +80 -80
- package/lib/wasm/WebAssemblyParser.js +28 -5
- package/lib/wasm/WebAssemblyUtils.js +48 -0
- package/lib/web/FetchCompileWasmTemplatePlugin.js +25 -25
- package/lib/web/JsonpChunkTemplatePlugin.js +47 -47
- package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
- package/lib/web/JsonpMainTemplate.runtime.js +65 -64
- package/lib/web/JsonpMainTemplatePlugin.js +576 -574
- package/lib/web/JsonpTemplatePlugin.js +23 -23
- package/lib/webpack.js +183 -182
- package/lib/webpack.web.js +31 -31
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -64
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +179 -179
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
- package/package.json +9 -8
- package/schemas/WebpackOptions.json +1988 -1988
- package/schemas/ajv.absolutePath.js +55 -55
- 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
@@ -5,14 +5,40 @@
|
|
5
5
|
"use strict";
|
6
6
|
|
7
7
|
const Generator = require("../Generator");
|
8
|
+
const Template = require("../Template");
|
9
|
+
const WebAssemblyUtils = require("./WebAssemblyUtils");
|
8
10
|
const { RawSource } = require("webpack-sources");
|
9
11
|
|
12
|
+
const { shrinkPaddedLEB128 } = require("@webassemblyjs/wasm-opt");
|
10
13
|
const { editWithAST, addWithAST } = require("@webassemblyjs/wasm-edit");
|
11
14
|
const { decode } = require("@webassemblyjs/wasm-parser");
|
12
15
|
const t = require("@webassemblyjs/ast");
|
13
16
|
|
17
|
+
/** @typedef {import("../Module")} Module */
|
18
|
+
/** @typedef {import("./WebAssemblyUtils").UsedWasmDependency} UsedWasmDependency */
|
19
|
+
|
20
|
+
/**
|
21
|
+
* @typedef {(ArrayBuffer) => ArrayBuffer} ArrayBufferTransform
|
22
|
+
*/
|
23
|
+
|
24
|
+
/**
|
25
|
+
* Run some preprocessing on the binary before wasm-edit
|
26
|
+
*
|
27
|
+
* @param {ArrayBuffer} ab - original binary
|
28
|
+
* @returns {ArrayBufferTransform} transform
|
29
|
+
*/
|
30
|
+
function preprocess(ab) {
|
31
|
+
const optBin = shrinkPaddedLEB128(new Uint8Array(ab));
|
32
|
+
return optBin.buffer;
|
33
|
+
}
|
34
|
+
|
35
|
+
/**
|
36
|
+
* @template T
|
37
|
+
* @param {Function[]} fns transforms
|
38
|
+
* @returns {Function} composed transform
|
39
|
+
*/
|
14
40
|
function compose(...fns) {
|
15
|
-
return fns.
|
41
|
+
return fns.reduce((prevFn, nextFn) => {
|
16
42
|
return value => nextFn(prevFn(value));
|
17
43
|
}, value => value);
|
18
44
|
}
|
@@ -31,12 +57,7 @@ const isGlobalImport = n => n.descr.type === "GlobalType";
|
|
31
57
|
*/
|
32
58
|
const isFuncImport = n => n.descr.type === "FuncImportDescr";
|
33
59
|
|
34
|
-
const initFuncId = t.identifier("__webpack_init__");
|
35
|
-
|
36
60
|
// TODO replace with @callback
|
37
|
-
/**
|
38
|
-
* @typedef {(ArrayBuffer) => ArrayBuffer} ArrayBufferTransform
|
39
|
-
*/
|
40
61
|
|
41
62
|
/**
|
42
63
|
* Removes the start instruction
|
@@ -166,14 +187,33 @@ const rewriteImportedGlobals = state => bin => {
|
|
166
187
|
|
167
188
|
globalType.mutability = "var";
|
168
189
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
190
|
+
let init;
|
191
|
+
|
192
|
+
if (globalType.valtype[0] === "i") {
|
193
|
+
// create NumberLiteral global initializer
|
194
|
+
init = t.objectInstruction("const", globalType.valtype, [
|
195
|
+
t.numberLiteralFromRaw(0)
|
196
|
+
]);
|
197
|
+
} else if (globalType.valtype[0] === "f") {
|
198
|
+
// create FloatLiteral global initializer
|
199
|
+
init = t.objectInstruction("const", globalType.valtype, [
|
200
|
+
t.floatLiteral(0, false, false, "0")
|
201
|
+
]);
|
202
|
+
} else {
|
203
|
+
throw new Error("unknown type: " + globalType.valtype);
|
204
|
+
}
|
205
|
+
|
206
|
+
newGlobals.push(t.global(globalType, [init]));
|
174
207
|
|
175
208
|
path.remove();
|
176
209
|
}
|
210
|
+
},
|
211
|
+
|
212
|
+
// in order to preserve non-imported global's order we need to re-inject
|
213
|
+
// those as well
|
214
|
+
Global(path) {
|
215
|
+
newGlobals.push(path.node);
|
216
|
+
path.remove();
|
177
217
|
}
|
178
218
|
});
|
179
219
|
|
@@ -181,6 +221,49 @@ const rewriteImportedGlobals = state => bin => {
|
|
181
221
|
return addWithAST(state.ast, bin, newGlobals);
|
182
222
|
};
|
183
223
|
|
224
|
+
/**
|
225
|
+
* Rewrite the export names
|
226
|
+
* @param {Object} state state
|
227
|
+
* @param {Object} state.ast Module's ast
|
228
|
+
* @param {Object} state.module Module
|
229
|
+
* @returns {ArrayBufferTransform} transform
|
230
|
+
*/
|
231
|
+
const rewriteExportNames = ({ ast, module }) => bin => {
|
232
|
+
return editWithAST(ast, bin, {
|
233
|
+
ModuleExport(path) {
|
234
|
+
const usedName = module.isUsed(path.node.name);
|
235
|
+
if (usedName) {
|
236
|
+
path.node.name = usedName;
|
237
|
+
} else {
|
238
|
+
path.remove();
|
239
|
+
}
|
240
|
+
}
|
241
|
+
});
|
242
|
+
};
|
243
|
+
|
244
|
+
/**
|
245
|
+
* Mangle import names and modules
|
246
|
+
* @param {Object} state state
|
247
|
+
* @param {Object} state.ast Module's ast
|
248
|
+
* @param {Map<string, UsedWasmDependency>} state.usedDependencyMap mappings to mangle names
|
249
|
+
* @returns {ArrayBufferTransform} transform
|
250
|
+
*/
|
251
|
+
const rewriteImports = ({ ast, usedDependencyMap }) => bin => {
|
252
|
+
return editWithAST(ast, bin, {
|
253
|
+
ModuleImport(path) {
|
254
|
+
const result = usedDependencyMap.get(
|
255
|
+
path.node.module + ":" + path.node.name
|
256
|
+
);
|
257
|
+
if (result === undefined) {
|
258
|
+
path.remove();
|
259
|
+
} else {
|
260
|
+
path.node.module = WebAssemblyUtils.MANGLED_MODULE;
|
261
|
+
path.node.name = result.name;
|
262
|
+
}
|
263
|
+
}
|
264
|
+
});
|
265
|
+
};
|
266
|
+
|
184
267
|
/**
|
185
268
|
* Add an init function.
|
186
269
|
*
|
@@ -188,6 +271,7 @@ const rewriteImportedGlobals = state => bin => {
|
|
188
271
|
*
|
189
272
|
* @param {Object} state transformation state
|
190
273
|
* @param {Object} state.ast - Module's ast
|
274
|
+
* @param {t.Identifier} state.initFuncId identifier of the init function
|
191
275
|
* @param {t.IndexLiteral} state.startAtFuncIndex index of the start function
|
192
276
|
* @param {t.ModuleImport[]} state.importedGlobals list of imported globals
|
193
277
|
* @param {t.IndexLiteral} state.nextFuncIndex index of the next function
|
@@ -196,6 +280,7 @@ const rewriteImportedGlobals = state => bin => {
|
|
196
280
|
*/
|
197
281
|
const addInitFunction = ({
|
198
282
|
ast,
|
283
|
+
initFuncId,
|
199
284
|
startAtFuncIndex,
|
200
285
|
importedGlobals,
|
201
286
|
nextFuncIndex,
|
@@ -225,30 +310,56 @@ const addInitFunction = ({
|
|
225
310
|
const funcResults = [];
|
226
311
|
|
227
312
|
// Code section
|
228
|
-
const
|
313
|
+
const funcSignature = t.signature(funcParams, funcResults);
|
314
|
+
const func = t.func(initFuncId, funcSignature, funcBody);
|
229
315
|
|
230
316
|
// Type section
|
231
|
-
const functype = t.
|
232
|
-
func.signature.params,
|
233
|
-
func.signature.result
|
234
|
-
);
|
317
|
+
const functype = t.typeInstruction(undefined, funcSignature);
|
235
318
|
|
236
319
|
// Func section
|
237
320
|
const funcindex = t.indexInFuncSection(nextTypeIndex);
|
238
321
|
|
239
322
|
// Export section
|
240
|
-
const moduleExport = t.moduleExport(
|
323
|
+
const moduleExport = t.moduleExport(
|
324
|
+
initFuncId.value,
|
325
|
+
t.moduleExportDescr("Func", nextFuncIndex)
|
326
|
+
);
|
241
327
|
|
242
328
|
return addWithAST(ast, bin, [func, moduleExport, funcindex, functype]);
|
243
329
|
};
|
244
330
|
|
331
|
+
/**
|
332
|
+
* Extract mangle mappings from module
|
333
|
+
* @param {Module} module current module
|
334
|
+
* @returns {Map<string, UsedWasmDependency>} mappings to mangled names
|
335
|
+
*/
|
336
|
+
const getUsedDependencyMap = module => {
|
337
|
+
/** @type {Map<string, UsedWasmDependency>} */
|
338
|
+
const map = new Map();
|
339
|
+
for (const usedDep of WebAssemblyUtils.getUsedDependencies(module)) {
|
340
|
+
const dep = usedDep.dependency;
|
341
|
+
const request = dep.request;
|
342
|
+
const exportName = dep.name;
|
343
|
+
map.set(request + ":" + exportName, usedDep);
|
344
|
+
}
|
345
|
+
return map;
|
346
|
+
};
|
347
|
+
|
245
348
|
class WebAssemblyGenerator extends Generator {
|
246
349
|
generate(module) {
|
247
|
-
|
350
|
+
let bin = module.originalSource().source();
|
351
|
+
bin = preprocess(bin);
|
352
|
+
|
353
|
+
const initFuncId = t.identifier(
|
354
|
+
Array.isArray(module.usedExports)
|
355
|
+
? Template.numberToIdentifer(module.usedExports.length)
|
356
|
+
: "__webpack_init__"
|
357
|
+
);
|
248
358
|
|
249
359
|
const ast = decode(bin, {
|
250
360
|
ignoreDataSection: true,
|
251
|
-
ignoreCodeSection: true
|
361
|
+
ignoreCodeSection: true,
|
362
|
+
ignoreCustomNameSection: true
|
252
363
|
});
|
253
364
|
|
254
365
|
const importedGlobals = getImportedGlobals(ast);
|
@@ -257,13 +368,26 @@ class WebAssemblyGenerator extends Generator {
|
|
257
368
|
const nextFuncIndex = getNextFuncIndex(ast, countImportedFunc);
|
258
369
|
const nextTypeIndex = getNextTypeIndex(ast);
|
259
370
|
|
371
|
+
const usedDependencyMap = getUsedDependencyMap(module);
|
372
|
+
|
260
373
|
const transform = compose(
|
374
|
+
rewriteExportNames({
|
375
|
+
ast,
|
376
|
+
module
|
377
|
+
}),
|
378
|
+
|
261
379
|
removeStartFunc({ ast }),
|
262
380
|
|
263
381
|
rewriteImportedGlobals({ ast }),
|
264
382
|
|
383
|
+
rewriteImports({
|
384
|
+
ast,
|
385
|
+
usedDependencyMap
|
386
|
+
}),
|
387
|
+
|
265
388
|
addInitFunction({
|
266
389
|
ast,
|
390
|
+
initFuncId,
|
267
391
|
importedGlobals,
|
268
392
|
startAtFuncIndex,
|
269
393
|
nextFuncIndex,
|
@@ -1,107 +1,90 @@
|
|
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
|
-
|
12
|
-
function generateInitParams(module) {
|
13
|
-
const list = [];
|
14
|
-
|
15
|
-
for (const dep of module.dependencies) {
|
16
|
-
if (dep instanceof WebAssemblyImportDependency) {
|
17
|
-
if (dep.description.type === "GlobalType") {
|
18
|
-
const exportName = dep.name;
|
19
|
-
const usedName = dep.module && dep.module.isUsed(exportName);
|
20
|
-
|
21
|
-
if (dep.module === null) {
|
22
|
-
// Dependency was not found, an error will be thrown later
|
23
|
-
continue;
|
24
|
-
}
|
25
|
-
|
26
|
-
if (usedName !== false) {
|
27
|
-
list.push(
|
28
|
-
`__webpack_require__(${JSON.stringify(
|
29
|
-
dep.module.id
|
30
|
-
)})[${JSON.stringify(usedName)}]`
|
31
|
-
);
|
32
|
-
}
|
33
|
-
}
|
34
|
-
}
|
35
|
-
}
|
36
|
-
|
37
|
-
return list;
|
38
|
-
}
|
39
|
-
|
40
|
-
class WebAssemblyJavascriptGenerator extends Generator {
|
41
|
-
generate(module, dependencyTemplates, runtimeTemplate) {
|
42
|
-
const
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
const
|
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
|
-
// this must be before import for circular dependencies
|
93
|
-
"// export exports from WebAssembly module",
|
94
|
-
generateExports(),
|
95
|
-
|
96
|
-
"// exec imports from WebAssembly module (for esm order)",
|
97
|
-
generateImports(),
|
98
|
-
|
99
|
-
"// exec wasm module",
|
100
|
-
`instance.exports.__webpack_init__(${initParams})`
|
101
|
-
].join("\n")
|
102
|
-
);
|
103
|
-
return source;
|
104
|
-
}
|
105
|
-
}
|
106
|
-
|
107
|
-
module.exports = WebAssemblyJavascriptGenerator;
|
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
|
+
|
12
|
+
function generateInitParams(module) {
|
13
|
+
const list = [];
|
14
|
+
|
15
|
+
for (const dep of module.dependencies) {
|
16
|
+
if (dep instanceof WebAssemblyImportDependency) {
|
17
|
+
if (dep.description.type === "GlobalType") {
|
18
|
+
const exportName = dep.name;
|
19
|
+
const usedName = dep.module && dep.module.isUsed(exportName);
|
20
|
+
|
21
|
+
if (dep.module === null) {
|
22
|
+
// Dependency was not found, an error will be thrown later
|
23
|
+
continue;
|
24
|
+
}
|
25
|
+
|
26
|
+
if (usedName !== false) {
|
27
|
+
list.push(
|
28
|
+
`__webpack_require__(${JSON.stringify(
|
29
|
+
dep.module.id
|
30
|
+
)})[${JSON.stringify(usedName)}]`
|
31
|
+
);
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
return list;
|
38
|
+
}
|
39
|
+
|
40
|
+
class WebAssemblyJavascriptGenerator extends Generator {
|
41
|
+
generate(module, dependencyTemplates, runtimeTemplate) {
|
42
|
+
const initIdentifer = Array.isArray(module.usedExports)
|
43
|
+
? Template.numberToIdentifer(module.usedExports.length)
|
44
|
+
: "__webpack_init__";
|
45
|
+
|
46
|
+
const generateImports = () => {
|
47
|
+
const modules = new Map();
|
48
|
+
for (const dep of module.dependencies) {
|
49
|
+
if (dep.module) modules.set(dep.module, dep.userRequest);
|
50
|
+
}
|
51
|
+
return Template.asString(
|
52
|
+
Array.from(modules, ([m, r]) => {
|
53
|
+
return `${runtimeTemplate.moduleRaw({
|
54
|
+
module: m,
|
55
|
+
request: r
|
56
|
+
})};`;
|
57
|
+
})
|
58
|
+
);
|
59
|
+
};
|
60
|
+
|
61
|
+
// FIXME(sven): assert that the exports exists in the modules
|
62
|
+
// otherwise it will default to i32 0
|
63
|
+
const initParams = generateInitParams(module).join(",");
|
64
|
+
|
65
|
+
// create source
|
66
|
+
const source = new RawSource(
|
67
|
+
[
|
68
|
+
'"use strict";',
|
69
|
+
"// Instantiate WebAssembly module",
|
70
|
+
"var wasmExports = __webpack_require__.w[module.i];",
|
71
|
+
|
72
|
+
// this must be before import for circular dependencies
|
73
|
+
"// export exports from WebAssembly module",
|
74
|
+
Array.isArray(module.usedExports)
|
75
|
+
? `${module.moduleArgument}.exports = wasmExports;`
|
76
|
+
: "for(var name in wasmExports) " +
|
77
|
+
`if(name != ${JSON.stringify(initIdentifer)}) ` +
|
78
|
+
`${module.exportsArgument}[name] = wasmExports[name];`,
|
79
|
+
"// exec imports from WebAssembly module (for esm order)",
|
80
|
+
generateImports(),
|
81
|
+
|
82
|
+
"// exec wasm module",
|
83
|
+
`wasmExports[${JSON.stringify(initIdentifer)}](${initParams})`
|
84
|
+
].join("\n")
|
85
|
+
);
|
86
|
+
return source;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
module.exports = WebAssemblyJavascriptGenerator;
|
@@ -1,80 +1,80 @@
|
|
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 WebAssemblyParser = require("./WebAssemblyParser");
|
9
|
-
const WebAssemblyGenerator = require("./WebAssemblyGenerator");
|
10
|
-
const WebAssemblyJavascriptGenerator = require("./WebAssemblyJavascriptGenerator");
|
11
|
-
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
|
12
|
-
|
13
|
-
class WebAssemblyModulesPlugin {
|
14
|
-
apply(compiler) {
|
15
|
-
compiler.hooks.compilation.tap(
|
16
|
-
"WebAssemblyModulesPlugin",
|
17
|
-
(compilation, { normalModuleFactory }) => {
|
18
|
-
compilation.dependencyFactories.set(
|
19
|
-
WebAssemblyImportDependency,
|
20
|
-
normalModuleFactory
|
21
|
-
);
|
22
|
-
|
23
|
-
normalModuleFactory.hooks.createParser
|
24
|
-
.for("webassembly/experimental")
|
25
|
-
.tap("WebAssemblyModulesPlugin", () => {
|
26
|
-
return new WebAssemblyParser();
|
27
|
-
});
|
28
|
-
|
29
|
-
normalModuleFactory.hooks.createGenerator
|
30
|
-
.for("webassembly/experimental")
|
31
|
-
.tap("WebAssemblyModulesPlugin", () => {
|
32
|
-
return Generator.byType({
|
33
|
-
javascript: new WebAssemblyJavascriptGenerator(),
|
34
|
-
webassembly: new WebAssemblyGenerator()
|
35
|
-
});
|
36
|
-
});
|
37
|
-
|
38
|
-
compilation.chunkTemplate.hooks.renderManifest.tap(
|
39
|
-
"WebAssemblyModulesPlugin",
|
40
|
-
(result, options) => {
|
41
|
-
const chunk = options.chunk;
|
42
|
-
const outputOptions = options.outputOptions;
|
43
|
-
const moduleTemplates = options.moduleTemplates;
|
44
|
-
const dependencyTemplates = options.dependencyTemplates;
|
45
|
-
|
46
|
-
for (const module of chunk.modulesIterable) {
|
47
|
-
if (module.type && module.type.startsWith("webassembly")) {
|
48
|
-
const filenameTemplate =
|
49
|
-
outputOptions.webassemblyModuleFilename;
|
50
|
-
|
51
|
-
result.push({
|
52
|
-
render: () =>
|
53
|
-
this.renderWebAssembly(
|
54
|
-
module,
|
55
|
-
moduleTemplates.webassembly,
|
56
|
-
dependencyTemplates
|
57
|
-
),
|
58
|
-
filenameTemplate,
|
59
|
-
pathOptions: {
|
60
|
-
module
|
61
|
-
},
|
62
|
-
identifier: `webassemblyModule${module.id}`,
|
63
|
-
hash: module.hash
|
64
|
-
});
|
65
|
-
}
|
66
|
-
}
|
67
|
-
|
68
|
-
return result;
|
69
|
-
}
|
70
|
-
);
|
71
|
-
}
|
72
|
-
);
|
73
|
-
}
|
74
|
-
|
75
|
-
renderWebAssembly(module, moduleTemplate, dependencyTemplates) {
|
76
|
-
return moduleTemplate.render(module, dependencyTemplates, {});
|
77
|
-
}
|
78
|
-
}
|
79
|
-
|
80
|
-
module.exports = WebAssemblyModulesPlugin;
|
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 WebAssemblyParser = require("./WebAssemblyParser");
|
9
|
+
const WebAssemblyGenerator = require("./WebAssemblyGenerator");
|
10
|
+
const WebAssemblyJavascriptGenerator = require("./WebAssemblyJavascriptGenerator");
|
11
|
+
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
|
12
|
+
|
13
|
+
class WebAssemblyModulesPlugin {
|
14
|
+
apply(compiler) {
|
15
|
+
compiler.hooks.compilation.tap(
|
16
|
+
"WebAssemblyModulesPlugin",
|
17
|
+
(compilation, { normalModuleFactory }) => {
|
18
|
+
compilation.dependencyFactories.set(
|
19
|
+
WebAssemblyImportDependency,
|
20
|
+
normalModuleFactory
|
21
|
+
);
|
22
|
+
|
23
|
+
normalModuleFactory.hooks.createParser
|
24
|
+
.for("webassembly/experimental")
|
25
|
+
.tap("WebAssemblyModulesPlugin", () => {
|
26
|
+
return new WebAssemblyParser();
|
27
|
+
});
|
28
|
+
|
29
|
+
normalModuleFactory.hooks.createGenerator
|
30
|
+
.for("webassembly/experimental")
|
31
|
+
.tap("WebAssemblyModulesPlugin", () => {
|
32
|
+
return Generator.byType({
|
33
|
+
javascript: new WebAssemblyJavascriptGenerator(),
|
34
|
+
webassembly: new WebAssemblyGenerator()
|
35
|
+
});
|
36
|
+
});
|
37
|
+
|
38
|
+
compilation.chunkTemplate.hooks.renderManifest.tap(
|
39
|
+
"WebAssemblyModulesPlugin",
|
40
|
+
(result, options) => {
|
41
|
+
const chunk = options.chunk;
|
42
|
+
const outputOptions = options.outputOptions;
|
43
|
+
const moduleTemplates = options.moduleTemplates;
|
44
|
+
const dependencyTemplates = options.dependencyTemplates;
|
45
|
+
|
46
|
+
for (const module of chunk.modulesIterable) {
|
47
|
+
if (module.type && module.type.startsWith("webassembly")) {
|
48
|
+
const filenameTemplate =
|
49
|
+
outputOptions.webassemblyModuleFilename;
|
50
|
+
|
51
|
+
result.push({
|
52
|
+
render: () =>
|
53
|
+
this.renderWebAssembly(
|
54
|
+
module,
|
55
|
+
moduleTemplates.webassembly,
|
56
|
+
dependencyTemplates
|
57
|
+
),
|
58
|
+
filenameTemplate,
|
59
|
+
pathOptions: {
|
60
|
+
module
|
61
|
+
},
|
62
|
+
identifier: `webassemblyModule${module.id}`,
|
63
|
+
hash: module.hash
|
64
|
+
});
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
return result;
|
69
|
+
}
|
70
|
+
);
|
71
|
+
}
|
72
|
+
);
|
73
|
+
}
|
74
|
+
|
75
|
+
renderWebAssembly(module, moduleTemplate, dependencyTemplates) {
|
76
|
+
return moduleTemplate.render(module, dependencyTemplates, {});
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
module.exports = WebAssemblyModulesPlugin;
|
@@ -24,6 +24,25 @@ const isMemoryImport = n => n.descr.type === "Memory";
|
|
24
24
|
*/
|
25
25
|
const isTableImport = n => n.descr.type === "Table";
|
26
26
|
|
27
|
+
const JS_COMPAT_TYPES = new Set(["i32", "f32", "f64"]);
|
28
|
+
|
29
|
+
/**
|
30
|
+
* @param {t.ModuleImport} moduleImport the import
|
31
|
+
* @returns {null | string} the type incompatible with js types
|
32
|
+
*/
|
33
|
+
const getJsIncompatibleType = moduleImport => {
|
34
|
+
if (moduleImport.descr.type !== "FuncImportDescr") return null;
|
35
|
+
const signature = moduleImport.descr.signature;
|
36
|
+
for (const param of signature.params) {
|
37
|
+
if (!JS_COMPAT_TYPES.has(param.valtype))
|
38
|
+
return `${param.valtype} as parameter`;
|
39
|
+
}
|
40
|
+
for (const type of signature.results) {
|
41
|
+
if (!JS_COMPAT_TYPES.has(type)) return `${type} as result`;
|
42
|
+
}
|
43
|
+
return null;
|
44
|
+
};
|
45
|
+
|
27
46
|
const decoderOpts = {
|
28
47
|
ignoreCodeSection: true,
|
29
48
|
ignoreDataSection: true
|
@@ -51,14 +70,18 @@ class WebAssemblyParser extends Tapable {
|
|
51
70
|
},
|
52
71
|
|
53
72
|
ModuleImport({ node }) {
|
73
|
+
/** @type {false | string} */
|
54
74
|
let onlyDirectImport = false;
|
55
75
|
|
56
76
|
if (isMemoryImport(node) === true) {
|
57
|
-
onlyDirectImport =
|
58
|
-
}
|
59
|
-
|
60
|
-
|
61
|
-
|
77
|
+
onlyDirectImport = "Memory";
|
78
|
+
} else if (isTableImport(node) === true) {
|
79
|
+
onlyDirectImport = "Table";
|
80
|
+
} else {
|
81
|
+
const incompatibleType = getJsIncompatibleType(node);
|
82
|
+
if (incompatibleType) {
|
83
|
+
onlyDirectImport = `Non-JS-compatible Func Sigurature (${incompatibleType})`;
|
84
|
+
}
|
62
85
|
}
|
63
86
|
|
64
87
|
const dep = new WebAssemblyImportDependency(
|