JsonGenerator.js 1.4 KB

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