123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const { ConcatSource, RawSource } = require("webpack-sources");
- const stringifySafe = data => {
- const stringified = JSON.stringify(data);
- if (!stringified) {
- return undefined; // Invalid JSON
- }
- return stringified.replace(/\u2028|\u2029/g, str =>
- str === "\u2029" ? "\\u2029" : "\\u2028"
- ); // invalid in JavaScript but valid JSON
- };
- class JsonGenerator {
- generate(module, dependencyTemplates, runtimeTemplate) {
- const source = new ConcatSource();
- const data = module.buildInfo.jsonData;
- if (data === undefined) {
- return new RawSource(
- runtimeTemplate.missingModuleStatement({
- request: module.rawRequest
- })
- );
- }
- let finalJson;
- if (
- Array.isArray(module.buildMeta.providedExports) &&
- !module.isUsed("default")
- ) {
- // Only some exports are used: We can optimize here, by only generating a part of the JSON
- const reducedJson = {};
- for (const exportName of module.buildMeta.providedExports) {
- if (exportName === "default") continue;
- const used = module.isUsed(exportName);
- if (used) {
- reducedJson[used] = data[exportName];
- }
- }
- finalJson = reducedJson;
- } else {
- finalJson = data;
- }
- // Use JSON because JSON.parse() is much faster than JavaScript evaluation
- const jsonSource = JSON.stringify(stringifySafe(finalJson));
- const jsonExpr = `JSON.parse(${jsonSource})`;
- source.add(`${module.moduleArgument}.exports = ${jsonExpr};`);
- return source;
- }
- }
- module.exports = JsonGenerator;
|