diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 29d92452..458f6d5b 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -4,7 +4,7 @@ on: push: branches: ['main'] pull_request: - branches: ['main'] + types: [opened, synchronize, reopened] jobs: run-on-linux: @@ -12,7 +12,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [20.x, lts/*] steps: - name: Checkout @@ -26,22 +26,9 @@ jobs: name: Install pnpm id: pnpm-install with: - # version: 9 run_install: false - # - name: Get pnpm store directory - # id: pnpm-cache - # shell: bash - # run: | - # echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - # - uses: actions/cache@v3 - # name: Setup pnpm cache - # with: - # path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - # key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - # restore-keys: | - # ${{ runner.os }}-pnpm-store- + - uses: oven-sh/setup-bun@v2 - name: Install dependencies run: pnpm install @@ -49,7 +36,11 @@ jobs: - run: pnpm -v - run: dir - run: pnpm lint - # - run: pnpm --filter app-example test - run: pnpm start:tsdk + + - run: pnpm --filter=web typecheck && pnpm --filter=web build + + - run: pnpm start:bun + - run: pnpm --filter fe-sdk-demo-docs build - run: dir diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml new file mode 100644 index 00000000..f272bd86 --- /dev/null +++ b/.github/workflows/playwright.yml @@ -0,0 +1,38 @@ +name: Playwright Tests +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + - uses: pnpm/action-setup@v4 + name: Install pnpm + id: pnpm-install + with: + run_install: false + + - name: Install dependencies + run: pnpm install + - name: Install Playwright Browsers + run: pnpm exec playwright install --with-deps + + - name: Build necessary packages + run: pnpm build:tsdk + - name: Run Playwright tests + run: pnpm exec playwright test + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 + - name: Run vite/webpack/next builds + run: pnpm --filter web --filter vue-web --filter solid-web --filter svelte-web build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0f321d6f..e77a5993 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,46 +2,79 @@ name: Release on: push: - branches: - - main tags: - - v* - pull_request: + - 'v*' jobs: release: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [18.x] - - if: startsWith(github.ref, 'refs/tags/v') permissions: id-token: write + contents: write + steps: - name: Check out - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + - name: Install pnpm + uses: pnpm/action-setup@v4 with: - node-version: ${{ matrix.node-version }} - registry-url: 'https://registry.npmjs.org' + version: 9 + run_install: false - - uses: pnpm/action-setup@v4 - name: Install pnpm - id: pnpm-install + - name: Use Node.js 20.x + uses: actions/setup-node@v4 with: - # version: 9.1.2 - run_install: false + node-version: 20.x + registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: pnpm install + run: pnpm install --frozen-lockfile + + - name: Check types + run: pnpm checktype + + - name: Run lint + run: pnpm lint - - run: pnpm lint + - name: Determine release tag + id: release-tag + run: | + TAG=${GITHUB_REF#refs/tags/} + echo "version=$TAG" >> $GITHUB_OUTPUT - - name: Release - run: pnpm start-publish + if [[ "$TAG" =~ -alpha(\.|$) ]] || [[ "$TAG" =~ -beta(\.|$) ]]; then + echo "npm_tag=next" >> $GITHUB_OUTPUT + echo "is_prerelease=true" >> $GITHUB_OUTPUT + echo "📦 Publishing as pre-release: $TAG (npm tag: next)" + else + echo "npm_tag=latest" >> $GITHUB_OUTPUT + echo "is_prerelease=false" >> $GITHUB_OUTPUT + echo "📦 Publishing as stable release: $TAG (npm tag: latest)" + fi + + - name: Verify tsdk package contents + run: cd packages/tsdk && npm pack --dry-run + + - name: Verify tsdk-server-adapters package contents + run: cd packages/tsdk-server-adapters && npm pack --dry-run + + - name: Publish tsdk to npm + run: cd packages/tsdk && npm run build && node ../../scripts/purge-pkg-for-publish.mjs && npm publish --access public --no-git-checks --provenance --registry=https://registry.npmjs.org --tag=${{ steps.release-tag.outputs.npm_tag }} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN_ELEVATED }} + + - name: Publish tsdk-server-adapters to npm + run: cd packages/tsdk-server-adapters && npm run build && node ../../scripts/purge-pkg-for-publish.mjs && npm publish --access public --no-git-checks --provenance --registry=https://registry.npmjs.org --tag=${{ steps.release-tag.outputs.npm_tag }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN_ELEVATED }} + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.release-tag.outputs.version }} + name: Release ${{ steps.release-tag.outputs.version }} + draft: false + prerelease: ${{ steps.release-tag.outputs.is_prerelease }} + generate_release_notes: true diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index 5d1d4f6a..62c4d62d 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -4,15 +4,15 @@ on: push: branches: ['main'] pull_request: - branches: ['main'] + types: [opened, synchronize, reopened] jobs: - run-on-windows-2019: - runs-on: windows-2019 + run-on-windows-2025: + runs-on: windows-2025 strategy: matrix: - node-version: [18.x] + node-version: [20.x, lts/*] steps: - name: Checkout @@ -26,30 +26,20 @@ jobs: name: Install pnpm id: pnpm-install with: - # version: 9.1.2 run_install: false - # - name: Get pnpm store directory - # id: pnpm-cache - # shell: bash - # run: | - # echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - # - uses: actions/cache@v3 - # name: Setup pnpm cache - # with: - # path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - # key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - # restore-keys: | - # ${{ runner.os }}-pnpm-store- + - uses: oven-sh/setup-bun@v2 - name: Install dependencies run: pnpm install - run: pnpm -v - run: dir - # - run: pnpm lint - # - run: pnpm --filter app-example test - run: pnpm start:tsdk + + - run: pnpm --filter=web typecheck && pnpm --filter=web build + + - run: pnpm start:bun + - run: pnpm --filter fe-sdk-demo-docs build - run: dir diff --git a/.gitignore b/.gitignore index 31c90972..b98cf992 100644 --- a/.gitignore +++ b/.gitignore @@ -65,4 +65,17 @@ build-* *.db *.db-shm *.db-wal -*.zip \ No newline at end of file +*.zip +test-project +test-project-bun +test-project-yarn +test-project-npm + +# Playwright +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ +DOC.md +FAQ.md +FAQ2.md \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit index 36af2198..cb2c84d5 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx lint-staged +pnpm lint-staged diff --git a/.npmrc b/.npmrc deleted file mode 100644 index cc8df9de..00000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -node-linker=hoisted \ No newline at end of file diff --git a/.vscode/tsdk.code-snippets b/.vscode/tsdk.code-snippets index 2ac02f43..1ac40187 100644 --- a/.vscode/tsdk.code-snippets +++ b/.vscode/tsdk.code-snippets @@ -3,59 +3,76 @@ "scope": "typescript", "prefix": "apii", "body": [ - "import * as z from 'zod';", - "import { transformPath, APIConfig, ObjectLiteral } from '@/src/shared/tsdk-helper';" + "import { transformPath, type APIConfig } from '@/src/tsdk-shared/helpers';" ], - "description": "api config import snippet" + "description": "API config import snippet" }, "apiconf": { "scope": "typescript", "prefix": "apic", "body": [ - "", "/**", - " * ${1:description} ({@link APIConfig})", - " * @category ${3:Category}", + " * ${1:Description} ({@link APIConfig})", + " * @category ${2:Category}", " */", - "export const ${2:ApiName}Config: APIConfig = {", + "export const ${3:ApiName}Config: APIConfig = {", " type: '${4:user}',", - " method: '${5|get,post,delete,put,patch,head,options|}',", - " path: transformPath('${2:ApiName}'),", - " description: '${1:description}',", - " category: '${3:Category}'", + " method: '${5|GET,POST,DELETE,PUT,PATCH,HEAD,OPTIONS|}',", + " path: transformPath('${3:ApiName}'),", "};", "/**", - " *", - " * @category ${3:Category}", + " * @category ${2:Category}", " */", - "export type ${2:ApiName}Req = ${8:{\\}};", - "", + "export type ${3:ApiName}Req = {${6:}};", "/**", - " *", - " * @category ${3:Category}", + " * @category ${2:Category}", " */", - "export type ${2:ApiName}Res = ${9:{\\}};", - "// --------- ${2:ApiName} END ---------", - "" + "export type ${3:ApiName}Res = {${7:}};", + "// --------- ${3:ApiName} END ---------" ], - "description": "apic onfig snippet" + "description": "API config snippet" }, - "importApiConf": { + "simple apiconf": { "scope": "typescript", + "prefix": "sapic", + "body": [ + "/**", + " * ${1:Description} ({@link APIConfig})", + " * @category ${2:Category}", + " */", + "export const ${3:ApiName}Config: APIConfig = {", + " // type: 'user',", + " method: '${4|get,post,delete,put,patch,head,options|}',", + " path: transformPath('${3:ApiName}'),", + "};", + "/**", + " * @category ${2:Category}", + " */", + "export type ${3:ApiName}Req = {${5}};", + "/**", + " * @category ${2:Category}", + " */", + "export type ${3:ApiName}Res = {${6}};", + "// --------- ${3:ApiName} END ---------" + ], + "description": "Simple API config snippet" + }, + "importApiConf": { + "scope": "typescript,typescriptreact", "prefix": "apin", "body": [ - "${1:name}Config,", - "${1:name}Req,", - "${1:name}Res,", + "${1:ApiName}Config,", + "${1:ApiName}Req,", + "${1:ApiName}Res," ], - "description": "apic onfig name snippet" + "description": "API config import names" }, "genRoute": { "scope": "typescript", "prefix": "genr", "body": [ - "genRoute<${1:name}Req, ${1:name}Res>(${1:name}Config, async (data, reqInfo) => {", - " return ${2://service}(data, reqInfo);", + "genRoute<${1:ApiName}Req, ${1:ApiName}Res>(${1:ApiName}Config, async (data, reqInfo) => {", + " return ${2://serviceName}(data, reqInfo);", "});" ], "description": "genRoute() snippet" diff --git a/README.md b/README.md index 89a3182b..18090b71 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,6 @@ pnpm install - [`packages/tsdk`](./packages/tsdk) - `tsdk` package. - [`packages/tsdk-server-adapters`](./packages/tsdk-server-adapters) - Server adapters package for tsdk. - [`packages/bench`](./packages/bench) - benchmark for `tsdk-server-adapters`. -- [`configs/*`](./packages/bench) - config packages for ts/eslint/test etc. - [`examples/*`](./examples) - Examples that only use packages and aren't aware of other apps. ## Community diff --git a/configs/eslint-config/index.js b/configs/eslint-config/index.js deleted file mode 100644 index 375b097f..00000000 --- a/configs/eslint-config/index.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - extends: 'eslint-config-universe', - // do some additional things with it - rules: { - 'prettier/prettier': ['warn', { endOfLine: 'auto' }], - }, - // Disable import/namespace due to https://github.com/facebook/react-native/issues/28549 - // By setting delimiters to `\|/`, this ignore is supported on Windows too - settings: { - 'import/ignore': ['node_modules(\\\\|/)react-native(\\\\|/)index\\.js$'], - }, -}; diff --git a/configs/eslint-config/native.js b/configs/eslint-config/native.js deleted file mode 100644 index 3bc46aba..00000000 --- a/configs/eslint-config/native.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - extends: 'universe/native', - // do some additional things with it - rules: { - 'prettier/prettier': ['warn', { endOfLine: 'auto' }], - }, - // Disable import/namespace due to https://github.com/facebook/react-native/issues/28549 - // By setting delimiters to `\|/`, this ignore is supported on Windows too - settings: { - 'import/ignore': ['node_modules(\\\\|/)react-native(\\\\|/)index\\.js$'], - }, -}; diff --git a/configs/eslint-config/node.js b/configs/eslint-config/node.js deleted file mode 100644 index 481044e0..00000000 --- a/configs/eslint-config/node.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - extends: 'universe/node', - // do some additional things with it - rules: { - 'prettier/prettier': ['warn', { endOfLine: 'auto' }], - }, -}; diff --git a/configs/eslint-config/package.json b/configs/eslint-config/package.json deleted file mode 100644 index 088dfac6..00000000 --- a/configs/eslint-config/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "private": true, - "name": "@configs/eslint-config", - "version": "1.0.0", - "description": "eslint configuration", - "license": "MIT", - "main": "index.js", - "files": [ - "index.js", - "native.js", - "web.js", - "node.js" - ], - "scripts": { - "lint": "eslint --ext js,ts,tsx ." - }, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^6.1.0", - "@typescript-eslint/parser": "^6.1.0", - "eslint": "^8.45.0", - "eslint-config-universe": "^11.3.0", - "prettier": "^2.8.8", - "@tsconfig/recommended": "^1.0.7" - }, - "eslintConfig": { - "extends": "." - } -} diff --git a/configs/eslint-config/web.js b/configs/eslint-config/web.js deleted file mode 100644 index 20233930..00000000 --- a/configs/eslint-config/web.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - extends: 'universe/web', - // do some additional things with it - rules: { - 'prettier/prettier': ['warn', { endOfLine: 'auto' }], - }, - // Disable import/namespace due to https://github.com/facebook/react-native/issues/28549 - // By setting delimiters to `\|/`, this ignore is supported on Windows too - settings: { - 'import/ignore': ['node_modules(\\\\|/)react-native(\\\\|/)index\\.js$'], - }, -}; diff --git a/configs/test-config/README.md b/configs/test-config/README.md deleted file mode 100644 index 4130d999..00000000 --- a/configs/test-config/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# test-config - -Usage: - -First, add `"@configs/test-config": "workspace:*"` to the `package.json` devDependencies: - -```json -{ - "devDependencies": { - "@configs/test-config": "workspace:*" - } -} -``` - -And add the below to the scripts - -```json -{ - "scripts": { - "test": "cross-env NODE_ENV=test TS_CONFIG_PATHS=true ts-mocha -p tsconfig.json ./**/*.test.ts ./**/*.test.tsx --parallel --timeout 30000" - } -} -``` - -If want support `react`, add `"jsx": "react"` to tsconfig.json `compilerOptions` diff --git a/configs/test-config/package.json b/configs/test-config/package.json deleted file mode 100644 index cda438fb..00000000 --- a/configs/test-config/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "private": true, - "name": "@configs/test-config", - "description": "test config", - "version": "1.0.0", - "devDependencies": { - "@types/chai": "^4.3.4", - "@types/mocha": "^10.0.6", - "@types/node": "^18.13.0", - "ts-node": "^10.9.1", - "chai": "^4.3.10", - "mocha": "^10.2.0", - "ts-mocha": "^10.0.0" - }, - "license": "MIT" -} diff --git a/configs/test-config/tsconfig.json b/configs/test-config/tsconfig.json deleted file mode 100644 index 6e7bec40..00000000 --- a/configs/test-config/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "compilerOptions": {}, - "exclude": ["node_modules"] -} diff --git a/configs/ts-config/index.js b/configs/ts-config/index.js deleted file mode 100644 index dded6087..00000000 --- a/configs/ts-config/index.js +++ /dev/null @@ -1 +0,0 @@ -console.log('nothing here'); diff --git a/configs/ts-config/main.ts b/configs/ts-config/main.ts deleted file mode 100644 index 7763d6a2..00000000 --- a/configs/ts-config/main.ts +++ /dev/null @@ -1 +0,0 @@ -console.log('this is test'); diff --git a/configs/ts-config/package.json b/configs/ts-config/package.json deleted file mode 100644 index 651b24d7..00000000 --- a/configs/ts-config/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "private": true, - "name": "@configs/ts-config", - "version": "1.0.0", - "description": "ts configuration", - "license": "MIT", - "main": "index.js", - "files": [ - "tsconfig.json" - ], - "devDependencies": { - "typescript": "^5", - "@types/node": "^18.13.0", - "cross-env": "^7.0.3", - "@total-typescript/ts-reset": "^0.5.1" - } -} diff --git a/configs/ts-config/reset.d.ts b/configs/ts-config/reset.d.ts deleted file mode 100644 index faedef42..00000000 --- a/configs/ts-config/reset.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Do not add any other lines of code to this file! -import '@total-typescript/ts-reset'; diff --git a/configs/ts-config/tsconfig.json b/configs/ts-config/tsconfig.json deleted file mode 100644 index 88ed1948..00000000 --- a/configs/ts-config/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "compilerOptions": {}, - "exclude": ["node_modules"], - "include": ["./reset.d.ts"] -} diff --git a/configs/vitest-config/README.md b/configs/vitest-config/README.md deleted file mode 100644 index 62e12182..00000000 --- a/configs/vitest-config/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# vitest-config - -Usage: - -First, add `"@configs/vitest-config": "workspace:*"` to the `package.json` devDependencies: - -```json -{ - "devDependencies": { - "@configs/vitest-config": "workspace:*" - } -} -``` - -And add the below to the scripts - -```json -{ - "scripts": { - "test": "vitest", - "test:ui": "vitest --ui", - "test:run": "vitest run" - } -} -``` diff --git a/configs/vitest-config/package.json b/configs/vitest-config/package.json deleted file mode 100644 index 2bd98392..00000000 --- a/configs/vitest-config/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "private": true, - "name": "@configs/vitest-config", - "description": "vitest config", - "version": "1.0.0", - "devDependencies": { - "vitest": "^1.0.1", - "@vitest/ui": "^1.0.1", - "@vitejs/plugin-react": "^4.2.1", - "@testing-library/react": "^14.1.2", - "jsdom": "^23.0.1" - }, - "license": "MIT" -} diff --git a/configs/vitest-config/tsconfig.json b/configs/vitest-config/tsconfig.json deleted file mode 100644 index 4ec45702..00000000 --- a/configs/vitest-config/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "compilerOptions": { - "experimentalDecorators": true, - "emitDecoratorMetadata": true - }, - "exclude": ["node_modules"] -} diff --git a/configs/vitest-config/vitest.config.ts b/configs/vitest-config/vitest.config.ts deleted file mode 100644 index 32df03f2..00000000 --- a/configs/vitest-config/vitest.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -/// - -import react from '@vitejs/plugin-react'; -import { defineConfig } from 'vitest/config'; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], - test: { - environment: 'jsdom', - }, -}); diff --git a/e2e-tests/global-setup.js b/e2e-tests/global-setup.js new file mode 100644 index 00000000..2d5e9939 --- /dev/null +++ b/e2e-tests/global-setup.js @@ -0,0 +1,14 @@ +// tests/global-setup.js +import { spawn } from 'child_process'; + +let backend; + +export default async function globalSetup() { + backend = spawn('pnpm', ['--filter=server-example', 'dev'], { stdio: 'inherit', shell: true }); + + // wait until server is ready + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // save PID so teardown can kill it + return { backendPid: backend.pid }; +} diff --git a/e2e-tests/global-teardown.js b/e2e-tests/global-teardown.js new file mode 100644 index 00000000..442df0e6 --- /dev/null +++ b/e2e-tests/global-teardown.js @@ -0,0 +1,12 @@ +import { execSync } from 'child_process'; + +export default async function globalTeardown(config) { + const pid = config.global?.backendPid; + if (pid) { + try { + process.kill(-pid, 'SIGTERM'); + } catch (e) { + console.warn('Failed to kill server process', e); + } + } +} diff --git a/e2e-tests/react-query.spec.ts b/e2e-tests/react-query.spec.ts new file mode 100644 index 00000000..62b3538c --- /dev/null +++ b/e2e-tests/react-query.spec.ts @@ -0,0 +1,107 @@ +import { test, expect } from '@playwright/test'; + +test.describe('@tanstack/*-query E2E Todo Page tests', () => { + test.beforeEach(async ({ page }) => { + // go to page + await page.goto('/react-query-e2e'); + await page.waitForTimeout(260); + + await page.click('#delete-all-todos'); + await page.waitForTimeout(260); + }); + + test('should has zero todos', async ({ page }) => { + await expect(page.locator('.todo-item')).toHaveCount(0); + }); + + test('should add todo and show it', async ({ page }) => { + await page.click('#add-todo'); + + await expect(page.locator('.todo-item')).toHaveCount(0); + await page.click('#query-todo'); + await page.waitForTimeout(260); + + // wait for todo list to update + await expect(page.locator('.todo-item')).toHaveCount(1); + await expect(page.locator('.todo-item')).toContainText('This is test'); + }); + + test('should delete todo', async ({ page }) => { + await page.click('#add-todo'); + + await page.click('#query-todo'); + await page.waitForTimeout(260); + + await expect(page.locator('.todo-item')).toHaveCount(1); + + await page.click('#delete-todo'); + + await page.click('#query-todo'); + await page.waitForTimeout(260); + + await expect(page.locator('.todo-item')).toHaveCount(0); + }); + + test('should manually query (refresh) todos', async ({ page }) => { + await page.click('#add-todo'); + await page.click('#query-todo'); + await page.waitForTimeout(260); + + await expect(page.locator('.todo-item')).toHaveCount(1); + + // clear backend manually (optional, simulate server state) + // then trigger query refresh + await page.click('#query-todo'); + await page.waitForTimeout(260); + + // verify still one item since backend didn't change + await expect(page.locator('.todo-item')).toHaveCount(1); + }); + + test('should not query when disabled', async ({ page }) => { + // disable query + await page.click('#toggle-enabled'); + + // should hide list or not update + const initialCount = await page.locator('.todo-item').count(); + await page.click('#add-todo'); + // click query button, expect no change + await page.click('#query-todo'); + await page.waitForTimeout(260); + await expect(page.locator('.todo-item')).toHaveCount(initialCount); + + await page.click('#toggle-enabled'); + await page.click('#query-todo'); + await page.waitForTimeout(260); + await expect(page.locator('.todo-item')).toHaveCount(1); + }); + + test('should refetch on window focus', async ({ page, context }) => { + // Add todo first + await page.click('#add-todo'); + await expect(page.locator('.todo-item')).toHaveCount(0); + await page.waitForTimeout(100); + + // Simulate leaving page + const newPage = await context.newPage(); + await newPage.goto('about:blank'); + // Wait a bit to ensure focus is lost + await page.waitForTimeout(100); + + // Back to main page (regain focus) + await newPage.close(); + await page.bringToFront(); + await page.click('#query-todo'); + // wait for *-query + await page.waitForTimeout(500); + + // Simulate actual browser focus/visibility events + await page.evaluate(() => { + window.dispatchEvent(new Event('focus')); + document.dispatchEvent(new Event('visibilitychange')); + }); + + // Expect refetch updated list + await expect(page.locator('.todo-item')).toContainText('This is test'); + }); +}); diff --git a/e2e-tests/swr.spec.ts.ts b/e2e-tests/swr.spec.ts.ts new file mode 100644 index 00000000..ad07d510 --- /dev/null +++ b/e2e-tests/swr.spec.ts.ts @@ -0,0 +1,104 @@ +import { test, expect } from '@playwright/test'; + +test.describe('SWR E2E Todo Page', () => { + test.beforeEach(async ({ page }) => { + // go to page + await page.goto('/swr-e2e'); + await page.waitForTimeout(260); + + await page.click('#delete-all-todos'); + await page.waitForTimeout(260); + }); + + test('should has zero todos', async ({ page }) => { + await expect(page.locator('.todo-item')).toHaveCount(0); + }); + + test('should add todo and show it', async ({ page }) => { + await page.click('#add-todo'); + + await expect(page.locator('.todo-item')).toHaveCount(0); + await page.click('#query-todo'); + await page.waitForTimeout(260); + + // wait for todo list to update + await expect(page.locator('.todo-item')).toHaveCount(1); + await expect(page.locator('.todo-item')).toContainText('This is test'); + }); + + test('should delete todo', async ({ page }) => { + await page.click('#add-todo'); + + await page.click('#query-todo'); + await page.waitForTimeout(260); + + await expect(page.locator('.todo-item')).toHaveCount(1); + + await page.click('#delete-todo'); + + await page.click('#query-todo'); + await page.waitForTimeout(260); + + await expect(page.locator('.todo-item')).toHaveCount(0); + }); + + test('should manually query (refresh) todos', async ({ page }) => { + await page.click('#add-todo'); + await page.click('#query-todo'); + await page.waitForTimeout(260); + + await expect(page.locator('.todo-item')).toHaveCount(1); + + // clear backend manually (optional, simulate server state) + // then trigger query refresh + await page.click('#query-todo'); + await page.waitForTimeout(260); + + // verify still one item since backend didn't change + await expect(page.locator('.todo-item')).toHaveCount(1); + }); + + test('should not query when disabled', async ({ page }) => { + // disable query + await page.click('#toggle-enabled'); + + // should hide list or not update + const initialCount = await page.locator('.todo-item').count(); + await page.click('#add-todo'); + // click query button, expect no change + await page.click('#query-todo'); + await page.waitForTimeout(260); + await expect(page.locator('.todo-item')).toHaveCount(initialCount); + + await page.click('#toggle-enabled'); + await page.click('#query-todo'); + await page.waitForTimeout(260); + await expect(page.locator('.todo-item')).toHaveCount(1); + }); + + test('should refetch on window focus', async ({ page, context }) => { + // Add todo first + await page.click('#add-todo'); + await expect(page.locator('.todo-item')).toHaveCount(0); + + // Simulate leaving page + const newPage = await context.newPage(); + await newPage.goto('about:blank'); + + // Back to main page (regain focus) + await newPage.close(); + await page.bringToFront(); + + // Simulate actual browser focus/visibility events + await page.evaluate(() => { + window.dispatchEvent(new Event('focus')); + document.dispatchEvent(new Event('visibilitychange')); + }); + + // wait for SWR/react-query to react + await page.waitForTimeout(260); + + // Expect refetch updated list + await expect(page.locator('.todo-item')).toContainText('This is test'); + }); +}); diff --git a/e2e-tests/tan-query.spec.ts b/e2e-tests/tan-query.spec.ts new file mode 100644 index 00000000..f22f6640 --- /dev/null +++ b/e2e-tests/tan-query.spec.ts @@ -0,0 +1,107 @@ +import { test, expect } from '@playwright/test'; + +test.describe('@tanstack/tanstack-query E2E Todo Page tests', () => { + test.beforeEach(async ({ page }) => { + // go to page + await page.goto('/'); + await page.waitForTimeout(260); + + await page.click('#delete-all-todos'); + await page.waitForTimeout(260); + }); + + test('should has zero todos', async ({ page }) => { + await expect(page.locator('.todo-item')).toHaveCount(0); + }); + + test('should add todo and show it', async ({ page }) => { + await page.click('#add-todo'); + + await expect(page.locator('.todo-item')).toHaveCount(0); + await page.click('#query-todo'); + await page.waitForTimeout(260); + + // wait for todo list to update + await expect(page.locator('.todo-item')).toHaveCount(1); + await expect(page.locator('.todo-item')).toContainText('This is test'); + }); + + test('should delete todo', async ({ page }) => { + await page.click('#add-todo'); + + await page.click('#query-todo'); + await page.waitForTimeout(260); + + await expect(page.locator('.todo-item')).toHaveCount(1); + + await page.click('#delete-todo'); + + await page.click('#query-todo'); + await page.waitForTimeout(260); + + await expect(page.locator('.todo-item')).toHaveCount(0); + }); + + test('should manually query (refresh) todos', async ({ page }) => { + await page.click('#add-todo'); + await page.click('#query-todo'); + await page.waitForTimeout(260); + + await expect(page.locator('.todo-item')).toHaveCount(1); + + // clear backend manually (optional, simulate server state) + // then trigger query refresh + await page.click('#query-todo'); + await page.waitForTimeout(260); + + // verify still one item since backend didn't change + await expect(page.locator('.todo-item')).toHaveCount(1); + }); + + test('should not query when disabled', async ({ page }) => { + // disable query + await page.click('#toggle-enabled'); + + // should hide list or not update + const initialCount = await page.locator('.todo-item').count(); + await page.click('#add-todo'); + // click query button, expect no change + await page.click('#query-todo'); + await page.waitForTimeout(260); + await expect(page.locator('.todo-item')).toHaveCount(initialCount); + + await page.click('#toggle-enabled'); + await page.click('#query-todo'); + await page.waitForTimeout(260); + await expect(page.locator('.todo-item')).toHaveCount(1); + }); + + test('should refetch on window focus', async ({ page, context }) => { + // Add todo first + await page.click('#add-todo'); + await expect(page.locator('.todo-item')).toHaveCount(0); + await page.waitForTimeout(100); + + // Simulate leaving page + const newPage = await context.newPage(); + await newPage.goto('about:blank'); + // Wait a bit to ensure focus is lost + await page.waitForTimeout(100); + + // Back to main page (regain focus) + await newPage.close(); + await page.bringToFront(); + await page.click('#query-todo'); + // wait for *-query + await page.waitForTimeout(500); + + // Simulate actual browser focus/visibility events + await page.evaluate(() => { + window.dispatchEvent(new Event('focus')); + document.dispatchEvent(new Event('visibilitychange')); + }); + + // Expect refetch updated list + await expect(page.locator('.todo-item')).toContainText('This is test'); + }); +}); diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..b8d6f8bc --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,22 @@ +import js from '@eslint/js'; +// import globals from 'globals'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, , ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + // globals: globals.browser, + }, + plugins: {}, + rules: { + '@typescript-eslint/no-unused-vars': 'warn', + '@typescript-eslint/ban-ts-comment': 'warn', + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-require-imports': 'warn', + }, + } +); diff --git a/examples/server/.gitignore b/examples/server/.gitignore index 6ce5c17b..e22b2d70 100644 --- a/examples/server/.gitignore +++ b/examples/server/.gitignore @@ -13,5 +13,5 @@ build-* *.db-shm *.db-wal *.sqlite -packages/fe-sdk-demo/* -!packages/fe-sdk-demo/package.json +fe-sdk-demo/* +!fe-sdk-demo/package.json diff --git a/examples/server/fe-sdk-demo/package.json b/examples/server/fe-sdk-demo/package.json new file mode 100644 index 00000000..1cdb3eed --- /dev/null +++ b/examples/server/fe-sdk-demo/package.json @@ -0,0 +1,48 @@ +{ + "name": "fe-sdk-demo", + "version": "1.0.0", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "require": "./lib/index.js", + "scripts": { + "tsc:build": "concurrently \"npm run tsc:build:cjs\" \"npm run tsc:build:esm\"", + "tsc:build:cjs": "tsc --project tsconfig.json", + "tsc:build:esm": "tsc --project tsconfig.esm.json", + "doc:build": "typedoc --customJs popover.js src/**.ts", + "serve": "serve docs" + }, + "dependencies": { + "axios": "^1.13.2", + "xior": "^0.8.3", + "kysely": "^0.28.9", + "zod": "^4", + "swr": "^2.3.8", + "@tanstack/react-query": "^5.90.19", + "@tanstack/vue-query": "^5.92.8", + "@tanstack/solid-query": "^5.90.22", + "@tanstack/svelte-query": "^6.0.17", + "i18next": "^23.10.1", + "intl-pluralrules": "^2.0.1" + }, + "devDependencies": { + "typescript": "^5.9.3", + "typedoc": "^0.28.16", + "concurrently": "^9.2.1", + "@standard-schema/spec": "^1.1.0" + }, + "peerDependencies": { + "socket.io-client": "^4.8.3" + }, + "peerDependenciesMeta": { + "socket.io-client": { + "optional": true + } + }, + "files": [ + "lib", + "esm", + "src", + "tsconfig.json", + "tsconfig.esm.json" + ] +} diff --git a/examples/server/package.json b/examples/server/package.json index a3307d12..8f9d47e6 100644 --- a/examples/server/package.json +++ b/examples/server/package.json @@ -4,7 +4,7 @@ "description": "Server development example, `tsdk` export `fe-sdk-demo` package.", "version": "1.0.0", "scripts": { - "build": "node ./node_modules/tsdk/bin/tsdk.js --nest build all && pnpm sync", + "build": "node ../../packages/tsdk/bin/tsdk.js --nest build all && pnpm sync", "example": "cross-env IS_TEST=true node dist-projects/dist-express-todo/main && npm run test", "serve": "node dist-projects/dist-express-todo/main", "dev": "nest start express-todo --watch", @@ -12,54 +12,50 @@ "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", - "sync-sdk": "npx tsdk --sync", - "sync": "node ./node_modules/tsdk/bin/tsdk.js --sync", - "test": "cross-env NODE_ENV=test TS_CONFIG_PATHS=true ts-mocha -p tsconfig.json src/**/*.test.ts --parallel --timeout 30000", - "lint": "eslint . --ext .ts,.tsx --fix", - "checktype": "tsc --noEmit" + "sync-sdk": "node ../../packages/tsdk/bin/tsdk.js --sync --build", + "sync": "node ../../packages/tsdk/bin/tsdk.js --sync --build", + "bun:sync": "bun ../../packages/tsdk/bin/tsdk.js --sync --build", + "test": "vitest --run ./src/", + "lint": "eslint . --ext .ts,.tsx --fix ./src", + "checktype": "tsc --noEmit", + "build-sdk": "tsdk --sync --build", + "watch-sdk": "tsdk --watch --no-verbose" }, "dependencies": { "tsdk-server-adapters": "workspace:*", - "better-sqlite3": "^9.0.0", - "bufferutil": "^4.0.7", - "change-case": "^4.1.2", + "better-sqlite3": "12.5.0", + "bufferutil": "^4.1.0", "cors": "^2.8.5", - "express": "^4.21.0", - "reflect-metadata": "^0.2.1", - "socket.io": "^4.8.0", - "typeorm": "^0.3.20", - "kysely": "^0.27.5", + "express": "^5.1.0", + "reflect-metadata": "^0.2.2", + "socket.io": "^4.8.3", + "typeorm": "^0.3.28", + "kysely": "^0.28.9", "typeorm-cursor-pagination": "^0.10.1", - "utf-8-validate": "^6.0.3", - "ws": "^8.13.0", - "zod": "^3.23.8", - "hono": "^4.6.2", - "fastify": "^5.0.0", - "@fastify/express": "^3.0.0", - "@hono/node-server": "^1.11.1", + "ws": "^8.18.3", + "zod": "^4", + "hono": "^4.11.3", + "fastify": "^5.6.2", + "@fastify/express": "^4.0.2", + "@hono/node-server": "^1.19.7", "i18next": "^23.15.1", - "intl-pluralrules": "^2.0.1" + "intl-pluralrules": "^2.0.1", + "@standard-schema/spec": "^1.1.0" }, "devDependencies": { - "@configs/test-config": "workspace:*", - "@configs/ts-config": "workspace:*", - "@configs/eslint-config": "workspace:*", - "@nestjs/cli": "^10.3.2", - "@types/express": "^4.17.21", + "@nestjs/cli": "11.0.16", + "@types/express": "^5.0.3", "@types/ws": "^8.5.5", - "socket.io-client": "^4.8.0", - "tsdk": "workspace:*" - }, - "eslintConfig": { - "extends": [ - "@configs/eslint-config/node" - ], - "rules": { - "@typescript-eslint/no-useless-constructor": 0 - }, - "ignorePatterns": [ - "node_modules" - ] + "socket.io-client": "^4.8.1", + "tsdk": "workspace:*", + "vitest": "^3.2.4", + "cross-env": "^7.0.3", + "vite-tsconfig-paths": "^5.1.4", + "unplugin-swc": "^1.5.5", + "fs-extra": "^11.3.0", + "webpack": "^5.102.1", + "typescript": "^5.9.3", + "webpack-node-externals": "^3.0.0" }, "license": "MIT" } \ No newline at end of file diff --git a/examples/server/packages/fe-sdk-demo/package.json b/examples/server/packages/fe-sdk-demo/package.json deleted file mode 100644 index 54f8db8b..00000000 --- a/examples/server/packages/fe-sdk-demo/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "fe-sdk-demo", - "version": "1.0.0", - "main": "lib/index.js", - "scripts": { - "tsc:build": "tsc --project tsconfig.json", - "doc:build": "typedoc src/**.ts --plugin ./hover.mjs && node write-popover.mjs", - "serve": "serve docs" - }, - "dependencies": { - "zod": "^3.24.1", - "axios": "^1.7.9", - "xior": "^0.6.1", - "change-case": "^4.1.2", - "kysely": "^0.27.5", - "@tanstack/react-query": "^5.56.2", - "i18next": "^23.10.1", - "intl-pluralrules": "^2.0.1" - }, - "devDependencies": { - "typescript": "^5", - "typedoc": "^0.27.6", - "@tsconfig/recommended": "^1.0.8" - }, - "peerDependencies": { - "socket.io-client": "^4.8.0" - }, - "peerDependenciesMeta": { - "socket.io-client": { - "optional": true - } - }, - "files": [ - "lib", - "src" - ] -} diff --git a/examples/server/src/i18n/index.ts b/examples/server/src/i18n/index.ts index 4c4dfca0..89e15730 100644 --- a/examples/server/src/i18n/index.ts +++ b/examples/server/src/i18n/index.ts @@ -1,10 +1,10 @@ import 'intl-pluralrules'; -import i18next from 'i18next'; +import i18next, { i18n as I18n } from 'i18next'; import helloJSON from './index.json'; const translation = helloJSON; -export const i18n = i18next.createInstance( +export const i18n: I18n = i18next.createInstance( { fallbackLng: 'en', debug: true, diff --git a/examples/server/src/modules/core/apiconf/GetConfig.apiconf.ts b/examples/server/src/modules/core/apiconf/GetConfig.apiconf.ts index b08c6a4c..7d6b747c 100644 --- a/examples/server/src/modules/core/apiconf/GetConfig.apiconf.ts +++ b/examples/server/src/modules/core/apiconf/GetConfig.apiconf.ts @@ -1,4 +1,4 @@ -import { transformPath, APIConfig } from '@/src/shared/tsdk-helper'; +import { transformPath, APIConfig } from '@/src/tsdk-shared/helpers'; /** * get server configs for client ({@link APIConfig}) @@ -6,11 +6,9 @@ import { transformPath, APIConfig } from '@/src/shared/tsdk-helper'; */ export const GetConfigsConfig: APIConfig = { type: 'common', - + category: 'test', method: 'get', path: transformPath('GetConfigs'), - description: 'get server configs for client', - category: 'core', }; /** * diff --git a/examples/server/src/modules/core/apiconf/TestParams.apiconf.ts b/examples/server/src/modules/core/apiconf/TestParams.apiconf.ts index bf071598..25b08fb9 100644 --- a/examples/server/src/modules/core/apiconf/TestParams.apiconf.ts +++ b/examples/server/src/modules/core/apiconf/TestParams.apiconf.ts @@ -1,6 +1,6 @@ -import * as z from 'zod'; +import { z } from 'zod'; -import { transformPath, APIConfig, ObjectLiteral } from '@/src/shared/tsdk-helper'; +import { transformPath, APIConfig } from '@/src/tsdk-shared/helpers'; /** * Test path params ({@link APIConfig}) @@ -10,8 +10,6 @@ export const TestPathParamsConfig: APIConfig = { type: 'user', method: 'get', path: transformPath('TestPathParams') + '/:a/b/:c', - description: 'Test path params', - category: 'test', paramsInUrl: ':', }; /** diff --git a/examples/server/src/modules/express-todo/main.ts b/examples/server/src/modules/express-todo/main.ts index be10daf9..2d6281ac 100644 --- a/examples/server/src/modules/express-todo/main.ts +++ b/examples/server/src/modules/express-todo/main.ts @@ -4,13 +4,15 @@ import http from 'http'; import { Server } from 'socket.io'; import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; import { socketIOAdapterFactory } from 'tsdk-server-adapters/lib/socket.io-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; +// import { socketIOAdapterFactory } from 'tsdk-server-adapters/esm/socket.io-adapter'; import { setupRoutes } from '../setup-routes'; import { routeBus } from '../todo/gen-route'; import { RequestInfo } from '../todo/types'; import { initializeDataSources } from '@/src/db'; -import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; +import { checkMethodHasBody, ProtocolTypes } from '@/src/tsdk-shared/helpers'; const port = 3012; @@ -92,7 +94,7 @@ const port = 3012; return reqInfo.type; }, getData(data) { - // maybe decode here?(e.g.: decryption) + // maybe decode data here?(e.g.: decryption) return data; }, protocolType: ProtocolTypes, diff --git a/examples/server/src/modules/fastify-todo/main.ts b/examples/server/src/modules/fastify-todo/main.ts index 642069b1..30ec8d02 100644 --- a/examples/server/src/modules/fastify-todo/main.ts +++ b/examples/server/src/modules/fastify-todo/main.ts @@ -1,16 +1,19 @@ import fastifyExpress from '@fastify/express'; import Fastify from 'fastify'; +import express from 'express'; import http from 'http'; import { Server } from 'socket.io'; import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; import { socketIOAdapterFactory } from 'tsdk-server-adapters/lib/socket.io-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; +// import { socketIOAdapterFactory } from 'tsdk-server-adapters/esm/socket.io-adapter'; import { setupRoutes } from '../setup-routes'; import { routeBus } from '../todo/gen-route'; import { RequestInfo } from '../todo/types'; import { initializeDataSources } from '@/src/db'; -import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; +import { checkMethodHasBody, ProtocolTypes } from '@/src/tsdk-shared/helpers'; const port = 3014; @@ -32,6 +35,9 @@ const port = 3014; const app = Fastify({ serverFactory }); await app.register(fastifyExpress); + + app.use(express.json()); + app.use(express.urlencoded({ extended: true })); app.use((req, res, next) => { res.setHeader('X-Powered-By', 'tsdk'); next(); diff --git a/examples/server/src/modules/hono-todo/main.ts b/examples/server/src/modules/hono-todo/main.ts index a9e8a138..0ca44d19 100644 --- a/examples/server/src/modules/hono-todo/main.ts +++ b/examples/server/src/modules/hono-todo/main.ts @@ -2,13 +2,14 @@ import { serve } from '@hono/node-server'; import { Hono, HonoRequest } from 'hono'; import { cors } from 'hono/cors'; import { honoAdapterFactory } from 'tsdk-server-adapters/lib/hono-adapter'; +// import { honoAdapterFactory } from 'tsdk-server-adapters/esm/hono-adapter'; import { setupRoutes } from '../setup-routes'; import { routeBus } from '../todo/gen-route'; import { RequestInfo } from '../todo/types'; import { initializeDataSources } from '@/src/db'; -import { checkMethodHasBody } from '@/src/shared/tsdk-helper'; +import { checkMethodHasBody } from '@/src/tsdk-shared/helpers'; const port = 3013; @@ -39,7 +40,7 @@ const port = 3013; ip: '', lang: 'zh-CN', type: (req.param() as { type: string }).type, - token: req.header['authorization'], + token: req.header('authorization'), }; return params; }, @@ -47,8 +48,30 @@ const port = 3013; return reqInfo.type; }, async getData(req: HonoRequest) { - // maybe decode here?(e.g.: decryption) - return checkMethodHasBody(req.method) ? req.raw.body : req.query(); + if (!checkMethodHasBody(req.method)) { + return req.query(); + } + const contentType = req.header('content-type') || ''; + try { + if (contentType.includes('application/json')) { + const bodyText = await req.text(); // Read raw body first + + if (!bodyText.trim()) { + return null; // Handle empty JSON body + } + + return JSON.parse(bodyText); // Manually parse to catch errors + } else if (contentType.includes('text/plain')) { + return await req.text(); + } else if ( + contentType.includes('multipart/form-data') || + contentType.includes('application/x-www-form-urlencoded') + ) { + return await req.parseBody(); + } + } catch (error) { + return null; // Gracefully handle unexpected errors + } }, }) ); diff --git a/examples/server/src/modules/kysely-todo/index.ts b/examples/server/src/modules/kysely-todo/index.ts index b97dd90d..160d1aa2 100644 --- a/examples/server/src/modules/kysely-todo/index.ts +++ b/examples/server/src/modules/kysely-todo/index.ts @@ -38,8 +38,4 @@ async function demo() { .select(['first_name', 'pet.name as pet_name']) .where('person.id', '=', id) .executeTakeFirst(); - - if (person) { - person.pet_name; - } } diff --git a/examples/server/src/modules/todo/Todo.entity.ts b/examples/server/src/modules/todo/Todo.entity.ts index 9596e9fe..8da9fceb 100644 --- a/examples/server/src/modules/todo/Todo.entity.ts +++ b/examples/server/src/modules/todo/Todo.entity.ts @@ -24,7 +24,7 @@ export class Todo extends CreatedUpdatedAt { /** title */ title: string; - @Column() + @Column({ type: 'text' }) /** status */ status: TodoStatus; diff --git a/examples/server/src/modules/todo/Todo.service.ts b/examples/server/src/modules/todo/Todo.service.ts index 75ae563c..f41ad215 100644 --- a/examples/server/src/modules/todo/Todo.service.ts +++ b/examples/server/src/modules/todo/Todo.service.ts @@ -1,4 +1,4 @@ -import { Like } from 'typeorm'; +import { DataSource, Like } from 'typeorm'; import { buildPaginator } from 'typeorm-cursor-pagination'; import { Todo } from './Todo.entity'; @@ -11,14 +11,13 @@ import { ReadonlyRequestInfo } from './types'; import { appDataSource } from '@/src/db'; -export default class TodoService { +export class TodoService { private static instance: TodoService; - static getInstance() { - if (!TodoService.instance) { - TodoService.instance = new TodoService(); - } - return TodoService.instance; + db: DataSource; + + constructor(dbSource: DataSource) { + this.db = dbSource; } get todoRepo() { @@ -111,4 +110,4 @@ export default class TodoService { } } -export const todoService = TodoService.getInstance(); +export const todoService = new TodoService(appDataSource); diff --git a/examples/server/src/modules/todo/apiconf/AddTodo.apiconf.ts b/examples/server/src/modules/todo/apiconf/AddTodo.apiconf.ts index 038aa7f6..24457c21 100644 --- a/examples/server/src/modules/todo/apiconf/AddTodo.apiconf.ts +++ b/examples/server/src/modules/todo/apiconf/AddTodo.apiconf.ts @@ -1,17 +1,45 @@ +import { InsertResult } from '@/src/shared/types'; import type { Todo } from '../Todo.entity'; import { addTodoSchema } from './TodoSchema.shared'; -import { InsertResult, transformPath, APIConfig } from '@/src/shared/tsdk-helper'; +import { transformPath, APIConfig } from '@/src/tsdk-shared/helpers'; export const AddTodoConfig: APIConfig = { type: 'user', path: transformPath('AddTodo'), method: 'post', - description: 'add todo', - category: 'todo', schema: addTodoSchema, }; export type AddTodoReq = Omit; export type AddTodoRes = InsertResult; + +// For `type: 'admin'` test only +export const AddTodo2Config: APIConfig = { + type: 'admin', + /** import a from 'xx' */ + path: transformPath('AddTodo2'), + /** + * + * import a from 'xx' + * import { a + * b, + * } from "xx" + */ + method: 'post', +}; + +export type AddTodo2Req = Omit & { + /** Namespace to import repo into */ + new_namespace?: string; +}; + +/** + * + * import a from 'xx' + * import { a + * b, + * } from "xx" + */ +export type AddTodo2Res = InsertResult; diff --git a/examples/server/src/modules/todo/apiconf/DeleteTodo.apiconf.ts b/examples/server/src/modules/todo/apiconf/DeleteTodo.apiconf.ts index e7f29bf1..2fd97af9 100644 --- a/examples/server/src/modules/todo/apiconf/DeleteTodo.apiconf.ts +++ b/examples/server/src/modules/todo/apiconf/DeleteTodo.apiconf.ts @@ -1,17 +1,16 @@ -import { transformPath } from '/src/shared/tsdk-helper'; +import { transformPath } from '/src/tsdk-shared/helpers'; import type { Todo } from '../Todo.entity'; import { deleteTodoSchema } from './TodoSchema.shared'; -import { APIConfig, DeleteResult, RequireOnlyOne } from '@/src/shared/tsdk-helper'; +import { APIConfig } from '@/src/tsdk-shared/helpers'; +import { RequireOnlyOne, DeleteResult } from '@/src/shared/types'; export const DeleteTodoConfig: APIConfig = { type: 'user', path: transformPath('DeleteTodo'), method: 'post', - description: 'delete todo', - category: 'todo', schema: deleteTodoSchema, }; diff --git a/examples/server/src/modules/todo/apiconf/QueryTodo.apiconf.ts b/examples/server/src/modules/todo/apiconf/QueryTodo.apiconf.ts index 66674a10..3fecedb6 100644 --- a/examples/server/src/modules/todo/apiconf/QueryTodo.apiconf.ts +++ b/examples/server/src/modules/todo/apiconf/QueryTodo.apiconf.ts @@ -2,14 +2,12 @@ import type { Todo } from '../Todo.entity'; import { queryTodoSchema } from './TodoSchema.shared'; import { Paging, PagingRes } from '@/src/shared/paging'; -import { APIConfig, transformPath } from '@/src/shared/tsdk-helper'; +import { APIConfig, transformPath } from '@/src/tsdk-shared/helpers'; export const QueryTodoConfig: APIConfig = { path: transformPath('QueryTodo'), method: 'get', - description: 'query todo', - category: 'todo', type: 'user', schema: queryTodoSchema, }; diff --git a/examples/server/src/modules/todo/apiconf/QueryTodoByCursor.apiconf.ts b/examples/server/src/modules/todo/apiconf/QueryTodoByCursor.apiconf.ts index 5699638d..5c3a267d 100644 --- a/examples/server/src/modules/todo/apiconf/QueryTodoByCursor.apiconf.ts +++ b/examples/server/src/modules/todo/apiconf/QueryTodoByCursor.apiconf.ts @@ -2,7 +2,7 @@ import type { Todo } from '../Todo.entity'; import { queryTodoByCursorSchema } from './TodoSchema.shared'; import { Paging, PagingRes } from '@/src/shared/paging'; -import { APIConfig, transformPath } from '@/src/shared/tsdk-helper'; +import { APIConfig, transformPath } from '@/src/tsdk-shared/helpers'; /** * query todo list by cursor ({@link APIConfig}) @@ -14,7 +14,6 @@ export const QueryTodoByCursorConfig: APIConfig = { method: 'get', path: transformPath('QueryTodoByCursor'), schema: queryTodoByCursorSchema, - description: 'query todo list by cursor', }; /** * diff --git a/examples/server/src/modules/todo/apiconf/TodoSchema.shared.ts b/examples/server/src/modules/todo/apiconf/TodoSchema.shared.ts index 0c430d25..17e486cb 100644 --- a/examples/server/src/modules/todo/apiconf/TodoSchema.shared.ts +++ b/examples/server/src/modules/todo/apiconf/TodoSchema.shared.ts @@ -1,4 +1,4 @@ -import * as z from 'zod'; +import { z } from 'zod'; import { TodoStatus } from '../Todo.entity'; @@ -31,7 +31,7 @@ export const updateTodoSchema = TodoSchema.omit({ id: true }) }) .refine( ({ id, ...rest }) => Object.values(rest).some((i) => i !== undefined), - (val) => ({ message: `One of the fields must be defined` }) + `One of the fields must be defined` ); export const deleteTodoSchema = TodoSchema.pick({ diff --git a/examples/server/src/modules/todo/apiconf/UpdateTodo.apiconf.ts b/examples/server/src/modules/todo/apiconf/UpdateTodo.apiconf.ts index 4e4de412..6ac7c726 100644 --- a/examples/server/src/modules/todo/apiconf/UpdateTodo.apiconf.ts +++ b/examples/server/src/modules/todo/apiconf/UpdateTodo.apiconf.ts @@ -1,20 +1,14 @@ import type { Todo } from '../Todo.entity'; import { updateTodoSchema } from './TodoSchema.shared'; -import { - APIConfig, - RequireAtLeastOne, - transformPath, - UpdateResult, -} from '@/src/shared/tsdk-helper'; +import { APIConfig, transformPath } from '@/src/tsdk-shared/helpers'; +import { RequireAtLeastOne, UpdateResult } from '@/src/shared/types'; export const UpdateTodoConfig: APIConfig = { type: 'user', path: transformPath('UpdateTodo'), method: 'post', - description: 'update todo', - category: 'todo', schema: updateTodoSchema, }; diff --git a/examples/server/src/modules/todo/gen-route.ts b/examples/server/src/modules/todo/gen-route.ts index 75c91664..0588fc3e 100644 --- a/examples/server/src/modules/todo/gen-route.ts +++ b/examples/server/src/modules/todo/gen-route.ts @@ -1,28 +1,42 @@ import { genRouteFactory, getRouteEventName, Protocol } from 'tsdk-server-adapters'; import { TypeORMError, EntityNotFoundError } from 'typeorm'; -import { ZodError } from 'zod'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; import { RequestInfo } from './types'; -import { ProtocolTypes } from '@/src/shared/tsdk-helper'; -import { APIConfig } from '@/src/shared/tsdk-types'; +import { ProtocolTypes } from '@/src/tsdk-shared/helpers'; +import { APIConfig } from '@/src/tsdk-shared/types'; + +const middlewares = [langMiddleware, authMiddleware, rateLimitMiddleware]; +export const genRouteObj = genRouteFactory( + onErrorHandler, + ProtocolTypes, + middlewares +); + +export const routeBus = genRouteObj.routeBus; + +const genRoute = genRouteObj.genRoute; + +export { getRouteEventName, genRoute }; +export default genRoute; function onErrorHandler( e: Error, { protocol, send, msgId }: Parameters[0]>[1] ) { - if (e instanceof ZodError) { + if ((e as unknown as StandardSchemaV1.FailureResult)?.issues) { return send({ _id: msgId, status: 400, result: { - msg: e.issues, + msg: (e as unknown as StandardSchemaV1.FailureResult).issues, }, }); } - let status = 500, - msg = e.message; + let status = 500; + const msg = e.message; if (e instanceof AuthError) { status = 401; @@ -73,18 +87,3 @@ function rateLimitMiddleware(protocol: Protocol, apiConfig: APIConfig, reqInfo: // @todo return Promise.resolve(); } - -const middlewares = [langMiddleware, authMiddleware, rateLimitMiddleware]; -export const genRouteObj = genRouteFactory( - onErrorHandler, - ProtocolTypes, - middlewares -); - -export const routeBus = genRouteObj.routeBus; - -const genRoute = genRouteObj.genRoute; - -export { getRouteEventName }; - -export default genRoute; diff --git a/examples/server/src/modules/todo/tests/Todo.service.test.ts b/examples/server/src/modules/todo/tests/Todo.service.test.ts index cad132f3..c2bbbef1 100644 --- a/examples/server/src/modules/todo/tests/Todo.service.test.ts +++ b/examples/server/src/modules/todo/tests/Todo.service.test.ts @@ -1,15 +1,14 @@ -import { expect } from 'chai'; +import { expect, it, describe, beforeAll, afterAll, beforeEach, afterEach } from 'vitest'; +import { appDataSource } from '../../../db'; import { TodoStatus } from '../Todo.entity'; import { todoService } from '../Todo.service'; -import { appDataSource } from '@/src/db'; - -before(() => { +beforeAll(() => { return appDataSource.initialize(); }); -after(() => { +afterAll(() => { return appDataSource.destroy(); }); @@ -20,7 +19,8 @@ describe('appDataSource setup', () => { }); describe('Todo.service test', () => { - before('create 100 todos', () => { + // 'create 100 todos' + beforeAll(() => { return Promise.all( Array(100) .fill('todo') @@ -35,12 +35,11 @@ describe('Todo.service test', () => { ) ); }); - after('delete todos', async () => { + // 'delete todos' + afterAll(async () => { const { data } = await todoService.queryTodo({}, { type: 'admin', ip: '', lang: '' }); return Promise.all( - data.map((i) => - todoService.deleteTodo({ id: i.id } as any, { type: 'admin', ip: '', lang: '' }) - ) + data.map((i) => todoService.deleteTodo({ id: i.id }, { type: 'admin', ip: '', lang: '' })) ); }); @@ -52,14 +51,14 @@ describe('Todo.service test', () => { }); it('todoService.deleteTodo with `id` param should success', async () => { - await todoService.deleteTodo({ id: 1 } as any, { type: 'admin', ip: '', lang: '' }); + await todoService.deleteTodo({ id: 1 }, { type: 'admin', ip: '', lang: '' }); expect( (await todoService.queryTodo({}, { type: 'admin', ip: '', lang: '' })).data.length ).to.equal(99); }); it('todoService.deleteTodo with `IDs` param should success', async () => { - await todoService.deleteTodo({ IDs: [2, 3] } as any, { type: 'admin', ip: '', lang: '' }); + await todoService.deleteTodo({ IDs: [2, 3] }, { type: 'admin', ip: '', lang: '' }); expect( (await todoService.queryTodo({}, { type: 'admin', ip: '', lang: '' })).data.length ).to.equal(97); diff --git a/examples/server/src/modules/todo/tests/TodoSchema.test.ts b/examples/server/src/modules/todo/tests/TodoSchema.test.ts index 81c3a4a1..54cccdcb 100644 --- a/examples/server/src/modules/todo/tests/TodoSchema.test.ts +++ b/examples/server/src/modules/todo/tests/TodoSchema.test.ts @@ -1,9 +1,9 @@ -import { expect } from 'chai'; +import { expect, it, describe } from 'vitest'; import { TodoStatus } from '../Todo.entity'; import { addTodoSchema, updateTodoSchema, deleteTodoSchema } from '../apiconf/TodoSchema.shared'; -import { IDSchema } from '@/src/shared/utils'; +import { IDSchema } from '../../../shared/utils'; describe('TodoSchema tests', () => { describe('IDSchema tests', () => { diff --git a/examples/server/src/modules/todo/tests/sum.test.ts b/examples/server/src/modules/todo/tests/sum.test.ts index 0b6d02da..26205db9 100644 --- a/examples/server/src/modules/todo/tests/sum.test.ts +++ b/examples/server/src/modules/todo/tests/sum.test.ts @@ -1,36 +1,11 @@ import assert from 'assert'; -import { expect } from 'chai'; +import { expect, it, describe } from 'vitest'; -import { sum } from '@/src/shared/utils'; - -describe('hooks', function () { - before(function () { - // runs once before the first test in this block - }); - - after(function () { - // runs once after the last test in this block - }); - - beforeEach(function () { - // runs before each test in this block - }); - - afterEach(function () { - // runs after each test in this block - }); - // test cases -}); - -before('before', function before() { - console.log('process.env.NODE_ENV', process.env.NODE_ENV); -}); +import { sum } from '../../../shared/utils'; describe('Running TypeScript tests in ts-node runtime without compilation', () => { - describe('baseline app module', function () { - it('should return the same value that was passed', () => { - assert.equal(sum(1, 2), 3); - expect(sum(1, 1)).to.equal(2); - }); + it('should return the same value that was passed', () => { + assert.equal(sum(1, 2), 3); + expect(sum(1, 1)).to.equal(2); }); }); diff --git a/examples/server/src/modules/todo/types.ts b/examples/server/src/modules/todo/types.ts index ffdf95c4..a224ff5f 100644 --- a/examples/server/src/modules/todo/types.ts +++ b/examples/server/src/modules/todo/types.ts @@ -4,7 +4,7 @@ export interface GeneralParams { } export interface RequestInfo extends GeneralParams { - /** user or admin? */ + /** `user` or `admin` endpoints */ type: string; username?: string; userId?: number; diff --git a/examples/server/src/shared/paging.ts b/examples/server/src/shared/paging.ts index 7cba3887..b50653f8 100644 --- a/examples/server/src/shared/paging.ts +++ b/examples/server/src/shared/paging.ts @@ -1,4 +1,4 @@ -import * as z from 'zod'; +import { z } from 'zod'; import { PositiveNumberSchema } from '@/src/shared/utils'; diff --git a/examples/server/src/shared/tsdk-types.ts b/examples/server/src/shared/tsdk-types.ts deleted file mode 100644 index 7f4db595..00000000 --- a/examples/server/src/shared/tsdk-types.ts +++ /dev/null @@ -1,98 +0,0 @@ -import * as z from 'zod'; - -export interface APIConfig { - /** The API type. Like: user side or admin side, required. */ - type: 'user' | 'admin' | 'common'; - /** The API path */ - path: string; - method: 'get' | 'post' | 'head' | 'put' | 'delete' | 'options' | 'patch'; - /** Request data validate scheme */ - schema?: z.ZodTypeAny; - /** The API need auth? Default is false */ - needAuth?: boolean; - /** The API disabled? Default is false */ - disabled?: boolean; - /** The API description */ - description: string; - /** The API category */ - category?: string; - - /** custom headers for client */ - headers?: { [key: string]: any }; - /** is params in url, - * default undefined - * if `:`, will support `/api/:a/b/:c`, - * if `{}`, will support `/api/{a}/b/{c}`, - * and will replace with data with {a: 1, c: 2} to `/api/1/b/2` */ - paramsInUrl?: ':' | '{}'; - isGet?: boolean; -} - -export interface ObjectLiteral { - [key: string]: any; -} - -/** - * Result object returned by InsertQueryBuilder execution. - */ -export declare class InsertResult { - /** - * Contains inserted entity id. - * Has entity-like structure (not just column database name and values). - */ - identifiers: ObjectLiteral[]; - /** - * Generated values returned by a database. - * Has entity-like structure (not just column database name and values). - */ - generatedMaps: ObjectLiteral[]; - /** - * Raw SQL result returned by executed query. - */ - raw: any; -} - -export declare class UpdateResult { - /** - * Raw SQL result returned by executed query. - */ - raw: any; - /** - * Number of affected rows/documents - * Not all drivers support this - */ - affected?: number; - /** - * Contains inserted entity id. - * Has entity-like structure (not just column database name and values). - */ - /** - * Generated values returned by a database. - * Has entity-like structure (not just column database name and values). - */ - generatedMaps: ObjectLiteral[]; -} - -/** - * Result object returned by DeleteQueryBuilder execution. - */ -export declare class DeleteResult { - /** - * Raw SQL result returned by executed query. - */ - raw: any; - /** - * Number of affected rows/documents - * Not all drivers support this - */ - affected?: number | null; -} - -export type RequireAtLeastOne = { - [K in keyof T]-?: Required> & Partial>>; -}[keyof T]; - -export type RequireOnlyOne = Pick> & - { - [K in Keys]-?: Required> & Partial, undefined>>; - }[Keys]; diff --git a/packages/bench/src/shared/tsdk-types.ts b/examples/server/src/shared/types.ts similarity index 66% rename from packages/bench/src/shared/tsdk-types.ts rename to examples/server/src/shared/types.ts index 42f1a6cb..e40e95be 100644 --- a/packages/bench/src/shared/tsdk-types.ts +++ b/examples/server/src/shared/types.ts @@ -1,37 +1,3 @@ -import * as z from 'zod'; - -export const APITypes = { - user: 'user', - admin: 'admin', - common: 'common', -} as const; - -export const APITypesKey = Object.keys(APITypes).filter((item) => item !== APITypes.common); - -export type APIType = keyof typeof APITypes; - -export interface APIConfig { - /** The API type. Like: user side or admin side. */ - type: APIType; - /** The API path */ - path: string; - method: 'get' | 'post' | 'delete' | 'put' | 'patch' | 'head' | 'options'; - /** Request data validate scheme */ - schema?: z.ZodTypeAny; - /** The API need auth? Default is false */ - needAuth?: boolean; - /** The API disabled? Default is false */ - disabled?: boolean; - /** The API description */ - description: string; - /** The API category */ - category?: string; - - /** custom headers for client */ - headers?: { [key: string]: any }; - isGet?: boolean; -} - export interface ObjectLiteral { [key: string]: any; } diff --git a/examples/server/src/shared/utils.ts b/examples/server/src/shared/utils.ts index ebb24f36..fade8d79 100644 --- a/examples/server/src/shared/utils.ts +++ b/examples/server/src/shared/utils.ts @@ -1,4 +1,4 @@ -import * as z from 'zod'; +import { z } from 'zod'; /** * Math sum diff --git a/packages/tsdk/fe-sdk-template/src/shared/tsdk-helper.ts b/examples/server/src/tsdk-shared/helpers.ts similarity index 67% rename from packages/tsdk/fe-sdk-template/src/shared/tsdk-helper.ts rename to examples/server/src/tsdk-shared/helpers.ts index fb704fde..3dbee0eb 100644 --- a/packages/tsdk/fe-sdk-template/src/shared/tsdk-helper.ts +++ b/examples/server/src/tsdk-shared/helpers.ts @@ -1,6 +1,4 @@ -import { paramCase } from 'change-case'; - -export * from './tsdk-types'; +export * from './types'; export const hasBodyMethods: { [key: string]: boolean | undefined } = { post: true, @@ -16,6 +14,13 @@ export function transformPath(path: string) { return `/${paramCase(path)}`; } +export function paramCase(input: string): string { + return input + .replace(/([a-z0-9])([A-Z])/g, '$1-$2') // Add a hyphen between lower and upper case letters + .replace(/\s+/g, '-') // Replace spaces with hyphens + .toLowerCase(); // Convert all characters to lowercase +} + export function isObject(data: T) { const result = typeof data === 'object' && diff --git a/examples/server/src/tsdk-shared/types.ts b/examples/server/src/tsdk-shared/types.ts new file mode 100644 index 00000000..f2351860 --- /dev/null +++ b/examples/server/src/tsdk-shared/types.ts @@ -0,0 +1,43 @@ +import type { StandardSchemaV1 } from '@standard-schema/spec'; + +export const APITypes = { + user: 'user', + admin: 'admin', + common: 'common', +} as const; + +export const APITypesKey = Object.keys(APITypes).filter((item) => item !== APITypes.common); + +export type APIType = keyof typeof APITypes; +export interface APIConfig { + /** The API type, such as user-side or admin-side. Default is `user`. */ + type?: APIType; + /** The API path. */ + path: string; + /** The HTTP method. */ + method: 'get' | 'post' | 'delete' | 'put' | 'patch' | 'head' | 'options'; + /** Request data validation schema. */ + schema?: StandardSchemaV1; + category?: string; + /** Does the API require authentication? Default is `false`. */ + needAuth?: boolean; + /** Is the API disabled? Default is `false`. */ + disabled?: boolean; + /** Custom headers for the client. */ + headers?: { [key: string]: any }; + /** + * Are parameters included in the URL? Used for generating API SDK-based documentation. + * Default is `undefined`. + * - If `':'`, supports `/api/:a/b/:c`. + * - If `'{}'`, supports `/api/{a}/b/{c}`. + * Parameters will be replaced with data, e.g., `{ a: 1, c: 2 }` → `/api/1/b/2`. + */ + paramsInUrl?: ':' | '{}'; + /** Force the API to be treated as a data-fetching request, + * useful when backend APIs use `POST` for all requests. */ + isGet?: boolean; + /** Hook to process data before sending the request. */ + onRequest?: (data: any) => any | Promise; + /** Hook to process data after receiving the response. */ + onResponse?: (response: any) => any | Promise; +} diff --git a/examples/server/tsconfig.json b/examples/server/tsconfig.json index 643a9c20..6d0a6d01 100644 --- a/examples/server/tsconfig.json +++ b/examples/server/tsconfig.json @@ -19,5 +19,5 @@ "incremental": true, "skipLibCheck": true }, - "include": ["src", "../../configs/ts-config/reset.d.ts"] + "include": ["src"] } diff --git a/examples/server/tsdk.config.js b/examples/server/tsdk.config.js index 886938d5..e9228d72 100644 --- a/examples/server/tsdk.config.js +++ b/examples/server/tsdk.config.js @@ -1,21 +1,21 @@ /** @type {import('tsdk').TSDKConfig} */ module.exports = { - packageDir: 'packages/', + packageDir: './', packageName: 'fe-sdk-demo', baseDir: './src', monorepoRoot: '../../', entityLibName: ['typeorm', 'kysely'], + removeFields: ['schema', 'needAuth', 'type'], entityExt: 'entity', apiconfExt: 'apiconf', httpLib: 'xior', - sharedDirs: ['./src/shared', './src/i18n'], - dataHookLib: 'ReactQuery', + sharedDirs: ['./src/tsdk-shared', './src/shared', './src/i18n'], + dataHookLib: ['SWR', 'ReactQuery', 'VueQuery', 'SolidQuery', 'SvelteQuery'], + worker: true, + // moduleType: 'module', dependencies: { i18next: '^23.10.1', 'intl-pluralrules': '^2.0.1', - xior: '^0.6.1', - }, - scripts: { - 'tsc:build': 'tsc --project tsconfig.json', + xior: '^0.8.3', }, }; diff --git a/examples/server/vitest.config.mjs b/examples/server/vitest.config.mjs new file mode 100644 index 00000000..6af7b0dc --- /dev/null +++ b/examples/server/vitest.config.mjs @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config'; +import tsconfigPaths from 'vite-tsconfig-paths'; +import swc from 'unplugin-swc'; + +export default defineConfig({ + test: { + // You can add additional Vitest configuration options here + }, + plugins: [tsconfigPaths(), swc.vite()], +}); diff --git a/examples/solid-web/.gitignore b/examples/solid-web/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/examples/solid-web/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/solid-web/README.md b/examples/solid-web/README.md new file mode 100644 index 00000000..167c5679 --- /dev/null +++ b/examples/solid-web/README.md @@ -0,0 +1,28 @@ +## Usage + +```bash +$ npm install # or pnpm install or yarn install +``` + +### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs) + +## Available Scripts + +In the project directory, you can run: + +### `npm run dev` + +Runs the app in the development mode.
+Open [http://localhost:5173](http://localhost:5173) to view it in the browser. + +### `npm run build` + +Builds the app for production to the `dist` folder.
+It correctly bundles Solid in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.
+Your app is ready to be deployed! + +## Deployment + +Learn more about deploying your application with the [documentations](https://vite.dev/guide/static-deploy.html) diff --git a/examples/solid-web/index.html b/examples/solid-web/index.html new file mode 100644 index 00000000..c82ebe48 --- /dev/null +++ b/examples/solid-web/index.html @@ -0,0 +1,13 @@ + + + + + + + solid-web + + +
+ + + diff --git a/examples/solid-web/package.json b/examples/solid-web/package.json new file mode 100644 index 00000000..fc1aeebb --- /dev/null +++ b/examples/solid-web/package.json @@ -0,0 +1,24 @@ +{ + "name": "solid-web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --port 5176", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "solid-js": "^1.9.9", + "@tanstack/solid-query": "5.90.22", + "socket.io-client": "^4.8.3", + "xior": "^0.8.3" + }, + "devDependencies": { + "@types/node": "^24.6.0", + "typescript": "~5.9.3", + "vite": "^7.1.7", + "vite-plugin-solid": "^2.11.8", + "fe-sdk-demo": "workspace:*" + } +} diff --git a/examples/solid-web/public/vite.svg b/examples/solid-web/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/examples/solid-web/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/solid-web/src/App.css b/examples/solid-web/src/App.css new file mode 100644 index 00000000..613607d4 --- /dev/null +++ b/examples/solid-web/src/App.css @@ -0,0 +1,27 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.solid:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/examples/solid-web/src/App.tsx b/examples/solid-web/src/App.tsx new file mode 100644 index 00000000..c2f2338f --- /dev/null +++ b/examples/solid-web/src/App.tsx @@ -0,0 +1,8 @@ +import './App.css'; +import TodoComponent from './Todos'; + +function App() { + return ; +} + +export default App; diff --git a/examples/solid-web/src/Todos.tsx b/examples/solid-web/src/Todos.tsx new file mode 100644 index 00000000..e42bfb6c --- /dev/null +++ b/examples/solid-web/src/Todos.tsx @@ -0,0 +1,110 @@ +import { createSignal, createMemo, For } from 'solid-js'; +import { TodoStatus } from './api/user-api'; +import { useQueryTodo, useAddTodo, useDeleteTodo, setupUserApi } from './api/user-api-solidquery'; + +// Setup user API +setupUserApi(); + +function TodoComponent() { + // State + const [enabled, setEnabled] = createSignal(true); + + // Mutations and queries + const addTodoMutation = useAddTodo(); + const deleteTodoMutation = useDeleteTodo(); + const todosQuery = useQueryTodo( + {}, + { + refetchOnWindowFocus: 'always', + staleTime: 0, + get enabled() { + return enabled(); + }, + } + ); + + // Computed + const dataList = createMemo(() => todosQuery.data?.data || []); + + // Methods + const handleAddTodo = () => { + addTodoMutation.mutate({ + title: 'This is test', + status: TodoStatus.todo, + }); + }; + + const handleDeleteTodo = () => { + const list = dataList(); + if (list?.[0]) { + deleteTodoMutation.mutate({ id: list[0].id }); + } + }; + + const handleDeleteAllTodos = async () => { + const list = dataList(); + if (list) { + await Promise.all( + list.map((item) => { + return deleteTodoMutation.mutateAsync({ id: item.id }); + }) + ); + } + todosQuery.refetch(); + }; + + const handleQueryTodo = () => { + if (enabled()) todosQuery.refetch(); + }; + + const toggleEnabled = () => { + setEnabled(!enabled()); + }; + + const handleDeleteItem = (id: number) => { + deleteTodoMutation.mutate({ id }); + // Note: Solid Query will typically handle refetching automatically + // based on your query invalidation settings, but you can manually refetch: + todosQuery.refetch(); + }; + + return ( +
+
+ + + + + +
+ +
+ + {(item) => ( +
+ {item.id}.{item.title} + +
+ )} +
+
+
+ ); +} + +export default TodoComponent; diff --git a/examples/solid-web/src/api/solid-query-provider.ts b/examples/solid-web/src/api/solid-query-provider.ts new file mode 100644 index 00000000..12917a18 --- /dev/null +++ b/examples/solid-web/src/api/solid-query-provider.ts @@ -0,0 +1,32 @@ +import { QueryClient, defaultShouldDehydrateQuery, isServer } from '@tanstack/solid-query'; + +function makeQueryClient() { + return new QueryClient({ + defaultOptions: { + queries: { + staleTime: 60 * 1000, + }, + dehydrate: { + // include pending queries in dehydration + shouldDehydrateQuery: (query) => + defaultShouldDehydrateQuery(query) || query.state.status === 'pending', + }, + }, + }); +} + +let browserQueryClient: QueryClient | undefined = undefined; + +export function getQueryClient() { + if (isServer) { + // Server: always make a new query client + return makeQueryClient(); + } else { + // Browser: make a new query client if we don't already have one + // This is very important, so we don't re-make a new client if React + // suspends during the initial render. This may not be needed if we + // have a suspense boundary BELOW the creation of the query client + if (!browserQueryClient) browserQueryClient = makeQueryClient(); + return browserQueryClient; + } +} diff --git a/examples/solid-web/src/api/user-api-solidquery.ts b/examples/solid-web/src/api/user-api-solidquery.ts new file mode 100644 index 00000000..619d2b17 --- /dev/null +++ b/examples/solid-web/src/api/user-api-solidquery.ts @@ -0,0 +1,2 @@ +export * from './user-api'; +export * from 'fe-sdk-demo/esm/worker/user-api-solidquery'; diff --git a/examples/solid-web/src/api/user-api.ts b/examples/solid-web/src/api/user-api.ts new file mode 100644 index 00000000..6b8bebe6 --- /dev/null +++ b/examples/solid-web/src/api/user-api.ts @@ -0,0 +1,47 @@ +import { setHandler } from 'fe-sdk-demo/esm/index'; +import { xiorHandler, setXiorInstance } from 'fe-sdk-demo/esm/xior'; +import axios, { AxiosError, joinPath } from 'xior'; + +import APIWorker from './user-api.worker?worker'; +import { setWorker } from 'fe-sdk-demo/esm/worker/user-api'; + +const baseURL = (() => { + if (typeof document === 'undefined') return 'http://localhost:3012/'; + return window?.location.protocol + '//' + window?.location.host.split(':')[0] + ':' + 3012 + '/'; +})(); + +const socketURL = baseURL; +const apiURL = joinPath(baseURL, `/api/user`); + +if (typeof document !== 'undefined' && typeof Worker !== 'undefined') { + const myWorker = new APIWorker(); + myWorker.postMessage({ baseURL, apiURL, socketURL, apiType: 'user' }); + setWorker(myWorker); +} + +export const http = axios.create({ + baseURL: apiURL, +}); + +http.interceptors.request.use((config) => { + return config; +}); + +http.interceptors.response.use( + (res) => res, + async (error: AxiosError) => { + throw new Error((error?.response?.data as { msg: string })?.msg || error?.message); + } +); + +export function setupUserApi() { + setXiorInstance(http); + setHandler(xiorHandler); +} + +setupUserApi(); + +export * from 'fe-sdk-demo/esm/worker/user-api'; +export * from 'fe-sdk-demo/esm/apiconf-refs'; +export * from 'fe-sdk-demo/esm/entity-refs'; +export * from 'fe-sdk-demo/esm/shared-refs'; diff --git a/examples/solid-web/src/api/user-api.worker.ts b/examples/solid-web/src/api/user-api.worker.ts new file mode 100644 index 00000000..9014202b --- /dev/null +++ b/examples/solid-web/src/api/user-api.worker.ts @@ -0,0 +1,43 @@ +import { setHandler } from 'fe-sdk-demo/esm/worker/user-api-worker'; +import { xiorHandler, setXiorInstance } from 'fe-sdk-demo/esm/xior'; +import axios, { AxiosError } from 'xior'; + +import { socketIOHandler, setSocketIOInstance } from 'fe-sdk-demo/esm/socket.io'; +import { io as SocketIO } from 'socket.io-client'; + +self.addEventListener('message', (e) => { + if (!e.data.apiURL) return; + const apiURL = e.data.apiURL; + const apiType = e.data.apiType; + const socketURL = e.data.socketURL; + + const http = axios.create({ + baseURL: apiURL, + params: { worker: true }, + }); + + http.interceptors.response.use( + (res) => res, + async (error: AxiosError) => { + throw new Error((error?.response?.data as { msg: string })?.msg || error?.message); + } + ); + + setXiorInstance(http); + setHandler(xiorHandler); + + // or use socket.io protocol + const io = SocketIO(socketURL, { + transports: ['websocket'], + query: { + type: apiType, + }, + }); + setSocketIOInstance(io); + io.on('connect', () => { + setHandler(socketIOHandler); + }); + io.on('disconnect', () => { + setHandler(xiorHandler); + }); +}); diff --git a/examples/solid-web/src/assets/solid.svg b/examples/solid-web/src/assets/solid.svg new file mode 100644 index 00000000..025aa303 --- /dev/null +++ b/examples/solid-web/src/assets/solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/solid-web/src/index.css b/examples/solid-web/src/index.css new file mode 100644 index 00000000..08a3ac9e --- /dev/null +++ b/examples/solid-web/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/examples/solid-web/src/index.tsx b/examples/solid-web/src/index.tsx new file mode 100644 index 00000000..663596ac --- /dev/null +++ b/examples/solid-web/src/index.tsx @@ -0,0 +1,17 @@ +/* @refresh reload */ +import { render } from 'solid-js/web'; +import './index.css'; +import App from './App.tsx'; +import { QueryClientProvider } from '@tanstack/solid-query'; +import { getQueryClient } from './api/solid-query-provider.ts'; + +const root = document.getElementById('root'); + +render( + () => ( + + + + ), + root! +); diff --git a/examples/solid-web/src/test.ts b/examples/solid-web/src/test.ts new file mode 100644 index 00000000..2c4b3952 --- /dev/null +++ b/examples/solid-web/src/test.ts @@ -0,0 +1,33 @@ +import { useQueryTodo, useAddTodo } from './api/user-api-solidquery'; +import { useQuery, type SolidQueryOptions, useMutation } from '@tanstack/solid-query'; + +const a: Omit = { + enabled: true, +}; +const b: Omit = { + enabled: true, +}; +console.log(a, b); + +useQueryTodo( + {}, + { + refetchOnWindowFocus: 'always', + enabled: true, + initialData: {}, + } +); + +useQuery(() => ({ + queryKey: [], + queryFn: () => {}, + refetchOnWindowFocus: 'always', + enabled: true, +})); + +useMutation(() => ({ + async mutationFn() { + return []; + }, +})); +useAddTodo({}); diff --git a/examples/solid-web/tsconfig.app.json b/examples/solid-web/tsconfig.app.json new file mode 100644 index 00000000..c0b480e7 --- /dev/null +++ b/examples/solid-web/tsconfig.app.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/examples/solid-web/tsconfig.json b/examples/solid-web/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/examples/solid-web/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/examples/solid-web/tsconfig.node.json b/examples/solid-web/tsconfig.node.json new file mode 100644 index 00000000..8a67f62f --- /dev/null +++ b/examples/solid-web/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/solid-web/vite.config.ts b/examples/solid-web/vite.config.ts new file mode 100644 index 00000000..da402532 --- /dev/null +++ b/examples/solid-web/vite.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite'; +import solid from 'vite-plugin-solid'; + +export default defineConfig({ + plugins: [solid()], +}); diff --git a/examples/svelte-web/.gitignore b/examples/svelte-web/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/examples/svelte-web/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/svelte-web/.vscode/extensions.json b/examples/svelte-web/.vscode/extensions.json new file mode 100644 index 00000000..bdef8201 --- /dev/null +++ b/examples/svelte-web/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode"] +} diff --git a/examples/svelte-web/README.md b/examples/svelte-web/README.md new file mode 100644 index 00000000..156efd97 --- /dev/null +++ b/examples/svelte-web/README.md @@ -0,0 +1,47 @@ +# Svelte + TS + Vite + +This template should help get you started developing with Svelte and TypeScript in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + +This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why include `.vscode/extensions.json`?** + +Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. + +**Why enable `allowJs` in the TS template?** + +While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```ts +// store.ts +// An extremely simple external store +import { writable } from 'svelte/store'; +export default writable(0); +``` diff --git a/examples/svelte-web/index.html b/examples/svelte-web/index.html new file mode 100644 index 00000000..5349c0ba --- /dev/null +++ b/examples/svelte-web/index.html @@ -0,0 +1,13 @@ + + + + + + + svelte-web + + +
+ + + diff --git a/examples/svelte-web/package.json b/examples/svelte-web/package.json new file mode 100644 index 00000000..a727275a --- /dev/null +++ b/examples/svelte-web/package.json @@ -0,0 +1,27 @@ +{ + "name": "svelte-web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --port 5175", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json" + }, + "dependencies": { + "@tanstack/svelte-query": "6.0.17", + "socket.io-client": "^4.8.3", + "xior": "^0.8.3" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tsconfig/svelte": "^5.0.5", + "@types/node": "^24.6.0", + "svelte": "^5.39.6", + "svelte-check": "^4.3.2", + "typescript": "~5.9.3", + "vite": "^7.1.7", + "fe-sdk-demo": "workspace:*" + } +} diff --git a/examples/svelte-web/public/vite.svg b/examples/svelte-web/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/examples/svelte-web/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/svelte-web/src/App.svelte b/examples/svelte-web/src/App.svelte new file mode 100644 index 00000000..6b0717ca --- /dev/null +++ b/examples/svelte-web/src/App.svelte @@ -0,0 +1,19 @@ + +
+ + + + + +
+ + diff --git a/examples/svelte-web/src/QueryE2E.svelte b/examples/svelte-web/src/QueryE2E.svelte new file mode 100644 index 00000000..cb4b4822 --- /dev/null +++ b/examples/svelte-web/src/QueryE2E.svelte @@ -0,0 +1,100 @@ + + +
+
+ {#if queryState.isLoading} +

Loading...

+ {:else if queryState.isError} +

Error: {queryState.error?.message}

+ {:else if queryState.isSuccess} + {#each queryState.data?.data || [] as todo (todo.id)} +

{todo.title}

+ {/each} + {/if} +
+ +
+ + + + + +
+ +
+ {#each queryState.data?.data || [] as item (item.id)} +
+ {item.id}.{item.title} + +
+ {/each} +
+
\ No newline at end of file diff --git a/examples/svelte-web/src/api/svelte-query-provider.ts b/examples/svelte-web/src/api/svelte-query-provider.ts new file mode 100644 index 00000000..8b00f22f --- /dev/null +++ b/examples/svelte-web/src/api/svelte-query-provider.ts @@ -0,0 +1,32 @@ +import { QueryClient, defaultShouldDehydrateQuery, isServer } from '@tanstack/svelte-query'; + +function makeQueryClient() { + return new QueryClient({ + defaultOptions: { + queries: { + staleTime: 60 * 1000, + }, + dehydrate: { + // include pending queries in dehydration + shouldDehydrateQuery: (query) => + defaultShouldDehydrateQuery(query) || query.state.status === 'pending', + }, + }, + }); +} + +let browserQueryClient: QueryClient | undefined = undefined; + +export function getQueryClient() { + if (isServer) { + // Server: always make a new query client + return makeQueryClient(); + } else { + // Browser: make a new query client if we don't already have one + // This is very important, so we don't re-make a new client if React + // suspends during the initial render. This may not be needed if we + // have a suspense boundary BELOW the creation of the query client + if (!browserQueryClient) browserQueryClient = makeQueryClient(); + return browserQueryClient; + } +} diff --git a/examples/svelte-web/src/api/user-api-sveltequery.ts b/examples/svelte-web/src/api/user-api-sveltequery.ts new file mode 100644 index 00000000..64872f2f --- /dev/null +++ b/examples/svelte-web/src/api/user-api-sveltequery.ts @@ -0,0 +1,2 @@ +export * from './user-api'; +export * from 'fe-sdk-demo/esm/worker/user-api-sveltequery'; diff --git a/examples/svelte-web/src/api/user-api.ts b/examples/svelte-web/src/api/user-api.ts new file mode 100644 index 00000000..6b8bebe6 --- /dev/null +++ b/examples/svelte-web/src/api/user-api.ts @@ -0,0 +1,47 @@ +import { setHandler } from 'fe-sdk-demo/esm/index'; +import { xiorHandler, setXiorInstance } from 'fe-sdk-demo/esm/xior'; +import axios, { AxiosError, joinPath } from 'xior'; + +import APIWorker from './user-api.worker?worker'; +import { setWorker } from 'fe-sdk-demo/esm/worker/user-api'; + +const baseURL = (() => { + if (typeof document === 'undefined') return 'http://localhost:3012/'; + return window?.location.protocol + '//' + window?.location.host.split(':')[0] + ':' + 3012 + '/'; +})(); + +const socketURL = baseURL; +const apiURL = joinPath(baseURL, `/api/user`); + +if (typeof document !== 'undefined' && typeof Worker !== 'undefined') { + const myWorker = new APIWorker(); + myWorker.postMessage({ baseURL, apiURL, socketURL, apiType: 'user' }); + setWorker(myWorker); +} + +export const http = axios.create({ + baseURL: apiURL, +}); + +http.interceptors.request.use((config) => { + return config; +}); + +http.interceptors.response.use( + (res) => res, + async (error: AxiosError) => { + throw new Error((error?.response?.data as { msg: string })?.msg || error?.message); + } +); + +export function setupUserApi() { + setXiorInstance(http); + setHandler(xiorHandler); +} + +setupUserApi(); + +export * from 'fe-sdk-demo/esm/worker/user-api'; +export * from 'fe-sdk-demo/esm/apiconf-refs'; +export * from 'fe-sdk-demo/esm/entity-refs'; +export * from 'fe-sdk-demo/esm/shared-refs'; diff --git a/examples/svelte-web/src/api/user-api.worker.ts b/examples/svelte-web/src/api/user-api.worker.ts new file mode 100644 index 00000000..9014202b --- /dev/null +++ b/examples/svelte-web/src/api/user-api.worker.ts @@ -0,0 +1,43 @@ +import { setHandler } from 'fe-sdk-demo/esm/worker/user-api-worker'; +import { xiorHandler, setXiorInstance } from 'fe-sdk-demo/esm/xior'; +import axios, { AxiosError } from 'xior'; + +import { socketIOHandler, setSocketIOInstance } from 'fe-sdk-demo/esm/socket.io'; +import { io as SocketIO } from 'socket.io-client'; + +self.addEventListener('message', (e) => { + if (!e.data.apiURL) return; + const apiURL = e.data.apiURL; + const apiType = e.data.apiType; + const socketURL = e.data.socketURL; + + const http = axios.create({ + baseURL: apiURL, + params: { worker: true }, + }); + + http.interceptors.response.use( + (res) => res, + async (error: AxiosError) => { + throw new Error((error?.response?.data as { msg: string })?.msg || error?.message); + } + ); + + setXiorInstance(http); + setHandler(xiorHandler); + + // or use socket.io protocol + const io = SocketIO(socketURL, { + transports: ['websocket'], + query: { + type: apiType, + }, + }); + setSocketIOInstance(io); + io.on('connect', () => { + setHandler(socketIOHandler); + }); + io.on('disconnect', () => { + setHandler(xiorHandler); + }); +}); diff --git a/examples/svelte-web/src/app.css b/examples/svelte-web/src/app.css new file mode 100644 index 00000000..61ba3678 --- /dev/null +++ b/examples/svelte-web/src/app.css @@ -0,0 +1,79 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/examples/svelte-web/src/assets/svelte.svg b/examples/svelte-web/src/assets/svelte.svg new file mode 100644 index 00000000..c5e08481 --- /dev/null +++ b/examples/svelte-web/src/assets/svelte.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/svelte-web/src/lib/Counter.svelte b/examples/svelte-web/src/lib/Counter.svelte new file mode 100644 index 00000000..37d75ce7 --- /dev/null +++ b/examples/svelte-web/src/lib/Counter.svelte @@ -0,0 +1,10 @@ + + + diff --git a/examples/svelte-web/src/main.ts b/examples/svelte-web/src/main.ts new file mode 100644 index 00000000..c049299c --- /dev/null +++ b/examples/svelte-web/src/main.ts @@ -0,0 +1,9 @@ +import { mount } from 'svelte'; +import './app.css'; +import App from './App.svelte'; + +const app = mount(App, { + target: document.getElementById('app')!, +}); + +export default app; diff --git a/examples/svelte-web/src/test.ts b/examples/svelte-web/src/test.ts new file mode 100644 index 00000000..6cf183bc --- /dev/null +++ b/examples/svelte-web/src/test.ts @@ -0,0 +1,21 @@ +import { useQueryTodo, useAddTodo } from './api/user-api-sveltequery'; +import { createQuery } from '@tanstack/svelte-query'; + +useQueryTodo( + {}, + { + refetchOnWindowFocus: 'always', + enabled: false, + } +); +useAddTodo({ + onError: (e) => { + // + }, +}); + +createQuery(() => ({ + queryKey: [], + queryFn: () => {}, + refetchOnWindowFocus: 'always', +})); diff --git a/examples/svelte-web/svelte.config.js b/examples/svelte-web/svelte.config.js new file mode 100644 index 00000000..1ceefaa3 --- /dev/null +++ b/examples/svelte-web/svelte.config.js @@ -0,0 +1,8 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */ +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +}; diff --git a/examples/svelte-web/tsconfig.app.json b/examples/svelte-web/tsconfig.app.json new file mode 100644 index 00000000..31c18cfd --- /dev/null +++ b/examples/svelte-web/tsconfig.app.json @@ -0,0 +1,21 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "module": "ESNext", + "types": ["svelte", "vite/client"], + "noEmit": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "moduleDetection": "force" + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/examples/svelte-web/tsconfig.json b/examples/svelte-web/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/examples/svelte-web/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/examples/svelte-web/tsconfig.node.json b/examples/svelte-web/tsconfig.node.json new file mode 100644 index 00000000..8a67f62f --- /dev/null +++ b/examples/svelte-web/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/svelte-web/vite.config.ts b/examples/svelte-web/vite.config.ts new file mode 100644 index 00000000..5e6b0ec3 --- /dev/null +++ b/examples/svelte-web/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [svelte()], +}); diff --git a/examples/vue-web/.gitignore b/examples/vue-web/.gitignore new file mode 100644 index 00000000..8ee54e8d --- /dev/null +++ b/examples/vue-web/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/examples/vue-web/.vscode/extensions.json b/examples/vue-web/.vscode/extensions.json new file mode 100644 index 00000000..a7cea0b0 --- /dev/null +++ b/examples/vue-web/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/examples/vue-web/README.md b/examples/vue-web/README.md new file mode 100644 index 00000000..1334ee17 --- /dev/null +++ b/examples/vue-web/README.md @@ -0,0 +1,42 @@ +# vue-web + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Vue (Official)](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Recommended Browser Setup + +- Chromium-based browsers (Chrome, Edge, Brave, etc.): + - [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) + - [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters) +- Firefox: + - [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/) + - [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/) + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +pnpm install +``` + +### Compile and Hot-Reload for Development + +```sh +pnpm dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +pnpm build +``` diff --git a/examples/vue-web/env.d.ts b/examples/vue-web/env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/examples/vue-web/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/vue-web/index.html b/examples/vue-web/index.html new file mode 100644 index 00000000..9e5fc8f0 --- /dev/null +++ b/examples/vue-web/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/examples/vue-web/package.json b/examples/vue-web/package.json new file mode 100644 index 00000000..d65d89dc --- /dev/null +++ b/examples/vue-web/package.json @@ -0,0 +1,34 @@ +{ + "name": "vue-web", + "version": "0.0.0", + "private": true, + "type": "module", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "scripts": { + "dev": "vite --port 5174", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build" + }, + "dependencies": { + "vue": "^3.5.22", + "@tanstack/vue-query": "5.92.8", + "socket.io-client": "^4.8.3", + "xior": "^0.8.3" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.2", + "@types/node": "^22.18.6", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.8.1", + "npm-run-all2": "^8.0.4", + "typescript": "~5.9.0", + "vite": "^7.1.7", + "vite-plugin-vue-devtools": "^8.0.2", + "vue-tsc": "^3.1.0", + "fe-sdk-demo": "workspace:*" + } +} diff --git a/examples/vue-web/public/favicon.ico b/examples/vue-web/public/favicon.ico new file mode 100644 index 00000000..df36fcfb Binary files /dev/null and b/examples/vue-web/public/favicon.ico differ diff --git a/examples/vue-web/src/App.vue b/examples/vue-web/src/App.vue new file mode 100644 index 00000000..b57649a5 --- /dev/null +++ b/examples/vue-web/src/App.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/examples/vue-web/src/main.ts b/examples/vue-web/src/main.ts new file mode 100644 index 00000000..9083b986 --- /dev/null +++ b/examples/vue-web/src/main.ts @@ -0,0 +1,13 @@ +import { createApp } from 'vue'; +import { VueQueryPlugin } from '@tanstack/vue-query'; +import { getQueryClient } from './vue-query-provider'; + +import App from './App.vue'; + +const app = createApp(App); +const queryClient = getQueryClient(); +app.use(VueQueryPlugin, { + queryClient, +}); + +app.mount('#app'); diff --git a/examples/vue-web/src/test.ts b/examples/vue-web/src/test.ts new file mode 100644 index 00000000..c02211a3 --- /dev/null +++ b/examples/vue-web/src/test.ts @@ -0,0 +1,22 @@ +import { useQueryTodo, useDeleteTodo } from './user-api-vuequery'; +import { useQuery } from '@tanstack/vue-query'; + +useQueryTodo( + {}, + { + refetchOnWindowFocus: 'always', + enabled: false, + } +); + +useDeleteTodo({ + onError: (e) => { + // + }, +}); + +useQuery({ + queryKey: [], + queryFn: () => {}, + refetchOnWindowFocus: 'always', +}); diff --git a/examples/vue-web/src/user-api-vuequery.ts b/examples/vue-web/src/user-api-vuequery.ts new file mode 100644 index 00000000..23bd4314 --- /dev/null +++ b/examples/vue-web/src/user-api-vuequery.ts @@ -0,0 +1,2 @@ +export * from './user-api'; +export * from 'fe-sdk-demo/esm/worker/user-api-vuequery'; diff --git a/examples/vue-web/src/user-api.ts b/examples/vue-web/src/user-api.ts new file mode 100644 index 00000000..6b8bebe6 --- /dev/null +++ b/examples/vue-web/src/user-api.ts @@ -0,0 +1,47 @@ +import { setHandler } from 'fe-sdk-demo/esm/index'; +import { xiorHandler, setXiorInstance } from 'fe-sdk-demo/esm/xior'; +import axios, { AxiosError, joinPath } from 'xior'; + +import APIWorker from './user-api.worker?worker'; +import { setWorker } from 'fe-sdk-demo/esm/worker/user-api'; + +const baseURL = (() => { + if (typeof document === 'undefined') return 'http://localhost:3012/'; + return window?.location.protocol + '//' + window?.location.host.split(':')[0] + ':' + 3012 + '/'; +})(); + +const socketURL = baseURL; +const apiURL = joinPath(baseURL, `/api/user`); + +if (typeof document !== 'undefined' && typeof Worker !== 'undefined') { + const myWorker = new APIWorker(); + myWorker.postMessage({ baseURL, apiURL, socketURL, apiType: 'user' }); + setWorker(myWorker); +} + +export const http = axios.create({ + baseURL: apiURL, +}); + +http.interceptors.request.use((config) => { + return config; +}); + +http.interceptors.response.use( + (res) => res, + async (error: AxiosError) => { + throw new Error((error?.response?.data as { msg: string })?.msg || error?.message); + } +); + +export function setupUserApi() { + setXiorInstance(http); + setHandler(xiorHandler); +} + +setupUserApi(); + +export * from 'fe-sdk-demo/esm/worker/user-api'; +export * from 'fe-sdk-demo/esm/apiconf-refs'; +export * from 'fe-sdk-demo/esm/entity-refs'; +export * from 'fe-sdk-demo/esm/shared-refs'; diff --git a/examples/vue-web/src/user-api.worker.ts b/examples/vue-web/src/user-api.worker.ts new file mode 100644 index 00000000..9014202b --- /dev/null +++ b/examples/vue-web/src/user-api.worker.ts @@ -0,0 +1,43 @@ +import { setHandler } from 'fe-sdk-demo/esm/worker/user-api-worker'; +import { xiorHandler, setXiorInstance } from 'fe-sdk-demo/esm/xior'; +import axios, { AxiosError } from 'xior'; + +import { socketIOHandler, setSocketIOInstance } from 'fe-sdk-demo/esm/socket.io'; +import { io as SocketIO } from 'socket.io-client'; + +self.addEventListener('message', (e) => { + if (!e.data.apiURL) return; + const apiURL = e.data.apiURL; + const apiType = e.data.apiType; + const socketURL = e.data.socketURL; + + const http = axios.create({ + baseURL: apiURL, + params: { worker: true }, + }); + + http.interceptors.response.use( + (res) => res, + async (error: AxiosError) => { + throw new Error((error?.response?.data as { msg: string })?.msg || error?.message); + } + ); + + setXiorInstance(http); + setHandler(xiorHandler); + + // or use socket.io protocol + const io = SocketIO(socketURL, { + transports: ['websocket'], + query: { + type: apiType, + }, + }); + setSocketIOInstance(io); + io.on('connect', () => { + setHandler(socketIOHandler); + }); + io.on('disconnect', () => { + setHandler(xiorHandler); + }); +}); diff --git a/examples/vue-web/src/vue-query-e2e.vue b/examples/vue-web/src/vue-query-e2e.vue new file mode 100644 index 00000000..bb4d45e6 --- /dev/null +++ b/examples/vue-web/src/vue-query-e2e.vue @@ -0,0 +1,95 @@ + + + diff --git a/examples/vue-web/src/vue-query-provider.ts b/examples/vue-web/src/vue-query-provider.ts new file mode 100644 index 00000000..5294413e --- /dev/null +++ b/examples/vue-web/src/vue-query-provider.ts @@ -0,0 +1,32 @@ +import { QueryClient, defaultShouldDehydrateQuery, isServer } from '@tanstack/vue-query'; + +function makeQueryClient() { + return new QueryClient({ + defaultOptions: { + queries: { + staleTime: 60 * 1000, + }, + dehydrate: { + // include pending queries in dehydration + shouldDehydrateQuery: (query) => + defaultShouldDehydrateQuery(query) || query.state.status === 'pending', + }, + }, + }); +} + +let browserQueryClient: QueryClient | undefined = undefined; + +export function getQueryClient() { + if (isServer) { + // Server: always make a new query client + return makeQueryClient(); + } else { + // Browser: make a new query client if we don't already have one + // This is very important, so we don't re-make a new client if React + // suspends during the initial render. This may not be needed if we + // have a suspense boundary BELOW the creation of the query client + if (!browserQueryClient) browserQueryClient = makeQueryClient(); + return browserQueryClient; + } +} diff --git a/examples/vue-web/tsconfig.app.json b/examples/vue-web/tsconfig.app.json new file mode 100644 index 00000000..913b8f27 --- /dev/null +++ b/examples/vue-web/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/examples/vue-web/tsconfig.json b/examples/vue-web/tsconfig.json new file mode 100644 index 00000000..66b5e570 --- /dev/null +++ b/examples/vue-web/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/examples/vue-web/tsconfig.node.json b/examples/vue-web/tsconfig.node.json new file mode 100644 index 00000000..a83dfc9d --- /dev/null +++ b/examples/vue-web/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*", + "eslint.config.*" + ], + "compilerOptions": { + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/examples/vue-web/vite.config.ts b/examples/vue-web/vite.config.ts new file mode 100644 index 00000000..d12d642d --- /dev/null +++ b/examples/vue-web/vite.config.ts @@ -0,0 +1,15 @@ +import { fileURLToPath, URL } from 'node:url'; + +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueDevTools from 'vite-plugin-vue-devtools'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue(), vueDevTools()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, +}); diff --git a/examples/web/.dockerignore b/examples/web/.dockerignore new file mode 100644 index 00000000..9b8d5147 --- /dev/null +++ b/examples/web/.dockerignore @@ -0,0 +1,4 @@ +.react-router +build +node_modules +README.md \ No newline at end of file diff --git a/examples/web/.gitignore b/examples/web/.gitignore index c87c9b39..9b7c041f 100644 --- a/examples/web/.gitignore +++ b/examples/web/.gitignore @@ -1,36 +1,6 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc .DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env*.local - -# vercel -.vercel +/node_modules/ -# typescript -*.tsbuildinfo -next-env.d.ts +# React Router +/.react-router/ +/build/ diff --git a/examples/web/Dockerfile b/examples/web/Dockerfile new file mode 100644 index 00000000..207bf937 --- /dev/null +++ b/examples/web/Dockerfile @@ -0,0 +1,22 @@ +FROM node:20-alpine AS development-dependencies-env +COPY . /app +WORKDIR /app +RUN npm ci + +FROM node:20-alpine AS production-dependencies-env +COPY ./package.json package-lock.json /app/ +WORKDIR /app +RUN npm ci --omit=dev + +FROM node:20-alpine AS build-env +COPY . /app/ +COPY --from=development-dependencies-env /app/node_modules /app/node_modules +WORKDIR /app +RUN npm run build + +FROM node:20-alpine +COPY ./package.json package-lock.json /app/ +COPY --from=production-dependencies-env /app/node_modules /app/node_modules +COPY --from=build-env /app/build /app/build +WORKDIR /app +CMD ["npm", "run", "start"] \ No newline at end of file diff --git a/examples/web/README.md b/examples/web/README.md index b12f3e33..e0d20664 100644 --- a/examples/web/README.md +++ b/examples/web/README.md @@ -1,34 +1,100 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). +# Welcome to React Router! + +A modern, production-ready template for building full-stack React applications using React Router. + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/remix-run/react-router-templates/tree/main/default) + +## Features + +- 🚀 Server-side rendering +- ⚡️ Hot Module Replacement (HMR) +- 📦 Asset bundling and optimization +- 🔄 Data loading and mutations +- 🔒 TypeScript by default +- 🎉 TailwindCSS for styling +- 📖 [React Router docs](https://reactrouter.com/) ## Getting Started -First, run the development server: +### Installation + +Install the dependencies: + +```bash +npm install +``` + +### Development + +Start the development server with HMR: ```bash npm run dev -# or -yarn dev ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +Your application will be available at `http://localhost:5173`. + +## Building for Production + +Create a production build: + +```bash +npm run build +``` + +## Deployment + +### Docker Deployment + +This template includes three Dockerfiles optimized for different package managers: + +- `Dockerfile` - for npm +- `Dockerfile.pnpm` - for pnpm +- `Dockerfile.bun` - for bun + +To build and run using Docker: + +```bash +# For npm +docker build -t my-app . + +# For pnpm +docker build -f Dockerfile.pnpm -t my-app . -You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. +# For bun +docker build -f Dockerfile.bun -t my-app . + +# Run the container +docker run -p 3000:3000 my-app +``` -[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. +The containerized application can be deployed to any platform that supports Docker, including: -The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. +- AWS ECS +- Google Cloud Run +- Azure Container Apps +- Digital Ocean App Platform +- Fly.io +- Railway -## Learn More +### DIY Deployment -To learn more about Next.js, take a look at the following resources: +If you're familiar with deploying Node applications, the built-in app server is production-ready. -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +Make sure to deploy the output of `npm run build` + +``` +├── package.json +├── package-lock.json (or pnpm-lock.yaml, or bun.lockb) +├── build/ +│ ├── client/ # Static assets +│ └── server/ # Server-side code +``` -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! +## Styling -## Deploy on Vercel +This template comes with [Tailwind CSS](https://tailwindcss.com/) already configured for a simple default starting experience. You can use whatever CSS framework you prefer. -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +--- -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. +Built with ❤️ using React Router. diff --git a/examples/web/app/app.css b/examples/web/app/app.css new file mode 100644 index 00000000..6c0a7e6c --- /dev/null +++ b/examples/web/app/app.css @@ -0,0 +1,15 @@ +@import 'tailwindcss'; + +@theme { + --font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; +} + +html, +body { + @apply bg-white dark:bg-gray-950; + + @media (prefers-color-scheme: dark) { + color-scheme: dark; + } +} diff --git a/examples/web/app/react-query-provider.tsx b/examples/web/app/react-query-provider.tsx new file mode 100644 index 00000000..ae83a4fc --- /dev/null +++ b/examples/web/app/react-query-provider.tsx @@ -0,0 +1,32 @@ +import { QueryClient, defaultShouldDehydrateQuery, isServer } from '@tanstack/react-query'; + +function makeQueryClient() { + return new QueryClient({ + defaultOptions: { + queries: { + staleTime: 60 * 1000, + }, + dehydrate: { + // include pending queries in dehydration + shouldDehydrateQuery: (query) => + defaultShouldDehydrateQuery(query) || query.state.status === 'pending', + }, + }, + }); +} + +let browserQueryClient: QueryClient | undefined = undefined; + +export function getQueryClient() { + if (isServer) { + // Server: always make a new query client + return makeQueryClient(); + } else { + // Browser: make a new query client if we don't already have one + // This is very important, so we don't re-make a new client if React + // suspends during the initial render. This may not be needed if we + // have a suspense boundary BELOW the creation of the query client + if (!browserQueryClient) browserQueryClient = makeQueryClient(); + return browserQueryClient; + } +} diff --git a/examples/web/app/root.tsx b/examples/web/app/root.tsx new file mode 100644 index 00000000..005562db --- /dev/null +++ b/examples/web/app/root.tsx @@ -0,0 +1,98 @@ +import { + isRouteErrorResponse, + Links, + Meta, + Outlet, + Scripts, + ScrollRestoration, +} from 'react-router'; +import { QueryClientProvider } from '@tanstack/react-query'; + +import type { Route } from './+types/root'; +import { + setupUserApi, + QueryTodo, + useQueryTodo, + AddTodo, + useAddTodo, + DeleteTodo, + useDeleteTodo, + UpdateTodo, + useUpdateTodo, + QueryTodoByCursor, + useQueryTodoByCursor, +} from './user-api-swr'; + +import './app.css'; +import { getQueryClient } from './react-query-provider'; +import React from 'react'; +import { setQueryClient } from './user-api-reactquery'; + +export const links: Route.LinksFunction = () => [ + { rel: 'preconnect', href: 'https://fonts.googleapis.com' }, + { + rel: 'preconnect', + href: 'https://fonts.gstatic.com', + crossOrigin: 'anonymous', + }, + { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap', + }, +]; + +setupUserApi(); + +export function Layout({ children }: { children: React.ReactNode }) { + const [queryClient] = React.useState(() => { + const client = getQueryClient(); + setQueryClient(client); + return client; + }); + return ( + + + + + + + + + {children} + + + + + ); +} + +export default function App() { + return ; +} + +export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { + let message = 'Oops!'; + let details = 'An unexpected error occurred.'; + let stack: string | undefined; + + if (isRouteErrorResponse(error)) { + message = error.status === 404 ? '404' : 'Error'; + details = + error.status === 404 ? 'The requested page could not be found.' : error.statusText || details; + } else if (import.meta.env.DEV && error && error instanceof Error) { + details = error.message; + stack = error.stack; + } + + return ( +
+

{message}

+

{details}

+ {stack && ( +
+          {stack}
+        
+ )} +
+ ); +} diff --git a/examples/web/app/routes.ts b/examples/web/app/routes.ts new file mode 100644 index 00000000..08291bc5 --- /dev/null +++ b/examples/web/app/routes.ts @@ -0,0 +1,7 @@ +import { type RouteConfig, index, route } from '@react-router/dev/routes'; + +export default [ + index('routes/home.tsx'), + route('/swr-e2e', 'routes/swr-e2e.tsx'), + route('/react-query-e2e', 'routes/react-query-e2e.tsx'), +] satisfies RouteConfig; diff --git a/examples/web/app/routes/home.tsx b/examples/web/app/routes/home.tsx new file mode 100644 index 00000000..d151c1a4 --- /dev/null +++ b/examples/web/app/routes/home.tsx @@ -0,0 +1,41 @@ +import { useState, useEffect } from 'react'; + +import { AddTodo, QueryTodo, TodoStatus, type QueryTodoRes } from '../user-api'; +import { Welcome } from '../welcome/welcome'; +import { useQueryTodo } from '~/user-api-swr'; + +export async function loader() { + const res = await QueryTodo({}); + console.log('QueryTodo result:', res); + return { res }; +} + +export function meta() { + return [ + { title: 'New React Router App' }, + { name: 'description', content: 'Welcome to React Router!' }, + ]; +} + +export default function Home() { + const [_result, setResult] = useState(); + const { data: result, mutate } = useQueryTodo({}); + useEffect(() => { + (async () => { + await AddTodo({ + status: TodoStatus.todo, + title: 'create by socket.io', + }); + mutate(); + const res = await QueryTodo({}); + setResult(res); + })(); + }, []); + + return ( + <> + +
{JSON.stringify(result)}
+ + ); +} diff --git a/examples/web/app/routes/react-query-e2e.tsx b/examples/web/app/routes/react-query-e2e.tsx new file mode 100644 index 00000000..387061d3 --- /dev/null +++ b/examples/web/app/routes/react-query-e2e.tsx @@ -0,0 +1,105 @@ +import { useState } from 'react'; + +import { AddTodo, QueryTodo, TodoStatus, type QueryTodoRes } from '../user-api'; +import { useQueryTodo, useAddTodo, useDeleteTodo, setupUserApi } from '~/user-api-reactquery'; + +export async function loader() { + const res = await QueryTodo({}); + return { res }; +} + +export function meta() { + return [ + { title: 'React Router Page for @tanstack/react-query hooks tests' }, + { name: 'description', content: 'Welcome to React Router!' }, + ]; +} + +setupUserApi(); + +export default function ReactQueryE2EPage() { + const [enabled, setEnabled] = useState(true); + + const { mutateAsync: addTodo, ...addTodoRes } = useAddTodo({}); + const { mutateAsync: deleteTodo, ...deleteTodoRes } = useDeleteTodo({}); + const { data, refetch: refreshTodos } = useQueryTodo( + {}, + { + refetchOnWindowFocus: 'always', + staleTime: 0, + enabled, + } + ); + + const dataList = data?.data || []; + + return ( +
+
+ + + + + +
+ +
+ {dataList.map((item) => { + return ( +
+ {item.id}.{item.title}{' '} + +
+ ); + })} +
+
+ ); +} diff --git a/examples/web/app/routes/swr-e2e.tsx b/examples/web/app/routes/swr-e2e.tsx new file mode 100644 index 00000000..266c237a --- /dev/null +++ b/examples/web/app/routes/swr-e2e.tsx @@ -0,0 +1,102 @@ +import { useState } from 'react'; + +import { AddTodo, QueryTodo, TodoStatus, type QueryTodoRes } from '../user-api'; +import { useQueryTodo, useAddTodo, useDeleteTodo, setupUserApi } from '~/user-api-swr'; + +export async function loader() { + const res = await QueryTodo({}); + return { res }; +} + +export function meta() { + return [ + { title: 'React Router Page for SWR hooks tests' }, + { name: 'description', content: 'Welcome to React Router!' }, + ]; +} + +setupUserApi(); + +export default function SWRE2EPage() { + const [enabled, setEnabled] = useState(true); + + const { trigger: addTodo, ...addTodoRes } = useAddTodo({}); + const { trigger: deleteTodo, ...deleteTodoRes } = useDeleteTodo({}); + const { data, mutate: refreshTodos } = useQueryTodo(enabled ? {} : undefined, { + revalidateOnFocus: true, + focusThrottleInterval: 100, + dedupingInterval: 100, + }); + + const dataList = data?.data || []; + + return ( +
+
+ + + + + +
+ +
+ {dataList.map((item) => { + return ( +
+ {item.id}.{item.title}{' '} + +
+ ); + })} +
+
+ ); +} diff --git a/examples/web/app/user-api-reactquery.ts b/examples/web/app/user-api-reactquery.ts new file mode 100644 index 00000000..fd8781e7 --- /dev/null +++ b/examples/web/app/user-api-reactquery.ts @@ -0,0 +1,2 @@ +export * from './user-api'; +export * from 'fe-sdk-demo/esm/worker/user-api-reactquery'; diff --git a/examples/web/app/user-api-swr.ts b/examples/web/app/user-api-swr.ts new file mode 100644 index 00000000..bfad0fbc --- /dev/null +++ b/examples/web/app/user-api-swr.ts @@ -0,0 +1,2 @@ +export * from './user-api'; +export * from 'fe-sdk-demo/esm/worker/user-api-swr'; diff --git a/examples/web/app/user-api.ts b/examples/web/app/user-api.ts new file mode 100644 index 00000000..6b8bebe6 --- /dev/null +++ b/examples/web/app/user-api.ts @@ -0,0 +1,47 @@ +import { setHandler } from 'fe-sdk-demo/esm/index'; +import { xiorHandler, setXiorInstance } from 'fe-sdk-demo/esm/xior'; +import axios, { AxiosError, joinPath } from 'xior'; + +import APIWorker from './user-api.worker?worker'; +import { setWorker } from 'fe-sdk-demo/esm/worker/user-api'; + +const baseURL = (() => { + if (typeof document === 'undefined') return 'http://localhost:3012/'; + return window?.location.protocol + '//' + window?.location.host.split(':')[0] + ':' + 3012 + '/'; +})(); + +const socketURL = baseURL; +const apiURL = joinPath(baseURL, `/api/user`); + +if (typeof document !== 'undefined' && typeof Worker !== 'undefined') { + const myWorker = new APIWorker(); + myWorker.postMessage({ baseURL, apiURL, socketURL, apiType: 'user' }); + setWorker(myWorker); +} + +export const http = axios.create({ + baseURL: apiURL, +}); + +http.interceptors.request.use((config) => { + return config; +}); + +http.interceptors.response.use( + (res) => res, + async (error: AxiosError) => { + throw new Error((error?.response?.data as { msg: string })?.msg || error?.message); + } +); + +export function setupUserApi() { + setXiorInstance(http); + setHandler(xiorHandler); +} + +setupUserApi(); + +export * from 'fe-sdk-demo/esm/worker/user-api'; +export * from 'fe-sdk-demo/esm/apiconf-refs'; +export * from 'fe-sdk-demo/esm/entity-refs'; +export * from 'fe-sdk-demo/esm/shared-refs'; diff --git a/examples/web/app/user-api.worker.ts b/examples/web/app/user-api.worker.ts new file mode 100644 index 00000000..9014202b --- /dev/null +++ b/examples/web/app/user-api.worker.ts @@ -0,0 +1,43 @@ +import { setHandler } from 'fe-sdk-demo/esm/worker/user-api-worker'; +import { xiorHandler, setXiorInstance } from 'fe-sdk-demo/esm/xior'; +import axios, { AxiosError } from 'xior'; + +import { socketIOHandler, setSocketIOInstance } from 'fe-sdk-demo/esm/socket.io'; +import { io as SocketIO } from 'socket.io-client'; + +self.addEventListener('message', (e) => { + if (!e.data.apiURL) return; + const apiURL = e.data.apiURL; + const apiType = e.data.apiType; + const socketURL = e.data.socketURL; + + const http = axios.create({ + baseURL: apiURL, + params: { worker: true }, + }); + + http.interceptors.response.use( + (res) => res, + async (error: AxiosError) => { + throw new Error((error?.response?.data as { msg: string })?.msg || error?.message); + } + ); + + setXiorInstance(http); + setHandler(xiorHandler); + + // or use socket.io protocol + const io = SocketIO(socketURL, { + transports: ['websocket'], + query: { + type: apiType, + }, + }); + setSocketIOInstance(io); + io.on('connect', () => { + setHandler(socketIOHandler); + }); + io.on('disconnect', () => { + setHandler(xiorHandler); + }); +}); diff --git a/examples/web/app/welcome/logo-dark.svg b/examples/web/app/welcome/logo-dark.svg new file mode 100644 index 00000000..dd820289 --- /dev/null +++ b/examples/web/app/welcome/logo-dark.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/web/app/welcome/logo-light.svg b/examples/web/app/welcome/logo-light.svg new file mode 100644 index 00000000..73284929 --- /dev/null +++ b/examples/web/app/welcome/logo-light.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/web/app/welcome/welcome.tsx b/examples/web/app/welcome/welcome.tsx new file mode 100644 index 00000000..7e8eac07 --- /dev/null +++ b/examples/web/app/welcome/welcome.tsx @@ -0,0 +1,78 @@ +import logoDark from './logo-dark.svg'; +import logoLight from './logo-light.svg'; + +export function Welcome() { + return ( +
+
+
+
+ React Router + React Router +
+
+
+ +
+
+
+ ); +} + +const resources = [ + { + href: 'https://reactrouter.com/docs', + text: 'React Router Docs', + icon: ( + + + + ), + }, + { + href: 'https://rmx.as/discord', + text: 'Join Discord', + icon: ( + + + + ), + }, +]; diff --git a/examples/web/babel.config.js b/examples/web/babel.config.js deleted file mode 100644 index bd1f93b0..00000000 --- a/examples/web/babel.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - presets: ['next/babel'], - plugins: [['react-native-web', { commonjs: true }]], -}; diff --git a/examples/web/next.config.js b/examples/web/next.config.js deleted file mode 100644 index 399b3b2f..00000000 --- a/examples/web/next.config.js +++ /dev/null @@ -1,23 +0,0 @@ -/** @type {import('next').NextConfig} */ -module.exports = { - reactStrictMode: false, - swcMinify: true, - webpack: (config) => { - // Set the alias from `react-native` to `react-native-web` - config.resolve.alias = { - ...(config.resolve.alias || {}), - 'react-native$': 'react-native-web', - }; - - // Add custom `.web.{jsx?,tsx?}` extension resolver - config.resolve.extensions = [ - '.web.js', - '.web.jsx', - '.web.ts', - '.web.tsx', - ...config.resolve.extensions, - ]; - - return config; - }, -}; diff --git a/examples/web/package.json b/examples/web/package.json index f66dde94..1d15bd46 100644 --- a/examples/web/package.json +++ b/examples/web/package.json @@ -1,38 +1,36 @@ { + "name": "web", "private": true, - "name": "web-example", - "description": "Use `fe-sdk-demo` package with next.js", - "version": "1.0.0", + "type": "module", "scripts": { - "lint": "eslint . --ext .ts,.tsx --fix", - "checktype": "tsc --noEmit", - "dev": "next dev -p 3080", - "build": "next build && next export", - "serve": "serve out", - "start": "next start -p 3080", - "test": "cross-env NODE_ENV=test vitest run" + "build": "react-router build", + "dev": "react-router dev", + "start": "react-router-serve ./build/server/index.js", + "typecheck": "react-router typegen && tsc" }, "dependencies": { - "fe-sdk-demo": "workspace:*", - "next": "^13.5.6", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-native-web": "^0.19.6", - "socket.io-client": "^4.8.0", - "axios": "^1.7.7", - "xior": "^0.6.2" + "@react-router/node": "^7.2.0", + "@react-router/serve": "^7.2.0", + "isbot": "^5.1.17", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router": "^7.2.0", + "axios": "^1.13.2", + "xior": "^0.8.3", + "socket.io-client": "^4.8.3", + "@tanstack/react-query": "5.90.19" }, "devDependencies": { - "@configs/vitest-config": "workspace:*", - "@configs/eslint-config": "workspace:*", - "babel-plugin-react-native-web": "^0.19.6" - }, - "eslintConfig": { - "extends": "@configs/eslint-config", - "ignorePatterns": [ - "node_modules", - ".next", - "public" - ] + "@react-router/dev": "^7.2.0", + "@tailwindcss/vite": "^4.0.0", + "@types/node": "^20", + "@types/react": "^19.0.1", + "@types/react-dom": "^19.0.1", + "react-router-devtools": "^1.1.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.9.3", + "vite": "^5.4.11", + "vite-tsconfig-paths": "^5.1.4", + "fe-sdk-demo": "workspace:*" } } diff --git a/examples/web/pages/_app.tsx b/examples/web/pages/_app.tsx deleted file mode 100644 index 244e40bb..00000000 --- a/examples/web/pages/_app.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import '../styles/globals.css'; - -function MyApp({ Component, pageProps }) { - return ; -} - -export default MyApp; diff --git a/examples/web/pages/api/hello.tsx b/examples/web/pages/api/hello.tsx deleted file mode 100644 index d49a2572..00000000 --- a/examples/web/pages/api/hello.tsx +++ /dev/null @@ -1,5 +0,0 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction - -export default function handler(req, res) { - res.status(200).json({ name: 'John Doe' }); -} diff --git a/examples/web/pages/index.tsx b/examples/web/pages/index.tsx deleted file mode 100644 index d718a115..00000000 --- a/examples/web/pages/index.tsx +++ /dev/null @@ -1,97 +0,0 @@ -// import { HomeScreen, HomeIcon } from '@acme/feature-home'; -import axios from 'axios'; -import { - setHandler, - setSocketIOInstance, - socketIOHandler, - setAxiosInstance, - axiosHandler, - getHandler, -} from 'fe-sdk-demo'; -import { QueryTodoRes } from 'fe-sdk-demo/lib/apiconf-refs'; -import { TodoStatus } from 'fe-sdk-demo/lib/modules/todo/Todo.entity'; -import { AddTodo, QueryTodo } from 'fe-sdk-demo/lib/user-api'; -import Head from 'next/head'; -import { useState, useEffect } from 'react'; -// eslint-disable-next-line import/namespace -import { io as SocketIO } from 'socket.io-client'; - -import styles from '../styles/Home.module.css'; - -const baseURL = - // process.env.NODE_ENV === 'production' - // ? process.env.BASE_URL - // : - (() => { - if (typeof window === 'undefined') return; - return ( - window?.location.protocol + '//' + window?.location.host.split(':')[0] + ':' + 3012 + '/' - ); - })(); - -const apiType = 'user'; -const socketURL = baseURL; -const apiURL = baseURL + `api/${apiType}`; - -export default function Home() { - const [handlerName, setHanlderName] = useState(''); - const [result, setResult] = useState(); - - useEffect(() => { - const io = SocketIO(socketURL, { - transports: ['websocket'], - query: { - type: apiType, - }, - }); - setSocketIOInstance(io); - setHandler(socketIOHandler); - - setHanlderName(getHandler().name); - - io.on('connect', async () => { - await AddTodo({ - status: TodoStatus.todo, - title: 'create by socket.io', - }); - const wsRes = await QueryTodo({}); - - console.log(wsRes); - setResult(wsRes); - - io.disconnect(); - setTimeout(async () => { - setAxiosInstance(axios.create({ baseURL: apiURL })); - setHandler(axiosHandler); - - setHanlderName(getHandler().name); - await AddTodo({ - status: TodoStatus.todo, - title: 'create by axios', - }); - const httpRes = await QueryTodo({}); - console.log(httpRes); - - setResult(httpRes); - }, 2500); - }); - - return () => { - io.off('connect'); - }; - }, []); - - return ( -
- - [web] Expo monorepo - - - - -
- Hello, {handlerName}: {JSON.stringify(result)} -
-
- ); -} diff --git a/examples/web/pages/xior/page.tsx b/examples/web/pages/xior/page.tsx deleted file mode 100644 index 4b5ffb0e..00000000 --- a/examples/web/pages/xior/page.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { - setHandler, - setSocketIOInstance, - socketIOHandler, - setXiorInstance, - xiorHandler, - getHandler, -} from 'fe-sdk-demo'; -import { QueryTodoRes } from 'fe-sdk-demo/lib/apiconf-refs'; -import { TodoStatus } from 'fe-sdk-demo/lib/modules/todo/Todo.entity'; -import { AddTodo, QueryTodo } from 'fe-sdk-demo/lib/user-api'; -import { useQueryTodo, useDeleteTodo } from 'fe-sdk-demo/lib/user-api-hooks'; -import Head from 'next/head'; -import { useState, useEffect } from 'react'; -// eslint-disable-next-line import/namespace -import { io as SocketIO } from 'socket.io-client'; -import xior from 'xior'; - -import styles from '../../styles/Home.module.css'; - -const baseURL = - // process.env.NODE_ENV === 'production' - // ? process.env.BASE_URL - // : - (() => { - if (typeof window === 'undefined') return; - return ( - window?.location.protocol + '//' + window?.location.host.split(':')[0] + ':' + 3012 + '/' - ); - })(); - -const apiType = 'user'; -const socketURL = baseURL; -const apiURL = baseURL + `api/${apiType}`; - -export default function Home() { - const [handlerName, setHanlderName] = useState(''); - const [result, setResult] = useState(); - const { data } = useQueryTodo(handlerName ? {} : undefined); - - const { mutate: deleteTodo } = useDeleteTodo(); - - useEffect(() => { - const io = SocketIO(socketURL, { - transports: ['websocket'], - query: { - type: apiType, - }, - }); - setSocketIOInstance(io); - setHandler(socketIOHandler); - - setHanlderName(getHandler().name); - - io.on('connect', async () => { - await AddTodo({ - status: TodoStatus.todo, - title: 'create by socket.io', - }); - const wsRes = await QueryTodo({}); - - console.log(wsRes); - setResult(wsRes); - - io.disconnect(); - setTimeout(async () => { - setXiorInstance(xior.create({ baseURL: apiURL })); - setHandler(xiorHandler); - - setHanlderName(getHandler().name); - await AddTodo({ - status: TodoStatus.todo, - title: 'create by axios', - }); - const httpRes = await QueryTodo({}); - console.log(httpRes); - - setResult(httpRes); - }, 2500); - }); - - return () => { - io.off('connect'); - }; - }, []); - - console.log(data); - return ( -
- - [web] Expo monorepo - - - - -
- Hello, {handlerName}: {JSON.stringify(result)} -
-
- ); -} diff --git a/examples/web/public/favicon.ico b/examples/web/public/favicon.ico index 718d6fea..5dbdfcdd 100644 Binary files a/examples/web/public/favicon.ico and b/examples/web/public/favicon.ico differ diff --git a/examples/web/public/vercel.svg b/examples/web/public/vercel.svg deleted file mode 100644 index fbf0e25a..00000000 --- a/examples/web/public/vercel.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - \ No newline at end of file diff --git a/examples/web/react-router.config.ts b/examples/web/react-router.config.ts new file mode 100644 index 00000000..4f9a6ed5 --- /dev/null +++ b/examples/web/react-router.config.ts @@ -0,0 +1,7 @@ +import type { Config } from '@react-router/dev/config'; + +export default { + // Config options... + // Server-side render by default, to enable SPA mode set this to `false` + ssr: true, +} satisfies Config; diff --git a/examples/web/styles/Home.module.css b/examples/web/styles/Home.module.css deleted file mode 100644 index f7cfbcc9..00000000 --- a/examples/web/styles/Home.module.css +++ /dev/null @@ -1,13 +0,0 @@ -.container { - padding: 0 2rem; -} - -.main { - min-height: 100vh; - padding: 4rem 0; - flex: 1; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; -} diff --git a/examples/web/styles/globals.css b/examples/web/styles/globals.css deleted file mode 100644 index 713c7421..00000000 --- a/examples/web/styles/globals.css +++ /dev/null @@ -1,16 +0,0 @@ -html, -body { - padding: 0; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, - Fira Sans, Droid Sans, Helvetica Neue, sans-serif; -} - -a { - color: inherit; - text-decoration: none; -} - -* { - box-sizing: border-box; -} diff --git a/examples/web/tests/sum.test.tsx b/examples/web/tests/sum.test.tsx deleted file mode 100644 index 1755e387..00000000 --- a/examples/web/tests/sum.test.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { beforeAll, afterAll, expect, describe, test } from 'vitest'; - -beforeAll(() => { - console.log('before test'); -}); - -afterAll(() => { - console.log('after test'); -}); - -describe('tests', () => { - test('test sum', () => { - expect(1 + 1).to.equal(2); - }); -}); diff --git a/examples/web/tsconfig.json b/examples/web/tsconfig.json index 02df1550..dc391a45 100644 --- a/examples/web/tsconfig.json +++ b/examples/web/tsconfig.json @@ -1,21 +1,27 @@ { + "include": [ + "**/*", + "**/.server/**/*", + "**/.client/**/*", + ".react-router/types/**/*" + ], "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "incremental": true, - "noImplicitAny": true, + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "types": ["node", "vite/client"], + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "rootDirs": [".", "./.react-router/types"], + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", + "verbatimModuleSyntax": true, + "noEmit": true, "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve" - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "../../configs/ts-config/reset.d.ts"], - "exclude": ["node_modules"] + "skipLibCheck": true, + "strict": true + } } diff --git a/examples/web/vite.config.ts b/examples/web/vite.config.ts new file mode 100644 index 00000000..9ec9983b --- /dev/null +++ b/examples/web/vite.config.ts @@ -0,0 +1,11 @@ +import { reactRouter } from '@react-router/dev/vite'; +import tailwindcss from '@tailwindcss/vite'; +import { defineConfig } from 'vite'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +export default defineConfig({ + plugins: [tailwindcss(), reactRouter(), tsconfigPaths()], + worker: { + format: 'es', + }, +}); diff --git a/package.json b/package.json index 5d37d0b8..b68145ec 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,40 @@ { "private": true, "name": "tsdk-monorepo", - "packageManager": "pnpm@9.1.2", + "packageManager": "pnpm@10.5.2", "scripts": { "lint": "pnpm -r lint", "checktype": "pnpm -r checktype", "test": "pnpm -r test", "build": "pnpm -r build", "dev": "pnpm -r dev", - "start:tsdk": "pnpm build:tsdk && pnpm --filter tsdk start", - "build:tsdk": "pnpm --filter tsdk-server-adapters --filter tsdk build", + "start:tsdk": "pnpm build:tsdk && pnpm --filter tsdk start && pnpm --filter tsdk-server-adapters test", + "start:bun": "pnpm --filter server-example bun:sync", + "build:tsdk": "pnpm --filter tsdk-server-adapters --filter tsdk build && pnpm --filter server-example sync", "dev:web-example": "pnpm --filter server-example --filter web-example dev", "dev:app-web-example": "pnpm --filter server-example --filter web-example dev", "build:web-example": "pnpm --filter server-example --filter web-example build", "serve:web-example": "pnpm build:web-example && pnpm --filter server-example --filter web-example serve", "start-publish": "pnpm --filter tsdk --filter tsdk-server-adapters start-publish", - "prepare": "is-ci || husky install" + "prepare": "is-ci || husky" }, "devDependencies": { - "@configs/eslint-config": "workspace:*", - "husky": "^8.0.3", - "lint-staged": "^14.0.1", - "is-ci": "^3.0.1" + "@eslint/js": "^9.22.0", + "@playwright/test": "^1.51.1", + "@types/node": "^20.17.24", + "eslint": "^9.22.0", + "husky": "^9.1.7", + "is-ci": "^4.1.0", + "lint-staged": "^15.5.0", + "prettier": "^3.5.3", + "typescript": "^5.9.3", + "typescript-eslint": "^8.26.1" }, "pnpm": { - "peerDependencyRules": { - "ignoreMissing": [ - "@babel/*", - "typescript" - ] - }, - "packageExtensions": {}, - "overrides": { - "uuid": "^3.4.0", - "@babel/traverse": ">=7.23.2", - "xior": "^0.6.2" - } - }, - "eslintConfig": { - "extends": "@configs/eslint-config", - "ignorePatterns": [ - "node_modules", - ".next" + "onlyBuiltDependencies": [ + "@swc/core", + "better-sqlite3", + "bufferutil" ] }, "prettier": { diff --git a/packages/bench/package.json b/packages/bench/package.json index fcc42394..d641ad4b 100644 --- a/packages/bench/package.json +++ b/packages/bench/package.json @@ -10,39 +10,29 @@ "start:all": "concurrently \"pnpm start express\" \"pnpm start tsdk-express\" \"pnpm start hono\" \"pnpm start tsdk-hono\" \"pnpm start trpc-express\" \"pnpm start fastify\"", "bench": "sh bench.sh", "bench-opi5": "sh bench-opi5.sh", - "test": "cross-env NODE_ENV=test TS_CONFIG_PATHS=true ts-mocha -p tsconfig.json src/**/*.test.ts --parallel --timeout 30000", - "lint": "eslint . --ext .ts,.tsx --fix", + "test": "vitest --run", + "lint": "eslint . --ext .ts,.tsx --fix ./src", "checktype": "tsc --noEmit" }, "dependencies": { - "tsdk-server-adapters": "^0.1.15", - "change-case": "^4.1.2", - "express": "^4.21.0", - "zod": "^3.23.8", - "hono": "^4.6.2", - "@hono/node-server": "^1.11.1", - "@trpc/server": "^10.44.1", - "fastify": "^5.0.0" + "tsdk-server-adapters": "^0.3.0", + "express": "^5.1.0", + "zod": "^4", + "hono": "^4.9.11", + "@hono/node-server": "^1.14.4", + "@trpc/server": "^10.45.2", + "fastify": "^5.6.1", + "@standard-schema/spec": "^1.0.0" }, "devDependencies": { - "@configs/test-config": "workspace:*", - "@configs/ts-config": "workspace:*", - "@configs/eslint-config": "workspace:*", - "@nestjs/cli": "^10.3.2", - "@types/express": "^4.17.21", + "@nestjs/cli": "11.0.16", + "@types/express": "^5.0.1", "tsdk": "workspace:*", - "concurrently": "^8.2.2" - }, - "eslintConfig": { - "extends": [ - "@configs/eslint-config/node" - ], - "rules": { - "@typescript-eslint/no-useless-constructor": 0 - }, - "ignorePatterns": [ - "node_modules" - ] + "concurrently": "^9.2.1", + "vitest": "^3.2.4", + "webpack": "^5.102.1", + "webpack-node-externals": "^3.0.0", + "typescript": "^5.9.3" }, "license": "MIT" } diff --git a/packages/bench/src/modules/tsdk-express/Hello.api.ts b/packages/bench/src/modules/tsdk-express/Hello.api.ts index 7b8cd41c..09db0937 100644 --- a/packages/bench/src/modules/tsdk-express/Hello.api.ts +++ b/packages/bench/src/modules/tsdk-express/Hello.api.ts @@ -1,6 +1,6 @@ import { genRoute, type RequestInfo } from './gen-route'; -import { transformPath } from '@/src/shared/tsdk-helper'; +import { transformPath } from '@/src/tsdk-shared/helpers'; export function setupHelloAPI() { const count = 2000; @@ -14,10 +14,8 @@ export function setupHelloAPI() { type: 'user', method: 'get', path: transformPath(`Hello${_i}`), - description: `Hello${_i} api`, - category: 'hello', }, - async (data, reqInfo: Readonly) => { + async (requestData, reqInfo: Readonly) => { const result = 'hi ' + Date.now() + ' ' + Math.random(); return { result }; } diff --git a/packages/bench/src/modules/tsdk-express/gen-route.ts b/packages/bench/src/modules/tsdk-express/gen-route.ts index 1b0a6dc1..99287cfa 100644 --- a/packages/bench/src/modules/tsdk-express/gen-route.ts +++ b/packages/bench/src/modules/tsdk-express/gen-route.ts @@ -1,8 +1,8 @@ import { genRouteFactory, Protocol } from 'tsdk-server-adapters'; -import { ZodError } from 'zod'; -import { ProtocolTypes } from '@/src/shared/tsdk-helper'; -import { APIConfig, APITypesKey } from '@/src/shared/tsdk-types'; +import { ProtocolTypes } from '@/src/tsdk-shared/helpers'; +import { APIConfig, APITypesKey } from '@/src/tsdk-shared/types'; +import { StandardSchemaV1 } from '@standard-schema/spec'; const middlewares = [authMiddleware]; const genRouteObj = genRouteFactory( @@ -50,12 +50,12 @@ function onErrorHandler( e: CustomError, { protocol, send, msgId }: Parameters[0]>[1] ) { - if (e instanceof ZodError) { + if ((e as unknown as StandardSchemaV1.FailureResult)?.issues) { return send({ _id: msgId, status: 400, result: { - msg: e.errors, + msg: (e as unknown as StandardSchemaV1.FailureResult).issues, }, }); } diff --git a/packages/bench/src/modules/tsdk-express/main.ts b/packages/bench/src/modules/tsdk-express/main.ts index aaa47f95..849d5769 100644 --- a/packages/bench/src/modules/tsdk-express/main.ts +++ b/packages/bench/src/modules/tsdk-express/main.ts @@ -1,10 +1,11 @@ import express, { Request } from 'express'; import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; import { setupHelloAPI } from './Hello.api'; import { RequestInfo, routeBus } from './gen-route'; -import { checkMethodHasBody } from '@/src/shared/tsdk-helper'; +import { checkMethodHasBody } from '@/src/tsdk-shared/helpers'; const port = 3015; diff --git a/packages/bench/src/modules/tsdk-hono/Hello.api.ts b/packages/bench/src/modules/tsdk-hono/Hello.api.ts index 7b8cd41c..09db0937 100644 --- a/packages/bench/src/modules/tsdk-hono/Hello.api.ts +++ b/packages/bench/src/modules/tsdk-hono/Hello.api.ts @@ -1,6 +1,6 @@ import { genRoute, type RequestInfo } from './gen-route'; -import { transformPath } from '@/src/shared/tsdk-helper'; +import { transformPath } from '@/src/tsdk-shared/helpers'; export function setupHelloAPI() { const count = 2000; @@ -14,10 +14,8 @@ export function setupHelloAPI() { type: 'user', method: 'get', path: transformPath(`Hello${_i}`), - description: `Hello${_i} api`, - category: 'hello', }, - async (data, reqInfo: Readonly) => { + async (requestData, reqInfo: Readonly) => { const result = 'hi ' + Date.now() + ' ' + Math.random(); return { result }; } diff --git a/packages/bench/src/modules/tsdk-hono/gen-route.ts b/packages/bench/src/modules/tsdk-hono/gen-route.ts index 1b0a6dc1..15f364cd 100644 --- a/packages/bench/src/modules/tsdk-hono/gen-route.ts +++ b/packages/bench/src/modules/tsdk-hono/gen-route.ts @@ -1,8 +1,7 @@ import { genRouteFactory, Protocol } from 'tsdk-server-adapters'; -import { ZodError } from 'zod'; - -import { ProtocolTypes } from '@/src/shared/tsdk-helper'; -import { APIConfig, APITypesKey } from '@/src/shared/tsdk-types'; +import { ProtocolTypes } from '@/src/tsdk-shared/helpers'; +import { APIConfig, APITypesKey } from '@/src/tsdk-shared/types'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; const middlewares = [authMiddleware]; const genRouteObj = genRouteFactory( @@ -50,12 +49,12 @@ function onErrorHandler( e: CustomError, { protocol, send, msgId }: Parameters[0]>[1] ) { - if (e instanceof ZodError) { + if ((e as unknown as StandardSchemaV1.FailureResult)?.issues) { return send({ _id: msgId, status: 400, result: { - msg: e.errors, + msg: (e as unknown as StandardSchemaV1.FailureResult).issues, }, }); } diff --git a/packages/bench/src/modules/tsdk-hono/main.ts b/packages/bench/src/modules/tsdk-hono/main.ts index dc9cad53..5726dc3f 100644 --- a/packages/bench/src/modules/tsdk-hono/main.ts +++ b/packages/bench/src/modules/tsdk-hono/main.ts @@ -1,11 +1,12 @@ import { serve } from '@hono/node-server'; import { Hono, HonoRequest } from 'hono'; import { honoAdapterFactory } from 'tsdk-server-adapters/lib/hono-adapter'; +// import { honoAdapterFactory } from 'tsdk-server-adapters/esm/hono-adapter'; import { setupHelloAPI } from './Hello.api'; import { RequestInfo, routeBus } from './gen-route'; -import { checkMethodHasBody } from '@/src/shared/tsdk-helper'; +import { checkMethodHasBody } from '@/src/tsdk-shared/helpers'; const port = 3016; @@ -30,8 +31,31 @@ app.all( getType(reqInfo) { return reqInfo.type; }, - async getData(req) { - return checkMethodHasBody(req.method) ? req.raw.body : req.query(); + async getData(req: HonoRequest) { + if (!checkMethodHasBody(req.method)) { + return req.query(); + } + const contentType = req.header('content-type') || ''; + try { + if (contentType.includes('application/json')) { + const bodyText = await req.text(); // Read raw body first + + if (!bodyText.trim()) { + return null; // Handle empty JSON body + } + + return JSON.parse(bodyText); // Manually parse to catch errors + } else if (contentType.includes('text/plain')) { + return await req.text(); + } else if ( + contentType.includes('multipart/form-data') || + contentType.includes('application/x-www-form-urlencoded') + ) { + return await req.parseBody(); + } + } catch (error) { + return null; // Gracefully handle unexpected errors + } }, }) ); diff --git a/packages/bench/src/tests/sum.test.ts b/packages/bench/src/tests/sum.test.ts index 89144273..4f1e589a 100644 --- a/packages/bench/src/tests/sum.test.ts +++ b/packages/bench/src/tests/sum.test.ts @@ -1,10 +1,10 @@ -import { expect } from 'chai'; +import { expect, it, describe, beforeAll, afterAll } from 'vitest'; -before(() => { +beforeAll(() => { console.log('before test'); }); -after(() => { +afterAll(() => { console.log('after test'); }); diff --git a/packages/bench/src/shared/tsdk-helper.ts b/packages/bench/src/tsdk-shared/helpers.ts similarity index 65% rename from packages/bench/src/shared/tsdk-helper.ts rename to packages/bench/src/tsdk-shared/helpers.ts index 313171f2..b8e76783 100644 --- a/packages/bench/src/shared/tsdk-helper.ts +++ b/packages/bench/src/tsdk-shared/helpers.ts @@ -1,8 +1,4 @@ -import { paramCase } from 'change-case'; - -import { ObjectLiteral } from '@/src/shared/tsdk-types'; - -export * from '@/src/shared/tsdk-types'; +export * from '@/src/tsdk-shared/types'; export const hasBodyMethods: { [key: string]: boolean | undefined } = { post: true, @@ -18,6 +14,13 @@ export function transformPath(path: string) { return `/${paramCase(path)}`; } +export function paramCase(input: string): string { + return input + .replace(/([a-z0-9])([A-Z])/g, '$1-$2') // Add a hyphen between lower and upper case letters + .replace(/\s+/g, '-') // Replace spaces with hyphens + .toLowerCase(); // Convert all characters to lowercase +} + export function isObject(data: T) { const result = typeof data === 'object' && diff --git a/packages/bench/src/tsdk-shared/types.ts b/packages/bench/src/tsdk-shared/types.ts new file mode 100644 index 00000000..7bf4ef5a --- /dev/null +++ b/packages/bench/src/tsdk-shared/types.ts @@ -0,0 +1,29 @@ +import type { StandardSchemaV1 } from '@standard-schema/spec'; + +export const APITypes = { + user: 'user', + admin: 'admin', + common: 'common', +} as const; + +export const APITypesKey = Object.keys(APITypes).filter((item) => item !== APITypes.common); + +export type APIType = keyof typeof APITypes; + +export interface APIConfig { + /** The API type. Like: user side or admin side. */ + type: APIType; + /** The API path */ + path: string; + method: 'get' | 'post' | 'delete' | 'put' | 'patch' | 'head' | 'options'; + /** Request data validate scheme */ + schema?: StandardSchemaV1; + /** The API need auth? Default is false */ + needAuth?: boolean; + /** The API disabled? Default is false */ + disabled?: boolean; + + /** custom headers for client */ + headers?: { [key: string]: any }; + isGet?: boolean; +} diff --git a/packages/tsdk-server-adapters/.gitignore b/packages/tsdk-server-adapters/.gitignore index 7951405f..cc186b1e 100644 --- a/packages/tsdk-server-adapters/.gitignore +++ b/packages/tsdk-server-adapters/.gitignore @@ -1 +1,2 @@ -lib \ No newline at end of file +lib +esm \ No newline at end of file diff --git a/packages/tsdk-server-adapters/package.json b/packages/tsdk-server-adapters/package.json index c1b15875..89aab9b7 100644 --- a/packages/tsdk-server-adapters/package.json +++ b/packages/tsdk-server-adapters/package.json @@ -1,19 +1,24 @@ { "name": "tsdk-server-adapters", - "version": "0.3.0", + "version": "1.0.0-alpha.2", "main": "lib/index.js", + "module": "esm/index.js", "repository": "tsdk-monorepo/tsdk", "bugs": "https://github.com/tsdk-monorepo/tsdk/issues", "homepage": "https://tsdk.dev", "scripts": { - "start-publish": "npm run build && npm publish --access public --no-git-checks --provenance --registry=https://registry.npmjs.org", - "build": "rm -rf lib && tsc --project tsconfig.json && rm -rf lib/tests", - "lint": "eslint . --ext .ts,.tsx --fix", + "build": "concurrently \"npm run build:cjs\" \"npm run build:esm\"", + "build:cjs": "rm -rf lib && tsc --project tsconfig.json && rm -rf lib/tests", + "build:esm": "rm -rf esm && tsc --project tsconfig.esm.json && rm -rf esm/tests", + "lint": "eslint ./src --ext .ts,.tsx --fix", "checktype": "tsc --noEmit", - "test": "cross-env NODE_ENV=test TS_CONFIG_PATHS=true ts-mocha -p tsconfig.json src/**/*.test.ts --parallel --timeout 30000" + "test": "vitest --run --testTimeout=120000 --hookTimeout=60000", + "start-publish": "npm run build && node ../../scripts/purge-pkg-for-publish.mjs && npm publish --access public --no-git-checks --provenance --registry=https://registry.npmjs.org", + "local:start-publish": "npm run build && node ../../scripts/purge-pkg-for-publish.mjs && npm publish --tag alpha --access public --no-git-checks --provenance=false --registry=https://registry.npmjs.org" }, "files": [ "lib/*", + "esm/*", "README.md" ], "keywords": [ @@ -26,22 +31,34 @@ "typesafe API" ], "dependencies": { - "eventemitter3": "^5.0.1" + "eventemitter3": "^5.0.1", + "@standard-schema/spec": "^1.1.0" }, "devDependencies": { - "@configs/ts-config": "workspace:*", - "@configs/eslint-config": "workspace:*", - "@configs/test-config": "workspace:*", - "@types/express": "^4.17.21", - "typescript": "^5", - "@tsconfig/recommended": "^1.0.7" + "@types/express": "^5.0.1", + "typescript": "^5.9.3", + "@tsconfig/recommended": "^1.0.10", + "vitest": "^3.2.4", + "concurrently": "^9.2.1", + "zod": "^4", + "valibot": "^1.2.0", + "arktype": "^2.1.29", + "hono": "^4.11.3", + "fastify": "^5.6.2", + "@fastify/express": "^4.0.2", + "@hono/node-server": "^1.19.7", + "express": "^5.2.1", + "socket.io": "^4.8.3", + "socket.io-client": "^4.8.3", + "multer": "^2.0.2", + "@types/multer": "^2.0.0" }, "peerDependencies": { - "express": "^4.21.0", - "zod": "^3.23.8", - "socket.io": "^4.8.0", - "hono": "^4.6.2", - "fastify": "^5.0.0" + "express": "^5.2.1", + "zod": "^4", + "socket.io": "^4.8.3", + "hono": "^4.11.3", + "fastify": "^5.6.2" }, "peerDependenciesMeta": { "express": { @@ -57,13 +74,5 @@ "optional": true } }, - "eslintConfig": { - "extends": [ - "@configs/eslint-config/node" - ], - "ignorePatterns": [ - "node_modules" - ] - }, "license": "MIT" } diff --git a/packages/tsdk-server-adapters/src/express-adapter.ts b/packages/tsdk-server-adapters/src/express-adapter.ts index c8c0f361..f539e482 100644 --- a/packages/tsdk-server-adapters/src/express-adapter.ts +++ b/packages/tsdk-server-adapters/src/express-adapter.ts @@ -25,7 +25,7 @@ export function expressAdapterFactory({ path: req.path, }); - if ((routeBus as ObjectLiteral)._events[eventName]) { + if (eventName in (routeBus as ObjectLiteral)._events) { const payload = await getData(req); routeBus.emit(eventName, reqInfo, res, { payload }); } else { diff --git a/packages/tsdk-server-adapters/src/gen-route-factory.ts b/packages/tsdk-server-adapters/src/gen-route-factory.ts index b705a7ec..11099d60 100644 --- a/packages/tsdk-server-adapters/src/gen-route-factory.ts +++ b/packages/tsdk-server-adapters/src/gen-route-factory.ts @@ -1,15 +1,16 @@ -// @ts-ignore import EventEmitter from 'eventemitter3'; // @ts-ignore import type { Response } from 'express'; // @ts-ignore import type { Context } from 'hono'; +// @ts-ignore import { StatusCode } from 'hono/utils/http-status'; // @ts-ignore import type { Socket } from 'socket.io'; // @ts-ignore import type { WebSocket } from 'ws'; -import type { ZodTypeAny } from 'zod'; +// @ts-ignore +import type { StandardSchemaV1 } from '@standard-schema/spec'; export const PROTOCOLs = { /** express.js */ @@ -30,8 +31,8 @@ type ResponseSocket = Response | Context | Socket | WebSocket; interface BasicAPIConfig { method: string; path: string; - type: string; - schema?: ZodTypeAny; + type?: string; + schema?: StandardSchemaV1; } export interface ObjectLiteral { @@ -46,21 +47,21 @@ export interface ProtocolType { export function getRouteEventName( config: Pick & { protocol: Protocol } ) { - return `${PROTOCOLs[config.protocol]}:${config.type}:${config.method}:${config.path}`; + return `${PROTOCOLs[config.protocol]}:${config.type || 'user'}:${config.method}:${config.path}`; } function sendFactory( protocol: Protocol, response: ResponseSocket, protocolType: ProtocolType, - callback?: (result: any) => void + callback?: (result: unknown) => void ) { return function send(payload: { _id: string; status?: number; result?: unknown; // [key: string]: unknown; - callback?: Function; + callback?: () => void; }) { // default http is express.js if (protocol === 'express') { @@ -88,7 +89,7 @@ function sendFactory( export function genRouteFactory( onErrorHandler: ( - error: unknown, + error: Error, params: { protocol: Protocol; msgId: string; @@ -122,7 +123,7 @@ export function genRouteFactory( reqInfo: Readonly, response: ResponseSocket, { _id: msgId, payload }: { _id: string; payload: ReqData }, - callback?: (result: any) => void + callback?: () => void ) { const send = sendFactory(protocol, response, protocolType, callback); @@ -134,11 +135,13 @@ export function genRouteFactory( return previousPromise.then(() => nextMiddleware(protocol, apiConfig, reqInfo)); }, Promise.resolve()); } - const data = apiConfig.schema ? apiConfig.schema.parse(payload) : payload; + const data = apiConfig.schema + ? await standardValidate(apiConfig.schema, payload || {}) + : payload; const result = await cb(data, reqInfo, response); send({ result, _id: msgId, callback }); } catch (e) { - onErrorHandler(e, { + onErrorHandler(e as Error, { protocol, msgId, send, @@ -168,7 +171,7 @@ export function genRouteFactory( reqInfo: Readonly, resOrSocket: ResponseSocket, body: { _id: string; payload: ReqData }, - callback?: (result: any) => void + callback?: () => void ) => { onEvent(i as Protocol, reqInfo, resOrSocket, body, callback); } @@ -186,7 +189,7 @@ export function genRouteFactory( resOrSocket?: ResponseSocket ) => Promise ) { - if (apiConfig.type === 'common' || !apiConfig.type) { + if (apiConfig.type === 'common') { if (!types || types?.length === 0) { throw new Error(`\`genRouteFactory\` \`types\` param is required`); } @@ -202,3 +205,18 @@ export function genRouteFactory( getRouteEventName, }; } + +export async function standardValidate( + schema: T, + input: StandardSchemaV1.InferInput +): Promise> { + let result = schema['~standard'].validate(input); + if (result instanceof Promise) result = await result; + + // if the `issues` field exists, the validation failed + if (result.issues) { + throw result; + } + + return result.value; +} diff --git a/packages/tsdk-server-adapters/src/hono-adapter.ts b/packages/tsdk-server-adapters/src/hono-adapter.ts index 4e15820f..03a1c03e 100644 --- a/packages/tsdk-server-adapters/src/hono-adapter.ts +++ b/packages/tsdk-server-adapters/src/hono-adapter.ts @@ -1,7 +1,12 @@ +// @ts-ignore import type { HonoRequest as Request, Context as HonoContext, Next as NextFunction } from 'hono'; - import { genRouteFactory, getRouteEventName, ObjectLiteral } from './gen-route-factory'; +/** + * Factory to create a Hono middleware adapter for the route bus + * @param options Configuration options for the adapter + * @returns Hono middleware function + */ export function honoAdapterFactory({ routeBus, getReqInfo, @@ -13,34 +18,64 @@ export function honoAdapterFactory({ getData: (req: Request) => ObjectLiteral | Promise; getType: (reqInfo: ReqInfo, req: Request) => string; }) { - return async function honoAdapter(c: HonoContext, next: NextFunction): Promise { - const { req } = c; - const method = req.method.toLowerCase(); - const reqInfo = await getReqInfo(req); - const type = getType(reqInfo, req); - const paths = req.path.split(`/${type}/`); - paths.shift(); - const path = `/${paths.join('/')}`; - const eventName = getRouteEventName({ - protocol: 'hono', - type, - method, - path, - }); - if ((routeBus as ObjectLiteral)._events[eventName]) { - const payload = await getData(req); - const response = await new Promise((resolve, reject) => { - routeBus.emit(eventName, reqInfo, c, { payload }, (result: Response) => { - try { - resolve(result); - } catch (e) { - reject(e); - } - }); + return async function honoAdapter(c: HonoContext, next: NextFunction): Promise { + try { + const { req } = c; + const method = req.method.toLowerCase(); + + // Extract request info and determine the route type + const reqInfo = await getReqInfo(req); + const type = getType(reqInfo, req); + + // Parse the path based on the route type + const paths = req.path.split(`/${type}/`); + paths.shift(); + const path = paths.length > 0 ? `/${paths.join('/')}` : '/'; + + // Generate the event name for the route + const eventName = getRouteEventName({ + protocol: 'hono', + type, + method, + path, }); - return response as Response; - } else { + + // Check if there's a handler for this route + const hasHandler = + (routeBus as ObjectLiteral)._events && eventName in (routeBus as ObjectLiteral)._events; + + if (hasHandler) { + const payload = await getData(req); + + // Process the request through the route bus + return await new Promise((resolve, reject) => { + routeBus.emit(eventName, reqInfo, c, { payload }, (result: Response | Error) => { + if (result instanceof Error) { + reject(result); + } else { + resolve(result); + } + }); + }); + } + + // No handler found, continue to next middleware return next(); + } catch (error) { + // Handle any unexpected errors + console.error('Error in Hono adapter:', error); + + // Return a generic error response + return new Response( + JSON.stringify({ + error: 'Internal server error', + message: error instanceof Error ? error.message : 'Unknown error', + }), + { + status: 500, + headers: { 'Content-Type': 'application/json' }, + } + ); } }; } diff --git a/packages/tsdk-server-adapters/src/socket.io-adapter.ts b/packages/tsdk-server-adapters/src/socket.io-adapter.ts index 3bf4b362..9af05cd9 100644 --- a/packages/tsdk-server-adapters/src/socket.io-adapter.ts +++ b/packages/tsdk-server-adapters/src/socket.io-adapter.ts @@ -34,7 +34,7 @@ export function socketIOAdapterFactory({ return async function socketIOAdapter(socket: Socket) { const reqInfo = await getReqInfo(socket); - const onRequest = async (data: { _id: string; payload: any }) => { + const onRequest = async (data: { _id: string; payload: unknown }) => { if (!socket.connected) return; if (data && data._id) { @@ -43,8 +43,7 @@ export function socketIOAdapterFactory({ const [methodIdx, path] = data._id.split(':'); const method = methodsMap[methodIdx] || methodIdx || 'get'; const eventName = getRouteEventName({ protocol: 'socket.io', type, method, path }); - - if ((routeBus as ObjectLiteral)._events[eventName]) { + if (eventName in (routeBus as ObjectLiteral)._events) { routeBus.emit(eventName, reqInfo, socket, getData ? await getData(data) : data); } } diff --git a/packages/tsdk-server-adapters/src/tests/sum.test.ts b/packages/tsdk-server-adapters/src/tests/sum.test.ts deleted file mode 100644 index 89144273..00000000 --- a/packages/tsdk-server-adapters/src/tests/sum.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { expect } from 'chai'; - -before(() => { - console.log('before test'); -}); - -after(() => { - console.log('after test'); -}); - -describe('tests', () => { - it('test sum', () => { - expect(1 + 1).to.equal(2); - }); -}); diff --git a/packages/tsdk-server-adapters/tests/express-adapter.test.ts b/packages/tsdk-server-adapters/tests/express-adapter.test.ts new file mode 100644 index 00000000..6fbcb143 --- /dev/null +++ b/packages/tsdk-server-adapters/tests/express-adapter.test.ts @@ -0,0 +1,301 @@ +import { it, beforeAll, afterAll, describe, expect } from 'vitest'; + +import http from 'http'; +import { app } from './servers/express-adapter.app'; + +const server = http.createServer(app); +const port = 7001; + +beforeAll(async () => { + await new Promise((resolve) => + server.listen(port, () => { + resolve('ok'); + }) + ); +}); + +afterAll(async () => { + await new Promise((resolve) => + server.close(() => { + resolve('ok'); + }) + ); +}); + +describe('express adapter tests', () => { + it('GET should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello`).then((res) => res.json()); + expect(result.msg).toBe('hello get'); + }); + + it('GET with query data should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello?a=1&b=2`).then((res) => + res.json() + ); + expect(result.msg).toBe('hello get'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('GET with auth API should work with token', async () => { + const result = await fetch(`http://localhost:${port}/api/user/auth`, { + headers: { + authorization: 'this is token', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + expect(result.msg).toBe('ok'); + }); + + it('GET with auth API should throw error without token', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/auth`) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(401); + }); + + it('POST should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello`, { method: 'post' }).then( + (res) => res.json() + ); + expect(result.msg).toBe('hello post'); + }); + + it('POST with data should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello`, { + method: 'post', + body: JSON.stringify({ a: '1', b: '2' }), + headers: { + 'content-type': 'application/json', + }, + }).then((res) => res.json()); + expect(result.msg).toBe('hello post'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('POST with auth API should work with token', async () => { + const result = await fetch(`http://localhost:${port}/api/user/auth`, { + method: 'post', + headers: { + authorization: 'this is token', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + expect(result.msg).toBe('ok'); + }); + + it('POST with auth API should throw error without token', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/auth`, { method: 'post' }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(401); + }); + + it('POST with FormData should work', async () => { + const formData = new FormData(); + formData.append('a', '1'); + formData.append('b', '2'); + const result = await fetch(`http://localhost:${port}/api/user/hello`, { + method: 'post', + body: formData, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + expect(result.msg).toBe('hello post'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('GET with not exists path should throw 404 error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/not-found-path`, { method: 'get' }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(404); + }); + + it('POST with not exists path should throw 404 error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/not-found-path`, { method: 'post' }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(404); + }); + + it('GET with not valid query data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello?a=a&b=b&c=d`) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + expect(res.errors[0].code).toBe('unrecognized_keys'); + expect(res.errors[1]).toBeUndefined(); + }); + + it('POST with not valid data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello`, { + method: 'post', + body: JSON.stringify({ a: '1', b: '2', c: 'd' }), + headers: { + 'content-type': 'application/json', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + expect(res.errors[0].code).toBe('unrecognized_keys'); + expect(res.errors[1]).toBeUndefined(); + }); + + it('[valibot] GET should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello-valibot`).then((res) => + res.json() + ); + expect(result.msg).toBe('hello get'); + }); + + it('[valibot] GET with query data should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello-valibot?a=1&b=2`).then( + (res) => res.json() + ); + expect(result.msg).toBe('hello get'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('[valibot] GET with not valid query data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello-valibot?a=a&b=b&c=d`) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + expect(res.errors[0].expected).toBe('never'); + expect(res.errors[0].received).toBe('"c"'); + expect(res.errors[1]).toBeUndefined(); + }); + + it('[valibot] POST with not valid data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello-valibot`, { + method: 'post', + body: JSON.stringify({ a: '1', b: '2', c: 'd' }), + headers: { + 'content-type': 'application/json', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + expect(res.errors[0].expected).toBe('never'); + expect(res.errors[0].received).toBe('"c"'); + expect(res.errors[1]).toBeUndefined(); + }); + + it('[arktype] GET should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello-arktype`).then((res) => + res.json() + ); + expect(result.msg).toBe('hello get'); + }); + + it('[arktype] GET with query data should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello-arktype?a=1&b=2`).then( + (res) => res.json() + ); + expect(result.msg).toBe('hello get'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('[arktype] GET with not valid query data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello-arktype?a=a&b=b&c=d`) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + + expect(res.errors[0].expected).toBe('removed'); + expect(res.errors[0].message).toBe('c must be removed'); + expect(res.errors[1]).toBeUndefined(); + }); + + it('[arktype] POST with not valid data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello-arktype`, { + method: 'post', + body: JSON.stringify({ a: '1', b: '2', c: 'd' }), + headers: { + 'content-type': 'application/json', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + + expect(res.errors[0].expected).toBe('removed'); + expect(res.errors[0].message).toBe('c must be removed'); + expect(res.errors[1]).toBeUndefined(); + }); +}); diff --git a/packages/tsdk-server-adapters/tests/fastify-adapter.test.ts b/packages/tsdk-server-adapters/tests/fastify-adapter.test.ts new file mode 100644 index 00000000..9723e385 --- /dev/null +++ b/packages/tsdk-server-adapters/tests/fastify-adapter.test.ts @@ -0,0 +1,185 @@ +import { it, beforeAll, afterAll, describe, expect } from 'vitest'; + +import { app } from './servers/fastify-adapter.app'; + +const server = app; +const port = 7002; +beforeAll(async () => { + await new Promise((resolve) => + server.listen({ port }, () => { + resolve('ok'); + }) + ); +}); + +afterAll(async () => { + await new Promise((resolve) => + server.close(() => { + resolve('ok'); + }) + ); +}); + +describe('Fastify with `express-adapter` tests', () => { + it('GET should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello`).then((res) => res.json()); + expect(result.msg).toBe('hello get'); + }); + + it('GET with query data should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello?a=1&b=2`).then((res) => + res.json() + ); + expect(result.msg).toBe('hello get'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('GET with auth API should work with token', async () => { + const result = await fetch(`http://localhost:${port}/api/user/auth`, { + headers: { + authorization: 'this is token', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + expect(result.msg).toBe('ok'); + }); + + it('GET with auth API should throw error without token', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/auth`) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(401); + }); + + // it('POST with FormData should work', async () => { + // const formData = new FormData(); + // formData.append('a', '1'); + // formData.append('b', '2'); + // const result = await fetch(`http://localhost:${port}/api/user/hello`, { + // method: 'post', + // body: formData, + // }) + // .then((res) => (res.ok ? res : Promise.reject(res))) + // .then((res) => res.json()); + // expect(result.msg).toBe('hello post'); + // expect(result.data.a).toBe('1'); + // expect(result.data.b).toBe('2'); + // }); + + it('POST should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello`, { method: 'post' }).then( + (res) => res.json() + ); + expect(result.msg).toBe('hello post'); + }); + + it('POST with data should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello`, { + method: 'post', + body: JSON.stringify({ a: '1', b: '2' }), + headers: { + 'Content-Type': 'application/json', + }, + }).then((res) => res.json()); + expect(result.msg).toBe('hello post'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('POST with auth API should work with token', async () => { + const result = await fetch(`http://localhost:${port}/api/user/auth`, { + method: 'post', + headers: { + authorization: 'this is token', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + expect(result.msg).toBe('ok'); + }); + + it('POST with auth API should throw error without token', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/auth`, { method: 'post' }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(401); + }); + + it('GET with not exists path should throw 404 error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/not-found-path`, { method: 'get' }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(404); + }); + + it('POST with not exists path should throw 404 error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/not-found-path`, { method: 'post' }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(404); + }); + + it('GET with not valid query data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello?a=a&b=b&c=d`) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + expect(res.errors[0].code).toBe('unrecognized_keys'); + expect(res.errors[1]).toBeUndefined(); + }); + + it('POST with not valid data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello`, { + method: 'post', + body: JSON.stringify({ a: '1', b: '2', c: 'd' }), + headers: { + 'content-type': 'application/json', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + expect(res.errors[0].code).toBe('unrecognized_keys'); + expect(res.errors[1]).toBeUndefined(); + }); +}); diff --git a/packages/tsdk-server-adapters/tests/hono-adapter.test.ts b/packages/tsdk-server-adapters/tests/hono-adapter.test.ts new file mode 100644 index 00000000..c2e85147 --- /dev/null +++ b/packages/tsdk-server-adapters/tests/hono-adapter.test.ts @@ -0,0 +1,189 @@ +import { it, beforeAll, afterAll, describe, expect } from 'vitest'; + +import { serve } from '@hono/node-server'; +import { app } from './servers/hono-adapter.app'; + +const port = 7003; +const server = serve({ + fetch: app.fetch, + port, +}); + +beforeAll(() => { + return new Promise((resolve) => setTimeout(resolve, 1000)); +}); + +afterAll(async () => { + await new Promise((resolve) => + server.close(() => { + resolve('ok'); + }) + ); +}); + +describe('Hono adapter tests', () => { + it('GET should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello`).then((res) => res.json()); + expect(result.msg).toBe('hello get'); + }); + + it('GET with query data should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello?a=1&b=2`).then((res) => + res.json() + ); + expect(result.msg).toBe('hello get'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('GET with auth API should work with token', async () => { + const result = await fetch(`http://localhost:${port}/api/user/auth`, { + headers: { + authorization: 'this is token', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + expect(result.msg).toBe('ok'); + }); + + it('GET with auth API should throw error without token', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/auth`) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(401); + }); + + it('POST with FormData should work', async () => { + const formData = new FormData(); + formData.append('a', '1'); + formData.append('b', '2'); + const result = await fetch(`http://localhost:${port}/api/user/hello`, { + method: 'post', + body: formData, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + expect(result.msg).toBe('hello post'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('POST should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello`, { + method: 'post', + headers: { + 'content-type': 'application/json', + }, + }).then((res) => res.json()); + expect(result.msg).toBe('hello post'); + }); + + it('POST with data should work', async () => { + const result = await fetch(`http://localhost:${port}/api/user/hello`, { + method: 'post', + body: JSON.stringify({ a: '1', b: '2' }), + headers: { + 'Content-Type': 'application/json', + }, + }).then((res) => res.json()); + expect(result.msg).toBe('hello post'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('POST with auth API should work with token', async () => { + const result = await fetch(`http://localhost:${port}/api/user/auth`, { + method: 'post', + headers: { + authorization: 'this is token', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + expect(result.msg).toBe('ok'); + }); + + it('POST with auth API should throw error without token', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/auth`, { method: 'post' }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(401); + }); + + it('GET with not exists path should throw 404 error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/not-found-path`, { method: 'get' }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(404); + }); + + it('POST with not exists path should throw 404 error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/not-found-path`, { method: 'post' }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(404); + }); + + it('GET with not valid query data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello?a=a&b=b&c=d`) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + expect(res.errors[0].code).toBe('unrecognized_keys'); + expect(res.errors[1]).toBeUndefined(); + }); + + it('POST with not valid data should throw error', async () => { + let error!: Response; + try { + await fetch(`http://localhost:${port}/api/user/hello`, { + method: 'post', + body: JSON.stringify({ a: '1', b: '2', c: 'd' }), + headers: { + 'content-type': 'application/json', + }, + }) + .then((res) => (res.ok ? res : Promise.reject(res))) + .then((res) => res.json()); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = await error.json(); + expect(res.errors[0].code).toBe('unrecognized_keys'); + expect(res.errors[1]).toBeUndefined(); + }); +}); diff --git a/packages/tsdk-server-adapters/tests/servers/express-adapter.app.ts b/packages/tsdk-server-adapters/tests/servers/express-adapter.app.ts new file mode 100644 index 00000000..5d3cdba1 --- /dev/null +++ b/packages/tsdk-server-adapters/tests/servers/express-adapter.app.ts @@ -0,0 +1,134 @@ +import { z } from 'zod'; +import express from 'express'; +import multer from 'multer'; +import { expressAdapterFactory } from '../../src/express-adapter'; +import genRoute, { routeBus } from './gen-route'; +import { checkMethodHasBody, RequestInfo } from './utils'; + +import * as v from 'valibot'; +import { type } from 'arktype'; + +export const app = express(); + +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); + +genRoute( + { + method: 'get', + path: '/hello', + schema: z + .object({ + a: z.string().optional(), + b: z.string().optional(), + }) + .strict(), + }, + async (data) => { + return { msg: 'hello get', data }; + } +); +genRoute( + { + method: 'post', + path: '/hello', + schema: z + .object({ + a: z.string().optional(), + b: z.string().optional(), + }) + .strict(), + }, + async (data) => { + return { msg: 'hello post', data }; + } +); + +// valibot +genRoute( + { + method: 'get', + path: '/hello-valibot', + schema: v.strictObject({ + a: v.optional(v.string()), + b: v.optional(v.string()), + }), + }, + async (data) => { + return { msg: 'hello get', data }; + } +); +genRoute( + { + method: 'post', + path: '/hello-valibot', + schema: v.strictObject({ + a: v.optional(v.string()), + b: v.optional(v.string()), + }), + }, + async (data) => { + return { msg: 'hello post', data }; + } +); + +// arktype +genRoute( + { + method: 'get', + path: '/hello-arktype', + schema: type({ + a: 'string?', + b: 'string?', + }).onUndeclaredKey('reject'), + }, + async (data) => { + return { msg: 'hello get', data }; + } +); +genRoute( + { + method: 'post', + path: '/hello-arktype', + schema: type({ + a: 'string?', + b: 'string?', + }).onUndeclaredKey('reject'), + }, + async (data) => { + return { msg: 'hello post', data }; + } +); + +genRoute({ method: 'get', path: '/auth', needAuth: true }, async (data) => { + return { msg: 'ok', data }; +}); +genRoute({ method: 'post', path: '/auth', needAuth: true }, async (data) => { + return { msg: 'ok', data }; +}); + +app.use( + '/api/:type', + (req, res, next) => { + // if ([UploadImageConfig.path].includes(req.url)) { + // return next(); + // } + multer().none()(req, res, next); // enable form data without upload + }, + expressAdapterFactory({ + routeBus, + async getReqInfo(req) { + return { + type: req.params.type, + token: req.headers.authorization, + }; + }, + getType(reqInfo) { + return reqInfo.type; + }, + async getData(req) { + // maybe decode here?(e.g.: decryption) + return checkMethodHasBody(req.method) ? req.body : req.query; + }, + }) +); diff --git a/packages/tsdk-server-adapters/tests/servers/fastify-adapter.app.ts b/packages/tsdk-server-adapters/tests/servers/fastify-adapter.app.ts new file mode 100644 index 00000000..07b01dd6 --- /dev/null +++ b/packages/tsdk-server-adapters/tests/servers/fastify-adapter.app.ts @@ -0,0 +1,81 @@ +import { z } from 'zod'; +import express from 'express'; +import fastifyExpress from '@fastify/express'; +import Fastify from 'fastify'; +import http from 'http'; +import { expressAdapterFactory } from '../../src/express-adapter'; +import genRoute, { routeBus } from './gen-route'; +import { checkMethodHasBody, RequestInfo } from './utils'; + +let server: http.Server; + +const serverFactory = ( + handler: (req: http.IncomingMessage, res: http.ServerResponse) => void +) => { + server = http.createServer((req, res) => { + handler(req, res); + }); + + return server; +}; +export const app = Fastify({ serverFactory }); +await app.register(fastifyExpress); + +genRoute( + { + method: 'get', + path: '/hello', + schema: z + .object({ + a: z.string().optional(), + b: z.string().optional(), + }) + .strict(), + }, + async (data) => { + return { msg: 'hello get', data }; + } +); +genRoute( + { + method: 'post', + path: '/hello', + schema: z + .object({ + a: z.string().optional(), + b: z.string().optional(), + }) + .strict(), + }, + async (data) => { + return { msg: 'hello post', data }; + } +); + +genRoute({ method: 'get', path: '/auth', needAuth: true }, async (data) => { + return { msg: 'ok', data }; +}); +genRoute({ method: 'post', path: '/auth', needAuth: true }, async (data) => { + return { msg: 'ok', data }; +}); + +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); +app.use( + '/api/:type', + expressAdapterFactory({ + routeBus, + async getReqInfo(req) { + return { + type: req.params.type, + token: req.headers.authorization, + }; + }, + getType(reqInfo) { + return reqInfo.type; + }, + async getData(req) { + return checkMethodHasBody(req.method) ? req.body : req.query; + }, + }) +); diff --git a/packages/tsdk-server-adapters/tests/servers/gen-route.ts b/packages/tsdk-server-adapters/tests/servers/gen-route.ts new file mode 100644 index 00000000..1e90ff36 --- /dev/null +++ b/packages/tsdk-server-adapters/tests/servers/gen-route.ts @@ -0,0 +1,69 @@ +import { genRouteFactory, getRouteEventName, Protocol } from '../../src'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; +import { APIConfig, ProtocolTypes, RequestInfo } from './utils'; + +export type RequestError = { + errors?: StandardSchemaV1.Issue[]; + message?: string; +}; + +function onErrorHandler( + e: unknown, + { send, msgId }: Parameters[0]>[1] +) { + if ((e as unknown as StandardSchemaV1.FailureResult)?.issues) { + return send({ + _id: msgId, + status: 400, + result: { + errors: (e as unknown as StandardSchemaV1.FailureResult).issues, + }, + }); + } + + let status = 500; + if (e instanceof AuthError) { + status = 401; + } + const message = (e as Error).message; + return send({ _id: msgId, status, result: { message } }); +} + +class AuthError extends Error { + // +} + +async function langMiddleware(protocol: Protocol, apiConfig: APIConfig, reqInfo: RequestInfo) { + // parse lang in adapter or here + // @todo + // reqInfo.lang = 'zh-CN'; + // if correct, next + return Promise.resolve(); +} + +async function authMiddleware(protocol: Protocol, apiConfig: APIConfig, reqInfo: RequestInfo) { + if (protocol === 'socket.io' || protocol === 'ws') { + // only parse once for socket + } + if (!apiConfig.needAuth) { + return Promise.resolve(); + } + if (!reqInfo.token) { + return Promise.reject(new AuthError()); + } + + return Promise.resolve(); +} + +const middlewares = [langMiddleware, authMiddleware]; +export const genRouteObj = genRouteFactory( + onErrorHandler, + ProtocolTypes, + middlewares +); + +export const routeBus = genRouteObj.routeBus; + +export { getRouteEventName }; + +export default genRouteObj.genRoute; diff --git a/packages/tsdk-server-adapters/tests/servers/hono-adapter.app.ts b/packages/tsdk-server-adapters/tests/servers/hono-adapter.app.ts new file mode 100644 index 00000000..132fefef --- /dev/null +++ b/packages/tsdk-server-adapters/tests/servers/hono-adapter.app.ts @@ -0,0 +1,89 @@ +import { z } from 'zod'; +import { Hono, HonoRequest } from 'hono'; + +import { honoAdapterFactory } from '../../src/hono-adapter'; +import genRoute, { routeBus } from './gen-route'; +import { checkMethodHasBody, RequestInfo } from './utils'; + +export const app = new Hono(); + +genRoute( + { + method: 'get', + path: '/hello', + schema: z + .object({ + a: z.string().optional(), + b: z.string().optional(), + }) + .strict(), + }, + async (data) => { + return { msg: 'hello get', data }; + } +); +genRoute( + { + method: 'post', + path: '/hello', + schema: z + .object({ + a: z.string().optional(), + b: z.string().optional(), + }) + .strict(), + }, + async (data) => { + return { msg: 'hello post', data }; + } +); + +genRoute({ method: 'get', path: '/auth', needAuth: true }, async (data) => { + return { msg: 'ok', data }; +}); +genRoute({ method: 'post', path: '/auth', needAuth: true }, async (data) => { + return { msg: 'ok', data }; +}); + +app.all( + '/api/:type/*', + honoAdapterFactory({ + routeBus, + async getReqInfo(req: HonoRequest) { + const params = { + type: (req.param() as { type: string }).type, + token: req.header('authorization'), + }; + return params; + }, + getType(reqInfo) { + return reqInfo.type; + }, + async getData(req: HonoRequest) { + if (!checkMethodHasBody(req.method)) { + return req.query(); + } + const contentType = req.header('content-type') || ''; + try { + if (contentType.includes('application/json')) { + const bodyText = await req.text(); // Read raw body first + + if (!bodyText.trim()) { + return null; // Handle empty JSON body + } + + return JSON.parse(bodyText); // Manually parse to catch errors + } else if (contentType.includes('text/plain')) { + return await req.text(); + } else if ( + contentType.includes('multipart/form-data') || + contentType.includes('application/x-www-form-urlencoded') + ) { + return await req.parseBody(); + } + } catch (error) { + return null; // Gracefully handle unexpected errors + } + }, + }) +); diff --git a/packages/tsdk-server-adapters/tests/servers/socket.io-adapter.app.ts b/packages/tsdk-server-adapters/tests/servers/socket.io-adapter.app.ts new file mode 100644 index 00000000..2e1c4ed3 --- /dev/null +++ b/packages/tsdk-server-adapters/tests/servers/socket.io-adapter.app.ts @@ -0,0 +1,76 @@ +import { z } from 'zod'; +import http from 'http'; +import { Server } from 'socket.io'; + +import { socketIOAdapterFactory } from '../../src/socket.io-adapter'; +import genRoute, { routeBus } from './gen-route'; +import { ProtocolTypes, RequestInfo } from './utils'; + +genRoute( + { + method: 'get', + path: '/hello', + schema: z + .object({ + a: z.string().optional(), + b: z.string().optional(), + }) + .strict(), + }, + async (data) => { + return { msg: 'hello get', data }; + } +); +genRoute( + { + method: 'post', + path: '/hello', + schema: z + .object({ + a: z.string().optional(), + b: z.string().optional(), + }) + .strict(), + }, + async (data) => { + return { msg: 'hello post', data }; + } +); + +genRoute({ method: 'get', path: '/auth', needAuth: true }, async (data) => { + return { msg: 'ok', data }; +}); +genRoute({ method: 'post', path: '/auth', needAuth: true }, async (data) => { + return { msg: 'ok', data }; +}); + +export const server = http.createServer(); +export const io = new Server(server); + +io.on('connection', (socket) => { + const { address, query, headers } = socket.handshake; + + const reqInfo = { + ip: address, + token: query.token as string, + type: query.type as string, + }; + + socket.on('token', (token) => { + reqInfo.token = token; + }); + + socketIOAdapterFactory({ + routeBus, + getReqInfo() { + return reqInfo; + }, + getType(reqInfo) { + return reqInfo.type; + }, + getData(data) { + return data; + }, + protocolType: ProtocolTypes, + })(socket); +}); diff --git a/packages/tsdk-server-adapters/tests/servers/utils.ts b/packages/tsdk-server-adapters/tests/servers/utils.ts new file mode 100644 index 00000000..bab47b5a --- /dev/null +++ b/packages/tsdk-server-adapters/tests/servers/utils.ts @@ -0,0 +1,83 @@ +import { type StandardSchemaV1 } from '@standard-schema/spec'; + +export const hasBodyMethods: { [key: string]: boolean | undefined } = { + post: true, + put: true, + patch: true, +}; + +export function checkMethodHasBody(method: string) { + return hasBodyMethods[method.toLowerCase()]; +} + +export const ProtocolTypes = { + request: 'REQ:', + response: 'RES:', + set: 'SET:', +}; + +export interface RequestInfo { + /** user or admin? */ + type: string; + username?: string; + userId?: number; + token?: string; +} + +export type ReadonlyRequestInfo = Readonly; + +export interface APIConfig { + /** The API type. Like: user side or admin side, default is user. */ + type?: 'user' | 'admin' | 'common'; + /** The API path */ + path: string; + method: 'get' | 'post' | 'head' | 'put' | 'delete' | 'options' | 'patch'; + /** Request data validate scheme */ + schema?: StandardSchemaV1; + /** The API need auth? Default is false */ + needAuth?: boolean; + /** The API disabled? Default is false */ + disabled?: boolean; + + /** custom headers for client */ + headers?: { [key: string]: any }; + /** is params in url, + * default undefined + * if `:`, will support `/api/:a/b/:c`, + * if `{}`, will support `/api/{a}/b/{c}`, + * and will replace with data with {a: 1, c: 2} to `/api/1/b/2` */ + paramsInUrl?: ':' | '{}'; + isGet?: boolean; +} + +/** + * The `methods` sort order should same with + * `packages/tsdk-server-adapters/src/socket.io-adapter.ts` + */ +const methods = ['get', 'post', 'delete', 'put', 'patch', 'head', 'options']; +const methodsMap: { [key: string]: number } = {}; +methods.forEach((i, idx) => { + methodsMap[i] = idx; +}); + +let ID = 0; + +/** + * Generates a unique ID for API requests based on HTTP method and path + * @param method - HTTP method (get, post, etc.) + * @param path - API endpoint path + * @returns A unique string identifier + */ +export function getID(method: string, path: string): string { + const lowCaseMethod = method.toLowerCase(); + const methodIdx = methodsMap[lowCaseMethod]; + + // Add error handling for invalid methods + if (methodIdx === undefined) { + throw new Error(`Invalid method: ${method}. Valid methods are: ${methods.join(', ')}`); + } + + return `${methodIdx}:${path}:${++ID}${ + Date.now().toString(36).slice(-4) + Math.random().toString(36).slice(-4) + }`; +} diff --git a/packages/tsdk-server-adapters/tests/socket.io-adapter.test.ts b/packages/tsdk-server-adapters/tests/socket.io-adapter.test.ts new file mode 100644 index 00000000..3ca85a9f --- /dev/null +++ b/packages/tsdk-server-adapters/tests/socket.io-adapter.test.ts @@ -0,0 +1,199 @@ +import { it, beforeAll, afterAll, describe, expect } from 'vitest'; + +import SocketIOClient, { Socket } from 'socket.io-client'; +import { server } from './servers/socket.io-adapter.app'; +import { getID, ProtocolTypes } from './servers/utils'; +import { ObjectLiteral } from '../src/gen-route-factory'; +import { RequestError } from './servers/gen-route'; + +const port = 7004; +const QUEUES: ObjectLiteral = {}; +let io!: Socket; + +beforeAll(async () => { + await new Promise((resolve) => + server.listen(port, () => { + resolve('ok'); + }) + ); + io = SocketIOClient(`http://localhost:${port}`, { query: { type: 'user' } }); + io.on( + ProtocolTypes.response, + ({ + _id: msgId, + status, + result, + }: { + _id: string; + status?: number; + result?: unknown; + [key: string]: unknown; + }) => { + if (msgId && QUEUES[msgId]) { + if (!status || status === 200) { + QUEUES[msgId].resolve(result); + } else { + const _result = result as RequestError; + QUEUES[msgId].reject({ status, errors: _result?.errors, message: _result?.message }); + } + delete QUEUES[msgId]; + } + } + ); + await new Promise((resolve) => setTimeout(resolve, 200)); +}); + +afterAll(async () => { + io.disconnect(); + await new Promise((resolve) => + server.close(() => { + resolve('ok'); + }) + ); +}); + +describe('socket.io adapter tests', () => { + it('GET should work', async () => { + const result = await send('get', '/hello'); + expect((result as { msg: string }).msg).toBe('hello get'); + }); + + it('GET with query data should work', async () => { + const result: any = await send('get', '/hello', { a: '1', b: '2' }); + expect(result.msg).toBe('hello get'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('GET with auth API should work with token', async () => { + io.emit('token', 'this is token'); + const result: any = await send('get', '/auth', { a: '1', b: '2' }); + io.emit('token', undefined); + expect(result.msg).toBe('ok'); + }); + + it('GET with auth API should throw error without token', async () => { + let error!: Response; + try { + await send('get', '/auth'); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(401); + }); + + it('POST should work', async () => { + const result = await send('post', '/hello'); + expect((result as { msg: string }).msg).toBe('hello post'); + }); + + it('POST with query data should work', async () => { + const result: any = await send('post', '/hello', { a: '1', b: '2' }); + expect(result.msg).toBe('hello post'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('POST with auth API should work with token', async () => { + io.emit('token', 'this is token'); + const result: any = await send('post', '/auth', { a: '1', b: '2' }); + io.emit('token', undefined); + expect(result.msg).toBe('ok'); + }); + + it('post with auth API should throw error without token', async () => { + let error!: Response; + try { + await send('post', '/auth'); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.status).toBe(401); + }); + + it('GET with not exists path should throw request timeout error', async () => { + let error!: Error; + try { + await send('get', '/not-found-path'); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.message).toBe('Request Timeout'); + }); + + it('POST with not exists path should throw request timeout error', async () => { + let error!: Error; + try { + await send('post', '/not-found-path'); + } catch (err) { + error = err; + } + expect(error).not.toBeUndefined(); + expect(error.message).toBe('Request Timeout'); + }); + + it('POST with FormData should work', async () => { + const formData = new FormData(); + formData.append('a', '1'); + formData.append('b', '2'); + const result: any = await send('post', '/hello', formData); + expect(result.msg).toBe('hello post'); + expect(result.data.a).toBe('1'); + expect(result.data.b).toBe('2'); + }); + + it('GET with not valid query data should throw error', async () => { + let error!: any; + try { + await send('get', '/hello', { a: 'a', b: 'b', c: 'd' }); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = error; + expect(res.errors[0].code).toBe('unrecognized_keys'); + expect(res.errors[1]).toBeUndefined(); + }); + + it('POST with not valid data should throw error', async () => { + let error!: any; + try { + await send('post', '/hello', { a: 'a', b: 'b', c: 'd' }); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.status).toBe(400); + const res = error; + expect(res.errors[0].code).toBe('unrecognized_keys'); + expect(res.errors[1]).toBeUndefined(); + }); +}); + +function send(method: string, path: string, data?: any) { + return new Promise((resolve, reject) => { + const msgId = getID(method, path); + const timer = setTimeout(() => { + delete QUEUES[msgId]; + reject(new Error('Request Timeout')); + }, 2e3); + QUEUES[msgId] = { + resolve(res: any) { + clearTimeout(timer); + resolve(res); + }, + reject(e: Error) { + clearTimeout(timer); + reject(e); + }, + }; + io.emit(ProtocolTypes.request, { + _id: msgId, + payload: data instanceof FormData ? Object.fromEntries(data as unknown as any) : data, + }); + }); +} diff --git a/packages/tsdk-server-adapters/tsconfig.esm.json b/packages/tsdk-server-adapters/tsconfig.esm.json new file mode 100644 index 00000000..4b8ee379 --- /dev/null +++ b/packages/tsdk-server-adapters/tsconfig.esm.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "strict": true, + "strictPropertyInitialization": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "downlevelIteration": true, + "esModuleInterop": true, + "declaration": true, + "noImplicitAny": true, + "module": "ES2015", + "target": "ES2015", + "outDir": "esm", + "lib": ["ES2015"], + "incremental": true, + "skipLibCheck": true, + "moduleResolution": "bundler", + "resolveJsonModule": true + }, + "include": ["./src"], + "exclude": ["node_modules"] +} diff --git a/packages/tsdk/.gitignore b/packages/tsdk/.gitignore index 755d7f65..01ed8dbe 100644 --- a/packages/tsdk/.gitignore +++ b/packages/tsdk/.gitignore @@ -8,4 +8,6 @@ dist build package-lock.json dist-* -build-* \ No newline at end of file +build-* +tsdk-shared +!fe-sdk-template/src/tsdk-shared \ No newline at end of file diff --git a/packages/tsdk/fe-sdk-template-tests/tsdk-helpers.test.ts b/packages/tsdk/fe-sdk-template-tests/tsdk-helpers.test.ts new file mode 100644 index 00000000..21d99dab --- /dev/null +++ b/packages/tsdk/fe-sdk-template-tests/tsdk-helpers.test.ts @@ -0,0 +1,139 @@ +import { describe, it, expect } from 'vitest'; +import { + hasBodyMethods, + checkMethodHasBody, + transformPath, + paramCase, + isObject, + ProtocolTypes, +} from '../fe-sdk-template/src/tsdk-shared/helpers'; // Replace with actual path to the module + +describe('hasBodyMethods', () => { + it('should include POST, PUT, and PATCH as true', () => { + expect(hasBodyMethods['post']).toBe(true); + expect(hasBodyMethods['put']).toBe(true); + expect(hasBodyMethods['patch']).toBe(true); + }); + + it('should return undefined for non-body methods', () => { + expect(hasBodyMethods['get']).toBeUndefined(); + expect(hasBodyMethods['delete']).toBeUndefined(); + expect(hasBodyMethods['head']).toBeUndefined(); + }); +}); + +describe('checkMethodHasBody', () => { + it('should return true for methods that have a body', () => { + expect(checkMethodHasBody('POST')).toBe(true); + expect(checkMethodHasBody('post')).toBe(true); + expect(checkMethodHasBody('PUT')).toBe(true); + expect(checkMethodHasBody('put')).toBe(true); + expect(checkMethodHasBody('PATCH')).toBe(true); + expect(checkMethodHasBody('patch')).toBe(true); + }); + + it('should return undefined for methods that do not have a body', () => { + expect(checkMethodHasBody('GET')).toBeUndefined(); + expect(checkMethodHasBody('get')).toBeUndefined(); + expect(checkMethodHasBody('DELETE')).toBeUndefined(); + expect(checkMethodHasBody('delete')).toBeUndefined(); + }); + + it('should handle case insensitivity', () => { + expect(checkMethodHasBody('PoSt')).toBe(true); + expect(checkMethodHasBody('pUT')).toBe(true); + }); +}); + +describe('paramCase', () => { + it('should convert camelCase to param-case', () => { + expect(paramCase('camelCaseText')).toBe('camel-case-text'); + expect(paramCase('thisIsATest')).toBe('this-is-a-test'); + }); + + it('should convert PascalCase to param-case', () => { + expect(paramCase('PascalCaseText')).toBe('pascal-case-text'); + expect(paramCase('ThisIsATest')).toBe('this-is-a-test'); + }); + + it('should replace spaces with hyphens', () => { + expect(paramCase('this is a test')).toBe('this-is-a-test'); + expect(paramCase('multiple spaces here')).toBe('multiple-spaces-here'); + }); + + it('should handle mixed cases and spaces', () => { + expect(paramCase('this Is mixedCase with Spaces')).toBe('this-is-mixed-case-with-spaces'); + }); + + it('should convert everything to lowercase', () => { + expect(paramCase('ALL UPPERCASE')).toBe('all-uppercase'); + expect(paramCase('MixedCASE')).toBe('mixed-case'); + }); +}); + +describe('transformPath', () => { + it('should transform camelCase paths to param-case with leading slash', () => { + expect(transformPath('userProfile')).toBe('/user-profile'); + expect(transformPath('apiEndpoint')).toBe('/api-endpoint'); + }); + + it('should transform PascalCase paths to param-case with leading slash', () => { + expect(transformPath('UserProfile')).toBe('/user-profile'); + expect(transformPath('APIEndpoint')).toBe('/api-endpoint'); + }); + + it('should transform paths with spaces to param-case with leading slash', () => { + expect(transformPath('user profile')).toBe('/user-profile'); + }); + + it('should add leading slash to already param-case paths', () => { + expect(transformPath('user-profile')).toBe('/user-profile'); + }); +}); + +describe('isObject', () => { + it('should return true for non-empty objects', () => { + expect(isObject({ key: 'value' })).toBe(true); + expect(isObject({ a: 1, b: 2 })).toBe(true); + }); + + it('should return false for arrays', () => { + expect(isObject([])).toBe(false); + expect(isObject([1, 2, 3])).toBe(false); + }); + + it('should return false for null', () => { + expect(isObject(null)).toBe(false); + }); + + it('should return false for FormData', () => { + const formData = new FormData(); + expect(isObject(formData)).toBe(false); + }); + + it('should return false for empty objects', () => { + expect(isObject({})).toBe(false); + }); + + it('should return false for primitives', () => { + expect(isObject('string')).toBe(false); + expect(isObject(123)).toBe(false); + expect(isObject(true)).toBe(false); + expect(isObject(undefined)).toBe(false); + }); +}); + +describe('ProtocolTypes', () => { + it('should contain the correct protocol type values', () => { + expect(ProtocolTypes.request).toBe('REQ:'); + expect(ProtocolTypes.response).toBe('RES:'); + expect(ProtocolTypes.set).toBe('SET:'); + }); + + it('should be an object with three properties', () => { + expect(Object.keys(ProtocolTypes).length).toBe(3); + expect(ProtocolTypes).toHaveProperty('request'); + expect(ProtocolTypes).toHaveProperty('response'); + expect(ProtocolTypes).toHaveProperty('set'); + }); +}); diff --git a/packages/tsdk/fe-sdk-template-tests/utils.test.ts b/packages/tsdk/fe-sdk-template-tests/utils.test.ts new file mode 100644 index 00000000..572ca993 --- /dev/null +++ b/packages/tsdk/fe-sdk-template-tests/utils.test.ts @@ -0,0 +1,111 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { getID, resetID } from '../fe-sdk-template/src/utils'; // Update this path as needed + +describe('getID', () => { + // Reset the module before each test to ensure ID counter is reset + beforeEach(() => { + // Note: In a real implementation, you might need to use + // module mocking to reset the ID counter between tests + // This is a limitation of the current implementation with a module-level ID variable + resetID(); + }); + + it('should generate a unique ID for valid HTTP methods', () => { + const validMethods = ['get', 'post', 'delete', 'put', 'patch', 'head', 'options']; + const path = '/api/users'; + + for (const method of validMethods) { + const id = getID(method, path); + + // Check that ID follows the expected format: {methodIdx}:{path}:{incrementalID}{randomSuffix} + const expectedMethodIdx = validMethods.indexOf(method); + expect(id).toMatch(new RegExp(`^${expectedMethodIdx}:${path}:\\d+[a-z0-9]{8}$`)); + } + }); + + it('should accept uppercase HTTP methods', () => { + const method = 'GET'; + const path = '/api/users'; + + const id = getID(method, path); + + // The method index for 'get' is 0 + expect(id).toMatch(new RegExp(`^0:${path}:\\d+[a-z0-9]{8}$`)); + }); + + it('should generate different IDs for the same method and path', () => { + const method = 'get'; + const path = '/api/users'; + + const id1 = getID(method, path); + const id2 = getID(method, path); + + expect(id1).not.toEqual(id2); + }); + + it('should generate different IDs for different paths', () => { + const method = 'get'; + const path1 = '/api/users'; + const path2 = '/api/posts'; + + const id1 = getID(method, path1); + const id2 = getID(method, path2); + + expect(id1).not.toEqual(id2); + expect(id1).toMatch(new RegExp(`^0:${path1}:`)); + expect(id2).toMatch(new RegExp(`^0:${path2}:`)); + }); + + it('should generate different IDs for different methods', () => { + const method1 = 'get'; + const method2 = 'post'; + const path = '/api/users'; + + const id1 = getID(method1, path); + const id2 = getID(method2, path); + + expect(id1).not.toEqual(id2); + expect(id1).toMatch(/^0:/); + expect(id2).toMatch(/^1:/); + }); + + it('should throw an error for invalid HTTP methods', () => { + const invalidMethod = 'invalid'; + const path = '/api/users'; + + expect(() => getID(invalidMethod, path)).toThrow( + `Invalid method: ${invalidMethod}. Valid methods are: get, post, delete, put, patch, head, options` + ); + }); + + it('should increment the ID counter for each call', () => { + const method = 'get'; + const path = '/api/users'; + + // Extract the incremental ID part from two consecutive calls + const id1 = getID(method, path); + const id2 = getID(method, path); + + const match1 = id1.match(/^0:\/api\/users:(\d+)/); + const match2 = id2.match(/^0:\/api\/users:(\d+)/); + + expect(match1).not.toBeNull(); + expect(match2).not.toBeNull(); + + if (match1 && match2) { + const incrementalId1 = parseInt(match1[1][0], 10); + const incrementalId2 = parseInt(match2[1][0], 10); + expect(incrementalId2).toEqual(incrementalId1 + 1); + } + }); + + it('should include random suffix in the generated ID', () => { + const method = 'get'; + const path = '/api/users'; + + const id = getID(method, path); + + // Check that the ID ends with 8 alphanumeric characters + expect(id).toMatch(/[a-z0-9]{8}$/); + }); +}); diff --git a/packages/tsdk/fe-sdk-template/.gitignore b/packages/tsdk/fe-sdk-template/.gitignore deleted file mode 100644 index 1a201e4a..00000000 --- a/packages/tsdk/fe-sdk-template/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -lib \ No newline at end of file diff --git a/packages/tsdk/fe-sdk-template/README.md b/packages/tsdk/fe-sdk-template/README.md index fca780fc..9a6ed7f9 100644 --- a/packages/tsdk/fe-sdk-template/README.md +++ b/packages/tsdk/fe-sdk-template/README.md @@ -1,6 +1,8 @@ > Document for %PROJECT NAME%, generated by [`tsdk`](https://tsdk.dev) -### Setup for xior.js and socket.io +### Setup for [xior.js](https://github.com/suhaotian/xior) and [socket.io](https://socket.io) + +> Xior.js is an Axios-like API but a lightweight replacement for Axios. ```ts import { @@ -10,19 +12,50 @@ import { setXiorInstance, xiorHandler, getHandler, -} from '%PROJECT NAME%'; +} from '%PROJECT NAME%/esm/index'; +import type { QueryTodoRes } from '%PROJECT NAME%/esm/apiconf-refs'; +import { QueryTodo } from '%PROJECT NAME%/esm/user-api'; + +export * from '%PROJECT NAME%/esm/user-api'; +export * from '%PROJECT NAME%/esm/user-api-swr'; +// export * from '%PROJECT NAME%/esm/user-api-reactquery'; +// export * from '%PROJECT NAME%/esm/user-api-vuequery'; +export * from '%PROJECT NAME%/esm/apiconf-refs'; +export * from '%PROJECT NAME%/esm/entity-refs'; +export * from '%PROJECT NAME%/esm/shared-refs'; + +/* +// For CommonJs +import { + setHandler, + setSocketIOInstance, + socketIOHandler, + setXiorInstance, + xiorHandler, + getHandler, +} from '%PROJECT NAME%/lib/index'; import type { QueryTodoRes } from '%PROJECT NAME%/lib/apiconf-refs'; import { QueryTodo } from '%PROJECT NAME%/lib/user-api'; + +export * from '%PROJECT NAME%/lib/user-api'; +export * from '%PROJECT NAME%/lib/user-api-swr'; +// export * from '%PROJECT NAME%/lib/user-api-reactquery'; +// export * from '%PROJECT NAME%/lib/user-api-vuequery'; +export * from '%PROJECT NAME%/lib/apiconf-refs'; +export * from '%PROJECT NAME%/lib/entity-refs'; +export * from '%PROJECT NAME%/lib/shared-refs'; +*/ + import { io as SocketIO } from 'socket.io-client'; import axios from 'xior'; const apiType = 'user'; const baseURL = 'https://example.com'; -const socketURL = baseURL; const apiURL = `${baseURL}/api/${apiType}`; // use HTTP protocol -setXiorInstance(axios.create({ baseURL: apiURL })); +export const http = axios.create({ baseURL: apiURL }); +setXiorInstance(http); setHandler(xiorHandler); // Usage @@ -32,6 +65,7 @@ setHandler(xiorHandler); })(); // or use socket.io protocol +const socketURL = baseURL; const io = SocketIO(socketURL, { transports: ['websocket'], query: { @@ -48,7 +82,7 @@ io.on('connect', async function () { }); ``` -### Setup for axios and socket.io +### Setup for [axios](https://github.com/axios/axios) and [socket.io](https://socket.io) ```ts import { @@ -58,19 +92,50 @@ import { setAxiosInstance, axiosHandler, getHandler, -} from '%PROJECT NAME%'; +} from '%PROJECT NAME%/esm/index'; +import type { QueryTodoRes } from '%PROJECT NAME%/esm/apiconf-refs'; +import { QueryTodo } from '%PROJECT NAME%/esm/user-api'; + +export * from '%PROJECT NAME%/esm/user-api'; +export * from '%PROJECT NAME%/esm/user-api-swr'; +// export * from '%PROJECT NAME%/esm/user-api-reactquery'; +// export * from '%PROJECT NAME%/esm/user-api-vuequery'; +export * from '%PROJECT NAME%/esm/apiconf-refs'; +export * from '%PROJECT NAME%/esm/entity-refs'; +export * from '%PROJECT NAME%/esm/shared-refs'; + +/* +// For CommonJS +import { + setHandler, + setSocketIOInstance, + socketIOHandler, + setAxiosInstance, + axiosHandler, + getHandler, +} from '%PROJECT NAME%/lib/index'; import type { QueryTodoRes } from '%PROJECT NAME%/lib/apiconf-refs'; import { QueryTodo } from '%PROJECT NAME%/lib/user-api'; + +export * from '%PROJECT NAME%/lib/user-api'; +export * from '%PROJECT NAME%/lib/user-api-swr'; +// export * from '%PROJECT NAME%/lib/user-api-reactquery'; +// export * from '%PROJECT NAME%/lib/user-api-vuequery'; +export * from '%PROJECT NAME%/lib/apiconf-refs'; +export * from '%PROJECT NAME%/lib/entity-refs'; +export * from '%PROJECT NAME%/lib/shared-refs'; +*/ + import { io as SocketIO } from 'socket.io-client'; import axios from 'axios'; const apiType = 'user'; const baseURL = 'https://example.com'; -const socketURL = baseURL; const apiURL = `${baseURL}/api/${apiType}`; // use HTTP protocol -setAxiosInstance(axios.create({ baseURL: apiURL })); +const http = axios.create({ baseURL: apiURL }); +setAxiosInstance(http); setHandler(axiosHandler); // Usage @@ -80,6 +145,7 @@ setHandler(axiosHandler); })(); // or use socket.io protocol +const socketURL = baseURL; const io = SocketIO(socketURL, { transports: ['websocket'], query: { @@ -96,6 +162,117 @@ io.on('connect', async function () { }); ``` +### Setup for [xior.js](https://github.com/suhaotian/xior) and [socket.io](https://socket.io) with **Web Worker** + +> In vite + +> Add `worker: true` to `tsdk.config.js` + +> Xior.js is an Axios-like API but a lightweight replacement for Axios. + +```ts +// user-api.worker.ts +import { setHandler } from '%PROJECT NAME%/esm/worker/user-api-worker'; +import { xiorHandler, setXiorInstance } from '%PROJECT NAME%/esm/xior'; +import axios, { AxiosError } from 'xior'; + +import { setSocketIOInstance, socketIOHandler } from '%PROJECT NAME%/esm/socket.io'; +import { io as SocketIO } from 'socket.io-client'; + +self.addEventListener('message', (e) => { + if (!e.data.apiURL) return; + const apiURL = e.data.apiURL; + const socketURL = e.data.socketURL; + + const http = axios.create({ + baseURL: apiURL, + // params: { worker: true }, + }); + + http.interceptors.response.use( + (res) => res, + async (error: AxiosError) => { + throw new Error((error?.response?.data as { msg: string })?.msg || error?.message); + } + ); + + setXiorInstance(http); + setHandler(xiorHandler); + + // or use socket.io protocol + const io = SocketIO(socketURL, { + transports: ['websocket'], + query: { + type: apiType, + }, + }); + setSocketIOInstance(io); + io.on('connect', () => { + setHandler(socketIOHandler); + }); + io.on('disconnect', () => { + setHandler(xiorHandler); + }); +}); +``` + +```ts +// user-api.ts +import { + setHandler, + setSocketIOInstance, + socketIOHandler, + setXiorInstance, + xiorHandler, + getHandler, +} from '%PROJECT NAME%/esm/index'; +import APIWorker from './user-api.worker?worker'; +import { setWorker } from '%PROJECT NAME%/esm/worker/user-api'; + +export * from '%PROJECT NAME%/esm/worker/user-api'; +export * from '%PROJECT NAME%/esm/worker/user-api-swr'; +// export * from '%PROJECT NAME%/esm/worker/user-api-reactquery'; +// export * from '%PROJECT NAME%/esm/worker/user-api-vuequery'; +export * from '%PROJECT NAME%/esm/apiconf-refs'; +export * from '%PROJECT NAME%/esm/entity-refs'; +export * from '%PROJECT NAME%/esm/shared-refs'; + +import { io as SocketIO } from 'socket.io-client'; +import axios from 'xior'; + +const apiType = 'user'; +const baseURL = 'https://example.com'; +const socketURL = baseURL; +const apiURL = `${baseURL}/api/${apiType}`; + +if (typeof document !== 'undefined' && typeof Worker !== 'undefined') { + const myWorker = new APIWorker(); + myWorker.postMessage({ baseURL, apiURL, socketURL }); + setWorker(myWorker); +} + +// use HTTP protocol +export const http = axios.create({ baseURL: apiURL }); +setXiorInstance(http); +setHandler(xiorHandler); + +// or use socket.io protocol +const socketURL = baseURL; +const io = SocketIO(socketURL, { + transports: ['websocket'], + query: { + type: apiType, + }, +}); +setSocketIOInstance(io); +io.on('connect', () => { + setHandler(socketIOHandler); +}); +io.on('disconnect', () => { + setHandler(xiorHandler); +}); +``` + ### API Reference %API_REFERENCE% diff --git a/packages/tsdk/fe-sdk-template/config/.vscode/tsdk.code-snippets b/packages/tsdk/fe-sdk-template/config/.vscode/tsdk.code-snippets index eb0c4662..1ac40187 100644 --- a/packages/tsdk/fe-sdk-template/config/.vscode/tsdk.code-snippets +++ b/packages/tsdk/fe-sdk-template/config/.vscode/tsdk.code-snippets @@ -3,59 +3,76 @@ "scope": "typescript", "prefix": "apii", "body": [ - "import * as z from 'zod';", - "import { transformPath, APIConfig, ObjectLiteral } from '@/src/shared/tsdk-helper';" + "import { transformPath, type APIConfig } from '@/src/tsdk-shared/helpers';" ], - "description": "api config import snippet" + "description": "API config import snippet" }, "apiconf": { "scope": "typescript", "prefix": "apic", "body": [ - "", "/**", - " * ${1:description} ({@link APIConfig})", - " * @category ${3:Category}", + " * ${1:Description} ({@link APIConfig})", + " * @category ${2:Category}", " */", - "export const ${2:ApiName}Config: APIConfig = {", + "export const ${3:ApiName}Config: APIConfig = {", " type: '${4:user}',", - " method: '${5|get,post,delete,put,patch,head,options|}',", - " path: transformPath('${2:ApiName}'),", - " description: '${1:description}',", - " category: '${3:Category}'", + " method: '${5|GET,POST,DELETE,PUT,PATCH,HEAD,OPTIONS|}',", + " path: transformPath('${3:ApiName}'),", "};", "/**", - " *", - " * @category ${3:Category}", + " * @category ${2:Category}", " */", - "export type ${2:ApiName}Req = ${8:{\\}};", - "", + "export type ${3:ApiName}Req = {${6:}};", "/**", - " *", - " * @category ${3:Category}", + " * @category ${2:Category}", " */", - "export type ${2:ApiName}Res = ${9:{\\}};", - "// --------- ${2:ApiName} END ---------", - "" + "export type ${3:ApiName}Res = {${7:}};", + "// --------- ${3:ApiName} END ---------" ], - "description": "apic onfig snippet" + "description": "API config snippet" + }, + "simple apiconf": { + "scope": "typescript", + "prefix": "sapic", + "body": [ + "/**", + " * ${1:Description} ({@link APIConfig})", + " * @category ${2:Category}", + " */", + "export const ${3:ApiName}Config: APIConfig = {", + " // type: 'user',", + " method: '${4|get,post,delete,put,patch,head,options|}',", + " path: transformPath('${3:ApiName}'),", + "};", + "/**", + " * @category ${2:Category}", + " */", + "export type ${3:ApiName}Req = {${5}};", + "/**", + " * @category ${2:Category}", + " */", + "export type ${3:ApiName}Res = {${6}};", + "// --------- ${3:ApiName} END ---------" + ], + "description": "Simple API config snippet" }, "importApiConf": { - "scope": "typescriptreact,typescript", + "scope": "typescript,typescriptreact", "prefix": "apin", "body": [ - "${1:name}Config,", - "${1:name}Req,", - "${1:name}Res,", + "${1:ApiName}Config,", + "${1:ApiName}Req,", + "${1:ApiName}Res," ], - "description": "apic onfig name snippet" + "description": "API config import names" }, "genRoute": { "scope": "typescript", "prefix": "genr", "body": [ - "genRoute<${1:name}Req, ${1:name}Res>(${1:name}Config, async (data, reqInfo) => {", - " return ${2://service}(data, reqInfo);", + "genRoute<${1:ApiName}Req, ${1:ApiName}Res>(${1:ApiName}Config, async (data, reqInfo) => {", + " return ${2://serviceName}(data, reqInfo);", "});" ], "description": "genRoute() snippet" diff --git a/packages/tsdk/fe-sdk-template/config/tsdk.config.js b/packages/tsdk/fe-sdk-template/config/tsdk.config.js index fc7193a3..9d4d83c9 100644 --- a/packages/tsdk/fe-sdk-template/config/tsdk.config.js +++ b/packages/tsdk/fe-sdk-template/config/tsdk.config.js @@ -1,18 +1,22 @@ /** @type {import('tsdk').TSDKConfig} */ module.exports = { - packageDir: 'packages/', - packageName: 'fe-sdk', - baseDir: './src', monorepoRoot: './', - entityLibName: 'typeorm', - entityExt: 'entity', - apiconfExt: 'apiconf', - shareExt: 'shared', - sharedDirs: ['./src/shared'], + packageDir: './', + /** source dir, Recommend `./src` */ + baseDir: './src', + packageName: 'fe-sdk', + apiconfExt: 'apiconf', // *.apiconf.ts + shareExt: 'shared', // *.shared.ts + sharedDirs: ['./src/tsdk-shared'], removeFields: [], /** 'xior' | 'axios'. More: https://tsdk.dev/docs/guide/tsdk.config#httplib */ httpLib: 'xior', + dataHookLib: ['SWR', 'ReactQuery', 'VueQuery'], + /** Support: zod / valibot / arktype */ + // validationLib: 'zod', dependencies: { - xior: '^0.6.1', + // xior: '^0.8.3', }, + /** Default undefined: support 'module' and 'commonjs' */ + moduleType: undefined, }; diff --git a/packages/tsdk/fe-sdk-template/gitignore-x b/packages/tsdk/fe-sdk-template/gitignore-x new file mode 100644 index 00000000..0f04a9e9 --- /dev/null +++ b/packages/tsdk/fe-sdk-template/gitignore-x @@ -0,0 +1,2 @@ +* +!package.json \ No newline at end of file diff --git a/packages/tsdk/fe-sdk-template/hover.mjs b/packages/tsdk/fe-sdk-template/hover.mjs deleted file mode 100644 index 94601b6d..00000000 --- a/packages/tsdk/fe-sdk-template/hover.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import { JSX } from 'typedoc'; - -export async function load(app) { - app.renderer.hooks.on('head.end', (ctx) => { - return JSX.createElement('script', { - defer: true, - src: 'https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js', - }); - }); -} diff --git a/packages/tsdk/fe-sdk-template/package.json b/packages/tsdk/fe-sdk-template/package.json index 79c30dcf..17bee78a 100644 --- a/packages/tsdk/fe-sdk-template/package.json +++ b/packages/tsdk/fe-sdk-template/package.json @@ -1,25 +1,28 @@ { "name": "fe-sdk-template", "version": "1.0.0", - "main": "lib/index.js", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "require": "./lib/index.js", "scripts": { - "tsc:build": "tsc --project tsconfig.json", - "doc:build": "typedoc src/**.ts --plugin ./hover.mjs && node write-popover.mjs", + "tsc:build": "concurrently \"npm run tsc:build:cjs\" \"npm run tsc:build:esm\"", + "tsc:build:cjs": "tsc --project tsconfig.json", + "tsc:build:esm": "tsc --project tsconfig.esm.json", + "doc:build": "typedoc --customJs popover.js src/**.ts", "serve": "serve docs" }, "dependencies": { - "zod": "^3.24.1", - "axios": "^1.7.9", - "xior": "^0.6.2", - "change-case": "^4.1.2" + "axios": "^1.13.2", + "xior": "^0.8.3" }, "devDependencies": { - "typescript": "^5", - "typedoc": "^0.27.6", - "@tsconfig/recommended": "^1.0.8" + "typescript": "^5.9.3", + "typedoc": "^0.28.16", + "concurrently": "^9.2.1", + "@standard-schema/spec": "^1.1.0" }, "peerDependencies": { - "socket.io-client": "^4.8.0" + "socket.io-client": "^4.8.3" }, "peerDependenciesMeta": { "socket.io-client": { @@ -28,6 +31,9 @@ }, "files": [ "lib", - "src" + "esm", + "src", + "tsconfig.json", + "tsconfig.esm.json" ] } diff --git a/packages/tsdk/fe-sdk-template/popover.js b/packages/tsdk/fe-sdk-template/popover.js index 4fbab1d4..69654443 100644 --- a/packages/tsdk/fe-sdk-template/popover.js +++ b/packages/tsdk/fe-sdk-template/popover.js @@ -1,58 +1,138 @@ +/* eslint-disable-for-generated-file */ +/* prettier-disable */ + window.onload = function () { console.log('Init popover'); + var id = 0; + var timer = 0; + var timer2 = 0; - let id = 0; - let timer = 0; - $('body .col-content').delegate('a', 'mouseenter mouseleave', function (e) { - const $target = $(e.target); - if (!$target.attr('href')) { - return; - } - if ($target.attr('href').indexOf('#') > -1) { - return; - } - if ( - $target.parent() && - $target.parent().text() && - $target.parent().text().startsWith('Defined in') - ) { - return; - } + document.querySelector('body .col-content').addEventListener('mouseover', handleMouseEvents); + document.querySelector('body .col-content').addEventListener('mouseout', handleMouseEvents); + + function handleMouseEvents(e) { + // Check if target is a link + var target = e.target.closest('a'); + if (!target) return; + + // Skip links without href attribute or internal page links + if (!target.getAttribute('href')) return; + if (target.getAttribute('href').includes('#')) return; - let currentId = id; + // Skip "Defined in" links + var parentText = target.parentElement?.textContent || ''; + if (parentText.startsWith('Defined in')) return; - if (e.type === 'mouseenter') { - $(`[data-popover=${id}]`).unbind().remove(); + var currentId = id; + + if (e.type === 'mouseover') { + // Remove any existing popover + removePopover(currentId); + + // Increment ID for new popover id++; currentId = id; - fetch(e.target.href) - .then((res) => res.text()) - .then((res) => { - const $html = $(res); - const $content = $html.find('.col-content'); - const { top, left } = $target.offset(); - $content.attr( - 'style', - `position: absolute; top: ${ - top + $target.outerHeight() - }px; left: ${left}px;width: 400px;padding: 10px;border-radius: 10px;max-width: 100%;max-height: 400px;overflow-y: auto;font-size: 14px; background: #fff;box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px;` - ); - $content.attr('data-popover', currentId); - $content.find('.tsd-breadcrumb').remove(); - $content.on('mouseenter mouseleave', function (e) { - if (e.type === 'mouseenter') { - clearTimeout(timer); - } else { - $(`[data-popover=${currentId}]`).unbind().remove(); - } + fetch(target.getAttribute('href')) + .then(function (res) { + return res.text(); + }) + .then(function (res) { + var parser = new DOMParser(); + var doc = parser.parseFromString(res, 'text/html'); + var content = doc.querySelector('.col-content'); + var rect = target.getBoundingClientRect(); + + // Calculate available space + var viewportHeight = window.innerHeight; + var viewportWidth = window.innerWidth; + var popoverHeight = 400; // Max height of popover + var popoverWidth = 400; // Width of popover + var linkHeight = target.offsetHeight; + if (viewportHeight < popoverHeight) { + popoverHeight = viewportHeight - 40; + } + if (viewportWidth < popoverWidth) { + popoverWidth = viewportWidth - 40; + } + + // Position calculations + var topPos = rect.top + linkHeight + window.scrollY + 5; + + var leftPos = rect.left + window.scrollX + 20; + + // If there's not enough room below, position it above + if (topPos + popoverHeight > viewportHeight) { + topPos = Math.max(10, rect.top + window.scrollY - popoverHeight - 5); + } + + // Ensure it doesn't go off-screen horizontally + if (leftPos + popoverWidth > viewportWidth) { + leftPos = Math.max(10, viewportWidth - popoverWidth - 20); + } + + // Apply styles to popover + Object.assign(content.style, { + opacity: 0, + position: 'absolute', + top: `${topPos}px`, + left: `${leftPos}px`, + width: '400px', + padding: '10px', + borderRadius: '10px', + maxWidth: '100%', + maxHeight: '400px', + overflowY: 'auto', + fontSize: '14px', + background: '#fff', + zIndex: '9999', + boxShadow: 'rgba(100, 100, 111, 0.2) 0px 7px 29px 0px', + transition: 'opacity .3s ease', + }); + + content.setAttribute('data-popover', currentId); + + // Remove breadcrumb if exists + var breadcrumb = content.querySelector('.tsd-breadcrumb'); + if (breadcrumb) breadcrumb.remove(); + + // Handle mouse events on the popover itself + content.addEventListener('mouseenter', function () { + clearTimeout(timer); + clearTimeout(timer2); + }); + content.addEventListener('mouseleave', function () { + removePopover(currentId); }); - $('body').append($content); + + document.body.appendChild(content); + timer2 = setTimeout(function () { + // Position calculations + var topPos = rect.top + linkHeight + window.scrollY + 5; + popoverHeight = content.getBoundingClientRect().height; + // If there's not enough room below, position it above + if (topPos + popoverHeight > viewportHeight) { + topPos = Math.max(10, rect.top + window.scrollY - popoverHeight - 5); + } + content.style.top = topPos + 'px'; + content.style.opacity = 1; + }, 100); + }) + .catch(function (error) { + console.error('Error fetching content:', error); }); } else { + // On mouseout, remove popover after delay timer = setTimeout(function () { - $(`[data-popover=${currentId}]`).unbind().remove(); + removePopover(currentId); }, 200); } - }); + } + + function removePopover(popoverId) { + var popover = document.querySelector(`[data-popover="${popoverId}"]`); + if (popover) { + popover.remove(); + } + } }; diff --git a/packages/tsdk/fe-sdk-template/src/axios.ts b/packages/tsdk/fe-sdk-template/src/axios.ts index 8f186d82..1a219231 100644 --- a/packages/tsdk/fe-sdk-template/src/axios.ts +++ b/packages/tsdk/fe-sdk-template/src/axios.ts @@ -1,8 +1,8 @@ -import { AxiosRequestConfig, AxiosInstance } from 'axios'; - +// @ts-ignore +import { AxiosRequestConfig as _AxiosRequestConfig, AxiosInstance } from 'axios'; import { NoHandlerError } from './error'; import { pathParams } from './path-params'; -import { APIConfig, checkMethodHasBody } from './shared/tsdk-helper'; +import { APIConfig, checkMethodHasBody } from './tsdk-shared/helpers'; let axiosInstance: AxiosInstance; @@ -18,30 +18,43 @@ export const setAxiosInstance = (instance: AxiosInstance): void => { /** * Get the AxiosInstance * - * @param instance - AxiosInstance * @returns The AxiosInstance */ -export const getAxiosInstance = () => { +export const getAxiosInstance = (): AxiosInstance => { return axiosInstance; }; -export type RequestConfig = Omit & { +export type AxiosRequestConfig = Omit<_AxiosRequestConfig, 'data'> & { data?: ReqPayload; }; +/** + * Handler for making HTTP requests using Axios + * + * @param apiConfig - API configuration including path, method, and headers + * @param requestData - Request payload data + * @param requestConfig - Optional Axios-specific request configuration + * @returns Promise resolving to the response data + */ export async function axiosHandler( apiConfig: APIConfig, requestData: any, - requestConfig?: RequestConfig -) { + requestConfig?: _AxiosRequestConfig +): Promise { const instance = getAxiosInstance(); - if (!axiosInstance) { + if (!instance) { throw new NoHandlerError(`Call \`setAxiosInstance\` first`); } - const { path, headers } = apiConfig; - const method = apiConfig.method.toLowerCase(); - const payload: AxiosRequestConfig = { + const { path, headers, onRequest, onResponse } = apiConfig; + const method = apiConfig?.method?.toLowerCase() || 'get'; + + // Apply onRequest hook if available + if (onRequest) { + requestData = await onRequest(requestData); + } + + const payload: _AxiosRequestConfig = { method: method === 'patch' ? method.toUpperCase() : method, url: path, ...requestConfig, @@ -55,20 +68,24 @@ export async function axiosHandler( } if (requestData) { - const data = requestData; if (checkMethodHasBody(method)) { - payload.data = data; + payload.data = requestData; if (requestConfig?.params) { payload.params = requestConfig.params; } } else { - payload.params = requestConfig?.params ? { ...requestConfig.params, ...data } : data; + payload.params = requestConfig?.params + ? { ...requestConfig.params, ...requestData } + : requestData; } } - if (requestData && (apiConfig as any).paramsInUrl) { + + if (requestData && 'paramsInUrl' in apiConfig) { payload.url = pathParams(path, requestData, (apiConfig as any).paramsInUrl); } const { data } = await instance.request(payload); - return data; + + // Apply onResponse hook if available + return onResponse ? await onResponse(data) : data; } diff --git a/packages/tsdk/fe-sdk-template/src/error.ts b/packages/tsdk/fe-sdk-template/src/error.ts index 53e64276..4b9dec65 100644 --- a/packages/tsdk/fe-sdk-template/src/error.ts +++ b/packages/tsdk/fe-sdk-template/src/error.ts @@ -1,25 +1,37 @@ /** TSDK Base Error */ export class TSDKError extends Error { - // + constructor(message: string) { + super(message); + this.name = 'TSDKError'; + } } /** * Before call, not set handler instance error */ export class NoHandlerError extends TSDKError { - // + constructor(message: string) { + super(message); + this.name = 'NoHandlerError'; + } } /** * Timeout error */ export class TimeoutError extends TSDKError { - // + constructor(message: string) { + super(message); + this.name = 'TimeoutError'; + } } /** * No connection error */ export class NoConnectionError extends TSDKError { - // + constructor(message: string) { + super(message); + this.name = 'NoConnectionError'; + } } diff --git a/packages/tsdk/fe-sdk-template/src/gen-api.ts b/packages/tsdk/fe-sdk-template/src/gen-api.ts index d34e68d6..2414fde8 100644 --- a/packages/tsdk/fe-sdk-template/src/gen-api.ts +++ b/packages/tsdk/fe-sdk-template/src/gen-api.ts @@ -1,14 +1,15 @@ -import type { RequestConfig as AxiosRequestConfig } from './axios'; +import type { AxiosRequestConfig } from './axios'; import { NoHandlerError } from './error'; -import { APIConfig, ObjectLiteral } from './shared/tsdk-helper'; +import { APIConfig } from './tsdk-shared/helpers'; import type { XiorRequestConfig } from './xior'; -type RequestConfig = AxiosRequestConfig; +// Define a union type for all possible request configuration types +export type RequestConfig = AxiosRequestConfig | XiorRequestConfig | Record; let handler = ( apiConfig: APIConfig, requestData: any, - requestConfig?: any | RequestConfig | ObjectLiteral | XiorRequestConfig + requestConfig?: RequestConfig ): Promise => { return Promise.reject(new NoHandlerError(`Call \`setHandler\` first`)); }; @@ -19,18 +20,18 @@ export type Handler = typeof handler; * @example * ```ts * setAxiosInstance(axios.create()) - setSocketIOInstance(io()); - - setHandler(axiosHandler); - setHandler(socketIOHandler); + * setSocketIOInstance(io()); + * + * setHandler(axiosHandler); + * setHandler(socketIOHandler); * ``` * @param _handler */ -export function setHandler(_handler: typeof handler) { +export function setHandler(_handler: Handler) { handler = _handler; } -export function getHandler() { +export function getHandler(): Handler { return handler; } @@ -41,7 +42,7 @@ export function getHandler() { * * @example * ```ts - * const apiDemo = genApi(ApiDemoConfig); + * const apiDemo = genAPICall(ApiDemoConfig); * ``` */ export default function genAPICall( @@ -49,17 +50,17 @@ export default function genAPICall( ): { ( data: ReqPayload, - requestConfig?: RequestConfig | ObjectLiteral, - customHandler?: typeof handler + requestConfig?: RequestConfig & { worker?: boolean }, + customHandler?: Handler ): Promise; config: APIConfig; } { function APICall( data: ReqPayload, - requestConfig?: RequestConfig | ObjectLiteral, - customHandler?: typeof handler + requestConfig?: RequestConfig & { worker?: boolean }, + customHandler?: Handler ): Promise { - return (customHandler ? customHandler : getHandler())(apiConfig, data, requestConfig); + return (customHandler || getHandler())(apiConfig, data, requestConfig); } // now you can access the config with api @@ -72,13 +73,13 @@ export default function genAPICall( export type Expand = T extends (...args: infer A) => infer R ? (...args: Expand) => Expand : T extends infer O - ? { [K in keyof O]: O[K] } - : never; + ? { [K in keyof O]: O[K] } + : never; export type ExpandRecursively = T extends (...args: infer A) => infer R ? (...args: ExpandRecursively) => ExpandRecursively : T extends object - ? T extends infer O - ? { [K in keyof O]: ExpandRecursively } - : never - : T; + ? T extends infer O + ? { [K in keyof O]: ExpandRecursively } + : never + : T; diff --git a/packages/tsdk/fe-sdk-template/src/path-params.ts b/packages/tsdk/fe-sdk-template/src/path-params.ts index 7bcd3ffc..6393cfaa 100644 --- a/packages/tsdk/fe-sdk-template/src/path-params.ts +++ b/packages/tsdk/fe-sdk-template/src/path-params.ts @@ -1,6 +1,4 @@ -import { ObjectLiteral } from './shared/tsdk-types'; - -export function pathParams(path: string, data: ObjectLiteral, symbol: ':' | '{}'): string { +export function pathParams(path: string, data: Record, symbol: ':' | '{}'): string { let newPath = path; const params = symbol === ':' ? parseParams(path) : parseBracesParams(path); @@ -35,11 +33,12 @@ export function parseParams(path: string) { return result; } -/** parse /{a}/{b} -> [{name: 'a', symbol: '{'},{name: 'b', symbol: '{'},] */ +/** parse /{a}/{b} -> [{name: 'a', symbol: '{a}'},{name: 'b', symbol: '{b}'},] */ export function parseBracesParams(path: string) { const result: { name: string; symbol: string }[] = []; const arr = path.match(/\{(.*?)\}/g); - arr && + + if (arr) arr.forEach((item) => { const key = item.slice(1, -1); result.push({ diff --git a/packages/tsdk/fe-sdk-template/src/shared/tsdk-types.ts b/packages/tsdk/fe-sdk-template/src/shared/tsdk-types.ts deleted file mode 100644 index 11918f71..00000000 --- a/packages/tsdk/fe-sdk-template/src/shared/tsdk-types.ts +++ /dev/null @@ -1,110 +0,0 @@ -import * as z from 'zod'; - -export const APITypes = { - user: 'user', - admin: 'admin', - common: 'common', -} as const; - -export const APITypesKey = Object.keys(APITypes).filter((item) => item !== APITypes.common); - -export type APIType = keyof typeof APITypes; - -export interface APIConfig { - /** The API type. Like: user side or admin side. */ - type: APIType; - /** The API path */ - path: string; - method: 'get' | 'post' | 'delete' | 'put' | 'patch' | 'head' | 'options'; - /** Request data validate scheme */ - schema?: z.ZodTypeAny; - /** The API need auth? Default is false */ - needAuth?: boolean; - /** The API disabled? Default is false */ - disabled?: boolean; - /** The API description */ - description: string; - /** The API category */ - category?: string; - - /** custom headers for client */ - headers?: { [key: string]: any }; - /** - * is params in url? for generate API sdk base documentation. - * default undefined, - * if `:`, will support `/api/:a/b/:c`, - * if `{}`, will support `/api/{a}/b/{c}`, - * and will replace with data with {a: 1, c: 2} to `/api/1/b/2` */ - paramsInUrl?: ':' | '{}'; - /** Force the API is fetch data, for sometimes the backend API is all `post` method */ - isGet?: boolean; -} - -export interface ObjectLiteral { - [key: string]: any; -} - -/** - * Result object returned by InsertQueryBuilder execution. - */ -export declare class InsertResult { - /** - * Contains inserted entity id. - * Has entity-like structure (not just column database name and values). - */ - identifiers: ObjectLiteral[]; - /** - * Generated values returned by a database. - * Has entity-like structure (not just column database name and values). - */ - generatedMaps: ObjectLiteral[]; - /** - * Raw SQL result returned by executed query. - */ - raw: any; -} - -export declare class UpdateResult { - /** - * Raw SQL result returned by executed query. - */ - raw: any; - /** - * Number of affected rows/documents - * Not all drivers support this - */ - affected?: number; - /** - * Contains inserted entity id. - * Has entity-like structure (not just column database name and values). - */ - /** - * Generated values returned by a database. - * Has entity-like structure (not just column database name and values). - */ - generatedMaps: ObjectLiteral[]; -} - -/** - * Result object returned by DeleteQueryBuilder execution. - */ -export declare class DeleteResult { - /** - * Raw SQL result returned by executed query. - */ - raw: any; - /** - * Number of affected rows/documents - * Not all drivers support this - */ - affected?: number | null; -} - -export type RequireAtLeastOne = { - [K in keyof T]-?: Required> & Partial>>; -}[keyof T]; - -export type RequireOnlyOne = Pick> & - { - [K in Keys]-?: Required> & Partial, undefined>>; - }[Keys]; diff --git a/packages/tsdk/fe-sdk-template/src/socket.io.ts b/packages/tsdk/fe-sdk-template/src/socket.io.ts index 6e03edd7..ce00a47c 100644 --- a/packages/tsdk/fe-sdk-template/src/socket.io.ts +++ b/packages/tsdk/fe-sdk-template/src/socket.io.ts @@ -1,13 +1,12 @@ // @ts-ignore import type { Socket } from 'socket.io-client'; - import { NoConnectionError, NoHandlerError, TimeoutError } from './error'; -import { APIConfig, ObjectLiteral, ProtocolTypes } from './shared/tsdk-helper'; -import { getID } from './utils'; +import { APIConfig, ProtocolTypes } from './tsdk-shared/helpers'; +import { RequestError, getID } from './utils'; let socketIOInstance: Socket; -const QUEUEs: ObjectLiteral = {}; +const QUEUES: Record = {}; /** * Set the io instance @@ -38,13 +37,14 @@ export const setSocketIOInstance = (instance: Socket): void => { result?: unknown; [key: string]: unknown; }) => { - if (msgId && QUEUEs[msgId]) { + if (msgId && QUEUES[msgId]) { if (!status || status === 200) { - QUEUEs[msgId].resolve(result); + QUEUES[msgId].resolve(result); } else { - QUEUEs[msgId].reject(result); + const _result = result as RequestError; + QUEUES[msgId].reject({ status, errors: _result?.errors, message: _result?.message }); } - delete QUEUEs[msgId]; + delete QUEUES[msgId]; } } ); @@ -53,55 +53,58 @@ export const setSocketIOInstance = (instance: Socket): void => { /** * Get socket.io-client instance * - * @param instance - socekt.io-client instance * @returns The io */ -export const getSocketIOInstance: () => Socket = () => { +export const getSocketIOInstance = (): Socket => { return socketIOInstance; }; type ParamsOfFromEntries = Parameters[0]; -export function socketIOHandler( +export async function socketIOHandler( apiConfig: APIConfig, data: any, - requestConfig?: ObjectLiteral & { timeout?: number } + requestConfig?: Record & { timeout?: number } ): Promise { const ioInstance = getSocketIOInstance(); if (!ioInstance) { throw new NoHandlerError(`Call \`setSocketIOInstance\` first`); } - return new Promise((resolve, reject) => { - if (!ioInstance.connected) { - return reject(new NoConnectionError('No Connection')); - } + if (!ioInstance.connected) { + throw new NoConnectionError('No Connection'); + } - const msgId = getID(apiConfig.method, apiConfig.path); + const { method, path, onRequest, onResponse } = apiConfig; - ioInstance.emit(ProtocolTypes.request, { - _id: msgId, - payload: - data instanceof FormData - ? Object.fromEntries(data as unknown as ParamsOfFromEntries) - : data, - }); + let requestData = + data instanceof FormData ? Object.fromEntries(data as unknown as ParamsOfFromEntries) : data; + // Apply onRequest hook if available + if (onRequest) { + requestData = await onRequest(requestData); + } + + return new Promise((resolve, reject) => { + const msgId = getID(method, path); - const timer = requestConfig?.timeout - ? setTimeout(() => { - delete QUEUEs[msgId]; - reject(new TimeoutError('Request Timeout')); - }, requestConfig.timeout) - : -1; + const timer = setTimeout(() => { + delete QUEUES[msgId]; + reject(new TimeoutError(`Request Timeout: ${method} ${path}`)); + }, requestConfig?.timeout || 10e3); - QUEUEs[msgId] = { - resolve(res: any) { + QUEUES[msgId] = { + async resolve(res: unknown) { clearTimeout(timer); - resolve(res); + resolve(onResponse ? await onResponse(res) : res); }, reject(e: Error) { clearTimeout(timer); reject(e); }, }; + + ioInstance.emit(ProtocolTypes.request, { + _id: msgId, + payload: requestData, + }); }); } diff --git a/examples/server/src/shared/tsdk-helper.ts b/packages/tsdk/fe-sdk-template/src/tsdk-shared/helpers.ts similarity index 59% rename from examples/server/src/shared/tsdk-helper.ts rename to packages/tsdk/fe-sdk-template/src/tsdk-shared/helpers.ts index 313171f2..38864ccf 100644 --- a/examples/server/src/shared/tsdk-helper.ts +++ b/packages/tsdk/fe-sdk-template/src/tsdk-shared/helpers.ts @@ -1,8 +1,4 @@ -import { paramCase } from 'change-case'; - -import { ObjectLiteral } from '@/src/shared/tsdk-types'; - -export * from '@/src/shared/tsdk-types'; +export * from './types'; export const hasBodyMethods: { [key: string]: boolean | undefined } = { post: true, @@ -17,6 +13,13 @@ export function checkMethodHasBody(method: string) { export function transformPath(path: string) { return `/${paramCase(path)}`; } +export function paramCase(input: string): string { + return input + .replace(/([a-z0-9])([A-Z])/g, '$1-$2') // Add a hyphen between lower and upper case letters + .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') // Add a hyphen between consecutive capitals when followed by lowercase + .replace(/\s+/g, '-') // Replace spaces with hyphens + .toLowerCase(); // Convert all characters to lowercase +} export function isObject(data: T) { const result = diff --git a/packages/tsdk/fe-sdk-template/src/tsdk-shared/types.ts b/packages/tsdk/fe-sdk-template/src/tsdk-shared/types.ts new file mode 100644 index 00000000..56947bbb --- /dev/null +++ b/packages/tsdk/fe-sdk-template/src/tsdk-shared/types.ts @@ -0,0 +1,44 @@ +// @ts-ignore +import type { StandardSchemaV1 } from '@standard-schema/spec'; + +export const APITypes = { + user: 'user', + admin: 'admin', + common: 'common', +} as const; + +export const APITypesKey = Object.keys(APITypes).filter((item) => item !== APITypes.common); + +export type APIType = keyof typeof APITypes; +type HTTPMethod = 'GET' | 'POST' | 'DELETE' | 'PUT' | 'PATCH' | 'HEAD' | 'OPTIONS'; +export interface APIConfig { + /** The API type, such as user-side or admin-side. Default is `user`. */ + type?: APIType; + /** The API path. */ + path: string; + /** The HTTP method. */ + method: HTTPMethod | Lowercase; + /** Request data validation schema. */ + schema?: StandardSchemaV1; + /** Does the API require authentication? Default is `false`. */ + needAuth?: boolean; + /** Is the API disabled? Default is `false`. */ + disabled?: boolean; + /** Custom headers for the client. */ + headers?: { [key: string]: any }; + /** + * Are parameters included in the URL? Used for generating API SDK-based documentation. + * Default is `undefined`. + * - If `':'`, supports `/api/:a/b/:c`. + * - If `'{}'`, supports `/api/{a}/b/{c}`. + * Parameters will be replaced with data, e.g., `{ a: 1, c: 2 }` → `/api/1/b/2`. + */ + paramsInUrl?: ':' | '{}'; + /** Force the API to be treated as a data-fetching request, + * useful when backend APIs use `POST` for all requests. */ + isGet?: boolean; + /** Hook to process data before sending the request. */ + onRequest?(data: T): T | Promise; + /** Hook to process data after receiving the response. */ + onResponse?(response: T): T | Promise; +} diff --git a/packages/tsdk/fe-sdk-template/src/utils.ts b/packages/tsdk/fe-sdk-template/src/utils.ts index 6538a557..2c0ac3d9 100644 --- a/packages/tsdk/fe-sdk-template/src/utils.ts +++ b/packages/tsdk/fe-sdk-template/src/utils.ts @@ -1,3 +1,5 @@ +// @ts-ignore +import type { StandardSchemaV1 } from '@standard-schema/spec'; /** * The `methods` sort order should same with * `packages/tsdk-server-adapters/src/socket.io-adapter.ts` @@ -10,10 +12,32 @@ methods.forEach((i, idx) => { let ID = 0; -export function getID(method: string, path: string) { +export function resetID() { + ID = 0; +} + +/** + * Generates a unique ID for API requests based on HTTP method and path + * @param method - HTTP method (get, post, etc.) + * @param path - API endpoint path + * @returns A unique string identifier + */ +export function getID(method: string, path: string): string { const lowCaseMethod = method.toLowerCase(); const methodIdx = methodsMap[lowCaseMethod]; - return `${methodIdx}:${path}:${++ID}${ - Date.now().toString(36).slice(-4) + Math.random().toString(36).slice(-4) - }`; + + // Add error handling for invalid methods + if (methodIdx === undefined) { + throw new Error(`Invalid method: ${method}. Valid methods are: ${methods.join(', ')}`); + } + + const timestamp = Date.now().toString(36).slice(-4); + const randomStr = Math.random().toString(36).slice(-4); + + return `${methodIdx}:${path}:${++ID}${timestamp}${randomStr}`; } + +export type RequestError = { + errors?: StandardSchemaV1.Issue[]; + message?: string; +}; diff --git a/packages/tsdk/fe-sdk-template/src/worker/gen-worker-api.ts b/packages/tsdk/fe-sdk-template/src/worker/gen-worker-api.ts new file mode 100644 index 00000000..5d6f5bf5 --- /dev/null +++ b/packages/tsdk/fe-sdk-template/src/worker/gen-worker-api.ts @@ -0,0 +1,87 @@ +import { APIConfig, ProtocolTypes } from '../tsdk-shared/helpers'; +import { getID, RequestError } from '../utils'; +import genAPI, { type Handler, type RequestConfig } from '../gen-api'; +import { TimeoutError } from '../error'; + +const QUEUES: Record = {}; +let PENDINGS: [(value: unknown) => void, () => void][] = []; + +let worker: Worker; +let ready = false; +export function setWorker(_worker: Worker) { + worker = _worker; + worker.addEventListener('message', (e) => { + if (e.data.type !== ProtocolTypes.response) return; + if (e.data.ready) { + ready = true; + PENDINGS.forEach(([resolve]) => resolve(1)); + PENDINGS = []; + } + + const msgId = e.data.id; + if (msgId && QUEUES[msgId]) { + if (e.data.success) { + QUEUES[msgId].resolve(e.data.result); + } else { + const _result = e.data.error as RequestError; + QUEUES[msgId].reject({ errors: _result?.errors, message: _result?.message }); + } + delete QUEUES[msgId]; + } + }); +} +function genWorkerAPI( + apiConfig: APIConfig +): { + ( + payload: ReqPayload, + requestConfig?: RequestConfig & { worker?: boolean }, + customHandler?: Handler + ): Promise; + config: APIConfig; +} { + async function APICall( + payload: ReqPayload, + requestConfig?: RequestConfig & { worker?: boolean }, + /** @deprecated Useless with web workers */ + customHandler?: Handler + ): Promise { + if (requestConfig?.worker === false) + return genAPI(apiConfig)(payload, requestConfig, customHandler); + if (!ready) { + await new Promise((resolve, reject) => { + PENDINGS.push([resolve, reject]); + }); + } + return new Promise((resolve, reject) => { + const msgId = getID(apiConfig.method, apiConfig.path); + const timer = setTimeout(() => { + delete QUEUES[msgId]; + reject(new TimeoutError(`Request Timeout: ${apiConfig.method} ${apiConfig.path}`)); + }, requestConfig?.timeout || 10e3); + QUEUES[msgId] = { + async resolve(res: ResData) { + clearTimeout(timer); + resolve(res); + }, + reject(error: Error) { + clearTimeout(timer); + reject(error); + }, + }; + worker.postMessage({ + type: ProtocolTypes.request, + id: msgId, + payload, + apiConfig, + options: requestConfig, + }); + }); + } + APICall.config = apiConfig; + return APICall; +} + +const supportWebWorkers = typeof document !== 'undefined' && typeof Worker !== 'undefined'; + +export default !supportWebWorkers ? genAPI : genWorkerAPI; diff --git a/packages/tsdk/fe-sdk-template/src/xior.ts b/packages/tsdk/fe-sdk-template/src/xior.ts index 496f81ad..bc4d2813 100644 --- a/packages/tsdk/fe-sdk-template/src/xior.ts +++ b/packages/tsdk/fe-sdk-template/src/xior.ts @@ -1,8 +1,8 @@ +// @ts-ignore import { XiorRequestConfig as _XiorRequestConfig, Xior as xior } from 'xior'; - import { NoHandlerError } from './error'; import { pathParams } from './path-params'; -import { APIConfig, checkMethodHasBody } from './shared/tsdk-helper'; +import { APIConfig, checkMethodHasBody } from './tsdk-shared/helpers'; let xiorInstance: xior; @@ -18,10 +18,9 @@ export const setXiorInstance = (instance: xior): void => { /** * Get the XiorInstance * - * @param instance - XiorInstance * @returns The XiorInstance */ -export const getXiorInstance = () => { +export const getXiorInstance = (): xior => { return xiorInstance; }; @@ -29,17 +28,31 @@ export type XiorRequestConfig = Omit<_XiorRequestConfig, 'data'> & { data?: ReqPayload; }; +/** + * Handler for making HTTP requests using Xior + * + * @param apiConfig - API configuration including path, method, and headers + * @param requestData - Request payload data + * @param requestConfig - Optional Xior-specific request configuration + * @returns Promise resolving to the response data + */ export async function xiorHandler( apiConfig: APIConfig, requestData: any, requestConfig?: XiorRequestConfig -) { - const xiorInstance = getXiorInstance(); - if (!xiorInstance) { +): Promise { + const instance = getXiorInstance(); + if (!instance) { throw new NoHandlerError(`Call \`setXiorInstance\` first`); } - const { path, headers, isGet } = apiConfig; - const method = apiConfig.method.toLowerCase(); + + const { path, headers, isGet, onRequest, onResponse } = apiConfig; + const method = apiConfig?.method?.toLowerCase() || 'get'; + + // Apply onRequest hook if available + if (onRequest) { + requestData = await onRequest(requestData); + } const payload: _XiorRequestConfig = { method: method === 'patch' ? method.toUpperCase() : method, @@ -56,20 +69,24 @@ export async function xiorHandler( } if (requestData) { - const data = requestData; if (checkMethodHasBody(method)) { - payload.data = data; + payload.data = requestData; if (requestConfig?.params) { payload.params = requestConfig.params; } } else { - payload.params = requestConfig?.params ? { ...requestConfig.params, ...data } : data; + payload.params = requestConfig?.params + ? { ...requestConfig.params, ...requestData } + : requestData; } } - if (requestData && (apiConfig as any).paramsInUrl) { + + if (requestData && 'paramsInUrl' in apiConfig) { payload.url = pathParams(path, requestData, (apiConfig as any).paramsInUrl); } - const { data } = await xiorInstance.request(payload); - return data; + const { data } = await instance.request(payload); + + // Apply onResponse hook if available + return onResponse ? await onResponse(data) : data; } diff --git a/packages/tsdk/fe-sdk-template/tsconfig.esm.json b/packages/tsdk/fe-sdk-template/tsconfig.esm.json new file mode 100644 index 00000000..6d886135 --- /dev/null +++ b/packages/tsdk/fe-sdk-template/tsconfig.esm.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "strict": true, + "strictPropertyInitialization": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "downlevelIteration": true, + "esModuleInterop": true, + "declaration": true, + "noImplicitAny": true, + "module": "ES2015", + "target": "ES2015", + "outDir": "esm", + "lib": ["ES2015", "ES2019", "DOM"], + "incremental": true, + "skipLibCheck": true, + "moduleResolution": "bundler", + "resolveJsonModule": true + }, + "include": ["./src"] +} diff --git a/packages/tsdk/fe-sdk-template/tsconfig.json b/packages/tsdk/fe-sdk-template/tsconfig.json index d0c516a9..accaa3cc 100644 --- a/packages/tsdk/fe-sdk-template/tsconfig.json +++ b/packages/tsdk/fe-sdk-template/tsconfig.json @@ -1,5 +1,4 @@ { - "extends": "@tsconfig/recommended/tsconfig.json", "compilerOptions": { "strict": true, "strictPropertyInitialization": false, @@ -10,8 +9,9 @@ "declaration": true, "noImplicitAny": true, "target": "ES5", + "module": "CommonJS", "outDir": "lib", - "lib": ["DOM", "ES2015", "ES5", "dom.iterable"], + "lib": ["DOM", "ES2015", "ES2019", "ES5"], "incremental": true, "skipLibCheck": true, "resolveJsonModule": true diff --git a/packages/tsdk/fe-sdk-template/write-popover.mjs b/packages/tsdk/fe-sdk-template/write-popover.mjs deleted file mode 100644 index 6e46d20b..00000000 --- a/packages/tsdk/fe-sdk-template/write-popover.mjs +++ /dev/null @@ -1,6 +0,0 @@ -import fs from "fs"; - -const mainContent = fs.readFileSync("./docs/assets/main.js", "utf8"); -const popoverContent = fs.readFileSync("./popover.js", "utf8"); - -fs.writeFileSync("./docs/assets/main.js", `${mainContent}\n;${popoverContent}`); diff --git a/packages/tsdk/package.json b/packages/tsdk/package.json index 1cd7bc2d..3ab396cb 100644 --- a/packages/tsdk/package.json +++ b/packages/tsdk/package.json @@ -1,6 +1,6 @@ { "name": "tsdk", - "version": "0.3.0", + "version": "1.0.0-alpha.17", "description": "Type-safe API development and code share tool for TypeScript projects.", "repository": "tsdk-monorepo/tsdk", "bugs": "https://github.com/tsdk-monorepo/tsdk/issues", @@ -11,19 +11,22 @@ "tsdk": "bin/tsdk.js" }, "scripts": { - "start": "npm run build && pnpm --filter server-example sync && pnpm --filter server-example build && pnpm --filter server-example example", - "start-publish": "npm run build && npm publish --access public --no-git-checks --provenance --registry=https://registry.npmjs.org", + "start": "npm run test && pnpm --filter server-example sync && pnpm --filter server-example build && pnpm --filter server-example example", + "start-publish": "npm run build && node ../../scripts/purge-pkg-for-publish.mjs && npm publish --access public --no-git-checks --provenance --registry=https://registry.npmjs.org", + "local:start-publish": "npm run build && node ../../scripts/purge-pkg-for-publish.mjs && npm publish --tag alpha --access public --no-git-checks --provenance=false --registry=https://registry.npmjs.org", "build": "rm -rf lib && tsc --project tsconfig.json", "start-website": "cd website && yarn && npm run start", "build-website": "cd website && yarn && npm run build", - "test": "cross-env NODE_ENV=test TS_CONFIG_PATHS=true ts-mocha -p tsconfig.json ./**/*.test.ts --parallel --timeout 30000", - "lint": "eslint . --ext .ts,.tsx --fix", + "test": "vitest --run --testTimeout=120000 --hookTimeout=120000 --exclude tests/cli.empty-project.test.ts && vitest --run --testTimeout=120000 --hookTimeout=120000 --poolOptions.threads.singleThread tests/cli.empty-project.test.ts", + "lint": "eslint . --ext .ts,.tsx --fix ./src", "checktype": "tsc --noEmit" }, "files": [ "bin/*", "lib/*", "fe-sdk-template/*", + "templates/*", + "fe-sdk-template/.gitignore", "README.md" ], "keywords": [ @@ -43,32 +46,27 @@ "ws", "socket.io", "cli", - "axios", "fetch", - "xior" + "xior", + "axios" ], "dependencies": { - "chalk": "4.1.2", - "fast-glob": "^3.3.2", - "fs-extra": "^11.2.0" + "fast-glob": "^3.3.3", + "fs-extra": "^11.3.0", + "js-yaml": "^4.1.1", + "@parcel/watcher": "^2.5.4", + "typescript-json-schema": "^0.67.1", + "typescript": "~5.5.4", + "@clack/prompts": "^0.11.0", + "tar": "^7.5.6" }, "devDependencies": { - "@configs/test-config": "workspace:*", - "@configs/eslint-config": "workspace:*", - "@configs/ts-config": "workspace:*", + "@types/js-yaml": "^4.0.9", "@types/fs-extra": "^11.0.4", "@types/webpack-node-externals": "^3.0.0", - "webpack": "^5.97.1", + "webpack": "^5.102.1", "webpack-node-externals": "^3.0.0", - "typescript": "^5", - "@tsconfig/recommended": "^1.0.7" - }, - "eslintConfig": { - "extends": [ - "@configs/eslint-config/node" - ], - "ignorePatterns": [ - "node_modules" - ] + "@tsconfig/recommended": "^1.0.10", + "vitest": "^3.2.4" } } diff --git a/packages/tsdk/src/alias.ts b/packages/tsdk/src/alias.ts index 981d7fce..a482ee0a 100644 --- a/packages/tsdk/src/alias.ts +++ b/packages/tsdk/src/alias.ts @@ -1,85 +1,96 @@ import path from 'path'; +import { replaceWindowsPath } from './utils'; export interface AliasToRelativePathOptions { filePath: string; imports: string[]; - config: { baseUrl?: string; paths?: { [key: string]: [] } }; + config: { + baseUrl?: string; + paths?: Record; + }; cwd?: string; } export function aliasToRelativePath({ filePath, imports, - config, - cwd, -}: AliasToRelativePathOptions) { - if (!config) { - config = {}; - } - if (!config.paths) { - config.paths = {}; - // throw new Error( - // "Unable to find the 'paths' property in the supplied configuration!" - // ); + config: inputConfig, + cwd = process.cwd(), +}: AliasToRelativePathOptions): string[] { + if (cwd === './') { + cwd = process.cwd(); } - if (config.baseUrl === undefined || config.baseUrl === '.') { - config.baseUrl = './'; - } + // Initialize config with defaults + const config = { + baseUrl: inputConfig?.baseUrl || './', + paths: inputConfig?.paths || {}, + }; - const { baseUrl, paths } = config; - const aliases: { [key: string]: string[] | undefined } = {}; + // Create alias mapping with resolved paths + const aliasMap = Object.entries(config.paths).reduce>( + (acc, [alias, paths]) => { + // Store original alias patterns for matching + acc[alias] = paths.map((p) => p); + return acc; + }, + {} + ); - for (const alias in paths) { - /* istanbul ignore else */ - if (paths.hasOwnProperty(alias)) { - let resolved = alias; + // Process each import + return imports.map((importPath) => { + // Find matching alias - handle wildcard patterns correctly + const matchingAlias = Object.keys(aliasMap).find((alias) => { if (alias.endsWith('/*')) { - resolved = alias.replace('/*', '/'); + const prefix = alias.slice(0, -2); // Remove the '/*' + return importPath === prefix || importPath.startsWith(prefix + '/'); } + return importPath === alias || importPath.startsWith(alias + '/'); + }); - aliases[resolved] = paths[alias]; + if (!matchingAlias) { + return importPath; } - } - const lines: string[] = [...imports]; - let idx = -1; - for (const line of imports) { - idx++; - let resolved = ''; - for (const alias in aliases) { - /* istanbul ignore else */ - if (aliases.hasOwnProperty(alias) && line.startsWith(alias)) { - const choices: string[] | undefined = aliases[alias]; + const choices = aliasMap[matchingAlias]; + if (!choices?.[0]) { + return importPath; + } - if (choices !== undefined) { - resolved = choices[0]; - if (resolved.endsWith('/*')) { - resolved = resolved.replace('/*', '/'); - } + // Handle the replacement correctly for wildcards + let resolved; + if (matchingAlias.endsWith('/*')) { + const baseAlias = matchingAlias.slice(0, -2); + const restOfImport = importPath.slice(baseAlias.length); - resolved = line.replace(alias, resolved); + let choice = choices[0]; + if (choice.endsWith('/*')) { + choice = choice.slice(0, -2); + } - break; - } + resolved = choice + restOfImport; + } else { + const restOfImport = importPath.slice(matchingAlias.length); + let choice = choices[0]; + if (choice.endsWith('/*')) { + choice = choice.slice(0, -2); } - } - if (resolved.length < 1) { - continue; + resolved = choice + restOfImport; } - const base = path.join(cwd as string, path.relative(cwd as string, baseUrl || './')); + // Calculate relative path + const baseUrlPath = path.resolve(cwd, config.baseUrl); + const targetPath = path.resolve(baseUrlPath, resolved); + const currentDirPath = path.dirname(path.resolve(cwd, filePath)); - const current = path.relative(base, path.dirname(filePath)); + let relativePath = replaceWindowsPath(path.relative(currentDirPath, targetPath)); - const target = path.relative(base, resolved); - const relative = path.relative(current, target).replace(/\\/g, '/'); - lines[idx] = line.replace(line, relative); - if (lines[idx].indexOf('/') < 0 || target.startsWith(current)) { - lines[idx] = './' + lines[idx]; + // Ensure proper path format + if (!relativePath.startsWith('../') && !relativePath.startsWith('./')) { + relativePath = './' + relativePath; } - } - return lines; + return relativePath; + }); } diff --git a/packages/tsdk/src/cli.ts b/packages/tsdk/src/cli.ts index f2da91f7..929b70c2 100644 --- a/packages/tsdk/src/cli.ts +++ b/packages/tsdk/src/cli.ts @@ -1,85 +1,478 @@ import { buildSDK } from './compile-tsdk'; -import { tsconfigExists, parsePkg, pkg } from './config'; -import { getNpmCommand } from './get-pkg-manager'; +import { tsconfigExists, parsePkg, config } from './config'; +import { addModule } from './create/add-module'; +import { createTemplate } from './create/create-template'; +import { getNpmCommand } from './get-npm-command'; +import { logger } from './log'; +import { runOpenapiToApiconfCommand, runApiconfToOpenapiCommand } from './openapi-command'; import { runPrettier } from './prettier'; import { removeFields } from './remove-fields'; import { runNestCommand } from './run-nest-command'; import symbols from './symbols'; import { copyPermissionsJSON, deleteSDKFolder, syncAPI } from './sync-api'; import { addDepsIfNone, copyTsdkConfig, syncFiles } from './sync-files'; +import { ignorePatterns, measureExecutionTime } from './utils'; +import watcher from '@parcel/watcher'; +import path from 'path'; -export async function run() { - const params = process.argv.filter((i) => i.startsWith('--')); - - const commands: { [key: string]: any } = { - help: ` -Usage - $ tsdk - -Options - --help help - --init initialize \`tsdk\` config file - --sync sync files and generate api - --sync --no-overwrite default is overwrite with template files(no overwrite for create custom files) - --nest run nest command, only support build - --version the verison info - -Examples - $ tsdk --version - $ tsdk --help - $ tsdk --init - $ tsdk --sync - $ tsdk --sync --no-overwrite - $ - $ tsdk --nest build - $ tsdk --nest build [name] [name] - $ tsdk --nest build all +// CLI command definitions +// Purpose: Define all CLI commands, their help text, and usage examples +// Each command should have clear, structured documentation +const CLI_COMMANDS = { + help: ` +${bold('tsdk')} - TypeScript Development Kit + +${bold('USAGE')} + ${dim('$')} tsdk ${yellow('[command]')} ${cyan('[options]')} + +${bold('COMMANDS')} + ${yellow('create')} ${cyan('[name]')} Create a new project from Git template + ${yellow('add')} ${cyan('')} Add a module to current project + ${yellow('init')} Initialize tsdk configuration file + ${yellow('sync')} Sync files and generate API + ${yellow('watch')} Watch mode for continuous sync + ${yellow('nest')} ${cyan('')} Run NestJS build commands + ${yellow('from-openapi')} ${cyan('')} Convert OpenAPI spec to *.apiconf.ts + ${yellow('to-openapi')} Convert *.apiconf.ts to OpenAPI spec + +${bold('OPTIONS')} + ${cyan('--help, -h')} Show this help message + ${cyan('--version, -v')} Show version information + ${cyan('--build')} Run tsc build after sync ${dim('(with --sync)')} + ${cyan('--no-zod')} Skip adding zod to dependencies + ${cyan('--no-vscode')} Skip copying .vscode/ directory ${dim('(with --sync)')} + ${cyan('--no-overwrite')} Preserve existing files, only create new ones + ${cyan('--no-verbose')} Only log necessary information + ${cyan('-o, --output')} ${yellow('')} Output directory ${dim('(with --from-openapi)')} + ${cyan('-t, --template')} ${yellow('')} Git repository for template ${dim('(with create)')} + +${bold('EXAMPLES')} + ${dim('# Project scaffolding')} + ${dim('$')} tsdk create my-app ${cyan('--template')} user/react-template + ${dim('$')} tsdk create backend ${cyan('-t')} company/express-starter + ${dim('$')} tsdk add user/auth-module + ${dim('$')} tsdk add https://github.com/user/payment-module.git + + ${dim('# Configuration & sync')} + ${dim('$')} tsdk init + ${dim('$')} tsdk init ${cyan('--no-zod')} + ${dim('$')} tsdk sync + ${dim('$')} tsdk sync ${cyan('--build')} + ${dim('$')} tsdk sync ${cyan('--no-overwrite --no-vscode')} + ${dim('$')} tsdk watch + + ${dim('# NestJS integration')} + ${dim('$')} tsdk nest build + ${dim('$')} tsdk nest build ${yellow('')} + ${dim('$')} tsdk nest build all + + ${dim('# OpenAPI conversion')} + ${dim('$')} tsdk to-openapi + ${dim('$')} tsdk from-openapi openapi.yaml ${cyan('-o')} ${yellow('./src/api')} + ${dim('$')} tsdk from-openapi spec.json ${cyan('--output')} ${yellow('./generated')} + +${bold('TEMPLATES & MODULES')} + Templates and modules are sourced from Git repositories: + • ${cyan('user/repo')} GitHub short form + • ${cyan('user/repo#branch')} Specific branch + • ${cyan('https://...')} Full Git URL + + Create your own: + • Templates: Any Git repo with a valid project structure + • Modules: Git repo with ${yellow('module.json')} at root + +${dim('Documentation:')} https://github.com/tsdk-monorepo/tsdk +${dim('Report issues:')} https://github.com/tsdk-monorepo/tsdk/issues `, - init: `init \`tsdk\` config file`, - sync: `generate api`, - nest: `@nestjs/cli enchance`, - }; - const validProjectMsg = `Please run \`tsdk\` in a valid TypeScript project's root directory.`; + // Short descriptions for programmatic use + create: 'Create a new project from Git template', + add: 'Add a module from Git repository to current project', + init: 'Initialize tsdk configuration file', + sync: 'Sync files and generate API code from configuration', + watch: 'Watch for changes and auto-sync', + nest: 'Run NestJS CLI commands (currently supports: build)', + 'from-openapi': 'Convert OpenAPI specification (YAML or JSON) to TypeScript API configuration', + 'to-openapi': 'Convert TypeScript API configuration to OpenAPI specification (YAML or JSON)', + version: 'Display tsdk version information', +} as const; + +// Color helpers (if not already imported from picocolors) +function bold(str: string) { + return `\x1b[1m${str}\x1b[0m`; +} +function dim(str: string) { + return `\x1b[2m${str}\x1b[0m`; +} +function yellow(str: string) { + return `\x1b[33m${str}\x1b[0m`; +} +function cyan(str: string) { + return `\x1b[36m${str}\x1b[0m`; +} - if (params.length === 0 || params[0] === '--help') { - console.log(commands.help); +// Map old flags to new commands +const LEGACY_MAPPING: Record = { + '--init': 'init', + '--sync': 'sync', + '--watch': 'watch', + '--nest': 'nest', + '--from-openapi': 'from-openapi', + '--to-openapi': 'to-openapi', + '--help': 'help', + '-h': 'help', + '--version': 'version', + '-v': 'version', +}; - if (!tsconfigExists) { - console.log(symbols.warning, validProjectMsg, '\n'); - } - } else if (params[0] === '--version') { - await parsePkg(); - console.log(`${pkg.name}@${pkg.version}`); - } else if (!tsconfigExists) { - console.log('\n', 'Error: >> ', symbols.error, validProjectMsg, '\n'); - } else if (params[0] === `--init`) { - await copyTsdkConfig(); - console.log(symbols.success, '`tsdk.config.js` copied!'); - console.log( - symbols.info, - `You can edit and generate the SDK package with \`${ - getNpmCommand(process.cwd()).npxCmd - } tsdk --sync\`` +export type CommandKey = keyof typeof CLI_COMMANDS; +/** + * Normalizes arguments to ensure compatibility between + * old style (flags) and new style (commands). + */ +export function resolveCommand(args: string[]): { command: CommandKey; args: string[] } { + const primaryInput = args[0]; + + // 1. Handle empty input + if (!primaryInput) { + return { command: 'help', args: [] }; + } + + // 2. Check if it's a known new-style command + if (primaryInput in CLI_COMMANDS && primaryInput !== 'help') { + return { + command: primaryInput as CommandKey, + args: args.slice(1), + }; + } + + // 3. Check legacy mapping (Old Style conversion) + if (LEGACY_MAPPING[primaryInput]) { + // If user typed 'tsdk --sync', we treat it as 'tsdk sync' + return { + command: LEGACY_MAPPING[primaryInput], + args: args.slice(1), + }; + } + + // 4. Fallback for unknown commands + return { command: 'help', args: [] }; +} + +// Validate that a command exists +function isValidCommand(cmd: string): cmd is keyof typeof CLI_COMMANDS { + return cmd in CLI_COMMANDS; +} + +// Get command description +function getCommandDescription(cmd: keyof typeof CLI_COMMANDS): string { + return CLI_COMMANDS[cmd]; +} + +export { CLI_COMMANDS, isValidCommand, getCommandDescription }; + +const VALID_PROJECT_MSG = `Please run \`tsdk\` in a valid TypeScript project! Check: https://tsdk.dev/docs/start-a-typescript-project`; + +/** + * Main function to run the CLI + */ +export async function run(): Promise { + const startTime = Date.now(); + try { + const tsdkIdx = process.argv.findIndex( + (item) => item.endsWith('tsdk') || item.endsWith('tsdk.js') ); - await addDepsIfNone(); - } else if (params[0] === `--sync`) { - await deleteSDKFolder(); - await addDepsIfNone(); - const noOverwrite = params[1] === `--no-overwrite`; - await syncFiles(noOverwrite); - console.log('\n\n', symbols.bullet, 'build configs for generate APIs'); - await buildSDK(true); - console.log(symbols.success, 'build configs for generate APIs'); - await syncAPI(); - console.log('\n\n', symbols.bullet, 'build files'); - await buildSDK(); - console.log(symbols.success, 'build files\n'); - await Promise.all([copyPermissionsJSON(), removeFields()]); - await runPrettier(); - } else if (params[0] === `--nest`) { - runNestCommand(); + const rawArgs = process.argv.filter((item, idx) => idx > tsdkIdx); + // Normalize args using our compatibility layer + const { command, args: commandArgs } = resolveCommand(rawArgs); + await handleCommand(command, commandArgs); + if (['create', 'watch'].includes(command)) return; + const totalTime = Date.now() - startTime; + logger.log(`\n✅ Total execution time: ${(totalTime / 1000).toFixed(2)}s`); + } catch (error) { + logger.error(`\n${symbols.error} Unexpected error:`); + logger.error(error); + const totalTime = Date.now() - startTime; + logger.error(`\n❌ Failed after: ${(totalTime / 1000).toFixed(2)}s`); + process.exit(1); } } +// Execute the CLI run(); + +/** + * Handles sync command with parallelization where possible + * @param noOverwrite Whether to use no-overwrite mode + * @param needBuild Run build + */ +async function handleSyncCommand( + noOverwrite: boolean, + needBuild = false, + prettier = true +): Promise { + try { + await measureExecutionTime(`Delete SDK ${config.baseDir} folder`, () => deleteSDKFolder()); + await measureExecutionTime('Add dependencies if none', () => addDepsIfNone()); + + const result = await measureExecutionTime('Sync files', () => syncFiles(noOverwrite)); + + await measureExecutionTime('Generating API', () => + syncAPI(result?.apiconfs || [], result?.types || []) + ); + if (needBuild) { + await measureExecutionTime('Build SDK', () => buildSDK(true)); + } + + const removeFieldsValue = config.removeFields ?? ['needAuth']; + // Execute these tasks in parallel + await measureExecutionTime('Post-processing', async () => { + await Promise.all([ + measureExecutionTime('Copy permissions JSON', () => copyPermissionsJSON(), ' '), + removeFieldsValue.length > 0 + ? measureExecutionTime('Remove fields', () => removeFields(), ' ') + : Promise.resolve(1), + ]); + }); + + if (prettier) { + const prettierSuccess = await measureExecutionTime('Run Prettier', () => runPrettier()); + if (prettierSuccess) logger.log(`${symbols.success} Prettier files\n`); + } + } catch (error) { + logger.error(`\n${symbols.error} Sync command failed:`); + logger.error(error); + process.exit(1); + } +} + +/** + * Watch mode implementation using @parcel/watcher + * Monitors apiconf files and triggers sync on changes + * @param noOverwrite Whether to use no-overwrite mode + * @param needBuild Run build after each sync + */ +async function handleWatchCommand(noOverwrite: boolean, needBuild = false): Promise { + logger.info(`${symbols.info} Starting watch mode...`); + + // Run initial sync + logger.info(`${symbols.info} Running initial sync...`); + let DEBOUNCE_MS = 300; + const start = Date.now(); + await handleSyncCommand(noOverwrite, needBuild, false); + DEBOUNCE_MS = Math.max(DEBOUNCE_MS, Date.now() - start + 50); + const pattern = path.join(...config.baseDir.split('/')); + // Determine watch directories from config + const watchDirs: string[] = []; + const dirs = [pattern, ...(config.sharedDirs || [])]; + + // Convert to absolute paths + const absoluteDirs = dirs.map((dir) => + path.isAbsolute(dir) ? dir : path.join(process.cwd(), dir) + ); + // Remove subdirectories if parent is already watched + const filteredDirs = absoluteDirs.filter((dir, index, array) => { + // Check if any OTHER directory is a parent of this one + return !array.some((otherDir, otherIndex) => { + if (index === otherIndex) return false; + // Is otherDir a parent of dir? + const relative = path.relative(otherDir, dir); + return relative && !relative.startsWith('..') && !path.isAbsolute(relative); + }); + }); + watchDirs.push(...filteredDirs); + + logger.info(`${symbols.info} Watching for changes in:`); + watchDirs.forEach((dir) => logger.info(` - ${dir}`)); + logger.info(`\n${symbols.info} Press Ctrl+C to stop`); + + // Build file extension patterns from config + const { apiconfExt, entityExt, shareExt } = config; + + // Track last sync time to debounce rapid changes + let lastSyncTime = Date.now(); + let syncTimeout: NodeJS.Timeout | null = null; + + /** + * Check if file matches watched extensions + * Matches patterns like: *.apiconf.ts, *.entity.ts, *.shared.ts + * shareExt uses pattern: *.{shareExt}.* (e.g., *.shared.ts, *.shared.json) + */ + function isRelevantFile(filePath: string): boolean { + const fileName = path.basename(filePath); + + // Check apiconf pattern: *.apiconf.ts + const apiconfPattern = `.${apiconfExt}.ts`; + if (fileName.endsWith(apiconfPattern)) return true; + + // Check entity pattern: *.entity.ts + const entityPattern = `.${entityExt}.ts`; + if (fileName.endsWith(entityPattern)) return true; + + // Check shareExt pattern: *.{shareExt}.{ext} + // Match files like: *.shared.ts, *.shared.json, *.shared.jpg + // Split on last dot to get the final extension + const parts = fileName.split('.'); + if (parts.length >= 3) { + // Check if second-to-last part matches shareExt + const secondToLast = parts[parts.length - 2]; + if (secondToLast === shareExt) return true; + } + + return false; + } + + try { + // Subscribe to all watch directories + const subscriptions = await Promise.all( + watchDirs.map(async (watchDir) => { + return watcher.subscribe( + watchDir, + async (err, events) => { + if (err) { + logger.error(`\n${symbols.error} Watch error in ${watchDir}:`, err); + return; + } + + // Filter for relevant file changes based on configured extensions + const relevantChanges = events.filter((event) => isRelevantFile(event.path)); + + if (relevantChanges.length === 0) return; + + // Log detected changes + logger.info(`\n${symbols.info} Detected changes:`); + relevantChanges.forEach((event) => { + const relativePath = path.relative(process.cwd(), event.path); + logger.info(` ${event.type}: ${relativePath}`); + }); + + // Debounce: wait for changes to settle before syncing + if (syncTimeout) clearTimeout(syncTimeout); + + syncTimeout = setTimeout(async () => { + const now = Date.now(); + const timeSinceLastSync = now - lastSyncTime; + + if (timeSinceLastSync < DEBOUNCE_MS) return; + + lastSyncTime = now; + logger.info(`${symbols.info} Syncing changes...`); + let spendTime = 0; + try { + await handleSyncCommand(noOverwrite, needBuild, false); + spendTime = Date.now() - lastSyncTime; + logger.info( + `${symbols.success}Sync complete in ${spendTime}ms. Watching for changes...\n` + ); + } catch (error) { + spendTime = Date.now() - lastSyncTime; + logger.error(`${symbols.error} Sync failed:`, error); + logger.log(`${symbols.info} Continuing to watch for changes...\n`); + } + DEBOUNCE_MS = Math.max(DEBOUNCE_MS, spendTime + 50); + }, DEBOUNCE_MS); + }, + { ignore: ignorePatterns } + ); + }) + ); + + // Handle graceful shutdown + const cleanup = async () => { + logger.info(`\n\n${symbols.info} Shutting down watch mode...`); + if (syncTimeout) clearTimeout(syncTimeout); + await Promise.all(subscriptions.map((sub) => sub.unsubscribe())); + logger.info(`${symbols.success} Watch mode stopped\n`); + process.exit(0); + }; + + process.on('SIGINT', cleanup); + process.on('SIGTERM', cleanup); + + // Keep process alive + await new Promise(() => {}); + } catch (error) { + logger.error(`\n${symbols.error} Failed to start watch mode:`, error); + process.exit(1); + } +} + +/** + * Handles CLI commands + * @param params Command line parameters + */ +async function handleCommand(command: string, commandArgs: string[]): Promise { + const params = commandArgs; + try { + if (command === 'help') { + logger.info(CLI_COMMANDS.help); + + if (!tsconfigExists) logger.info(symbols.warning, VALID_PROJECT_MSG, '\n'); + return; + } + + if (command === 'version') { + const pkg = await parsePkg(); + logger.info(`${pkg.name}@${pkg.version}`); + return; + } + + if (!tsconfigExists) { + logger.error(`\nError: >> ${symbols.error} ${VALID_PROJECT_MSG}\n`); + return process.exit(1); + } + + switch (command) { + case 'create': + createTemplate(commandArgs); + break; + + case 'add': + addModule(commandArgs); + break; + case 'init': { + await copyTsdkConfig(); + const npmCommand = getNpmCommand(process.cwd()); + logger.info( + `${symbols.info} You can edit and generate the SDK package with \`${npmCommand.npxCmd} tsdk --sync\`` + ); + await addDepsIfNone(); + break; + } + + case 'sync': { + const noOverwrite = params.includes('--no-overwrite'); + const withBuild = params.includes('--build'); + await handleSyncCommand(noOverwrite, withBuild); + break; + } + + case 'watch': { + const noOverwrite = params.includes('--no-overwrite'); + const withBuild = params.includes('--build'); + await handleWatchCommand(noOverwrite, withBuild); + break; + } + + case 'nest': + await runNestCommand(); + break; + + case 'from-openapi': + await runOpenapiToApiconfCommand(); + break; + + case 'to-openapi': + await runApiconfToOpenapiCommand(); + break; + + default: + logger.info(`\n${symbols.error} Unknown command: ${command}`); + logger.info(CLI_COMMANDS.help); + process.exit(1); + } + } catch (error) { + logger.error(`\n${symbols.error} Command execution failed:`, error); + process.exit(1); + } +} diff --git a/packages/tsdk/src/compile-tsdk.ts b/packages/tsdk/src/compile-tsdk.ts index e481e3ae..9d721493 100644 --- a/packages/tsdk/src/compile-tsdk.ts +++ b/packages/tsdk/src/compile-tsdk.ts @@ -1,20 +1,75 @@ import { execSync } from 'child_process'; - -import { ensureDir } from './config'; -import { getNpmCommand } from './get-pkg-manager'; +import fsExtra from 'fs-extra'; +import { config, ensureDir } from './config'; +import { getNpmCommand } from './get-npm-command'; +import { logger } from './log'; export async function buildSDK(needInstall = false) { const CMDs = getNpmCommand(process.cwd()); - execSync( - `cd ${ensureDir} ${needInstall ? `&& ${CMDs.installCmd} ` : ``}&& ${CMDs.runCmd} tsc:build`, - { - stdio: 'inherit', + if (needInstall) { + const cmd = `${CMDs.installCmd}`; + logger.info(` Run \`${cmd}\` in dir: ${ensureDir}`); + try { + execSync(cmd, { + cwd: ensureDir, + stdio: 'pipe', + encoding: 'utf-8', + env: process.env, + }); + } catch (error) { + logger.error( + ` Run \`${cmd}\` in \`compile-tsdk.ts\` error`, + (error as any).stdout || (error as any).stderr + ); + throw error; + } + const isNodeModulesExists = await fsExtra.exists(`${ensureDir}/node_modules`); + if (!isNodeModulesExists) { + logger.log(`\n Run \`npm install\` in dir: ${ensureDir}`); + try { + execSync(`npm install`, { + cwd: ensureDir, + stdio: 'pipe', + encoding: 'utf-8', + env: process.env, + }); + } catch (error) { + logger.error('Command failed:', (error as any).stdout || (error as any).stderr); + throw error; + } } - ); + } + if (config.moduleType === 'disabled') { + logger.info(` Ignore run tsc; because \`moduleType:'disabled'\``); + return; + } + const tscBuild = !config.moduleType + ? 'tsc:build' + : config.moduleType === 'module' + ? 'tsc:build:esm' + : 'tsc:build:cjs'; + const cmd = `cd ${ensureDir} && ${CMDs.runCmd} ${tscBuild}`; + logger.log(` Run \`${cmd}\``); + try { + execSync(cmd, { + stdio: 'pipe', + encoding: 'utf-8', + env: process.env, + }); + } catch (error) { + logger.error('Command failed:', (error as any).stdout || (error as any).stderr); + throw error; + } } export function buildSDKDoc() { - execSync(`cd ${ensureDir} && ${getNpmCommand(process.cwd()).runCmd} doc:build`, { - stdio: 'inherit', - }); + try { + execSync(`cd ${ensureDir} && ${getNpmCommand(process.cwd()).runCmd} doc:build`, { + stdio: 'pipe', + encoding: 'utf-8', + }); + } catch (error) { + logger.error('Command failed:', (error as any).stdout || (error as any).stderr); + throw error; + } } diff --git a/packages/tsdk/src/config.ts b/packages/tsdk/src/config.ts index 0b9d1e05..e3ed6a1e 100644 --- a/packages/tsdk/src/config.ts +++ b/packages/tsdk/src/config.ts @@ -1,44 +1,63 @@ -import fsExtra from 'fs-extra'; +import fs from 'fs'; import path from 'path'; import symbols from './symbols'; +import { loadCommonJS } from './load-commonjs'; export interface TSDKConfig { + monorepoRoot?: string; packageDir: string; packageName: string; - /** 'typeorm' or 'kysely' or 'DrizzleORM' */ - entityLibName: string | string[]; baseDir: string; - entityExt: string; + /** 'typeorm' or 'kysely' or 'DrizzleORM'. Default: 'typeorm' */ + entityLibName?: string | string[]; + /** + * Default: 'entity' + * @Example: *.entity.ts + */ + entityExt?: string; + /** + * Can be `apiconf`, `dto` or others custom extension + * @Example: *.apiconf.ts + */ apiconfExt: string; shareExt?: string; sharedDirs: string[]; - monorepoRoot?: string; - /** default: axios */ + /** default: xior */ httpLib?: 'xior' | 'axios'; - dataHookLib?: 'SWR' | 'ReactQuery'; + dataHookLib?: + | 'SWR' + | 'ReactQuery' + | 'VueQuery' + | 'SolidQuery' + | 'SvelteQuery' + | ('SWR' | 'ReactQuery' | 'VueQuery' | 'SolidQuery' | 'SvelteQuery')[]; + validationLib?: 'valibot' | 'zod' | 'arktype'; + /** Generate Web Worker files */ + worker?: boolean; /** custom dependencies or override */ dependencies?: { [key: string]: string }; devDependencies?: { [key: string]: string }; /** custom scripts or override */ scripts?: { [key: string]: string }; /** - * remove unnecessary filelds in *.apiconf.js after build + * remove unnecessary fields in *.apiconf.js after build * @default * [ 'needAuth', - 'category', - 'description', - 'type', ] */ removeFields?: string[]; + /** Default undefined: support 'module' and 'commonjs' */ + moduleType?: 'module' | 'commonjs' | 'disabled'; + /** default true */ + logVerbose?: boolean; } export const comment = ` /** - * This is auto generated by \`tsdk\`. - * Don't edit this file. + * This is auto-generated by \`tsdk\`. + * Do not edit this file. */ `; @@ -48,28 +67,38 @@ export const getDefaultContent = () => `/** This line auto generated by \`tsdk\` and this will be removed if have content. */\nexport const test_${++id} = ${++id};`; export const tsdkConfigFilePath = path.join(process.cwd(), 'tsdk.config.js'); -export const isTsdkConfigExist = fsExtra.existsSync(tsdkConfigFilePath); +export const isTsdkConfigExist = fs.existsSync(tsdkConfigFilePath); /** Deprecated: Use `tsdk.config.js` instead `.tsdkrc.json` */ export const oldConfigFilePath = path.join(process.cwd(), '.tsdkrc.json'); -export const idOldConfigExist = fsExtra.existsSync(oldConfigFilePath); +export const isOldConfigExist = fs.existsSync(oldConfigFilePath); -export const isConfigExist = isTsdkConfigExist || idOldConfigExist; +export const isConfigExist = isTsdkConfigExist || isOldConfigExist; if (isTsdkConfigExist) { - console.log(symbols.info, `load ${tsdkConfigFilePath}`); + console.log(symbols.info, `Load ${tsdkConfigFilePath}`); } + +// Load configuration safely +const baseConfigPath = path.join(__dirname, '..', 'fe-sdk-template', 'config', 'tsdk.config.js'); +const baseConfig = fs.existsSync(baseConfigPath) ? loadCommonJS(baseConfigPath) : {}; +const oldConfig = isOldConfigExist ? JSON.parse(fs.readFileSync(oldConfigFilePath, 'utf-8')) : {}; +const newConfig = isTsdkConfigExist ? loadCommonJS(tsdkConfigFilePath) : {}; + export const config: TSDKConfig = { - ...require(path.join(__dirname, '..', 'fe-sdk-template', 'config', 'tsdk.config.js')), - ...(idOldConfigExist - ? JSON.parse(fsExtra.readFileSync(oldConfigFilePath, 'utf-8')) - : isTsdkConfigExist - ? require(tsdkConfigFilePath) - : {}), + entityLibName: 'typeorm', + entityExt: 'entity', // *.entity.ts + ...baseConfig, + ...oldConfig, + ...newConfig, }; +config.logVerbose = process.argv.includes('--no-verbose') ? false : config.logVerbose !== false; // example: ./src => src -config.baseDir = path.normalize(config.baseDir); +// Ensure baseDir normalization +if (config.baseDir) { + config.baseDir = path.normalize(config.baseDir); +} function getPackageFolder(name: string) { if (name[0] === '@') { @@ -79,34 +108,32 @@ function getPackageFolder(name: string) { } export const packageFolder = getPackageFolder(config.packageName); -export const ensureDir = path.join(`${config.packageDir}`, `${packageFolder}`); +export const ensureDir = path.join(config.packageDir, packageFolder); const tsconfigPath = path.join(process.cwd(), 'tsconfig.json'); -export const tsconfigExists = fsExtra.pathExistsSync(tsconfigPath); +export const tsconfigExists = fs.existsSync(tsconfigPath); export const tsconfig = tsconfigExists - ? // eslint-disable-next-line no-eval - eval(`(() => (${fsExtra.readFileSync(tsconfigPath, 'utf-8')}))();`).compilerOptions + ? eval(`(() => (${fs.readFileSync(tsconfigPath, 'utf-8')}))();`).compilerOptions : {}; - let deps: { [key: string]: string } = {}; -export const pkg: { [key: string]: string } = {}; +export const pkg: { [key: string]: any } = {}; export async function parsePkg() { - const content = await fsExtra.readFile(path.join(__dirname, '..', 'package.json'), 'utf-8'); + const content = await fs.promises.readFile(path.join(__dirname, '..', 'package.json'), 'utf-8'); Object.assign(pkg, JSON.parse(content)); return pkg; } export async function parseDeps() { - const content = await fsExtra.readFile(path.join(ensureDir, 'package.json'), 'utf-8'); + const content = await fs.promises.readFile(path.join(ensureDir, 'package.json'), 'utf-8'); const pkgJSON = JSON.parse(content); Object.assign(pkg, pkgJSON); deps = { - ...pkgJSON.dependencies, - ...pkgJSON.devDependencies, - ...pkgJSON.peerDependencies, + ...(pkgJSON.dependencies || {}), + ...(pkgJSON.devDependencies || {}), + ...(pkgJSON.peerDependencies || {}), }; } diff --git a/packages/tsdk/src/create/add-module.ts b/packages/tsdk/src/create/add-module.ts new file mode 100644 index 00000000..e7ec88c1 --- /dev/null +++ b/packages/tsdk/src/create/add-module.ts @@ -0,0 +1,253 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { execSync } from 'node:child_process'; +import * as prompts from '@clack/prompts'; +import { parseArgv } from '../utils'; + +// ============================================================================ +// Types +// ============================================================================ + +interface ModuleConfig { + name: string; + description?: string; + files?: Array<{ + src: string; + dest: string; + }>; + dependencies?: string[]; + routes?: Array<{ + path: string; + file: string; + }>; + postInstall?: string; +} + +// ============================================================================ +// Main Entry +// ============================================================================ + +export async function addModule(argv: string[]) { + // Check if in a project + if (!fs.existsSync('package.json')) { + prompts.log.error('Not in a project directory (package.json not found)'); + process.exit(1); + } + // Check if in a TypeScript project + if (!fs.existsSync('tsconfig.json')) { + prompts.log.error('Not in a TypeScript project directory (tsconfig.json not found)'); + process.exit(1); + } + // Check if in a tsdk project + if (!fs.existsSync('tsdk.config.js')) { + prompts.log.error('Not in a tsdk project directory (tsdk.config.js not found)'); + process.exit(1); + } + + prompts.intro('📦 Add Module'); + const argvObj = parseArgv(argv); + + try { + // 1. Get module repository + const moduleRepo = + argv[0] || + (await prompts.text({ + message: 'Module repository:', + placeholder: 'user/repo or https://github.com/user/repo.git', + validate: (v) => (v ? undefined : 'Required'), + })); + if (prompts.isCancel(moduleRepo)) exit(); + + // 2. Download module to temp directory + const spinner = prompts.spinner(); + spinner.start('Downloading module...'); + + const tempDir = downloadModule(String(moduleRepo)); + + spinner.stop('Module downloaded'); + + // 3. Parse module.json + const configPath = path.join(tempDir, 'module.json'); + if (!fs.existsSync(configPath)) { + throw new Error('Invalid module: module.json not found'); + } + + const config: ModuleConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8')); + + // 4. Show module info + prompts.log.info(` +Name: ${config.name} +${config.description ? `Description: ${config.description}` : ''} +`); + + // 5. Confirm installation + const confirm = await prompts.confirm({ + message: `Install "${config.name}"?`, + initialValue: true, + }); + if (prompts.isCancel(confirm) || !confirm) { + fs.rmSync(tempDir, { recursive: true, force: true }); + exit(); + } + + // 6. Install module + spinner.start('Installing module...'); + installModule(process.cwd(), tempDir, config); + spinner.stop('Module installed'); + + // Cleanup + fs.rmSync(tempDir, { recursive: true, force: true }); + + prompts.outro(`✅ Module "${config.name}" installed +${config.postInstall ? `\n${config.postInstall}` : ''}`); + } catch (error: any) { + prompts.log.error(error.message); + process.exit(1); + } +} + +// ============================================================================ +// Module Download +// ============================================================================ + +function downloadModule(repo: string): string { + const [repoPath, branch] = repo.split('#'); + + let url = repoPath; + if (!repoPath.startsWith('http')) { + url = `https://github.com/${repoPath}.git`; + } + + const tempDir = fs.mkdtempSync(path.join(process.cwd(), '.tsdk-module-')); + + const args = ['clone', '--depth', '1']; + if (branch) args.push('--branch', branch); + args.push(url, tempDir); + + try { + execSync(`git ${args.join(' ')}`, { stdio: 'pipe' }); + + // Remove .git + const gitDir = path.join(tempDir, '.git'); + if (fs.existsSync(gitDir)) { + fs.rmSync(gitDir, { recursive: true, force: true }); + } + + return tempDir; + } catch { + if (fs.existsSync(tempDir)) { + fs.rmSync(tempDir, { recursive: true, force: true }); + } + throw new Error(`Failed to download module: ${repo}`); + } +} + +// ============================================================================ +// Module Installation +// ============================================================================ + +function installModule(projectRoot: string, modulePath: string, config: ModuleConfig) { + // 1. Copy files + if (config.files) { + config.files.forEach(({ src, dest }) => { + const srcPath = path.join(modulePath, src); + const destPath = path.join(projectRoot, dest); + + if (!fs.existsSync(srcPath)) { + prompts.log.warn(`File not found: ${src}`); + return; + } + + fs.mkdirSync(path.dirname(destPath), { recursive: true }); + + if (fs.statSync(srcPath).isDirectory()) { + fs.cpSync(srcPath, destPath, { recursive: true }); + } else { + fs.copyFileSync(srcPath, destPath); + } + }); + } + + // 2. Install dependencies + if (config.dependencies && config.dependencies.length > 0) { + const pkgPath = path.join(projectRoot, 'package.json'); + const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); + + pkg.dependencies = pkg.dependencies || {}; + + config.dependencies.forEach((dep) => { + const [name, version] = dep.split('@'); + if (!pkg.dependencies[name]) { + pkg.dependencies[name] = version || 'latest'; + } + }); + + fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n'); + + prompts.log.step('Installing dependencies...'); + execSync('npm install', { cwd: projectRoot, stdio: 'inherit' }); + } + + // 3. Register routes (if applicable) + if (config.routes) { + registerRoutes(projectRoot, config); + } +} + +function registerRoutes(root: string, config: ModuleConfig) { + // Try to find main server file + const candidates = ['server/main.ts', 'server/index.ts', 'src/main.ts', 'src/index.ts']; + + let mainFile: string | null = null; + for (const candidate of candidates) { + const fullPath = path.join(root, candidate); + if (fs.existsSync(fullPath)) { + mainFile = fullPath; + break; + } + } + + if (!mainFile) { + prompts.log.warn('Could not find main file to register routes'); + prompts.log.info( + 'Add routes manually:\n' + config.routes!.map((r) => ` app.use('${r.path}', ...)`).join('\n') + ); + return; + } + + let content = fs.readFileSync(mainFile, 'utf-8'); + + // Add imports + const imports = config + .routes!.map((r) => { + const name = path.basename(r.file, '.ts') + 'Router'; + return `import ${name} from '${r.file.replace(/\.ts$/, '.js')}'`; + }) + .join('\n'); + + // Add route registrations + const routes = config + .routes!.map((r) => { + const name = path.basename(r.file, '.ts') + 'Router'; + return `app.use('${r.path}', ${name})`; + }) + .join('\n '); + + // Insert at marker or after last import + if (content.includes('// TSDK_MODULES')) { + content = content.replace( + '// TSDK_MODULES', + `${imports}\n// TSDK_MODULES\n\n ${routes}\n // TSDK_ROUTES` + ); + } else { + prompts.log.warn('No "// TSDK_MODULES" marker found in main file'); + prompts.log.info('Add manually:\n' + imports + '\n\n' + routes); + } + + fs.writeFileSync(mainFile, content); +} + +function exit() { + prompts.cancel('Operation cancelled'); + process.exit(0); +} diff --git a/packages/tsdk/src/create/create-template.ts b/packages/tsdk/src/create/create-template.ts new file mode 100644 index 00000000..534bf462 --- /dev/null +++ b/packages/tsdk/src/create/create-template.ts @@ -0,0 +1,292 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import os from 'node:os'; +import { execSync } from 'node:child_process'; +import * as prompts from '@clack/prompts'; +import * as tar from 'tar'; +import { parseArgv } from '../utils'; +import { getNpmCommand } from '../get-npm-command'; + +// ============================================================================ +// Built-in Templates +// ============================================================================ + +const BUILTIN_TEMPLATES = { + 'basic-sdk-export': { + name: 'SDK Export', + description: 'Minimal TypeScript SDK export', + }, + 'basic-fullstack': { + name: 'Full Stack', + description: 'Type-safe full stack setup', + }, +} as const; + +type BuiltinTemplate = keyof typeof BUILTIN_TEMPLATES; + +function isBuiltinTemplate(name: string): name is BuiltinTemplate { + return name in BUILTIN_TEMPLATES; +} + +// ============================================================================ +// Main Entry +// ============================================================================ + +export async function createTemplate(argv: string[]) { + prompts.intro('🚀 Create TSDK Project'); + const argvObj = parseArgv(argv); + + try { + // 1. Get project name + const projectName = + argv[0] || + (await prompts.text({ + message: 'Project name:', + defaultValue: 'my-project', + placeholder: 'my-project or "." for current directory', + validate: (v) => (v ? undefined : 'Required'), + })); + if (prompts.isCancel(projectName)) exit(); + + // 2. Get template source + let template = argvObj.template || argvObj.t; + + if (!template) { + const builtinOptions = Object.entries(BUILTIN_TEMPLATES).map(([key, val]) => ({ + value: key, + label: val.name, + hint: val.description, + })); + + const templateChoice = await prompts.select({ + message: 'Select a template:', + options: [ + ...builtinOptions, + { + value: 'custom', + label: 'Custom template', + hint: 'NPM package, Git repo, or local path', + }, + ], + }); + if (prompts.isCancel(templateChoice)) exit(); + + if (templateChoice === 'custom') { + template = (await prompts.text({ + message: 'Template source:', + placeholder: 'npm-package, user/repo, or local/path', + validate: (v) => (v ? undefined : 'Required'), + })) as string; + if (prompts.isCancel(template)) exit(); + } else { + template = templateChoice as string; + } + } + + // 3. Resolve Target Directory + const targetDir = path.resolve(String(projectName).trim()); + const targetDirName = path.basename(targetDir); + + if (fs.existsSync(targetDir) && !isEmpty(targetDir)) { + if (!argvObj.overwrite) { + const action = await prompts.select({ + message: `"${targetDirName}" is not empty:`, + options: [ + { label: 'Cancel', value: 'cancel' }, + { label: 'Remove and continue', value: 'remove' }, + ], + }); + if (prompts.isCancel(action) || action === 'cancel') exit(); + if (action === 'remove') emptyDir(targetDir); + } else { + emptyDir(targetDir); + } + } + + // 4. Download Template + const spinner = prompts.spinner(); + const templateSource = String(template); + + // Check if builtin first + if (isBuiltinTemplate(templateSource)) { + spinner.start('Creating built-in template...'); + copyBuiltinTemplate(templateSource, targetDir); + spinner.stop('Template created'); + } else { + // Template resolution logic + const isLocal = + fs.existsSync(templateSource) || + templateSource.startsWith('.') || + templateSource.startsWith('/'); + const isUrl = /^(https?|git|ssh):/.test(templateSource); + const isScopedNpm = templateSource.startsWith('@'); + const isGitShorthand = !isLocal && !isUrl && !isScopedNpm && templateSource.includes('/'); + + if (isLocal) { + spinner.start('Copying local template...'); + copyLocalTemplate(templateSource, targetDir); + spinner.stop('Template created'); + } else if (isUrl || isGitShorthand) { + spinner.start('Cloning Git template...'); + cloneGitTemplate(templateSource, targetDir); + spinner.stop('Template created'); + } else { + spinner.start('Downloading NPM template...'); + await downloadNpmTemplate(templateSource, targetDir); + spinner.stop('Template created'); + } + } + + // 5. Update package.json + updatePackageName(targetDir, targetDirName); + + const CMDs = getNpmCommand(process.cwd()); + + prompts.outro(`✅ Project created at ${targetDir} + +Next steps: + cd ${projectName === '.' ? '' : targetDirName} + ${CMDs.installCmd} + ${CMDs.runCmd} dev`); + } catch (error: any) { + prompts.log.error(error.message); + process.exit(1); + } +} + +function copyBuiltinTemplate(template: BuiltinTemplate, targetDir: string) { + // Get the installed package location + const templateDir = path.join(__dirname, '../../templates', template); + copyLocalTemplate(templateDir, targetDir); +} + +// ============================================================================ +// NPM Operations +// ============================================================================ + +async function downloadNpmTemplate(pkgName: string, targetDir: string) { + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'tsdk-template-')); + + if (!fs.existsSync(targetDir)) { + fs.mkdirSync(targetDir, { recursive: true }); + } + + try { + const packResult = execSync(`npm pack ${pkgName}`, { + cwd: tempDir, + stdio: 'pipe', + encoding: 'utf-8', + }); + + const tarballName = packResult.trim(); + const tarballPath = path.join(tempDir, tarballName); + + await tar.x({ + file: tarballPath, + cwd: targetDir, + strip: 1, + }); + } catch (error) { + throw new Error(`Failed to download NPM template "${pkgName}". Check the name or version.`); + } finally { + try { + fs.rmSync(tempDir, { recursive: true, force: true }); + } catch (e) { + /* ignore cleanup errors */ + } + } +} + +// ============================================================================ +// Git Operations +// ============================================================================ + +function cloneGitTemplate(repo: string, targetDir: string) { + const [repoPath, branch] = repo.split('#'); + + let url = repoPath; + if (!repoPath.startsWith('http') && !repoPath.startsWith('git') && !repoPath.startsWith('ssh')) { + url = `https://github.com/${repoPath}.git`; + } + + const args = ['clone', '--depth', '1']; + if (branch) args.push('--branch', branch); + args.push(url, targetDir); + + try { + execSync(`git ${args.join(' ')}`, { stdio: 'pipe' }); + const gitDir = path.join(targetDir, '.git'); + if (fs.existsSync(gitDir)) { + fs.rmSync(gitDir, { recursive: true, force: true }); + } + } catch (error) { + throw new Error(`Failed to clone git template: ${repo}`); + } +} + +// ============================================================================ +// Local Operations +// ============================================================================ + +function copyLocalTemplate(src: string, dest: string) { + if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true }); + + const entries = fs.readdirSync(src, { withFileTypes: true }); + for (const entry of entries) { + const srcPath = path.join(src, entry.name); + const destPath = path.join(dest, entry.name); + + if (entry.name === '.git' || entry.name === 'node_modules') continue; + + if (entry.isDirectory()) { + copyLocalTemplate(srcPath, destPath); + } else { + fs.copyFileSync(srcPath, destPath); + } + } +} + +// ============================================================================ +// Utils +// ============================================================================ + +function updatePackageName(projectDir: string, name: string) { + const pkgPath = path.join(projectDir, 'package.json'); + if (!fs.existsSync(pkgPath)) return; + + const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); + pkg.name = toValidPackageName(name); + pkg.version = '0.0.0'; + fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n'); +} + +function isEmpty(dir: string): boolean { + try { + const files = fs.readdirSync(dir); + return files.length === 0 || (files.length === 1 && files[0] === '.git'); + } catch (e) { + return true; + } +} + +function emptyDir(dir: string) { + if (!fs.existsSync(dir)) return; + for (const file of fs.readdirSync(dir)) { + if (file === '.git') continue; + fs.rmSync(path.join(dir, file), { recursive: true, force: true }); + } +} + +function toValidPackageName(name: string): string { + return name + .trim() + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/^[._]/, '') + .replace(/[^a-z\d\-~]+/g, '-'); +} + +function exit() { + prompts.cancel('Operation cancelled'); + process.exit(0); +} diff --git a/packages/tsdk/src/deps-version.ts b/packages/tsdk/src/deps-version.ts new file mode 100644 index 00000000..876b3018 --- /dev/null +++ b/packages/tsdk/src/deps-version.ts @@ -0,0 +1,3 @@ +import pkg from './package.json'; + +export const depsVersions = pkg.peerDependencies; diff --git a/packages/tsdk/src/extract-apiconfs.ts b/packages/tsdk/src/extract-apiconfs.ts new file mode 100644 index 00000000..b833f2cf --- /dev/null +++ b/packages/tsdk/src/extract-apiconfs.ts @@ -0,0 +1,174 @@ +export function extractApiconfs(content: string) { + const lines = content.split('\n'); + + const results: { + method: string; + path: string; + name: string; + type: string; + description: string; + category: string; + isGet?: boolean; + }[] = []; + + let currentConfig: any = null; + let comments: string[] = []; + let inMultilineComment = false; + let multilineCommentBuffer = ''; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim(); + + // Handle multi-line comments + if (inMultilineComment) { + const endCommentIndex = line.indexOf('*/'); + if (endCommentIndex !== -1) { + multilineCommentBuffer += line.substring(0, endCommentIndex).trim(); + if (multilineCommentBuffer.trim()) { + comments.push(multilineCommentBuffer.trim()); + } + multilineCommentBuffer = ''; + inMultilineComment = false; + } else { + multilineCommentBuffer += line + ' '; + } + continue; + } + + // Start of multi-line comment + if (line.startsWith('/*')) { + const endIndex = line.indexOf('*/'); + if (endIndex !== -1) { + // Single-line multi-line comment + const comment = line + .substring(2, endIndex) + .replace(/^\*+|\*+$/g, '') + .trim(); + if (comment) { + comments.push(comment); + } + } else { + inMultilineComment = true; + multilineCommentBuffer = line.substring(2) + ' '; + } + continue; + } + + // Collect single-line comments + if (line.startsWith('//')) { + const comment = line.substring(2).trim(); + if (comment) { + comments.push(comment); + } + continue; + } + + // Match API config declaration + let configMatch = line.match(/^export\s+const\s+(\w+)Config\s*:\s*APIConfig\s*=/); + if (!configMatch) { + configMatch = line.match(/^export\s+const\s+(\w+)Config\s*=/); + } + + if (configMatch && configMatch[1] && /^[A-Z]/.test(configMatch[1])) { + const name = configMatch[1]; + + // Initialize new config object + currentConfig = { + name, + method: '', + path: '', + type: '', + description: comments.join(' ').trim(), + category: '', + }; + + // Reset comments after attaching them + comments = []; + + // Continue parsing config object + let j = i; + let braceDepth = 0; + let configStarted = false; + let inComment = false; + + while (j < lines.length) { + const configLine = lines[j].trim(); + + // Track comment state + if (!inComment && configLine.includes('/*')) { + inComment = true; + } + if (inComment && configLine.includes('*/')) { + inComment = false; + j++; + continue; + } + if (inComment) { + j++; + continue; + } + + // Count braces + for (const char of configLine) { + if (char === '{') { + braceDepth++; + configStarted = true; + } else if (char === '}') { + braceDepth--; + } + } + + // Extract fields only when not in comment + if (!inComment && configStarted) { + // Extract method + const methodMatch = configLine.match(/^\s*method\s*:\s*['"`]([^'"`]+)['"`]/); + if (methodMatch) { + currentConfig.method = methodMatch[1]; + } + + // Extract isGet + const isGetMatch = configLine.match(/^\s*isGet\s*:\s*(\S+)/); + if (isGetMatch) { + currentConfig.isGet = isGetMatch[1].replace(/,\s*$/, ''); + } + + // Extract path + const pathDirectMatch = configLine.match(/^\s*path\s*:\s*['"`]([^'"`]+)['"`]/); + if (pathDirectMatch) { + currentConfig.path = pathDirectMatch[1]; + } else { + const transformPathMatch = configLine.match(/^\s*path\s*:\s*(transformPath\([^)]+\))/); + if (transformPathMatch) { + currentConfig.path = transformPathMatch[1]; + } + } + + // Extract type + const typeMatch = configLine.match(/^\s*type\s*:\s*['"`]([^'"`]+)['"`]/); + if (typeMatch) { + currentConfig.type = typeMatch[1]; + } + } + + // End config when braces close completely + if (configStarted && braceDepth === 0) { + results.push(currentConfig); + currentConfig = null; + break; + } + + j++; + } + + // Update loop index + i = j; + } else { + // Clear comments if we encounter non-comment, non-config line + if (line && !line.startsWith('//') && !line.startsWith('/*')) { + comments = []; + } + } + } + + return results; +} diff --git a/packages/tsdk/src/from-openapi.ts b/packages/tsdk/src/from-openapi.ts new file mode 100644 index 00000000..bcd23d47 --- /dev/null +++ b/packages/tsdk/src/from-openapi.ts @@ -0,0 +1,1080 @@ +#!/usr/bin/env node + +/** + * Transform OpenAPI spec to APIConfig format + * * Usage: + * Bun: bun transform.ts [-o ] + * Node: ts-node transform.ts [-o ] + */ + +import { readFileSync, writeFileSync, existsSync, statSync } from 'fs'; +import { resolve, basename } from 'path'; +import yaml from 'js-yaml'; +import { config } from './config'; + +// ========================================== +// Environment Detection +// ========================================== +const isBun = typeof process.versions.bun !== 'undefined'; +const runtimeName = isBun ? 'Bun' : 'Node.js'; + +interface OpenAPISpec { + openapi?: string; // v3.x + swagger?: string; // v2.0 + info: { + title: string; + version: string; + description?: string; + }; + // v3 style + paths: Record>; + components?: { + schemas?: Record; + requestBodies?: Record; + securitySchemes?: Record; + }; + // v2 style + definitions?: Record; + securityDefinitions?: Record; + // Common + security?: Array>; + // v2 server info + host?: string; + basePath?: string; + schemes?: string[]; +} + +interface Operation { + operationId?: string; + summary?: string; + description?: string; + tags?: string[]; + parameters?: Parameter[]; + requestBody?: RequestBody; + responses?: Record; + security?: Array>; +} + +interface Parameter { + name: string; + in: 'path' | 'query' | 'header' | 'cookie' | 'body' | 'formData'; + required?: boolean; + schema?: Schema; + description?: string; + // Swagger 2.0 style (inline type instead of schema) + type?: string; + format?: string; + items?: Schema; + default?: any; +} + +interface RequestBody { + content?: Record; + required?: boolean; + $ref?: string; +} + +interface Response { + description: string; + content?: Record; + headers?: Record; +} + +interface Schema { + type?: string; + properties?: Record; + required?: string[]; + items?: Schema; + $ref?: string; + description?: string; + example?: any; + enum?: any[]; + format?: string; + maximum?: number; + minimum?: number; + maxItems?: number; + minItems?: number; + additionalProperties?: Schema | boolean; + // Polymorphic type support + oneOf?: Schema[]; + anyOf?: Schema[]; + allOf?: Schema[]; + discriminator?: { + propertyName: string; + mapping?: Record; + }; +} + +interface SecurityScheme { + type: string; + scheme?: string; + bearerFormat?: string; + in?: string; + name?: string; +} + +function extractPathParams(path: string): string[] { + const params: string[] = []; + + // Extract standard {param} format + const standardMatches = path.match(/\{([^}]+)\}/g); + if (standardMatches) { + params.push(...standardMatches.map((m) => m.slice(1, -1))); + } + + // Extract NuGet-style *param_name format (used in GitLab API) + const nugetMatches = path.match(/\*([a-zA-Z_][a-zA-Z0-9_]*)/g); + if (nugetMatches) { + params.push(...nugetMatches.map((m) => m.slice(1))); // Remove * + } + + // Remove duplicates + return Array.from(new Set(params)); +} + +function normalizePathFormat(path: string): string { + // Convert *param_name to {param_name} + return path.replace(/\*([a-zA-Z_][a-zA-Z0-9_]*)/g, '{$1}'); +} + +function cleanOperationId(operationId: string): string { + return operationId + .replace(/\\./g, '') // Remove escaped chars like \( \) + .replace(/[()]/g, '') // Remove parentheses + .replace(/[^a-zA-Z0-9_]/g, ''); // Remove other special chars +} + +function escapeComment(text: string): string { + return text.replace(/\*\//g, '*\\/').replace(/\n/g, '\n * '); // Add * prefix to each new line in JSDoc +} + +function pascalCase(str: string): string { + return str + .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase()) + .replace(/^[a-z]/, (chr) => chr.toUpperCase()); +} + +function sanitizeTypeName(name: string): string { + const reservedKeywords = new Set([ + 'break', + 'case', + 'catch', + 'class', + 'const', + 'continue', + 'debugger', + 'default', + 'delete', + 'do', + 'else', + 'enum', + 'export', + 'extends', + 'false', + 'finally', + 'for', + 'function', + 'if', + 'import', + 'in', + 'instanceof', + 'new', + 'null', + 'return', + 'super', + 'switch', + 'this', + 'throw', + 'true', + 'try', + 'typeof', + 'var', + 'void', + 'while', + 'with', + 'yield', + 'let', + 'static', + 'implements', + 'interface', + 'package', + 'private', + 'protected', + 'public', + 'any', + 'boolean', + 'number', + 'string', + 'symbol', + 'undefined', + 'never', + 'object', + 'unknown', + 'as', + 'async', + 'await', + 'constructor', + 'declare', + 'from', + 'get', + 'module', + 'namespace', + 'of', + 'readonly', + 'require', + 'set', + 'type', + 'abstract', + 'keyof', + 'infer', + 'is', + 'asserts', + ]); + + let sanitized = pascalCase(name); + + if (reservedKeywords.has(sanitized.toLowerCase())) { + sanitized = sanitized + 'Type'; + } + + if (!/^[A-Za-z_]/.test(sanitized)) { + sanitized = '_' + sanitized; + } + + sanitized = sanitized.replace(/[^A-Za-z0-9_]/g, ''); + + return sanitized; +} + +function sanitizePropertyName(name: string): string { + const reservedKeywords = new Set([ + 'break', + 'case', + 'catch', + 'class', + 'const', + 'continue', + 'debugger', + 'default', + 'delete', + 'do', + 'else', + 'enum', + 'export', + 'extends', + 'false', + 'finally', + 'for', + 'function', + 'if', + 'import', + 'in', + 'instanceof', + 'new', + 'null', + 'return', + 'super', + 'switch', + 'this', + 'throw', + 'true', + 'try', + 'typeof', + 'var', + 'void', + 'while', + 'with', + 'yield', + 'let', + 'static', + 'implements', + 'interface', + 'package', + 'private', + 'protected', + 'public', + ]); + + if (reservedKeywords.has(name) || !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name)) { + return `"${name}"`; + } + + return name; +} + +function resolveRef(ref: string, spec: OpenAPISpec): any { + const parts = ref.split('/'); + if (parts[0] !== '#') return null; + + let current: any = spec; + for (let i = 1; i < parts.length; i++) { + // Handle v2 'definitions' vs v3 'components/schemas' + if (parts[i] === 'definitions' && !current.definitions && current.components?.schemas) { + current = current.components.schemas; + continue; + } + current = current?.[parts[i]]; + if (!current) return null; + } + return current; +} + +function getContentType(content: Record): string | null { + const types = Object.keys(content); + if (types.includes('application/json')) return 'application/json'; + if (types.includes('multipart/form-data')) return 'multipart/form-data'; + if (types.includes('text/plain')) return 'text/plain'; + if (types.includes('text/html')) return 'text/html'; + if (types.includes('text/csv')) return 'text/csv'; + if (types.includes('application/xml')) return 'application/xml'; + if (types.includes('text/xml')) return 'text/xml'; + return null; +} + +function parameterToSchema(param: Parameter): Schema { + if (param.schema) { + return param.schema; + } + const schema: Schema = { + type: param.type, + format: param.format, + description: param.description, + }; + if (param.type === 'array' && param.items) { + schema.items = param.items; + } + return schema; +} + +function expandDiscriminatorTypes(schema: Schema, spec: OpenAPISpec, indent: number): string { + const schemas = spec.components?.schemas || spec.definitions; + if (!schemas) return 'any'; + + const discriminatorProp = schema.discriminator?.propertyName; + if (!discriminatorProp) return 'any'; + + const subtypes: string[] = []; + + if (schema.discriminator?.mapping) { + for (const ref of Object.values(schema.discriminator.mapping)) { + const typeName = ref.split('/').pop(); + if (typeName) subtypes.push(sanitizeTypeName(typeName)); + } + } else { + for (const [name, candidateSchema] of Object.entries(schemas)) { + if (candidateSchema.allOf) { + for (const item of candidateSchema.allOf) { + if ( + item.$ref && + item.$ref.endsWith(`/${schema.discriminator?.propertyName || 'unknown'}`) + ) { + subtypes.push(sanitizeTypeName(name)); + } + } + } + } + } + + return subtypes.length > 0 ? subtypes.join(' | ') : 'any'; +} + +function schemaToTypeScript( + schema: Schema | undefined, + spec: OpenAPISpec, + indent = 0, + visitedRefs = new Set(), + expandDiscriminator = false +): string { + const indentStr = ' '.repeat(indent); + + if (!schema) return 'unknown'; + + if (schema.$ref) { + if (visitedRefs.has(schema.$ref)) { + const typeName = schema.$ref.split('/').pop(); + return typeName ? sanitizeTypeName(typeName) : 'any'; + } + + const resolved = resolveRef(schema.$ref, spec); + const typeName = schema.$ref.split('/').pop(); + const sanitizedTypeName = typeName ? sanitizeTypeName(typeName) : 'any'; + + if (resolved) { + if ( + schema.$ref.startsWith('#/components/schemas/') || + schema.$ref.startsWith('#/definitions/') + ) { + if (expandDiscriminator && resolved.discriminator) { + return expandDiscriminatorTypes(resolved, spec, indent); + } + return sanitizedTypeName; + } + + visitedRefs.add(schema.$ref); + const result = schemaToTypeScript(resolved, spec, indent, visitedRefs, expandDiscriminator); + visitedRefs.delete(schema.$ref); + return result; + } + return sanitizedTypeName; + } + + if (schema.allOf) { + const types = schema.allOf.map((s) => { + if (!s) return 'unknown'; + if (s.$ref) { + const typeName = s.$ref.split('/').pop(); + return typeName + ? sanitizeTypeName(typeName) + : schemaToTypeScript(s, spec, indent, visitedRefs, expandDiscriminator); + } + return schemaToTypeScript(s, spec, indent, visitedRefs, expandDiscriminator); + }); + + if (types.every((t) => !t.includes('{') && !t.includes('|') && t !== 'unknown')) { + return types.filter((t) => t !== 'unknown').join(' & ') || 'unknown'; + } + + const mergedProps: Record = {}; + const mergedRequired: string[] = []; + + for (const s of schema.allOf) { + if (!s) continue; + const resolved = s.$ref ? resolveRef(s.$ref, spec) : s; + if (resolved?.properties) { + Object.assign(mergedProps, resolved.properties); + } + if (resolved?.required) { + mergedRequired.push(...resolved.required); + } + } + + if (Object.keys(mergedProps).length > 0) { + const props = Object.entries(mergedProps) + .map(([key, prop]) => { + const optional = !mergedRequired.includes(key) ? '?' : ''; + const propType = schemaToTypeScript( + prop, + spec, + indent + 1, + visitedRefs, + expandDiscriminator + ); + const sanitizedKey = sanitizePropertyName(key); + const desc = prop?.description + ? `\n${indentStr} /** ${escapeComment(prop.description)} */` + : ''; + return `${desc}\n${indentStr} ${sanitizedKey}${optional}: ${propType};`; + }) + .join('\n'); + return `{\n${props}\n${indentStr}}`; + } + + return types.filter((t) => t !== 'unknown').join(' & ') || 'unknown'; + } + + if (schema.oneOf) { + const types = schema.oneOf + .map((s) => schemaToTypeScript(s, spec, indent, visitedRefs, expandDiscriminator)) + .filter((t) => t !== 'unknown'); + return types.length > 0 ? types.join(' | ') : 'unknown'; + } + + if (schema.anyOf) { + const types = schema.anyOf + .map((s) => schemaToTypeScript(s, spec, indent, visitedRefs, expandDiscriminator)) + .filter((t) => t !== 'unknown'); + return types.length > 0 ? types.join(' | ') : 'unknown'; + } + + if (schema.enum) { + return schema.enum.map((v) => JSON.stringify(v)).join(' | '); + } + + switch (schema.type) { + case 'string': + if (schema.format === 'binary') { + return 'File'; + } + return 'string'; + case 'number': + case 'integer': + return 'number'; + case 'boolean': + return 'boolean'; + case 'array': + if (schema.items) { + return `Array<${schemaToTypeScript(schema.items, spec, indent, visitedRefs, expandDiscriminator)}>`; + } + return 'Array'; + case 'object': + if (schema.properties) { + const props = Object.entries(schema.properties) + .map(([key, prop]) => { + const optional = !schema.required?.includes(key) ? '?' : ''; + const propType = schemaToTypeScript( + prop, + spec, + indent + 1, + visitedRefs, + expandDiscriminator + ); + const sanitizedKey = sanitizePropertyName(key); + const desc = prop?.description + ? `\n${indentStr} /** ${escapeComment(prop.description)} */` + : ''; + return `${desc}\n${indentStr} ${sanitizedKey}${optional}: ${propType};`; + }) + .join('\n'); + + if (props.trim().length === 0) { + return 'Record'; + } + return `{\n${props}\n${indentStr}}`; + } + if (schema.additionalProperties) { + if (typeof schema.additionalProperties === 'boolean') { + return 'Record'; + } + const valueType = schemaToTypeScript( + schema.additionalProperties, + spec, + indent, + visitedRefs, + expandDiscriminator + ); + return `Record`; + } + return 'Record'; + default: + if (schema.properties) { + const props = Object.entries(schema.properties) + .map(([key, prop]) => { + const optional = !schema.required?.includes(key) ? '?' : ''; + const propType = schemaToTypeScript( + prop, + spec, + indent + 1, + visitedRefs, + expandDiscriminator + ); + const sanitizedKey = sanitizePropertyName(key); + const desc = prop?.description + ? `\n${indentStr} /** ${escapeComment(prop.description)} */` + : ''; + return `${desc}\n${indentStr} ${sanitizedKey}${optional}: ${propType};`; + }) + .join('\n'); + + if (props.trim().length === 0) { + return 'Record'; + } + return `{\n${props}\n${indentStr}}`; + } + return 'unknown'; + } +} + +function generateComponentTypes(spec: OpenAPISpec): string { + const schemas = spec.components?.schemas || spec.definitions; + if (!schemas) return ''; + + let output = '// ========== Component Schemas ==========\n\n'; + + for (const [name, schema] of Object.entries(schemas)) { + const sanitizedName = sanitizeTypeName(name); + const desc = schema.description ? `/**\n * ${escapeComment(schema.description)}\n */\n` : ''; + const type = schemaToTypeScript(schema, spec, 0); + output += `${desc}export type ${sanitizedName} = ${type};\n\n`; + } + + return output; +} + +function requiresAuth(operation: Operation, spec: OpenAPISpec): boolean { + if (operation.security !== undefined) { + if (operation.security.length === 0) return false; + if (operation.security.length > 0) return true; + } + if (spec.security !== undefined && spec.security.length > 0) { + return true; + } + return false; +} + +function generateFormDataType(schema: Schema, spec: OpenAPISpec): string { + if (!schema.properties) { + return 'FormData'; + } + + const props = Object.entries(schema.properties) + .map(([key, prop]) => { + const optional = !schema.required?.includes(key) ? '?' : ''; + const sanitizedKey = sanitizePropertyName(key); + const desc = prop?.description ? `\n /** ${escapeComment(prop.description)} */` : ''; + + if (prop.type === 'string' && prop.format === 'binary') { + return `${desc}\n ${sanitizedKey}${optional}: File;`; + } + if ( + prop.type === 'array' && + prop.items?.type === 'string' && + prop.items?.format === 'binary' + ) { + return `${desc}\n ${sanitizedKey}${optional}: File[];`; + } + + const propType = schemaToTypeScript(prop, spec, 1); + return `${desc}\n ${sanitizedKey}${optional}: ${propType};`; + }) + .join('\n'); + + return `{\n${props}\n}`; +} + +function generateOperationCode( + path: string, + method: string, + operation: Operation, + spec: OpenAPISpec +): string { + const normalizedPath = normalizePathFormat(path); + const rawOperationId = operation.operationId || `${method}${path.replace(/[^a-zA-Z0-9]/g, '')}`; + const cleanedOperationId = cleanOperationId(rawOperationId); + const name = sanitizeTypeName(cleanedOperationId); + const tag = operation.tags?.[0] || 'general'; + const needsAuth = requiresAuth(operation, spec); + const pathParamNames = extractPathParams(path); + + const description = + operation.summary || operation.description || `${method.toUpperCase()} ${path}`; + + let jsdoc = `/**\n * ${escapeComment(description)}`; + if (operation.description && operation.description !== operation.summary && operation.summary) { + jsdoc += `\n * \n * ${escapeComment(operation.description)}`; + } + jsdoc += `\n * @category ${tag}\n */\n`; + + let configFields = ` type: 'user',\n method: "${method}",\n path: "${normalizedPath}"`; + if (needsAuth) { + configFields += `,\n needAuth: true`; + } + if (pathParamNames.length > 0) { + configFields += `,\n paramsInUrl: '{}'`; + } + + const configCode = `${jsdoc}export const ${name}Config: APIConfig = {\n${configFields},\n};\n\n`; + + let reqType = 'Record'; + const pathParams: Parameter[] = []; + const queryParams: Parameter[] = []; + const headerParams: Parameter[] = []; + let bodySchema: Schema | null = null; + let contentType: string | null = null; + + if (operation.parameters) { + operation.parameters.forEach((param) => { + if (param.in === 'path') { + pathParams.push(param); + } else if (param.in === 'query') { + queryParams.push(param); + } else if (param.in === 'header') { + headerParams.push(param); + } + }); + } + + const pathParamMap = new Map(); + pathParams.forEach((param) => { + pathParamMap.set(param.name, param); + }); + pathParamNames.forEach((paramName) => { + if (!pathParamMap.has(paramName)) { + pathParamMap.set(paramName, { + name: paramName, + in: 'path', + required: true, + schema: { type: 'string' }, + }); + } + }); + + if (operation.requestBody) { + let requestBody = operation.requestBody; + if (requestBody.$ref) { + const resolved = resolveRef(requestBody.$ref, spec); + if (resolved) { + requestBody = resolved; + } + } + if (requestBody.content) { + contentType = getContentType(requestBody.content); + if (contentType) { + const content = requestBody.content[contentType]; + if (content?.schema) { + bodySchema = content.schema; + } + } + } + } + + if (pathParamMap.size || queryParams.length || headerParams.length || bodySchema) { + const parts: string[] = []; + + if (pathParamMap.size) { + pathParamMap.forEach((param) => { + const sanitizedName = sanitizePropertyName(param.name); + const desc = param.description ? `\n /** ${escapeComment(param.description)} */` : ''; + const paramSchema = parameterToSchema(param); + const paramType = schemaToTypeScript(paramSchema, spec, 1); + parts.push(`${desc}\n ${sanitizedName}: ${paramType};`); + }); + } + + if (queryParams.length) { + const queryProps = queryParams + .map((p) => { + const optional = !p.required ? '?' : ''; + const sanitizedName = sanitizePropertyName(p.name); + const desc = p.description ? `\n /** ${escapeComment(p.description)} */` : ''; + const paramSchema = parameterToSchema(p); + return `${desc}\n ${sanitizedName}${optional}: ${schemaToTypeScript(paramSchema, spec, 1)};`; + }) + .join(''); + + if (bodySchema) { + parts.push(` params: {${queryProps}\n };`); + } else { + parts.push(queryProps); + } + } + + if (headerParams.length) { + const headerProps = headerParams + .map((p) => { + const optional = !p.required ? '?' : ''; + const sanitizedName = sanitizePropertyName(p.name); + const desc = p.description ? `\n /** ${escapeComment(p.description)} */` : ''; + const paramSchema = parameterToSchema(p); + return `${desc}\n ${sanitizedName}${optional}: ${schemaToTypeScript(paramSchema, spec, 2)};`; + }) + .join(''); + parts.push(` header: {${headerProps}\n };`); + } + + if (bodySchema) { + let bodyType: string; + if (contentType === 'multipart/form-data') { + bodyType = generateFormDataType(bodySchema, spec); + } else { + bodyType = schemaToTypeScript(bodySchema, spec, 0); + } + + if (queryParams.length) { + parts.push(` body: ${bodyType};`); + } else { + reqType = bodyType; + } + } + + if (parts.length > 0) { + reqType = `{\n${parts.join('\n')}\n}`; + } + } + + const reqJsdoc = + pathParamMap.size || queryParams.length || headerParams.length || bodySchema + ? `/**\n * Request parameters.\n * @category ${tag}\n */\n` + : `/**\n * No request parameters required.\n * @category ${tag}\n */\n`; + const reqCode = `${reqJsdoc}export type ${name}Req = ${reqType};\n\n`; + + let resType = 'void'; + const successResponse = + operation.responses?.['200'] || operation.responses?.['201'] || operation.responses?.['204']; + + if (successResponse) { + if (successResponse.content) { + contentType = getContentType(successResponse.content); + if (contentType) { + const content = successResponse.content[contentType]; + if (content?.schema) { + if (contentType === 'multipart/form-data') { + resType = 'FormData'; + } else { + resType = schemaToTypeScript(content.schema, spec, 0); + } + } + } else { + const contentTypes = Object.keys(successResponse.content); + if (contentTypes.length > 0) { + resType = 'unknown'; + } + } + } + } + + const resDesc = successResponse?.description || 'Success response'; + const resJsdoc = `/**\n * ${resDesc}\n * @category ${tag}\n */\n`; + const resCode = `${resJsdoc}export type ${name}Res = ${resType};\n\n`; + + return `${configCode}${reqCode}${resCode}// --------- ${name} END ---------\n\n`; +} + +function transformOpenAPISpec(spec: OpenAPISpec): string { + const version = spec.openapi || spec.swagger || 'unknown'; + let output = `// Generated from OpenAPI spec: ${spec.info.title} ${spec.info.version.toLowerCase().startsWith('v') ? '' : 'v'}${spec.info.version}\n`; + output += `// Spec version: ${version}\n`; + if (spec.info.description) { + const lines = spec.info.description.split('\n'); + for (const line of lines) { + output += `// ${line}\n`; + } + } + output += `import { type APIConfig } from "@/src/tsdk-shared/helpers";\n\n`; + + output += generateComponentTypes(spec); + output += '// ========== API Operations ==========\n\n'; + + for (const [path, methods] of Object.entries(spec.paths)) { + for (const [method, operation] of Object.entries(methods)) { + if (['get', 'post', 'put', 'patch', 'delete', 'head', 'options'].includes(method)) { + output += generateOperationCode(path, method, operation as Operation, spec); + } + } + } + + return output; +} + +export function removeRepeat(source: string): string { + const lines = source.split('\n'); + const output: string[] = []; + let depth = 0; + const seenKeysAtLevel1 = new Set(); + let entryBuffer: string[] = []; + let skipBlockUntilDepth: number | null = null; + const blockStartRegex = /export\s+(type|const|interface)\s+[\w\d_]+\s*(?:=|extends.*)?\s*\{/; + const propertyKeyRegex = /^\s*(?:readonly\s+)?([a-zA-Z0-9_$]+)\??\s*:/; + + for (const line of lines) { + const openBraces = (line.match(/\{/g) || []).length; + const closeBraces = (line.match(/\}/g) || []).length; + const netChange = openBraces - closeBraces; + + if (skipBlockUntilDepth !== null) { + depth += netChange; + if (depth <= skipBlockUntilDepth) { + skipBlockUntilDepth = null; + } + continue; + } + + if (depth === 0 && blockStartRegex.test(line)) { + depth = 1; + seenKeysAtLevel1.clear(); + entryBuffer = []; + output.push(line); + continue; + } + + if (depth > 0) { + if (depth > 1) { + if (entryBuffer.length) { + output.push(...entryBuffer); + entryBuffer = []; + } + output.push(line); + depth += netChange; + continue; + } + + const match = line.match(propertyKeyRegex); + + if (match) { + const key = match[1]; + + if (seenKeysAtLevel1.has(key)) { + entryBuffer = []; + if (netChange > 0) { + skipBlockUntilDepth = depth; + depth += netChange; + } + } else { + seenKeysAtLevel1.add(key); + output.push(...entryBuffer); + output.push(line); + entryBuffer = []; + depth += netChange; + } + } else { + if (depth === 1 && line.trim().startsWith('}')) { + output.push(...entryBuffer); + output.push(line); + entryBuffer = []; + depth += netChange; + } else { + entryBuffer.push(line); + depth += netChange; + } + } + } else { + output.push(line); + } + } + + return output.join('\n'); +} + +async function parseSpec(content: string, filename: string): Promise { + const ext = filename.split('.').pop()?.toLowerCase(); + + if (ext === 'json') { + return JSON.parse(content); + } else if (ext === 'yaml' || ext === 'yml') { + // If using Node, this ensures compat with ESM or CJS environments + try { + return yaml.load(content) as OpenAPISpec; + } catch (error) { + try { + return JSON.parse(content); + } catch { + console.error('❌ Error: YAML parsing failed.'); + console.error("Make sure 'js-yaml' is installed and imported correctly."); + console.error(`Runtime: ${runtimeName}`); + console.error('Run: bun add js-yaml @types/js-yaml'); + process.exit(1); + } + } + } + + throw new Error('Unsupported file format'); +} + +async function main() { + const args = process.argv.slice(2); + + if (args.length === 0) { + console.error(`Usage: tsdk --openapi [-o ]`); + process.exit(1); + } + + // Argument Parsing + let inputFile: string | null = null; + let outputFile: string | null = null; + + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (arg === '-o' || arg === '--output') { + if (i + 1 < args.length) { + outputFile = args[i + 1]; + i++; // skip next arg + } else { + console.error('❌ Error: Missing output file path after -o/--output'); + process.exit(1); + } + } else if (!arg.startsWith('-')) { + inputFile = arg; + } + } + + if (!inputFile) { + console.error('❌ Error: No input file specified'); + process.exit(1); + } + + const resolvedInput = resolve(inputFile); + + // Check if input file exists + if (!existsSync(resolvedInput)) { + console.error(`❌ Error: Input file not found: ${resolvedInput}`); + process.exit(1); + } + + // Check file extension + const ext = resolvedInput.split('.').pop()?.toLowerCase(); + if (!ext || !['json', 'yaml', 'yml'].includes(ext)) { + console.error('❌ Error: Only JSON, YAML, and YML files are supported'); + process.exit(1); + } + + // Determine output file + let resolvedOutput: string; + const defaultFilename = basename(resolvedInput).replace( + /\.(json|yaml|yml)$/, + `.${config.apiconfExt}.ts` + ); + + if (outputFile) { + const outPath = resolve(outputFile); + // Check if path exists and is a directory + let isDir = false; + try { + if (existsSync(outPath) && statSync(outPath).isDirectory()) { + isDir = true; + } + } catch { + // ignore + } + + if (isDir) { + // It's a directory: append the default filename + resolvedOutput = resolve(outPath, defaultFilename); + } else { + // It's a file (existing or new) + resolvedOutput = outPath; + } + } else { + // No output specified: use current directory + default filename + resolvedOutput = resolve(defaultFilename); + } + + try { + const specContent = readFileSync(resolvedInput, 'utf-8'); + const spec = await parseSpec(specContent, resolvedInput); + + console.log(`🤖 Runtime: ${runtimeName}`); + console.log( + `📖 Reading: ${spec.info.title} ${spec.info.version.toLowerCase().startsWith('v') ? '' : 'v'}${spec.info.version}` + ); + console.log(`📝 Transforming OpenAPI spec...`); + + const transformed = removeRepeat(transformOpenAPISpec(spec)); + + writeFileSync(resolvedOutput, transformed); + console.log(`✅ Success! Generated: ${resolvedOutput}`); + + // Print stats + const pathCount = Object.keys(spec.paths).length; + const operationCount = Object.values(spec.paths).reduce( + (acc, methods) => + acc + + Object.keys(methods).filter((m) => + ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'].includes(m) + ).length, + 0 + ); + const schemaCount = Object.keys(spec.components?.schemas || spec.definitions || {}).length; + const hasAuth = + spec.security !== undefined || + Object.values(spec.paths).some((methods) => + Object.values(methods).some((op: any) => op.security !== undefined) + ); + + const specVersion = spec.openapi || spec.swagger || 'unknown'; + + console.log(`\n📊 Stats:`); + console.log(` - Spec version: ${specVersion}`); + console.log(` - ${pathCount} paths`); + console.log(` - ${operationCount} operations`); + console.log(` - ${schemaCount} schemas`); + if (hasAuth) { + console.log(` - 🔒 Auth required`); + } + } catch (error) { + console.error('❌ Error:', error); + process.exit(1); + } +} + +if (require.main === module) { + main(); +} diff --git a/packages/tsdk/src/get-npm-command.ts b/packages/tsdk/src/get-npm-command.ts new file mode 100644 index 00000000..5c8b224c --- /dev/null +++ b/packages/tsdk/src/get-npm-command.ts @@ -0,0 +1,54 @@ +import { execSync } from 'child_process'; +import { getPkgManager, PackageManager } from './get-pkg-manager'; + +interface CommandConfig { + pkg: PackageManager; + npxCmd: string; + installCmd: string; + runCmd: string; +} + +const DEFAULT_COMMANDS: CommandConfig = { + pkg: 'npm', + npxCmd: 'npx', + installCmd: 'npm install', + runCmd: 'npm run', +}; + +export function checkPackageManagerVersion(command: string): boolean { + try { + execSync(`${command} --version`, { stdio: 'ignore' }); + return true; + } catch { + return false; + } +} + +export function getNpmCommand(baseDir: string): CommandConfig { + const pkgManager = getPkgManager(baseDir); + const commands: CommandConfig = { ...DEFAULT_COMMANDS, pkg: pkgManager }; + + switch (pkgManager) { + case 'bun': + commands.npxCmd = 'bunx'; + commands.installCmd = 'bun install'; + commands.runCmd = 'bun run'; + break; + + case 'pnpm': + commands.npxCmd = 'pnpm'; + commands.installCmd = 'pnpm install'; + commands.runCmd = 'pnpm'; + break; + + case 'yarn': + if (checkPackageManagerVersion('yarn dlx')) { + commands.npxCmd = 'yarn'; + commands.installCmd = 'yarn'; + commands.runCmd = 'yarn'; + } + break; + } + + return commands; +} diff --git a/packages/tsdk/src/get-pkg-manager.ts b/packages/tsdk/src/get-pkg-manager.ts index 2b85a3d5..f2a495d0 100644 --- a/packages/tsdk/src/get-pkg-manager.ts +++ b/packages/tsdk/src/get-pkg-manager.ts @@ -2,59 +2,54 @@ import { execSync } from 'child_process'; import fs from 'fs'; import path from 'path'; -export type PackageManager = 'npm' | 'pnpm' | 'yarn'; +export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'; + +export interface LockFileConfig { + lockFile: string; + packageManager: PackageManager; +} + +const LOCK_FILE_CONFIGS: LockFileConfig[] = [ + { lockFile: 'bun.lock', packageManager: 'bun' }, + { lockFile: 'bun.lockb', packageManager: 'bun' }, + { lockFile: 'pnpm-lock.yaml', packageManager: 'pnpm' }, + { lockFile: 'yarn.lock', packageManager: 'yarn' }, + { lockFile: 'package-lock.json', packageManager: 'npm' }, +]; + +function checkPackageManagerVersion(command: string): boolean { + try { + execSync(`${command} --version`, { stdio: 'ignore' }); + return true; + } catch { + return false; + } +} export function getPkgManager(baseDir: string): PackageManager { try { - for (const { lockFile, packageManager } of [ - { lockFile: 'yarn.lock', packageManager: 'yarn' }, - { lockFile: 'pnpm-lock.yaml', packageManager: 'pnpm' }, - { lockFile: 'package-lock.json', packageManager: 'npm' }, - ]) { + // Check for lock files + for (const { lockFile, packageManager } of LOCK_FILE_CONFIGS) { if (fs.existsSync(path.join(baseDir, lockFile))) { - return packageManager as PackageManager; + return packageManager; } } + + // Check user agent const userAgent = process.env.npm_config_user_agent; if (userAgent) { - if (userAgent.startsWith('yarn')) { - return 'yarn'; - } else if (userAgent.startsWith('pnpm')) { - return 'pnpm'; - } - } - try { - execSync('yarn --version', { stdio: 'ignore' }); - return 'yarn'; - } catch { - execSync('pnpm --version', { stdio: 'ignore' }); - return 'pnpm'; + if (userAgent.startsWith('yarn')) return 'yarn'; + if (userAgent.startsWith('pnpm')) return 'pnpm'; + if (userAgent.startsWith('bun')) return 'bun'; } + + // Check installed package managers + if (checkPackageManagerVersion('pnpm')) return 'pnpm'; + if (checkPackageManagerVersion('bun')) return 'bun'; + if (checkPackageManagerVersion('yarn')) return 'yarn'; + + return 'npm'; } catch { return 'npm'; } } - -export function getNpmCommand(baseDir: string) { - const pkgManager = getPkgManager(baseDir); - const commandMap = { - pkg: pkgManager, - npxCmd: 'npx', - installCmd: 'npm install', - runCmd: 'npm run', - }; - if (pkgManager === 'pnpm') { - commandMap.npxCmd = 'pnpm'; - commandMap.installCmd = 'pnpm install'; - commandMap.runCmd = 'pnpm'; - } else if (pkgManager === 'yarn') { - try { - execSync('yarn dlx --help', { stdio: 'ignore' }); - commandMap.npxCmd = 'yarn'; - commandMap.installCmd = 'yarn'; - commandMap.runCmd = 'yarn'; - } catch {} - } - - return commandMap; -} diff --git a/packages/tsdk/src/hooks-generate.ts b/packages/tsdk/src/hooks-generate.ts new file mode 100644 index 00000000..d13bfd06 --- /dev/null +++ b/packages/tsdk/src/hooks-generate.ts @@ -0,0 +1,334 @@ +export function generateSWRHook(name: string, apiConf: APIConfig) { + const funcName = name[0].toLowerCase() + name.slice(1); + const { description = '', category = 'others', isGet, method, path } = apiConf; + const isGetMethod = isGet ?? (!apiConf.method || apiConf.method.toLowerCase() === 'get'); + if (isGetMethod) { + // Query hook + return ` + /** + * ${description || funcName} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + payload?: ${name}Req | null, + options?: SWRConfiguration<${name}Res>, + requestConfig?: AxiosRequestConfig<${name}Req>, + customHandler?: Handler, + ) { + const key = useMemo(() => { + const {method='GET', path} = ${funcName}.config; + if (payload !== null && typeof payload === 'object') return buildSortedURL(method+path, payload, stringify); + return method+path+(payload || '') + }, [payload]); + return useSWR( + key, + () => { + if (!payload) return null as unknown as ${name}Res; + return ${funcName}(payload, requestConfig, customHandler); + }, + options + ); + }`; + } else { + // Mutation hook + return ` + /** + * ${description || funcName} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + options?: SWRMutationConfiguration< + ${name}Res, + Error, + string, + ${name}Req | FormData + >, + requestConfig?: AxiosRequestConfig<${name}Req | FormData>, + customHandler?: Handler, + ) { + const {method='GET', path} = ${funcName}.config; + return useSWRMutation( + method+path, + (url, { arg }: { arg: ${name}Req | FormData }) => { + return ${funcName}(arg, requestConfig, customHandler); + }, + options + ); + }`; + } +} + +export function generateReactQueryHook(name: string, apiConf: APIConfig) { + const funcName = name[0].toLowerCase() + name.slice(1); + + const { description = '', category = 'others', isGet, method, path } = apiConf; + const isGetMethod = isGet ?? (!apiConf.method || apiConf.method.toLowerCase() === 'get'); + + if (isGetMethod) { + return ` + /** + * ${description || name} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + payload?: ${name}Req | null, + options?: Omit, 'queryKey' | 'queryFn'>, + queryClient?: QueryClient, + requestConfig?: AxiosRequestConfig<${name}Req>, + customHandler?: Handler, + ) { + const key = useMemo(() => { + const {method='GET', path} = ${funcName}.config; + if (payload !== null && typeof payload === 'object') return buildSortedURL(method+path, payload, stringify); + return method+path+(payload || '') + }, [payload]); + return useQuery( + { + ...(options ?? {}), + queryKey: [key], + queryFn() { + if (!payload) return null; + return ${funcName}(payload, requestConfig, customHandler); + }, + }, + queryClient || _queryClient + ); + }`; + } else { + return ` + /** + * ${description || funcName} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + options?: UseMutationOptions< + ${name}Res, + Error, + ${name}Req | FormData, + unknown + >, + queryClient?: QueryClient, + requestConfig?: AxiosRequestConfig<${name}Req | FormData>, + customHandler?: Handler, + ) { + return useMutation( + { + ...(options ?? {}), + mutationFn(payload) { + return ${funcName}(payload, requestConfig, customHandler); + }, + }, + queryClient || _queryClient + ); + }`; + } +} + +export function generateVueQueryHook(name: string, apiConf: APIConfig) { + const funcName = name[0].toLowerCase() + name.slice(1); + + const { description = '', category = 'others', isGet, method, path } = apiConf; + const isGetMethod = isGet ?? (!apiConf.method || apiConf.method.toLowerCase() === 'get'); + + if (isGetMethod) { + return ` + /** + * ${description || funcName} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + payload?: ${name}Req, + options?: Partial>, + queryClient?: QueryClient, + requestConfig?: AxiosRequestConfig<${name}Req>, + customHandler?: Handler, + ): UseQueryReturnType<${name}Res | undefined, Error> { + const isUndefined = typeof payload === 'undefined'; + return useQuery( + { + // Disable query if payload is undefined + enabled: !isUndefined, + ...(options ?? {}), + queryKey: [${funcName}.config.path, payload], + queryFn() { + if (isUndefined) { + // Return a resolved promise so queryFn always returns a Promise + return Promise.resolve(undefined); + } + return ${funcName}(payload, requestConfig, customHandler); + }, + }, + queryClient || _queryClient + ); + }`; + } else { + return ` + /** + * ${description || funcName} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + options?: UseMutationOptions< + ${name}Res, + Error, + ${name}Req | FormData, + unknown + >, + queryClient?: QueryClient, + requestConfig?: AxiosRequestConfig<${name}Req | FormData>, + customHandler?: Handler, + ) { + return useMutation( + { + ...(options ?? {}), + mutationFn(payload: ${name}Req | FormData) { + return ${funcName}(payload, requestConfig, customHandler); + }, + }, + queryClient || _queryClient + ); + }`; + } +} + +export function generateSolidQueryHook(name: string, apiConf: APIConfig) { + const funcName = name[0].toLowerCase() + name.slice(1); + + const { description = '', category = 'others', isGet, method, path } = apiConf; + const isGetMethod = isGet ?? (!apiConf.method || apiConf.method.toLowerCase() === 'get'); + + if (isGetMethod) { + return ` + /** + * ${description || funcName} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + payload?: ${name}Req, + options?: Partial< + Omit, 'queryKey' | 'queryFn' | 'initialData'> + > & { initialData?: any }, + queryClient?: QueryClient, + requestConfig?: AxiosRequestConfig<${name}Req>, + customHandler?: Handler, + ) { + return useQuery(() => ( + { + ...(options ?? {}), + queryKey: [${funcName}.config.path, payload], + queryFn() { + if (typeof payload === 'undefined') return undefined; + return ${funcName}(payload, requestConfig, customHandler); + }, + }), + queryClient || _queryClient + ); + }`; + } else { + return ` + /** + * ${description || funcName} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + options?: ReturnType>, + queryClient?: QueryClient, + requestConfig?: AxiosRequestConfig<${name}Req | FormData>, + customHandler?: Handler, + ) { + return useMutation<${name}Res, Error, ${name}Req | FormData>(() => ( + { + ...(options ?? {}), + mutationFn(payload) { + return ${funcName}(payload, requestConfig, customHandler); + }, + }), + queryClient || _queryClient + ); + }`; + } +} + +export function generateSvelteQueryHook(name: string, apiConf: APIConfig) { + const funcName = name[0].toLowerCase() + name.slice(1); + const { description = '', category = 'others', isGet, method, path } = apiConf; + const isGetMethod = isGet ?? (!apiConf.method || apiConf.method.toLowerCase() === 'get'); + + if (isGetMethod) { + return ` + /** + * ${description || funcName} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + payload?: ${name}Req, + options?: Omit, 'queryKey' | 'queryFn'>, + queryClient?: QueryClient, + requestConfig?: AxiosRequestConfig<${name}Req>, + customHandler?: Handler, + ) { + return createQuery(() => ( + { + ...(options ?? {}), + queryKey: [${funcName}.config.path, payload], + queryFn() { + if (typeof payload === 'undefined') return undefined; + return ${funcName}(payload, requestConfig, customHandler); + }, + }), + () => queryClient ?? _queryClient + ); + }`; + } else { + return ` + /** + * ${description || name} + * ${method?.toUpperCase() ?? 'GET'} ${path} + * @category ${category} + */ + export function use${name}( + options?: CreateMutationOptions< + ${name}Res, + Error, + ${name}Req | FormData, + unknown + >, + queryClient?: QueryClient, + requestConfig?: AxiosRequestConfig<${name}Req | FormData>, + customHandler?: Handler, + ) { + return createMutation(() => ( + { + ...(options ?? {}), + mutationFn(payload) { + return ${funcName}(payload, requestConfig, customHandler); + }, + }), + () => queryClient ?? _queryClient + ); + }`; + } +} + +export interface APIConfig { + path: string; + description?: string; + method?: string; + type?: string; + category?: string; + isGet?: boolean; + schema?: any; +} diff --git a/packages/tsdk/src/load-commonjs.ts b/packages/tsdk/src/load-commonjs.ts new file mode 100644 index 00000000..a058a5db --- /dev/null +++ b/packages/tsdk/src/load-commonjs.ts @@ -0,0 +1,26 @@ +import fs from 'fs'; +import path from 'path'; +import vm from 'vm'; + +export function loadCommonJS(filePath: string) { + const absPath = path.resolve(filePath); + const code = fs.readFileSync(absPath, 'utf8'); + + // Prepare sandbox + const sandbox: vm.Context = { + module: { exports: {} }, + exports: {}, + require: (mod: string) => { + // Only allow certain modules + // if (['path', 'fs'].includes(mod)) return require(mod); + throw new Error(`Module "${mod}" is not allowed in sandbox`); + }, + console, + }; + vm.createContext(sandbox); + + // Run the code in sandbox + vm.runInContext(code, sandbox, { filename: absPath }); + + return sandbox.module.exports; +} diff --git a/packages/tsdk/src/log.ts b/packages/tsdk/src/log.ts new file mode 100644 index 00000000..6b82018b --- /dev/null +++ b/packages/tsdk/src/log.ts @@ -0,0 +1,18 @@ +import { config } from './config'; + +export const logger: { + log: typeof console.log; + info: typeof console.info; + warn: typeof console.warn; + error: typeof console.error; +} = { + log: (...args: Parameters) => { + if (config.logVerbose !== false) { + return console.log(...args); + } + // ignore + }, + info: console.info, + warn: console.warn, + error: console.error, +}; diff --git a/packages/tsdk/src/nest-webpack.ts b/packages/tsdk/src/nest-webpack.ts index 3494193c..e5c214cd 100644 --- a/packages/tsdk/src/nest-webpack.ts +++ b/packages/tsdk/src/nest-webpack.ts @@ -5,7 +5,7 @@ import ts from 'typescript'; import webpack from 'webpack'; import nodeExternals from 'webpack-node-externals'; -import { getNpmCommand } from './get-pkg-manager'; +import { getNpmCommand } from './get-npm-command'; export const tsdkConfigFilePath = path.join(process.cwd(), 'tsdk.config.js'); @@ -65,13 +65,13 @@ async function run() { console.log( `[${command} ${name}] Success: \`${npmCMDs.runCmd} nest ${command} ${name}\` and start webpack build` ); - } catch (e) { + } catch (error) { console.log( `[${command} ${name}] Run: \`${npmCMDs.runCmd} nest ${command} ${name}\` error: `, - e + (error as any).stdout || (error as any).stderr ); console.log('\n'); - reject(e); + reject(error); return; } const nestProjectConfig = projects[name]; diff --git a/packages/tsdk/src/openapi-command.ts b/packages/tsdk/src/openapi-command.ts new file mode 100644 index 00000000..178da4b5 --- /dev/null +++ b/packages/tsdk/src/openapi-command.ts @@ -0,0 +1,31 @@ +import { execSync } from 'child_process'; +import path from 'path'; + +import symbols from './symbols'; +import { logger } from './log'; + +export async function runOpenapiToApiconfCommand() { + const idx = process.argv.findIndex((i) => i === '--from-openapi' || i === 'from-openapi'); + const restArgv = process.argv.slice(idx + 1); + const openapiScript = path.join(__dirname, 'from-openapi.js'); + if (openapiScript) { + const cmd = `node ${openapiScript} ${restArgv.join(' ')}`; + logger.log(`${symbols.info} Run \`${cmd}\``); + execSync(cmd, { stdio: 'inherit' }); + } else { + logger.warn(symbols.warning, `\`tsdk from-openapi\` currently only support \`build\` command.`); + } +} + +export async function runApiconfToOpenapiCommand() { + const idx = process.argv.findIndex((i) => i === '--to-openapi' || i === 'to-openapi'); + const restArgv = process.argv.slice(idx + 1); + const openapiScript = path.join(__dirname, 'to-openapi.js'); + if (openapiScript) { + const cmd = `node ${openapiScript} ${restArgv.join(' ')}`; + logger.log(`${symbols.info} Run \`${cmd}\``); + execSync(cmd, { stdio: 'inherit' }); + } else { + logger.warn(symbols.warning, `\`tsdk to-openapi\` currently only support \`build\` command.`); + } +} diff --git a/packages/tsdk/src/package.json b/packages/tsdk/src/package.json new file mode 100644 index 00000000..f54d0a9f --- /dev/null +++ b/packages/tsdk/src/package.json @@ -0,0 +1,16 @@ +{ + "name": "for-versions", + "private": true, + "peerDependencies": { + "swr": "^2.3.8", + "@tanstack/react-query": "^5.90.19", + "@tanstack/vue-query": "^5.92.8", + "@tanstack/solid-query": "^5.90.22", + "@tanstack/svelte-query": "^6.0.17", + "zod": "^4", + "valibot": "^1.2.0", + "arktype": "^2.1.29", + "@standard-schema/spec": "^1.1.0", + "kysely": "^0.28.9" + } +} diff --git a/packages/tsdk/src/prettier.ts b/packages/tsdk/src/prettier.ts index 6bed003c..c81bf7f8 100644 --- a/packages/tsdk/src/prettier.ts +++ b/packages/tsdk/src/prettier.ts @@ -11,15 +11,23 @@ export async function runPrettier() { // prettier 3.x execSync(`node ${rootDir}/node_modules/prettier/bin/prettier.cjs ${formatDir} --write`, { stdio: 'pipe', + encoding: 'utf-8', }); - } catch (e) { + return true; + } catch (error) { try { // prettier 2.x - execSync(`node ${rootDir}/node_modules/prettier/bin-prettier ${formatDir} --write`, { + execSync(`node ${rootDir}/node_modules/prettier/bin-prettier.js ${formatDir} --write`, { stdio: 'pipe', + encoding: 'utf-8', }); - } catch (e) { - // + return true; + } catch (error2) { + // console.error( + // ' ❌ Failed to run Prettier', + // (error2 as Error).message + '.\n' + (error as Error).message + // ); + return false; } } } diff --git a/packages/tsdk/src/remove-fields.ts b/packages/tsdk/src/remove-fields.ts index 17bdd292..50481abe 100644 --- a/packages/tsdk/src/remove-fields.ts +++ b/packages/tsdk/src/remove-fields.ts @@ -1,23 +1,203 @@ -import glob = require('fast-glob'); -import fsExtra from 'fs-extra'; +import glob from 'fast-glob'; +import fs from 'fs'; import path from 'path'; import { config, ensureDir } from './config'; +import { replaceWindowsPath } from './utils'; +import symbols from './symbols'; +import { logger } from './log'; export async function removeFields() { - if (config.removeFields?.length === 0) return; - const pattern = path.join(ensureDir, `lib/**/*.${config.apiconfExt}.js`).replace(/\\/g, '/'); + if (!config.removeFields || config.removeFields.length === 0) return; - const removeFields = config.removeFields || ['needAuth', 'category', 'description', 'type']; + const jsPattern = replaceWindowsPath(path.join(ensureDir, `lib/**/*.${config.apiconfExt}.js`)); + const jsPatternForEsm = replaceWindowsPath( + path.join(ensureDir, `esm/**/*.${config.apiconfExt}.js`) + ); + + const removeFields = config.removeFields ?? ['needAuth']; + logger.log(` ${symbols.info}`, `Removing fields [${removeFields.join(',')}]`); + const files = await glob([jsPattern, jsPatternForEsm]); + + let processedCount = 0; + let errorCount = 0; - const files = await glob(pattern); await Promise.all( files.map(async (file) => { - let content = await fsExtra.readFile(file, 'utf8'); - removeFields.forEach((field) => { - content = content.replace(new RegExp(`${field}:.*\n`, 'g'), ''); - }); - return fsExtra.writeFile(file, content); + try { + const content = await fs.promises.readFile(file, 'utf8'); + const arr = content.split('\n'); + const result: string[] = []; + let skipUntilIndex = -1; + + arr.forEach((line, index) => { + // Skip lines in the deletion range + if (index <= skipUntilIndex) { + return; + } + + const trimLine = line.trim(); + const isMatched = removeFields.find((field) => trimLine.startsWith(`${field}:`)); + + if (isMatched) { + const spaceCount = line.search(/\S/); // More robust than indexOf + + // Find the end of this field block + const endIndex = findFieldEnd(arr, index, spaceCount); + + if (endIndex > -1) { + // Mark lines to skip (from current line to end of field) + skipUntilIndex = endIndex; + + // Handle trailing comma removal + handleTrailingComma(result, arr, endIndex); + } else { + // If we can't find the end, keep the line (safer fallback) + result.push(line); + logger.warn( + ` ${symbols.warning}`, + `Could not determine end of field in ${file}:${index + 1}` + ); + } + } else { + result.push(line); + } + }); + + // Only write if content changed + const newContent = result.join('\n'); + if (newContent !== content) { + await fs.promises.writeFile(file, newContent); + processedCount++; + } + } catch (error) { + errorCount++; + logger.error(` ${symbols.error}`, `Failed to process ${file}:`, error); + } }) ); + + logger.log( + ` ${symbols.success}`, + `Processed ${processedCount} file(s), ${errorCount} error(s)` + ); +} + +/** + * Find the end index of a field block by tracking brace depth + */ +function findFieldEnd(lines: string[], startIndex: number, baseIndent: number): number { + const startLine = lines[startIndex].trim(); + + // Check if field value starts with { or [ + const hasOpenBrace = startLine.includes('{') || startLine.includes('['); + + if (!hasOpenBrace) { + // Simple value - ends on the same line or next line without deeper indent + if (startLine.endsWith(',') || startLine.endsWith('}')) { + return startIndex; + } + + // Multi-line simple value - find where it ends + for (let i = startIndex + 1; i < lines.length; i++) { + const line = lines[i]; + const indent = line.search(/\S/); + const trimmed = line.trim(); + + if (trimmed === '') continue; // Skip empty lines + + // If we hit a line at same or less indent, previous line was the end + if (indent !== -1 && indent <= baseIndent) { + return i - 1; + } + } + return startIndex; + } + + // Complex value with braces - track depth + let braceDepth = 0; + let bracketDepth = 0; + let inString = false; + let stringChar = ''; + let hasStartedCounting = false; + + for (let i = startIndex; i < lines.length; i++) { + const line = lines[i]; + + for (let j = 0; j < line.length; j++) { + const char = line[j]; + const prevChar = j > 0 ? line[j - 1] : ''; + + // Handle string boundaries (skip escaped quotes) + if ((char === '"' || char === "'" || char === '`') && prevChar !== '\\') { + if (!inString) { + inString = true; + stringChar = char; + } else if (char === stringChar) { + inString = false; + stringChar = ''; + } + continue; + } + + // Skip if inside string + if (inString) continue; + + // Track braces and brackets + if (char === '{') { + braceDepth++; + hasStartedCounting = true; + } else if (char === '}') { + braceDepth--; + } else if (char === '[') { + bracketDepth++; + hasStartedCounting = true; + } else if (char === ']') { + bracketDepth--; + } + + // Check if we've closed all braces/brackets after opening at least one + if (hasStartedCounting && braceDepth === 0 && bracketDepth === 0) { + // Look for trailing comma on this line or if line ends cleanly + const restOfLine = line.slice(j + 1).trim(); + if (restOfLine === ',' || restOfLine === '' || restOfLine.startsWith(',')) { + return i; + } + } + } + } + + // Couldn't find proper end - return -1 to indicate error + return -1; +} + +/** + * Remove trailing comma from the previous field if the deleted field had one + */ +function handleTrailingComma(result: string[], allLines: string[], deletedEndIndex: number): void { + if (result.length === 0) return; + + // Check if the deleted block ended with a comma + const deletedLastLine = allLines[deletedEndIndex]; + const hasTrailingComma = deletedLastLine.trim().endsWith(','); + + if (!hasTrailingComma) return; + + // Check if next non-empty line after deletion is a closing brace + let nextNonEmptyIndex = deletedEndIndex + 1; + while (nextNonEmptyIndex < allLines.length && allLines[nextNonEmptyIndex].trim() === '') { + nextNonEmptyIndex++; + } + + if (nextNonEmptyIndex < allLines.length) { + const nextLine = allLines[nextNonEmptyIndex].trim(); + if (nextLine.startsWith('}') || nextLine.startsWith(']')) { + // Remove trailing comma from last line in result + const lastIndex = result.length - 1; + const lastLine = result[lastIndex]; + if (lastLine.trim().endsWith(',')) { + result[lastIndex] = lastLine.replace(/,(\s*)$/, '$1'); + } + } + } } diff --git a/packages/tsdk/src/run-nest-command.ts b/packages/tsdk/src/run-nest-command.ts index 3b2adb84..ff44e4e4 100644 --- a/packages/tsdk/src/run-nest-command.ts +++ b/packages/tsdk/src/run-nest-command.ts @@ -3,15 +3,16 @@ import fsExtra from 'fs-extra'; import path from 'path'; import symbols from './symbols'; +import { logger } from './log'; export async function runNestCommand() { - const idx = process.argv.findIndex((i) => i === '--nest'); + const idx = process.argv.findIndex((i) => i === '--nest' || i === 'nest'); const command = process.argv[idx + 1]; if (command === 'build') { const cwd = process.cwd(); const webpackDistFile = path.resolve(cwd, 'node_modules', 'nest-webpack.js'); - const copyFiles = ['nest-webpack.js', 'get-pkg-manager.js']; + const copyFiles = ['nest-webpack.js', 'get-pkg-manager.js', 'get-npm-command.js']; await Promise.all( copyFiles.map((filename) => { return fsExtra.copy( @@ -26,10 +27,16 @@ export async function runNestCommand() { const names = process.argv.filter((i, index) => index > idx + 1); - execSync(`node ${webpackDistFile} ${command} --names ${names.join(' ')}`, { - stdio: 'inherit', - }); + try { + execSync(`node ${webpackDistFile} ${command} --names ${names.join(' ')}`, { + stdio: 'inherit', + encoding: 'utf-8', + }); + } catch (error) { + logger.error('Command failed:', (error as any).stdout || (error as any).stderr); + throw error; + } } else { - console.log(symbols.warning, `\`tsdk --nest\` currently only support \`build\` command.`); + logger.log(symbols.warning, `\`tsdk nest\` currently only support \`build\` command.`); } } diff --git a/packages/tsdk/src/symbols.ts b/packages/tsdk/src/symbols.ts index f21afd69..0937ad3b 100644 --- a/packages/tsdk/src/symbols.ts +++ b/packages/tsdk/src/symbols.ts @@ -1,38 +1,22 @@ -import chalk from 'chalk'; -/* c8 ignore next 4 */ -const isSupported = - process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; - const folder = '└─'; const space = ' '; const main = { - info: chalk.blue('ℹ'), - success: chalk.green('✔'), - warning: chalk.yellow('⚠'), - error: chalk.red('✖'), - bullet: '●', - folder, - space, -}; - -const fallbacks = { - info: chalk.blue('i'), - success: chalk.green('√'), - warning: chalk.yellow('‼'), - error: chalk.red('×'), - bullet: '*', + info: 'ℹ️', + success: '✅', + warning: '⚠️', + error: '❌', + bullet: '⏰', folder, space, }; function get(name: keyof typeof main) { - /* c8 ignore next */ - const symbols = isSupported ? main : fallbacks; + const symbols = main; return symbols[name]; } export default { - ...(isSupported ? main : /* c8 ignore next */ fallbacks), + ...main, get, }; diff --git a/packages/tsdk/src/sync-api.ts b/packages/tsdk/src/sync-api.ts index 268cf6b2..1146a7dc 100644 --- a/packages/tsdk/src/sync-api.ts +++ b/packages/tsdk/src/sync-api.ts @@ -1,289 +1,378 @@ import fsExtra from 'fs-extra'; +import fs from 'fs'; import path from 'path'; import { config, ensureDir, packageFolder } from './config'; import symbols from './symbols'; +import { + generateSWRHook, + generateReactQueryHook, + generateVueQueryHook, + generateSolidQueryHook, + generateSvelteQueryHook, +} from './hooks-generate'; +import { logger } from './log'; export const baseDir = path.join(path.relative(path.dirname(__filename), process.cwd()), ensureDir); export function deleteSDKFolder() { - return fsExtra.remove(path.resolve(process.cwd(), config.packageDir, packageFolder)); + const dir = path.resolve(process.cwd(), config.packageDir, packageFolder, config.baseDir); + logger.log(` Deleting ${dir}`); + return fsExtra.remove(dir); } -export async function syncAPI() { - console.log(symbols.bullet, 'generating APIs'); - await replaceGenAPI(); - const pkgJSON = require(path.join(baseDir, 'package.json')); - const apiconfs = require(path.join(baseDir, 'lib', `${config.apiconfExt}-refs`)); - - const keys = Object.keys(apiconfs); - keys.sort(); +export async function syncAPI( + _apiconfs: { + method: string; + path: string; + name: string; + type: string; + description: string; + category: string; + isGet?: boolean; + }[], + _types: string[] +) { + logger.log(` ${symbols.bullet}`, 'generating APIs'); + await checkRepkaceAxiosWithXior(); + const pkgJSON = JSON.parse( + await fs.promises.readFile( + path.resolve(process.cwd(), config.packageDir, packageFolder, 'package.json'), + 'utf-8' + ) + ); - const types = [...new Set(keys.map((k) => apiconfs[k].type))].filter((i) => !!i); + const types = [..._types]; if (!types.includes('common')) { types.push('common'); } types.sort(); - const isSWR = config.dataHookLib?.toLowerCase() === 'swr'; - const isReactQuery = config.dataHookLib?.toLowerCase() === 'reactquery'; - types.forEach((apiType) => { - const dataHookHeadStr = ` - ${ - !isSWR - ? '' - : `import useSWR, { SWRConfiguration } from "swr"; - import useSWRMutation, { SWRMutationConfiguration } from "swr/mutation"; - ${ - config.httpLib !== 'xior' - ? `import type { AxiosRequestConfig } from "axios";` - : `import type { XiorRequestConfig as AxiosRequestConfig } from "xior";` - } - ` + + const _hookLibs = ( + Array.isArray(config.dataHookLib) ? config.dataHookLib : [config.dataHookLib || 'SWR'] + ).map((i) => (i as string).toLowerCase()); + + const hookLibs = Array.from(new Set(_hookLibs)); + + let commonApiConfigStr = ``; + + _apiconfs.forEach((item) => { + if (item.type === 'common') { + commonApiConfigStr += `${item.name}Config,`; } - ${ - !isReactQuery - ? '' - : `import { - useQuery, - useMutation, - QueryClient, + }); + + // const isSWR = hookLibs?.includes('swr'); + // const isReactQuery = hookLibs?.includes('reactquery'); + // const isVueQuery = hookLibs?.includes('vuequery'); + + const hasCommon = _apiconfs.find((item) => { + return item.type === 'common'; + }); + + for (const apiType of types) { + const hooksContentMap: Record< + 'swr' | 'reactquery' | 'vuequery' | 'solidquery' | 'sveltequery', + { + dataHookHeadStr: string; + dataHookImportStr: string; + dataHookBodyStr: string; + dataHookExportStr: string; + } + > = { + swr: { + dataHookHeadStr: '', + dataHookImportStr: '', + dataHookBodyStr: '', + dataHookExportStr: '', + }, + reactquery: { + dataHookHeadStr: '', + dataHookImportStr: '', + dataHookBodyStr: '', + dataHookExportStr: '', + }, + vuequery: { + dataHookHeadStr: '', + dataHookImportStr: '', + dataHookBodyStr: '', + dataHookExportStr: '', + }, + solidquery: { + dataHookHeadStr: '', + dataHookImportStr: '', + dataHookBodyStr: '', + dataHookExportStr: '', + }, + sveltequery: { + dataHookHeadStr: '', + dataHookImportStr: '', + dataHookBodyStr: '', + dataHookExportStr: '', + }, + }; + const commonDataHookHeadStr = ` + ${ + config.httpLib !== 'xior' + ? `import type { AxiosRequestConfig } from "axios";` + : `import type { AxiosRequestConfig } from "xior";` + } + import {buildSortedURL, encodeParams as stringify} from 'xior'; + import type { Handler } from './gen-api'; + `; + + // isSWR + hooksContentMap['swr'].dataHookHeadStr = `import useSWR, { SWRConfiguration } from "swr"; + import useSWRMutation, { SWRMutationConfiguration } from "swr/mutation"; + // @ts-ignore install react + import {useMemo} from 'react'; + ${commonDataHookHeadStr} + `; + // isReactQuery + hooksContentMap['reactquery'].dataHookHeadStr = ` + import { + useQuery, + useMutation, + QueryClient, + UndefinedInitialDataOptions, + UseMutationOptions, + } from "@tanstack/react-query"; + // @ts-ignore install react + import {useMemo} from 'react'; + ${commonDataHookHeadStr} + `; + // isVueQuery + hooksContentMap['vuequery'].dataHookHeadStr = ` + import { + useQueryClient, + useQuery, + useMutation, + QueryClient, + UseQueryOptions, + UseMutationOptions, + UseQueryReturnType, + } from "@tanstack/vue-query"; + ${commonDataHookHeadStr} + `; + // isSolidQuery + hooksContentMap['solidquery'].dataHookHeadStr = ` + import { + useQueryClient, + useQuery, + useMutation, + QueryClient as _QueryClient, + SolidQueryOptions, + UseMutationOptions, + } from "@tanstack/solid-query"; + ${commonDataHookHeadStr} + `; + // isSvelteQuery + hooksContentMap['sveltequery'].dataHookHeadStr = ` + import { + useQueryClient, + createQuery, + createMutation, + type QueryClient, UndefinedInitialDataOptions, - UseMutationOptions, - } from "@tanstack/react-query"; - ${ - config.httpLib !== 'xior' - ? `import type { AxiosRequestConfig } from "axios";` - : `import type { XiorRequestConfig as AxiosRequestConfig } from "xior";` - } - ` - } - import { Handler } from './gen-api'; + CreateMutationOptions, + } from "@tanstack/svelte-query"; + ${commonDataHookHeadStr} + `; + + // isReactQuery isVueQuery) { + hooksContentMap['reactquery'].dataHookBodyStr = + hooksContentMap['vuequery'].dataHookBodyStr = + hooksContentMap['sveltequery'].dataHookBodyStr = + ` + let _queryClient: QueryClient; + + ${ + apiType === 'common' + ? ` + export function setQueryClientForCommon(queryClient: QueryClient) { + _queryClient = queryClient; + } + ` + : `` + } + `; + hooksContentMap['solidquery'].dataHookBodyStr = ` + type QueryClient = Parameters[1]; + let _queryClient: QueryClient; + + ${ + apiType === 'common' + ? ` + export function setQueryClientForCommon(queryClient: QueryClient) { + _queryClient = queryClient; + } + ` + : `` + } + `; + + hooksContentMap['swr'].dataHookExportStr = + apiType === 'common' || !hasCommon ? `` : `\nexport * from './common-api-swr';`; + + hooksContentMap['reactquery'].dataHookExportStr = + apiType === 'common' || !hasCommon + ? `\nexport function setQueryClient(queryClient: QueryClient) { + _queryClient = queryClient; + }` + : `\nexport * from './common-api-reactquery'; + import { setQueryClientForCommon } from './common-api-reactquery'; + + export function setQueryClient(queryClient: QueryClient) { + _queryClient = queryClient; + setQueryClientForCommon(queryClient); + } + `; + + hooksContentMap['vuequery'].dataHookExportStr = + apiType === 'common' || !hasCommon + ? `\nexport function setQueryClient(queryClient: QueryClient) { + _queryClient = queryClient; + }` + : `\nexport * from './common-api-vuequery'; + import { setQueryClientForCommon } from './common-api-vuequery'; + + export function setQueryClient(queryClient: QueryClient) { + _queryClient = queryClient; + setQueryClientForCommon(queryClient); + } + `; + + hooksContentMap['solidquery'].dataHookExportStr = + apiType === 'common' || !hasCommon + ? `\nexport function setQueryClient(queryClient: QueryClient) { + _queryClient = queryClient; + }` + : `\nexport * from './common-api-solidquery'; + import { setQueryClientForCommon } from './common-api-solidquery'; + + export function setQueryClient(queryClient: QueryClient) { + _queryClient = queryClient; + setQueryClientForCommon(queryClient); + } + `; + + hooksContentMap['sveltequery'].dataHookExportStr = + apiType === 'common' || !hasCommon + ? `\nexport function setQueryClient(queryClient: QueryClient) { + _queryClient = queryClient; + }` + : `\nexport * from './common-api-sveltequery'; + import { setQueryClientForCommon } from './common-api-sveltequery'; + + export function setQueryClient(queryClient: QueryClient) { + _queryClient = queryClient; + setQueryClientForCommon(queryClient); + } `; - let dataHookImportStr = ``; - let dataHookBodyStr = isReactQuery - ? ` - let _queryClient: QueryClient; - - ${ - apiType === 'common' - ? ` - export function setQueryClientForCommon(queryClient: QueryClient) { - _queryClient = queryClient; - } - ` - : ` - - ` - } - ` - : ``; const headStr = ` /** * - * api-${apiType}.ts + * ${apiType}-api.ts * ${config.packageName}@${pkgJSON.version} * **/ import genApi, { Expand } from './gen-api'; - -`; + `; + const workerSenderHeadStr = ` + /** + * + * worker/${apiType}-api.ts + * ${config.packageName}@${pkgJSON.version} + * + **/ + import type { Expand } from '../gen-api'; + import genApi, { setWorker } from './gen-worker-api'; - let importStr = ``; - let bodyStr = ``; + export { setWorker }; + `; + let importStr = ``, + bodyStr = ``; - const hasCommon = keys.find((k) => { - const item = apiconfs[k]; - return (item.type === 'common' || !item.type) && item.path; - }); + let apiConfigStr = ``; const exportStr = apiType === 'common' || !hasCommon ? `` : `\nexport * from './common-api';\n`; - const dataHookExportStr = - apiType === 'common' || !hasCommon - ? `` - : `\nexport * from './common-api-hooks'; - ${ - isReactQuery - ? ` - import { setQueryClientForCommon } from './common-api-hooks'; - export function setQueryClient(queryClient: QueryClient) { - _queryClient = queryClient; - setQueryClientForCommon(queryClient); - } - ` - : `${ - isReactQuery - ? ` - export function setQueryClient(queryClient: QueryClient) { - _queryClient = queryClient; - } - ` - : `` - }` - } - `; + let contentCount = 0; - let hasContentCount = 0; - keys.forEach((k, idx) => { - const { - name: _name, - path, - description, - method, - type: _type, - category = 'others', - } = apiconfs[k]; - const name = _name || k.replace(/Config$/, ''); - const type = _type === 'common' || !_type ? 'common' : _type; - - const isGET = !method || method?.toLowerCase() === 'get'; - const likeGET = apiconfs[k].isGet === false ? false : apiconfs[k].isGet === true || isGET; - - if (type === apiType && path) { - importStr += ` - ${name}Config, - type ${name}Req, - type ${name}Res, - `; - bodyStr += ` - /** - * ${description} - * - * @category ${category} - */ - export const ${name} = genApi${ - isGET ? '' : ' | FormData' - }, Expand<${name}Res>>(${name}Config); - `; + await Promise.all( + _apiconfs.map((item) => { + const { name: _name, path, description, method, type: _type, category = 'others' } = item; + const name = _name; + const funcName = name[0].toLowerCase() + name.slice(1); + const type = !_type ? 'user' : _type; - dataHookImportStr += ` - ${name}, - `; - if (isSWR) { - dataHookBodyStr += ` - ${ - likeGET - ? ` -/** - * ${description} - * - * @category ${category} - */ -export function use${name}( -payload?: ${name}Req, -options?: SWRConfiguration<${name}Res | undefined>, -requestConfig?: AxiosRequestConfig<${name}Req>, -customHandler?: Handler, -) { -return useSWR( - () => ({ url: ${name}.config.path, arg: payload }), - ({ arg }) => { - if (typeof arg === 'undefined') return undefined; - return ${name}(arg, requestConfig, customHandler); - }, - options -); -} - ` - : ` + const isGET = !method || method?.toLowerCase() === 'get' || item.isGet; + + if (type === apiType) { + importStr += ` + ${name}Config as ${item.name}ApiConfig, + type ${name}Req, + type ${name}Res, + `; + apiConfigStr += `${name}Config,`; + bodyStr += ` /** - * ${description} - * + * ${description || funcName} + * ${method?.toUpperCase() ?? 'GET'} ${path || ''} * @category ${category} */ - export function use${name}( - options?: SWRMutationConfiguration< - ${name}Res, - Error, - string, - ${name}Req | FormData - >, - requestConfig?: AxiosRequestConfig<${name}Req | FormData>, - customHandler?: Handler, - ) { - return useSWRMutation( - ${name}.config.path, - (url, { arg }: { arg: ${name}Req | FormData }) => { - return ${name}(arg, requestConfig, customHandler); - }, - options - ); - }` - } - - `; - } else if (isReactQuery) { - dataHookBodyStr += ` - ${ - likeGET - ? ` - /** - * ${description} - * - * @category ${category} - */ - export function use${name}( - payload?: ${name}Req, - options?: UndefinedInitialDataOptions<${name}Res | undefined, Error>, - queryClient?: QueryClient, - requestConfig?: AxiosRequestConfig<${name}Req>, - customHandler?: Handler, - ) { - return useQuery( - { - ...(options || {}), - queryKey: [${name}.config.path, payload], - queryFn() { - if (typeof payload === 'undefined') { - return undefined; - } - return ${name}(payload, requestConfig, customHandler); - }, - }, - queryClient || _queryClient - ); - }` - : ` - /** - * ${description} - * - * @category ${category} - */ - export function use${name}( - options?: UseMutationOptions< - ${name}Res, - Error, - ${name}Req | FormData, - unknown - >, - queryClient?: QueryClient, - requestConfig?: AxiosRequestConfig<${name}Req | FormData>, - customHandler?: Handler, - ) { - return useMutation( - { - ...(options || {}), - mutationFn(payload) { - return ${name}(payload, requestConfig, customHandler); - }, - }, - queryClient || _queryClient - ); - } - ` - } + export const ${funcName} = genApi${ + isGET ? '' : ' | FormData' + }, Expand<${name}Res>>(${name}ApiConfig); + /** + * @Deprecated use \`${funcName}\` instead + * ${description || name} + * ${method?.toUpperCase() ?? 'GET'} ${path || ''} + * @category ${category} + */ + export const ${name} = ${funcName}; `; - } - hasContentCount++; - } - }); + // SWR hook + hooksContentMap['swr'].dataHookImportStr += ` + ${funcName}, + `; + hooksContentMap['swr'].dataHookBodyStr += generateSWRHook(name, item); + + // ReactQuery hook + hooksContentMap['reactquery'].dataHookImportStr += ` + ${funcName}, + `; + hooksContentMap['reactquery'].dataHookBodyStr += generateReactQueryHook(name, item); + + // VueQuery hook + hooksContentMap['vuequery'].dataHookImportStr += ` + ${funcName}, + `; + hooksContentMap['vuequery'].dataHookBodyStr += generateVueQueryHook(name, item); + + // SolidQuery hook + hooksContentMap['solidquery'].dataHookImportStr += ` + ${funcName}, + `; + hooksContentMap['solidquery'].dataHookBodyStr += generateSolidQueryHook(name, item); + + // SvelteQuery hook + hooksContentMap['sveltequery'].dataHookImportStr += ` + ${funcName}, + `; + hooksContentMap['sveltequery'].dataHookBodyStr += generateSvelteQueryHook(name, item); + + contentCount++; + } + }) + ); - if (hasContentCount > 0) { + if (contentCount > 0) { const content = ` ${headStr} ${ @@ -296,103 +385,214 @@ return useSWR( ${exportStr} ${bodyStr} `; + const workerSenderContent = ` + ${workerSenderHeadStr} + ${ + importStr + ? `import { + ${importStr} + } from '../${config.apiconfExt}-refs';` + : '' + } + ${exportStr} + ${bodyStr} + `; - fsExtra.writeFileSync(path.join(ensureDir, `src`, `${apiType}-api.ts`), content); - - const dataHookContent = ` - ${dataHookHeadStr} - ${ - importStr - ? `import { - ${importStr} - } from './${config.apiconfExt}-refs';` - : '' - } - ${ - dataHookImportStr - ? `import { - ${dataHookImportStr} - } from './${apiType}-api';` - : '' - } - ${dataHookExportStr} - ${dataHookBodyStr} + const workerContent = ` + import genApi, { setHandler } from '../gen-api'; + import { APIConfig, ProtocolTypes } from '../tsdk-shared/helpers'; + ${ + apiConfigStr + ? `import { + ${apiConfigStr} + ${commonApiConfigStr} + } from '../${config.apiconfExt}-refs';` + : '' + } + export { setHandler }; + + const APIS: APIConfig[] = [ + ${apiConfigStr} + ${commonApiConfigStr} + ]; + + const API_MAP: Record> = {}; + self.addEventListener('message', async (e: { + data: { id: string; type: string; apiConfig: APIConfig; payload: any; options?: any }; + }) => { + if (e.data?.type !== ProtocolTypes.request) return; + + const ID = \`\${e.data.apiConfig.method}:\${e.data.apiConfig.path}\`; + + const api = API_MAP[ID] + ? API_MAP[ID] + : genApi(APIS.find((item) => \`\${item.method}:\${item.path}\` === ID) as APIConfig); + if (!API_MAP[ID]) API_MAP[ID] = api; + + const msgId = e.data.id; + try { + const result = await api(e.data.payload, e.data.options); + postMessage({ type: ProtocolTypes.response, id: msgId, success: true, result }); + } catch (error) { + postMessage({ type: ProtocolTypes.response, id: msgId, success: false, error }); + } + }); + postMessage({ type: ProtocolTypes.response, ready: true }); `; - fsExtra.writeFileSync( - path.join(ensureDir, `src`, `${apiType}-api-hooks.ts`), - dataHookContent - ); + await Promise.all([ + fs.promises.writeFile(path.join(ensureDir, `src/${apiType}-api.ts`), content), + ...hookLibs.map((hook) => { + const { dataHookHeadStr, dataHookImportStr, dataHookExportStr, dataHookBodyStr } = + hooksContentMap[hook as 'vuequery']; + const dataHookContent = ` + 'use client'; + ${dataHookHeadStr} + ${ + importStr + ? `import { + ${importStr} + } from './${config.apiconfExt}-refs';` + : '' + } + ${ + dataHookImportStr + ? `import { + ${dataHookImportStr} + } from './${apiType}-api';` + : '' + } + ${dataHookExportStr} + ${dataHookBodyStr} + `; + return fs.promises.writeFile( + path.join(ensureDir, `src/${apiType}-api-${hook}.ts`), + dataHookContent + ); + }), + fs.promises.writeFile( + path.join(ensureDir, `src/${apiType}-api-hooks.ts`), + `export * from './${apiType}-api-${hookLibs[0]}';` + ), + + ...(config.worker + ? [ + ...hookLibs.map((hook) => { + const { dataHookHeadStr, dataHookImportStr, dataHookExportStr, dataHookBodyStr } = + hooksContentMap[hook as 'vuequery']; + const dataHookContent = ` + 'use client'; + ${dataHookHeadStr} + ${ + importStr + ? `import { + ${importStr} + } from '../${config.apiconfExt}-refs';` + : '' + } + ${ + dataHookImportStr + ? `import { + ${dataHookImportStr} + } from './${apiType}-api';` + : '' + } + ${dataHookExportStr} + ${dataHookBodyStr} + `; + return fs.promises.writeFile( + path.join(ensureDir, `src/worker/${apiType}-api-${hook}.ts`), + dataHookContent.replace("'./gen-api'", "'../gen-api'") + ); + }), + + apiType !== 'common' + ? fs.promises.writeFile( + path.join(ensureDir, `src/worker/${apiType}-api-worker.ts`), + workerContent + ) + : Promise.resolve(1), // onmessage src/worker/${apiType}-api-worker.ts + fs.promises.writeFile( + path.join(ensureDir, `src/worker/${apiType}-api.ts`), + workerSenderContent + ), // postMessage + fs.promises.writeFile( + path.join(ensureDir, `src/worker/${apiType}-api-hooks.ts`), + `export * from './${apiType}-api-${hookLibs[0]}';` + ), // current default hook + ] + : []), + ]); } - }); + } - console.log(symbols.success, 'generated APIs'); + logger.log(` ${symbols.success}`, 'generated APIs'); const exportPermissions: { [key: string]: any[]; } = {}; - keys.forEach((k) => { - const item = apiconfs[k]; - if (typeof item !== 'object') return; - item.name = item.name || k.replace(/Config$/, ''); + for (const k of _apiconfs) { + const item = k; + if (typeof item !== 'object') continue; + + item.name = item.name || k.name; + if (!exportPermissions[item.type]) { exportPermissions[item.type] = []; } - if (item.schema) { - item.schema = {}; - } + exportPermissions[item.type].push(item); - }); + } - await fsExtra.writeFile( - path.join(ensureDir, 'src', `permissions.json`), + await fs.promises.writeFile( + path.join(ensureDir, `src/permissions.json`), JSON.stringify(exportPermissions, null, 2) ); - console.log(symbols.bullet, 'Docs config'); + logger.log(` ${symbols.bullet}`, 'Generating documentation'); // sync APIs docs const links: string[] = []; - types.forEach((apiType) => { - if (apiType === 'common') return; - links.push(`- [${apiType} APIs](/modules/${apiType}_api)`); - }); + + for (const apiType of types) { + if (apiType === 'common') continue; + links.push(`- [${apiType} APIs](/modules/${apiType}-api)`); + } const projectName = `%PROJECT NAME%`; try { - let getStartedContent = await fsExtra.readFile( + let getStartedContent = await fs.promises.readFile( path.join(__dirname, '..', 'fe-sdk-template', 'README.md'), 'utf-8' ); getStartedContent = getStartedContent .replace(new RegExp(projectName, 'g'), config.packageName) .replace('%API_REFERENCE%', links.join('\n')); - await fsExtra.writeFile(path.join(ensureDir, 'README.md'), getStartedContent); - console.log(symbols.success, 'Docs config'); + await fs.promises.writeFile(path.join(ensureDir, 'README.md'), getStartedContent); + logger.log(` ${symbols.success}`, 'Documentation generated'); } catch (e: unknown) { if (e instanceof Error) { - console.log(symbols.error, 'Docs config error', e.message); + logger.error(` ${symbols.error}`, 'Documentation generation error:', e.message); } } } -export function copyPermissionsJSON() { +export async function copyPermissionsJSON() { const dist = path.join(ensureDir, `lib`, `permissions.json`); - console.log(symbols.info, `copy \`permission.json\` to \`${dist}\``); - return fsExtra.copy(path.join(ensureDir, `src`, `permissions.json`), dist, { + logger.log(` ${symbols.info}`, `copying \`permissions.json\` to \`${dist}\``); + return fsExtra.copy(path.join(ensureDir, `src/permissions.json`), dist, { overwrite: true, }); } -export async function replaceGenAPI() { - if (config.httpLib === 'xior') { - const genAPIfile = path.join(ensureDir, 'src', 'gen-api.ts'); - const res = await fsExtra.readFile(genAPIfile, 'utf-8'); - return fsExtra.writeFile( - genAPIfile, - res - .replace('= AxiosRequestConfig', '= XiorRequestConfig') - .replace(`import type { RequestConfig as AxiosRequestConfig } from './axios';`, '') - ); - } +export async function checkRepkaceAxiosWithXior() { + if (config.httpLib !== 'xior') return; + const genAPIfile = path.join(ensureDir, 'src/gen-api.ts'); + const res = await fs.promises.readFile(genAPIfile, 'utf-8'); + return fs.promises.writeFile( + genAPIfile, + res + .replace('= AxiosRequestConfig', '= XiorRequestConfig') + .replace(`import type { AxiosRequestConfig } from './axios';`, '') + ); } diff --git a/packages/tsdk/src/sync-files.ts b/packages/tsdk/src/sync-files.ts index 9fdc05be..bbeff9e8 100644 --- a/packages/tsdk/src/sync-files.ts +++ b/packages/tsdk/src/sync-files.ts @@ -1,7 +1,9 @@ import { execSync } from 'child_process'; -import glob = require('fast-glob'); +import glob from 'fast-glob'; import fsExtra from 'fs-extra'; +import fs from 'fs'; import path from 'path'; +import { depsVersions } from './deps-version'; import { isConfigExist, @@ -12,17 +14,32 @@ import { parseDeps, packageFolder, } from './config'; -import { getNpmCommand } from './get-pkg-manager'; +import { getNpmCommand } from './get-npm-command'; import symbols from './symbols'; import { transformImportPath } from './transform-import-path'; +import { replaceWindowsPath, measureExecutionTime } from './utils'; +import { extractApiconfs } from './extract-apiconfs'; +import { logger } from './log'; export async function syncFiles(noOverwrite = false) { - await copySDK(noOverwrite); - await parseDeps(); - await syncAddtionShareFiles(); - await syncAPIConf(); - await syncEntityFiles(); - await syncSharedFiles(); + const indent = ' '; + await measureExecutionTime(`Init ${ensureDir}`, () => copySDK(noOverwrite), indent); + await measureExecutionTime(`Parse deps`, () => parseDeps(), indent); + await measureExecutionTime( + `sync *.${config.shareExt || 'share'}.ts files`, + () => syncAdditionalSharedFiles(), + indent + ); + const [apiconfs] = await Promise.all([ + measureExecutionTime(`Sync *.${config.apiconfExt}.ts`, () => syncAPIConf(), indent), + measureExecutionTime(`Sync *.${config.entityExt}.ts`, () => syncEntityFiles(), indent), + ]); + await measureExecutionTime( + `Sync shared folders: ${config.sharedDirs.join(', ')}`, + () => syncSharedFolders(), + indent + ); + return apiconfs; } export async function copyTsdkConfig() { @@ -35,76 +52,139 @@ export async function copyTsdkConfig() { } export async function addDepsIfNone() { + if (process.argv.find((i) => i.indexOf('--no-zod') > -1)) return Promise.resolve(0); const cwd = process.cwd(); const pkgPath = path.resolve(cwd, 'package.json'); - const content = await fsExtra.readFile(pkgPath, 'utf8'); + const content = await fs.promises.readFile(pkgPath, 'utf8'); const contentJSON = JSON.parse(content); + if (!contentJSON.dependencies) contentJSON.dependencies = {}; const npmCMDs = await getNpmCommand(cwd); let needRunInstall = false; + + const validationLib = config.validationLib || 'zod'; + await Promise.all( - [ - ['zod', '^3'], - ['change-case', '^4.1.2'], - ].map(async ([i, version]) => { - if (!contentJSON.dependencies[i]) { - contentJSON.dependencies[i] = version; - await fsExtra.writeFile(pkgPath, JSON.stringify(contentJSON, null, 2)); - needRunInstall = true; - console.log(''); - console.log( - symbols.warning, - `\`tsdk\` depends on \`${i}\`, so automatic add \`${i}\` to dependencies` - ); - console.log( - symbols.info, - `You can run \`${npmCMDs.installCmd}\` to install new dependencies` - ); - console.log(''); + [vLibs[validationLib], ['@standard-schema/spec', depsVersions['@standard-schema/spec']]].map( + async ([dependency, version]) => { + if (!contentJSON.dependencies[dependency]) { + contentJSON.dependencies[dependency] = version; + needRunInstall = true; + logger.log(''); + logger.warn( + ` ${symbols.warning}`, + `\`tsdk\` depends on \`${dependency}\`, so automatically adding \`${dependency}\` to dependencies` + ); + // logger.log( + // symbols.info, + // `You can run \`${npmCMDs.installCmd}\` to install new dependencies` + // ); + logger.log(''); + } + return 1; } - return 1; - }) + ) ); + await fs.promises.writeFile(pkgPath, JSON.stringify(contentJSON, null, 2)); + if (needRunInstall) { - execSync(`${npmCMDs.installCmd}`); + try { + execSync(`${npmCMDs.installCmd}`, { stdio: 'pipe', encoding: 'utf-8', env: process.env }); + } catch (error) { + logger.error('Command failed:', (error as any).stdout || (error as any).stderr); + throw error; + } } } export async function copySnippet() { + if (process.argv.find((i) => i.indexOf('--no-vscode') > -1)) return Promise.resolve(0); + const vscodeFilePath = path.resolve(process.cwd(), config.monorepoRoot || './', '.vscode'); await fsExtra.copy( path.join(__dirname, '../fe-sdk-template', './config/.vscode'), - path.resolve(process.cwd(), config.monorepoRoot || './', '.vscode'), + vscodeFilePath, { overwrite: false } ); + + // overwrite snippets + const validationLib = config.validationLib || 'zod'; + const imports = { + zod: `import { z } from 'zod';`, + valibot: `import * as v from 'valibot';`, + arktype: `import { type } from "arktype"`, + } as const; + const currentImport = imports[validationLib]; + const snippetPath = path.join(vscodeFilePath, 'tsdk.code-snippets'); + const content = await fs.promises.readFile(snippetPath, 'utf-8'); + await fs.promises.writeFile(snippetPath, content.replace(imports.zod, currentImport)); } export async function copyShared() { await fsExtra.copy( - path.join(__dirname, '../fe-sdk-template', './src/shared/'), - path.join(process.cwd(), config.baseDir, 'shared'), + path.join(__dirname, '../fe-sdk-template', './src/tsdk-shared/'), + path.join(process.cwd(), config.baseDir, 'tsdk-shared'), { overwrite: false } ); } +/** Validation libs */ +const vLibs = { + zod: ['zod', depsVersions['zod']], + valibot: ['valibot', depsVersions['valibot']], + arktype: ['arktype', depsVersions['arktype']], +} as const; + async function reconfigPkg() { // rename package name const pkgPath = path.resolve(process.cwd(), config.packageDir, packageFolder, 'package.json'); - const [content] = await Promise.all([fsExtra.readFile(pkgPath, 'utf-8')]); + const [content] = await Promise.all([ + fs.promises.readFile(pkgPath, 'utf-8'), + fs.promises.rename( + path.resolve(process.cwd(), config.packageDir, packageFolder, 'gitignore-x'), + path.resolve(process.cwd(), config.packageDir, packageFolder, '.gitignore') + ), + ]); const pkgContent = JSON.parse(content); pkgContent.name = config.packageName; + if ( (Array.isArray(config.entityLibName) ? config.entityLibName : [config.entityLibName || 'typeorm'] )?.find((item) => item === 'kysely') ) { - pkgContent.dependencies.kysely = '^0.27.5'; + pkgContent.dependencies.kysely = depsVersions['kysely']; } - const dataHookLib = config.dataHookLib?.toLowerCase(); - if (dataHookLib === 'swr') { - pkgContent.dependencies.swr = '^2.3.0'; - } else if (dataHookLib === 'reactquery') { - pkgContent.dependencies['@tanstack/react-query'] = '^5.56.2'; + + const validationLib = config.validationLib || 'zod'; + pkgContent.dependencies[validationLib] = vLibs[validationLib][1]; + + const _hookLibs = ( + Array.isArray(config.dataHookLib) ? config.dataHookLib : [config.dataHookLib || 'SWR'] + ).map((i) => (i as string).toLowerCase()); + + const hookLibs = Array.from(new Set(_hookLibs)); + + const isSWR = hookLibs?.includes('swr'); + const isReactQuery = hookLibs?.includes('reactquery'); + const isVueQuery = hookLibs?.includes('vuequery'); + const isSolidQuery = hookLibs?.includes('solidquery'); + const isSvelteQuery = hookLibs?.includes('sveltequery'); + + if (isSWR) { + pkgContent.dependencies.swr = depsVersions['swr']; + } + if (isReactQuery) { + pkgContent.dependencies['@tanstack/react-query'] = depsVersions['@tanstack/react-query']; + } + if (isVueQuery) { + pkgContent.dependencies['@tanstack/vue-query'] = depsVersions['@tanstack/vue-query']; + } + if (isSolidQuery) { + pkgContent.dependencies['@tanstack/solid-query'] = depsVersions['@tanstack/solid-query']; + } + if (isSvelteQuery) { + pkgContent.dependencies['@tanstack/svelte-query'] = depsVersions['@tanstack/svelte-query']; } if (config.dependencies) { @@ -113,12 +193,14 @@ async function reconfigPkg() { ...config.dependencies, }; } + if (config.devDependencies) { pkgContent.devDependencies = { ...pkgContent.devDependencies, ...config.devDependencies, }; } + if (config.scripts) { pkgContent.scripts = { ...pkgContent.scripts, @@ -126,44 +208,44 @@ async function reconfigPkg() { }; } - await Promise.all([fsExtra.writeFile(pkgPath, JSON.stringify(pkgContent, null, 2))]); - - await Promise.all([copyShared(), copySnippet()]); + await Promise.all([ + fs.promises.writeFile(pkgPath, JSON.stringify(pkgContent, null, 2)), + copyShared(), + copySnippet(), + ]); - const content2 = await fsExtra.readFile('./package.json', 'utf-8'); + const content2 = await fs.promises.readFile('./package.json', 'utf-8'); const pkgJSON = JSON.parse(content2); pkgJSON.scripts = { ...(pkgJSON.scripts || {}), - 'sync-sdk': pkgJSON.scripts?.['sync-sdk'] || `tsdk --sync`, + 'sync-sdk': pkgJSON.scripts?.['sync-sdk'] || `tsdk sync`, + 'watch-sdk': pkgJSON.scripts?.['watch-sdk'] || `tsdk watch --no-verbose`, + 'build-sdk': pkgJSON.scripts?.['build-sdk'] || `tsdk sync --build`, }; - await fsExtra.writeFile('./package.json', JSON.stringify(pkgJSON, null, 2)); + await fs.promises.writeFile('./package.json', JSON.stringify(pkgJSON, null, 2)); } export async function copySDK(noOverwrite: boolean) { - console.log(symbols.bullet, `init ${ensureDir}`); - - if (!isConfigExist) { - await copyTsdkConfig(); - } + if (!isConfigExist) await copyTsdkConfig(); const existPath = path.resolve(process.cwd(), config.packageDir, packageFolder, `package.json`); const isExist = await fsExtra.pathExists(existPath); if (isExist && noOverwrite) { await reconfigPkg(); - console.log( + logger.info( symbols.info, - `skip init sdk: \`${path.resolve( + `Skip init sdk: \`${path.resolve( process.cwd(), config.packageDir, packageFolder - )}\` already exist` + )}\` already exists` ); return; } await fsExtra.ensureDir(ensureDir); - console.log(symbols.success, `mkdir -p ${ensureDir}`); + logger.log(` ${symbols.success} mkdir -p ${ensureDir}`); await fsExtra.copy( path.join(__dirname, '../fe-sdk-template'), path.resolve(process.cwd(), config.packageDir, packageFolder), @@ -177,48 +259,81 @@ export async function copySDK(noOverwrite: boolean) { return fsExtra.remove(path.join(ensureDir, folder)); }) ); - - console.log(symbols.success, `init ${ensureDir}`); } /** sync files base extension config */ export async function syncExtFiles(ext: string, isEntity = false) { - console.log(symbols.bullet, `sync *.${ext}.ts files`); - - const pattern = path - .join(`${path.join(...config.baseDir.split('/'))}`, `**`, `*.${ext}.ts`) - .replace(/\\/g, '/'); + const isApiconf = ext === config.apiconfExt; + const pattern = replaceWindowsPath( + path.join(`${path.join(...config.baseDir.split('/'))}`, `**`, `*.${ext}.ts`) + ); const files = await glob(pattern); files.sort(); const indexContentMap: { [key: string]: string } = {}; + const apiconfs: { + method: string; + path: string; + name: string; + type: string; + description: string; + category: string; + isGet?: boolean; + }[] = []; + const types = new Set(); await Promise.all( - files.map(async (file, idx) => { + files.map(async (file) => { const filePath = path.join(ensureDir, file.replace(`${config.baseDir}/`, 'src/')); const content: string = await transformImportPath(file, isEntity); + if (isApiconf) { + // Get the configs and push to `apiconfs` + const extractResult = extractApiconfs(content); + if (extractResult.length > 0) { + extractResult.forEach((item) => { + if (item.type) { + types.add(item.type); + } + apiconfs.push(item); + }); + } + } + await fsExtra.ensureDir(path.dirname(filePath)); let fromPath = path.relative( - `${ensureDir}/src/`.replace(/\\/g, '/'), + replaceWindowsPath(`${ensureDir}/src/`), filePath.replace('.ts', '') ); fromPath = path.normalize(fromPath); fromPath = fromPath.startsWith('.') ? fromPath : './' + fromPath; - indexContentMap[file] = `export * from '${fromPath.replace(/\\/g, '/')}';\n`; - return fsExtra.writeFile(filePath, content); + indexContentMap[file] = `export * from '${replaceWindowsPath(fromPath)}';\n`; + await fs.promises.writeFile(filePath, content); + return filePath; }) ); + + if (apiconfs.length > 0) { + logger.log(` There are ${apiconfs.length} APIs`); + } + const indexContent = files.length > 0 ? files.map((file) => indexContentMap[file]).join('') : getDefaultContent(); - await fsExtra.writeFile(path.join(ensureDir, `src/${ext}-refs.ts`), `${comment}${indexContent}`); + await fs.promises.writeFile( + path.join(ensureDir, `src/${ext}-refs.ts`), + `${comment}${indexContent}` + ); + + if (isApiconf) { + return { apiconfs, types: Array.from(types), files }; + } } /** sync entity files */ export async function syncEntityFiles() { - return syncExtFiles(config.entityExt, true); + return syncExtFiles(config?.entityExt as string, true); } /** sync apiconf files */ @@ -226,18 +341,16 @@ export async function syncAPIConf() { return syncExtFiles(config.apiconfExt); } -/** sync apiconf files */ -export async function syncAddtionShareFiles() { +/** sync additional shared files */ +export async function syncAdditionalSharedFiles() { return syncExtFiles(config.shareExt || 'shared'); } /** sync shared files */ -export async function syncSharedFiles() { - console.log(symbols.bullet, `sync shared files`); - +export async function syncSharedFolders() { const files = await glob([ - ...config.sharedDirs.map((i) => path.join(i, `**/*.*`).replace(/\\/g, '/')), - path.join(config.baseDir, `**/*.${config.shareExt || 'shared'}.*`).replace(/\\/g, '/'), + ...config.sharedDirs.map((i) => replaceWindowsPath(path.join(i, `**/*.*`))), + replaceWindowsPath(path.join(config.baseDir, `**/*.${config.shareExt || 'shared'}.*`)), ]); files.sort(); @@ -249,22 +362,21 @@ export async function syncSharedFiles() { await fsExtra.ensureDir(path.dirname(filePath)); let fromPath = path.relative( - `${ensureDir}/src/`.replace(/\\/g, '/'), + replaceWindowsPath(`${ensureDir}/src/`), filePath.replace('.ts', '') ); fromPath = path.normalize(fromPath); fromPath = fromPath.startsWith('.') ? fromPath : './' + fromPath; if (fromPath.indexOf('tsdk-types') < 0 && filePath.endsWith('.ts')) { - indexContentMap[file] = `export * from '${fromPath.replace(/\\/g, '/')}';\n`; + indexContentMap[file] = `export * from '${replaceWindowsPath(fromPath)}';\n`; } - return fsExtra.writeFile(filePath, content); + return fs.promises.writeFile(filePath, content); }) ); - const indexContent = files.map((file) => indexContentMap[file]).join('\n'); - await fsExtra.writeFile( + + const indexContent = Object.values(indexContentMap).join(''); + await fs.promises.writeFile( path.join(ensureDir, `src`, `shared-refs.ts`), `${comment}${indexContent}` ); - - console.log(symbols.success, `sync shared files`); } diff --git a/packages/tsdk/src/to-openapi.ts b/packages/tsdk/src/to-openapi.ts new file mode 100644 index 00000000..a0366267 --- /dev/null +++ b/packages/tsdk/src/to-openapi.ts @@ -0,0 +1,621 @@ +/* eslint-disable no-empty */ +import * as fs from 'fs'; +import * as path from 'path'; +import * as glob from 'fast-glob'; +import * as TJS from 'typescript-json-schema'; +import * as yaml from 'js-yaml'; +import * as ts from 'typescript'; +import { config, packageFolder, TSDKConfig } from './config'; +import { ignorePatterns } from './utils'; +import { logger } from './log'; + +// ========================================== +// 1. Helpers & Sanitization +// ========================================== + +function paramCase(input: string): string { + return input + .replace(/([a-z0-9])([A-Z])/g, '$1-$2') + .replace(/\s+/g, '-') + .toLowerCase(); +} + +function applyTransformPath(pathStr: string): string { + return `/${paramCase(pathStr)}`; +} + +/** + * Refactored Sanitization + * Allows for generics (MyType) to become readable (MyType_Sub) + * while strictly adhering to OpenAPI component name standards: ^[a-zA-Z0-9\.\-_]+$ + */ +function sanitizeSchemaName(name: string): string { + if (!name) return 'Unknown'; + let clean = name; + try { + clean = decodeURIComponent(clean); + } catch (e) {} + + // 1. Handle Generics specific formatting: "Wrapper" -> "Wrapper_User" + // Replace opening brackets with underscore + clean = clean.replace(/<|\[/g, '_'); + // Replace closing brackets with empty string (or underscore if preferred, but usually looks cleaner without) + clean = clean.replace(/>|\]/g, ''); + + // 2. Replace common separators (whitespace, commas, pipes) with underscore + clean = clean.replace(/[|&,:\s]+/g, '_'); + + // 3. Remove any remaining illegal characters (OpenAPI strict mode) + clean = clean.replace(/[^a-zA-Z0-9.\-_]/g, ''); + + // 4. Dedupe underscores and trim edges + clean = clean.replace(/_{2,}/g, '_').replace(/^_|_$/g, ''); + + return clean || 'UnnamedSchema'; +} + +/** + * Refactored Cleanup Logic + * 1. Doesn't blindly delete defaultProperties. + * 2. Uses a WeakMap to track recursion for circular references. + */ +function cleanSchemaRefs(schema: any, seen = new WeakMap()): any { + if (!schema || typeof schema !== 'object') return schema; + + // Return early if we've already processed this object instance to handle circular refs + if (seen.has(schema)) return seen.get(schema); + + // Clone extraction + const clean = Array.isArray(schema) ? [] : {}; + seen.set(schema, clean); // Register before recursing + + // Copy properties + if (Array.isArray(schema)) { + (clean as any[]).push(...schema.map((item) => cleanSchemaRefs(item, seen))); + return clean; + } + + // Object processing + for (const [key, value] of Object.entries(schema)) { + // 1. Remove Generator Artifacts (Only strictly invalid ones) + if (key === '$schema') continue; + + // NOTE: 'defaultProperties' is preserved per user request. + // If you need to map it to 'required' or 'default', do it here. + + // 2. Handle Ref Sanitization + if (key === '$ref' && typeof value === 'string') { + let refName = value.replace('#/definitions/', '').replace('#/components/schemas/', ''); + refName = sanitizeSchemaName(refName); + (clean as any)[key] = `#/components/schemas/${refName}`; + continue; + } + + // 3. Fix Date objects turning into complex schemas + if (key === '$ref' && (value as string).includes('Date')) { + return { type: 'string', format: 'date-time' }; + } + + // 4. Recurse + (clean as any)[key] = cleanSchemaRefs(value, seen); + } + + // 5. Flatten definitions (Move nested definitions to components later) + if ((clean as any).definitions) { + const newDefs: any = {}; + for (const [defName, defSchema] of Object.entries((clean as any).definitions)) { + const cleanName = sanitizeSchemaName(defName); + newDefs[cleanName] = cleanSchemaRefs(defSchema, seen); + } + // We attach these temporarily to be extracted later in registerSchema + (clean as any)._nestedDefinitions = newDefs; + delete (clean as any).definitions; + } + + return clean; +} + +// ========================================== +// 2. Discovery & Extraction +// ========================================== + +const baseDirRef = path.resolve(process.cwd(), config.packageDir, packageFolder); + +interface ExtractedAPIConfig { + name: string; + method: string; + path: string; + description?: string; + type?: string; // 'user', 'admin', 'common' + category?: string; // The UI category/tag + needAuth?: boolean; + paramsInUrl?: string; + requestTypeName?: string; + responseTypeName?: string; + sourceFile: string; + successStatus?: number; +} + +function discoverSourceFiles(config: TSDKConfig): string[] { + const baseDir = path.resolve(process.cwd(), config.packageDir, packageFolder); + if (!fs.existsSync(baseDir)) throw new Error(`Base directory not found: ${baseDir}`); + + const patterns: string[] = [`${baseDir}/**/*.ts`, `${baseDir}/**/*.tsx`]; + + if (config.sharedDirs) { + config.sharedDirs.forEach((dir) => { + const resolvedDir = path.resolve(process.cwd(), dir); + if (fs.existsSync(resolvedDir)) { + patterns.push(`${resolvedDir}/**/*.ts`); + patterns.push(`${resolvedDir}/**/*.tsx`); + } + }); + } + + const allFiles = new Set(); + patterns.forEach((pattern) => { + try { + const files = glob.sync(pattern, { + absolute: true, + ignore: [...ignorePatterns, '**/node_modules/**'], + onlyFiles: true, + }); + files.forEach((file) => allFiles.add(file)); + } catch (error) {} + }); + return Array.from(allFiles); +} + +function createTypeScriptProgram(files: string[]): ts.Program { + const tsconfigPath = ts.findConfigFile(baseDirRef, ts.sys.fileExists, 'tsconfig.json'); + let compilerOptions: ts.CompilerOptions = { + target: ts.ScriptTarget.ES2020, + module: ts.ModuleKind.CommonJS, + noEmit: true, + skipLibCheck: true, + }; + + if (tsconfigPath) { + const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile); + if (!configFile.error) { + const parsed = ts.parseJsonConfigFileContent( + configFile.config, + ts.sys, + path.dirname(tsconfigPath) + ); + compilerOptions = { ...compilerOptions, ...parsed.options, noEmit: true, skipLibCheck: true }; + } + } + const host = ts.createCompilerHost(compilerOptions); + return ts.createProgram(files, compilerOptions, host); +} + +function extractAPIConfigs(program: ts.Program, config: TSDKConfig): ExtractedAPIConfig[] { + const apiconfExt = `.${config.apiconfExt}.ts`; + const sourceFiles = program + .getSourceFiles() + .filter((sf) => sf.fileName.endsWith(apiconfExt) && !sf.fileName.includes('node_modules')); + + const configs: ExtractedAPIConfig[] = []; + for (const sourceFile of sourceFiles) { + configs.push(...extractFromSourceFile(sourceFile, config)); + } + return configs; +} + +function hasExportModifier(node: ts.Node): boolean { + if (!ts.canHaveModifiers(node)) return false; + const modifiers = ts.getModifiers(node); + return modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false; +} + +function extractFromSourceFile( + sourceFile: ts.SourceFile, + config: TSDKConfig +): ExtractedAPIConfig[] { + const configs: ExtractedAPIConfig[] = []; + const exportedTypes = new Map(); + const exportedInterfaces = new Map(); + + // 1. First Pass: Collect Types/Interfaces + ts.forEachChild(sourceFile, (node) => { + if (!hasExportModifier(node)) return; + if (ts.isTypeAliasDeclaration(node)) exportedTypes.set(node.name.getText(sourceFile), node); + else if (ts.isInterfaceDeclaration(node)) + exportedInterfaces.set(node.name.getText(sourceFile), node); + }); + + // 2. Second Pass: Find Config Objects + ts.forEachChild(sourceFile, (node) => { + if (!ts.isVariableStatement(node) || !hasExportModifier(node)) return; + + node.declarationList.declarations.forEach((decl) => { + if (!ts.isVariableDeclaration(decl) || !decl.initializer) return; + + const configName = decl.name.getText(sourceFile); + if ( + !configName.endsWith('Config') && + !configName.endsWith('API') && + !configName.endsWith('Route') + ) + return; + + const configObj = parseConfigObject(decl.initializer, config, sourceFile); + if (!configObj || !configObj.path) return; + + const baseName = configName + .replace(/Config$/, '') + .replace(/API$/, '') + .replace(/Route$/, ''); + + const patterns = generateTypeNamePatterns(baseName); + + // Find Request Type + let requestTypeName = patterns.request.find( + (p) => exportedTypes.has(p) || exportedInterfaces.has(p) + ); + if (requestTypeName && exportedTypes.has(requestTypeName)) { + const typeNode = exportedTypes.get(requestTypeName); + if ( + typeNode && + (typeNode.type.kind === ts.SyntaxKind.UndefinedKeyword || + typeNode.type.kind === ts.SyntaxKind.VoidKeyword) + ) { + requestTypeName = undefined; + } + } + + // Find Response Type + const responseTypeName = patterns.response.find( + (p) => exportedTypes.has(p) || exportedInterfaces.has(p) + ); + + configs.push({ + name: configName, + method: configObj.method || 'post', + path: configObj.path!, + description: configObj.description, + type: configObj.type, + category: configObj.category, // Pass category through + needAuth: configObj.needAuth, + paramsInUrl: configObj.paramsInUrl, + requestTypeName, + responseTypeName, + sourceFile: sourceFile.fileName, + successStatus: configObj.successStatus, + }); + }); + }); + return configs; +} + +function generateTypeNamePatterns(baseName: string) { + return { + request: [`${baseName}Req`], + response: [`${baseName}Res`], + }; +} + +/** + * FIXED: Properly separates type and category + */ +function parseConfigObject( + node: ts.Expression, + config: TSDKConfig, + sourceFile: ts.SourceFile +): Partial | null { + if (!ts.isObjectLiteralExpression(node)) return null; + const result: Partial = {}; + + node.properties.forEach((prop) => { + if (!ts.isPropertyAssignment(prop)) return; + const name = prop.name.getText(sourceFile); + const val = prop.initializer; + + if (name === 'successStatus') { + if (ts.isNumericLiteral(val)) result.successStatus = parseInt(val.text, 10); + } else if (name === 'method') result.method = extractStringValue(val, sourceFile); + // --- SEPARATED EXTRACTION START --- + else if (name === 'type') result.type = extractStringValue(val, sourceFile); + else if (name === 'category') result.category = extractStringValue(val, sourceFile); + // --- SEPARATED EXTRACTION END --- + else if (name === 'path') result.path = extractStringValue(val, sourceFile); + else if (name === 'description') result.description = extractStringValue(val, sourceFile); + else if (name === 'needAuth') result.needAuth = val.kind === ts.SyntaxKind.TrueKeyword; + else if (name === 'paramsInUrl') result.paramsInUrl = extractStringValue(val, sourceFile); + }); + return result; +} + +function extractStringValue(node: ts.Expression, sourceFile: ts.SourceFile): string | undefined { + if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) return node.text; + if (ts.isAsExpression(node)) return extractStringValue(node.expression, sourceFile); + if (ts.isCallExpression(node)) { + if ( + node.expression.getText(sourceFile).includes('transformPath') && + node.arguments.length > 0 + ) { + const rawValue = extractStringValue(node.arguments[0], sourceFile); + if (rawValue) return applyTransformPath(rawValue); + } + } + return undefined; +} + +// ========================================== +// 3. OpenAPI 3.1.0 Generation +// ========================================== + +function generateOpenAPISpec( + program: ts.Program, + configs: ExtractedAPIConfig[], + tsdkConfig: TSDKConfig +): any { + const spec = { + openapi: '3.1.0', + info: { + title: `${tsdkConfig.packageName} API`, + version: '1.0.0', + description: `Generated from tsdk source files in ${tsdkConfig.baseDir}`, + }, + servers: [{ url: '/api', description: 'API Server' }], + paths: {} as Record, + components: { + schemas: {} as Record, + securitySchemes: { bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' } }, + }, + tags: [] as Array<{ name: string; description?: string }>, + }; + + const generator = TJS.buildGenerator(program as any, { + required: true, + noExtraProps: false, + strictNullChecks: false, + ignoreErrors: true, + validationKeywords: [], + ref: true, + topRef: false, + defaultProps: true, + defaultNumberType: 'number', + titles: true, + }); + + if (!generator) logger.warn('Warning: Could not build schema generator.'); + + const registerSchema = (typeName: string) => { + if (!generator) return null; + const rawSchema = generator.getSchemaForSymbol(typeName); + if (!rawSchema) return null; + + const schema = cleanSchemaRefs(rawSchema); + + if (schema._nestedDefinitions) { + Object.entries(schema._nestedDefinitions).forEach(([key, val]) => { + const cleanKey = sanitizeSchemaName(key); + if (!spec.components.schemas[cleanKey]) { + spec.components.schemas[cleanKey] = val; + } + }); + delete schema._nestedDefinitions; + } + + const cleanTypeName = sanitizeSchemaName(typeName); + spec.components.schemas[cleanTypeName] = schema; + return cleanTypeName; + }; + + const resolveRef = (ref: string): any => { + const cleanRef = sanitizeSchemaName( + ref.replace('#/definitions/', '').replace('#/components/schemas/', '') + ); + return spec.components.schemas[cleanRef]; + }; + + const convertToParams = (schema: any): any[] => { + if (!schema) return []; + const params: any[] = []; + if (schema.properties) { + const required = schema.required || []; + Object.entries(schema.properties).forEach(([name, prop]: [string, any]) => { + params.push({ + name, + in: 'query', + required: required.includes(name), + schema: prop, + description: prop.description, + }); + }); + } + if (schema.allOf) schema.allOf.forEach((sub: any) => params.push(...convertToParams(sub))); + if (schema.$ref) { + const resolved = resolveRef(schema.$ref); + if (resolved) params.push(...convertToParams(resolved)); + } + return params; + }; + + // --- Main Loop Over Configs --- + for (const config of configs) { + const operationIdBase = config.name + .replace(/Config$/, '') + .replace(/API$/, '') + .replace(/Route$/, '') + .replace(/^([A-Z])/, (match) => match.toLowerCase()); + + let targetPrefixes: string[] = []; + if (config.type === 'common') { + targetPrefixes = ['user', 'admin']; + } else { + targetPrefixes = [config.type || 'user']; + } + + for (const prefix of targetPrefixes) { + const isCommon = config.type === 'common'; + const operationId = isCommon + ? `${prefix}${operationIdBase.charAt(0).toUpperCase() + operationIdBase.slice(1)}` + : operationIdBase; + + const rawPath = config.path.startsWith('/') ? config.path : `/${config.path}`; + let fullPath = rawPath; + if (!rawPath.startsWith(`/${prefix}/`)) { + fullPath = `/${prefix}${rawPath}`; + } + fullPath = fullPath.replace('//', '/'); + const pathKey = fullPath.replace(/:(\w+)/g, '{$1}'); + + if (!spec.paths[pathKey]) spec.paths[pathKey] = {}; + + // --- FIXED TAGS GENERATION --- + const operationTags = [prefix]; + if (config.category) { + operationTags.push(config.category); + } + // ----------------------------- + + const operation: any = { + operationId, + summary: config.description || config.name, + tags: operationTags, + responses: { + '200': { + description: 'Successful response', + content: { 'application/json': { schema: { type: 'object' } } }, + }, + '400': { description: 'Bad Request' }, + }, + }; + + if (config.needAuth) { + operation.responses['401'] = { description: 'Unauthorized' }; + operation.security = [{ bearerAuth: [] }]; + } + + const pathParams = (pathKey.match(/\{(\w+)\}/g) || []).map((m: string) => + m.replace(/[{}]/g, '') + ); + if (pathParams.length > 0) { + operation.parameters = pathParams.map((param: string) => ({ + name: param, + in: 'path', + required: true, + schema: { type: 'string' }, + })); + } + + const method = (config.method || 'post').toLowerCase(); + + if (config.requestTypeName) { + let schemaName = null; + try { + schemaName = registerSchema(config.requestTypeName); + } catch (e) { + logger.warn(`Failed to register request schema: ${config.requestTypeName}`); + } + + if (schemaName) { + if (method === 'get' || method === 'delete') { + if (!operation.parameters) operation.parameters = []; + const mainSchema = spec.components.schemas[schemaName]; + const queryParams = convertToParams(mainSchema); + operation.parameters.push(...queryParams); + } else { + let contentType = 'application/json'; + if ( + config.requestTypeName && + (config.requestTypeName.includes('Upload') || + config.requestTypeName.includes('Multipart')) + ) { + contentType = 'multipart/form-data'; + } + operation.requestBody = { + required: true, + content: { + [contentType]: { + schema: { $ref: `#/components/schemas/${schemaName}` }, + }, + }, + }; + } + } + } + + if (config.responseTypeName) { + let schemaName = null; + try { + schemaName = registerSchema(config.responseTypeName); + } catch (e) {} + if (schemaName) { + operation.responses['200'].content['application/json'].schema = { + $ref: `#/components/schemas/${schemaName}`, + }; + } + } + + spec.paths[pathKey][method] = operation; + } + } + + // Populate global tags list + const usedTags = new Set(); + Object.values(spec.paths).forEach((pathItem: any) => { + Object.values(pathItem).forEach((op: any) => { + if (op.tags) op.tags.forEach((t: string) => usedTags.add(t)); + }); + }); + spec.tags = Array.from(usedTags).map((t) => ({ name: t })); + + return spec; +} + +// ========================================== +// 4. Main Entry +// ========================================== + +async function main() { + try { + console.log('🚀 tsdk to OpenAPI Generator (v3.1.0) [Fixed]\n'); + logger.log('🔍 Configuration:'); + logger.log(` Package: ${config.packageName}`); + + const allFiles = discoverSourceFiles(config); + const apiconfFiles = allFiles.filter((f) => f.endsWith(`.${config.apiconfExt}.ts`)); + + if (apiconfFiles.length === 0) { + logger.error('No apiconf files found.'); + process.exit(1); + } + + logger.log('\n🔨 Creating TypeScript program...'); + const program = createTypeScriptProgram(allFiles); + + logger.log('\n📋 Extracting API configurations...'); + const configs = extractAPIConfigs(program, config); + + logger.log('\n📝 API Endpoints Preview:'); + configs.forEach((cfg) => { + const method = (cfg.method || 'post').toUpperCase(); + const cat = cfg.type || 'user'; + const tagStr = cfg.category ? `[${cfg.category}] ` : ''; + const displayPath = cfg.type === 'common' ? `/{user|admin}${cfg.path}` : `/${cat}${cfg.path}`; + logger.log(` ${method.padEnd(6)} ${displayPath.padEnd(35)} ${tagStr}${cfg.name}`); + }); + + logger.log('\n🏗️ Generating OpenAPI 3.1.0 specification...'); + const spec = generateOpenAPISpec(program, configs, config); + + logger.log('\n💾 Writing output files...'); + const yamlContent = yaml.dump(spec, { lineWidth: -1, noRefs: false, sortKeys: false }); + fs.writeFileSync(path.join(baseDirRef, 'openapi.yaml'), yamlContent, 'utf-8'); + fs.writeFileSync(path.join(baseDirRef, 'openapi.json'), JSON.stringify(spec, null, 2), 'utf-8'); + + console.log('\n✨ Generation complete! Files written to openapi.yaml and openapi.json\n'); + } catch (error) { + console.error(error); + process.exit(1); + } +} + +if (require.main === module) { + main(); +} +export { main, generateOpenAPISpec, extractAPIConfigs }; diff --git a/packages/tsdk/src/transform-import-path.ts b/packages/tsdk/src/transform-import-path.ts index 773db8a0..6d4e19d9 100644 --- a/packages/tsdk/src/transform-import-path.ts +++ b/packages/tsdk/src/transform-import-path.ts @@ -1,23 +1,23 @@ -import fsExtra from 'fs-extra'; +import fs from 'fs'; import path from 'path'; import { aliasToRelativePath } from './alias'; import { config, ensureDir, getDeps, tsconfig } from './config'; import symbols from './symbols'; import { transformTypeormEntity } from './transform-typeorm-entity'; +import { logger } from './log'; /** Handling import path */ export function processImportPath(_importString: string, _filePath: string) { let importString = _importString; - const commentString = importString.slice(0, 2); + const commentString = importString.trim().slice(0, 2); const hasComment = commentString === '//' || commentString === '/*'; - const arr = _filePath.split('/'); - arr.pop(); - const filePath = arr.join('/'); + const filePath = path.dirname(_filePath); const isDoubleSemicolon = importString.indexOf('from "') > -1; - const matched = importString.match(isDoubleSemicolon ? /from "(.*)";/ : /from '(.*)';/); + const matched = importString.match(isDoubleSemicolon ? /from "(.*)";?/ : /from '(.*)';?/); + if (matched) { // path alias check and replace path const fromPath = aliasToRelativePath({ @@ -27,17 +27,21 @@ export function processImportPath(_importString: string, _filePath: string) { filePath: _filePath, })[0]; - importString = _importString.replace(matched[1], fromPath); + importString = importString.replace(matched[1], fromPath); - const firstLevelPath = fromPath.split('/')[0]; + const arr = fromPath.split('/'); + let firstLevelPath = arr[0]; if (firstLevelPath[0] !== '.') { + if (firstLevelPath.startsWith('@')) { + firstLevelPath = arr.slice(0, 2).join('/'); + } const isShareLib = !!getDeps()[firstLevelPath]; if (isShareLib) { return importString; } else { if (!hasComment) { - console.warn( + logger.warn( symbols.space, symbols.warning, `Warn: '${firstLevelPath}' not support. If you confirm '${firstLevelPath}' will use in the both side, please add this lib to the '${ensureDir}/package.json' dependencies` @@ -52,19 +56,16 @@ export function processImportPath(_importString: string, _filePath: string) { importString.indexOf(`.${config.apiconfExt}`) > -1 || importString.indexOf(`.${config.shareExt}`) > -1; - // if (isEntityOrApiconf) { - // console.log(_importString); - // } - if (!hasComment) { const findDir = isEntityOrApiconf || - config.sharedDirs.find((dir) => { + config.sharedDirs.some((dir) => { const currentShareDir = path.normalize(dir); return finalPath.indexOf(currentShareDir) === 0; }); + if (!findDir) { - console.log( + logger.error( symbols.space, symbols.error, `Error: Don't import file from outside of shared dirs: '${importString}'`, @@ -73,14 +74,14 @@ export function processImportPath(_importString: string, _filePath: string) { } } } else { - console.warn(symbols.space, symbols.warning, `No match: ${importString}`); + logger.warn(symbols.space, symbols.warning, `No match: ${importString}`); } return importString; } /** parse import alias path and transform */ export async function transformImportPath(filePath: string, isEntity?: boolean) { - let res = await fsExtra.readFile(filePath, 'utf-8'); + let res = await fs.promises.readFile(filePath, 'utf-8'); if (isEntity) { res = config.entityLibName?.includes('typeorm') ? transformTypeormEntity(res, 'typeorm') : res; @@ -91,29 +92,67 @@ export async function transformImportPath(filePath: string, isEntity?: boolean) const imports: string[] = []; const otherContent: string[] = []; let importArr: string[] = []; - result.forEach((i) => { - const inlineImport = i.indexOf("import '") > -1 || i.indexOf('import "') > -1; - const hasImport = i.indexOf('import ') > -1; - const hasFrom = i.indexOf(' from "') > -1 || i.indexOf(" from '") > -1; - - if (inlineImport) { - imports.push(i); - } else if (hasImport && hasFrom) { - imports.push(processImportPath(i, filePath)); - } else if (hasImport) { - importArr.push(i); - } else if (hasFrom) { - importArr.push(i); - imports.push(processImportPath(importArr.join(''), filePath)); + let inMultilineComment = false; + + result.forEach((line) => { + const trimmedLine = line.trim(); + + // Track multi-line comments + if (trimmedLine.startsWith('/*')) { + inMultilineComment = true; + } + if (inMultilineComment) { + otherContent.push(line); + if (trimmedLine.endsWith('*/') || line.indexOf('*/') > -1) { + inMultilineComment = false; + } + return; + } + + // Skip single-line comments and empty lines when checking for imports + if (trimmedLine.startsWith('//') || trimmedLine.startsWith('*') || trimmedLine === '') { + if (importArr.length > 0) { + importArr.push(line); + } else { + otherContent.push(line); + } + return; + } + + const inlineImport = line.indexOf("import '") > -1 || line.indexOf('import "') > -1; + const hasImport = line.indexOf('import ') > -1; + const hasFrom = line.indexOf(' from "') > -1 || line.indexOf(" from '") > -1; + + // Only process as import if line actually starts with 'import' (after trimming) + const isActualImport = trimmedLine.startsWith('import '); + + if (inlineImport && isActualImport) { + imports.push(line); + } else if (hasImport && hasFrom && isActualImport) { + imports.push(processImportPath(line, filePath)); + } else if (hasImport && isActualImport) { + importArr.push(line); + } else if (hasFrom && importArr.length > 0) { + importArr.push(line); + imports.push(processImportPath(importArr.join('\n'), filePath)); importArr = []; } else if (importArr.length > 0) { - importArr.push(i); + importArr.push(line); } else { - otherContent.push(i); + otherContent.push(line); } }); - const fileContent = imports.join('\n') + otherContent.join('\n'); + // Handle any remaining import statements that weren't processed + if (importArr.length > 0) { + imports.push(processImportPath(importArr.join('\n'), filePath)); + } + + // Ensure proper line breaks between imports and other content + const fileContent = + imports.length > 0 && otherContent.length > 0 + ? imports.join('\n') + '\n' + otherContent.join('\n') + : imports.join('\n') + otherContent.join('\n'); return fileContent; } diff --git a/packages/tsdk/src/transform-typeorm-entity.ts b/packages/tsdk/src/transform-typeorm-entity.ts index 58c9ac9a..baaa31f4 100644 --- a/packages/tsdk/src/transform-typeorm-entity.ts +++ b/packages/tsdk/src/transform-typeorm-entity.ts @@ -2,27 +2,50 @@ export function transformTypeormEntity(_fileContent: string, entityLibName: stri let fileContent = _fileContent; // remove import entityLibName(like `typeorm`) and remove entityLibName(like `typeorm`) decorators @xxx() / @xxx({.*}) / @xxx({ \n\n }) - const result = fileContent.split('\n'); + const lines = fileContent.split('\n'); const imports: string[] = []; const otherContent: string[] = []; let importArr: string[] = []; let decoratorArr: string[] = []; - - result.forEach((i) => { - const hasImport = i.indexOf('import ') > -1; + let multipleLineCommentStartIdx = -1, + multipleLineCommentStartLineIdx = Infinity; + lines.forEach((i, lineIdx) => { + const importIdx = i.indexOf('import '); + const hasImport = importIdx > -1; const fromIdx = i.indexOf(' from'); const commentIdx = i.indexOf('//'); const commentIdx2 = i.indexOf('/*'); const commentIdx3 = i.indexOf('*/'); + if (commentIdx2 > -1 && multipleLineCommentStartIdx === -1) { + multipleLineCommentStartIdx = commentIdx2; + multipleLineCommentStartLineIdx = lineIdx; + } + if (commentIdx3 > -1) { + multipleLineCommentStartIdx = -1; + multipleLineCommentStartLineIdx = Infinity; + } - const isComment = + let isFromInComment = (commentIdx > -1 && commentIdx < fromIdx) || (commentIdx2 > -1 && commentIdx2 < fromIdx) || (commentIdx3 > -1 && commentIdx3 > fromIdx); - const hasFrom = fromIdx > -1 && !isComment && (i[fromIdx + 5] || '').trim() === ''; + if (!isFromInComment && lineIdx > multipleLineCommentStartLineIdx) { + isFromInComment = true; + } + + let isImportInComment = + (commentIdx > -1 && commentIdx < importIdx) || + (commentIdx2 > -1 && commentIdx2 < importIdx) || + (commentIdx3 > -1 && commentIdx3 > importIdx); + + if (!isImportInComment && lineIdx > multipleLineCommentStartLineIdx) { + isImportInComment = true; + } + + const hasFrom = fromIdx > -1 && !isFromInComment && (i[fromIdx + 5] || '').trim() === ''; const hasTypeormFrom = hasFrom && (i.indexOf(` '${entityLibName}`) > -1 || i.indexOf(` "${entityLibName}`) > -1); @@ -44,7 +67,7 @@ export function transformTypeormEntity(_fileContent: string, entityLibName: stri // ignore entityLibName(like `typeorm`) } else if (hasImport && hasFrom) { imports.push(i); - } else if (hasImport) { + } else if (hasImport && !isImportInComment) { importArr.push(i); } else if (hasTypeormFrom) { // ignore entityLibName(like `typeorm`) diff --git a/packages/tsdk/src/utils.ts b/packages/tsdk/src/utils.ts new file mode 100644 index 00000000..eecc653d --- /dev/null +++ b/packages/tsdk/src/utils.ts @@ -0,0 +1,80 @@ +import { config } from './config'; + +const isWindows = process.platform === 'win32'; +export function replaceWindowsPath(path: string, isWin = isWindows) { + if (!isWin) return path; + return path.replace(/\\/g, '/'); +} + +/** + * Helper function to measure execution time of async tasks + * @param task The task name to be displayed + * @param fn The async function to execute and measure + * @returns The result of the executed function + */ +export const measureExecutionTime = async ( + task: string, + fn: () => Promise, + indent = '' +): Promise => { + const startTime = Date.now(); + + try { + if (config.logVerbose !== false) console.log(`${indent}⏰ ${task}`); + const result = await fn(); + const endTime = Date.now(); + const duration = (endTime - startTime).toFixed(2); + if (config.logVerbose !== false) console.log(`${indent}✅ ${task} ${duration}ms`); + return result; + } catch (error) { + const endTime = Date.now(); + const duration = endTime - startTime; + if (config.logVerbose !== false) console.log(`${indent}❌ ${task} ${duration}ms`); + throw error; + } +}; + +export const ignorePatterns = [ + '**/node_modules/**', + '**/*.d.ts', + '**/*.test.ts', + '**/*.test.tsx', + '**/*.spec.ts', + '**/*.spec.tsx', + '**/dist/**', + '**/build/**', + `**/${config.packageDir}/**`, // Ignore generated SDK +]; + +type ParsedArgs = Record; + +export function parseArgv(argv: string[]): ParsedArgs { + const result: ParsedArgs = {}; + + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + + if (arg.startsWith('--')) { + const key = arg.slice(2); + const next = argv[i + 1]; + // if next is missing or starts with -, treat as boolean flag + if (!next || next.startsWith('-')) { + result[key] = true; + } else { + result[key] = next; + i++; + } + } else if (arg.startsWith('-')) { + const key = arg.slice(1); + const next = argv[i + 1]; + if (!next || next.startsWith('-')) { + result[key] = true; + } else { + result[key] = next; + i++; + } + } + } + + return result; +} diff --git a/packages/tsdk/tests/alias.test.ts b/packages/tsdk/tests/alias.test.ts new file mode 100644 index 00000000..23692dd9 --- /dev/null +++ b/packages/tsdk/tests/alias.test.ts @@ -0,0 +1,175 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { aliasToRelativePath } from '../src/alias'; + +describe('aliasToRelativePath', () => { + const mockCwd = '/project'; + + beforeEach(() => { + vi.spyOn(process, 'cwd').mockReturnValue(mockCwd); + }); + + it('should return the original import if no alias matches', () => { + const result = aliasToRelativePath({ + cwd: './', + filePath: '/project/src/components/Button.tsx', + imports: ['react', 'react-dom'], + config: { + baseUrl: './src', + paths: { + '@components/*': ['components/*'], + }, + }, + }); + + expect(result).toEqual(['react', 'react-dom']); + }); + + it('should transform aliased imports to relative paths', () => { + const result = aliasToRelativePath({ + cwd: './', + filePath: '/project/src/pages/Home.tsx', + imports: ['@components/Button', '@utils/format'], + config: { + baseUrl: './src', + paths: { + '@components/*': ['components/*'], + '@utils/*': ['utils/*'], + }, + }, + }); + + expect(result).toEqual(['../components/Button', '../utils/format']); + }); + + it('should handle imports with nested paths after the alias', () => { + const result = aliasToRelativePath({ + cwd: './', + filePath: '/project/src/pages/Home.tsx', + imports: ['@components/forms/Input', '@utils/date/format'], + config: { + baseUrl: './src', + paths: { + '@components/*': ['components/*'], + '@utils/*': ['utils/*'], + }, + }, + }); + + expect(result).toEqual(['../components/forms/Input', '../utils/date/format']); + }); + + it('should calculate correct relative paths from different directories', () => { + const result = aliasToRelativePath({ + cwd: './', + filePath: '/project/src/features/auth/Login.tsx', + imports: ['@components/Button', '@utils/auth'], + config: { + baseUrl: './src', + paths: { + '@components/*': ['components/*'], + '@utils/*': ['utils/*'], + }, + }, + }); + + expect(result).toEqual(['../../components/Button', '../../utils/auth']); + }); + + it('should handle aliases without wildcards', () => { + const result = aliasToRelativePath({ + cwd: './', + filePath: '/project/src/pages/Home.tsx', + imports: ['@api/client', '@constants'], + config: { + baseUrl: './src', + paths: { + '@api/client': ['services/api/client.ts'], + '@constants': ['constants/index.ts'], + }, + }, + }); + + expect(result).toEqual(['../services/api/client.ts', '../constants/index.ts']); + }); + + it('should use default baseUrl when not provided', () => { + const result = aliasToRelativePath({ + cwd: './', + filePath: '/project/src/components/Button.tsx', + imports: ['@utils/format'], + config: { + paths: { + '@utils/*': ['src/utils/*'], + }, + }, + }); + + expect(result).toEqual(['../utils/format']); + }); + + it('should handle empty paths in config', () => { + const result = aliasToRelativePath({ + cwd: './', + filePath: '/project/src/components/Button.tsx', + imports: ['react', '@utils/format'], + config: { + baseUrl: './src', + paths: { + '@utils/*': [], + }, + }, + }); + + // Should return original import if the paths array is empty + expect(result).toEqual(['react', '@utils/format']); + }); + + it('should handle custom cwd parameter', () => { + const result = aliasToRelativePath({ + filePath: '/custom/project/src/pages/Home.tsx', + imports: ['@components/Button'], + config: { + baseUrl: './src', + paths: { + '@components/*': ['components/*'], + }, + }, + cwd: '/custom/project', + }); + + expect(result).toEqual(['../components/Button']); + }); + + it('should handle absolute paths in baseUrl', () => { + const result = aliasToRelativePath({ + cwd: './', + filePath: '/project/src/pages/Home.tsx', + imports: ['@components/Button'], + config: { + baseUrl: '/project/src', + paths: { + '@components/*': ['components/*'], + }, + }, + }); + + expect(result).toEqual(['../components/Button']); + }); + + it('should correctly handle multiple possible paths for an alias', () => { + const result = aliasToRelativePath({ + cwd: './', + filePath: '/project/src/pages/Home.tsx', + imports: ['@shared/Button'], + config: { + baseUrl: './src', + paths: { + '@shared/*': ['components/shared/*', 'shared/*'], + }, + }, + }); + + // Should use the first path in the array + expect(result).toEqual(['../components/shared/Button']); + }); +}); diff --git a/packages/tsdk/tests/cli.bun.empty-project.test.ts b/packages/tsdk/tests/cli.bun.empty-project.test.ts new file mode 100644 index 00000000..fbaee4c8 --- /dev/null +++ b/packages/tsdk/tests/cli.bun.empty-project.test.ts @@ -0,0 +1,64 @@ +import fsExtra from 'fs-extra'; +import { execSync } from 'child_process'; +import { expect, it, describe, beforeEach, afterEach } from 'vitest'; + +beforeEach(async () => { + // create folder test-project-bun + // run npm init in test-project-bun and create tsconfig.json + // Run bin/tsdk.js --sync should work exactly + // run bin/tsdk.js --no-zod --no-vscode should work + await fsExtra.remove('../../test-project-bun'); + await fsExtra.ensureDir('../../test-project-bun'); + execSync('bun init -y', { cwd: '../../test-project-bun', stdio: 'inherit' }); +}); + +afterEach(async () => { + await fsExtra.remove('../../test-project-bun'); +}); + +describe('tsdk cli bun tests in empty project', () => { + it('Run `bin/tsdk.js --sync` should work exactly', async () => { + try { + execSync('node ../packages/tsdk/bin/tsdk.js --sync', { + cwd: '../../test-project-bun', + stdio: 'pipe', + encoding: 'utf-8', + }); + } catch (error) { + console.error('Command failed:', error.stdout || error.stderr); + throw error; + } + + const snippetsShouldExists = await fsExtra.exists( + '../../test-project-bun/.vscode/tsdk.code-snippets' + ); + expect(snippetsShouldExists).toBe(true); + + const zodShouldExists = + JSON.parse(await fsExtra.readFile('../../test-project-bun/package.json', 'utf-8')) + .dependencies.zod !== undefined; + expect(zodShouldExists).toBe(true); + }); + + it('Run `bin/tsdk.js --sync --no-zod --no-vscode` should work exactly', async () => { + try { + execSync('node ../packages/tsdk/bin/tsdk.js --sync --no-zod --no-vscode', { + cwd: '../../test-project-bun', + stdio: 'pipe', + encoding: 'utf-8', + }); + } catch (error) { + console.error('Command failed:', error.stdout || error.stderr); + throw error; + } + const snippetsShouldExists = await fsExtra.exists( + '../../test-project-bun/.vscode/tsdk.code-snippets' + ); + expect(snippetsShouldExists).toBe(false); + + const zodShouldExists = + JSON.parse(await fsExtra.readFile('../../test-project-bun/package.json', 'utf-8')) + ?.dependencies?.zod !== undefined; + expect(zodShouldExists).toBe(false); + }); +}); diff --git a/packages/tsdk/tests/cli.empty-project.test.ts b/packages/tsdk/tests/cli.empty-project.test.ts new file mode 100644 index 00000000..17e2f5b9 --- /dev/null +++ b/packages/tsdk/tests/cli.empty-project.test.ts @@ -0,0 +1,73 @@ +import fsExtra from 'fs-extra'; +import { execSync } from 'child_process'; +import { expect, it, describe, beforeEach, afterEach } from 'vitest'; + +describe('tsdk cli tests in empty project', () => { + beforeEach(async () => { + // Ensure clean slate + await fsExtra.remove('../../test-project'); + await fsExtra.ensureDir('../../test-project'); + + // Create basic project structure + await fsExtra.writeJson('../../test-project/tsconfig.json', {}); + await fsExtra.writeFile('../../test-project/tsconfig.json', '{}'); + execSync('npm init -y', { cwd: '../../test-project', stdio: 'inherit' }); + }); + + afterEach(async () => { + // Clean up with error suppression for robustness + try { + await fsExtra.remove('../../test-project'); + } catch (error) { + console.warn('Cleanup warning:', error); + } + }); + + it('should work with --sync flag (creates vscode snippets and installs zod)', async () => { + try { + execSync('node ../packages/tsdk/bin/tsdk.js --sync', { + cwd: '../../test-project', + stdio: 'pipe', + encoding: 'utf-8', + }); + } catch (error) { + console.error('Command failed:', error.stdout || error.stderr); + throw error; + } + + // Check VSCode snippets exist + const snippetsExists = await fsExtra.pathExists( + '../../test-project/.vscode/tsdk.code-snippets' + ); + expect(snippetsExists).toBe(true); + + // Check zod dependency exists + const packageJson = await fsExtra.readJson('../../test-project/package.json'); + const zodExists = packageJson.dependencies?.zod !== undefined; + expect(zodExists).toBe(true); + }); + + it('should work with --sync --no-zod --no-vscode flags', async () => { + try { + execSync('node ../packages/tsdk/bin/tsdk.js --sync --no-zod --no-vscode', { + cwd: '../../test-project', + stdio: 'pipe', + encoding: 'utf-8', + }); + } catch (error) { + console.error('Command failed:', error.stdout || error.stderr); + throw error; + } + + // Check VSCode snippets do NOT exist + const snippetsExists = await fsExtra.pathExists( + '../../test-project/.vscode/tsdk.code-snippets' + ); + expect(snippetsExists).toBe(false); + + // Check zod dependency does NOT exist + const packageJson = await fsExtra.readJson('../../test-project/package.json'); + const zodExists = packageJson.dependencies?.zod !== undefined; + expect(zodExists).toBe(false); + }); +}); diff --git a/packages/tsdk/tests/cli.test.ts b/packages/tsdk/tests/cli.test.ts new file mode 100644 index 00000000..9b439eab --- /dev/null +++ b/packages/tsdk/tests/cli.test.ts @@ -0,0 +1,111 @@ +import fsExtra from 'fs-extra'; +import { execSync } from 'child_process'; +import { expect, it, describe, beforeEach } from 'vitest'; + +beforeEach(async () => { + // delete root/.vscode/tsdk.code-snippets + // delete root/examples/server/fe-sdk-demo + // rename root/examples/server/tsdk.config.js to root/examples/server/temp.tsdk.config.js + // run `tsdk --init` + // check root/.vscode/tsdk.code-snippets and it should exists + // check root/examples/server/tsdk.config.js and it should exists + // check root/examples/server/fe-sdk-demo/package.json should exists + // run `tsdk --sync` should work + + await Promise.all( + ['../../.vscode/tsdk.code-snippets', '../../examples/server/fe-sdk-demo'].map((i) => + fsExtra.remove(i) + ) + ); + const result = await Promise.all( + ['../../.vscode/tsdk.code-snippets', '../../examples/server/fe-sdk-demo'].map((i) => + fsExtra.exists(i) + ) + ); + expect(result[0]).toBe(false); + expect(result[1]).toBe(false); + const isTempConfigExists = await fsExtra.exists('../../examples/server/temp.tsdk.config.js'); + if (isTempConfigExists) { + await fsExtra.remove('../../examples/server/tsdk.config.js'); + await fsExtra.move( + '../../examples/server/temp.tsdk.config.js', + '../../examples/server/tsdk.config.js' + ); + } + await fsExtra.move( + '../../examples/server/tsdk.config.js', + '../../examples/server/temp.tsdk.config.js' + ); + + const isTsdkConfigExists = await fsExtra.exists('../../examples/server/tsdk.config.js'); + expect(isTsdkConfigExists).toBe(false); +}); + +describe('tsdk cli tests', () => { + it('`tsdk --sync --no-vscode` should work', async () => { + // restore + await fsExtra.move( + '../../examples/server/temp.tsdk.config.js', + '../../examples/server/tsdk.config.js', + { overwrite: true } + ); + + execSync('node ../../packages/tsdk/bin/tsdk.js --sync --no-vscode', { + cwd: '../../examples/server', + stdio: 'pipe', + encoding: 'utf-8', + }); + + const isTsdkConfigExists = await fsExtra.exists('../../examples/server/tsdk.config.js'); + expect(isTsdkConfigExists).toBe(true); + + const isVscodeSnippetExists = await fsExtra.exists('../../.vscode/tsdk.code-snippets'); + expect(isVscodeSnippetExists).toBe(false); + }); + + it('`tsdk --init --no-vscode` should work', async () => { + execSync('node ../../packages/tsdk/bin/tsdk.js --init --no-vscode', { + cwd: '../../examples/server', + stdio: 'pipe', + encoding: 'utf-8', + }); + + const isTsdkConfigExists = await fsExtra.exists('../../examples/server/tsdk.config.js'); + expect(isTsdkConfigExists).toBe(true); + + const isVscodeSnippetExists = await fsExtra.exists('../../.vscode/tsdk.code-snippets'); + expect(isVscodeSnippetExists).toBe(false); + }); + + it('`tsdk --init` and `tsdk --sync` should work', async () => { + execSync('node ../../packages/tsdk/bin/tsdk.js --init', { + cwd: '../../examples/server', + stdio: 'pipe', + encoding: 'utf-8', + }); + // restore + await fsExtra.move( + '../../examples/server/temp.tsdk.config.js', + '../../examples/server/tsdk.config.js', + { overwrite: true } + ); + // + execSync('node ../../packages/tsdk/bin/tsdk.js --init', { + cwd: '../../examples/server', + stdio: 'pipe', + encoding: 'utf-8', + }); + + const isVscodeSnippetExists = await fsExtra.exists('../../.vscode/tsdk.code-snippets'); + expect(isVscodeSnippetExists).toBe(false); + + execSync('node ../../packages/tsdk/bin/tsdk.js --sync', { + cwd: '../../examples/server', + stdio: 'pipe', + encoding: 'utf-8', + }); + + const isVscodeSnippetExists2 = await fsExtra.exists('../../.vscode/tsdk.code-snippets'); + expect(isVscodeSnippetExists2).toBe(true); + }); +}); diff --git a/packages/tsdk/tests/extract-apiconfs.test.ts b/packages/tsdk/tests/extract-apiconfs.test.ts new file mode 100644 index 00000000..0c7f6362 --- /dev/null +++ b/packages/tsdk/tests/extract-apiconfs.test.ts @@ -0,0 +1,504 @@ +import { describe, it, expect, test } from 'vitest'; +import { extractApiconfs } from '../src/extract-apiconfs'; + +const sampleInput = ` +import type { Todo } from '../Todo.entity'; +import { addTodoSchema } from './TodoSchema.shared'; + +import { InsertResult, transformPath, APIConfig } from '@/src/tsdk-shared/helpers'; + +/** hello */ +export const AddTodoConfig: APIConfig = { + type: 'user', + a: '', + /* +}*/ + path: transformPath('AddTodo'), + method: 'post', // {} + // description: 'add todo', // } + category: 'todo', + schema: addTodoSchema, +}; + +export type AddTodoReq = Omit; + +export type AddTodoRes = InsertResult; +`; + +const sampleInput2 = ` +import type { Todo } from '../Todo.entity'; +import { addTodoSchema } from './TodoSchema.shared'; + +import { InsertResult, transformPath, APIConfig } from '@/src/tsdk-shared/helpers'; + +/** hello */ +export const AddTodoConfig: APIConfig = { + type: 'user', + path: '/add-todo', + method: 'post', // {} + // description: 'add todo', // } + category: 'todo', + schema: addTodoSchema, +}; + +export type AddTodoReq = Omit; + +export type AddTodoRes = InsertResult; +`; + +describe('extractApiconfs simple tests', () => { + test('parses a simple API config with all properties', () => { + const result = extractApiconfs(sampleInput); + + expect(result).toEqual([ + { + name: 'AddTodo', + type: 'user', + path: "transformPath('AddTodo')", + method: 'post', + description: 'hello', + category: '', + }, + ]); + }); + + test('parses a simple API config with all properties 2', () => { + const result = extractApiconfs(sampleInput2); + + expect(result).toEqual([ + { + name: 'AddTodo', + type: 'user', + path: '/add-todo', + method: 'post', + description: 'hello', + category: '', + }, + ]); + }); +}); + +describe('extractApiconfs', () => { + it('extracts basic API configuration', () => { + const content = ` +// Add todo item +export const AddTodoConfig: APIConfig = { + method: 'POST', + path: '/api/todos', + type: 'mutation' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0]).toEqual({ + name: 'AddTodo', + method: 'POST', + path: '/api/todos', + type: 'mutation', + description: 'Add todo item', + category: '', + }); + }); + + it('handles multiline comments', () => { + const content = ` +/* + * Get user list + * Supports pagination + */ +export const GetUsersConfig = { + method: 'GET', + path: '/api/users' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].description).toContain('Get user list'); + expect(result[0].description).toContain('Supports pagination'); + }); + + it('handles inline multiline comments', () => { + const content = ` +/* Delete user */ +export const DeleteUserConfig = { + method: 'DELETE', + path: '/api/users/:id' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].description).toBe('Delete user'); + expect(result[0].name).toBe('DeleteUser'); + }); + + it('extracts transformPath expressions', () => { + const content = ` +export const GetProjectConfig = { + method: 'GET', + path: transformPath('/api/projects/:id'), + type: 'query' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].path).toBe("transformPath('/api/projects/:id')"); + }); + + it('handles nested object structures', () => { + const content = ` +export const ComplexConfig = { + method: 'POST', + path: '/api/complex', + options: { + headers: { + 'Content-Type': 'application/json' + } + }, + type: 'mutation' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].name).toBe('Complex'); + expect(result[0].method).toBe('POST'); + expect(result[0].type).toBe('mutation'); + }); + + it('ignores lowercase-starting configs', () => { + const content = ` +export const validConfig = { + method: 'GET', + path: '/api/valid' +} + +export const InvalidConfig = { + method: 'POST', + path: '/api/invalid' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].name).toBe('Invalid'); + }); + + it('handles multiple consecutive configs', () => { + const content = ` +// Create task +export const CreateTaskConfig = { + method: 'POST', + path: '/api/tasks' +} + +// Update task +export const UpdateTaskConfig = { + method: 'PUT', + path: '/api/tasks/:id' +} + +// Delete task +export const DeleteTaskConfig = { + method: 'DELETE', + path: '/api/tasks/:id' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(3); + expect(result[0].name).toBe('CreateTask'); + expect(result[0].description).toBe('Create task'); + expect(result[1].name).toBe('UpdateTask'); + expect(result[1].description).toBe('Update task'); + expect(result[2].name).toBe('DeleteTask'); + expect(result[2].description).toBe('Delete task'); + }); + + it('prevents comment misattribution', () => { + const content = ` +// This is an unrelated comment +const someVariable = 'value'; + +// Get data +export const GetDataConfig = { + method: 'GET', + path: '/api/data' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].description).toBe('Get data'); + expect(result[0].description).not.toContain('unrelated comment'); + }); + + it('handles comments inside config objects', () => { + const content = ` +export const ConfigWithCommentsConfig = { + method: 'GET', + /* Path comment */ + path: '/api/test', + // Type comment - this line will be skipped + type: 'query' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].path).toBe('/api/test'); + expect(result[0].type).toBe('query'); + }); + + it('handles configs without type annotation', () => { + const content = ` +export const SimpleConfig = { + method: 'GET', + path: '/api/simple' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].name).toBe('Simple'); + }); + + it('handles empty file', () => { + const result = extractApiconfs(''); + expect(result).toEqual([]); + }); + + it('handles file with only comments', () => { + const content = ` +// Only comments +/* No configs */ +`; + const result = extractApiconfs(content); + expect(result).toEqual([]); + }); + + it('handles various quote types in paths', () => { + const content = ` +export const SingleQuoteConfig = { + method: 'GET', + path: '/api/single' +} + +export const DoubleQuoteConfig = { + method: 'GET', + path: "/api/double" +} + +export const BacktickConfig = { + method: 'GET', + path: \`/api/backtick\` +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(3); + expect(result[0].path).toBe('/api/single'); + expect(result[1].path).toBe('/api/double'); + expect(result[2].path).toBe('/api/backtick'); + }); + + it('handles deeply nested structures', () => { + const content = ` +export const NestedConfig = { + method: 'POST', + path: '/api/nested', + metadata: { + auth: { + required: true, + roles: ['admin', 'user'] + }, + cache: { + enabled: false + } + }, + type: 'mutation' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].method).toBe('POST'); + expect(result[0].type).toBe('mutation'); + }); + + it('extracts isGet property when present', () => { + const content = ` +export const GetWithIsGetConfig = { + isGet: true, + path: '/api/get-test', + type: 'query' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0]).toHaveProperty('isGet', 'true'); + }); + + it('handles empty config object', () => { + const content = ` +export const EmptyConfig = { +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].name).toBe('Empty'); + expect(result[0].method).toBe(''); + expect(result[0].path).toBe(''); + }); + + it('handles config with trailing comma', () => { + const content = ` +export const TrailingCommaConfig = { + method: 'GET', + path: '/api/test', + type: 'query', +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].type).toBe('query'); + }); + + it('handles multiple levels of array nesting', () => { + const content = ` +export const ArrayNestedConfig = { + method: 'POST', + path: '/api/array', + data: { + items: [ + { id: 1, name: 'test' }, + { id: 2, name: 'test2' } + ] + }, + type: 'mutation' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].method).toBe('POST'); + expect(result[0].path).toBe('/api/array'); + }); + + it('handles indented configs', () => { + const content = ` + // Indented comment + export const IndentedConfig = { + method: 'GET', + path: '/api/indented', + type: 'query' + } +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].name).toBe('Indented'); + expect(result[0].description).toBe('Indented comment'); + }); + + it('handles config with no fields', () => { + const content = ` +export const NoFieldsConfig = { + options: { + retry: true + } +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].name).toBe('NoFields'); + expect(result[0].method).toBe(''); + expect(result[0].path).toBe(''); + expect(result[0].type).toBe(''); + }); + + it('handles consecutive multiline comments', () => { + const content = ` +/* First comment */ +/* Second comment */ +export const MultiCommentConfig = { + method: 'GET', + path: '/api/multi' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].description).toContain('First comment'); + expect(result[0].description).toContain('Second comment'); + }); + + it('extracts config name ending with Config', () => { + const content = ` +export const UserApiConfig = { + method: 'GET', + path: '/api/users' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].name).toBe('UserApi'); + }); + + it('handles mixed empty lines and comments', () => { + const content = ` + +// First line + +// Second line + +export const MixedEmptyConfig = { + method: 'POST', + path: '/api/mixed' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].description).toContain('First line'); + expect(result[0].description).toContain('Second line'); + }); + + it('handles isGet with boolean false', () => { + const content = ` +export const IsGetFalseConfig = { + isGet: false, + method: 'POST', + path: '/api/post' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].isGet).toBe('false'); + }); + + it('ignores non-Config exports', () => { + const content = ` +export const SomeConstant = 'value'; +export const AnotherObject = { key: 'value' }; + +export const RealConfig = { + method: 'GET', + path: '/api/real' +} +`; + const result = extractApiconfs(content); + + expect(result).toHaveLength(1); + expect(result[0].name).toBe('Real'); + }); +}); diff --git a/packages/tsdk/tests/get-npm-command.test.ts b/packages/tsdk/tests/get-npm-command.test.ts new file mode 100644 index 00000000..3b9afb9f --- /dev/null +++ b/packages/tsdk/tests/get-npm-command.test.ts @@ -0,0 +1,76 @@ +import { describe, expect, it, vi } from 'vitest'; +import { getNpmCommand } from '../src/get-npm-command'; +import * as pkgManager from '../src/get-pkg-manager'; +import { execSync } from 'child_process'; + +vi.mock('child_process'); +vi.mock('../src/get-pkg-manager'); + +describe('getNpmCommand', () => { + it('should return default npm commands', () => { + vi.mocked(pkgManager.getPkgManager).mockReturnValue('npm'); + + const result = getNpmCommand('/test'); + expect(result).toEqual({ + pkg: 'npm', + npxCmd: 'npx', + installCmd: 'npm install', + runCmd: 'npm run', + }); + }); + + it('should return bun commands', () => { + vi.mocked(pkgManager.getPkgManager).mockReturnValue('bun'); + + const result = getNpmCommand('/test'); + expect(result).toEqual({ + pkg: 'bun', + npxCmd: 'bunx', + installCmd: 'bun install', + runCmd: 'bun run', + }); + }); + + it('should return pnpm commands', () => { + vi.mocked(pkgManager.getPkgManager).mockReturnValue('pnpm'); + + const result = getNpmCommand('/test'); + expect(result).toEqual({ + pkg: 'pnpm', + npxCmd: 'pnpm', + installCmd: 'pnpm install', + runCmd: 'pnpm', + }); + }); + + it('should return yarn commands for modern yarn', () => { + vi.mocked(pkgManager.getPkgManager).mockReturnValue('yarn'); + vi.mocked(execSync).mockImplementation((cmd) => { + if (cmd.includes('yarn dlx')) return Buffer.from('3.0.0'); + throw new Error('Command not found'); + }); + + const result = getNpmCommand('/test'); + expect(result).toEqual({ + pkg: 'yarn', + npxCmd: 'yarn', + installCmd: 'yarn', + runCmd: 'yarn', + }); + }); + + it('should return default yarn commands for classic yarn', () => { + vi.mocked(pkgManager.getPkgManager).mockReturnValue('yarn'); + vi.mocked(execSync).mockImplementation(() => { + throw new Error('Command not found'); + }); + + const result = getNpmCommand('/test'); + expect(result).toEqual({ + pkg: 'yarn', + npxCmd: 'npx', + installCmd: 'npm install', + runCmd: 'npm run', + }); + }); +}); diff --git a/packages/tsdk/tests/get-pkg-manager.test.ts b/packages/tsdk/tests/get-pkg-manager.test.ts new file mode 100644 index 00000000..3eec302d --- /dev/null +++ b/packages/tsdk/tests/get-pkg-manager.test.ts @@ -0,0 +1,76 @@ +import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'; +import { getPkgManager } from '../src/get-pkg-manager'; +import fs from 'fs'; +import { execSync } from 'child_process'; + +vi.mock('fs'); +vi.mock('child_process'); + +describe('getPkgManager', () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + afterEach(() => { + delete process.env.npm_config_user_agent; + }); + + it('should detect bun from lock file', () => { + vi.mocked(fs.existsSync).mockImplementation((path) => (path as string).includes('bun.lock')); + expect(getPkgManager('/test')).toBe('bun'); + }); + + it('should detect yarn from lock file', () => { + vi.mocked(fs.existsSync).mockImplementation((path) => (path as string).includes('yarn.lock')); + expect(getPkgManager('/test')).toBe('yarn'); + }); + + it('should detect pnpm from lock file', () => { + vi.mocked(fs.existsSync).mockImplementation((path) => + (path as string).includes('pnpm-lock.yaml') + ); + expect(getPkgManager('/test')).toBe('pnpm'); + }); + + it('should detect npm from lock file', () => { + vi.mocked(fs.existsSync).mockImplementation((path) => + (path as string).includes('package-lock.json') + ); + expect(getPkgManager('/test')).toBe('npm'); + }); + + it('should detect package manager from user agent', () => { + vi.mocked(fs.existsSync).mockReturnValue(false); + + process.env.npm_config_user_agent = 'yarn/1.22.0'; + expect(getPkgManager('/test')).toBe('yarn'); + + process.env.npm_config_user_agent = 'pnpm/7.0.0'; + expect(getPkgManager('/test')).toBe('pnpm'); + + process.env.npm_config_user_agent = 'bun/1.0.0'; + expect(getPkgManager('/test')).toBe('bun'); + }); + + it('should detect installed package managers', () => { + vi.mocked(fs.existsSync).mockReturnValue(false); + delete process.env.npm_config_user_agent; + + vi.mocked(execSync).mockImplementation((cmd) => { + if (cmd.includes('pnpm')) return Buffer.from('7.0.0'); + throw new Error('Command not found'); + }); + + expect(getPkgManager('/test')).toBe('pnpm'); + }); + + it('should fallback to npm when no other manager is detected', () => { + vi.mocked(fs.existsSync).mockReturnValue(false); + delete process.env.npm_config_user_agent; + vi.mocked(execSync).mockImplementation(() => { + throw new Error('Command not found'); + }); + + expect(getPkgManager('/test')).toBe('npm'); + }); +}); diff --git a/packages/tsdk/tests/param-case.test.ts b/packages/tsdk/tests/param-case.test.ts new file mode 100644 index 00000000..15d67be9 --- /dev/null +++ b/packages/tsdk/tests/param-case.test.ts @@ -0,0 +1,31 @@ +// paramCase.test.ts +import { describe, it, expect } from 'vitest'; + +function paramCase(input: string): string { + return input + .replace(/([a-z0-9])([A-Z])/g, '$1-$2') // Add a hyphen between lower and upper case letters + .replace(/\s+/g, '-') // Replace spaces with hyphens + .toLowerCase(); // Convert all characters to lowercase +} + +describe('paramCase', () => { + it('should convert camelCase to param-case', () => { + expect(paramCase('camelCaseString')).toBe('camel-case-string'); + }); + + it('should convert PascalCase to param-case', () => { + expect(paramCase('PascalCaseString')).toBe('pascal-case-string'); + }); + + it('should replace spaces with hyphens', () => { + expect(paramCase('a string with spaces')).toBe('a-string-with-spaces'); + }); + + it('should convert all characters to lowercase', () => { + expect(paramCase('MIXEDCASE String')).toBe('mixedcase-string'); + }); + + it('should handle empty string', () => { + expect(paramCase('')).toBe(''); + }); +}); diff --git a/packages/tsdk/tests/path-params.test.ts b/packages/tsdk/tests/path-params.test.ts index dd33ae3a..d0677132 100644 --- a/packages/tsdk/tests/path-params.test.ts +++ b/packages/tsdk/tests/path-params.test.ts @@ -1,5 +1,4 @@ -import { expect } from 'chai'; -import { paramCase } from 'change-case'; +import { expect, it, describe } from 'vitest'; import { parseParams, pathParams, parseBracesParams } from '../fe-sdk-template/src/path-params'; @@ -32,8 +31,8 @@ describe('path parms tests', () => { expect(result).to.equal('/1/b/2'); }); - it('test paramCase', () => { - const result = '/' + paramCase('TestPathParams') + '/:a/b/:c'; - expect(result).to.equal('/test-path-params/:a/b/:c'); - }); + // it('test paramCase', () => { + // const result = '/' + paramCase('TestPathParams') + '/:a/b/:c'; + // expect(result).to.equal('/test-path-params/:a/b/:c'); + // }); }); diff --git a/packages/tsdk/tests/sum.test.ts b/packages/tsdk/tests/sum.test.ts deleted file mode 100644 index 89144273..00000000 --- a/packages/tsdk/tests/sum.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { expect } from 'chai'; - -before(() => { - console.log('before test'); -}); - -after(() => { - console.log('after test'); -}); - -describe('tests', () => { - it('test sum', () => { - expect(1 + 1).to.equal(2); - }); -}); diff --git a/packages/tsdk/tests/transform-typeorm-entity.test.ts b/packages/tsdk/tests/transform-typeorm-entity.test.ts new file mode 100644 index 00000000..3df21531 --- /dev/null +++ b/packages/tsdk/tests/transform-typeorm-entity.test.ts @@ -0,0 +1,161 @@ +import { expect, it, describe } from 'vitest'; +import { transformTypeormEntity } from '../src/transform-typeorm-entity'; + +describe('transform-typeorm-entity tests', () => { + it('should work with single line', () => { + const input = ` +import typeorm from 'typeorm'; // +`; + const result = transformTypeormEntity(input, 'typeorm'); + expect(result.trim()).to.equal(''); + }); + + it('should work with single inline comment', () => { + const input = ` +//import typeorm from 'typeorm'; +`; + const result = transformTypeormEntity(input, 'typeorm'); + expect(result.trim()).to.equal(input.trim()); + }); + + it('should work single line with multi-line comment', () => { + const input = ` +/* import typeorm from 'typeorm'; */ +`; + const result = transformTypeormEntity(input, 'typeorm'); + expect(result.trim()).to.equal(input.trim()); + }); + + it('should work multiple lines with multi-line comment', () => { + const input = ` + /* +import { +Unique, +Entity, +} from 'typeorm'; + */ +`; + const result = transformTypeormEntity(input, 'typeorm'); + expect(result.trim()).to.equal(input.trim()); + }); + + it('should work with multiple lines', () => { + const input = ` +import { +Unique, +Entity, +} from 'typeorm'; +`; + const result = transformTypeormEntity(input, 'typeorm'); + expect(result.trim()).to.equal(''); + }); + + it('should work with multiple line with comment', () => { + const input = ` +import { +Unique, /* */ +Entity, +} from 'typeorm'; // +`; + const result = transformTypeormEntity(input, 'typeorm'); + expect(result.trim()).to.equal(''); + }); + + it('should work with entity', () => { + const input = ` +import { Entity, PrimaryGeneratedColumn } from "typeorm" + +@Entity() +export class User { + @PrimaryGeneratedColumn() + id: number +} +`; + const output = ` +export class User { + id: number +} +`; + const result = transformTypeormEntity(input, 'typeorm'); + expect(result.trim()).to.equal(output.trim()); + }); + + it('should work with multiple columns entity', () => { + const input = ` +import { Entity, PrimaryColumn, Column } from "typeorm" + +@Entity() +export class Thing { + @PrimaryColumn() + id: number + + @Column("point") + point: string + + @Column("geometry", { + spatialFeatureType: "MultiPoint", + srid: 4326, + }) + linestring: string +} +`; + const output = ` +export class Thing { + id: number + + point: string + + linestring: string +} +`; + const result = transformTypeormEntity(input, 'typeorm'); + expect(result.trim()).to.equal(output.trim()); + }); + + it('should work with multiple columns entity and @ManyToMany', () => { + const input = ` +import { Entity, PrimaryColumn, Column } from "typeorm" + +@Entity() +export class Thing { + @PrimaryColumn() + id: number + + @Column("point") + point: string + + @Column("geometry", { + spatialFeatureType: "MultiPoint", + srid: 4326, + }) + linestring: string + + @ManyToMany((type) => Question, (question) => question.categories) + questions: Question[] + + @ManyToOne(() => User, (user) => user.photos) + user: User + + @OneToMany(() => Photo, (photo) => photo.user) + photos: Photo[] +} +`; + const output = ` +export class Thing { + id: number + + point: string + + linestring: string + + questions: Question[] + + user: User + + photos: Photo[] +} +`; + const result = transformTypeormEntity(input, 'typeorm'); + expect(result.trim()).to.equal(output.trim()); + }); +}); diff --git a/packages/tsdk/tests/utils.measureExecutionTime.test.ts b/packages/tsdk/tests/utils.measureExecutionTime.test.ts new file mode 100644 index 00000000..7448106a --- /dev/null +++ b/packages/tsdk/tests/utils.measureExecutionTime.test.ts @@ -0,0 +1,93 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { measureExecutionTime } from '../src/utils'; + +describe('measureExecutionTime', () => { + beforeEach(() => { + // Mock console.log + vi.spyOn(console, 'log').mockImplementation(() => {}); + + // Mock Date.now to control timing + vi.spyOn(global.Date, 'now').mockImplementation(() => 1000); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('should return the result of the executed function', async () => { + const mockFn = vi.fn().mockResolvedValue('test result'); + + const result = await measureExecutionTime('Test Task', mockFn); + + expect(result).toBe('test result'); + expect(mockFn).toHaveBeenCalledTimes(1); + }); + + it('should log start and successful completion messages', async () => { + const mockFn = vi.fn().mockResolvedValue('test result'); + + // First call returns start time, second call returns end time + vi.spyOn(global.Date, 'now') + .mockImplementationOnce(() => 1000) + .mockImplementationOnce(() => 1500); + + await measureExecutionTime('Test Task', mockFn); + + expect(console.log).toHaveBeenCalledTimes(2); + expect(console.log).toHaveBeenNthCalledWith(1, '⏰ Test Task'); + expect(console.log).toHaveBeenNthCalledWith(2, '✅ Test Task 500.00ms'); + }); + + it('should throw error when the executed function fails', async () => { + const testError = new Error('Test error'); + const mockFn = vi.fn().mockRejectedValue(testError); + + // First call returns start time, second call returns end time + vi.spyOn(global.Date, 'now') + .mockImplementationOnce(() => 1000) + .mockImplementationOnce(() => 1800); + + await expect(measureExecutionTime('Test Task', mockFn)).rejects.toThrow(testError); + + expect(console.log).toHaveBeenCalledTimes(2); + expect(console.log).toHaveBeenNthCalledWith(1, '⏰ Test Task'); + expect(console.log).toHaveBeenNthCalledWith(2, '❌ Test Task 800ms'); + }); + + it('should respect the indent parameter', async () => { + const mockFn = vi.fn().mockResolvedValue('test result'); + + // First call returns start time, second call returns end time + vi.spyOn(global.Date, 'now') + .mockImplementationOnce(() => 1000) + .mockImplementationOnce(() => 1300); + + await measureExecutionTime('Test Task', mockFn, ' '); + + expect(console.log).toHaveBeenCalledTimes(2); + expect(console.log).toHaveBeenNthCalledWith(1, ' ⏰ Test Task'); + expect(console.log).toHaveBeenNthCalledWith(2, ' ✅ Test Task 300.00ms'); + }); + + it('should handle nested execution timing correctly', async () => { + // Mock Date.now to return incremental times for nested calls + vi.spyOn(global.Date, 'now') + .mockImplementationOnce(() => 1000) // outer start + .mockImplementationOnce(() => 1100) // inner start + .mockImplementationOnce(() => 1300) // inner end + .mockImplementationOnce(() => 1500); // outer end + + const innerFn = vi.fn().mockResolvedValue('inner result'); + const outerFn = vi.fn().mockImplementation(async () => { + return measureExecutionTime('Inner Task', innerFn, ' '); + }); + + await measureExecutionTime('Outer Task', outerFn); + + expect(console.log).toHaveBeenCalledTimes(4); + expect(console.log).toHaveBeenNthCalledWith(1, '⏰ Outer Task'); + expect(console.log).toHaveBeenNthCalledWith(2, ' ⏰ Inner Task'); + expect(console.log).toHaveBeenNthCalledWith(3, ' ✅ Inner Task 200.00ms'); + expect(console.log).toHaveBeenNthCalledWith(4, '✅ Outer Task 500.00ms'); + }); +}); diff --git a/packages/tsdk/tests/utils.test.ts b/packages/tsdk/tests/utils.test.ts new file mode 100644 index 00000000..2756af91 --- /dev/null +++ b/packages/tsdk/tests/utils.test.ts @@ -0,0 +1,50 @@ +import { expect, it } from 'vitest'; + +import { replaceWindowsPath, parseArgv } from '../src/utils'; // Adjust the import path + +it('utils.replaceWindowsPath', async () => { + expect(replaceWindowsPath('/')).toBe('/'); + expect(replaceWindowsPath('\\\\', true)).toBe('//'); +}); + +it('utils.parseArgv - basic long and short options', () => { + const argv = ['create', 'my-app', '--template', 'user/react-template', '-t', 'user/vue-template']; + const result = parseArgv(argv); + + expect(result.template).toBe('user/react-template'); + expect(result.t).toBe('user/vue-template'); +}); + +it('utils.parseArgv - boolean flags', () => { + const argv = ['create', 'my-app', '--no-overwrite', '-f']; + const result = parseArgv(argv); + + expect(result['no-overwrite']).toBe(true); + expect(result.f).toBe(true); +}); + +it('utils.parseArgv - missing value treated as boolean', () => { + const argv = ['--flag', '--option', '-x']; + const result = parseArgv(argv); + + expect(result.flag).toBe(true); + expect(result.option).toBe(true); + expect(result.x).toBe(true); +}); + +it('utils.parseArgv - values after options', () => { + const argv = ['--name', 'app', '-v', '1.0.0']; + const result = parseArgv(argv); + + expect(result.name).toBe('app'); + expect(result.v).toBe('1.0.0'); +}); + +it('utils.parseArgv - ignore non-option arguments', () => { + const argv = ['create', 'my-app', '--template', 'user/react-template']; + const result = parseArgv(argv); + + expect(result.template).toBe('user/react-template'); + expect(result.create).toBeUndefined(); + expect(result['my-app']).toBeUndefined(); +}); diff --git a/packages/tsdk/tsconfig.json b/packages/tsdk/tsconfig.json index 79fa9fe9..80b0960e 100644 --- a/packages/tsdk/tsconfig.json +++ b/packages/tsdk/tsconfig.json @@ -5,6 +5,7 @@ "esModuleInterop": true, "declaration": true, "skipLibCheck": true, + "resolveJsonModule": true, "outDir": "./lib", }, "include": ["./src"], diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000..ec804543 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,128 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + // frontend + use: { + baseURL: 'http://localhost:5173', // default target app + headless: true, + trace: 'on-first-retry', + }, + webServer: [ + { + command: 'pnpm --filter=web dev', // start frontend dev server + port: 5173, // wait until this port is open + timeout: 60000, // max wait time + reuseExistingServer: !process.env.CI, // useful in dev + }, + { + command: 'pnpm --filter=vue-web dev', // start frontend dev server + port: 5174, // wait until this port is open + timeout: 60000, // max wait time + reuseExistingServer: !process.env.CI, // useful in dev + }, + { + command: 'pnpm --filter=svelte-web dev', // start frontend dev server + port: 5175, // wait until this port is open + timeout: 60000, // max wait time + reuseExistingServer: !process.env.CI, // useful in dev + }, + { + command: 'pnpm --filter=solid-web dev', // start frontend dev server + port: 5176, // wait until this port is open + timeout: 60000, // max wait time + reuseExistingServer: !process.env.CI, // useful in dev + }, + ], + // backend + globalSetup: require.resolve('./e2e-tests/global-setup.js'), + globalTeardown: require.resolve('./e2e-tests/global-teardown.js'), + testDir: './e2e-tests', + timeout: 60e3, + /* Run tests in files in parallel */ + fullyParallel: false, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : 1, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + + /* Configure projects for major browsers */ + projects: [ + { + name: 'swr - chromium', + testMatch: /.*swr\.spec\.ts/, + use: { ...devices['Desktop Chrome'], baseURL: 'http://localhost:5173' }, + }, + { + name: 'react-query - chromium', + testMatch: /.*react-query\.spec\.ts/, + use: { ...devices['Desktop Chrome'], baseURL: 'http://localhost:5173' }, + }, + { + name: 'vue-query - chromium', + testMatch: /.*tan-query\.spec\.ts/, + use: { ...devices['Desktop Firefox'], baseURL: 'http://localhost:5174' }, + }, + { + name: 'svelte-query - chromium', + testMatch: /.*tan-query\.spec\.ts/, + use: { ...devices['Desktop Safari'], baseURL: 'http://localhost:5175' }, + }, + { + name: 'solid-query - chromium', + testMatch: /.*tan-query\.spec\.ts/, + use: { ...devices['Desktop Edge'], baseURL: 'http://localhost:5176' }, + }, + + // { + // name: 'firefox', + // use: { ...devices['Desktop Firefox'] }, + // }, + + // { + // name: 'webkit', + // use: { ...devices['Desktop Safari'] }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9631d38f..4dec1a1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,135 +4,70 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - uuid: ^3.4.0 - '@babel/traverse': '>=7.23.2' - xior: ^0.6.2 - importers: .: devDependencies: - '@configs/eslint-config': - specifier: workspace:* - version: link:configs/eslint-config + '@eslint/js': + specifier: ^9.22.0 + version: 9.22.0 + '@playwright/test': + specifier: ^1.51.1 + version: 1.51.1 + '@types/node': + specifier: ^20.17.24 + version: 20.17.24 + eslint: + specifier: ^9.22.0 + version: 9.22.0(jiti@2.4.2) husky: - specifier: ^8.0.3 - version: 8.0.3 + specifier: ^9.1.7 + version: 9.1.7 is-ci: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^4.1.0 + version: 4.1.0 lint-staged: - specifier: ^14.0.1 - version: 14.0.1 - - configs/eslint-config: - dependencies: - '@tsconfig/recommended': - specifier: ^1.0.7 - version: 1.0.7 - '@typescript-eslint/eslint-plugin': - specifier: ^6.1.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.1.0 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.45.0 - version: 8.57.0 - eslint-config-universe: - specifier: ^11.3.0 - version: 11.3.0(eslint@8.57.0)(prettier@2.8.8)(typescript@5.4.5) + specifier: ^15.5.0 + version: 15.5.0 prettier: - specifier: ^2.8.8 - version: 2.8.8 - - configs/test-config: - devDependencies: - '@types/chai': - specifier: ^4.3.4 - version: 4.3.16 - '@types/mocha': - specifier: ^10.0.6 - version: 10.0.6 - '@types/node': - specifier: ^18.13.0 - version: 18.19.33 - chai: - specifier: ^4.3.10 - version: 4.4.1 - mocha: - specifier: ^10.2.0 - version: 10.4.0 - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@10.4.0) - ts-node: - specifier: ^10.9.1 - version: 10.9.2(@types/node@18.19.33)(typescript@5.4.5) - - configs/ts-config: - devDependencies: - '@total-typescript/ts-reset': - specifier: ^0.5.1 - version: 0.5.1 - '@types/node': - specifier: ^18.13.0 - version: 18.19.33 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 + specifier: ^3.5.3 + version: 3.5.3 typescript: - specifier: ^5 - version: 5.4.5 - - configs/vitest-config: - devDependencies: - '@testing-library/react': - specifier: ^14.1.2 - version: 14.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.2.1(vite@5.2.11(@types/node@18.19.33)(terser@5.31.0)) - '@vitest/ui': - specifier: ^1.0.1 - version: 1.6.0(vitest@1.6.0) - jsdom: - specifier: ^23.0.1 - version: 23.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - vitest: - specifier: ^1.0.1 - version: 1.6.0(@types/node@18.19.33)(@vitest/ui@1.6.0)(jsdom@23.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.26.1 + version: 8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3) examples/server: dependencies: '@fastify/express': - specifier: ^3.0.0 - version: 3.0.0 + specifier: ^4.0.2 + version: 4.0.2 '@hono/node-server': - specifier: ^1.11.1 - version: 1.11.1 + specifier: ^1.19.7 + version: 1.19.7(hono@4.11.3) + '@standard-schema/spec': + specifier: ^1.1.0 + version: 1.1.0 better-sqlite3: - specifier: ^9.0.0 - version: 9.6.0 + specifier: 12.5.0 + version: 12.5.0 bufferutil: - specifier: ^4.0.7 - version: 4.0.8 - change-case: - specifier: ^4.1.2 - version: 4.1.2 + specifier: ^4.1.0 + version: 4.1.0 cors: specifier: ^2.8.5 version: 2.8.5 express: - specifier: ^4.21.0 - version: 4.21.0 + specifier: ^5.1.0 + version: 5.1.0 fastify: - specifier: ^5.0.0 - version: 5.0.0 + specifier: ^5.6.2 + version: 5.6.2 hono: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.11.3 + version: 4.11.3 i18next: specifier: ^23.15.1 version: 23.15.1 @@ -140,69 +75,87 @@ importers: specifier: ^2.0.1 version: 2.0.1 kysely: - specifier: ^0.27.5 - version: 0.27.5 + specifier: ^0.28.9 + version: 0.28.9 reflect-metadata: - specifier: ^0.2.1 + specifier: ^0.2.2 version: 0.2.2 socket.io: - specifier: ^4.8.0 - version: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: ^4.8.3 + version: 4.8.3(bufferutil@4.1.0) tsdk-server-adapters: specifier: workspace:* version: link:../../packages/tsdk-server-adapters typeorm: - specifier: ^0.3.20 - version: 0.3.20(better-sqlite3@9.6.0)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.3.3)) + specifier: ^0.3.28 + version: 0.3.28(babel-plugin-macros@3.1.0)(better-sqlite3@12.5.0)(ts-node@10.9.2(@swc/core@1.10.18)(@types/node@24.7.2)(typescript@5.9.3)) typeorm-cursor-pagination: specifier: ^0.10.1 - version: 0.10.1(typeorm@0.3.20(better-sqlite3@9.6.0)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.3.3))) - utf-8-validate: - specifier: ^6.0.3 - version: 6.0.3 + version: 0.10.1(typeorm@0.3.28(babel-plugin-macros@3.1.0)(better-sqlite3@12.5.0)(ts-node@10.9.2(@swc/core@1.10.18)(@types/node@24.7.2)(typescript@5.9.3))) ws: - specifier: ^8.13.0 - version: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: ^8.18.3 + version: 8.18.3(bufferutil@4.1.0) zod: - specifier: ^3.23.8 - version: 3.23.8 + specifier: ^4 + version: 4.0.14 devDependencies: - '@configs/eslint-config': - specifier: workspace:* - version: link:../../configs/eslint-config - '@configs/test-config': - specifier: workspace:* - version: link:../../configs/test-config - '@configs/ts-config': - specifier: workspace:* - version: link:../../configs/ts-config '@nestjs/cli': - specifier: ^10.3.2 - version: 10.3.2 + specifier: 11.0.16 + version: 11.0.16(@swc/core@1.10.18)(@types/node@24.7.2) '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + specifier: ^5.0.3 + version: 5.0.3 '@types/ws': specifier: ^8.5.5 version: 8.5.10 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + fs-extra: + specifier: ^11.3.0 + version: 11.3.0 socket.io-client: - specifier: ^4.8.0 - version: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: ^4.8.1 + version: 4.8.1(bufferutil@4.1.0) tsdk: specifier: workspace:* version: link:../../packages/tsdk + typescript: + specifier: ^5.9.3 + version: 5.9.3 + unplugin-swc: + specifier: ^1.5.5 + version: 1.5.5(@swc/core@1.10.18)(rollup@4.52.4) + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.9.3)(vite@5.4.14(@types/node@24.7.2)(lightningcss@1.29.1)(terser@5.39.0)) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + webpack: + specifier: ^5.102.1 + version: 5.102.1(@swc/core@1.10.18) + webpack-node-externals: + specifier: ^3.0.0 + version: 3.0.0 - examples/server/packages/fe-sdk-demo: + examples/server/fe-sdk-demo: dependencies: '@tanstack/react-query': - specifier: ^5.56.2 - version: 5.56.2(react@18.2.0) + specifier: ^5.90.19 + version: 5.90.19(react@19.0.0) + '@tanstack/solid-query': + specifier: ^5.90.22 + version: 5.90.22(solid-js@1.9.9) + '@tanstack/svelte-query': + specifier: ^6.0.17 + version: 6.0.17(svelte@5.39.12) + '@tanstack/vue-query': + specifier: ^5.92.8 + version: 5.92.8(vue@3.5.22(typescript@5.9.3)) axios: - specifier: ^1.7.9 - version: 1.7.9 - change-case: - specifier: ^4.1.2 - version: 4.1.2 + specifier: ^1.13.2 + version: 1.13.2 i18next: specifier: ^23.10.1 version: 23.15.1 @@ -210,386 +163,662 @@ importers: specifier: ^2.0.1 version: 2.0.1 kysely: - specifier: ^0.27.5 - version: 0.27.5 + specifier: ^0.28.9 + version: 0.28.9 socket.io-client: - specifier: ^4.8.0 - version: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: ^4.8.3 + version: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + swr: + specifier: ^2.3.8 + version: 2.3.8(react@19.0.0) xior: - specifier: ^0.6.2 - version: 0.6.2 + specifier: ^0.8.3 + version: 0.8.3 zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^4 + version: 4.0.14 devDependencies: - '@tsconfig/recommended': - specifier: ^1.0.8 - version: 1.0.8 + '@standard-schema/spec': + specifier: ^1.1.0 + version: 1.1.0 + concurrently: + specifier: ^9.2.1 + version: 9.2.1 typedoc: - specifier: ^0.27.6 - version: 0.27.6(typescript@5.4.5) + specifier: ^0.28.16 + version: 0.28.16(typescript@5.9.3) typescript: - specifier: ^5 - version: 5.4.5 + specifier: ^5.9.3 + version: 5.9.3 - examples/web: + examples/solid-web: dependencies: - axios: - specifier: ^1.7.7 - version: 1.7.7 + '@tanstack/solid-query': + specifier: 5.90.22 + version: 5.90.22(solid-js@1.9.9) + socket.io-client: + specifier: ^4.8.3 + version: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + solid-js: + specifier: ^1.9.9 + version: 1.9.9 + xior: + specifier: ^0.8.3 + version: 0.8.3 + devDependencies: + '@types/node': + specifier: ^24.6.0 + version: 24.7.2 + fe-sdk-demo: + specifier: workspace:* + version: link:../server/fe-sdk-demo + typescript: + specifier: ~5.9.3 + version: 5.9.3 + vite: + specifier: ^7.1.7 + version: 7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + vite-plugin-solid: + specifier: ^2.11.8 + version: 2.11.9(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + + examples/svelte-web: + dependencies: + '@tanstack/svelte-query': + specifier: 6.0.17 + version: 6.0.17(svelte@5.39.12) + socket.io-client: + specifier: ^4.8.3 + version: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + xior: + specifier: ^0.8.3 + version: 0.8.3 + devDependencies: + '@sveltejs/vite-plugin-svelte': + specifier: ^6.2.1 + version: 6.2.1(svelte@5.39.12)(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + '@tsconfig/svelte': + specifier: ^5.0.5 + version: 5.0.5 + '@types/node': + specifier: ^24.6.0 + version: 24.7.2 + fe-sdk-demo: + specifier: workspace:* + version: link:../server/fe-sdk-demo + svelte: + specifier: ^5.39.6 + version: 5.39.12 + svelte-check: + specifier: ^4.3.2 + version: 4.3.3(picomatch@4.0.3)(svelte@5.39.12)(typescript@5.9.3) + typescript: + specifier: ~5.9.3 + version: 5.9.3 + vite: + specifier: ^7.1.7 + version: 7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + + examples/vue-web: + dependencies: + '@tanstack/vue-query': + specifier: 5.92.8 + version: 5.92.8(vue@3.5.22(typescript@5.9.3)) + socket.io-client: + specifier: ^4.8.3 + version: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + vue: + specifier: ^3.5.22 + version: 3.5.22(typescript@5.9.3) + xior: + specifier: ^0.8.3 + version: 0.8.3 + devDependencies: + '@tsconfig/node22': + specifier: ^22.0.2 + version: 22.0.2 + '@types/node': + specifier: ^22.18.6 + version: 22.18.10 + '@vitejs/plugin-vue': + specifier: ^6.0.1 + version: 6.0.1(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + '@vue/tsconfig': + specifier: ^0.8.1 + version: 0.8.1(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)) fe-sdk-demo: specifier: workspace:* - version: link:../server/packages/fe-sdk-demo - next: - specifier: ^13.5.6 - version: 13.5.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: link:../server/fe-sdk-demo + npm-run-all2: + specifier: ^8.0.4 + version: 8.0.4 + typescript: + specifier: ~5.9.0 + version: 5.9.3 + vite: + specifier: ^7.1.7 + version: 7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + vite-plugin-vue-devtools: + specifier: ^8.0.2 + version: 8.0.2(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + vue-tsc: + specifier: ^3.1.0 + version: 3.1.1(typescript@5.9.3) + + examples/web: + dependencies: + '@react-router/node': + specifier: ^7.2.0 + version: 7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3) + '@react-router/serve': + specifier: ^7.2.0 + version: 7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3) + '@tanstack/react-query': + specifier: 5.90.19 + version: 5.90.19(react@19.0.0) + axios: + specifier: ^1.13.2 + version: 1.13.2 + isbot: + specifier: ^5.1.17 + version: 5.1.23 react: - specifier: 18.2.0 - version: 18.2.0 + specifier: ^19.0.0 + version: 19.0.0 react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-native-web: - specifier: ^0.19.6 - version: 0.19.11(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + react-router: + specifier: ^7.2.0 + version: 7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) socket.io-client: - specifier: ^4.8.0 - version: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: ^4.8.3 + version: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) xior: - specifier: ^0.6.2 - version: 0.6.2 + specifier: ^0.8.3 + version: 0.8.3 devDependencies: - '@configs/eslint-config': - specifier: workspace:* - version: link:../../configs/eslint-config - '@configs/vitest-config': + '@react-router/dev': + specifier: ^7.2.0 + version: 7.2.0(@react-router/serve@7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3))(@types/node@20.17.19)(babel-plugin-macros@3.1.0)(lightningcss@1.29.1)(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(terser@5.39.0)(typescript@5.9.3)(vite@5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0)) + '@tailwindcss/vite': + specifier: ^4.0.0 + version: 4.0.8(vite@5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0)) + '@types/node': + specifier: ^20 + version: 20.17.19 + '@types/react': + specifier: ^19.0.1 + version: 19.0.10 + '@types/react-dom': + specifier: ^19.0.1 + version: 19.0.4(@types/react@19.0.10) + fe-sdk-demo: specifier: workspace:* - version: link:../../configs/vitest-config - babel-plugin-react-native-web: - specifier: ^0.19.6 - version: 0.19.11 + version: link:../server/fe-sdk-demo + react-router-devtools: + specifier: ^1.1.0 + version: 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(vite@5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0)) + tailwindcss: + specifier: ^4.0.0 + version: 4.0.8 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^5.4.11 + version: 5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0) + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.9.3)(vite@5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0)) packages/bench: dependencies: '@hono/node-server': - specifier: ^1.11.1 - version: 1.11.1 + specifier: ^1.14.4 + version: 1.14.4(hono@4.9.11) + '@standard-schema/spec': + specifier: ^1.0.0 + version: 1.1.0 '@trpc/server': - specifier: ^10.44.1 + specifier: ^10.45.2 version: 10.45.2 - change-case: - specifier: ^4.1.2 - version: 4.1.2 express: - specifier: ^4.21.0 - version: 4.21.0 + specifier: ^5.1.0 + version: 5.1.0 fastify: - specifier: ^5.0.0 - version: 5.0.0 + specifier: ^5.6.1 + version: 5.6.1 hono: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.9.11 + version: 4.9.11 tsdk-server-adapters: - specifier: ^0.1.15 - version: 0.1.15(express@4.21.0)(fastify@5.0.0)(hono@4.6.2)(socket.io@4.8.0)(zod@3.23.8) + specifier: ^0.3.0 + version: 0.3.0(express@5.1.0)(fastify@5.6.1)(hono@4.9.11)(socket.io@4.8.3)(zod@4.0.14) zod: - specifier: ^3.23.8 - version: 3.23.8 + specifier: ^4 + version: 4.0.14 devDependencies: - '@configs/eslint-config': - specifier: workspace:* - version: link:../../configs/eslint-config - '@configs/test-config': - specifier: workspace:* - version: link:../../configs/test-config - '@configs/ts-config': - specifier: workspace:* - version: link:../../configs/ts-config '@nestjs/cli': - specifier: ^10.3.2 - version: 10.3.2 + specifier: 11.0.16 + version: 11.0.16(@swc/core@1.10.18)(@types/node@24.7.2) '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + specifier: ^5.0.1 + version: 5.0.1 concurrently: - specifier: ^8.2.2 - version: 8.2.2 + specifier: ^9.2.1 + version: 9.2.1 tsdk: specifier: workspace:* version: link:../tsdk + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + webpack: + specifier: ^5.102.1 + version: 5.102.1(@swc/core@1.10.18) + webpack-node-externals: + specifier: ^3.0.0 + version: 3.0.0 packages/tsdk: dependencies: - chalk: - specifier: 4.1.2 - version: 4.1.2 + '@clack/prompts': + specifier: ^0.11.0 + version: 0.11.0 + '@parcel/watcher': + specifier: ^2.5.4 + version: 2.5.4 fast-glob: - specifier: ^3.3.2 - version: 3.3.2 + specifier: ^3.3.3 + version: 3.3.3 fs-extra: - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^11.3.0 + version: 11.3.0 + js-yaml: + specifier: ^4.1.1 + version: 4.1.1 + tar: + specifier: ^7.5.6 + version: 7.5.6 + typescript: + specifier: ~5.5.4 + version: 5.5.4 + typescript-json-schema: + specifier: ^0.67.1 + version: 0.67.1(@swc/core@1.10.18) devDependencies: - '@configs/eslint-config': - specifier: workspace:* - version: link:../../configs/eslint-config - '@configs/test-config': - specifier: workspace:* - version: link:../../configs/test-config - '@configs/ts-config': - specifier: workspace:* - version: link:../../configs/ts-config '@tsconfig/recommended': - specifier: ^1.0.7 - version: 1.0.7 + specifier: ^1.0.10 + version: 1.0.10 '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 '@types/webpack-node-externals': specifier: ^3.0.0 - version: 3.0.4 - typescript: - specifier: ^5 - version: 5.4.5 + version: 3.0.4(@swc/core@1.10.18) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@18.19.130)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) webpack: - specifier: ^5.97.1 - version: 5.97.1 + specifier: ^5.102.1 + version: 5.104.1(@swc/core@1.10.18) webpack-node-externals: specifier: ^3.0.0 version: 3.0.0 packages/tsdk-server-adapters: dependencies: + '@standard-schema/spec': + specifier: ^1.1.0 + version: 1.1.0 eventemitter3: specifier: ^5.0.1 version: 5.0.1 + devDependencies: + '@fastify/express': + specifier: ^4.0.2 + version: 4.0.2 + '@hono/node-server': + specifier: ^1.19.7 + version: 1.19.7(hono@4.11.3) + '@tsconfig/recommended': + specifier: ^1.0.10 + version: 1.0.10 + '@types/express': + specifier: ^5.0.1 + version: 5.0.1 + '@types/multer': + specifier: ^2.0.0 + version: 2.0.0 + arktype: + specifier: ^2.1.29 + version: 2.1.29 + concurrently: + specifier: ^9.2.1 + version: 9.2.1 express: - specifier: ^4.21.0 - version: 4.21.0 + specifier: ^5.2.1 + version: 5.2.1 fastify: - specifier: ^5.0.0 - version: 5.0.0 + specifier: ^5.6.2 + version: 5.6.2 hono: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.11.3 + version: 4.11.3 + multer: + specifier: ^2.0.2 + version: 2.0.2 socket.io: - specifier: ^4.8.0 - version: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - zod: - specifier: ^3.23.8 - version: 3.23.8 - devDependencies: - '@configs/eslint-config': - specifier: workspace:* - version: link:../../configs/eslint-config - '@configs/test-config': - specifier: workspace:* - version: link:../../configs/test-config - '@configs/ts-config': - specifier: workspace:* - version: link:../../configs/ts-config - '@tsconfig/recommended': - specifier: ^1.0.7 - version: 1.0.7 - '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + specifier: ^4.8.3 + version: 4.8.3(bufferutil@4.1.0) + socket.io-client: + specifier: ^4.8.3 + version: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) typescript: - specifier: ^5 - version: 5.4.5 + specifier: ^5.9.3 + version: 5.9.3 + valibot: + specifier: ^1.2.0 + version: 1.2.0(typescript@5.9.3) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + zod: + specifier: ^4 + version: 4.0.14 - packages/tsdk/fe-sdk-template: + packages/tsdk/lib: dependencies: - axios: - specifier: ^1.7.9 - version: 1.7.9 - change-case: - specifier: ^4.1.2 - version: 4.1.2 - socket.io-client: - specifier: ^4.8.0 - version: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - xior: - specifier: ^0.6.2 - version: 0.6.2 - zod: - specifier: ^3.24.1 - version: 3.24.1 - devDependencies: - '@tsconfig/recommended': - specifier: ^1.0.8 - version: 1.0.8 - typedoc: - specifier: ^0.27.6 - version: 0.27.6(typescript@5.4.5) - typescript: - specifier: ^5 - version: 5.4.5 - - website: - dependencies: - next: - specifier: 13.0.6 - version: 13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - next-sitemap: - specifier: 4.2.3 - version: 4.2.3(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) - next-videos: - specifier: 1.4.1 - version: 1.4.1(webpack@5.97.1) - nextra: - specifier: 2.13.2 - version: 2.13.2(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - nextra-theme-docs: - specifier: 2.13.2 - version: 2.13.2(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(nextra@2.13.2(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - react-wrap-balancer: - specifier: 1.1.0 - version: 1.1.0(react@18.2.0) - devDependencies: - '@types/node': - specifier: ^18.13.0 - version: 18.19.33 - autoprefixer: - specifier: ^10.4.16 - version: 10.4.19(postcss@8.4.38) - postcss: - specifier: ^8.4.31 - version: 8.4.38 - tailwindcss: - specifier: ^3.3.5 - version: 3.4.3(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5)) - tailwindcss-animate-plugin: + '@standard-schema/spec': specifier: ^1.1.0 version: 1.1.0 - typescript: - specifier: ^5 - version: 5.4.5 + '@tanstack/react-query': + specifier: ^5.90.19 + version: 5.90.19(react@19.0.0) + '@tanstack/solid-query': + specifier: ^5.90.22 + version: 5.90.22(solid-js@1.9.9) + '@tanstack/svelte-query': + specifier: ^6.0.17 + version: 6.0.17(svelte@5.39.12) + '@tanstack/vue-query': + specifier: ^5.92.8 + version: 5.92.8(vue@3.5.22(typescript@5.9.3)) + arktype: + specifier: ^2.1.29 + version: 2.1.29 + kysely: + specifier: ^0.28.9 + version: 0.28.9 + swr: + specifier: ^2.3.8 + version: 2.3.8(react@19.0.0) + valibot: + specifier: ^1.2.0 + version: 1.2.0(typescript@5.9.3) + zod: + specifier: ^4 + version: 4.0.14 packages: - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular-devkit/core@17.1.2': - resolution: {integrity: sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/core@19.1.7': + resolution: {integrity: sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^4.0.0 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/core@19.2.19': + resolution: {integrity: sha512-JbLL+4IMLMBgjLZlnPG4lYDfz4zGrJ/s6Aoon321NJKuw1Kb1k5KpFu9dUY0BqLIe8xPQ2UJBpI+xXdK5MXMHQ==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - chokidar: ^3.5.2 + chokidar: ^4.0.0 peerDependenciesMeta: chokidar: optional: true - '@angular-devkit/schematics-cli@17.1.2': - resolution: {integrity: sha512-bvXykYzSST05qFdlgIzUguNOb3z0hCa8HaTwtqdmQo9aFPf+P+/AC56I64t1iTchMjQtf3JrBQhYM25gUdcGbg==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics-cli@19.2.19': + resolution: {integrity: sha512-7q9UY6HK6sccL9F3cqGRUwKhM7b/XfD2YcVaZ2WD7VMaRlRm85v6mRjSrfKIAwxcQU0UK27kMc79NIIqaHjzxA==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/schematics@17.1.2': - resolution: {integrity: sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics@19.1.7': + resolution: {integrity: sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-devkit/schematics@19.2.19': + resolution: {integrity: sha512-J4Jarr0SohdrHcb40gTL4wGPCQ952IMWF1G/MSAQfBAPvA9ZKApYhpxcY7PmehVePve+ujpus1dGsJ7dPxz8Kg==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@ark/schema@0.56.0': + resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==} + + '@ark/util@0.56.0': + resolution: {integrity: sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.9': + resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.26.9': + resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} - '@asamuzakjp/dom-selector@2.0.2': - resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@babel/helper-module-imports@7.18.6': + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.5': - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.5': - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.24.5': - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.24.5': - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.24.5': - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.5': - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.5': - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + '@babel/helpers@7.26.9': + resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.5': - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.24.5': - resolution: {integrity: sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==} + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.28.0': + resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.25.9': + resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.26.8': + resolution: {integrity: sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.1': - resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -598,187 +827,431 @@ packages: resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.5': - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.5': - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} - '@braintree/sanitize-url@6.0.4': - resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@biomejs/cli-darwin-arm64@1.9.4': + resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@bkrem/react-transition-group@1.3.5': + resolution: {integrity: sha512-lbBYhC42sxAeFEopxzd9oWdkkV0zirO5E9WyeOBxOrpXsf7m30Aj8vnbayZxFOwD9pvUQ2Pheb1gO79s0Qap3Q==} + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@clack/core@0.5.0': + resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} + + '@clack/prompts@0.11.0': + resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@corex/deepmerge@4.0.43': - resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} - '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/css@11.13.5': + resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.1.0': + resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.22.0': + resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/ajv-compiler@4.0.0': resolution: {integrity: sha512-dt0jyLAlay14LpIn4Fg1SY7V5NJ9KH0YFDpYVQY5cgIVBvdI8908AMx5zQ0bBYPGT6Wh+bM3f2caMmOXLP3QsQ==} @@ -786,54 +1259,240 @@ packages: '@fastify/error@4.0.0': resolution: {integrity: sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==} - '@fastify/express@3.0.0': - resolution: {integrity: sha512-Ug6aulXCUiHgMyrHVYQqnQbGdsAV0aTad6nZxbOr6w3QjKn1mdQS3Kyzvc+I0xMjZ9yIyMUWHSooHgZ0l7nOng==} + '@fastify/express@4.0.2': + resolution: {integrity: sha512-lzu9MLdjlsK4Q2RiqEAwTgwQPrWQVP0kmbgAi/w9rIUqtnacjKvj3EHVTR6PIvXDs6Ut1jnTHiGbuNxHTsZwHQ==} '@fastify/fast-json-stringify-compiler@5.0.1': resolution: {integrity: sha512-f2d3JExJgFE3UbdFcpPwqNUEoHWmt8pAKf8f+9YuLESdefA0WgqxeT6DrGL4Yrf/9ihXNSKOqpjEmurV405meA==} + '@fastify/forwarded@3.0.0': + resolution: {integrity: sha512-kJExsp4JCms7ipzg7SJ3y8DwmePaELHxKYtg+tZow+k0znUTf3cb+npgyqm8+ATZOdmfgfydIebPDWM172wfyA==} + '@fastify/merge-json-schemas@0.1.1': resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} - '@gerrit0/mini-shiki@1.27.2': - resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} + '@fastify/proxy-addr@5.0.0': + resolution: {integrity: sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==} - '@headlessui/react@1.7.19': - resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} - engines: {node: '>=10'} + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@gerrit0/mini-shiki@3.20.0': + resolution: {integrity: sha512-Wa57i+bMpK6PGJZ1f2myxo3iO+K/kZikcyvH8NIqNNZhQUbDav7V9LQmWOXhf946mz5c1NZ19WMsGYiDKTryzQ==} + + '@hono/node-server@1.14.4': + resolution: {integrity: sha512-DnxpshhYewr2q9ZN8ez/M5mmc3sucr8CT1sIgIy1bkeUXut9XWDkqHoFHRhWIQgkYnKpVRxunyhK7WzpJeJ6qQ==} + engines: {node: '>=18.14.1'} peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 + hono: ^4 - '@hono/node-server@1.11.1': - resolution: {integrity: sha512-GW1Iomhmm1o4Z+X57xGby8A35Cu9UZLL7pSMdqDBkD99U5cywff8F+8hLk5aBTzNubnsFAvWQ/fZjNwPsEn9lA==} + '@hono/node-server@1.19.7': + resolution: {integrity: sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==} engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.3.2': + resolution: {integrity: sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -848,417 +1507,945 @@ packages: '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@ljharb/through@2.3.13': - resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} - engines: {node: '>= 0.4'} + '@mjackson/node-fetch-server@0.2.0': + resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==} - '@mdx-js/mdx@2.3.0': - resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + '@nestjs/cli@11.0.16': + resolution: {integrity: sha512-P0H+Vcjki6P5160E5QnMt3Q0X5FTg4PZkP99Ig4lm/4JWqfw32j3EXv3YBTJ2DmxLwOQ/IS9F7dzKpMAgzKTGg==} + engines: {node: '>= 20.11'} + hasBin: true + peerDependencies: + '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 + '@swc/core': ^1.3.62 + peerDependenciesMeta: + '@swc/cli': + optional: true + '@swc/core': + optional: true - '@mdx-js/react@2.3.0': - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + '@nestjs/schematics@11.0.1': + resolution: {integrity: sha512-PHPAUk4sXkfCxiMacD1JFC+vEyzXjZJRCu1KT2MmG2hrTiMDMk5KtMprro148JUefNuWbVyN0uLTJVSmWVzhoA==} peerDependencies: - react: '>=16' + typescript: '>=4.8.2' - '@napi-rs/simple-git-android-arm-eabi@0.1.16': - resolution: {integrity: sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} - '@napi-rs/simple-git-android-arm64@0.1.16': - resolution: {integrity: sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==} - engines: {node: '>= 10'} + '@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'} + + '@npmcli/git@4.1.0': + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@4.0.1': + resolution: {integrity: sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/promise-spawn@6.0.2': + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@parcel/watcher-android-arm64@2.5.4': + resolution: {integrity: sha512-hoh0vx4v+b3BNI7Cjoy2/B0ARqcwVNrzN/n7DLq9ZB4I3lrsvhrkCViJyfTj/Qi5xM9YFiH4AmHGK6pgH1ss7g==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@napi-rs/simple-git-darwin-arm64@0.1.16': - resolution: {integrity: sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==} - engines: {node: '>= 10'} + '@parcel/watcher-darwin-arm64@2.5.4': + resolution: {integrity: sha512-kphKy377pZiWpAOyTgQYPE5/XEKVMaj6VUjKT5VkNyUJlr2qZAn8gIc7CPzx+kbhvqHDT9d7EqdOqRXT6vk0zw==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@napi-rs/simple-git-darwin-x64@0.1.16': - resolution: {integrity: sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==} - engines: {node: '>= 10'} + '@parcel/watcher-darwin-x64@2.5.4': + resolution: {integrity: sha512-UKaQFhCtNJW1A9YyVz3Ju7ydf6QgrpNQfRZ35wNKUhTQ3dxJ/3MULXN5JN/0Z80V/KUBDGa3RZaKq1EQT2a2gg==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': - resolution: {integrity: sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==} - engines: {node: '>= 10'} + '@parcel/watcher-freebsd-x64@2.5.4': + resolution: {integrity: sha512-Dib0Wv3Ow/m2/ttvLdeI2DBXloO7t3Z0oCp4bAb2aqyqOjKPPGrg10pMJJAQ7tt8P4V2rwYwywkDhUia/FgS+Q==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.4': + resolution: {integrity: sha512-I5Vb769pdf7Q7Sf4KNy8Pogl/URRCKu9ImMmnVKYayhynuyGYMzuI4UOWnegQNa2sGpsPSbzDsqbHNMyeyPCgw==} + engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': - resolution: {integrity: sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==} - engines: {node: '>= 10'} + '@parcel/watcher-linux-arm-musl@2.5.4': + resolution: {integrity: sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.4': + resolution: {integrity: sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@napi-rs/simple-git-linux-arm64-musl@0.1.16': - resolution: {integrity: sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==} - engines: {node: '>= 10'} + '@parcel/watcher-linux-arm64-musl@2.5.4': + resolution: {integrity: sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@napi-rs/simple-git-linux-x64-gnu@0.1.16': - resolution: {integrity: sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==} - engines: {node: '>= 10'} + '@parcel/watcher-linux-x64-glibc@2.5.4': + resolution: {integrity: sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@napi-rs/simple-git-linux-x64-musl@0.1.16': - resolution: {integrity: sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==} - engines: {node: '>= 10'} + '@parcel/watcher-linux-x64-musl@2.5.4': + resolution: {integrity: sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': - resolution: {integrity: sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==} - engines: {node: '>= 10'} + '@parcel/watcher-win32-arm64@2.5.4': + resolution: {integrity: sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@napi-rs/simple-git-win32-x64-msvc@0.1.16': - resolution: {integrity: sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==} - engines: {node: '>= 10'} + '@parcel/watcher-win32-ia32@2.5.4': + resolution: {integrity: sha512-vQN+KIReG0a2ZDpVv8cgddlf67J8hk1WfZMMP7sMeZmJRSmEax5xNDNWKdgqSe2brOKTQQAs3aCCUal2qBHAyg==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.4': + resolution: {integrity: sha512-3A6efb6BOKwyw7yk9ro2vus2YTt2nvcd56AuzxdMiVOxL9umDyN5PKkKfZ/gZ9row41SjVmTVQNWQhaRRGpOKw==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@napi-rs/simple-git@0.1.16': - resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} - engines: {node: '>= 10'} + '@parcel/watcher@2.5.4': + resolution: {integrity: sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==} + engines: {node: '>= 10.0.0'} + + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} - '@nestjs/cli@10.3.2': - resolution: {integrity: sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==} - engines: {node: '>= 16.14'} + '@playwright/test@1.51.1': + resolution: {integrity: sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==} + engines: {node: '>=18'} hasBin: true + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + + '@radix-ui/primitive@1.1.1': + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + + '@radix-ui/react-accordion@1.2.3': + resolution: {integrity: sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A==} peerDependencies: - '@swc/cli': ^0.1.62 || ^0.3.0 - '@swc/core': ^1.3.62 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@swc/cli': + '@types/react': optional: true - '@swc/core': + '@types/react-dom': optional: true - '@nestjs/schematics@10.1.1': - resolution: {integrity: sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==} + '@radix-ui/react-arrow@1.1.2': + resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} peerDependencies: - typescript: '>=4.8.2' + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.3': + resolution: {integrity: sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.2': + resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@next/env@13.0.6': - resolution: {integrity: sha512-yceT6DCHKqPRS1cAm8DHvDvK74DLIkDQdm5iV+GnIts8h0QbdHvkUIkdOvQoOODgpr6018skbmSQp12z5OWIQQ==} + '@radix-ui/react-compose-refs@1.1.1': + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@next/env@13.5.6': - resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@next/swc-android-arm-eabi@13.0.6': - resolution: {integrity: sha512-FGFSj3v2Bluw8fD/X+1eXIEB0PhoJE0zfutsAauRhmNpjjZshLDgoXMWm1jTRL/04K/o9gwwO2+A8+sPVCH1uw==} - engines: {node: '>= 10'} + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.5': + resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.2': + resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popper@1.2.2': + resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.4': + resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.2': + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.2': + resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.1.6': + resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.2': + resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.2': + resolution: {integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@react-router/dev@7.2.0': + resolution: {integrity: sha512-GzSNGeWuhx6sMsnidCQAlCAephibUMC61xIAdsc6hBXWCJe/T9wUrvtnh2Xbcpr7BRZJtJN4UhI472ZURA6m9w==} + engines: {node: '>=20.0.0'} + hasBin: true + peerDependencies: + '@react-router/serve': ^7.2.0 + react-router: ^7.2.0 + typescript: ^5.1.0 + vite: ^5.1.0 || ^6.0.0 + wrangler: ^3.28.2 + peerDependenciesMeta: + '@react-router/serve': + optional: true + typescript: + optional: true + wrangler: + optional: true + + '@react-router/express@7.2.0': + resolution: {integrity: sha512-+lJXBYtBdJ8yeDv5DJW/z/Zc+6d+k0dyZoX+TUXoUlaoyoBagHOyBwKcijX80MYI1h71d+YZY1n7CV9M+0lVRw==} + engines: {node: '>=20.0.0'} + peerDependencies: + express: ^4.17.1 + react-router: 7.2.0 + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + '@react-router/node@7.2.0': + resolution: {integrity: sha512-CqBHLwvvV4BB8htmaSwT+SOwX9B4RVOIiEdTlaIp12sNVCGSYDIEGbv3T4Wxeq8p5ynNfhNcdBeXtZ6ZPWVozA==} + engines: {node: '>=20.0.0'} + peerDependencies: + react-router: 7.2.0 + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + '@react-router/serve@7.2.0': + resolution: {integrity: sha512-if6tQBqewTGv2/oGcgXh44XRyyWfxJICp6NAA++acbK1ol/1k/rcdIrSZXDP0Oz2+aItKTIXZR3sVYH/R80YXQ==} + engines: {node: '>=20.0.0'} + hasBin: true + peerDependencies: + react-router: 7.2.0 + + '@rolldown/pluginutils@1.0.0-beta.29': + resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} cpu: [arm] os: [android] - '@next/swc-android-arm64@13.0.6': - resolution: {integrity: sha512-7MgbtU7kimxuovVsd7jSJWMkIHBDBUsNLmmlkrBRHTvgzx5nDBXogP0hzZm7EImdOPwVMPpUHRQMBP9mbsiJYQ==} - engines: {node: '>= 10'} + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] - '@next/swc-darwin-arm64@13.0.6': - resolution: {integrity: sha512-AUVEpVTxbP/fxdFsjVI9d5a0CFn6NVV7A/RXOb0Y+pXKIIZ1V5rFjPwpYfIfyOo2lrqgehMNQcyMRoTrhq04xg==} - engines: {node: '>= 10'} + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@13.5.6': - resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==} - engines: {node: '>= 10'} + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@13.0.6': - resolution: {integrity: sha512-SasCDJlshglsPnbzhWaIF6VEGkQy2NECcAOxPwaPr0cwbbt4aUlZ7QmskNzgolr5eAjFS/xTr7CEeKJtZpAAtQ==} - engines: {node: '>= 10'} + '@rollup/rollup-darwin-x64@4.34.8': + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@13.5.6': - resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} - engines: {node: '>= 10'} + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} cpu: [x64] os: [darwin] - '@next/swc-freebsd-x64@13.0.6': - resolution: {integrity: sha512-6Lbxd9gAdXneTkwHyYW/qtX1Tdw7ND9UbiGsGz/SP43ZInNWnW6q0au4hEVPZ9bOWWRKzcVoeTBdoMpQk9Hx9w==} - engines: {node: '>= 10'} + '@rollup/rollup-freebsd-arm64@4.34.8': + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.8': + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} cpu: [x64] os: [freebsd] - '@next/swc-linux-arm-gnueabihf@13.0.6': - resolution: {integrity: sha512-wNdi5A519e1P+ozEuYOhWPzzE6m1y7mkO6NFwn6watUwO0X9nZs7fT9THmnekvmFQpaZ6U+xf2MQ9poQoCh6jQ==} - engines: {node: '>= 10'} + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} cpu: [arm] os: [linux] - '@next/swc-linux-arm64-gnu@13.0.6': - resolution: {integrity: sha512-e8KTRnleQY1KLk5PwGV5hrmvKksCc74QRpHl5ffWnEEAtL2FE0ave5aIkXqErsPdXkiKuA/owp3LjQrP+/AH7Q==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@13.5.6': - resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@13.0.6': - resolution: {integrity: sha512-/7RF03C3mhjYpHN+pqOolgME3guiHU5T3TsejuyteqyEyzdEyLHod+jcYH6ft7UZ71a6TdOewvmbLOtzHW2O8A==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm64-musl@4.34.8': + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@13.5.6': - resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@13.0.6': - resolution: {integrity: sha512-kxyEXnYHpOEkFnmrlwB1QlzJtjC6sAJytKcceIyFUHbCaD3W/Qb5tnclcnHKTaFccizZRePXvV25Ok/eUSpKTw==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@13.5.6': - resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@13.0.6': - resolution: {integrity: sha512-N0c6gubS3WW1oYYgo02xzZnNatfVQP/CiJq2ax+DJ55ePV62IACbRCU99TZNXXg+Kos6vNW4k+/qgvkvpGDeyA==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@13.5.6': - resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@13.0.6': - resolution: {integrity: sha512-QjeMB2EBqBFPb/ac0CYr7GytbhUkrG4EwFWbcE0vsRp4H8grt25kYpFQckL4Jak3SUrp7vKfDwZ/SwO7QdO8vw==} - engines: {node: '>= 10'} + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@13.5.6': - resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} - engines: {node: '>= 10'} + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@13.0.6': - resolution: {integrity: sha512-EQzXtdqRTcmhT/tCq81rIwE36Y3fNHPInaCuJzM/kftdXfa0F+64y7FAoMO13npX8EG1+SamXgp/emSusKrCXg==} - engines: {node: '>= 10'} + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} cpu: [ia32] os: [win32] - '@next/swc-win32-ia32-msvc@13.5.6': - resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} - engines: {node: '>= 10'} + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@13.0.6': - resolution: {integrity: sha512-pSkqZ//UP/f2sS9T7IvHLfEWDPTX0vRyXJnAUNisKvO3eF3e1xdhDX7dix/X3Z3lnN4UjSwOzclAI87JFbOwmQ==} - engines: {node: '>= 10'} + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@13.5.6': - resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} - engines: {node: '>= 10'} + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} cpu: [x64] os: [win32] - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + cpu: [x64] + os: [win32] - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@shikijs/engine-oniguruma@3.20.0': + resolution: {integrity: sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@shikijs/langs@3.20.0': + resolution: {integrity: sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==} - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@shikijs/themes@3.20.0': + resolution: {integrity: sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==} - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@shikijs/types@3.20.0': + resolution: {integrity: sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==} - '@react-native/normalize-colors@0.74.83': - resolution: {integrity: sha512-jhCY95gRDE44qYawWVvhTjTplW1g+JtKTKM3f8xYT1dJtJ8QWv+gqEtKcfmOHfDkSDaMKG0AGBaDTSK8GXLH8Q==} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@rollup/rollup-android-arm-eabi@4.17.2': - resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} - cpu: [arm] - os: [android] + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} - '@rollup/rollup-android-arm64@4.17.2': - resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} - cpu: [arm64] - os: [android] + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@sqltools/formatter@1.2.5': + resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1': + resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/vite-plugin-svelte@6.2.1': + resolution: {integrity: sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 - '@rollup/rollup-darwin-arm64@4.17.2': - resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + '@swc/core-darwin-arm64@1.10.18': + resolution: {integrity: sha512-FdGqzAIKVQJu8ROlnHElP59XAUsUzCFSNsou+tY/9ba+lhu8R9v0OI5wXiPErrKGZpQFMmx/BPqqhx3X4SuGNg==} + engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.17.2': - resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + '@swc/core-darwin-x64@1.10.18': + resolution: {integrity: sha512-RZ73gZRituL/ZVLgrW6BYnQ5g8tuStG4cLUiPGJsUZpUm0ullSH6lHFvZTCBNFTfpQChG6eEhi2IdG6DwFp1lw==} + engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': - resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.17.2': - resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + '@swc/core-linux-arm-gnueabihf@1.10.18': + resolution: {integrity: sha512-8iJqI3EkxJuuq21UHoen1VS+QlS23RvynRuk95K+Q2HBjygetztCGGEc+Xelx9a0uPkDaaAtFvds4JMDqb9SAA==} + engines: {node: '>=10'} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.17.2': - resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + '@swc/core-linux-arm64-gnu@1.10.18': + resolution: {integrity: sha512-8f1kSktWzMB6PG+r8lOlCfXz5E8Qhsmfwonn77T/OfjvGwQaWrcoASh2cdjpk3dydbf8jsKGPQE1lSc7GyjXRQ==} + engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.17.2': - resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + '@swc/core-linux-arm64-musl@1.10.18': + resolution: {integrity: sha512-4rv+E4VLdgQw6zjbTAauCAEExxChvxMpBUMCiZweTNPKbJJ2dY6BX2WGJ1ea8+RcgqR/Xysj3AFbOz1LBz6dGA==} + engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': - resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.17.2': - resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.17.2': - resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.17.2': - resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + '@swc/core-linux-x64-gnu@1.10.18': + resolution: {integrity: sha512-vTNmyRBVP+sZca+vtwygYPGTNudTU6Gl6XhaZZ7cEUTBr8xvSTgEmYXoK/2uzyXpaTUI4Bmtp1x81cGN0mMoLQ==} + engines: {node: '>=10'} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.17.2': - resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + '@swc/core-linux-x64-musl@1.10.18': + resolution: {integrity: sha512-1TZPReKhFCeX776XaT6wegknfg+g3zODve+r4oslFHI+g7cInfWlxoGNDS3niPKyuafgCdOjme2g3OF+zzxfsQ==} + engines: {node: '>=10'} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.17.2': - resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + '@swc/core-win32-arm64-msvc@1.10.18': + resolution: {integrity: sha512-o/2CsaWSN3bkzVQ6DA+BiFKSVEYvhWGA1h+wnL2zWmIDs2Knag54sOEXZkCaf8YQyZesGeXJtPEy9hh/vjJgkA==} + engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.17.2': - resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + '@swc/core-win32-ia32-msvc@1.10.18': + resolution: {integrity: sha512-eTPASeJtk4mJDfWiYEiOC6OYUi/N7meHbNHcU8e+aKABonhXrIo/FmnTE8vsUtC6+jakT1TQBdiQ8fzJ1kJVwA==} + engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.17.2': - resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + '@swc/core-win32-x64-msvc@1.10.18': + resolution: {integrity: sha512-1Dud8CDBnc34wkBOboFBQud9YlV1bcIQtKSg7zC8LtwR3h+XAaCayZPkpGmmAlCv1DLQPvkF+s0JcaVC9mfffQ==} + engines: {node: '>=10'} cpu: [x64] os: [win32] - '@shikijs/engine-oniguruma@1.27.2': - resolution: {integrity: sha512-FZYKD1KN7srvpkz4lbGLOYWlyDU4Rd+2RtuKfABTkafAPOFr+J6umfIwY/TzOQqfNtWjL7SAwPAO0dcOraRLaQ==} + '@swc/core@1.10.18': + resolution: {integrity: sha512-IUWKD6uQYGRy8w2X9EZrtYg1O3SCijlHbCXzMaHQYc1X7yjijQh4H3IVL9ssZZyVp2ZDfQZu4bD5DWxxvpyjvg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@shikijs/types@1.27.2': - resolution: {integrity: sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg==} + '@swc/types@0.1.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} - '@shikijs/vscode-textmate@10.0.1': - resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@tailwindcss/node@4.0.8': + resolution: {integrity: sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@tailwindcss/oxide-android-arm64@4.0.8': + resolution: {integrity: sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@tailwindcss/oxide-darwin-arm64@4.0.8': + resolution: {integrity: sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] - '@sqltools/formatter@1.2.5': - resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + '@tailwindcss/oxide-darwin-x64@4.0.8': + resolution: {integrity: sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] - '@swc/helpers@0.4.14': - resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + '@tailwindcss/oxide-freebsd-x64@4.0.8': + resolution: {integrity: sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8': + resolution: {integrity: sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] - '@swc/helpers@0.5.2': - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + '@tailwindcss/oxide-linux-arm64-gnu@4.0.8': + resolution: {integrity: sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - '@tanstack/query-core@5.56.2': - resolution: {integrity: sha512-gor0RI3/R5rVV3gXfddh1MM+hgl0Z4G7tj6Xxpq6p2I03NGPaJ8dITY9Gz05zYYb/EJq9vPas/T4wn9EaDPd4Q==} + '@tailwindcss/oxide-linux-arm64-musl@4.0.8': + resolution: {integrity: sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - '@tanstack/react-query@5.56.2': - resolution: {integrity: sha512-SR0GzHVo6yzhN72pnRhkEFRAHMsUo5ZPzAxfTMvUxFIDVS6W9LYUp6nXW3fcHVdg0ZJl8opSH85jqahvm6DSVg==} - peerDependencies: - react: ^18 || ^19 + '@tailwindcss/oxide-linux-x64-gnu@4.0.8': + resolution: {integrity: sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.0.8': + resolution: {integrity: sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-win32-arm64-msvc@4.0.8': + resolution: {integrity: sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.0.8': + resolution: {integrity: sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.0.8': + resolution: {integrity: sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==} + engines: {node: '>= 10'} - '@tanstack/react-virtual@3.5.0': - resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==} + '@tailwindcss/vite@4.0.8': + resolution: {integrity: sha512-+SAq44yLzYlzyrb7QTcFCdU8Xa7FOA0jp+Xby7fPMUie+MY9HhJysM7Vp+vL8qIp8ceQJfLD+FjgJuJ4lL6nyg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + vite: ^5.2.0 || ^6 - '@tanstack/virtual-core@3.5.0': - resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} + '@tanstack/match-sorter-utils@8.19.4': + resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} + engines: {node: '>=12'} - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@tanstack/query-core@5.90.19': + resolution: {integrity: sha512-GLW5sjPVIvH491VV1ufddnfldyVB+teCnpPIvweEfkpRx7CfUmUGhoh9cdcUKBh/KwVxk22aNEDxeTsvmyB/WA==} - '@testing-library/react@14.3.1': - resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} - engines: {node: '>=14'} + '@tanstack/react-query@5.90.19': + resolution: {integrity: sha512-qTZRZ4QyTzQc+M0IzrbKHxSeISUmRB3RPGmao5bT+sI6ayxSRhn0FXEnT5Hg3as8SBFcRosrXXRFB+yAcxVxJQ==} peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18 || ^19 - '@theguild/remark-mermaid@0.0.5': - resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} + '@tanstack/solid-query@5.90.22': + resolution: {integrity: sha512-gu+KfBSBCth3N2IsVWcpJWinFsokOElm3D2IpyaezDq/N6OZVSBn0qSo35HlTxD3gbAscKzIFLJNRinMXOCSYA==} peerDependencies: - react: ^18.2.0 + solid-js: ^1.6.0 - '@theguild/remark-npm2yarn@0.2.1': - resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} + '@tanstack/svelte-query@6.0.17': + resolution: {integrity: sha512-SFFsW99Z5DCI9rIowJrPBGEJgl5i+Lzimzoup+P1LhHUIrSyJ4R7KcroFlIxTHz0XaYTAqpNjhXuUUvOqjdTHQ==} + peerDependencies: + svelte: ^5.25.0 - '@total-typescript/ts-reset@0.5.1': - resolution: {integrity: sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==} + '@tanstack/vue-query@5.92.8': + resolution: {integrity: sha512-MBNFWyL7cZWwIKpPGnBUad2Sm9K08Elo7YWobQQoYKUm3uLKwBLOtfAtO94M6VNIuk7k2kV5ZN9cTXOeAt7/aQ==} + peerDependencies: + '@vue/composition-api': ^1.1.2 + vue: ^2.6.0 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true '@trpc/server@10.45.2': resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} @@ -1275,35 +2462,32 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@tsconfig/recommended@1.0.7': - resolution: {integrity: sha512-xiNMgCuoy4mCL4JTywk9XFs5xpRUcKxtWEcMR6FNMtsgewYTIgIR+nvlP4A4iRCAzRsHMnPhvTRrzp4AGcRTEA==} + '@tsconfig/node22@22.0.2': + resolution: {integrity: sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==} - '@tsconfig/recommended@1.0.8': - resolution: {integrity: sha512-TotjFaaXveVUdsrXCdalyF6E5RyG6+7hHHQVZonQtdlk1rJZ1myDIvPUUKPhoYv+JAzThb2lQJh9+9ZfF46hsA==} + '@tsconfig/recommended@1.0.10': + resolution: {integrity: sha512-cGvydvg03lONp5Z9yaplW493Vw9/um7k588mvDkm+VFPF2PZUVPx0uswq4PFpeEySsLbQRETrDRhzh4Dmxaslw==} - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@tsconfig/svelte@5.0.5': + resolution: {integrity: sha512-48fAnUjKye38FvMiNOj0J9I/4XlQQiZlpe9xaNPfe8vy2Y1hFBt8g1yqf2EGjVvHavo4jf2lC+TQyENCr4BJBQ==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -1311,20 +2495,14 @@ packages: '@types/cookie@0.4.1': resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -1332,27 +2510,24 @@ packages: '@types/eslint@8.56.10': resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/express-serve-static-core@4.19.0': - resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@5.0.1': + resolution: {integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==} + + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} - '@types/hast@2.3.10': - resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} - '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1365,38 +2540,32 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - '@types/katex@0.16.7': - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/mdast@4.0.3': - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + '@types/multer@2.0.0': + resolution: {integrity: sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/node@20.17.19': + resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} - '@types/mocha@10.0.6': - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} + '@types/node@20.17.24': + resolution: {integrity: sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/node@22.18.10': + resolution: {integrity: sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==} - '@types/node@18.19.33': - resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + '@types/node@24.7.2': + resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} '@types/qs@6.9.15': resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} @@ -1404,14 +2573,18 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + peerDependencies: + '@types/react': ^19.0.0 - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@types/react-reconciler@0.28.9': + resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} + peerDependencies: + '@types/react': '*' - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -1419,9 +2592,6 @@ packages: '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} @@ -1431,238 +2601,227 @@ packages: '@types/ws@8.5.10': resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/eslint-plugin@8.27.0': + resolution: {integrity: sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/parser@8.27.0': + resolution: {integrity: sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@8.27.0': + resolution: {integrity: sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.27.0': + resolution: {integrity: sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@8.27.0': + resolution: {integrity: sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.27.0': + resolution: {integrity: sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/utils@8.27.0': + resolution: {integrity: sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@8.27.0': + resolution: {integrity: sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@vitejs/plugin-vue@6.0.1': + resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.2.25 - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: - typescript: + msw: + optional: true + vite: optional: true - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + '@volar/language-core@2.4.23': + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@volar/source-map@2.4.23': + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} + + '@volar/typescript@2.4.23': + resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} + + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} peerDependencies: - typescript: '*' + '@babel/core': ^7.0.0-0 peerDependenciesMeta: - typescript: + '@babel/core': optional: true - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@babel/core': ^7.0.0-0 - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@vue/compiler-sfc@3.5.22': + resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} - '@vitejs/plugin-react@4.2.1': - resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} - engines: {node: ^14.18.0 || >=16.0.0} + '@vue/compiler-ssr@3.5.22': + resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-core@8.0.2': + resolution: {integrity: sha512-V7eKTTHoS6KfK8PSGMLZMhGv/9yNDrmv6Qc3r71QILulnzPnqK2frsTyx3e2MrhdUZnENPEm6hcb4z0GZOqNhw==} peerDependencies: - vite: ^4.2.0 || ^5.0.0 + vue: ^3.0.0 + + '@vue/devtools-kit@8.0.2': + resolution: {integrity: sha512-yjZKdEmhJzQqbOh4KFBfTOQjDPMrjjBNCnHBvnTGJX+YLAqoUtY2J+cg7BE+EA8KUv8LprECq04ts75wCoIGWA==} + + '@vue/devtools-shared@8.0.2': + resolution: {integrity: sha512-mLU0QVdy5Lp40PMGSixDw/Kbd6v5dkQXltd2r+mdVQV7iUog2NlZuLxFZApFZ/mObUBDhoCpf0T3zF2FWWdeHw==} - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vue/language-core@3.1.1': + resolution: {integrity: sha512-qjMY3Q+hUCjdH+jLrQapqgpsJ0rd/2mAY02lZoHG3VFJZZZKLjAlV+Oo9QmWIT4jh8+Rx8RUGUi++d7T9Wb6Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vue/reactivity@3.5.22': + resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vue/runtime-core@3.5.22': + resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vue/runtime-dom@3.5.22': + resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} - '@vitest/ui@1.6.0': - resolution: {integrity: sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==} + '@vue/server-renderer@3.5.22': + resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} peerDependencies: - vitest: 1.6.0 + vue: 3.5.22 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@vue/tsconfig@0.8.1': + resolution: {integrity: sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==} + peerDependencies: + typescript: 5.x + vue: ^3.4.0 + peerDependenciesMeta: + typescript: + optional: true + vue: + optional: true '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - '@webassemblyjs/floating-point-hex-parser@1.13.2': resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - '@webassemblyjs/helper-api-error@1.13.2': resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - '@webassemblyjs/helper-buffer@1.14.1': resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - '@webassemblyjs/helper-numbers@1.13.2': resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - '@webassemblyjs/helper-wasm-bytecode@1.13.2': resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} - '@webassemblyjs/helper-wasm-section@1.14.1': resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - '@webassemblyjs/ieee754@1.13.2': resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - '@webassemblyjs/leb128@1.13.2': resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - '@webassemblyjs/utf8@1.13.2': resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} - '@webassemblyjs/wasm-edit@1.14.1': resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} - '@webassemblyjs/wasm-gen@1.14.1': resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} - '@webassemblyjs/wasm-opt@1.14.1': resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} - '@webassemblyjs/wasm-parser@1.14.1': resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} - '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} @@ -1672,6 +2831,10 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + abbrev@3.0.0: + resolution: {integrity: sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==} + engines: {node: ^18.17.0 || >=20.5.0} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -1683,11 +2846,15 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - acorn-import-assertions@1.9.0: - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - deprecated: package has been renamed to acorn-import-attributes + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} peerDependencies: - acorn: ^8 + acorn: ^8.14.0 acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1698,19 +2865,19 @@ packages: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - hasBin: true acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} @@ -1733,30 +2900,27 @@ packages: peerDependencies: ajv: ^6.9.1 + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - - ajv@8.13.0: - resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} + alien-signals@3.0.0: + resolution: {integrity: sha512-JHoRJf18Y6HN4/KZALr3iU+0vW9LKG+8FMThQlbn4+gv8utsLIkwpomjElGPccGeNwh0FI2HN6BLnyFLo6OyLQ==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -1766,41 +2930,24 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} app-root-path@3.1.0: resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} engines: {node: '>= 6.0.0'} - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - - arg@1.0.0: - resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} + append-field@1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -1808,105 +2955,74 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} + arkregex@0.0.5: + resolution: {integrity: sha512-ncYjBdLlh5/QnVsAA8De16Tc9EqmYM7y/WU9j+236KcyYNUXogpz3sC4ATIZYzzLxwI+0sEOaQLEmLmRleaEXw==} + + arktype@2.1.29: + resolution: {integrity: sha512-jyfKk4xIOzvYNayqnD8ZJQqOwcrTOUbIU4293yrzAjA3O1dWh61j71ArMQ6tS/u4pD7vabSPe7nG3RCyoXW6RQ==} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + avvio@9.0.0: + resolution: {integrity: sha512-UbYrOXgE/I+knFG+3kJr9AgC7uNo8DG+FGGODpH9Bj1O1kL/QDjBXnTem9leD3VdQKtaHjV3O85DQ7hHh4IIHw==} - array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + babel-dead-code-elimination@1.0.9: + resolution: {integrity: sha512-JLIhax/xullfInZjtu13UJjaLHDeTzt3vOeomaSUdO/nAMEL/pWC/laKrSvWylXMnVWyL5bpmG9njqBZlUQOdg==} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + babel-plugin-jsx-dom-expressions@0.40.1: + resolution: {integrity: sha512-b4iHuirqK7RgaMzB2Lsl7MqrlDgQtVRSSazyrmx7wB3T759ggGjod5Rkok5MfHjQXhR7tRPmdwoeGPqBnW2KfA==} + peerDependencies: + '@babel/core': ^7.20.12 - astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - - autoprefixer@10.4.19: - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true + babel-preset-solid@1.9.9: + resolution: {integrity: sha512-pCnxWrciluXCeli/dj5PIEHgbNzim3evtTn12snjqqg8QZWJNMjH1AWIp4iG/tbVjqQ72aBEymMSagvmgxubXw==} peerDependencies: - postcss: ^8.1.0 - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - avvio@9.0.0: - resolution: {integrity: sha512-UbYrOXgE/I+knFG+3kJr9AgC7uNo8DG+FGGODpH9Bj1O1kL/QDjBXnTem9leD3VdQKtaHjV3O85DQ7hHh4IIHw==} - - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - - axios@1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} - - babel-plugin-react-native-web@0.19.11: - resolution: {integrity: sha512-0sHf8GgDhsRZxGwlwHHdfL3U8wImFaLw4haEa60U9M3EiO3bg6u3BJ+1vXhwgrevqSq76rMb5j1HJs+dNvMj5g==} - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + '@babel/core': ^7.0.0 + solid-js: ^1.9.8 + peerDependenciesMeta: + solid-js: + optional: true balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1918,22 +3034,37 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - better-sqlite3@9.6.0: - resolution: {integrity: sha512-yR5HATnqeYNVnkaUTf4bOP2dJSnyhP4puJN/QPRyx4YkBEEUxib422n2XzPqDEHjQQqazoYoADdAm5vE15+dAQ==} + baseline-browser-mapping@2.8.16: + resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} + hasBin: true + + baseline-browser-mapping@2.9.14: + resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} + hasBin: true - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + beautify@0.0.8: + resolution: {integrity: sha512-1iF6Ey2qxDkm6bPgKcoXUmwFDpoRi5IgwefQDDQBRLxlZAAYwcULoQ2IdBArXZuSsuL7AT+KvZI9xZVLeUZPRg==} + hasBin: true - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + better-sqlite3@12.5.0: + resolution: {integrity: sha512-WwCZ/5Diz7rsF29o27o0Gcc1Du+l7Zsv7SYtVPG0X3G/uUI1LqdxrQI7c9Hs2FWpqXXERjW9hp6g3/tH7DlVKg==} + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bippy@0.3.7: + resolution: {integrity: sha512-nY9cP//b0SbEHmcsAogMZicomKz0arc4jT9o17E73vFVFyen+jkV/bzHHq4USRNgcYrpYn/M8FUbJuxlTLX2Tg==} + peerDependencies: + react: '>=17.0.1' + + birpc@2.6.1: + resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -1941,26 +3072,39 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + + body-parser@2.2.1: + resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} + engines: {node: '>=18'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1973,10 +3117,14 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} engines: {node: '>=6.14.2'} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -1989,140 +3137,103 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001617: - resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==} - caniuse-lite@1.0.30001692: resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} - capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + caniuse-lite@1.0.30001750: + resolution: {integrity: sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==} - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + caniuse-lite@1.0.30001764: + resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@2.3.0: - resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} - engines: {node: '>=4'} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chain-function@1.0.1: + resolution: {integrity: sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + ci-info@4.1.0: + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} engines: {node: '>=8'} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - cli-highlight@2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} - cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - clipboardy@1.2.2: - resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} - engines: {node: '>=4'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2131,20 +3242,18 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -2155,12 +3264,13 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} - commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2169,49 +3279,62 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + comment-json@4.2.5: + resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} engines: {node: '>= 6'} - compute-scroll-into-view@3.1.0: - resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + engines: {node: '>= 0.8.0'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} + hasBin: true - constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} @@ -2220,6 +3343,18 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2227,8 +3362,9 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} @@ -2247,75 +3383,21 @@ packages: engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true - cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-in-js-utils@3.1.0: - resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} - - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + cssbeautify@0.3.1: + resolution: {integrity: sha512-ljnSOCOiMbklF+dwPbpooyB78foId02vUrTDogWzu6ca2DCNB7Kc/BHEGBnYOlUYtwXvSW0mWTwaiO2pwFIoRg==} hasBin: true - cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - cytoscape-cose-bilkent@4.1.0: - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape@3.29.2: - resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} - engines: {node: '>=0.10'} - - d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - - d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} - - d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} - d3-color@3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} - d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} - - d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} - d3-dispatch@3.0.1: resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} engines: {node: '>=12'} @@ -2324,34 +3406,12 @@ packages: resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} engines: {node: '>=12'} - d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true - d3-ease@3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} - d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} - - d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - - d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - - d3-geo@3.1.1: - resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} - engines: {node: '>=12'} - - d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} + d3-hierarchy@1.1.9: + resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} d3-interpolate@3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} @@ -2360,33 +3420,6 @@ packages: d3-path@1.0.9: resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - - d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - - d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - - d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} - - d3-scale-chromatic@3.1.0: - resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - d3-selection@3.0.0: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} @@ -2394,18 +3427,6 @@ packages: d3-shape@1.3.7: resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - d3-timer@3.0.1: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} @@ -2420,35 +3441,11 @@ packages: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} - d3@7.9.0: - resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} - engines: {node: '>=12'} - - dagre-d3-es@7.0.10: - resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} - - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - - 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'} - - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -2458,16 +3455,17 @@ packages: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2475,27 +3473,47 @@ packages: supports-color: optional: true - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + dedent@1.7.1: + resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} @@ -2508,6 +3526,14 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -2515,12 +3541,9 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delaunator@5.0.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -2538,78 +3561,62 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-helpers@3.4.0: + resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} - dompurify@3.1.2: - resolution: {integrity: sha512-hLGGBI1tw5N8qTELr3blKjAML/LY4ANxksbS612UiJyDfyf/2D092Pvm+S7pmeTGJRqvlJkFzBoHBQKgQlOQVg==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.4.760: - resolution: {integrity: sha512-xF6AWMVM/QGQseTPgXjUewfNjCW2fgUcV/z5cSG0r+SiYcgtvcmRAL3oH/MSZwHBBD+fyKTXdQ4qGENJMSedEQ==} + electron-to-chromium@1.5.234: + resolution: {integrity: sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==} + + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} electron-to-chromium@1.5.83: resolution: {integrity: sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==} - elkjs@0.9.3: - resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2617,10 +3624,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -2643,66 +3646,65 @@ packages: resolution: {integrity: sha512-NEpDCw9hrvBW+hVEOK4T7v0jFJ++KgtPl4jKFwsZVfG1XhS0dCrSb3VMb9gPAd7VAdW52VT1EnaNiU2vM8C0og==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.16.1: - resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} - engines: {node: '>=10.13.0'} - - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} - engines: {node: '>= 0.4'} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - es-module-lexer@1.5.2: - resolution: {integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} @@ -2711,141 +3713,55 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - eslint-config-prettier@8.10.0: - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-config-universe@11.3.0: - resolution: {integrity: sha512-CL6v7IxV+OJn0q1vqtFVtX+sNUdY7MiIy3/XD0dy96D7RsDvYBWWqs4S1AIB4AdVgraNnv829q1+asluAePSSw==} - peerDependencies: - eslint: '>=8.10' - prettier: '>=2.4' - peerDependenciesMeta: - prettier: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-es@3.0.1: - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-node@11.1.0: - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' - - eslint-plugin-prettier@4.2.1: - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.34.1: - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - - eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.22.0: + resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} + esrap@2.1.0: + resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -2858,24 +3774,8 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} - - estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} - - estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - - estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} - - estree-util-value-to-estree@1.3.0: - resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} - engines: {node: '>=12.0.0'} - - estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -2899,36 +3799,37 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - - execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + engines: {node: ^18.19.0 || >=20.5.0} + + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - express@4.21.0: - resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} - engines: {node: '>= 0.10.0'} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -2936,11 +3837,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -2952,9 +3850,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-loops@1.1.3: - resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} - fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} @@ -2968,77 +3863,75 @@ packages: fast-uri@3.0.1: resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} - fastify-plugin@4.5.1: - resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + fastify-plugin@5.0.1: + resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} - fastify@5.0.0: - resolution: {integrity: sha512-Qe4dU+zGOzg7vXjw4EvcuyIbNnMwTmcuOhlOrOJsgwzvjEZmsM/IeHulgJk+r46STjdJS/ZJbxO8N70ODXDMEQ==} + fastify@5.6.1: + resolution: {integrity: sha512-WjjlOciBF0K8pDUPZoGPhqhKrQJ02I8DKaDIfO51EL0kbSMwQFl85cRwhOvmSDWoukNOdTo27gLN549pLCcH7Q==} + + fastify@5.6.2: + resolution: {integrity: sha512-dPugdGnsvYkBlENLhCgX8yhyGCsCPrpA8lFWbTNU428l+YOnLgYHR69hzV8HWPC79n536EqzqQtvhtdaCE0dKg==} fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fbjs-css-vars@1.0.2: - resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} - - fbjs@3.0.5: - resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} - - fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - figures@5.0.0: - resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} - engines: {node: '>=14'} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} - file-loader@4.3.0: - resolution: {integrity: sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==} - engines: {node: '>= 8.9.0'} - peerDependencies: - webpack: ^4.0.0 + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} finalhandler@1.3.1: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-my-way@9.0.1: resolution: {integrity: sha512-/5NN/R0pFWuff16TMajeKt2JyiW+/OE8nOO8vo1DwZTxLaIURb7lcBYPIgRPh61yCNh9l8voeKwcrkUzmB00vw==} engines: {node: '>=14'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - flexsearch@0.7.43: - resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} - focus-visible@5.2.0: - resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} @@ -3049,35 +3942,51 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - fork-ts-checker-webpack-plugin@9.0.2: - resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + fork-ts-checker-webpack-plugin@9.1.0: + resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==} + engines: {node: '>=14.21.3'} peerDependencies: typescript: '>3.6.0' webpack: ^5.11.0 - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + framer-motion@12.4.7: + resolution: {integrity: sha512-VhrcbtcAMXfxlrjeHPpWVu2+mkcoR31e02aNSR7OUS/hZAciKa8q6o3YN2mA1h+jjscRsSyKvX6E1CiY/7OLMw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -3085,8 +3994,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} fs-monkey@1.0.6: @@ -3095,6 +4004,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3103,13 +4017,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -3118,41 +4025,37 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - - git-url-parse@13.1.1: - resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3164,47 +4067,32 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} hasBin: true - glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3212,20 +4100,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -3238,110 +4115,63 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hash-obj@4.0.0: - resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} - engines: {node: '>=12'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-from-dom@5.0.0: - resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} - - hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} - - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} - - hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@9.0.3: - resolution: {integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==} - - hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + hono@4.11.3: + resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==} + engines: {node: '>=16.9.0'} - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hono@4.9.11: + resolution: {integrity: sha512-MyJ4xop3boTyXl8bJBh4i20AAZTLM3AXUJphyrUb0CpgTKYb1N703z53XiKUKchGUpcPqiiYkiLOXA3kqK3icA==} + engines: {node: '>=16.9.0'} - hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + hosted-git-info@6.1.3: + resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + html@1.0.0: + resolution: {integrity: sha512-lw/7YsdKiP3kk5PnR1INY17iJuzdAtJewxr14ozKJWbbR97znovZ0mh+WEMZ8rjc3lgTK+ID/htTjuyGKB52Kw==} hasBin: true - header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - - highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - - hono@4.6.2: - resolution: {integrity: sha512-v+39817TgAhetmHUEli8O0uHDmxp2Up3DnhS4oUZXOl5IQ9np9tYtldd42e5zgdLVS0wsOoXQNZ6mx+BGmEvCA==} - engines: {node: '>=16.9.0'} - - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} - engines: {node: '>= 14'} - - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} - hyphenate-style-name@1.0.4: - resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true i18next@23.15.1: resolution: {integrity: sha512-wB4abZ3uK7EWodYisHl/asf8UYEhrI/vj/8aoSsrj/ZDxj4/UXPOa1KvFt1Fq5hkUHquNqwFlDprmjZ8iySgYA==} @@ -3354,11 +4184,19 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -3379,38 +4217,6 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - - inline-style-prefixer@6.0.4: - resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} - - inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} - - inquirer@9.2.12: - resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} - engines: {node: '>=14.18.0'} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - intersection-observer@0.12.2: - resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - intl-pluralrules@2.0.1: resolution: {integrity: sha512-astxTLzIdXPeN0K9Rumi6LfMpm3rvNO0iJE+h/k8Kr/is+wPbRe4ikyDjlLr6VTh/mEfNv8RjN+gu3KwDiuhqg==} @@ -3418,75 +4224,36 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - - is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + is-ci@4.1.0: + resolution: {integrity: sha512-Ab9bQDQ11lWootZUI5qxgN2ZXwxNI5hTwnsvOc1wyxQ7zQ8OkEDw79mI0+9jI3x432NfwbVRru+3noJfXF6lSQ==} hasBin: true is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - 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'} - - is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + 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 is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -3495,164 +4262,124 @@ packages: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isbot@5.1.23: + resolution: {integrity: sha512-ie3ehy2iXdkuzaZx32SoKb9b8l9Cm8cqQ1lJjQXnq8GRTrk/Jx7IUDcB4mhlw6H3gWaMqGYoWeV0lPv1P/20Ig==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-beautify@1.15.3: + resolution: {integrity: sha512-rKKGuyTxGNlyN4EQKWzNndzXpi0bOl8Gl8YQAW1as/oMz0XhD6sHJO1hTvoBDOSzKuJb9WkwoAb34FfdkKMv2A==} + engines: {node: '>=14'} hasBin: true + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} hasBin: true - jsdom@23.2.0: - resolution: {integrity: sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: @@ -3661,6 +4388,14 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-parse-even-better-errors@4.0.0: + resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} + engines: {node: ^18.17.0 || >=20.5.0} + json-schema-ref-resolver@1.0.1: resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} @@ -3673,52 +4408,26 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - - jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - katex@0.16.10: - resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} - hasBin: true - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - kysely@0.27.5: - resolution: {integrity: sha512-s7hZHcQeSNKpzCkHRm8yA+0JPLjncSWnjb+2TIElwS2JAqYr+Kv3Ess+9KFfJS0C1xcQ1i9NkNHpWwCYpHMWsA==} - engines: {node: '>=14.0.0'} - - layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + kysely@0.28.9: + resolution: {integrity: sha512-3BeXMoiOhpOwu62CiVpO6lxfq4eS6KMYfQdMsN/2kUCRNuF2YiEr7u0HLHaQU+O4Xu8YXE3bHVkwaQ85i72EuA==} + engines: {node: '>=20.0.0'} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -3727,12 +4436,72 @@ packages: light-my-request@6.0.0: resolution: {integrity: sha512-kFkFXrmKCL0EEeOmJybMH5amWFd+AFvlvMlvFTRxCUwbhfapZqDmeLMPoWihntnYY6JpoQDE9k+vOzObF1fDqg==} - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + lightningcss-darwin-arm64@1.29.1: + resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.1: + resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.1: + resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.1: + resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.1: + resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.1: + resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.1: + resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.1: + resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.1: + resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.1: + resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.1: + resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} + engines: {node: '>= 12.0.0'} - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} lines-and-columns@1.2.4: @@ -3741,42 +4510,34 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@14.0.1: - resolution: {integrity: sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==} - engines: {node: ^16.14.0 || >=18.0.0} + lint-staged@15.5.0: + resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==} + engines: {node: '>=18.12.0'} hasBin: true - listr2@6.6.1: - resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} - engines: {node: '>=16.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - loader-utils@1.4.2: - resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} - engines: {node: '>=4.0.0'} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -3787,123 +4548,54 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - log-update@5.0.1: - resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lru-cache@10.2.2: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} - markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - - match-sorter@6.3.4: - resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} - - mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - - mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - - mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} - - mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} - - mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} - - mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} - - mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} - - mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - - mdast-util-math@2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} - - mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} - - mdast-util-mdx-jsx@2.1.4: - resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} - - mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} - - mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} - - mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - - mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} - - mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -3912,6 +4604,10 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} @@ -3919,9 +4615,21 @@ packages: memoize-one@6.0.0: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3929,148 +4637,30 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@10.9.0: - resolution: {integrity: sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==} - methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - - micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} - - micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} - - micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} - - micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} - - micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} - - micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} - - micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} - - micromark-extension-math@2.1.2: - resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} - - micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} - - micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} - - micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} - - micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} - - micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} - - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - - micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} - - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} - - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - - micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} - - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -4084,27 +4674,23 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - - minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} engines: {node: '>=16 || 14 >=14.17'} minimatch@9.0.5: @@ -4114,14 +4700,17 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - - minipass@7.1.0: - resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -4129,25 +4718,22 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true - mkdirp@2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} - hasBin: true + morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + motion-dom@12.4.5: + resolution: {integrity: sha512-Q2xmhuyYug1CGTo0jdsL05EQ4RhIYXlggFS/yPhQQRNzbrhjKQ1tbjThx5Plv68aX31LsUQRq4uIkuDxdO5vRQ==} - mocha@10.4.0: - resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} - engines: {node: '>= 14.0.0'} - hasBin: true + motion-utils@12.0.0: + resolution: {integrity: sha512-MNFiBKbbqnmvOjkPyOKgHUp3Q6oiokLkI1bEwm5QA28cxMZrv0CbbBGDNmhF6DIXsi1pCQBSs0dX8xjeER1tmA==} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} ms@2.0.0: @@ -4159,27 +4745,35 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - 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} + multer@2.0.2: + resolution: {integrity: sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==} + engines: {node: '>= 10.16.0'} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -4187,91 +4781,16 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - next-mdx-remote@4.4.1: - resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} - engines: {node: '>=14', npm: '>=7'} - peerDependencies: - react: '>=16.x <=18.x' - react-dom: '>=16.x <=18.x' - - next-seo@6.5.0: - resolution: {integrity: sha512-MfzUeWTN/x/rsKp/1n0213eojO97lIl0unxqbeCY+6pAucViHDA8GSLRRcXpgjsSmBxfCFdfpu7LXbt4ANQoNQ==} - peerDependencies: - next: ^8.1.1-canary.54 || >=9.0.0 - react: '>=16.0.0' - react-dom: '>=16.0.0' - - next-sitemap@4.2.3: - resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} - engines: {node: '>=14.18'} - hasBin: true - peerDependencies: - next: '*' - - next-themes@0.2.1: - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' - - next-videos@1.4.1: - resolution: {integrity: sha512-cdEbyBwsbp76LCY6gTZxGT/5meRilmNsvUqxIbdu2y6JEdAWLWyL3yOUlsRgrkDq3j6lL74jwzcVzwo3YpMoSg==} - - next@13.0.6: - resolution: {integrity: sha512-COvigvms2LRt1rrzfBQcMQ2GZd86Mvk1z+LOLY5pniFtL4VrTmhZ9salrbKfSiXbhsD01TrDdD68ec3ABDyscA==} - engines: {node: '>=14.6.0'} - hasBin: true - peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^6.0.0 || ^7.0.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - - next@13.5.6: - resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} - engines: {node: '>=16.14.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - sass: - optional: true - - nextra-theme-docs@2.13.2: - resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} - peerDependencies: - next: '>=9.5.3' - nextra: 2.13.2 - react: '>=16.13.1' - react-dom: '>=16.13.1' + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} - nextra@2.13.2: - resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} - engines: {node: '>=16'} - peerDependencies: - next: '>=9.5.3' - react: '>=16.13.1' - react-dom: '>=16.13.1' + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} node-abi@3.62.0: resolution: {integrity: sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==} @@ -4280,105 +4799,97 @@ packages: node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-gyp-build@4.8.1: resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} + normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@4.0.0: + resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} + engines: {node: ^18.17.0 || >=20.5.0} + + npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-pick-manifest@8.0.2: + resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-all2@8.0.4: + resolution: {integrity: sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA==} + engines: {node: ^20.5.0 || >=22.0.0, npm: '>= 10'} + hasBin: true npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npm-to-yarn@2.2.1: - resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -4390,6 +4901,14 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -4398,70 +4917,44 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - - parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} - - parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - - parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - - parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + path-equal@1.2.5: + resolution: {integrity: sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -4471,10 +4964,6 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -4486,12 +4975,20 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} - path-to-regexp@0.1.10: - resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -4500,14 +4997,18 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4516,91 +5017,63 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@3.0.1: - resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} - engines: {node: '>=10'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - pino-abstract-transport@1.2.0: resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + pino-std-serializers@6.2.2: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@10.1.0: + resolution: {integrity: sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==} + hasBin: true + pino@9.0.0: resolution: {integrity: sha512-uI1ThkzTShNSwvsUM6b4ND8ANzWURk9zTELMztFkmnCQeR/4wkomJ+echHee5GMWGovoSfjwdeu80DsFIt7mbA==} hasBin: true - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + playwright-core@1.51.1: + resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} + engines: {node: '>=18'} + hasBin: true - pkg-types@1.1.0: - resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} + playwright@1.51.1: + resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==} + engines: {node: '>=18'} + hasBin: true pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prebuild-install@7.1.2: @@ -4612,22 +5085,26 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: 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} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.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} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} @@ -4635,21 +5112,30 @@ packages: process-warning@4.0.0: resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - promise@7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - - protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -4658,15 +5144,15 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -4679,8 +5165,9 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4699,45 +5186,116 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + react-d3-tree@3.6.5: + resolution: {integrity: sha512-U/PH6hqgP8m6RvYmxqjqsXBeMowuSMfX4jE+uiBB4lM5CcdrnpR1V7U6h4xsOkPWxpoTqFFotsDnzvZ/D42YKg==} peerDependencies: - react: ^18.2.0 - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react: 16.x || 17.x || 18.x || 19.x + react-dom: 16.x || 17.x || 18.x || 19.x - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-diff-viewer-continued@4.0.5: + resolution: {integrity: sha512-L43gIPdhHgu1MYdip4vNqAt5s2JLICKe2/RyGUr2ohAxfhYaH1+QZ6vBO0qgo4xGBhE3jmvbOA/swq4/gdS/0g==} + engines: {node: '>= 16'} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 - react-native-web@0.19.11: - resolution: {integrity: sha512-51Qcjr0AtIgskwLqLsBByUMPs2nAWZ+6QF7x/siC72svNPcJ1/daXoPTNuHR2fX4oOrDATC4Vmc/SXOYPH19rw==} + react-hotkeys-hook@4.6.1: + resolution: {integrity: sha512-XlZpbKUj9tkfgPgT9gA+1p7Ey6vFIZHttUjPqpTdyT5nqQ8mHL7elxvSbaC+dpSiHUSmr21Ya1mDxBZG3aje4Q==} peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + react: '>=16.8.1' + react-dom: '>=16.8.1' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-wrap-balancer@1.1.0: - resolution: {integrity: sha512-EhF3jOZm5Fjx+Cx41e423qOv2c2aOvXAtym2OHqrGeMUnwERIyNsRBgnfT3plB170JmuYvts8K2KSPEIerKr5A==} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-router-devtools@1.1.5: + resolution: {integrity: sha512-nzls/j5WGgBTHGY+/J9ZikFWUvfY1tNdid9nveWpo3VzCuJbTM/IMzQq1e00LsW70eNaMLkdyXaQcMp7UODPxA==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + react-router: '>=7.0.0' + vite: '>=5.0.0 || >=6.0.0' + + react-router@7.2.0: + resolution: {integrity: sha512-fXyqzPgCPZbqhrk7k3hPcCpYIlQ2ugIXDboHUzhJISFVy2DEPsmHgN588MyGmkIOv3jDgNfUE3kJi83L28s/LQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-tooltip@5.28.0: + resolution: {integrity: sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg==} peerDependencies: - react: '>=16.8.0 || ^17.0.0 || ^18' + react: '>=16.14.0' + react-dom: '>=16.14.0' - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-package-json-fast@4.0.0: + resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} + engines: {node: ^18.17.0 || >=20.5.0} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -4747,69 +5305,20 @@ packages: resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - reading-time@1.5.0: - resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - - rehype-katex@7.0.0: - resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} - - rehype-pretty-code@0.9.11: - resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} - engines: {node: '>=16'} - peerDependencies: - shiki: '*' - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - - remark-math@5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} - - remark-mdx@2.3.0: - resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} - - remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} - - remark-reading-time@2.0.1: - resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} - - remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - remove-accents@0.5.0: resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} @@ -4825,9 +5334,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4836,82 +5342,66 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} ret@0.5.0: resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} + rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - - rollup@4.17.2: - resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} - run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safe-regex2@4.0.0: resolution: {integrity: sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==} @@ -4922,30 +5412,23 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + engines: {node: '>= 10.13.0'} - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + secure-json-parse@4.0.0: + resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -4960,19 +5443,31 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + seroval-plugins@1.3.3: + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} @@ -4980,51 +5475,46 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} hasBin: true - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} - shiki@0.14.7: - resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -5041,50 +5531,65 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} socket.io-adapter@2.5.4: resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} - socket.io-client@4.8.0: - resolution: {integrity: sha512-C0jdhD5yQahMws9alf/yvtsMGTaIDBnZ8Rb5HU56svyq0l5LIrGzIDZZD5pHQlmzxLuU91Gz+VpQMKgCTNYtkw==} + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} engines: {node: '>=10.0.0'} socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - socket.io@4.8.0: - resolution: {integrity: sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==} + socket.io@4.8.3: + resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} engines: {node: '>=10.2.0'} + solid-js@1.9.9: + resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==} + + solid-refresh@0.6.3: + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} + peerDependencies: + solid-js: ^1.3 + sonic-boom@3.8.1: resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} - sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -5093,18 +5598,29 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sql-highlight@6.1.0: + resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==} + engines: {node: '>=14'} stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -5113,12 +5629,18 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + stream-slice@0.1.2: + resolution: {integrity: sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==} streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} @@ -5136,27 +5658,16 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5165,22 +5676,18 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -5189,88 +5696,60 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - styled-jsx@5.1.0: - resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} - styleq@0.1.3: - resolution: {integrity: sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} - stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} + svelte-check@4.3.3: + resolution: {integrity: sha512-RYP0bEwenDXzfv0P1sKAwjZSlaRyqBn0Fz1TVni58lqyEiqgwztTpmodJrGzP6ZT2aHl4MbTvWP6gbmQ3FOnBg==} + engines: {node: '>= 18.0.0'} hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' - supports-color@4.5.0: - resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} - engines: {node: '>=4'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + svelte@5.39.12: + resolution: {integrity: sha512-CEzwxFuEycokU8K8CE/OuwVbmei+ivu2HvBGYIdASfMa1hCRSNr4RRkzNSvbAvu6h+BOig2CsZTAEY+WKvwZpA==} + engines: {node: '>=18'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + swr@2.3.8: + resolution: {integrity: sha512-gaCPRVoMq8WGDcWj9p4YWzCMPHzE0WNl6W8ADIx9c3JBEIdMkJGMzW+uzXvxHMltwcYACr9jP+32H8/hgwMR7w==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - tailwindcss-animate-plugin@1.1.0: - resolution: {integrity: sha512-vv3Vc4tRVvTnL3cm2I/mHSthteU16aqTGA+I/CZfZ9yLnCaGJkuJ/VeVBZtBvTSf6MzkUiUIMTyqGr5XBySatA==} - - tailwindcss@3.4.3: - resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} - engines: {node: '>=14.0.0'} - hasBin: true + tailwindcss@4.0.8: + resolution: {integrity: sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} @@ -5278,8 +5757,28 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + tar@7.5.6: + resolution: {integrity: sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==} + engines: {node: '>=18'} + + terser-webpack-plugin@5.3.11: + resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -5294,57 +5793,53 @@ packages: uglify-js: optional: true - terser@5.31.0: - resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} + terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} engines: {node: '>=10'} hasBin: true - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - tiny-lru@11.2.6: - resolution: {integrity: sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA==} + tiny-lru@11.2.11: + resolution: {integrity: sha512-27BIW0dIWTYYoWNnqSmoNMKe5WIbkXsc0xaCQHd3/3xT2XMuMJrzHdrO9QBFR14emBz1Bu0dOAs2sCBBrvgPQA==} engines: {node: '>=12'} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} - title@3.5.3: - resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} - hasBin: true + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} - titleize@1.0.0: - resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} - engines: {node: '>=0.10.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -5362,50 +5857,15 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - - ts-deepmerge@7.0.0: - resolution: {integrity: sha512-WZ/iAJrKDhdINv1WG6KZIGHrZDar6VfhftG1QJFpVbOYZMYJLJOvZOo1amictRXVdBXZIgBHKswMTXzElngprA==} - engines: {node: '>=14.13.1'} - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X + typescript: '>=4.8.4' ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} @@ -5421,30 +5881,32 @@ packages: '@swc/wasm': optional: true - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} + tsconfck@3.1.5: + resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + engines: {node: ^18 || >=20} hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - tsconfig-paths-webpack-plugin@4.1.0: - resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} + tsconfig-paths-webpack-plugin@4.2.0: + resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} engines: {node: '>=10.13.0'} - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tsdk-server-adapters@0.1.15: - resolution: {integrity: sha512-pU0i4nDjDWAr3nxETmyckzbYQ/WPsZq/1vv8z2PfDmSfChA+LjmLRHAK1vuHxSnFewsS2eci3Usqk2d6uZCL1w==} + tsdk-server-adapters@0.3.0: + resolution: {integrity: sha512-6oTA4ITSb2onZ3R0Gi9yoLiEXeecDEQ4WEjrNBDmR+3nI/IVj88FdlURyi/E2gbV7L63GvO3pJlqtNDxRvbreg==} peerDependencies: - express: ^4.19.2 - fastify: ^4.27.0 - hono: ^4.3.3 - socket.io: ^4.7.5 - zod: ^3.23.7 + express: ^4.21.0 + fastify: ^5.0.0 + hono: ^4.6.2 + socket.io: ^4.8.0 + zod: ^3.23.8 peerDependenciesMeta: express: optional: true @@ -5455,95 +5917,70 @@ packages: socket.io: optional: true - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + turbo-stream@2.4.0: + resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typedoc@0.27.6: - resolution: {integrity: sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw==} - engines: {node: '>= 18'} + typedoc@0.28.16: + resolution: {integrity: sha512-x4xW77QC3i5DUFMBp0qjukOTnr/sSg+oEs86nB3LjDslvAmwe/PUGDWbe3GrIqt59oTqoXK5GRK9tAa0sYMiog==} + engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x typeorm-cursor-pagination@0.10.1: resolution: {integrity: sha512-ezMx9giREI8aBVUpOs7RPn5/uIdygqlduuXJcKiny9UnUXev3zIJaoXCHlrenT6pgcR1cx3baHG/HImPEgeVgA==} peerDependencies: typeorm: ^0.3.6 - typeorm@0.3.20: - resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} + typeorm@0.3.28: + resolution: {integrity: sha512-6GH7wXhtfq2D33ZuRXYwIsl/qM5685WZcODZb7noOOcRMteM9KF2x2ap3H0EBjnSV0VO4gNAfJT5Ukp0PkOlvg==} engines: {node: '>=16.13.0'} hasBin: true peerDependencies: - '@google-cloud/spanner': ^5.18.0 - '@sap/hana-client': ^2.12.25 - better-sqlite3: ^7.1.2 || ^8.0.0 || ^9.0.0 - hdb-pool: ^0.1.6 + '@google-cloud/spanner': ^5.18.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + '@sap/hana-client': ^2.14.22 + better-sqlite3: ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 ioredis: ^5.0.4 - mongodb: ^5.8.0 - mssql: ^9.1.1 || ^10.0.1 + mongodb: ^5.8.0 || ^6.0.0 + mssql: ^9.1.1 || ^10.0.0 || ^11.0.0 || ^12.0.0 mysql2: ^2.2.5 || ^3.0.1 oracledb: ^6.3.0 pg: ^8.5.1 pg-native: ^3.0.0 pg-query-stream: ^4.0.0 - redis: ^3.1.1 || ^4.0.0 + redis: ^3.1.1 || ^4.0.0 || ^5.0.14 sql.js: ^1.4.0 sqlite3: ^5.0.3 ts-node: ^10.7.0 - typeorm-aurora-data-api-driver: ^2.0.0 + typeorm-aurora-data-api-driver: ^2.0.0 || ^3.0.0 peerDependenciesMeta: '@google-cloud/spanner': optional: true @@ -5551,8 +5988,6 @@ packages: optional: true better-sqlite3: optional: true - hdb-pool: - optional: true ioredis: optional: true mongodb: @@ -5580,91 +6015,49 @@ packages: typeorm-aurora-data-api-driver: optional: true - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} + typescript-eslint@8.27.0: + resolution: {integrity: sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript-json-schema@0.67.1: + resolution: {integrity: sha512-vKTZB/RoYTIBdVP7E7vrgHMCssBuhja91wQy498QIVhvfRimaOgjc98uwAXmZ7mbLUytJmOSbF11wPz+ByQeXg==} hasBin: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true - ua-parser-js@1.0.37: - resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - - unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - - unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} - - unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} - unist-util-remove@4.0.0: - resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + undici@6.21.1: + resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==} + engines: {node: '>=18.17'} - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@4.1.1: - resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} - - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@3.1.0: - resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} - - unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -5674,11 +6067,18 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.0.15: - resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} - hasBin: true + unplugin-swc@1.5.5: + resolution: {integrity: sha512-BahYtYvQ/KSgOqHoy5FfQgp/oZNAB7jwERxNeFVeN/PtJhg4fpK/ybj9OwKtqGPseOadS7+TGbq6tH2DmDAYvA==} peerDependencies: - browserslist: '>= 4.21.0' + '@swc/core': ^1.2.108 + + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + unplugin@2.3.5: + resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} + engines: {node: '>=18.12.0'} update-browserslist-db@1.1.2: resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} @@ -5686,20 +6086,48 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' - upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - utf-8-validate@6.0.3: - resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} + utf-8-validate@6.0.6: + resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} engines: {node: '>=6.14.2'} util-deprecate@1.0.2: @@ -5709,48 +6137,108 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + valibot@0.41.0: + resolution: {integrity: sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + valibot@1.2.0: + resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + validate-html-nesting@1.2.3: + resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + vite-dev-rpc@1.1.0: + resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 + + vite-hot-client@2.1.0: + resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite-node@3.0.0-beta.2: + resolution: {integrity: sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true - vfile-matter@3.0.1: - resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vite-plugin-inspect@11.3.3: + resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vite-plugin-solid@2.11.9: + resolution: {integrity: sha512-bTA6p+bspXZsuulSd2y6aTzegF8xGaJYcq1Uyh/mv+W4DQtzCgL9nN6n2fsTaxp/dMk+ZHHKgGndlNeooqHLKw==} + peerDependencies: + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vite-plugin-vue-devtools@8.0.2: + resolution: {integrity: sha512-1069qvMBcyAu3yXQlvYrkwoyLOk0lSSR/gTKy/vy+Det7TXnouGei6ZcKwr5TIe938v/14oLlp0ow6FSJkkORA==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^6.0.0 || ^7.0.0-0 - vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vite-plugin-vue-inspector@5.3.2: + resolution: {integrity: sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vite-tsconfig-paths@5.1.4: + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true - vite@5.2.11: - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5758,6 +6246,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -5770,6 +6259,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -5777,20 +6268,71 @@ packages: terser: optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@7.1.9: + resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -5802,50 +6344,62 @@ packages: jsdom: optional: true - vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + vm2@3.10.2: + resolution: {integrity: sha512-qTnbvpada8qlEEyIPFwhTcF5Ns+k83fVlOSE8XvAtHkhcQ+okMnbvryVQBfP/ExRT1CRsQpYusdATR+FBJfrnQ==} + engines: {node: '>=6.0'} + hasBin: true - vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true - watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} + vue-tsc@3.1.1: + resolution: {integrity: sha512-fyixKxFniOVgn+L/4+g8zCG6dflLLt01Agz9jl3TO45Bgk87NZJRmJVPsiK+ouq3LB91jJCbOV+pDkzYTxbI7A==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.22: + resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + warning@3.0.0: + resolution: {integrity: sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==} + + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} engines: {node: '>=10.13.0'} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - - web-worker@1.3.0: - resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - webpack-node-externals@3.0.0: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} engines: {node: '>=6'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} - webpack@5.90.1: - resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + webpack@5.102.1: + resolution: {integrity: sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -5854,8 +6408,8 @@ packages: webpack-cli: optional: true - webpack@5.97.1: - resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} + webpack@5.104.1: + resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -5864,47 +6418,27 @@ packages: webpack-cli: optional: true - 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'} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} 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==} + which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -5912,9 +6446,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -5923,846 +6454,1912 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + 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 + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + 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 + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + 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 + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xior@0.8.3: + resolution: {integrity: sha512-yHzIBnpGS3qhSjGnvi5IvLQVPlWXDYmvtaO6TfOaIUMes/6lFnoHL02cdHo5xPj3JUSfEts9Q3hTiVGfnHAh5w==} + + xmlhttprequest-ssl@2.1.1: + resolution: {integrity: sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + 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'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + + zod@4.0.14: + resolution: {integrity: sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@angular-devkit/core@19.1.7(chokidar@4.0.3)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 + + '@angular-devkit/core@19.2.19(chokidar@4.0.3)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 + + '@angular-devkit/schematics-cli@19.2.19(@types/node@24.7.2)(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.2.19(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) + '@inquirer/prompts': 7.3.2(@types/node@24.7.2) + ansi-colors: 4.1.3 + symbol-observable: 4.0.0 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@types/node' + - chokidar + + '@angular-devkit/schematics@19.1.7(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.1.7(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/schematics@19.2.19(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.2.19(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + + '@ark/schema@0.56.0': + dependencies: + '@ark/util': 0.56.0 + + '@ark/util@0.56.0': {} + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.9': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helpers': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.9': + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.4 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.28.4 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.4 + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.9': + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/parser@7.26.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.26.8(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.26.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.9) + '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.24.5': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.9': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@biomejs/cli-darwin-arm64@1.9.4': + optional: true + + '@bkrem/react-transition-group@1.3.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + chain-function: 1.0.1 + dom-helpers: 3.4.0 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-lifecycles-compat: 3.0.4 + warning: 3.0.0 + + '@clack/core@0.5.0': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.11.0': + dependencies: + '@clack/core': 0.5.0 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@colors/colors@1.5.0': + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.24.5 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/css@11.13.5': + dependencies: + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + transitivePeerDependencies: + - supports-color + + '@emotion/hash@0.9.2': {} + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.24.5 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.0.0)': + dependencies: + react: 19.0.0 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.22.0(jiti@2.4.2))': + dependencies: + eslint: 9.22.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + '@eslint-community/regexpp@4.12.1': {} - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - 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 + '@eslint/config-array@0.19.2': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - 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 + '@eslint/config-helpers@0.1.0': {} - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - 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 + '@eslint/core@0.12.0': + dependencies: + '@types/json-schema': 7.0.15 - xior@0.6.2: - resolution: {integrity: sha512-1tb//3L7ARved6FbwxwptrdJucRkZiOolxBjIUFltlNcDbtMM8MPw4V18Nbkeus2g+S4LT3XRuFjWZyPMlGp0A==} + '@eslint/eslintrc@3.3.0': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} + '@eslint/js@9.22.0': {} - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + '@eslint/object-schema@2.1.6': {} - xmlhttprequest-ssl@2.1.1: - resolution: {integrity: sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==} - engines: {node: '>=0.4.0'} + '@eslint/plugin-kit@0.2.7': + dependencies: + '@eslint/core': 0.12.0 + levn: 0.4.1 - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + '@fastify/ajv-compiler@4.0.0': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-uri: 3.0.1 - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + '@fastify/error@4.0.0': {} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + '@fastify/express@4.0.2': + dependencies: + express: 4.21.2 + fastify-plugin: 5.0.1 + transitivePeerDependencies: + - supports-color - yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} + '@fastify/fast-json-stringify-compiler@5.0.1': + dependencies: + fast-json-stringify: 6.0.0 - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true + '@fastify/forwarded@3.0.0': {} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} - hasBin: true + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} + '@fastify/proxy-addr@5.0.0': + dependencies: + '@fastify/forwarded': 3.0.0 + ipaddr.js: 2.2.0 - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + '@floating-ui/utils@0.2.9': {} - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} + '@gerrit0/mini-shiki@3.20.0': + dependencies: + '@shikijs/engine-oniguruma': 3.20.0 + '@shikijs/langs': 3.20.0 + '@shikijs/themes': 3.20.0 + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + '@hono/node-server@1.14.4(hono@4.9.11)': + dependencies: + hono: 4.9.11 - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + '@hono/node-server@1.19.7(hono@4.11.3)': + dependencies: + hono: 4.11.3 - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} + '@humanfs/core@0.19.1': {} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + '@humanwhocodes/module-importer@1.0.1': {} - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + '@humanwhocodes/retry@0.3.1': {} -snapshots: + '@humanwhocodes/retry@0.4.2': {} - '@alloc/quick-lru@5.2.0': {} + '@inquirer/ansi@1.0.2': {} - '@ampproject/remapping@2.3.0': + '@inquirer/checkbox@4.3.2(@types/node@24.7.2)': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 - '@angular-devkit/core@17.1.2(chokidar@3.6.0)': + '@inquirer/confirm@5.1.21(@types/node@24.7.2)': dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - jsonc-parser: 3.2.0 - picomatch: 3.0.1 - rxjs: 7.8.1 - source-map: 0.7.4 + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/type': 3.0.10(@types/node@24.7.2) optionalDependencies: - chokidar: 3.6.0 + '@types/node': 24.7.2 - '@angular-devkit/schematics-cli@17.1.2(chokidar@3.6.0)': + '@inquirer/core@10.3.2(@types/node@24.7.2)': dependencies: - '@angular-devkit/core': 17.1.2(chokidar@3.6.0) - '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) - ansi-colors: 4.1.3 - inquirer: 9.2.12 - symbol-observable: 4.0.0 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - chokidar + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.7.2) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 - '@angular-devkit/schematics@17.1.2(chokidar@3.6.0)': + '@inquirer/editor@4.2.23(@types/node@24.7.2)': dependencies: - '@angular-devkit/core': 17.1.2(chokidar@3.6.0) - jsonc-parser: 3.2.0 - magic-string: 0.30.5 - ora: 5.4.1 - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/external-editor': 1.0.3(@types/node@24.7.2) + '@inquirer/type': 3.0.10(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 - '@asamuzakjp/dom-selector@2.0.2': + '@inquirer/expand@4.0.23(@types/node@24.7.2)': dependencies: - bidi-js: 1.0.3 - css-tree: 2.3.1 - is-potential-custom-element-name: 1.0.1 + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/type': 3.0.10(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 - '@babel/code-frame@7.24.2': + '@inquirer/external-editor@1.0.3(@types/node@24.7.2)': dependencies: - '@babel/highlight': 7.24.5 - picocolors: 1.0.0 + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 24.7.2 - '@babel/compat-data@7.24.4': {} + '@inquirer/figures@1.0.15': {} - '@babel/core@7.24.5': + '@inquirer/input@4.3.1(@types/node@24.7.2)': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/type': 3.0.10(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 - '@babel/generator@7.24.5': + '@inquirer/number@3.0.23(@types/node@24.7.2)': dependencies: - '@babel/types': 7.24.5 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/type': 3.0.10(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 - '@babel/helper-compilation-targets@7.23.6': + '@inquirer/password@4.0.23(@types/node@24.7.2)': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/type': 3.0.10(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/prompts@7.10.1(@types/node@24.7.2)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@24.7.2) + '@inquirer/confirm': 5.1.21(@types/node@24.7.2) + '@inquirer/editor': 4.2.23(@types/node@24.7.2) + '@inquirer/expand': 4.0.23(@types/node@24.7.2) + '@inquirer/input': 4.3.1(@types/node@24.7.2) + '@inquirer/number': 3.0.23(@types/node@24.7.2) + '@inquirer/password': 4.0.23(@types/node@24.7.2) + '@inquirer/rawlist': 4.1.11(@types/node@24.7.2) + '@inquirer/search': 3.2.2(@types/node@24.7.2) + '@inquirer/select': 4.4.2(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/prompts@7.3.2(@types/node@24.7.2)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@24.7.2) + '@inquirer/confirm': 5.1.21(@types/node@24.7.2) + '@inquirer/editor': 4.2.23(@types/node@24.7.2) + '@inquirer/expand': 4.0.23(@types/node@24.7.2) + '@inquirer/input': 4.3.1(@types/node@24.7.2) + '@inquirer/number': 3.0.23(@types/node@24.7.2) + '@inquirer/password': 4.0.23(@types/node@24.7.2) + '@inquirer/rawlist': 4.1.11(@types/node@24.7.2) + '@inquirer/search': 3.2.2(@types/node@24.7.2) + '@inquirer/select': 4.4.2(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 - '@babel/helper-environment-visitor@7.22.20': {} + '@inquirer/rawlist@4.1.11(@types/node@24.7.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/type': 3.0.10(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 - '@babel/helper-function-name@7.23.0': + '@inquirer/search@3.2.2(@types/node@24.7.2)': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 - '@babel/helper-hoist-variables@7.22.5': + '@inquirer/select@4.4.2(@types/node@24.7.2)': dependencies: - '@babel/types': 7.24.5 + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.7.2) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/type@3.0.10(@types/node@24.7.2)': + optionalDependencies: + '@types/node': 24.7.2 - '@babel/helper-module-imports@7.24.3': + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': dependencies: - '@babel/types': 7.24.5 + '@isaacs/balanced-match': 4.0.1 - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': + '@isaacs/cliui@8.0.2': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - '@babel/helper-plugin-utils@7.24.5': {} + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 - '@babel/helper-simple-access@7.24.5': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@babel/types': 7.24.5 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.31 - '@babel/helper-split-export-declaration@7.24.5': + '@jridgewell/gen-mapping@0.3.5': dependencies: - '@babel/types': 7.24.5 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 - '@babel/helper-string-parser@7.24.1': {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@babel/helper-validator-identifier@7.24.5': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@babel/helper-validator-option@7.23.5': {} + '@jridgewell/set-array@1.2.1': {} - '@babel/helpers@7.24.5': + '@jridgewell/source-map@0.3.6': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 - '@babel/highlight@7.24.5': - dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 + '@jridgewell/sourcemap-codec@1.4.15': {} - '@babel/parser@7.24.5': - dependencies: - '@babel/types': 7.24.5 + '@jridgewell/sourcemap-codec@1.5.0': {} - '@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@jridgewell/sourcemap-codec@1.5.5': {} - '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.5)': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 - '@babel/runtime@7.24.5': + '@jridgewell/trace-mapping@0.3.31': dependencies: - regenerator-runtime: 0.14.1 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@babel/template@7.24.0': + '@jridgewell/trace-mapping@0.3.9': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@babel/traverse@7.24.5': + '@mjackson/node-fetch-server@0.2.0': {} + + '@nestjs/cli@11.0.16(@swc/core@1.10.18)(@types/node@24.7.2)': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 + '@angular-devkit/core': 19.2.19(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) + '@angular-devkit/schematics-cli': 19.2.19(@types/node@24.7.2)(chokidar@4.0.3) + '@inquirer/prompts': 7.10.1(@types/node@24.7.2) + '@nestjs/schematics': 11.0.1(chokidar@4.0.3)(typescript@5.9.3) + ansis: 4.2.0 + chokidar: 4.0.3 + cli-table3: 0.6.5 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.10.18)) + glob: 13.0.0 + node-emoji: 1.11.0 + ora: 5.4.1 + tsconfig-paths: 4.2.0 + tsconfig-paths-webpack-plugin: 4.2.0 + typescript: 5.9.3 + webpack: 5.104.1(@swc/core@1.10.18) + webpack-node-externals: 3.0.0 + optionalDependencies: + '@swc/core': 1.10.18 transitivePeerDependencies: - - supports-color + - '@types/node' + - esbuild + - uglify-js + - webpack-cli - '@babel/types@7.24.5': + '@nestjs/schematics@11.0.1(chokidar@4.0.3)(typescript@5.9.3)': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 - - '@braintree/sanitize-url@6.0.4': {} + '@angular-devkit/core': 19.1.7(chokidar@4.0.3) + '@angular-devkit/schematics': 19.1.7(chokidar@4.0.3) + comment-json: 4.2.5 + jsonc-parser: 3.3.1 + pluralize: 8.0.0 + typescript: 5.9.3 + transitivePeerDependencies: + - chokidar - '@colors/colors@1.5.0': - optional: true + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - '@corex/deepmerge@4.0.43': {} + '@nodelib/fs.stat@2.0.5': {} - '@cspotcode/source-map-support@0.8.1': + '@nodelib/fs.walk@1.2.8': dependencies: - '@jridgewell/trace-mapping': 0.3.9 + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 - '@esbuild/aix-ppc64@0.20.2': - optional: true + '@npmcli/git@4.1.0': + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.2 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.6.1 + which: 3.0.1 + transitivePeerDependencies: + - bluebird - '@esbuild/android-arm64@0.20.2': - optional: true + '@npmcli/package-json@4.0.1': + dependencies: + '@npmcli/git': 4.1.0 + glob: 10.5.0 + hosted-git-info: 6.1.3 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 5.0.0 + proc-log: 3.0.0 + semver: 7.6.1 + transitivePeerDependencies: + - bluebird - '@esbuild/android-arm@0.20.2': - optional: true + '@npmcli/promise-spawn@6.0.2': + dependencies: + which: 3.0.1 - '@esbuild/android-x64@0.20.2': - optional: true + '@one-ini/wasm@0.1.1': {} - '@esbuild/darwin-arm64@0.20.2': + '@parcel/watcher-android-arm64@2.5.4': optional: true - '@esbuild/darwin-x64@0.20.2': + '@parcel/watcher-darwin-arm64@2.5.4': optional: true - '@esbuild/freebsd-arm64@0.20.2': + '@parcel/watcher-darwin-x64@2.5.4': optional: true - '@esbuild/freebsd-x64@0.20.2': + '@parcel/watcher-freebsd-x64@2.5.4': optional: true - '@esbuild/linux-arm64@0.20.2': + '@parcel/watcher-linux-arm-glibc@2.5.4': optional: true - '@esbuild/linux-arm@0.20.2': + '@parcel/watcher-linux-arm-musl@2.5.4': optional: true - '@esbuild/linux-ia32@0.20.2': + '@parcel/watcher-linux-arm64-glibc@2.5.4': optional: true - '@esbuild/linux-loong64@0.20.2': + '@parcel/watcher-linux-arm64-musl@2.5.4': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@parcel/watcher-linux-x64-glibc@2.5.4': optional: true - '@esbuild/linux-ppc64@0.20.2': + '@parcel/watcher-linux-x64-musl@2.5.4': optional: true - '@esbuild/linux-riscv64@0.20.2': + '@parcel/watcher-win32-arm64@2.5.4': optional: true - '@esbuild/linux-s390x@0.20.2': + '@parcel/watcher-win32-ia32@2.5.4': optional: true - '@esbuild/linux-x64@0.20.2': + '@parcel/watcher-win32-x64@2.5.4': optional: true - '@esbuild/netbsd-x64@0.20.2': - optional: true + '@parcel/watcher@2.5.4': + dependencies: + detect-libc: 2.0.3 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.3 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.4 + '@parcel/watcher-darwin-arm64': 2.5.4 + '@parcel/watcher-darwin-x64': 2.5.4 + '@parcel/watcher-freebsd-x64': 2.5.4 + '@parcel/watcher-linux-arm-glibc': 2.5.4 + '@parcel/watcher-linux-arm-musl': 2.5.4 + '@parcel/watcher-linux-arm64-glibc': 2.5.4 + '@parcel/watcher-linux-arm64-musl': 2.5.4 + '@parcel/watcher-linux-x64-glibc': 2.5.4 + '@parcel/watcher-linux-x64-musl': 2.5.4 + '@parcel/watcher-win32-arm64': 2.5.4 + '@parcel/watcher-win32-ia32': 2.5.4 + '@parcel/watcher-win32-x64': 2.5.4 + + '@pinojs/redact@0.4.0': {} - '@esbuild/openbsd-x64@0.20.2': + '@pkgjs/parseargs@0.11.0': optional: true - '@esbuild/sunos-x64@0.20.2': - optional: true + '@playwright/test@1.51.1': + dependencies: + playwright: 1.51.1 - '@esbuild/win32-arm64@0.20.2': - optional: true + '@polka/url@1.0.0-next.29': {} - '@esbuild/win32-ia32@0.20.2': - optional: true + '@radix-ui/number@1.1.0': {} - '@esbuild/win32-x64@0.20.2': - optional: true + '@radix-ui/primitive@1.1.1': {} - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@radix-ui/react-accordion@1.2.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.10.0': {} + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collapsible': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@eslint/eslintrc@2.1.4': + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-collapsible@1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@eslint/js@8.57.0': {} + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@fastify/ajv-compiler@4.0.0': + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: - ajv: 8.13.0 - ajv-formats: 3.0.1(ajv@8.13.0) - fast-uri: 3.0.1 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@fastify/error@4.0.0': {} + '@radix-ui/react-context@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@fastify/express@3.0.0': + '@radix-ui/react-direction@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - express: 4.21.0 - fastify-plugin: 4.5.1 - transitivePeerDependencies: - - supports-color + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@fastify/fast-json-stringify-compiler@5.0.1': + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - fast-json-stringify: 6.0.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@fastify/merge-json-schemas@0.1.1': + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: - fast-deep-equal: 3.1.3 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@gerrit0/mini-shiki@1.27.2': + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@shikijs/engine-oniguruma': 1.27.2 - '@shikijs/types': 1.27.2 - '@shikijs/vscode-textmate': 10.0.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@headlessui/react@1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-id@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@tanstack/react-virtual': 3.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - client-only: 0.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-popper@1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/rect': 1.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@hono/node-server@1.11.1': {} + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@humanwhocodes/config-array@0.11.14': + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@humanwhocodes/module-importer@1.0.1': {} + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-select@2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@humanwhocodes/object-schema@2.0.3': {} + '@radix-ui/react-slot@1.1.2(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@isaacs/cliui@8.0.2': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@jest/schemas@29.6.3': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@sinclair/typebox': 0.27.8 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@jridgewell/gen-mapping@0.3.5': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@jridgewell/resolve-uri@3.1.2': {} + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@jridgewell/set-array@1.2.1': {} + '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@jridgewell/source-map@0.3.6': + '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@radix-ui/rect': 1.1.0 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@jridgewell/sourcemap-codec@1.4.15': {} + '@radix-ui/react-use-size@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 - '@jridgewell/trace-mapping@0.3.25': + '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/rect@1.1.0': {} + + '@react-router/dev@7.2.0(@react-router/serve@7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3))(@types/node@20.17.19)(babel-plugin-macros@3.1.0)(lightningcss@1.29.1)(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(terser@5.39.0)(typescript@5.9.3)(vite@5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0))': + dependencies: + '@babel/core': 7.26.9 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.9) + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + '@npmcli/package-json': 4.0.1 + '@react-router/node': 7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3) + arg: 5.0.2 + babel-dead-code-elimination: 1.0.9 + chokidar: 4.0.3 + dedent: 1.5.3(babel-plugin-macros@3.1.0) + es-module-lexer: 1.6.0 + exit-hook: 2.2.1 + fs-extra: 10.1.0 + gunzip-maybe: 1.4.2 + jsesc: 3.0.2 + lodash: 4.17.21 + pathe: 1.1.2 + picocolors: 1.1.1 + picomatch: 2.3.1 + prettier: 2.8.8 + react-refresh: 0.14.2 + react-router: 7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + semver: 7.6.1 + set-cookie-parser: 2.6.0 + valibot: 0.41.0(typescript@5.9.3) + vite: 5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0) + vite-node: 3.0.0-beta.2(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0) + optionalDependencies: + '@react-router/serve': 7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - bluebird + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser - '@jridgewell/trace-mapping@0.3.9': + '@react-router/express@7.2.0(express@4.21.2)(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@react-router/node': 7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3) + express: 4.21.2 + react-router: 7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + optionalDependencies: + typescript: 5.9.3 - '@ljharb/through@2.3.13': + '@react-router/node@7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3)': dependencies: - call-bind: 1.0.7 + '@mjackson/node-fetch-server': 0.2.0 + react-router: 7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + source-map-support: 0.5.21 + stream-slice: 0.1.2 + undici: 6.21.1 + optionalDependencies: + typescript: 5.9.3 - '@mdx-js/mdx@2.3.0': + '@react-router/serve@7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3)': dependencies: - '@types/estree-jsx': 1.0.5 - '@types/mdx': 2.0.13 - estree-util-build-jsx: 2.2.2 - estree-util-is-identifier-name: 2.1.0 - estree-util-to-js: 1.2.0 - estree-walker: 3.0.3 - hast-util-to-estree: 2.3.3 - markdown-extensions: 1.1.1 - periscopic: 3.1.0 - remark-mdx: 2.3.0 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - unified: 10.1.2 - unist-util-position-from-estree: 1.1.2 - unist-util-stringify-position: 3.0.3 - unist-util-visit: 4.1.2 - vfile: 5.3.7 + '@react-router/express': 7.2.0(express@4.21.2)(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3) + '@react-router/node': 7.2.0(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(typescript@5.9.3) + compression: 1.8.0 + express: 4.21.2 + get-port: 5.1.1 + morgan: 1.10.0 + react-router: 7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + source-map-support: 0.5.21 transitivePeerDependencies: - supports-color + - typescript - '@mdx-js/react@2.3.0(react@18.2.0)': + '@rolldown/pluginutils@1.0.0-beta.29': {} + + '@rollup/pluginutils@5.2.0(rollup@4.52.4)': dependencies: - '@types/mdx': 2.0.13 - '@types/react': 18.3.1 - react: 18.2.0 + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.52.4 - '@napi-rs/simple-git-android-arm-eabi@0.1.16': + '@rollup/rollup-android-arm-eabi@4.34.8': optional: true - '@napi-rs/simple-git-android-arm64@0.1.16': + '@rollup/rollup-android-arm-eabi@4.52.4': optional: true - '@napi-rs/simple-git-darwin-arm64@0.1.16': + '@rollup/rollup-android-arm64@4.34.8': optional: true - '@napi-rs/simple-git-darwin-x64@0.1.16': + '@rollup/rollup-android-arm64@4.52.4': optional: true - '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': + '@rollup/rollup-darwin-arm64@4.34.8': optional: true - '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': + '@rollup/rollup-darwin-arm64@4.52.4': optional: true - '@napi-rs/simple-git-linux-arm64-musl@0.1.16': + '@rollup/rollup-darwin-x64@4.34.8': optional: true - '@napi-rs/simple-git-linux-x64-gnu@0.1.16': + '@rollup/rollup-darwin-x64@4.52.4': optional: true - '@napi-rs/simple-git-linux-x64-musl@0.1.16': + '@rollup/rollup-freebsd-arm64@4.34.8': optional: true - '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': + '@rollup/rollup-freebsd-arm64@4.52.4': optional: true - '@napi-rs/simple-git-win32-x64-msvc@0.1.16': + '@rollup/rollup-freebsd-x64@4.34.8': optional: true - '@napi-rs/simple-git@0.1.16': - optionalDependencies: - '@napi-rs/simple-git-android-arm-eabi': 0.1.16 - '@napi-rs/simple-git-android-arm64': 0.1.16 - '@napi-rs/simple-git-darwin-arm64': 0.1.16 - '@napi-rs/simple-git-darwin-x64': 0.1.16 - '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.16 - '@napi-rs/simple-git-linux-arm64-gnu': 0.1.16 - '@napi-rs/simple-git-linux-arm64-musl': 0.1.16 - '@napi-rs/simple-git-linux-x64-gnu': 0.1.16 - '@napi-rs/simple-git-linux-x64-musl': 0.1.16 - '@napi-rs/simple-git-win32-arm64-msvc': 0.1.16 - '@napi-rs/simple-git-win32-x64-msvc': 0.1.16 - - '@nestjs/cli@10.3.2': - dependencies: - '@angular-devkit/core': 17.1.2(chokidar@3.6.0) - '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) - '@angular-devkit/schematics-cli': 17.1.2(chokidar@3.6.0) - '@nestjs/schematics': 10.1.1(chokidar@3.6.0)(typescript@5.3.3) - chalk: 4.1.2 - chokidar: 3.6.0 - cli-table3: 0.6.3 - commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.90.1) - glob: 10.3.10 - inquirer: 8.2.6 - node-emoji: 1.11.0 - ora: 5.4.1 - rimraf: 4.4.1 - shelljs: 0.8.5 - source-map-support: 0.5.21 - tree-kill: 1.2.2 - tsconfig-paths: 4.2.0 - tsconfig-paths-webpack-plugin: 4.1.0 - typescript: 5.3.3 - webpack: 5.90.1 - webpack-node-externals: 3.0.0 - transitivePeerDependencies: - - esbuild - - uglify-js - - webpack-cli + '@rollup/rollup-freebsd-x64@4.52.4': + optional: true - '@nestjs/schematics@10.1.1(chokidar@3.6.0)(typescript@5.3.3)': - dependencies: - '@angular-devkit/core': 17.1.2(chokidar@3.6.0) - '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) - comment-json: 4.2.3 - jsonc-parser: 3.2.1 - pluralize: 8.0.0 - typescript: 5.3.3 - transitivePeerDependencies: - - chokidar + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + optional: true - '@next/env@13.0.6': {} + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + optional: true - '@next/env@13.5.6': {} + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + optional: true - '@next/swc-android-arm-eabi@13.0.6': + '@rollup/rollup-linux-arm-musleabihf@4.52.4': optional: true - '@next/swc-android-arm64@13.0.6': + '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true - '@next/swc-darwin-arm64@13.0.6': + '@rollup/rollup-linux-arm64-gnu@4.52.4': optional: true - '@next/swc-darwin-arm64@13.5.6': + '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true - '@next/swc-darwin-x64@13.0.6': + '@rollup/rollup-linux-arm64-musl@4.52.4': optional: true - '@next/swc-darwin-x64@13.5.6': + '@rollup/rollup-linux-loong64-gnu@4.52.4': optional: true - '@next/swc-freebsd-x64@13.0.6': + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true - '@next/swc-linux-arm-gnueabihf@13.0.6': + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true - '@next/swc-linux-arm64-gnu@13.0.6': + '@rollup/rollup-linux-ppc64-gnu@4.52.4': optional: true - '@next/swc-linux-arm64-gnu@13.5.6': + '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true - '@next/swc-linux-arm64-musl@13.0.6': + '@rollup/rollup-linux-riscv64-gnu@4.52.4': optional: true - '@next/swc-linux-arm64-musl@13.5.6': + '@rollup/rollup-linux-riscv64-musl@4.52.4': optional: true - '@next/swc-linux-x64-gnu@13.0.6': + '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true - '@next/swc-linux-x64-gnu@13.5.6': + '@rollup/rollup-linux-s390x-gnu@4.52.4': optional: true - '@next/swc-linux-x64-musl@13.0.6': + '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true - '@next/swc-linux-x64-musl@13.5.6': + '@rollup/rollup-linux-x64-gnu@4.52.4': optional: true - '@next/swc-win32-arm64-msvc@13.0.6': + '@rollup/rollup-linux-x64-musl@4.34.8': optional: true - '@next/swc-win32-arm64-msvc@13.5.6': + '@rollup/rollup-linux-x64-musl@4.52.4': optional: true - '@next/swc-win32-ia32-msvc@13.0.6': + '@rollup/rollup-openharmony-arm64@4.52.4': optional: true - '@next/swc-win32-ia32-msvc@13.5.6': + '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true - '@next/swc-win32-x64-msvc@13.0.6': + '@rollup/rollup-win32-arm64-msvc@4.52.4': optional: true - '@next/swc-win32-x64-msvc@13.5.6': + '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true - '@nodelib/fs.scandir@2.1.5': + '@rollup/rollup-win32-ia32-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.8': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.4': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + + '@shikijs/engine-oniguruma@3.20.0': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 - '@nodelib/fs.stat@2.0.5': {} + '@shikijs/langs@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 - '@nodelib/fs.walk@1.2.8': + '@shikijs/themes@3.20.0': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + '@shikijs/types': 3.20.0 - '@pkgjs/parseargs@0.11.0': - optional: true + '@shikijs/types@3.20.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - '@polka/url@1.0.0-next.25': {} + '@shikijs/vscode-textmate@10.0.2': {} - '@popperjs/core@2.11.8': {} + '@sindresorhus/merge-streams@4.0.0': {} - '@react-native/normalize-colors@0.74.83': {} + '@socket.io/component-emitter@3.1.2': {} - '@rollup/rollup-android-arm-eabi@4.17.2': - optional: true + '@sqltools/formatter@1.2.5': {} - '@rollup/rollup-android-arm64@4.17.2': - optional: true + '@standard-schema/spec@1.1.0': {} - '@rollup/rollup-darwin-arm64@4.17.2': - optional: true + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 - '@rollup/rollup-darwin-x64@4.17.2': - optional: true + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.12)(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)))(svelte@5.39.12)(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.39.12)(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + debug: 4.4.1 + svelte: 5.39.12 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': - optional: true + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.12)(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.12)(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)))(svelte@5.39.12)(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + debug: 4.4.1 + deepmerge: 4.3.1 + magic-string: 0.30.19 + svelte: 5.39.12 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + transitivePeerDependencies: + - supports-color - '@rollup/rollup-linux-arm-musleabihf@4.17.2': + '@swc/core-darwin-arm64@1.10.18': optional: true - '@rollup/rollup-linux-arm64-gnu@4.17.2': + '@swc/core-darwin-x64@1.10.18': optional: true - '@rollup/rollup-linux-arm64-musl@4.17.2': + '@swc/core-linux-arm-gnueabihf@1.10.18': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + '@swc/core-linux-arm64-gnu@1.10.18': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.17.2': + '@swc/core-linux-arm64-musl@1.10.18': optional: true - '@rollup/rollup-linux-s390x-gnu@4.17.2': + '@swc/core-linux-x64-gnu@1.10.18': optional: true - '@rollup/rollup-linux-x64-gnu@4.17.2': + '@swc/core-linux-x64-musl@1.10.18': optional: true - '@rollup/rollup-linux-x64-musl@4.17.2': + '@swc/core-win32-arm64-msvc@1.10.18': optional: true - '@rollup/rollup-win32-arm64-msvc@4.17.2': + '@swc/core-win32-ia32-msvc@1.10.18': optional: true - '@rollup/rollup-win32-ia32-msvc@4.17.2': + '@swc/core-win32-x64-msvc@1.10.18': optional: true - '@rollup/rollup-win32-x64-msvc@4.17.2': - optional: true + '@swc/core@1.10.18': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.17 + optionalDependencies: + '@swc/core-darwin-arm64': 1.10.18 + '@swc/core-darwin-x64': 1.10.18 + '@swc/core-linux-arm-gnueabihf': 1.10.18 + '@swc/core-linux-arm64-gnu': 1.10.18 + '@swc/core-linux-arm64-musl': 1.10.18 + '@swc/core-linux-x64-gnu': 1.10.18 + '@swc/core-linux-x64-musl': 1.10.18 + '@swc/core-win32-arm64-msvc': 1.10.18 + '@swc/core-win32-ia32-msvc': 1.10.18 + '@swc/core-win32-x64-msvc': 1.10.18 + + '@swc/counter@0.1.3': {} - '@shikijs/engine-oniguruma@1.27.2': + '@swc/types@0.1.17': dependencies: - '@shikijs/types': 1.27.2 - '@shikijs/vscode-textmate': 10.0.1 + '@swc/counter': 0.1.3 - '@shikijs/types@1.27.2': + '@tailwindcss/node@4.0.8': dependencies: - '@shikijs/vscode-textmate': 10.0.1 - '@types/hast': 3.0.4 + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + tailwindcss: 4.0.8 - '@shikijs/vscode-textmate@10.0.1': {} + '@tailwindcss/oxide-android-arm64@4.0.8': + optional: true - '@sinclair/typebox@0.27.8': {} + '@tailwindcss/oxide-darwin-arm64@4.0.8': + optional: true - '@socket.io/component-emitter@3.1.2': {} + '@tailwindcss/oxide-darwin-x64@4.0.8': + optional: true - '@sqltools/formatter@1.2.5': {} + '@tailwindcss/oxide-freebsd-x64@4.0.8': + optional: true - '@swc/helpers@0.4.14': - dependencies: - tslib: 2.6.2 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8': + optional: true - '@swc/helpers@0.5.2': - dependencies: - tslib: 2.6.2 + '@tailwindcss/oxide-linux-arm64-gnu@4.0.8': + optional: true - '@tanstack/query-core@5.56.2': {} + '@tailwindcss/oxide-linux-arm64-musl@4.0.8': + optional: true - '@tanstack/react-query@5.56.2(react@18.2.0)': - dependencies: - '@tanstack/query-core': 5.56.2 - react: 18.2.0 + '@tailwindcss/oxide-linux-x64-gnu@4.0.8': + optional: true - '@tanstack/react-virtual@3.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@tanstack/virtual-core': 3.5.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@tailwindcss/oxide-linux-x64-musl@4.0.8': + optional: true - '@tanstack/virtual-core@3.5.0': {} + '@tailwindcss/oxide-win32-arm64-msvc@4.0.8': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.0.8': + optional: true - '@testing-library/dom@9.3.4': + '@tailwindcss/oxide@4.0.8': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.0.8 + '@tailwindcss/oxide-darwin-arm64': 4.0.8 + '@tailwindcss/oxide-darwin-x64': 4.0.8 + '@tailwindcss/oxide-freebsd-x64': 4.0.8 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.8 + '@tailwindcss/oxide-linux-arm64-gnu': 4.0.8 + '@tailwindcss/oxide-linux-arm64-musl': 4.0.8 + '@tailwindcss/oxide-linux-x64-gnu': 4.0.8 + '@tailwindcss/oxide-linux-x64-musl': 4.0.8 + '@tailwindcss/oxide-win32-arm64-msvc': 4.0.8 + '@tailwindcss/oxide-win32-x64-msvc': 4.0.8 + + '@tailwindcss/vite@4.0.8(vite@5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0))': + dependencies: + '@tailwindcss/node': 4.0.8 + '@tailwindcss/oxide': 4.0.8 + lightningcss: 1.29.1 + tailwindcss: 4.0.8 + vite: 5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0) + + '@tanstack/match-sorter-utils@8.19.4': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 - '@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 + remove-accents: 0.5.0 + + '@tanstack/query-core@5.90.19': {} - '@testing-library/react@14.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-query@5.90.19(react@19.0.0)': dependencies: - '@babel/runtime': 7.24.5 - '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.3.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@tanstack/query-core': 5.90.19 + react: 19.0.0 - '@theguild/remark-mermaid@0.0.5(react@18.2.0)': + '@tanstack/solid-query@5.90.22(solid-js@1.9.9)': dependencies: - mermaid: 10.9.0 - react: 18.2.0 - unist-util-visit: 5.0.0 - transitivePeerDependencies: - - supports-color + '@tanstack/query-core': 5.90.19 + solid-js: 1.9.9 - '@theguild/remark-npm2yarn@0.2.1': + '@tanstack/svelte-query@6.0.17(svelte@5.39.12)': dependencies: - npm-to-yarn: 2.2.1 - unist-util-visit: 5.0.0 + '@tanstack/query-core': 5.90.19 + svelte: 5.39.12 - '@total-typescript/ts-reset@0.5.1': {} + '@tanstack/vue-query@5.92.8(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@tanstack/match-sorter-utils': 8.19.4 + '@tanstack/query-core': 5.90.19 + '@vue/devtools-api': 6.6.4 + vue: 3.5.22(typescript@5.9.3) + vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.3)) '@trpc/server@10.45.2': {} @@ -6774,106 +8371,93 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@tsconfig/recommended@1.0.7': {} + '@tsconfig/node22@22.0.2': {} - '@tsconfig/recommended@1.0.8': {} + '@tsconfig/recommended@1.0.10': {} - '@types/acorn@4.0.6': - dependencies: - '@types/estree': 1.0.5 - - '@types/aria-query@5.0.4': {} + '@tsconfig/svelte@5.0.5': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.28.0 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.28.4 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@types/babel__traverse@7.20.5': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.28.4 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.33 + '@types/node': 20.17.24 - '@types/chai@4.3.16': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 '@types/connect@3.4.38': dependencies: - '@types/node': 18.19.33 + '@types/node': 20.17.24 '@types/cookie@0.4.1': {} - '@types/cors@2.8.17': - dependencies: - '@types/node': 18.19.33 - - '@types/d3-scale-chromatic@3.0.3': {} + '@types/cookie@0.6.0': {} - '@types/d3-scale@4.0.8': + '@types/cors@2.8.17': dependencies: - '@types/d3-time': 3.0.3 - - '@types/d3-time@3.0.3': {} + '@types/node': 20.17.24 - '@types/debug@4.1.12': - dependencies: - '@types/ms': 0.7.34 + '@types/deep-eql@4.0.2': {} '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/eslint@8.56.10': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/estree-jsx@1.0.5': - dependencies: - '@types/estree': 1.0.5 - - '@types/estree@1.0.5': {} - '@types/estree@1.0.6': {} - '@types/express-serve-static-core@4.19.0': + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 18.19.33 + '@types/node': 20.17.24 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - '@types/express@4.17.21': + '@types/express@5.0.1': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.0 - '@types/qs': 6.9.15 + '@types/express-serve-static-core': 5.0.6 '@types/serve-static': 1.15.7 - '@types/fs-extra@11.0.4': + '@types/express@5.0.3': dependencies: - '@types/jsonfile': 6.1.4 - '@types/node': 18.19.33 + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 5.0.6 + '@types/serve-static': 1.15.7 - '@types/hast@2.3.10': + '@types/fs-extra@11.0.4': dependencies: - '@types/unist': 2.0.10 + '@types/jsonfile': 6.1.4 + '@types/node': 20.17.24 '@types/hast@3.0.4': dependencies: @@ -6885,70 +8469,71 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - '@types/jsonfile@6.1.4': dependencies: - '@types/node': 18.19.33 + '@types/node': 20.17.24 - '@types/katex@0.16.7': {} + '@types/mime@1.3.5': {} - '@types/mdast@3.0.15': + '@types/multer@2.0.0': dependencies: - '@types/unist': 2.0.10 + '@types/express': 5.0.3 - '@types/mdast@4.0.3': + '@types/node@18.19.130': dependencies: - '@types/unist': 3.0.2 - - '@types/mdx@2.0.13': {} + undici-types: 5.26.5 - '@types/mime@1.3.5': {} + '@types/node@20.17.19': + dependencies: + undici-types: 6.19.8 - '@types/mocha@10.0.6': {} + '@types/node@20.17.24': + dependencies: + undici-types: 6.19.8 - '@types/ms@0.7.34': {} + '@types/node@22.18.10': + dependencies: + undici-types: 6.21.0 - '@types/node@18.19.33': + '@types/node@24.7.2': dependencies: - undici-types: 5.26.5 + undici-types: 7.14.0 - '@types/prop-types@15.7.12': {} + '@types/parse-json@4.0.2': {} '@types/qs@6.9.15': {} '@types/range-parser@1.2.7': {} - '@types/react-dom@18.3.0': + '@types/react-dom@19.0.4(@types/react@19.0.10)': dependencies: - '@types/react': 18.3.1 + '@types/react': 19.0.10 - '@types/react@18.3.1': + '@types/react-reconciler@0.28.9(@types/react@19.0.10)': dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 + '@types/react': 19.0.10 - '@types/semver@7.5.8': {} + '@types/react@19.0.10': + dependencies: + csstype: 3.1.3 '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.33 + '@types/node': 20.17.24 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 18.19.33 + '@types/node': 20.17.24 '@types/send': 0.17.4 - '@types/unist@2.0.10': {} - '@types/unist@3.0.2': {} - '@types/webpack-node-externals@3.0.4': + '@types/webpack-node-externals@3.0.4(@swc/core@1.10.18)': dependencies: - '@types/node': 18.19.33 - webpack: 5.97.1 + '@types/node': 20.17.24 + webpack: 5.104.1(@swc/core@1.10.18) transitivePeerDependencies: - '@swc/core' - esbuild @@ -6957,276 +8542,315 @@ snapshots: '@types/ws@8.5.10': dependencies: - '@types/node': 18.19.33 + '@types/node': 20.17.24 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.27.0 + '@typescript-eslint/type-utils': 8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3) + '@typescript-eslint/utils': 8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.27.0 + eslint: 9.22.0(jiti@2.4.2) graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.1 - tsutils: 3.21.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.1(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - semver: 7.6.1 - ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 + '@typescript-eslint/scope-manager': 8.27.0 + '@typescript-eslint/types': 8.27.0 + '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.27.0 + debug: 4.4.0 + eslint: 9.22.0(jiti@2.4.2) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/scope-manager@8.27.0': dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.4.5 + '@typescript-eslint/types': 8.27.0 + '@typescript-eslint/visitor-keys': 8.27.0 + + '@typescript-eslint/type-utils@8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3) + debug: 4.4.0 + eslint: 9.22.0(jiti@2.4.2) + ts-api-utils: 2.0.1(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/types@8.27.0': {} + + '@typescript-eslint/typescript-estree@8.27.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.4.5 + '@typescript-eslint/types': 8.27.0 + '@typescript-eslint/visitor-keys': 8.27.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.1 + ts-api-utils: 2.0.1(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': + '@typescript-eslint/utils@8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.27.0 + '@typescript-eslint/types': 8.27.0 + '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.9.3) + eslint: 9.22.0(jiti@2.4.2) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.27.0': + dependencies: + '@typescript-eslint/types': 8.27.0 + eslint-visitor-keys: 4.2.0 - '@typescript-eslint/scope-manager@6.21.0': + '@vitejs/plugin-vue@6.0.1(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 + '@rolldown/pluginutils': 1.0.0-beta.29 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.3) - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': + '@vitest/expect@3.2.4': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.4.5) + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@5.4.14(@types/node@18.19.130)(lightningcss@1.29.1)(terser@5.39.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color + vite: 5.4.14(@types/node@18.19.130)(lightningcss@1.29.1)(terser@5.39.0) - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + '@vitest/mocker@3.2.4(vite@5.4.14(@types/node@24.7.2)(lightningcss@1.29.1)(terser@5.39.0))': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color + vite: 5.4.14(@types/node@24.7.2)(lightningcss@1.29.1)(terser@5.39.0) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + + '@volar/language-core@2.4.23': + dependencies: + '@volar/source-map': 2.4.23 - '@typescript-eslint/types@5.62.0': {} + '@volar/source-map@2.4.23': {} - '@typescript-eslint/types@6.21.0': {} + '@volar/typescript@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/babel-helper-vue-transform-on@1.5.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5)': + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.26.9)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.1 - tsutils: 3.21.0(typescript@5.4.5) + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.26.9) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.26.9) + '@vue/shared': 3.5.22 optionalDependencies: - typescript: 5.4.5 + '@babel/core': 7.26.9 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.26.9)': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.1 - ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.28.4 + '@vue/compiler-sfc': 3.5.22 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': + '@vue/compiler-core@3.5.13': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.1 - transitivePeerDependencies: - - supports-color - - typescript + '@babel/parser': 7.26.9 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 - '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + '@vue/compiler-core@3.5.22': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - eslint: 8.57.0 - semver: 7.6.1 - transitivePeerDependencies: - - supports-color - - typescript + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.22 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 - '@typescript-eslint/visitor-keys@5.62.0': + '@vue/compiler-dom@3.5.13': dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 - '@typescript-eslint/visitor-keys@6.21.0': + '@vue/compiler-dom@3.5.22': dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 + '@vue/compiler-core': 3.5.22 + '@vue/shared': 3.5.22 - '@ungap/structured-clone@1.2.0': {} + '@vue/compiler-sfc@3.5.22': + dependencies: + '@babel/parser': 7.28.4 + '@vue/compiler-core': 3.5.22 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + estree-walker: 2.0.2 + magic-string: 0.30.19 + postcss: 8.5.6 + source-map-js: 1.2.1 - '@vitejs/plugin-react@4.2.1(vite@5.2.11(@types/node@18.19.33)(terser@5.31.0))': + '@vue/compiler-ssr@3.5.22': dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 5.2.11(@types/node@18.19.33)(terser@5.31.0) + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-core@8.0.2(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@vue/devtools-kit': 8.0.2 + '@vue/devtools-shared': 8.0.2 + mitt: 3.0.1 + nanoid: 5.1.6 + pathe: 2.0.3 + vite-hot-client: 2.1.0(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - - supports-color + - vite - '@vitest/expect@1.6.0': + '@vue/devtools-kit@8.0.2': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 + '@vue/devtools-shared': 8.0.2 + birpc: 2.6.1 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 2.0.0 + speakingurl: 14.0.1 + superjson: 2.2.2 - '@vitest/runner@1.6.0': + '@vue/devtools-shared@8.0.2': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 - pathe: 1.1.2 + rfdc: 1.4.1 - '@vitest/snapshot@1.6.0': + '@vue/language-core@3.1.1(typescript@5.9.3)': dependencies: - magic-string: 0.30.10 - pathe: 1.1.2 - pretty-format: 29.7.0 + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + alien-signals: 3.0.0 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.2 + optionalDependencies: + typescript: 5.9.3 - '@vitest/spy@1.6.0': + '@vue/reactivity@3.5.22': dependencies: - tinyspy: 2.2.1 + '@vue/shared': 3.5.22 - '@vitest/ui@1.6.0(vitest@1.6.0)': + '@vue/runtime-core@3.5.22': dependencies: - '@vitest/utils': 1.6.0 - fast-glob: 3.3.2 - fflate: 0.8.2 - flatted: 3.3.1 - pathe: 1.1.2 - picocolors: 1.0.0 - sirv: 2.0.4 - vitest: 1.6.0(@types/node@18.19.33)(@vitest/ui@1.6.0)(jsdom@23.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + '@vue/reactivity': 3.5.22 + '@vue/shared': 3.5.22 - '@vitest/utils@1.6.0': + '@vue/runtime-dom@3.5.22': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + '@vue/reactivity': 3.5.22 + '@vue/runtime-core': 3.5.22 + '@vue/shared': 3.5.22 + csstype: 3.1.3 - '@webassemblyjs/ast@1.12.1': + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.3))': dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + vue: 3.5.22(typescript@5.9.3) + + '@vue/shared@3.5.13': {} + + '@vue/shared@3.5.22': {} + + '@vue/tsconfig@0.8.1(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3))': + optionalDependencies: + typescript: 5.9.3 + vue: 3.5.22(typescript@5.9.3) '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - '@webassemblyjs/helper-api-error@1.11.6': {} - '@webassemblyjs/helper-api-error@1.13.2': {} - '@webassemblyjs/helper-buffer@1.12.1': {} - '@webassemblyjs/helper-buffer@1.14.1': {} - '@webassemblyjs/helper-numbers@1.11.6': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - '@webassemblyjs/helper-numbers@1.13.2': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.13.2 '@webassemblyjs/helper-api-error': 1.13.2 '@xtuc/long': 4.2.2 - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - '@webassemblyjs/helper-wasm-section@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/helper-wasm-section@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -7234,37 +8858,16 @@ snapshots: '@webassemblyjs/helper-wasm-bytecode': 1.13.2 '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/ieee754@1.11.6': - dependencies: - '@xtuc/ieee754': 1.2.0 - '@webassemblyjs/ieee754@1.13.2': dependencies: '@xtuc/ieee754': 1.2.0 - '@webassemblyjs/leb128@1.11.6': - dependencies: - '@xtuc/long': 4.2.2 - '@webassemblyjs/leb128@1.13.2': dependencies: '@xtuc/long': 4.2.2 - '@webassemblyjs/utf8@1.11.6': {} - '@webassemblyjs/utf8@1.13.2': {} - '@webassemblyjs/wasm-edit@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 - '@webassemblyjs/wasm-edit@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -7276,14 +8879,6 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 '@webassemblyjs/wast-printer': 1.14.1 - '@webassemblyjs/wasm-gen@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wasm-gen@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -7292,13 +8887,6 @@ snapshots: '@webassemblyjs/leb128': 1.13.2 '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wasm-opt@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wasm-opt@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -7306,15 +8894,6 @@ snapshots: '@webassemblyjs/wasm-gen': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wasm-parser@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wasm-parser@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -7324,11 +8903,6 @@ snapshots: '@webassemblyjs/leb128': 1.13.2 '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wast-printer@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@xtuc/long': 4.2.2 - '@webassemblyjs/wast-printer@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -7338,6 +8912,8 @@ snapshots: '@xtuc/long@4.2.2': {} + abbrev@3.0.0: {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -7349,244 +8925,166 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-assertions@1.9.0(acorn@8.11.3): + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + acorn-import-phases@1.0.4(acorn@8.15.0): dependencies: - acorn: 8.11.3 + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.11.3 + acorn: 8.14.0 acorn-walk@8.3.2: {} - acorn@8.11.3: {} + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 acorn@8.14.0: {} - agent-base@7.1.1: - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color + acorn@8.15.0: {} - ajv-formats@2.1.1(ajv@8.12.0): + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: - ajv: 8.12.0 + ajv: 8.17.1 - ajv-formats@3.0.1(ajv@8.13.0): + ajv-formats@3.0.1(ajv@8.17.1): optionalDependencies: - ajv: 8.13.0 + ajv: 8.17.1 ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - ajv@6.12.6: + ajv-keywords@5.1.0(ajv@8.17.1): dependencies: + ajv: 8.17.1 fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@8.12.0: + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.13.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 - ansi-colors@4.1.1: {} + alien-signals@3.0.0: {} ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-escapes@5.0.0: + ansi-escapes@7.0.0: dependencies: - type-fest: 1.4.0 + environment: 1.1.0 ansi-regex@5.0.1: {} ansi-regex@6.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: {} - ansi-styles@6.2.1: {} - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 + ansis@4.2.0: {} app-root-path@3.1.0: {} - arch@2.2.0: {} - - arg@1.0.0: {} + append-field@1.0.0: {} arg@4.1.3: {} arg@5.0.2: {} - 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 - - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - - array-flatten@1.1.1: {} - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - - array-timsort@1.0.3: {} - - array-union@2.1.0: {} - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: + aria-hidden@1.2.4: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 + tslib: 2.8.1 - array.prototype.toreversed@1.1.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 + aria-query@5.3.2: {} - array.prototype.tosorted@1.1.3: + arkregex@0.0.5: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + '@ark/util': 0.56.0 - arraybuffer.prototype.slice@1.0.3: + arktype@2.1.29: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + '@ark/schema': 0.56.0 + '@ark/util': 0.56.0 + arkregex: 0.0.5 - arrify@1.0.1: {} - - asap@2.0.6: {} + array-flatten@1.1.1: {} - assertion-error@1.1.0: {} + array-timsort@1.0.3: {} - astring@1.8.6: {} + assertion-error@2.0.1: {} asynckit@0.4.0: {} atomic-sleep@1.0.0: {} - autoprefixer@10.4.19(postcss@8.4.38): - dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001617 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 avvio@9.0.0: dependencies: '@fastify/error': 4.0.0 fastq: 1.17.1 - axios@1.7.7: + axios@1.13.2: dependencies: follow-redirects: 1.15.6 - form-data: 4.0.0 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.7.9: + axobject-query@4.1.0: {} + + babel-dead-code-elimination@1.0.9: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - proxy-from-env: 1.1.0 + '@babel/core': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - - debug + - supports-color + + babel-plugin-jsx-dom-expressions@0.40.1(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.26.9) + '@babel/types': 7.28.4 + html-entities: 2.3.3 + parse5: 7.3.0 + validate-html-nesting: 1.2.3 - babel-plugin-react-native-web@0.19.11: {} + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.24.5 + cosmiconfig: 7.1.0 + resolve: 1.22.8 - bail@2.0.2: {} + babel-preset-solid@1.9.9(@babel/core@7.26.9)(solid-js@1.9.9): + dependencies: + '@babel/core': 7.26.9 + babel-plugin-jsx-dom-expressions: 0.40.1(@babel/core@7.26.9) + optionalDependencies: + solid-js: 1.9.9 balanced-match@1.0.2: {} @@ -7594,23 +9092,38 @@ snapshots: base64id@2.0.0: {} - better-sqlite3@9.6.0: - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.2 + baseline-browser-mapping@2.8.16: {} - bidi-js@1.0.3: + baseline-browser-mapping@2.9.14: {} + + basic-auth@2.0.1: dependencies: - require-from-string: 2.0.2 + safe-buffer: 5.1.2 - big.js@5.2.2: {} + beautify@0.0.8: + dependencies: + cssbeautify: 0.3.1 + html: 1.0.0 + js-beautify: 1.15.3 - binary-extensions@2.3.0: {} + better-sqlite3@12.5.0: + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.2 bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 + bippy@0.3.7(@types/react@19.0.10)(react@19.0.0): + dependencies: + '@types/react-reconciler': 0.28.9(@types/react@19.0.10) + react: 19.0.0 + transitivePeerDependencies: + - '@types/react' + + birpc@2.6.1: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -7634,6 +9147,34 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.0 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + body-parser@2.2.1: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.0 + iconv-lite: 0.7.0 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.2 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -7643,18 +9184,13 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 - - browser-stdout@1.3.1: {} + fill-range: 7.1.1 - browserslist@4.23.0: + browserify-zlib@0.1.4: dependencies: - caniuse-lite: 1.0.30001617 - electron-to-chromium: 1.4.760 - node-releases: 2.0.14 - update-browserslist-db: 1.0.15(browserslist@4.23.0) + pako: 0.2.9 browserslist@4.24.4: dependencies: @@ -7663,6 +9199,22 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) + browserslist@4.26.3: + dependencies: + baseline-browser-mapping: 2.8.16 + caniuse-lite: 1.0.30001750 + electron-to-chromium: 1.5.234 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.14 + caniuse-lite: 1.0.30001764 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + buffer-from@1.1.2: {} buffer@5.7.1: @@ -7675,10 +9227,14 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufferutil@4.0.8: + bufferutil@4.1.0: dependencies: node-gyp-build: 4.8.1 + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -7687,172 +9243,97 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 - callsites@3.1.0: {} - - camel-case@4.1.2: + call-bind@1.0.8: dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 - - camelcase-css@2.0.1: {} + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 - camelcase@6.3.0: {} + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 - caniuse-lite@1.0.30001617: {} + callsites@3.1.0: {} caniuse-lite@1.0.30001692: {} - capital-case@1.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case-first: 2.0.2 - - ccount@2.0.1: {} + caniuse-lite@1.0.30001750: {} - 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 + caniuse-lite@1.0.30001764: {} - chalk@2.3.0: + chai@5.2.0: dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 4.5.0 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + chain-function@1.0.1: {} chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} - - change-case@4.1.2: - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.6.2 - - character-entities-html4@2.1.0: {} + chalk@5.4.1: {} - character-entities-legacy@3.0.0: {} + chardet@2.1.1: {} - character-entities@2.0.2: {} - - character-reference-invalid@2.0.1: {} - - chardet@0.7.0: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - 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 + check-error@2.1.1: {} - chokidar@3.6.0: + chokidar@4.0.3: 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 + readdirp: 4.1.2 chownr@1.1.4: {} + chownr@3.0.0: {} + chrome-trace-event@1.0.3: {} - ci-info@3.9.0: {} + ci-info@4.1.0: {} + + classnames@2.5.1: {} cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - cli-cursor@4.0.0: + cli-cursor@5.0.0: dependencies: - restore-cursor: 4.0.0 - - cli-highlight@2.1.11: - dependencies: - chalk: 4.1.2 - highlight.js: 10.7.3 - mz: 2.7.0 - parse5: 5.1.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - yargs: 16.2.0 + restore-cursor: 5.1.0 cli-spinners@2.9.2: {} - cli-table3@0.6.3: + cli-table3@0.6.5: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - cli-truncate@3.1.0: + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 - string-width: 5.1.2 - - cli-width@3.0.0: {} + string-width: 7.2.0 cli-width@4.1.0: {} - client-only@0.0.1: {} - - clipboardy@1.2.2: - dependencies: - arch: 2.2.0 - execa: 0.8.0 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -7861,18 +9342,14 @@ snapshots: clone@1.0.4: {} - clsx@2.1.1: {} + clone@2.1.2: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 + clsx@2.1.1: {} color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} colorette@2.0.20: {} @@ -7881,19 +9358,15 @@ snapshots: dependencies: delayed-stream: 1.0.0 - comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} - commander@11.0.0: {} + commander@13.1.0: {} commander@2.20.3: {} commander@4.1.1: {} - commander@7.2.0: {} - - commander@8.3.0: {} - - comment-json@4.2.3: + comment-json@4.2.5: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 @@ -7901,44 +9374,82 @@ snapshots: has-own-prop: 2.0.0 repeat-string: 1.6.1 - compute-scroll-into-view@3.1.0: {} + compressible@2.0.18: + dependencies: + mime-db: 1.52.0 + + compression@1.8.0: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color concat-map@0.0.1: {} - concurrently@8.2.2: + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + concurrently@9.2.1: dependencies: chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 7.8.1 - shell-quote: 1.8.1 - spawn-command: 0.0.2 + rxjs: 7.8.2 + shell-quote: 1.8.3 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 - confbox@0.1.7: {} - - constant-case@3.0.4: + config-chain@1.1.13: dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case: 2.0.2 + ini: 1.3.8 + proto-list: 1.2.4 content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + content-type@1.0.5: {} + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.0.6: {} + cookie-signature@1.2.2: {} + cookie@0.4.2: {} cookie@0.6.0: {} + cookie@0.7.1: {} + + cookie@1.0.2: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + core-util-is@1.0.3: {} cors@2.8.5: @@ -7946,99 +9457,41 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cose-base@1.0.3: + cosmiconfig@7.1.0: dependencies: - layout-base: 1.0.2 + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.3.3): + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.3.3 + typescript: 5.9.3 create-require@1.1.1: {} cross-env@7.0.3: dependencies: - cross-spawn: 7.0.3 - - cross-fetch@3.1.8: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 + cross-spawn: 7.0.6 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - css-in-js-utils@3.1.0: - dependencies: - hyphenate-style-name: 1.0.4 - - css-tree@2.3.1: - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.0 - - cssesc@3.0.0: {} - - cssstyle@4.0.1: - dependencies: - rrweb-cssom: 0.6.0 + cssbeautify@0.3.1: {} csstype@3.1.3: {} - cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): - dependencies: - cose-base: 1.0.3 - cytoscape: 3.29.2 - - cytoscape@3.29.2: {} - - d3-array@2.12.1: - dependencies: - internmap: 1.0.1 - - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-axis@3.0.0: {} - - d3-brush@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - - d3-chord@3.0.1: - dependencies: - d3-path: 3.1.0 - d3-color@3.1.0: {} - d3-contour@4.0.2: - dependencies: - d3-array: 3.2.4 - - d3-delaunay@6.0.4: - dependencies: - delaunator: 5.0.1 - d3-dispatch@3.0.1: {} d3-drag@3.0.0: @@ -8046,31 +9499,9 @@ snapshots: d3-dispatch: 3.0.1 d3-selection: 3.0.0 - d3-dsv@3.0.1: - dependencies: - commander: 7.2.0 - iconv-lite: 0.6.3 - rw: 1.3.3 - d3-ease@3.0.1: {} - d3-fetch@3.0.1: - dependencies: - d3-dsv: 3.0.1 - - d3-force@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - - d3-format@3.1.0: {} - - d3-geo@3.1.1: - dependencies: - d3-array: 3.2.4 - - d3-hierarchy@3.1.2: {} + d3-hierarchy@1.1.9: {} d3-interpolate@3.0.1: dependencies: @@ -8078,50 +9509,12 @@ snapshots: d3-path@1.0.9: {} - d3-path@3.1.0: {} - - d3-polygon@3.0.1: {} - - d3-quadtree@3.0.1: {} - - d3-random@3.0.1: {} - - d3-sankey@0.12.3: - dependencies: - d3-array: 2.12.1 - d3-shape: 1.3.7 - - d3-scale-chromatic@3.1.0: - dependencies: - d3-color: 3.1.0 - d3-interpolate: 3.0.1 - - d3-scale@4.0.2: - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - d3-selection@3.0.0: {} d3-shape@1.3.7: dependencies: d3-path: 1.0.9 - d3-shape@3.2.0: - dependencies: - d3-path: 3.1.0 - - d3-time-format@4.1.0: - dependencies: - d3-time: 3.1.0 - - d3-time@3.1.0: - dependencies: - d3-array: 3.2.4 - d3-timer@3.0.1: {} d3-transition@3.0.1(d3-selection@3.0.0): @@ -8141,123 +9534,43 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - d3@7.9.0: - dependencies: - d3-array: 3.2.4 - d3-axis: 3.0.0 - d3-brush: 3.0.0 - d3-chord: 3.0.1 - d3-color: 3.1.0 - d3-contour: 4.0.2 - d3-delaunay: 6.0.4 - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-dsv: 3.0.1 - d3-ease: 3.0.1 - d3-fetch: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.0 - d3-geo: 3.1.1 - d3-hierarchy: 3.1.2 - d3-interpolate: 3.0.1 - d3-path: 3.1.0 - d3-polygon: 3.0.1 - d3-quadtree: 3.0.1 - d3-random: 3.0.1 - d3-scale: 4.0.2 - d3-scale-chromatic: 3.1.0 - d3-selection: 3.0.0 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - d3-timer: 3.0.1 - d3-transition: 3.0.1(d3-selection@3.0.0) - d3-zoom: 3.0.0 - - dagre-d3-es@7.0.10: - dependencies: - d3: 7.9.0 - lodash-es: 4.17.21 - - 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 - - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.24.5 + date-fns@4.1.0: {} - dayjs@1.11.11: {} + dayjs@1.11.19: {} debug@2.6.9: dependencies: ms: 2.0.0 - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.4(supports-color@8.1.1): + debug@4.3.4: dependencies: ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - decamelize@4.0.0: {} + debug@4.4.0: + dependencies: + ms: 2.1.3 - decimal.js@10.4.3: {} + debug@4.4.1: + dependencies: + ms: 2.1.3 - decode-named-character-reference@1.0.2: + debug@4.4.3: dependencies: - character-entities: 2.0.2 + ms: 2.1.3 decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 + dedent@1.5.3(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 - 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.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 + dedent@1.7.1(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 + + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -8265,25 +9578,24 @@ snapshots: deepmerge@4.3.1: {} + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + defaults@1.0.4: dependencies: clone: 1.0.4 define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 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 + gopd: 1.2.0 - delaunator@5.0.1: - dependencies: - robust-predicates: 3.0.2 + define-lazy-prop@3.0.0: {} delayed-stream@1.0.0: {} @@ -8293,65 +9605,58 @@ snapshots: destroy@1.2.0: {} - detect-libc@2.0.3: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - didyoumean@1.2.2: {} + detect-libc@1.0.3: {} - diff-sequences@29.6.3: {} + detect-libc@2.0.3: {} - diff@3.5.0: {} + detect-node-es@1.1.0: {} diff@4.0.2: {} - diff@5.0.0: {} - diff@5.2.0: {} - dir-glob@3.0.1: + dom-helpers@3.4.0: dependencies: - path-type: 4.0.0 + '@babel/runtime': 7.24.5 - dlv@1.1.3: {} + dotenv@16.6.1: {} - doctrine@2.1.0: + dunder-proto@1.0.1: dependencies: - esutils: 2.0.3 + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 - doctrine@3.0.0: + duplexify@3.7.1: dependencies: - esutils: 2.0.3 - - dom-accessibility-api@0.5.16: {} + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 - dompurify@3.1.2: {} + eastasianwidth@0.2.0: {} - dot-case@3.0.4: + editorconfig@1.0.4: dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - - dotenv@16.4.5: {} - - eastasianwidth@0.2.0: {} + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.1 ee-first@1.1.1: {} - electron-to-chromium@1.4.760: {} + electron-to-chromium@1.5.234: {} + + electron-to-chromium@1.5.267: {} electron-to-chromium@1.5.83: {} - elkjs@0.9.3: {} + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - emojis-list@3.0.0: {} - encodeurl@1.0.2: {} encodeurl@2.0.0: {} @@ -8360,12 +9665,12 @@ snapshots: dependencies: once: 1.4.0 - engine.io-client@6.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.3): + engine.io-client@6.6.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 engine.io-parser: 5.2.2 - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.17.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) xmlhttprequest-ssl: 2.1.1 transitivePeerDependencies: - bufferutil @@ -8374,374 +9679,198 @@ snapshots: engine.io-parser@5.2.2: {} - engine.io@6.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.3): + engine.io@6.6.1(bufferutil@4.1.0): dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 18.19.33 + '@types/node': 20.17.24 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 engine.io-parser: 5.2.2 - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.17.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - enhanced-resolve@5.16.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 entities@4.5.0: {} + entities@6.0.1: {} + + environment@1.1.0: {} + + err-code@2.0.3: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - 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.4 - 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 + error-stack-parser-es@1.0.5: {} + + es-define-property@1.0.1: {} 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.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 + es-module-lexer@1.6.0: {} - es-iterator-helpers@1.0.19: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 + es-module-lexer@1.7.0: {} - es-module-lexer@1.5.2: {} + es-module-lexer@2.0.0: {} - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - 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.20.2: + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.10: 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: {} + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} - escape-string-regexp@5.0.0: {} - - eslint-config-prettier@8.10.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-config-universe@11.3.0(eslint@8.57.0)(prettier@2.8.8)(typescript@5.4.5): - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - eslint-config-prettier: 8.10.0(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) - eslint-plugin-node: 11.1.0(eslint@8.57.0) - eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) - eslint-plugin-react: 7.34.1(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) - optionalDependencies: - prettier: 2.8.8 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - typescript - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-es@3.0.1(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.13.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-node@11.1.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - eslint-plugin-es: 3.0.1(eslint@8.57.0) - eslint-utils: 2.1.0 - ignore: 5.3.1 - minimatch: 3.1.2 - resolve: 1.22.8 - semver: 6.3.1 - - eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): - dependencies: - eslint: 8.57.0 - prettier: 2.8.8 - prettier-linter-helpers: 1.0.0 - optionalDependencies: - eslint-config-prettier: 8.10.0(eslint@8.57.0) - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-plugin-react@7.34.1(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.toreversed: 1.1.2 - array.prototype.tosorted: 1.1.3 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 - eslint: 8.57.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - object.hasown: 1.1.4 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.11 - eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: + eslint-scope@8.3.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@2.1.0: - dependencies: - eslint-visitor-keys: 1.3.0 - - eslint-visitor-keys@1.3.0: {} - eslint-visitor-keys@3.4.3: {} - eslint@8.57.0: + eslint-visitor-keys@4.2.0: {} + + eslint@9.22.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.2 + '@eslint/config-helpers': 0.1.0 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.22.0 + '@eslint/plugin-kit': 0.2.7 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 + cross-spawn: 7.0.6 + debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 2.4.2 transitivePeerDependencies: - supports-color - espree@9.6.1: + esm-env@1.2.2: {} + + espree@10.3.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 + esrap@2.1.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -8750,36 +9879,11 @@ snapshots: estraverse@5.3.0: {} - estree-util-attach-comments@2.1.1: - dependencies: - '@types/estree': 1.0.5 - - estree-util-build-jsx@2.2.2: - dependencies: - '@types/estree-jsx': 1.0.5 - estree-util-is-identifier-name: 2.1.0 - estree-walker: 3.0.3 - - estree-util-is-identifier-name@2.1.0: {} - - estree-util-to-js@1.2.0: - dependencies: - '@types/estree-jsx': 1.0.5 - astring: 1.8.6 - source-map: 0.7.4 - - estree-util-value-to-estree@1.3.0: - dependencies: - is-plain-obj: 3.0.0 - - estree-util-visit@1.2.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/unist': 2.0.10 + estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 esutils@2.0.3: {} @@ -8791,31 +9895,9 @@ snapshots: events@3.3.0: {} - execa@0.8.0: - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - - execa@7.2.0: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -8825,16 +9907,35 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + execa@9.6.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + exit-hook@2.2.1: {} + expand-template@2.0.3: {} - express@4.21.0: + expect-type@1.2.1: {} + + express@4.21.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.6.0 + cookie: 0.7.1 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 @@ -8848,7 +9949,7 @@ snapshots: methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.10 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 qs: 6.13.0 range-parser: 1.2.1 @@ -8863,48 +9964,97 @@ snapshots: transitivePeerDependencies: - supports-color - extend-shallow@2.0.1: + express@5.1.0: dependencies: - is-extendable: 0.1.1 - - extend@3.0.2: {} + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.2.2 + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color - external-editor@3.1.0: + express@5.2.1: dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 + accepts: 2.0.0 + body-parser: 2.2.1 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.2.2 + debug: 4.4.1 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - - fast-glob@3.3.2: + fast-glob@3.3.3: 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 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-json-stringify@6.0.0: dependencies: '@fastify/merge-json-schemas': 0.1.1 - ajv: 8.13.0 - ajv-formats: 3.0.1(ajv@8.13.0) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) fast-deep-equal: 3.1.3 fast-uri: 2.3.0 json-schema-ref-resolver: 1.0.1 - rfdc: 1.3.1 + rfdc: 1.4.1 fast-levenshtein@2.0.6: {} - fast-loops@1.1.3: {} - fast-querystring@1.1.2: dependencies: fast-decode-uri-component: 1.0.1 @@ -8915,68 +10065,67 @@ snapshots: fast-uri@3.0.1: {} - fastify-plugin@4.5.1: {} + fastify-plugin@5.0.1: {} - fastify@5.0.0: + fastify@5.6.1: dependencies: '@fastify/ajv-compiler': 4.0.0 '@fastify/error': 4.0.0 '@fastify/fast-json-stringify-compiler': 5.0.1 + '@fastify/proxy-addr': 5.0.0 abstract-logging: 2.0.1 avvio: 9.0.0 fast-json-stringify: 6.0.0 find-my-way: 9.0.1 light-my-request: 6.0.0 pino: 9.0.0 - process-warning: 4.0.0 - proxy-addr: 2.0.7 - rfdc: 1.3.1 - secure-json-parse: 2.7.0 + process-warning: 5.0.0 + rfdc: 1.4.1 + secure-json-parse: 4.0.0 semver: 7.6.1 toad-cache: 3.7.0 - fastq@1.17.1: + fastify@5.6.2: dependencies: - reusify: 1.0.4 - - fbjs-css-vars@1.0.2: {} + '@fastify/ajv-compiler': 4.0.0 + '@fastify/error': 4.0.0 + '@fastify/fast-json-stringify-compiler': 5.0.1 + '@fastify/proxy-addr': 5.0.0 + abstract-logging: 2.0.1 + avvio: 9.0.0 + fast-json-stringify: 6.0.0 + find-my-way: 9.0.1 + light-my-request: 6.0.0 + pino: 10.1.0 + process-warning: 5.0.0 + rfdc: 1.4.1 + secure-json-parse: 4.0.0 + semver: 7.6.1 + toad-cache: 3.7.0 - fbjs@3.0.5: + fastq@1.17.1: dependencies: - cross-fetch: 3.1.8 - fbjs-css-vars: 1.0.2 - loose-envify: 1.4.0 - object-assign: 4.1.1 - promise: 7.3.1 - setimmediate: 1.0.5 - ua-parser-js: 1.0.37 - transitivePeerDependencies: - - encoding - - fflate@0.8.2: {} + reusify: 1.0.4 - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 + fdir@6.4.6(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 - figures@5.0.0: - dependencies: - escape-string-regexp: 5.0.0 - is-unicode-supported: 1.3.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 - file-entry-cache@6.0.1: + figures@6.1.0: dependencies: - flat-cache: 3.2.0 + is-unicode-supported: 2.1.0 - file-loader@4.3.0(webpack@5.97.1): + file-entry-cache@8.0.0: dependencies: - loader-utils: 1.4.2 - schema-utils: 2.7.1 - webpack: 5.97.1 + flat-cache: 4.0.1 file-uri-to-path@1.0.0: {} - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -8992,48 +10141,54 @@ snapshots: transitivePeerDependencies: - supports-color + finalhandler@2.1.0: + dependencies: + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-my-way@9.0.1: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 safe-regex2: 4.0.0 + find-root@1.1.0: {} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.3 keyv: 4.5.4 - rimraf: 3.0.2 - - flat@5.0.2: {} - - flatted@3.3.1: {} - - flexsearch@0.7.43: {} - focus-visible@5.2.0: {} + flatted@3.3.3: {} follow-redirects@1.15.6: {} - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: + foreground-child@3.3.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.90.1): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.10.18)): dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.27.1 chalk: 4.1.2 - chokidar: 3.6.0 - cosmiconfig: 8.3.6(typescript@5.3.3) + chokidar: 4.0.3 + cosmiconfig: 8.3.6(typescript@5.9.3) deepmerge: 4.3.1 fs-extra: 10.1.0 memfs: 3.5.3 @@ -9041,22 +10196,33 @@ snapshots: node-abort-controller: 3.1.1 schema-utils: 3.3.0 semver: 7.6.1 - tapable: 2.2.1 - typescript: 5.3.3 - webpack: 5.90.1 + tapable: 2.3.0 + typescript: 5.9.3 + webpack: 5.104.1(@swc/core@1.10.18) - form-data@4.0.0: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 forwarded@0.2.0: {} - fraction.js@4.3.7: {} + framer-motion@12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + motion-dom: 12.4.5 + motion-utils: 12.0.0 + tslib: 2.6.2 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) fresh@0.5.2: {} + fresh@2.0.0: {} + fs-constants@1.0.0: {} fs-extra@10.1.0: @@ -9065,7 +10231,7 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.2.0: + fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -9075,59 +10241,51 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + 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.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} - get-func-name@2.0.2: {} + get-east-asian-width@1.3.0: {} - get-intrinsic@1.2.4: + get-intrinsic@1.3.0: dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 - get-stream@3.0.0: {} + get-nonce@1.0.1: {} - get-stream@6.0.1: {} + get-port@5.1.1: {} - get-stream@8.0.1: {} - - get-symbol-description@1.0.2: + get-proto@1.0.1: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 - git-up@7.0.0: - dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 + get-stream@8.0.1: {} - git-url-parse@13.1.1: + get-stream@9.0.1: dependencies: - git-up: 7.0.0 + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 github-from-package@0.0.0: {} - github-slugger@2.0.0: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -9138,21 +10296,20 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.3.10: + glob@10.5.0: dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.1.0 - path-scurry: 1.10.2 + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 - glob@10.3.12: + glob@13.0.0: dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.1.0 - path-scurry: 1.10.2 + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.0 glob@7.2.3: dependencies: @@ -9163,61 +10320,26 @@ snapshots: 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.0.1 - once: 1.4.0 - - glob@9.3.5: - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.4 - minipass: 4.2.8 - path-scurry: 1.10.2 - globals@11.12.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 + globals@14.0.0: {} - 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 + globrex@0.1.2: {} - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} - gray-matter@4.0.3: + gunzip-maybe@1.4.2: dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - - has-bigints@1.0.2: {} - - has-flag@2.0.0: {} - - has-flag@3.0.0: {} + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 has-flag@4.0.0: {} @@ -9225,146 +10347,37 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 - - hash-obj@4.0.0: - dependencies: - is-obj: 3.0.0 - sort-keys: 5.0.0 - type-fest: 1.4.0 + has-symbols: 1.1.0 hasown@2.0.2: dependencies: function-bind: 1.1.2 - hast-util-from-dom@5.0.0: - dependencies: - '@types/hast': 3.0.4 - hastscript: 8.0.0 - web-namespaces: 2.0.1 - - hast-util-from-html-isomorphic@2.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-from-dom: 5.0.0 - hast-util-from-html: 2.0.1 - unist-util-remove-position: 5.0.0 - - hast-util-from-html@2.0.1: - dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.1 - parse5: 7.1.2 - vfile: 6.0.1 - vfile-message: 4.0.2 - - hast-util-from-parse5@8.0.1: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.5.0 - vfile: 6.0.1 - vfile-location: 5.0.2 - web-namespaces: 2.0.1 - - hast-util-is-element@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-parse-selector@4.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-raw@9.0.3: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-estree@2.3.3: - dependencies: - '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/unist': 2.0.10 - comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.1 - estree-util-is-identifier-name: 2.1.0 - hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unist-util-position: 4.0.4 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - - hast-util-to-parse5@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-text@4.0.2: + hoist-non-react-statics@3.3.2: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 + react-is: 16.13.1 - hast-util-whitespace@2.0.1: {} + hono@4.11.3: {} - hastscript@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 + hono@4.9.11: {} - he@1.2.0: {} + hookable@5.5.3: {} - header-case@2.0.4: + hosted-git-info@6.1.3: dependencies: - capital-case: 1.0.4 - tslib: 2.6.2 - - highlight.js@10.7.3: {} + lru-cache: 7.18.3 - hono@4.6.2: {} + html-entities@2.3.3: {} - html-encoding-sniffer@4.0.0: + html@1.0.0: dependencies: - whatwg-encoding: 3.1.1 - - html-void-elements@3.0.0: {} + concat-stream: 1.6.2 http-errors@2.0.0: dependencies: @@ -9374,288 +10387,143 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.4: + http-errors@2.0.1: dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - human-signals@4.3.1: {} + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 human-signals@5.0.0: {} - husky@8.0.3: {} - - hyphenate-style-name@1.0.4: {} - - i18next@23.15.1: - dependencies: - '@babel/runtime': 7.24.5 - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - ieee754@1.2.1: {} - - ignore@5.3.1: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ini@1.3.8: {} - - inline-style-parser@0.1.1: {} - - inline-style-prefixer@6.0.4: - dependencies: - css-in-js-utils: 3.1.0 - fast-loops: 1.1.3 - - inquirer@8.2.6: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 6.2.0 - - inquirer@9.2.12: - dependencies: - '@ljharb/through': 2.3.13 - ansi-escapes: 4.3.2 - chalk: 5.3.0 - cli-cursor: 3.1.0 - cli-width: 4.1.0 - external-editor: 3.1.0 - figures: 5.0.0 - lodash: 4.17.21 - mute-stream: 1.0.0 - ora: 5.4.1 - run-async: 3.0.0 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - - internmap@1.0.1: {} - - internmap@2.0.3: {} - - interpret@1.4.0: {} - - intersection-observer@0.12.2: {} + human-signals@8.0.1: {} - intl-pluralrules@2.0.1: {} + husky@9.1.7: {} - ipaddr.js@1.9.1: {} + i18next@23.15.1: + dependencies: + '@babel/runtime': 7.24.5 - is-alphabetical@2.0.1: {} + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 - is-alphanumerical@2.0.1: + iconv-lite@0.6.3: dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 + safer-buffer: 2.1.2 - is-arguments@1.1.1: + iconv-lite@0.7.0: dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + safer-buffer: 2.1.2 - is-array-buffer@3.0.4: + iconv-lite@0.7.2: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + safer-buffer: 2.1.2 - is-arrayish@0.2.1: {} + ieee754@1.2.1: {} - is-async-function@2.0.0: - dependencies: - has-tostringtag: 1.0.2 + ignore@5.3.2: {} - is-bigint@1.0.4: + import-fresh@3.3.0: dependencies: - has-bigints: 1.0.2 + parent-module: 1.0.1 + resolve-from: 4.0.0 - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 + imurmurhash@0.1.4: {} - is-boolean-object@1.1.2: + inflight@1.0.6: dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + intl-pluralrules@2.0.1: {} + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} - is-buffer@2.0.5: {} + is-arrayish@0.2.1: {} is-callable@1.2.7: {} - is-ci@3.0.1: + is-ci@4.1.0: dependencies: - ci-info: 3.9.0 + ci-info: 4.1.0 is-core-module@2.13.1: dependencies: hasown: 2.0.2 - 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-decimal@2.0.1: {} + is-deflate@1.0.0: {} - is-extendable@0.1.1: {} + is-docker@3.0.0: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.7 - is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} - is-generator-function@1.0.10: + is-fullwidth-code-point@5.0.0: dependencies: - has-tostringtag: 1.0.2 + get-east-asian-width: 1.3.0 is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-hexadecimal@2.0.1: {} + is-gzip@1.0.0: {} - is-interactive@1.0.0: {} - - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: + is-inside-container@1.0.0: dependencies: - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} - - is-obj@3.0.0: {} + is-docker: 3.0.0 - is-path-inside@3.0.3: {} - - is-plain-obj@2.1.0: {} + is-interactive@1.0.0: {} - is-plain-obj@3.0.0: {} + is-number@7.0.0: {} is-plain-obj@4.1.0: {} - is-potential-custom-element-name@1.0.1: {} - - is-reference@3.0.2: - dependencies: - '@types/estree': 1.0.5 - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 + is-promise@4.0.0: {} - is-ssh@1.4.0: + is-reference@3.0.3: dependencies: - protocols: 2.0.1 - - is-stream@1.1.0: {} + '@types/estree': 1.0.8 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-stream@4.0.1: {} - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 is-unicode-supported@0.1.0: {} - is-unicode-supported@1.3.0: {} + is-unicode-supported@2.1.0: {} - is-weakmap@2.0.2: {} + is-what@4.1.16: {} - is-weakref@1.0.2: + is-wsl@3.1.0: dependencies: - call-bind: 1.0.7 + is-inside-container: 1.0.0 - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + isarray@1.0.0: {} isarray@2.0.5: {} + isbot@5.1.23: {} + isexe@2.0.0: {} - iterator.prototype@1.1.2: - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 - set-function-name: 2.0.2 + isexe@3.1.1: {} - jackspeak@2.3.6: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -9663,59 +10531,42 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 18.19.33 + '@types/node': 20.17.24 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@1.21.0: {} + jiti@2.4.2: {} - js-tokens@4.0.0: {} + js-beautify@1.15.3: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.5.0 + js-cookie: 3.0.5 + nopt: 8.1.0 - js-tokens@9.0.0: {} + js-cookie@3.0.5: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + js-tokens@4.0.0: {} - js-yaml@4.1.0: + js-tokens@9.0.1: {} + + js-yaml@4.1.1: dependencies: argparse: 2.0.1 - jsdom@23.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): - dependencies: - '@asamuzakjp/dom-selector': 2.0.2 - 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 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - 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.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + jsesc@3.0.2: {} - jsesc@2.5.2: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} + + json-parse-even-better-errors@4.0.0: {} + json-schema-ref-resolver@1.0.1: dependencies: fast-deep-equal: 3.1.3 @@ -9726,15 +10577,9 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json5@1.0.2: - dependencies: - minimist: 1.2.8 - json5@2.2.3: {} - jsonc-parser@3.2.0: {} - - jsonc-parser@3.2.1: {} + jsonc-parser@3.3.1: {} jsonfile@6.1.0: dependencies: @@ -9742,30 +10587,13 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 - - katex@0.16.10: - dependencies: - commander: 8.3.0 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 - khroma@2.1.0: {} - - kind-of@6.0.3: {} + kolorist@1.8.0: {} - kleur@4.1.5: {} - - kysely@0.27.5: {} - - layout-base@1.0.2: {} + kysely@0.28.9: {} levn@0.4.1: dependencies: @@ -9778,9 +10606,52 @@ snapshots: process-warning: 4.0.0 set-cookie-parser: 2.6.0 - lilconfig@2.1.0: {} + lightningcss-darwin-arm64@1.29.1: + optional: true + + lightningcss-darwin-x64@1.29.1: + optional: true + + lightningcss-freebsd-x64@1.29.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.1: + optional: true + + lightningcss-linux-arm64-gnu@1.29.1: + optional: true + + lightningcss-linux-arm64-musl@1.29.1: + optional: true + + lightningcss-linux-x64-gnu@1.29.1: + optional: true + + lightningcss-linux-x64-musl@1.29.1: + optional: true + + lightningcss-win32-arm64-msvc@1.29.1: + optional: true + + lightningcss-win32-x64-msvc@1.29.1: + optional: true - lilconfig@3.1.1: {} + lightningcss@1.29.1: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.1 + lightningcss-darwin-x64: 1.29.1 + lightningcss-freebsd-x64: 1.29.1 + lightningcss-linux-arm-gnueabihf: 1.29.1 + lightningcss-linux-arm64-gnu: 1.29.1 + lightningcss-linux-arm64-musl: 1.29.1 + lightningcss-linux-x64-gnu: 1.29.1 + lightningcss-linux-x64-musl: 1.29.1 + lightningcss-win32-arm64-msvc: 1.29.1 + lightningcss-win32-x64-msvc: 1.29.1 + + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -9788,52 +10659,42 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@14.0.1: + lint-staged@15.5.0: dependencies: - chalk: 5.3.0 - commander: 11.0.0 - debug: 4.3.4(supports-color@8.1.1) - execa: 7.2.0 - lilconfig: 2.1.0 - listr2: 6.6.1 - micromatch: 4.0.5 + chalk: 5.4.1 + commander: 13.1.0 + debug: 4.4.0 + execa: 8.0.1 + lilconfig: 3.1.3 + listr2: 8.2.5 + micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.3.1 + yaml: 2.7.0 transitivePeerDependencies: - - enquirer - supports-color - listr2@6.6.1: + listr2@8.2.5: dependencies: - cli-truncate: 3.1.0 + cli-truncate: 4.0.0 colorette: 2.0.20 eventemitter3: 5.0.1 - log-update: 5.0.1 - rfdc: 1.3.1 - wrap-ansi: 8.1.0 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + load-tsconfig@0.2.5: {} loader-runner@4.3.0: {} - loader-utils@1.4.2: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.2 + loader-runner@4.3.1: {} - local-pkg@0.5.0: - dependencies: - mlly: 1.7.0 - pkg-types: 1.1.0 + locate-character@3.0.0: {} locate-path@6.0.0: dependencies: p-locate: 5.0.0 - lodash-es@4.17.21: {} - - lodash.get@4.4.2: {} - lodash.merge@4.6.2: {} lodash@4.17.21: {} @@ -9843,613 +10704,119 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - log-update@5.0.1: + log-update@6.1.0: dependencies: - ansi-escapes: 5.0.0 - cli-cursor: 4.0.0 - slice-ansi: 5.0.0 + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 strip-ansi: 7.1.0 - wrap-ansi: 8.1.0 - - longest-streak@3.1.0: {} + wrap-ansi: 9.0.0 loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 + loupe@3.1.3: {} - lower-case@2.0.2: - dependencies: - tslib: 2.6.2 + loupe@3.1.4: {} lru-cache@10.2.2: {} - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 + lru-cache@11.0.2: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lunr@2.3.9: {} + lru-cache@7.18.3: {} - lz-string@1.5.0: {} + lunr@2.3.9: {} - magic-string@0.30.10: + magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.5: + magic-string@0.30.19: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 make-error@1.3.6: {} - markdown-extensions@1.1.1: {} - 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 - - markdown-table@3.0.3: {} - - match-sorter@6.3.4: - dependencies: - '@babel/runtime': 7.24.5 - remove-accents: 0.5.0 - - mdast-util-definitions@5.1.2: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - unist-util-visit: 4.1.2 - - mdast-util-find-and-replace@2.2.2: - dependencies: - '@types/mdast': 3.0.15 - escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - - mdast-util-from-markdown@1.3.1: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-autolink-literal@1.0.3: - dependencies: - '@types/mdast': 3.0.15 - ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 - - mdast-util-gfm-footnote@1.0.2: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 - - mdast-util-gfm-strikethrough@1.0.3: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - - mdast-util-gfm-table@1.0.7: - dependencies: - '@types/mdast': 3.0.15 - markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@1.0.2: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - - mdast-util-gfm@2.0.2: - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - - mdast-util-math@2.0.2: - dependencies: - '@types/mdast': 3.0.15 - longest-streak: 3.1.0 - mdast-util-to-markdown: 1.5.0 - - mdast-util-mdx-expression@1.3.2: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-jsx@2.1.4: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - ccount: 2.0.1 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.4 - unist-util-remove-position: 4.0.2 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx@2.0.1: - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdx-jsx: 2.1.4 - mdast-util-mdxjs-esm: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - - mdast-util-mdxjs-esm@1.3.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@3.0.1: - dependencies: - '@types/mdast': 3.0.15 - unist-util-is: 5.2.1 - - mdast-util-to-hast@12.3.0: - dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.2.0 - trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - - mdast-util-to-hast@13.1.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - - mdast-util-to-markdown@1.5.0: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 - - mdast-util-to-string@3.2.0: - dependencies: - '@types/mdast': 3.0.15 - - mdn-data@2.0.30: {} - - mdurl@2.0.0: {} - - media-typer@0.3.0: {} - - memfs@3.5.3: - dependencies: - fs-monkey: 1.0.6 - - memoize-one@6.0.0: {} - - merge-descriptors@1.0.3: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - mermaid@10.9.0: - dependencies: - '@braintree/sanitize-url': 6.0.4 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 - cytoscape: 3.29.2 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.29.2) - d3: 7.9.0 - d3-sankey: 0.12.3 - dagre-d3-es: 7.0.10 - dayjs: 1.11.11 - dompurify: 3.1.2 - elkjs: 0.9.3 - katex: 0.16.10 - khroma: 2.1.0 - lodash-es: 4.17.21 - mdast-util-from-markdown: 1.3.1 - non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.3.2 - ts-dedent: 2.2.0 - uuid: 3.4.0 - web-worker: 1.3.0 - transitivePeerDependencies: - - supports-color - - methods@1.1.2: {} - - micromark-core-commonmark@1.1.0: - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm-autolink-literal@1.0.5: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-extension-gfm-footnote@1.1.2: - dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm-strikethrough@1.0.7: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm-table@1.0.7: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm-tagfilter@1.0.2: - dependencies: - micromark-util-types: 1.1.0 - - micromark-extension-gfm-task-list-item@1.0.5: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm@2.0.3: - dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-extension-math@2.1.2: - dependencies: - '@types/katex': 0.16.7 - katex: 0.16.10 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-mdx-expression@1.0.8: - dependencies: - '@types/estree': 1.0.5 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-mdx-jsx@1.0.5: - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 - estree-util-is-identifier-name: 2.1.0 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 - - micromark-extension-mdx-md@1.0.1: - dependencies: - micromark-util-types: 1.1.0 - - micromark-extension-mdxjs-esm@1.0.5: - dependencies: - '@types/estree': 1.0.5 - micromark-core-commonmark: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - - micromark-extension-mdxjs@1.0.1: - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - micromark-extension-mdx-expression: 1.0.8 - micromark-extension-mdx-jsx: 1.0.5 - micromark-extension-mdx-md: 1.0.1 - micromark-extension-mdxjs-esm: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-factory-destination@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-factory-label@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-factory-mdx-expression@1.0.9: - dependencies: - '@types/estree': 1.0.5 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - - micromark-factory-space@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - - micromark-factory-title@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-factory-whitespace@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-character@1.2.0: - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-character@2.1.0: - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-chunked@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-classify-character@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-combine-extensions@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-decode-numeric-character-reference@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-decode-string@1.1.0: - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 - - micromark-util-encode@1.1.0: {} + 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 - micromark-util-encode@2.0.0: {} + math-intrinsics@1.1.0: {} - micromark-util-events-to-acorn@1.2.3: - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 - '@types/unist': 2.0.10 - estree-util-visit: 1.2.1 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 + mdurl@2.0.0: {} - micromark-util-html-tag-name@1.2.0: {} + media-typer@0.3.0: {} - micromark-util-normalize-identifier@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 + media-typer@1.1.0: {} - micromark-util-resolve-all@1.1.0: + memfs@3.5.3: dependencies: - micromark-util-types: 1.1.0 + fs-monkey: 1.0.6 - micromark-util-sanitize-uri@1.2.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 + memoize-one@6.0.0: {} - micromark-util-sanitize-uri@2.0.0: - dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 + memorystream@0.3.1: {} - micromark-util-subtokenize@1.1.0: + merge-anything@5.1.7: dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + is-what: 4.1.16 - micromark-util-symbol@1.1.0: {} + merge-descriptors@1.0.3: {} - micromark-util-symbol@2.0.0: {} + merge-descriptors@2.0.0: {} - micromark-util-types@1.1.0: {} + merge-stream@2.0.0: {} - micromark-util-types@2.0.0: {} + merge2@1.4.1: {} - micromark@3.2.0: - dependencies: - '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@8.1.1) - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color + methods@1.1.2: {} - micromatch@4.0.5: + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mime@1.6.0: {} mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} - mimic-response@3.1.0: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 + mimic-function@5.0.1: {} - minimatch@5.0.1: - dependencies: - brace-expansion: 2.0.1 + mimic-response@3.1.0: {} - minimatch@8.0.4: + minimatch@10.1.1: dependencies: - brace-expansion: 2.0.1 + '@isaacs/brace-expansion': 5.0.0 - minimatch@9.0.3: + minimatch@3.1.2: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.11 - minimatch@9.0.4: + minimatch@9.0.1: dependencies: brace-expansion: 2.0.1 @@ -10459,9 +10826,13 @@ snapshots: minimist@1.2.8: {} - minipass@4.2.8: {} + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 - minipass@7.1.0: {} + mitt@3.0.1: {} mkdirp-classic@0.5.3: {} @@ -10469,41 +10840,25 @@ snapshots: dependencies: minimist: 1.2.8 - mkdirp@2.1.6: {} - - mlly@1.7.0: + morgan@1.10.0: dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.1.0 - ufo: 1.5.3 + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color - mocha@10.4.0: + motion-dom@12.4.5: dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 + motion-utils: 12.0.0 + + motion-utils@12.0.0: {} mri@1.2.0: {} - mrmime@2.0.0: {} + mrmime@2.0.1: {} ms@2.0.0: {} @@ -10511,175 +10866,37 @@ snapshots: ms@2.1.3: {} - mute-stream@0.0.8: {} - - mute-stream@1.0.0: {} + muggle-string@0.4.1: {} - mz@2.7.0: + multer@2.0.2: dependencies: - any-promise: 1.3.0 + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 2.0.0 + mkdirp: 0.5.6 object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.7: {} - - napi-build-utils@1.0.2: {} - - natural-compare-lite@1.4.0: {} - - natural-compare@1.4.0: {} - - negotiator@0.6.3: {} + type-is: 1.6.18 + xtend: 4.0.2 - neo-async@2.6.2: {} + mute-stream@2.0.0: {} - next-mdx-remote@4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - vfile: 5.3.7 - vfile-matter: 3.0.1 - transitivePeerDependencies: - - supports-color + nanoid@3.3.11: {} - next-seo@6.5.0(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - next: 13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + nanoid@3.3.8: {} - next-sitemap@4.2.3(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)): - dependencies: - '@corex/deepmerge': 4.0.43 - '@next/env': 13.5.6 - fast-glob: 3.3.2 - minimist: 1.2.8 - next: 13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + nanoid@5.1.6: {} - next-themes@0.2.1(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - next: 13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + napi-build-utils@1.0.2: {} - next-videos@1.4.1(webpack@5.97.1): - dependencies: - file-loader: 4.3.0(webpack@5.97.1) - transitivePeerDependencies: - - webpack + natural-compare@1.4.0: {} - next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@next/env': 13.0.6 - '@swc/helpers': 0.4.14 - caniuse-lite: 1.0.30001617 - postcss: 8.4.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.0(react@18.2.0) - optionalDependencies: - '@next/swc-android-arm-eabi': 13.0.6 - '@next/swc-android-arm64': 13.0.6 - '@next/swc-darwin-arm64': 13.0.6 - '@next/swc-darwin-x64': 13.0.6 - '@next/swc-freebsd-x64': 13.0.6 - '@next/swc-linux-arm-gnueabihf': 13.0.6 - '@next/swc-linux-arm64-gnu': 13.0.6 - '@next/swc-linux-arm64-musl': 13.0.6 - '@next/swc-linux-x64-gnu': 13.0.6 - '@next/swc-linux-x64-musl': 13.0.6 - '@next/swc-win32-arm64-msvc': 13.0.6 - '@next/swc-win32-ia32-msvc': 13.0.6 - '@next/swc-win32-x64-msvc': 13.0.6 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros + negotiator@0.6.3: {} - next@13.5.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@next/env': 13.5.6 - '@swc/helpers': 0.5.2 - busboy: 1.6.0 - caniuse-lite: 1.0.30001617 - postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(react@18.2.0) - watchpack: 2.4.0 - optionalDependencies: - '@next/swc-darwin-arm64': 13.5.6 - '@next/swc-darwin-x64': 13.5.6 - '@next/swc-linux-arm64-gnu': 13.5.6 - '@next/swc-linux-arm64-musl': 13.5.6 - '@next/swc-linux-x64-gnu': 13.5.6 - '@next/swc-linux-x64-musl': 13.5.6 - '@next/swc-win32-arm64-msvc': 13.5.6 - '@next/swc-win32-ia32-msvc': 13.5.6 - '@next/swc-win32-x64-msvc': 13.5.6 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros + negotiator@0.6.4: {} - nextra-theme-docs@2.13.2(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(nextra@2.13.2(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@headlessui/react': 1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@popperjs/core': 2.11.8 - clsx: 2.1.1 - escape-string-regexp: 5.0.0 - flexsearch: 0.7.43 - focus-visible: 5.2.0 - git-url-parse: 13.1.1 - intersection-observer: 0.12.2 - match-sorter: 6.3.4 - next: 13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - next-seo: 6.5.0(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - next-themes: 0.2.1(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - nextra: 2.13.2(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - scroll-into-view-if-needed: 3.1.0 - zod: 3.24.1 - - nextra@2.13.2(next@13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@headlessui/react': 1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - '@napi-rs/simple-git': 0.1.16 - '@theguild/remark-mermaid': 0.0.5(react@18.2.0) - '@theguild/remark-npm2yarn': 0.2.1 - clsx: 2.1.1 - github-slugger: 2.0.0 - graceful-fs: 4.2.11 - gray-matter: 4.0.3 - katex: 0.16.10 - lodash.get: 4.4.2 - next: 13.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - next-mdx-remote: 4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - p-limit: 3.1.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - rehype-katex: 7.0.0 - rehype-pretty-code: 0.9.11(shiki@0.14.7) - rehype-raw: 7.0.0 - remark-gfm: 3.0.1 - remark-math: 5.1.1 - remark-reading-time: 2.0.1 - shiki: 0.14.7 - slash: 3.0.0 - title: 3.5.3 - unist-util-remove: 4.0.0 - unist-util-visit: 5.0.0 - zod: 3.24.1 - transitivePeerDependencies: - - supports-color + negotiator@1.0.0: {} - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.6.2 + neo-async@2.6.2: {} node-abi@3.62.0: dependencies: @@ -10687,95 +10904,93 @@ snapshots: node-abort-controller@3.1.1: {} + node-addon-api@7.1.1: {} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-gyp-build@4.8.1: {} - node-releases@2.0.14: {} - node-releases@2.0.19: {} - non-layered-tidy-tree-layout@2.0.2: {} - - normalize-path@3.0.0: {} + node-releases@2.0.23: {} - normalize-range@0.1.2: {} + node-releases@2.0.27: {} - npm-run-path@2.0.2: + nopt@8.1.0: dependencies: - path-key: 2.0.1 + abbrev: 3.0.0 - npm-run-path@5.3.0: + normalize-package-data@5.0.0: dependencies: - path-key: 4.0.0 - - npm-to-yarn@2.2.1: {} - - nullthrows@1.1.1: {} + hosted-git-info: 6.1.3 + is-core-module: 2.13.1 + semver: 7.6.1 + validate-npm-package-license: 3.0.4 - object-assign@4.1.1: {} + npm-install-checks@6.3.0: + dependencies: + semver: 7.6.1 - object-hash@3.0.0: {} + npm-normalize-package-bin@3.0.1: {} - object-inspect@1.13.1: {} + npm-normalize-package-bin@4.0.0: {} - object-is@1.1.6: + npm-package-arg@10.1.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - object-keys@1.1.1: {} + hosted-git-info: 6.1.3 + proc-log: 3.0.0 + semver: 7.6.1 + validate-npm-package-name: 5.0.1 - object.assign@4.1.5: + npm-pick-manifest@8.0.2: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.6.1 - object.entries@1.1.8: + npm-run-all2@8.0.4: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 + ansi-styles: 6.2.1 + cross-spawn: 7.0.6 + memorystream: 0.3.1 + picomatch: 4.0.2 + pidtree: 0.6.0 + read-package-json-fast: 4.0.0 + shell-quote: 1.8.3 + which: 5.0.0 - object.fromentries@2.0.8: + npm-run-path@5.3.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + path-key: 4.0.0 - object.groupby@1.0.3: + npm-run-path@6.0.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 + path-key: 4.0.0 + unicorn-magic: 0.3.0 - object.hasown@1.1.4: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + object-assign@4.1.1: {} - object.values@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 + object-inspect@1.13.1: {} + + object-inspect@1.13.4: {} + + ohash@2.0.11: {} on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 + on-headers@1.0.2: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -10788,6 +11003,17 @@ snapshots: dependencies: mimic-fn: 4.0.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@10.2.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -10809,133 +11035,118 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - os-tmpdir@1.0.2: {} - - p-finally@1.0.0: {} - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.0.0 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 + package-json-from-dist@1.0.1: {} + + pako@0.2.9: {} parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-entities@4.0.1: - dependencies: - '@types/unist': 2.0.10 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-numeric-range@1.3.0: {} - - parse-path@7.0.0: - dependencies: - protocols: 2.0.1 - - parse-url@8.1.0: - dependencies: - parse-path: 7.0.0 - - parse5-htmlparser2-tree-adapter@6.0.1: - dependencies: - parse5: 6.0.1 - - parse5@5.1.1: {} + parse-ms@4.0.0: {} - parse5@6.0.1: {} - - parse5@7.1.2: + parse5@7.3.0: dependencies: - entities: 4.5.0 + entities: 6.0.1 parseurl@1.3.3: {} - pascal-case@3.1.2: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 + path-browserify@1.0.1: {} - path-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 + path-equal@1.2.5: {} 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-scurry@1.10.2: + path-scurry@1.11.1: dependencies: lru-cache: 10.2.2 - minipass: 7.1.0 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} - path-to-regexp@0.1.10: {} + path-to-regexp@8.2.0: {} path-type@4.0.0: {} pathe@1.1.2: {} - pathval@1.1.1: {} + pathe@2.0.3: {} - periscopic@3.1.0: + pathval@2.0.0: {} + + peek-stream@1.1.3: dependencies: - '@types/estree': 1.0.5 - estree-walker: 3.0.3 - is-reference: 3.0.2 + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 - picocolors@1.0.0: {} + perfect-debounce@2.0.0: {} picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@3.0.1: {} + picomatch@4.0.2: {} - pidtree@0.6.0: {} + picomatch@4.0.3: {} - pify@2.3.0: {} + pidtree@0.6.0: {} pino-abstract-transport@1.2.0: dependencies: readable-stream: 4.5.2 split2: 4.2.0 + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + pino-std-serializers@6.2.2: {} + pino-std-serializers@7.0.0: {} + + pino@10.1.0: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pino@9.0.0: dependencies: atomic-sleep: 1.0.0 @@ -10950,67 +11161,29 @@ snapshots: sonic-boom: 3.8.1 thread-stream: 2.7.0 - pirates@4.0.6: {} - - pkg-types@1.1.0: - dependencies: - confbox: 0.1.7 - mlly: 1.7.0 - pathe: 1.1.2 - - pluralize@8.0.0: {} - - possible-typed-array-names@1.0.0: {} - - postcss-import@15.1.0(postcss@8.4.38): - dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - - postcss-js@4.0.1(postcss@8.4.38): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.38 + playwright-core@1.51.1: {} - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5)): + playwright@1.51.1: dependencies: - lilconfig: 3.1.1 - yaml: 2.4.2 + playwright-core: 1.51.1 optionalDependencies: - postcss: 8.4.38 - ts-node: 10.9.2(@types/node@18.19.33)(typescript@5.4.5) - - postcss-nested@6.0.1(postcss@8.4.38): - dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - - postcss-selector-parser@6.0.16: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + fsevents: 2.3.2 - postcss-value-parser@4.2.0: {} + pluralize@8.0.0: {} - postcss@8.4.14: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 + possible-typed-array-names@1.1.0: {} - postcss@8.4.31: + postcss@8.5.3: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 - postcss@8.4.38: + postcss@8.5.6: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 prebuild-install@7.1.2: dependencies: @@ -11029,33 +11202,32 @@ snapshots: prelude-ls@1.2.1: {} - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - prettier@2.8.8: {} - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 + prettier@3.5.3: {} - pretty-format@29.7.0: + pretty-ms@9.3.0: dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 + parse-ms: 4.0.0 + + proc-log@3.0.0: {} + + process-nextick-args@2.0.1: {} process-warning@3.0.0: {} process-warning@4.0.0: {} + process-warning@5.0.0: {} + process@0.11.10: {} - promise@7.3.1: + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: dependencies: - asap: 2.0.6 + err-code: 2.0.3 + retry: 0.12.0 prop-types@15.8.1: dependencies: @@ -11063,9 +11235,7 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - property-information@6.5.0: {} - - protocols@2.0.1: {} + proto-list@1.2.4: {} proxy-addr@2.0.7: dependencies: @@ -11074,15 +11244,22 @@ snapshots: proxy-from-env@1.1.0: {} - pseudomap@1.0.2: {} - - psl@1.9.0: {} + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -11091,7 +11268,9 @@ snapshots: dependencies: side-channel: 1.0.6 - querystringify@2.2.0: {} + qs@6.14.0: + dependencies: + side-channel: 1.1.0 queue-microtask@1.2.3: {} @@ -11110,6 +11289,20 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.0 + unpipe: 1.0.0 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -11117,46 +11310,141 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@18.2.0(react@18.2.0): + react-d3-tree@3.6.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.2 + '@bkrem/react-transition-group': 1.3.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + clone: 2.1.2 + d3-hierarchy: 1.1.9 + d3-selection: 3.0.0 + d3-shape: 1.3.7 + d3-zoom: 3.0.0 + dequal: 2.0.3 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + uuid: 8.3.2 + + react-diff-viewer-continued@4.0.5(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@emotion/css': 11.13.5 + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) + classnames: 2.5.1 + diff: 5.2.0 + memoize-one: 6.0.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + transitivePeerDependencies: + - '@types/react' + - supports-color + + react-dom@19.0.0(react@19.0.0): + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + + react-hotkeys-hook@4.6.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) react-is@16.13.1: {} - react-is@17.0.2: {} + react-lifecycles-compat@3.0.4: {} - react-is@18.3.1: {} + react-refresh@0.14.2: {} - react-native-web@0.19.11(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-remove-scroll-bar@2.3.8(@types/react@19.0.10)(react@19.0.0): dependencies: - '@babel/runtime': 7.24.5 - '@react-native/normalize-colors': 0.74.83 - fbjs: 3.0.5 - inline-style-prefixer: 6.0.4 - memoize-one: 6.0.0 - nullthrows: 1.1.1 - postcss-value-parser: 4.2.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styleq: 0.1.3 + react: 19.0.0 + react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.10 + + react-remove-scroll@2.6.3(@types/react@19.0.10)(react@19.0.0): + dependencies: + react: 19.0.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.0.10)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.0.10)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@19.0.10)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + + react-router-devtools@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(vite@5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0)): + dependencies: + '@babel/core': 7.26.9 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + '@radix-ui/react-accordion': 1.2.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-select': 2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + beautify: 0.0.8 + bippy: 0.3.7(@types/react@19.0.10)(react@19.0.0) + chalk: 5.4.1 + clsx: 2.1.1 + date-fns: 4.1.0 + framer-motion: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-d3-tree: 3.6.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-diff-viewer-continued: 4.0.5(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-dom: 19.0.0(react@19.0.0) + react-hotkeys-hook: 4.6.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-router: 7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-tooltip: 5.28.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + vite: 5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0) + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.4 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 transitivePeerDependencies: - - encoding + - '@emotion/is-prop-valid' + - '@types/react' + - '@types/react-dom' + - supports-color + + react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@types/cookie': 0.6.0 + cookie: 1.0.2 + react: 19.0.0 + set-cookie-parser: 2.6.0 + turbo-stream: 2.4.0 + optionalDependencies: + react-dom: 19.0.0(react@19.0.0) - react-refresh@0.14.2: {} + react-style-singleton@2.2.3(@types/react@19.0.10)(react@19.0.0): + dependencies: + get-nonce: 1.0.1 + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.10 - react-wrap-balancer@1.1.0(react@18.2.0): + react-tooltip@5.28.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - react: 18.2.0 + '@floating-ui/dom': 1.6.13 + classnames: 2.5.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + react@19.0.0: {} - react@18.2.0: + read-package-json-fast@4.0.0: dependencies: - loose-envify: 1.4.0 + json-parse-even-better-errors: 4.0.0 + npm-normalize-package-bin: 4.0.0 - read-cache@1.0.0: + readable-stream@2.3.8: dependencies: - pify: 2.3.0 + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 readable-stream@3.6.2: dependencies: @@ -11172,109 +11460,14 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - reading-time@1.5.0: {} + readdirp@4.1.2: {} real-require@0.2.0: {} - rechoir@0.6.2: - dependencies: - resolve: 1.22.8 - reflect-metadata@0.2.2: {} - reflect.getprototypeof@1.0.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.3 - 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 - - regexpp@3.2.0: {} - - rehype-katex@7.0.0: - dependencies: - '@types/hast': 3.0.4 - '@types/katex': 0.16.7 - hast-util-from-html-isomorphic: 2.0.0 - hast-util-to-text: 4.0.2 - katex: 0.16.10 - unist-util-visit-parents: 6.0.1 - vfile: 6.0.1 - - rehype-pretty-code@0.9.11(shiki@0.14.7): - dependencies: - '@types/hast': 2.3.10 - hash-obj: 4.0.0 - parse-numeric-range: 1.3.0 - shiki: 0.14.7 - - rehype-raw@7.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.0.3 - vfile: 6.0.1 - - remark-gfm@3.0.1: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - - remark-math@5.1.1: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-math: 2.0.2 - micromark-extension-math: 2.1.2 - unified: 10.1.2 - - remark-mdx@2.3.0: - dependencies: - mdast-util-mdx: 2.0.1 - micromark-extension-mdxjs: 1.0.1 - transitivePeerDependencies: - - supports-color - - remark-parse@10.0.2: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - - remark-reading-time@2.0.1: - dependencies: - estree-util-is-identifier-name: 2.1.0 - estree-util-value-to-estree: 1.3.0 - reading-time: 1.5.0 - unist-util-visit: 3.1.0 - - remark-rehype@10.1.0: - dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 - remove-accents@0.5.0: {} repeat-string@1.6.1: {} @@ -11283,8 +11476,6 @@ snapshots: require-from-string@2.0.2: {} - requires-port@1.0.0: {} - resolve-from@4.0.0: {} resolve@1.22.8: @@ -11293,95 +11484,109 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - restore-cursor@4.0.0: + restore-cursor@5.1.0: dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 + onetime: 7.0.0 + signal-exit: 4.1.0 ret@0.5.0: {} - reusify@1.0.4: {} + retry@0.12.0: {} - rfdc@1.3.1: {} + reusify@1.0.4: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 + rfdc@1.4.1: {} - rimraf@4.4.1: + rollup@4.34.8: dependencies: - glob: 9.3.5 - - robust-predicates@3.0.2: {} + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 + fsevents: 2.3.3 - rollup@4.17.2: + rollup@4.52.4: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 fsevents: 2.3.3 - rrweb-cssom@0.6.0: {} - - run-async@2.4.1: {} + router@2.2.0: + dependencies: + debug: 4.4.0 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color - run-async@3.0.0: {} + run-applescript@7.1.0: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - rw@1.3.3: {} - rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 sade@1.8.1: dependencies: mri: 1.2.0 - 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-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safe-regex2@4.0.0: dependencies: ret: 0.5.0 @@ -11390,19 +11595,7 @@ snapshots: safer-buffer@2.1.2: {} - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - schema-utils@2.7.1: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + scheduler@0.25.0: {} schema-utils@3.3.0: dependencies: @@ -11410,16 +11603,21 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - scroll-into-view-if-needed@3.1.0: + schema-utils@4.3.2: dependencies: - compute-scroll-into-view: 3.1.0 + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) - section-matter@1.0.0: + schema-utils@4.3.3: dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) - secure-json-parse@2.7.0: {} + secure-json-parse@4.0.0: {} semver@6.3.1: {} @@ -11443,19 +11641,31 @@ snapshots: transitivePeerDependencies: - supports-color - sentence-case@3.0.4: + send@1.2.0: dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case-first: 2.0.2 + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color - serialize-javascript@6.0.0: + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - serialize-javascript@6.0.2: + seroval-plugins@1.3.3(seroval@1.3.2): dependencies: - randombytes: 2.1.0 + seroval: 1.3.2 + + seroval@1.3.2: {} serve-static@1.16.2: dependencies: @@ -11466,6 +11676,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + set-cookie-parser@2.6.0: {} set-function-length@1.2.2: @@ -11473,60 +11692,61 @@ snapshots: 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 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - setimmediate@1.0.5: {} - setprototypeof@1.2.0: {} - sha.js@2.4.11: + sha.js@2.4.12: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 + to-buffer: 1.2.2 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: {} + shell-quote@1.8.3: {} - shelljs@0.8.5: + side-channel-list@1.0.0: dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 - shiki@0.14.7: + side-channel-weakmap@1.0.2: dependencies: - ansi-sequence-parser: 1.1.1 - jsonc-parser: 3.2.1 - vscode-oniguruma: 1.7.0 - vscode-textmate: 8.0.0 + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 object-inspect: 1.13.1 + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -11541,38 +11761,49 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - sirv@2.0.4: + sirv@3.0.2: dependencies: - '@polka/url': 1.0.0-next.25 - mrmime: 2.0.0 + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 totalist: 3.0.1 - slash@3.0.0: {} + sisteransi@1.0.5: {} slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - snake-case@3.0.4: + slice-ansi@7.1.0: dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + socket.io-adapter@2.5.4(bufferutil@4.1.0): + dependencies: + debug: 4.3.4 + ws: 8.11.0(bufferutil@4.1.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - socket.io-adapter@2.5.4(bufferutil@4.0.8)(utf-8-validate@6.0.3): + socket.io-client@4.8.1(bufferutil@4.1.0): dependencies: - debug: 4.3.4(supports-color@8.1.1) - ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.4 + engine.io-client: 6.6.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-client@4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@8.1.1) - engine.io-client: 6.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) + debug: 4.4.1 + engine.io-client: 6.6.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil @@ -11582,60 +11813,91 @@ snapshots: socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color - socket.io@4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + socket.io@4.8.3(bufferutil@4.1.0): dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) - engine.io: 6.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) - socket.io-adapter: 2.5.4(bufferutil@4.0.8)(utf-8-validate@6.0.3) + debug: 4.4.1 + engine.io: 6.6.1(bufferutil@4.1.0) + socket.io-adapter: 2.5.4(bufferutil@4.1.0) socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate + solid-js@1.9.9: + dependencies: + csstype: 3.1.3 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) + + solid-refresh@0.6.3(solid-js@1.9.9): + dependencies: + '@babel/generator': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/types': 7.28.4 + solid-js: 1.9.9 + transitivePeerDependencies: + - supports-color + sonic-boom@3.8.1: dependencies: atomic-sleep: 1.0.0 - sort-keys@5.0.0: + sonic-boom@4.2.0: dependencies: - is-plain-obj: 4.1.0 + atomic-sleep: 1.0.0 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + source-map@0.5.7: {} + source-map@0.6.1: {} source-map@0.7.4: {} - space-separated-tokens@2.0.2: {} + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} - spawn-command@0.0.2: {} + speakingurl@14.0.1: {} split2@4.2.0: {} - sprintf-js@1.0.3: {} + sql-highlight@6.1.0: {} stackback@0.0.2: {} statuses@2.0.1: {} - std-env@3.7.0: {} + statuses@2.0.2: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 + std-env@3.9.0: {} + + stream-shift@1.0.3: {} + + stream-slice@0.1.2: {} streamsearch@1.1.0: {} @@ -11653,49 +11915,20 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.11: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.2 - side-channel: 1.0.6 - - 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.8: + string-width@7.2.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 - string.prototype.trimstart@1.0.8: + string_decoder@1.1.1: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 + safe-buffer: 5.1.2 string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -11704,57 +11937,25 @@ snapshots: dependencies: ansi-regex: 6.0.1 - strip-bom-string@1.0.0: {} - strip-bom@3.0.0: {} - strip-eof@1.0.0: {} - strip-final-newline@3.0.0: {} + strip-final-newline@4.0.0: {} + strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} - strip-literal@2.1.0: - dependencies: - js-tokens: 9.0.0 - - style-to-object@0.4.4: - dependencies: - inline-style-parser: 0.1.1 - - styled-jsx@5.1.0(react@18.2.0): + strip-literal@3.0.0: dependencies: - client-only: 0.0.1 - react: 18.2.0 - - styled-jsx@5.1.1(react@18.2.0): - dependencies: - client-only: 0.0.1 - react: 18.2.0 - - styleq@0.1.3: {} - - stylis@4.3.2: {} - - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - commander: 4.1.1 - glob: 10.3.12 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 + js-tokens: 9.0.1 - supports-color@4.5.0: - dependencies: - has-flag: 2.0.0 + stylis@4.2.0: {} - supports-color@5.5.0: + superjson@2.2.2: dependencies: - has-flag: 3.0.0 + copy-anything: 3.0.5 supports-color@7.2.0: dependencies: @@ -11766,41 +11967,49 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - symbol-observable@4.0.0: {} - - symbol-tree@3.2.4: {} + svelte-check@4.3.3(picomatch@4.0.3)(svelte@5.39.12)(typescript@5.9.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.3) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.39.12 + typescript: 5.9.3 + transitivePeerDependencies: + - picomatch - tailwindcss-animate-plugin@1.1.0: {} + svelte@5.39.12: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 2.1.0 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.19 + zimmerframe: 1.1.2 - tailwindcss@3.4.3(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5)): + swr@2.3.8(react@19.0.0): dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.38 - postcss-import: 15.1.0(postcss@8.4.38) - postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5)) - postcss-nested: 6.0.1(postcss@8.4.38) - postcss-selector-parser: 6.0.16 - resolve: 1.22.8 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node + dequal: 2.0.3 + react: 19.0.0 + use-sync-external-store: 1.6.0(react@19.0.0) + + symbol-observable@4.0.0: {} + + tailwindcss@4.0.8: {} tapable@2.2.1: {} + tapable@2.3.0: {} + tar-fs@2.1.1: dependencies: chownr: 1.1.4 @@ -11816,69 +12025,83 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - terser-webpack-plugin@5.3.10(webpack@5.90.1): + tar@7.5.6: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + terser-webpack-plugin@5.3.11(@swc/core@1.10.18)(webpack@5.102.1(@swc/core@1.10.18)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 - schema-utils: 3.3.0 + schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.31.0 - webpack: 5.90.1 + terser: 5.39.0 + webpack: 5.102.1(@swc/core@1.10.18) + optionalDependencies: + '@swc/core': 1.10.18 - terser-webpack-plugin@5.3.10(webpack@5.97.1): + terser-webpack-plugin@5.3.16(@swc/core@1.10.18)(webpack@5.104.1(@swc/core@1.10.18)): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 3.3.0 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.31.0 - webpack: 5.97.1 + terser: 5.39.0 + webpack: 5.104.1(@swc/core@1.10.18) + optionalDependencies: + '@swc/core': 1.10.18 - terser@5.31.0: + terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 - text-table@0.2.0: {} - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: + thread-stream@2.7.0: dependencies: - any-promise: 1.3.0 + real-require: 0.2.0 - thread-stream@2.7.0: + thread-stream@3.1.0: dependencies: real-require: 0.2.0 - through@2.3.8: {} + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 - tiny-lru@11.2.6: {} + tiny-lru@11.2.11: {} - tinybench@2.8.0: {} + tinybench@2.9.0: {} - tinypool@0.8.4: {} + tinyexec@0.3.2: {} - tinyspy@2.2.1: {} + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 - title@3.5.3: + tinyglobby@0.2.15: dependencies: - arg: 1.0.0 - chalk: 2.3.0 - clipboardy: 1.2.2 - titleize: 1.0.0 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 - titleize@1.0.0: {} + tinypool@1.1.1: {} - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 + tinyrainbow@2.0.0: {} - to-fast-properties@2.0.0: {} + tinyspy@4.0.3: {} + + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 to-regex-range@5.0.1: dependencies: @@ -11890,341 +12113,216 @@ snapshots: totalist@3.0.1: {} - tough-cookie@4.1.4: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - - tr46@0.0.3: {} - - tr46@5.0.0: - dependencies: - punycode: 2.3.1 - tree-kill@1.2.2: {} - trim-lines@3.0.1: {} - - trough@2.2.0: {} - - ts-api-utils@1.3.0(typescript@5.4.5): - dependencies: - typescript: 5.4.5 - - ts-dedent@2.2.0: {} - - ts-deepmerge@7.0.0: {} - - ts-interface-checker@0.1.13: {} - - ts-mocha@10.0.0(mocha@10.4.0): + ts-api-utils@2.0.1(typescript@5.9.3): dependencies: - mocha: 10.4.0 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 + typescript: 5.9.3 - ts-node@10.9.2(@types/node@18.19.33)(typescript@5.3.3): + ts-node@10.9.2(@swc/core@1.10.18)(@types/node@18.19.130)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.33 - acorn: 8.11.3 + '@types/node': 18.19.130 + acorn: 8.15.0 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optional: true + optionalDependencies: + '@swc/core': 1.10.18 - ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5): + ts-node@10.9.2(@swc/core@1.10.18)(@types/node@24.7.2)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.33 - acorn: 8.11.3 + '@types/node': 24.7.2 + acorn: 8.15.0 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.10.18 + optional: true + + tsconfck@3.1.5(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths-webpack-plugin@4.1.0: + tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.16.1 + enhanced-resolve: 5.18.1 + tapable: 2.3.0 tsconfig-paths: 4.2.0 - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - tsdk-server-adapters@0.1.15(express@4.21.0)(fastify@5.0.0)(hono@4.6.2)(socket.io@4.8.0)(zod@3.23.8): + tsdk-server-adapters@0.3.0(express@5.1.0)(fastify@5.6.1)(hono@4.9.11)(socket.io@4.8.3)(zod@4.0.14): dependencies: eventemitter3: 5.0.1 - zod: 3.23.8 + zod: 4.0.14 optionalDependencies: - express: 4.21.0 - fastify: 5.0.0 - hono: 4.6.2 - socket.io: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - - tslib@1.14.1: {} + express: 5.1.0 + fastify: 5.6.1 + hono: 4.9.11 + socket.io: 4.8.3(bufferutil@4.1.0) tslib@2.6.2: {} - tsutils@3.21.0(typescript@5.4.5): - dependencies: - tslib: 1.14.1 - typescript: 5.4.5 + tslib@2.8.1: {} tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 + turbo-stream@2.4.0: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - - type-fest@0.20.2: {} - - type-fest@0.21.3: {} - - type-fest@1.4.0: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - 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: + type-is@2.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 + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 - typed-array-byte-offset@1.0.2: + typed-array-buffer@1.0.3: 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 + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 - 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 + typedarray@0.0.6: {} - typedoc@0.27.6(typescript@5.4.5): + typedoc@0.28.16(typescript@5.9.3): dependencies: - '@gerrit0/mini-shiki': 1.27.2 + '@gerrit0/mini-shiki': 3.20.0 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.4.5 - yaml: 2.7.0 + typescript: 5.9.3 + yaml: 2.8.1 - typeorm-cursor-pagination@0.10.1(typeorm@0.3.20(better-sqlite3@9.6.0)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.3.3))): + typeorm-cursor-pagination@0.10.1(typeorm@0.3.28(babel-plugin-macros@3.1.0)(better-sqlite3@12.5.0)(ts-node@10.9.2(@swc/core@1.10.18)(@types/node@24.7.2)(typescript@5.9.3))): dependencies: - typeorm: 0.3.20(better-sqlite3@9.6.0)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.3.3)) + typeorm: 0.3.28(babel-plugin-macros@3.1.0)(better-sqlite3@12.5.0)(ts-node@10.9.2(@swc/core@1.10.18)(@types/node@24.7.2)(typescript@5.9.3)) - typeorm@0.3.20(better-sqlite3@9.6.0)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.3.3)): + typeorm@0.3.28(babel-plugin-macros@3.1.0)(better-sqlite3@12.5.0)(ts-node@10.9.2(@swc/core@1.10.18)(@types/node@24.7.2)(typescript@5.9.3)): dependencies: '@sqltools/formatter': 1.2.5 + ansis: 4.2.0 app-root-path: 3.1.0 buffer: 6.0.3 - chalk: 4.1.2 - cli-highlight: 2.1.11 - dayjs: 1.11.11 - debug: 4.3.4(supports-color@8.1.1) - dotenv: 16.4.5 - glob: 10.3.12 - mkdirp: 2.1.6 + dayjs: 1.11.19 + debug: 4.4.3 + dedent: 1.7.1(babel-plugin-macros@3.1.0) + dotenv: 16.6.1 + glob: 10.5.0 reflect-metadata: 0.2.2 - sha.js: 2.4.11 - tslib: 2.6.2 - uuid: 3.4.0 + sha.js: 2.4.12 + sql-highlight: 6.1.0 + tslib: 2.8.1 + uuid: 11.1.0 yargs: 17.7.2 optionalDependencies: - better-sqlite3: 9.6.0 - ts-node: 10.9.2(@types/node@18.19.33)(typescript@5.3.3) + better-sqlite3: 12.5.0 + ts-node: 10.9.2(@swc/core@1.10.18)(@types/node@24.7.2)(typescript@5.9.3) transitivePeerDependencies: + - babel-plugin-macros - supports-color - typescript@5.3.3: {} - - typescript@5.4.5: {} - - ua-parser-js@1.0.37: {} - - uc.micro@2.1.0: {} - - ufo@1.5.3: {} - - 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: {} - - unified@10.1.2: - dependencies: - '@types/unist': 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 5.3.7 - - unist-util-find-after@5.0.0: - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - - unist-util-generated@2.0.1: {} - - unist-util-is@5.2.1: + typescript-eslint@8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3): dependencies: - '@types/unist': 2.0.10 - - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.2 + '@typescript-eslint/eslint-plugin': 8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3) + '@typescript-eslint/parser': 8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3) + '@typescript-eslint/utils': 8.27.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.9.3) + eslint: 9.22.0(jiti@2.4.2) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - unist-util-position-from-estree@1.1.2: + typescript-json-schema@0.67.1(@swc/core@1.10.18): dependencies: - '@types/unist': 2.0.10 + '@types/json-schema': 7.0.15 + '@types/node': 18.19.130 + glob: 7.2.3 + path-equal: 1.2.5 + safe-stable-stringify: 2.4.3 + ts-node: 10.9.2(@swc/core@1.10.18)(@types/node@18.19.130)(typescript@5.5.4) + typescript: 5.5.4 + vm2: 3.10.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' - unist-util-position@4.0.4: - dependencies: - '@types/unist': 2.0.10 + typescript@5.5.4: {} - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.2 + typescript@5.9.3: {} - unist-util-remove-position@4.0.2: - dependencies: - '@types/unist': 2.0.10 - unist-util-visit: 4.1.2 + uc.micro@2.1.0: {} - unist-util-remove-position@5.0.0: - dependencies: - '@types/unist': 3.0.2 - unist-util-visit: 5.0.0 + undici-types@5.26.5: {} - unist-util-remove@4.0.0: - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + undici-types@6.19.8: {} - unist-util-stringify-position@3.0.3: - dependencies: - '@types/unist': 2.0.10 + undici-types@6.21.0: {} - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.2 + undici-types@7.14.0: {} - unist-util-visit-parents@4.1.1: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 + undici@6.21.1: {} - unist-util-visit-parents@5.1.3: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 + unicorn-magic@0.3.0: {} - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 + universalify@2.0.1: {} - unist-util-visit@3.1.0: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 4.1.1 + unpipe@1.0.0: {} - unist-util-visit@4.1.2: + unplugin-swc@1.5.5(@swc/core@1.10.18)(rollup@4.52.4): dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + '@rollup/pluginutils': 5.2.0(rollup@4.52.4) + '@swc/core': 1.10.18 + load-tsconfig: 0.2.5 + unplugin: 2.3.5 + transitivePeerDependencies: + - rollup - unist-util-visit@5.0.0: + unplugin-utils@0.3.1: dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - universalify@0.2.0: {} - - universalify@2.0.1: {} + pathe: 2.0.3 + picomatch: 4.0.3 - unpipe@1.0.0: {} - - update-browserslist-db@1.0.15(browserslist@4.23.0): + unplugin@2.3.5: dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 + acorn: 8.15.0 + picomatch: 4.0.2 + webpack-virtual-modules: 0.6.2 update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: @@ -12232,154 +12330,424 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - upper-case-first@2.0.2: + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: - tslib: 2.6.2 + browserslist: 4.26.3 + escalade: 3.2.0 + picocolors: 1.1.1 - upper-case@2.0.2: + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - tslib: 2.6.2 + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: punycode: 2.3.1 - url-parse@1.5.10: + use-callback-ref@1.3.3(@types/react@19.0.10)(react@19.0.0): + dependencies: + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.10 + + use-sidecar@1.1.3(@types/react@19.0.10)(react@19.0.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.10 + + use-sync-external-store@1.6.0(react@19.0.0): dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 + react: 19.0.0 - utf-8-validate@6.0.3: + utf-8-validate@6.0.6: dependencies: node-gyp-build: 4.8.1 + optional: true util-deprecate@1.0.2: {} utils-merge@1.0.1: {} - uuid@3.4.0: {} + uuid@11.1.0: {} - uvu@0.5.6: - dependencies: - dequal: 2.0.3 - diff: 5.2.0 - kleur: 4.1.5 - sade: 1.8.1 + uuid@8.3.2: {} v8-compile-cache-lib@3.0.1: {} - vary@1.1.2: {} + valibot@0.41.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 - vfile-location@5.0.2: - dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 + valibot@1.2.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 - vfile-matter@3.0.1: + validate-html-nesting@1.2.3: {} + + validate-npm-package-license@3.0.4: dependencies: - '@types/js-yaml': 4.0.9 - is-buffer: 2.0.5 - js-yaml: 4.1.0 + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@5.0.1: {} + + vary@1.1.2: {} - vfile-message@3.1.4: + vite-dev-rpc@1.1.0(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)): dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 + birpc: 2.6.1 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) - vfile-message@4.0.2: + vite-hot-client@2.1.0(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)): dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) - vfile@5.3.7: + vite-node@3.0.0-beta.2(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0): dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 1.1.2 + vite: 5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser - vfile@6.0.1: + vite-node@3.2.4(@types/node@18.19.130)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1): dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.9(@types/node@18.19.130)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml - vite-node@1.6.0(@types/node@18.19.33)(terser@5.31.0): + vite-node@3.2.4(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@8.1.1) - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.2.11(@types/node@18.19.33)(terser@5.31.0) + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser + - tsx + - yaml + + vite-plugin-inspect@11.3.3(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)): + dependencies: + ansis: 4.2.0 + debug: 4.4.1 + error-stack-parser-es: 1.0.5 + ohash: 2.0.11 + open: 10.2.0 + perfect-debounce: 2.0.0 + sirv: 3.0.2 + unplugin-utils: 0.3.1 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + transitivePeerDependencies: + - supports-color + + vite-plugin-solid@2.11.9(solid-js@1.9.9)(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)): + dependencies: + '@babel/core': 7.26.9 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.9(@babel/core@7.26.9)(solid-js@1.9.9) + merge-anything: 5.1.7 + solid-js: 1.9.9 + solid-refresh: 0.6.3(solid-js@1.9.9) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + transitivePeerDependencies: + - supports-color + + vite-plugin-vue-devtools@8.0.2(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@vue/devtools-core': 8.0.2(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + '@vue/devtools-kit': 8.0.2 + '@vue/devtools-shared': 8.0.2 + execa: 9.6.0 + sirv: 3.0.2 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + vite-plugin-inspect: 11.3.3(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + vite-plugin-vue-inspector: 5.3.2(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - vue + + vite-plugin-vue-inspector@5.3.2(vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)): + dependencies: + '@babel/core': 7.26.9 + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.26.9) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.9) + '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.9) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.26.9) + '@vue/compiler-dom': 3.5.13 + kolorist: 1.8.0 + magic-string: 0.30.17 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.9.3) + optionalDependencies: + vite: 5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0) + transitivePeerDependencies: + - supports-color + - typescript + + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@5.4.14(@types/node@24.7.2)(lightningcss@1.29.1)(terser@5.39.0)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.9.3) + optionalDependencies: + vite: 5.4.14(@types/node@24.7.2)(lightningcss@1.29.1)(terser@5.39.0) + transitivePeerDependencies: + - supports-color + - typescript - vite@5.2.11(@types/node@18.19.33)(terser@5.31.0): + vite@5.4.14(@types/node@18.19.130)(lightningcss@1.29.1)(terser@5.39.0): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.17.2 + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.34.8 optionalDependencies: - '@types/node': 18.19.33 + '@types/node': 18.19.130 fsevents: 2.3.3 - terser: 5.31.0 + lightningcss: 1.29.1 + terser: 5.39.0 - vitest@1.6.0(@types/node@18.19.33)(@vitest/ui@1.6.0)(jsdom@23.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0): + vite@5.4.14(@types/node@20.17.19)(lightningcss@1.29.1)(terser@5.39.0): dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4(supports-color@8.1.1) - 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.11(@types/node@18.19.33)(terser@5.31.0) - vite-node: 1.6.0(@types/node@18.19.33)(terser@5.31.0) - why-is-node-running: 2.2.2 + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + '@types/node': 20.17.19 + fsevents: 2.3.3 + lightningcss: 1.29.1 + terser: 5.39.0 + + vite@5.4.14(@types/node@24.7.2)(lightningcss@1.29.1)(terser@5.39.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + '@types/node': 24.7.2 + fsevents: 2.3.3 + lightningcss: 1.29.1 + terser: 5.39.0 + + vite@7.1.9(@types/node@18.19.130)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.4 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 18.19.130 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.1 + terser: 5.39.0 + yaml: 2.8.1 + + vite@7.1.9(@types/node@22.18.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.4 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.18.10 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.1 + terser: 5.39.0 + yaml: 2.8.1 + + vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.4 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 18.19.33 - '@vitest/ui': 1.6.0(vitest@1.6.0) - jsdom: 23.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@types/node': 24.7.2 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.1 + terser: 5.39.0 + yaml: 2.8.1 + + vitefu@1.1.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1)): + optionalDependencies: + vite: 7.1.9(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + + vitest@3.2.4(@types/node@18.19.130)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@5.4.14(@types/node@18.19.130)(lightningcss@1.29.1)(terser@5.39.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + debug: 4.4.1 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 5.4.14(@types/node@18.19.130)(lightningcss@1.29.1)(terser@5.39.0) + vite-node: 3.2.4(@types/node@18.19.130)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.19.130 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@3.2.4(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@5.4.14(@types/node@24.7.2)(lightningcss@1.29.1)(terser@5.39.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + debug: 4.4.1 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 5.4.14(@types/node@24.7.2)(lightningcss@1.29.1)(terser@5.39.0) + vite-node: 3.2.4(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.7.2 transitivePeerDependencies: + - jiti - less - lightningcss + - msw - sass + - sass-embedded - stylus - sugarss - supports-color - terser + - tsx + - yaml - vscode-oniguruma@1.7.0: {} + vm2@3.10.2: + dependencies: + acorn: 8.15.0 + acorn-walk: 8.3.4 - vscode-textmate@8.0.0: {} + vscode-uri@3.1.0: {} - w3c-xmlserializer@5.0.0: + vue-demi@0.14.10(vue@3.5.22(typescript@5.9.3)): dependencies: - xml-name-validator: 5.0.0 + vue: 3.5.22(typescript@5.9.3) - watchpack@2.4.0: + vue-tsc@3.1.1(typescript@5.9.3): dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 + '@volar/typescript': 2.4.23 + '@vue/language-core': 3.1.1(typescript@5.9.3) + typescript: 5.9.3 - watchpack@2.4.1: + vue@3.5.22(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-sfc': 3.5.22 + '@vue/runtime-dom': 3.5.22 + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.3)) + '@vue/shared': 3.5.22 + optionalDependencies: + typescript: 5.9.3 + + warning@3.0.0: + dependencies: + loose-envify: 1.4.0 + + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -12388,31 +12756,26 @@ snapshots: dependencies: defaults: 1.0.4 - web-namespaces@2.0.1: {} - - web-worker@1.3.0: {} - - webidl-conversions@3.0.1: {} - - webidl-conversions@7.0.0: {} - webpack-node-externals@3.0.0: {} - webpack-sources@3.2.3: {} + webpack-sources@3.3.3: {} - webpack@5.90.1: + webpack-virtual-modules@0.6.2: {} + + webpack@5.102.1(@swc/core@1.10.18): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.26.3 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.1 - es-module-lexer: 1.5.2 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -12421,117 +12784,77 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.90.1) - watchpack: 2.4.1 - webpack-sources: 3.2.3 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.11(@swc/core@1.10.18)(webpack@5.102.1(@swc/core@1.10.18)) + watchpack: 2.4.4 + webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.97.1: + webpack@5.104.1(@swc/core@1.10.18): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.0 - browserslist: 4.24.4 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.1 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.18.0 - es-module-lexer: 1.5.2 + enhanced-resolve: 5.18.1 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.97.1) - watchpack: 2.4.1 - webpack-sources: 3.2.3 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.10.18)(webpack@5.104.1(@swc/core@1.10.18)) + watchpack: 2.4.4 + webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@4.0.0: {} - - whatwg-url@14.0.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - 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 - - which-builtin-type@1.1.3: - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - - which-typed-array@1.1.15: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 - which@1.3.1: + which@2.0.2: dependencies: isexe: 2.0.0 - which@2.0.2: + which@3.0.1: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + which@5.0.0: + dependencies: + isexe: 3.1.1 + + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 word-wrap@1.2.5: {} - workerpool@6.2.1: {} - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -12550,87 +12873,71 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} - ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@8.11.0(bufferutil@4.1.0): optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + bufferutil: 4.1.0 - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@8.17.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 - ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@8.18.3(bufferutil@4.1.0): optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + bufferutil: 4.1.0 - xior@0.6.2: + wsl-utils@0.1.0: dependencies: - tiny-lru: 11.2.6 - ts-deepmerge: 7.0.0 + is-wsl: 3.1.0 - xml-name-validator@5.0.0: {} - - xmlchars@2.2.0: {} + xior@0.8.3: + dependencies: + tiny-lru: 11.2.11 xmlhttprequest-ssl@2.1.1: {} - y18n@5.0.8: {} + xtend@4.0.2: {} - yallist@2.1.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} - yaml@2.3.1: {} + yallist@5.0.0: {} - yaml@2.4.2: {} + yaml@1.10.2: {} yaml@2.7.0: {} - yargs-parser@20.2.4: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - yn@2.0.0: {} - yn@3.1.1: {} yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} + yoctocolors-cjs@2.1.3: {} - zod@3.23.8: {} + yoctocolors@2.1.2: {} - zod@3.24.1: {} + zimmerframe@1.1.2: {} - zwitch@2.0.4: {} + zod@4.0.14: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 84dc57df..89681c74 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,15 +2,12 @@ packages: # packages - 'packages/**' - # configs - - 'configs/*' - - # website - - 'website' - - 'docs' - # examples - 'examples/**' - # exclude projects in dist folder + + # exclude projects in dist folder - '!**/dist*/**' - '!**/.next/**' + - '!packages/tsdk/fe-sdk-template' + - '!packages/tsdk/templates/**' + - '!packages/tsdk/src/**' \ No newline at end of file diff --git a/scripts/npm-publish-fields.mjs b/scripts/npm-publish-fields.mjs new file mode 100644 index 00000000..3b75ff2f --- /dev/null +++ b/scripts/npm-publish-fields.mjs @@ -0,0 +1,49 @@ +export const whiteFields = [ + 'name', + 'version', + 'description', + 'keywords', + 'homepage', + 'bugs', + 'license', + 'author', + 'contributors', + 'funding', + 'files', + 'main', + 'types', + 'require', + 'import', + 'module', + 'browser', + 'bin', + 'man', + 'directories', + 'repository', + // 'scripts', + 'config', + 'dependencies', + 'peerDependencies', + 'peerDependenciesMeta', + 'bundleDependencies', + 'optionalDependencies', + 'overrides', + 'engines', + 'os', + 'cpu', + 'publishConfig', + 'exports', + 'types', + 'typing', + 'module', + 'react-server', + 'react-native', +]; + +export function getFieldsMap() { + const result = {}; + whiteFields.forEach((field) => { + result[field.toLowerCase()] = true; + }); + return result; +} diff --git a/scripts/purge-pkg-for-publish.mjs b/scripts/purge-pkg-for-publish.mjs new file mode 100644 index 00000000..b45af21f --- /dev/null +++ b/scripts/purge-pkg-for-publish.mjs @@ -0,0 +1,18 @@ +import fs from 'fs/promises'; + +import { getFieldsMap } from './npm-publish-fields.mjs'; + +async function purgePkg() { + const content = await fs.readFile('package.json', 'utf8'); + const json = JSON.parse(content); + const whiteFieldsMap = getFieldsMap(); + Object.keys(json).forEach((key) => { + if (!whiteFieldsMap[key.toLowerCase()]) { + delete json[key]; + } + }); + + await fs.writeFile('package.json', JSON.stringify(json, null, 2)); +} + +purgePkg(); diff --git a/tests-examples/demo-todo-app.spec.ts b/tests-examples/demo-todo-app.spec.ts new file mode 100644 index 00000000..94e84c9a --- /dev/null +++ b/tests-examples/demo-todo-app.spec.ts @@ -0,0 +1,424 @@ +import { test, expect, type Page } from '@playwright/test'; + +test.beforeEach(async ({ page }) => { + await page.goto('https://demo.playwright.dev/todomvc'); +}); + +const TODO_ITEMS = ['buy some cheese', 'feed the cat', 'book a doctors appointment'] as const; + +test.describe('New Todo', () => { + test('should allow me to add todo items', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create 1st todo. + await newTodo.fill(TODO_ITEMS[0]); + await newTodo.press('Enter'); + + // Make sure the list only has one todo item. + await expect(page.getByTestId('todo-title')).toHaveText([TODO_ITEMS[0]]); + + // Create 2nd todo. + await newTodo.fill(TODO_ITEMS[1]); + await newTodo.press('Enter'); + + // Make sure the list now has two todo items. + await expect(page.getByTestId('todo-title')).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); + + await checkNumberOfTodosInLocalStorage(page, 2); + }); + + test('should clear text input field when an item is added', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create one todo item. + await newTodo.fill(TODO_ITEMS[0]); + await newTodo.press('Enter'); + + // Check that input is empty. + await expect(newTodo).toBeEmpty(); + await checkNumberOfTodosInLocalStorage(page, 1); + }); + + test('should append new items to the bottom of the list', async ({ page }) => { + // Create 3 items. + await createDefaultTodos(page); + + // create a todo count locator + const todoCount = page.getByTestId('todo-count'); + + // Check test using different methods. + await expect(page.getByText('3 items left')).toBeVisible(); + await expect(todoCount).toHaveText('3 items left'); + await expect(todoCount).toContainText('3'); + await expect(todoCount).toHaveText(/3/); + + // Check all items in one call. + await expect(page.getByTestId('todo-title')).toHaveText(TODO_ITEMS); + await checkNumberOfTodosInLocalStorage(page, 3); + }); +}); + +test.describe('Mark all as completed', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test.afterEach(async ({ page }) => { + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test('should allow me to mark all items as completed', async ({ page }) => { + // Complete all todos. + await page.getByLabel('Mark all as complete').check(); + + // Ensure all todos have 'completed' class. + await expect(page.getByTestId('todo-item')).toHaveClass([ + 'completed', + 'completed', + 'completed', + ]); + await checkNumberOfCompletedTodosInLocalStorage(page, 3); + }); + + test('should allow me to clear the complete state of all items', async ({ page }) => { + const toggleAll = page.getByLabel('Mark all as complete'); + // Check and then immediately uncheck. + await toggleAll.check(); + await toggleAll.uncheck(); + + // Should be no completed classes. + await expect(page.getByTestId('todo-item')).toHaveClass(['', '', '']); + }); + + test('complete all checkbox should update state when items are completed / cleared', async ({ + page, + }) => { + const toggleAll = page.getByLabel('Mark all as complete'); + await toggleAll.check(); + await expect(toggleAll).toBeChecked(); + await checkNumberOfCompletedTodosInLocalStorage(page, 3); + + // Uncheck first todo. + const firstTodo = page.getByTestId('todo-item').nth(0); + await firstTodo.getByRole('checkbox').uncheck(); + + // Reuse toggleAll locator and make sure its not checked. + await expect(toggleAll).not.toBeChecked(); + + await firstTodo.getByRole('checkbox').check(); + await checkNumberOfCompletedTodosInLocalStorage(page, 3); + + // Assert the toggle all is checked again. + await expect(toggleAll).toBeChecked(); + }); +}); + +test.describe('Item', () => { + test('should allow me to mark items as complete', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create two items. + for (const item of TODO_ITEMS.slice(0, 2)) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } + + // Check first item. + const firstTodo = page.getByTestId('todo-item').nth(0); + await firstTodo.getByRole('checkbox').check(); + await expect(firstTodo).toHaveClass('completed'); + + // Check second item. + const secondTodo = page.getByTestId('todo-item').nth(1); + await expect(secondTodo).not.toHaveClass('completed'); + await secondTodo.getByRole('checkbox').check(); + + // Assert completed class. + await expect(firstTodo).toHaveClass('completed'); + await expect(secondTodo).toHaveClass('completed'); + }); + + test('should allow me to un-mark items as complete', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create two items. + for (const item of TODO_ITEMS.slice(0, 2)) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } + + const firstTodo = page.getByTestId('todo-item').nth(0); + const secondTodo = page.getByTestId('todo-item').nth(1); + const firstTodoCheckbox = firstTodo.getByRole('checkbox'); + + await firstTodoCheckbox.check(); + await expect(firstTodo).toHaveClass('completed'); + await expect(secondTodo).not.toHaveClass('completed'); + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + + await firstTodoCheckbox.uncheck(); + await expect(firstTodo).not.toHaveClass('completed'); + await expect(secondTodo).not.toHaveClass('completed'); + await checkNumberOfCompletedTodosInLocalStorage(page, 0); + }); + + test('should allow me to edit an item', async ({ page }) => { + await createDefaultTodos(page); + + const todoItems = page.getByTestId('todo-item'); + const secondTodo = todoItems.nth(1); + await secondTodo.dblclick(); + await expect(secondTodo.getByRole('textbox', { name: 'Edit' })).toHaveValue(TODO_ITEMS[1]); + await secondTodo.getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); + await secondTodo.getByRole('textbox', { name: 'Edit' }).press('Enter'); + + // Explicitly assert the new text value. + await expect(todoItems).toHaveText([TODO_ITEMS[0], 'buy some sausages', TODO_ITEMS[2]]); + await checkTodosInLocalStorage(page, 'buy some sausages'); + }); +}); + +test.describe('Editing', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test('should hide other controls when editing', async ({ page }) => { + const todoItem = page.getByTestId('todo-item').nth(1); + await todoItem.dblclick(); + await expect(todoItem.getByRole('checkbox')).not.toBeVisible(); + await expect( + todoItem.locator('label', { + hasText: TODO_ITEMS[1], + }) + ).not.toBeVisible(); + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test('should save edits on blur', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).dispatchEvent('blur'); + + await expect(todoItems).toHaveText([TODO_ITEMS[0], 'buy some sausages', TODO_ITEMS[2]]); + await checkTodosInLocalStorage(page, 'buy some sausages'); + }); + + test('should trim entered text', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(' buy some sausages '); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); + + await expect(todoItems).toHaveText([TODO_ITEMS[0], 'buy some sausages', TODO_ITEMS[2]]); + await checkTodosInLocalStorage(page, 'buy some sausages'); + }); + + test('should remove the item if an empty text string was entered', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(''); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); + + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); + }); + + test('should cancel edits on escape', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Escape'); + await expect(todoItems).toHaveText(TODO_ITEMS); + }); +}); + +test.describe('Counter', () => { + test('should display the current number of todo items', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // create a todo count locator + const todoCount = page.getByTestId('todo-count'); + + await newTodo.fill(TODO_ITEMS[0]); + await newTodo.press('Enter'); + + await expect(todoCount).toContainText('1'); + + await newTodo.fill(TODO_ITEMS[1]); + await newTodo.press('Enter'); + await expect(todoCount).toContainText('2'); + + await checkNumberOfTodosInLocalStorage(page, 2); + }); +}); + +test.describe('Clear completed button', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + }); + + test('should display the correct text', async ({ page }) => { + await page.locator('.todo-list li .toggle').first().check(); + await expect(page.getByRole('button', { name: 'Clear completed' })).toBeVisible(); + }); + + test('should remove completed items when clicked', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).getByRole('checkbox').check(); + await page.getByRole('button', { name: 'Clear completed' }).click(); + await expect(todoItems).toHaveCount(2); + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); + }); + + test('should be hidden when there are no items that are completed', async ({ page }) => { + await page.locator('.todo-list li .toggle').first().check(); + await page.getByRole('button', { name: 'Clear completed' }).click(); + await expect(page.getByRole('button', { name: 'Clear completed' })).toBeHidden(); + }); +}); + +test.describe('Persistence', () => { + test('should persist its data', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + for (const item of TODO_ITEMS.slice(0, 2)) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } + + const todoItems = page.getByTestId('todo-item'); + const firstTodoCheck = todoItems.nth(0).getByRole('checkbox'); + await firstTodoCheck.check(); + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); + await expect(firstTodoCheck).toBeChecked(); + await expect(todoItems).toHaveClass(['completed', '']); + + // Ensure there is 1 completed item. + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + + // Now reload. + await page.reload(); + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); + await expect(firstTodoCheck).toBeChecked(); + await expect(todoItems).toHaveClass(['completed', '']); + }); +}); + +test.describe('Routing', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + // make sure the app had a chance to save updated todos in storage + // before navigating to a new view, otherwise the items can get lost :( + // in some frameworks like Durandal + await checkTodosInLocalStorage(page, TODO_ITEMS[0]); + }); + + test('should allow me to display active items', async ({ page }) => { + const todoItem = page.getByTestId('todo-item'); + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + await page.getByRole('link', { name: 'Active' }).click(); + await expect(todoItem).toHaveCount(2); + await expect(todoItem).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); + }); + + test('should respect the back button', async ({ page }) => { + const todoItem = page.getByTestId('todo-item'); + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + + await test.step('Showing all items', async () => { + await page.getByRole('link', { name: 'All' }).click(); + await expect(todoItem).toHaveCount(3); + }); + + await test.step('Showing active items', async () => { + await page.getByRole('link', { name: 'Active' }).click(); + }); + + await test.step('Showing completed items', async () => { + await page.getByRole('link', { name: 'Completed' }).click(); + }); + + await expect(todoItem).toHaveCount(1); + await page.goBack(); + await expect(todoItem).toHaveCount(2); + await page.goBack(); + await expect(todoItem).toHaveCount(3); + }); + + test('should allow me to display completed items', async ({ page }) => { + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + await page.getByRole('link', { name: 'Completed' }).click(); + await expect(page.getByTestId('todo-item')).toHaveCount(1); + }); + + test('should allow me to display all items', async ({ page }) => { + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + await page.getByRole('link', { name: 'Active' }).click(); + await page.getByRole('link', { name: 'Completed' }).click(); + await page.getByRole('link', { name: 'All' }).click(); + await expect(page.getByTestId('todo-item')).toHaveCount(3); + }); + + test('should highlight the currently applied filter', async ({ page }) => { + await expect(page.getByRole('link', { name: 'All' })).toHaveClass('selected'); + + //create locators for active and completed links + const activeLink = page.getByRole('link', { name: 'Active' }); + const completedLink = page.getByRole('link', { name: 'Completed' }); + await activeLink.click(); + + // Page change - active items. + await expect(activeLink).toHaveClass('selected'); + await completedLink.click(); + + // Page change - completed items. + await expect(completedLink).toHaveClass('selected'); + }); +}); + +async function createDefaultTodos(page: Page) { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + for (const item of TODO_ITEMS) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } +} + +async function checkNumberOfTodosInLocalStorage(page: Page, expected: number) { + return await page.waitForFunction((e) => { + return JSON.parse(localStorage['react-todos']).length === e; + }, expected); +} + +async function checkNumberOfCompletedTodosInLocalStorage(page: Page, expected: number) { + return await page.waitForFunction((e) => { + return ( + JSON.parse(localStorage['react-todos']).filter((todo: any) => todo.completed).length === e + ); + }, expected); +} + +async function checkTodosInLocalStorage(page: Page, title: string) { + return await page.waitForFunction((t) => { + return JSON.parse(localStorage['react-todos']) + .map((todo: any) => todo.title) + .includes(t); + }, title); +} diff --git a/website/components/home.en-US/code.mdx b/website/components/home.en-US/code.mdx index 508b92ba..012e11e5 100644 --- a/website/components/home.en-US/code.mdx +++ b/website/components/home.en-US/code.mdx @@ -60,12 +60,12 @@ import { Tabs } from 'nextra-theme-docs'; import { GetHelloConfig, GetHelloReq, GetHelloRes } from './Hello.apiconf'; - import { genRoute, type RequestInfo } from './gen-route'; + import { genRoute } from './gen-route'; export function setupHelloAPI() { genRoute( GetHelloConfig, - async (data, reqInfo: Readonly) => { + async (data, reqInfo) => { return { result: `Hello ${data.world}` }; } ); @@ -77,7 +77,7 @@ import { Tabs } from 'nextra-theme-docs'; Define the API config: ```ts filename="Hello.apiconf.ts" - import * as z from 'zod'; + import { z } from 'zod/v4'; import { APIConfig, transformPath } from '@/src/shared/tsdk-helper'; /** @@ -88,8 +88,6 @@ import { Tabs } from 'nextra-theme-docs'; type: 'user', method: 'get', path: transformPath('GetHello'), - description: 'Get hello', - category: 'hello', needAuth: false, schema: z.object({ world: z.string().min(1). diff --git a/website/components/home.zh-CN/code.mdx b/website/components/home.zh-CN/code.mdx index 6a578994..938adddf 100644 --- a/website/components/home.zh-CN/code.mdx +++ b/website/components/home.zh-CN/code.mdx @@ -60,12 +60,12 @@ import { Tabs } from 'nextra-theme-docs'; import { GetHelloConfig, GetHelloReq, GetHelloRes } from './Hello.apiconf'; - import { genRoute, type RequestInfo } from './gen-route'; + import { genRoute } from './gen-route'; export function setupHelloAPI() { genRoute( GetHelloConfig, - async (data, reqInfo: Readonly) => { + async (data, reqInfo) => { return { result: `Hello ${data.world}` }; } ); @@ -77,7 +77,7 @@ import { Tabs } from 'nextra-theme-docs'; 声明接口配置: ```ts filename="Hello.apiconf.ts" - import * as z from 'zod'; + import { z } from 'zod/v4'; import { APIConfig, transformPath } from '@/src/shared/tsdk-helper'; /** @@ -88,8 +88,6 @@ import { Tabs } from 'nextra-theme-docs'; type: 'user', method: 'get', path: transformPath('GetHello'), - description: 'Get hello', - category: 'hello', needAuth: false, schema: z.object({ world: z.string().min(1). diff --git a/website/package.json b/website/package.json index 0d147c69..653f6fd4 100644 --- a/website/package.json +++ b/website/package.json @@ -31,7 +31,7 @@ }, "devDependencies": { "@types/node": "^18.13.0", - "typescript": "^5", + "typescript": "^5.9.3", "tailwindcss": "^3.3.5", "postcss": "^8.4.31", "autoprefixer": "^10.4.16", diff --git a/website/pages/docs/_meta.en-US.json b/website/pages/docs/_meta.en-US.json index 58ddd399..1d8832c0 100644 --- a/website/pages/docs/_meta.en-US.json +++ b/website/pages/docs/_meta.en-US.json @@ -5,5 +5,6 @@ "performance": "Performance", "faq": "FAQ", "tips": "Tips", - "tsdk-born": "How tsdk created" + "tsdk-born": "How tsdk created", + "start-a-typescript-project": "Start a A TypeScript Project" } diff --git a/website/pages/docs/_meta.zh-CN.json b/website/pages/docs/_meta.zh-CN.json index e4df8697..8000d11e 100644 --- a/website/pages/docs/_meta.zh-CN.json +++ b/website/pages/docs/_meta.zh-CN.json @@ -5,5 +5,6 @@ "performance": "性能", "faq": "常见问题 FAQ", "tips": "最佳实践", - "tsdk-born": "tsdk 诞生记" + "tsdk-born": "tsdk 诞生记", + "start-a-typescript-project": "创建一个初始化 TypeScript 项目" } diff --git a/website/pages/docs/guide/apiconf.en-US.mdx b/website/pages/docs/guide/apiconf.en-US.mdx index 22aa311d..9bdf2679 100644 --- a/website/pages/docs/guide/apiconf.en-US.mdx +++ b/website/pages/docs/guide/apiconf.en-US.mdx @@ -3,7 +3,8 @@ `APIConfig` defined the basic configuration specifications of API: ```ts filename="src/shared/tsdk-types.ts" copy -import * as z from 'zod'; +import { z } from 'zod/v4'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; export const APITypes = { user: 'user', @@ -22,15 +23,11 @@ export interface APIConfig { path: string; method: 'get' | 'post' | 'delete' | 'put' | 'patch' | 'head' | 'options'; /** Request data validate scheme */ - schema?: z.ZodTypeAny; + schema?: StandardSchemaV1; /** The API need auth? Default is false */ needAuth?: boolean; /** The API disabled? Default is false */ disabled?: boolean; - /** The API description */ - description: string; - /** The API category */ - category?: string; /** custom headers for client */ headers?: { [key: string]: any }; @@ -51,8 +48,6 @@ export interface APIConfig { - `type` - API type - `path` - API url path - `method` - HTTP request method -- `description` - API description -- `category` - Optional, API category - `schema` - Optional, validate schem with zod - `needAuth` - Optional, need auth or no need - `disabled` - Optional, is disabled or not diff --git a/website/pages/docs/guide/apiconf.zh-CN.mdx b/website/pages/docs/guide/apiconf.zh-CN.mdx index 0f4d596a..4de6ec7a 100644 --- a/website/pages/docs/guide/apiconf.zh-CN.mdx +++ b/website/pages/docs/guide/apiconf.zh-CN.mdx @@ -3,7 +3,8 @@ `APIConfig` 定义了 tsdk 的 API 基本配置规范,内容如下: ```ts filename="src/shared/tsdk-types.ts" copy -import * as z from 'zod'; +import { z } from 'zod/v4'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; export const APITypes = { user: 'user', @@ -22,15 +23,11 @@ export interface APIConfig { path: string; method: 'get' | 'post' | 'delete' | 'put' | 'patch' | 'head' | 'options'; /** Request data validate scheme */ - schema?: z.ZodTypeAny; + schema?: StandardSchemaV1; /** The API need auth? Default is false */ needAuth?: boolean; /** The API disabled? Default is false */ disabled?: boolean; - /** The API description */ - description: string; - /** The API category */ - category?: string; /** custom headers for client */ headers?: { [key: string]: any }; @@ -51,8 +48,6 @@ export interface APIConfig { - `type` - API 类型 - `path` - API 路径 - `method` - HTTP 请求方法 -- `description` - API 备注 -- `category` - 可选,API 模块分类 - `schema` - 可选,运行时类型校验表达式,使用 **zod** - `needAuth` - 可选,是否需要登录才能访问 - `disabled` - 可选,是否禁止 API diff --git a/website/pages/docs/guide/tsdk-server-adapters/express-adapter.en-US.mdx b/website/pages/docs/guide/tsdk-server-adapters/express-adapter.en-US.mdx index f5e12b94..e090901c 100644 --- a/website/pages/docs/guide/tsdk-server-adapters/express-adapter.en-US.mdx +++ b/website/pages/docs/guide/tsdk-server-adapters/express-adapter.en-US.mdx @@ -7,6 +7,8 @@ import http from 'http'; import express, { Request } from 'express'; import multer from 'multer'; import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; + import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; diff --git a/website/pages/docs/guide/tsdk-server-adapters/express-adapter.zh-CN.mdx b/website/pages/docs/guide/tsdk-server-adapters/express-adapter.zh-CN.mdx index a2cd0e21..3126455f 100644 --- a/website/pages/docs/guide/tsdk-server-adapters/express-adapter.zh-CN.mdx +++ b/website/pages/docs/guide/tsdk-server-adapters/express-adapter.zh-CN.mdx @@ -9,6 +9,8 @@ import http from 'http'; import express, { Request } from 'express'; import multer from 'multer'; import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; + import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; diff --git a/website/pages/docs/guide/tsdk-server-adapters/fastify-adapter.en-US.mdx b/website/pages/docs/guide/tsdk-server-adapters/fastify-adapter.en-US.mdx index c69e930a..1d2e71f3 100644 --- a/website/pages/docs/guide/tsdk-server-adapters/fastify-adapter.en-US.mdx +++ b/website/pages/docs/guide/tsdk-server-adapters/fastify-adapter.en-US.mdx @@ -7,6 +7,8 @@ import http from 'http'; import Fastify from 'fastify'; import fastifyExpress from '@fastify/express'; import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; + import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; diff --git a/website/pages/docs/guide/tsdk-server-adapters/fastify-adapter.zh-CN.mdx b/website/pages/docs/guide/tsdk-server-adapters/fastify-adapter.zh-CN.mdx index f5ae9115..113feb74 100644 --- a/website/pages/docs/guide/tsdk-server-adapters/fastify-adapter.zh-CN.mdx +++ b/website/pages/docs/guide/tsdk-server-adapters/fastify-adapter.zh-CN.mdx @@ -9,6 +9,7 @@ import http from 'http'; import Fastify from 'fastify'; import fastifyExpress from '@fastify/express'; import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; diff --git a/website/pages/docs/guide/tsdk-server-adapters/hono-adapter.en-US.mdx b/website/pages/docs/guide/tsdk-server-adapters/hono-adapter.en-US.mdx index b1ef5054..d068bc82 100644 --- a/website/pages/docs/guide/tsdk-server-adapters/hono-adapter.en-US.mdx +++ b/website/pages/docs/guide/tsdk-server-adapters/hono-adapter.en-US.mdx @@ -8,6 +8,8 @@ import { Callout } from 'nextra/components'; import { Hono, HonoRequest } from 'hono'; import { serve } from '@hono/node-server'; import { honoAdapterFactory } from 'tsdk-server-adapters/lib/hono-adapter'; +// import { honoAdapterFactory } from 'tsdk-server-adapters/esm/hono-adapter'; + import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; diff --git a/website/pages/docs/guide/tsdk-server-adapters/hono-adapter.zh-CN.mdx b/website/pages/docs/guide/tsdk-server-adapters/hono-adapter.zh-CN.mdx index ceb1a0fc..612273fa 100644 --- a/website/pages/docs/guide/tsdk-server-adapters/hono-adapter.zh-CN.mdx +++ b/website/pages/docs/guide/tsdk-server-adapters/hono-adapter.zh-CN.mdx @@ -10,6 +10,8 @@ Hono 适配器使用分别包扩后端使用和前端使用。 import { Hono, HonoRequest } from 'hono'; import { serve } from '@hono/node-server'; import { honoAdapterFactory } from 'tsdk-server-adapters/lib/hono-adapter'; +// import { honoAdapterFactory } from 'tsdk-server-adapters/esm/hono-adapter'; + import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; diff --git a/website/pages/docs/guide/tsdk-server-adapters/socket.io-adapter.en-US.mdx b/website/pages/docs/guide/tsdk-server-adapters/socket.io-adapter.en-US.mdx index c008287c..d58fbf24 100644 --- a/website/pages/docs/guide/tsdk-server-adapters/socket.io-adapter.en-US.mdx +++ b/website/pages/docs/guide/tsdk-server-adapters/socket.io-adapter.en-US.mdx @@ -6,6 +6,8 @@ import http from 'http'; import { Server } from 'socket.io'; import { socketIOAdapterFactory } from 'tsdk-server-adapters/lib/socket.io-adapter'; +// import { socketIOAdapterFactory } from 'tsdk-server-adapters/esm/socket.io-adapter'; + import { ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; diff --git a/website/pages/docs/guide/tsdk-server-adapters/socket.io-adapter.zh-CN.mdx b/website/pages/docs/guide/tsdk-server-adapters/socket.io-adapter.zh-CN.mdx index 76ff030b..b87c12e0 100644 --- a/website/pages/docs/guide/tsdk-server-adapters/socket.io-adapter.zh-CN.mdx +++ b/website/pages/docs/guide/tsdk-server-adapters/socket.io-adapter.zh-CN.mdx @@ -8,6 +8,8 @@ Socket.IO 适配器使用包扩后端部分和前端部分。 import http from 'http'; import { Server } from 'socket.io'; import { socketIOAdapterFactory } from 'tsdk-server-adapters/lib/socket.io-adapter'; +// import { socketIOAdapterFactory } from 'tsdk-server-adapters/esm/socket.io-adapter'; + import { ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; diff --git a/website/pages/docs/guide/tsdk-snippets.en-US.mdx b/website/pages/docs/guide/tsdk-snippets.en-US.mdx index b8d46439..631df274 100644 --- a/website/pages/docs/guide/tsdk-snippets.en-US.mdx +++ b/website/pages/docs/guide/tsdk-snippets.en-US.mdx @@ -38,8 +38,6 @@ export const ApiNameConfig: APIConfig = { type: 'user', method: 'get', path: transformPath('ApiName'), - description: 'description', - category: 'Category', }; /** * diff --git a/website/pages/docs/guide/tsdk-snippets.zh-CN.mdx b/website/pages/docs/guide/tsdk-snippets.zh-CN.mdx index d490e26e..78c4396a 100644 --- a/website/pages/docs/guide/tsdk-snippets.zh-CN.mdx +++ b/website/pages/docs/guide/tsdk-snippets.zh-CN.mdx @@ -37,8 +37,6 @@ export const ApiNameConfig: APIConfig = { type: 'user', method: 'get', path: transformPath('ApiName'), - description: 'description', - category: 'Category', }; /** * diff --git a/website/pages/docs/guide/tsdk.config.en-US.mdx b/website/pages/docs/guide/tsdk.config.en-US.mdx index 070f225f..5578d5ec 100644 --- a/website/pages/docs/guide/tsdk.config.en-US.mdx +++ b/website/pages/docs/guide/tsdk.config.en-US.mdx @@ -30,7 +30,8 @@ module.exports = { - `sharedDirs` - shared dir, default is `["./src/shared"]` - `monorepoRoot` - monorepo root folder, default is `./` - `httpLib` - `xior` | `axios`, default is `axios`; `xior` use fetch, and have similiar API with axios -- `dataHookLib` - `SWR` | `ReactQuery`,Generate `SWR` or `React Query` hooks;dependencies version: `swr@^2.3.0`; `@tanstack/react-query@^5.10.0` +- `dataHookLib` - `SWR` | `ReactQuery` | `VueQuery` | string[],Generate `SWR`, `React Query` or `Vue Query` hooks;dependencies version: `swr@^2.3.3`; `@tanstack/react-query@^5.68.0` +- `validationLib` - 'valibot' | 'zod' | 'arktype' - `dependencies` - custom dependencies,will combine to `fe-sdk/package.json ` dependencies. This can custom dependencies and override fe-sdk's default version - `devDependencies` - custom devDependencies. @@ -74,7 +75,7 @@ Generate API SDK which request library to use. ### dataHookLib -`dataHookLib` - `SWR` | `ReactQuery`; Generate `SWR` or `React Query` hooks;dependencies version: `swr@^2.3.0`; `@tanstack/react-query@^5.64.1` +`dataHookLib` - `SWR` | `ReactQuery` | `VueQuery` | string[]; Generate `SWR`, `React Query` or `Vue Query` hooks;dependencies version: `swr@^2.3.3`; `@tanstack/react-query@^5.68.0` ### dependencies diff --git a/website/pages/docs/guide/tsdk.config.zh-CN.mdx b/website/pages/docs/guide/tsdk.config.zh-CN.mdx index 213245f4..c4fd0b1b 100644 --- a/website/pages/docs/guide/tsdk.config.zh-CN.mdx +++ b/website/pages/docs/guide/tsdk.config.zh-CN.mdx @@ -30,7 +30,8 @@ module.exports = { - `sharedDirs` - 共享文件夹,默认 `["./src/shared"]` - `monorepoRoot` - monorepo 根路径,默认当前路径 `./` - `httpLib` - 可选值有 `xior` | `axios`,默认 `axios`; `xior` 和 `axios` 什么区别?`xior` 使用 fetch,API 和 `axios` 类似 -- `dataHookLib` - 可选值有 `SWR` | `ReactQuery`,生成 `SWR` 或者 `React Query` 钩子;get 方法的接口将生成获取钩子,非 get 的将生成更新钩子。默认不生成。依赖版本:swr@^2.2.4;@tanstack/react-query@^5.10.0 +- `dataHookLib` - 可选值有 `SWR` | `ReactQuery` | `VueQuery` | string[],生成 `SWR` 或者 `React Query` 钩子;get 方法的接口将生成获取钩子,非 get 的将生成更新钩子。默认不生成。依赖版本:swr@^2.3.3;@tanstack/react-query@^5.68.0 +- `validationLib` - 'valibot' | 'zod' | 'arktype' - `dependencies` - 自定义依赖,将会和 **fe-sdk/package.json** dependencies 进行合并。作用:添加自定义依赖,以及覆盖默认的依赖版本号 - `devDependencies` - 自定义依赖,将会和 **fe-sdk/package.json** devDependencies 进行合并。 @@ -66,8 +67,7 @@ module.exports = { `monorepoRoot` - monorepo 根路径,默认当前路径 `./` - -### `httpLib` +### `httpLib` 可选值有 `xior` | `axios`,默认 `axios`; @@ -75,7 +75,7 @@ module.exports = { ### dataHookLib -`dataHookLib` - 可选值有 `SWR` | `ReactQuery`,生成 `SWR` 或者 `React Query` 钩子;get 方法的接口将生成获取钩子,非 get 的将生成更新钩子。默认不生成。依赖版本:swr@^2.2.4;@tanstack/react-query@^5.10.0 +`dataHookLib` - 可选值有 `SWR` | `ReactQuery` | `VueQuery` | string[],生成 `SWR`, `React Query` 或者 `Vue Query` 钩子;get 方法的接口将生成获取钩子,非 get 的将生成更新钩子。默认不生成。依赖版本:swr@^2.3.3;@tanstack/react-query@^5.68.0 ### dependencies @@ -97,4 +97,4 @@ module.exports = { ### `devDependencies` -自定义依赖,将会和 **fe-sdk/package.json** devDependencies 进行合并。 \ No newline at end of file +自定义依赖,将会和 **fe-sdk/package.json** devDependencies 进行合并。 diff --git a/website/pages/docs/quick-start/hello-world-api.en-US.mdx b/website/pages/docs/quick-start/hello-world-api.en-US.mdx index 5cf55cb1..21ed39d1 100644 --- a/website/pages/docs/quick-start/hello-world-api.en-US.mdx +++ b/website/pages/docs/quick-start/hello-world-api.en-US.mdx @@ -9,7 +9,7 @@ This chapter, We will use tsdk to develop two simple APIs, one is return Hello w **gen-route.ts** This file is responsible for middleware, error handling and route logic. ```ts filename="server/src/gen-route.ts" copy -import { ZodError } from 'zod'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; import { genRouteFactory, Protocol } from 'tsdk-server-adapters'; import { ProtocolTypes } from '@/src/shared/tsdk-helper'; import { APIConfig, APITypesKey } from '@/src/shared/tsdk-types'; @@ -60,12 +60,12 @@ function onErrorHandler( e: CustomError, { protocol, send, msgId }: Parameters[0]>[1] ) { - if (e instanceof ZodError) { + if ((e as unknown as StandardSchemaV1.FailureResult)?.issues) { return send({ _id: msgId, status: 400, result: { - msg: e.errors, + msg: (e as unknown as StandardSchemaV1.FailureResult).issues, }, }); } @@ -88,7 +88,11 @@ import express, { Request } from 'express'; import multer from 'multer'; import { Server } from 'socket.io'; import { socketIOAdapterFactory } from 'tsdk-server-adapters/lib/socket.io-adapter'; +// import { socketIOAdapterFactory } from 'tsdk-server-adapters/esm/socket.io-adapter'; + import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; + import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; @@ -166,7 +170,7 @@ import { Callout } from 'nextra/components'; ```ts filename="server/src/Hello.apiconf.ts" copy -import * as z from 'zod'; +import { z } from 'zod/v4'; import { APIConfig, transformPath } from '@/src/shared/tsdk-helper'; /** @@ -177,8 +181,6 @@ export const GetHelloConfig: APIConfig = { type: 'user', method: 'get', path: transformPath('GetHello'), - description: 'Get hello', - category: 'hello', needAuth: false, }; /** @@ -202,8 +204,6 @@ export const UpdateHelloConfig = { type: 'user' as const, method: 'post' as const, path: transformPath('UpdateHello'), - description: 'Update hello', - category: 'hello', needAuth: false, schema: z.object({ payload: z.string().min(1), @@ -226,7 +226,7 @@ export type UpdateHelloRes = { ### Combine the API with config in `src/Hello.api.ts` ```ts copy filename="server/src/Hello.api.ts" -import { genRoute, type RequestInfo } from './gen-route'; +import { genRoute } from './gen-route'; import { GetHelloReq, GetHelloRes, @@ -243,14 +243,14 @@ const DB = { export function setupHelloAPI() { genRoute( GetHelloConfig, - async (data, reqInfo: Readonly) => { + async (data, reqInfo) => { return { result: DB.data }; } ); genRoute( UpdateHelloConfig, - async (data, reqInfo: Readonly) => { + async (data, reqInfo) => { DB.data = data.payload; return { result: data.payload }; } @@ -265,9 +265,13 @@ export function setupHelloAPI() { ```ts filename="server/src/main.ts" {7, 67} import http from 'http'; import { socketIOAdapterFactory } from 'tsdk-server-adapters/lib/socket.io-adapter'; +// import { socketIOAdapterFactory } from 'tsdk-server-adapters/esm/socket.io-adapter'; + +import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; + import express from 'express'; import multer from 'multer' -import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; import { setupHelloAPI } from './Hello.api'; diff --git a/website/pages/docs/quick-start/hello-world-api.zh-CN.mdx b/website/pages/docs/quick-start/hello-world-api.zh-CN.mdx index 1185603d..56fd6423 100644 --- a/website/pages/docs/quick-start/hello-world-api.zh-CN.mdx +++ b/website/pages/docs/quick-start/hello-world-api.zh-CN.mdx @@ -9,7 +9,7 @@ **gen-route.ts** 该文件负责中间件,错误处理等逻辑。 ```ts filename="server/src/gen-route.ts" copy -import { ZodError } from 'zod'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; import { genRouteFactory, Protocol } from 'tsdk-server-adapters'; import { ProtocolTypes } from '@/src/shared/tsdk-helper'; import { APIConfig, APITypesKey } from '@/src/shared/tsdk-types'; @@ -60,12 +60,12 @@ function onErrorHandler( e: CustomError, { protocol, send, msgId }: Parameters[0]>[1] ) { - if (e instanceof ZodError) { + if ((e as unknown as StandardSchemaV1.FailureResult)?.issues) { return send({ _id: msgId, status: 400, result: { - msg: e.errors, + msg: (e as unknown as StandardSchemaV1.FailureResult).issues, }, }); } @@ -85,10 +85,11 @@ function onErrorHandler( ```ts filename="server/src/main.ts" copy import http from 'http'; import express, { Request } from 'express'; -import multer from 'multer' +import multer from 'multer'; import { Server } from 'socket.io'; import { socketIOAdapterFactory } from 'tsdk-server-adapters/lib/socket.io-adapter'; import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; + import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; @@ -166,7 +167,7 @@ import { Callout } from 'nextra/components'; ```ts filename="server/src/Hello.apiconf.ts" copy -import * as z from 'zod'; +import { z } from 'zod/v4'; import { APIConfig, transformPath } from '@/src/shared/tsdk-helper'; /** @@ -177,8 +178,6 @@ export const GetHelloConfig: APIConfig = { type: 'user', method: 'get', path: transformPath('GetHello'), - description: 'Get hello', - category: 'hello', needAuth: false, }; /** @@ -202,8 +201,6 @@ export const UpdateHelloConfig = { type: 'user' as const, method: 'post' as const, path: transformPath('UpdateHello'), - description: 'Update hello', - category: 'hello', needAuth: false, schema: z.object({ payload: z.string().min(1), @@ -226,7 +223,7 @@ export type UpdateHelloRes = { ### 编写接口 src/Hello.api.ts ```ts copy filename="server/src/Hello.api.ts" -import { genRoute, type RequestInfo } from './gen-route'; +import { genRoute } from './gen-route'; import { GetHelloReq, GetHelloRes, @@ -241,20 +238,14 @@ const DB = { }; export function setupHelloAPI() { - genRoute( - GetHelloConfig, - async (data, reqInfo: Readonly) => { - return { result: DB.data }; - } - ); - - genRoute( - UpdateHelloConfig, - async (data, reqInfo: Readonly) => { - DB.data = data.payload; - return { result: data.payload }; - } - ); + genRoute(GetHelloConfig, async (data, reqInfo) => { + return { result: DB.data }; + }); + + genRoute(UpdateHelloConfig, async (data, reqInfo) => { + DB.data = data.payload; + return { result: data.payload }; + }); } ``` @@ -265,9 +256,13 @@ export function setupHelloAPI() { ```ts filename="server/src/main.ts" {7, 67} import http from 'http'; import { socketIOAdapterFactory } from 'tsdk-server-adapters/lib/socket.io-adapter'; +// import { socketIOAdapterFactory } from 'tsdk-server-adapters/esm/socket.io-adapter'; + +import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; +// import { expressAdapterFactory } from 'tsdk-server-adapters/esm/express-adapter'; + import express from 'express'; import multer from 'multer'; -import { expressAdapterFactory } from 'tsdk-server-adapters/lib/express-adapter'; import { checkMethodHasBody, ProtocolTypes } from '@/src/shared/tsdk-helper'; import { RequestInfo, routeBus } from './gen-route'; import { setupHelloAPI } from './Hello.api'; diff --git a/website/pages/docs/quick-start/hello-world-next.en-US.mdx b/website/pages/docs/quick-start/hello-world-next.en-US.mdx index 5aed96de..b9276988 100644 --- a/website/pages/docs/quick-start/hello-world-next.en-US.mdx +++ b/website/pages/docs/quick-start/hello-world-next.en-US.mdx @@ -45,7 +45,7 @@ After create next-app project folder,We add `./fe-sdk` module to the file `./n ... "dependencies": { "fe-sdk": "workspace:*", - "axios": "1.7.7", + "axios": "1.8.4", "http-proxy": "1.18.1", ... }, @@ -114,11 +114,25 @@ Create `lib/user-api.ts` in **./next-app**: ```ts filename="next-app/lib/user-api.ts" copy import axios, { AxiosError } from 'axios'; -import { setHandler, setAxiosInstance, axiosHandler } from 'fe-sdk'; +/* +// For CommonJS +import { setHandler, setAxiosInstance, axiosHandler } from 'fe-sdk/lib/index'; export * from 'fe-sdk/lib/user-api'; +export * from 'fe-sdk/lib/user-api-hooks'; export * from 'fe-sdk/lib/apiconf-refs'; +export * from 'fe-sdk/lib/entity-refs'; export * from 'fe-sdk/lib/shared-refs'; +*/ + +// for ESM +import { setHandler, setAxiosInstance, axiosHandler } from 'fe-sdk/esm/index'; + +export * from 'fe-sdk/esm/user-api'; +export * from 'fe-sdk/esm/user-api-hooks'; +export * from 'fe-sdk/esm/apiconf-refs'; +export * from 'fe-sdk/esm/entity-refs'; +export * from 'fe-sdk/esm/shared-refs'; export const baseURL = process.env.API_URL || ''; diff --git a/website/pages/docs/quick-start/hello-world-next.zh-CN.mdx b/website/pages/docs/quick-start/hello-world-next.zh-CN.mdx index e66263e6..bec1b268 100644 --- a/website/pages/docs/quick-start/hello-world-next.zh-CN.mdx +++ b/website/pages/docs/quick-start/hello-world-next.zh-CN.mdx @@ -46,7 +46,7 @@ pnpx create-next-app@latest ... "dependencies": { "fe-sdk": "workspace:*", - "axios": "1.7.7", + "axios": "1.8.4", "http-proxy": "1.18.1", ... }, @@ -115,11 +115,25 @@ export default function api(req: IncomingMessage, res: ServerResponse How to install **bun**: https://bun.sh/ + + +```sh +bun init -y +# or just `bun init` and choose which template you'd like to use +``` + +The output: + +```sh + + .gitignore + + package.json + + index.ts + + tsconfig.json (for editor autocomplete) + + README.md + +To get started, run: + + bun run index.ts +bun install v1.2.4 (fd9a5ea6) + ++ typescript@5.8.2 ++ @types/bun@1.2.5 + +6 packages installed [1244.00ms] +``` diff --git a/website/pages/docs/start-a-typescript-project.zh-CN.mdx b/website/pages/docs/start-a-typescript-project.zh-CN.mdx new file mode 100644 index 00000000..863ba34c --- /dev/null +++ b/website/pages/docs/start-a-typescript-project.zh-CN.mdx @@ -0,0 +1,30 @@ +# 创建一个初始化 TypeScript 项目 + +最简单的方式是使用 **bun** 初始化一个新的 TypeScript 项目: + +> 如何安装 **bun**:https://bun.sh/ + +```sh +bun init -y +# 或者使用 `bun init`(没有 -y),再选择对应的模版生成 +``` + +运行后输出: + +```sh + + .gitignore + + package.json + + index.ts + + tsconfig.json (for editor autocomplete) + + README.md + +To get started, run: + + bun run index.ts +bun install v1.2.4 (fd9a5ea6) + ++ typescript@5.8.2 ++ @types/bun@1.2.5 + +6 packages installed [1244.00ms] +``` diff --git a/website/pages/docs/tsdk-born.zh-CN.mdx b/website/pages/docs/tsdk-born.zh-CN.mdx index aa6755dd..413a278c 100644 --- a/website/pages/docs/tsdk-born.zh-CN.mdx +++ b/website/pages/docs/tsdk-born.zh-CN.mdx @@ -3,11 +3,11 @@ -2019 年底,在学习了一段时间的 Golang 后端开发后,对于习惯了 JavaScript 语言,切换到 Golang 其实不是那么适应,所以为什么不直接用 node 写后端服务,于是中止了学习 Golang,开始投入精力学习 Node.js。 +2019 年底,我在学习了一段时间的 Golang 后端开发后,我对于习惯了 JavaScript 语言,切换到 Golang 其实不是那么适应,所以为什么不直接用 node 写后端服务呢?于是中止了学习 Golang,我开始投入精力学习 Node.js。 -而且使用 Node.js 写后端还有以下好处: +而使用 Node.js 写后端还有以下好处: -- 前后端是 JavaScript 或者 TypeScript, 一些相同逻辑的代码可以互相共享 +- 前后端是 JavaScript 或者 TypeScript, 一些相同逻辑的代码和类型可以更容易互相共享 - 找到一种方式,将 Node 端写好的接口,生成前端的接口调用代码 这也是目前 tsdk 提供的核心功能。