first
This commit is contained in:
506
node_modules/webpack/lib/asset/AssetGenerator.js
generated
vendored
Normal file
506
node_modules/webpack/lib/asset/AssetGenerator.js
generated
vendored
Normal file
@ -0,0 +1,506 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Sergey Melyukov @smelukov
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const mimeTypes = require("mime-types");
|
||||
const path = require("path");
|
||||
const { RawSource } = require("webpack-sources");
|
||||
const ConcatenationScope = require("../ConcatenationScope");
|
||||
const Generator = require("../Generator");
|
||||
const { ASSET_MODULE_TYPE } = require("../ModuleTypeConstants");
|
||||
const RuntimeGlobals = require("../RuntimeGlobals");
|
||||
const createHash = require("../util/createHash");
|
||||
const { makePathsRelative } = require("../util/identifier");
|
||||
const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
|
||||
|
||||
/** @typedef {import("webpack-sources").Source} Source */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").AssetGeneratorOptions} AssetGeneratorOptions */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").AssetModuleOutputPath} AssetModuleOutputPath */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").RawPublicPath} RawPublicPath */
|
||||
/** @typedef {import("../Compilation")} Compilation */
|
||||
/** @typedef {import("../Compiler")} Compiler */
|
||||
/** @typedef {import("../Generator").GenerateContext} GenerateContext */
|
||||
/** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */
|
||||
/** @typedef {import("../Module")} Module */
|
||||
/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
|
||||
/** @typedef {import("../NormalModule")} NormalModule */
|
||||
/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
|
||||
/** @typedef {import("../util/Hash")} Hash */
|
||||
|
||||
const mergeMaybeArrays = (a, b) => {
|
||||
const set = new Set();
|
||||
if (Array.isArray(a)) for (const item of a) set.add(item);
|
||||
else set.add(a);
|
||||
if (Array.isArray(b)) for (const item of b) set.add(item);
|
||||
else set.add(b);
|
||||
return Array.from(set);
|
||||
};
|
||||
|
||||
const mergeAssetInfo = (a, b) => {
|
||||
const result = { ...a, ...b };
|
||||
for (const key of Object.keys(a)) {
|
||||
if (key in b) {
|
||||
if (a[key] === b[key]) continue;
|
||||
switch (key) {
|
||||
case "fullhash":
|
||||
case "chunkhash":
|
||||
case "modulehash":
|
||||
case "contenthash":
|
||||
result[key] = mergeMaybeArrays(a[key], b[key]);
|
||||
break;
|
||||
case "immutable":
|
||||
case "development":
|
||||
case "hotModuleReplacement":
|
||||
case "javascriptModule":
|
||||
result[key] = a[key] || b[key];
|
||||
break;
|
||||
case "related":
|
||||
result[key] = mergeRelatedInfo(a[key], b[key]);
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Can't handle conflicting asset info for ${key}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
const mergeRelatedInfo = (a, b) => {
|
||||
const result = { ...a, ...b };
|
||||
for (const key of Object.keys(a)) {
|
||||
if (key in b) {
|
||||
if (a[key] === b[key]) continue;
|
||||
result[key] = mergeMaybeArrays(a[key], b[key]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
const encodeDataUri = (encoding, source) => {
|
||||
let encodedContent;
|
||||
|
||||
switch (encoding) {
|
||||
case "base64": {
|
||||
encodedContent = source.buffer().toString("base64");
|
||||
break;
|
||||
}
|
||||
case false: {
|
||||
const content = source.source();
|
||||
|
||||
if (typeof content !== "string") {
|
||||
encodedContent = content.toString("utf-8");
|
||||
}
|
||||
|
||||
encodedContent = encodeURIComponent(encodedContent).replace(
|
||||
/[!'()*]/g,
|
||||
character => "%" + character.codePointAt(0).toString(16)
|
||||
);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new Error(`Unsupported encoding '${encoding}'`);
|
||||
}
|
||||
|
||||
return encodedContent;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} encoding encoding
|
||||
* @param {string} content content
|
||||
* @returns {Buffer} decoded content
|
||||
*/
|
||||
const decodeDataUriContent = (encoding, content) => {
|
||||
const isBase64 = encoding === "base64";
|
||||
|
||||
if (isBase64) {
|
||||
return Buffer.from(content, "base64");
|
||||
}
|
||||
|
||||
// If we can't decode return the original body
|
||||
try {
|
||||
return Buffer.from(decodeURIComponent(content), "ascii");
|
||||
} catch (_) {
|
||||
return Buffer.from(content, "ascii");
|
||||
}
|
||||
};
|
||||
|
||||
const JS_TYPES = new Set(["javascript"]);
|
||||
const JS_AND_ASSET_TYPES = new Set(["javascript", ASSET_MODULE_TYPE]);
|
||||
const DEFAULT_ENCODING = "base64";
|
||||
|
||||
class AssetGenerator extends Generator {
|
||||
/**
|
||||
* @param {AssetGeneratorOptions["dataUrl"]=} dataUrlOptions the options for the data url
|
||||
* @param {string=} filename override for output.assetModuleFilename
|
||||
* @param {RawPublicPath=} publicPath override for output.assetModulePublicPath
|
||||
* @param {AssetModuleOutputPath=} outputPath the output path for the emitted file which is not included in the runtime import
|
||||
* @param {boolean=} emit generate output asset
|
||||
*/
|
||||
constructor(dataUrlOptions, filename, publicPath, outputPath, emit) {
|
||||
super();
|
||||
this.dataUrlOptions = dataUrlOptions;
|
||||
this.filename = filename;
|
||||
this.publicPath = publicPath;
|
||||
this.outputPath = outputPath;
|
||||
this.emit = emit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module module
|
||||
* @param {RuntimeTemplate} runtimeTemplate runtime template
|
||||
* @returns {string} source file name
|
||||
*/
|
||||
getSourceFileName(module, runtimeTemplate) {
|
||||
return makePathsRelative(
|
||||
runtimeTemplate.compilation.compiler.context,
|
||||
module.matchResource || module.resource,
|
||||
runtimeTemplate.compilation.compiler.root
|
||||
).replace(/^\.\//, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 module
|
||||
* @returns {string} mime type
|
||||
*/
|
||||
getMimeType(module) {
|
||||
if (typeof this.dataUrlOptions === "function") {
|
||||
throw new Error(
|
||||
"This method must not be called when dataUrlOptions is a function"
|
||||
);
|
||||
}
|
||||
|
||||
/** @type {string | boolean | undefined} */
|
||||
let mimeType = this.dataUrlOptions.mimetype;
|
||||
if (mimeType === undefined) {
|
||||
const ext = path.extname(module.nameForCondition());
|
||||
if (
|
||||
module.resourceResolveData &&
|
||||
module.resourceResolveData.mimetype !== undefined
|
||||
) {
|
||||
mimeType =
|
||||
module.resourceResolveData.mimetype +
|
||||
module.resourceResolveData.parameters;
|
||||
} else if (ext) {
|
||||
mimeType = mimeTypes.lookup(ext);
|
||||
|
||||
if (typeof mimeType !== "string") {
|
||||
throw new Error(
|
||||
"DataUrl can't be generated automatically, " +
|
||||
`because there is no mimetype for "${ext}" in mimetype database. ` +
|
||||
'Either pass a mimetype via "generator.mimetype" or ' +
|
||||
'use type: "asset/resource" to create a resource file instead of a DataUrl'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof mimeType !== "string") {
|
||||
throw new Error(
|
||||
"DataUrl can't be generated automatically. " +
|
||||
'Either pass a mimetype via "generator.mimetype" or ' +
|
||||
'use type: "asset/resource" to create a resource file instead of a DataUrl'
|
||||
);
|
||||
}
|
||||
|
||||
return /** @type {string} */ (mimeType);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module module for which the code should be generated
|
||||
* @param {GenerateContext} generateContext context for generate
|
||||
* @returns {Source} generated code
|
||||
*/
|
||||
generate(
|
||||
module,
|
||||
{
|
||||
runtime,
|
||||
concatenationScope,
|
||||
chunkGraph,
|
||||
runtimeTemplate,
|
||||
runtimeRequirements,
|
||||
type,
|
||||
getData
|
||||
}
|
||||
) {
|
||||
switch (type) {
|
||||
case ASSET_MODULE_TYPE:
|
||||
return /** @type {Source} */ (module.originalSource());
|
||||
default: {
|
||||
let content;
|
||||
const originalSource = /** @type {Source} */ (module.originalSource());
|
||||
if (module.buildInfo.dataUrl) {
|
||||
let encodedSource;
|
||||
if (typeof this.dataUrlOptions === "function") {
|
||||
encodedSource = this.dataUrlOptions.call(
|
||||
null,
|
||||
originalSource.source(),
|
||||
{
|
||||
filename: module.matchResource || module.resource,
|
||||
module
|
||||
}
|
||||
);
|
||||
} else {
|
||||
/** @type {string | false | undefined} */
|
||||
let encoding = this.dataUrlOptions.encoding;
|
||||
if (encoding === undefined) {
|
||||
if (
|
||||
module.resourceResolveData &&
|
||||
module.resourceResolveData.encoding !== undefined
|
||||
) {
|
||||
encoding = module.resourceResolveData.encoding;
|
||||
}
|
||||
}
|
||||
if (encoding === undefined) {
|
||||
encoding = DEFAULT_ENCODING;
|
||||
}
|
||||
const mimeType = this.getMimeType(module);
|
||||
|
||||
let encodedContent;
|
||||
|
||||
if (
|
||||
module.resourceResolveData &&
|
||||
module.resourceResolveData.encoding === encoding &&
|
||||
decodeDataUriContent(
|
||||
module.resourceResolveData.encoding,
|
||||
module.resourceResolveData.encodedContent
|
||||
).equals(originalSource.buffer())
|
||||
) {
|
||||
encodedContent = module.resourceResolveData.encodedContent;
|
||||
} else {
|
||||
encodedContent = encodeDataUri(encoding, originalSource);
|
||||
}
|
||||
|
||||
encodedSource = `data:${mimeType}${
|
||||
encoding ? `;${encoding}` : ""
|
||||
},${encodedContent}`;
|
||||
}
|
||||
const data = getData();
|
||||
data.set("url", Buffer.from(encodedSource));
|
||||
content = JSON.stringify(encodedSource);
|
||||
} else {
|
||||
const assetModuleFilename =
|
||||
this.filename || runtimeTemplate.outputOptions.assetModuleFilename;
|
||||
const hash = createHash(runtimeTemplate.outputOptions.hashFunction);
|
||||
if (runtimeTemplate.outputOptions.hashSalt) {
|
||||
hash.update(runtimeTemplate.outputOptions.hashSalt);
|
||||
}
|
||||
hash.update(originalSource.buffer());
|
||||
const fullHash = /** @type {string} */ (
|
||||
hash.digest(runtimeTemplate.outputOptions.hashDigest)
|
||||
);
|
||||
const contentHash = nonNumericOnlyHash(
|
||||
fullHash,
|
||||
runtimeTemplate.outputOptions.hashDigestLength
|
||||
);
|
||||
module.buildInfo.fullContentHash = fullHash;
|
||||
const sourceFilename = this.getSourceFileName(
|
||||
module,
|
||||
runtimeTemplate
|
||||
);
|
||||
let { path: filename, info: assetInfo } =
|
||||
runtimeTemplate.compilation.getAssetPathWithInfo(
|
||||
assetModuleFilename,
|
||||
{
|
||||
module,
|
||||
runtime,
|
||||
filename: sourceFilename,
|
||||
chunkGraph,
|
||||
contentHash
|
||||
}
|
||||
);
|
||||
let assetPath;
|
||||
if (this.publicPath !== undefined) {
|
||||
const { path, info } =
|
||||
runtimeTemplate.compilation.getAssetPathWithInfo(
|
||||
this.publicPath,
|
||||
{
|
||||
module,
|
||||
runtime,
|
||||
filename: sourceFilename,
|
||||
chunkGraph,
|
||||
contentHash
|
||||
}
|
||||
);
|
||||
assetInfo = mergeAssetInfo(assetInfo, info);
|
||||
assetPath = JSON.stringify(path + filename);
|
||||
} else {
|
||||
runtimeRequirements.add(RuntimeGlobals.publicPath); // add __webpack_require__.p
|
||||
assetPath = runtimeTemplate.concatenation(
|
||||
{ expr: RuntimeGlobals.publicPath },
|
||||
filename
|
||||
);
|
||||
}
|
||||
assetInfo = {
|
||||
sourceFilename,
|
||||
...assetInfo
|
||||
};
|
||||
if (this.outputPath) {
|
||||
const { path: outputPath, info } =
|
||||
runtimeTemplate.compilation.getAssetPathWithInfo(
|
||||
this.outputPath,
|
||||
{
|
||||
module,
|
||||
runtime,
|
||||
filename: sourceFilename,
|
||||
chunkGraph,
|
||||
contentHash
|
||||
}
|
||||
);
|
||||
assetInfo = mergeAssetInfo(assetInfo, info);
|
||||
filename = path.posix.join(outputPath, filename);
|
||||
}
|
||||
module.buildInfo.filename = filename;
|
||||
module.buildInfo.assetInfo = assetInfo;
|
||||
if (getData) {
|
||||
// Due to code generation caching module.buildInfo.XXX can't used to store such information
|
||||
// It need to be stored in the code generation results instead, where it's cached too
|
||||
// TODO webpack 6 For back-compat reasons we also store in on module.buildInfo
|
||||
const data = getData();
|
||||
data.set("fullContentHash", fullHash);
|
||||
data.set("filename", filename);
|
||||
data.set("assetInfo", assetInfo);
|
||||
}
|
||||
content = assetPath;
|
||||
}
|
||||
|
||||
if (concatenationScope) {
|
||||
concatenationScope.registerNamespaceExport(
|
||||
ConcatenationScope.NAMESPACE_OBJECT_EXPORT
|
||||
);
|
||||
return new RawSource(
|
||||
`${runtimeTemplate.supportsConst() ? "const" : "var"} ${
|
||||
ConcatenationScope.NAMESPACE_OBJECT_EXPORT
|
||||
} = ${content};`
|
||||
);
|
||||
} else {
|
||||
runtimeRequirements.add(RuntimeGlobals.module);
|
||||
return new RawSource(
|
||||
`${RuntimeGlobals.module}.exports = ${content};`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module fresh module
|
||||
* @returns {Set<string>} available types (do not mutate)
|
||||
*/
|
||||
getTypes(module) {
|
||||
if ((module.buildInfo && module.buildInfo.dataUrl) || this.emit === false) {
|
||||
return JS_TYPES;
|
||||
} else {
|
||||
return JS_AND_ASSET_TYPES;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module the module
|
||||
* @param {string=} type source type
|
||||
* @returns {number} estimate size of the module
|
||||
*/
|
||||
getSize(module, type) {
|
||||
switch (type) {
|
||||
case ASSET_MODULE_TYPE: {
|
||||
const originalSource = module.originalSource();
|
||||
|
||||
if (!originalSource) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return originalSource.size();
|
||||
}
|
||||
default:
|
||||
if (module.buildInfo && module.buildInfo.dataUrl) {
|
||||
const originalSource = module.originalSource();
|
||||
|
||||
if (!originalSource) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// roughly for data url
|
||||
// Example: m.exports="data:image/png;base64,ag82/f+2=="
|
||||
// 4/3 = base64 encoding
|
||||
// 34 = ~ data url header + footer + rounding
|
||||
return originalSource.size() * 1.34 + 36;
|
||||
} else {
|
||||
// it's only estimated so this number is probably fine
|
||||
// Example: m.exports=r.p+"0123456789012345678901.ext"
|
||||
return 42;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Hash} hash hash that will be modified
|
||||
* @param {UpdateHashContext} updateHashContext context for updating hash
|
||||
*/
|
||||
updateHash(hash, { module, runtime, runtimeTemplate, chunkGraph }) {
|
||||
if (module.buildInfo.dataUrl) {
|
||||
hash.update("data-url");
|
||||
// this.dataUrlOptions as function should be pure and only depend on input source and filename
|
||||
// therefore it doesn't need to be hashed
|
||||
if (typeof this.dataUrlOptions === "function") {
|
||||
const ident = /** @type {{ ident?: string }} */ (this.dataUrlOptions)
|
||||
.ident;
|
||||
if (ident) hash.update(ident);
|
||||
} else {
|
||||
if (
|
||||
this.dataUrlOptions.encoding &&
|
||||
this.dataUrlOptions.encoding !== DEFAULT_ENCODING
|
||||
) {
|
||||
hash.update(this.dataUrlOptions.encoding);
|
||||
}
|
||||
if (this.dataUrlOptions.mimetype)
|
||||
hash.update(this.dataUrlOptions.mimetype);
|
||||
// computed mimetype depends only on module filename which is already part of the hash
|
||||
}
|
||||
} else {
|
||||
hash.update("resource");
|
||||
|
||||
const pathData = {
|
||||
module,
|
||||
runtime,
|
||||
filename: this.getSourceFileName(module, runtimeTemplate),
|
||||
chunkGraph,
|
||||
contentHash: runtimeTemplate.contentHashReplacement
|
||||
};
|
||||
|
||||
if (typeof this.publicPath === "function") {
|
||||
hash.update("path");
|
||||
const assetInfo = {};
|
||||
hash.update(this.publicPath(pathData, assetInfo));
|
||||
hash.update(JSON.stringify(assetInfo));
|
||||
} else if (this.publicPath) {
|
||||
hash.update("path");
|
||||
hash.update(this.publicPath);
|
||||
} else {
|
||||
hash.update("no-path");
|
||||
}
|
||||
|
||||
const assetModuleFilename =
|
||||
this.filename || runtimeTemplate.outputOptions.assetModuleFilename;
|
||||
const { path: filename, info } =
|
||||
runtimeTemplate.compilation.getAssetPathWithInfo(
|
||||
assetModuleFilename,
|
||||
pathData
|
||||
);
|
||||
hash.update(filename);
|
||||
hash.update(JSON.stringify(info));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = AssetGenerator;
|
239
node_modules/webpack/lib/asset/AssetModulesPlugin.js
generated
vendored
Normal file
239
node_modules/webpack/lib/asset/AssetModulesPlugin.js
generated
vendored
Normal file
@ -0,0 +1,239 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Yuta Hiroto @hiroppy
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const {
|
||||
ASSET_MODULE_TYPE_RESOURCE,
|
||||
ASSET_MODULE_TYPE_INLINE,
|
||||
ASSET_MODULE_TYPE,
|
||||
ASSET_MODULE_TYPE_SOURCE
|
||||
} = require("../ModuleTypeConstants");
|
||||
const { cleverMerge } = require("../util/cleverMerge");
|
||||
const { compareModulesByIdentifier } = require("../util/comparators");
|
||||
const createSchemaValidation = require("../util/create-schema-validation");
|
||||
const memoize = require("../util/memoize");
|
||||
|
||||
/** @typedef {import("webpack-sources").Source} Source */
|
||||
/** @typedef {import("../Chunk")} Chunk */
|
||||
/** @typedef {import("../Compiler")} Compiler */
|
||||
/** @typedef {import("../Module")} Module */
|
||||
|
||||
/**
|
||||
* @param {string} name name of definitions
|
||||
* @returns {TODO} definition
|
||||
*/
|
||||
const getSchema = name => {
|
||||
const { definitions } = require("../../schemas/WebpackOptions.json");
|
||||
return {
|
||||
definitions,
|
||||
oneOf: [{ $ref: `#/definitions/${name}` }]
|
||||
};
|
||||
};
|
||||
|
||||
const generatorValidationOptions = {
|
||||
name: "Asset Modules Plugin",
|
||||
baseDataPath: "generator"
|
||||
};
|
||||
const validateGeneratorOptions = {
|
||||
asset: createSchemaValidation(
|
||||
require("../../schemas/plugins/asset/AssetGeneratorOptions.check.js"),
|
||||
() => getSchema("AssetGeneratorOptions"),
|
||||
generatorValidationOptions
|
||||
),
|
||||
"asset/resource": createSchemaValidation(
|
||||
require("../../schemas/plugins/asset/AssetResourceGeneratorOptions.check.js"),
|
||||
() => getSchema("AssetResourceGeneratorOptions"),
|
||||
generatorValidationOptions
|
||||
),
|
||||
"asset/inline": createSchemaValidation(
|
||||
require("../../schemas/plugins/asset/AssetInlineGeneratorOptions.check.js"),
|
||||
() => getSchema("AssetInlineGeneratorOptions"),
|
||||
generatorValidationOptions
|
||||
)
|
||||
};
|
||||
|
||||
const validateParserOptions = createSchemaValidation(
|
||||
require("../../schemas/plugins/asset/AssetParserOptions.check.js"),
|
||||
() => getSchema("AssetParserOptions"),
|
||||
{
|
||||
name: "Asset Modules Plugin",
|
||||
baseDataPath: "parser"
|
||||
}
|
||||
);
|
||||
|
||||
const getAssetGenerator = memoize(() => require("./AssetGenerator"));
|
||||
const getAssetParser = memoize(() => require("./AssetParser"));
|
||||
const getAssetSourceParser = memoize(() => require("./AssetSourceParser"));
|
||||
const getAssetSourceGenerator = memoize(() =>
|
||||
require("./AssetSourceGenerator")
|
||||
);
|
||||
|
||||
const type = ASSET_MODULE_TYPE;
|
||||
const plugin = "AssetModulesPlugin";
|
||||
|
||||
class AssetModulesPlugin {
|
||||
/**
|
||||
* Apply the plugin
|
||||
* @param {Compiler} compiler the compiler instance
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(compiler) {
|
||||
compiler.hooks.compilation.tap(
|
||||
plugin,
|
||||
(compilation, { normalModuleFactory }) => {
|
||||
normalModuleFactory.hooks.createParser
|
||||
.for(ASSET_MODULE_TYPE)
|
||||
.tap(plugin, parserOptions => {
|
||||
validateParserOptions(parserOptions);
|
||||
parserOptions = cleverMerge(
|
||||
compiler.options.module.parser.asset,
|
||||
parserOptions
|
||||
);
|
||||
|
||||
let dataUrlCondition = parserOptions.dataUrlCondition;
|
||||
if (!dataUrlCondition || typeof dataUrlCondition === "object") {
|
||||
dataUrlCondition = {
|
||||
maxSize: 8096,
|
||||
...dataUrlCondition
|
||||
};
|
||||
}
|
||||
|
||||
const AssetParser = getAssetParser();
|
||||
|
||||
return new AssetParser(dataUrlCondition);
|
||||
});
|
||||
normalModuleFactory.hooks.createParser
|
||||
.for(ASSET_MODULE_TYPE_INLINE)
|
||||
.tap(plugin, parserOptions => {
|
||||
const AssetParser = getAssetParser();
|
||||
|
||||
return new AssetParser(true);
|
||||
});
|
||||
normalModuleFactory.hooks.createParser
|
||||
.for(ASSET_MODULE_TYPE_RESOURCE)
|
||||
.tap(plugin, parserOptions => {
|
||||
const AssetParser = getAssetParser();
|
||||
|
||||
return new AssetParser(false);
|
||||
});
|
||||
normalModuleFactory.hooks.createParser
|
||||
.for(ASSET_MODULE_TYPE_SOURCE)
|
||||
.tap(plugin, parserOptions => {
|
||||
const AssetSourceParser = getAssetSourceParser();
|
||||
|
||||
return new AssetSourceParser();
|
||||
});
|
||||
|
||||
for (const type of [
|
||||
ASSET_MODULE_TYPE,
|
||||
ASSET_MODULE_TYPE_INLINE,
|
||||
ASSET_MODULE_TYPE_RESOURCE
|
||||
]) {
|
||||
normalModuleFactory.hooks.createGenerator
|
||||
.for(type)
|
||||
.tap(plugin, generatorOptions => {
|
||||
validateGeneratorOptions[type](generatorOptions);
|
||||
|
||||
let dataUrl = undefined;
|
||||
if (type !== ASSET_MODULE_TYPE_RESOURCE) {
|
||||
dataUrl = generatorOptions.dataUrl;
|
||||
if (!dataUrl || typeof dataUrl === "object") {
|
||||
dataUrl = {
|
||||
encoding: undefined,
|
||||
mimetype: undefined,
|
||||
...dataUrl
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
let filename = undefined;
|
||||
let publicPath = undefined;
|
||||
let outputPath = undefined;
|
||||
if (type !== ASSET_MODULE_TYPE_INLINE) {
|
||||
filename = generatorOptions.filename;
|
||||
publicPath = generatorOptions.publicPath;
|
||||
outputPath = generatorOptions.outputPath;
|
||||
}
|
||||
|
||||
const AssetGenerator = getAssetGenerator();
|
||||
|
||||
return new AssetGenerator(
|
||||
dataUrl,
|
||||
filename,
|
||||
publicPath,
|
||||
outputPath,
|
||||
generatorOptions.emit !== false
|
||||
);
|
||||
});
|
||||
}
|
||||
normalModuleFactory.hooks.createGenerator
|
||||
.for(ASSET_MODULE_TYPE_SOURCE)
|
||||
.tap(plugin, () => {
|
||||
const AssetSourceGenerator = getAssetSourceGenerator();
|
||||
|
||||
return new AssetSourceGenerator();
|
||||
});
|
||||
|
||||
compilation.hooks.renderManifest.tap(plugin, (result, options) => {
|
||||
const { chunkGraph } = compilation;
|
||||
const { chunk, codeGenerationResults } = options;
|
||||
|
||||
const modules = chunkGraph.getOrderedChunkModulesIterableBySourceType(
|
||||
chunk,
|
||||
ASSET_MODULE_TYPE,
|
||||
compareModulesByIdentifier
|
||||
);
|
||||
if (modules) {
|
||||
for (const module of modules) {
|
||||
try {
|
||||
const codeGenResult = codeGenerationResults.get(
|
||||
module,
|
||||
chunk.runtime
|
||||
);
|
||||
result.push({
|
||||
render: () => codeGenResult.sources.get(type),
|
||||
filename:
|
||||
module.buildInfo.filename ||
|
||||
codeGenResult.data.get("filename"),
|
||||
info:
|
||||
module.buildInfo.assetInfo ||
|
||||
codeGenResult.data.get("assetInfo"),
|
||||
auxiliary: true,
|
||||
identifier: `assetModule${chunkGraph.getModuleId(module)}`,
|
||||
hash:
|
||||
module.buildInfo.fullContentHash ||
|
||||
codeGenResult.data.get("fullContentHash")
|
||||
});
|
||||
} catch (e) {
|
||||
/** @type {Error} */ (
|
||||
e
|
||||
).message += `\nduring rendering of asset ${module.identifier()}`;
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
compilation.hooks.prepareModuleExecution.tap(
|
||||
"AssetModulesPlugin",
|
||||
(options, context) => {
|
||||
const { codeGenerationResult } = options;
|
||||
const source = codeGenerationResult.sources.get(ASSET_MODULE_TYPE);
|
||||
if (source === undefined) return;
|
||||
context.assets.set(codeGenerationResult.data.get("filename"), {
|
||||
source,
|
||||
info: codeGenerationResult.data.get("assetInfo")
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = AssetModulesPlugin;
|
65
node_modules/webpack/lib/asset/AssetParser.js
generated
vendored
Normal file
65
node_modules/webpack/lib/asset/AssetParser.js
generated
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Yuta Hiroto @hiroppy
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const Parser = require("../Parser");
|
||||
|
||||
/** @typedef {import("../../declarations/WebpackOptions").AssetParserDataUrlOptions} AssetParserDataUrlOptions */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").AssetParserOptions} AssetParserOptions */
|
||||
/** @typedef {import("../Module").BuildInfo} BuildInfo */
|
||||
/** @typedef {import("../Module").BuildMeta} BuildMeta */
|
||||
/** @typedef {import("../Parser").ParserState} ParserState */
|
||||
/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
|
||||
|
||||
class AssetParser extends Parser {
|
||||
/**
|
||||
* @param {AssetParserOptions["dataUrlCondition"] | boolean} dataUrlCondition condition for inlining as DataUrl
|
||||
*/
|
||||
constructor(dataUrlCondition) {
|
||||
super();
|
||||
this.dataUrlCondition = dataUrlCondition;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string | Buffer | PreparsedAst} source the source to parse
|
||||
* @param {ParserState} state the parser state
|
||||
* @returns {ParserState} the parser state
|
||||
*/
|
||||
parse(source, state) {
|
||||
if (typeof source === "object" && !Buffer.isBuffer(source)) {
|
||||
throw new Error("AssetParser doesn't accept preparsed AST");
|
||||
}
|
||||
|
||||
const buildInfo = /** @type {BuildInfo} */ (state.module.buildInfo);
|
||||
buildInfo.strict = true;
|
||||
const buildMeta = /** @type {BuildMeta} */ (state.module.buildMeta);
|
||||
buildMeta.exportsType = "default";
|
||||
buildMeta.defaultObject = false;
|
||||
|
||||
if (typeof this.dataUrlCondition === "function") {
|
||||
buildInfo.dataUrl = this.dataUrlCondition(source, {
|
||||
filename: state.module.matchResource || state.module.resource,
|
||||
module: state.module
|
||||
});
|
||||
} else if (typeof this.dataUrlCondition === "boolean") {
|
||||
buildInfo.dataUrl = this.dataUrlCondition;
|
||||
} else if (
|
||||
this.dataUrlCondition &&
|
||||
typeof this.dataUrlCondition === "object"
|
||||
) {
|
||||
buildInfo.dataUrl =
|
||||
Buffer.byteLength(source) <=
|
||||
/** @type {NonNullable<AssetParserDataUrlOptions["maxSize"]>} */
|
||||
(this.dataUrlCondition.maxSize);
|
||||
} else {
|
||||
throw new Error("Unexpected dataUrlCondition type");
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = AssetParser;
|
96
node_modules/webpack/lib/asset/AssetSourceGenerator.js
generated
vendored
Normal file
96
node_modules/webpack/lib/asset/AssetSourceGenerator.js
generated
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
/*
|
||||
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();
|
||||
|
||||
let encodedSource;
|
||||
if (typeof content === "string") {
|
||||
encodedSource = content;
|
||||
} else {
|
||||
encodedSource = 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<string>} 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;
|
37
node_modules/webpack/lib/asset/AssetSourceParser.js
generated
vendored
Normal file
37
node_modules/webpack/lib/asset/AssetSourceParser.js
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Yuta Hiroto @hiroppy
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const Parser = require("../Parser");
|
||||
|
||||
/** @typedef {import("../Module").BuildInfo} BuildInfo */
|
||||
/** @typedef {import("../Module").BuildMeta} BuildMeta */
|
||||
/** @typedef {import("../Parser").ParserState} ParserState */
|
||||
/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
|
||||
|
||||
class AssetSourceParser extends Parser {
|
||||
/**
|
||||
* @param {string | Buffer | PreparsedAst} source the source to parse
|
||||
* @param {ParserState} state the parser state
|
||||
* @returns {ParserState} the parser state
|
||||
*/
|
||||
parse(source, state) {
|
||||
if (typeof source === "object" && !Buffer.isBuffer(source)) {
|
||||
throw new Error("AssetSourceParser doesn't accept preparsed AST");
|
||||
}
|
||||
const { module } = state;
|
||||
/** @type {BuildInfo} */
|
||||
(module.buildInfo).strict = true;
|
||||
/** @type {BuildMeta} */
|
||||
(module.buildMeta).exportsType = "default";
|
||||
/** @type {BuildMeta} */
|
||||
(state.module.buildMeta).defaultObject = false;
|
||||
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = AssetSourceParser;
|
159
node_modules/webpack/lib/asset/RawDataUrlModule.js
generated
vendored
Normal file
159
node_modules/webpack/lib/asset/RawDataUrlModule.js
generated
vendored
Normal file
@ -0,0 +1,159 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const { RawSource } = require("webpack-sources");
|
||||
const Module = require("../Module");
|
||||
const { ASSET_MODULE_TYPE_RAW_DATA_URL } = require("../ModuleTypeConstants");
|
||||
const RuntimeGlobals = require("../RuntimeGlobals");
|
||||
const makeSerializable = require("../util/makeSerializable");
|
||||
|
||||
/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
|
||||
/** @typedef {import("../Compilation")} Compilation */
|
||||
/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
|
||||
/** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
|
||||
/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
|
||||
/** @typedef {import("../Module").NeedBuildContext} NeedBuildContext */
|
||||
/** @typedef {import("../RequestShortener")} RequestShortener */
|
||||
/** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
|
||||
/** @typedef {import("../WebpackError")} WebpackError */
|
||||
/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
|
||||
/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
|
||||
/** @typedef {import("../util/Hash")} Hash */
|
||||
/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
|
||||
|
||||
const TYPES = new Set(["javascript"]);
|
||||
|
||||
class RawDataUrlModule extends Module {
|
||||
/**
|
||||
* @param {string} url raw url
|
||||
* @param {string} identifier unique identifier
|
||||
* @param {string=} readableIdentifier readable identifier
|
||||
*/
|
||||
constructor(url, identifier, readableIdentifier) {
|
||||
super(ASSET_MODULE_TYPE_RAW_DATA_URL, null);
|
||||
this.url = url;
|
||||
this.urlBuffer = url ? Buffer.from(url) : undefined;
|
||||
this.identifierStr = identifier || this.url;
|
||||
this.readableIdentifierStr = readableIdentifier || this.identifierStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Set<string>} types available (do not mutate)
|
||||
*/
|
||||
getSourceTypes() {
|
||||
return TYPES;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {string} a unique identifier of the module
|
||||
*/
|
||||
identifier() {
|
||||
return this.identifierStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string=} type the source type for which the size should be estimated
|
||||
* @returns {number} the estimated size of the module (must be non-zero)
|
||||
*/
|
||||
size(type) {
|
||||
if (this.url === undefined)
|
||||
this.url = /** @type {Buffer} */ (this.urlBuffer).toString();
|
||||
return Math.max(1, this.url.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {RequestShortener} requestShortener the request shortener
|
||||
* @returns {string} a user readable identifier of the module
|
||||
*/
|
||||
readableIdentifier(requestShortener) {
|
||||
return requestShortener.shorten(this.readableIdentifierStr);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NeedBuildContext} context context info
|
||||
* @param {function((WebpackError | null)=, boolean=): void} callback callback function, returns true, if the module needs a rebuild
|
||||
* @returns {void}
|
||||
*/
|
||||
needBuild(context, callback) {
|
||||
return callback(null, !this.buildMeta);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {WebpackOptions} options webpack options
|
||||
* @param {Compilation} compilation the compilation
|
||||
* @param {ResolverWithOptions} resolver the resolver
|
||||
* @param {InputFileSystem} fs the file system
|
||||
* @param {function(WebpackError=): void} callback callback function
|
||||
* @returns {void}
|
||||
*/
|
||||
build(options, compilation, resolver, fs, callback) {
|
||||
this.buildMeta = {};
|
||||
this.buildInfo = {
|
||||
cacheable: true
|
||||
};
|
||||
callback();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {CodeGenerationContext} context context for code generation
|
||||
* @returns {CodeGenerationResult} result
|
||||
*/
|
||||
codeGeneration(context) {
|
||||
if (this.url === undefined)
|
||||
this.url = /** @type {Buffer} */ (this.urlBuffer).toString();
|
||||
const sources = new Map();
|
||||
sources.set(
|
||||
"javascript",
|
||||
new RawSource(`module.exports = ${JSON.stringify(this.url)};`)
|
||||
);
|
||||
const data = new Map();
|
||||
data.set("url", this.urlBuffer);
|
||||
const runtimeRequirements = new Set();
|
||||
runtimeRequirements.add(RuntimeGlobals.module);
|
||||
return { sources, runtimeRequirements, data };
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Hash} hash the hash used to track dependencies
|
||||
* @param {UpdateHashContext} context context
|
||||
* @returns {void}
|
||||
*/
|
||||
updateHash(hash, context) {
|
||||
hash.update(/** @type {Buffer} */ (this.urlBuffer));
|
||||
super.updateHash(hash, context);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ObjectSerializerContext} context context
|
||||
*/
|
||||
serialize(context) {
|
||||
const { write } = context;
|
||||
|
||||
write(this.urlBuffer);
|
||||
write(this.identifierStr);
|
||||
write(this.readableIdentifierStr);
|
||||
|
||||
super.serialize(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ObjectDeserializerContext} context context
|
||||
*/
|
||||
deserialize(context) {
|
||||
const { read } = context;
|
||||
|
||||
this.urlBuffer = read();
|
||||
this.identifierStr = read();
|
||||
this.readableIdentifierStr = read();
|
||||
|
||||
super.deserialize(context);
|
||||
}
|
||||
}
|
||||
|
||||
makeSerializable(RawDataUrlModule, "webpack/lib/asset/RawDataUrlModule");
|
||||
|
||||
module.exports = RawDataUrlModule;
|
Reference in New Issue
Block a user