From e78c42c7eefab6080f2bfdbc438e3992e34a0ef4 Mon Sep 17 00:00:00 2001 From: Tommaso Allevi Date: Sat, 20 Apr 2024 15:17:32 +0200 Subject: [PATCH] Enable JSX --- examples/counter-component/src/Main.ts | 33 - examples/counter-component/src/Main.tsx | 34 + examples/counter-component/src/index.ts | 2 +- examples/counter-component/src/tsconfig.json | 5 - .../counter-component/tests/index.test.ts | 12 +- examples/counter-component/tsconfig.json | 9 + examples/counter-domain/src/Main.ts | 49 - examples/counter-domain/src/Main.tsx | 52 + .../counter/components/ChangeCounterButton.ts | 14 - .../components/ChangeCounterButton.tsx | 14 + .../counter/components/ResetCounterButton.ts | 13 - .../counter/components/ResetCounterButton.tsx | 11 + examples/counter-domain/src/tsconfig.json | 5 - examples/counter-domain/tests/index.test.ts | 15 +- examples/counter-domain/tsconfig.json | 9 + examples/counter/src/Main.ts | 31 - examples/counter/src/Main.tsx | 45 + examples/counter/src/index.ts | 2 +- examples/counter/src/tsconfig.json | 5 - examples/counter/tests/index.test.ts | 12 +- examples/counter/tsconfig.json | 9 + examples/e-commerce/src/{Main.ts => Main.tsx} | 11 +- .../src/components/CardList.module.css | 5 + .../e-commerce/src/components/CardList.ts | 27 - .../e-commerce/src/components/CardList.tsx | 21 + .../src/components/header.module.css | 6 +- examples/e-commerce/src/components/header.ts | 65 - examples/e-commerce/src/components/header.tsx | 58 + .../e-commerce/src/domains/cart/CartDomain.ts | 11 +- .../src/domains/cart/components/AddToCart.ts | 63 - .../src/domains/cart/components/AddToCart.tsx | 84 + .../src/domains/cart/components/CartBadge.ts | 35 - .../src/domains/cart/components/CartBadge.tsx | 36 + .../cart/components/CartProductList.ts | 111 - .../cart/components/CartProductList.tsx | 134 + .../domains/cart/components/CartTooltip.ts | 53 - .../domains/cart/components/CartTooltip.tsx | 58 + .../e-commerce/src/domains/cart/events.ts | 5 +- .../src/domains/product/ProductDomain.ts | 7 +- .../components/ProductCategoryList.module.css | 6 +- .../product/components/ProductCategoryList.ts | 38 - .../components/ProductCategoryList.tsx | 42 + .../product/components/ProductItem.module.css | 1 + .../domains/product/components/ProductItem.ts | 41 - .../product/components/ProductItem.tsx | 37 + .../e-commerce/src/domains/user/UserDomain.ts | 4 +- .../user/components/UserProfileBadge.ts | 73 - .../user/components/UserProfileBadge.tsx | 76 + .../components/user-profile-badge.module.css | 14 +- examples/e-commerce/src/index.ts | 4 +- examples/e-commerce/src/pages/cart.ts | 15 - examples/e-commerce/src/pages/cart.tsx | 7 + examples/e-commerce/src/pages/category.ts | 41 - examples/e-commerce/src/pages/category.tsx | 26 + examples/e-commerce/src/pages/checkout.ts | 24 - examples/e-commerce/src/pages/checkout.tsx | 22 + examples/e-commerce/src/pages/home.ts | 25 - examples/e-commerce/src/pages/home.tsx | 16 + examples/e-commerce/src/pages/login.ts | 35 - examples/e-commerce/src/pages/login.tsx | 40 + examples/e-commerce/src/pages/logout.ts | 8 - examples/e-commerce/src/pages/logout.tsx | 8 + examples/e-commerce/src/pages/profile.ts | 19 - examples/e-commerce/src/pages/profile.tsx | 20 + examples/e-commerce/src/router.module.css | 9 +- .../e-commerce/src/{router.ts => router.tsx} | 47 +- examples/e-commerce/src/tsconfig.json | 6 - examples/e-commerce/tests/index.test.ts | 83 +- examples/e-commerce/tsconfig.json | 10 + examples/empty/src/Main.ts | 5 - examples/empty/src/Main.tsx | 5 + examples/empty/src/index.ts | 4 +- examples/empty/src/tsconfig.json | 5 - examples/empty/tests/index.test.ts | 8 +- examples/empty/tsconfig.json | 9 + packages/seqflow-js/README.md | 48 - packages/seqflow-js/package.json | 35 +- packages/seqflow-js/pnpm-lock.yaml | 2973 ------- packages/seqflow-js/src/domains.ts | 36 + packages/seqflow-js/src/event-utils.ts | 54 - packages/seqflow-js/src/events.ts | 112 + packages/seqflow-js/src/index.ts | 1029 ++- packages/seqflow-js/src/router.ts | 102 + packages/seqflow-js/src/typedEvents.ts | 32 + packages/seqflow-js/tests/appConfig.test.tsx | 61 + packages/seqflow-js/tests/cleanUp.test.ts | 135 - packages/seqflow-js/tests/cleanUp.test.tsx | 31 + packages/seqflow-js/tests/domEvent.test.ts | 118 - packages/seqflow-js/tests/domEvent.test.tsx | 261 + packages/seqflow-js/tests/domainEvent.test.ts | 70 - .../seqflow-js/tests/domainEvent.test.tsx | 102 + packages/seqflow-js/tests/mixedEvent.test.ts | 130 - .../seqflow-js/tests/navigationEvent.test.ts | 88 - packages/seqflow-js/tests/render.test.ts | 53 - packages/seqflow-js/tests/render.test.tsx | 245 + .../seqflow-js/tests/routerEvent.test.tsx | 79 + packages/seqflow-js/tests/utils.ts | 14 - packages/seqflow-js/tsconfig.json | 10 + packages/seqflow-js/vite.d.ts | 0 packages/seqflow-js/vitest.config.ts | 5 + packages/website/src/Main.ts | 36 - packages/website/src/Main.tsx | 37 + .../website/src/components/ContentWithToc.ts | 42 - .../website/src/components/ContentWithToc.tsx | 49 + packages/website/src/components/Header.css | 7 + packages/website/src/components/Header.ts | 80 - packages/website/src/components/Header.tsx | 87 + packages/website/src/pages/ApiReference.ts | 10 - packages/website/src/pages/ApiReference.tsx | 11 + packages/website/src/pages/GettingStarted.md | 236 +- packages/website/src/pages/GettingStarted.ts | 10 - packages/website/src/pages/GettingStarted.tsx | 9 + packages/website/src/pages/Home.ts | 22 - packages/website/src/pages/Home.tsx | 23 + packages/website/src/pages/Why.ts | 10 - packages/website/src/pages/Why.tsx | 9 + packages/website/src/tsconfig.json | 6 - packages/website/tsconfig.json | 9 + packages/website/vite.config.ts | 3 + pnpm-lock.yaml | 6828 +++++++++++------ 120 files changed, 7510 insertions(+), 7841 deletions(-) delete mode 100644 examples/counter-component/src/Main.ts create mode 100644 examples/counter-component/src/Main.tsx delete mode 100644 examples/counter-component/src/tsconfig.json create mode 100644 examples/counter-component/tsconfig.json delete mode 100644 examples/counter-domain/src/Main.ts create mode 100644 examples/counter-domain/src/Main.tsx delete mode 100644 examples/counter-domain/src/domains/counter/components/ChangeCounterButton.ts create mode 100644 examples/counter-domain/src/domains/counter/components/ChangeCounterButton.tsx delete mode 100644 examples/counter-domain/src/domains/counter/components/ResetCounterButton.ts create mode 100644 examples/counter-domain/src/domains/counter/components/ResetCounterButton.tsx delete mode 100644 examples/counter-domain/src/tsconfig.json create mode 100644 examples/counter-domain/tsconfig.json delete mode 100644 examples/counter/src/Main.ts create mode 100644 examples/counter/src/Main.tsx delete mode 100644 examples/counter/src/tsconfig.json create mode 100644 examples/counter/tsconfig.json rename examples/e-commerce/src/{Main.ts => Main.tsx} (58%) delete mode 100644 examples/e-commerce/src/components/CardList.ts create mode 100644 examples/e-commerce/src/components/CardList.tsx delete mode 100644 examples/e-commerce/src/components/header.ts create mode 100644 examples/e-commerce/src/components/header.tsx delete mode 100644 examples/e-commerce/src/domains/cart/components/AddToCart.ts create mode 100644 examples/e-commerce/src/domains/cart/components/AddToCart.tsx delete mode 100644 examples/e-commerce/src/domains/cart/components/CartBadge.ts create mode 100644 examples/e-commerce/src/domains/cart/components/CartBadge.tsx delete mode 100644 examples/e-commerce/src/domains/cart/components/CartProductList.ts create mode 100644 examples/e-commerce/src/domains/cart/components/CartProductList.tsx delete mode 100644 examples/e-commerce/src/domains/cart/components/CartTooltip.ts create mode 100644 examples/e-commerce/src/domains/cart/components/CartTooltip.tsx delete mode 100644 examples/e-commerce/src/domains/product/components/ProductCategoryList.ts create mode 100644 examples/e-commerce/src/domains/product/components/ProductCategoryList.tsx delete mode 100644 examples/e-commerce/src/domains/product/components/ProductItem.ts create mode 100644 examples/e-commerce/src/domains/product/components/ProductItem.tsx delete mode 100644 examples/e-commerce/src/domains/user/components/UserProfileBadge.ts create mode 100644 examples/e-commerce/src/domains/user/components/UserProfileBadge.tsx delete mode 100644 examples/e-commerce/src/pages/cart.ts create mode 100644 examples/e-commerce/src/pages/cart.tsx delete mode 100644 examples/e-commerce/src/pages/category.ts create mode 100644 examples/e-commerce/src/pages/category.tsx delete mode 100644 examples/e-commerce/src/pages/checkout.ts create mode 100644 examples/e-commerce/src/pages/checkout.tsx delete mode 100644 examples/e-commerce/src/pages/home.ts create mode 100644 examples/e-commerce/src/pages/home.tsx delete mode 100644 examples/e-commerce/src/pages/login.ts create mode 100644 examples/e-commerce/src/pages/login.tsx delete mode 100644 examples/e-commerce/src/pages/logout.ts create mode 100644 examples/e-commerce/src/pages/logout.tsx delete mode 100644 examples/e-commerce/src/pages/profile.ts create mode 100644 examples/e-commerce/src/pages/profile.tsx rename examples/e-commerce/src/{router.ts => router.tsx} (54%) delete mode 100644 examples/e-commerce/src/tsconfig.json create mode 100644 examples/e-commerce/tsconfig.json delete mode 100644 examples/empty/src/Main.ts create mode 100644 examples/empty/src/Main.tsx delete mode 100644 examples/empty/src/tsconfig.json create mode 100644 examples/empty/tsconfig.json delete mode 100644 packages/seqflow-js/README.md delete mode 100644 packages/seqflow-js/pnpm-lock.yaml create mode 100644 packages/seqflow-js/src/domains.ts delete mode 100644 packages/seqflow-js/src/event-utils.ts create mode 100644 packages/seqflow-js/src/events.ts create mode 100644 packages/seqflow-js/src/router.ts create mode 100644 packages/seqflow-js/src/typedEvents.ts create mode 100644 packages/seqflow-js/tests/appConfig.test.tsx delete mode 100644 packages/seqflow-js/tests/cleanUp.test.ts create mode 100644 packages/seqflow-js/tests/cleanUp.test.tsx delete mode 100644 packages/seqflow-js/tests/domEvent.test.ts create mode 100644 packages/seqflow-js/tests/domEvent.test.tsx delete mode 100644 packages/seqflow-js/tests/domainEvent.test.ts create mode 100644 packages/seqflow-js/tests/domainEvent.test.tsx delete mode 100644 packages/seqflow-js/tests/mixedEvent.test.ts delete mode 100644 packages/seqflow-js/tests/navigationEvent.test.ts delete mode 100644 packages/seqflow-js/tests/render.test.ts create mode 100644 packages/seqflow-js/tests/render.test.tsx create mode 100644 packages/seqflow-js/tests/routerEvent.test.tsx delete mode 100644 packages/seqflow-js/tests/utils.ts create mode 100644 packages/seqflow-js/tsconfig.json create mode 100644 packages/seqflow-js/vite.d.ts delete mode 100644 packages/website/src/Main.ts create mode 100644 packages/website/src/Main.tsx delete mode 100644 packages/website/src/components/ContentWithToc.ts create mode 100644 packages/website/src/components/ContentWithToc.tsx create mode 100644 packages/website/src/components/Header.css delete mode 100644 packages/website/src/components/Header.ts create mode 100644 packages/website/src/components/Header.tsx delete mode 100644 packages/website/src/pages/ApiReference.ts create mode 100644 packages/website/src/pages/ApiReference.tsx delete mode 100644 packages/website/src/pages/GettingStarted.ts create mode 100644 packages/website/src/pages/GettingStarted.tsx delete mode 100644 packages/website/src/pages/Home.ts create mode 100644 packages/website/src/pages/Home.tsx delete mode 100644 packages/website/src/pages/Why.ts create mode 100644 packages/website/src/pages/Why.tsx delete mode 100644 packages/website/src/tsconfig.json create mode 100644 packages/website/tsconfig.json diff --git a/examples/counter-component/src/Main.ts b/examples/counter-component/src/Main.ts deleted file mode 100644 index ed0f216..0000000 --- a/examples/counter-component/src/Main.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ComponentParam } from "seqflow-js"; - -async function Button({ dom, data }: ComponentParam<{ text: string }>) { - dom.render(``); -} - -export async function Main({ dom, event }: ComponentParam) { - let counter = 0; - dom.render(` -
-
-
-
-
${counter}
-`); - dom.child("decrement", Button, { data: { text: "Decrement" } }); - dom.child("increment", Button, { data: { text: "Increment" } }); - - const incrementButton = dom.querySelector("#increment"); - const decrementButton = dom.querySelector("#decrement"); - const counterDiv = dom.querySelector("#counter"); - - const events = event.waitEvent(event.domEvent("click")); - for await (const ev of events) { - if (incrementButton.contains(ev.target)) { - counter++; - } else if (decrementButton.contains(ev.target)) { - counter--; - } - - counterDiv.textContent = `${counter}`; - } -} diff --git a/examples/counter-component/src/Main.tsx b/examples/counter-component/src/Main.tsx new file mode 100644 index 0000000..ea15be3 --- /dev/null +++ b/examples/counter-component/src/Main.tsx @@ -0,0 +1,34 @@ +import { SeqflowFunctionContext } from "seqflow-js"; + +async function Button(this: SeqflowFunctionContext, data: { text: string }) { + this.renderSync(); +} + +export async function Main(this: SeqflowFunctionContext) { + let counter = 0; + const incrementButton = `); - const events = event.waitEvent(event.domEvent("click")); - for await (const _ of events) { - domains.counter.applyDelta(data.delta); - } -} diff --git a/examples/counter-domain/src/domains/counter/components/ChangeCounterButton.tsx b/examples/counter-domain/src/domains/counter/components/ChangeCounterButton.tsx new file mode 100644 index 0000000..b894303 --- /dev/null +++ b/examples/counter-domain/src/domains/counter/components/ChangeCounterButton.tsx @@ -0,0 +1,14 @@ +import { SeqflowFunctionContext } from "seqflow-js"; + +export async function ChangeCounterButton( + this: SeqflowFunctionContext, + data: { delta: number; text: string }, +) { + this.renderSync(); + const events = this.waitEvents( + this.domEvent("click", { el: this._el as HTMLElement }), + ); + for await (const _ of events) { + this.app.domains.counter.applyDelta(data.delta); + } +} diff --git a/examples/counter-domain/src/domains/counter/components/ResetCounterButton.ts b/examples/counter-domain/src/domains/counter/components/ResetCounterButton.ts deleted file mode 100644 index d7b9e09..0000000 --- a/examples/counter-domain/src/domains/counter/components/ResetCounterButton.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ComponentParam } from "seqflow-js"; - -export async function ResetCounterButton({ - dom, - event, - domains, -}: ComponentParam) { - dom.render(``); - const events = event.waitEvent(event.domEvent("click")); - for await (const _ of events) { - domains.counter.reset(); - } -} diff --git a/examples/counter-domain/src/domains/counter/components/ResetCounterButton.tsx b/examples/counter-domain/src/domains/counter/components/ResetCounterButton.tsx new file mode 100644 index 0000000..3662ae5 --- /dev/null +++ b/examples/counter-domain/src/domains/counter/components/ResetCounterButton.tsx @@ -0,0 +1,11 @@ +import { SeqflowFunctionContext } from "seqflow-js"; + +export async function ResetCounterButton(this: SeqflowFunctionContext) { + this.renderSync(); + const events = this.waitEvents( + this.domEvent("click", { el: this._el as HTMLElement }), + ); + for await (const _ of events) { + this.app.domains.counter.reset(); + } +} diff --git a/examples/counter-domain/src/tsconfig.json b/examples/counter-domain/src/tsconfig.json deleted file mode 100644 index 396b39b..0000000 --- a/examples/counter-domain/src/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "compilerOptions": { - "lib": ["es2015", "dom"] - } -} \ No newline at end of file diff --git a/examples/counter-domain/tests/index.test.ts b/examples/counter-domain/tests/index.test.ts index 25f24e8..f48343b 100644 --- a/examples/counter-domain/tests/index.test.ts +++ b/examples/counter-domain/tests/index.test.ts @@ -6,7 +6,6 @@ import { CounterDomain } from "../src/domains/counter"; test("should increment and decrement the counter", async () => { start(document.body, Main, undefined, { - log() {}, domains: { counter: (eventTarget) => { return new CounterDomain(eventTarget); @@ -18,14 +17,28 @@ test("should increment and decrement the counter", async () => { await screen.findByText("Increment"); const decrementButton = await screen.findByText("Decrement"); + const resetButton = + await screen.findByText("Reset"); const counterDiv = await screen.findByText("0"); expect(counterDiv.textContent).toBe("0"); + // increment the counter incrementButton?.click(); await waitFor(() => expect(counterDiv?.textContent).toBe("1")); + // increment the counter again incrementButton?.click(); await waitFor(() => expect(counterDiv?.textContent).toBe("2")); + // decrement the counter decrementButton?.click(); await waitFor(() => expect(counterDiv?.textContent).toBe("1")); + // reset the counter + resetButton?.click(); + await waitFor(() => expect(counterDiv?.textContent).toBe("0")); + // counter can be negative + decrementButton?.click(); + await waitFor(() => expect(counterDiv?.textContent).toBe("-1")); + // reset the counter again + resetButton?.click(); + await waitFor(() => expect(counterDiv?.textContent).toBe("0")); }); diff --git a/examples/counter-domain/tsconfig.json b/examples/counter-domain/tsconfig.json new file mode 100644 index 0000000..29ecf96 --- /dev/null +++ b/examples/counter-domain/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "lib": ["es2015", "dom"], + "jsx": "react", + "jsxFactory": "this.createDOMElement", + "jsxFragmentFactory": "this.createDOMFragment" + }, + "include": ["./src/**/*", "./tests/**/*"] +} diff --git a/examples/counter/src/Main.ts b/examples/counter/src/Main.ts deleted file mode 100644 index b29d022..0000000 --- a/examples/counter/src/Main.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ComponentParam } from "seqflow-js"; - -export async function Main({ dom, event }: ComponentParam) { - let counter = 0; - dom.render(` -
-
-
- -
- -
-
${counter}
-
-
`); - - const incrementButton = dom.querySelector("#increment"); - const decrementButton = dom.querySelector("#decrement"); - const counterDiv = dom.querySelector("#counter"); - - const events = event.waitEvent(event.domEvent("click")); - for await (const ev of events) { - if (ev.target === incrementButton) { - counter++; - } else if (ev.target === decrementButton) { - counter--; - } - - counterDiv.textContent = `${counter}`; - } -} diff --git a/examples/counter/src/Main.tsx b/examples/counter/src/Main.tsx new file mode 100644 index 0000000..531de08 --- /dev/null +++ b/examples/counter/src/Main.tsx @@ -0,0 +1,45 @@ +import { type SeqflowFunctionContext } from "seqflow-js"; + +export async function Main(this: SeqflowFunctionContext) { + const incrementButton: HTMLButtonElement = ( + + ); + const decrementButton: HTMLButtonElement = ( + + ); + const counterDiv: HTMLDivElement =
0
; + + let counter = 0; + this.renderSync( + <> +
+
+
+ {decrementButton} +
+ {incrementButton} +
+ {counterDiv} +
+
+ , + ); + + const events = this.waitEvents( + this.domEvent("click", { + el: incrementButton, + }), + this.domEvent("click", { + el: decrementButton, + }), + ); + for await (const ev of events) { + if (incrementButton.contains(ev.target as Node)) { + counter++; + } else if (decrementButton.contains(ev.target as Node)) { + counter--; + } + + counterDiv.textContent = `${counter}`; + } +} diff --git a/examples/counter/src/index.ts b/examples/counter/src/index.ts index 07a1f7c..69b71ba 100644 --- a/examples/counter/src/index.ts +++ b/examples/counter/src/index.ts @@ -2,4 +2,4 @@ import { start } from "seqflow-js"; import { Main } from "./Main"; import "./index.css"; -start(document.getElementById("root"), Main); +start(document.getElementById("root"), Main, undefined, {}); diff --git a/examples/counter/src/tsconfig.json b/examples/counter/src/tsconfig.json deleted file mode 100644 index 396b39b..0000000 --- a/examples/counter/src/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "compilerOptions": { - "lib": ["es2015", "dom"] - } -} \ No newline at end of file diff --git a/examples/counter/tests/index.test.ts b/examples/counter/tests/index.test.ts index b0be284..d3481ba 100644 --- a/examples/counter/tests/index.test.ts +++ b/examples/counter/tests/index.test.ts @@ -1,16 +1,14 @@ -import { waitFor } from "@testing-library/dom"; +import { screen, waitFor } from "@testing-library/dom"; import { start } from "seqflow-js"; import { expect, test } from "vitest"; import { Main } from "../src/Main"; test("should increment and decrement the counter", async () => { - start(document.body, Main); + start(document.body, Main, undefined, {}); - const incrementButton = - document.querySelector("#increment"); - const decrementButton = - document.querySelector("#decrement"); - const counterDiv = document.querySelector("#counter"); + const incrementButton = await screen.findByText(/increment/i); + const decrementButton = await screen.findByText(/decrement/i); + const counterDiv = await screen.findByText(/0/i); expect(counterDiv?.textContent).toBe("0"); diff --git a/examples/counter/tsconfig.json b/examples/counter/tsconfig.json new file mode 100644 index 0000000..29ecf96 --- /dev/null +++ b/examples/counter/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "lib": ["es2015", "dom"], + "jsx": "react", + "jsxFactory": "this.createDOMElement", + "jsxFragmentFactory": "this.createDOMFragment" + }, + "include": ["./src/**/*", "./tests/**/*"] +} diff --git a/examples/e-commerce/src/Main.ts b/examples/e-commerce/src/Main.tsx similarity index 58% rename from examples/e-commerce/src/Main.ts rename to examples/e-commerce/src/Main.tsx index f23e4f8..3cbdcc0 100644 --- a/examples/e-commerce/src/Main.ts +++ b/examples/e-commerce/src/Main.tsx @@ -1,14 +1,13 @@ -import { ComponentParam } from "seqflow-js"; +import { SeqflowFunctionContext } from "seqflow-js"; import { CartDomain } from "./domains/cart"; import { ProductDomain } from "./domains/product"; import { UserDomain } from "./domains/user"; import { Router } from "./router"; -export async function Main({ dom, domains }: ComponentParam) { - await domains.user.restoreUser(); +export async function Main(this: SeqflowFunctionContext) { + await this.app.domains.user.restoreUser(); - dom.render(`
`); - dom.child("router", Router); + this.renderSync(); } declare module "seqflow-js" { @@ -18,7 +17,7 @@ declare module "seqflow-js" { product: ProductDomain; } - interface ApplicationConfig { + interface ApplicationConfiguration { api: { baseUrl: string; }; diff --git a/examples/e-commerce/src/components/CardList.module.css b/examples/e-commerce/src/components/CardList.module.css index ccdbf08..e9319bc 100644 --- a/examples/e-commerce/src/components/CardList.module.css +++ b/examples/e-commerce/src/components/CardList.module.css @@ -4,6 +4,11 @@ gap: 5px; list-style: none; + margin-block: 0px; + padding-inline: 0px; + margin-left: 20px; + margin-right: 20px; + .element { border: 1px solid #b4b5b5; background: #e1e1e1; diff --git a/examples/e-commerce/src/components/CardList.ts b/examples/e-commerce/src/components/CardList.ts deleted file mode 100644 index 2f4fb8f..0000000 --- a/examples/e-commerce/src/components/CardList.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ChildOption, ComponentParam } from "seqflow-js"; -import classes from "./CardList.module.css"; - -export async function CardList({ - dom, - data, -}: ComponentParam<{ - prefix: string; - items: T[]; - component: (p: ComponentParam) => Promise; -}>) { - dom.render( - `
    - ${data.items - .map( - (item) => - `
  1. `, - ) - .join("")} -
- `, - ); - for (const item of data.items) { - const option: ChildOption = { data: item } as ChildOption; - dom.child(`${data.prefix}-${item.id}`, data.component, option); - } -} diff --git a/examples/e-commerce/src/components/CardList.tsx b/examples/e-commerce/src/components/CardList.tsx new file mode 100644 index 0000000..6ea6f12 --- /dev/null +++ b/examples/e-commerce/src/components/CardList.tsx @@ -0,0 +1,21 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import classes from "./CardList.module.css"; + +export async function CardList( + this: SeqflowFunctionContext, + data: { + prefix: string; + items: T[]; + Component: (p: T) => Promise; + }, +) { + this.renderSync( +
    + {data.items.map((item) => ( +
  1. + +
  2. + ))} +
, + ); +} diff --git a/examples/e-commerce/src/components/header.module.css b/examples/e-commerce/src/components/header.module.css index 9c2c174..6e20c1f 100644 --- a/examples/e-commerce/src/components/header.module.css +++ b/examples/e-commerce/src/components/header.module.css @@ -1,14 +1,10 @@ -header { +.header { background-color: #7d7d7d40; border-bottom: 1px solid #02020214; -} - -.topHeader { display: flex; align-items: center; gap: 10px; - max-width: 1024px; margin: auto; padding-left: 10px; padding-right: 10px; diff --git a/examples/e-commerce/src/components/header.ts b/examples/e-commerce/src/components/header.ts deleted file mode 100644 index 6056ff8..0000000 --- a/examples/e-commerce/src/components/header.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { CartBadge } from "../domains/cart/components/CartBadge"; -import { UserType } from "../domains/user"; -import { UserProfileBadge } from "../domains/user/components/UserProfileBadge"; -import { UserLoggedEvent, UserLoggedOutEvent } from "../domains/user/events"; -import classes from "./header.module.css"; -import icon from "./icon.png"; - -export async function Header({ - dom, - event, - data, - router, -}: ComponentParam<{ user?: UserType }>) { - dom.render(` -
-
- icon -
-
-
- -
-
-
-
-`); - dom.child("userProfileBadge", UserProfileBadge); - dom.child("cartBadge", CartBadge); - - const user: UserType | undefined = data.user; - - const header = dom.querySelector("header"); - let className: string; - if (user) { - className = classes.logged; - } else { - className = classes.unlogged; - } - header.classList.add(className); - - const loginButton = dom.querySelector("#login-button"); - const storeLogo = dom.querySelector(`.${classes.icon}`); - const events = event.waitEvent( - event.domainEvent(UserLoggedEvent), - event.domainEvent(UserLoggedOutEvent), - event.domEvent("click"), - ); - - for await (const ev of events) { - ev.preventDefault(); - if (ev instanceof UserLoggedEvent) { - header.classList.add(classes.logged); - } else if (ev instanceof UserLoggedOutEvent) { - header.classList.remove(classes.logged); - } else if (ev.target === loginButton) { - router.navigate("/login"); - } else if (ev.target === storeLogo) { - router.navigate("/"); - } else { - console.log(ev); - console.error("Unknown event", ev); - } - } -} diff --git a/examples/e-commerce/src/components/header.tsx b/examples/e-commerce/src/components/header.tsx new file mode 100644 index 0000000..9c423ab --- /dev/null +++ b/examples/e-commerce/src/components/header.tsx @@ -0,0 +1,58 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { CartBadge } from "../domains/cart/components/CartBadge"; +import { UserType } from "../domains/user"; +import { UserProfileBadge } from "../domains/user/components/UserProfileBadge"; +import { UserLoggedEvent, UserLoggedOutEvent } from "../domains/user/events"; +import classes from "./header.module.css"; +import icon from "./icon.png"; + +export async function Header( + this: SeqflowFunctionContext, + data: { user?: UserType }, +) { + const loginButton = ; + const storeLogo = icon; + + this.renderSync( +
+ {storeLogo} +
+ +
+ {loginButton} +
+ +
, + ); + + const user: UserType | undefined = data.user; + + let className: string; + if (user) { + className = classes.logged; + } else { + className = classes.unlogged; + } + this._el.classList.add(className); + + const events = this.waitEvents( + this.domainEvent(UserLoggedEvent), + this.domainEvent(UserLoggedOutEvent), + this.domEvent("click", { + el: this._el, + }), + ); + + for await (const ev of events) { + ev.preventDefault(); + if (ev instanceof UserLoggedEvent) { + this._el.classList.add(classes.logged); + } else if (ev instanceof UserLoggedOutEvent) { + this._el.classList.remove(classes.logged); + } else if (loginButton.contains(ev.target as HTMLElement)) { + this.app.router.navigate("/login"); + } else if (storeLogo.contains(ev.target as HTMLElement)) { + this.app.router.navigate("/"); + } + } +} diff --git a/examples/e-commerce/src/domains/cart/CartDomain.ts b/examples/e-commerce/src/domains/cart/CartDomain.ts index c8f2908..22f03d9 100644 --- a/examples/e-commerce/src/domains/cart/CartDomain.ts +++ b/examples/e-commerce/src/domains/cart/CartDomain.ts @@ -33,7 +33,7 @@ export class CartDomain { this.eventTarget.dispatchEvent( new ChangeCartEvent({ product, - action: "add", + action: "add-product", }), ); @@ -59,7 +59,7 @@ export class CartDomain { this.eventTarget.dispatchEvent( new ChangeCartEvent({ product, - action: "remove", + action: "remove-element-product", }), ); @@ -70,6 +70,13 @@ export class CartDomain { const productId = product.id; this.products.delete(productId); + this.eventTarget.dispatchEvent( + new ChangeCartEvent({ + product, + action: "remove-all-elements-of-a-product", + }), + ); + updateLocalStorage(this.products); } diff --git a/examples/e-commerce/src/domains/cart/components/AddToCart.ts b/examples/e-commerce/src/domains/cart/components/AddToCart.ts deleted file mode 100644 index 02741ad..0000000 --- a/examples/e-commerce/src/domains/cart/components/AddToCart.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { Product } from "../../product/ProductDomain"; -import classes from "./AddToCart.module.css"; - -export async function AddToCart({ - dom, - event, - data, - domains, -}: ComponentParam<{ product: Product }>) { - const initCount = domains.cart.getProductCount(data.product.id); - - dom.render(` -
- -
- - ${initCount} - -
-
`); - - const firstAddToCart = dom.querySelector(`.${classes.firstAddToCart}`); - const otherAddToCartWrapper = dom.querySelector( - `.${classes.otherAddToCartWrapper}`, - ); - const removeFromCart = dom.querySelector(`.${classes.removeFromCart}`); - const secondAddFromCart = dom.querySelector(`.${classes.secondAddFromCart}`); - const count = dom.querySelector(".count"); - - if (initCount > 0) { - count.textContent = `${initCount}`; - firstAddToCart.classList.remove(classes.show); - otherAddToCartWrapper.classList.add(classes.show); - } - - const events = event.waitEvent(event.domEvent("click")); - for await (const ev of events) { - switch (true) { - case ev.target === firstAddToCart: { - const c = domains.cart.addToCart({ product: data.product }); - count.textContent = `${c}`; - otherAddToCartWrapper.classList.add(classes.show); - firstAddToCart.classList.remove(classes.show); - break; - } - case ev.target === removeFromCart: { - const remain = domains.cart.removeFromCart({ product: data.product }); - count.textContent = `${remain}`; - if (remain === 0) { - otherAddToCartWrapper.classList.remove(classes.show); - firstAddToCart.classList.add(classes.show); - } - break; - } - case ev.target === secondAddFromCart: { - const c = domains.cart.addToCart({ product: data.product }); - count.textContent = `${c}`; - break; - } - } - } -} diff --git a/examples/e-commerce/src/domains/cart/components/AddToCart.tsx b/examples/e-commerce/src/domains/cart/components/AddToCart.tsx new file mode 100644 index 0000000..58099cd --- /dev/null +++ b/examples/e-commerce/src/domains/cart/components/AddToCart.tsx @@ -0,0 +1,84 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { Product } from "../../product/ProductDomain"; +import classes from "./AddToCart.module.css"; + +export async function AddToCart( + this: SeqflowFunctionContext, + data: { product: Product }, +) { + const initCount = this.app.domains.cart.getProductCount(data.product.id); + + const firstAddToCart = ( + + ); + const removeFromCart = ( + + ); + const secondAddFromCart = ( + + ); + const count = {initCount}; + const otherAddToCartWrapper = ( +
+ {removeFromCart} + {count} + {secondAddFromCart} +
+ ); + this.renderSync( +
+ {firstAddToCart} + {otherAddToCartWrapper} +
, + ); + + if (initCount > 0) { + count.textContent = `${initCount}`; + firstAddToCart.classList.remove(classes.show); + otherAddToCartWrapper.classList.add(classes.show); + } else { + count.textContent = "0"; + firstAddToCart.classList.add(classes.show); + otherAddToCartWrapper.classList.remove(classes.show); + } + + const events = this.waitEvents( + this.domEvent("click", { + el: this._el, + }), + ); + for await (const ev of events) { + const target = ev.target as HTMLElement; + switch (true) { + case firstAddToCart.contains(target): { + const c = this.app.domains.cart.addToCart({ product: data.product }); + count.textContent = `${c}`; + otherAddToCartWrapper.classList.add(classes.show); + firstAddToCart.classList.remove(classes.show); + break; + } + case removeFromCart.contains(target): { + const remain = this.app.domains.cart.removeFromCart({ + product: data.product, + }); + count.textContent = `${remain}`; + if (remain === 0) { + otherAddToCartWrapper.classList.remove(classes.show); + firstAddToCart.classList.add(classes.show); + } + break; + } + case secondAddFromCart.contains(target): { + const c = this.app.domains.cart.addToCart({ product: data.product }); + count.textContent = `${c}`; + break; + } + } + } +} diff --git a/examples/e-commerce/src/domains/cart/components/CartBadge.ts b/examples/e-commerce/src/domains/cart/components/CartBadge.ts deleted file mode 100644 index 69bb723..0000000 --- a/examples/e-commerce/src/domains/cart/components/CartBadge.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { ChangeCartEvent, CheckoutEndedCartEvent } from "../events"; -import classes from "./cart-badge.module.css"; - -export async function CartBadge({ - event, - dom, - domains, - router, -}: ComponentParam) { - const count = domains.cart.getProductCount(); - dom.render(` - - - ${count} -`); - - const numberOfProductsInCart = dom.querySelector( - `.${classes.numberOfProductsInCart} span`, - ); - - const events = event.waitEvent( - event.domainEvent(ChangeCartEvent), - event.domainEvent(CheckoutEndedCartEvent), - event.domEvent("click"), - ); - for await (const ev of events) { - if (ev instanceof ChangeCartEvent || ev instanceof CheckoutEndedCartEvent) { - numberOfProductsInCart.textContent = `${domains.cart.getProductCount()}`; - } else { - // click event - router.navigate("/cart"); - } - } -} diff --git a/examples/e-commerce/src/domains/cart/components/CartBadge.tsx b/examples/e-commerce/src/domains/cart/components/CartBadge.tsx new file mode 100644 index 0000000..49f7426 --- /dev/null +++ b/examples/e-commerce/src/domains/cart/components/CartBadge.tsx @@ -0,0 +1,36 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { ChangeCartEvent, CheckoutEndedCartEvent } from "../events"; +import classes from "./cart-badge.module.css"; + +export async function CartBadge(this: SeqflowFunctionContext) { + const count = this.app.domains.cart.getProductCount(); + + const counter = ( + + {count} + + ); + this.renderSync( + + + {counter} + , + ); + + const events = this.waitEvents( + this.domainEvent(ChangeCartEvent), + this.domainEvent(CheckoutEndedCartEvent), + this.domEvent("click", { + el: this._el, + preventDefault: true, + }), + ); + for await (const ev of events) { + if (ev instanceof ChangeCartEvent || ev instanceof CheckoutEndedCartEvent) { + counter.textContent = `${this.app.domains.cart.getProductCount()}`; + } else { + // click event + this.app.router.navigate("/cart"); + } + } +} diff --git a/examples/e-commerce/src/domains/cart/components/CartProductList.ts b/examples/e-commerce/src/domains/cart/components/CartProductList.ts deleted file mode 100644 index 3db22c6..0000000 --- a/examples/e-commerce/src/domains/cart/components/CartProductList.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { Product } from "../../product/ProductDomain"; -import { Cart } from "../CartDomain"; -import { ChangeCartEvent } from "../events"; -import classes from "./CartProductList.module.css"; - -export async function CartProduct({ - dom, - data, - event, - domains, -}: ComponentParam<{ product: Product; count: number; subTotal: number }>) { - dom.render(` -
-
- ${data.product.title} -
${data.product.price} €
-
-
-

${data.product.title}

-
-
x ${data.count}
-
= ${data.subTotal} €
- -
`); - - const button = dom.querySelector(".remove-from-cart"); - - const events = event.waitEvent(event.domEvent("click")); - for await (const ev of events) { - if (button.contains(ev.target as Node)) { - domains.cart.removeAllFromCart({ product: data.product }); - event.dispatchDomainEvent( - new ChangeCartEvent({ product: data.product, action: "remove-all" }), - ); - } - } -} - -export async function CartProductList({ - dom, - data, - event, - domains, - router, -}: ComponentParam<{ cart: Cart }>) { - dom.render(` -
-
    - ${data.cart.products - .map(({ product: { id } }) => `
  • `) - .join("")} -
-
-
- total: ${data.cart.total} € -
-
- -
- -
`); - for (const { product, count, subTotal } of data.cart.products) { - dom.child(`cart-item-${product.id}`, CartProduct, { - data: { product, count, subTotal }, - }); - } - - const cartCheckoutWrapper = dom.querySelector("#cart-checkout"); - const cartLoginWrapper = dom.querySelector("#cart-login"); - const cartLoginLink = dom.querySelector("#cart-login-link"); - const checkoutButton = dom.querySelector("#checkout-button"); - const cartTotal = dom.querySelector("#cart-total"); - const cartProducts = dom.querySelector("#cart-products"); - - const isLogged = domains.user.isLoggedIn(); - if (isLogged) { - cartLoginWrapper.remove(); - } else { - cartCheckoutWrapper.remove(); - } - - const events = event.waitEvent( - event.domEvent("click"), - event.domainEvent(ChangeCartEvent), - ); - for await (const ev of events) { - if (ev.target === cartLoginLink) { - router.navigate("/login"); - } - if (ev.target === checkoutButton && isLogged) { - router.navigate("/checkout"); - } - if (ev instanceof ChangeCartEvent) { - const cart = domains.cart.getCart(); - cartProducts.innerHTML = cart.products - .map(({ product: { id } }) => `
  • `) - .join(""); - for (const { product, count, subTotal } of cart.products) { - dom.child(`cart-item-${product.id}`, CartProduct, { - data: { product, count, subTotal }, - }); - } - cartTotal.textContent = `total: ${cart.total} €`; - } - } -} diff --git a/examples/e-commerce/src/domains/cart/components/CartProductList.tsx b/examples/e-commerce/src/domains/cart/components/CartProductList.tsx new file mode 100644 index 0000000..918c224 --- /dev/null +++ b/examples/e-commerce/src/domains/cart/components/CartProductList.tsx @@ -0,0 +1,134 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { Product } from "../../product/ProductDomain"; +import { Cart } from "../CartDomain"; +import { ChangeCartEvent } from "../events"; +import classes from "./CartProductList.module.css"; + +async function EmptyCart(this: SeqflowFunctionContext) { + this.renderSync(
    Cart is empty
    ); +} + +export async function CartProduct( + this: SeqflowFunctionContext, + data: { product: Product; count: number; subTotal: number }, +) { + const removeButton = ( + + ); + this.renderSync( +
    +
    + {data.product.title} +
    {data.product.price} €
    +
    +
    +

    {data.product.title}

    +
    +
    x {data.count}
    +
    = {data.subTotal} €
    + {removeButton} +
    , + ); + + const events = this.waitEvents( + this.domEvent("click", { + el: removeButton, + }), + ); + for await (const ev of events) { + this.app.domains.cart.removeAllFromCart({ product: data.product }); + } +} + +export async function CartProductList( + this: SeqflowFunctionContext, + data: { cart: Cart }, +) { + if (data.cart.products.length === 0) { + this.renderSync(); + return; + } + + const checkoutButton = ; + const cartLogin =
    Go to login; + const cartTotal = ( +
    + total: {data.cart.total} € +
    + ); + this.renderSync( +
    +
      + {data.cart.products.map(({ product, count, subTotal }) => { + return ( +
    • + +
    • + ); + })} +
    +
    + {cartTotal} +
    {checkoutButton}
    +
    {cartLogin}
    +
    , + ); + + const isLogged = this.app.domains.user.isLoggedIn(); + if (!isLogged) { + checkoutButton.remove(); + } else { + cartLogin.remove(); + } + + const events = this.waitEvents( + this.domEvent("click", { + el: this._el, + preventDefault: true, + }), + this.domainEvent(ChangeCartEvent), + ); + for await (const ev of events) { + if (ev.target instanceof HTMLElement) { + if (cartLogin.contains(ev.target)) { + ev.preventDefault(); + this.app.router.navigate("/login"); + continue; + } + if (checkoutButton.contains(ev.target)) { + ev.preventDefault(); + this.app.router.navigate("/checkout"); + continue; + } + } + if (ev instanceof ChangeCartEvent) { + switch (ev.detail.action) { + case "remove-all-elements-of-a-product": + this._el + .querySelector(`li[key=cart-item-${ev.detail.product.id}]`) + ?.remove(); + break; + default: + throw new Error("Unsupported action"); + } + const cart = this.app.domains.cart.getCart(); + + if (cart.products.length === 0) { + this.renderSync(); + break; + } + + cartTotal.innerText = `total: ${cart.total} €`; + } + } +} diff --git a/examples/e-commerce/src/domains/cart/components/CartTooltip.ts b/examples/e-commerce/src/domains/cart/components/CartTooltip.ts deleted file mode 100644 index 9292078..0000000 --- a/examples/e-commerce/src/domains/cart/components/CartTooltip.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { ChangeCartEvent, CheckoutEndedCartEvent } from "../events"; -import classes from "./CartTooltip.module.css"; - -export async function CartTooltip({ - event, - dom, - domains, - router, -}: ComponentParam) { - const hasProduct = domains.cart.getProductCount() !== 0; - dom.render(` -`); - - const wrapper = dom.querySelector(`.${classes.wrapper}`); - const cartTooltipLink = dom.querySelector("#cart-tooltip-link"); - - const events = event.waitEvent( - event.domainEvent(ChangeCartEvent), - event.domainEvent(CheckoutEndedCartEvent), - event.domEvent("click"), - ); - for await (const ev of events) { - ev.preventDefault(); - ev.stopPropagation(); - ev.stopImmediatePropagation(); - switch (true) { - case ev.type === "click" && - cartTooltipLink.contains(ev.target as HTMLElement): { - router.navigate("/cart"); - break; - } - case ev instanceof ChangeCartEvent: { - const count = domains.cart.getProductCount(); - if (count === 0) { - wrapper.style.display = "none"; - } - if (ev.detail.action === "add" && count === 1) { - wrapper.style.display = "inline"; - } - break; - } - case ev instanceof CheckoutEndedCartEvent: { - wrapper.style.display = "none"; - break; - } - } - } -} diff --git a/examples/e-commerce/src/domains/cart/components/CartTooltip.tsx b/examples/e-commerce/src/domains/cart/components/CartTooltip.tsx new file mode 100644 index 0000000..d463de5 --- /dev/null +++ b/examples/e-commerce/src/domains/cart/components/CartTooltip.tsx @@ -0,0 +1,58 @@ +import { NavigationEvent, SeqflowFunctionContext } from "seqflow-js"; +import { ChangeCartEvent, CheckoutEndedCartEvent } from "../events"; +import classes from "./CartTooltip.module.css"; + +export async function CartTooltip(this: SeqflowFunctionContext) { + const hasProduct = this.app.domains.cart.getProductCount() !== 0; + this._el.classList.add(classes.wrapper); + if (!hasProduct) { + this._el.style.display = "none"; + } else { + this._el.style.display = "inline"; + } + + const cartTooltipLink = ( + + Go to checkout + + ); + this.renderSync(cartTooltipLink); + + const events = this.waitEvents( + this.domainEvent(ChangeCartEvent), + this.domainEvent(CheckoutEndedCartEvent), + this.navigationEvent(), + this.domEvent("click", { el: this._el, preventDefault: true }), + ); + for await (const ev of events) { + switch (true) { + case ev.type === "click" && + cartTooltipLink.contains(ev.target as HTMLElement): { + this.app.router.navigate("/cart"); + break; + } + case ev instanceof NavigationEvent: { + if (ev.path === "/cart") { + this._el.style.display = "none"; + } else { + this._el.style.display = "inline"; + } + break; + } + case ev instanceof ChangeCartEvent: { + const count = this.app.domains.cart.getProductCount(); + if (count === 0) { + this._el.style.display = "none"; + } + if (count > 0) { + this._el.style.display = "inline"; + } + break; + } + case ev instanceof CheckoutEndedCartEvent: { + this._el.style.display = "none"; + break; + } + } + } +} diff --git a/examples/e-commerce/src/domains/cart/events.ts b/examples/e-commerce/src/domains/cart/events.ts index d28c3dd..80425ad 100644 --- a/examples/e-commerce/src/domains/cart/events.ts +++ b/examples/e-commerce/src/domains/cart/events.ts @@ -3,7 +3,10 @@ import { Product } from "../product/ProductDomain"; export const ChangeCartEvent = createDomainEventClass<{ product: Product; - action: "add" | "remove" | "remove-all"; + action: + | "add-product" + | "remove-element-product" + | "remove-all-elements-of-a-product"; }>("cart", "change-cart"); export const CheckoutEndedCartEvent = createDomainEventClass( "cart", diff --git a/examples/e-commerce/src/domains/product/ProductDomain.ts b/examples/e-commerce/src/domains/product/ProductDomain.ts index d933519..90194c3 100644 --- a/examples/e-commerce/src/domains/product/ProductDomain.ts +++ b/examples/e-commerce/src/domains/product/ProductDomain.ts @@ -1,10 +1,7 @@ -import { ApplicationConfig } from "seqflow-js"; +import { ApplicationConfiguration } from "seqflow-js"; export class ProductDomain { - constructor( - private _eventTarget: EventTarget, - private applicationConfig: ApplicationConfig, - ) {} + constructor(private applicationConfig: Readonly) {} async fetchProductsCategories( signal: AbortSignal, diff --git a/examples/e-commerce/src/domains/product/components/ProductCategoryList.module.css b/examples/e-commerce/src/domains/product/components/ProductCategoryList.module.css index faf16fe..f0f0e1a 100644 --- a/examples/e-commerce/src/domains/product/components/ProductCategoryList.module.css +++ b/examples/e-commerce/src/domains/product/components/ProductCategoryList.module.css @@ -1,4 +1,8 @@ +.productList { + margin-top: 30px; +} + .categoryAnchor { display: inline-block; padding: 5px; @@ -11,4 +15,4 @@ border-radius: 3px 4px 0px 0px; max-width: 100%; height: auto; -} \ No newline at end of file +} diff --git a/examples/e-commerce/src/domains/product/components/ProductCategoryList.ts b/examples/e-commerce/src/domains/product/components/ProductCategoryList.ts deleted file mode 100644 index a5cfd1a..0000000 --- a/examples/e-commerce/src/domains/product/components/ProductCategoryList.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { CardList } from "../../../components/CardList"; -import { ProductCategory } from "../ProductDomain"; -import classes from "./ProductCategoryList.module.css"; - -async function CategoryItem({ - dom, - data, - event, - router, -}: ComponentParam) { - dom.render(` - - - ${data.name} -`); - - const events = event.waitEvent(event.domEvent("click")); - for await (const ev of events) { - ev.preventDefault(); - router.navigate(`/category/${data.name}`); - } -} - -export async function ProductCategoryList({ - dom, - data, -}: ComponentParam<{ categories: ProductCategory[] }>) { - dom.render('
    '); - - dom.child("product-category-list", CardList, { - data: { - prefix: "category", - items: data.categories, - component: CategoryItem, - }, - }); -} diff --git a/examples/e-commerce/src/domains/product/components/ProductCategoryList.tsx b/examples/e-commerce/src/domains/product/components/ProductCategoryList.tsx new file mode 100644 index 0000000..30fe80e --- /dev/null +++ b/examples/e-commerce/src/domains/product/components/ProductCategoryList.tsx @@ -0,0 +1,42 @@ +import { SeqflowAppContext, SeqflowFunctionContext } from "seqflow-js"; +import { CardList } from "../../../components/CardList"; +import { ProductCategory } from "../ProductDomain"; +import classes from "./ProductCategoryList.module.css"; + +async function CategoryItem( + this: SeqflowFunctionContext, + data: ProductCategory, +) { + const anchor = ( + + {data.name} + {data.name} + + ); + this.renderSync(anchor); + + const events = this.waitEvents( + this.domEvent("click", { + el: anchor, + preventDefault: true, + }), + ); + for await (const ev of events) { + this.app.router.navigate(`/category/${data.name}`); + } +} + +export async function ProductCategoryList( + this: SeqflowFunctionContext, + data: { categories: ProductCategory[] }, +) { + this.renderSync( +
    + +
    , + ); +} diff --git a/examples/e-commerce/src/domains/product/components/ProductItem.module.css b/examples/e-commerce/src/domains/product/components/ProductItem.module.css index d29d94a..e78420d 100644 --- a/examples/e-commerce/src/domains/product/components/ProductItem.module.css +++ b/examples/e-commerce/src/domains/product/components/ProductItem.module.css @@ -26,6 +26,7 @@ width: calc(100% + 20px); max-width: 200px; text-align: center; + left: 0px; transition: opacity 0.3s; box-sizing: border-box; } diff --git a/examples/e-commerce/src/domains/product/components/ProductItem.ts b/examples/e-commerce/src/domains/product/components/ProductItem.ts deleted file mode 100644 index 9cea2a5..0000000 --- a/examples/e-commerce/src/domains/product/components/ProductItem.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { AddToCart } from "../../cart/components/AddToCart"; -import { Product } from "../ProductDomain"; -import classes from "./ProductItem.module.css"; - -export async function ProductItem({ - dom, - data, - event, -}: ComponentParam) { - dom.render(` -
    - ${data.title} -

    ${data.price} €

    -
    ${data.title}
    -
    -
    -`); - dom.child(`product-card-cart-${data.id}`, AddToCart, { - data: { product: data }, - }); - - const img = dom.querySelector(`.${classes.productImage}`); - const tooltip = dom.querySelector(`.${classes.tooltipWrapper}`); - - const events = event.waitEvent( - event.domEvent("mouseover"), - event.domEvent("mouseout"), - ); - for await (const e of events) { - if (e.target !== img) { - continue; - } - - if (e.type === "mouseover") { - tooltip.classList.add(classes.show); - } else { - tooltip.classList.remove(classes.show); - } - } -} diff --git a/examples/e-commerce/src/domains/product/components/ProductItem.tsx b/examples/e-commerce/src/domains/product/components/ProductItem.tsx new file mode 100644 index 0000000..5734061 --- /dev/null +++ b/examples/e-commerce/src/domains/product/components/ProductItem.tsx @@ -0,0 +1,37 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { AddToCart } from "../../cart/components/AddToCart"; +import { Product } from "../ProductDomain"; +import classes from "./ProductItem.module.css"; + +export async function ProductItem(this: SeqflowFunctionContext, data: Product) { + const productImage = ( + {data.title} + ); + const tooltip =
    {data.title}
    ; + this.renderSync( +
    + {productImage} +

    {data.price} €

    + {tooltip} +
    + +
    +
    , + ); + + const events = this.waitEvents( + this.domEvent("mouseover", { el: this._el }), + this.domEvent("mouseout", { el: this._el }), + ); + for await (const e of events) { + if (!productImage.contains(e.target as HTMLElement)) { + continue; + } + + if (e.type === "mouseover") { + tooltip.classList.add(classes.show); + } else { + tooltip.classList.remove(classes.show); + } + } +} diff --git a/examples/e-commerce/src/domains/user/UserDomain.ts b/examples/e-commerce/src/domains/user/UserDomain.ts index 174c90f..b546b3a 100644 --- a/examples/e-commerce/src/domains/user/UserDomain.ts +++ b/examples/e-commerce/src/domains/user/UserDomain.ts @@ -1,4 +1,4 @@ -import { ApplicationConfig } from "seqflow-js"; +import { ApplicationConfiguration } from "seqflow-js"; import { UserLoggedEvent, UserLoggedOutEvent } from "./events"; const LOCALSTORAGE_USER_KEY = "user"; @@ -30,7 +30,7 @@ export class UserDomain { constructor( private eventTarget: EventTarget, - private applicationConfig: ApplicationConfig, + private applicationConfig: Readonly, ) {} async restoreUser(): Promise { diff --git a/examples/e-commerce/src/domains/user/components/UserProfileBadge.ts b/examples/e-commerce/src/domains/user/components/UserProfileBadge.ts deleted file mode 100644 index cbd6bad..0000000 --- a/examples/e-commerce/src/domains/user/components/UserProfileBadge.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { UserLoggedEvent, UserLoggedOutEvent } from "../events"; -import classes from "./user-profile-badge.module.css"; - -function getProfileUrl(user: { username: string }, size: number) { - return `https://placehold.co/${size}?text=${user.username[0].toUpperCase()}`; -} - -export async function UserProfileBadge({ - event, - dom, - domains, - router, -}: ComponentParam) { - const user = (await domains.user.getUser()) || { - username: "Guest", - }; - - const profileHeaderMenuId = classes["profile-header-menu"]; - - const size = 40; - dom.render(` -
    - - Profile Picture - -
    -
    -
      -
    1. Profile
    2. -
    3. Logout
    4. -
    -
    -
    -
    `); - - const imgEl = dom.querySelector("img"); - const profileHeaderMenu = dom.querySelector( - `#${profileHeaderMenuId}`, - ); - - const events = event.waitEvent( - event.domainEvent(UserLoggedEvent), - event.domainEvent(UserLoggedOutEvent), - event.domEvent("click"), - event.domEvent("mouseover"), - event.domEvent("mouseout"), - ); - for await (const ev of events) { - if (ev instanceof UserLoggedEvent || ev instanceof UserLoggedOutEvent) { - const user = (await domains.user.getUser()) || { - username: "Guest", - }; - imgEl.src = getProfileUrl(user, size); - } else if (ev.type === "click") { - if (ev.target instanceof HTMLAnchorElement) { - router.navigate(ev.target.href); - } else if (ev.target instanceof HTMLImageElement) { - router.navigate("/profile"); - } - } else if (ev.type === "mouseover") { - profileHeaderMenu.classList.add(classes.show); - } else if (ev.type === "mouseout") { - profileHeaderMenu.classList.remove(classes.show); - } - } -} diff --git a/examples/e-commerce/src/domains/user/components/UserProfileBadge.tsx b/examples/e-commerce/src/domains/user/components/UserProfileBadge.tsx new file mode 100644 index 0000000..9f03adc --- /dev/null +++ b/examples/e-commerce/src/domains/user/components/UserProfileBadge.tsx @@ -0,0 +1,76 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { UserLoggedEvent, UserLoggedOutEvent } from "../events"; +import classes from "./user-profile-badge.module.css"; + +function getProfileUrl(user: { username: string }, size: number) { + return `https://placehold.co/${size}?text=${user.username[0].toUpperCase()}`; +} + +const size = 40; +export async function UserProfileBadge(this: SeqflowFunctionContext) { + const user = (await this.app.domains.user.getUser()) || { + username: "Guest", + }; + + const profileHeaderMenuId = classes["profile-header-menu"]; + + const profilePicture = ( + Profile Avatar + ) as HTMLImageElement; + const profileHeaderMenu = ( +
    +
      +
    1. + Profile +
    2. +
    3. + Logout +
    4. +
    +
    + ); + + this.renderSync( + , + ); + + const events = this.waitEvents( + this.domainEvent(UserLoggedEvent), + this.domainEvent(UserLoggedOutEvent), + this.domEvent("click", { el: this._el }), + this.domEvent("mouseover", { el: this._el }), + this.domEvent("mouseout", { el: this._el }), + ); + for await (const ev of events) { + if (ev instanceof UserLoggedEvent || ev instanceof UserLoggedOutEvent) { + const user = (await this.app.domains.user.getUser()) || { + username: "Guest", + }; + profilePicture.src = getProfileUrl(user, size); + } else if (ev.type === "click") { + ev.preventDefault(); + + if (ev.target instanceof HTMLAnchorElement) { + const url = new URL(ev.target.href); + this.app.router.navigate(url.pathname); + } else if (ev.target instanceof HTMLImageElement) { + this.app.router.navigate("/profile"); + } + } else if (ev.type === "mouseover") { + profileHeaderMenu.classList.add(classes.show); + } else if (ev.type === "mouseout") { + profileHeaderMenu.classList.remove(classes.show); + } + } +} diff --git a/examples/e-commerce/src/domains/user/components/user-profile-badge.module.css b/examples/e-commerce/src/domains/user/components/user-profile-badge.module.css index f33a357..5e6f01f 100644 --- a/examples/e-commerce/src/domains/user/components/user-profile-badge.module.css +++ b/examples/e-commerce/src/domains/user/components/user-profile-badge.module.css @@ -9,11 +9,23 @@ height: 100%; } +.profile-header-menu-wrapper { + position: relative; + right: 50px; +} #profile-header-menu { display: none; - background-color: white; width: 150px; + + padding-top: 5px; + padding-bottom: 5px; + + ol { + list-style: none; + margin-block: 0; + padding-inline: 0; + } } #profile-header-menu.show { position: absolute; diff --git a/examples/e-commerce/src/index.ts b/examples/e-commerce/src/index.ts index f6f1acb..fc0af3c 100644 --- a/examples/e-commerce/src/index.ts +++ b/examples/e-commerce/src/index.ts @@ -1,4 +1,4 @@ -import { start } from "seqflow-js"; +import { InMemoryRouter, start } from "seqflow-js"; import { Main } from "./Main"; import { CartDomain } from "./domains/cart"; import { ProductDomain } from "./domains/product"; @@ -17,7 +17,7 @@ start(document.getElementById("root"), Main, undefined, { return new CartDomain(eventTarget); }, product: (eventTarget, _, config) => { - return new ProductDomain(eventTarget, config); + return new ProductDomain(config); }, }, config: { diff --git a/examples/e-commerce/src/pages/cart.ts b/examples/e-commerce/src/pages/cart.ts deleted file mode 100644 index f47efc9..0000000 --- a/examples/e-commerce/src/pages/cart.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { components } from "../domains/cart"; - -export async function Cart({ dom, domains }: ComponentParam) { - const cart = domains.cart.getCart(); - dom.render(`
    `); - - if (cart.products.length !== 0) { - dom.child("cart-product-list", components.CartProductList, { - data: { cart }, - }); - } else { - dom.render("
    Cart is empty
    "); - } -} diff --git a/examples/e-commerce/src/pages/cart.tsx b/examples/e-commerce/src/pages/cart.tsx new file mode 100644 index 0000000..5515fc2 --- /dev/null +++ b/examples/e-commerce/src/pages/cart.tsx @@ -0,0 +1,7 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { components } from "../domains/cart"; + +export async function Cart(this: SeqflowFunctionContext) { + const cart = this.app.domains.cart.getCart(); + this.renderSync(); +} diff --git a/examples/e-commerce/src/pages/category.ts b/examples/e-commerce/src/pages/category.ts deleted file mode 100644 index 38a09cb..0000000 --- a/examples/e-commerce/src/pages/category.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { CardList } from "../components/CardList"; -import { components } from "../domains/product"; - -async function Loading({ dom: { render } }: ComponentParam) { - render("
    Loading...
    "); -} - -export async function Category({ - dom, - signal, - domains, - router, -}: ComponentParam) { - dom.render(` -
    -
    - -
    -
    `); - dom.child("loading", Loading); - - const loadingElement = dom.querySelector("#loading"); - console.log(router.segments); - const categoryId = router.segments.pop(); - - const products = await domains.product.fetchProductsByCategory( - { categoryId }, - signal, - ); - - loadingElement.remove(); - - dom.child("products", CardList, { - data: { - prefix: "category", - items: products, - component: components.ProductItem, - }, - }); -} diff --git a/examples/e-commerce/src/pages/category.tsx b/examples/e-commerce/src/pages/category.tsx new file mode 100644 index 0000000..635c54e --- /dev/null +++ b/examples/e-commerce/src/pages/category.tsx @@ -0,0 +1,26 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { CardList } from "../components/CardList"; +import { components } from "../domains/product"; + +async function Loading(this: SeqflowFunctionContext) { + this.renderSync(
    Loading...
    ); +} + +export async function Category(this: SeqflowFunctionContext) { + this.renderSync(); + + const categoryId = this.app.router.segments.pop(); + + const products = await this.app.domains.product.fetchProductsByCategory( + { categoryId }, + this.abortController.signal, + ); + + this.renderSync( + , + ); +} diff --git a/examples/e-commerce/src/pages/checkout.ts b/examples/e-commerce/src/pages/checkout.ts deleted file mode 100644 index e33ddb1..0000000 --- a/examples/e-commerce/src/pages/checkout.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentParam } from "seqflow-js"; - -export async function Checkout({ - dom, - event, - domains, - router, -}: ComponentParam) { - domains.cart.checkout(); - - dom.render(` -

    Well done!

    -Go home -`); - const goHomeAfterCheckout = dom.querySelector("#go-home-after-checkout"); - - const events = event.waitEvent(event.domEvent("click")); - for await (const ev of events) { - if (ev.target === goHomeAfterCheckout) { - ev.preventDefault(); - router.navigate("/"); - } - } -} diff --git a/examples/e-commerce/src/pages/checkout.tsx b/examples/e-commerce/src/pages/checkout.tsx new file mode 100644 index 0000000..ee8e704 --- /dev/null +++ b/examples/e-commerce/src/pages/checkout.tsx @@ -0,0 +1,22 @@ +import { SeqflowFunctionContext } from "seqflow-js"; + +export async function Checkout(this: SeqflowFunctionContext) { + this.app.domains.cart.checkout(); + + const goHomeAfterCheckout = Go home; + + this.renderSync( + <> +

    Well done!

    + {goHomeAfterCheckout} + , + ); + + const events = this.waitEvents( + this.domEvent("click", { el: goHomeAfterCheckout }), + ); + for await (const ev of events) { + ev.preventDefault(); + this.app.router.navigate("/"); + } +} diff --git a/examples/e-commerce/src/pages/home.ts b/examples/e-commerce/src/pages/home.ts deleted file mode 100644 index b567377..0000000 --- a/examples/e-commerce/src/pages/home.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { components } from "../domains/product"; - -async function Loading({ dom: { render } }: ComponentParam) { - render("
    Loading...
    "); -} - -export async function Home({ dom, signal, domains }: ComponentParam) { - dom.render(` -
    -
    -
    -
    `); - dom.child("loading", Loading); - - const loadingElement = dom.querySelector("#loading"); - - const categories = await domains.product.fetchProductsCategories(signal); - - loadingElement.remove(); - - dom.child("categories", components.ProductCategoryList, { - data: { categories }, - }); -} diff --git a/examples/e-commerce/src/pages/home.tsx b/examples/e-commerce/src/pages/home.tsx new file mode 100644 index 0000000..dfd0d0d --- /dev/null +++ b/examples/e-commerce/src/pages/home.tsx @@ -0,0 +1,16 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { components } from "../domains/product"; + +async function Loading(this: SeqflowFunctionContext) { + this.renderSync(
    Loading...
    ); +} + +export async function Home(this: SeqflowFunctionContext) { + this.renderSync(); + + const categories = await this.app.domains.product.fetchProductsCategories( + this.abortController.signal, + ); + + this.renderSync(); +} diff --git a/examples/e-commerce/src/pages/login.ts b/examples/e-commerce/src/pages/login.ts deleted file mode 100644 index 05604d0..0000000 --- a/examples/e-commerce/src/pages/login.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { UserType } from "../domains/user"; - -export async function Login({ dom, event, domains, router }: ComponentParam) { - dom.render(`
    -
    - - -

    - -
    -
    `); - - const el = dom.querySelector('input[name="username"]'); - const p = dom.querySelector(".error"); - const button = dom.querySelector("button"); - - const events = event.waitEvent(event.domEvent("submit")); - let user: UserType | undefined; - for await (const ev of events) { - ev.preventDefault(); - button.disabled = true; - const username = el.value; - - user = await domains.user.login({ username }); - if (!user) { - p.textContent = 'User not found. Try "johnd"'; - button.disabled = false; - continue; - } - break; - } - - router.navigate("/"); -} diff --git a/examples/e-commerce/src/pages/login.tsx b/examples/e-commerce/src/pages/login.tsx new file mode 100644 index 0000000..b6f0696 --- /dev/null +++ b/examples/e-commerce/src/pages/login.tsx @@ -0,0 +1,40 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { UserType } from "../domains/user"; + +export async function Login(this: SeqflowFunctionContext) { + const el = ( + + ) as HTMLInputElement; + const error =

    ; + const submit = () as HTMLButtonElement; + + this.renderSync( +

    +
    + + {el} + {error} + {submit} +
    +
    , + ); + + const events = this.waitEvents( + this.domEvent("submit", { el: this._el, preventDefault: true }), + ); + let user: UserType | undefined; + for await (const ev of events) { + submit.disabled = true; + const username = el.value; + + user = await this.app.domains.user.login({ username }); + if (!user) { + error.textContent = 'User not found. Try "johnd"'; + submit.disabled = false; + continue; + } + break; + } + + this.app.router.navigate("/"); +} diff --git a/examples/e-commerce/src/pages/logout.ts b/examples/e-commerce/src/pages/logout.ts deleted file mode 100644 index ce2635e..0000000 --- a/examples/e-commerce/src/pages/logout.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ComponentParam } from "seqflow-js"; - -export async function Logout({ dom, event, domains, router }: ComponentParam) { - // blank - dom.render(""); - await domains.user.logout(); - router.navigate("/"); -} diff --git a/examples/e-commerce/src/pages/logout.tsx b/examples/e-commerce/src/pages/logout.tsx new file mode 100644 index 0000000..6642338 --- /dev/null +++ b/examples/e-commerce/src/pages/logout.tsx @@ -0,0 +1,8 @@ +import { SeqflowFunctionContext } from "seqflow-js"; + +export async function Logout(this: SeqflowFunctionContext) { + // blank + this.renderSync(""); + await this.app.domains.user.logout(); + this.app.router.navigate("/"); +} diff --git a/examples/e-commerce/src/pages/profile.ts b/examples/e-commerce/src/pages/profile.ts deleted file mode 100644 index 7088336..0000000 --- a/examples/e-commerce/src/pages/profile.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ComponentParam } from "seqflow-js"; - -export async function Profile({ dom, router, domains }: ComponentParam) { - const user = await domains.user.getUser(); - if (!user) { - router.navigate("/login"); - return; - } - dom.render(` -
    -

    Profile

    -
    -
    Username
    -
    ${user.username}
    -
    Email
    -
    ${user.email}
    -
    -
    `); -} diff --git a/examples/e-commerce/src/pages/profile.tsx b/examples/e-commerce/src/pages/profile.tsx new file mode 100644 index 0000000..9748b99 --- /dev/null +++ b/examples/e-commerce/src/pages/profile.tsx @@ -0,0 +1,20 @@ +import { SeqflowFunctionContext } from "seqflow-js"; + +export async function Profile(this: SeqflowFunctionContext) { + const user = await this.app.domains.user.getUser(); + if (!user) { + this.app.router.navigate("/login"); + return; + } + this.renderSync( +
    +

    Profile

    +
    +
    Username
    +
    {user.username}
    +
    Email
    +
    {user.email}
    +
    +
    , + ); +} diff --git a/examples/e-commerce/src/router.module.css b/examples/e-commerce/src/router.module.css index 710a43f..bf7231c 100644 --- a/examples/e-commerce/src/router.module.css +++ b/examples/e-commerce/src/router.module.css @@ -5,13 +5,14 @@ overflow: hidden; height: 100vh; - #main { - flex-grow: 1; + .main { + flex: 1; + display: flex; overflow: auto; + padding-bottom: 40px; > div { - width: 800px; - margin: auto; + width: 100%; } } } \ No newline at end of file diff --git a/examples/e-commerce/src/router.ts b/examples/e-commerce/src/router.tsx similarity index 54% rename from examples/e-commerce/src/router.ts rename to examples/e-commerce/src/router.tsx index 231ba79..63c2b1f 100644 --- a/examples/e-commerce/src/router.ts +++ b/examples/e-commerce/src/router.tsx @@ -1,4 +1,4 @@ -import { ComponentParam, NavigationEvent } from "seqflow-js"; +import { NavigationEvent, SeqflowFunctionContext } from "seqflow-js"; import { Header } from "./components/header"; import { components } from "./domains/cart"; import { UserType } from "./domains/user"; @@ -11,12 +11,13 @@ import { Logout } from "./pages/logout"; import { Profile } from "./pages/profile"; import classes from "./router.module.css"; -async function NotFound({ dom: { render } }: ComponentParam) { - render(` -
    -

    404

    -

    Not found

    -
    `); +async function NotFound(this: SeqflowFunctionContext) { + this.renderSync( +
    +

    404

    +

    Not found

    +
    , + ); } function getComponent(path: string) { @@ -40,26 +41,24 @@ function getComponent(path: string) { } } -export async function Router({ dom, event, domains, router }: ComponentParam) { - dom.render(` -
    - -
    -
    -
    `); - const user: UserType | undefined = await domains.user.getUser(); - dom.child("header", Header, { - data: { user }, - }); - dom.child("checkout-tooltip", components.CartTooltip); +export async function Router(this: SeqflowFunctionContext) { + const user: UserType | undefined = await this.app.domains.user.getUser(); + const Component = getComponent(window.location.pathname); + this.renderSync( +
    +
    + + +
    , + ); - // Default route - dom.child(classes.main, getComponent(window.location.pathname)); - - const events = event.waitEvent(event.navigationEvent()); + const events = this.waitEvents(this.navigationEvent()); for await (const ev of events) { if (ev instanceof NavigationEvent) { - dom.child(classes.main, getComponent(ev.path)); + this.replaceChild("main", () => { + const Component = getComponent(ev.path); + return ; + }); } else { console.error("Unknown event", ev); } diff --git a/examples/e-commerce/src/tsconfig.json b/examples/e-commerce/src/tsconfig.json deleted file mode 100644 index 35e2288..0000000 --- a/examples/e-commerce/src/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "compilerOptions": { - "lib": ["ES2023", "dom"], - "downlevelIteration": true - } -} \ No newline at end of file diff --git a/examples/e-commerce/tests/index.test.ts b/examples/e-commerce/tests/index.test.ts index ff926a6..d102d10 100644 --- a/examples/e-commerce/tests/index.test.ts +++ b/examples/e-commerce/tests/index.test.ts @@ -1,15 +1,46 @@ -import { screen, waitFor } from "@testing-library/dom"; +import { + screen, + waitFor, + waitForElementToBeRemoved, +} from "@testing-library/dom"; import { http, HttpResponse } from "msw"; import { setupServer } from "msw/node"; -import { start } from "seqflow-js"; +import { InMemoryRouter, start } from "seqflow-js"; import { afterAll, afterEach, beforeAll, expect, test } from "vitest"; +import { s } from "vitest/dist/reporters-MmQN-57K"; import { Main } from "../src/Main"; import { CartDomain } from "../src/domains/cart"; import { ProductDomain } from "../src/domains/product"; import { UserDomain } from "../src/domains/user"; const server = setupServer( + http.get("/users", () => { + return HttpResponse.json([ + { + address: { + geolocation: { + lat: "-37.3159", + long: "81.1496", + }, + city: "kilcoole", + street: "new road", + number: 7682, + zipcode: "12926-3874", + }, + id: 1, + email: "john@gmail.com", + username: "johnd", + password: "m38rmF$", + name: { + firstname: "john", + lastname: "doe", + }, + phone: "1-570-236-7033", + __v: 0, + }, + ]); + }), http.get("/products/categories", () => { return HttpResponse.json([ "electronics", @@ -92,7 +123,8 @@ beforeAll(() => server.listen()); afterEach(() => server.resetHandlers()); afterAll(() => server.close()); -test("should increment and decrement the counter", async () => { +test("The user should buy products", async () => { + const router = new InMemoryRouter(new EventTarget(), "/"); start(document.body, Main, undefined, { domains: { user: (eventTarget, _, config) => { @@ -101,10 +133,11 @@ test("should increment and decrement the counter", async () => { cart: (eventTarget, _, config) => { return new CartDomain(eventTarget); }, - product: (eventTarget, _, config) => { - return new ProductDomain(eventTarget, config); + product: (_1, _, config) => { + return new ProductDomain(config); }, }, + router, config: { api: { baseUrl: "", @@ -118,10 +151,50 @@ test("should increment and decrement the counter", async () => { const electronicsCategory = await screen.findByText(/electronics/i); electronicsCategory.click(); + // Wait for the products to be rendered + await screen.findByText( + /WD 2TB Elements Portable External Hard Drive - USB 3.0/i, + ); + const cartButtons = await screen.findAllByText(/Add to cart/i); expect(cartButtons).toHaveLength(6); + // Add 2 products to the cart cartButtons[0].click(); + cartButtons[2].click(); const goToCheckoutTooltipAfter = await screen.findByText(/Go to checkout/i); goToCheckoutTooltipAfter.click(); + + // The user should see the total price + await screen.findByText(/total: 173 €/i); + + const goToLoginButton = await screen.findByText(/Go to login/i); + expect(goToLoginButton).toBeVisible(); + goToLoginButton.click(); + + await screen.findByText(/login/i); + + const input: HTMLInputElement = await screen.findByLabelText(/username/i); + input.value = "johnd"; + const loginButton = await screen.findByText(/login/i); + loginButton.click(); + + await screen.findByText(/electronics/i); + + const cartImage = await screen.findByTitle(/go to cart/i); + cartImage.click(); + + // The user should see the total price + const total = await screen.findByText(/total: 173 €/i); + expect(total).toBeVisible(); + + const checkoutButton = await screen.findByRole("button", { + name: /checkout/i, + }); + checkoutButton.click(); + + const goHomeLink = await screen.findByText(/Go home/i); + goHomeLink.click(); + + await screen.findByText(/electronics/i); }); diff --git a/examples/e-commerce/tsconfig.json b/examples/e-commerce/tsconfig.json new file mode 100644 index 0000000..98fc268 --- /dev/null +++ b/examples/e-commerce/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "lib": ["es2015", "dom"], + "downlevelIteration": true, + "jsx": "react", + "jsxFactory": "this.createDOMElement", + "jsxFragmentFactory": "this.createDOMFragment" + }, + "include": ["./src/**/*", "./tests/**/*"] +} diff --git a/examples/empty/src/Main.ts b/examples/empty/src/Main.ts deleted file mode 100644 index 02d18e3..0000000 --- a/examples/empty/src/Main.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ComponentParam } from "seqflow-js"; - -export async function Main({ dom }: ComponentParam) { - dom.render("Hi!"); -} diff --git a/examples/empty/src/Main.tsx b/examples/empty/src/Main.tsx new file mode 100644 index 0000000..339aae0 --- /dev/null +++ b/examples/empty/src/Main.tsx @@ -0,0 +1,5 @@ +import { SeqflowFunctionContext } from "seqflow-js"; + +export async function Main(this: SeqflowFunctionContext) { + this.renderSync(
    Hi!
    ); +} diff --git a/examples/empty/src/index.ts b/examples/empty/src/index.ts index 07a1f7c..5521437 100644 --- a/examples/empty/src/index.ts +++ b/examples/empty/src/index.ts @@ -2,4 +2,6 @@ import { start } from "seqflow-js"; import { Main } from "./Main"; import "./index.css"; -start(document.getElementById("root"), Main); +start(document.getElementById("root"), Main, undefined, { + log: (l) => console.log(l), +}); diff --git a/examples/empty/src/tsconfig.json b/examples/empty/src/tsconfig.json deleted file mode 100644 index 396b39b..0000000 --- a/examples/empty/src/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "compilerOptions": { - "lib": ["es2015", "dom"] - } -} \ No newline at end of file diff --git a/examples/empty/tests/index.test.ts b/examples/empty/tests/index.test.ts index f1f2d22..48a488b 100644 --- a/examples/empty/tests/index.test.ts +++ b/examples/empty/tests/index.test.ts @@ -1,3 +1,9 @@ +import { screen } from "@testing-library/dom"; +import { start } from "seqflow-js"; import { test } from "vitest"; +import { Main } from "../src/Main"; -test("should increment and decrement the counter", async () => {}); +test("should render hi", async () => { + start(document.body, Main, undefined, {}); + await screen.findByText(/Hi!/i); +}); diff --git a/examples/empty/tsconfig.json b/examples/empty/tsconfig.json new file mode 100644 index 0000000..29ecf96 --- /dev/null +++ b/examples/empty/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "lib": ["es2015", "dom"], + "jsx": "react", + "jsxFactory": "this.createDOMElement", + "jsxFragmentFactory": "this.createDOMFragment" + }, + "include": ["./src/**/*", "./tests/**/*"] +} diff --git a/packages/seqflow-js/README.md b/packages/seqflow-js/README.md deleted file mode 100644 index e3c65e9..0000000 --- a/packages/seqflow-js/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# SeqFlow JS - -SeqFlowJS is a JavaScript library for creating and managing frontend workflows. The core ideas are: -- Linearity over Complex Abstractions -- Explicitness over Implicitiveness - -## Installation - -```bash -npm install seqflow-js -``` - -## Usage - -```ts -import { start, ComponentParam } from 'seqflow-js' - -async function main({ dom, event }: ComponentParam) { - let counter = 0 - dom.render(` -
    - - -
    -
    ${counter}
    -`) - - const decrementButton = dom.querySelector('#decrement')! - const incrementButton = dom.querySelector('#increment')! - const counterDiv = dom.querySelector('#counter')! - - const events = event.waitEvent( - event.domEvent('click') - ) - for await (const ev of events) { - if (ev.target === incrementButton) { - counter++ - } else if (ev.target === decrementButton) { - counter-- - } - - counterDiv.textContent = `${counter}` - } -} - -start(document.getElementById('root')!, main) -``` - diff --git a/packages/seqflow-js/package.json b/packages/seqflow-js/package.json index e2d1a39..97d1d0a 100644 --- a/packages/seqflow-js/package.json +++ b/packages/seqflow-js/package.json @@ -1,34 +1,31 @@ { "name": "seqflow-js", - "version": "0.0.1-beta.4", - "description": "A framework to write products efficiently", - "main": "dist/index.js", + "version": "1.0.0", + "description": "", + "main": "./dist/index.mjs", "types": "./dist/index.d.ts", - "type": "module", - "files": [ - "dist" - ], "scripts": { "test": "npm-run-all biome unit build", - "unit": "vitest --run", + "unit": "vitest --run --coverage", "biome": "biome ci ./src", "biome:check": "biome check --apply src tests", "build": "vite build -c vite.config.js" }, - "keywords": [], - "author": "Tommaso Allevi ", "devDependencies": { - "@biomejs/biome": "1.5.3", - "@testing-library/dom": "^9.3.4", + "@biomejs/biome": "1.7.1", + "@testing-library/dom": "^10.0.0", "@types/css-modules": "^1.0.5", "@types/jsdom": "^21.1.6", - "@vitest/coverage-v8": "^1.2.2", + "@vitest/coverage-v8": "^1.5.2", "jsdom": "^24.0.0", "npm-run-all": "^4.1.5", - "typedoc": "^0.25.12", - "vite": "^5.0.0", - "vite-plugin-dts": "^3.6.4", - "vitest": "^1.2.2" + "tsd": "^0.31.0", + "typedoc": "^0.25.13", + "vite": "^5.2.10", + "vite-plugin-dts": "^3.9.0", + "vitest": "^1.5.2" }, - "license": "MIT" -} \ No newline at end of file + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/packages/seqflow-js/pnpm-lock.yaml b/packages/seqflow-js/pnpm-lock.yaml deleted file mode 100644 index 32749e9..0000000 --- a/packages/seqflow-js/pnpm-lock.yaml +++ /dev/null @@ -1,2973 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -devDependencies: - '@biomejs/biome': - specifier: 1.5.3 - version: 1.5.3 - '@testing-library/dom': - specifier: ^9.3.4 - version: 9.3.4 - '@types/css-modules': - specifier: ^1.0.5 - version: 1.0.5 - '@types/jsdom': - specifier: ^21.1.6 - version: 21.1.6 - '@vitest/coverage-v8': - specifier: ^1.2.2 - version: 1.2.2(vitest@1.2.2) - jsdom: - specifier: ^24.0.0 - version: 24.0.0 - npm-run-all: - specifier: ^4.1.5 - version: 4.1.5 - vite: - specifier: ^5.0.0 - version: 5.0.12 - vite-plugin-dts: - specifier: ^3.6.4 - version: 3.7.2(typescript@5.3.3)(vite@5.0.12) - vitest: - specifier: ^1.2.2 - version: 1.2.2(jsdom@24.0.0) - -packages: - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 - dev: true - - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.23.9: - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.9 - dev: true - - /@babel/runtime@7.23.9: - resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: true - - /@babel/types@7.23.9: - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - - /@biomejs/biome@1.5.3: - resolution: {integrity: sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==} - engines: {node: '>=14.*'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.5.3 - '@biomejs/cli-darwin-x64': 1.5.3 - '@biomejs/cli-linux-arm64': 1.5.3 - '@biomejs/cli-linux-arm64-musl': 1.5.3 - '@biomejs/cli-linux-x64': 1.5.3 - '@biomejs/cli-linux-x64-musl': 1.5.3 - '@biomejs/cli-win32-arm64': 1.5.3 - '@biomejs/cli-win32-x64': 1.5.3 - dev: true - - /@biomejs/cli-darwin-arm64@1.5.3: - resolution: {integrity: sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==} - engines: {node: '>=14.*'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-darwin-x64@1.5.3: - resolution: {integrity: sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==} - engines: {node: '>=14.*'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-linux-arm64-musl@1.5.3: - resolution: {integrity: sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==} - engines: {node: '>=14.*'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-linux-arm64@1.5.3: - resolution: {integrity: sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==} - engines: {node: '>=14.*'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-linux-x64-musl@1.5.3: - resolution: {integrity: sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==} - engines: {node: '>=14.*'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-linux-x64@1.5.3: - resolution: {integrity: sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==} - engines: {node: '>=14.*'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-win32-arm64@1.5.3: - resolution: {integrity: sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==} - engines: {node: '>=14.*'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-win32-x64@1.5.3: - resolution: {integrity: sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==} - engines: {node: '>=14.*'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.22: - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@microsoft/api-extractor-model@7.28.3: - resolution: {integrity: sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0 - transitivePeerDependencies: - - '@types/node' - dev: true - - /@microsoft/api-extractor@7.39.0: - resolution: {integrity: sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==} - hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.28.3 - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0 - '@rushstack/rig-package': 0.5.1 - '@rushstack/ts-command-line': 4.17.1 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.3.3 - transitivePeerDependencies: - - '@types/node' - dev: true - - /@microsoft/tsdoc-config@0.16.2: - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - dev: true - - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: true - - /@rollup/pluginutils@5.1.0: - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - dev: true - - /@rollup/rollup-android-arm-eabi@4.9.6: - resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm64@4.9.6: - resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-arm64@4.9.6: - resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-x64@4.9.6: - resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm-gnueabihf@4.9.6: - resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-gnu@4.9.6: - resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-musl@4.9.6: - resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-riscv64-gnu@4.9.6: - resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-gnu@4.9.6: - resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-musl@4.9.6: - resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.9.6: - resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-ia32-msvc@4.9.6: - resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-x64-msvc@4.9.6: - resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rushstack/node-core-library@3.62.0: - resolution: {integrity: sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - dependencies: - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - dev: true - - /@rushstack/rig-package@0.5.1: - resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} - dependencies: - resolve: 1.22.8 - strip-json-comments: 3.1.1 - dev: true - - /@rushstack/ts-command-line@4.17.1: - resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.2 - dev: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@testing-library/dom@9.3.4: - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.9 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: true - - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true - - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true - - /@types/css-modules@1.0.5: - resolution: {integrity: sha512-oeKafs/df9lwOvtfiXVliZsocFVOexK9PZtLQWuPeuVCFR7jwiqlg60lu80JTe5NFNtH3tnV6Fs/ySR8BUPHAw==} - dev: true - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/jsdom@21.1.6: - resolution: {integrity: sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==} - dependencies: - '@types/node': 20.11.16 - '@types/tough-cookie': 4.0.5 - parse5: 7.1.2 - dev: true - - /@types/node@20.11.16: - resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==} - dependencies: - undici-types: 5.26.5 - dev: true - - /@types/tough-cookie@4.0.5: - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - dev: true - - /@vitest/coverage-v8@1.2.2(vitest@1.2.2): - resolution: {integrity: sha512-IHyKnDz18SFclIEEAHb9Y4Uxx0sPKC2VO1kdDCs1BF6Ip4S8rQprs971zIsooLUn7Afs71GRxWMWpkCGZpRMhw==} - peerDependencies: - vitest: ^1.0.0 - dependencies: - '@ampproject/remapping': 2.2.1 - '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - magic-string: 0.30.6 - magicast: 0.3.3 - picocolors: 1.0.0 - std-env: 3.7.0 - test-exclude: 6.0.0 - v8-to-istanbul: 9.2.0 - vitest: 1.2.2(jsdom@24.0.0) - transitivePeerDependencies: - - supports-color - dev: true - - /@vitest/expect@1.2.2: - resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} - dependencies: - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 - chai: 4.4.1 - dev: true - - /@vitest/runner@1.2.2: - resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} - dependencies: - '@vitest/utils': 1.2.2 - p-limit: 5.0.0 - pathe: 1.1.2 - dev: true - - /@vitest/snapshot@1.2.2: - resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} - dependencies: - magic-string: 0.30.6 - pathe: 1.1.2 - pretty-format: 29.7.0 - dev: true - - /@vitest/spy@1.2.2: - resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} - dependencies: - tinyspy: 2.2.0 - dev: true - - /@vitest/utils@1.2.2: - resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true - - /@volar/language-core@1.11.1: - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - dependencies: - '@volar/source-map': 1.11.1 - dev: true - - /@volar/source-map@1.11.1: - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - dependencies: - muggle-string: 0.3.1 - dev: true - - /@volar/typescript@1.11.1: - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - dependencies: - '@volar/language-core': 1.11.1 - path-browserify: 1.0.1 - dev: true - - /@vue/compiler-core@3.4.15: - resolution: {integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==} - dependencies: - '@babel/parser': 7.23.9 - '@vue/shared': 3.4.15 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: true - - /@vue/compiler-dom@3.4.15: - resolution: {integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==} - dependencies: - '@vue/compiler-core': 3.4.15 - '@vue/shared': 3.4.15 - dev: true - - /@vue/language-core@1.8.27(typescript@5.3.3): - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.15 - '@vue/shared': 3.4.15 - computeds: 0.0.1 - minimatch: 9.0.3 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - typescript: 5.3.3 - vue-template-compiler: 2.7.16 - dev: true - - /@vue/shared@3.4.15: - resolution: {integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==} - dev: true - - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.3 - dev: true - - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.4 - dev: true - - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.2 - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - - /available-typed-arrays@1.0.6: - resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==} - engines: {node: '>= 0.4'} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.3 - set-function-length: 1.2.0 - dev: true - - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.1 - dev: true - - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /colors@1.2.5: - resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} - engines: {node: '>=0.1.90'} - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - requiresBuild: true - dev: true - optional: true - - /computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} - dependencies: - rrweb-cssom: 0.6.0 - dev: true - - /data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - dev: true - - /de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.5 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.3 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.1 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 - dev: true - - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - dev: true - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 - object-keys: 1.1.1 - dev: true - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true - - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /es-abstract@1.22.4: - resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.6 - call-bind: 1.0.7 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.2 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.1 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.1 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.1 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 - dev: true - - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - dev: true - - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true - - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.3 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.1 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true - - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.5 - dev: true - - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.2.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - functions-have-names: 1.2.3 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - - /get-intrinsic@1.2.3: - resolution: {integrity: sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - dev: true - - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.1 - dev: true - - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.3 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - dependencies: - get-intrinsic: 1.2.3 - dev: true - - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - dependencies: - es-define-property: 1.0.0 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true - - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - dependencies: - whatwg-encoding: 3.1.1 - dev: true - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.3 - hasown: 2.0.0 - side-channel: 1.0.4 - dev: true - - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - hasown: 2.0.1 - side-channel: 1.0.4 - dev: true - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.2 - dev: true - - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.3 - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.2 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true - - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true - - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.2 - dev: true - - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.5 - dev: true - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.14 - dev: true - - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.7 - dev: true - - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.3 - dev: true - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /jsdom@24.0.0: - resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.16.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - dev: true - - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.5.0 - pkg-types: 1.0.3 - dev: true - - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true - - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: true - - /magic-string@0.30.6: - resolution: {integrity: sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /magicast@0.3.3: - resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} - dependencies: - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 - source-map-js: 1.0.2 - dev: true - - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: true - - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /mlly@1.5.0: - resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.3.2 - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - dev: true - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true - - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - - /npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true - dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.5 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.8.1 - string.prototype.padend: 3.1.5 - dev: true - - /npm-run-path@5.2.0: - resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true - - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true - - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - dev: true - - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.1 - mlly: 1.5.0 - pathe: 1.1.2 - dev: true - - /postcss@8.4.33: - resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true - - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - set-function-name: 2.0.1 - dev: true - - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.1 - dev: true - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - - /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - dev: true - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /rollup@4.9.6: - resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.6 - '@rollup/rollup-android-arm64': 4.9.6 - '@rollup/rollup-darwin-arm64': 4.9.6 - '@rollup/rollup-darwin-x64': 4.9.6 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 - '@rollup/rollup-linux-arm64-gnu': 4.9.6 - '@rollup/rollup-linux-arm64-musl': 4.9.6 - '@rollup/rollup-linux-riscv64-gnu': 4.9.6 - '@rollup/rollup-linux-x64-gnu': 4.9.6 - '@rollup/rollup-linux-x64-musl': 4.9.6 - '@rollup/rollup-win32-arm64-msvc': 4.9.6 - '@rollup/rollup-win32-ia32-msvc': 4.9.6 - '@rollup/rollup-win32-x64-msvc': 4.9.6 - fsevents: 2.3.3 - dev: true - - /rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: true - - /safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - dev: true - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - dependencies: - xmlchars: 2.2.0 - dev: true - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /set-function-length@1.2.0: - resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - function-bind: 1.1.2 - get-intrinsic: 1.2.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - dev: true - - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 - dev: true - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.3 - object-inspect: 1.13.1 - dev: true - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - dev: true - - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - dev: true - - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - dev: true - - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.6 - dev: true - - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true - - /string.prototype.padend@3.1.5: - resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.4 - dev: true - - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - dev: true - - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - dev: true - - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} - dependencies: - acorn: 8.11.3 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} - dev: true - - /tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.2.0: - resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} - engines: {node: '>=14.0.0'} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: true - - /tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - dependencies: - punycode: 2.3.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typed-array-buffer@1.0.1: - resolution: {integrity: sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - dev: true - - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.13 - dev: true - - /typed-array-byte-offset@1.0.1: - resolution: {integrity: sha512-tcqKMrTRXjqvHN9S3553NPCaGL0VPgFI92lXszmrE8DMhiDPLBYLlvo8Uu4WZAAX/aGqp/T1sbA4ph8EWjDF9Q==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.6 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.1 - is-typed-array: 1.1.13 - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - is-typed-array: 1.1.13 - dev: true - - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /ufo@1.3.2: - resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} - dev: true - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.22 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - dev: true - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} - engines: {node: '>= 0.10'} - dev: true - - /vite-node@1.2.2: - resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.0.12 - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite-plugin-dts@3.7.2(typescript@5.3.3)(vite@5.0.12): - resolution: {integrity: sha512-kg//1nDA01b8rufJf4TsvYN8LMkdwv0oBYpiQi6nRwpHyue+wTlhrBiqgipdFpMnW1oOYv6ywmzE5B0vg6vSEA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - '@microsoft/api-extractor': 7.39.0 - '@rollup/pluginutils': 5.1.0 - '@vue/language-core': 1.8.27(typescript@5.3.3) - debug: 4.3.4 - kolorist: 1.8.0 - typescript: 5.3.3 - vite: 5.0.12 - vue-tsc: 1.8.27(typescript@5.3.3) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - dev: true - - /vite@5.0.12: - resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.19.12 - postcss: 8.4.33 - rollup: 4.9.6 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /vitest@1.2.2(jsdom@24.0.0): - resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': ^1.0.0 - '@vitest/ui': ^1.0.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - dependencies: - '@vitest/expect': 1.2.2 - '@vitest/runner': 1.2.2 - '@vitest/snapshot': 1.2.2 - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 - acorn-walk: 8.3.2 - cac: 6.7.14 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 - jsdom: 24.0.0 - local-pkg: 0.5.0 - magic-string: 0.30.6 - pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 1.3.0 - tinybench: 2.6.0 - tinypool: 0.8.2 - vite: 5.0.12 - vite-node: 1.2.2 - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - dev: true - - /vue-tsc@1.8.27(typescript@5.3.3): - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true - peerDependencies: - typescript: '*' - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.3.3) - semver: 7.5.4 - typescript: 5.3.3 - dev: true - - /w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - dependencies: - xml-name-validator: 5.0.0 - dev: true - - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true - - /whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - dependencies: - iconv-lite: 0.6.3 - dev: true - - /whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - dev: true - - /whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - dev: true - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - - /which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.6 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - dev: true - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - dev: true - - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.11.0 - optionalDependencies: - commander: 9.5.0 - dev: true diff --git a/packages/seqflow-js/src/domains.ts b/packages/seqflow-js/src/domains.ts new file mode 100644 index 0000000..f53d626 --- /dev/null +++ b/packages/seqflow-js/src/domains.ts @@ -0,0 +1,36 @@ +import type { Domains } from "./index"; + +export class DomainEvent extends Event implements CustomEvent { + static domainName: keyof Domains; + static t: string; + detail: T; + + constructor(detail: T, eventType = "") { + super(eventType, { bubbles: true }); + this.detail = detail; + } + + /* v8 ignore next 3 */ + initCustomEvent(): void { + throw new Error("Method not implemented."); + } +} +export type GetDataType = T extends DomainEvent + ? R + : "T is not a DomainEvent"; +export type GetArrayOf = () => T[]; + +export function createDomainEventClass( + domainName: keyof Domains, + type: string, +) { + class CustomBusinessEvent extends DomainEvent { + static readonly domainName = domainName; + static readonly t = type; + + constructor(detail: T) { + super(detail, type); + } + } + return CustomBusinessEvent; +} diff --git a/packages/seqflow-js/src/event-utils.ts b/packages/seqflow-js/src/event-utils.ts deleted file mode 100644 index 5cf9b4b..0000000 --- a/packages/seqflow-js/src/event-utils.ts +++ /dev/null @@ -1,54 +0,0 @@ -interface IterOnEventsConfig { - preventDefault: boolean; - stopPropagation: boolean; - stopImmediatePropagation: boolean; -} - -const WAKEUP_EVENT = new Event("wakeup"); - -export function iterOnEvents( - target: EventTarget, - eventType: string, - config: IterOnEventsConfig, -): (c: AbortController) => AsyncGenerator { - async function* iterOnDomEvent(controller: AbortController) { - const queue: T[] = []; - - target.addEventListener( - eventType, - (e: Event) => { - if (config.preventDefault) e.preventDefault(); - if (config.stopPropagation) e.stopPropagation(); - if (config.stopImmediatePropagation) e.stopImmediatePropagation(); - - queue.push(e as T); - - controller.signal.dispatchEvent(WAKEUP_EVENT); - }, - { - signal: controller.signal, - }, - ); - - while (true) { - controller.signal.throwIfAborted(); - - if (queue.length > 0) { - yield queue.shift() as T; - } else { - await new Promise((resolve) => { - controller.signal.addEventListener( - WAKEUP_EVENT.type, - () => resolve(), - { - once: true, - signal: controller.signal, - }, - ); - }); - } - } - } - - return iterOnDomEvent; -} diff --git a/packages/seqflow-js/src/events.ts b/packages/seqflow-js/src/events.ts new file mode 100644 index 0000000..7d1485a --- /dev/null +++ b/packages/seqflow-js/src/events.ts @@ -0,0 +1,112 @@ +export type EventAsyncGenerator = ( + abortController: AbortController, +) => AsyncGenerator; + +const wakeupEventName = "wakeup"; +export const WAKEUP_EVENT = new Event(wakeupEventName); + +export function yieldEvent( + eventType: string, + options: { + el: EventTarget; + preventDefault: boolean; + }, +): EventAsyncGenerator { + async function* iterOnEvents(abortController: AbortController) { + // If already aborted, throw immediately + abortController.signal.throwIfAborted(); + + const queue: E[] = []; + options.el.addEventListener( + eventType, + (event) => { + if (options.preventDefault) { + event.preventDefault(); + } + queue.push(event as E); + abortController.signal.dispatchEvent(WAKEUP_EVENT); + }, + { + signal: abortController.signal, + }, + ); + + while (true) { + abortController.signal.throwIfAborted(); + + if (queue.length > 0) { + const ev = queue.shift(); + if (ev) { + yield ev; + } + } else { + await new Promise((resolve) => { + abortController.signal.addEventListener( + wakeupEventName, + () => resolve(), + { + once: true, + signal: abortController.signal, + }, + ); + }); + } + } + } + + return iterOnEvents; +} + +export async function* combineEvents( + childAbortController: AbortController, + ...fns: EventAsyncGenerator[] +): AsyncGenerator { + if (fns.length === 0) { + throw new Error("waitEvent needs at least one argument"); + } + + const waitEventsAbortController = new AbortController(); + + if (fns.length === 1) { + childAbortController.signal.addEventListener("abort", () => { + waitEventsAbortController.abort(); + }); + const g = fns[0](waitEventsAbortController); + for await (const e of g) { + yield e; + } + } + const queue: unknown[] = []; + + Promise.all( + fns.map((fn) => { + const it = fn(waitEventsAbortController); + + return (async () => { + for await (const value of it) { + queue.push(value); + waitEventsAbortController.signal.dispatchEvent(WAKEUP_EVENT); + } + })(); + }), + ); + + while (true) { + waitEventsAbortController.signal.throwIfAborted(); + + if (queue.length > 0) { + yield queue.shift() as Awaited; + } else { + await new Promise((resolve) => { + waitEventsAbortController.signal.addEventListener( + WAKEUP_EVENT.type, + () => resolve(), + { + once: true, + signal: waitEventsAbortController.signal, + }, + ); + }); + } + } +} diff --git a/packages/seqflow-js/src/index.ts b/packages/seqflow-js/src/index.ts index c1663ba..52e4053 100644 --- a/packages/seqflow-js/src/index.ts +++ b/packages/seqflow-js/src/index.ts @@ -1,628 +1,547 @@ -import { iterOnEvents } from "./event-utils"; +import * as DomainsPackage from "./domains"; +import { type EventAsyncGenerator, combineEvents } from "./events"; +import { + BrowserRouter, + InMemoryRouter, + NavigationEvent, + type Router, +} from "./router"; +import { domEvent, domainEvent, navigationEvent } from "./typedEvents"; + +export { BrowserRouter, type Router, NavigationEvent, InMemoryRouter }; -export type ChildOption = { - data: T; -}; - -type AbortControllerWithId = AbortController & { id: number }; - -let _abortControllerId = 0; -function generateAbortController() { - const controller = new AbortController(); - (controller as AbortControllerWithId).id = _abortControllerId++; - - return controller; -} - -export class DomainEvent extends Event implements CustomEvent { - static domainName: keyof Domains; - static t: string; - detail: T; +// biome-ignore lint/suspicious/noEmptyInterface: This type is fulfilled by the user +export interface Domains {} - constructor(detail: T, eventType = "") { - super(eventType, { bubbles: true }); - this.detail = detail; - } +export type DomainEvent = DomainsPackage.DomainEvent; +export const createDomainEventClass = DomainsPackage.createDomainEventClass; - /* v8 ignore next 3 */ - initCustomEvent(): void { - throw new Error("Method not implemented."); - } +export interface Log { + type: "info" | "debug" | "error"; + message: string; + data?: unknown; } -export type GetDataType = T extends DomainEvent ? R : never; -export type GetArrayOf = () => T[]; +export type LogFunction = (log: Log) => void; -export function createDomainEventClass( - domainName: keyof Domains, - type: string, -) { - class CustomBusinessEvent extends DomainEvent { - static readonly domainName = domainName; - static readonly t = type; - - constructor(detail: T) { - super(detail, type); - } - } - return CustomBusinessEvent; +export interface SeqflowAppContext { + log: LogFunction; + domains: Domains; + domainEventTargets: { [K in keyof Domains]: EventTarget }; + config: ApplicationConfiguration; + router: Router; } -export interface DomEventOption { - element: HTMLElement; - preventDefault: boolean; - stopPropagation: boolean; - stopImmediatePropagation: boolean; +type GetYieldType> = Exclude< + Awaited["next"]>>, + IteratorReturnResult +>["value"]; + +export interface SeqflowFunctionContext { + app: Readonly; + abortController: AbortController; + createDOMElement( + tagName: string, + options?: { [key: string]: string }, + ...children: JSX.Element[] + ): Node; + createDOMFragment({ + children, + }: { children?: JSX.Element[] }): DocumentFragment; + renderSync: (html: string | JSX.Element) => void; + waitEvents: >[]>( + ...fn: Fns + ) => AsyncGenerator>; + domEvent: ( + eventType: K, + options: { + el: HTMLElement; + preventDefault?: boolean; + }, + ) => EventAsyncGenerator; + domainEvent>( + b: BEE, + ): EventAsyncGenerator>; + navigationEvent(): EventAsyncGenerator; + replaceChild: ( + key: string, + newChild: () => JSX.Element | Promise, + ) => void; + _el: HTMLElement; } -export type AbortableAsyncGenerator = ( - controller: AbortController, -) => AsyncGenerator; +export type SeqflowFunction = ( + this: SeqflowFunctionContext, + data: T, +) => Promise; -export interface ComponentParam { - data: T; - domains: Domains; - signal: AbortSignal; - _controller: AbortController; - router: { - /** - * Navigate to a new path - * - * @param path new path - */ - navigate(path: string); - /** - * Current path segments - */ - segments: string[]; - /** - * Current query parameters - */ - query: Map; - }; - dom: { - /** - * Render HTML to the component - * - * @param html innerHTML to render - */ - render(html: string): void; - /** - * Query a single element inside the current component - * - * @param selector query selector - */ - querySelector(selector: string): E; - /** - * Query all elements inside the current component - * - * @param selector query selector - */ - querySelectorAll(selector): NodeListOf; - /** - * Mount a child component - * - * @param id mount point element id - * @param fn child component function - * @param option child component option - */ - child(id: string, fn: ComponentFn): void; - child(id: string, fn: ComponentFn, option: ChildOption): void; - }; - event: { - /** - * Dispatch a domain event - * - * @param event domain event - */ - dispatchDomainEvent = DomainEvent>( - event: BE, - ); - dispatchEvent(event: Event): void; - /** - * Async generator for DOM event. - * - * @param type event type - */ - domEvent( - type: K, - option?: Partial, - ): AbortableAsyncGenerator; - domainEvent>( - b: BEE, - ): AbortableAsyncGenerator>; - /** - * Async generator for navigation event - */ - navigationEvent(): AbortableAsyncGenerator; - /** - * Combine multiple event generators into one - * - * @param fns event generators - */ - waitEvent( - ...fns: { - [I in keyof T]: AbortableAsyncGenerator; - } - ): AsyncGenerator; +// biome-ignore lint/suspicious/noEmptyInterface: This type is fulfilled by the user +export interface ApplicationConfiguration {} + +export interface SeqflowConfiguration { + log: LogFunction; + config: ApplicationConfiguration; + domains: { + [K in keyof Domains]: ( + eventTarget: EventTarget, + applicationDomainTargets: Readonly<{ + [D in keyof Domains]: EventTarget; + }>, + config: Readonly, + ) => Domains[K]; }; + router: Router; } -/** - * Component function - * - * @typeParam T - The type of the data passed to the component - * - * @param param The component parameter - * - * @returns A promise without a value - */ -export type ComponentFn = ( - param: ComponentParam, -) => Promise; - -function Component( +function startComponent( + parentContext: SeqflowFunctionContext, el: HTMLElement, - fn: (p: ComponentParam) => Promise, - option: ChildOption, - configuration: GlobalConfiguration, + component: SeqflowFunction, + componentOption: T | undefined, ) { - let controller = generateAbortController(); - const children = {} as Record>; - - controller.signal.addEventListener("abort", () => { - for (const mountPoint in children) { - configuration.log({ - msg: "Aborting child component", - data: { - parent: fn.name, - child: mountPoint, - }, - }); - children[mountPoint]._controller.abort("Parent controller aborted"); - } + const componentName = component.name; + parentContext.app.log({ + type: "debug", + message: "startComponent", + data: { componentOption, componentName }, }); - configuration.log({ - msg: "Component Mounted", - data: { - name: fn.name, - id: (controller as AbortControllerWithId).id, + const childAbortController = new AbortController(); + + // When parent is unmouted, we have to abort the child as well + // Because the abort signal is fired only once, we have to use { once: true } + parentContext.abortController.signal.addEventListener( + "abort", + () => { + childAbortController.abort(); }, - }); + { once: true }, + ); + // If this component has a key, probably it's a component that can be replaced in the future + // The parent, when `replaceChild` is called, will dispatch an event to abort this component + // And replace it with a new one + if (componentOption?.key) { + parentContext.abortController.signal.addEventListener( + `abort-component-${componentOption.key}`, + () => { + childAbortController.abort(); + }, + { once: true }, + ); + } - let isFirstRender = true; - const b: Omit, "data"> = { - domains: configuration.domains, - router: { - navigate(path: string) { - configuration.log({ - msg: "Navigating", - data: { - name: fn.name, - path, - }, - }); - let navigationPath = path; - if (navigationPath.startsWith("http")) { - const url = new URL(path); - navigationPath = url.pathname + url.search; - } + // This array will contain all the children of this component + // that has the `key` attribute. Used to replace a child. + const componentChildren: { key: string; el: HTMLElement }[] = []; - configuration.navigationEventBus.dispatchEvent( - new NavigationEvent(navigationPath), - ); - window.history.pushState({}, "", navigationPath); - }, - get segments() { - const segments = window.location.pathname.split("/"); - // first element is always empty - segments.shift(); - return segments; - }, - get query() { - const url = new URL(window.location.href); - return new Map(url.searchParams); - }, + // When we abort the current component, + // we have to erase the above array + // otherwise, it is a memory leak + childAbortController.signal.addEventListener( + "abort", + () => { + while (componentChildren.pop()) {} }, - dom: { - render(html: string) { - configuration.log({ - msg: "Rendering component", - data: { - name: fn.name, - isFirstRender, - }, - }); + { once: true }, + ); - if (!isFirstRender) { - controller.abort("Rerendering the component"); - - for (const mountPoint in children) { - configuration.log({ - msg: "Aborting child component", - data: { - parent: fn.name, - child: mountPoint, - isFirstRender, - }, - }); - children[mountPoint]._controller.abort("Rerendering the component"); - } + const childContext: SeqflowFunctionContext = { + app: parentContext.app, + abortController: childAbortController, + _el: el, + waitEvents: async function* ( + this: SeqflowFunctionContext, + ...fns: EventAsyncGenerator[] + ): AsyncGenerator { + for await (const ev of combineEvents(childAbortController, ...fns)) { + yield ev; + } + }, + replaceChild( + this: SeqflowFunctionContext, + key: string, + newChild: () => JSX.Element | Promise, + ) { + const oldChildIndex = componentChildren.findIndex((c) => c.key === key); + if (oldChildIndex < 0) { + this.app.log({ + type: "error", + message: "replaceChild: wrapper not found", + data: { key, newChild }, + }); + throw new Error("replaceChild: wrapper not found"); + } - isFirstRender = false; + // `this` is the parent component. WHen the user calls `replaceChild`, + // we have to abort the child component dispatching the below event + this.abortController.signal.dispatchEvent( + new Event(`abort-component-${key}`), + ); - controller = generateAbortController(); - } + // Remove the old child from the array, and replace it with the new one + const [oldChild] = componentChildren.splice(oldChildIndex, 1); - el.innerHTML = html; + const { el: wrapper } = oldChild; - configuration.log({ - msg: "Component rendered", - data: { - name: fn.name, - }, + const a = newChild(); + if (a instanceof Promise) { + a.then((child) => { + wrapper.replaceWith(child); }); + return; + } + + wrapper.replaceWith(a); + }, + domEvent( + this: SeqflowFunctionContext, + eventType: K, + options: { + el: HTMLElement; + preventDefault?: boolean; }, - querySelector(selector): T { - return el.querySelector(selector); - }, - querySelectorAll(selector): NodeListOf { - return el.querySelectorAll(selector); - }, - child(...args: unknown[]) { - let id: string; - let childFn: ComponentFn; - let option: ChildOption; - if (args.length === 2) { - id = args[0] as string; - childFn = args[1] as ComponentFn; - option = {} as ChildOption; - } else if (args.length === 3) { - id = args[0] as string; - childFn = args[1] as ComponentFn; - option = args[2] as ChildOption; - } else { - throw new Error("Invalid number of arguments"); + ): EventAsyncGenerator { + return domEvent(eventType, { + el: options.el, + preventDefault: options.preventDefault ?? false, + }); + }, + domainEvent>( + this: SeqflowFunctionContext, + b: BEE, + ): EventAsyncGenerator> { + const domainName = b.domainName; + const eventTarget = parentContext.app.domainEventTargets[domainName]; + return domainEvent(b.t, eventTarget); + }, + navigationEvent(): EventAsyncGenerator { + this.app.log({ + type: "debug", + message: "navigationEvent", + data: { + componentName, + }, + }); + const et = this.app.router.getEventTarget(); + return async function* (controller: AbortController) { + const navigationEvents = navigationEvent(et); + for await (const ev of combineEvents(controller, navigationEvents)) { + yield ev; } - - configuration.log({ - msg: "Mounting child component", - data: { - parent: fn.name, - mountPoint: id, - child: childFn.name, - }, - }); - - const el2 = el.querySelector(`#${id}`); - if (!el2) { - throw new Error(`Mount point not found: ${id}`); + }; + }, + createDOMFragment( + this: SeqflowFunctionContext, + { children }: JSX.IntrinsicAttributes, + ): DocumentFragment { + this.app.log({ + type: "debug", + message: "createDOMFragment", + data: { children }, + }); + const fragment = new DocumentFragment(); + if (!children) { + return fragment; + } + if (!Array.isArray(children)) { + children = [children]; + } + const c = children.flat(Number.POSITIVE_INFINITY); + for (const child of c) { + if (typeof child === "string") { + fragment.appendChild(document.createTextNode(child)); + continue; } - - if (children[id]) { - children[id]._controller.abort("Parent controller aborted"); + if (typeof child === "number") { + fragment.appendChild(document.createTextNode(`${child}`)); + continue; + } + // `Node` here means: + // - `HTMLElement` + // - `DocumentFragment` + if (child instanceof Node) { + fragment.appendChild(child); + continue; } - children[id] = Component( - el2 as HTMLElement, - childFn, - option, - configuration, - ); - }, - }, - event: { - navigationEvent() { - return iterOnEvents( - configuration.navigationEventBus, - "navigate", - { - preventDefault: true, - stopPropagation: false, - stopImmediatePropagation: false, - }, - ); - }, - - domainEvent>( - b: BEE, - ): (b: AbortController) => AsyncGenerator> { - const domainKey = b.domainName; - const type = b.t; - - configuration.log({ - msg: "Waiting for Business event", - data: { - name: fn.name, - isFirstRender, - domainKey, - type, - }, - }); - - return iterOnEvents>( - configuration.domainEventBuses[domainKey], - type, - { - preventDefault: false, - stopPropagation: false, - stopImmediatePropagation: false, - }, - ); - }, - domEvent( - type: K, - option?: Partial<{ - element: HTMLElement; - preventDefault: boolean; - stopPropagation: boolean; - stopImmediatePropagation: boolean; - }>, - ) { - configuration.log({ - msg: `Waiting for DOM event ${type}`, - data: { - name: fn.name, - isFirstRender, - }, + this.app.log({ + type: "error", + message: "Unsupported child type. Implement me", + data: { child, children }, }); + throw new Error("Unsupported child type"); + } - const element = option?.element || el; + return fragment; + }, + createDOMElement( + this: SeqflowFunctionContext, + tagName: string, + options?: { [key: string]: string }, + ...children: JSX.Element[] + ): Node { + this.app.log({ + type: "debug", + message: "createDOMElement", + data: { tagName, options, children }, + }); - return iterOnEvents(element, type, { - preventDefault: option?.preventDefault || false, - stopPropagation: option?.stopPropagation || false, - stopImmediatePropagation: option?.stopImmediatePropagation || false, - }); - }, - waitEvent( - ...fns: { - [I in keyof T]: (controller: AbortController) => AsyncGenerator; + if (typeof tagName === "string") { + const el = document.createElement(tagName); + for (const key in options) { + el.setAttribute(key, options[key]); } - ): AsyncGenerator { - configuration.log({ - msg: "Waiting for event", - data: { - name: fn.name, - isFirstRender, - }, - }); - - const _controller = generateAbortController(); - controller.signal.addEventListener( - "abort", - () => { - _controller.abort("Parent controller aborted"); - }, - { - once: true, - }, - ); + const c = children.flat(Number.POSITIVE_INFINITY); + for (const child of c) { + if (typeof child === "string") { + el.appendChild(document.createTextNode(child)); + continue; + } + if (typeof child === "number") { + el.appendChild(document.createTextNode(`${child}`)); + continue; + } + // `Node` here means: + // - `HTMLElement` + // - `DocumentFragment` + if (child instanceof Node) { + el.appendChild(child); + continue; + } - if (fns.length === 0) { - throw new Error("waitEvent needs at least one argument"); + this.app.log({ + type: "error", + message: "Unsupported child type. Implement me", + data: { child, children, tagName, options, el }, + }); + throw new Error("Unsupported child type"); } + return el; + } - if (fns.length === 1) { - return fns[0](_controller); - } + if (tagName === this.createDOMFragment) { + return this.createDOMFragment({ children }); + } - const queue: Event[] = []; - - const controllers = [] as AbortController[]; - - Promise.all( - fns.map((fn) => { - const c = generateAbortController(); - controllers.push(c); - const it = fn(c); - return (async () => { - let result = await it.next(); - while (!result.done) { - queue.push(result.value); - _controller.signal.dispatchEvent(new Event("wakeup")); - result = await it.next(); - } - })(); - }), - ).catch((e) => { - console.error("ERROR", e); + const wrapper = document.createElement("div"); + if (options?.key) { + componentChildren.push({ + key: options.key, + el: wrapper, }); + } + if (options?.wrapperClass) { + wrapper.classList.add(options.wrapperClass); + } - return (async function* () { - while (true) { - _controller.signal.throwIfAborted(); - - if (queue.length > 0) { - yield queue.shift() as T[number]; - } else { - await new Promise((resolve) => { - _controller.signal.addEventListener("wakeup", () => resolve(), { - once: true, - signal: _controller.signal, - }); - }); - } - } - })(); - }, - dispatchEvent(event: Event) { - configuration.log({ - msg: "Dispatching event", - data: { - name: fn.name, - eventType: event.type, - }, + startComponent(childContext, wrapper, tagName, { ...options, children }); + return wrapper; + }, + renderSync(this: SeqflowFunctionContext, html: string | JSX.Element) { + if (typeof html === "string") { + this._el.innerHTML = html; + return; + } + this._el.innerHTML = ""; + this._el.appendChild(html); + }, + }; + + const v = component.call(childContext, componentOption || ({} as T)); + if (v.then !== undefined) { + v.then( + () => { + parentContext.app.log({ + type: "debug", + message: "Component rendering ended", + data: { componentOption, componentName }, }); - el.dispatchEvent(event); }, - dispatchDomainEvent = DomainEvent>( - event: BE, - ) { - const domainName = (event.constructor as typeof DomainEvent) - .domainName; - configuration.log({ - msg: "Dispatching business event", + (e) => { + parentContext.app.log({ + type: "error", + message: "Component throws an error", data: { - name: fn.name, - domainName, - eventType: event.type, + componentOption, + componentName, + errorMessage: e.message, + error: e, + stack: e.stack, }, }); - ( - configuration.domainEventBuses[domainName] as EventTarget - ).dispatchEvent(event); }, - }, - _controller: controller, - signal: controller.signal, - }; - - if (option?.data) { - (b as ComponentParam).data = option.data; + ); } +} - fn(b as ComponentParam).then( - () => { - configuration.log({ - msg: "ENDED!", - data: { - name: fn.name, - id: (controller as AbortControllerWithId).id, - }, - }); - }, - (e) => { - /* v8 ignore next 9 */ - configuration.log({ - msg: "ENDED WITH ERROR!", - data: { - name: fn.name, - id: (controller as AbortControllerWithId).id, - error: e, - }, - }); - }, +export function start< + Component extends SeqflowFunction, + FirstComponentData extends JSX.IntrinsicAttributes, +>( + root: HTMLElement, + firstComponent: Component, + componentOption: FirstComponentData | undefined, + seqflowConfiguration: Partial, +): AbortController { + const seqflowConfig = applyDefaults(seqflowConfiguration); + + const { domains, domainEventTargets } = createDomains( + seqflowConfig.domains, + seqflowConfig.config, ); - return b as ComponentParam; -} + seqflowConfig.router.install(); + const appContext: SeqflowAppContext = { + log: seqflowConfig.log, + domains, + domainEventTargets, + config: seqflowConfig.config, + router: seqflowConfig.router, + }; + seqflowConfig.router.getEventTarget().addEventListener("navigation", (ev) => { + appContext.log({ + type: "info", + message: "navigate", + data: { path: (ev as NavigationEvent).path, event: ev }, + }); + }); -interface DomainCreator { - ( - domainEventBus: EventTarget, - allDomainEventBus: Record, - config: ApplicationConfig, - ): Domain; -} + const mainAbortController = new AbortController(); + const mainContext: SeqflowFunctionContext = { + app: appContext, + abortController: mainAbortController, + _el: root, + // biome-ignore lint/correctness/useYield: This is a generator function + waitEvents: async function* (): AsyncGenerator { + throw new Error("waitEvents is not supported in the main context"); + }, + replaceChild: () => { + throw new Error("replaceChild is not supported in the main context"); + }, + domEvent: (): EventAsyncGenerator< + HTMLElementEventMap[K] + > => { + throw new Error("domEvent is not supported in the main context"); + }, + domainEvent< + BEE extends typeof DomainsPackage.DomainEvent, + >(): EventAsyncGenerator> { + throw new Error("domainEvent is not supported in the main context"); + }, + navigationEvent(): EventAsyncGenerator { + throw new Error("routerEvent is not supported in the main context"); + }, + createDOMFragment(): DocumentFragment { + throw new Error("createDOMFragment is not supported in the main context"); + }, + createDOMElement( + tagName: string, + options?: { [key: string]: string }, + ...children: JSX.Element[] + ): Node { + const el = document.createElement(tagName); + for (const key in options) { + el.setAttribute(key, options[key]); + } + for (const child of children) { + if (typeof child === "string") { + el.appendChild(document.createTextNode(child)); + continue; + } + throw new Error("Unsupported child type"); + } + return el; + }, + renderSync(html: string | JSX.Element) { + if (typeof html === "string") { + this._el.innerHTML = html; + return; + } + this._el.innerHTML = ""; + this._el.appendChild(html); + }, + }; -type DomainCreators = { [K in keyof Domains]: DomainCreator }; - -export type Log = { - msg: string; - data: unknown; -}; -export type StartParameters = { - log: (log: Log) => void; - domains: DomainCreators; - navigationEventBus: EventTarget; - config: ApplicationConfig; -}; -interface GlobalConfiguration { - log: (log: Log) => void; - domains: Domains; - domainEventBuses: { [K in keyof Domains]: EventTarget }; - navigationEventBus: EventTarget; - config: ApplicationConfig; -} + startComponent(mainContext, root, firstComponent, componentOption); -/** - * Start a new SeqFlow application - * - * @typeParam T - The type of the data passed to the component - * - * @param el The element to mount the component - * @param fn The component function - * @param option The component option - * @param config The application configuration - * @return The controller to abort the component - */ -export function start( - el: HTMLElement, - fn: ComponentFn, - option?: ChildOption, - config?: Partial, -): AbortController { - const option2 = (option || {}) as ChildOption; + return mainAbortController; +} - const params = applyDefault(config); - const configuration = createConfiguration(params); - const a = Component(el, fn, option2, configuration); +function applyDefaults( + seqflowConfiguration: Partial, +): SeqflowConfiguration { + function noop() {} - a._controller.signal.addEventListener("abort", () => { - configuration.log({ - msg: "Component aborted", - data: { - name: fn.name, - }, - }); - }); + if (seqflowConfiguration.router === undefined) { + seqflowConfiguration.router = new BrowserRouter(new EventTarget()); + } - return a._controller; + return Object.assign( + {}, + { + log: noop, + config: {}, + domains: {}, + }, + seqflowConfiguration, + ) as SeqflowConfiguration; } -function createConfiguration(params: StartParameters): GlobalConfiguration { - const domainEventBuses = {}; - for (const domainName in params.domains) { - domainEventBuses[domainName] = new EventTarget(); +function createDomains( + domainFunctions: SeqflowConfiguration["domains"], + applicationConfiguration: ApplicationConfiguration, +): { + domains: Domains; + domainEventTargets: { [K in keyof Domains]: EventTarget }; +} { + const domainEventTargetsPartial: Record = {}; + + const domainKeys = Object.keys(domainFunctions); + for (const domainKey of domainKeys) { + domainEventTargetsPartial[domainKey] = new EventTarget(); } - const domains = {}; - for (const domainName in params.domains) { - domains[domainName] = params.domains[domainName]( - domainEventBuses[domainName], - domainEventBuses, - params.config, + const domainEventTargets = domainEventTargetsPartial as { + [K in keyof Domains]: EventTarget; + }; + const domains: Record = {}; + for (const domainKey of domainKeys as (keyof Domains)[]) { + // biome-ignore lint/complexity/noBannedTypes: Don't care about `Function` banned type + const c = domainFunctions[domainKey as keyof Domains] as Function; + domains[domainKey] = c( + domainEventTargets[domainKey], + domainEventTargets, + applicationConfiguration, ); } - const config: GlobalConfiguration = { - log: params.log, - navigationEventBus: params.navigationEventBus, - domains: domains as Domains, - domainEventBuses: - domainEventBuses as GlobalConfiguration["domainEventBuses"], - config: params.config, + return { + domains: domains as unknown as Domains, + domainEventTargets: domainEventTargets as { + [K in keyof Domains]: EventTarget; + }, }; - return config; } -function noop() {} -function applyDefault(config?: Partial) { - const c: Partial = config || {}; - if (!c.log) { - c.log = noop; - } - if (!c.domains) { - c.domains = {} as StartParameters["domains"]; - } - if (!c.navigationEventBus) { - c.navigationEventBus = new EventTarget(); - } - if (!c.config) { - c.config = {} as StartParameters["config"]; - } +declare global { + namespace JSX { + // biome-ignore lint/complexity/noBannedTypes: Don't care about `Function` banned type + type ElementType = HTMLElement | Function | string | number; - return c as StartParameters; -} + interface Element extends HTMLElement {} -// biome-ignore lint/suspicious/noEmptyInterface: This type is fulfilled by the user -export interface Domains {} -// biome-ignore lint/suspicious/noEmptyInterface: This type is fulfilled by the user -export interface ApplicationConfig {} + interface IntrinsicElements { + [key: string]: Partial> & { + children?: ElementType | ElementType[]; + }; + button: Partial> & { + children?: ElementType | ElementType[]; + }; + } -export class NavigationEvent extends Event { - constructor(public readonly path: string) { - super("navigate", { bubbles: false }); + interface IntrinsicAttributes { + key?: string; + wrapperClass?: string; + children?: ElementType | ElementType[]; + } } } diff --git a/packages/seqflow-js/src/router.ts b/packages/seqflow-js/src/router.ts new file mode 100644 index 0000000..2b88045 --- /dev/null +++ b/packages/seqflow-js/src/router.ts @@ -0,0 +1,102 @@ +export class NavigationEvent extends Event { + constructor(public path: string) { + super("navigation"); + } +} + +export interface Router { + navigate(path: string): void; + install(): void; + getEventTarget(): EventTarget; + navigate(path: string): void; + readonly segments: string[]; + back(): void; +} + +export class BrowserRouter implements Router { + constructor(private eventTarget: EventTarget) {} + + install() { + window.addEventListener("popstate", (ev) => { + const e = ev as PopStateEvent; + e.preventDefault(); + + // TODO: we should calculate the new path and dispatch a navigation event + this.eventTarget.dispatchEvent( + new NavigationEvent(window.location.pathname), + ); + }); + } + + getEventTarget() { + return this.eventTarget; + } + + navigate(path: string) { + window.history.pushState({}, "", path); + this.eventTarget.dispatchEvent(new NavigationEvent(path)); + } + + back() { + window.history.back(); + } + + public get segments(): string[] { + const segments = window.location.pathname.split("/"); + // URL starts with a slash, so the first element is always an empty string + segments.shift(); + return segments; + } +} + +interface HistoryEntry { + path: string; +} + +export class InMemoryRouter implements Router { + private history: HistoryEntry[] = []; + + constructor( + private eventTarget: EventTarget, + currentPath: string, + ) { + this.history.push({ path: currentPath }); + } + + public get segments(): string[] { + const segments = this.history[this.history.length - 1].path.split("/"); + // URL starts with a slash, so the first element is always an empty string + segments.shift(); + return segments; + } + + install() {} + + getEventTarget() { + return this.eventTarget; + } + + navigate(path: string) { + // NB: only domain relative paths are supported + // TODO: handle path relative paths + // TODO: handle absolute paths + // TODO: what if the path is equal to the current path? + this.history.push({ path }); + this.eventTarget.dispatchEvent(new NavigationEvent(path)); + } + + back() { + if (!this.history.length) { + // What if the programmer calls back() when there is no history? + // Should we throw an error? + // For now, we just return ignoring the call. + return; + } + + this.history.pop(); + const last = this.history[this.history.length - 1]; + if (last) { + this.eventTarget.dispatchEvent(new NavigationEvent(last.path)); + } + } +} diff --git a/packages/seqflow-js/src/typedEvents.ts b/packages/seqflow-js/src/typedEvents.ts new file mode 100644 index 0000000..abe58ed --- /dev/null +++ b/packages/seqflow-js/src/typedEvents.ts @@ -0,0 +1,32 @@ +import { type EventAsyncGenerator, yieldEvent } from "./events"; +import type { DomainEvent } from "./index"; +import type { NavigationEvent } from "./router"; + +export function domEvent( + eventType: K, + options: { + el: HTMLElement; + preventDefault: boolean; + }, +): EventAsyncGenerator { + return yieldEvent(eventType, options); +} + +export function domainEvent>( + eventType: string, + eventTarget: EventTarget, +): EventAsyncGenerator { + return yieldEvent(eventType, { + el: eventTarget, + preventDefault: false, + }); +} + +export function navigationEvent( + eventTarget: EventTarget, +): EventAsyncGenerator { + return yieldEvent("navigation", { + el: eventTarget, + preventDefault: false, + }); +} diff --git a/packages/seqflow-js/tests/appConfig.test.tsx b/packages/seqflow-js/tests/appConfig.test.tsx new file mode 100644 index 0000000..16b6862 --- /dev/null +++ b/packages/seqflow-js/tests/appConfig.test.tsx @@ -0,0 +1,61 @@ +import { screen, waitFor } from "@testing-library/dom"; +import { expect, test } from "vitest"; + +import { type Log, type SeqflowFunctionContext, start } from "../src/index"; + +test("app log", async () => { + async function App(this: SeqflowFunctionContext) { + this.app.log({ type: "info", message: "render" }); + this.renderSync(""); + } + + const logs: Log[] = []; + start( + document.body, + App, + {}, + { + log: (l: Log) => { + logs.push(l); + }, + }, + ); + expect(document.body.innerHTML).toBe(""); + + const appLog = logs.find((l) => l.message === "render" && l.type === "info"); + expect(appLog).toBeDefined(); +}); + +test("app config", async () => { + async function App(this: SeqflowFunctionContext) { + this.app.log({ type: "info", message: this.app.config.api }); + this.renderSync(""); + } + + const logs: Log[] = []; + start( + document.body, + App, + {}, + { + log: (l: Log) => { + logs.push(l); + }, + config: { + api: "https://api.example.com", + }, + }, + ); + expect(document.body.innerHTML).toBe(""); + + const appLog = logs.find( + (l) => l.message === "https://api.example.com" && l.type === "info", + ); + expect(appLog).toBeDefined(); +}); + +declare module "../src/index" { + interface ApplicationConfiguration { + api: string; + } +} diff --git a/packages/seqflow-js/tests/cleanUp.test.ts b/packages/seqflow-js/tests/cleanUp.test.ts deleted file mode 100644 index a15f3b8..0000000 --- a/packages/seqflow-js/tests/cleanUp.test.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { expect, test } from "vitest"; -import { - ComponentParam, - DomainEvent, - createDomainEventClass, - start, -} from "../src/index"; - -test("test 1", async () => { - async function app({ dom, event }: ComponentParam) { - dom.render('

    '); - - const result = dom.querySelector("#result"); - - let i = 0; - const events = event.waitEvent(event.domEvent("click")); - for await (const event of events) { - result.textContent = `${++i}`; - } - } - - const c = start(document.body, app); - expect(document.body.innerHTML).toBe( - '

    ', - ); - - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(document.body.innerHTML).toBe( - '

    1

    ', - ); - - document.body.querySelector("button")?.click(); - document.body.querySelector("button")?.click(); - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(document.body.innerHTML).toBe( - '

    4

    ', - ); - - // This should unmount the whole application - c.abort("test"); - await new Promise((resolve) => setTimeout(resolve, 100)); - - const result = document.body.querySelector("#result"); - - // The handler is not attached anymore - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(result?.innerHTML).toBe("4"); - - async function app2({ dom, event }: ComponentParam) { - dom.render(` - - -

    -`); - - const result = dom.querySelector("#result"); - const increment = dom.querySelector("#increment"); - const decrement = dom.querySelector("#decrement"); - - let i = 0; - const events = event.waitEvent(event.domEvent("click")); - for await (const event of events) { - if (event.target === increment) { - result.textContent = `${++i}`; - } else if (event.target === decrement) { - result.textContent = `${--i}`; - } else { - throw new Error("unknown event"); - } - } - } - start(document.body, app2); - - expect(document.body.innerHTML).toBe(` - - -

    -`); - - document.body.querySelector("#increment")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - const result2 = document.body.querySelector("#result"); - expect(result2?.innerHTML).toBe("1"); -}); - -test("test 2", async () => { - const counterDomain = { counter: 0 }; - const C = createDomainEventClass("foo", "increment"); - - async function Button({ dom, event, domains }: ComponentParam) { - dom.render(''); - const events = event.waitEvent(event.domEvent("click")); - for await (const ev of events) { - ev.stopPropagation(); - domains.foo.counter++; - event.dispatchDomainEvent(new C(undefined)); - } - } - async function app({ dom, event }: ComponentParam) { - dom.render('
    '); - dom.child("button", Button); - - const events = event.waitEvent(event.domainEvent(C)); - for await (const ev of events) { - dom.child("button", Button); - } - } - - start(document.body, app, undefined, { - domains: { - foo: () => counterDomain, - }, - }); - - expect(counterDomain.counter).toBe(0); - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 100)); - expect(counterDomain.counter).toBe(1); - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 100)); - expect(counterDomain.counter).toBe(2); -}); - -declare module "../src/index" { - interface Domains { - foo: { counter: number }; - } -} diff --git a/packages/seqflow-js/tests/cleanUp.test.tsx b/packages/seqflow-js/tests/cleanUp.test.tsx new file mode 100644 index 0000000..c23d747 --- /dev/null +++ b/packages/seqflow-js/tests/cleanUp.test.tsx @@ -0,0 +1,31 @@ +import { screen, waitFor } from "@testing-library/dom"; +import { expect, test } from "vitest"; + +import { type SeqflowFunctionContext, start } from "../src/index"; + +test("cleanUp", async () => { + let counter = 0; + async function App(this: SeqflowFunctionContext) { + this.renderSync(); + + const events = this.waitEvents(this.domEvent("click", { el: this._el })); + for await (const _ of events) { + counter += 1; + } + } + + const abortController = start(document.body, App, {}, {}); + + const incrementButton = await screen.findByText(/click me/i); + await waitFor(() => expect(counter).toBe(0)); + incrementButton.click(); + await waitFor(() => expect(counter).toBe(1)); + + abortController.abort("Stop the app"); + + incrementButton.click(); + await waitFor(() => expect(counter).toBe(1)); + + // The app is stopped, but no one remove the existing dom + await screen.findByText(/click me/i); +}); diff --git a/packages/seqflow-js/tests/domEvent.test.ts b/packages/seqflow-js/tests/domEvent.test.ts deleted file mode 100644 index 1e3c151..0000000 --- a/packages/seqflow-js/tests/domEvent.test.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { expect, test } from "vitest"; -import { ComponentParam, start } from "../src/index"; - -test("dom event self", async () => { - async function app({ dom, event }: ComponentParam) { - dom.render('

    '); - - const result = dom.querySelector("#result"); - - let i = 0; - const events = event.waitEvent(event.domEvent("click")); - for await (const _ of events) { - result.textContent = `${++i}`; - } - } - - start(document.body, app); - expect(document.body.innerHTML).toBe( - '

    ', - ); - - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(document.body.innerHTML).toBe( - '

    1

    ', - ); - - document.body.querySelector("button")?.click(); - document.body.querySelector("button")?.click(); - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(document.body.innerHTML).toBe( - '

    4

    ', - ); -}); - -test("dom event multi", async () => { - async function app({ dom, event }: ComponentParam) { - dom.render(` - - -

    -`); - - const result = dom.querySelector("#result"); - const increment = dom.querySelector("#increment"); - const decrement = dom.querySelector("#decrement"); - - let i = 0; - const events = event.waitEvent(event.domEvent("click")); - for await (const event of events) { - if (event.target === increment) { - result.textContent = `${++i}`; - } else if (event.target === decrement) { - result.textContent = `${--i}`; - } else { - throw new Error("unknown event"); - } - } - } - - start(document.body, app); - - const result = document.body.querySelector("#result"); - - document.body.querySelector("#increment")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(result?.innerHTML).toBe("1"); - - document.body.querySelector("#increment")?.click(); - document.body.querySelector("#increment")?.click(); - document.body.querySelector("#increment")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(result?.innerHTML).toBe("4"); - - document.body.querySelector("#decrement")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result?.innerHTML).toBe("3"); -}); - -test("dom event child", async () => { - async function Button({ dom }: ComponentParam) { - dom.render(''); - } - async function app({ dom, event }: ComponentParam) { - let i = 0; - - dom.render(`

    ${i}

    `); - dom.child("wrapper", Button); - - const result = dom.querySelector("#result"); - - const events = event.waitEvent(event.domEvent("click")); - for await (const ev of events) { - i++; - result.textContent = `${i}`; - } - } - - start(document.body, app); - const result = document.body.querySelector("#result"); - expect(result?.innerHTML).toBe("0"); - await new Promise((resolve) => setTimeout(resolve, 10)); - - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result?.innerHTML).toBe("1"); - - document.body.querySelector("button")?.click(); - document.body.querySelector("button")?.click(); - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result?.innerHTML).toBe("4"); -}); diff --git a/packages/seqflow-js/tests/domEvent.test.tsx b/packages/seqflow-js/tests/domEvent.test.tsx new file mode 100644 index 0000000..7844746 --- /dev/null +++ b/packages/seqflow-js/tests/domEvent.test.tsx @@ -0,0 +1,261 @@ +import { screen, waitFor } from "@testing-library/dom"; +import { expect, test } from "vitest"; + +import { type SeqflowFunctionContext, start } from "../src/index"; + +test("dom event - increment", async () => { + async function App(this: SeqflowFunctionContext) { + const button: HTMLButtonElement = ; + let counter = 0; + const counterSpan: HTMLSpanElement = {counter}; + this.renderSync( +
    + {button} + {counterSpan} +
    , + ); + + const events = this.waitEvents( + this.domEvent("click", { + el: button, + }), + ); + for await (const _ of events) { + counter += 1; + counterSpan.textContent = `${counter}`; + } + } + + start(document.body, App, {}, {}); + + await screen.findByText(/0/i); + (await screen.findByText(/increment/i)).click(); + await screen.findByText(/1/i); + (await screen.findByText(/increment/i)).click(); + await screen.findByText(/2/i); + (await screen.findByText(/increment/i)).click(); + await screen.findByText(/3/i); + + for (let i = 0; i < 10; i++) { + (await screen.findByText(/increment/i)).click(); + } + await screen.findByText(/13/i); +}); + +test("dom event - counter", async () => { + async function App(this: SeqflowFunctionContext) { + const incrementButton: HTMLButtonElement = ( + + ); + const decrementButton: HTMLButtonElement = ( + + ); + let counter = 0; + const counterSpan: HTMLSpanElement = {counter}; + this.renderSync( +
    + {incrementButton} + {counterSpan} + {decrementButton} +
    , + ); + + const events = this.waitEvents( + this.domEvent("click", { el: this._el as HTMLElement }), + ); + for await (const event of events) { + if (decrementButton.contains(event.target as Node)) { + counter -= 1; + } else if (incrementButton.contains(event.target as Node)) { + counter += 1; + } + counterSpan.textContent = `${counter}`; + } + } + + start(document.body, App, {}, {}); + + await screen.findByText(/0/i); + (await screen.findByText(/increment/i)).click(); + (await screen.findByText(/increment/i)).click(); + (await screen.findByText(/increment/i)).click(); + + await screen.findByText(/3/i); + (await screen.findByText(/decrement/i)).click(); + await screen.findByText(/2/i); +}); + +test("dom event - multiple", async () => { + async function App(this: SeqflowFunctionContext) { + const incrementButton: HTMLButtonElement = ( + + ); + const decrementButton: HTMLButtonElement = ( + + ); + let counter = 0; + const counterSpan: HTMLSpanElement = {counter}; + this.renderSync( +
    + {incrementButton} + {counterSpan} + {decrementButton} +
    , + ); + + const events = this.waitEvents( + this.domEvent("click", { el: incrementButton }), + this.domEvent("click", { el: decrementButton }), + ); + for await (const event of events) { + if (decrementButton.contains(event.target as Node)) { + counter -= 1; + } else if (incrementButton.contains(event.target as Node)) { + counter += 1; + } + counterSpan.textContent = `${counter}`; + } + } + + start(document.body, App, {}, {}); + + await screen.findByText(/0/i); + (await screen.findByText(/increment/i)).click(); + (await screen.findByText(/increment/i)).click(); + (await screen.findByText(/increment/i)).click(); + + await screen.findByText(/3/i); + (await screen.findByText(/decrement/i)).click(); + await screen.findByText(/2/i); +}); + +test("dom event - multiple - different event type", async () => { + async function App(this: SeqflowFunctionContext) { + const incrementButton: HTMLButtonElement = ( + + ); + const decrementButton: HTMLButtonElement = ( + + ); + let counter = 0; + const counterSpan: HTMLSpanElement = {counter}; + this.renderSync( +
    + {incrementButton} + {counterSpan} + {decrementButton} +
    , + ); + + const events = this.waitEvents( + this.domEvent("click", { el: incrementButton }), + this.domEvent("focus", { el: decrementButton }), + ); + for await (const event of events) { + if (decrementButton.contains(event.target as Node)) { + counter -= 1; + } else if (incrementButton.contains(event.target as Node)) { + counter += 1; + } + counterSpan.textContent = `${counter}`; + } + } + + start(document.body, App, {}, {}); + + await screen.findByText(/0/i); + (await screen.findByText(/increment/i)).click(); + (await screen.findByText(/increment/i)).click(); + (await screen.findByText(/increment/i)).click(); + + await screen.findByText(/3/i); + (await screen.findByText(/decrement/i)).focus(); + await screen.findByText(/2/i); +}); + +test("dom event - stop listen on unmount", async () => { + async function App(this: SeqflowFunctionContext) { + const next1Button: HTMLButtonElement = ( + + ); + this.renderSync(
    {next1Button}
    ); + const events1 = this.waitEvents( + this.domEvent("click", { el: next1Button }), + ); + for await (const _ of events1) { + // do nothing + break; + } + + const next2Button: HTMLButtonElement = ( + + ); + this.renderSync(
    {next2Button}
    ); + // This event async generator should end when the component is unmounted + for await (const _ of events1) { + } + + const events2 = this.waitEvents( + this.domEvent("click", { el: next2Button }), + ); + for await (const _ of events2) { + // do nothing + break; + } + + this.renderSync(
    end
    ); + + // This event async generator should end when the component is unmounted + for await (const _ of events2) { + } + } + + start(document.body, App, {}, {}); + (await screen.findByText(/go to 1/i)).click(); + (await screen.findByText(/go to 2/i)).click(); + await screen.findByText(/end/i); +}); + +test("child component can be used to listen", async () => { + let counter = 0; + + async function Button(this: SeqflowFunctionContext, data: { text: string }) { + this.renderSync(); + } + + async function App(this: SeqflowFunctionContext) { + const incrementButton = '); - - const events = event.waitEvent(event.domEvent("click")); - for await (const _ of events) { - domains.counter.increment(); - } - } - async function app({ dom, event }: ComponentParam) { - const i = 0; - dom.render(`

    ${i}

    `); - dom.child("button", IncrementButton); - - const result = dom.querySelector("#result"); - - const events = event.waitEvent(event.domainEvent(CounterChanged)); - for await (const ev of events) { - result.textContent = `${ev.detail.counter}`; - } - } - - start(document.body, app, undefined, { - log(l) {}, - domains: { - counter: (eventTarget) => { - return new CounterDomain(eventTarget); - }, - }, - }); - - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(document.body.innerHTML).toBe( - '

    1

    ', - ); - - document.body.querySelector("button")?.click(); - document.body.querySelector("button")?.click(); - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(document.body.innerHTML).toBe( - '

    4

    ', - ); -}); - -declare module "../src/index" { - interface Domains { - counter: CounterDomain; - } -} - -const CounterChanged = createDomainEventClass<{ counter: number }>( - "counter", - "changed", -); -class CounterDomain { - constructor( - private et: EventTarget, - private _counter = 0, - ) {} - increment() { - this._counter++; - this.et.dispatchEvent(new CounterChanged({ counter: this._counter })); - } -} diff --git a/packages/seqflow-js/tests/domainEvent.test.tsx b/packages/seqflow-js/tests/domainEvent.test.tsx new file mode 100644 index 0000000..00f64ee --- /dev/null +++ b/packages/seqflow-js/tests/domainEvent.test.tsx @@ -0,0 +1,102 @@ +import { screen, waitFor } from "@testing-library/dom"; +import { expect, test } from "vitest"; + +import { + type SeqflowFunctionContext, + createDomainEventClass, + start, +} from "../src/index"; + +test("domain event - increment", async () => { + async function ChangeButton( + this: SeqflowFunctionContext, + { delta, text }: { delta: number; text: string }, + ) { + const button = ; + this.renderSync(button); + + const events = this.waitEvents( + this.domEvent("click", { + el: button, + }), + ); + for await (const _ of events) { + this.app.domains.counter.applyDelta(delta); + } + } + async function App(this: SeqflowFunctionContext) { + const counterSpan = {this.app.domains.counter.get()}; + this.renderSync( +
    + + + {counterSpan} +
    , + ); + + const events = this.waitEvents(this.domainEvent(CounterChanged)); + for await (const e of events) { + counterSpan.textContent = `${e.detail.counter}`; + } + } + + start( + document.body, + App, + {}, + { + domains: { + counter: (eventTarget) => { + return new CounterDomain(eventTarget); + }, + }, + }, + ); + + const incrementButton = await screen.findByText(/increment/i); + const decrementButton = await screen.findByText(/decrement/i); + + await screen.findByText(/0/i); + incrementButton.click(); + await screen.findByText(/1/i); + incrementButton.click(); + await screen.findByText(/2/i); + incrementButton.click(); + await screen.findByText(/3/i); + + for (let i = 0; i < 10; i++) { + incrementButton.click(); + } + + await screen.findByText(/13/i); + + decrementButton.click(); + await screen.findByText(/12/i); +}); + +declare module "../src/index" { + interface Domains { + counter: CounterDomain; + } +} + +const CounterChanged = createDomainEventClass<{ counter: number }>( + "counter", + "changed", +); +class CounterDomain { + private counter = 0; + + constructor(private eventTarget: EventTarget) {} + + get() { + return this.counter; + } + + applyDelta(delta: number) { + this.counter += delta; + this.eventTarget.dispatchEvent( + new CounterChanged({ counter: this.counter }), + ); + } +} diff --git a/packages/seqflow-js/tests/mixedEvent.test.ts b/packages/seqflow-js/tests/mixedEvent.test.ts deleted file mode 100644 index b86ceac..0000000 --- a/packages/seqflow-js/tests/mixedEvent.test.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { expect, test } from "vitest"; -import { ComponentParam, createDomainEventClass, start } from "../src/index"; - -const CounterChanged = createDomainEventClass<{ - delta: number; - counter: number; -}>("counter", "changed"); -const CounterReset = createDomainEventClass("counter", "reset-changed"); -class CounterDomain { - constructor( - private eventTarget: EventTarget, - private counter = 0, - ) {} - - applyDelta(delta: number) { - this.counter += delta; - this.eventTarget.dispatchEvent( - new CounterChanged({ delta, counter: this.counter }), - ); - } - - reset() { - this.counter = 0; - this.eventTarget.dispatchEvent(new CounterReset(null)); - return 0; - } -} - -test("dom & business event", async () => { - async function ChangeButton({ - dom, - event, - data, - domains, - }: ComponentParam<{ delta: number }>) { - dom.render(""); - const events = event.waitEvent(event.domEvent("click")); - for await (const _ of events) { - domains.counter.applyDelta(data.delta); - } - } - async function app({ dom, event, domains }: ComponentParam) { - let i = 0; - - dom.render(` -
    -
    - -

    ${i}

    -`); - dom.child("increment", ChangeButton, { data: { delta: 1 } }); - dom.child("decrement", ChangeButton, { data: { delta: -1 } }); - - const result = dom.querySelector("#result"); - const reset = dom.querySelector("#reset"); - - const events = event.waitEvent( - event.domEvent("click"), - event.domainEvent(CounterChanged), - ); - for await (const event of events) { - if (event instanceof CounterChanged) { - i = event.detail.counter; - } else if (event.target === reset) { - i = domains.counter.reset(); - } - result.textContent = `${i}`; - } - } - - const c = start(document.body, app, undefined, { - domains: { - counter: (eventTarget) => { - return new CounterDomain(eventTarget); - }, - }, - }); - - const increment = document.querySelector( - "#increment button", - ) as HTMLButtonElement; - const decrement = document.querySelector( - "#decrement button", - ) as HTMLButtonElement; - const reset = document.querySelector("#reset") as HTMLButtonElement; - const result = document.querySelector("#result") as HTMLParagraphElement; - - await new Promise((resolve) => setTimeout(resolve, 100)); - - increment.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result.textContent).toBe("1"); - - increment.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result.textContent).toBe("2"); - - increment.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result.textContent).toBe("3"); - - decrement.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result.textContent).toBe("2"); - - decrement.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result.textContent).toBe("1"); - - decrement.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result.textContent).toBe("0"); - - decrement.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result.textContent).toBe("-1"); - - reset.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - expect(result.textContent).toBe("0"); - - c.abort("test"); - await new Promise((resolve) => setTimeout(resolve, 10)); -}); - -declare module "../src/index" { - interface Domains { - counter: CounterDomain; - } -} diff --git a/packages/seqflow-js/tests/navigationEvent.test.ts b/packages/seqflow-js/tests/navigationEvent.test.ts deleted file mode 100644 index 4ee70a2..0000000 --- a/packages/seqflow-js/tests/navigationEvent.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { expect, test } from "vitest"; -import { ComponentParam, NavigationEvent, start } from "../src/index"; - -test("navigation even", async () => { - async function Button({ dom, event, router }: ComponentParam) { - dom.render(''); - - const input = dom.querySelector("input"); - - const events = event.waitEvent(event.domEvent("click")); - for await (const _ of events) { - router.navigate(input.value); - } - } - async function app({ dom, event, router }: ComponentParam) { - dom.render( - '

    ', - ); - dom.child("button", Button); - - const eventPath = dom.querySelector("#eventPath"); - const segments = dom.querySelector("#segments"); - const query = dom.querySelector("#query"); - - const events = event.waitEvent(event.navigationEvent()); - for await (const event of events) { - eventPath.textContent = (event as NavigationEvent).path; - segments.textContent = JSON.stringify(router.segments); - query.textContent = JSON.stringify( - Object.fromEntries(router.query.entries()), - ); - } - } - - start(document.body, app); - - const eventPath = - document.body.querySelector("#eventPath"); - const segments = - document.body.querySelector("#segments"); - const query = document.body.querySelector("#query"); - - // biome-ignore lint/style/noNonNullAssertion: test - document.body.querySelector("input")!.value = "/foo"; - document.body.querySelector("button")?.click(); - - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(eventPath?.textContent).toStrictEqual("/foo"); - expect(JSON.parse(segments?.textContent || "")).toStrictEqual(["foo"]); - expect(JSON.parse(query?.textContent || "")).toStrictEqual({}); - - // biome-ignore lint/style/noNonNullAssertion: test - document.body.querySelector("input")!.value = "/bar"; - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(eventPath?.textContent).toStrictEqual("/bar"); - expect(JSON.parse(segments?.textContent || "")).toStrictEqual(["bar"]); - expect(JSON.parse(query?.textContent || "")).toStrictEqual({}); - - // biome-ignore lint/style/noNonNullAssertion: test - document.body.querySelector("input")!.value = "/foo/bar/baz/pippo/pluto"; - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(eventPath?.textContent).toStrictEqual("/foo/bar/baz/pippo/pluto"); - expect(JSON.parse(segments?.textContent || "")).toStrictEqual([ - "foo", - "bar", - "baz", - "pippo", - "pluto", - ]); - expect(JSON.parse(query?.textContent || "")).toStrictEqual({}); - - // biome-ignore lint/style/noNonNullAssertion: test - document.body.querySelector("input")!.value = "/foo?bar=baz&pippo=pluto"; - document.body.querySelector("button")?.click(); - await new Promise((resolve) => setTimeout(resolve, 10)); - - expect(eventPath?.textContent).toStrictEqual("/foo?bar=baz&pippo=pluto"); - expect(JSON.parse(segments?.textContent || "")).toStrictEqual(["foo"]); - expect(JSON.parse(query?.textContent || "")).toStrictEqual({ - bar: "baz", - pippo: "pluto", - }); -}); diff --git a/packages/seqflow-js/tests/render.test.ts b/packages/seqflow-js/tests/render.test.ts deleted file mode 100644 index 5f7592d..0000000 --- a/packages/seqflow-js/tests/render.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { getByText, waitFor } from "@testing-library/dom"; -import { expect, test } from "vitest"; - -import { ComponentParam, start } from "../src/index"; - -test("render self", () => { - async function app({ dom: { render } }: ComponentParam) { - render("
    hello
    "); - } - - start(document.body, app); - - expect(document.body.innerHTML).toBe("
    hello
    "); -}); - -test("render child", async () => { - async function Header({ dom: { render } }: ComponentParam) { - render("
    header
    "); - } - async function Main({ - dom: { render }, - data, - }: ComponentParam<{ text: string }>) { - render(`
    ${data.text}
    `); - } - - async function app({ dom: { render, child } }: ComponentParam) { - render('
    '); - child("header", Header); - child("main", Main, { - data: { text: "main" }, - }); - } - - start(document.body, app); - - await waitFor(() => getByText(document.body, "main")); - await waitFor(() => getByText(document.body, "header")); - - expect(document.body.innerHTML).toBe( - '
    main
    ', - ); -}); - -test("render child throw error on wrong argument", async () => { - async function app({ dom: { render, child } }: ComponentParam) { - render('
    '); - // biome-ignore lint/suspicious/noExplicitAny: it is a test - (child as any)(); - } - - start(document.body, app); -}); diff --git a/packages/seqflow-js/tests/render.test.tsx b/packages/seqflow-js/tests/render.test.tsx new file mode 100644 index 0000000..d16aca2 --- /dev/null +++ b/packages/seqflow-js/tests/render.test.tsx @@ -0,0 +1,245 @@ +import { screen, waitFor } from "@testing-library/dom"; +import { expect, test } from "vitest"; +import { type Log, type SeqflowFunctionContext, start } from "../src/index"; + +test("render simple button", async () => { + async function App(this: SeqflowFunctionContext, data: { text: string }) { + this.renderSync(``); + } + + start( + document.body, + App, + { + text: "increment", + }, + {}, + ); + expect(document.body.innerHTML).toBe( + '', + ); +}); + +test("render simple button with jsx", async () => { + async function App(this: SeqflowFunctionContext, data: { text: string }) { + this.renderSync(); + } + + start( + document.body, + App, + { + text: "increment", + }, + {}, + ); + expect(document.body.innerHTML).toBe( + '', + ); +}); + +test("render - fragment", async () => { + async function App(this: SeqflowFunctionContext) { + this.renderSync( + <> + first + , + ); + } + + start(document.body, App, undefined, {}); + expect(document.body.innerHTML).toBe("first"); +}); + +test("render - component in fragment", async () => { + async function Button(this: SeqflowFunctionContext, data: { text: string }) { + this.renderSync(); + } + async function App(this: SeqflowFunctionContext) { + this.renderSync( + <> +
    ', + ); +}); + +test("render a direct nested component button with jsx", async () => { + async function Button(this: SeqflowFunctionContext, data: { text: string }) { + this.renderSync(); + } + async function App(this: SeqflowFunctionContext) { + this.renderSync(', + ); +}); + +test("render a indirect nested component button with jsx", async () => { + async function Button(this: SeqflowFunctionContext, data: { text: string }) { + this.renderSync(); + } + async function App(this: SeqflowFunctionContext) { + this.renderSync( +
    +
    , + ); + } + + start(document.body, App, undefined, {}); + expect(document.body.innerHTML).toBe( + '
    ', + ); +}); + +test("render a component with children", async () => { + async function MyDiv( + this: SeqflowFunctionContext, + data: JSX.IntrinsicAttributes, + ) { + this.renderSync(
    {data.children}
    ); + } + async function App(this: SeqflowFunctionContext) { + this.renderSync( + + + , + ); + } + + start(document.body, App, undefined, {}); + expect(document.body.innerHTML).toBe( + '
    ', + ); +}); + +test("render plain nested jsx", async () => { + async function App(this: SeqflowFunctionContext) { + this.renderSync( +
    + +
    + +
    + +
    +
    +
    +
    +
    , + ); + } + + start(document.body, App, undefined, {}); + expect(document.body.innerHTML).toBe( + '
    ', + ); +}); + +test("re-render plain nested jsx", async () => { + async function App(this: SeqflowFunctionContext) { + this.renderSync(first); + await new Promise((resolve) => setTimeout(resolve, 100)); + this.renderSync(second); + await new Promise((resolve) => setTimeout(resolve, 100)); + this.renderSync(third); + } + + start(document.body, App, undefined, {}); + await screen.findByText(/first/i); + await screen.findByText(/second/i); + await screen.findByText(/third/i); +}); + +test("replace a child", async () => { + const texts = ["first", "second", "third"]; + async function Button(this: SeqflowFunctionContext, data: { text: string }) { + this.renderSync(); + } + async function App(this: SeqflowFunctionContext) { + const text = texts.shift(); + if (!text) { + throw new Error("no text"); + } + this.renderSync( +
    +
    , + ); + + const events = this.waitEvents(this.domEvent("click", { el: this._el })); + for await (const _ of events) { + const nextText = texts.shift(); + if (!nextText) { + break; + } + this.replaceChild("aa", async () => ', + ), + ); +}); + +test("replace a child - stop listen", async () => { + let counter = 0; + async function Button1(this: SeqflowFunctionContext) { + this.renderSync(); + const events = this.waitEvents(this.domEvent("click", { el: this._el })); + for await (const _ of events) { + counter++; + } + } + async function Button2(this: SeqflowFunctionContext) { + this.renderSync(); + } + async function App(this: SeqflowFunctionContext) { + this.renderSync( +
    + +
    , + ); + + const events = this.waitEvents(this.domEvent("click", { el: this._el })); + for await (const _ of events) { + this.replaceChild("aa", async () => ); + break; + } + } + + start(document.body, App, undefined, {}); + + // Click button1, just to see if it's working + const firstButton = await screen.findByText(/button1/i); + firstButton.click(); + await waitFor(() => expect(counter).toBe(1)); + + // Click button2, is displayed + await screen.findByText(/button2/i); + + // If I click button1 again, it should not increment the counter + firstButton.click(); + firstButton.click(); + await new Promise((resolve) => setTimeout(resolve, 100)); + await waitFor(() => expect(counter).toBe(1)); +}); diff --git a/packages/seqflow-js/tests/routerEvent.test.tsx b/packages/seqflow-js/tests/routerEvent.test.tsx new file mode 100644 index 0000000..27f22eb --- /dev/null +++ b/packages/seqflow-js/tests/routerEvent.test.tsx @@ -0,0 +1,79 @@ +import { screen, waitFor } from "@testing-library/dom"; +import { expect, test } from "vitest"; + +import { + InMemoryRouter, + type SeqflowFunctionContext, + createDomainEventClass, + start, +} from "../src/index"; + +test("router", async () => { + async function NavigateButton(this: SeqflowFunctionContext) { + this.renderSync(); + + const events = this.waitEvents( + this.domEvent("click", { + el: this._el, + }), + ); + for await (const _ of events) { + this.app.router.navigate("/new"); + } + } + async function BackButton(this: SeqflowFunctionContext) { + this.renderSync(); + + const events = this.waitEvents( + this.domEvent("click", { + el: this._el, + }), + ); + for await (const _ of events) { + this.app.router.back(); + } + } + async function App(this: SeqflowFunctionContext) { + const span = /; + this.renderSync( + <> + + + {span} + , + ); + + const events = this.waitEvents(this.navigationEvent()); + for await (const ev of events) { + span.innerHTML = ev.path; + } + } + + const router = new InMemoryRouter(new EventTarget(), "/"); + const routerHistory = (router as unknown as { history: { path: string }[] }) + .history; + + start( + document.body, + App, + {}, + { + router, + }, + ); + + const navigationButton = await screen.findByText(/navigate/i); + const backButton = await screen.findByText(/back/i); + + navigationButton.click(); + + await waitFor(() => expect(routerHistory.length).toBe(2)); + expect(routerHistory[1].path).toBe("/new"); + await waitFor(() => expect(screen.getByText("/new")).toBeTruthy()); + + backButton.click(); + + await waitFor(() => expect(routerHistory.length).toBe(1)); + expect(routerHistory[0].path).toBe("/"); + await waitFor(() => expect(screen.getByText("/")).toBeTruthy()); +}); diff --git a/packages/seqflow-js/tests/utils.ts b/packages/seqflow-js/tests/utils.ts deleted file mode 100644 index ddcc304..0000000 --- a/packages/seqflow-js/tests/utils.ts +++ /dev/null @@ -1,14 +0,0 @@ -import jsdom from "jsdom"; - -export function createFakeDom() { - const dom = new jsdom.JSDOM('', { - resources: "usable", - runScripts: "dangerously", - }); - global.AbortController = dom.window.AbortController; - global.AbortSignal = dom.window.AbortSignal; - global.Event = dom.window.Event; - global.CustomEvent = dom.window.CustomEvent; - global.EventTarget = dom.window.EventTarget; - return dom; -} diff --git a/packages/seqflow-js/tsconfig.json b/packages/seqflow-js/tsconfig.json new file mode 100644 index 0000000..9de0da7 --- /dev/null +++ b/packages/seqflow-js/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "lib": ["es2015", "dom"], + "jsx": "react", + "jsxFactory": "this.createDOMElement", + "jsxFragmentFactory": "this.createDOMFragment" + }, + "include": ["./src/**/*", "./tests/**/*"] +} diff --git a/packages/seqflow-js/vite.d.ts b/packages/seqflow-js/vite.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/seqflow-js/vitest.config.ts b/packages/seqflow-js/vitest.config.ts index 160648e..e840e6a 100644 --- a/packages/seqflow-js/vitest.config.ts +++ b/packages/seqflow-js/vitest.config.ts @@ -3,5 +3,10 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ test: { environment: 'jsdom', + coverage: { + include: ['src/**/*.ts'], + reporter: ['text-summary', 'html'], + reportsDirectory: 'coverage', + } }, }) \ No newline at end of file diff --git a/packages/website/src/Main.ts b/packages/website/src/Main.ts deleted file mode 100644 index ec9f2b8..0000000 --- a/packages/website/src/Main.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { Header } from "./components/Header"; -import { ApiReference } from "./pages/ApiReference"; -import { GettingStarted } from "./pages/GettingStarted"; -import { Home } from "./pages/Home"; -import { Why } from "./pages/Why"; - -export async function Main({ dom, event, router }: ComponentParam) { - dom.render(` - -
    -`); - dom.child("nav", Header); - - const events = event.waitEvent(event.navigationEvent()); - while (true) { - const path = router.segments.pop(); - switch (path) { - case "getting-started": - console.log("PPPPPPP ---- "); - dom.child("main", GettingStarted); - break; - case "why": - dom.child("main", Why); - break; - case "api-reference": - dom.child("main", ApiReference); - break; - case "home": - case "": - dom.child("main", Home); - break; - } - await events.next(); - } -} diff --git a/packages/website/src/Main.tsx b/packages/website/src/Main.tsx new file mode 100644 index 0000000..531d2b9 --- /dev/null +++ b/packages/website/src/Main.tsx @@ -0,0 +1,37 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { Header } from "./components/Header"; +import { ApiReference } from "./pages/ApiReference"; +import { GettingStarted } from "./pages/GettingStarted"; +import { Home } from "./pages/Home"; +import { Why } from "./pages/Why"; + +function getComponent(path: string) { + switch (path) { + case "getting-started": + return GettingStarted; + case "why": + return Why; + case "api-reference": + return ApiReference; + default: + return Home; + } +} + +export async function Main(this: SeqflowFunctionContext) { + const InitalComponent = getComponent(this.app.router.segments.pop()); + this.renderSync( + <> +
    +
    + +
    + + ); + + const events = this.waitEvents(this.navigationEvent()); + for await (const _ of events) { + const Component = getComponent(this.app.router.segments.pop()); + this.replaceChild("main", () => ); + } +} diff --git a/packages/website/src/components/ContentWithToc.ts b/packages/website/src/components/ContentWithToc.ts deleted file mode 100644 index ae30f96..0000000 --- a/packages/website/src/components/ContentWithToc.ts +++ /dev/null @@ -1,42 +0,0 @@ -import Prism from "prismjs"; -import "prismjs/components/prism-typescript"; -import "prismjs/themes/prism-twilight.css"; -import { ComponentParam } from "seqflow-js"; -import classes from "./ContentWithToc.module.css"; - -export interface Toc { - title: string; - slug: string; - type: "h2" | "h3"; - level: number; -} - -export async function ContentWithToc({ - dom, - data, -}: ComponentParam<{ toc: Toc[]; html: string; title: string }>) { - const { toc, html } = data; - - const tocHTML = `
    `; - - dom.render(` -
    - -
    -

    ${data.title}

    - ${html} -
    -
    -`); - - Prism.highlightAll(); -} diff --git a/packages/website/src/components/ContentWithToc.tsx b/packages/website/src/components/ContentWithToc.tsx new file mode 100644 index 0000000..f3cc8dd --- /dev/null +++ b/packages/website/src/components/ContentWithToc.tsx @@ -0,0 +1,49 @@ +import * as Prism from "prismjs"; +import "prismjs/components/prism-typescript"; +import "prismjs/components/prism-jsx"; +import "prismjs/components/prism-tsx"; +import "prismjs/themes/prism-twilight.css"; +import { SeqflowFunctionContext } from "seqflow-js"; +import classes from "./ContentWithToc.module.css"; + +export interface Toc { + title: string; + slug: string; + type: "h2" | "h3"; + level: number; +} + +function getElementFromString(string: string) { + const template = document.createElement("div"); + template.innerHTML = string; + return Array.from(template.children) as HTMLElement[]; +} + +export async function ContentWithToc(this: SeqflowFunctionContext, data: { toc: Toc[]; html: string; title: string }) { + // await import("prismjs/components/prism-tsx.min"); + + const { toc, html } = data; + + this.renderSync( +
    + +
    +

    {data.title}

    + {getElementFromString(html)} +
    +
    + ) + + Prism.highlightAll(); +} diff --git a/packages/website/src/components/Header.css b/packages/website/src/components/Header.css new file mode 100644 index 0000000..8e08829 --- /dev/null +++ b/packages/website/src/components/Header.css @@ -0,0 +1,7 @@ + + +@media (min-width: 992px) { + .github-name { + display: none; + } +} \ No newline at end of file diff --git a/packages/website/src/components/Header.ts b/packages/website/src/components/Header.ts deleted file mode 100644 index 639b665..0000000 --- a/packages/website/src/components/Header.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import githuLogo from "../public/images/github.svg"; -import logo from "../public/images/logo.svg"; - -const str = ` -`; - -export async function Header({ dom, event, router }: ComponentParam) { - dom.render(str); - - const seqflowAnchor = dom.querySelector("#seqflow-anchor"); - const whyAncor = dom.querySelector("#why-link"); - const docAnchor = dom.querySelector("#getting-started-link"); - const apiReferenceAnchor = dom.querySelector("#api-reference-link"); - const elements = [seqflowAnchor, whyAncor, docAnchor, apiReferenceAnchor]; - const anchors = Array.from(dom.querySelectorAll("a")) as HTMLAnchorElement[]; - - const currentPath = new RegExp(router.segments.shift(), "i"); - const currentAnchor = anchors.find((el) => currentPath.test(el.href)); - if (currentAnchor) { - currentAnchor.classList.add("active"); - } - - const events = event.waitEvent(event.domEvent("click")); - for await (const e of events) { - const anchor = elements.find((el) => el.contains(e.target as Node)); - if (anchor instanceof HTMLAnchorElement) { - router.navigate(anchor.href); - - for (const anchor of anchors) { - anchor.classList.remove("active"); - } - anchor.classList.add("active"); - } - } -} diff --git a/packages/website/src/components/Header.tsx b/packages/website/src/components/Header.tsx new file mode 100644 index 0000000..a6b1a00 --- /dev/null +++ b/packages/website/src/components/Header.tsx @@ -0,0 +1,87 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import githubLogoAsString from "../public/images/github.svg"; +import logoAsString from "../public/images/logo.svg"; +import './Header.css'; + + +function getSvg(html: string) { + const div = document.createElement("div"); + div.innerHTML = html + return div.children[0] as HTMLElement; +} + +export async function Header(this: SeqflowFunctionContext) { + const svg = getSvg(logoAsString(30, 30)) + const githubLogo = getSvg(githubLogoAsString(30, 30)) + + const anchor = ( + {svg} + SeqFlow + + ); + this.renderSync( + + ); + + /* + const seqflowAnchor = dom.querySelector("#seqflow-anchor"); + const whyAncor = dom.querySelector("#why-link"); + const docAnchor = dom.querySelector("#getting-started-link"); + const apiReferenceAnchor = dom.querySelector("#api-reference-link"); + const elements = [seqflowAnchor, whyAncor, docAnchor, apiReferenceAnchor]; + const anchors = Array.from(dom.querySelectorAll("a")) as HTMLAnchorElement[]; + + const currentPath = new RegExp(router.segments.shift(), "i"); + const currentAnchor = anchors.find((el) => currentPath.test(el.href)); + if (currentAnchor) { + currentAnchor.classList.add("active"); + } + + const events = event.waitEvent(event.domEvent("click")); + for await (const e of events) { + const anchor = elements.find((el) => el.contains(e.target as Node)); + if (anchor instanceof HTMLAnchorElement) { + router.navigate(anchor.href); + + for (const anchor of anchors) { + anchor.classList.remove("active"); + } + anchor.classList.add("active"); + } + } + */ +} diff --git a/packages/website/src/pages/ApiReference.ts b/packages/website/src/pages/ApiReference.ts deleted file mode 100644 index acd61d2..0000000 --- a/packages/website/src/pages/ApiReference.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { ContentWithToc } from "../components/ContentWithToc"; -import { html, toc } from "./ApiReference.md"; - -export async function ApiReference({ dom }: ComponentParam) { - dom.render(`
    `); - dom.child("api-reference", ContentWithToc, { - data: { toc, html, title: "Api Reference" }, - }); -} diff --git a/packages/website/src/pages/ApiReference.tsx b/packages/website/src/pages/ApiReference.tsx new file mode 100644 index 0000000..4468eff --- /dev/null +++ b/packages/website/src/pages/ApiReference.tsx @@ -0,0 +1,11 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { ContentWithToc } from "../components/ContentWithToc"; +import { html, toc } from "./ApiReference.md"; + +export async function ApiReference(this: SeqflowFunctionContext) { + this.renderSync( +
    + +
    + ); +} diff --git a/packages/website/src/pages/GettingStarted.md b/packages/website/src/pages/GettingStarted.md index 33e17d9..56b8836 100644 --- a/packages/website/src/pages/GettingStarted.md +++ b/packages/website/src/pages/GettingStarted.md @@ -23,70 +23,74 @@ This command will ask you some questions about the project, like where to place For the purpose of this documentation, we will use the empty template, but you can choose another one running the previous command without `--template empty` argument. - Opening the project folder, you may see some files and folders. The most important are: - -- `src/Main.ts`: the parent component -- `src/index.ts`: the entrypoint file -- `src/index.html`: the main HTML file - `src/index.css`: the main CSS file - +- `src/index.html`: the main HTML file +- `src/index.ts`: the entrypoint file +- `src/Main.tsx`: the parent component - `package.json`: the dependencies and devDependencies are fulfilled - `biome.json`: the project formatter configuration - `vite.config.js`: the Vite configuration file - `vitest.config.ts`: the Vitest configuration file. We will talk about it later +- `tests/index.test.ts`: the test file. Test part is covered at the end of this page -For now, we will focus only on `src/Main.ts` file. Our first application will be a simple counter. Let's start by creating the component. +Before we start, let's install the dependencies. Run the command `pnpm install` to install the dependencies. +For now, we will focus only on `src/Main.tsx` file. Our first application will be a simple counter. Let's start by creating the component. ## Counter application The counter application is a simple application that increments and decrements a number. We will create a unique component for this application that shows two buttons and a number: one button for incrementing the number and another for decrementing it.
    So, our desiderata is to create 2 buttons and wait for a "click" event on each one: when the user clicks on a button, the number should be incremented or decremented accordingly.
    It is simple. -Change the `src/Main.ts` file content as the following: +Change the `src/Main.tsx` file content as the following: -```ts -import { ComponentParam } from "seqflow-js"; +```tsx +import { SeqflowFunctionContext } from "seqflow-js"; -export async function Main({ dom, event }: ComponentParam) { +export async function Main(this: SeqflowFunctionContext) { let counter = 0; - dom.render(\` -
    - - -
    -
    \${counter}
    \`); - - const incrementButton = dom.querySelector("#increment"); - const decrementButton = dom.querySelector("#decrement"); - const counterDiv = dom.querySelector("#counter"); - - const events = event.waitEvent( - event.domEvent("click") + + const incrementButton = + const decrementButton = + const counterSpan = {counter} + this.renderSync( + <> +
    + {decrementButton} + {incrementButton} +
    + {counterSpan} + + ); + + const events = this.waitEvents( + this.domEvent("click", { el: this._el }) ); for await (const ev of events) { - if (ev.target === incrementButton) { + if (!(ev.target instanceof HTMLElement)) { + continue; + } + if (incrementButton.contains(ev.target)) { counter++; - } else if (ev.target === decrementButton) { + } else if (decrementButton.contains(ev.target)) { counter--; } - counterDiv.textContent = \`\${counter}\`; + counterSpan.textContent = \`\${counter}\`; } } - ``` -Wait... let's start the application and see the result. Run the command `pnpm dev`.
    +Wait... let's start the application and see the result. Run the command `pnpm start`.
    Open your browser and go to [`http://localhost:5173`](http://localhost:5173 "localhost"). You should see the counter application running. Let's see what we have done: -- We created a new component, `Main`, that is responsible for rendering the counter application. It is an `async` function that receives a `ComponentParam` object as a parameter. See the [API reference](/api-reference "Api Reference") for more information about the `ComponentParam` object. +- We created a new component, `Main`, that is responsible for rendering the counter application. It is an `async` function binded to a own `SeqflowFunctionContext` instance. See the [API reference](/api-reference "Api Reference") for more information about the `SeqflowFunctionContext` object. - We define a variable that holds the state of the application: the `counter` variable. -- We use the `dom.render` method to render the html. -- We also use the `dom.querySelector` method to get the button elements and the counter wrapper element. -- We use the `event.waitEvent` method to wait for a `"click"` event. Due to the event bubbling, we can attach a single event handler. `event.waitEvent` returns an async iterator that yields the events. +- We create two buttons, `incrementButton` and `decrementButton`, and a span, `counterSpan`, that shows the value of the counter variable. +- We use the `this.renderSync` method to render the html. +- We use the `this.domEvent` with `this.waitEvents` method to wait for a `"click"` event. Due to the event bubbling, we can attach a single event handler to the component mounting element (`this._el`). `this.waitEvents` returns an async iterator that yields the events. - We use a `for await` loop to wait for the `"click"` event. - When the user clicks, we check which is the target of the event: if it is the increment button, we increment the counter variable; if it is the decrement button, we decrement the counter variable. - Finally, we update the counter wrapper element with the new value of the counter variable. @@ -100,64 +104,68 @@ In SeqFlow, state is just a variable. You can use it as you want. You can use a ## Create different components -Even if the counter application is simple, it is not well-structured. -We have the entire application in a single component. It is not a good practice. We should split the application into different components. +Even if the counter application is simple, we want to learn how to structure a complex project. Now, we have the entire application in a single component. It is not a good practice. We should split the application into different components. -Let's start by creating a component, `Counter`, that will be responsible for rendering the counter application. Change the `src/Main.ts` file content as the following: +Let's start by creating a component, `Counter`, that will be responsible for rendering the counter application. Change the `src/Main.tsx` file content as the following: -```ts -import { ComponentParam } from "seqflow-js"; +```tsx +import { SeqflowFunctionContext } from "seqflow-js"; -async function ChangeCounterButton({ dom, data }: ComponentParam<{ text: string }>) { - dom.render(\`\`); +async function ChangeCounterButton(this: SeqflowFunctionContext, data: { text: string }) { + this.renderSync(); } -export async function Main({ dom, event }: ComponentParam) { +export async function Main(this: SeqflowFunctionContext) { let counter = 0; - dom.render(\` -
    -
    -
    -
    -
    \${counter}
    -\`); - dom.child("decrement", ChangeCounterButton, { data: { text: "Decrement" } }); - dom.child("increment", ChangeCounterButton, { data: { text: "Increment" } }); - - const incrementButton = dom.querySelector("#increment"); - const decrementButton = dom.querySelector("#decrement"); - const counterDiv = dom.querySelector("#counter"); - - const events = event.waitEvent(event.domEvent("click")); + + const incrementButton = + const decrementButton = + const counterSpan = {counter} + this.renderSync( + <> +
    + {decrementButton} + {incrementButton} +
    + {counterSpan} + + ); + + const events = this.waitEvents( + this.domEvent("click", { el: this._el }) + ); for await (const ev of events) { + if (!(ev.target instanceof HTMLElement)) { + continue; + } if (incrementButton.contains(ev.target)) { counter++; } else if (decrementButton.contains(ev.target)) { counter--; } - counterDiv.textContent = \`\${counter}\`; + counterSpan.textContent = \`\${counter}\`; } } ``` -We created a new component, `ChangeCounterButton`, that is responsible for rendering a button. We also used the `dom.child` method to render the `ChangeCounterButton` component inside the `Main` component. +We created a new component, `ChangeCounterButton`, that is responsible for rendering a button. The `Main` component uses it to render the increment and decrement buttons. -The `ChangeCounterButton` component receives a `ComponentParam` object as a parameter. We also used the `ComponentParam` generic type to define the type of the `data` property. We typed the `data` property as an object with a `text` property that is a string. So, inside the component, we can access the `text` property as a string. - -We also changed the `Main` component to use the `ChangeCounterButton` component. We used the `dom.child` method to render the `ChangeCounterButton` component inside the `Main` component. We passed the `text` property to the `ChangeCounterButton` component. +The `ChangeCounterButton` component receives a `data` object as a parameter which contains `text` property, the text we want to render as button label. +In `Main` component, we instantiate the `ChangeCounterButton` component twice: one for the increment button and another for the decrement button, passing the `text` property accordingly. Moreover, we changed the event handling to use the `contains` method to check if the target of the event is inside the button element. +**NB**: even if SeqFlow uses JSX syntax, it is not React. Everytime SeqFlow mounts a child component, it creates a `div` element to wrap the child component. This is the reason we use the `contains` method to check if the target of the event is inside the button element. + ## Structure your project into domains The counter application is still not well-structured: we mixed the UI and the logic parts.
    When the application grows, it will be hard to maintain and test it. We should split the application into different parts: the UI part and the logic part. Before we start, let's understood the concept of domain in SeqFlow. A domain is a part of the application that is responsible for a specific feature.
    -In this example, we will create a domain for the counter application: the counter domain will be responsible for managing the state of the counter application, incrementing and decrementing the counter variable.
    -We will also create a domain for the UI part of the counter application: the button that increments and decrements the counter variable.
    -We create the `counter` domain and put it in the `src/domains/counter` folder. +Even if an application manages multiple domains at the same time, in this example, we will create only one domain for the counter application: the counter domain will be responsible for managing the state of the counter application, incrementing and decrementing the counter variable.
    +We want to create the `counter` domain and put all the files in the `src/domains/counter` folder. Lets start by creating the `counter` domain class. Create the `src/domains/counter/index.ts` file with the folling content: ```ts @@ -191,17 +199,18 @@ export class CounterDomain { The `CounterDomain` class is a pure Javascript (Typescript) class that is responsible for managing the state of the counter application. It has a `counter` property that holds the state of the counter application. It also has a `applyDelta` method that is responsible for incrementing and decrementing the counter variable.
    Because the UI part should be notified when the state changes, we create a `CounterChanged` event class for that reason: after the counter variable changes, the `CounterDomain` class dispatches a `CounterChanged` event with the new value of the counter variable.
    -NB: the `createDomainEventClass` function is a helper function that creates a new event class. It is a simple function that returns a new event class. See the [API reference](/api-reference "Api Reference") for more information about the `createDomainEventClass` function. +NB: the `createDomainEventClass` function is a helper function that creates a new event class. See the [API reference](/api-reference "Api Reference") for more information about the `createDomainEventClass` function. After creating the `counter` domain, we should register it updating the `src/index.ts` file content as the following: ```ts import { start } from "seqflow-js"; -import { CounterDomain } from "./domains/counter/index.ts"; +import { CounterDomain } from "./domains/counter/index"; import { Main } from "./Main"; start(document.getElementById("root"), Main, undefined, { + log: (l) => console.log(l), domains: { counter: (eventTarget) => { return new CounterDomain(eventTarget); @@ -215,71 +224,69 @@ declare module "seqflow-js" { counter: CounterDomain; } } - ``` This update is necessary to register the `counter` domain. See the [API reference](/api-reference "Api Reference") for more information about the `start` function. -Now, it is the time to move the `ChangeCounterButton` component to the `src/domains/counter` folder. Create the `src/domains/counter/ChangeCounterButton.ts` file with the following content: +Now, it is the time to move the `ChangeCounterButton` component to the `src/domains/counter` folder. Create the `src/domains/counter/ChangeCounterButton.tsx` file with the following content: -```ts -import { ComponentParam } from "seqflow-js"; - -export async function ChangeCounterButton({ - dom, - event, - domains, - data, -}: ComponentParam<{ delta: number; text: string }>) { - dom.render(\`\`); - const events = event.waitEvent(event.domEvent("click")); +```tsx +import { SeqflowFunctionContext } from "seqflow-js"; + +export async function ChangeCounterButton(this: SeqflowFunctionContext, data: { delta: number; text: string }) { + const button = ( + + ); + this.renderSync(button); + const events = this.waitEvents(this.domEvent("click", { el: button })); for await (const _ of events) { - domains.counter.applyDelta(data.delta); + this.app.domains.counter.applyDelta(data.delta); } } ``` We didn't change the `ChangeCounterButton` component too much: - We added `delta` property to the `data` property. It is a number that represents the increment or decrement value. -- We used the `domains` property to access the `counter` domain. We used the `applyDelta` method to increment or decrement the counter variable. +- We created the `button` element separately and rendered it using the `this.renderSync` method. This allows us to access the button element later. +- We rendered the button element. After we wait for the `"click"` event on the button element. In this case, we use the `button` element as the event target. +- We used the `this.app.domains` property to access the `counter` domain. We used the `applyDelta` method to increment or decrement the counter variable. -Finally, we should update the `src/Main.ts` file content as the following: +Finally, we should update the `src/Main.tsx` file content as the following: -```ts -import { ComponentParam } from "seqflow-js"; -import { - CounterChanged, -} from "./domains/counter"; +```tsx +import { SeqflowFunctionContext } from "seqflow-js"; +import { CounterChanged } from "./domains/counter"; import { ChangeCounterButton } from "./domains/counter/ChangeCounterButton"; -export async function Main({ dom, event, domains }: ComponentParam) { - const counter = domains.counter.get(); - dom.render(\` -
    -
    -
    -
    -
    \${counter}
    \`); - dom.child("decrement", ChangeCounterButton, { - data: { delta: -1, text: "Decrement" }, - }); - dom.child("increment", ChangeCounterButton, { - data: { delta: 1, text: "Increment" }, - }); +export async function Main(this: SeqflowFunctionContext) { + let counter = 0; - const counterDiv = dom.querySelector("#counter"); + const incrementButton = + const decrementButton = + const counterSpan = {counter} + this.renderSync( + <> +
    + {decrementButton} + {incrementButton} +
    + {counterSpan} + + ); - const events = event.waitEvent( - event.domainEvent(CounterChanged), + + const events = this.waitEvents( + this.domainEvent(CounterChanged), ); for await (const ev of events) { - counterDiv.textContent = \`\${domains.counter.get()}\`; + counterSpan.textContent = \`\${this.app.domains.counter.get()}\`; } } + ``` In this update, we changed the `Main` component as the following: - the component uses the `counter` domain to get the initial value of the counter -- the component renders the html and two `ChangeCounterButton`: one for decrementing the counter variable and another for incrementing it. -- the component uses the `event.waitEvent` method to wait for the `CounterChanged` event. +- the component renders the html with two `ChangeCounterButton` components: one for decrementing the counter variable and another for incrementing it. +- the component uses the `this.waitEvents` method to wait for the `CounterChanged` event. - when the `CounterChanged` event is dispatched, the component updates the counter wrapper element with the new value of the counter variable. ## How to test your application @@ -294,11 +301,10 @@ import { screen, waitFor } from "@testing-library/dom"; import { start } from "seqflow-js"; import { expect, test } from "vitest"; import { Main } from "../src/Main"; -import { CounterDomain } from "../src/domains/counter/index.ts"; +import { CounterDomain } from "../src/domains/counter/index"; test("should increment and decrement the counter", async () => { start(document.body, Main, undefined, { - log() {}, domains: { counter: (eventTarget) => { return new CounterDomain(eventTarget); @@ -307,9 +313,9 @@ test("should increment and decrement the counter", async () => { }); const incrementButton = - await screen.findByText("Increment"); + await screen.findByText(/Increment/i); const decrementButton = - await screen.findByText("Decrement"); + await screen.findByText(/Decrement/i); const counterDiv = await screen.findByText("0"); expect(counterDiv.textContent).toBe("0"); @@ -325,8 +331,14 @@ test("should increment and decrement the counter", async () => { This test is simple: it starts the application and waits for the `Increment` and `Decrement` buttons to appear. Then, it clicks on the `Increment` button and waits for the counter variable to be incremented. It does the same for the `Decrement` button. +## Improvements (at home) + +I want to leave you with two little homework: +- implement a reset button that sets the counter to 0 +- persist the counter value in the local storage. If the user refreshes the page, the counter value should be the same as before. For this, try to not change the UI part. + ## Conclusion In this tutorial, we learned how to create a simple counter application using SeqFlow. We also learned how to structure the application into different parts: the UI part and the logic part. We also learned how to test the application using the `vitest` library. -For more complex examples, check the examples folder at GitHub. \ No newline at end of file +For more complex examples, check the examples folder at GitHub. diff --git a/packages/website/src/pages/GettingStarted.ts b/packages/website/src/pages/GettingStarted.ts deleted file mode 100644 index 099d785..0000000 --- a/packages/website/src/pages/GettingStarted.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { ContentWithToc } from "../components/ContentWithToc"; -import { html, toc } from "./GettingStarted.md"; - -export async function GettingStarted({ dom }: ComponentParam) { - dom.render(`
    `); - dom.child("getting-started", ContentWithToc, { - data: { toc, html, title: "Getting started" }, - }); -} diff --git a/packages/website/src/pages/GettingStarted.tsx b/packages/website/src/pages/GettingStarted.tsx new file mode 100644 index 0000000..9fc5ecf --- /dev/null +++ b/packages/website/src/pages/GettingStarted.tsx @@ -0,0 +1,9 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { ContentWithToc } from "../components/ContentWithToc"; +import { html, toc } from "./GettingStarted.md"; + +export async function GettingStarted(this: SeqflowFunctionContext) { + this.renderSync(
    + +
    ); +} diff --git a/packages/website/src/pages/Home.ts b/packages/website/src/pages/Home.ts deleted file mode 100644 index 53b5ab0..0000000 --- a/packages/website/src/pages/Home.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import classes from "./Home.module.css"; - -export async function Home({ dom }: ComponentParam) { - dom.render(` -
    -
    -

    SeqFlow

    -

    A framework to write products efficiently

    -
    -
    -
      -
    • Events over State Management!
    • -
    • Simplicity over Complexity
    • -
    • Linearity over Complex Abstractions
    • -
    • Explicitness over Implicitiveness
    • -
    -
    - See documentation -
    -
    `); -} diff --git a/packages/website/src/pages/Home.tsx b/packages/website/src/pages/Home.tsx new file mode 100644 index 0000000..f006b2d --- /dev/null +++ b/packages/website/src/pages/Home.tsx @@ -0,0 +1,23 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import classes from "./Home.module.css"; + +export async function Home(this: SeqflowFunctionContext) { + this.renderSync( +
    +
    +

    SeqFlow

    +

    A framework to write products efficiently

    +
    +
    +
      +
    • Events over State Management!
    • +
    • Simplicity over Complexity
    • +
    • Linearity over Complex Abstractions
    • +
    • Explicitness over Implicitiveness
    • +
    +
    + See documentation +
    +
    + ); +} diff --git a/packages/website/src/pages/Why.ts b/packages/website/src/pages/Why.ts deleted file mode 100644 index f93aa9d..0000000 --- a/packages/website/src/pages/Why.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ComponentParam } from "seqflow-js"; -import { ContentWithToc } from "../components/ContentWithToc"; -import { html, toc } from "./Why.md"; - -export async function Why({ dom }: ComponentParam) { - dom.render(`
    `); - dom.child("why", ContentWithToc, { - data: { toc, html, title: "Why SeqFlow?" }, - }); -} diff --git a/packages/website/src/pages/Why.tsx b/packages/website/src/pages/Why.tsx new file mode 100644 index 0000000..359924f --- /dev/null +++ b/packages/website/src/pages/Why.tsx @@ -0,0 +1,9 @@ +import { SeqflowFunctionContext } from "seqflow-js"; +import { ContentWithToc } from "../components/ContentWithToc"; +import { html, toc } from "./Why.md"; + +export async function Why(this: SeqflowFunctionContext) { + this.renderSync(
    + +
    ); +} diff --git a/packages/website/src/tsconfig.json b/packages/website/src/tsconfig.json deleted file mode 100644 index bb3c92f..0000000 --- a/packages/website/src/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "compilerOptions": { - "lib": ["es2015", "dom"] - }, - "include": ["./**/*", "../vite.d.ts"] -} \ No newline at end of file diff --git a/packages/website/tsconfig.json b/packages/website/tsconfig.json new file mode 100644 index 0000000..29ecf96 --- /dev/null +++ b/packages/website/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "lib": ["es2015", "dom"], + "jsx": "react", + "jsxFactory": "this.createDOMElement", + "jsxFragmentFactory": "this.createDOMFragment" + }, + "include": ["./src/**/*", "./tests/**/*"] +} diff --git a/packages/website/vite.config.ts b/packages/website/vite.config.ts index 92e9dc9..822eac3 100644 --- a/packages/website/vite.config.ts +++ b/packages/website/vite.config.ts @@ -21,6 +21,9 @@ export default defineConfig({ build: { outDir: "../dist", }, + optimizeDeps: { + exclude: ['prism'] + }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99c781c..1857dee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -42,19 +42,19 @@ importers: version: 4.1.5 vite: specifier: ^5.0.0 - version: 5.1.4(@types/node@20.11.24) + version: 5.1.4(@types/node@20.12.7) vite-plugin-dts: specifier: ^3.6.4 - version: 3.7.3(@types/node@20.11.24)(typescript@5.3.3)(vite@5.1.4) + version: 3.7.3(@types/node@20.12.7)(rollup@4.17.0)(typescript@5.4.2)(vite@5.1.4(@types/node@20.12.7)) vite-plugin-full-reload: specifier: ^1.1.0 version: 1.1.0 vite-plugin-live-reload: specifier: ^3.0.3 - version: 3.0.3(vite@5.1.4) + version: 3.0.3(vite@5.1.4(@types/node@20.12.7)) vitest: specifier: ^1.2.2 - version: 1.3.1(jsdom@24.0.0) + version: 1.3.1(@types/node@20.12.7)(jsdom@24.0.0) examples/counter-component: dependencies: @@ -82,19 +82,19 @@ importers: version: 4.1.5 vite: specifier: ^5.0.0 - version: 5.1.4(@types/node@20.11.24) + version: 5.1.4(@types/node@20.12.7) vite-plugin-dts: specifier: ^3.6.4 - version: 3.7.3(@types/node@20.11.24)(typescript@5.3.3)(vite@5.1.4) + version: 3.7.3(@types/node@20.12.7)(rollup@4.17.0)(typescript@5.4.2)(vite@5.1.4(@types/node@20.12.7)) vite-plugin-full-reload: specifier: ^1.1.0 version: 1.1.0 vite-plugin-live-reload: specifier: ^3.0.3 - version: 3.0.3(vite@5.1.4) + version: 3.0.3(vite@5.1.4(@types/node@20.12.7)) vitest: specifier: ^1.2.2 - version: 1.3.1(jsdom@24.0.0) + version: 1.3.1(@types/node@20.12.7)(jsdom@24.0.0) examples/counter-domain: dependencies: @@ -122,19 +122,19 @@ importers: version: 4.1.5 vite: specifier: ^5.0.0 - version: 5.1.4(@types/node@20.11.24) + version: 5.1.4(@types/node@20.12.7) vite-plugin-dts: specifier: ^3.6.4 - version: 3.7.3(@types/node@20.11.24)(typescript@5.3.3)(vite@5.1.4) + version: 3.7.3(@types/node@20.12.7)(rollup@4.17.0)(typescript@5.4.2)(vite@5.1.4(@types/node@20.12.7)) vite-plugin-full-reload: specifier: ^1.1.0 version: 1.1.0 vite-plugin-live-reload: specifier: ^3.0.3 - version: 3.0.3(vite@5.1.4) + version: 3.0.3(vite@5.1.4(@types/node@20.12.7)) vitest: specifier: ^1.2.2 - version: 1.3.1(jsdom@24.0.0) + version: 1.3.1(@types/node@20.12.7)(jsdom@24.0.0) examples/e-commerce: dependencies: @@ -150,7 +150,7 @@ importers: version: 9.3.4 '@testing-library/jest-dom': specifier: ^6.4.2 - version: 6.4.2(vitest@1.3.1) + version: 6.4.2(vitest@1.3.1(@types/node@20.12.7)(jsdom@24.0.0)) '@types/css-modules': specifier: ^1.0.5 version: 1.0.5 @@ -162,25 +162,25 @@ importers: version: 24.0.0 msw: specifier: ^2.2.1 - version: 2.2.1(typescript@5.3.3) + version: 2.2.1(typescript@5.4.2) npm-run-all: specifier: ^4.1.5 version: 4.1.5 vite: specifier: ^5.0.0 - version: 5.1.4(@types/node@20.11.24) + version: 5.1.4(@types/node@20.12.7) vite-plugin-dts: specifier: ^3.6.4 - version: 3.7.3(@types/node@20.11.24)(typescript@5.3.3)(vite@5.1.4) + version: 3.7.3(@types/node@20.12.7)(rollup@4.17.0)(typescript@5.4.2)(vite@5.1.4(@types/node@20.12.7)) vite-plugin-full-reload: specifier: ^1.1.0 version: 1.1.0 vite-plugin-live-reload: specifier: ^3.0.3 - version: 3.0.3(vite@5.1.4) + version: 3.0.3(vite@5.1.4(@types/node@20.12.7)) vitest: specifier: ^1.2.2 - version: 1.3.1(jsdom@24.0.0) + version: 1.3.1(@types/node@20.12.7)(jsdom@24.0.0) examples/empty: dependencies: @@ -202,16 +202,16 @@ importers: version: 4.1.5 vite: specifier: ^5.0.0 - version: 5.1.4(@types/node@20.11.24) + version: 5.1.4(@types/node@20.12.7) vite-plugin-full-reload: specifier: ^1.1.0 version: 1.1.0 vite-plugin-live-reload: specifier: ^3.0.3 - version: 3.0.3(vite@5.1.4) + version: 3.0.3(vite@5.1.4(@types/node@20.12.7)) vitest: specifier: ^1.2.2 - version: 1.3.1(jsdom@24.0.0) + version: 1.3.1(@types/node@20.12.7)(jsdom@24.0.0) packages/create-seqflow: dependencies: @@ -266,18 +266,22 @@ importers: version: 5.1.4(@types/node@20.11.24) vite-plugin-dts: specifier: ^3.6.4 - version: 3.7.3(@types/node@20.11.24)(typescript@5.3.3)(vite@5.1.4) + version: 3.7.3(@types/node@20.11.24)(rollup@4.17.0)(typescript@5.4.2)(vite@5.1.4(@types/node@20.11.24)) vite-plugin-full-reload: specifier: ^1.1.0 version: 1.1.0 vite-plugin-live-reload: specifier: ^3.0.3 - version: 3.0.3(vite@5.1.4) + version: 3.0.3(vite@5.1.4(@types/node@20.11.24)) vitest: specifier: ^1.2.2 version: 1.3.1(@types/node@20.11.24)(jsdom@24.0.0) - packages/seqflow-js: + packages/doc-test: + dependencies: + seqflow-js: + specifier: workspace:* + version: link:../seqflow-js devDependencies: '@biomejs/biome': specifier: 1.5.3 @@ -288,30 +292,60 @@ importers: '@types/css-modules': specifier: ^1.0.5 version: 1.0.5 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + vite: + specifier: ^5.0.0 + version: 5.2.10(@types/node@20.12.7) + vite-plugin-full-reload: + specifier: ^1.1.0 + version: 1.1.0 + vite-plugin-live-reload: + specifier: ^3.0.3 + version: 3.0.3(vite@5.2.10(@types/node@20.12.7)) + vitest: + specifier: ^1.2.2 + version: 1.5.2(@types/node@20.12.7)(jsdom@24.0.0) + + packages/seqflow-js: + devDependencies: + '@biomejs/biome': + specifier: 1.7.1 + version: 1.7.1 + '@testing-library/dom': + specifier: ^10.0.0 + version: 10.0.0 + '@types/css-modules': + specifier: ^1.0.5 + version: 1.0.5 '@types/jsdom': specifier: ^21.1.6 version: 21.1.6 '@vitest/coverage-v8': - specifier: ^1.2.2 - version: 1.3.1(vitest@1.3.1) + specifier: ^1.5.2 + version: 1.5.2(vitest@1.5.2(@types/node@20.12.7)(jsdom@24.0.0)) jsdom: specifier: ^24.0.0 version: 24.0.0 npm-run-all: specifier: ^4.1.5 version: 4.1.5 + tsd: + specifier: ^0.31.0 + version: 0.31.0 typedoc: - specifier: ^0.25.12 - version: 0.25.12(typescript@5.3.3) + specifier: ^0.25.13 + version: 0.25.13(typescript@5.4.2) vite: - specifier: ^5.0.0 - version: 5.1.4(@types/node@20.11.24) + specifier: ^5.2.10 + version: 5.2.10(@types/node@20.12.7) vite-plugin-dts: - specifier: ^3.6.4 - version: 3.7.3(@types/node@20.11.24)(typescript@5.3.3)(vite@5.1.4) + specifier: ^3.9.0 + version: 3.9.0(@types/node@20.12.7)(rollup@4.17.0)(typescript@5.4.2)(vite@5.2.10(@types/node@20.12.7)) vitest: - specifier: ^1.2.2 - version: 1.3.1(jsdom@24.0.0) + specifier: ^1.5.2 + version: 1.5.2(@types/node@20.12.7)(jsdom@24.0.0) packages/website: dependencies: @@ -329,7 +363,7 @@ importers: version: 6.5.1 '@mojojoejo/vite-plugin-purgecss': specifier: ^1.1.0 - version: 1.1.0(vite@5.1.4) + version: 1.1.0(vite@5.1.4(@types/node@20.11.24)) bootstrap: specifier: 5.3.3 version: 5.3.3(@popperjs/core@2.11.8) @@ -384,575 +418,574 @@ importers: version: 5.1.4(@types/node@20.11.24) vite-plugin-dts: specifier: ^3.6.4 - version: 3.7.3(@types/node@20.11.24)(typescript@5.3.3)(vite@5.1.4) + version: 3.7.3(@types/node@20.11.24)(rollup@4.17.0)(typescript@5.4.2)(vite@5.1.4(@types/node@20.11.24)) vite-plugin-full-reload: specifier: ^1.1.0 version: 1.1.0 vite-plugin-live-reload: specifier: ^3.0.3 - version: 3.0.3(vite@5.1.4) + version: 3.0.3(vite@5.1.4(@types/node@20.11.24)) vite-plugin-markdown: specifier: ^2.2.0 - version: 2.2.0(vite@5.1.4) + version: 2.2.0(vite@5.1.4(@types/node@20.11.24)) vitest: specifier: ^1.2.2 version: 1.3.1(@types/node@20.11.24)(jsdom@24.0.0) packages: - /@adobe/css-tools@4.3.3: + '@adobe/css-tools@4.3.3': resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - dev: true - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 - dev: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - /@babel/helper-string-parser@7.23.4: + '@babel/helper-string-parser@7.23.4': resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.20: + '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - dev: true - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - /@babel/parser@7.23.9: + '@babel/parser@7.23.9': resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.23.9 - dev: true - /@babel/runtime@7.23.9: + '@babel/parser@7.24.4': + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.23.9': resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: true - /@babel/types@7.23.9: - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + '@babel/runtime@7.24.4': + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - /@bcoe/v8-coverage@0.2.3: + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - /@biomejs/biome@1.5.3: + '@biomejs/biome@1.5.3': resolution: {integrity: sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==} engines: {node: '>=14.*'} hasBin: true - requiresBuild: true - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.5.3 - '@biomejs/cli-darwin-x64': 1.5.3 - '@biomejs/cli-linux-arm64': 1.5.3 - '@biomejs/cli-linux-arm64-musl': 1.5.3 - '@biomejs/cli-linux-x64': 1.5.3 - '@biomejs/cli-linux-x64-musl': 1.5.3 - '@biomejs/cli-win32-arm64': 1.5.3 - '@biomejs/cli-win32-x64': 1.5.3 - dev: true - /@biomejs/cli-darwin-arm64@1.5.3: + '@biomejs/biome@1.7.1': + resolution: {integrity: sha512-wb2UNoFXcgaMdKXKT5ytsYntaogl2FSTjDt20CZynF3v7OXQUcIpTrr+be3XoOGpoZRj3Ytq9TSpmplUREXmeA==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.5.3': resolution: {integrity: sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==} engines: {node: '>=14.*'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@biomejs/cli-darwin-x64@1.5.3: + '@biomejs/cli-darwin-arm64@1.7.1': + resolution: {integrity: sha512-qfLrIIB58dkgiY/1tgG6fSCBK22PZaSIf6blweZBsG6iMij05mEuJt50ne+zPnNFNUmt8t43NC/qOXT3iFHQBA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.5.3': resolution: {integrity: sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==} engines: {node: '>=14.*'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@biomejs/cli-linux-arm64-musl@1.5.3: + '@biomejs/cli-darwin-x64@1.7.1': + resolution: {integrity: sha512-OGeyNsEcp5VnKbF9/TBjPCTHNEOm7oHegEve07U3KZmzqfpw2Oe3i9DVW8t6vvj1TYbrwWYCld25H34kBDY7Vg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.5.3': resolution: {integrity: sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==} engines: {node: '>=14.*'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@biomejs/cli-linux-arm64@1.5.3: + '@biomejs/cli-linux-arm64-musl@1.7.1': + resolution: {integrity: sha512-giH0/CzLOJ+wbxLxd5Shnr5xQf5fGnTRWLDe3lzjaF7IplVydNCEeZJtncB01SvyA6DAFJsvQ4LNxzAOQfEVCg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.5.3': resolution: {integrity: sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==} engines: {node: '>=14.*'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@biomejs/cli-linux-x64-musl@1.5.3: + '@biomejs/cli-linux-arm64@1.7.1': + resolution: {integrity: sha512-MQDf5wErj1iBvlcxCyOa0XqZYN8WJrupVgbNnqhntO3yVATg8GxduVUn1fDSaolznkDRsj7Pz3Xu1esBFwvfmg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.5.3': resolution: {integrity: sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==} engines: {node: '>=14.*'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@biomejs/cli-linux-x64@1.5.3: + '@biomejs/cli-linux-x64-musl@1.7.1': + resolution: {integrity: sha512-ySNDtPhsLxU125IFHHAxfpoHBpkM56s4mEXeO70GZtgZay/o1h8IUPWCWf5Z7gKgc4jwgYN1U1U9xabI3hZVAg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.5.3': resolution: {integrity: sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==} engines: {node: '>=14.*'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@biomejs/cli-win32-arm64@1.5.3: + '@biomejs/cli-linux-x64@1.7.1': + resolution: {integrity: sha512-3wmCsGcC3KZ4pfTknXHfyMMlXPMhgfXVAcG5GlrR+Tq2JGiAw0EUydaLpsSBEbcG7IxH6OiUZEJZ95kAycCHBA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.5.3': resolution: {integrity: sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==} engines: {node: '>=14.*'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@biomejs/cli-win32-x64@1.5.3: + '@biomejs/cli-win32-arm64@1.7.1': + resolution: {integrity: sha512-8hIDakEqZn0i6+388noYKdZ0ZrovTwnvMU/Qp/oJou0G7EPVdXupOe0oxiQSdRN0W7f6CS/yjPCYuVGzDG6r0g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.5.3': resolution: {integrity: sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==} engines: {node: '>=14.*'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@bundled-es-modules/cookie@2.0.0: + '@biomejs/cli-win32-x64@1.7.1': + resolution: {integrity: sha512-3W9k3uH6Ea6VOpAS9xkkAlS0LTfnGQjmIUCegZ8SDtK2NgJ1gO+qdEkGJb0ltahusFTN1QxJ107dM7ASA9IUEg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@bundled-es-modules/cookie@2.0.0': resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} - dependencies: - cookie: 0.5.0 - dev: true - /@bundled-es-modules/statuses@1.0.1: + '@bundled-es-modules/statuses@1.0.1': resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} - dependencies: - statuses: 2.0.1 - dev: true - /@esbuild/aix-ppc64@0.19.12: + '@esbuild/aix-ppc64@0.19.12': resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - optional: true - /@esbuild/android-arm64@0.19.12: + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - optional: true - /@esbuild/android-arm@0.19.12: + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - optional: true - /@esbuild/android-x64@0.19.12: + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - optional: true - /@esbuild/darwin-arm64@0.19.12: + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - optional: true - /@esbuild/darwin-x64@0.19.12: + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - optional: true - /@esbuild/freebsd-arm64@0.19.12: + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/freebsd-x64@0.19.12: + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/linux-arm64@0.19.12: + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-arm@0.19.12: + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ia32@0.19.12: + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-loong64@0.19.12: + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-mips64el@0.19.12: + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ppc64@0.19.12: + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-riscv64@0.19.12: + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-s390x@0.19.12: + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-x64@0.19.12: + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/netbsd-x64@0.19.12: + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - optional: true - /@esbuild/openbsd-x64@0.19.12: + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.12': resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - optional: true - /@esbuild/sunos-x64@0.19.12: + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - optional: true - /@esbuild/win32-arm64@0.19.12: + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-ia32@0.19.12: + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-x64@0.19.12: + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - optional: true - /@fortawesome/fontawesome-common-types@6.5.1: + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@fortawesome/fontawesome-common-types@6.5.1': resolution: {integrity: sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==} engines: {node: '>=6'} - requiresBuild: true - dev: false - /@fortawesome/fontawesome-svg-core@6.5.1: + '@fortawesome/fontawesome-svg-core@6.5.1': resolution: {integrity: sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==} engines: {node: '>=6'} - requiresBuild: true - dependencies: - '@fortawesome/fontawesome-common-types': 6.5.1 - dev: false - /@fortawesome/free-brands-svg-icons@6.5.1: + '@fortawesome/free-brands-svg-icons@6.5.1': resolution: {integrity: sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==} engines: {node: '>=6'} - requiresBuild: true - dependencies: - '@fortawesome/fontawesome-common-types': 6.5.1 - dev: false - /@fortawesome/free-regular-svg-icons@6.5.1: + '@fortawesome/free-regular-svg-icons@6.5.1': resolution: {integrity: sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ==} engines: {node: '>=6'} - requiresBuild: true - dependencies: - '@fortawesome/fontawesome-common-types': 6.5.1 - dev: false - /@fortawesome/free-solid-svg-icons@6.5.1: + '@fortawesome/free-solid-svg-icons@6.5.1': resolution: {integrity: sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==} engines: {node: '>=6'} - requiresBuild: true - dependencies: - '@fortawesome/fontawesome-common-types': 6.5.1 - dev: false - /@inquirer/confirm@3.0.0: + '@inquirer/confirm@3.0.0': resolution: {integrity: sha512-LHeuYP1D8NmQra1eR4UqvZMXwxEdDXyElJmmZfU44xdNLL6+GcQBS0uE16vyfZVjH8c22p9e+DStROfE/hyHrg==} engines: {node: '>=18'} - dependencies: - '@inquirer/core': 7.0.0 - '@inquirer/type': 1.2.0 - dev: true - /@inquirer/core@7.0.0: + '@inquirer/core@7.0.0': resolution: {integrity: sha512-g13W5yEt9r1sEVVriffJqQ8GWy94OnfxLCreNSOTw0HPVcszmc/If1KIf7YBmlwtX4klmvwpZHnQpl3N7VX2xA==} engines: {node: '>=18'} - dependencies: - '@inquirer/type': 1.2.0 - '@types/mute-stream': 0.0.4 - '@types/node': 20.11.24 - '@types/wrap-ansi': 3.0.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-spinners: 2.9.2 - cli-width: 4.1.0 - figures: 3.2.0 - mute-stream: 1.0.0 - run-async: 3.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true - /@inquirer/type@1.2.0: + '@inquirer/type@1.2.0': resolution: {integrity: sha512-/vvkUkYhrjbm+RolU7V1aUFDydZVKNKqKHR5TsE+j5DXgXFwrsOPcoGUJ02K0O7q7O53CU2DOTMYCHeGZ25WHA==} engines: {node: '>=18'} - dev: true - /@istanbuljs/schema@0.1.3: + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - dev: true - /@jest/schemas@29.6.3: + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 - dev: true - /@jridgewell/resolve-uri@3.1.2: + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/sourcemap-codec@1.4.15: + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - /@jridgewell/trace-mapping@0.3.22: - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@microsoft/api-extractor-model@7.28.13': + resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} - /@microsoft/api-extractor-model@7.28.3(@types/node@20.11.24): + '@microsoft/api-extractor-model@7.28.3': resolution: {integrity: sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0(@types/node@20.11.24) - transitivePeerDependencies: - - '@types/node' - dev: true - /@microsoft/api-extractor@7.39.0(@types/node@20.11.24): + '@microsoft/api-extractor@7.39.0': resolution: {integrity: sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==} hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.28.3(@types/node@20.11.24) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0(@types/node@20.11.24) - '@rushstack/rig-package': 0.5.1 - '@rushstack/ts-command-line': 4.17.1 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.3.3 - transitivePeerDependencies: - - '@types/node' - dev: true - /@microsoft/tsdoc-config@0.16.2: + '@microsoft/api-extractor@7.43.0': + resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + hasBin: true + + '@microsoft/tsdoc-config@0.16.2': resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - dev: true - /@microsoft/tsdoc@0.14.2: + '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: true - /@mojojoejo/vite-plugin-purgecss@1.1.0(vite@5.1.4): + '@mojojoejo/vite-plugin-purgecss@1.1.0': resolution: {integrity: sha512-J9hgBEsvP5f1XvejZVynO1gVZn6ruin5dLjr3FSjtf7Z6f8A9VqOJr2pZVGzP6Nc9ih5HSTuw3cPAOg8DzgZTQ==} peerDependencies: vite: ^3 || ^4 - dependencies: - purgecss: 5.0.0 - vite: 5.1.4(@types/node@20.11.24) - dev: false - /@mswjs/cookies@1.1.0: + '@mswjs/cookies@1.1.0': resolution: {integrity: sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw==} engines: {node: '>=18'} - dev: true - /@mswjs/interceptors@0.25.16: + '@mswjs/interceptors@0.25.16': resolution: {integrity: sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg==} engines: {node: '>=18'} - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.2 - strict-event-emitter: 0.5.1 - dev: true - /@open-draft/deferred-promise@2.2.0: + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - dev: true - /@open-draft/logger@0.3.0: + '@open-draft/logger@0.3.0': resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} - dependencies: - is-node-process: 1.2.0 - outvariant: 1.4.2 - dev: true - /@open-draft/until@2.1.0: + '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - dev: true - /@popperjs/core@2.11.8: + '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false - /@rollup/pluginutils@5.1.0: + '@rollup/pluginutils@5.1.0': resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -960,156 +993,200 @@ packages: peerDependenciesMeta: rollup: optional: true - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - dev: true - /@rollup/rollup-android-arm-eabi@4.12.0: + '@rollup/rollup-android-arm-eabi@4.12.0': resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} cpu: [arm] os: [android] - requiresBuild: true - optional: true - /@rollup/rollup-android-arm64@4.12.0: + '@rollup/rollup-android-arm-eabi@4.17.0': + resolution: {integrity: sha512-nNvLvC2fjC+3+bHYN9uaGF3gcyy7RHGZhtl8TB/kINj9hiOQza8kWJGZh47GRPMrqeseO8U+Z8ElDMCZlWBdHA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.12.0': resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} cpu: [arm64] os: [android] - requiresBuild: true - optional: true - /@rollup/rollup-darwin-arm64@4.12.0: + '@rollup/rollup-android-arm64@4.17.0': + resolution: {integrity: sha512-+kjt6dvxnyTIAo7oHeYseYhDyZ7xRKTNl/FoQI96PHkJVxoChldJnne/LzYqpqidoK1/0kX0/q+5rrYqjpth6w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.12.0': resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} cpu: [arm64] os: [darwin] - requiresBuild: true - optional: true - /@rollup/rollup-darwin-x64@4.12.0: + '@rollup/rollup-darwin-arm64@4.17.0': + resolution: {integrity: sha512-Oj6Tp0unMpGTBjvNwbSRv3DopMNLu+mjBzhKTt2zLbDJ/45fB1pltr/rqrO4bE95LzuYwhYn127pop+x/pzf5w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.12.0': resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} cpu: [x64] os: [darwin] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.0: + '@rollup/rollup-darwin-x64@4.17.0': + resolution: {integrity: sha512-3nJx0T+yptxMd+v93rBRxSPTAVCv8szu/fGZDJiKX7kvRe9sENj2ggXjCH/KK1xZEmJOhaNo0c9sGMgGdfkvEw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.12.0': resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} cpu: [arm] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.0: + '@rollup/rollup-linux-arm-gnueabihf@4.17.0': + resolution: {integrity: sha512-Vb2e8p9b2lxxgqyOlBHmp6hJMu/HSU6g//6Tbr7x5V1DlPCHWLOm37nSIVK314f+IHzORyAQSqL7+9tELxX3zQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.17.0': + resolution: {integrity: sha512-Md60KsmC5ZIaRq/bYYDloklgU+XLEZwS2EXXVcSpiUw+13/ZASvSWQ/P92rQ9YDCL6EIoXxuQ829JkReqdYbGg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.12.0': resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.12.0: + '@rollup/rollup-linux-arm64-gnu@4.17.0': + resolution: {integrity: sha512-zL5rBFtJ+2EGnMRm2TqKjdjgFqlotSU+ZJEN37nV+fiD3I6Gy0dUh3jBWN0wSlcXVDEJYW7YBe+/2j0N9unb2w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.12.0': resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.0: + '@rollup/rollup-linux-arm64-musl@4.17.0': + resolution: {integrity: sha512-s2xAyNkJqUdtRVgNK4NK4P9QttS538JuX/kfVQOdZDI5FIKVAUVdLW7qhGfmaySJ1EvN/Bnj9oPm5go9u8navg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.0': + resolution: {integrity: sha512-7F99yzVT67B7IUNMjLD9QCFDCyHkyCJMS1dywZrGgVFJao4VJ9szrIEgH67cR+bXQgEaY01ur/WSL6B0jtcLyA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.12.0': resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} cpu: [riscv64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.12.0: + '@rollup/rollup-linux-riscv64-gnu@4.17.0': + resolution: {integrity: sha512-leFtyiXisfa3Sg9pgZJwRKITWnrQfhtqDjCamnZhkZuIsk1FXmYwKoTkp6lsCgimIcneFFkHKp/yGLxDesga4g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.17.0': + resolution: {integrity: sha512-FtOgui6qMJ4jbSXTxElsy/60LEe/3U0rXkkz2G5CJ9rbHPAvjMvI+3qF0A0fwLQ5hW+/ZC6PbnS2KfRW9JkgDQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.12.0': resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-x64-musl@4.12.0: + '@rollup/rollup-linux-x64-gnu@4.17.0': + resolution: {integrity: sha512-v6eiam/1w3HUfU/ZjzIDodencqgrSqzlNuNtiwH7PFJHYSo1ezL0/UIzmS2lpSJF1ORNaplXeKHYmmdt81vV2g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.12.0': resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.0: + '@rollup/rollup-linux-x64-musl@4.17.0': + resolution: {integrity: sha512-OUhkSdpM5ofVlVU2k4CwVubYwiwu1a4jYWPpubzN7Vzao73GoPBowHcCfaRSFRz1SszJ3HIsk3dZYk4kzbqjgw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.12.0': resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} cpu: [arm64] os: [win32] - requiresBuild: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.0: + '@rollup/rollup-win32-arm64-msvc@4.17.0': + resolution: {integrity: sha512-uL7UYO/MNJPGL/yflybI+HI+n6+4vlfZmQZOCb4I+z/zy1wisHT3exh7oNQsnL6Eso0EUTEfgQ/PaGzzXf6XyQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.12.0': resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} cpu: [ia32] os: [win32] - requiresBuild: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.12.0: + '@rollup/rollup-win32-ia32-msvc@4.17.0': + resolution: {integrity: sha512-4WnSgaUiUmXILwFqREdOcqvSj6GD/7FrvSjhaDjmwakX9w4Z2F8JwiSP1AZZbuRkPqzi444UI5FPv33VKOWYFQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.12.0': resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} cpu: [x64] os: [win32] - requiresBuild: true - optional: true - /@rushstack/node-core-library@3.62.0(@types/node@20.11.24): + '@rollup/rollup-win32-x64-msvc@4.17.0': + resolution: {integrity: sha512-ve+D8t1prRSRnF2S3pyDtTXDlvW1Pngbz76tjgYFQW1jxVSysmQCZfPoDAo4WP+Ano8zeYp85LsArZBI12HfwQ==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@3.62.0': resolution: {integrity: sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - dependencies: - '@types/node': 20.11.24 - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - dev: true - /@rushstack/rig-package@0.5.1: + '@rushstack/node-core-library@4.0.2': + resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.1': resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} - dependencies: - resolve: 1.22.8 - strip-json-comments: 3.1.1 - dev: true - /@rushstack/ts-command-line@4.17.1: + '@rushstack/rig-package@0.5.2': + resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} + + '@rushstack/terminal@0.10.0': + resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@4.17.1': resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.2 - dev: true - /@sinclair/typebox@0.27.8: + '@rushstack/ts-command-line@4.19.1': + resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - /@testing-library/dom@9.3.4: + '@testing-library/dom@10.0.0': + resolution: {integrity: sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==} + engines: {node: '>=18'} + + '@testing-library/dom@9.3.4': resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.9 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: true - /@testing-library/jest-dom@6.4.2(vitest@1.3.1): + '@testing-library/jest-dom@6.4.2': resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} peerDependencies: @@ -1129,625 +1206,384 @@ packages: optional: true vitest: optional: true - dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.23.9 - aria-query: 5.3.0 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - vitest: 1.3.1(jsdom@24.0.0) - dev: true - /@types/argparse@1.0.38: + '@tsd/typescript@5.4.5': + resolution: {integrity: sha512-saiCxzHRhUrRxQV2JhH580aQUZiKQUXI38FcAcikcfOomAil4G4lxT0RfrrKywoAYP/rqAdYXYmNRLppcd+hQQ==} + engines: {node: '>=14.17'} + + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true - /@types/aria-query@5.0.4: + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true - /@types/clean-css@4.2.11: + '@types/clean-css@4.2.11': resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==} - dependencies: - '@types/node': 20.11.24 - source-map: 0.6.1 - dev: true - /@types/cookie@0.6.0: + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - dev: true - /@types/css-modules@1.0.5: + '@types/css-modules@1.0.5': resolution: {integrity: sha512-oeKafs/df9lwOvtfiXVliZsocFVOexK9PZtLQWuPeuVCFR7jwiqlg60lu80JTe5NFNtH3tnV6Fs/ySR8BUPHAw==} - dev: true - /@types/estree@1.0.5: + '@types/eslint@7.29.0': + resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} + + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - /@types/html-minifier@4.0.5: + '@types/html-minifier@4.0.5': resolution: {integrity: sha512-LfE7f7MFd+YUfZnlBz8W43P4NgSObWiqyKapANsWCj63Aqeqli8/9gVsGP4CwC8jPpTTYlTopKCk9rJSuht/ew==} - dependencies: - '@types/clean-css': 4.2.11 - '@types/relateurl': 0.2.33 - '@types/uglify-js': 3.17.5 - dev: true - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/jsdom@21.1.6: + '@types/jsdom@21.1.6': resolution: {integrity: sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==} - dependencies: - '@types/node': 20.11.24 - '@types/tough-cookie': 4.0.5 - parse5: 7.1.2 - dev: true - /@types/mute-stream@0.0.4: + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - dependencies: - '@types/node': 20.11.24 - dev: true - /@types/node@20.11.24: + '@types/node@20.11.24': resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} - dependencies: - undici-types: 5.26.5 - /@types/prismjs@1.26.3: + '@types/node@20.12.7': + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/prismjs@1.26.3': resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==} - dev: true - /@types/prompts@2.4.9: + '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} - dependencies: - '@types/node': 20.11.24 - kleur: 3.0.3 - dev: false - /@types/relateurl@0.2.33: + '@types/relateurl@0.2.33': resolution: {integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==} - dev: true - /@types/statuses@2.0.4: + '@types/statuses@2.0.4': resolution: {integrity: sha512-eqNDvZsCNY49OAXB0Firg/Sc2BgoWsntsLUdybGFOhAfCD6QJ2n9HXUIHGqt5qjrxmMv4wS8WLAw43ZkKcJ8Pw==} - dev: true - /@types/tar@6.1.11: + '@types/tar@6.1.11': resolution: {integrity: sha512-ThA1WD8aDdVU4VLuyq5NEqriwXErF5gEIJeyT6gHBWU7JtSmW2a5qjNv3/vR82O20mW+1vhmeZJfBQPT3HCugg==} - dependencies: - '@types/node': 20.11.24 - minipass: 4.2.8 - dev: true - /@types/tough-cookie@4.0.5: + '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - dev: true - /@types/uglify-js@3.17.5: + '@types/uglify-js@3.17.5': resolution: {integrity: sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==} - dependencies: - source-map: 0.6.1 - dev: true - /@types/wrap-ansi@3.0.0: + '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - dev: true - /@vitest/coverage-v8@1.3.1(vitest@1.3.1): - resolution: {integrity: sha512-UuBnkSJUNE9rdHjDCPyJ4fYuMkoMtnghes1XohYa4At0MS3OQSAo97FrbwSLRshYsXThMZy1+ybD/byK5llyIg==} + '@vitest/coverage-v8@1.5.2': + resolution: {integrity: sha512-QJqxRnbCwNtbbegK9E93rBmhN3dbfG1bC/o52Bqr0zGCYhQzwgwvrJBG7Q8vw3zilX6Ryy6oa/mkZku2lLJx1Q==} peerDependencies: - vitest: 1.3.1 - dependencies: - '@ampproject/remapping': 2.2.1 - '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - magic-string: 0.30.7 - magicast: 0.3.3 - picocolors: 1.0.0 - std-env: 3.7.0 - test-exclude: 6.0.0 - v8-to-istanbul: 9.2.0 - vitest: 1.3.1(jsdom@24.0.0) - transitivePeerDependencies: - - supports-color - dev: true + vitest: 1.5.2 - /@vitest/expect@1.3.1: + '@vitest/expect@1.3.1': resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} - dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 - chai: 4.4.1 - dev: true - /@vitest/runner@1.3.1: + '@vitest/expect@1.5.2': + resolution: {integrity: sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==} + + '@vitest/runner@1.3.1': resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} - dependencies: - '@vitest/utils': 1.3.1 - p-limit: 5.0.0 - pathe: 1.1.2 - dev: true - /@vitest/snapshot@1.3.1: + '@vitest/runner@1.5.2': + resolution: {integrity: sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==} + + '@vitest/snapshot@1.3.1': resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} - dependencies: - magic-string: 0.30.7 - pathe: 1.1.2 - pretty-format: 29.7.0 - dev: true - /@vitest/spy@1.3.1: + '@vitest/snapshot@1.5.2': + resolution: {integrity: sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==} + + '@vitest/spy@1.3.1': resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} - dependencies: - tinyspy: 2.2.1 - dev: true - /@vitest/utils@1.3.1: + '@vitest/spy@1.5.2': + resolution: {integrity: sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==} + + '@vitest/utils@1.3.1': resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true - /@volar/language-core@1.11.1: + '@vitest/utils@1.5.2': + resolution: {integrity: sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==} + + '@volar/language-core@1.11.1': resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - dependencies: - '@volar/source-map': 1.11.1 - dev: true - /@volar/source-map@1.11.1: + '@volar/source-map@1.11.1': resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - dependencies: - muggle-string: 0.3.1 - dev: true - /@volar/typescript@1.11.1: + '@volar/typescript@1.11.1': resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - dependencies: - '@volar/language-core': 1.11.1 - path-browserify: 1.0.1 - dev: true - /@vue/compiler-core@3.4.19: + '@vue/compiler-core@3.4.19': resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==} - dependencies: - '@babel/parser': 7.23.9 - '@vue/shared': 3.4.19 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: true - /@vue/compiler-dom@3.4.19: + '@vue/compiler-dom@3.4.19': resolution: {integrity: sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==} - dependencies: - '@vue/compiler-core': 3.4.19 - '@vue/shared': 3.4.19 - dev: true - /@vue/language-core@1.8.27(typescript@5.3.3): + '@vue/language-core@1.8.27': resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.19 - '@vue/shared': 3.4.19 - computeds: 0.0.1 - minimatch: 9.0.3 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - typescript: 5.3.3 - vue-template-compiler: 2.7.16 - dev: true - /@vue/shared@3.4.19: + '@vue/shared@3.4.19': resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==} - dev: true - /acorn-walk@8.3.2: + acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} - dev: true - /acorn@8.11.3: + acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true - dev: true - /agent-base@7.1.0: + agent-base@7.1.0: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /ajv@6.12.6: + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - /ansi-escapes@4.3.2: + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - /ansi-regex@5.0.1: + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true - /ansi-sequence-parser@1.1.1: + ansi-sequence-parser@1.1.1: resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - dev: true - /ansi-styles@3.2.1: + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - /ansi-styles@5.2.0: + ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - dev: true - /anymatch@3.1.3: + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - /argparse@1.0.10: + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - /aria-query@5.1.3: + aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.3 - dev: true - /aria-query@5.3.0: + aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - dependencies: - dequal: 2.0.3 - dev: true - /array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - dev: true - /arraybuffer.prototype.slice@1.0.3: + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - dev: true - /assertion-error@1.1.0: + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - /asynckit@0.4.0: + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - /available-typed-arrays@1.0.7: + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.0.0 - dev: true - /balanced-match@1.0.2: + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /binary-extensions@2.2.0: + binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - dev: true - /bootstrap@5.3.3(@popperjs/core@2.11.8): + bootstrap@5.3.3: resolution: {integrity: sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==} peerDependencies: '@popperjs/core': ^2.11.8 - dependencies: - '@popperjs/core': 2.11.8 - dev: false - /brace-expansion@1.1.11: + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - /braces@3.0.2: + braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - /cac@6.7.14: + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dev: true - /call-bind@1.0.7: + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.1 - dev: true - /camel-case@3.0.0: + camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - dev: false - /chai@4.4.1: + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - /chalk@2.4.2: + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - /chalk@3.0.0: + chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - /chalk@4.1.2: + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - /check-error@1.0.3: + check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - /chokidar@3.6.0: + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /chownr@2.0.0: + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - dev: false - /clean-css@4.2.4: + clean-css@4.2.4: resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} engines: {node: '>= 4.0'} - dependencies: - source-map: 0.6.1 - dev: false - /cli-spinners@2.9.2: + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - dev: true - /cli-width@4.1.0: + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - dev: true - /cliui@8.0.1: + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - /color-convert@1.9.3: + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - /color-convert@2.0.1: + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - /color-name@1.1.3: + color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - /color-name@1.1.4: + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - /colors@1.2.5: + colors@1.2.5: resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} engines: {node: '>=0.1.90'} - dev: true - /combined-stream@1.0.8: + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - /commander@2.20.3: + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false - /commander@9.5.0: + commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - requiresBuild: true - /computeds@0.0.1: + computeds@0.0.1: resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - dev: true - /concat-map@0.0.1: + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cookie@0.5.0: + cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: true - /cross-spawn@6.0.5: + cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - /cross-spawn@7.0.3: + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /css.escape@1.5.1: + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - dev: true - /cssesc@3.0.0: + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - dev: false - /cssstyle@4.0.1: + cssstyle@4.0.1: resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} engines: {node: '>=18'} - dependencies: - rrweb-cssom: 0.6.0 - dev: true - /data-urls@5.0.0: + data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - dev: true - /de-indent@1.0.2: + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - dev: true - /debug@4.3.4: + debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -1755,855 +1591,538 @@ packages: peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - dev: true - /decimal.js@10.4.3: + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true - /deep-eql@4.1.3: + deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - /deep-equal@2.2.3: + deep-equal@2.2.3: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 - dev: true - /define-data-property@1.1.4: + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - dev: true - /define-properties@1.2.1: + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - dev: true - /delayed-stream@1.0.0: + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true - /dequal@2.0.3: + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: true - /diff-sequences@29.6.3: + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /dom-accessibility-api@0.5.16: + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true - /dom-accessibility-api@0.6.3: + dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dev: true - /dom-serializer@1.4.1: + dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: true - /domelementtype@2.3.0: + domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - /domhandler@4.3.1: + domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - /domutils@2.8.0: + domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dev: true - /emoji-regex@8.0.0: + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - /entities@2.1.0: + entities@2.1.0: resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} - dev: true - /entities@2.2.0: + entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: true - /entities@4.5.0: + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: true - /error-ex@1.3.2: + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - /es-abstract@1.22.4: + es-abstract@1.22.4: resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.1 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 - dev: true - /es-define-property@1.0.0: + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - dev: true - /es-errors@1.3.0: + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - dev: true - /es-get-iterator@1.1.3: + es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - /es-set-tostringtag@2.0.3: + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.1 - dev: true - /es-to-primitive@1.2.1: + es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - /esbuild@0.19.12: + esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - /escalade@3.1.2: + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} - dev: true - /escape-string-regexp@1.0.5: + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - dev: true - /esprima@4.0.1: + eslint-formatter-pretty@4.1.0: + resolution: {integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==} + engines: {node: '>=10'} + + eslint-rule-docs@1.1.235: + resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} + + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: true - /estree-walker@2.0.2: + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true - /estree-walker@3.0.3: + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.5 - dev: true - /execa@8.0.1: + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.2.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - /fast-deep-equal@3.1.3: + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - /fast-json-stable-stringify@2.1.0: + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - /figures@3.2.0: + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - /fill-range@7.0.1: + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - /for-each@0.3.3: + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - /form-data@4.0.0: + form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - /front-matter@4.0.2: + front-matter@4.0.2: resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} - dependencies: - js-yaml: 3.14.1 - dev: true - /fs-extra@7.0.1: + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - /fs-minipass@2.1.0: + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: false - /fs.realpath@1.0.0: + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents@2.3.3: + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - requiresBuild: true - optional: true - /function-bind@1.1.2: + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - /function.prototype.name@1.1.6: + function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: + functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - /get-caller-file@2.0.5: + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true - /get-func-name@2.0.2: + get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - /get-intrinsic@1.2.4: + get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.1 - dev: true - /get-stream@8.0.1: + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - dev: true - /get-symbol-description@1.0.2: + get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - dev: true - /get-tsconfig@4.7.2: + get-tsconfig@4.7.2: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} - dependencies: - resolve-pkg-maps: 1.0.0 - dev: true - /glob-parent@5.1.2: + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - /glob@7.2.3: + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /glob@8.1.0: + glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: false - /globalthis@1.0.3: + globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - dev: true - /gopd@1.0.1: + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.4 - dev: true - /graceful-fs@4.2.11: + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - /graphql@16.8.1: + graphql@16.8.1: resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - dev: true - /has-bigints@1.0.2: + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - /has-flag@3.0.0: + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true - /has-flag@4.0.0: + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: true - /has-property-descriptors@1.0.2: + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - dependencies: - es-define-property: 1.0.0 - dev: true - /has-proto@1.0.3: + has-proto@1.0.3: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} - dev: true - /has-symbols@1.0.3: + has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dev: true - /has-tostringtag@1.0.2: + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - /hasown@2.0.1: + hasown@2.0.1: resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - /he@1.2.0: + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - /headers-polyfill@4.0.2: + headers-polyfill@4.0.2: resolution: {integrity: sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw==} - dev: true - /hosted-git-info@2.8.9: + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - /html-encoding-sniffer@4.0.0: + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} - dependencies: - whatwg-encoding: 3.1.1 - dev: true - /html-escaper@2.0.2: + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /html-minifier@4.0.0: + html-minifier@4.0.0: resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} engines: {node: '>=6'} hasBin: true - dependencies: - camel-case: 3.0.0 - clean-css: 4.2.4 - commander: 2.20.3 - he: 1.2.0 - param-case: 2.1.1 - relateurl: 0.2.7 - uglify-js: 3.17.4 - dev: false - /htmlparser2@6.1.0: + htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - dev: true - /http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /https-proxy-agent@7.0.4: + https-proxy-agent@7.0.4: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /human-signals@5.0.0: + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - dev: true - /iconv-lite@0.6.3: + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - /import-lazy@4.0.0: + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - dev: true - /indent-string@4.0.0: + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - dev: true - /inflight@1.0.6: + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - /inherits@2.0.4: + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /internal-slot@1.0.7: + internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - hasown: 2.0.1 - side-channel: 1.0.5 - dev: true - /is-arguments@1.1.1: + irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + + is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true - /is-array-buffer@3.0.4: + is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.2.1: + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - /is-bigint@1.0.4: + is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - /is-boolean-object@1.1.2: + is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true - /is-callable@1.2.7: + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - dev: true - /is-core-module@2.13.1: + is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.1 - dev: true - /is-date-object@1.0.5: + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true - /is-extglob@2.1.1: + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - dev: true - /is-fullwidth-code-point@3.0.0: + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true - /is-glob@4.0.3: + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - /is-map@2.0.2: + is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - /is-negative-zero@2.0.3: + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - dev: true - /is-node-process@1.2.0: + is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - dev: true - /is-number-object@1.0.7: + is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true - /is-number@7.0.0: + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - dev: true - /is-potential-custom-element-name@1.0.1: + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - /is-regex@1.1.4: + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true - /is-set@2.0.2: + is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - /is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - dev: true - /is-stream@3.0.0: + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /is-string@1.0.7: + is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true - /is-symbol@1.0.4: + is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.13: + is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.14 - dev: true - /is-weakmap@2.0.1: + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakmap@2.0.1: resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - /is-weakref@1.0.2: + is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.7 - dev: true - /is-weakset@2.0.2: + is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - dev: true - /isarray@2.0.5: + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - /isexe@2.0.0: + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - /istanbul-lib-coverage@3.2.2: + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - dev: true - /istanbul-lib-report@3.0.1: + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + istanbul-lib-source-maps@5.0.4: + resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - /istanbul-reports@3.1.7: + istanbul-reports@3.1.7: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - /jju@1.4.0: + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true - /js-tokens@4.0.0: + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - /js-tokens@8.0.3: + js-tokens@8.0.3: resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} - dev: true - /js-yaml@3.14.1: + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - /jsdom@24.0.0: + jsdom@24.0.0: resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} engines: {node: '>=18'} peerDependencies: @@ -2611,1329 +2130,932 @@ packages: peerDependenciesMeta: canvas: optional: true - dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.16.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /json-parse-better-errors@1.0.2: + json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - /json-schema-traverse@0.4.1: + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - /jsonc-parser@3.2.1: + jsonc-parser@3.2.1: resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true - /jsonfile@4.0.0: + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - /kleur@3.0.3: + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - dev: false - /kolorist@1.8.0: + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - dev: true - /linkify-it@3.0.3: + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@3.0.3: resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} - dependencies: - uc.micro: 1.0.6 - dev: true - /linkify-it@5.0.0: + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - dependencies: - uc.micro: 2.1.0 - dev: true - /load-json-file@4.0.0: + load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - /local-pkg@0.5.0: + local-pkg@0.5.0: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} - dependencies: - mlly: 1.5.0 - pkg-types: 1.0.3 - dev: true - /lodash.get@4.4.2: + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true - /lodash.isequal@4.5.0: + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true - /lodash@4.17.21: + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - /loupe@2.3.7: + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - /lower-case@1.1.4: + lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - dev: false - /lru-cache@6.0.0: + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - /lunr@2.3.9: + lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: true - /lz-string@1.5.0: + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - dev: true - /magic-string@0.30.7: + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + magic-string@0.30.7: resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /magicast@0.3.3: - resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} - dependencies: - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 - source-map-js: 1.0.2 - dev: true + magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} - /make-dir@4.0.0: + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - dependencies: - semver: 7.6.0 - dev: true - /markdown-it@12.3.2: + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-it@12.3.2: resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} hasBin: true - dependencies: - argparse: 2.0.1 - entities: 2.1.0 - linkify-it: 3.0.3 - mdurl: 1.0.1 - uc.micro: 1.0.6 - dev: true - /markdown-it@14.1.0: + markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - dev: true - /marked@4.3.0: + marked@4.3.0: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} hasBin: true - dev: true - /mdurl@1.0.1: + mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - dev: true - /mdurl@2.0.0: + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - dev: true - /memorystream@0.3.1: + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - dev: true - /merge-stream@2.0.0: + meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - /mime-db@1.52.0: + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: true - /mime-types@2.1.35: + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - /mimic-fn@4.0.0: + mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - dev: true - /min-indent@1.0.1: + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - dev: true - /minimatch@3.1.2: + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - /minimatch@5.1.6: + minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: false - /minimatch@9.0.3: + minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minipass@3.3.6: + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: false - /minipass@4.2.8: + minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} - dev: true - /minipass@5.0.0: + minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - dev: false - /minizlib@2.1.2: + minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - dev: false - /mkdirp@1.0.4: + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - dev: false - /mlly@1.5.0: + mlly@1.5.0: resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.4.0 - dev: true - /ms@2.1.2: + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - /msw@2.2.1(typescript@5.3.3): + msw@2.2.1: resolution: {integrity: sha512-DCsZAQwan+2onEcpD86fiEnCKW4IvYzqcwDq/2TIoeNrmBqNp/mJW4wHQyxcoYrRPwgujin7wDFflqiSO1iT/w==} engines: {node: '>=18'} hasBin: true - requiresBuild: true peerDependencies: typescript: '>= 4.7.x <= 5.3.x' peerDependenciesMeta: typescript: optional: true - dependencies: - '@bundled-es-modules/cookie': 2.0.0 - '@bundled-es-modules/statuses': 1.0.1 - '@inquirer/confirm': 3.0.0 - '@mswjs/cookies': 1.1.0 - '@mswjs/interceptors': 0.25.16 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.6.0 - '@types/statuses': 2.0.4 - chalk: 4.1.2 - graphql: 16.8.1 - headers-polyfill: 4.0.2 - is-node-process: 1.2.0 - outvariant: 1.4.2 - path-to-regexp: 6.2.1 - strict-event-emitter: 0.5.1 - type-fest: 4.10.2 - typescript: 5.3.3 - yargs: 17.7.2 - dev: true - /muggle-string@0.3.1: + muggle-string@0.3.1: resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - dev: true - /mute-stream@1.0.0: + mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - /nanoid@3.3.7: + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nice-try@1.0.5: + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true - /no-case@2.3.2: + no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} - dependencies: - lower-case: 1.1.4 - dev: false - /normalize-package-data@2.5.0: + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - dev: true - /npm-run-all@4.1.5: + npm-run-all@4.1.5: resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} engines: {node: '>= 4'} hasBin: true - dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.5 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.8.1 - string.prototype.padend: 3.1.5 - dev: true - /npm-run-path@5.2.0: + npm-run-path@5.2.0: resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true + nwsapi@2.2.9: + resolution: {integrity: sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==} - /object-inspect@1.13.1: + object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true - /object-is@1.1.5: + object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - dev: true - /object-keys@1.1.1: + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - dev: true - /object.assign@4.1.5: + object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - /once@1.4.0: + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - /onetime@6.0.0: + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - /outvariant@1.4.2: + outvariant@1.4.2: resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} - dev: true - /p-limit@5.0.0: + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@5.0.0: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - /param-case@2.1.1: + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + param-case@2.1.1: resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} - dependencies: - no-case: 2.3.2 - dev: false - /parse-json@4.0.0: + parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - /parse5@7.1.2: + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - /path-browserify@1.0.1: + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true - /path-is-absolute@1.0.1: + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - dev: true - /path-key@2.0.1: + path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} - dev: true - /path-key@3.1.1: + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - dev: true - /path-key@4.0.0: + path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} - dev: true - /path-parse@1.0.7: + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - /path-to-regexp@6.2.1: + path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true - /path-type@3.0.0: + path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - /pathe@1.1.2: + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true - /pathval@1.1.1: + pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - /picocolors@1.0.0: + picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - /picomatch@2.3.1: + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - dev: true - /pidtree@0.3.1: + pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} engines: {node: '>=0.10'} hasBin: true - dev: true - /pify@3.0.0: + pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - dev: true - /pkg-types@1.0.3: + pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.1 - mlly: 1.5.0 - pathe: 1.1.2 - dev: true - /possible-typed-array-names@1.0.0: + plur@4.0.0: + resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} + engines: {node: '>=10'} + + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - dev: true - /postcss-selector-parser@6.0.15: + postcss-selector-parser@6.0.15: resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false - /postcss@8.4.35: + postcss@8.4.35: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - /pretty-format@27.5.1: + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - /pretty-format@29.7.0: + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - /prismjs@1.29.0: + prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} - dev: false - /prompts@2.4.2: + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: false - /psl@1.9.0: + psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - /punycode.js@2.3.1: + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - dev: true - /punycode@2.3.1: + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - dev: true - /purgecss@5.0.0: + purgecss@5.0.0: resolution: {integrity: sha512-RAnuxrGuVyLLTr8uMbKaxDRGWMgK5CCYDfRyUNNcaz5P3kGgD2b7ymQGYEyo2ST7Tl/ScwFgf5l3slKMxHSbrw==} hasBin: true - dependencies: - commander: 9.5.0 - glob: 8.1.0 - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 - dev: false - /querystringify@2.2.0: + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - /react-is@17.0.2: + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - /react-is@18.2.0: + react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - /read-pkg@3.0.0: + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - /readdirp@3.6.0: + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - /redent@3.0.0: + redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - /regenerator-runtime@0.14.1: + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true - /regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - dev: true - /relateurl@0.2.7: + relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} - dev: false - /require-directory@2.1.1: + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true - /requires-port@1.0.0: + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - /resolve-pkg-maps@1.0.0: + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true - /resolve@1.19.0: + resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - dev: true - /resolve@1.22.8: + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /rollup@4.12.0: + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.12.0: resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.0 - '@rollup/rollup-android-arm64': 4.12.0 - '@rollup/rollup-darwin-arm64': 4.12.0 - '@rollup/rollup-darwin-x64': 4.12.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 - '@rollup/rollup-linux-arm64-gnu': 4.12.0 - '@rollup/rollup-linux-arm64-musl': 4.12.0 - '@rollup/rollup-linux-riscv64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-musl': 4.12.0 - '@rollup/rollup-win32-arm64-msvc': 4.12.0 - '@rollup/rollup-win32-ia32-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.12.0 - fsevents: 2.3.3 - /rrweb-cssom@0.6.0: + rollup@4.17.0: + resolution: {integrity: sha512-wZJSn0WMtWrxhYKQRt5Z6GIXlziOoMDFmbHmRfL3v+sBTAshx2DBq1AfMArB7eIjF63r4ocn2ZTAyUptg/7kmQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: true - /run-async@3.0.0: + run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} - dev: true - /safe-array-concat@1.1.0: + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.0: resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - /safe-regex-test@1.0.3: + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - dev: true - /safer-buffer@2.1.2: + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - /saxes@6.0.0: + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - dependencies: - xmlchars: 2.2.0 - dev: true - /semver@5.7.2: + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true - dev: true - /semver@7.5.4: + semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /semver@7.6.0: + semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /set-function-length@1.2.1: + set-function-length@1.2.1: resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - dev: true - /set-function-name@2.0.2: + set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - dev: true - /shebang-command@1.2.0: + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - /shebang-command@2.0.0: + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - /shebang-regex@1.0.0: + shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} - dev: true - /shebang-regex@3.0.0: + shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - dev: true - /shell-quote@1.8.1: + shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true - /shiki@0.14.7: + shiki@0.14.7: resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} - dependencies: - ansi-sequence-parser: 1.1.1 - jsonc-parser: 3.2.1 - vscode-oniguruma: 1.7.0 - vscode-textmate: 8.0.0 - dev: true - /side-channel@1.0.5: + side-channel@1.0.5: resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: true - /siginfo@2.0.0: + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - /signal-exit@4.1.0: + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - dev: true - /sisteransi@1.0.5: + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: false - /source-map-js@1.0.2: + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map@0.6.1: + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - /spdx-correct@3.2.0: + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - dev: true - /spdx-exceptions@2.5.0: + spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true - /spdx-expression-parse@3.0.1: + spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - dev: true - /spdx-license-ids@3.0.17: + spdx-license-ids@3.0.17: resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true - /sprintf-js@1.0.3: + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - /stackback@0.0.2: + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - /statuses@2.0.1: + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - dev: true - /std-env@3.7.0: + std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - dev: true - /stop-iteration-iterator@1.0.0: + stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.7 - dev: true - /strict-event-emitter@0.5.1: + strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - dev: true - /string-argv@0.3.2: + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - dev: true - /string-width@4.2.3: + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - /string.prototype.padend@3.1.5: - resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} + string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - dev: true - /string.prototype.trim@1.2.8: + string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - dev: true - /string.prototype.trimend@1.0.7: + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - dev: true - /string.prototype.trimstart@1.0.7: + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 - dev: true - /strip-ansi@6.0.1: + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - /strip-bom@3.0.0: + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: true - /strip-final-newline@3.0.0: + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - dev: true - /strip-indent@3.0.0: + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - dev: true - /strip-literal@2.0.0: + strip-literal@2.0.0: resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} - dependencies: - js-tokens: 8.0.3 - dev: true - /supports-color@5.5.0: + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - dev: true - /symbol-tree@3.2.4: + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true - /tar@6.2.0: + tar@6.2.0: resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: false - /test-exclude@6.0.0: + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - /tinybench@2.6.0: + tinybench@2.6.0: resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} - dev: true - /tinypool@0.8.2: + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + + tinypool@0.8.2: resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} engines: {node: '>=14.0.0'} - dev: true - /tinyspy@2.2.1: + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} - dev: true - /to-fast-properties@2.0.0: + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - dev: true - /to-regex-range@5.0.1: + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - /tough-cookie@4.1.3: + tough-cookie@4.1.3: resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: true - /tr46@5.0.0: + tr46@5.0.0: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} - dependencies: - punycode: 2.3.1 - dev: true - /tsx@4.7.1: + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + tsd@0.31.0: + resolution: {integrity: sha512-yjBiQ5n8OMv/IZOuhDjBy0ZLCoJ7rky/RxRh5W4sJ0oNNCU/kf6s3puPAkGNi59PptDdkcpUm+RsKSdjR2YbNg==} + engines: {node: '>=14.16'} + hasBin: true + + tsx@4.7.1: resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} engines: {node: '>=18.0.0'} hasBin: true - dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.2 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /turbo-darwin-64@1.12.4: + turbo-darwin-64@1.12.4: resolution: {integrity: sha512-dBwFxhp9isTa9RS/fz2gDVk5wWhKQsPQMozYhjM7TT4jTrnYn0ZJMzr7V3B/M/T8QF65TbniW7w1gtgxQgX5Zg==} cpu: [x64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /turbo-darwin-arm64@1.12.4: + turbo-darwin-arm64@1.12.4: resolution: {integrity: sha512-1Uo5iI6xsJ1j9ObsqxYRsa3W26mEbUe6fnj4rQYV6kDaqYD54oAMJ6hM53q9rB8JvFxwdrUXGp3PwTw9A0qqkA==} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /turbo-linux-64@1.12.4: + turbo-linux-64@1.12.4: resolution: {integrity: sha512-ONg2aSqKP7LAQOg7ysmU5WpEQp4DGNxSlAiR7um+LKtbmC/UxogbR5+T+Uuq6zGuQ5kJyKjWJ4NhtvUswOqBsA==} cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /turbo-linux-arm64@1.12.4: + turbo-linux-arm64@1.12.4: resolution: {integrity: sha512-9FPufkwdgfIKg/9jj87Cdtftw8o36y27/S2vLN7FTR2pp9c0MQiTBOLVYadUr1FlShupddmaMbTkXEhyt9SdrA==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: false - optional: true - /turbo-windows-64@1.12.4: + turbo-windows-64@1.12.4: resolution: {integrity: sha512-2mOtxHW5Vjh/5rDVu/aFwsMzI+chs8XcEuJHlY1sYOpEymYTz+u6AXbnzRvwZFMrLKr7J7fQOGl+v96sLKbNdA==} cpu: [x64] os: [win32] - requiresBuild: true - dev: false - optional: true - /turbo-windows-arm64@1.12.4: + turbo-windows-arm64@1.12.4: resolution: {integrity: sha512-nOY5wae9qnxPOpT1fRuYO0ks6dTwpKMPV6++VkDkamFDLFHUDVM/9kmD2UTeh1yyrKnrZksbb9zmShhmfj1wog==} cpu: [arm64] os: [win32] - requiresBuild: true - dev: false - optional: true - /turbo@1.12.4: + turbo@1.12.4: resolution: {integrity: sha512-yUJ7elEUSToiGwFZogXpYKJpQ0BvaMbkEuQECIWtkBLcmWzlMOt6bActsIm29oN83mRU0WbzGt4e8H1KHWedhg==} hasBin: true - optionalDependencies: - turbo-darwin-64: 1.12.4 - turbo-darwin-arm64: 1.12.4 - turbo-linux-64: 1.12.4 - turbo-linux-arm64: 1.12.4 - turbo-windows-64: 1.12.4 - turbo-windows-arm64: 1.12.4 - dev: false - /type-detect@4.0.8: + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - dev: true - /type-fest@0.21.3: + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - dev: true - /type-fest@4.10.2: + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@4.10.2: resolution: {integrity: sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==} engines: {node: '>=16'} - dev: true - /typed-array-buffer@1.0.2: + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.5: + typed-array-length@1.0.5: resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - dev: true - /typedoc@0.25.12(typescript@5.3.3): - resolution: {integrity: sha512-F+qhkK2VoTweDXd1c42GS/By2DvI2uDF4/EpG424dTexSHdtCH52C6IcAvMA6jR3DzAWZjHpUOW+E02kyPNUNw==} + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedoc@0.25.13: + resolution: {integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==} engines: {node: '>= 16'} hasBin: true peerDependencies: typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x - dependencies: - lunr: 2.3.9 - marked: 4.3.0 - minimatch: 9.0.3 - shiki: 0.14.7 - typescript: 5.3.3 - dev: true - /typescript@5.3.3: + typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true - dev: true - /uc.micro@1.0.6: + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - dev: true - /uc.micro@2.1.0: + uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - dev: true - /ufo@1.4.0: + ufo@1.4.0: resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} - dev: true - /uglify-js@3.17.4: + uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true - dev: false - /unbox-primitive@1.0.2: + unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - /undici-types@5.26.5: + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /universalify@0.1.2: + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - dev: true - /universalify@0.2.0: + universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - dev: true - /upper-case@1.1.3: + upper-case@1.1.3: resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - dev: false - /uri-js@4.4.1: + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - /url-parse@1.5.10: + url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - /util-deprecate@1.0.2: + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.22 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - dev: true - /validate-npm-package-license@3.0.4: + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - /validator@13.11.0: + validator@13.11.0: resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} engines: {node: '>= 0.10'} - dev: true - /vite-node@1.3.1(@types/node@20.11.24): + vite-node@1.3.1: resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.1.4(@types/node@20.11.24) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vite-plugin-dts@3.7.3(@types/node@20.11.24)(typescript@5.3.3)(vite@5.1.4): + vite-node@1.5.2: + resolution: {integrity: sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-dts@3.7.3: resolution: {integrity: sha512-26eTlBYdpjRLWCsTJebM8vkCieE+p9gP3raf+ecDnzzK5E3FG6VE1wcy55OkRpfWWVlVvKkYFe6uvRHYWx7Nog==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3942,51 +3064,31 @@ packages: peerDependenciesMeta: vite: optional: true - dependencies: - '@microsoft/api-extractor': 7.39.0(@types/node@20.11.24) - '@rollup/pluginutils': 5.1.0 - '@vue/language-core': 1.8.27(typescript@5.3.3) - debug: 4.3.4 - kolorist: 1.8.0 - typescript: 5.3.3 - vite: 5.1.4(@types/node@20.11.24) - vue-tsc: 1.8.27(typescript@5.3.3) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - dev: true - /vite-plugin-full-reload@1.1.0: + vite-plugin-dts@3.9.0: + resolution: {integrity: sha512-pwFIEYQ3LZvMafkEGvNnileb6af5JuyZsBfYQrTDYxdeGEy0OS4B4hCsLPo5YGnhK5k9EzyO6BXVO6y+Lt5T2A==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite-plugin-full-reload@1.1.0: resolution: {integrity: sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA==} - dependencies: - picocolors: 1.0.0 - picomatch: 2.3.1 - dev: true - /vite-plugin-live-reload@3.0.3(vite@5.1.4): + vite-plugin-live-reload@3.0.3: resolution: {integrity: sha512-ce1ygNPmfVdiO6SyjpephroZiK+X5+BFetkceD/FFOYZEPoVSydJRfKT2JPaL4/D3C3NwqJvtPjnla1GSa264A==} peerDependencies: vite: ^4.0.0 || ^5.0.0 - dependencies: - chokidar: 3.6.0 - picocolors: 1.0.0 - vite: 5.1.4(@types/node@20.11.24) - dev: true - /vite-plugin-markdown@2.2.0(vite@5.1.4): + vite-plugin-markdown@2.2.0: resolution: {integrity: sha512-eH2tXMZcx3EHb5okd+/0VIyoR8Gp9pGe24UXitOOcGkzObbJ1vl48aGOAbakoT88FBdzC8MXNkMfBIB9VK0Ndg==} peerDependencies: vite: '>= 2.0.0' - dependencies: - domhandler: 4.3.1 - front-matter: 4.0.2 - htmlparser2: 6.1.0 - markdown-it: 12.3.2 - vite: 5.1.4(@types/node@20.11.24) - dev: true - /vite@5.1.4(@types/node@20.11.24): + vite@5.1.4: resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -4013,72 +3115,36 @@ packages: optional: true terser: optional: true - dependencies: - '@types/node': 20.11.24 - esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.12.0 - optionalDependencies: - fsevents: 2.3.3 - /vitest@1.3.1(@types/node@20.11.24)(jsdom@24.0.0): - resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} + vite@5.2.10: + resolution: {integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.3.1 - '@vitest/ui': 1.3.1 - happy-dom: '*' - jsdom: '*' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 peerDependenciesMeta: - '@edge-runtime/vm': - optional: true '@types/node': optional: true - '@vitest/browser': + less: optional: true - '@vitest/ui': + lightningcss: optional: true - happy-dom: + sass: optional: true - jsdom: + stylus: + optional: true + sugarss: + optional: true + terser: optional: true - dependencies: - '@types/node': 20.11.24 - '@vitest/expect': 1.3.1 - '@vitest/runner': 1.3.1 - '@vitest/snapshot': 1.3.1 - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 - jsdom: 24.0.0 - local-pkg: 0.5.0 - magic-string: 0.30.7 - pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.0.0 - tinybench: 2.6.0 - tinypool: 0.8.2 - vite: 5.1.4(@types/node@20.11.24) - vite-node: 1.3.1(@types/node@20.11.24) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vitest@1.3.1(jsdom@24.0.0): + vitest@1.3.1: resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -4102,7 +3168,3104 @@ packages: optional: true jsdom: optional: true - dependencies: + + vitest@1.5.2: + resolution: {integrity: sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.5.2 + '@vitest/ui': 1.5.2 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + + vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-tsc@1.8.27: + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + + which-typed-array@1.1.14: + resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + +snapshots: + + '@adobe/css-tools@4.3.3': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + '@babel/helper-string-parser@7.23.4': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/highlight@7.24.2': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.23.9': + dependencies: + '@babel/types': 7.24.0 + + '@babel/parser@7.24.4': + dependencies: + '@babel/types': 7.24.0 + + '@babel/runtime@7.23.9': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.24.4': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@biomejs/biome@1.5.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.5.3 + '@biomejs/cli-darwin-x64': 1.5.3 + '@biomejs/cli-linux-arm64': 1.5.3 + '@biomejs/cli-linux-arm64-musl': 1.5.3 + '@biomejs/cli-linux-x64': 1.5.3 + '@biomejs/cli-linux-x64-musl': 1.5.3 + '@biomejs/cli-win32-arm64': 1.5.3 + '@biomejs/cli-win32-x64': 1.5.3 + + '@biomejs/biome@1.7.1': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.7.1 + '@biomejs/cli-darwin-x64': 1.7.1 + '@biomejs/cli-linux-arm64': 1.7.1 + '@biomejs/cli-linux-arm64-musl': 1.7.1 + '@biomejs/cli-linux-x64': 1.7.1 + '@biomejs/cli-linux-x64-musl': 1.7.1 + '@biomejs/cli-win32-arm64': 1.7.1 + '@biomejs/cli-win32-x64': 1.7.1 + + '@biomejs/cli-darwin-arm64@1.5.3': + optional: true + + '@biomejs/cli-darwin-arm64@1.7.1': + optional: true + + '@biomejs/cli-darwin-x64@1.5.3': + optional: true + + '@biomejs/cli-darwin-x64@1.7.1': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.5.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.7.1': + optional: true + + '@biomejs/cli-linux-arm64@1.5.3': + optional: true + + '@biomejs/cli-linux-arm64@1.7.1': + optional: true + + '@biomejs/cli-linux-x64-musl@1.5.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.7.1': + optional: true + + '@biomejs/cli-linux-x64@1.5.3': + optional: true + + '@biomejs/cli-linux-x64@1.7.1': + optional: true + + '@biomejs/cli-win32-arm64@1.5.3': + optional: true + + '@biomejs/cli-win32-arm64@1.7.1': + optional: true + + '@biomejs/cli-win32-x64@1.5.3': + optional: true + + '@biomejs/cli-win32-x64@1.7.1': + optional: true + + '@bundled-es-modules/cookie@2.0.0': + dependencies: + cookie: 0.5.0 + + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.1 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@fortawesome/fontawesome-common-types@6.5.1': {} + + '@fortawesome/fontawesome-svg-core@6.5.1': + dependencies: + '@fortawesome/fontawesome-common-types': 6.5.1 + + '@fortawesome/free-brands-svg-icons@6.5.1': + dependencies: + '@fortawesome/fontawesome-common-types': 6.5.1 + + '@fortawesome/free-regular-svg-icons@6.5.1': + dependencies: + '@fortawesome/fontawesome-common-types': 6.5.1 + + '@fortawesome/free-solid-svg-icons@6.5.1': + dependencies: + '@fortawesome/fontawesome-common-types': 6.5.1 + + '@inquirer/confirm@3.0.0': + dependencies: + '@inquirer/core': 7.0.0 + '@inquirer/type': 1.2.0 + + '@inquirer/core@7.0.0': + dependencies: + '@inquirer/type': 1.2.0 + '@types/mute-stream': 0.0.4 + '@types/node': 20.11.24 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + figures: 3.2.0 + mute-stream: 1.0.0 + run-async: 3.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + '@inquirer/type@1.2.0': {} + + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@microsoft/api-extractor-model@7.28.13(@types/node@20.12.7)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.12.7) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor-model@7.28.3(@types/node@20.11.24)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.11.24) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor-model@7.28.3(@types/node@20.12.7)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.12.7) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.39.0(@types/node@20.11.24)': + dependencies: + '@microsoft/api-extractor-model': 7.28.3(@types/node@20.11.24) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.11.24) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.3.3 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.39.0(@types/node@20.12.7)': + dependencies: + '@microsoft/api-extractor-model': 7.28.3(@types/node@20.12.7) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.12.7) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.3.3 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.43.0(@types/node@20.12.7)': + dependencies: + '@microsoft/api-extractor-model': 7.28.13(@types/node@20.12.7) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.12.7) + '@rushstack/rig-package': 0.5.2 + '@rushstack/terminal': 0.10.0(@types/node@20.12.7) + '@rushstack/ts-command-line': 4.19.1(@types/node@20.12.7) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + + '@mojojoejo/vite-plugin-purgecss@1.1.0(vite@5.1.4(@types/node@20.11.24))': + dependencies: + purgecss: 5.0.0 + vite: 5.1.4(@types/node@20.11.24) + + '@mswjs/cookies@1.1.0': {} + + '@mswjs/interceptors@0.25.16': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.2 + strict-event-emitter: 0.5.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.2 + + '@open-draft/until@2.1.0': {} + + '@popperjs/core@2.11.8': {} + + '@rollup/pluginutils@5.1.0(rollup@4.17.0)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.17.0 + + '@rollup/rollup-android-arm-eabi@4.12.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.17.0': + optional: true + + '@rollup/rollup-android-arm64@4.12.0': + optional: true + + '@rollup/rollup-android-arm64@4.17.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.12.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.17.0': + optional: true + + '@rollup/rollup-darwin-x64@4.12.0': + optional: true + + '@rollup/rollup-darwin-x64@4.17.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.12.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.17.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.17.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.12.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.17.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.12.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.17.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.12.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.17.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.17.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.12.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.17.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.12.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.17.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.12.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.17.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.12.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.17.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.12.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.17.0': + optional: true + + '@rushstack/node-core-library@3.62.0(@types/node@20.11.24)': + dependencies: + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 20.11.24 + + '@rushstack/node-core-library@3.62.0(@types/node@20.12.7)': + dependencies: + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 20.12.7 + + '@rushstack/node-core-library@4.0.2(@types/node@20.12.7)': + dependencies: + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 20.12.7 + + '@rushstack/rig-package@0.5.1': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/rig-package@0.5.2': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.10.0(@types/node@20.12.7)': + dependencies: + '@rushstack/node-core-library': 4.0.2(@types/node@20.12.7) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 20.12.7 + + '@rushstack/ts-command-line@4.17.1': + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + + '@rushstack/ts-command-line@4.19.1(@types/node@20.12.7)': + dependencies: + '@rushstack/terminal': 0.10.0(@types/node@20.12.7) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@sinclair/typebox@0.27.8': {} + + '@testing-library/dom@10.0.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/dom@9.3.4': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.4 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.12.7)(jsdom@24.0.0))': + dependencies: + '@adobe/css-tools': 4.3.3 + '@babel/runtime': 7.23.9 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + optionalDependencies: + vitest: 1.3.1(@types/node@20.12.7)(jsdom@24.0.0) + + '@tsd/typescript@5.4.5': {} + + '@types/argparse@1.0.38': {} + + '@types/aria-query@5.0.4': {} + + '@types/clean-css@4.2.11': + dependencies: + '@types/node': 20.11.24 + source-map: 0.6.1 + + '@types/cookie@0.6.0': {} + + '@types/css-modules@1.0.5': {} + + '@types/eslint@7.29.0': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + + '@types/html-minifier@4.0.5': + dependencies: + '@types/clean-css': 4.2.11 + '@types/relateurl': 0.2.33 + '@types/uglify-js': 3.17.5 + + '@types/jsdom@21.1.6': + dependencies: + '@types/node': 20.12.7 + '@types/tough-cookie': 4.0.5 + parse5: 7.1.2 + + '@types/json-schema@7.0.15': {} + + '@types/minimist@1.2.5': {} + + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 20.11.24 + + '@types/node@20.11.24': + dependencies: + undici-types: 5.26.5 + + '@types/node@20.12.7': + dependencies: + undici-types: 5.26.5 + + '@types/normalize-package-data@2.4.4': {} + + '@types/prismjs@1.26.3': {} + + '@types/prompts@2.4.9': + dependencies: + '@types/node': 20.11.24 + kleur: 3.0.3 + + '@types/relateurl@0.2.33': {} + + '@types/statuses@2.0.4': {} + + '@types/tar@6.1.11': + dependencies: + '@types/node': 20.11.24 + minipass: 4.2.8 + + '@types/tough-cookie@4.0.5': {} + + '@types/uglify-js@3.17.5': + dependencies: + source-map: 0.6.1 + + '@types/wrap-ansi@3.0.0': {} + + '@vitest/coverage-v8@1.5.2(vitest@1.5.2(@types/node@20.12.7)(jsdom@24.0.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.4 + istanbul-reports: 3.1.7 + magic-string: 0.30.10 + magicast: 0.3.4 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.1.0 + test-exclude: 6.0.0 + vitest: 1.5.2(@types/node@20.12.7)(jsdom@24.0.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.3.1': + dependencies: + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 + chai: 4.4.1 + + '@vitest/expect@1.5.2': + dependencies: + '@vitest/spy': 1.5.2 + '@vitest/utils': 1.5.2 + chai: 4.4.1 + + '@vitest/runner@1.3.1': + dependencies: + '@vitest/utils': 1.3.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/runner@1.5.2': + dependencies: + '@vitest/utils': 1.5.2 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.3.1': + dependencies: + magic-string: 0.30.7 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/snapshot@1.5.2': + dependencies: + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.3.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/spy@1.5.2': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.3.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@vitest/utils@1.5.2': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@volar/language-core@1.11.1': + dependencies: + '@volar/source-map': 1.11.1 + + '@volar/source-map@1.11.1': + dependencies: + muggle-string: 0.3.1 + + '@volar/typescript@1.11.1': + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + + '@vue/compiler-core@3.4.19': + dependencies: + '@babel/parser': 7.23.9 + '@vue/shared': 3.4.19 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + + '@vue/compiler-dom@3.4.19': + dependencies: + '@vue/compiler-core': 3.4.19 + '@vue/shared': 3.4.19 + + '@vue/language-core@1.8.27(typescript@5.4.2)': + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.4.19 + '@vue/shared': 3.4.19 + computeds: 0.0.1 + minimatch: 9.0.3 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.4.2 + + '@vue/shared@3.4.19': {} + + acorn-walk@8.3.2: {} + + acorn@8.11.3: {} + + agent-base@7.1.0: + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-sequence-parser@1.1.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.1.3: + dependencies: + deep-equal: 2.2.3 + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-union@2.1.0: {} + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + arrify@1.0.1: {} + + assertion-error@1.1.0: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + balanced-match@1.0.2: {} + + binary-extensions@2.2.0: {} + + bootstrap@5.3.3(@popperjs/core@2.11.8): + dependencies: + '@popperjs/core': 2.11.8 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + cac@6.7.14: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 + + camel-case@3.0.0: + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + + clean-css@4.2.4: + dependencies: + source-map: 0.6.1 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colors@1.2.5: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + commander@9.5.0: {} + + computeds@0.0.1: {} + + concat-map@0.0.1: {} + + cookie@0.5.0: {} + + cross-spawn@6.0.5: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css.escape@1.5.1: {} + + cssesc@3.0.0: {} + + cssstyle@4.0.1: + dependencies: + rrweb-cssom: 0.6.0 + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + de-indent@1.0.2: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decimal.js@10.4.3: {} + + deep-eql@4.1.3: + dependencies: + type-detect: 4.0.8 + + deep-equal@2.2.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.14 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + diff-sequences@29.6.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + emoji-regex@8.0.0: {} + + entities@2.1.0: {} + + entities@2.2.0: {} + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.22.4: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.5 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.14 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + 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.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-get-iterator@1.1.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.1 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + eslint-formatter-pretty@4.1.0: + dependencies: + '@types/eslint': 7.29.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + eslint-rule-docs: 1.1.235 + log-symbols: 4.1.0 + plur: 4.0.0 + string-width: 4.2.3 + supports-hyperlinks: 2.3.0 + + eslint-rule-docs@1.1.235: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + front-matter@4.0.2: + dependencies: + js-yaml: 3.14.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + + get-stream@8.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.7.2: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + globalthis@1.0.3: + dependencies: + define-properties: 1.2.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphql@16.8.1: {} + + hard-rejection@2.1.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.1: + dependencies: + function-bind: 1.1.2 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + headers-polyfill@4.0.2: {} + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-escaper@2.0.2: {} + + html-minifier@4.0.0: + dependencies: + camel-case: 3.0.0 + clean-css: 4.2.4 + commander: 2.20.3 + he: 1.2.0 + param-case: 2.1.1 + relateurl: 0.2.7 + uglify-js: 3.17.4 + + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.4: + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.1: {} + + import-lazy@4.0.0: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.1 + side-channel: 1.0.5 + + irregular-plurals@3.5.0: {} + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.2.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.1 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.2: {} + + is-negative-zero@2.0.3: {} + + is-node-process@1.2.0: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@1.1.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-set@2.0.2: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@3.0.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.14 + + is-unicode-supported@0.1.0: {} + + is-weakmap@2.0.1: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.4: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + js-tokens@8.0.3: {} + + js-tokens@9.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsdom@24.0.0: + dependencies: + cssstyle: 4.0.1 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.9 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.16.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + jsonc-parser@3.2.1: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + kolorist@1.8.0: {} + + lines-and-columns@1.2.4: {} + + linkify-it@3.0.3: + dependencies: + uc.micro: 1.0.6 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + local-pkg@0.5.0: + dependencies: + mlly: 1.5.0 + pkg-types: 1.0.3 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.get@4.4.2: {} + + lodash.isequal@4.5.0: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lower-case@1.1.4: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lunr@2.3.9: {} + + lz-string@1.5.0: {} + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magic-string@0.30.7: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magicast@0.3.4: + dependencies: + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + source-map-js: 1.2.0 + + make-dir@4.0.0: + dependencies: + semver: 7.6.0 + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + markdown-it@12.3.2: + dependencies: + argparse: 2.0.1 + entities: 2.1.0 + linkify-it: 3.0.3 + mdurl: 1.0.1 + uc.micro: 1.0.6 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + marked@4.3.0: {} + + mdurl@1.0.1: {} + + mdurl@2.0.0: {} + + memorystream@0.3.1: {} + + meow@9.0.0: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@4.0.0: {} + + min-indent@1.0.1: {} + + minimatch@3.0.8: + dependencies: + brace-expansion: 1.1.11 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@4.2.8: {} + + minipass@5.0.0: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + mlly@1.5.0: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.4.0 + + ms@2.1.2: {} + + msw@2.2.1(typescript@5.4.2): + dependencies: + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@inquirer/confirm': 3.0.0 + '@mswjs/cookies': 1.1.0 + '@mswjs/interceptors': 0.25.16 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.4 + chalk: 4.1.2 + graphql: 16.8.1 + headers-polyfill: 4.0.2 + is-node-process: 1.2.0 + outvariant: 1.4.2 + path-to-regexp: 6.2.1 + strict-event-emitter: 0.5.1 + type-fest: 4.10.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.4.2 + + muggle-string@0.3.1: {} + + mute-stream@1.0.0: {} + + nanoid@3.3.7: {} + + nice-try@1.0.5: {} + + no-case@2.3.2: + dependencies: + lower-case: 1.1.4 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.6.0 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + npm-run-all@4.1.5: + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.1 + string.prototype.padend: 3.1.6 + + npm-run-path@5.2.0: + dependencies: + path-key: 4.0.0 + + nwsapi@2.2.9: {} + + object-inspect@1.13.1: {} + + object-is@1.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + outvariant@1.4.2: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + param-case@2.1.1: + dependencies: + no-case: 2.3.2 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-to-regexp@6.2.1: {} + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@1.1.1: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pidtree@0.3.1: {} + + pify@3.0.0: {} + + pkg-types@1.0.3: + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.5.0 + pathe: 1.1.2 + + plur@4.0.0: + dependencies: + irregular-plurals: 3.5.0 + + possible-typed-array-names@1.0.0: {} + + postcss-selector-parser@6.0.15: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.4.35: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + + prismjs@1.29.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + psl@1.9.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + purgecss@5.0.0: + dependencies: + commander: 9.5.0 + glob: 8.1.0 + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + quick-lru@4.0.1: {} + + react-is@17.0.2: {} + + react-is@18.2.0: {} + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + regenerator-runtime@0.14.1: {} + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + relateurl@0.2.7: {} + + require-directory@2.1.1: {} + + requires-port@1.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.19.0: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rollup@4.12.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.12.0 + '@rollup/rollup-android-arm64': 4.12.0 + '@rollup/rollup-darwin-arm64': 4.12.0 + '@rollup/rollup-darwin-x64': 4.12.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 + '@rollup/rollup-linux-arm64-gnu': 4.12.0 + '@rollup/rollup-linux-arm64-musl': 4.12.0 + '@rollup/rollup-linux-riscv64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-musl': 4.12.0 + '@rollup/rollup-win32-arm64-msvc': 4.12.0 + '@rollup/rollup-win32-ia32-msvc': 4.12.0 + '@rollup/rollup-win32-x64-msvc': 4.12.0 + fsevents: 2.3.3 + + rollup@4.17.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.17.0 + '@rollup/rollup-android-arm64': 4.17.0 + '@rollup/rollup-darwin-arm64': 4.17.0 + '@rollup/rollup-darwin-x64': 4.17.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.0 + '@rollup/rollup-linux-arm-musleabihf': 4.17.0 + '@rollup/rollup-linux-arm64-gnu': 4.17.0 + '@rollup/rollup-linux-arm64-musl': 4.17.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.0 + '@rollup/rollup-linux-riscv64-gnu': 4.17.0 + '@rollup/rollup-linux-s390x-gnu': 4.17.0 + '@rollup/rollup-linux-x64-gnu': 4.17.0 + '@rollup/rollup-linux-x64-musl': 4.17.0 + '@rollup/rollup-win32-arm64-msvc': 4.17.0 + '@rollup/rollup-win32-ia32-msvc': 4.17.0 + '@rollup/rollup-win32-x64-msvc': 4.17.0 + fsevents: 2.3.3 + + rrweb-cssom@0.6.0: {} + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.0: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safer-buffer@2.1.2: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + semver@5.7.2: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 + + set-function-length@1.2.1: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + shell-quote@1.8.1: {} + + shiki@0.14.7: + dependencies: + ansi-sequence-parser: 1.1.1 + jsonc-parser: 3.2.1 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + + side-channel@1.0.5: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + source-map-js@1.0.2: {} + + source-map-js@1.2.0: {} + + source-map@0.6.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + + spdx-license-ids@3.0.17: {} + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + statuses@2.0.1: {} + + std-env@3.7.0: {} + + stop-iteration-iterator@1.0.0: + dependencies: + internal-slot: 1.0.7 + + strict-event-emitter@0.5.1: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.padend@3.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trim@1.2.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + strip-literal@2.0.0: + dependencies: + js-tokens: 8.0.3 + + strip-literal@2.1.0: + dependencies: + js-tokens: 9.0.0 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@2.3.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-tree@3.2.4: {} + + tar@6.2.0: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + tinybench@2.6.0: {} + + tinybench@2.8.0: {} + + tinypool@0.8.2: {} + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tough-cookie@4.1.3: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + + trim-newlines@3.0.1: {} + + tsd@0.31.0: + dependencies: + '@tsd/typescript': 5.4.5 + eslint-formatter-pretty: 4.1.0 + globby: 11.1.0 + jest-diff: 29.7.0 + meow: 9.0.0 + path-exists: 4.0.0 + read-pkg-up: 7.0.1 + + tsx@4.7.1: + dependencies: + esbuild: 0.19.12 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + + turbo-darwin-64@1.12.4: + optional: true + + turbo-darwin-arm64@1.12.4: + optional: true + + turbo-linux-64@1.12.4: + optional: true + + turbo-linux-arm64@1.12.4: + optional: true + + turbo-windows-64@1.12.4: + optional: true + + turbo-windows-arm64@1.12.4: + optional: true + + turbo@1.12.4: + optionalDependencies: + turbo-darwin-64: 1.12.4 + turbo-darwin-arm64: 1.12.4 + turbo-linux-64: 1.12.4 + turbo-linux-arm64: 1.12.4 + turbo-windows-64: 1.12.4 + turbo-windows-arm64: 1.12.4 + + type-detect@4.0.8: {} + + type-fest@0.18.1: {} + + type-fest@0.21.3: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@4.10.2: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.5: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedoc@0.25.13(typescript@5.4.2): + dependencies: + lunr: 2.3.9 + marked: 4.3.0 + minimatch: 9.0.4 + shiki: 0.14.7 + typescript: 5.4.2 + + typescript@5.3.3: {} + + typescript@5.4.2: {} + + uc.micro@1.0.6: {} + + uc.micro@2.1.0: {} + + ufo@1.4.0: {} + + uglify-js@3.17.4: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + undici-types@5.26.5: {} + + universalify@0.1.2: {} + + universalify@0.2.0: {} + + upper-case@1.1.3: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + util-deprecate@1.0.2: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validator@13.11.0: {} + + vite-node@1.3.1(@types/node@20.11.24): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.10(@types/node@20.11.24) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-node@1.3.1(@types/node@20.12.7): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.10(@types/node@20.12.7) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-node@1.5.2(@types/node@20.12.7): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.10(@types/node@20.12.7) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-dts@3.7.3(@types/node@20.11.24)(rollup@4.17.0)(typescript@5.4.2)(vite@5.1.4(@types/node@20.11.24)): + dependencies: + '@microsoft/api-extractor': 7.39.0(@types/node@20.11.24) + '@rollup/pluginutils': 5.1.0(rollup@4.17.0) + '@vue/language-core': 1.8.27(typescript@5.4.2) + debug: 4.3.4 + kolorist: 1.8.0 + typescript: 5.4.2 + vue-tsc: 1.8.27(typescript@5.4.2) + optionalDependencies: + vite: 5.1.4(@types/node@20.11.24) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-plugin-dts@3.7.3(@types/node@20.12.7)(rollup@4.17.0)(typescript@5.4.2)(vite@5.1.4(@types/node@20.12.7)): + dependencies: + '@microsoft/api-extractor': 7.39.0(@types/node@20.12.7) + '@rollup/pluginutils': 5.1.0(rollup@4.17.0) + '@vue/language-core': 1.8.27(typescript@5.4.2) + debug: 4.3.4 + kolorist: 1.8.0 + typescript: 5.4.2 + vue-tsc: 1.8.27(typescript@5.4.2) + optionalDependencies: + vite: 5.1.4(@types/node@20.12.7) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-plugin-dts@3.9.0(@types/node@20.12.7)(rollup@4.17.0)(typescript@5.4.2)(vite@5.2.10(@types/node@20.12.7)): + dependencies: + '@microsoft/api-extractor': 7.43.0(@types/node@20.12.7) + '@rollup/pluginutils': 5.1.0(rollup@4.17.0) + '@vue/language-core': 1.8.27(typescript@5.4.2) + debug: 4.3.4 + kolorist: 1.8.0 + magic-string: 0.30.10 + typescript: 5.4.2 + vue-tsc: 1.8.27(typescript@5.4.2) + optionalDependencies: + vite: 5.2.10(@types/node@20.12.7) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-plugin-full-reload@1.1.0: + dependencies: + picocolors: 1.0.0 + picomatch: 2.3.1 + + vite-plugin-live-reload@3.0.3(vite@5.1.4(@types/node@20.11.24)): + dependencies: + chokidar: 3.6.0 + picocolors: 1.0.0 + vite: 5.1.4(@types/node@20.11.24) + + vite-plugin-live-reload@3.0.3(vite@5.1.4(@types/node@20.12.7)): + dependencies: + chokidar: 3.6.0 + picocolors: 1.0.0 + vite: 5.1.4(@types/node@20.12.7) + + vite-plugin-live-reload@3.0.3(vite@5.2.10(@types/node@20.12.7)): + dependencies: + chokidar: 3.6.0 + picocolors: 1.0.0 + vite: 5.2.10(@types/node@20.12.7) + + vite-plugin-markdown@2.2.0(vite@5.1.4(@types/node@20.11.24)): + dependencies: + domhandler: 4.3.1 + front-matter: 4.0.2 + htmlparser2: 6.1.0 + markdown-it: 12.3.2 + vite: 5.1.4(@types/node@20.11.24) + + vite@5.1.4(@types/node@20.11.24): + dependencies: + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.12.0 + optionalDependencies: + '@types/node': 20.11.24 + fsevents: 2.3.3 + + vite@5.1.4(@types/node@20.12.7): + dependencies: + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.12.0 + optionalDependencies: + '@types/node': 20.12.7 + fsevents: 2.3.3 + + vite@5.2.10(@types/node@20.11.24): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.0 + optionalDependencies: + '@types/node': 20.11.24 + fsevents: 2.3.3 + + vite@5.2.10(@types/node@20.12.7): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.0 + optionalDependencies: + '@types/node': 20.12.7 + fsevents: 2.3.3 + + vitest@1.3.1(@types/node@20.11.24)(jsdom@24.0.0): + dependencies: '@vitest/expect': 1.3.1 '@vitest/runner': 1.3.1 '@vitest/snapshot': 1.3.1 @@ -4112,7 +6275,6 @@ packages: chai: 4.4.1 debug: 4.3.4 execa: 8.0.1 - jsdom: 24.0.0 local-pkg: 0.5.0 magic-string: 0.30.7 pathe: 1.1.2 @@ -4121,9 +6283,12 @@ packages: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.1.4(@types/node@20.11.24) + vite: 5.2.10(@types/node@20.11.24) vite-node: 1.3.1(@types/node@20.11.24) why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.11.24 + jsdom: 24.0.0 transitivePeerDependencies: - less - lightningcss @@ -4132,180 +6297,181 @@ packages: - sugarss - supports-color - terser - dev: true - /vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: true + vitest@1.3.1(@types/node@20.12.7)(jsdom@24.0.0): + dependencies: + '@vitest/expect': 1.3.1 + '@vitest/runner': 1.3.1 + '@vitest/snapshot': 1.3.1 + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.7 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.1.4(@types/node@20.12.7) + vite-node: 1.3.1(@types/node@20.12.7) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.7 + jsdom: 24.0.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser - /vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: true + vitest@1.5.2(@types/node@20.12.7)(jsdom@24.0.0): + dependencies: + '@vitest/expect': 1.5.2 + '@vitest/runner': 1.5.2 + '@vitest/snapshot': 1.5.2 + '@vitest/spy': 1.5.2 + '@vitest/utils': 1.5.2 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.2.10(@types/node@20.12.7) + vite-node: 1.5.2(@types/node@20.12.7) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.7 + jsdom: 24.0.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser - /vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + vscode-oniguruma@1.7.0: {} + + vscode-textmate@8.0.0: {} + + vue-template-compiler@2.7.16: dependencies: de-indent: 1.0.2 he: 1.2.0 - dev: true - /vue-tsc@1.8.27(typescript@5.3.3): - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true - peerDependencies: - typescript: '*' + vue-tsc@1.8.27(typescript@5.4.2): dependencies: '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.3.3) + '@vue/language-core': 1.8.27(typescript@5.4.2) semver: 7.6.0 - typescript: 5.3.3 - dev: true + typescript: 5.4.2 - /w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - dev: true - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + webidl-conversions@7.0.0: {} - /whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - dev: true - /whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - dev: true + whatwg-mimetype@4.0.0: {} - /whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + whatwg-url@14.0.0: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.1: dependencies: is-map: 2.0.2 is-set: 2.0.2 is-weakmap: 2.0.1 is-weakset: 2.0.2 - dev: true - /which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.14: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.2.2: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@8.16.0: {} - /xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - dev: true + xml-name-validator@5.0.0: {} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true + xmlchars@2.2.0: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + y18n@5.0.8: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@20.2.9: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} + + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -4314,21 +6480,13 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true + z-schema@5.0.5: dependencies: lodash.get: 4.4.2 lodash.isequal: 4.5.0 validator: 13.11.0 optionalDependencies: commander: 9.5.0 - dev: true