JsonExportsDependency.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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("../util/Hash")} Hash */
  14. const getExportsFromData = data => {
  15. if (data && typeof data === "object") {
  16. if (Array.isArray(data)) {
  17. return data.map((item, idx) => {
  18. return {
  19. name: `${idx}`,
  20. canMangle: true,
  21. exports: getExportsFromData(item)
  22. };
  23. });
  24. } else {
  25. const exports = [];
  26. for (const key of Object.keys(data)) {
  27. exports.push({
  28. name: key,
  29. canMangle: true,
  30. exports: getExportsFromData(data[key])
  31. });
  32. }
  33. return exports;
  34. }
  35. }
  36. return undefined;
  37. };
  38. class JsonExportsDependency extends NullDependency {
  39. /**
  40. * @param {(string | ExportSpec)[]} exports json exports
  41. */
  42. constructor(exports) {
  43. super();
  44. this.exports = exports;
  45. this._hashUpdate = undefined;
  46. }
  47. get type() {
  48. return "json exports";
  49. }
  50. /**
  51. * Returns the exported names
  52. * @param {ModuleGraph} moduleGraph module graph
  53. * @returns {ExportsSpec | undefined} export names
  54. */
  55. getExports(moduleGraph) {
  56. return {
  57. exports: this.exports,
  58. dependencies: undefined
  59. };
  60. }
  61. /**
  62. * Update the hash
  63. * @param {Hash} hash hash to be updated
  64. * @param {UpdateHashContext} context context
  65. * @returns {void}
  66. */
  67. updateHash(hash, context) {
  68. if (this._hashUpdate === undefined) {
  69. this._hashUpdate = this.exports
  70. ? JSON.stringify(this.exports)
  71. : "undefined";
  72. }
  73. hash.update(this._hashUpdate);
  74. }
  75. serialize(context) {
  76. const { write } = context;
  77. write(this.exports);
  78. super.serialize(context);
  79. }
  80. deserialize(context) {
  81. const { read } = context;
  82. this.exports = read();
  83. super.deserialize(context);
  84. }
  85. }
  86. makeSerializable(
  87. JsonExportsDependency,
  88. "webpack/lib/dependencies/JsonExportsDependency"
  89. );
  90. module.exports = JsonExportsDependency;
  91. module.exports.getExportsFromData = getExportsFromData;