feat: allow to use `falsy` loaders and plugins

This commit is contained in:
alexander.akait 2023-06-07 04:07:31 +03:00
parent 90ee0510b1
commit 27cae68bda
15 changed files with 353 additions and 83 deletions

View File

@ -289,6 +289,10 @@ export type RuleSetConditionsAbsolute = RuleSetConditionAbsolute[];
* A loader request.
*/
export type RuleSetLoader = string;
/**
* Falsy value.
*/
export type Falsy = false | 0 | "" | null;
/**
* Options passed to a loader.
*/
@ -325,14 +329,14 @@ export type ResolveAlias =
* A list of descriptions of loaders applied.
*/
export type RuleSetUse =
| RuleSetUseItem[]
| (Falsy | RuleSetUseItem)[]
| ((data: {
resource: string;
realResource: string;
resourceQuery: string;
issuer: string;
compiler: string;
}) => RuleSetUseItem[])
}) => (Falsy | RuleSetUseItem)[])
| RuleSetUseItem;
/**
* A description of an applied loader.
@ -352,12 +356,12 @@ export type RuleSetUseItem =
*/
options?: RuleSetLoaderOptions;
}
| ((data: object) => RuleSetUseItem | RuleSetUseItem[])
| ((data: object) => RuleSetUseItem | (Falsy | RuleSetUseItem)[])
| RuleSetLoader;
/**
* A list of rules.
*/
export type RuleSetRules = ("..." | RuleSetRule)[];
export type RuleSetRules = ("..." | (false | 0 | "" | null) | RuleSetRule)[];
/**
* Specify options for each generator.
*/
@ -596,7 +600,7 @@ export type Performance = false | PerformanceOptions;
/**
* Add additional plugins to the compiler.
*/
export type Plugins = (WebpackPluginInstance | WebpackPluginFunction)[];
export type Plugins = (Falsy | WebpackPluginInstance | WebpackPluginFunction)[];
/**
* Capture timing information for each module.
*/
@ -1392,7 +1396,7 @@ export interface RuleSetRule {
/**
* Only execute the first matching rule in this array.
*/
oneOf?: RuleSetRule[];
oneOf?: (Falsy | RuleSetRule)[];
/**
* Shortcut for use.options.
*/
@ -1695,7 +1699,7 @@ export interface Optimization {
/**
* Minimizer(s) to use for minimizing the output.
*/
minimizer?: ("..." | WebpackPluginInstance | WebpackPluginFunction)[];
minimizer?: ("..." | Falsy | WebpackPluginInstance | WebpackPluginFunction)[];
/**
* Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: (deprecated) short hashes as ids for better long term caching, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, false: no algorithm used, as custom one can be provided via plugin).
*/

View File

@ -1073,7 +1073,9 @@ ${other}`);
childCompiler.root = this.root;
if (Array.isArray(plugins)) {
for (const plugin of plugins) {
plugin.apply(childCompiler);
if (plugin) {
plugin.apply(childCompiler);
}
}
}
for (const name in this.hooks) {

View File

@ -566,7 +566,7 @@ class WebpackOptionsApply extends OptionsApply {
for (const minimizer of options.optimization.minimizer) {
if (typeof minimizer === "function") {
minimizer.call(compiler, compiler);
} else if (minimizer !== "...") {
} else if (minimizer !== "..." && minimizer) {
minimizer.apply(compiler);
}
}

View File

@ -150,9 +150,9 @@ class RuleSetCompiler {
* @returns {CompiledRule[]} rules
*/
compileRules(path, rules, refs) {
return rules.map((rule, i) =>
this.compileRule(`${path}[${i}]`, rule, refs)
);
return rules
.filter(Boolean)
.map((rule, i) => this.compileRule(`${path}[${i}]`, rule, refs));
}
/**

View File

@ -106,9 +106,11 @@ class UseEffectRulePlugin {
*/
const useToEffectsWithoutIdent = (path, items) => {
if (Array.isArray(items)) {
return items.map((item, idx) =>
useToEffectRaw(`${path}[${idx}]`, "[[missing ident]]", item)
);
return items
.filter(Boolean)
.map((item, idx) =>
useToEffectRaw(`${path}[${idx}]`, "[[missing ident]]", item)
);
}
return [useToEffectRaw(path, "[[missing ident]]", items)];
};
@ -120,7 +122,7 @@ class UseEffectRulePlugin {
*/
const useToEffects = (path, items) => {
if (Array.isArray(items)) {
return items.map((item, idx) => {
return items.filter(Boolean).map((item, idx) => {
const subPath = `${path}[${idx}]`;
return useToEffect(subPath, subPath, item);
});

View File

@ -69,7 +69,7 @@ const createCompiler = rawOptions => {
for (const plugin of options.plugins) {
if (typeof plugin === "function") {
plugin.call(compiler, compiler);
} else {
} else if (plugin) {
plugin.apply(compiler);
}
}

View File

@ -49,7 +49,7 @@
"core-js": "^3.6.5",
"coveralls": "^3.1.0",
"cspell": "^6.31.1",
"css-loader": "^5.0.1",
"css-loader": "^6.8.1",
"date-fns": "^2.15.0",
"es5-ext": "^0.10.53",
"es6-promise-polyfill": "^1.2.0",
@ -91,10 +91,12 @@
"react": "^18.2.0",
"react-dom": "^18.2.0",
"rimraf": "^3.0.2",
"sass": "^1.62.1",
"sass-loader": "^13.3.1",
"script-loader": "^0.7.2",
"simple-git": "^3.17.0",
"strip-ansi": "^6.0.0",
"style-loader": "^2.0.0",
"style-loader": "^3.3.3",
"terser": "^5.17.0",
"toml": "^3.0.0",
"tooling": "webpack/tooling#v1.22.1",

View File

@ -1145,6 +1145,10 @@
"node-commonjs"
]
},
"Falsy": {
"description": "Falsy value.",
"enum": [false, 0, "", null]
},
"FileCacheOptions": {
"description": "Options object for persistent file-based caching.",
"type": "object",
@ -2476,6 +2480,9 @@
{
"enum": ["..."]
},
{
"$ref": "#/definitions/Falsy"
},
{
"$ref": "#/definitions/WebpackPluginInstance"
},
@ -3577,6 +3584,9 @@
"items": {
"description": "Plugin of type object or instanceof Function.",
"anyOf": [
{
"$ref": "#/definitions/Falsy"
},
{
"$ref": "#/definitions/WebpackPluginInstance"
},
@ -4288,6 +4298,9 @@
"items": {
"description": "A rule.",
"oneOf": [
{
"$ref": "#/definitions/Falsy"
},
{
"$ref": "#/definitions/RuleSetRule"
}
@ -4409,6 +4422,12 @@
},
"enum": ["..."]
},
{
"$ref": "#/definitions/Falsy",
"cli": {
"exclude": true
}
},
{
"$ref": "#/definitions/RuleSetRule"
}
@ -4423,6 +4442,9 @@
"items": {
"description": "An use item.",
"oneOf": [
{
"$ref": "#/definitions/Falsy"
},
{
"$ref": "#/definitions/RuleSetUseItem"
}
@ -4431,7 +4453,7 @@
},
{
"instanceof": "Function",
"tsType": "((data: { resource: string, realResource: string, resourceQuery: string, issuer: string, compiler: string }) => RuleSetUseItem[])"
"tsType": "((data: { resource: string, realResource: string, resourceQuery: string, issuer: string, compiler: string }) => (Falsy | RuleSetUseItem)[])"
},
{
"$ref": "#/definitions/RuleSetUseItem"
@ -4469,7 +4491,7 @@
},
{
"instanceof": "Function",
"tsType": "((data: object) => RuleSetUseItem|RuleSetUseItem[])"
"tsType": "((data: object) => RuleSetUseItem | (Falsy | RuleSetUseItem)[])"
},
{
"$ref": "#/definitions/RuleSetLoader"

View File

@ -0,0 +1 @@
export default "test";

View File

@ -0,0 +1 @@
export default "test";

View File

@ -0,0 +1 @@
export default "test";

View File

@ -0,0 +1,10 @@
import foo from "./foo.js?external";
import bar from "./bar.js";
import baz from "./baz.js?custom-use";
it("should work with falsy plugins and loaders", function() {
expect(ONE).toBe("ONE");
expect(foo.endsWith("?external")).toBe(true);
expect(bar).toBe("test");
expect(baz).toBe("test");
});

View File

@ -0,0 +1,102 @@
var DefinePlugin = require("../../../../").DefinePlugin;
const nullValue = null;
// TODO fix me
const undefinedValue = null;
const falseValue = false;
const zeroValue = 0;
const emptyStringValue = "";
class FailPlugin {
apply() {
throw new Error("FailedPlugin");
}
}
class TestChildCompilationPlugin {
constructor(output) {}
apply(compiler) {
compiler.hooks.make.tapAsync(
"TestChildCompilationFailurePlugin",
(compilation, cb) => {
const child = compilation.createChildCompiler(
"name",
compiler.outputOptions,
[
undefinedValue && new FailPlugin(),
nullValue && new FailPlugin(),
falseValue && new FailPlugin(),
zeroValue && new FailPlugin(),
emptyStringValue && new FailPlugin()
]
);
child.runAsChild(cb);
}
);
}
}
/** @type {import("../../../../").Configuration} */
module.exports = {
module: {
defaultRules: [
nullValue && {
test: /\.js$/,
loader: "unknown-loader"
},
"..."
],
rules: [
// Will failed because we don't have unknown-loader
nullValue && {
test: /\.js$/,
loader: "unknown-loader"
},
{
test: /foo\.js$/,
oneOf: [
nullValue && {
resourceQuery: /inline/,
loader: "unknown-loader"
},
{
resourceQuery: /external/,
type: "asset/resource"
}
]
},
{
test: /bar\.js$/,
use: [nullValue && "unknown-loader"]
},
{
test: /baz\.js$/,
resourceQuery: /custom-use/,
use: () => {
return [
nullValue && {
loader: "unknown-loader"
}
];
}
}
]
},
plugins: [
new DefinePlugin({
ONE: JSON.stringify("ONE")
}),
new TestChildCompilationPlugin(),
undefinedValue && new FailPlugin(),
nullValue && new FailPlugin(),
falseValue && new FailPlugin(),
zeroValue && new FailPlugin(),
emptyStringValue && new FailPlugin()
],
optimization: {
minimize: true,
minimizer: [nullValue && new FailPlugin()]
}
};

172
types.d.ts vendored
View File

@ -2378,6 +2378,10 @@ declare interface Configuration {
* Add additional plugins to the compiler.
*/
plugins?: (
| null
| false
| ""
| 0
| ((this: Compiler, compiler: Compiler) => void)
| WebpackPluginInstance
)[];
@ -7691,7 +7695,7 @@ declare interface ModuleOptions {
/**
* An array of rules applied by default for modules.
*/
defaultRules?: (RuleSetRule | "...")[];
defaultRules?: (null | false | "" | 0 | RuleSetRule | "...")[];
/**
* Enable warnings for full dynamic dependencies.
@ -7731,7 +7735,7 @@ declare interface ModuleOptions {
/**
* An array of rules applied for modules.
*/
rules?: (RuleSetRule | "...")[];
rules?: (null | false | "" | 0 | RuleSetRule | "...")[];
/**
* Emit errors instead of warnings when imported names don't exist in imported module. Deprecated: This option has moved to 'module.parser.javascript.strictExportPresence'.
@ -7791,7 +7795,7 @@ declare interface ModuleOptionsNormalized {
/**
* An array of rules applied by default for modules.
*/
defaultRules: (RuleSetRule | "...")[];
defaultRules: (null | false | "" | 0 | RuleSetRule | "...")[];
/**
* Specify options for each generator.
@ -7811,7 +7815,7 @@ declare interface ModuleOptionsNormalized {
/**
* An array of rules applied for modules.
*/
rules: (RuleSetRule | "...")[];
rules: (null | false | "" | 0 | RuleSetRule | "...")[];
/**
* Cache the resolving of module requests.
@ -8609,6 +8613,10 @@ declare interface Optimization {
* Minimizer(s) to use for minimizing the output.
*/
minimizer?: (
| null
| false
| ""
| 0
| ((this: Compiler, compiler: Compiler) => void)
| WebpackPluginInstance
| "..."
@ -10752,7 +10760,7 @@ declare interface RuleSetRule {
/**
* Only execute the first matching rule in this array.
*/
oneOf?: RuleSetRule[];
oneOf?: (null | false | "" | 0 | RuleSetRule)[];
/**
* Shortcut for use.options.
@ -10849,30 +10857,11 @@ declare interface RuleSetRule {
*/
use?:
| string
| RuleSetUseItem[]
| ((data: {
resource: string;
realResource: string;
resourceQuery: string;
issuer: string;
compiler: string;
}) => RuleSetUseItem[])
| {
/**
* Unique loader options identifier.
*/
ident?: string;
/**
* Loader name.
*/
loader?: string;
/**
* Loader options.
*/
options?: string | { [index: string]: any };
}
| ((data: object) =>
| (
| null
| string
| false
| 0
| {
/**
* Unique loader options identifier.
@ -10887,19 +10876,95 @@ declare interface RuleSetRule {
*/
options?: string | { [index: string]: any };
}
| __TypeWebpackOptions
| RuleSetUseItem[]);
| ((data: object) =>
| string
| {
/**
* Unique loader options identifier.
*/
ident?: string;
/**
* Loader name.
*/
loader?: string;
/**
* Loader options.
*/
options?: string | { [index: string]: any };
}
| __TypeWebpackOptions
| __Type_2[])
)[]
| ((data: {
resource: string;
realResource: string;
resourceQuery: string;
issuer: string;
compiler: string;
}) => __Type_2[])
| {
/**
* Unique loader options identifier.
*/
ident?: string;
/**
* Loader name.
*/
loader?: string;
/**
* Loader options.
*/
options?: string | { [index: string]: any };
}
| __TypeWebpackOptions;
}
type RuleSetUse =
| string
| RuleSetUseItem[]
| (
| null
| string
| false
| 0
| {
/**
* Unique loader options identifier.
*/
ident?: string;
/**
* Loader name.
*/
loader?: string;
/**
* Loader options.
*/
options?: string | { [index: string]: any };
}
| ((data: object) =>
| string
| {
/**
* Unique loader options identifier.
*/
ident?: string;
/**
* Loader name.
*/
loader?: string;
/**
* Loader options.
*/
options?: string | { [index: string]: any };
}
| __TypeWebpackOptions
| __Type_2[])
)[]
| ((data: {
resource: string;
realResource: string;
resourceQuery: string;
issuer: string;
compiler: string;
}) => RuleSetUseItem[])
}) => __Type_2[])
| {
/**
* Unique loader options identifier.
@ -13155,6 +13220,10 @@ declare interface WebpackOptionsNormalized {
* Add additional plugins to the compiler.
*/
plugins: (
| null
| false
| ""
| 0
| ((this: Compiler, compiler: Compiler) => void)
| WebpackPluginInstance
)[];
@ -13252,7 +13321,44 @@ type __TypeWebpackOptions = (data: object) =>
options?: string | { [index: string]: any };
}
| __TypeWebpackOptions
| RuleSetUseItem[];
| __Type_2[];
type __Type_2 =
| null
| string
| false
| 0
| {
/**
* Unique loader options identifier.
*/
ident?: string;
/**
* Loader name.
*/
loader?: string;
/**
* Loader options.
*/
options?: string | { [index: string]: any };
}
| ((data: object) =>
| string
| {
/**
* Unique loader options identifier.
*/
ident?: string;
/**
* Loader name.
*/
loader?: string;
/**
* Loader options.
*/
options?: string | { [index: string]: any };
}
| __TypeWebpackOptions
| __Type_2[]);
declare function exports(
options: Configuration,
callback?: CallbackWebpack<Stats>

View File

@ -1889,7 +1889,7 @@ character-parser@^2.2.0:
dependencies:
is-regex "^1.0.3"
chokidar@^3.5.3:
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@ -2302,21 +2302,19 @@ cspell@^6.31.1:
strip-ansi "^6.0.1"
vscode-uri "^3.0.7"
css-loader@^5.0.1:
version "5.2.7"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae"
integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==
css-loader@^6.8.1:
version "6.8.1"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88"
integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==
dependencies:
icss-utils "^5.1.0"
loader-utils "^2.0.0"
postcss "^8.2.15"
postcss "^8.4.21"
postcss-modules-extract-imports "^3.0.0"
postcss-modules-local-by-default "^4.0.0"
postcss-modules-local-by-default "^4.0.3"
postcss-modules-scope "^3.0.0"
postcss-modules-values "^4.0.0"
postcss-value-parser "^4.1.0"
schema-utils "^3.0.0"
semver "^7.3.5"
postcss-value-parser "^4.2.0"
semver "^7.3.8"
cssesc@^3.0.0:
version "3.0.0"
@ -3373,6 +3371,11 @@ image-size@~0.5.0:
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
immutable@^4.0.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be"
integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==
import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@ -4217,7 +4220,7 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
klona@^2.0.4:
klona@^2.0.4, klona@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22"
integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==
@ -5024,10 +5027,10 @@ postcss-modules-extract-imports@^3.0.0:
resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d"
integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==
postcss-modules-local-by-default@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c"
integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==
postcss-modules-local-by-default@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524"
integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==
dependencies:
icss-utils "^5.0.0"
postcss-selector-parser "^6.0.2"
@ -5055,15 +5058,15 @@ postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
postcss-value-parser@^4.1.0:
postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.2.15:
version "8.4.22"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.22.tgz#c29e6776b60ab3af602d4b513d5bd2ff9aa85dc1"
integrity sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==
postcss@^8.4.21:
version "8.4.24"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df"
integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==
dependencies:
nanoid "^3.3.6"
picocolors "^1.0.0"
@ -5533,6 +5536,23 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sass-loader@^13.3.1:
version "13.3.1"
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.1.tgz#32ee5791434b9b4dbd1adcce76fcb4cea49cc12c"
integrity sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==
dependencies:
klona "^2.0.6"
neo-async "^2.6.2"
sass@^1.62.1:
version "1.62.1"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.1.tgz#caa8d6bf098935bc92fc73fa169fb3790cacd029"
integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
sax@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
@ -5673,7 +5693,7 @@ source-list-map@^2.0.0:
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
source-map-js@^1.0.2:
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@ -5863,13 +5883,10 @@ strtok3@^7.0.0:
"@tokenizer/token" "^0.3.0"
peek-readable "^5.0.0"
style-loader@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c"
integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==
dependencies:
loader-utils "^2.0.0"
schema-utils "^3.0.0"
style-loader@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff"
integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==
supports-color@^3.1.0:
version "3.2.3"