diff --git a/.changeset/nervous-crabs-reflect.md b/.changeset/nervous-crabs-reflect.md new file mode 100644 index 00000000..2e75592c --- /dev/null +++ b/.changeset/nervous-crabs-reflect.md @@ -0,0 +1,5 @@ +--- +"@webx-kit/storage": patch +--- + +feat(storage): compatible with unstorage diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index efafff03..c558b13b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,9 +22,9 @@ jobs: - uses: actions/cache@v3 with: path: node_modules/.cache/turbo - key: ${{ runner.os }}-turbo-${{ github.sha }} + key: turbo-${{ runner.os }}-${{ github.sha }} restore-keys: | - ${{ runner.os }}-turbo- + turbo-${{ runner.os }}- - uses: pnpm/action-setup@v2 diff --git a/packages/storage/demo/content-scripts/index.tsx b/packages/storage/demo/content-scripts/index.tsx index e757caeb..5fc6e559 100644 --- a/packages/storage/demo/content-scripts/index.tsx +++ b/packages/storage/demo/content-scripts/index.tsx @@ -1,6 +1,6 @@ import { createRoot } from 'react-dom/client'; import { useAtomValue } from 'jotai/react'; -import { apiKeyAtom } from '../hooks/atoms'; +import { apiKeyAtom } from '../shared/atoms'; const App = () => { const apiKey = useAtomValue(apiKeyAtom); diff --git a/packages/storage/demo/manifest.ts b/packages/storage/demo/manifest.ts index 32bdfdc0..c6e85401 100644 --- a/packages/storage/demo/manifest.ts +++ b/packages/storage/demo/manifest.ts @@ -7,10 +7,6 @@ const manifest: chrome.runtime.ManifestV3 = { service_worker: 'static/js/background.js', type: 'module', }, - options_ui: { - page: 'options.html', - open_in_tab: true, - }, content_scripts: [ { matches: [''], diff --git a/packages/storage/demo/pages/options/index.tsx b/packages/storage/demo/pages/jotai-2/index.tsx similarity index 86% rename from packages/storage/demo/pages/options/index.tsx rename to packages/storage/demo/pages/jotai-2/index.tsx index 4829b1fd..16ef834d 100644 --- a/packages/storage/demo/pages/options/index.tsx +++ b/packages/storage/demo/pages/jotai-2/index.tsx @@ -1,6 +1,6 @@ import { createRoot } from 'react-dom/client'; import { useAtomValue } from 'jotai/react'; -import { apiKeyAtom } from '../../hooks/atoms'; +import { apiKeyAtom } from '../../shared/atoms'; const App = () => { const apiKey = useAtomValue(apiKeyAtom); diff --git a/packages/storage/demo/pages/jotai/index.tsx b/packages/storage/demo/pages/jotai/index.tsx index d3d620e9..11b75167 100644 --- a/packages/storage/demo/pages/jotai/index.tsx +++ b/packages/storage/demo/pages/jotai/index.tsx @@ -1,6 +1,6 @@ import { createRoot } from 'react-dom/client'; import { useAtom } from 'jotai/react'; -import { apiKeyAtom } from '../../hooks/atoms'; +import { apiKeyAtom } from '../../shared/atoms'; const App = () => { const [apiKey, setAPIKey] = useAtom(apiKeyAtom); diff --git a/packages/storage/demo/pages/unstorage-2/index.tsx b/packages/storage/demo/pages/unstorage-2/index.tsx new file mode 100644 index 00000000..ef41771b --- /dev/null +++ b/packages/storage/demo/pages/unstorage-2/index.tsx @@ -0,0 +1,13 @@ +import { createRoot } from 'react-dom/client'; +import { useUnstorage } from '../../shared/unstorage'; + +const App = () => { + const [apiKey] = useUnstorage('apiKey', 'DEFAULT'); + return ( +
+
{apiKey}
+
+ ); +}; + +createRoot(document.getElementById('root')!).render(); diff --git a/packages/storage/demo/pages/unstorage/index.tsx b/packages/storage/demo/pages/unstorage/index.tsx new file mode 100644 index 00000000..2a3ce3dc --- /dev/null +++ b/packages/storage/demo/pages/unstorage/index.tsx @@ -0,0 +1,21 @@ +import { createRoot } from 'react-dom/client'; +import { useUnstorage } from '../../shared/unstorage'; + +const App = () => { + const [apiKey, setAPIKey] = useUnstorage('apiKey', 'DEFAULT'); + return ( +
+
{apiKey}
+ +
+ ); +}; + +createRoot(document.getElementById('root')!).render(); diff --git a/packages/storage/demo/hooks/atoms.ts b/packages/storage/demo/shared/atoms.ts similarity index 100% rename from packages/storage/demo/hooks/atoms.ts rename to packages/storage/demo/shared/atoms.ts diff --git a/packages/storage/demo/shared/unstorage.ts b/packages/storage/demo/shared/unstorage.ts new file mode 100644 index 00000000..3964d0fa --- /dev/null +++ b/packages/storage/demo/shared/unstorage.ts @@ -0,0 +1,29 @@ +import { useCallback, useEffect, useState } from 'react'; +import { createStorage } from 'unstorage'; +import { createDriver } from '@/unstorage'; + +export const storage = createStorage({ + driver: createDriver(), +}); + +export function useUnstorage(key: string, defaultValue?: any) { + const [value, setValue] = useState(defaultValue); + + useEffect(() => { + const refresh = () => storage.getItem(key).then((v) => setValue(v ?? defaultValue)); + refresh(); + const unwatch = storage.watch((_type, changedKey) => changedKey === key && refresh()); + return () => void unwatch.then((unwatch) => unwatch()); + }, [key]); + + const handleSetValue = useCallback( + (value: any) => { + storage.setItem(key, value).then(() => { + setValue(value); + }); + }, + [key] + ); + + return [value, handleSetValue] as const; +} diff --git a/packages/storage/e2e/jotai.spec.ts b/packages/storage/e2e/jotai.spec.ts index b205b22c..0f3d4af9 100644 --- a/packages/storage/e2e/jotai.spec.ts +++ b/packages/storage/e2e/jotai.spec.ts @@ -16,24 +16,24 @@ test('Single page', async ({ getURL, page }) => { test('Cross pages', async ({ getURL, context }) => { const jotaiPage = await context.newPage(); - const optionsPage = await context.newPage(); + const jotai2Page = await context.newPage(); const webPage = await context.newPage(); await jotaiPage.goto(await getURL('jotai.html')); - await optionsPage.goto(await getURL('options.html')); + await jotai2Page.goto(await getURL('jotai-2.html')); await webPage.goto(getWebpageURL()); await expect(jotaiPage.getByTestId('apiKey')).toHaveText('DEFAULT'); - await expect(optionsPage.getByTestId('apiKey')).toHaveText('DEFAULT'); + await expect(jotai2Page.getByTestId('apiKey')).toHaveText('DEFAULT'); await expect(webPage.getByTestId('apiKey')).toHaveText('DEFAULT'); await jotaiPage.getByTestId('change').click(); await expect(jotaiPage.getByTestId('apiKey')).toHaveText('Changed'); - await expect(optionsPage.getByTestId('apiKey')).toHaveText('Changed'); + await expect(jotai2Page.getByTestId('apiKey')).toHaveText('Changed'); await expect(webPage.getByTestId('apiKey')).toHaveText('Changed'); - await Promise.all([jotaiPage.reload(), optionsPage.reload(), webPage.reload()]); + await Promise.all([jotaiPage.reload(), jotai2Page.reload(), webPage.reload()]); await expect(jotaiPage.getByTestId('apiKey')).toHaveText('Changed'); - await expect(optionsPage.getByTestId('apiKey')).toHaveText('Changed'); + await expect(jotai2Page.getByTestId('apiKey')).toHaveText('Changed'); await expect(webPage.getByTestId('apiKey')).toHaveText('Changed'); }); diff --git a/packages/storage/e2e/unstorage.spec.ts b/packages/storage/e2e/unstorage.spec.ts new file mode 100644 index 00000000..65fd14d4 --- /dev/null +++ b/packages/storage/e2e/unstorage.spec.ts @@ -0,0 +1,31 @@ +import { expect, test } from './context'; + +test('Single page', async ({ getURL, page }) => { + await page.goto(await getURL('unstorage.html')); + + await expect(page.getByTestId('apiKey')).toHaveText('DEFAULT'); + await page.getByTestId('change').click(); + await expect(page.getByTestId('apiKey')).toHaveText('Changed'); + + await page.reload(); + await expect(page.getByTestId('apiKey')).toHaveText('Changed'); +}); + +test('Cross pages', async ({ getURL, context }) => { + const jotaiPage = await context.newPage(); + const jotai2Page = await context.newPage(); + + await jotaiPage.goto(await getURL('unstorage.html')); + await jotai2Page.goto(await getURL('unstorage-2.html')); + + await expect(jotaiPage.getByTestId('apiKey')).toHaveText('DEFAULT'); + await expect(jotai2Page.getByTestId('apiKey')).toHaveText('DEFAULT'); + + await jotaiPage.getByTestId('change').click(); + await expect(jotaiPage.getByTestId('apiKey')).toHaveText('Changed'); + await expect(jotai2Page.getByTestId('apiKey')).toHaveText('Changed'); + + await Promise.all([jotaiPage.reload(), jotai2Page.reload()]); + await expect(jotaiPage.getByTestId('apiKey')).toHaveText('Changed'); + await expect(jotai2Page.getByTestId('apiKey')).toHaveText('Changed'); +}); diff --git a/packages/storage/package.json b/packages/storage/package.json index 568e4a96..b80e0e4a 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -5,6 +5,10 @@ ".": { "types": "./src/index.ts", "default": "./src/index.ts" + }, + "./unstorage": { + "types": "./src/unstorage.ts", + "default": "./src/unstorage.ts" } }, "types": "./src/index.ts", @@ -13,6 +17,10 @@ ".": { "types": "./dist/index.d.mts", "default": "./dist/index.mjs" + }, + "./unstorage": { + "types": "./dist/unstorage.d.mts", + "default": "./dist/unstorage.mjs" } }, "types": "./dist/index.d.mts" @@ -40,7 +48,8 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "tsup": "^8.0.1", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "unstorage": "^1.10.1" }, "peerDependencies": { "@types/chrome": "^0.0.258" diff --git a/packages/storage/src/index.ts b/packages/storage/src/index.ts index 2e8aaffe..4758012a 100644 --- a/packages/storage/src/index.ts +++ b/packages/storage/src/index.ts @@ -1,9 +1,12 @@ export interface ChromeStorage = Record> { setItem: (key: K, value: T[K]) => Promise; getItem: (key: K, defaultValue?: T[K]) => Promise; + hasItem: (key: string) => Promise; + getKeys: () => Promise; removeItem: (key: keyof T | (keyof T)[]) => Promise; clear: () => Promise; subscribe: (key: K, callback: (value: T[K] | null) => void) => VoidFunction; + watch: (callback: (event: 'update' | 'remove', key: string) => void) => VoidFunction; } export function createStorage = Record>( @@ -17,7 +20,17 @@ export function createStorage = Record(key: K, defaultValue?: T[K]): Promise { const result = await storage.get(key as string); - return result[key as string] ?? (arguments.length === 2 ? defaultValue : null); + return key in result ? result[key as string] : arguments.length === 2 ? defaultValue : null; + } + + async function hasItem(key: string): Promise { + const result = await storage.get(key as string); + return key in result; + } + + async function getKeys(): Promise { + const result = await storage.get(); + return Object.keys(result); } async function removeItem(key: keyof T | (keyof T)[]): Promise { @@ -28,9 +41,11 @@ export function createStorage = Record[0]; + let onChangedActive = false; const onChangedCallbacks = new Map void>>(); - const onChangedListener: Parameters<(typeof storage)['onChanged']['addListener']>[0] = (changes) => { + const onChangedListener: OnChangedListener = (changes) => { for (const [key, value] of Object.entries(changes)) { const changedCallback = onChangedCallbacks.get(key); if (!changedCallback) continue; @@ -66,11 +81,27 @@ export function createStorage = Record void): VoidFunction { + const listener: OnChangedListener = (changes) => { + for (const [key, value] of Object.entries(changes)) { + const type = 'newValue' in value ? 'update' : 'remove'; + callback(type, key); + } + }; + storage.onChanged.addListener(listener); + return () => { + storage.onChanged.removeListener(listener); + }; + } + return { setItem, getItem, + hasItem, + getKeys, removeItem, clear, subscribe, + watch, }; } diff --git a/packages/storage/src/unstorage.ts b/packages/storage/src/unstorage.ts new file mode 100644 index 00000000..b97b9e7a --- /dev/null +++ b/packages/storage/src/unstorage.ts @@ -0,0 +1,9 @@ +import { ChromeStorage, createStorage } from './index'; + +export function createDriver(): ChromeStorage { + const storage = createStorage(); + return { + ...storage, + getItem: (key: string) => storage.getItem(key), + }; +} diff --git a/packages/storage/tsup.config.ts b/packages/storage/tsup.config.ts index b1bc8dcd..e777b868 100644 --- a/packages/storage/tsup.config.ts +++ b/packages/storage/tsup.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'tsup'; export default defineConfig({ - entry: ['./src/index.ts'], + entry: ['./src/*.ts'], outDir: './dist', format: 'esm', clean: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4cea7200..f8816429 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -387,6 +387,9 @@ importers: typescript: specifier: ^5.3.3 version: 5.3.3 + unstorage: + specifier: ^1.10.1 + version: 1.10.1 packages/test-utils: dependencies: @@ -2692,6 +2695,10 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: true + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2847,13 +2854,13 @@ packages: '@modern-js/new-action': 2.46.1(typescript@5.3.3) '@modern-js/node-bundle-require': 2.46.1 '@modern-js/plugin': 2.46.1 - '@modern-js/plugin-data-loader': 2.46.1 + '@modern-js/plugin-data-loader': 2.46.1(react-dom@18.2.0)(react@18.2.0) '@modern-js/plugin-i18n': 2.46.1 '@modern-js/plugin-lint': 2.46.1 - '@modern-js/prod-server': 2.46.1 - '@modern-js/server': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.4) + '@modern-js/prod-server': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/server': 2.46.1(@babel/traverse@7.23.7) '@modern-js/server-core': 2.46.1 - '@modern-js/server-utils': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.4) + '@modern-js/server-utils': 2.46.1(@babel/traverse@7.23.7) '@modern-js/types': 2.46.1 '@modern-js/uni-builder': 2.46.1(@babel/traverse@7.23.7)(esbuild@0.17.19)(typescript@5.3.3) '@modern-js/upgrade': 2.46.1 @@ -3090,23 +3097,6 @@ packages: esbuild: 0.17.19 dev: true - /@modern-js/plugin-data-loader@2.46.1: - resolution: {integrity: sha512-YUpj7kQnf8vfXtTBhKQc9LoI7TGZCEmO1Q2S9YTre/vsd8tn25C71AupEhCMrZh5RzyugHPe2RQ+Ad7FbyOftQ==} - engines: {node: '>=14.17.6'} - peerDependencies: - react: '>=17.0.0' - dependencies: - '@babel/core': 7.23.7 - '@modern-js/runtime-utils': 2.46.1 - '@modern-js/utils': 2.46.1 - '@remix-run/node': 1.19.3 - '@swc/helpers': 0.5.3 - path-to-regexp: 6.2.1 - transitivePeerDependencies: - - react-dom - - supports-color - dev: true - /@modern-js/plugin-data-loader@2.46.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-YUpj7kQnf8vfXtTBhKQc9LoI7TGZCEmO1Q2S9YTre/vsd8tn25C71AupEhCMrZh5RzyugHPe2RQ+Ad7FbyOftQ==} engines: {node: '>=14.17.6'} @@ -3152,32 +3142,6 @@ packages: '@swc/helpers': 0.5.3 dev: true - /@modern-js/prod-server@2.46.1: - resolution: {integrity: sha512-O2q0G5QbPd80FMkqi7Mf/kD3sznOUCfhfV7BSzJLHM6djFAdxz8l3wytGL2jUADImTwKv30rWgp6f9dcg2+WPA==} - dependencies: - '@modern-js/plugin': 2.46.1 - '@modern-js/runtime-utils': 2.46.1 - '@modern-js/server-core': 2.46.1 - '@modern-js/utils': 2.46.1 - '@swc/helpers': 0.5.3 - cookie: 0.5.0 - etag: 1.8.1 - fresh: 0.5.2 - http-proxy-middleware: 2.0.6 - ignore-styles: 5.0.1 - isbot: 3.8.0 - merge-deep: 3.0.3 - node-html-parser: 6.1.12 - path-to-regexp: 6.2.1 - serve-static: 1.15.0 - transitivePeerDependencies: - - '@types/express' - - debug - - react - - react-dom - - supports-color - dev: true - /@modern-js/prod-server@2.46.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-O2q0G5QbPd80FMkqi7Mf/kD3sznOUCfhfV7BSzJLHM6djFAdxz8l3wytGL2jUADImTwKv30rWgp6f9dcg2+WPA==} dependencies: @@ -3204,25 +3168,6 @@ packages: - supports-color dev: true - /@modern-js/runtime-utils@2.46.1: - resolution: {integrity: sha512-/dfd2VOxFlG5zLjpLILaWTJpGpoVufQmIe/zyxUmfmc25hTNvCaYpHgcBJdTuJstqkvo0EsenHWMZ+ESx7WIfw==} - peerDependencies: - react: '>=17.0.0' - react-dom: '>=17.0.0' - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - dependencies: - '@modern-js/utils': 2.46.1 - '@remix-run/router': 1.10.0 - '@swc/helpers': 0.5.3 - lru-cache: 6.0.0 - react-router-dom: 6.17.0 - serialize-javascript: 6.0.2 - dev: true - /@modern-js/runtime-utils@2.46.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-/dfd2VOxFlG5zLjpLILaWTJpGpoVufQmIe/zyxUmfmc25hTNvCaYpHgcBJdTuJstqkvo0EsenHWMZ+ESx7WIfw==} peerDependencies: @@ -3308,9 +3253,9 @@ packages: dependencies: '@babel/core': 7.23.7 '@babel/register': 7.23.7(@babel/core@7.23.7) - '@modern-js/prod-server': 2.46.1 - '@modern-js/runtime-utils': 2.46.1 - '@modern-js/server-utils': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.4) + '@modern-js/prod-server': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/runtime-utils': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/server-utils': 2.46.1(@babel/traverse@7.23.7) '@modern-js/types': 2.46.1 '@modern-js/utils': 2.46.1 '@swc/helpers': 0.5.3 @@ -3348,8 +3293,8 @@ packages: dependencies: '@babel/core': 7.23.7 '@babel/register': 7.23.7(@babel/core@7.23.7) - '@modern-js/prod-server': 2.46.1 - '@modern-js/runtime-utils': 2.46.1 + '@modern-js/prod-server': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/runtime-utils': 2.46.1(react-dom@18.2.0)(react@18.2.0) '@modern-js/server-utils': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.4) '@modern-js/types': 2.46.1 '@modern-js/utils': 2.46.1 @@ -3546,7 +3491,7 @@ packages: '@babel/core': 7.23.7 '@babel/preset-react': 7.23.3(@babel/core@7.23.7) '@babel/types': 7.23.6 - '@modern-js/prod-server': 2.46.1 + '@modern-js/prod-server': 2.46.1(react-dom@18.2.0)(react@18.2.0) '@modern-js/server': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.4) '@modern-js/utils': 2.46.1 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.14.0)(webpack@5.89.0) @@ -3682,6 +3627,147 @@ packages: fastq: 1.16.0 dev: true + /@parcel/watcher-android-arm64@2.4.0: + resolution: {integrity: sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-darwin-arm64@2.4.0: + resolution: {integrity: sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-darwin-x64@2.4.0: + resolution: {integrity: sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-freebsd-x64@2.4.0: + resolution: {integrity: sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm-glibc@2.4.0: + resolution: {integrity: sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.4.0: + resolution: {integrity: sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-arm64-musl@2.4.0: + resolution: {integrity: sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-x64-glibc@2.4.0: + resolution: {integrity: sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-linux-x64-musl@2.4.0: + resolution: {integrity: sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-wasm@2.3.0: + resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} + engines: {node: '>= 10.0.0'} + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + dev: true + bundledDependencies: + - napi-wasm + + /@parcel/watcher-win32-arm64@2.4.0: + resolution: {integrity: sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-ia32@2.4.0: + resolution: {integrity: sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher-win32-x64@2.4.0: + resolution: {integrity: sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@parcel/watcher@2.4.0: + resolution: {integrity: sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==} + engines: {node: '>= 10.0.0'} + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.1.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.4.0 + '@parcel/watcher-darwin-arm64': 2.4.0 + '@parcel/watcher-darwin-x64': 2.4.0 + '@parcel/watcher-freebsd-x64': 2.4.0 + '@parcel/watcher-linux-arm-glibc': 2.4.0 + '@parcel/watcher-linux-arm64-glibc': 2.4.0 + '@parcel/watcher-linux-arm64-musl': 2.4.0 + '@parcel/watcher-linux-x64-glibc': 2.4.0 + '@parcel/watcher-linux-x64-musl': 2.4.0 + '@parcel/watcher-win32-arm64': 2.4.0 + '@parcel/watcher-win32-ia32': 2.4.0 + '@parcel/watcher-win32-x64': 2.4.0 + dev: true + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -5552,6 +5638,12 @@ packages: safe-buffer: 5.2.1 dev: true + /citty@0.1.5: + resolution: {integrity: sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==} + dependencies: + consola: 3.2.3 + dev: true + /classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} dev: false @@ -5580,6 +5672,15 @@ packages: engines: {node: '>= 10'} dev: true + /clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + dev: true + /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: @@ -5632,6 +5733,11 @@ packages: engines: {node: '>=6'} dev: false + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: true + /code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} dependencies: @@ -5710,6 +5816,11 @@ packages: engines: {node: '>=0.8'} dev: true + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: true + /console-browserify@1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} dev: true @@ -5728,6 +5839,10 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + /cookie-es@1.0.0: + resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} + dev: true + /cookie-signature@1.2.1: resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} engines: {node: '>=6.6.0'} @@ -6157,11 +6272,20 @@ packages: object-keys: 1.1.1 dev: true + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: true + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: true + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: true + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -6178,6 +6302,10 @@ packages: minimalistic-assert: 1.0.1 dev: true + /destr@2.0.2: + resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} + dev: true + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -6187,6 +6315,12 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true @@ -6687,6 +6821,21 @@ packages: strip-final-newline: 2.0.0 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 + /extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} dev: true @@ -7012,11 +7161,20 @@ packages: hasown: 2.0.0 dev: true + /get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + dev: true + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -7135,6 +7293,19 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /h3@1.10.0: + resolution: {integrity: sha512-Tw1kcIC+AeimwRmviiObaD5EB430Yt+lTgOxLJxNr96Vd/fGRu04EF7aKfOAcpwKCI+U2JlbxOLhycD86p3Ciw==} + dependencies: + cookie-es: 1.0.0 + defu: 6.1.4 + destr: 2.0.2 + iron-webcrypto: 1.0.0 + radix3: 1.1.0 + ufo: 1.3.2 + uncrypto: 0.1.3 + unenv: 1.9.0 + dev: true + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} @@ -7330,6 +7501,11 @@ packages: - debug dev: true + /http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + /https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} dev: true @@ -7343,6 +7519,11 @@ packages: engines: {node: '>=10.17.0'} dev: true + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + /husky@8.0.3: resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} @@ -7430,6 +7611,27 @@ packages: side-channel: 1.0.4 dev: true + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /iron-webcrypto@1.0.0: + resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} + dev: true + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -7493,6 +7695,12 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + /is-expression@4.0.0: resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} dependencies: @@ -7529,6 +7737,14 @@ packages: is-extglob: 2.1.1 dev: true + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -7606,6 +7822,11 @@ packages: engines: {node: '>=8'} 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'} @@ -7650,6 +7871,20 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: true + + /is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + dependencies: + system-architecture: 0.1.0 + dev: true + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true @@ -7798,6 +8033,10 @@ packages: engines: {node: '>=6'} hasBin: true + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -7891,6 +8130,29 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true + /listhen@1.5.6: + resolution: {integrity: sha512-gTpEJhT5L85L0bFgmu+Boqu5rP4DwDtEb4Exq5gdQUxWRwx4jbzdInZkmyLONo5EwIcQB0k7ZpWlpCDPdL77EQ==} + hasBin: true + dependencies: + '@parcel/watcher': 2.4.0 + '@parcel/watcher-wasm': 2.3.0 + citty: 0.1.5 + clipboardy: 4.0.0 + consola: 3.2.3 + defu: 6.1.4 + get-port-please: 3.1.2 + h3: 1.10.0 + http-shutdown: 1.2.2 + jiti: 1.21.0 + mlly: 1.5.0 + node-forge: 1.3.1 + pathe: 1.1.2 + std-env: 3.7.0 + ufo: 1.3.2 + untun: 0.1.3 + uqr: 0.1.2 + dev: true + /load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7954,6 +8216,14 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: true + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: true + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true @@ -8140,11 +8410,22 @@ packages: hasBin: true dev: true + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: true + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: true + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -8261,6 +8542,20 @@ packages: hasBin: true 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 + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + /mrmime@1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} @@ -8312,6 +8607,20 @@ packages: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: true + /node-addon-api@7.1.0: + resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} + engines: {node: ^16 || ^18 || >= 20} + dev: true + + /node-fetch-native@1.6.1: + resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==} + dev: true + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + /node-html-parser@6.1.12: resolution: {integrity: sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==} dependencies: @@ -8371,6 +8680,13 @@ packages: path-key: 3.1.1 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 + /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: @@ -8405,6 +8721,14 @@ packages: object-keys: 1.1.1 dev: true + /ofetch@1.3.3: + resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} + dependencies: + destr: 2.0.2 + node-fetch-native: 1.6.1 + ufo: 1.3.2 + dev: true + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -8424,6 +8748,13 @@ packages: mimic-fn: 2.1.0 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 + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -8617,6 +8948,11 @@ packages: 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 @@ -8638,6 +8974,10 @@ packages: engines: {node: '>=8'} dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + /pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} @@ -8700,6 +9040,14 @@ packages: find-up: 6.3.0 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 + /pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} @@ -9321,6 +9669,10 @@ packages: engines: {node: '>=8'} dev: true + /radix3@1.1.0: + resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} + dev: true + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -9381,17 +9733,6 @@ packages: - react-dom dev: false - /react-router-dom@6.17.0: - resolution: {integrity: sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - dependencies: - '@remix-run/router': 1.10.0 - react-router: 6.17.0 - dev: true - /react-router-dom@6.17.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==} engines: {node: '>=14.0.0'} @@ -9405,15 +9746,6 @@ packages: react-router: 6.17.0(react@18.2.0) dev: true - /react-router@6.17.0: - resolution: {integrity: sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - dependencies: - '@remix-run/router': 1.10.0 - dev: true - /react-router@6.17.0(react@18.2.0): resolution: {integrity: sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA==} engines: {node: '>=14.0.0'} @@ -9514,6 +9846,18 @@ packages: strip-indent: 3.0.0 dev: true + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: true + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: true + /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -10082,11 +10426,19 @@ packages: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} dev: true + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: true + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: true + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + /stream-browserify@2.0.2: resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} dependencies: @@ -10193,6 +10545,11 @@ packages: engines: {node: '>=6'} dev: true + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -10372,6 +10729,11 @@ packages: picocolors: 1.0.0 dev: true + /system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + dev: true + /tailwindcss@3.4.1: resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} @@ -10837,6 +11199,10 @@ packages: engines: {node: '>=14.17'} hasBin: 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: @@ -10846,10 +11212,24 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dev: true + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true + /unenv@1.9.0: + resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.1 + pathe: 1.1.2 + dev: true + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -10883,6 +11263,71 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unstorage@1.10.1: + resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} + peerDependencies: + '@azure/app-configuration': ^1.4.1 + '@azure/cosmos': ^4.0.0 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^3.3.2 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.16.0 + '@capacitor/preferences': ^5.0.6 + '@netlify/blobs': ^6.2.0 + '@planetscale/database': ^1.11.0 + '@upstash/redis': ^1.23.4 + '@vercel/kv': ^0.2.3 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.2 + h3: 1.10.0 + ioredis: 5.3.2 + listhen: 1.5.6 + lru-cache: 10.1.0 + mri: 1.2.0 + node-fetch-native: 1.6.1 + ofetch: 1.3.3 + ufo: 1.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + hasBin: true + dependencies: + citty: 0.1.5 + consola: 3.2.3 + pathe: 1.1.2 + dev: true + /upath@2.0.1: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} @@ -10903,6 +11348,10 @@ packages: tslib: 2.6.2 dev: true + /uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: