You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/* 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;
|