feat: ability to rename loader resource

This commit is contained in:
alexander.akait 2024-08-27 21:17:23 +03:00
parent eabf85d858
commit 1b9c19818c
6 changed files with 38 additions and 15 deletions

View File

@ -48,6 +48,7 @@ export interface NormalModuleLoaderContext<OptionsType> {
fs: InputFileSystem;
sourceMap?: boolean;
mode: "development" | "production" | "none";
virtualResource: string | undefined;
webpack?: boolean;
_module?: NormalModule;
_compilation?: Compilation;

View File

@ -356,6 +356,8 @@ class NormalModule extends Module {
this.resourceResolveData = resourceResolveData;
/** @type {string | undefined} */
this.matchResource = matchResource;
/** @type {string | undefined} */
this.virtualResource = undefined;
/** @type {LoaderItem[]} */
this.loaders = loaders;
if (resolveOptions !== undefined) {
@ -431,7 +433,8 @@ class NormalModule extends Module {
* @returns {string | null} absolute path which should be used for condition matching (usually the resource path)
*/
nameForCondition() {
const resource = this.matchResource || this.resource;
const resource =
this.virtualResource || this.matchResource || this.resource;
const idx = resource.indexOf("?");
if (idx >= 0) return resource.slice(0, idx);
return resource;
@ -645,11 +648,12 @@ class NormalModule extends Module {
(compilation.outputOptions.hashFunction)
)
};
const module = this;
/** @type {import("../declarations/LoaderContext").NormalModuleLoaderContext<T>} */
const loaderContext = {
version: 2,
getOptions: schema => {
const loader = this.getCurrentLoader(loaderContext);
const loader = module.getCurrentLoader(loaderContext);
let { options } = /** @type {LoaderItem} */ (loader);
@ -692,7 +696,7 @@ class NormalModule extends Module {
if (!(warning instanceof Error)) {
warning = new NonErrorEmittedError(warning);
}
this.addWarning(
module.addWarning(
new ModuleWarning(warning, {
from: getCurrentLoaderName()
})
@ -702,16 +706,16 @@ class NormalModule extends Module {
if (!(error instanceof Error)) {
error = new NonErrorEmittedError(error);
}
this.addError(
module.addError(
new ModuleError(error, {
from: getCurrentLoaderName()
})
);
},
getLogger: name => {
const currentLoader = this.getCurrentLoader(loaderContext);
const currentLoader = module.getCurrentLoader(loaderContext);
return compilation.getLogger(() =>
[currentLoader && currentLoader.loader, name, this.identifier()]
[currentLoader && currentLoader.loader, name, module.identifier()]
.filter(Boolean)
.join("|")
);
@ -741,7 +745,7 @@ class NormalModule extends Module {
};
},
emitFile: (name, content, sourceMap, assetInfo) => {
const buildInfo = /** @type {BuildInfo} */ (this.buildInfo);
const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
if (!buildInfo.assets) {
buildInfo.assets = Object.create(null);
@ -755,7 +759,7 @@ class NormalModule extends Module {
/** @type {NonNullable<KnownBuildInfo["assetsInfo"]>} */
(buildInfo.assetsInfo);
assets[name] = this.createSourceForAsset(
assets[name] = module.createSourceForAsset(
/** @type {string} */ (options.context),
name,
content,
@ -765,7 +769,7 @@ class NormalModule extends Module {
assetsInfo.set(name, assetInfo);
},
addBuildDependency: dep => {
const buildInfo = /** @type {BuildInfo} */ (this.buildInfo);
const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
if (buildInfo.buildDependencies === undefined) {
buildInfo.buildDependencies = new LazySet();
@ -775,9 +779,15 @@ class NormalModule extends Module {
utils,
rootContext: /** @type {string} */ (options.context),
webpack: true,
sourceMap: Boolean(this.useSourceMap),
sourceMap: Boolean(module.useSourceMap),
mode: options.mode || "production",
_module: this,
get virtualResource() {
return module.virtualResource;
},
set virtualResource(v) {
module.virtualResource = v;
},
_module: module,
_compilation: compilation,
_compiler: compilation.compiler,
fs
@ -1590,6 +1600,7 @@ class NormalModule extends Module {
const { write } = context;
// deserialize
write(this._source);
write(this.virtualResource);
write(this.error);
write(this._lastSuccessfulBuildMeta);
write(this._forceBuild);
@ -1626,6 +1637,7 @@ class NormalModule extends Module {
deserialize(context) {
const { read } = context;
this._source = read();
this.virtualResource = read();
this.error = read();
this._lastSuccessfulBuildMeta = read();
this._forceBuild = read();

View File

@ -193,7 +193,7 @@ class AssetGenerator extends Generator {
getSourceFileName(module, runtimeTemplate) {
return makePathsRelative(
runtimeTemplate.compilation.compiler.context,
module.matchResource || module.resource,
module.virtualResource || module.matchResource || module.resource,
runtimeTemplate.compilation.compiler.root
).replace(/^\.\//, "");
}
@ -292,7 +292,10 @@ class AssetGenerator extends Generator {
null,
originalSource.source(),
{
filename: module.matchResource || module.resource,
filename:
module.virtualResource ||
module.matchResource ||
module.resource,
module
}
);

View File

@ -41,7 +41,10 @@ class AssetParser extends Parser {
if (typeof this.dataUrlCondition === "function") {
buildInfo.dataUrl = this.dataUrlCondition(source, {
filename: state.module.matchResource || state.module.resource,
filename:
state.module.virtualResource ||
state.module.matchResource ||
state.module.resource,
module: state.module
});
} else if (typeof this.dataUrlCondition === "boolean") {

View File

@ -183,7 +183,9 @@ class CssParser extends Parser {
if (
module.type === CSS_MODULE_TYPE_AUTO &&
IS_MODULES.test(
parseResource(module.matchResource || module.resource).path
parseResource(
module.virtualResource || module.matchResource || module.resource
).path
)
) {
oldDefaultMode = this.defaultMode;

2
types.d.ts vendored
View File

@ -9134,6 +9134,7 @@ declare class NormalModule extends Module {
resource: string;
resourceResolveData?: Record<string, any>;
matchResource?: string;
virtualResource?: string;
loaders: LoaderItem[];
error: null | WebpackError;
@ -9379,6 +9380,7 @@ declare interface NormalModuleLoaderContext<OptionsType> {
fs: InputFileSystem;
sourceMap?: boolean;
mode: "none" | "development" | "production";
virtualResource?: string;
webpack?: boolean;
_module?: NormalModule;
_compilation?: Compilation;