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.
112 lines
2.6 KiB
112 lines
2.6 KiB
/*
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
Author Tobias Koppers @sokra
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
const makeSerializable = require("../util/makeSerializable");
|
|
const NullDependency = require("./NullDependency");
|
|
|
|
/** @typedef {import("../ChunkGraph")} ChunkGraph */
|
|
/** @typedef {import("../Dependency").ExportSpec} ExportSpec */
|
|
/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
|
|
/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
|
|
/** @typedef {import("../ModuleGraph")} ModuleGraph */
|
|
/** @typedef {import("../json/JsonData")} JsonData */
|
|
/** @typedef {import("../json/JsonData").RawJsonData} RawJsonData */
|
|
/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
|
|
/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
|
|
/** @typedef {import("../util/Hash")} Hash */
|
|
|
|
/**
|
|
* @param {RawJsonData} data data
|
|
* @returns {TODO} value
|
|
*/
|
|
const getExportsFromData = data => {
|
|
if (data && typeof data === "object") {
|
|
if (Array.isArray(data)) {
|
|
return data.length < 100
|
|
? data.map((item, idx) => ({
|
|
name: `${idx}`,
|
|
canMangle: true,
|
|
exports: getExportsFromData(item)
|
|
}))
|
|
: undefined;
|
|
}
|
|
const exports = [];
|
|
for (const key of Object.keys(data)) {
|
|
exports.push({
|
|
name: key,
|
|
canMangle: true,
|
|
exports: getExportsFromData(data[key])
|
|
});
|
|
}
|
|
return exports;
|
|
}
|
|
return undefined;
|
|
};
|
|
|
|
class JsonExportsDependency extends NullDependency {
|
|
/**
|
|
* @param {JsonData} data json data
|
|
*/
|
|
constructor(data) {
|
|
super();
|
|
this.data = data;
|
|
}
|
|
|
|
get type() {
|
|
return "json exports";
|
|
}
|
|
|
|
/**
|
|
* Returns the exported names
|
|
* @param {ModuleGraph} moduleGraph module graph
|
|
* @returns {ExportsSpec | undefined} export names
|
|
*/
|
|
getExports(moduleGraph) {
|
|
return {
|
|
exports: getExportsFromData(
|
|
this.data && /** @type {RawJsonData} */ (this.data.get())
|
|
),
|
|
dependencies: undefined
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Update the hash
|
|
* @param {Hash} hash hash to be updated
|
|
* @param {UpdateHashContext} context context
|
|
* @returns {void}
|
|
*/
|
|
updateHash(hash, context) {
|
|
this.data.updateHash(hash);
|
|
}
|
|
|
|
/**
|
|
* @param {ObjectSerializerContext} context context
|
|
*/
|
|
serialize(context) {
|
|
const { write } = context;
|
|
write(this.data);
|
|
super.serialize(context);
|
|
}
|
|
|
|
/**
|
|
* @param {ObjectDeserializerContext} context context
|
|
*/
|
|
deserialize(context) {
|
|
const { read } = context;
|
|
this.data = read();
|
|
super.deserialize(context);
|
|
}
|
|
}
|
|
|
|
makeSerializable(
|
|
JsonExportsDependency,
|
|
"webpack/lib/dependencies/JsonExportsDependency"
|
|
);
|
|
|
|
module.exports = JsonExportsDependency;
|