/* MIT License http://www.opensource.org/licenses/mit-license.php Author Sergey Melyukov @smelukov */ "use strict"; const { RawSource } = require("webpack-sources"); const ConcatenationScope = require("../ConcatenationScope"); const Generator = require("../Generator"); const RuntimeGlobals = require("../RuntimeGlobals"); /** @typedef {import("webpack-sources").Source} Source */ /** @typedef {import("../Generator").GenerateContext} GenerateContext */ /** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */ /** @typedef {import("../NormalModule")} NormalModule */ const TYPES = new Set(["javascript"]); class AssetSourceGenerator extends Generator { /** * @param {NormalModule} module module for which the code should be generated * @param {GenerateContext} generateContext context for generate * @returns {Source} generated code */ generate( module, { concatenationScope, chunkGraph, runtimeTemplate, runtimeRequirements } ) { const originalSource = module.originalSource(); if (!originalSource) { return new RawSource(""); } const content = originalSource.source(); const encodedSource = typeof content === "string" ? content : content.toString("utf-8"); let sourceContent; if (concatenationScope) { concatenationScope.registerNamespaceExport( ConcatenationScope.NAMESPACE_OBJECT_EXPORT ); sourceContent = `${runtimeTemplate.supportsConst() ? "const" : "var"} ${ ConcatenationScope.NAMESPACE_OBJECT_EXPORT } = ${JSON.stringify(encodedSource)};`; } else { runtimeRequirements.add(RuntimeGlobals.module); sourceContent = `${RuntimeGlobals.module}.exports = ${JSON.stringify( encodedSource )};`; } return new RawSource(sourceContent); } /** * @param {NormalModule} module module for which the bailout reason should be determined * @param {ConcatenationBailoutReasonContext} context context * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated */ getConcatenationBailoutReason(module, context) { return undefined; } /** * @param {NormalModule} module fresh module * @returns {Set} available types (do not mutate) */ getTypes(module) { return TYPES; } /** * @param {NormalModule} module the module * @param {string=} type source type * @returns {number} estimate size of the module */ getSize(module, type) { const originalSource = module.originalSource(); if (!originalSource) { return 0; } // Example: m.exports="abcd" return originalSource.size() + 12; } } module.exports = AssetSourceGenerator;