UNPKG

1.45 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(
16 /\u2028|\u2029/g,
17 str => (str === "\u2029" ? "\\u2029" : "\\u2028")
18 ); // invalid in JavaScript but valid JSON
19};
20
21class JsonGenerator {
22 generate(module, dependencyTemplates, runtimeTemplate) {
23 const source = new ConcatSource();
24 const data = module.buildInfo.jsonData;
25 if (data === undefined) {
26 return new RawSource(
27 runtimeTemplate.missingModuleStatement({
28 request: module.rawRequest
29 })
30 );
31 }
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 source.add(
46 `${module.moduleArgument}.exports = ${stringifySafe(reducedJson)};`
47 );
48 } else {
49 source.add(`${module.moduleArgument}.exports = ${stringifySafe(data)};`);
50 }
51 return source;
52 }
53}
54
55module.exports = JsonGenerator;