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.
Files changed (279) hide show
  1. package/README.md +755 -755
  2. package/SECURITY.md +9 -9
  3. package/buildin/global.js +20 -20
  4. package/buildin/harmony-module.js +24 -24
  5. package/buildin/module.js +22 -22
  6. package/hot/dev-server.js +61 -61
  7. package/hot/log-apply-result.js +44 -44
  8. package/hot/log.js +45 -45
  9. package/hot/only-dev-server.js +105 -105
  10. package/hot/poll.js +37 -37
  11. package/hot/signal.js +62 -62
  12. package/lib/APIPlugin.js +84 -84
  13. package/lib/AmdMainTemplatePlugin.js +87 -75
  14. package/lib/AsyncDependenciesBlock.js +66 -66
  15. package/lib/AsyncDependencyToInitialChunkError.js +31 -21
  16. package/lib/AutomaticPrefetchPlugin.js +50 -50
  17. package/lib/BannerPlugin.js +3 -1
  18. package/lib/BasicEvaluatedExpression.js +211 -208
  19. package/lib/CachePlugin.js +102 -95
  20. package/lib/CaseSensitiveModulesWarning.js +71 -53
  21. package/lib/Chunk.js +750 -722
  22. package/lib/ChunkGroup.js +13 -5
  23. package/lib/ChunkRenderError.js +32 -32
  24. package/lib/CompatibilityPlugin.js +63 -63
  25. package/lib/Compilation.js +1947 -1905
  26. package/lib/Compiler.js +508 -496
  27. package/lib/ConcurrentCompilationError.js +19 -19
  28. package/lib/ConstPlugin.js +258 -242
  29. package/lib/ContextExclusionPlugin.js +17 -17
  30. package/lib/ContextModule.js +749 -710
  31. package/lib/ContextModuleFactory.js +256 -245
  32. package/lib/ContextReplacementPlugin.js +133 -126
  33. package/lib/DefinePlugin.js +206 -197
  34. package/lib/DelegatedModule.js +101 -101
  35. package/lib/DelegatedModuleFactoryPlugin.js +89 -89
  36. package/lib/DelegatedPlugin.js +39 -39
  37. package/lib/DependenciesBlock.js +89 -87
  38. package/lib/DependenciesBlockVariable.js +52 -51
  39. package/lib/Dependency.js +51 -51
  40. package/lib/DllEntryPlugin.js +51 -51
  41. package/lib/DllModule.js +54 -54
  42. package/lib/DllModuleFactory.js +29 -29
  43. package/lib/DllPlugin.js +44 -42
  44. package/lib/DllReferencePlugin.js +84 -84
  45. package/lib/DynamicEntryPlugin.js +73 -71
  46. package/lib/EntryOptionPlugin.js +33 -33
  47. package/lib/EnvironmentPlugin.js +65 -65
  48. package/lib/ErrorHelpers.js +60 -57
  49. package/lib/EvalDevToolModulePlugin.js +27 -27
  50. package/lib/EvalDevToolModuleTemplatePlugin.js +61 -61
  51. package/lib/EvalSourceMapDevToolPlugin.js +41 -40
  52. package/lib/ExportPropertyMainTemplatePlugin.js +53 -40
  53. package/lib/ExtendedAPIPlugin.js +84 -84
  54. package/lib/ExternalModule.js +159 -159
  55. package/lib/ExternalModuleFactoryPlugin.js +110 -110
  56. package/lib/ExternalsPlugin.js +23 -23
  57. package/lib/FlagDependencyExportsPlugin.js +146 -146
  58. package/lib/FlagDependencyUsagePlugin.js +110 -104
  59. package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
  60. package/lib/FunctionModulePlugin.js +19 -19
  61. package/lib/FunctionModuleTemplatePlugin.js +100 -98
  62. package/lib/GraphHelpers.js +64 -64
  63. package/lib/HarmonyLinkingError.js +18 -18
  64. package/lib/HashedModuleIdsPlugin.js +53 -53
  65. package/lib/HotModuleReplacement.runtime.js +7 -3
  66. package/lib/HotModuleReplacementPlugin.js +413 -406
  67. package/lib/HotUpdateChunk.js +16 -16
  68. package/lib/HotUpdateChunkTemplate.js +78 -78
  69. package/lib/IgnorePlugin.js +71 -71
  70. package/lib/JavascriptGenerator.js +229 -228
  71. package/lib/JavascriptModulesPlugin.js +179 -184
  72. package/lib/JsonGenerator.js +42 -42
  73. package/lib/JsonModulesPlugin.js +30 -30
  74. package/lib/JsonParser.js +27 -26
  75. package/lib/LibManifestPlugin.js +86 -86
  76. package/lib/LibraryTemplatePlugin.js +153 -119
  77. package/lib/LoaderOptionsPlugin.js +53 -52
  78. package/lib/LoaderTargetPlugin.js +24 -24
  79. package/lib/MainTemplate.js +34 -9
  80. package/lib/Module.js +381 -377
  81. package/lib/ModuleBuildError.js +42 -42
  82. package/lib/ModuleDependencyError.js +35 -25
  83. package/lib/ModuleDependencyWarning.js +25 -25
  84. package/lib/ModuleError.js +28 -28
  85. package/lib/ModuleFilenameHelpers.js +178 -166
  86. package/lib/ModuleParseError.js +44 -44
  87. package/lib/ModuleReason.js +40 -40
  88. package/lib/ModuleTemplate.js +84 -84
  89. package/lib/ModuleWarning.js +30 -30
  90. package/lib/MultiCompiler.js +283 -271
  91. package/lib/MultiEntryPlugin.js +58 -58
  92. package/lib/MultiModule.js +81 -78
  93. package/lib/MultiModuleFactory.js +23 -23
  94. package/lib/MultiStats.js +92 -92
  95. package/lib/MultiWatching.js +38 -38
  96. package/lib/NamedChunksPlugin.js +29 -29
  97. package/lib/NamedModulesPlugin.js +57 -57
  98. package/lib/NoEmitOnErrorsPlugin.js +20 -20
  99. package/lib/NoModeWarning.js +23 -23
  100. package/lib/NodeStuffPlugin.js +179 -178
  101. package/lib/NormalModule.js +497 -490
  102. package/lib/NormalModuleFactory.js +501 -483
  103. package/lib/NormalModuleReplacementPlugin.js +51 -51
  104. package/lib/OptionsDefaulter.js +84 -80
  105. package/lib/Parser.js +2164 -2086
  106. package/lib/ParserHelpers.js +103 -100
  107. package/lib/PrefetchPlugin.js +37 -37
  108. package/lib/ProgressPlugin.js +231 -231
  109. package/lib/ProvidePlugin.js +86 -86
  110. package/lib/RawModule.js +56 -54
  111. package/lib/RecordIdsPlugin.js +166 -162
  112. package/lib/RemovedPluginError.js +13 -13
  113. package/lib/RequestShortener.js +81 -74
  114. package/lib/RequireJsStuffPlugin.js +69 -69
  115. package/lib/ResolverFactory.js +64 -64
  116. package/lib/RuleSet.js +555 -534
  117. package/lib/RuntimeTemplate.js +320 -277
  118. package/lib/SetVarMainTemplatePlugin.js +69 -57
  119. package/lib/SingleEntryPlugin.js +44 -44
  120. package/lib/SizeFormatHelpers.js +24 -24
  121. package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
  122. package/lib/SourceMapDevToolPlugin.js +301 -300
  123. package/lib/Stats.js +1408 -1367
  124. package/lib/Template.js +4 -2
  125. package/lib/TemplatedPathPlugin.js +173 -170
  126. package/lib/UmdMainTemplatePlugin.js +304 -264
  127. package/lib/UseStrictPlugin.js +48 -48
  128. package/lib/WarnCaseSensitiveModulesPlugin.js +37 -36
  129. package/lib/WarnNoModeSetPlugin.js +17 -17
  130. package/lib/WatchIgnorePlugin.js +100 -100
  131. package/lib/Watching.js +194 -193
  132. package/lib/WebpackError.js +25 -19
  133. package/lib/WebpackOptionsApply.js +421 -405
  134. package/lib/WebpackOptionsDefaulter.js +347 -344
  135. package/lib/WebpackOptionsValidationError.js +345 -316
  136. package/lib/compareLocations.js +56 -56
  137. package/lib/dependencies/AMDDefineDependency.js +137 -137
  138. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +336 -327
  139. package/lib/dependencies/AMDPlugin.js +250 -250
  140. package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
  141. package/lib/dependencies/AMDRequireContextDependency.js +20 -20
  142. package/lib/dependencies/AMDRequireDependenciesBlock.js +43 -43
  143. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +273 -270
  144. package/lib/dependencies/AMDRequireDependency.js +135 -135
  145. package/lib/dependencies/CommonJsPlugin.js +161 -161
  146. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
  147. package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +130 -130
  148. package/lib/dependencies/ConstDependency.js +33 -33
  149. package/lib/dependencies/ContextDependency.js +68 -68
  150. package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
  151. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
  152. package/lib/dependencies/ContextElementDependency.js +21 -21
  153. package/lib/dependencies/DelegatedExportsDependency.js +33 -33
  154. package/lib/dependencies/DependencyReference.js +18 -18
  155. package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
  156. package/lib/dependencies/HarmonyAcceptImportDependency.js +23 -23
  157. package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
  158. package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -90
  159. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
  160. package/lib/dependencies/HarmonyExportExpressionDependency.js +53 -53
  161. package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
  162. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +620 -603
  163. package/lib/dependencies/HarmonyExportSpecifierDependency.js +54 -54
  164. package/lib/dependencies/HarmonyImportDependency.js +104 -94
  165. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +217 -214
  166. package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
  167. package/lib/dependencies/HarmonyImportSpecifierDependency.js +166 -156
  168. package/lib/dependencies/HarmonyInitDependency.js +60 -60
  169. package/lib/dependencies/HarmonyModulesPlugin.js +146 -146
  170. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -26
  171. package/lib/dependencies/ImportContextDependency.js +23 -23
  172. package/lib/dependencies/ImportDependenciesBlock.js +18 -18
  173. package/lib/dependencies/ImportDependency.js +34 -34
  174. package/lib/dependencies/ImportEagerDependency.js +32 -32
  175. package/lib/dependencies/ImportParserPlugin.js +233 -232
  176. package/lib/dependencies/ImportPlugin.js +82 -82
  177. package/lib/dependencies/ImportWeakDependency.js +34 -34
  178. package/lib/dependencies/JsonExportsDependency.js +26 -26
  179. package/lib/dependencies/LoaderPlugin.js +98 -93
  180. package/lib/dependencies/LocalModuleDependency.js +28 -28
  181. package/lib/dependencies/LocalModulesHelpers.js +52 -45
  182. package/lib/dependencies/ModuleDependency.js +20 -20
  183. package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
  184. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
  185. package/lib/dependencies/MultiEntryDependency.js +20 -20
  186. package/lib/dependencies/NullDependency.js +20 -20
  187. package/lib/dependencies/RequireContextDependency.js +22 -22
  188. package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
  189. package/lib/dependencies/RequireContextPlugin.js +143 -141
  190. package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
  191. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -112
  192. package/lib/dependencies/RequireEnsureDependency.js +58 -58
  193. package/lib/dependencies/RequireEnsurePlugin.js +74 -74
  194. package/lib/dependencies/RequireHeaderDependency.js +26 -26
  195. package/lib/dependencies/RequireIncludeDependency.js +39 -39
  196. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
  197. package/lib/dependencies/RequireIncludePlugin.js +61 -61
  198. package/lib/dependencies/RequireResolveContextDependency.js +23 -23
  199. package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
  200. package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
  201. package/lib/dependencies/SingleEntryDependency.js +18 -18
  202. package/lib/dependencies/SystemPlugin.js +125 -125
  203. package/lib/dependencies/UnsupportedDependency.js +27 -27
  204. package/lib/dependencies/WebAssemblyImportDependency.js +48 -44
  205. package/lib/dependencies/WebpackMissingModule.js +20 -20
  206. package/lib/dependencies/getFunctionExpression.js +52 -52
  207. package/lib/formatLocation.js +61 -53
  208. package/lib/node/NodeChunkTemplatePlugin.js +31 -31
  209. package/lib/node/NodeEnvironmentPlugin.js +28 -28
  210. package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -36
  211. package/lib/node/NodeMainTemplate.runtime.js +27 -27
  212. package/lib/node/NodeMainTemplateAsync.runtime.js +44 -44
  213. package/lib/node/NodeMainTemplatePlugin.js +323 -320
  214. package/lib/node/NodeSourcePlugin.js +144 -140
  215. package/lib/node/NodeTargetPlugin.js +18 -18
  216. package/lib/node/NodeTemplatePlugin.js +31 -31
  217. package/lib/node/NodeWatchFileSystem.js +99 -82
  218. package/lib/node/ReadFileCompileWasmTemplatePlugin.js +52 -52
  219. package/lib/optimize/AggressiveMergingPlugin.js +87 -87
  220. package/lib/optimize/AggressiveSplittingPlugin.js +287 -281
  221. package/lib/optimize/ChunkModuleIdRangePlugin.js +68 -68
  222. package/lib/optimize/ConcatenatedModule.js +1420 -1413
  223. package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -70
  224. package/lib/optimize/FlagIncludedChunksPlugin.js +99 -99
  225. package/lib/optimize/LimitChunkCountPlugin.js +66 -66
  226. package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -75
  227. package/lib/optimize/MinChunkSizePlugin.js +77 -77
  228. package/lib/optimize/ModuleConcatenationPlugin.js +470 -457
  229. package/lib/optimize/OccurrenceOrderPlugin.js +133 -126
  230. package/lib/optimize/RemoveParentModulesPlugin.js +127 -117
  231. package/lib/optimize/RuntimeChunkPlugin.js +41 -41
  232. package/lib/optimize/SideEffectsFlagPlugin.js +158 -156
  233. package/lib/optimize/SplitChunksPlugin.js +709 -696
  234. package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
  235. package/lib/performance/EntrypointsOverSizeLimitWarning.js +31 -31
  236. package/lib/performance/NoAsyncChunksWarning.js +21 -21
  237. package/lib/performance/SizeLimitsPlugin.js +105 -105
  238. package/lib/util/Semaphore.js +41 -41
  239. package/lib/util/SortableSet.js +5 -2
  240. package/lib/util/StackedSetMap.js +12 -5
  241. package/lib/util/TrackingSet.js +35 -35
  242. package/lib/util/cachedMerge.js +35 -35
  243. package/lib/util/createHash.js +77 -77
  244. package/lib/util/identifier.js +76 -76
  245. package/lib/validateSchema.js +67 -67
  246. package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +18 -18
  247. package/lib/wasm/WasmMainTemplatePlugin.js +310 -304
  248. package/lib/wasm/WebAssemblyGenerator.js +143 -19
  249. package/lib/wasm/WebAssemblyJavascriptGenerator.js +90 -107
  250. package/lib/wasm/WebAssemblyModulesPlugin.js +80 -80
  251. package/lib/wasm/WebAssemblyParser.js +28 -5
  252. package/lib/wasm/WebAssemblyUtils.js +48 -0
  253. package/lib/web/FetchCompileWasmTemplatePlugin.js +25 -25
  254. package/lib/web/JsonpChunkTemplatePlugin.js +47 -47
  255. package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
  256. package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
  257. package/lib/web/JsonpMainTemplate.runtime.js +65 -64
  258. package/lib/web/JsonpMainTemplatePlugin.js +576 -574
  259. package/lib/web/JsonpTemplatePlugin.js +23 -23
  260. package/lib/webpack.js +183 -182
  261. package/lib/webpack.web.js +31 -31
  262. package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
  263. package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
  264. package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -64
  265. package/lib/webworker/WebWorkerMainTemplatePlugin.js +179 -179
  266. package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
  267. package/package.json +9 -8
  268. package/schemas/WebpackOptions.json +1988 -1988
  269. package/schemas/ajv.absolutePath.js +55 -55
  270. package/schemas/plugins/DllPlugin.json +32 -32
  271. package/schemas/plugins/DllReferencePlugin.json +99 -99
  272. package/schemas/plugins/HashedModuleIdsPlugin.json +24 -24
  273. package/schemas/plugins/LoaderOptionsPlugin.json +26 -26
  274. package/schemas/plugins/SourceMapDevToolPlugin.json +187 -187
  275. package/schemas/plugins/WatchIgnorePlugin.json +16 -16
  276. package/schemas/plugins/debug/ProfilingPlugin.json +12 -12
  277. package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +22 -22
  278. package/schemas/plugins/optimize/LimitChunkCountPlugin.json +15 -15
  279. 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.reverse().reduce((prevFn, nextFn) => {
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
- newGlobals.push(
170
- t.global(globalType, [
171
- t.objectInstruction("const", "i32", [t.numberLiteral(0)])
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 func = t.func(initFuncId, funcParams, funcResults, funcBody);
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.typeInstructionFunc(
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(initFuncId.value, "Func", nextFuncIndex);
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
- const bin = module.originalSource().source();
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 generateExports = () => {
43
- if (
44
- Array.isArray(module.buildMeta.providedExports) &&
45
- Array.isArray(module.usedExports)
46
- ) {
47
- // generate mangled exports
48
- return Template.asString(
49
- module.buildMeta.providedExports.map(exp => {
50
- const usedName = module.isUsed(exp);
51
- if (usedName) {
52
- return `${module.exportsArgument}[${JSON.stringify(
53
- usedName
54
- )}] = instance.exports[${JSON.stringify(exp)}];`;
55
- } else {
56
- return `// unused ${JSON.stringify(exp)} export`;
57
- }
58
- })
59
- );
60
- } else {
61
- // generate simple export
62
- return `${module.moduleArgument}.exports = instance.exports;`;
63
- }
64
- };
65
-
66
- const generateImports = () => {
67
- const modules = new Map();
68
- for (const dep of module.dependencies) {
69
- if (dep.module) modules.set(dep.module, dep.userRequest);
70
- }
71
- return Template.asString(
72
- Array.from(modules, ([m, r]) => {
73
- return `${runtimeTemplate.moduleRaw({
74
- module: m,
75
- request: r
76
- })};`;
77
- })
78
- );
79
- };
80
-
81
- // FIXME(sven): assert that the exports exists in the modules
82
- // otherwise it will default to i32 0
83
- const initParams = generateInitParams(module).join(",");
84
-
85
- // create source
86
- const source = new RawSource(
87
- [
88
- '"use strict";',
89
- "// Instantiate WebAssembly module",
90
- "var instance = __webpack_require__.w[module.i];",
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 = true;
58
- }
59
-
60
- if (isTableImport(node) === true) {
61
- onlyDirectImport = true;
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(