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.
56 lines
1.7 KiB
56 lines
1.7 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Yuta Hiroto @hiroppy |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const Parser = require("../Parser"); |
|
|
|
/** @typedef {import("../../declarations/WebpackOptions").AssetParserOptions} AssetParserOptions */ |
|
/** @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"); |
|
} |
|
state.module.buildInfo.strict = true; |
|
state.module.buildMeta.exportsType = "default"; |
|
|
|
if (typeof this.dataUrlCondition === "function") { |
|
state.module.buildInfo.dataUrl = this.dataUrlCondition(source, { |
|
filename: state.module.matchResource || state.module.resource, |
|
module: state.module |
|
}); |
|
} else if (typeof this.dataUrlCondition === "boolean") { |
|
state.module.buildInfo.dataUrl = this.dataUrlCondition; |
|
} else if ( |
|
this.dataUrlCondition && |
|
typeof this.dataUrlCondition === "object" |
|
) { |
|
state.module.buildInfo.dataUrl = |
|
Buffer.byteLength(source) <= this.dataUrlCondition.maxSize; |
|
} else { |
|
throw new Error("Unexpected dataUrlCondition type"); |
|
} |
|
|
|
return state; |
|
} |
|
} |
|
|
|
module.exports = AssetParser;
|
|
|