| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- /*
- 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");
- /**
- * @import {
- * ExportSpec,
- * ExportsSpec,
- * UpdateHashContext
- * } from "../Dependency"
- */
- /** @import ModuleGraph from "../ModuleGraph" */
- /** @import JsonData from "../json/JsonData" */
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<[JsonData, number]>} ObjectDeserializerContext */
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<[JsonData, number]>} ObjectSerializerContext */
- /** @import { JsonValue } from "../util/fs" */
- /** @import Hash from "../util/Hash" */
- /**
- * Defines the get exports from data fn callback.
- * @callback GetExportsFromDataFn
- * @param {JsonValue} data raw json data
- * @param {number=} curDepth current depth
- * @returns {ExportSpec[] | null} export spec or nothing
- */
- /**
- * Gets exports with depth.
- * @param {number} exportsDepth exportsDepth
- * @returns {GetExportsFromDataFn} value
- */
- const getExportsWithDepth = (exportsDepth) =>
- /** @type {GetExportsFromDataFn} */
- function getExportsFromData(data, curDepth = 1) {
- if (curDepth > exportsDepth) {
- return null;
- }
- if (data && typeof data === "object") {
- if (Array.isArray(data)) {
- return data.length < 100
- ? data.map((item, idx) => ({
- name: `${idx}`,
- canMangle: true,
- exports: getExportsFromData(item, curDepth + 1) || undefined
- }))
- : null;
- }
- /** @type {ExportSpec[]} */
- const exports = [];
- for (const key of Object.keys(data)) {
- exports.push({
- name: key,
- canMangle: true,
- exports:
- getExportsFromData(
- /** @type {JsonValue} */
- (data[key]),
- curDepth + 1
- ) || undefined
- });
- }
- return exports;
- }
- return null;
- };
- class JsonExportsDependency extends NullDependency {
- /**
- * Creates an instance of JsonExportsDependency.
- * @param {JsonData} data json data
- * @param {number} exportsDepth the depth of json exports to analyze
- */
- constructor(data, exportsDepth) {
- super();
- /** @type {JsonData} */
- this.data = data;
- /** @type {number} */
- this.exportsDepth = exportsDepth;
- }
- get type() {
- return "json exports";
- }
- /**
- * Returns the exported names
- * @param {ModuleGraph} moduleGraph module graph
- * @returns {ExportsSpec | undefined} export names
- */
- getExports(moduleGraph) {
- return {
- exports: getExportsWithDepth(this.exportsDepth)(
- this.data && /** @type {JsonValue} */ (this.data.get())
- ),
- dependencies: undefined
- };
- }
- /**
- * Updates the hash with the data contributed by this instance.
- * @param {Hash} hash hash to be updated
- * @param {UpdateHashContext} context context
- * @returns {void}
- */
- updateHash(hash, context) {
- this.data.updateHash(hash);
- }
- /**
- * Serializes this instance into the provided serializer context.
- * @param {ObjectSerializerContext} context context
- */
- serialize(context) {
- context.write(this.data).write(this.exportsDepth);
- super.serialize(context);
- }
- /**
- * Restores this instance from the provided deserializer context.
- * @param {ObjectDeserializerContext} context context
- */
- deserialize(context) {
- this.data = context.read();
- const c1 = context.rest;
- this.exportsDepth = c1.read();
- super.deserialize(c1.rest);
- }
- }
- makeSerializable(
- JsonExportsDependency,
- "webpack/lib/dependencies/JsonExportsDependency"
- );
- module.exports = JsonExportsDependency;
|