diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 00000000..b03f4086
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+lts/krypton
diff --git a/.storybook/main.js b/.storybook/main.js
index 5a2d449a..649d43b5 100644
--- a/.storybook/main.js
+++ b/.storybook/main.js
@@ -1,5 +1,5 @@
-const sass = require("sass");
const path = require("path");
+const sass = require("sass");
const sassRenderSyncConfig = require("./../scripts/sassConfig");
const { silenceDeprecations } = require("../scripts/sassDeprecationConfig");
@@ -9,15 +9,6 @@ module.exports = {
"@storybook/addon-links",
"@storybook/addon-docs",
"@storybook/addon-a11y",
- {
- name: "@storybook/preset-scss",
- options: {
- sassLoaderOptions: {
- implementation: sass,
- sassOptions: { ...sassRenderSyncConfig, silenceDeprecations },
- },
- },
- },
"@storybook/addon-webpack5-compiler-babel",
],
framework: {
@@ -64,6 +55,16 @@ module.exports = {
},
},
webpackFinal: async (config, { configType }) => {
+ // never let the compiled package output take part in the Storybook build,
+ // stories always have to use the sources
+ // a directory import like `"./../../../../"` is resolved by the `exports` field of our
+ // own package.json and would silently pull `dist/esm/` into the preview bundle,
+ // this restriction removes it from the candidates so that the root `index.ts` is used
+ const distPath = path.resolve(__dirname, "..", "dist");
+ config.resolve.restrictions = [
+ ...(config.resolve.restrictions ?? []),
+ new RegExp(`^(?!${distPath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}[/\\\\])`),
+ ];
// `configType` has a value of 'DEVELOPMENT' or 'PRODUCTION'
if (configType === "PRODUCTION") {
// remove source maps from production storybook
@@ -72,13 +73,29 @@ module.exports = {
config.devtool = false;
}
config.module.rules = [
+ {
+ test: /\.s[ac]ss$/i,
+ use: [
+ require.resolve("style-loader"),
+ {
+ loader: require.resolve("css-loader"),
+ options: {
+ importLoaders: 1,
+ },
+ },
+ {
+ loader: require.resolve("sass-loader"),
+ options: {
+ implementation: sass,
+ sassOptions: { ...sassRenderSyncConfig, silenceDeprecations },
+ },
+ },
+ ],
+ },
{
test: /\.(png|jpg|gif|svg)(\\?.*)?$/,
include: /\.tobase64\./,
- loader: "url-loader",
- options: {
- limit: true,
- },
+ type: "asset/inline",
},
...config.module.rules.map((rule) => {
if (
@@ -92,11 +109,6 @@ module.exports = {
return rule;
}),
];
- config.resolve.alias = {
- ...config.resolve.alias,
- // Fix nasty bug with importing from this package, Storybook webpack cannot resolve it otherwise
- "@codemirror/legacy-modes": path.resolve(__dirname, "../node_modules/@codemirror/legacy-modes"),
- };
return config;
},
};
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4713135a..715decb0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- Upgrading base libraries
- Carbon, Codemirror, React-Flow
+- minimum node version (`engines.node`) is `18.19.0` now
+ - the build of the ESM distribution needs a synchronous `import.meta.resolve`, which is only available since this version
### Fixed
@@ -23,6 +25,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- BOM issue on compressed stylesheet
- first rule `selector` becomes `BOM:selector` that is valid but will never apply
- we fixed this problem by adding a dummy rule as first rule
+- ESM distribution
+ - the imports of the `@codemirror/legacy-modes` modes were written with an additional `.js` suffix, but the `exports` map of this package only provides the extension-less sub paths, so they were expanded to unresolvable paths like `mode/jinja2.js.js`
+- Storybook
+ - the `` story imported the package root directory, this way the `exports` field of our own `package.json` pulled the built `dist/esm/` output into the preview bundle instead of the sources, and the Storybook build failed as soon as `dist/` existed
+ - the webpack configuration excludes `dist/` from module resolution now, so the sources are always used even if a story references the package root
+- Added explicitly `assert` dependency
+ - the linter of `` uses `jshint`, which imports `console-browserify`, and this package requires the node core modules `assert` and `util` without declaring them; bundlers based on webpack 5 do not provide shims for node core modules anymore, so the polyfill (and `util` together with it) is part of the delivery now
### Deprecated
diff --git a/package.json b/package.json
index 07d08e35..8f3bf94c 100644
--- a/package.json
+++ b/package.json
@@ -28,7 +28,7 @@
"registry": "https://registry.npmjs.org"
},
"engines": {
- "node": ">=18.18.0"
+ "node": ">=18.19.0"
},
"style": "src/index.scss",
"main": "dist/cjs/index.js",
@@ -83,6 +83,7 @@
"@codemirror/legacy-modes": "^6.5.3",
"@mavrin/remark-typograf": "^2.2.0",
"@xyflow/react": "^12.11.5",
+ "assert": "^2.1.0",
"classnames": "^2.5.1",
"codemirror": "^6.0.2",
"color": "^5.0.3",
@@ -106,6 +107,7 @@
"remark-parse": "^11.0.0",
"reset-css": "^5.0.2",
"unified": "^11.0.5",
+ "util": "^0.12.5",
"wicg-inert": "^3.1.3"
},
"devDependencies": {
@@ -121,7 +123,6 @@
"@storybook/addon-links": "^10.5.10",
"@storybook/addon-webpack5-compiler-babel": "^4.0.1",
"@storybook/cli": "^10.5.10",
- "@storybook/preset-scss": "^1.0.3",
"@storybook/react": "^10.5.10",
"@storybook/react-webpack5": "^10.5.10",
"@testing-library/dom": "^10.4.1",
@@ -139,6 +140,7 @@
"@typescript-eslint/parser": "^8.68.0",
"babel-jest": "^30.4.1",
"chromatic": "^18.6.1",
+ "css-loader": "^7.1.4",
"eslint": "^10.9.1",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.1.1",
@@ -148,7 +150,6 @@
"jest": "^30.4.2",
"jest-environment-jsdom": "^30.4.1",
"jest-fixed-jsdom": "^0.0.11",
- "jest-pnp-resolver": "^1.2.3",
"lint-staged": "^15.5.2",
"node-sass-package-importer": "^5.3.3",
"path": "^0.12.7",
@@ -158,8 +159,9 @@
"regenerator-runtime": "^0.14.1",
"rimraf": "^6.1.3",
"sass": "^1.103.1",
- "sass-loader": "^16.0.8",
+ "sass-loader": "^17.0.0",
"storybook": "^10.5.10",
+ "style-loader": "^4.0.0",
"stylelint": "^17.14.1",
"stylelint-config-recess-order": "^7.8.0",
"stylelint-config-standard-scss": "^17.0.0",
@@ -167,7 +169,7 @@
"ts-node": "^10.9.2",
"tsc-esm-fix": "^3.1.2",
"typescript": "^5.9.3",
- "url-loader": "^4.1.1",
+ "webpack": "^5.109.2",
"yargs": "^18.1.0"
},
"peerDependencies": {
@@ -211,7 +213,6 @@
"src/**/*.{js,jsx,ts,tsx}",
"!src/**/*.d.ts"
],
- "resolver": "jest-pnp-resolver",
"setupFiles": [
"react-app-polyfill/jsdom"
],
diff --git a/scripts/compile-sass.ts b/scripts/compile-sass.ts
index e82d0b82..0b800a50 100644
--- a/scripts/compile-sass.ts
+++ b/scripts/compile-sass.ts
@@ -1,4 +1,6 @@
+import * as fs from "fs";
import tildeImporter from "node-sass-package-importer";
+import * as path from "path";
import * as sass from "sass";
import yargs from "yargs";
@@ -7,12 +9,52 @@ import { silenceDeprecations } from "./sassDeprecationConfig";
const args = yargs(process.argv.slice(2)).argv as any;
+/**
+ * Returns the directory a package was installed into, or `undefined` if it cannot be found.
+ * The `node_modules` chain of the resolver is walked directly instead of resolving the
+ * `package.json` of the package, because a package is free to hide that file behind its
+ * `exports` map, which would let `require.resolve()` fail with `ERR_PACKAGE_PATH_NOT_EXPORTED`.
+ * Symbolic links are resolved, so that the real location is used, e.g. the store directory of pnpm.
+ */
+const packageDirectory = (packageName: string) => {
+ for (const searchPath of require.resolve.paths(packageName) ?? []) {
+ const candidate = path.join(searchPath, ...packageName.split("/"));
+ if (fs.existsSync(path.join(candidate, "package.json"))) return fs.realpathSync(candidate);
+ }
+ return undefined;
+};
+
+/**
+ * Returns the dependency root a package was installed into, i.e. the `node_modules` directory
+ * holding it. The number of levels to climb is taken from the package name, this way scoped
+ * (`@scope/name`) and plain (`name`) packages are both handled correctly.
+ */
+const dependencyRoot = (packageName: string) => {
+ const directory = packageDirectory(packageName);
+ return directory === undefined ? undefined : path.resolve(directory, ...packageName.split("/").map(() => ".."));
+};
+
+// Imports without tilde syntax are not handled by the importer below, sass resolves them relative
+// to the importing file and via these include paths. `@blueprintjs/core` and `@carbon/react` both
+// use them internally to reach their sibling packages, e.g. `@blueprintjs/colors` or
+// `@carbon/styles`. Their dependency roots are looked up separately because the packages do not
+// need to share one, e.g. if only one of them is hoisted into a parent workspace. The local
+// `node_modules` is kept as a fallback, it is also used alone if a dependency root cannot be
+// determined. All paths are absolute, so that duplicates of the same directory can be removed.
+const includePaths = [
+ ...new Set(
+ [dependencyRoot("@blueprintjs/core"), dependencyRoot("@carbon/react"), path.resolve("node_modules")].filter(
+ (includePath): includePath is string => includePath !== undefined,
+ ),
+ ),
+];
+
const styles = sass.renderSync({
importer: tildeImporter(),
...sassRenderSyncConfig,
- silenceDeprecations: silenceDeprecations as sass.DeprecationOrId[],
+ silenceDeprecations: [...silenceDeprecations, "legacy-js-api"] as sass.DeprecationOrId[],
file: "src/index.scss",
- includePaths: ["node_modules"], // Carbon does not use tilde import syntax
+ includePaths,
});
if (args.outputCss) {
diff --git a/scripts/fix-esm-dist b/scripts/fix-esm-dist
index 61006373..ef7c3043 100755
--- a/scripts/fix-esm-dist
+++ b/scripts/fix-esm-dist
@@ -1,4 +1,9 @@
+#!/bin/sh
+# abort as soon as one of the steps fails, otherwise a broken ESM output would be
+# reported as a successful build because the exit code of the last command wins
+set -e
yarn tsc-esm-fix --target='dist/esm'
+node ./scripts/fix-esm-imports.mjs dist/esm
cat >dist/esm/package.json <
+ !specifier.startsWith(".") && !specifier.startsWith("/") && !/^\w[\w+.-]*:/.test(specifier);
+
+const collectFiles = (directory) =>
+ fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
+ const entryPath = path.join(directory, entry.name);
+ if (entry.isDirectory()) return collectFiles(entryPath);
+ return entry.name.endsWith(".js") ? [entryPath] : [];
+ });
+
+const resolvesToFile = (specifier) => {
+ let resolved;
+ try {
+ resolved = import.meta.resolve(specifier);
+ } catch (error) {
+ // only a failed resolution is an expected answer, everything else (a broken resolver, a
+ // permission problem, …) has to abort the build instead of silently repairing nothing
+ if (unresolvableCodes.has(error?.code)) return false;
+ throw error;
+ }
+ return fs.existsSync(fileURLToPath(resolved));
+};
+
+const replacements = new Map();
+
+/** @returns the specifier that should be used instead, or `undefined` to keep it as it is */
+const repairedSpecifier = (specifier) => {
+ if (!replacements.has(specifier)) {
+ const withoutExtension = specifier.replace(/\.js$/, "");
+ const repairable =
+ isBareSpecifier(specifier) &&
+ specifier !== withoutExtension &&
+ !resolvesToFile(specifier) &&
+ resolvesToFile(withoutExtension);
+ replacements.set(specifier, repairable ? withoutExtension : undefined);
+ }
+ return replacements.get(specifier);
+};
+
+/** @returns the module references of the given source, the last one in the file first */
+const moduleReferences = (contents) =>
+ [...ts.preProcessFile(contents, true, true).importedFiles].sort((one, other) => other.pos - one.pos);
+
+let repaired = 0;
+
+for (const file of collectFiles(target)) {
+ const contents = fs.readFileSync(file, "utf8");
+ let fixedContents = contents;
+ // the references are replaced from the end of the file to its beginning, this way the
+ // positions of all not yet handled ones stay valid
+ for (const reference of moduleReferences(contents)) {
+ const specifier = reference.fileName;
+ const replacement = repairedSpecifier(specifier);
+ if (replacement === undefined) continue;
+ // `pos` addresses the quote opening the reference, its text starts behind it
+ const start = reference.pos + 1;
+ if (fixedContents.slice(start, start + specifier.length) !== specifier) {
+ throw new Error(
+ `fix-esm-imports: cannot repair "${specifier}" in ${file}, the source at position ${start} does not match the parsed reference`,
+ );
+ }
+ fixedContents = fixedContents.slice(0, start) + replacement + fixedContents.slice(start + specifier.length);
+ }
+ if (fixedContents !== contents) {
+ fs.writeFileSync(file, fixedContents);
+ repaired += 1;
+ }
+}
+
+for (const [specifier, replacement] of replacements) {
+ if (replacement !== undefined) {
+ console.log(`fix-esm-imports: "${specifier}" -> "${replacement}"`);
+ }
+}
+console.log(`fix-esm-imports: repaired imports in ${repaired} file(s) of ${target}`);
diff --git a/scripts/sassDeprecationConfig.js b/scripts/sassDeprecationConfig.js
index 2a8ee5f7..a286bfc3 100644
--- a/scripts/sassDeprecationConfig.js
+++ b/scripts/sassDeprecationConfig.js
@@ -1,3 +1,3 @@
module.exports = {
- silenceDeprecations: ["import", "legacy-js-api"],
+ silenceDeprecations: ["import"],
};
diff --git a/src/components/Tabs/stories/Tab.stories.tsx b/src/components/Tabs/stories/Tab.stories.tsx
index 44ec92bd..e8b3f801 100644
--- a/src/components/Tabs/stories/Tab.stories.tsx
+++ b/src/components/Tabs/stories/Tab.stories.tsx
@@ -1,7 +1,7 @@
import React from "react";
import { Meta, StoryFn } from "@storybook/react";
-import { Tab as TabDummyForStorybook, Tabs } from "./../../../../";
+import { Tab as TabDummyForStorybook, Tabs } from "./../../../../index";
export default {
title: "Components/Tabs/Tab",
diff --git a/yarn.lock b/yarn.lock
index 11d35173..d00ef687 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3577,11 +3577,6 @@
tsconfig-paths "^4.2.0"
webpack "5"
-"@storybook/preset-scss@^1.0.3":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@storybook/preset-scss/-/preset-scss-1.0.3.tgz#8ac834545c642dada0f64f510ef08dfb882e9737"
- integrity sha512-o9Iz6wxPeNENrQa2mKlsDKynBfqU2uWaRP80HeWp4TkGgf7/x3DVF2O7yi9N0x/PI1qzzTTpxlQ90D62XmpiTw==
-
"@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0":
version "1.0.6--canary.9.0c3f3b7.0"
resolved "https://registry.yarnpkg.com/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz#7f10f3c641f32e4513a8b6ffb5036933e7059534"
@@ -4727,6 +4722,17 @@ asap@~2.0.6:
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
+assert@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd"
+ integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==
+ dependencies:
+ call-bind "^1.0.2"
+ is-nan "^1.3.2"
+ object-is "^1.1.5"
+ object.assign "^4.1.4"
+ util "^0.12.5"
+
assertion-error@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7"
@@ -4877,11 +4883,6 @@ baseline-browser-mapping@^2.10.12:
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz#47bdc13027af28d341f367a4f35a07ce872e27b4"
integrity sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==
-big.js@^5.2.2:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
- integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
-
boolbase@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
@@ -4969,6 +4970,16 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-
es-errors "^1.3.0"
function-bind "^1.1.2"
+call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7"
+ integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ es-define-property "^1.0.1"
+ get-intrinsic "^1.3.0"
+ set-function-length "^1.2.2"
+
call-bind@^1.0.7, call-bind@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c"
@@ -5508,7 +5519,7 @@ css-functions-list@^3.3.3:
resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.3.3.tgz#c4ab5008659de2e3baf3752c8fdef7662f3ffe23"
integrity sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==
-css-loader@^7.1.2:
+css-loader@^7.1.2, css-loader@^7.1.4:
version "7.1.4"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.4.tgz#8f6bf9f8fc8cbef7d2ef6e80acc6545eaefa90b1"
integrity sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==
@@ -5997,11 +6008,6 @@ emoji-regex@^9.2.2:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
-emojis-list@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
- integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
-
endent@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/endent/-/endent-2.1.0.tgz#5aaba698fb569e5e18e69e1ff7a28ff35373cd88"
@@ -6019,6 +6025,14 @@ enhanced-resolve@^5.17.1:
graceful-fs "^4.2.4"
tapable "^2.2.0"
+enhanced-resolve@^5.24.4:
+ version "5.24.5"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz#b4dad3255b7545f07ba5535189868e9f85f47573"
+ integrity sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.3.3"
+
entities@1.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26"
@@ -6145,6 +6159,11 @@ es-module-lexer@^1.2.1, es-module-lexer@^1.5.0:
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a"
integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==
+es-module-lexer@^2.1.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.3.2.tgz#311fa4f40168c1975c505477c51b23234d41ad55"
+ integrity sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==
+
es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
@@ -6786,6 +6805,11 @@ functions-have-names@^1.2.3:
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+generator-function@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2"
+ integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==
+
gensync@^1.0.0-beta.2:
version "1.0.0-beta.2"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@@ -7525,7 +7549,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@~2.0.1:
+inherits@2, inherits@^2.0.3, inherits@~2.0.1:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -7579,6 +7603,14 @@ is-alphanumerical@^2.0.0:
is-alphabetical "^2.0.0"
is-decimal "^2.0.0"
+is-arguments@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b"
+ integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==
+ dependencies:
+ call-bound "^1.0.2"
+ has-tostringtag "^1.0.2"
+
is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
version "3.0.5"
resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280"
@@ -7707,6 +7739,17 @@ is-generator-function@^1.0.10:
has-tostringtag "^1.0.2"
safe-regex-test "^1.1.0"
+is-generator-function@^1.0.7:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5"
+ integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==
+ dependencies:
+ call-bound "^1.0.4"
+ generator-function "^2.0.0"
+ get-proto "^1.0.1"
+ has-tostringtag "^1.0.2"
+ safe-regex-test "^1.1.0"
+
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
@@ -7738,6 +7781,14 @@ is-map@^2.0.3:
resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
+is-nan@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d"
+ integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+
is-number-object@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541"
@@ -7827,7 +7878,7 @@ is-symbol@^1.0.4, is-symbol@^1.1.1:
has-symbols "^1.1.0"
safe-regex-test "^1.1.0"
-is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15:
+is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed-array@^1.1.3:
version "1.1.15"
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b"
integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==
@@ -8516,7 +8567,7 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
-json5@^2.1.2, json5@^2.2.2, json5@^2.2.3:
+json5@^2.2.2, json5@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
@@ -8625,15 +8676,6 @@ loader-runner@^4.2.0:
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
-loader-utils@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
- integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==
- dependencies:
- big.js "^5.2.2"
- emojis-list "^3.0.0"
- json5 "^2.1.2"
-
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
@@ -9338,6 +9380,11 @@ mime-db@1.52.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+mime-db@^1.54.0:
+ version "1.54.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5"
+ integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
+
mime-types@^2.1.27, mime-types@^2.1.31:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
@@ -9377,6 +9424,16 @@ minimist@^1.2.6:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+minimizer-webpack-plugin@^5.6.1:
+ version "5.6.1"
+ resolved "https://registry.yarnpkg.com/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz#289922a4c96c4ed1ddb76b8a00bd8074e89a2f7f"
+ integrity sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jest-worker "^27.4.5"
+ schema-utils "^4.3.0"
+ terser "^5.31.1"
+
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
@@ -9563,6 +9620,14 @@ object-inspect@^1.13.3:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
+object-is@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07"
+ integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+
object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
@@ -10833,12 +10898,10 @@ safe-regex-test@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-sass-loader@^16.0.8:
- version "16.0.8"
- resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-16.0.8.tgz#b7eef3b7947b32e2988dd760a2f7f0d547838e6b"
- integrity sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA==
- dependencies:
- neo-async "^2.6.2"
+sass-loader@^17.0.0:
+ version "17.0.0"
+ resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-17.0.0.tgz#8f4f8864d834c1abb18f0f3d2bc653bbf29dde2a"
+ integrity sha512-0Ybm8ohBQ9LcrycVrFQp/KQBNX5a3Wda9/smS0mE/xLffzEnwvV8nykOzrbiSWNzTE3IB/jiXx8O4QmDPG2+Gw==
sass@^1.103.1:
version "1.103.1"
@@ -10870,7 +10933,7 @@ scheduler@^0.27.0:
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd"
integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==
-schema-utils@^3.0.0, schema-utils@^3.1.1:
+schema-utils@^3.1.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe"
integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==
@@ -10889,6 +10952,16 @@ schema-utils@^4.0.0, schema-utils@^4.3.0, schema-utils@^4.3.2:
ajv-formats "^2.1.1"
ajv-keywords "^5.1.0"
+schema-utils@^4.3.3:
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46"
+ integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ ajv "^8.9.0"
+ ajv-formats "^2.1.1"
+ ajv-keywords "^5.1.0"
+
semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
@@ -11576,6 +11649,11 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+tapable@^2.3.0, tapable@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160"
+ integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==
+
temp@^0.8.4:
version "0.8.4"
resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2"
@@ -12089,15 +12167,6 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-url-loader@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2"
- integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==
- dependencies:
- loader-utils "^2.0.0"
- mime-types "^2.1.27"
- schema-utils "^3.0.0"
-
use-sync-external-store@^1.2.0, use-sync-external-store@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d"
@@ -12120,6 +12189,17 @@ util@^0.10.3:
dependencies:
inherits "2.0.3"
+util@^0.12.5:
+ version "0.12.5"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc"
+ integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==
+ dependencies:
+ inherits "^2.0.3"
+ is-arguments "^1.0.4"
+ is-generator-function "^1.0.7"
+ is-typed-array "^1.1.3"
+ which-typed-array "^1.1.2"
+
utila@~0.4:
version "0.4.0"
resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
@@ -12197,6 +12277,13 @@ watchpack@^2.4.1:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
+watchpack@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.2.tgz#e12e82d84674266fc1c6dbfe38891b92ff0522ec"
+ integrity sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==
+ dependencies:
+ graceful-fs "^4.1.2"
+
web-namespaces@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692"
@@ -12232,6 +12319,11 @@ webpack-sources@^3.2.3:
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+webpack-sources@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a"
+ integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==
+
webpack-virtual-modules@^0.6.0, webpack-virtual-modules@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8"
@@ -12267,6 +12359,32 @@ webpack@5:
watchpack "^2.4.1"
webpack-sources "^3.2.3"
+webpack@^5.109.2:
+ version "5.109.2"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.109.2.tgz#b58dc289561c3282db35c210a99379a836a4c28d"
+ integrity sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==
+ dependencies:
+ "@types/estree" "^1.0.8"
+ "@types/json-schema" "^7.0.15"
+ "@webassemblyjs/ast" "^1.14.1"
+ "@webassemblyjs/wasm-edit" "^1.14.1"
+ "@webassemblyjs/wasm-parser" "^1.14.1"
+ acorn "^8.16.0"
+ browserslist "^4.28.1"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.24.4"
+ es-module-lexer "^2.1.0"
+ eslint-scope "5.1.1"
+ events "^3.2.0"
+ graceful-fs "^4.2.11"
+ mime-db "^1.54.0"
+ minimizer-webpack-plugin "^5.6.1"
+ neo-async "^2.6.2"
+ schema-utils "^4.3.3"
+ tapable "^2.3.0"
+ watchpack "^2.5.2"
+ webpack-sources "^3.5.1"
+
whatwg-encoding@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
@@ -12350,6 +12468,19 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.18:
gopd "^1.2.0"
has-tostringtag "^1.0.2"
+which-typed-array@^1.1.2:
+ version "1.1.22"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.22.tgz#8f3cc78aefb40b437346dd40a1dbfa5d1da43fe9"
+ integrity sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.9"
+ call-bound "^1.0.4"
+ for-each "^0.3.5"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-tostringtag "^1.0.2"
+
which@^1.2.14, which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"