UNPKG

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