10
0

JsonExportsDependency.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const makeSerializable = require("../util/makeSerializable");
  7. const NullDependency = require("./NullDependency");
  8. /** @typedef {import("../ChunkGraph")} ChunkGraph */
  9. /** @typedef {import("../Dependency").ExportSpec} ExportSpec */
  10. /** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
  11. /** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
  12. /** @typedef {import("../ModuleGraph")} ModuleGraph */
  13. /** @typedef {import("../json/JsonData")} JsonData */
  14. /** @typedef {import("../json/JsonData").RawJsonData} RawJsonData */
  15. /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
  16. /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
  17. /** @typedef {import("../util/Hash")} Hash */
  18. /**
  19. * @param {RawJsonData} data data
  20. * @returns {TODO} value
  21. */
  22. const getExportsFromData = data => {
  23. if (data && typeof data === "object") {
  24. if (Array.isArray(data)) {
  25. return data.length < 100
  26. ? data.map((item, idx) => ({
  27. name: `${idx}`,
  28. canMangle: true,
  29. exports: getExportsFromData(item)
  30. }))
  31. : undefined;
  32. }
  33. const exports = [];
  34. for (const key of Object.keys(data)) {
  35. exports.push({
  36. name: key,
  37. canMangle: true,
  38. exports: getExportsFromData(data[key])
  39. });
  40. }
  41. return exports;
  42. }
  43. return undefined;
  44. };
  45. class JsonExportsDependency extends NullDependency {
  46. /**
  47. * @param {JsonData} data json data
  48. */
  49. constructor(data) {
  50. super();
  51. this.data = data;
  52. }
  53. get type() {
  54. return "json exports";
  55. }
  56. /**
  57. * Returns the exported names
  58. * @param {ModuleGraph} moduleGraph module graph
  59. * @returns {ExportsSpec | undefined} export names
  60. */
  61. getExports(moduleGraph) {
  62. return {
  63. exports: getExportsFromData(
  64. this.data && /** @type {RawJsonData} */ (this.data.get())
  65. ),
  66. dependencies: undefined
  67. };
  68. }
  69. /**
  70. * Update the hash
  71. * @param {Hash} hash hash to be updated
  72. * @param {UpdateHashContext} context context
  73. * @returns {void}
  74. */
  75. updateHash(hash, context) {
  76. this.data.updateHash(hash);
  77. }
  78. /**
  79. * @param {ObjectSerializerContext} context context
  80. */
  81. serialize(context) {
  82. const { write } = context;
  83. write(this.data);
  84. super.serialize(context);
  85. }
  86. /**
  87. * @param {ObjectDeserializerContext} context context
  88. */
  89. deserialize(context) {
  90. const { read } = context;
  91. this.data = read();
  92. super.deserialize(context);
  93. }
  94. }
  95. makeSerializable(
  96. JsonExportsDependency,
  97. "webpack/lib/dependencies/JsonExportsDependency"
  98. );
  99. module.exports = JsonExportsDependency;