mirror of https://github.com/webpack/webpack.git
feat: added ability to generate custom error content for generators (#19385)
Github Actions / lint (push) Waiting to run
Details
Github Actions / basic (push) Waiting to run
Details
Github Actions / validate-legacy-node (push) Waiting to run
Details
Github Actions / unit (push) Waiting to run
Details
Github Actions / integration (10.x, macos-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, macos-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, windows-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, windows-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (12.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (14.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (16.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (18.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (18.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, macos-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, macos-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, windows-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, windows-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, macos-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, macos-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, windows-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, windows-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (23.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (23.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (lts/*, ubuntu-latest, a, 1) (push) Blocked by required conditions
Details
Github Actions / integration (lts/*, ubuntu-latest, b, 1) (push) Blocked by required conditions
Details
Github Actions / lint (push) Waiting to run
Details
Github Actions / basic (push) Waiting to run
Details
Github Actions / validate-legacy-node (push) Waiting to run
Details
Github Actions / unit (push) Waiting to run
Details
Github Actions / integration (10.x, macos-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, macos-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, windows-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (10.x, windows-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (12.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (14.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (16.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (18.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (18.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, macos-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, macos-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, windows-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (20.x, windows-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, macos-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, macos-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, windows-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (22.x, windows-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (23.x, ubuntu-latest, a) (push) Blocked by required conditions
Details
Github Actions / integration (23.x, ubuntu-latest, b) (push) Blocked by required conditions
Details
Github Actions / integration (lts/*, ubuntu-latest, a, 1) (push) Blocked by required conditions
Details
Github Actions / integration (lts/*, ubuntu-latest, b, 1) (push) Blocked by required conditions
Details
This commit is contained in:
parent
880cf0804d
commit
e5c3f95b84
|
@ -35,6 +35,14 @@
|
||||||
* @property {() => Map<string, TODO>=} getData get access to the code generation data
|
* @property {() => Map<string, TODO>=} getData get access to the code generation data
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback GenerateErrorFn
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {object} UpdateHashContext
|
* @typedef {object} UpdateHashContext
|
||||||
* @property {NormalModule} module the module
|
* @property {NormalModule} module the module
|
||||||
|
@ -108,6 +116,24 @@ class Generator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @this {ByTypeGenerator}
|
||||||
|
* @type {GenerateErrorFn}
|
||||||
|
*/
|
||||||
|
function generateError(error, module, generateContext) {
|
||||||
|
const type = generateContext.type;
|
||||||
|
const generator =
|
||||||
|
/** @type {Generator & { generateError?: GenerateErrorFn }} */
|
||||||
|
(this.map[type]);
|
||||||
|
if (!generator) {
|
||||||
|
throw new Error(`Generator.byType: no generator specified for ${type}`);
|
||||||
|
}
|
||||||
|
if (typeof generator.generateError === "undefined") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return generator.generateError(error, module, generateContext);
|
||||||
|
}
|
||||||
|
|
||||||
class ByTypeGenerator extends Generator {
|
class ByTypeGenerator extends Generator {
|
||||||
/**
|
/**
|
||||||
* @param {Record<string, Generator>} map map of types
|
* @param {Record<string, Generator>} map map of types
|
||||||
|
@ -116,6 +142,8 @@ class ByTypeGenerator extends Generator {
|
||||||
super();
|
super();
|
||||||
this.map = map;
|
this.map = map;
|
||||||
this._types = new Set(Object.keys(map));
|
this._types = new Set(Object.keys(map));
|
||||||
|
/** @type {GenerateErrorFn | undefined} */
|
||||||
|
this.generateError = generateError.bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -205,6 +205,7 @@ class Module extends DependenciesBlock {
|
||||||
this.useSimpleSourceMap = false;
|
this.useSimpleSourceMap = false;
|
||||||
|
|
||||||
// Is in hot context, i.e. HotModuleReplacementPlugin.js enabled
|
// Is in hot context, i.e. HotModuleReplacementPlugin.js enabled
|
||||||
|
// TODO do we need hot here?
|
||||||
/** @type {boolean} */
|
/** @type {boolean} */
|
||||||
this.hot = false;
|
this.hot = false;
|
||||||
// Info from Build
|
// Info from Build
|
||||||
|
|
|
@ -62,6 +62,7 @@ const memoize = require("./util/memoize");
|
||||||
/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
|
/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
|
||||||
/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
|
/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
|
||||||
/** @typedef {import("./Generator")} Generator */
|
/** @typedef {import("./Generator")} Generator */
|
||||||
|
/** @typedef {import("./Generator").GenerateErrorFn} GenerateErrorFn */
|
||||||
/** @typedef {import("./Module").BuildInfo} BuildInfo */
|
/** @typedef {import("./Module").BuildInfo} BuildInfo */
|
||||||
/** @typedef {import("./Module").BuildMeta} BuildMeta */
|
/** @typedef {import("./Module").BuildMeta} BuildMeta */
|
||||||
/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
|
/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
|
||||||
|
@ -1450,11 +1451,28 @@ class NormalModule extends Module {
|
||||||
|
|
||||||
const sources = new Map();
|
const sources = new Map();
|
||||||
for (const type of sourceTypes || chunkGraph.getModuleSourceTypes(this)) {
|
for (const type of sourceTypes || chunkGraph.getModuleSourceTypes(this)) {
|
||||||
|
// TODO webpack@6 make generateError required
|
||||||
|
const generator =
|
||||||
|
/** @type {Generator & { generateError?: GenerateErrorFn }} */
|
||||||
|
(this.generator);
|
||||||
const source = this.error
|
const source = this.error
|
||||||
? new RawSource(
|
? generator.generateError
|
||||||
`throw new Error(${JSON.stringify(this.error.message)});`
|
? generator.generateError(this.error, this, {
|
||||||
)
|
dependencyTemplates,
|
||||||
: /** @type {Generator} */ (this.generator).generate(this, {
|
runtimeTemplate,
|
||||||
|
moduleGraph,
|
||||||
|
chunkGraph,
|
||||||
|
runtimeRequirements,
|
||||||
|
runtime,
|
||||||
|
concatenationScope,
|
||||||
|
codeGenerationResults,
|
||||||
|
getData,
|
||||||
|
type
|
||||||
|
})
|
||||||
|
: new RawSource(
|
||||||
|
`throw new Error(${JSON.stringify(this.error.message)});`
|
||||||
|
)
|
||||||
|
: generator.generate(this, {
|
||||||
dependencyTemplates,
|
dependencyTemplates,
|
||||||
runtimeTemplate,
|
runtimeTemplate,
|
||||||
moduleGraph,
|
moduleGraph,
|
||||||
|
|
|
@ -244,6 +244,10 @@ class AssetGenerator extends Generator {
|
||||||
hash.update(source.buffer());
|
hash.update(source.buffer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (module.error) {
|
||||||
|
hash.update(module.error.toString());
|
||||||
|
}
|
||||||
|
|
||||||
const fullContentHash = /** @type {string} */ (
|
const fullContentHash = /** @type {string} */ (
|
||||||
hash.digest(runtimeTemplate.outputOptions.hashDigest)
|
hash.digest(runtimeTemplate.outputOptions.hashDigest)
|
||||||
);
|
);
|
||||||
|
@ -623,6 +627,27 @@ class AssetGenerator extends Generator {
|
||||||
return /** @type {Source} */ (module.originalSource());
|
return /** @type {Source} */ (module.originalSource());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
generateError(error, module, generateContext) {
|
||||||
|
switch (generateContext.type) {
|
||||||
|
case "asset": {
|
||||||
|
return new RawSource(error.message);
|
||||||
|
}
|
||||||
|
case "javascript": {
|
||||||
|
return new RawSource(
|
||||||
|
`throw new Error(${JSON.stringify(error.message)});`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {NormalModule} module fresh module
|
* @param {NormalModule} module fresh module
|
||||||
* @returns {SourceTypes} available types (do not mutate)
|
* @returns {SourceTypes} available types (do not mutate)
|
||||||
|
@ -708,6 +733,7 @@ class AssetGenerator extends Generator {
|
||||||
*/
|
*/
|
||||||
updateHash(hash, updateHashContext) {
|
updateHash(hash, updateHashContext) {
|
||||||
const { module } = updateHashContext;
|
const { module } = updateHashContext;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
/** @type {BuildInfo} */
|
/** @type {BuildInfo} */
|
||||||
(module.buildInfo).dataUrl
|
(module.buildInfo).dataUrl
|
||||||
|
|
|
@ -90,6 +90,24 @@ class AssetSourceGenerator extends Generator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
generateError(error, module, generateContext) {
|
||||||
|
switch (generateContext.type) {
|
||||||
|
case "javascript": {
|
||||||
|
return new RawSource(
|
||||||
|
`throw new Error(${JSON.stringify(error.message)});`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {NormalModule} module module for which the bailout reason should be determined
|
* @param {NormalModule} module module for which the bailout reason should be determined
|
||||||
* @param {ConcatenationBailoutReasonContext} context context
|
* @param {ConcatenationBailoutReasonContext} context context
|
||||||
|
|
|
@ -210,6 +210,27 @@ class CssGenerator extends Generator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
generateError(error, module, generateContext) {
|
||||||
|
switch (generateContext.type) {
|
||||||
|
case "javascript": {
|
||||||
|
return new RawSource(
|
||||||
|
`throw new Error(${JSON.stringify(error.message)});`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
case "css": {
|
||||||
|
return new RawSource(`/**\n ${error.message} \n**/`);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {NormalModule} module fresh module
|
* @param {NormalModule} module fresh module
|
||||||
* @returns {SourceTypes} available types (do not mutate)
|
* @returns {SourceTypes} available types (do not mutate)
|
||||||
|
|
|
@ -110,6 +110,16 @@ class JavascriptGenerator extends Generator {
|
||||||
return InitFragment.addToSource(source, initFragments, generateContext);
|
return InitFragment.addToSource(source, initFragments, generateContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
generateError(error, module, generateContext) {
|
||||||
|
return new RawSource(`throw new Error(${JSON.stringify(error.message)});`);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Module} module the module to generate
|
* @param {Module} module the module to generate
|
||||||
* @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments
|
* @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments
|
||||||
|
|
|
@ -216,6 +216,16 @@ class JsonGenerator extends Generator {
|
||||||
}
|
}
|
||||||
return new RawSource(content);
|
return new RawSource(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
generateError(error, module, generateContext) {
|
||||||
|
return new RawSource(`throw new Error(${JSON.stringify(error.message)});`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = JsonGenerator;
|
module.exports = JsonGenerator;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
const { RawSource } = require("webpack-sources");
|
||||||
const Generator = require("../Generator");
|
const Generator = require("../Generator");
|
||||||
const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypesConstants");
|
const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypesConstants");
|
||||||
|
|
||||||
|
@ -56,6 +57,16 @@ class AsyncWebAssemblyGenerator extends Generator {
|
||||||
generate(module, generateContext) {
|
generate(module, generateContext) {
|
||||||
return /** @type {Source} */ (module.originalSource());
|
return /** @type {Source} */ (module.originalSource());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
generateError(error, module, generateContext) {
|
||||||
|
return new RawSource(error.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = AsyncWebAssemblyGenerator;
|
module.exports = AsyncWebAssemblyGenerator;
|
||||||
|
|
|
@ -201,6 +201,16 @@ class AsyncWebAssemblyJavascriptGenerator extends Generator {
|
||||||
|
|
||||||
return InitFragment.addToSource(source, initFragments, generateContext);
|
return InitFragment.addToSource(source, initFragments, generateContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
generateError(error, module, generateContext) {
|
||||||
|
return new RawSource(`throw new Error(${JSON.stringify(error.message)});`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = AsyncWebAssemblyJavascriptGenerator;
|
module.exports = AsyncWebAssemblyJavascriptGenerator;
|
||||||
|
|
|
@ -521,6 +521,16 @@ class WebAssemblyGenerator extends Generator {
|
||||||
|
|
||||||
return new RawSource(newBuf);
|
return new RawSource(newBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
generateError(error, module, generateContext) {
|
||||||
|
return new RawSource(error.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = WebAssemblyGenerator;
|
module.exports = WebAssemblyGenerator;
|
||||||
|
|
|
@ -212,6 +212,16 @@ class WebAssemblyJavascriptGenerator extends Generator {
|
||||||
);
|
);
|
||||||
return InitFragment.addToSource(source, initFragments, generateContext);
|
return InitFragment.addToSource(source, initFragments, generateContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Error} error the error
|
||||||
|
* @param {NormalModule} module module for which the code should be generated
|
||||||
|
* @param {GenerateContext} generateContext context for generate
|
||||||
|
* @returns {Source | null} generated code
|
||||||
|
*/
|
||||||
|
generateError(error, module, generateContext) {
|
||||||
|
return new RawSource(`throw new Error(${JSON.stringify(error.message)});`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = WebAssemblyJavascriptGenerator;
|
module.exports = WebAssemblyJavascriptGenerator;
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
(module
|
||||||
|
(type $t0 (func (param i32 i32) (result i32)))
|
||||||
|
(type $t1 (func (result i32)))
|
||||||
|
(func $add (export "add") (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
|
||||||
|
(i32.add
|
||||||
|
(get_local $p0)
|
||||||
|
(get_local $p1)))
|
||||||
|
(func $getNumber (export "getNumber") (type $t1) (result i32)
|
||||||
|
(i32.const 40)))
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
module.exports = [
|
||||||
|
/javascript\/auto error message/,
|
||||||
|
/asset\/inline error message/,
|
||||||
|
/asset\/resource error message/,
|
||||||
|
/asset\/resource other error message/,
|
||||||
|
/asset\/resource in css error message/,
|
||||||
|
/asset\/source error message/,
|
||||||
|
/asset\/source in css error message/,
|
||||||
|
/css\/auto error message/,
|
||||||
|
/css error message/,
|
||||||
|
/json error message/,
|
||||||
|
/json other error message/,
|
||||||
|
/webassembly\/async error message/
|
||||||
|
];
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"test": "test"
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><title>icon-square-small</title><path fill="#FFF" d="M300 .1L565 150v299.9L300 599.8 35 449.9V150z"/><path fill="#8ED6FB" d="M517.7 439.5L308.8 557.8v-92L439 394.1l78.7 45.4zm14.3-12.9V179.4l-76.4 44.1v159l76.4 44.1zM81.5 439.5l208.9 118.2v-92l-130.2-71.6-78.7 45.4zm-14.3-12.9V179.4l76.4 44.1v159l-76.4 44.1zm8.9-263.2L290.4 42.2v89l-137.3 75.5-1.1.6-75.9-43.9zm446.9 0L308.8 42.2v89L446 206.8l1.1.6 75.9-44z"/><path fill="#1C78C0" d="M290.4 444.8L162 374.1V234.2l128.4 74.1v136.5zm18.4 0l128.4-70.6v-140l-128.4 74.1v136.5zM299.6 303zm-129-85l129-70.9L428.5 218l-128.9 74.4-129-74.4z"/></svg>
|
After Width: | Height: | Size: 656 B |
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
|
@ -0,0 +1,118 @@
|
||||||
|
it("should generate a custom error content", async () => {
|
||||||
|
expect(__STATS__.modules.filter(m => m.moduleType !== "runtime").length).toEqual(14);
|
||||||
|
expect(__STATS__.assets.length).toEqual(19);
|
||||||
|
expect(__STATS__.chunks.length).toEqual(12);
|
||||||
|
|
||||||
|
let errored;
|
||||||
|
|
||||||
|
let json;
|
||||||
|
|
||||||
|
try {
|
||||||
|
json = await import("./file.json");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/json error message/);
|
||||||
|
|
||||||
|
let otherJson;
|
||||||
|
|
||||||
|
try {
|
||||||
|
otherJson = await import("./other.json");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/json other error message/);
|
||||||
|
|
||||||
|
let source;
|
||||||
|
|
||||||
|
try {
|
||||||
|
source = await import("./source.txt");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/asset\/source error message/);
|
||||||
|
|
||||||
|
let resource;
|
||||||
|
|
||||||
|
try {
|
||||||
|
resource = await import("./file.svg");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/asset\/resource error message/);
|
||||||
|
|
||||||
|
let otherResource;
|
||||||
|
|
||||||
|
try {
|
||||||
|
otherResource = await import("./other.svg");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/asset\/resource other error message/);
|
||||||
|
|
||||||
|
let inline;
|
||||||
|
|
||||||
|
try {
|
||||||
|
inline = await import("./inline.txt");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/asset\/inline error message/);
|
||||||
|
|
||||||
|
let style;
|
||||||
|
|
||||||
|
try {
|
||||||
|
style = await import("./style.css");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/css error message/);
|
||||||
|
|
||||||
|
let js;
|
||||||
|
|
||||||
|
try {
|
||||||
|
js = await import("./module.js");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/javascript\/auto error message/);
|
||||||
|
|
||||||
|
let otherStyle;
|
||||||
|
errored = undefined;
|
||||||
|
|
||||||
|
try {
|
||||||
|
otherStyle = await import("./style-other.css");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored).toBeUndefined();
|
||||||
|
|
||||||
|
let cssModules;
|
||||||
|
|
||||||
|
try {
|
||||||
|
cssModules = await import("./style.modules.css");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/css\/auto error message/);
|
||||||
|
|
||||||
|
let asyncWasm;
|
||||||
|
|
||||||
|
try {
|
||||||
|
asyncWasm = await import("./async-wasm.wat");
|
||||||
|
} catch (error) {
|
||||||
|
errored = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(errored.toString()).toMatch(/webassembly\/async error message/);
|
||||||
|
});
|
|
@ -0,0 +1,7 @@
|
||||||
|
module.exports = options => {
|
||||||
|
if (options.cache && options.cache.type === "filesystem") {
|
||||||
|
return [/Pack got invalid because of write to/];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
};
|
|
@ -0,0 +1 @@
|
||||||
|
inline
|
|
@ -0,0 +1,7 @@
|
||||||
|
/** @type {import("../../../../").LoaderDefinition<{ message: string }>} */
|
||||||
|
module.exports = function() {
|
||||||
|
const callback = this.async();
|
||||||
|
const options = this.getOptions();
|
||||||
|
|
||||||
|
callback(new Error(options.message || 'Message'));
|
||||||
|
};
|
|
@ -0,0 +1 @@
|
||||||
|
export default "test";
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"test": "test"
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><title>icon-square-small</title><path fill="#FFF" d="M300 .1L565 150v299.9L300 599.8 35 449.9V150z"/><path fill="#8ED6FB" d="M517.7 439.5L308.8 557.8v-92L439 394.1l78.7 45.4zm14.3-12.9V179.4l-76.4 44.1v159l76.4 44.1zM81.5 439.5l208.9 118.2v-92l-130.2-71.6-78.7 45.4zm-14.3-12.9V179.4l76.4 44.1v159l-76.4 44.1zm8.9-263.2L290.4 42.2v89l-137.3 75.5-1.1.6-75.9-43.9zm446.9 0L308.8 42.2v89L446 206.8l1.1.6 75.9-44z"/><path fill="#1C78C0" d="M290.4 444.8L162 374.1V234.2l128.4 74.1v136.5zm18.4 0l128.4-70.6v-140l-128.4 74.1v136.5zM299.6 303zm-129-85l129-70.9L428.5 218l-128.9 74.4-129-74.4z"/></svg>
|
After Width: | Height: | Size: 656 B |
|
@ -0,0 +1 @@
|
||||||
|
test
|
|
@ -0,0 +1,4 @@
|
||||||
|
div {
|
||||||
|
background: url("./in-style.png");
|
||||||
|
background: url("./in-style-source.png");
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
a {
|
||||||
|
color: red;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
.class {
|
||||||
|
color: red;
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
(module
|
||||||
|
(type $t0 (func (param i32 i32) (result i32)))
|
||||||
|
(type $t1 (func (result i32)))
|
||||||
|
(func $add (export "add") (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
|
||||||
|
(i32.add
|
||||||
|
(get_local $p0)
|
||||||
|
(get_local $p1)))
|
||||||
|
(func $getNumber (export "getNumber") (type $t1) (result i32)
|
||||||
|
(i32.const 40)))
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
const findOutputFiles = require("../../../helpers/findOutputFiles");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
findBundle: function (i, options) {
|
||||||
|
const files = findOutputFiles(options, new RegExp(/\.js$/));
|
||||||
|
|
||||||
|
return files.sort((a, b) => (a.startsWith("main") ? 1 : 0));
|
||||||
|
}
|
||||||
|
};
|
|
@ -0,0 +1,5 @@
|
||||||
|
const supportsWebAssembly = require("../../../helpers/supportsWebAssembly");
|
||||||
|
|
||||||
|
module.exports = function (config) {
|
||||||
|
return supportsWebAssembly();
|
||||||
|
};
|
|
@ -0,0 +1,143 @@
|
||||||
|
/** @type {import("../../../../").Configuration} */
|
||||||
|
module.exports = {
|
||||||
|
target: "web",
|
||||||
|
output: {
|
||||||
|
filename: "[name].[chunkhash:8].[contenthash:8].js",
|
||||||
|
chunkFilename: "[name].[chunkhash:8].[contenthash:8].js"
|
||||||
|
},
|
||||||
|
optimization: {
|
||||||
|
chunkIds: "named",
|
||||||
|
emitOnErrors: true
|
||||||
|
},
|
||||||
|
experiments: {
|
||||||
|
css: true,
|
||||||
|
asyncWebAssembly: true
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
type: "asset/source",
|
||||||
|
test: /source\.txt$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "asset/source error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "asset/resource",
|
||||||
|
test: /file\.svg$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "asset/resource error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "asset/resource",
|
||||||
|
test: /other\.svg$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "asset/resource other error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "asset/inline",
|
||||||
|
test: /inline\.txt$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "asset/inline error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "css",
|
||||||
|
test: /style\.css$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "css error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "asset/resource",
|
||||||
|
test: /in-style\.png$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "asset/resource in css error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "asset/source",
|
||||||
|
test: /in-style-source\.png$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "asset/source in css error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "javascript/auto",
|
||||||
|
test: /module\.js$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "javascript/auto error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "json",
|
||||||
|
test: /file\.json$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "json error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "json",
|
||||||
|
test: /other\.json$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "json other error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "css/auto",
|
||||||
|
generator: {
|
||||||
|
exportsOnly: true
|
||||||
|
},
|
||||||
|
test: /style\.modules\.css$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "css/auto error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "webassembly/async",
|
||||||
|
test: /async-wasm\.wat$/,
|
||||||
|
use: {
|
||||||
|
loader: "./loader.js",
|
||||||
|
options: {
|
||||||
|
message: "webassembly/async error message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
|
@ -888,6 +888,11 @@ type BuildInfo = KnownBuildInfo & Record<string, any>;
|
||||||
type BuildMeta = KnownBuildMeta & Record<string, any>;
|
type BuildMeta = KnownBuildMeta & Record<string, any>;
|
||||||
declare abstract class ByTypeGenerator extends Generator {
|
declare abstract class ByTypeGenerator extends Generator {
|
||||||
map: Record<string, Generator>;
|
map: Record<string, Generator>;
|
||||||
|
generateError?: (
|
||||||
|
error: Error,
|
||||||
|
module: NormalModule,
|
||||||
|
generateContext: GenerateContext
|
||||||
|
) => null | Source;
|
||||||
}
|
}
|
||||||
declare const CIRCULAR_CONNECTION: unique symbol;
|
declare const CIRCULAR_CONNECTION: unique symbol;
|
||||||
declare class Cache {
|
declare class Cache {
|
||||||
|
|
Loading…
Reference in New Issue