diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..a891e3a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,190 @@ +name: CI + +on: + pull_request: + branches: [main] + +env: + DATABASE_URL: postgres://beacon:beacon@localhost:5432/beacon?sslmode=disable + PORT: 4000 + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v2 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "pnpm" + + - uses: erlef/setup-beam@v1 + with: + otp-version: "28" + gleam-version: "1.13" + rebar3-version: "3.25" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: just lint + + test-sdk: + name: Test SDK + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v2 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test SDK + run: just test-sdk + + test-api: + name: Test API + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v2 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "pnpm" + + - uses: erlef/setup-beam@v1 + with: + otp-version: "28" + gleam-version: "1.13" + rebar3-version: "3.25" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Download Gleam deps + run: cd apps/api && gleam deps download + + - name: Test API + run: just test-api + + test-dashboard: + name: Test Dashboard + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v2 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test Dashboard + run: just test-dashboard + + bench-size: + name: SDK Bundle Size + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v2 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build SDK + run: just build-sdk + + - name: Check bundle size + run: just bench-sdk-size + + test-integration: + name: Integration Tests + runs-on: ubuntu-latest + services: + postgres: + image: postgres:16-alpine + env: + POSTGRES_USER: beacon + POSTGRES_PASSWORD: beacon + POSTGRES_DB: beacon + ports: + - 5432:5432 + options: >- + --health-cmd "pg_isready -U beacon" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v2 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "pnpm" + + - uses: erlef/setup-beam@v1 + with: + otp-version: "28" + gleam-version: "1.13" + rebar3-version: "3.25" + + - name: Install dbmate + run: | + curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64 + chmod +x /usr/local/bin/dbmate + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Download Gleam deps + run: cd apps/api && gleam deps download + + - name: Run migrations + run: just db-migrate + + - name: Build API + run: just build-api + + - name: Start API server + run: | + cd apps/api && gleam run -m beacon & + for i in {1..30}; do + curl -s http://localhost:4000/health && break + sleep 1 + done + + - name: Run integration tests + run: just test-integration diff --git a/.github/workflows/load-test.yml b/.github/workflows/load-test.yml new file mode 100644 index 0000000..5916414 --- /dev/null +++ b/.github/workflows/load-test.yml @@ -0,0 +1,78 @@ +name: Load Tests + +on: + pull_request: + branches: [main] + +env: + DATABASE_URL: postgres://beacon:beacon@localhost:5432/beacon?sslmode=disable + PORT: 4000 + +jobs: + load-test: + name: k6 Load Test + runs-on: ubuntu-latest + continue-on-error: true + services: + postgres: + image: postgres:16-alpine + env: + POSTGRES_USER: beacon + POSTGRES_PASSWORD: beacon + POSTGRES_DB: beacon + ports: + - 5432:5432 + options: >- + --health-cmd "pg_isready -U beacon" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v2 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "pnpm" + + - uses: erlef/setup-beam@v1 + with: + otp-version: "28" + gleam-version: "1.13" + rebar3-version: "3.25" + + - uses: grafana/setup-k6-action@v1 + + - name: Install dbmate + run: | + curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64 + chmod +x /usr/local/bin/dbmate + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Download Gleam deps + run: cd apps/api && gleam deps download + + - name: Run migrations + run: just db-migrate + + - name: Build API + run: just build-api + + - name: Start API server + run: | + cd apps/api && gleam run -m beacon & + for i in {1..30}; do + curl -s http://localhost:4000/health && break + sleep 1 + done + + - name: Run load test + run: k6 run --quiet scripts/load-test.k6.js + + - name: Validate persistence + run: just bench-validate diff --git a/CLAUDE.md b/CLAUDE.md index 46f8153..e095963 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -130,3 +130,4 @@ For detailed documentation, see the `docs/` folder: - [API Reference](docs/api.md) - Server endpoints - [WebSocket Protocol](docs/protocol.md) - Wire protocol - [Identity Tracking](docs/identity.md) - User identification system +- [CI/CD](docs/ci.md) - GitHub Actions workflows diff --git a/apps/dashboard/eslint.config.js b/apps/dashboard/eslint.config.js new file mode 100644 index 0000000..ded9061 --- /dev/null +++ b/apps/dashboard/eslint.config.js @@ -0,0 +1,34 @@ +import js from "@eslint/js"; +import svelte from "eslint-plugin-svelte"; +import ts from "typescript-eslint"; +import globals from "globals"; + +export default ts.config( + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + }, + }, + }, + { + files: ["**/*.svelte", "**/*.svelte.ts"], + languageOptions: { + parserOptions: { + parser: ts.parser, + }, + }, + rules: { + // TODO: fix these in a future PR + "svelte/no-navigation-without-resolve": "off", + "svelte/require-each-key": "off", + }, + }, + { + ignores: [".svelte-kit/", "build/", "node_modules/"], + }, +); diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 6d9b4c4..fb9be47 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -7,12 +7,13 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", - "test": "vitest", + "test": "vitest --passWithNoTests", "lint": "eslint .", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "zero": "dotenv -- zero-cache-dev --schema-path=src/lib/zero/schema.ts" }, "devDependencies": { + "@eslint/js": "^9.39.1", "@sveltejs/adapter-node": "^5.2.0", "@sveltejs/kit": "^2.49.0", "@sveltejs/vite-plugin-svelte": "^6.2.1", @@ -20,13 +21,16 @@ "autoprefixer": "^10.4.20", "dotenv-cli": "^11.0.0", "eslint": "^9.15.0", + "eslint-plugin-svelte": "^3.13.0", + "globals": "^16.5.0", "postcss": "^8.4.49", "svelte": "^5.45.2", "svelte-check": "^4.1.0", "tailwindcss": "^3.4.15", "typescript": "^5.7.0", + "typescript-eslint": "^8.48.0", "vite": "^6.0.0", - "vitest": "^2.1.0" + "vitest": "^4.0.0" }, "dependencies": { "@rocicorp/zero": "^0.24.3000000000", diff --git a/docs/README.md b/docs/README.md index 0efa7fb..a078e53 100644 --- a/docs/README.md +++ b/docs/README.md @@ -124,6 +124,7 @@ just lint # Lint and format | [WebSocket Protocol](./protocol.md) | Wire protocol specification | | [Identity Tracking](./identity.md) | User identification system | | [Benchmarking](./bench.md) | Performance benchmarks | +| [CI/CD](./ci.md) | GitHub Actions workflows | ## Environment diff --git a/docs/ci.md b/docs/ci.md new file mode 100644 index 0000000..4f770ff --- /dev/null +++ b/docs/ci.md @@ -0,0 +1,55 @@ +# CI/CD + +GitHub Actions workflows for pull requests to `main`. + +## Workflows + +### CI (`ci.yml`) + +Main workflow - all jobs must pass to merge. + +| Job | Description | +| ---------------- | ----------------------------------- | +| lint | Gleam format + Prettier + ESLint | +| test-sdk | SDK unit tests | +| test-api | Gleam API unit tests | +| test-dashboard | Dashboard tests (vitest) | +| bench-size | SDK bundle size check (<2KB worker) | +| test-integration | Integration tests | + +### Load Tests (`load-test.yml`) + +Non-blocking k6 performance tests. Runs in parallel with CI but failures won't block PRs. + +- `bench-load` - Throughput test +- `bench-validate` - Verify DB persistence + +## Environment + +| Tool | Version | +| -------- | --------------------- | +| Node | 24 | +| pnpm | from `packageManager` | +| OTP | 28 | +| Gleam | 1.13 | +| rebar3 | 3.25 | +| Postgres | 16-alpine | + +## Running Locally + +```bash +just lint # Format and lint all code +just test-sdk # SDK unit tests +just test-api # Gleam unit tests +just test-dashboard # Dashboard tests +just test-integration # Integration tests (requires running server) +just bench-sdk-size # Bundle size check +just bench-load # k6 load test (requires k6 + running server) +``` + +## Adding Tests + +- **SDK**: `packages/sdk/test/*.test.ts` +- **API**: `apps/api/test/*_test.gleam` +- **Dashboard**: `apps/dashboard/**/*.test.ts` +- **Integration**: `scripts/integration-test.ts` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18b7ff4..6f95e72 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: specifier: ^4.1.13 version: 4.1.13 devDependencies: + "@eslint/js": + specifier: ^9.39.1 + version: 9.39.1 "@sveltejs/adapter-node": specifier: ^5.2.0 version: 5.4.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)))(svelte@5.45.2)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0))) @@ -56,6 +59,12 @@ importers: eslint: specifier: ^9.15.0 version: 9.39.1(jiti@1.21.7) + eslint-plugin-svelte: + specifier: ^3.13.0 + version: 3.13.0(eslint@9.39.1(jiti@1.21.7))(svelte@5.45.2) + globals: + specifier: ^16.5.0 + version: 16.5.0 postcss: specifier: ^8.4.49 version: 8.5.6 @@ -71,12 +80,15 @@ importers: typescript: specifier: ^5.7.0 version: 5.9.3 + typescript-eslint: + specifier: ^8.48.0 + version: 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) vite: specifier: ^6.0.0 version: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) vitest: - specifier: ^2.1.0 - version: 2.1.9(@types/node@22.19.1)(jsdom@27.2.0) + specifier: ^4.0.0 + version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(jiti@1.21.7)(jsdom@27.2.0)(tsx@4.21.0) apps/example-react: dependencies: @@ -431,15 +443,6 @@ packages: peerDependencies: "@noble/ciphers": ^1.0.0 - "@esbuild/aix-ppc64@0.21.5": - resolution: - { - integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [aix] - "@esbuild/aix-ppc64@0.25.12": resolution: { @@ -458,15 +461,6 @@ packages: 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-arm64@0.25.12": resolution: { @@ -485,15 +479,6 @@ packages: 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.12": resolution: { @@ -512,15 +497,6 @@ packages: cpu: [arm] os: [android] - "@esbuild/android-x64@0.21.5": - resolution: - { - integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [android] - "@esbuild/android-x64@0.25.12": resolution: { @@ -539,15 +515,6 @@ packages: 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-arm64@0.25.12": resolution: { @@ -566,15 +533,6 @@ packages: 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/darwin-x64@0.25.12": resolution: { @@ -593,15 +551,6 @@ packages: 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-arm64@0.25.12": resolution: { @@ -620,15 +569,6 @@ packages: 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/freebsd-x64@0.25.12": resolution: { @@ -647,15 +587,6 @@ packages: 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-arm64@0.25.12": resolution: { @@ -674,15 +605,6 @@ packages: cpu: [arm64] os: [linux] - "@esbuild/linux-arm@0.21.5": - resolution: - { - integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - "@esbuild/linux-arm@0.25.12": resolution: { @@ -701,15 +623,6 @@ packages: cpu: [arm] os: [linux] - "@esbuild/linux-ia32@0.21.5": - resolution: - { - integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - "@esbuild/linux-ia32@0.25.12": resolution: { @@ -728,15 +641,6 @@ packages: 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-loong64@0.25.12": resolution: { @@ -755,15 +659,6 @@ packages: cpu: [loong64] os: [linux] - "@esbuild/linux-mips64el@0.21.5": - resolution: - { - integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, - } - engines: { node: ">=12" } - cpu: [mips64el] - os: [linux] - "@esbuild/linux-mips64el@0.25.12": resolution: { @@ -782,15 +677,6 @@ packages: 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-ppc64@0.25.12": resolution: { @@ -809,15 +695,6 @@ packages: 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-riscv64@0.25.12": resolution: { @@ -836,15 +713,6 @@ packages: cpu: [riscv64] os: [linux] - "@esbuild/linux-s390x@0.21.5": - resolution: - { - integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, - } - engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - "@esbuild/linux-s390x@0.25.12": resolution: { @@ -863,15 +731,6 @@ packages: cpu: [s390x] os: [linux] - "@esbuild/linux-x64@0.21.5": - resolution: - { - integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [linux] - "@esbuild/linux-x64@0.25.12": resolution: { @@ -908,15 +767,6 @@ packages: cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-x64@0.21.5": - resolution: - { - integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - "@esbuild/netbsd-x64@0.25.12": resolution: { @@ -953,15 +803,6 @@ packages: cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-x64@0.21.5": - resolution: - { - integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [openbsd] - "@esbuild/openbsd-x64@0.25.12": resolution: { @@ -998,15 +839,6 @@ packages: 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/sunos-x64@0.25.12": resolution: { @@ -1025,15 +857,6 @@ packages: cpu: [x64] os: [sunos] - "@esbuild/win32-arm64@0.21.5": - resolution: - { - integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [win32] - "@esbuild/win32-arm64@0.25.12": resolution: { @@ -1052,15 +875,6 @@ packages: 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-ia32@0.25.12": resolution: { @@ -1079,15 +893,6 @@ packages: cpu: [ia32] os: [win32] - "@esbuild/win32-x64@0.21.5": - resolution: - { - integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - "@esbuild/win32-x64@0.25.12": resolution: { @@ -2649,6 +2454,95 @@ packages: integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==, } + "@typescript-eslint/eslint-plugin@8.48.0": + resolution: + { + integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + "@typescript-eslint/parser": ^8.48.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/parser@8.48.0": + resolution: + { + integrity: sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/project-service@8.48.0": + resolution: + { + integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/scope-manager@8.48.0": + resolution: + { + integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/tsconfig-utils@8.48.0": + resolution: + { + integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/type-utils@8.48.0": + resolution: + { + integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/types@8.48.0": + resolution: + { + integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/typescript-estree@8.48.0": + resolution: + { + integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/utils@8.48.0": + resolution: + { + integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/visitor-keys@8.48.0": + resolution: + { + integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + "@vitejs/plugin-react@4.7.0": resolution: { @@ -2670,32 +2564,12 @@ packages: "@vitest/browser": optional: true - "@vitest/expect@2.1.9": - resolution: - { - integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==, - } - "@vitest/expect@4.0.14": resolution: { integrity: sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==, } - "@vitest/mocker@2.1.9": - resolution: - { - integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==, - } - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - "@vitest/mocker@4.0.14": resolution: { @@ -2710,60 +2584,30 @@ packages: vite: optional: true - "@vitest/pretty-format@2.1.9": - resolution: - { - integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==, - } - "@vitest/pretty-format@4.0.14": resolution: { integrity: sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==, } - "@vitest/runner@2.1.9": - resolution: - { - integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==, - } - "@vitest/runner@4.0.14": resolution: { integrity: sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==, } - "@vitest/snapshot@2.1.9": - resolution: - { - integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==, - } - "@vitest/snapshot@4.0.14": resolution: { integrity: sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==, } - "@vitest/spy@2.1.9": - resolution: - { - integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==, - } - "@vitest/spy@4.0.14": resolution: { integrity: sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==, } - "@vitest/utils@2.1.9": - resolution: - { - integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==, - } - "@vitest/utils@4.0.14": resolution: { @@ -3007,6 +2851,12 @@ packages: integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==, } + brace-expansion@2.0.2: + resolution: + { + integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, + } + braces@3.0.3: resolution: { @@ -3085,13 +2935,6 @@ packages: integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==, } - chai@5.3.3: - resolution: - { - integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==, - } - engines: { node: ">=18" } - chai@6.2.1: resolution: { @@ -3127,13 +2970,6 @@ packages: } engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - check-error@2.1.1: - resolution: - { - integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, - } - engines: { node: ">= 16" } - chokidar@3.6.0: resolution: { @@ -3345,13 +3181,6 @@ packages: } engines: { node: ">=10" } - deep-eql@5.0.2: - resolution: - { - integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, - } - engines: { node: ">=6" } - deep-extend@0.6.0: resolution: { @@ -3517,14 +3346,6 @@ packages: } engines: { node: ">= 0.4" } - esbuild@0.21.5: - resolution: - { - integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==, - } - engines: { node: ">=12" } - hasBin: true - esbuild@0.25.12: resolution: { @@ -3555,6 +3376,19 @@ packages: } engines: { node: ">=10" } + eslint-plugin-svelte@3.13.0: + resolution: + { + integrity: sha512-2ohCCQJJTNbIpQCSDSTWj+FN0OVfPmSO03lmSNT7ytqMaWF6kpT86LdzDqtm4sh7TVPl/OEWJ/d7R87bXP2Vjg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + eslint-scope@8.4.0: resolution: { @@ -3953,6 +3787,13 @@ packages: } engines: { node: ">=18" } + globals@16.5.0: + resolution: + { + integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==, + } + engines: { node: ">=18" } + google-logging-utils@0.0.2: resolution: { @@ -3967,6 +3808,12 @@ packages: } engines: { node: ">= 0.4" } + graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + has-flag@4.0.0: resolution: { @@ -4055,6 +3902,13 @@ packages: } engines: { node: ">= 4" } + ignore@7.0.5: + resolution: + { + integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, + } + engines: { node: ">= 4" } + import-fresh@3.3.1: resolution: { @@ -4385,6 +4239,12 @@ packages: } engines: { node: ">=6" } + known-css-properties@0.37.0: + resolution: + { + integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==, + } + levn@0.4.1: resolution: { @@ -4398,6 +4258,13 @@ packages: integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==, } + lilconfig@2.1.0: + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, + } + engines: { node: ">=10" } + lilconfig@3.1.3: resolution: { @@ -4456,12 +4323,6 @@ packages: } hasBin: true - loupe@3.2.1: - resolution: - { - integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==, - } - lru-cache@11.2.2: resolution: { @@ -4547,6 +4408,13 @@ packages: integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, } + minimatch@9.0.5: + resolution: + { + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, + } + engines: { node: ">=16 || 14 >=14.17" } + minimist@1.2.8: resolution: { @@ -4790,25 +4658,12 @@ packages: integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, } - pathe@1.1.2: - resolution: - { - integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, - } - pathe@2.0.3: resolution: { integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, } - pathval@2.0.1: - resolution: - { - integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==, - } - engines: { node: ">= 14.16" } - pg-format-fix@1.0.5: resolution: { @@ -4920,6 +4775,21 @@ packages: peerDependencies: postcss: ^8.4.21 + postcss-load-config@3.1.4: + resolution: + { + integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==, + } + engines: { node: ">= 10" } + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + postcss-load-config@6.0.1: resolution: { @@ -4950,6 +4820,24 @@ packages: peerDependencies: postcss: ^8.2.14 + postcss-safe-parser@7.0.1: + resolution: + { + integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==, + } + engines: { node: ">=18.0" } + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: + { + integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.4.29 + postcss-selector-parser@6.1.2: resolution: { @@ -4957,6 +4845,13 @@ packages: } engines: { node: ">=4" } + postcss-selector-parser@7.1.1: + resolution: + { + integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==, + } + engines: { node: ">=4" } + postcss-value-parser@4.2.0: resolution: { @@ -5494,6 +5389,18 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 typescript: ">=5.0.0" + svelte-eslint-parser@1.4.0: + resolution: + { + integrity: sha512-fjPzOfipR5S7gQ/JvI9r2H8y9gMGXO3JtmrylHLLyahEMquXI0lrebcjT+9/hNgDej0H7abTyox5HpHmW1PSWA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.18.3 } + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + svelte@5.45.2: resolution: { @@ -5573,20 +5480,6 @@ packages: } engines: { node: ">=12.0.0" } - tinypool@1.1.1: - resolution: - { - integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==, - } - engines: { node: ^18.0.0 || >=20.0.0 } - - tinyrainbow@1.2.0: - resolution: - { - integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==, - } - engines: { node: ">=14.0.0" } - tinyrainbow@3.0.3: resolution: { @@ -5594,13 +5487,6 @@ packages: } engines: { node: ">=14.0.0" } - tinyspy@3.0.2: - resolution: - { - integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==, - } - engines: { node: ">=14.0.0" } - tldts-core@7.0.19: resolution: { @@ -5662,6 +5548,15 @@ packages: } hasBin: true + ts-api-utils@2.1.0: + resolution: + { + integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==, + } + engines: { node: ">=18.12" } + peerDependencies: + typescript: ">=4.8.4" + ts-interface-checker@0.1.13: resolution: { @@ -5711,6 +5606,16 @@ packages: } engines: { node: ">= 0.8.0" } + typescript-eslint@8.48.0: + resolution: + { + integrity: sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + typescript@5.9.3: resolution: { @@ -5787,52 +5692,10 @@ packages: uuid@9.0.1: resolution: - { - integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, - } - hasBin: true - - vite-node@2.1.9: - resolution: - { - integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==, - } - engines: { node: ^18.0.0 || >=20.0.0 } - hasBin: true - - vite@5.4.21: - resolution: - { - integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==, - } - engines: { node: ^18.0.0 || >=20.0.0 } - hasBin: true - peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" - lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } + hasBin: true vite@6.4.1: resolution: @@ -5888,34 +5751,6 @@ packages: vite: optional: true - vitest@2.1.9: - resolution: - { - integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==, - } - engines: { node: ^18.0.0 || >=20.0.0 } - hasBin: true - peerDependencies: - "@edge-runtime/vm": "*" - "@types/node": ^18.0.0 || >=20.0.0 - "@vitest/browser": 2.1.9 - "@vitest/ui": 2.1.9 - happy-dom: "*" - jsdom: "*" - peerDependenciesMeta: - "@edge-runtime/vm": - optional: true - "@types/node": - optional: true - "@vitest/browser": - optional: true - "@vitest/ui": - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vitest@4.0.14: resolution: { @@ -6106,6 +5941,13 @@ packages: integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, } + yaml@1.10.2: + resolution: + { + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, + } + engines: { node: ">= 6" } + yargs-parser@21.1.1: resolution: { @@ -6326,153 +6168,102 @@ snapshots: dependencies: "@noble/ciphers": 1.3.0 - "@esbuild/aix-ppc64@0.21.5": - optional: true - "@esbuild/aix-ppc64@0.25.12": optional: true "@esbuild/aix-ppc64@0.27.0": optional: true - "@esbuild/android-arm64@0.21.5": - optional: true - "@esbuild/android-arm64@0.25.12": optional: true "@esbuild/android-arm64@0.27.0": optional: true - "@esbuild/android-arm@0.21.5": - optional: true - "@esbuild/android-arm@0.25.12": optional: true "@esbuild/android-arm@0.27.0": optional: true - "@esbuild/android-x64@0.21.5": - optional: true - "@esbuild/android-x64@0.25.12": optional: true "@esbuild/android-x64@0.27.0": optional: true - "@esbuild/darwin-arm64@0.21.5": - optional: true - "@esbuild/darwin-arm64@0.25.12": optional: true "@esbuild/darwin-arm64@0.27.0": optional: true - "@esbuild/darwin-x64@0.21.5": - optional: true - "@esbuild/darwin-x64@0.25.12": optional: true "@esbuild/darwin-x64@0.27.0": optional: true - "@esbuild/freebsd-arm64@0.21.5": - optional: true - "@esbuild/freebsd-arm64@0.25.12": optional: true "@esbuild/freebsd-arm64@0.27.0": optional: true - "@esbuild/freebsd-x64@0.21.5": - optional: true - "@esbuild/freebsd-x64@0.25.12": optional: true "@esbuild/freebsd-x64@0.27.0": optional: true - "@esbuild/linux-arm64@0.21.5": - optional: true - "@esbuild/linux-arm64@0.25.12": optional: true "@esbuild/linux-arm64@0.27.0": optional: true - "@esbuild/linux-arm@0.21.5": - optional: true - "@esbuild/linux-arm@0.25.12": optional: true "@esbuild/linux-arm@0.27.0": optional: true - "@esbuild/linux-ia32@0.21.5": - optional: true - "@esbuild/linux-ia32@0.25.12": optional: true "@esbuild/linux-ia32@0.27.0": optional: true - "@esbuild/linux-loong64@0.21.5": - optional: true - "@esbuild/linux-loong64@0.25.12": optional: true "@esbuild/linux-loong64@0.27.0": optional: true - "@esbuild/linux-mips64el@0.21.5": - optional: true - "@esbuild/linux-mips64el@0.25.12": optional: true "@esbuild/linux-mips64el@0.27.0": optional: true - "@esbuild/linux-ppc64@0.21.5": - optional: true - "@esbuild/linux-ppc64@0.25.12": optional: true "@esbuild/linux-ppc64@0.27.0": optional: true - "@esbuild/linux-riscv64@0.21.5": - optional: true - "@esbuild/linux-riscv64@0.25.12": optional: true "@esbuild/linux-riscv64@0.27.0": optional: true - "@esbuild/linux-s390x@0.21.5": - optional: true - "@esbuild/linux-s390x@0.25.12": optional: true "@esbuild/linux-s390x@0.27.0": optional: true - "@esbuild/linux-x64@0.21.5": - optional: true - "@esbuild/linux-x64@0.25.12": optional: true @@ -6485,9 +6276,6 @@ snapshots: "@esbuild/netbsd-arm64@0.27.0": optional: true - "@esbuild/netbsd-x64@0.21.5": - optional: true - "@esbuild/netbsd-x64@0.25.12": optional: true @@ -6500,9 +6288,6 @@ snapshots: "@esbuild/openbsd-arm64@0.27.0": optional: true - "@esbuild/openbsd-x64@0.21.5": - optional: true - "@esbuild/openbsd-x64@0.25.12": optional: true @@ -6515,36 +6300,24 @@ snapshots: "@esbuild/openharmony-arm64@0.27.0": optional: true - "@esbuild/sunos-x64@0.21.5": - optional: true - "@esbuild/sunos-x64@0.25.12": optional: true "@esbuild/sunos-x64@0.27.0": optional: true - "@esbuild/win32-arm64@0.21.5": - optional: true - "@esbuild/win32-arm64@0.25.12": optional: true "@esbuild/win32-arm64@0.27.0": optional: true - "@esbuild/win32-ia32@0.21.5": - optional: true - "@esbuild/win32-ia32@0.25.12": optional: true "@esbuild/win32-ia32@0.27.0": optional: true - "@esbuild/win32-x64@0.21.5": - optional: true - "@esbuild/win32-x64@0.25.12": optional: true @@ -7763,6 +7536,98 @@ snapshots: dependencies: "@types/node": 22.19.1 + "@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)": + dependencies: + "@eslint-community/regexpp": 4.12.2 + "@typescript-eslint/parser": 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/scope-manager": 8.48.0 + "@typescript-eslint/type-utils": 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/utils": 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.48.0 + eslint: 9.39.1(jiti@1.21.7) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)": + dependencies: + "@typescript-eslint/scope-manager": 8.48.0 + "@typescript-eslint/types": 8.48.0 + "@typescript-eslint/typescript-estree": 8.48.0(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.48.0 + debug: 4.4.3 + eslint: 9.39.1(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/project-service@8.48.0(typescript@5.9.3)": + dependencies: + "@typescript-eslint/tsconfig-utils": 8.48.0(typescript@5.9.3) + "@typescript-eslint/types": 8.48.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/scope-manager@8.48.0": + dependencies: + "@typescript-eslint/types": 8.48.0 + "@typescript-eslint/visitor-keys": 8.48.0 + + "@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)": + dependencies: + typescript: 5.9.3 + + "@typescript-eslint/type-utils@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)": + dependencies: + "@typescript-eslint/types": 8.48.0 + "@typescript-eslint/typescript-estree": 8.48.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.1(jiti@1.21.7) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/types@8.48.0": {} + + "@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)": + dependencies: + "@typescript-eslint/project-service": 8.48.0(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.48.0(typescript@5.9.3) + "@typescript-eslint/types": 8.48.0 + "@typescript-eslint/visitor-keys": 8.48.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)": + dependencies: + "@eslint-community/eslint-utils": 4.9.0(eslint@9.39.1(jiti@1.21.7)) + "@typescript-eslint/scope-manager": 8.48.0 + "@typescript-eslint/types": 8.48.0 + "@typescript-eslint/typescript-estree": 8.48.0(typescript@5.9.3) + eslint: 9.39.1(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/visitor-keys@8.48.0": + dependencies: + "@typescript-eslint/types": 8.48.0 + eslint-visitor-keys: 4.2.1 + "@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0))": dependencies: "@babel/core": 7.28.5 @@ -7792,13 +7657,6 @@ snapshots: transitivePeerDependencies: - supports-color - "@vitest/expect@2.1.9": - dependencies: - "@vitest/spy": 2.1.9 - "@vitest/utils": 2.1.9 - chai: 5.3.3 - tinyrainbow: 1.2.0 - "@vitest/expect@4.0.14": dependencies: "@standard-schema/spec": 1.0.0 @@ -7808,14 +7666,6 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - "@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.1))": - dependencies: - "@vitest/spy": 2.1.9 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 5.4.21(@types/node@22.19.1) - "@vitest/mocker@4.0.14(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0))": dependencies: "@vitest/spy": 4.0.14 @@ -7824,48 +7674,23 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) - "@vitest/pretty-format@2.1.9": - dependencies: - tinyrainbow: 1.2.0 - "@vitest/pretty-format@4.0.14": dependencies: tinyrainbow: 3.0.3 - "@vitest/runner@2.1.9": - dependencies: - "@vitest/utils": 2.1.9 - pathe: 1.1.2 - "@vitest/runner@4.0.14": dependencies: "@vitest/utils": 4.0.14 pathe: 2.0.3 - "@vitest/snapshot@2.1.9": - dependencies: - "@vitest/pretty-format": 2.1.9 - magic-string: 0.30.21 - pathe: 1.1.2 - "@vitest/snapshot@4.0.14": dependencies: "@vitest/pretty-format": 4.0.14 magic-string: 0.30.21 pathe: 2.0.3 - "@vitest/spy@2.1.9": - dependencies: - tinyspy: 3.0.2 - "@vitest/spy@4.0.14": {} - "@vitest/utils@2.1.9": - dependencies: - "@vitest/pretty-format": 2.1.9 - loupe: 3.2.1 - tinyrainbow: 1.2.0 - "@vitest/utils@4.0.14": dependencies: "@vitest/pretty-format": 4.0.14 @@ -7992,6 +7817,10 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -8039,14 +7868,6 @@ snapshots: caniuse-lite@1.0.30001757: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 - chai@6.2.1: {} chalk-template@0.4.0: @@ -8064,8 +7885,6 @@ snapshots: chalk@5.6.2: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -8179,8 +7998,6 @@ snapshots: dependencies: mimic-response: 3.1.0 - deep-eql@5.0.2: {} - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -8260,32 +8077,6 @@ snapshots: dependencies: es-errors: 1.3.0 - 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.12: optionalDependencies: "@esbuild/aix-ppc64": 0.25.12 @@ -8348,6 +8139,24 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-plugin-svelte@3.13.0(eslint@9.39.1(jiti@1.21.7))(svelte@5.45.2): + dependencies: + "@eslint-community/eslint-utils": 4.9.0(eslint@9.39.1(jiti@1.21.7)) + "@jridgewell/sourcemap-codec": 1.5.5 + eslint: 9.39.1(jiti@1.21.7) + esutils: 2.0.3 + globals: 16.5.0 + known-css-properties: 0.37.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.6) + semver: 7.7.3 + svelte-eslint-parser: 1.4.0(svelte@5.45.2) + optionalDependencies: + svelte: 5.45.2 + transitivePeerDependencies: + - ts-node + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -8620,10 +8429,14 @@ snapshots: globals@14.0.0: {} + globals@16.5.0: {} + google-logging-utils@0.0.2: {} gopd@1.2.0: {} + graphemer@1.4.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -8670,6 +8483,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -8848,6 +8663,8 @@ snapshots: kleur@4.1.5: {} + known-css-properties@0.37.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -8859,6 +8676,8 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.2 + lilconfig@2.1.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -8881,8 +8700,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.2.1: {} - lru-cache@11.2.2: {} lru-cache@5.1.1: @@ -8924,6 +8741,10 @@ snapshots: dependencies: brace-expansion: 1.1.12 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + minimist@1.2.8: {} mkdirp-classic@0.5.3: {} @@ -9034,12 +8855,8 @@ snapshots: path-parse@1.0.7: {} - pathe@1.1.2: {} - pathe@2.0.3: {} - pathval@2.0.1: {} - pg-format-fix@1.0.5: {} pg-int8@1.0.1: {} @@ -9104,6 +8921,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0): dependencies: lilconfig: 3.1.3 @@ -9117,11 +8941,24 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 6.1.2 + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.5.6: @@ -9428,6 +9265,17 @@ snapshots: transitivePeerDependencies: - picomatch + svelte-eslint-parser@1.4.0(svelte@5.45.2): + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.1 + optionalDependencies: + svelte: 5.45.2 + svelte@5.45.2: dependencies: "@jridgewell/remapping": 2.3.5 @@ -9517,14 +9365,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - - tinyrainbow@1.2.0: {} - tinyrainbow@3.0.3: {} - tinyspy@3.0.2: {} - tldts-core@7.0.19: {} tldts@7.0.19: @@ -9551,6 +9393,10 @@ snapshots: tree-kill@1.2.2: {} + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-interface-checker@0.1.13: {} tsup@8.5.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3): @@ -9596,6 +9442,17 @@ snapshots: dependencies: prelude-ls: 1.2.1 + typescript-eslint@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3): + dependencies: + "@typescript-eslint/eslint-plugin": 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/parser": 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/typescript-estree": 8.48.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.1(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + typescript@5.9.3: {} typical@7.3.0: {} @@ -9632,33 +9489,6 @@ snapshots: uuid@9.0.1: {} - vite-node@2.1.9(@types/node@22.19.1): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 1.1.2 - vite: 5.4.21(@types/node@22.19.1) - transitivePeerDependencies: - - "@types/node" - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite@5.4.21(@types/node@22.19.1): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.6 - rollup: 4.53.3 - optionalDependencies: - "@types/node": 22.19.1 - fsevents: 2.3.3 - vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0): dependencies: esbuild: 0.25.12 @@ -9677,42 +9507,6 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) - vitest@2.1.9(@types/node@22.19.1)(jsdom@27.2.0): - dependencies: - "@vitest/expect": 2.1.9 - "@vitest/mocker": 2.1.9(vite@5.4.21(@types/node@22.19.1)) - "@vitest/pretty-format": 2.1.9 - "@vitest/runner": 2.1.9 - "@vitest/snapshot": 2.1.9 - "@vitest/spy": 2.1.9 - "@vitest/utils": 2.1.9 - chai: 5.3.3 - debug: 4.4.3 - expect-type: 1.2.2 - magic-string: 0.30.21 - pathe: 1.1.2 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinypool: 1.1.1 - tinyrainbow: 1.2.0 - vite: 5.4.21(@types/node@22.19.1) - vite-node: 2.1.9(@types/node@22.19.1) - why-is-node-running: 2.3.0 - optionalDependencies: - "@types/node": 22.19.1 - jsdom: 27.2.0 - transitivePeerDependencies: - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vitest@4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(jiti@1.21.7)(jsdom@27.2.0)(tsx@4.21.0): dependencies: "@vitest/expect": 4.0.14 @@ -9823,6 +9617,8 @@ snapshots: yallist@3.1.1: {} + yaml@1.10.2: {} + yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/scripts/benchmark-sdk-size.ts b/scripts/benchmark-sdk-size.ts index 7d35425..e7ff9e2 100644 --- a/scripts/benchmark-sdk-size.ts +++ b/scripts/benchmark-sdk-size.ts @@ -97,13 +97,13 @@ async function main() { console.log(`${BOLD}Bundle Sizes${RESET}`); console.log("-".repeat(50)); console.log( - `${"File".padEnd(25)} ${"Minified".padStart(10)} ${"Gzipped".padStart(10)}` + `${"File".padEnd(25)} ${"Minified".padStart(10)} ${"Gzipped".padStart(10)}`, ); console.log("-".repeat(50)); for (const result of results) { console.log( - `${result.file.padEnd(25)} ${formatBytes(result.minified).padStart(10)} ${formatBytes(result.gzipped).padStart(10)}` + `${result.file.padEnd(25)} ${formatBytes(result.minified).padStart(10)} ${formatBytes(result.gzipped).padStart(10)}`, ); } console.log("-".repeat(50)); @@ -113,7 +113,7 @@ async function main() { const totalGzipped = results.reduce((sum, r) => sum + r.gzipped, 0); console.log( - `${BOLD}${"Total".padEnd(25)}${RESET} ${formatBytes(totalMinified).padStart(10)} ${formatBytes(totalGzipped).padStart(10)}` + `${BOLD}${"Total".padEnd(25)}${RESET} ${formatBytes(totalMinified).padStart(10)} ${formatBytes(totalGzipped).padStart(10)}`, ); console.log(); @@ -128,7 +128,7 @@ async function main() { const workerPass = workerResult.gzipped <= WORKER_GZIP_THRESHOLD; const status = workerPass ? `${GREEN}PASS${RESET}` : `${RED}FAIL${RESET}`; console.log( - `Worker gzipped: ${formatBytes(workerResult.gzipped)} / ${formatBytes(WORKER_GZIP_THRESHOLD)} ${status}` + `Worker gzipped: ${formatBytes(workerResult.gzipped)} / ${formatBytes(WORKER_GZIP_THRESHOLD)} ${status}`, ); if (!workerPass) failed = true; } @@ -136,7 +136,7 @@ async function main() { const totalPass = totalGzipped <= TOTAL_GZIP_THRESHOLD; const totalStatus = totalPass ? `${GREEN}PASS${RESET}` : `${RED}FAIL${RESET}`; console.log( - `Total gzipped: ${formatBytes(totalGzipped)} / ${formatBytes(TOTAL_GZIP_THRESHOLD)} ${totalStatus}` + `Total gzipped: ${formatBytes(totalGzipped)} / ${formatBytes(TOTAL_GZIP_THRESHOLD)} ${totalStatus}`, ); if (!totalPass) failed = true; @@ -145,7 +145,7 @@ async function main() { if (failed) { console.log(`${RED}${BOLD}BENCHMARK FAILED${RESET}`); console.log( - `${DIM}SDK bundles exceed size thresholds. Consider optimizing.${RESET}` + `${DIM}SDK bundles exceed size thresholds. Consider optimizing.${RESET}`, ); process.exit(1); } else { diff --git a/scripts/benchmark-validate.ts b/scripts/benchmark-validate.ts index 3764f65..33c3fe1 100644 --- a/scripts/benchmark-validate.ts +++ b/scripts/benchmark-validate.ts @@ -107,7 +107,9 @@ async function main() { if (stats.length === 0) { console.log(`${YELLOW}No load test events found in database${RESET}`); - console.log(`${DIM}Run load tests first: k6 run scripts/load-test.k6.js${RESET}`); + console.log( + `${DIM}Run load tests first: k6 run scripts/load-test.k6.js${RESET}`, + ); await sql.end(); return; } @@ -115,7 +117,7 @@ async function main() { console.log(`${BOLD}Load Test Events${RESET}`); console.log("-".repeat(50)); console.log( - `${"Event Name".padEnd(25)} ${"Count".padStart(10)} ${"Time Range".padStart(12)}` + `${"Event Name".padEnd(25)} ${"Count".padStart(10)} ${"Time Range".padStart(12)}`, ); console.log("-".repeat(50)); @@ -124,14 +126,19 @@ async function main() { const duration = (new Date(stat.latest).getTime() - new Date(stat.earliest).getTime()) / 1000; - const durationStr = duration > 60 ? `${(duration / 60).toFixed(1)}m` : `${duration.toFixed(0)}s`; + const durationStr = + duration > 60 + ? `${(duration / 60).toFixed(1)}m` + : `${duration.toFixed(0)}s`; console.log( - `${stat.event_name.padEnd(25)} ${stat.count.toString().padStart(10)} ${durationStr.padStart(12)}` + `${stat.event_name.padEnd(25)} ${stat.count.toString().padStart(10)} ${durationStr.padStart(12)}`, ); totalEvents += stat.count; } console.log("-".repeat(50)); - console.log(`${BOLD}${"Total".padEnd(25)}${RESET} ${totalEvents.toString().padStart(10)}`); + console.log( + `${BOLD}${"Total".padEnd(25)}${RESET} ${totalEvents.toString().padStart(10)}`, + ); console.log(); // Recent events (last 10 minutes) @@ -149,7 +156,7 @@ async function main() { if (duration > 0) { const throughput = burstEvents.count / duration; console.log( - `${BOLD}Burst Throughput:${RESET} ${throughput.toFixed(1)} events/sec` + `${BOLD}Burst Throughput:${RESET} ${throughput.toFixed(1)} events/sec`, ); } } diff --git a/scripts/load-test-connections.k6.js b/scripts/load-test-connections.k6.js index e36e8d7..63f9e05 100644 --- a/scripts/load-test-connections.k6.js +++ b/scripts/load-test-connections.k6.js @@ -127,8 +127,7 @@ export function handleSummary(data) { connection_time_avg: data.metrics.connection_time?.values?.avg || 0, connection_time_p95: data.metrics.connection_time?.values?.["p(95)"] || 0, connection_time_p99: data.metrics.connection_time?.values?.["p(99)"] || 0, - peak_active: - data.metrics.active_connections?.values?.max || successful, + peak_active: data.metrics.active_connections?.values?.max || successful, }, thresholds: { passed: Object.values(data.thresholds || {}).every((t) => t.ok), diff --git a/scripts/load-test.k6.js b/scripts/load-test.k6.js index b6e851b..b50a055 100644 --- a/scripts/load-test.k6.js +++ b/scripts/load-test.k6.js @@ -100,7 +100,7 @@ export default function () { event: "load_test_burst", props: JSON.stringify({ seq: eventsSent, ts: sendStart }), ts: sendStart, - }) + }), ); eventsSent++; eventsDelivered.add(1); @@ -129,7 +129,7 @@ export default function () { event: "load_test_scaling", props: JSON.stringify({ seq: eventsSent, vu: __VU }), ts: sendStart, - }) + }), ); eventsSent++; eventsDelivered.add(1); @@ -149,7 +149,7 @@ export default function () { type: "identify", userId: `load_user_${__VU}`, traits: JSON.stringify({ loadTest: true, vu: __VU }), - }) + }), ); }, 1000); @@ -194,10 +194,8 @@ export function handleSummary(data) { timestamp: new Date().toISOString(), metrics: { events_delivered: data.metrics.events_delivered?.values?.count || 0, - event_send_time_p95: - data.metrics.event_send_time?.values?.["p(95)"] || 0, - event_send_time_p99: - data.metrics.event_send_time?.values?.["p(99)"] || 0, + event_send_time_p95: data.metrics.event_send_time?.values?.["p(95)"] || 0, + event_send_time_p99: data.metrics.event_send_time?.values?.["p(99)"] || 0, ping_rtt_avg: data.metrics.ping_rtt?.values?.avg || 0, ping_rtt_p95: data.metrics.ping_rtt?.values?.["p(95)"] || 0, connection_time_avg: data.metrics.connection_time?.values?.avg || 0,