UNPKG

1.59 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5"use strict";
6
7const { ConcatSource, RawSource } = require("webpack-sources");
8
9const stringifySafe = data => {
10 const stringified = JSON.stringify(data);
11 if (!stringified) {
12 return undefined; // Invalid JSON
13 }
14
15 return stringified.replace(/\u2028|\u2029/g, str =>
16 str === "\u2029" ? "\\u2029" : "\\u2028"
17 ); // invalid in JavaScript but valid JSON
18};
19
20class JsonGenerator {
21 generate(module, dependencyTemplates, runtimeTemplate) {
22 const source = new ConcatSource();
23 const data = module.buildInfo.jsonData;
24 if (data === undefined) {
25 return new RawSource(
26 runtimeTemplate.missingModuleStatement({
27 request: module.rawRequest
28 })
29 );
30 }
31 let finalJson;
32 if (
33 Array.isArray(module.buildMeta.providedExports) &&
34 !module.isUsed("default")
35 ) {
36 // Only some exports are used: We can optimize here, by only generating a part of the JSON
37 const reducedJson = {};
38 for (const exportName of module.buildMeta.providedExports) {
39 if (exportName === "default") continue;
40 const used = module.isUsed(exportName);
41 if (used) {
42 reducedJson[used] = data[exportName];
43 }
44 }
45 finalJson = reducedJson;
46 } else {
47 finalJson = data;
48 }
49 // Use JSON because JSON.parse() is much faster than JavaScript evaluation
50 const jsonSource = JSON.stringify(stringifySafe(finalJson));
51 const jsonExpr = `JSON.parse(${jsonSource})`;
52 source.add(`${module.moduleArgument}.exports = ${jsonExpr};`);
53 return source;
54 }
55}
56
57module.exports = JsonGenerator;