diff --git a/.github/workflows/checks.yaml b/.github/workflows/checks.yaml index 2171ae1..6acd045 100644 --- a/.github/workflows/checks.yaml +++ b/.github/workflows/checks.yaml @@ -67,7 +67,7 @@ jobs: sparse-checkout: | .git/** sparse-checkout-cone-mode: false - + - name: Workaround actions/checkout#1475 run: git config core.sparseCheckout false shell: bash @@ -89,7 +89,7 @@ jobs: working-directory: ./test/automation - name: Upload results for shard - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 if: ${{ !cancelled() }} with: name: blob-report-${{ matrix.type }}-${{ runner.os }} @@ -117,7 +117,7 @@ jobs: uses: ./.github/actions/setup-node - name: Download blob reports from GitHub Actions Artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: path: all-blob-reports pattern: blob-report-* @@ -127,7 +127,7 @@ jobs: run: npx playwright merge-reports --reporter=html ./all-blob-reports - name: Upload HTML report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: html-report--attempt-${{ github.run_attempt }} path: playwright-report diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ef7b596..227c71a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -77,7 +77,7 @@ jobs: - name: Upload updated package.json to artifact if: steps.pre-release-version.outcome == 'success' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: ${{ format('{0}-{1}', env.PACKAGE_ARTIFACT, matrix.package.shortName) }} path: | @@ -96,7 +96,7 @@ jobs: - name: Upload to publish matrix if: steps.artifact-json.outcome == 'success' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: ${{ format('{0}-{1}', env.UPDATED_MATRIX_ARTIFACT, matrix.package.shortName) }} path: | @@ -111,7 +111,7 @@ jobs: matrix: ${{ steps.updatedPackages.outputs.packageArray }} name: πŸ‘¨β€πŸ³ Prepare Publishing Matrix steps: - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: pattern: ${{ env.UPDATED_MATRIX_ARTIFACT }}-* merge-multiple: true @@ -151,7 +151,7 @@ jobs: .github/** sparse-checkout-cone-mode: false - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: pattern: ${{ env.PACKAGE_ARTIFACT }}-* merge-multiple: true @@ -175,7 +175,7 @@ jobs: shell: bash - name: Upload (potentially reified) package.jsons to artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: ${{ env.PACKAGE_ARTIFACT }} path: ${{ steps.createPathArray.outputs.pathArray }} @@ -204,7 +204,7 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: ${{ env.PACKAGE_ARTIFACT }} diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3b8b933..235e5e2 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -14,6 +14,13 @@ N.B. See changelogs for individual packages, where most change will occur: This log covers the [monorepo](https://en.wikipedia.org/wiki/Monorepo). +## [0.13.1] - 2025-11-14 + +### Changed + +- Moved to v5 of [`upload-artifact`](https://github.com/actions/upload-artifact) and [`download-artifact`](https://github.com/actions/download-artifact) actions +- updated `eslint` to 9.38.0 + ## [0.13.0] - 2025-10-21 ### Changed diff --git a/examples/express/README.md b/examples/express/README.md index ac9e6f6..b90634f 100644 --- a/examples/express/README.md +++ b/examples/express/README.md @@ -9,3 +9,13 @@ Some example applications based on an [express](https://expressjs.com/) router 2. [config](./src/routes/config/README.md) This example shows the use of the [`react-pointcuts`](../../packages/react-pointcuts/docs/README.md), [`features`](../../packages/features/docs/README.md), [`ssr`](../../packages/ssr/docs/README.md) and [`webpack`](../../packages/webpack/docs/README.md) packages. + +3. [parallel-folder-convention](./src/routes/parallel-folder-convention/README.md) + + This example shows the use of the [`react-pointcuts`](../../packages/react-pointcuts/docs/README.md), [`features`](../../packages/features/docs/README.md), [`ssr`](../../packages/ssr/docs/README.md) and [`webpack`](../../packages/webpack/docs/README.md) packages. + + It has a bespoke filesystem convention, with parallel directory hierarchies containing arbitrary replacements and patches of various types of module, including: + - constants + - css + - react components + - [redux slices](https://redux.js.org/tutorials/essentials/part-2-app-structure#redux-slices) \ No newline at end of file diff --git a/examples/express/docs/CHANGELOG.md b/examples/express/docs/CHANGELOG.md index 27f151f..1937dc2 100644 --- a/examples/express/docs/CHANGELOG.md +++ b/examples/express/docs/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.4.0] - 2025-10-21 + +### Changed + +- added "parallel folder convention" example + +### Fixed + +- went ltd cmdr data on the contraction "I'm", converting to "I am" since the "large" example inexplicably no longer text-matched (space before apostrophe) + ## [0.3.1] - 2025-10-21 ### Fixed diff --git a/examples/express/eslint.config.mjs b/examples/express/eslint.config.mjs index 27253ea..28aacd6 100644 --- a/examples/express/eslint.config.mjs +++ b/examples/express/eslint.config.mjs @@ -1,15 +1,43 @@ import examplesConfig from "../eslint.config.mjs"; import asosConfigReact from "../../peripheral/eslint-config-asosconfig/react.js"; import asosConfigServer from "../../peripheral/eslint-config-asosconfig/server.js"; +import parser from "@typescript-eslint/parser"; +import globals from "globals"; export default [ ...[...asosConfigReact, ...asosConfigServer].map((config) => ({ - files: ["**/*.js"], + files: ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"], ...config, settings: { + "import/resolver": { + typescript: { + alwaysTryTypes: true, + project: "./src/routes/parallel-folder-convention/tsconfig.json" + } + }, react: { version: "detect" } + }, + rules: { + ...config.rules, + "react/prop-types": "off", + "prettier/prettier": [ + "error", + { + trailingComma: "none", + endOfLine: "auto" + } + ] + }, + languageOptions: { + ...config.languageOptions, + parser, + globals: { + CLIENT: "readonly", + ...globals.browser, + ...globals.node + } } })), ...examplesConfig, diff --git a/examples/express/package.json b/examples/express/package.json index cbcb37c..0bf68b1 100644 --- a/examples/express/package.json +++ b/examples/express/package.json @@ -1,6 +1,6 @@ { "name": "web-toggle-point-express-example", - "version": "0.3.1", + "version": "0.4.0", "type": "module", "engines": { "node": ">=20.6.0" @@ -16,32 +16,38 @@ "prelint": "npm run build-dependencies", "lint": "npm run lint:code && npm run lint:docs", "lint:fix": "npm run lint:code -- --fix && npm run lint:docs -- --fix", - "lint:code": "eslint src --flag unstable_config_lookup_from_file", - "lint:docs": "eslint *.md --flag unstable_config_lookup_from_file" + "lint:code": "eslint src --flag v10_config_lookup_from_file", + "lint:docs": "eslint *.md --flag v10_config_lookup_from_file" }, "dependencies": { - "@asos/web-toggle-point-react-pointcuts": "file:../../packages/react-pointcuts", "@asos/web-toggle-point-features": "file:../../packages/features", + "@asos/web-toggle-point-react-pointcuts": "file:../../packages/react-pointcuts", "@asos/web-toggle-point-ssr": "file:../../packages/ssr", "@asos/web-toggle-point-webpack": "file:../../packages/webpack", + "@reduxjs/toolkit": "^2.8.2", "cross-env": "^7.0.3", "express": "^4.17.1", "http-status-codes": "^2.3.0", "react": ">=17", - "react-dom": ">=17" + "react-dom": ">=17", + "react-redux": "^9.2.0", + "valtio": "^2.1.5" }, "devDependencies": { "babel-loader": "^9.2.1", "css-loader": "^7.1.2", + "enhanced-tsconfig-paths-webpack-plugin": "^0.2.3", "mini-css-extract-plugin": "^2.9.2", "path-exists-cli": "^2.0.0", "prop-types": "^15.7.2", + "source-map-loader": "^5.0.0", "style-loader": "^4.0.0", + "ts-loader": "^9.5.2", "webpack": "^5.38.1", "webpack-cli": "^4.7.2", "webpack-node-externals": "^3.0.0" }, "peerDependencies": { - "@playwright/test": "^1.49.0" + "@playwright/test": "^1.56.0" } } diff --git a/examples/express/src/index.js b/examples/express/src/index.js index 11fa87e..1594241 100644 --- a/examples/express/src/index.js +++ b/examples/express/src/index.js @@ -1,12 +1,14 @@ import express from "express"; import animalsRouter from "./routes/animals/router.js"; import configRouter from "./routes/config/router.js"; +import parallelFolderConventionRouter from "./routes/parallel-folder-convention/router.tsx"; const app = express(); const PORT = process.env.PORT; app.use("/animals", animalsRouter); app.use("/config", configRouter); +app.use("/parallel-folder-convention", parallelFolderConventionRouter); app.get("/", (_, response) => { response.send(` @@ -39,6 +41,7 @@ app.get("/", (_, response) => { `); diff --git a/examples/express/src/routes/config/Component.jsx b/examples/express/src/routes/config/Component.jsx index 982eeed..4daf9e2 100644 --- a/examples/express/src/routes/config/Component.jsx +++ b/examples/express/src/routes/config/Component.jsx @@ -2,7 +2,7 @@ const Component = () => (
- I'm Medium + I am Medium
); diff --git a/examples/express/src/routes/config/__variants__/div-style/Large/Component.jsx b/examples/express/src/routes/config/__variants__/div-style/Large/Component.jsx index 348e1ae..dcb4ebb 100644 --- a/examples/express/src/routes/config/__variants__/div-style/Large/Component.jsx +++ b/examples/express/src/routes/config/__variants__/div-style/Large/Component.jsx @@ -8,7 +8,7 @@ const Component = ({ backgroundColor }) => ( backgroundColor }} > - I'm Large + I am Large ); diff --git a/examples/express/src/routes/config/__variants__/div-style/Small/Component.jsx b/examples/express/src/routes/config/__variants__/div-style/Small/Component.jsx index 7921e50..c6cf9c0 100644 --- a/examples/express/src/routes/config/__variants__/div-style/Small/Component.jsx +++ b/examples/express/src/routes/config/__variants__/div-style/Small/Component.jsx @@ -8,7 +8,7 @@ const Component = ({ backgroundColor }) => ( backgroundColor }} > - I'm Small + I am Small ); diff --git a/examples/express/src/routes/config/playwright.spec.js b/examples/express/src/routes/config/playwright.spec.js index 85f4483..edb4a71 100644 --- a/examples/express/src/routes/config/playwright.spec.js +++ b/examples/express/src/routes/config/playwright.spec.js @@ -14,7 +14,7 @@ test.describe("config endpoint", () => { }); test("it shows a varied experience", async ({ page }) => { - await expect(page.getByText(`I'm ${size}`)).toBeInViewport(); + await expect(page.getByText(`I am ${size}`)).toBeVisible(); }); scenarios @@ -25,7 +25,7 @@ test.describe("config endpoint", () => { page }) => { await page.getByRole("button", { name: otherSize }).click(); - await expect(page.getByText(`I'm ${otherSize}`)).toBeInViewport(); + await expect(page.getByText(`I am ${otherSize}`)).toBeVisible(); }); }); }); diff --git a/examples/express/src/routes/config/router.js b/examples/express/src/routes/config/router.js index d12d087..f4b2d8d 100644 --- a/examples/express/src/routes/config/router.js +++ b/examples/express/src/routes/config/router.js @@ -13,7 +13,7 @@ router.get("/*", (req, res) => { + + + + + ); +} diff --git a/examples/express/src/routes/parallel-folder-convention/README.md b/examples/express/src/routes/parallel-folder-convention/README.md new file mode 100644 index 0000000..a95614c --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/README.md @@ -0,0 +1,143 @@ +# Express "parallel folder convention" example + +This example shows the use of the [`react-pointcuts`](../../../../../packages/react-pointcuts/docs/README.md), [`features`](../../../../../packages/features/docs/README.md), [`ssr`](../../../../../packages/ssr/docs/README.md) and [`webpack`](../../../../../packages/webpack/docs/README.md) packages, as part of an [express](https://expressjs.com/) application. + +An inbound header named "feature" can take the following values: + +- baseline (or omitted) +- feature1 +- feature2 +- feature3 +- feature4 +- feature5 + +...which is used server side (via a ["node request scoped features store"](../../../../../packages/features/docs/README.md#noderequestscopedfeaturesstorefactory)) to generate appropriate server-rendered content. + +The chosen feature state is serialized to the browser using the `ssr` package, and loaded into a ["global features store"](../../../../../packages/features/docs/README.md#globalfeaturesstorefactory), using [`valtio`](https://github.com/pmndrs/valtio) browser-side, for reactivity. + +To demonstrate the reactivity, a drop-down allows changing of the selected feature state. + +## Filesystem structure + +The base / control folder structure is thus: + +```bash +β”œβ”€β”€ components +β”‚ β”œβ”€β”€ Animal +β”‚ β”‚ └── index.tsx +β”‚ β”œβ”€β”€ BottomBox +β”‚ β”‚ β”œβ”€β”€ index.tsx +β”‚ β”‚ └── useAnimals.ts +β”‚ └── TopBox +β”‚ β”œβ”€β”€ TopBoxChild +β”‚ β”‚ β”œβ”€β”€ TopBoxButton +β”‚ β”‚ β”‚ β”œβ”€β”€ index.module.css +β”‚ β”‚ β”‚ β”œβ”€β”€ index.tsx +β”‚ β”‚ β”‚ └── useAddAnimal.ts +β”‚ β”‚ └── index.tsx +β”‚ └── index.tsx +β”œβ”€β”€ constants +β”‚ └── index.ts +└── state + β”œβ”€β”€ modules + β”‚ β”œβ”€β”€ animals + β”‚ β”‚ └── slice.ts + β”‚ └── index.ts + └── store.ts +``` + +## Variations + +The features comprise the following: + +### _baseline_ + +The base experience. Clicking the dog dispatches a redux action adding a dog to the bottom box. + +### _feature1_ + +Varied react components (`TopBox` & `BottomBox`), at various depths in the folder structure. A varied constant for the animal emoji (`constants/index.ts`) and varied css (background colour of the button) (`TopBoxButton/index.module.css`). + +```bash +β”œβ”€β”€ components +β”‚ β”œβ”€β”€ BottomBox +β”‚ β”‚ └── index.tsx +β”‚ └── TopBox +β”‚ β”œβ”€β”€ TopBoxChild +β”‚ β”‚ └── TopBoxButton +β”‚ β”‚ └── index.module.css +β”‚ └── index.tsx +└── constants + └── index.ts +``` + +### _feature2_ + +Varied constant (`constants/index.ts`), react component (`TopBoxChild`) and redux slice (`slice.ts`) connecting an additional action creator (`useFreeAnimal.ts`) to "free" added animals (clears the state collection). Has an alternate "initial state" containing two hamsters, activated during server rendering by a `feature` header containing `feature2`. + +```bash +β”œβ”€β”€ components +β”‚ └── TopBox +β”‚ └── TopBoxChild +β”‚ β”œβ”€β”€ index.tsx +β”‚ └── useFreeAnimals.ts +└── constants + └── index.ts +``` + +### _feature3_ + +Varied constant (`constants/index.ts`) & redux slice (`slice.ts`) with modified reducer action that multiplies rabbits, when added. + +```bash +β”œβ”€β”€ constants +β”‚ └── index.ts +└── state + └── modules + └── animals + └── slice.ts +``` + +### _feature4_ + +Varied constant (`constants/index.ts`) & redux slice (`slice.ts`) with replaced redux selector that carcinises previously added animals. + +```bash +β”œβ”€β”€ constants +β”‚ └── index.ts +└── state + └── modules + └── animals + └── slice.ts +``` + +### _feature5_ + +Varied component (`TopBox`) & redux store (`modules/index.ts`) that introduces a new "space" slice, with it's own state containing spacey stuff. + +```bash +β”œβ”€β”€ components +β”‚ └── TopBox +β”‚ β”œβ”€β”€ index.tsx +β”‚ β”œβ”€β”€ styles.module.css +β”‚ └── useSpaceStuff.ts +└── state + └── modules + β”œβ”€β”€ space + β”‚ └── slice.ts + └── index.ts +``` + +## Explanation + +The webpack plugin is configured with a toggle handler that maps variants to controls based on a parallel root folder. This allows for any file to be replaced at any depth. The example shows both complete replacements, and augmentations (importing of the base, then modifying). + +To vary react components, the toggle point from the `react-pointcuts` package is used. + +To vary CSS files, constants, and [`redux` "slices"](https://redux.js.org/tutorials/essentials/part-2-app-structure#redux-slices), a toggle point is used that utilises an [object proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy), to intercept property access. Despite objects not being innately reactive, as long as they are accessed from something that does update with change of state (i.e. react components), their properties will also update based on the new feature. + +To vary `redux` reducer map, a toggle point that wraps the factory method (`getReducerMap`) is used. + +To ensure that the redux store is reactive to feature state, a `StateProvider` react component is used to host the [react-redux provider](https://react-redux.js.org/api/provider), that subscribes to the valtio state, and calls [replaceReducer](https://redux.js.org/usage/code-splitting#using-replacereducer) from the [`@reduxjs/toolkit`](https://github.com/reduxjs/redux-toolkit) whenever the feature state changes. This ensures a new redux store (but retaining current state) is made available to the react components. Care should be taken to ensure the existing state is compatible with any updated selectors etc. + +N.B. It is assumed that feature state will not change during a request cycle on the server, so `valtio` is only plumbed in to the client-side feature store, via conditional compilation using [Webpack's `DefinePlugin`](https://webpack.js.org/plugins/define-plugin/). \ No newline at end of file diff --git a/examples/express/src/routes/parallel-folder-convention/StateProvider.tsx b/examples/express/src/routes/parallel-folder-convention/StateProvider.tsx new file mode 100644 index 0000000..977db5d --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/StateProvider.tsx @@ -0,0 +1,20 @@ +import { Provider } from "react-redux"; +import { combineReducers } from "@reduxjs/toolkit"; +import createStore from "@/state/store"; +import { getFeatures } from "./toggle-plumbing/featuresStore"; +import getReducerMap from "@/state/modules"; +import { subscribe } from "valtio"; + +const StateProvider = ({ children }) => { + const store = createStore(); + + if (CLIENT) { + subscribe(getFeatures(), () => { + store.replaceReducer(combineReducers(getReducerMap())); + }); + } + + return {children}; +}; + +export default StateProvider; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/components/BottomBox/index.tsx b/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/components/BottomBox/index.tsx new file mode 100644 index 0000000..8a13b34 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/components/BottomBox/index.tsx @@ -0,0 +1,7 @@ +import type { JSX } from "react"; +import Variant2 from "@/component-library/variant2"; +import BottomBoxBase from "@/components/BottomBox"; + +const BottomBox = (): JSX.Element => BottomBoxBase({ BoxControl: Variant2 }); + +export default BottomBox; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/components/TopBox/TopBoxChild/TopBoxButton/index.module.css b/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/components/TopBox/TopBoxChild/TopBoxButton/index.module.css new file mode 100644 index 0000000..d12939b --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/components/TopBox/TopBoxChild/TopBoxButton/index.module.css @@ -0,0 +1,4 @@ +.button { + composes: button from "../../../../../../components/TopBox/TopBoxChild/TopBoxButton/index.module.css"; + background-color: wheat; +} \ No newline at end of file diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/components/TopBox/index.tsx b/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/components/TopBox/index.tsx new file mode 100644 index 0000000..7f4c291 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/components/TopBox/index.tsx @@ -0,0 +1,11 @@ +import type { JSX } from "react"; +import Variant1 from "@/component-library/variant1"; +import TopBoxChild from "@/components/TopBox/TopBoxChild"; + +const TopBox = (): JSX.Element => ( + + + +); + +export default TopBox; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/constants/index.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/constants/index.ts new file mode 100644 index 0000000..20dcc7c --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature1/constants/index.ts @@ -0,0 +1 @@ +export default { ANIMAL: "🐱" as "🐢" | "🐱" }; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/components/TopBox/TopBoxChild/index.tsx b/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/components/TopBox/TopBoxChild/index.tsx new file mode 100644 index 0000000..dd3fc6e --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/components/TopBox/TopBoxChild/index.tsx @@ -0,0 +1,17 @@ +import type { JSX } from "react"; +import Control2 from "@/component-library/control2"; +import useFreeAnimals from "./useFreeAnimals"; +import TopBoxButton from "@/components/TopBox/TopBoxChild/TopBoxButton"; +import styles from "@/components/TopBox/TopBoxChild/TopBoxButton/index.module.css"; +import constants from "../../../constants/index"; + +const TopBoxChild = (): JSX.Element => ( + + + + +); + +export default TopBoxChild; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/components/TopBox/TopBoxChild/useFreeAnimals.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/components/TopBox/TopBoxChild/useFreeAnimals.ts new file mode 100644 index 0000000..4d4b781 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/components/TopBox/TopBoxChild/useFreeAnimals.ts @@ -0,0 +1,15 @@ +import slice from "@/state/modules/animals/slice"; +import useAppDispatch from "@/state/useAppDispatch"; +import type { UnknownAction } from "@reduxjs/toolkit"; + +const useFreeAnimals = () => { + const dispatch = useAppDispatch(); + return () => { + const action = ( + slice.actions as typeof slice.actions & { freedom: () => UnknownAction } + ).freedom(); + dispatch(action); + }; +}; + +export default useFreeAnimals; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/constants/index.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/constants/index.ts new file mode 100644 index 0000000..0744493 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/constants/index.ts @@ -0,0 +1 @@ +export default { ANIMAL: "🐹", FREEDOM: "⛓️‍πŸ’₯" }; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/state/modules/animals/slice.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/state/modules/animals/slice.ts new file mode 100644 index 0000000..5f92a8b --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature2/state/modules/animals/slice.ts @@ -0,0 +1,17 @@ +import originalSlice from "@/state/modules/animals/slice"; +import { createSlice } from "@reduxjs/toolkit"; +import constant from "../../../constants"; + +const animalsSlice = createSlice({ + initialState: [constant.ANIMAL, constant.ANIMAL], + name: originalSlice.name, + reducers: { + ...originalSlice.caseReducers, + freedom: () => { + return []; + } + }, + selectors: originalSlice.getSelectors() +}); + +export default animalsSlice; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature3/constants/index.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature3/constants/index.ts new file mode 100644 index 0000000..60c9e64 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature3/constants/index.ts @@ -0,0 +1 @@ +export default { ANIMAL: "🐰" as "🐢" | "🐱" | "🐰" }; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature3/state/modules/animals/slice.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature3/state/modules/animals/slice.ts new file mode 100644 index 0000000..573c5dd --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature3/state/modules/animals/slice.ts @@ -0,0 +1,21 @@ +import originalSlice from "@/state/modules/animals/slice"; +import { createSlice } from "@reduxjs/toolkit"; + +const animalsSlice = createSlice({ + initialState: originalSlice.getInitialState(), + name: originalSlice.name, + reducers: { + add(state, action) { + const count = state.filter((animal) => animal === action.payload).length; + for (let i = 0; i < (count || 1); i++) { + originalSlice.reducer(state, { + ...action, + payload: action.payload + }); + } + } + }, + selectors: originalSlice.getSelectors() +}); + +export default animalsSlice; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature4/constants/index.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature4/constants/index.ts new file mode 100644 index 0000000..67fb4a0 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature4/constants/index.ts @@ -0,0 +1 @@ +export default { ANIMAL: "πŸ¦€" }; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature4/state/modules/animals/slice.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature4/state/modules/animals/slice.ts new file mode 100644 index 0000000..810fa7e --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature4/state/modules/animals/slice.ts @@ -0,0 +1,16 @@ +import { createSelector } from "@reduxjs/toolkit"; +import originalSlice from "@/state/modules/animals/slice"; +import constants from "@/constants/index"; + +const getAllAnimalsAsCrabs = createSelector( + [originalSlice.selectors.getAnimals], + (animals) => Array(animals.length).fill(constants.ANIMAL) +); + +export default { + ...originalSlice, + selectors: { + ...originalSlice.selectors, + getAnimals: getAllAnimalsAsCrabs + } +}; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/components/TopBox/index.tsx b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/components/TopBox/index.tsx new file mode 100644 index 0000000..ffc9777 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/components/TopBox/index.tsx @@ -0,0 +1,19 @@ +import type { JSX } from "react"; +import Variant2 from "@/component-library/variant2"; +import useSpaceStuff from "./useSpaceStuff"; +import styles from "./styles.module.css"; + +const BottomBox = (): JSX.Element => { + const planets = useSpaceStuff() as string[]; + return ( + +
+ {planets.map((planet) => ( + {planet} + ))} +
+
+ ); +}; + +export default BottomBox; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/components/TopBox/styles.module.css b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/components/TopBox/styles.module.css new file mode 100644 index 0000000..4e17879 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/components/TopBox/styles.module.css @@ -0,0 +1,114 @@ +.space { + padding: 1em; + margin-top: 0.3em; + font-size: xxx-large; + position: relative; + display: inline-flex; + gap: 0.25em; + width: 185px; + height: 170px; + justify-content: center; + align-items: center; + border-radius: 1rem; + overflow: hidden; + + background: radial-gradient( + ellipse at center, + rgba(0, 0, 0, 1) 0%, + rgba(0, 0, 0, 0.85) 45%, + rgba(0, 0, 0, 0.5) 70%, + rgba(0, 0, 0, 0) 100% + ); +} + +.space::after { + content: ""; + position: absolute; + inset: -25%; + pointer-events: none; + + background-image: radial-gradient( + rgba(255, 255, 255, 0.9) 1px, + transparent 1.2px + ), + radial-gradient(rgba(255, 255, 255, 0.6) 1px, transparent 1.4px); + background-size: + 120px 120px, + 180px 180px; + background-position: + 0 0, + 60px 90px; + + animation: + star-drift 90s linear infinite, + twinkle 4s ease-in-out infinite alternate; + opacity: 0.8; +} + +.space > * { + position: relative; + display: inline-block; + will-change: transform; + animation: float-ellipse 5s linear infinite; +} + +.space > *:nth-child(3n + 1) { + animation-delay: 0s; +} +.space > *:nth-child(3n + 2) { + animation-delay: -1.67s; +} +.space > *:nth-child(3n + 3) { + animation-delay: -3.33s; +} + +@media (prefers-reduced-motion: reduce) { + .space > * { + animation: none; + } + .space::after { + animation: none; + } +} +@keyframes float-ellipse { + 0% { + transform: translate(0.48em, 0em); + } + 25% { + transform: translate(0em, 0.32em); + } + 50% { + transform: translate(-0.48em, 0em); + } + 75% { + transform: translate(0em, -0.32em); + } + 100% { + transform: translate(0.48em, 0em); + } +} + +@keyframes star-drift { + 0% { + background-position: + 0px 0px, + 60px 90px; + } + 100% { + background-position: + -40px -30px, + 20px 50px; + } +} + +@keyframes twinkle { + 0% { + opacity: 0.6; + } + 50% { + opacity: 0.9; + } + 100% { + opacity: 0.5; + } +} diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/components/TopBox/useSpaceStuff.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/components/TopBox/useSpaceStuff.ts new file mode 100644 index 0000000..c1ac5fa --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/components/TopBox/useSpaceStuff.ts @@ -0,0 +1,7 @@ +import useAppSelector from "@/state/useAppSelector"; +import slice from "../../state/modules/space/slice"; + +const useSpaceStuff = () => + useAppSelector(slice.selectors.getSpaceStuff as any); + +export default useSpaceStuff; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/state/modules/index.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/state/modules/index.ts new file mode 100644 index 0000000..95e84db --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/state/modules/index.ts @@ -0,0 +1,9 @@ +import animalsSlice from "@/state/modules/animals/slice"; +import spaceSlice from "./space/slice"; + +const getReducerMap = () => ({ + animals: animalsSlice.reducer, + space: spaceSlice.reducer +}); + +export default getReducerMap; diff --git a/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/state/modules/space/slice.ts b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/state/modules/space/slice.ts new file mode 100644 index 0000000..f98dc5d --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/__variants__/feature5/state/modules/space/slice.ts @@ -0,0 +1,16 @@ +import { createSlice } from "@reduxjs/toolkit"; + +const spaceSlice = createSlice({ + name: "space", + initialState: ["🌎", "πŸͺ", "β˜„οΈ", "πŸ›Έ"], + reducers: { + add(state, action) { + state.push(action.payload); + } + }, + selectors: { + getSpaceStuff: (state) => state + } +}); + +export default spaceSlice; diff --git a/examples/express/src/routes/parallel-folder-convention/client.js b/examples/express/src/routes/parallel-folder-convention/client.js new file mode 100644 index 0000000..1d33c70 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/client.js @@ -0,0 +1,4 @@ +import { hydrateRoot } from "react-dom/client"; +import App from "./App.tsx"; + +hydrateRoot(document.body.firstChild, ); diff --git a/examples/express/src/routes/parallel-folder-convention/component-library/AnimalPen/index.module.css b/examples/express/src/routes/parallel-folder-convention/component-library/AnimalPen/index.module.css new file mode 100644 index 0000000..49e6a57 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/component-library/AnimalPen/index.module.css @@ -0,0 +1,11 @@ +.animalPen { + padding: 1em; + margin: 1em; + border-radius: 1em; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + max-width: 8em; + border: 1px dashed black; + background: lightgreen; + overflow: auto; + max-height: 40vh; +} diff --git a/examples/express/src/routes/parallel-folder-convention/component-library/AnimalPen/index.tsx b/examples/express/src/routes/parallel-folder-convention/component-library/AnimalPen/index.tsx new file mode 100644 index 0000000..e83155a --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/component-library/AnimalPen/index.tsx @@ -0,0 +1,9 @@ +import styles from "./index.module.css"; + +const AnimalPen = ({ animals }) => { + return animals.length ? ( +
{animals}
+ ) : null; +}; + +export default AnimalPen; diff --git a/examples/express/src/routes/parallel-folder-convention/component-library/control1.tsx b/examples/express/src/routes/parallel-folder-convention/component-library/control1.tsx new file mode 100644 index 0000000..9e5ade3 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/component-library/control1.tsx @@ -0,0 +1,18 @@ +import React, { ReactNode } from "react"; +import styles from "./styles.module.css"; + +interface Control1Props { + children?: ReactNode; +} + +const Control1: React.FC = ({ children = null }) => ( +
+ Control 1
+ {children} +
+); + +export default Control1; diff --git a/examples/express/src/routes/parallel-folder-convention/component-library/control2.tsx b/examples/express/src/routes/parallel-folder-convention/component-library/control2.tsx new file mode 100644 index 0000000..01d0f02 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/component-library/control2.tsx @@ -0,0 +1,18 @@ +import React, { ReactNode } from "react"; +import styles from "./styles.module.css"; + +interface Control2Props { + children?: ReactNode; +} + +const Control2: React.FC = ({ children = null }) => ( +
+ Control 2
+ {children} +
+); + +export default Control2; diff --git a/examples/express/src/routes/parallel-folder-convention/component-library/styles.module.css b/examples/express/src/routes/parallel-folder-convention/component-library/styles.module.css new file mode 100644 index 0000000..f539d46 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/component-library/styles.module.css @@ -0,0 +1,29 @@ +.example { + border: 1px solid black; + border-radius: 5px; + min-width: 200px; + min-height: 200px; + display: inline-flex; + align-items: center; + justify-content: center; + flex-direction: column; + padding: 20px; + margin: 20px; + text-align: center; + max-width: 280px; +} +.control { + background-color: lightblue; +} +.variant1 { + background-color: lightgreen; +} +.variant2 { + background-color: lightpink; +} +.routeList { + list-style-type: circle; +} +.routeList li:hover { + list-style-type: disc +} diff --git a/examples/express/src/routes/parallel-folder-convention/component-library/variant1.tsx b/examples/express/src/routes/parallel-folder-convention/component-library/variant1.tsx new file mode 100644 index 0000000..172c301 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/component-library/variant1.tsx @@ -0,0 +1,18 @@ +import React, { ReactNode } from "react"; +import styles from "./styles.module.css"; + +interface Variant1Props { + children?: ReactNode; +} + +const Variant1: React.FC = ({ children = null }) => ( +
+ Variant 1
+ {children} +
+); + +export default Variant1; diff --git a/examples/express/src/routes/parallel-folder-convention/component-library/variant2.tsx b/examples/express/src/routes/parallel-folder-convention/component-library/variant2.tsx new file mode 100644 index 0000000..aa03206 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/component-library/variant2.tsx @@ -0,0 +1,18 @@ +import React, { ReactNode } from "react"; +import styles from "./styles.module.css"; + +interface Variant2Props { + children?: ReactNode; +} + +const Variant2: React.FC = ({ children = null }) => ( +
+ Variant 2
+ {children} +
+); + +export default Variant2; diff --git a/examples/express/src/routes/parallel-folder-convention/components/Animal/index.tsx b/examples/express/src/routes/parallel-folder-convention/components/Animal/index.tsx new file mode 100644 index 0000000..5ccab21 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/components/Animal/index.tsx @@ -0,0 +1,5 @@ +import constants from "@/constants/index"; + +const animal = () => constants.ANIMAL; + +export default animal; diff --git a/examples/express/src/routes/parallel-folder-convention/components/BottomBox/index.tsx b/examples/express/src/routes/parallel-folder-convention/components/BottomBox/index.tsx new file mode 100644 index 0000000..8261752 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/components/BottomBox/index.tsx @@ -0,0 +1,15 @@ +import type { JSX } from "react"; +import Control2 from "@/component-library/control2"; +import AnimalPen from "@/component-library/AnimalPen"; +import useAnimals from "./useAnimals"; + +const BottomBox = ({ BoxControl = Control2 }): JSX.Element => { + const animals = useAnimals(); + return ( + + + + ); +}; + +export default BottomBox; diff --git a/examples/express/src/routes/parallel-folder-convention/components/BottomBox/useAnimals.ts b/examples/express/src/routes/parallel-folder-convention/components/BottomBox/useAnimals.ts new file mode 100644 index 0000000..757f4d8 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/components/BottomBox/useAnimals.ts @@ -0,0 +1,6 @@ +import useAppSelector from "@/state/useAppSelector"; +import slice from "@/state/modules/animals/slice"; + +const useAnimals = () => useAppSelector(slice.selectors.getAnimals); + +export default useAnimals; diff --git a/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/TopBoxButton/index.module.css b/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/TopBoxButton/index.module.css new file mode 100644 index 0000000..6b4e540 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/TopBoxButton/index.module.css @@ -0,0 +1,6 @@ +.button { + margin: auto; + border: 1px solid black; + border-radius: 20%; + font-size: xxx-large; +} diff --git a/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/TopBoxButton/index.tsx b/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/TopBoxButton/index.tsx new file mode 100644 index 0000000..71b0989 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/TopBoxButton/index.tsx @@ -0,0 +1,12 @@ +import type { JSX } from "react"; +import useAddAnimal from "./useAddAnimal"; +import Animal from "@/components/Animal"; +import styles from "./index.module.css"; + +const TopBoxButton = (): JSX.Element => ( + +); + +export default TopBoxButton; diff --git a/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/TopBoxButton/useAddAnimal.ts b/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/TopBoxButton/useAddAnimal.ts new file mode 100644 index 0000000..646aa80 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/TopBoxButton/useAddAnimal.ts @@ -0,0 +1,11 @@ +import slice from "@/state/modules/animals/slice"; +import useAppDispatch from "@/state/useAppDispatch"; +import constants from "@/constants/index"; + +const useAddAnimal = () => { + const action = slice.actions.add(constants.ANIMAL); + const dispatch = useAppDispatch(); + return () => dispatch(action); +}; + +export default useAddAnimal; diff --git a/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/index.tsx b/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/index.tsx new file mode 100644 index 0000000..3182545 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/components/TopBox/TopBoxChild/index.tsx @@ -0,0 +1,11 @@ +import type { JSX } from "react"; +import Control2 from "@/component-library/control2"; +import TopBoxButton from "@/components/TopBox/TopBoxChild/TopBoxButton"; + +const TopBoxChild = (): JSX.Element => ( + + + +); + +export default TopBoxChild; diff --git a/examples/express/src/routes/parallel-folder-convention/components/TopBox/index.tsx b/examples/express/src/routes/parallel-folder-convention/components/TopBox/index.tsx new file mode 100644 index 0000000..179ad6e --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/components/TopBox/index.tsx @@ -0,0 +1,11 @@ +import type { JSX } from "react"; +import Control1 from "@/component-library/control1"; +import TopBoxChild from "./TopBoxChild"; + +const TopBox = (): JSX.Element => ( + + + +); + +export default TopBox; diff --git a/examples/express/src/routes/parallel-folder-convention/constants/index.ts b/examples/express/src/routes/parallel-folder-convention/constants/index.ts new file mode 100644 index 0000000..8433764 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/constants/index.ts @@ -0,0 +1 @@ +export default { ANIMAL: "🐢" as "🐢" }; diff --git a/examples/express/src/routes/parallel-folder-convention/global.d.ts b/examples/express/src/routes/parallel-folder-convention/global.d.ts new file mode 100644 index 0000000..457b234 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/global.d.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-unused-vars +declare const CLIENT: boolean; diff --git a/examples/express/src/routes/parallel-folder-convention/playwright.spec.js b/examples/express/src/routes/parallel-folder-convention/playwright.spec.js new file mode 100644 index 0000000..30f05ff --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/playwright.spec.js @@ -0,0 +1,201 @@ +import { test, expect } from "@playwright/test"; + +test.describe("parallel folder convention endpoint", () => { + test.describe("with no version header", () => { + test.beforeEach(async ({ page }) => { + await page.goto("http://localhost:3002/parallel-folder-convention/"); + }); + + test("it shows the control experience", async ({ page }) => { + const control = page.getByTestId("control 1"); + await expect(control).toBeAttached(); + await expect(control.getByText("🐢")).toBeAttached(); + await expect(control.getByTestId("control 2")).toBeAttached(); + await expect( + page.locator(':nth-match(:text("Control 2"), 2)') + ).toBeAttached(); + }); + + test.describe("when clicking on the dog button", () => { + test.beforeEach(async ({ page }) => { + await page.getByRole("button").click(); + }); + + test("it adds a dog to the lower container", async ({ page }) => { + await page.getByRole("button").click(); + await expect( + page.locator(':nth-match(:text("Control 2"), 2) :text("🐢")') + ).toBeAttached(); + }); + + test.describe("when changing the feature to 'feature 1'", () => { + test.beforeEach(async ({ page }) => { + await page.getByRole("combobox").selectOption("feature 1 🐱"); + }); + + test("it shows a varied experience", async ({ page }) => { + const control = page.getByTestId("variant 1"); + await expect(control).toBeAttached(); + await expect(control.getByText("🐱")).toBeAttached(); + await expect(control.getByText("🐱")).toHaveCSS( + "background-color", + "rgb(245, 222, 179)" + ); + await expect(page.getByTestId("variant 2")).toBeAttached(); + }); + + test("it preserves the state", async ({ page }) => { + await expect( + page.locator(':text("Variant 2") :text("🐢")') + ).toBeAttached(); + }); + + test.describe("when clicking on the cat button", () => { + test.beforeEach(async ({ page }) => { + await page.getByRole("button").click(); + }); + + test("it adds a cat to the lower container", async ({ page }) => { + await expect( + page.locator(':text("Variant 2") :text("🐱")') + ).toBeAttached(); + }); + + test.describe("when changing the feature to 'feature 2'", () => { + test.beforeEach(async ({ page }) => { + await page.getByRole("combobox").selectOption("feature 2 🐹"); + }); + + test("it shows a different varied experience", async ({ page }) => { + const control = page.getByTestId("control 1"); + await expect(control).toBeAttached(); + await expect(control.getByTestId("control 2")).toBeAttached(); + await expect(control.getByText("🐹")).toBeAttached(); + await expect(control.getByText("⛓️‍πŸ’₯")).toBeAttached(); + await expect( + page.locator(':nth-match(:text("Control 2"), 2)') + ).toBeAttached(); + }); + + test("it preserves the state", async ({ page }) => { + await expect( + page.locator(':text("Control 2") :text("🐢🐱")') + ).toBeAttached(); + }); + + test.describe("when clicking the 'free the animals' button", () => { + test.beforeEach(async ({ page }) => { + await page.getByRole("button", { name: "⛓️‍πŸ’₯" }).click(); + }); + + test("it clears the state", async ({ page }) => { + await expect( + page.locator(':nth-match(:text("Control 2"), 2)') + ).toHaveText("Control 2"); + }); + }); + }); + }); + }); + }); + }); + + test.describe("when a 'feature2' feature header is sent with the request", () => { + test.beforeEach(async ({ page }) => { + await page.setExtraHTTPHeaders({ feature: "feature2" }); + await page.goto("http://localhost:3002/parallel-folder-convention/"); + }); + + test("it shows the varied experience (default state with two hamsters)", async ({ + page + }) => { + const control = page.getByTestId("control 1"); + await expect(control).toBeAttached(); + await expect(control.getByText("🐹")).toBeAttached(); + await expect( + page.locator(':nth-match(:text("Control 2"), 2) :text("🐹🐹")') + ).toBeAttached(); + }); + + test.describe("when changing the feature to 'feature 5'", () => { + test.beforeEach(async ({ page }) => { + await page.getByRole("combobox").selectOption("feature 5 πŸͺ"); + }); + + test("shows the varied experience (new store & slice)", async ({ + page + }) => { + const control = page.getByTestId("variant 2"); + await expect(control).toBeAttached(); + await expect(control.getByText("🌎πŸͺβ˜„οΈπŸ›Έ")).toBeAttached(); + }); + + test("it maintains the previous state (two hamsters shown before)", async ({ + page + }) => { + await expect( + page.locator(':text("Control 2") :text("🐹🐹")') + ).toBeAttached(); + }); + }); + }); + + test.describe("when a 'feature3' feature header is sent with the request", () => { + test.beforeEach(async ({ page }) => { + await page.setExtraHTTPHeaders({ feature: "feature3" }); + await page.goto("http://localhost:3002/parallel-folder-convention/"); + }); + + test("it shows the varied experience", async ({ page }) => { + const control = page.getByTestId("control 1"); + await expect(control).toBeAttached(); + await expect(control.getByText("🐰")).toBeAttached(); + }); + + test.describe("when clicking on the rabbit button", () => { + test.beforeEach(async ({ page }) => { + await page.getByRole("button").click(); + }); + + test("it adds a rabbit to the container", async ({ page }) => { + await expect( + page.locator(':nth-match(:text("Control 2"), 2) :text("🐰")') + ).toBeAttached(); + }); + + test.describe("when clicking on the rabbit button another two times", () => { + test.beforeEach(async ({ page }) => { + await page.getByRole("button").click(); + await page.getByRole("button").click(); + }); + + test("it adds three more rabbits to the container (multiplying redux action)", async ({ + page + }) => { + await expect( + page.locator(':nth-match(:text("Control 2"), 2) :text("🐰🐰🐰🐰")') + ).toBeAttached(); + }); + + test.describe("when changing the feature to 'feature 4'", () => { + test.beforeEach(async ({ page }) => { + await page.getByRole("combobox").selectOption("feature 4 πŸ¦€"); + }); + + test("it shows the varied experience (selector that modifies existing state)", async ({ + page + }) => { + const control = page.getByTestId("control 1"); + await expect(control).toBeAttached(); + await expect(control.getByText("πŸ¦€")).toBeAttached(); + await expect( + page.locator( + ':nth-match(:text("Control 2"), 2) :text("πŸ¦€πŸ¦€πŸ¦€πŸ¦€")' + ) + ).toBeAttached(); + }); + }); + }); + }); + }); +}); diff --git a/examples/express/src/routes/parallel-folder-convention/router.tsx b/examples/express/src/routes/parallel-folder-convention/router.tsx new file mode 100644 index 0000000..dde0de5 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/router.tsx @@ -0,0 +1,56 @@ +import { Router, static as assetsFolder } from "express"; +import { renderToPipeableStream } from "react-dom/server"; +import { getFeaturesScript } from "./toggle-plumbing/serialization"; +import { setValue } from "./toggle-plumbing/featuresStore"; +import App from "./App"; + +const router = new Router(); +router.use(assetsFolder("public")); +router.use("/*", (request, _, scopeCallBack) => { + setValue({ + value: { selection: request.headers.feature ?? "baseline" }, + scopeCallBack + }); +}); +router.get("/*", (_, res) => { + const { pipe } = renderToPipeableStream( + + + + + + + + {getFeaturesScript()} + + +
+ +
+ + , + { + bootstrapScripts: [ + "/parallel-folder-convention/parallel-folder-convention.js" + ], + onShellReady() { + res.statusCode = 200; + res.setHeader("Content-type", "text/html"); + pipe(res); + }, + onShellError() { + res.statusCode = 500; + res.send("

Loading...

"); + } + } + ); +}); + +export default router; diff --git a/examples/express/src/routes/parallel-folder-convention/state/modules/animals/slice.ts b/examples/express/src/routes/parallel-folder-convention/state/modules/animals/slice.ts new file mode 100644 index 0000000..156297b --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/state/modules/animals/slice.ts @@ -0,0 +1,24 @@ +import { createSlice } from "@reduxjs/toolkit"; +import type { PayloadAction } from "@reduxjs/toolkit"; +import constants from "../../../constants"; + +type Animals = typeof constants.ANIMAL; + +interface AnimalsState extends Array {} + +const initialState = [] satisfies AnimalsState as AnimalsState; + +const animalsSlice = createSlice({ + name: "animals", + initialState, + reducers: { + add(state, action: PayloadAction) { + state.push(action.payload); + } + }, + selectors: { + getAnimals: (state: AnimalsState) => state + } +}); + +export default animalsSlice; diff --git a/examples/express/src/routes/parallel-folder-convention/state/modules/index.ts b/examples/express/src/routes/parallel-folder-convention/state/modules/index.ts new file mode 100644 index 0000000..e149a09 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/state/modules/index.ts @@ -0,0 +1,7 @@ +import animalsSlice from "./animals/slice"; + +const getReducerMap = () => ({ + animals: animalsSlice.reducer +}); + +export default getReducerMap; diff --git a/examples/express/src/routes/parallel-folder-convention/state/store.ts b/examples/express/src/routes/parallel-folder-convention/state/store.ts new file mode 100644 index 0000000..e6fa8b2 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/state/store.ts @@ -0,0 +1,16 @@ +import { configureStore } from "@reduxjs/toolkit"; +import getReducerMap from "./modules/index"; + +const createStore = () => { + const store = configureStore({ + reducer: getReducerMap() + }); + return store; +}; + +export type AppStore = ReturnType; + +export type RootState = ReturnType; +export type AppDispatch = AppStore["dispatch"]; + +export default createStore; diff --git a/examples/express/src/routes/parallel-folder-convention/state/useAppDispatch.ts b/examples/express/src/routes/parallel-folder-convention/state/useAppDispatch.ts new file mode 100644 index 0000000..80abae5 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/state/useAppDispatch.ts @@ -0,0 +1,6 @@ +import { useDispatch } from "react-redux"; +import type { AppDispatch } from "./store"; + +const useAppDispatch = useDispatch.withTypes(); + +export default useAppDispatch; diff --git a/examples/express/src/routes/parallel-folder-convention/state/useAppSelector.ts b/examples/express/src/routes/parallel-folder-convention/state/useAppSelector.ts new file mode 100644 index 0000000..331e88d --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/state/useAppSelector.ts @@ -0,0 +1,6 @@ +import { useSelector } from "react-redux"; +import type { RootState } from "./store"; + +const useAppSelector = useSelector.withTypes(); + +export default useAppSelector; diff --git a/examples/express/src/routes/parallel-folder-convention/styles.css b/examples/express/src/routes/parallel-folder-convention/styles.css new file mode 100644 index 0000000..7685138 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/styles.css @@ -0,0 +1,54 @@ +body { + font-family: "Didact Gothic", sans-serif; + font-weight: 400; + font-style: normal; + height: 100vh; + display: flex; + margin: 0; + flex-direction: column; + align-items: center; + justify-content: center; + + > div { + display: flex; + flex-direction: column; + align-items: center; + height: 100vh; + padding: 2em; + flex-basis: content; + + & > div { + display: flex; + flex: 1 1 auto; + justify-content: center; + flex-direction: column; + padding: 3em; + } + } +} + +select, +::picker(select) { + appearance: base-select; + backdrop-filter: saturate(0.3); +} +::picker(select) { + opacity: 0; + transition: all 0.4s allow-discrete; +} +select::picker-icon { + margin: auto; +} +option::checkmark { + order: 1; + margin-left: auto; + content: "β˜‘οΈ"; +} +::picker(select):popover-open { + opacity: 1; +} +@starting-style { + ::picker(select):popover-open { + opacity: 0; + } +} diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/constants.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/constants.ts new file mode 100644 index 0000000..fca1a93 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/constants.ts @@ -0,0 +1 @@ +export const FEATURE_KEY = "feature"; diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/featuresStore/browser.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/featuresStore/browser.ts new file mode 100644 index 0000000..25dba54 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/featuresStore/browser.ts @@ -0,0 +1,20 @@ +import { proxy, useSnapshot } from "valtio"; +import featuresStoreFactory from "@asos/web-toggle-point-features/storeFactories/globalFeaturesStoreFactory"; +import { getJSONFromScript } from "../serialization"; + +const { setValue: storeSetValue, getFeatures } = featuresStoreFactory({ + toggleType: "version" +}); + +storeSetValue({ value: proxy({}) }); +export const setValue = (input) => { + storeSetValue({ + value: Object.assign(getFeatures(), input) + }); +}; + +export { getFeatures }; +export const useFeatures = () => ({ feature: useSnapshot(getFeatures()) }); + +const { selection } = getJSONFromScript(); +setValue({ selection }); diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/featuresStore/index.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/featuresStore/index.ts new file mode 100644 index 0000000..01c3019 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/featuresStore/index.ts @@ -0,0 +1,9 @@ +let getFeatures, setValue, useFeatures; + +if (CLIENT) { + ({ getFeatures, setValue, useFeatures } = require("./browser.ts")); +} else { + ({ getFeatures, setValue, useFeatures } = require("./server.ts")); +} + +export { getFeatures, setValue, useFeatures }; diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/featuresStore/server.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/featuresStore/server.ts new file mode 100644 index 0000000..8fbc3e2 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/featuresStore/server.ts @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unresolved -- https://github.com/import-js/eslint-plugin-import/issues/1810 +import featuresStoreFactory from "@asos/web-toggle-point-features/storeFactories/nodeRequestScopedFeaturesStoreFactory"; +const { setValue, getFeatures } = featuresStoreFactory({ + toggleType: "version" +}); + +export { getFeatures, setValue }; +export const useFeatures = () => ({ feature: getFeatures() }); diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/pointCutConfig.js b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/pointCutConfig.js new file mode 100644 index 0000000..5c6b44c --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/pointCutConfig.js @@ -0,0 +1,43 @@ +import { win32, posix } from "path"; + +const toggleHandler = + "/src/routes/parallel-folder-convention/toggle-plumbing/toggleHandler"; +const joinPointResolver = (path) => + path.replaceAll(win32.sep, posix.sep).replace(/__variants__\/[^/]+\//, ""); + +const common = { + toggleHandler, + joinPointResolver +}; + +export default [ + { + name: "react components", + togglePointModule: + "/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/reactComponentTogglePoint", + variantGlobs: [ + "./src/routes/parallel-folder-convention/__variants__/*/components/**/!(*.spec).tsx" + ], + ...common + }, + { + name: "css modules & constants & redux slices", + togglePointModule: + "/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/objectProxyTogglePoint", + variantGlobs: [ + "./src/routes/parallel-folder-convention/__variants__/*/components/**/*.css", + "./src/routes/parallel-folder-convention/__variants__/*/constants/**/*.ts", + "./src/routes/parallel-folder-convention/__variants__/*/state/modules/*/slice.ts" + ], + ...common + }, + { + name: "redux reducer maps", + togglePointModule: + "/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/reduxReducerMapTogglePoint", + variantGlobs: [ + "./src/routes/parallel-folder-convention/__variants__/*/state/modules/index.ts" + ], + ...common + } +]; diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/serialization.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/serialization.ts new file mode 100644 index 0000000..9beb93c --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/serialization.ts @@ -0,0 +1,12 @@ +import { serializationFactory } from "@asos/web-toggle-point-ssr"; +import { getFeatures } from "./featuresStore"; + +const { getScriptReactElement, getJSONFromScript } = serializationFactory({ + id: "features", + logWarning: console.warn +}); + +const getFeaturesScript = () => + getScriptReactElement({ content: getFeatures() }); + +export { getFeaturesScript, getJSONFromScript }; diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/getRelevantModule.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/getRelevantModule.ts new file mode 100644 index 0000000..ab64ae6 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/getRelevantModule.ts @@ -0,0 +1,11 @@ +import { getFeatures } from "../featuresStore"; +import { FEATURE_KEY } from "../constants"; + +const getRelevantModule = (joinPoint, featuresMap) => { + const activeFeatures = featuresMap.get(FEATURE_KEY); + const { selection } = getFeatures(); + const variant = activeFeatures.get(selection); + return variant ?? joinPoint; +}; + +export default getRelevantModule; diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/objectProxyTogglePoint.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/objectProxyTogglePoint.ts new file mode 100644 index 0000000..a6a50b3 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/objectProxyTogglePoint.ts @@ -0,0 +1,12 @@ +import getRelevantModule from "./getRelevantModule"; + +const togglePoint = (joinPoint, featuresMap) => { + return new Proxy(joinPoint.default, { + get(_, ...rest) { + const newTarget = getRelevantModule(joinPoint, featuresMap); + return Reflect.get(newTarget.default, ...rest); + } + }); +}; + +export default togglePoint; diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/reactComponentTogglePoint.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/reactComponentTogglePoint.ts new file mode 100644 index 0000000..c75c0d6 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/reactComponentTogglePoint.ts @@ -0,0 +1,9 @@ +import { withTogglePointFactory } from "@asos/web-toggle-point-react-pointcuts"; +import { useFeatures as getActiveFeatures } from "../featuresStore"; + +const togglePoint = withTogglePointFactory({ + getActiveFeatures, + variantKey: "selection" +}); + +export default togglePoint; diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/reduxReducerMapTogglePoint.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/reduxReducerMapTogglePoint.ts new file mode 100644 index 0000000..2fc0f7d --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggle-points/reduxReducerMapTogglePoint.ts @@ -0,0 +1,8 @@ +import getRelevantModule from "./getRelevantModule"; + +const togglePoint = + (joinPoint, featuresMap) => + (...args) => + getRelevantModule(joinPoint, featuresMap).default(...args); + +export default togglePoint; diff --git a/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggleHandler.ts b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggleHandler.ts new file mode 100644 index 0000000..548ab19 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/toggle-plumbing/toggleHandler.ts @@ -0,0 +1,11 @@ +import { FEATURE_KEY } from "./constants"; + +export default ({ togglePoint, joinPoint, variantPathMap }) => { + const variantsMap = new Map(); + for (const key of variantPathMap.keys()) { + const [, feature] = key.match(/\/__variants__\/(.+?)\//); + variantsMap.set(feature, variantPathMap.get(key)); + } + const featuresMap = new Map([[FEATURE_KEY, variantsMap]]); + return togglePoint(joinPoint, featuresMap); +}; diff --git a/examples/express/src/routes/parallel-folder-convention/tsconfig.json b/examples/express/src/routes/parallel-folder-convention/tsconfig.json new file mode 100644 index 0000000..837544f --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "baseUrl": ".", + "paths": { + "@/component-library/*": ["./component-library/*"], + "@/components/*": ["./components/*"], + "@/state/*": ["./state/*"], + "@/constants/*": ["./constants/*"] + }, + "target": "es2018", + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "incremental": true, + "module": "esnext", + "esModuleInterop": true, + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "sourceMap": true + }, + "include": ["**/*.ts", "**/*.tsx", "toggle-plumbing/pointCutConfig.js"], + "exclude": ["node_modules"] +} diff --git a/examples/express/src/routes/parallel-folder-convention/typings.d.ts b/examples/express/src/routes/parallel-folder-convention/typings.d.ts new file mode 100644 index 0000000..1eabbb4 --- /dev/null +++ b/examples/express/src/routes/parallel-folder-convention/typings.d.ts @@ -0,0 +1 @@ +declare module "*.module.css"; diff --git a/examples/express/webpack.config.js b/examples/express/webpack.config.js index 73d72f4..ff20d6e 100644 --- a/examples/express/webpack.config.js +++ b/examples/express/webpack.config.js @@ -3,6 +3,9 @@ import externals from "webpack-node-externals"; import { TogglePointInjection } from "@asos/web-toggle-point-webpack/plugins"; import MiniCssExtractPlugin from "mini-css-extract-plugin"; import { fileURLToPath } from "url"; +import parallelFolderConventionPointCutConfig from "./src/routes/parallel-folder-convention/toggle-plumbing/pointCutConfig.js"; +import { EnhancedTsconfigWebpackPlugin } from "enhanced-tsconfig-paths-webpack-plugin"; +import webpack from "webpack"; const configPointCutConfig = { name: "configuration variants", @@ -12,6 +15,7 @@ const configPointCutConfig = { const common = { mode: "production", + devtool: "source-map", module: { rules: [ { @@ -23,9 +27,39 @@ const common = { }, { test: /\.css$/, - use: [MiniCssExtractPlugin.loader, "css-loader"] + use: [ + MiniCssExtractPlugin.loader, + { + loader: "css-loader", + options: { + modules: { + namedExport: false + } + } + } + ] + }, + { + test: /\.tsx?$/, + use: "ts-loader", + exclude: /node_modules/ + }, + { + test: /\.js$/, + enforce: "pre", + use: ["source-map-loader"] } ] + }, + resolve: { + extensions: [".tsx", ".ts", ".js"], + plugins: [ + new EnhancedTsconfigWebpackPlugin({ + tsconfigPaths: { + extensions: [".ts", ".tsx", ".css"] + } + }) + ] } }; @@ -42,10 +76,14 @@ const config = [ externals: [externals()], ...common, plugins: [ + new webpack.DefinePlugin({ + CLIENT: false + }), new MiniCssExtractPlugin(), new TogglePointInjection({ pointCuts: [ configPointCutConfig, + ...parallelFolderConventionPointCutConfig, { name: "animal apis by version", variantGlobs: [ @@ -75,6 +113,26 @@ const config = [ new TogglePointInjection({ pointCuts: [configPointCutConfig] }) ], ...common + }, + { + entry: "./src/routes/parallel-folder-convention/client.js", + target: "web", + output: { + path: resolve(dirname(fileURLToPath(import.meta.url)), "public"), + filename: "parallel-folder-convention.js" + }, + plugins: [ + new webpack.DefinePlugin({ + CLIENT: true + }), + new MiniCssExtractPlugin({ + filename: "parallel-folder-convention.css" + }), + new TogglePointInjection({ + pointCuts: parallelFolderConventionPointCutConfig + }) + ], + ...common } ]; diff --git a/examples/next/README.md b/examples/next/README.md index 48a7229..bda15c2 100644 --- a/examples/next/README.md +++ b/examples/next/README.md @@ -21,4 +21,3 @@ N.B. NextJs support is currently experimental, see [caveats](#caveats). - The webpack package cannot currently vary some of NextJs' [filesystem convention files](https://nextjs.org/docs/pages/getting-started/project-structure#files-conventions) ([Issue #9](https://github.com/ASOS/web-toggle-point/issues/9)) - The `webpack` plugin uses webpack hooks, so is incompatible with the new TurboPack bundler - The `webpack` plugin uses Node JS APIs to access the filesystem, so may be incompatible with [the edge runtime](https://nextjs.org/docs/app/api-reference/edge#unsupported-apis) -- The `nodeRequestScopedFeaturesStoreFactory` from the [`features`](../../packages/features/docs/README.md) package relies on singleton values held in top-level scope, which Next does not support. See [issue 50](https://github.com/ASOS/web-toggle-point/issues/50), which should remedy this. \ No newline at end of file diff --git a/examples/next/docs/CHANGELOG.md b/examples/next/docs/CHANGELOG.md index 244ad2d..e1366c7 100644 --- a/examples/next/docs/CHANGELOG.md +++ b/examples/next/docs/CHANGELOG.md @@ -10,6 +10,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - update to take supply static `webpackNormalModule` corresponding to webpack plugin [version 0.9.0](../../../packages/webpack/docs/CHANGELOG.md#090---2025-07-29) +- update [`Next.js`](https://nextjs.org/) to version 15.5.6 +- update [`@playwright/test`](https://github.com/microsoft/playwright/tree/main/packages/playwright-test) to 1.56.0 + +### Fixed + +- remove note regarding [issue #50](https://github.com/ASOS/web-toggle-point/issues/50) after release of features [version 0.5.0](../../../packages/features/docs/CHANGELOG.md#050---2025-10-20) ## [0.4.0] - 2025-10-20 diff --git a/examples/next/package.json b/examples/next/package.json index fb71445..5c9e4c2 100644 --- a/examples/next/package.json +++ b/examples/next/package.json @@ -23,7 +23,7 @@ "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", "@next/mdx": "^15.0.3", - "next": "^15.3.0", + "next": "^15.5.6", "remark-gfm": "^4.0.0", "turndown": "^7.2.0" }, @@ -38,6 +38,6 @@ "path-exists-cli": "^2.0.0" }, "peerDependencies": { - "@playwright/test": "^1.49.0" + "@playwright/test": "^1.56.0" } } diff --git a/examples/next/playwright.config.ts b/examples/next/playwright.config.ts index 88d6b5e..331c13c 100644 --- a/examples/next/playwright.config.ts +++ b/examples/next/playwright.config.ts @@ -1,4 +1,5 @@ import { defineConfig, type PlaywrightTestConfig } from "@playwright/test"; +// eslint-disable-next-line workspaces/no-relative-imports, workspaces/require-dependency import baseConfig from "../../test/automation/base.config"; const THREE_MINUTES = 3 * 60 * 1000; diff --git a/examples/serve/docs/CHANGELOG.md b/examples/serve/docs/CHANGELOG.md index ad96a31..ecb3b6c 100644 --- a/examples/serve/docs/CHANGELOG.md +++ b/examples/serve/docs/CHANGELOG.md @@ -7,9 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.4.0] - 2025-10-21 -### Changed +### Added - updated toggle handlers to take a `variantPathMap` corresponding to webpack [version 0.9.0](../../../packages/webpack/docs/CHANGELOG.md#090---2025-07-29) +- `@typescript-eslint/parser` to support the above + +### Fixed + +- convert deprecated `unstable_config_lookup_from_file` eslint flag to `v10_config_lookup_from_file` now that [its stable](https://eslint.org/docs/latest/flags/#active-flags) awaiting next major version ## [0.3.0] - 2025-10-20 diff --git a/examples/serve/package.json b/examples/serve/package.json index e4bd084..f8428c0 100644 --- a/examples/serve/package.json +++ b/examples/serve/package.json @@ -11,8 +11,8 @@ "prelint": "npm run build-dependencies", "lint": "npm run lint:code && npm run lint:docs", "lint:fix": "npm run lint:code -- --fix && npm run lint:docs -- --fix", - "lint:code": "eslint src --flag unstable_config_lookup_from_file", - "lint:docs": "eslint *.md --flag unstable_config_lookup_from_file" + "lint:code": "eslint src --flag v10_config_lookup_from_file", + "lint:docs": "eslint *.md --flag v10_config_lookup_from_file" }, "dependencies": { "@asos/web-toggle-point-webpack": "file:../../packages/webpack", @@ -28,6 +28,6 @@ "webpack-node-externals": "^3.0.0" }, "peerDependencies": { - "@playwright/test": "^1.49.0" + "@playwright/test": "^1.56.0" } } diff --git a/package-lock.json b/package-lock.json index 461345b..02810f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "core-js": "^3.0.0", "cross-env": "^7.0.3", "danger": "^13.0.3", - "eslint": "^9.15.0", + "eslint": "^9.38.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^28.9.0", "eslint-plugin-jest-formatting": "^3.1.0", @@ -57,25 +57,31 @@ }, "examples/express": { "name": "web-toggle-point-express-example", - "version": "0.3.1", + "version": "0.4.0", "dependencies": { "@asos/web-toggle-point-features": "file:../../packages/features", "@asos/web-toggle-point-react-pointcuts": "file:../../packages/react-pointcuts", "@asos/web-toggle-point-ssr": "file:../../packages/ssr", "@asos/web-toggle-point-webpack": "file:../../packages/webpack", + "@reduxjs/toolkit": "^2.8.2", "cross-env": "^7.0.3", "express": "^4.17.1", "http-status-codes": "^2.3.0", "react": ">=17", - "react-dom": ">=17" + "react-dom": ">=17", + "react-redux": "^9.2.0", + "valtio": "^2.1.5" }, "devDependencies": { "babel-loader": "^9.2.1", "css-loader": "^7.1.2", + "enhanced-tsconfig-paths-webpack-plugin": "^0.2.3", "mini-css-extract-plugin": "^2.9.2", "path-exists-cli": "^2.0.0", "prop-types": "^15.7.2", + "source-map-loader": "^5.0.0", "style-loader": "^4.0.0", + "ts-loader": "^9.5.2", "webpack": "^5.38.1", "webpack-cli": "^4.7.2", "webpack-node-externals": "^3.0.0" @@ -84,7 +90,7 @@ "node": ">=20.6.0" }, "peerDependencies": { - "@playwright/test": "^1.49.0" + "@playwright/test": "^1.56.0" } }, "examples/next": { @@ -97,7 +103,7 @@ "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", "@next/mdx": "^15.0.3", - "next": "^15.3.0", + "next": "^15.5.6", "remark-gfm": "^4.0.0", "turndown": "^7.2.0" }, @@ -112,7 +118,7 @@ "path-exists-cli": "^2.0.0" }, "peerDependencies": { - "@playwright/test": "^1.49.0" + "@playwright/test": "^1.56.0" } }, "examples/serve": { @@ -132,25 +138,14 @@ "webpack-node-externals": "^3.0.0" }, "peerDependencies": { - "@playwright/test": "^1.49.0" + "@playwright/test": "^1.56.0" } }, "node_modules/@adobe/css-tools": { - "version": "4.4.1", + "version": "4.4.4", "dev": true, "license": "MIT" }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@asos/web-toggle-point-features": { "resolved": "packages/features", "link": true @@ -168,11 +163,11 @@ "link": true }, "node_modules/@babel/cli": { - "version": "7.26.4", + "version": "7.28.3", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.28", "commander": "^6.2.0", "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", @@ -208,26 +203,26 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", + "version": "7.28.4", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "version": "7.28.4", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -243,7 +238,7 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.25.9", + "version": "7.28.4", "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -259,13 +254,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", + "version": "7.28.3", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -273,21 +268,21 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", + "version": "7.27.3", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", + "version": "7.27.2", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -297,15 +292,15 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", + "version": "7.28.3", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "engines": { @@ -316,10 +311,10 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, @@ -331,48 +326,55 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.3", + "version": "0.6.5", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", + "version": "7.28.3", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -382,29 +384,29 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -414,12 +416,12 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -429,11 +431,11 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -454,19 +456,19 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", + "version": "7.28.3", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" @@ -497,11 +499,11 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -511,10 +513,10 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -524,10 +526,10 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -537,12 +539,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -552,11 +554,11 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", + "version": "7.28.3", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -623,10 +625,10 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -636,10 +638,10 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -671,10 +673,10 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -778,11 +780,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", + "version": "7.27.1", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -806,10 +808,10 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -819,12 +821,12 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", + "version": "7.28.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -834,12 +836,12 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -849,10 +851,10 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -862,10 +864,10 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", + "version": "7.28.4", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -875,11 +877,11 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -889,11 +891,11 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", + "version": "7.28.3", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -903,15 +905,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", + "version": "7.28.4", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -920,19 +922,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -942,10 +937,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", + "version": "7.28.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -955,11 +951,11 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -969,10 +965,10 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -982,11 +978,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -996,10 +992,24 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1009,10 +1019,10 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1022,10 +1032,10 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1035,11 +1045,11 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1049,12 +1059,12 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1064,10 +1074,10 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1077,10 +1087,10 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1090,10 +1100,10 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1103,10 +1113,10 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1116,11 +1126,11 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1130,11 +1140,11 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1144,13 +1154,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1160,11 +1170,11 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1174,11 +1184,11 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1188,10 +1198,10 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1201,10 +1211,10 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1214,10 +1224,10 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1227,12 +1237,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", + "version": "7.28.4", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1242,11 +1254,11 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1256,10 +1268,10 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1269,11 +1281,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1283,10 +1295,10 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", + "version": "7.27.7", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1296,11 +1308,11 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1310,12 +1322,12 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1325,10 +1337,10 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1338,10 +1350,10 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", + "version": "7.28.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1351,14 +1363,14 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1368,10 +1380,10 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1381,11 +1393,11 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1395,11 +1407,10 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", + "version": "7.28.4", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1409,11 +1420,11 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1423,10 +1434,10 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1436,14 +1447,14 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", + "version": "7.28.3", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -1454,10 +1465,10 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1467,11 +1478,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1481,10 +1492,10 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1494,10 +1505,10 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1507,10 +1518,10 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1520,10 +1531,10 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1533,11 +1544,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1547,11 +1558,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1561,11 +1572,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1575,77 +1586,78 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.0", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "version": "7.28.3", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -1668,15 +1680,15 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.26.3", + "version": "7.27.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1705,28 +1717,21 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", + "version": "7.28.4", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { "version": "7.28.4", "license": "MIT", @@ -1752,20 +1757,22 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.49.0", + "version": "0.50.2", "dev": true, "license": "MIT", "dependencies": { + "@types/estree": "^1.0.6", + "@typescript-eslint/types": "^8.11.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~4.1.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", + "version": "4.9.0", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -1798,14 +1805,17 @@ } }, "node_modules/@eslint/compat": { - "version": "1.2.4", + "version": "1.4.0", "license": "Apache-2.0", "peer": true, + "dependencies": { + "@eslint/core": "^0.16.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": "^9.10.0" + "eslint": "^8.40 || 9" }, "peerDependenciesMeta": { "eslint": { @@ -1813,11 +1823,22 @@ } } }, + "node_modules/@eslint/compat/node_modules/@eslint/core": { + "version": "0.16.0", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/config-array": { - "version": "0.19.1", + "version": "0.21.1", "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.5", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -1825,8 +1846,29 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.1", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "version": "0.16.0", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.9.1", + "version": "0.14.0", + "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -1836,7 +1878,7 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", + "version": "3.3.1", "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -1867,10 +1909,13 @@ } }, "node_modules/@eslint/js": { - "version": "9.17.0", + "version": "9.38.0", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/markdown": { @@ -1894,18 +1939,14 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/markdown/node_modules/@eslint/core": { - "version": "0.14.0", - "dev": true, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/markdown/node_modules/@eslint/plugin-kit": { + "node_modules/@eslint/plugin-kit": { "version": "0.3.5", "dev": true, "license": "Apache-2.0", @@ -1917,7 +1958,7 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/markdown/node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { "version": "0.15.2", "dev": true, "license": "Apache-2.0", @@ -1928,34 +1969,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.13.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.13.0", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@gitbeaker/core": { "version": "38.12.1", "dev": true, @@ -2001,27 +2014,16 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", + "version": "0.16.7", "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "license": "Apache-2.0", @@ -2034,7 +2036,7 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", + "version": "0.4.3", "license": "Apache-2.0", "engines": { "node": ">=18.18" @@ -2086,6 +2088,25 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "dev": true, @@ -2103,7 +2124,7 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", + "version": "6.2.3", "dev": true, "license": "MIT", "engines": { @@ -2902,7 +2923,7 @@ } }, "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "devOptional": true, "license": "ISC", "bin": { @@ -3211,33 +3232,30 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", + "version": "0.3.13", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", + "version": "0.3.11", "devOptional": true, "license": "MIT", "dependencies": { @@ -3246,11 +3264,11 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", + "version": "1.5.5", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", + "version": "0.3.31", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -3283,16 +3301,69 @@ "tslib": "2" } }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.1.1", + "node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", "dev": true, "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" - }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, "engines": { "node": ">=10.0" }, @@ -3305,9 +3376,13 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.5.0", + "version": "1.9.0", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, "engines": { "node": ">=10.0" }, @@ -3320,7 +3395,7 @@ } }, "node_modules/@mdx-js/loader": { - "version": "3.1.0", + "version": "3.1.1", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -3340,20 +3415,21 @@ } }, "node_modules/@mdx-js/loader/node_modules/source-map": { - "version": "0.7.4", + "version": "0.7.6", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/@mdx-js/mdx": { - "version": "3.1.0", + "version": "3.1.1", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", @@ -3388,14 +3464,14 @@ } }, "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.7.4", + "version": "0.7.6", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/@mdx-js/react": { - "version": "3.1.0", + "version": "3.1.1", "license": "MIT", "dependencies": { "@types/mdx": "^2.0.0" @@ -3411,16 +3487,14 @@ }, "node_modules/@mixmark-io/domino": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", - "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", "license": "BSD-2-Clause" }, "node_modules/@next/env": { - "version": "15.5.4", + "version": "15.5.6", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "15.1.2", + "version": "15.5.6", "dev": true, "license": "MIT", "dependencies": { @@ -3443,7 +3517,7 @@ } }, "node_modules/@next/mdx": { - "version": "15.1.2", + "version": "15.5.6", "license": "MIT", "dependencies": { "source-map": "^0.7.0" @@ -3462,29 +3536,14 @@ } }, "node_modules/@next/mdx/node_modules/source-map": { - "version": "0.7.4", + "version": "0.7.6", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.4.tgz", - "integrity": "sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.5.4", + "version": "15.5.6", "cpu": [ "x64" ], @@ -3497,96 +3556,6 @@ "node": ">= 10" } }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.4.tgz", - "integrity": "sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.4.tgz", - "integrity": "sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.4.tgz", - "integrity": "sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.4.tgz", - "integrity": "sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.4.tgz", - "integrity": "sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.4.tgz", - "integrity": "sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "dev": true, @@ -3656,7 +3625,7 @@ } }, "node_modules/@npmcli/config/node_modules/ci-info": { - "version": "4.1.0", + "version": "4.3.1", "dev": true, "funding": [ { @@ -3678,7 +3647,7 @@ } }, "node_modules/@npmcli/config/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -3729,7 +3698,7 @@ "license": "ISC" }, "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -3912,7 +3881,7 @@ } }, "node_modules/@npmcli/package-json/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -3957,8 +3926,6 @@ }, "node_modules/@octokit/auth-token": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "dev": true, "license": "MIT", "engines": { @@ -3967,8 +3934,6 @@ }, "node_modules/@octokit/core": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", - "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", "dev": true, "license": "MIT", "dependencies": { @@ -3986,8 +3951,6 @@ }, "node_modules/@octokit/endpoint": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", "dev": true, "license": "MIT", "dependencies": { @@ -4000,8 +3963,6 @@ }, "node_modules/@octokit/graphql": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", - "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", "dev": true, "license": "MIT", "dependencies": { @@ -4015,15 +3976,11 @@ }, "node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", "dev": true, "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "11.4.4-cjs.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", - "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", "dev": true, "license": "MIT", "dependencies": { @@ -4038,8 +3995,6 @@ }, "node_modules/@octokit/plugin-request-log": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", - "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", "dev": true, "license": "MIT", "engines": { @@ -4051,8 +4006,6 @@ }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "13.3.2-cjs.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", - "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4067,8 +4020,6 @@ }, "node_modules/@octokit/request": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -4083,8 +4034,6 @@ }, "node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", "dev": true, "license": "MIT", "dependencies": { @@ -4098,8 +4047,6 @@ }, "node_modules/@octokit/rest": { "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz", - "integrity": "sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==", "dev": true, "license": "MIT", "dependencies": { @@ -4114,8 +4061,6 @@ }, "node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", "dev": true, "license": "MIT", "dependencies": { @@ -4132,20 +4077,20 @@ } }, "node_modules/@pkgr/core": { - "version": "0.1.1", + "version": "0.2.9", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, "node_modules/@playwright/test": { - "version": "1.55.1", + "version": "1.56.1", "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.1" + "playwright": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -4154,8 +4099,32 @@ "node": ">=18" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.9.1", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-babel": { - "version": "6.0.4", + "version": "6.1.0", "dev": true, "license": "MIT", "dependencies": { @@ -4324,7 +4293,7 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.4", + "version": "5.3.0", "dev": true, "license": "MIT", "dependencies": { @@ -4349,7 +4318,7 @@ "license": "MIT" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", + "version": "1.14.0", "dev": true, "license": "MIT" }, @@ -4374,8 +4343,16 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "license": "MIT" + }, "node_modules/@stylistic/eslint-plugin-js": { - "version": "2.12.1", + "version": "2.13.0", "license": "MIT", "peer": true, "dependencies": { @@ -4390,7 +4367,7 @@ } }, "node_modules/@stylistic/eslint-plugin-js/node_modules/eslint-visitor-keys": { - "version": "4.2.0", + "version": "4.2.1", "license": "Apache-2.0", "peer": true, "engines": { @@ -4408,7 +4385,7 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.4.0", + "version": "10.4.1", "dev": true, "license": "MIT", "peer": true, @@ -4417,9 +4394,9 @@ "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", - "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", + "picocolors": "1.1.1", "pretty-format": "^27.0.2" }, "engines": { @@ -4427,16 +4404,15 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "6.6.3", + "version": "6.9.1", "dev": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", - "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", + "picocolors": "^1.1.1", "redent": "^3.0.0" }, "engines": { @@ -4445,25 +4421,44 @@ "yarn": ">=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/redent": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", + "node_modules/@testing-library/jest-dom/node_modules/strip-indent": { + "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/@testing-library/react": { - "version": "16.1.0", + "version": "16.3.0", "dev": true, "license": "MIT", "dependencies": { @@ -4496,13 +4491,6 @@ "node": ">= 10" } }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, "node_modules/@types/aria-query": { "version": "5.0.4", "dev": true, @@ -4522,7 +4510,7 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", + "version": "7.27.0", "devOptional": true, "license": "MIT", "dependencies": { @@ -4539,11 +4527,11 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", + "version": "7.28.0", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" } }, "node_modules/@types/concat-stream": { @@ -4580,7 +4568,7 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", + "version": "1.0.8", "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -4707,15 +4695,15 @@ "license": "MIT" }, "node_modules/@types/ms": { - "version": "0.7.34", + "version": "2.1.0", "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.2", + "version": "24.9.1", "devOptional": true, "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/normalize-package-data": { @@ -4724,7 +4712,7 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.0.2", + "version": "19.2.2", "license": "MIT", "peer": true, "dependencies": { @@ -4753,8 +4741,6 @@ }, "node_modules/@types/turndown": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.5.tgz", - "integrity": "sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==", "dev": true, "license": "MIT" }, @@ -4762,10 +4748,12 @@ "version": "3.0.3", "license": "MIT" }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "license": "MIT" + }, "node_modules/@types/webpack-env": { "version": "1.18.8", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", - "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", "dev": true, "license": "MIT" }, @@ -4783,19 +4771,19 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.18.1", + "version": "8.46.2", "devOptional": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/type-utils": "8.18.1", - "@typescript-eslint/utils": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/type-utils": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4805,20 +4793,28 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.46.2", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.18.1", + "version": "8.46.2", "devOptional": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4" }, "engines": { @@ -4830,15 +4826,34 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.2", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.1", + "version": "8.46.2", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1" + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4848,15 +4863,30 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.2", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.18.1", + "version": "8.46.2", "devOptional": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/utils": "8.18.1", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4867,11 +4897,11 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.18.1", + "version": "8.46.2", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4882,17 +4912,19 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.1", + "version": "8.46.2", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4902,7 +4934,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -4926,7 +4958,7 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4936,13 +4968,13 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.18.1", + "version": "8.46.2", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4953,15 +4985,15 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.1", + "version": "8.46.2", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.1", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.46.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4972,7 +5004,7 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", + "version": "4.2.1", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4982,9 +5014,21 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.1", + "version": "1.3.0", "license": "ISC" }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "devOptional": true, @@ -5188,7 +5232,7 @@ } }, "node_modules/acorn": { - "version": "8.14.0", + "version": "8.15.0", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5206,6 +5250,17 @@ "acorn-walk": "^8.0.2" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "license": "MIT", @@ -5285,14 +5340,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "license": "ISC", @@ -5341,7 +5388,7 @@ } }, "node_modules/ansi-escapes": { - "version": "7.0.0", + "version": "7.1.1", "dev": true, "license": "MIT", "dependencies": { @@ -5355,7 +5402,7 @@ } }, "node_modules/ansi-regex": { - "version": "6.1.0", + "version": "6.2.2", "license": "MIT", "engines": { "node": ">=12" @@ -5461,15 +5508,17 @@ "license": "MIT" }, "node_modules/array-includes": { - "version": "3.1.8", + "version": "3.1.9", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5505,15 +5554,16 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", + "version": "1.2.6", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5606,6 +5656,13 @@ "astring": "bin/astring" } }, + "node_modules/async-function": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/async-retry": { "version": "1.2.3", "dev": true, @@ -5633,7 +5690,7 @@ } }, "node_modules/axe-core": { - "version": "4.10.2", + "version": "4.11.0", "license": "MPL-2.0", "engines": { "node": ">=4" @@ -5721,11 +5778,11 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.12", + "version": "0.4.14", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -5733,21 +5790,21 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", + "version": "0.13.0", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.3", + "version": "0.6.5", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5762,7 +5819,7 @@ "link": true }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", + "version": "1.2.0", "devOptional": true, "license": "MIT", "dependencies": { @@ -5783,7 +5840,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "node_modules/babel-preset-jest": { @@ -5813,10 +5870,15 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.18", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/before-after-hook": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true, "license": "Apache-2.0" }, @@ -5904,7 +5966,7 @@ } }, "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.2.1", + "version": "6.2.3", "license": "MIT", "engines": { "node": ">=12" @@ -5924,7 +5986,7 @@ } }, "node_modules/boxen/node_modules/chalk": { - "version": "5.4.0", + "version": "5.6.2", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -5996,7 +6058,7 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", + "version": "4.26.3", "funding": [ { "type": "opencollective", @@ -6013,10 +6075,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -6079,7 +6142,7 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6090,11 +6153,11 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", + "version": "1.0.4", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -6147,9 +6210,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", + "version": "1.0.30001751", "funding": [ { "type": "opencollective", @@ -6299,7 +6360,7 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.1", + "version": "1.4.3", "devOptional": true, "license": "MIT" }, @@ -6566,7 +6627,7 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", + "version": "1.0.3", "devOptional": true, "license": "MIT" }, @@ -6742,7 +6803,7 @@ "license": "MIT" }, "node_modules/core-js": { - "version": "3.39.0", + "version": "3.46.0", "hasInstallScript": true, "license": "MIT", "funding": { @@ -6751,10 +6812,10 @@ } }, "node_modules/core-js-compat": { - "version": "3.39.0", + "version": "3.46.0", "license": "MIT", "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.26.3" }, "funding": { "type": "opencollective", @@ -6895,7 +6956,7 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -6953,8 +7014,6 @@ }, "node_modules/danger": { "version": "13.0.4", - "resolved": "https://registry.npmjs.org/danger/-/danger-13.0.4.tgz", - "integrity": "sha512-IAdQ5nSJyIs4zKj6AN35ixt2B0Ce3WZUm3IFe/CMnL/Op7wV7IGg4D348U0EKNaNPP58QgXbdSk9pM+IXP1QXg==", "dev": true, "license": "MIT", "dependencies": { @@ -7069,16 +7128,6 @@ "node": ">=4" } }, - "node_modules/danger/node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/danger/node_modules/supports-color": { "version": "5.5.0", "dev": true, @@ -7180,7 +7229,7 @@ } }, "node_modules/debug": { - "version": "4.4.0", + "version": "4.4.3", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -7237,12 +7286,12 @@ } }, "node_modules/decimal.js": { - "version": "10.4.3", + "version": "10.6.0", "dev": true, "license": "MIT" }, "node_modules/decode-named-character-reference": { - "version": "1.0.2", + "version": "1.2.0", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -7253,7 +7302,7 @@ } }, "node_modules/dedent": { - "version": "1.5.3", + "version": "1.7.0", "devOptional": true, "license": "MIT", "peerDependencies": { @@ -7331,8 +7380,6 @@ }, "node_modules/deprecation": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true, "license": "ISC" }, @@ -7352,7 +7399,7 @@ } }, "node_modules/detect-libc": { - "version": "2.1.1", + "version": "2.1.2", "license": "Apache-2.0", "optional": true, "engines": { @@ -7476,7 +7523,7 @@ } }, "node_modules/domutils": { - "version": "3.1.0", + "version": "3.2.2", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -7516,7 +7563,7 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.75", + "version": "1.5.237", "license": "ISC" }, "node_modules/emittery": { @@ -7531,7 +7578,7 @@ } }, "node_modules/emoji-regex": { - "version": "10.4.0", + "version": "10.6.0", "dev": true, "license": "MIT" }, @@ -7551,7 +7598,7 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.0", + "version": "5.18.3", "devOptional": true, "license": "MIT", "dependencies": { @@ -7562,6 +7609,14 @@ "node": ">=10.13.0" } }, + "node_modules/enhanced-tsconfig-paths-webpack-plugin": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "tsconfig-paths": "^3.10.1" + } + }, "node_modules/entities": { "version": "4.5.0", "license": "BSD-2-Clause", @@ -7573,7 +7628,7 @@ } }, "node_modules/envinfo": { - "version": "7.14.0", + "version": "7.19.0", "dev": true, "license": "MIT", "bin": { @@ -7600,7 +7655,7 @@ "license": "MIT" }, "node_modules/error-ex": { - "version": "1.3.2", + "version": "1.3.4", "devOptional": true, "license": "MIT", "dependencies": { @@ -7608,25 +7663,26 @@ } }, "node_modules/es-abstract": { - "version": "1.23.6", + "version": "1.24.0", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", + "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.7", - "get-intrinsic": "^1.2.6", - "get-symbol-description": "^1.0.2", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", @@ -7634,31 +7690,36 @@ "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.4", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.3", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.0.0", - "object-inspect": "^1.13.3", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.3", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.3", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.16" + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -7682,36 +7743,37 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.0", + "version": "1.2.1", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.5.4", + "version": "1.7.0", "devOptional": true, "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.0.0", + "version": "1.1.1", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -7734,10 +7796,13 @@ } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", + "version": "1.1.0", "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { @@ -7833,29 +7898,31 @@ } }, "node_modules/eslint": { - "version": "9.17.0", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.17.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.38.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -7894,11 +7961,11 @@ "link": true }, "node_modules/eslint-config-next": { - "version": "15.1.2", + "version": "15.5.6", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "15.1.2", + "@next/eslint-plugin-next": "15.5.6", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", @@ -7920,7 +7987,7 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", + "version": "9.1.2", "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" @@ -7957,24 +8024,23 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.7.0", + "version": "3.10.1", "dev": true, "license": "ISC", "dependencies": { "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.7", - "enhanced-resolve": "^5.15.0", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3", - "stable-hash": "^0.0.4" + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + "url": "https://opencollective.com/eslint-import-resolver-typescript" }, "peerDependencies": { "eslint": "*", @@ -7991,24 +8057,23 @@ } }, "node_modules/eslint-mdx": { - "version": "3.1.5", + "version": "3.6.2", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "espree": "^9.6.1", + "espree": "^9.6.1 || ^10.4.0", "estree-util-visit": "^2.0.0", - "remark-mdx": "^3.0.0", + "remark-mdx": "^3.1.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", - "synckit": "^0.9.0", - "tslib": "^2.6.2", - "unified": "^11.0.4", - "unified-engine": "^11.2.0", + "synckit": "^0.11.8", + "unified": "^11.0.5", + "unified-engine": "^11.2.2", "unist-util-visit": "^5.0.0", "uvu": "^0.5.6", - "vfile": "^6.0.1" + "vfile": "^6.0.3" }, "engines": { "node": ">=18.0.0" @@ -8018,38 +8083,17 @@ "url": "https://opencollective.com/unified" }, "peerDependencies": { - "eslint": ">=8.0.0" - } - }, - "node_modules/eslint-mdx/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-mdx/node_modules/espree": { - "version": "9.6.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "eslint": ">=8.0.0", + "remark-lint-file-extension": "*" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "remark-lint-file-extension": { + "optional": true + } } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", + "version": "2.12.1", "license": "MIT", "dependencies": { "debug": "^3.2.7" @@ -8071,7 +8115,7 @@ } }, "node_modules/eslint-plugin-chai-friendly": { - "version": "1.0.1", + "version": "1.1.0", "license": "MIT", "peer": true, "engines": { @@ -8118,27 +8162,27 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", + "version": "2.32.0", "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -8156,7 +8200,7 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "28.10.0", + "version": "28.14.0", "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -8189,21 +8233,20 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.6.1", + "version": "50.8.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.49.0", + "@es-joy/jsdoccomment": "~0.50.2", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.3.6", + "debug": "^4.4.1", "escape-string-regexp": "^4.0.0", - "espree": "^10.1.0", + "espree": "^10.3.0", "esquery": "^1.6.0", - "parse-imports": "^2.1.1", - "semver": "^7.6.3", - "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.1" + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.2", + "spdx-expression-parse": "^4.0.0" }, "engines": { "node": ">=18" @@ -8213,7 +8256,7 @@ } }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -8262,18 +8305,20 @@ "license": "MIT" }, "node_modules/eslint-plugin-mdx": { - "version": "3.1.5", + "version": "3.6.2", "dev": true, "license": "MIT", "dependencies": { - "eslint-mdx": "^3.1.5", - "eslint-plugin-markdown": "^3.0.1", - "remark-mdx": "^3.0.0", + "eslint-mdx": "^3.6.2", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0", + "remark-mdx": "^3.1.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", - "tslib": "^2.6.2", - "unified": "^11.0.4", - "vfile": "^6.0.1" + "synckit": "^0.11.8", + "unified": "^11.0.5", + "vfile": "^6.0.3" }, "engines": { "node": ">=18.0.0" @@ -8286,173 +8331,6 @@ "eslint": ">=8.0.0" } }, - "node_modules/eslint-plugin-mdx/node_modules/@types/mdast": { - "version": "3.0.15", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/@types/unist": { - "version": "2.0.11", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-plugin-mdx/node_modules/character-entities": { - "version": "1.2.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/character-entities-legacy": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/character-reference-invalid": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/eslint-plugin-markdown": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^0.8.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/is-alphabetical": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/is-alphanumerical": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/is-decimal": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/is-hexadecimal": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-to-string": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark": { - "version": "2.11.4", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/parse-entities": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/eslint-plugin-playwright": { "version": "1.8.3", "license": "MIT", @@ -8502,11 +8380,11 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", + "version": "5.5.4", "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "synckit": "^0.11.7" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -8517,7 +8395,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -8530,26 +8408,26 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.2", + "version": "7.37.5", "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", + "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.1.0", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", + "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", + "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "engines": { @@ -8560,7 +8438,7 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0", + "version": "5.2.0", "license": "MIT", "engines": { "node": ">=10" @@ -8592,7 +8470,7 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "7.1.1", + "version": "7.13.3", "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "^8.15.0", @@ -8607,7 +8485,7 @@ } }, "node_modules/eslint-plugin-wdio": { - "version": "9.4.4", + "version": "9.16.2", "license": "MIT", "peer": true, "engines": { @@ -8616,8 +8494,6 @@ }, "node_modules/eslint-plugin-workspaces": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-workspaces/-/eslint-plugin-workspaces-0.11.0.tgz", - "integrity": "sha512-1Ol5QoV+IDBt/YiGCAXWKccKI3AAUSQUmaz0cw0at/MjgEPHvCQAkrv5U2p0C3YInd4sOfBzmyumhWFl6n6INQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8642,8 +8518,29 @@ "node": ">=10" } }, + "node_modules/eslint/node_modules/@eslint/core": { + "version": "0.16.0", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint/node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.2.0", + "version": "8.4.0", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -8657,7 +8554,7 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", + "version": "4.2.1", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8737,12 +8634,12 @@ } }, "node_modules/espree": { - "version": "10.3.0", + "version": "10.4.0", "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8752,7 +8649,7 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", + "version": "4.2.1", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8880,10 +8777,10 @@ } }, "node_modules/estree-util-to-js/node_modules/source-map": { - "version": "0.7.4", + "version": "0.7.6", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/estree-util-visit": { @@ -8952,17 +8849,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/exit": { "version": "0.1.2", "devOptional": true, @@ -9117,14 +9003,14 @@ "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.3.2", + "version": "3.3.3", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -9144,8 +9030,18 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.3", + "version": "3.1.0", "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { @@ -9157,7 +9053,7 @@ } }, "node_modules/fastq": { - "version": "1.17.1", + "version": "1.19.1", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -9183,6 +9079,22 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "license": "MIT", @@ -9287,22 +9199,28 @@ } }, "node_modules/flatted": { - "version": "3.3.2", + "version": "3.3.3", "license": "ISC" }, "node_modules/for-each": { - "version": "0.3.3", + "version": "0.3.5", "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { - "version": "3.3.0", + "version": "3.3.1", "dev": true, "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -9362,7 +9280,7 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.6", + "version": "1.1.0", "dev": true, "license": "Unlicense" }, @@ -9427,6 +9345,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "license": "MIT", @@ -9443,7 +9368,7 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", + "version": "1.4.0", "dev": true, "license": "MIT", "engines": { @@ -9454,19 +9379,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.6", + "version": "1.3.0", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "dunder-proto": "^1.0.0", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "math-intrinsics": "^1.0.0" + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9483,6 +9408,17 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stdin": { "version": "6.0.0", "dev": true, @@ -9492,14 +9428,14 @@ } }, "node_modules/get-stream": { - "version": "4.1.0", + "version": "8.0.1", "dev": true, "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { @@ -9518,7 +9454,7 @@ } }, "node_modules/get-tsconfig": { - "version": "4.8.1", + "version": "4.12.0", "dev": true, "license": "MIT", "dependencies": { @@ -9562,13 +9498,28 @@ "node": ">= 6" } }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "devOptional": true, "license": "BSD-2-Clause" }, "node_modules/globals": { - "version": "15.14.0", + "version": "15.15.0", "license": "MIT", "engines": { "node": ">=18" @@ -9719,7 +9670,7 @@ } }, "node_modules/hast-util-to-estree": { - "version": "3.1.0", + "version": "3.1.3", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -9733,9 +9684,9 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" }, @@ -9744,19 +9695,8 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-estree/node_modules/inline-style-parser": { - "version": "0.1.1", - "license": "MIT" - }, - "node_modules/hast-util-to-estree/node_modules/style-to-object": { - "version": "0.4.4", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.2", + "version": "2.3.6", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -9769,9 +9709,9 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" }, @@ -9819,11 +9759,11 @@ "license": "ISC" }, "node_modules/html-dom-parser": { - "version": "5.0.12", + "version": "5.1.1", "license": "MIT", "dependencies": { "domhandler": "5.0.3", - "htmlparser2": "9.1.0" + "htmlparser2": "10.0.0" } }, "node_modules/html-encoding-sniffer": { @@ -9843,13 +9783,13 @@ "license": "MIT" }, "node_modules/html-react-parser": { - "version": "5.2.1", + "version": "5.2.7", "license": "MIT", "dependencies": { "domhandler": "5.0.3", - "html-dom-parser": "5.0.12", + "html-dom-parser": "5.1.1", "react-property": "2.0.2", - "style-to-js": "1.1.16" + "style-to-js": "1.1.18" }, "peerDependencies": { "@types/react": "0.14 || 15 || 16 || 17 || 18 || 19", @@ -9862,7 +9802,7 @@ } }, "node_modules/htmlparser2": { - "version": "9.1.0", + "version": "10.0.0", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -9874,8 +9814,18 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-errors": { @@ -9973,8 +9923,16 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.1.3", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { - "version": "3.3.0", + "version": "3.3.1", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -10024,7 +9982,7 @@ } }, "node_modules/import-meta-resolve": { - "version": "4.1.0", + "version": "4.2.0", "dev": true, "license": "MIT", "funding": { @@ -10040,11 +9998,14 @@ } }, "node_modules/indent-string": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/inflight": { @@ -10061,8 +10022,12 @@ "license": "ISC" }, "node_modules/ini": { - "version": "1.3.8", - "license": "ISC" + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, "node_modules/inline-style-parser": { "version": "0.2.4", @@ -10081,7 +10046,7 @@ } }, "node_modules/interpret": { - "version": "2.2.0", + "version": "1.4.0", "dev": true, "license": "MIT", "engines": { @@ -10136,10 +10101,14 @@ "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.0.0", + "version": "2.1.1", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -10174,10 +10143,10 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.1", + "version": "1.2.2", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -10188,15 +10157,15 @@ } }, "node_modules/is-bun-module": { - "version": "1.3.0", + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.6.3" + "semver": "^7.7.1" } }, "node_modules/is-bun-module/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -10217,7 +10186,7 @@ } }, "node_modules/is-core-module": { - "version": "2.16.0", + "version": "2.16.1", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -10324,10 +10293,14 @@ } }, "node_modules/is-generator-function": { - "version": "1.0.10", + "version": "1.1.2", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "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" }, "engines": { "node": ">= 0.4" @@ -10408,6 +10381,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-port-reachable": { "version": "4.0.0", "license": "MIT", @@ -10539,10 +10520,10 @@ } }, "node_modules/is-weakref": { - "version": "1.1.0", + "version": "1.1.1", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -10642,7 +10623,7 @@ } }, "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "devOptional": true, "license": "ISC", "bin": { @@ -10666,7 +10647,7 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", + "version": "3.2.0", "devOptional": true, "license": "BSD-3-Clause", "dependencies": { @@ -10678,14 +10659,14 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.4", + "version": "1.1.5", "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", "has-symbols": "^1.1.0", - "reflect.getprototypeof": "^1.0.8", "set-function-name": "^2.0.2" }, "engines": { @@ -12543,14 +12524,6 @@ "node": ">=8" } }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "8.1.1", "devOptional": true, @@ -12771,7 +12744,7 @@ "license": "MIT" }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "devOptional": true, "license": "ISC", "bin": { @@ -13095,7 +13068,7 @@ } }, "node_modules/jsdoc": { - "version": "4.0.4", + "version": "4.0.5", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13298,7 +13271,7 @@ } }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -13322,11 +13295,11 @@ } }, "node_modules/jwa": { - "version": "1.4.1", + "version": "1.4.2", "dev": true, "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } @@ -13429,20 +13402,20 @@ } }, "node_modules/lint-staged": { - "version": "15.2.11", + "version": "15.5.2", "dev": true, "license": "MIT", "dependencies": { - "chalk": "~5.3.0", - "commander": "~12.1.0", - "debug": "~4.4.0", - "execa": "~8.0.1", - "lilconfig": "~3.1.3", - "listr2": "~8.2.5", - "micromatch": "~4.0.8", - "pidtree": "~0.6.0", - "string-argv": "~0.3.2", - "yaml": "~2.6.1" + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -13455,7 +13428,7 @@ } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.3.0", + "version": "5.6.2", "dev": true, "license": "MIT", "engines": { @@ -13466,7 +13439,7 @@ } }, "node_modules/lint-staged/node_modules/commander": { - "version": "12.1.0", + "version": "13.1.0", "dev": true, "license": "MIT", "engines": { @@ -13474,7 +13447,7 @@ } }, "node_modules/listr2": { - "version": "8.2.5", + "version": "8.3.3", "dev": true, "license": "MIT", "dependencies": { @@ -13523,6 +13496,14 @@ "node": ">=4" } }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/load-plugin": { "version": "6.0.3", "dev": true, @@ -13537,11 +13518,15 @@ } }, "node_modules/loader-runner": { - "version": "4.3.0", + "version": "4.3.1", "devOptional": true, "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/locate-path": { @@ -13647,7 +13632,7 @@ } }, "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", + "version": "6.2.3", "dev": true, "license": "MIT", "engines": { @@ -13658,11 +13643,11 @@ } }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", + "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.0.0" + "get-east-asian-width": "^1.3.1" }, "engines": { "node": ">=18" @@ -13672,7 +13657,7 @@ } }, "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", + "version": "7.1.2", "dev": true, "license": "MIT", "dependencies": { @@ -13721,11 +13706,11 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", + "version": "0.30.19", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-dir": { @@ -13829,7 +13814,7 @@ } }, "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", + "version": "3.0.2", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -13903,7 +13888,7 @@ } }, "node_modules/mdast-util-gfm": { - "version": "3.0.0", + "version": "3.1.0", "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", @@ -13935,7 +13920,7 @@ } }, "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", + "version": "2.1.0", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -14023,7 +14008,7 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.3", + "version": "3.2.0", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -14134,91 +14119,50 @@ } }, "node_modules/memfs": { - "version": "4.15.0", + "version": "4.49.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/streamich" } }, - "node_modules/memfs-or-file-map-to-github-branch": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/rest": "*" - } - }, - "node_modules/meow": { - "version": "10.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/indent-string": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/redent": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/strip-indent": { - "version": "4.0.0", + "node_modules/memfs-or-file-map-to-github-branch": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/rest": "*" + } + }, + "node_modules/meow": { + "version": "10.1.5", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.1" + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14250,7 +14194,7 @@ } }, "node_modules/micromark": { - "version": "4.0.1", + "version": "4.0.2", "funding": [ { "type": "GitHub Sponsors", @@ -14283,7 +14227,7 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.2", + "version": "2.0.3", "funding": [ { "type": "GitHub Sponsors", @@ -14396,7 +14340,7 @@ } }, "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", + "version": "2.1.1", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -14437,7 +14381,7 @@ } }, "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.0", + "version": "3.0.1", "funding": [ { "type": "GitHub Sponsors", @@ -14461,10 +14405,9 @@ } }, "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.1", + "version": "3.0.2", "license": "MIT", "dependencies": { - "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", @@ -14569,7 +14512,7 @@ } }, "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.2", + "version": "2.0.3", "funding": [ { "type": "GitHub Sponsors", @@ -14775,7 +14718,7 @@ "license": "MIT" }, "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.2", + "version": "2.0.3", "funding": [ { "type": "GitHub Sponsors", @@ -14788,7 +14731,6 @@ ], "license": "MIT", "dependencies": { - "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", @@ -14866,7 +14808,7 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.3", + "version": "2.1.0", "funding": [ { "type": "GitHub Sponsors", @@ -14900,7 +14842,7 @@ "license": "MIT" }, "node_modules/micromark-util-types": { - "version": "2.0.1", + "version": "2.0.2", "funding": [ { "type": "GitHub Sponsors", @@ -14934,6 +14876,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -14982,7 +14934,7 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", + "version": "2.9.4", "dev": true, "license": "MIT", "dependencies": { @@ -15050,14 +15002,14 @@ } }, "node_modules/mlly": { - "version": "1.7.3", + "version": "1.8.0", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.14.0", - "pathe": "^1.1.2", - "pkg-types": "^1.2.1", - "ufo": "^1.5.4" + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" } }, "node_modules/mri": { @@ -15073,7 +15025,7 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.8", + "version": "3.3.11", "funding": [ { "type": "github", @@ -15088,6 +15040,20 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "license": "MIT" @@ -15105,10 +15071,10 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.5.4", + "version": "15.5.6", "license": "MIT", "dependencies": { - "@next/env": "15.5.4", + "@next/env": "15.5.6", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -15121,14 +15087,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.4", - "@next/swc-darwin-x64": "15.5.4", - "@next/swc-linux-arm64-gnu": "15.5.4", - "@next/swc-linux-arm64-musl": "15.5.4", - "@next/swc-linux-x64-gnu": "15.5.4", - "@next/swc-linux-x64-musl": "15.5.4", - "@next/swc-win32-arm64-msvc": "15.5.4", - "@next/swc-win32-x64-msvc": "15.5.4", + "@next/swc-darwin-arm64": "15.5.6", + "@next/swc-darwin-x64": "15.5.6", + "@next/swc-linux-arm64-gnu": "15.5.6", + "@next/swc-linux-arm64-musl": "15.5.6", + "@next/swc-linux-x64-gnu": "15.5.6", + "@next/swc-linux-x64-musl": "15.5.6", + "@next/swc-win32-arm64-msvc": "15.5.6", + "@next/swc-win32-x64-msvc": "15.5.6", "sharp": "^0.34.3" }, "peerDependencies": { @@ -15215,7 +15181,7 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", + "version": "2.0.26", "license": "MIT" }, "node_modules/nopt": { @@ -15247,7 +15213,7 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -15277,7 +15243,7 @@ } }, "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -15326,7 +15292,7 @@ "license": "ISC" }, "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -15351,7 +15317,7 @@ } }, "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.6.3", + "version": "7.7.3", "dev": true, "license": "ISC", "bin": { @@ -15387,7 +15353,7 @@ } }, "node_modules/nwsapi": { - "version": "2.2.16", + "version": "2.2.22", "dev": true, "license": "MIT" }, @@ -15399,7 +15365,7 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", + "version": "1.13.4", "license": "MIT", "engines": { "node": ">= 0.4" @@ -15434,12 +15400,13 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", + "version": "1.1.9", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -15548,6 +15515,21 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/own-keys": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-finally": { "version": "1.0.0", "dev": true, @@ -15641,16 +15623,12 @@ "node": ">= 0.10" } }, - "node_modules/parse-imports": { - "version": "2.2.1", + "node_modules/parse-imports-exports": { + "version": "0.2.4", "dev": true, - "license": "Apache-2.0 AND MIT", + "license": "MIT", "dependencies": { - "es-module-lexer": "^1.5.3", - "slashes": "^3.0.12" - }, - "engines": { - "node": ">= 18" + "parse-statements": "1.0.11" } }, "node_modules/parse-json": { @@ -15678,17 +15656,33 @@ "xtend": "~4.0.1" } }, + "node_modules/parse-statements": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, "node_modules/parse5": { - "version": "7.2.1", + "version": "7.3.0", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "license": "MIT", @@ -15785,7 +15779,7 @@ } }, "node_modules/pathe": { - "version": "1.1.2", + "version": "2.0.3", "dev": true, "license": "MIT" }, @@ -15794,7 +15788,7 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", + "version": "4.0.3", "dev": true, "license": "MIT", "engines": { @@ -15829,7 +15823,7 @@ "license": "MIT" }, "node_modules/pirates": { - "version": "4.0.6", + "version": "4.0.7", "devOptional": true, "license": "MIT", "engines": { @@ -15916,7 +15910,7 @@ } }, "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.1.1", + "version": "1.2.1", "dev": true, "license": "MIT", "engines": { @@ -15927,20 +15921,20 @@ } }, "node_modules/pkg-types": { - "version": "1.2.1", + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { "confbox": "^0.1.8", - "mlly": "^1.7.2", - "pathe": "^1.1.2" + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, "node_modules/playwright": { - "version": "1.55.1", + "version": "1.56.1", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.1" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -15953,7 +15947,7 @@ } }, "node_modules/playwright-core": { - "version": "1.55.1", + "version": "1.56.1", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -15974,14 +15968,14 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", + "version": "1.1.0", "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.49", + "version": "8.5.6", "dev": true, "funding": [ { @@ -15999,7 +15993,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -16063,7 +16057,7 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.0.0", + "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { @@ -16087,7 +16081,7 @@ } }, "node_modules/prettier": { - "version": "3.4.2", + "version": "3.6.2", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -16207,7 +16201,7 @@ "license": "MIT" }, "node_modules/property-information": { - "version": "6.5.0", + "version": "7.1.0", "license": "MIT", "funding": { "type": "github", @@ -16225,6 +16219,10 @@ "node": ">= 0.10" } }, + "node_modules/proxy-compare": { + "version": "3.0.1", + "license": "MIT" + }, "node_modules/psl": { "version": "1.15.0", "dev": true, @@ -16364,6 +16362,10 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "license": "MIT", @@ -16402,6 +16404,27 @@ "version": "2.0.2", "license": "MIT" }, + "node_modules/react-redux": { + "version": "9.2.0", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/read-package-json-fast": { "version": "3.0.2", "dev": true, @@ -16558,11 +16581,10 @@ } }, "node_modules/rechoir": { - "version": "0.7.1", + "version": "0.6.2", "dev": true, - "license": "MIT", "dependencies": { - "resolve": "^1.9.0" + "resolve": "^1.1.6" }, "engines": { "node": ">= 0.10" @@ -16582,7 +16604,7 @@ } }, "node_modules/recma-jsx": { - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "dependencies": { "acorn-jsx": "^5.0.0", @@ -16594,6 +16616,9 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/recma-parse": { @@ -16625,28 +16650,42 @@ } }, "node_modules/redent": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.9", + "version": "1.0.10", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "dunder-proto": "^1.0.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" }, "engines": { @@ -16661,7 +16700,7 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", + "version": "10.2.2", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -16675,20 +16714,15 @@ "dev": true, "license": "MIT" }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", + "version": "1.5.4", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { @@ -16699,15 +16733,15 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", + "version": "6.4.0", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -16736,25 +16770,15 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", + "version": "0.13.0", "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/rehype-recma": { "version": "1.0.0", "license": "MIT", @@ -16769,7 +16793,7 @@ } }, "node_modules/remark-gfm": { - "version": "4.0.0", + "version": "4.0.1", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -16785,7 +16809,7 @@ } }, "node_modules/remark-mdx": { - "version": "3.1.0", + "version": "3.1.1", "license": "MIT", "dependencies": { "mdast-util-mdx": "^3.0.0", @@ -16811,7 +16835,7 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.1", + "version": "11.1.2", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -16866,11 +16890,15 @@ "lodash": "^4.17.21" } }, + "node_modules/reselect": { + "version": "5.1.1", + "license": "MIT" + }, "node_modules/resolve": { - "version": "1.22.10", + "version": "1.22.11", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -16957,7 +16985,7 @@ } }, "node_modules/reusify": { - "version": "1.0.4", + "version": "1.1.0", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -16987,22 +17015,14 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/rimraf/node_modules/glob": { - "version": "11.0.0", + "version": "11.0.3", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" @@ -17018,7 +17038,7 @@ } }, "node_modules/rimraf/node_modules/jackspeak": { - "version": "4.0.2", + "version": "4.1.1", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -17032,7 +17052,7 @@ } }, "node_modules/rimraf/node_modules/lru-cache": { - "version": "11.0.2", + "version": "11.2.2", "dev": true, "license": "ISC", "engines": { @@ -17040,11 +17060,11 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "10.0.1", + "version": "10.0.3", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { "node": "20 || >=22" @@ -17176,14 +17196,6 @@ "dev": true, "license": "MIT" }, - "node_modules/rollup-plugin-copy/node_modules/is-plain-object": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "funding": [ @@ -17251,6 +17263,20 @@ ], "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { "version": "1.1.0", "license": "MIT", @@ -17294,7 +17320,7 @@ } }, "node_modules/schema-utils": { - "version": "4.3.0", + "version": "4.3.3", "devOptional": true, "license": "MIT", "dependencies": { @@ -17389,16 +17415,6 @@ "node": ">= 0.8" } }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "devOptional": true, @@ -17541,14 +17557,26 @@ "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.2", + "node_modules/set-function-name": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", + "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -17611,7 +17639,7 @@ } }, "node_modules/sharp/node_modules/semver": { - "version": "7.7.2", + "version": "7.7.3", "license": "ISC", "optional": true, "bin": { @@ -17687,12 +17715,15 @@ "node": ">=6" } }, - "node_modules/shelljs/node_modules/interpret": { - "version": "1.4.0", + "node_modules/shelljs/node_modules/get-stream": { + "version": "4.1.0", "dev": true, "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">= 0.10" + "node": ">=6" } }, "node_modules/shelljs/node_modules/is-stream": { @@ -17722,16 +17753,6 @@ "node": ">=4" } }, - "node_modules/shelljs/node_modules/rechoir": { - "version": "0.6.2", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/shelljs/node_modules/semver": { "version": "5.7.2", "dev": true, @@ -17878,11 +17899,6 @@ "node": ">=6" } }, - "node_modules/slashes": { - "version": "3.0.12", - "dev": true, - "license": "ISC" - }, "node_modules/slice-ansi": { "version": "5.0.0", "dev": true, @@ -17899,7 +17915,7 @@ } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", + "version": "6.2.3", "dev": true, "license": "MIT", "engines": { @@ -17929,6 +17945,36 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-loader": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "devOptional": true, @@ -17979,7 +18025,7 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", + "version": "3.0.22", "dev": true, "license": "CC0-1.0" }, @@ -17989,7 +18035,7 @@ "license": "BSD-3-Clause" }, "node_modules/stable-hash": { - "version": "0.0.4", + "version": "0.0.5", "dev": true, "license": "MIT" }, @@ -18019,6 +18065,17 @@ "node": ">= 0.8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "dev": true, @@ -18236,7 +18293,7 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", + "version": "7.1.2", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -18269,10 +18326,11 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", + "version": "4.0.0", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-eof": { @@ -18295,14 +18353,14 @@ } }, "node_modules/strip-indent": { - "version": "3.0.0", + "version": "4.1.1", "dev": true, "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -18331,14 +18389,14 @@ } }, "node_modules/style-to-js": { - "version": "1.1.16", + "version": "1.1.18", "license": "MIT", "dependencies": { - "style-to-object": "1.0.8" + "style-to-object": "1.0.11" } }, "node_modules/style-to-object": { - "version": "1.0.8", + "version": "1.0.11", "license": "MIT", "dependencies": { "inline-style-parser": "0.2.4" @@ -18430,34 +18488,37 @@ "license": "MIT" }, "node_modules/synckit": { - "version": "0.9.2", + "version": "0.11.11", "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@pkgr/core": "^0.2.9" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" } }, "node_modules/tapable": { - "version": "2.2.1", + "version": "2.3.0", "devOptional": true, "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { - "version": "5.37.0", + "version": "5.44.0", "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -18469,7 +18530,7 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.11", + "version": "5.3.14", "devOptional": true, "license": "MIT", "dependencies": { @@ -18520,16 +18581,35 @@ } }, "node_modules/thingies": { - "version": "1.21.0", + "version": "2.5.0", "dev": true, - "license": "Unlicense", + "license": "MIT", "engines": { "node": ">=10.18" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, "peerDependencies": { "tslib": "^2" } }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/tmpl": { "version": "1.0.5", "devOptional": true, @@ -18581,8 +18661,6 @@ }, "node_modules/transform-markdown-links": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/transform-markdown-links/-/transform-markdown-links-2.1.0.tgz", - "integrity": "sha512-7HWQwQ9US+tJSMMzi1aP+KA3QwfjDs8sB4H5GBMRHFNBMQVdgoF6VfIFy2nJR/UHRTkYoGFwWh2pe+QIwSvfOA==", "dev": true, "license": "MIT", "engines": { @@ -18590,7 +18668,7 @@ } }, "node_modules/tree-dump": { - "version": "1.0.2", + "version": "1.1.0", "dev": true, "license": "Apache-2.0", "engines": { @@ -18632,13 +18710,51 @@ } }, "node_modules/ts-api-utils": { - "version": "1.4.3", + "version": "2.1.0", "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-loader": { + "version": "9.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.7.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.6", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" } }, "node_modules/tsconfig-paths": { @@ -18661,14 +18777,19 @@ "json5": "lib/cli.js" } }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "2.8.1", "license": "0BSD" }, "node_modules/turndown": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.1.tgz", - "integrity": "sha512-7YiPJw6rLClQL3oUKN3KgMaXeJJ2lAyZItclgKDurqnH61so4k4IH/qwmMva0zpuJc/FhRExBBnk7EbeFANlgQ==", "license": "MIT", "dependencies": { "@mixmark-io/domino": "^2.2.0" @@ -18794,7 +18915,7 @@ } }, "node_modules/typescript": { - "version": "5.7.2", + "version": "5.9.3", "license": "Apache-2.0", "peer": true, "bin": { @@ -18811,7 +18932,7 @@ "license": "MIT" }, "node_modules/ufo": { - "version": "1.5.4", + "version": "1.6.1", "dev": true, "license": "MIT" }, @@ -18837,7 +18958,7 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "6.20.0", + "version": "7.16.0", "devOptional": true, "license": "MIT" }, @@ -18860,14 +18981,14 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", + "version": "2.2.1", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", + "version": "2.2.0", "license": "MIT", "engines": { "node": ">=4" @@ -18922,6 +19043,14 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unified-engine/node_modules/@types/node": { + "version": "22.18.12", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/unified-engine/node_modules/brace-expansion": { "version": "2.0.2", "dev": true, @@ -19027,6 +19156,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unified-engine/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, "node_modules/unified/node_modules/is-plain-obj": { "version": "4.1.0", "license": "MIT", @@ -19038,7 +19172,7 @@ } }, "node_modules/unionfs": { - "version": "4.5.4", + "version": "4.6.0", "dev": true, "dependencies": { "fs-monkey": "^1.0.0" @@ -19057,7 +19191,7 @@ } }, "node_modules/unist-util-is": { - "version": "6.0.0", + "version": "6.0.1", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -19114,7 +19248,7 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", + "version": "6.0.2", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -19127,8 +19261,6 @@ }, "node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "dev": true, "license": "ISC" }, @@ -19147,8 +19279,41 @@ "node": ">= 0.8" } }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.1", + "version": "1.1.3", "funding": [ { "type": "opencollective", @@ -19166,7 +19331,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -19199,6 +19364,13 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "dev": true, @@ -19275,6 +19447,28 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/valtio": { + "version": "2.1.8", + "license": "MIT", + "dependencies": { + "proxy-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "react": ">=18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/vary": { "version": "1.1.2", "license": "MIT", @@ -19295,7 +19489,7 @@ } }, "node_modules/vfile-message": { - "version": "4.0.2", + "version": "4.0.3", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -19403,7 +19597,7 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", + "version": "2.4.4", "devOptional": true, "license": "MIT", "dependencies": { @@ -19436,19 +19630,21 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.97.1", + "version": "5.102.1", "devOptional": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@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.14.0", - "browserslist": "^4.24.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -19458,11 +19654,11 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -19534,6 +19730,25 @@ "node": ">= 10" } }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -19556,7 +19771,7 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", + "version": "3.3.3", "devOptional": true, "license": "MIT", "engines": { @@ -19590,23 +19805,6 @@ "node": ">= 4.0.0" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/whatwg-encoding": { "version": "2.0.0", "dev": true, @@ -19718,13 +19916,14 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.18", + "version": "1.1.19", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, @@ -19780,7 +19979,7 @@ } }, "node_modules/wrap-ansi": { - "version": "9.0.0", + "version": "9.0.2", "dev": true, "license": "MIT", "dependencies": { @@ -19858,7 +20057,7 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", + "version": "6.2.3", "dev": true, "license": "MIT", "engines": { @@ -19890,7 +20089,7 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.0", + "version": "8.18.3", "dev": true, "license": "MIT", "engines": { @@ -19953,14 +20152,14 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.6.1", + "version": "2.8.1", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yargs": { @@ -20283,10 +20482,23 @@ "name": "web-toggle-point-automation-tests", "version": "0.1.4", "devDependencies": { - "@playwright/test": "^1.49.0", + "@playwright/test": "^1.56.0", "@types/node": "^22.9.1", "path-exists-cli": "^2.0.0" } + }, + "test/automation/node_modules/@types/node": { + "version": "22.18.12", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "test/automation/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" } } } diff --git a/package.json b/package.json index 7ceab75..52829d1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@asos/web-toggle-point", - "version": "0.13.0", + "version": "0.13.1", "repository": "git@github.com:asos/web-toggle-point.git", "homepage": "https://asos.github.io/web-toggle-point/", "license": "MIT", @@ -41,7 +41,7 @@ "core-js": "^3.0.0", "cross-env": "^7.0.3", "danger": "^13.0.3", - "eslint": "^9.15.0", + "eslint": "^9.38.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^28.9.0", "eslint-plugin-jest-formatting": "^3.1.0", diff --git a/packages/features/docs/CHANGELOG.md b/packages/features/docs/CHANGELOG.md index f7baa9e..b0efa1d 100644 --- a/packages/features/docs/CHANGELOG.md +++ b/packages/features/docs/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.5.1] - 2025-11-14 + +### Fixed + +- convert deprecated `unstable_config_lookup_from_file` eslint flag to `v10_config_lookup_from_file` now that [its stable](https://eslint.org/docs/latest/flags/#active-flags) awaiting next major version + ## [0.5.0] - 2025-10-20 ### Changed diff --git a/packages/features/package.json b/packages/features/package.json index 8496603..087fb41 100644 --- a/packages/features/package.json +++ b/packages/features/package.json @@ -1,7 +1,7 @@ { "name": "@asos/web-toggle-point-features", "description": "toggle point features code, used to store toggle state", - "version": "0.5.0", + "version": "0.5.1", "license": "MIT", "type": "module", "main": "./lib/global.js", @@ -49,7 +49,7 @@ "clean": "rimraf ./lib", "docs": "rimraf ./docs/**/*.html && jsdoc -c ../jsdoc.conf.js", "prelint": "npm run build-dependencies", - "lint": "eslint build src docs --flag unstable_config_lookup_from_file", + "lint": "eslint build src docs --flag v10_config_lookup_from_file", "lint:fix": "npm run lint -- --fix", "pretest": "npm run build-dependencies", "test": "jest" diff --git a/packages/react-pointcuts/docs/CHANGELOG.md b/packages/react-pointcuts/docs/CHANGELOG.md index d6c3303..f79abb4 100644 --- a/packages/react-pointcuts/docs/CHANGELOG.md +++ b/packages/react-pointcuts/docs/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.5.1] - 2025-11-14 + +### Fixed + +- convert deprecated `unstable_config_lookup_from_file` eslint flag to `v10_config_lookup_from_file` now that [its stable](https://eslint.org/docs/latest/flags/#active-flags) awaiting next major version +- reverted errant linebreak + ## [0.5.0] - 2025-09-30 ### Changed diff --git a/packages/react-pointcuts/package.json b/packages/react-pointcuts/package.json index b331adb..0624330 100644 --- a/packages/react-pointcuts/package.json +++ b/packages/react-pointcuts/package.json @@ -1,7 +1,7 @@ { "name": "@asos/web-toggle-point-react-pointcuts", "description": "react pointcut code", - "version": "0.5.0", + "version": "0.5.1", "license": "MIT", "type": "module", "main": "./lib/main.es5.cjs", @@ -41,7 +41,7 @@ "postpublish": "shx rm ./README.md LICENSE", "clean": "rimraf ./lib", "docs": "rimraf ./docs/**/*.html && jsdoc -c ../jsdoc.conf.js", - "lint": "eslint build src docs --flag unstable_config_lookup_from_file", + "lint": "eslint build src docs --flag v10_config_lookup_from_file", "lint:fix": "npm run lint -- --fix", "test": "jest" }, diff --git a/packages/react-pointcuts/src/withToggledHookFactory/index.js b/packages/react-pointcuts/src/withToggledHookFactory/index.js index 69e417b..0900441 100644 --- a/packages/react-pointcuts/src/withToggledHookFactory/index.js +++ b/packages/react-pointcuts/src/withToggledHookFactory/index.js @@ -3,8 +3,7 @@ import pluginsHookFactory from "./pluginsHookFactory"; import getHooksFromPlugins from "../getHooksFromPlugins"; // eslint-disable-next-line prettier/prettier, no-empty -- https://github.com/babel/babel/issues/15156 -{ -} +{} /** * A factory function used to create a withToggledHook React hook, wrapping an existing hook/function. * @memberof module:web-toggle-point-react-pointcuts diff --git a/packages/ssr/docs/CHANGELOG.md b/packages/ssr/docs/CHANGELOG.md index a6dc120..f944019 100644 --- a/packages/ssr/docs/CHANGELOG.md +++ b/packages/ssr/docs/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.2.7] - 2025-11-14 + +### Fixed + +- convert deprecated `unstable_config_lookup_from_file` eslint flag to `v10_config_lookup_from_file` now that [its stable](https://eslint.org/docs/latest/flags/#active-flags) awaiting next major version + ## [0.2.6] - 2025-09-30 ### Fixed diff --git a/packages/ssr/package.json b/packages/ssr/package.json index 2d4ef2e..0e023a9 100644 --- a/packages/ssr/package.json +++ b/packages/ssr/package.json @@ -1,7 +1,7 @@ { "name": "@asos/web-toggle-point-ssr", "description": "toggle point server side rendering code", - "version": "0.2.6", + "version": "0.2.7", "license": "MIT", "type": "module", "main": "./lib/main.es5.cjs", @@ -43,7 +43,7 @@ "postpublish": "shx rm ./README.md LICENSE", "clean": "rimraf ./lib", "docs": "rimraf ./docs/**/*.html && jsdoc -c ../jsdoc.conf.js", - "lint": "eslint build src docs --flag unstable_config_lookup_from_file", + "lint": "eslint build src docs --flag v10_config_lookup_from_file", "lint:fix": "npm run lint -- --fix", "test": "jest" }, diff --git a/packages/webpack/docs/CHANGELOG.md b/packages/webpack/docs/CHANGELOG.md index f33559a..4675b45 100644 --- a/packages/webpack/docs/CHANGELOG.md +++ b/packages/webpack/docs/CHANGELOG.md @@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.9.2] - 2025-11-14 + +### Fixed + +- updated the documentation to align with move to `variantPathMap`, missed in [version 0.9.0](#090---2025-10-21) + +## [0.9.1] - 2025-10-21 + +### Fixed + +- convert deprecated `unstable_config_lookup_from_file` eslint flag to `v10_config_lookup_from_file` now that [its stable](https://eslint.org/docs/latest/flags/#active-flags) awaiting next major version + ## [0.9.0] - 2025-10-21 ### Changed diff --git a/packages/webpack/docs/README.md b/packages/webpack/docs/README.md index 1a32ee0..1a75e68 100644 --- a/packages/webpack/docs/README.md +++ b/packages/webpack/docs/README.md @@ -99,7 +99,7 @@ If not supplied, a default `glob` of `/**/__variants__/*/*/!(*.test).{js,jsx,ts, #### _`toggleHandler`_ -This module unpicks the [WebPack context module](https://webpack.js.org/guides/dependency-management/#context-module-api) produced by enacting the configured `variantGlobs` and converts it into a form suitable for the configured `togglePoint`. +This module unpicks a `variantPathMap` (a [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) of full paths to [module namespace objects](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import#module_namespace_object)) produced by enacting the configured `variantGlobs` and converts it into a form suitable for the configured `togglePoint`. If not supplied, a default handler (`@asos/web-toggle-point-webpack/pathSegmentToggleHandler`) is used, compatible with the default `variantGlobs`, that converts the matched paths into a tree data structure held in a `Map`, with each path segment as a node in the tree, and the variant modules as the leaf nodes. @@ -176,9 +176,9 @@ const plugin = new TogglePointInjection({ ...the plugin inject a proxy module with the id `toggle:/join-points:/src/modules/myModule.js` into the compilation, to which all requests for `/src/modules/myModule.js` will be redirected.[^4] -That proxy module will, in turn, import a module with id `toggle:/point-cuts:/my point cut`, and pass it the original module for `/src/modules/myModule.js` as a `pointCut` argument, plus all the possible variation modules (`./feature1/variant1/myModule.js`, `./feature2/variant1/myModule.js`, `./feature2/variant2/myModule.js`) in a [WebPack context module](https://webpack.js.org/guides/dependency-management/#context-module-api). +That proxy module will, in turn, import a module with id `toggle:/point-cuts:/my point cut`, and pass it the original module for `/src/modules/myModule.js` as a `pointCut` argument, plus all the possible variation modules (`./feature1/variant1/myModule.js`, `./feature2/variant1/myModule.js`, `./feature2/variant2/myModule.js`) in a [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) linking the full paths to the corresponding [module namespace objects](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import#module_namespace_object). -The `toggle:/point-cuts:/my point cut` then imports the configured toggle point (and toggle handler, if configured), then calls the handler with the toggle point, join point module, and variants. The handler is expected to unpick the webpack-specific context module, and mutate it into something consumable by the toggle point. +The `toggle:/point-cuts:/my point cut` then imports the configured toggle point (and toggle handler, if configured), then calls the handler with the toggle point, join point module, and variants. The handler is expected to convert the key/value `Map` of variants into a data structure appropriate for the toggle point (the default being a `Map` keyed by feature, then variant, to variant module). This toggle point is then expected to return the outcome, having chosen the appropriate module at runtime. diff --git a/packages/webpack/package.json b/packages/webpack/package.json index cfaa680..bd33b24 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -1,7 +1,7 @@ { "name": "@asos/web-toggle-point-webpack", "description": "toggle point webpack plugin", - "version": "0.9.0", + "version": "0.9.2", "license": "MIT", "type": "module", "main": "./lib/main.cjs", @@ -37,7 +37,7 @@ "postpublish": "shx rm ./README.md LICENSE", "clean": "rimraf ./lib", "docs": "rimraf ./docs/**/*.html && jsdoc -c ../jsdoc.conf.js", - "lint": "eslint build src docs --flag unstable_config_lookup_from_file", + "lint": "eslint build src docs --flag v10_config_lookup_from_file", "lint:fix": "npm run lint -- --fix", "test": "jest" }, diff --git a/test/automation/docs/CHANGELOG.md b/test/automation/docs/CHANGELOG.md index a3b3a70..cd2e02b 100644 --- a/test/automation/docs/CHANGELOG.md +++ b/test/automation/docs/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.1.5] - 2025-11-14 + +### Changed + +- update [`@playwright/test`](https://github.com/microsoft/playwright/tree/main/packages/playwright-test) to 1.56.0 + ## [0.1.4] - 2025-09-29 ### Fixed diff --git a/test/automation/package.json b/test/automation/package.json index fa1c8d3..d9725e2 100644 --- a/test/automation/package.json +++ b/test/automation/package.json @@ -1,6 +1,6 @@ { "name": "web-toggle-point-automation-tests", - "version": "0.1.4", + "version": "0.1.5", "main": "index.js", "type": "module", "private": true, @@ -16,7 +16,7 @@ }, "description": "", "devDependencies": { - "@playwright/test": "^1.49.0", + "@playwright/test": "^1.56.0", "@types/node": "^22.9.1", "path-exists-cli": "^2.0.0" }