diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dfcd988..ec6339b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,6 +30,22 @@ jobs: - run: pnpm install --frozen-lockfile - run: pnpm nx run-many -t typecheck + lint: + name: Lint (module boundaries) + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + - run: pnpm install --frozen-lockfile + # Enforces the app→shared→shared dependency DAG (apps never depend on + # apps; shared depends only on shared) via @nx/enforce-module-boundaries. + - run: pnpm nx run-many -t lint + test: name: Unit Tests runs-on: ubuntu-latest diff --git a/CLAUDE.md b/CLAUDE.md index a82fb93..04c433f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -23,7 +23,7 @@ Keep this managed block so 'openspec update' can refresh the instructions. - **TypeScript only**: Do not create raw `.js` or `.mjs` files unless they serve a config purpose (e.g., `vite.config.mjs`, `eslint.config.mjs`). All project code, scripts, and utilities must be written in TypeScript. - **Nx-native automation**: Release process automation must use Nx extension points (e.g., `VersionActions`, `preVersionCommand`), not npm lifecycle scripts or standalone scripts. - **Agent assets — edit source, then sync**: Agent docs, skills, commands, references, and other agent-related files have their **source of truth in `packages/agents/`**. ALWAYS edit them there, then run `nx run cli:update` to write the changes out to the local project's `.ocr/` directory. Never hand-edit the generated `.ocr/` copies directly — they will be overwritten on the next sync and your edits will drift from source. -- **Shared layers live in `packages/shared/*`, apps never depend on apps**: `cli` and `dashboard` are application packages and MUST NOT depend on one another. Code both apps need (persistence, domain/state, config, cross-platform utilities) lives in dedicated library packages under `packages/shared/*` that each app depends on directly. The current shared packages are `@open-code-review/platform` (cross-platform/runtime utilities), `@open-code-review/persistence` (the `node:sqlite` adapter `db` + workflow `state` lifecycle + `test-support` + `vendor-resume` + the `node:sqlite` runtime precondition `runtime-checks` — kept in **one** package because `db` and `state` have a mutually-recursive *type* cycle (`db/types.ts` ↔ `state/types.ts`); a package boundary between them would form a dependency cycle. The single-module-instance connection-cache singleton is a *consequence* of that co-location, not its root cause), and `@open-code-review/config` (`runtime-config` + `team-config` + `models`). +- **Shared layers live in `packages/shared/*`, apps never depend on apps** (CI-enforced): `cli` and `dashboard` are application packages and MUST NOT depend on one another. This DAG is enforced by `@nx/enforce-module-boundaries` (root `eslint.config.mjs`, keyed off each project's `scope:*` tag) and gated in CI via `nx run-many -t lint` — an accidental `dashboard → cli` (or `shared → app`) import fails the build, not just review. Code both apps need (persistence, domain/state, config, cross-platform utilities) lives in dedicated library packages under `packages/shared/*` that each app depends on directly. The current shared packages are `@open-code-review/platform` (cross-platform/runtime utilities), `@open-code-review/persistence` (the `node:sqlite` adapter `db` + workflow `state` lifecycle + `test-support` + `vendor-resume` + the `node:sqlite` runtime precondition `runtime-checks` — kept in **one** package because `db` and `state` have a mutually-recursive *type* cycle (`db/types.ts` ↔ `state/types.ts`); a package boundary between them would form a dependency cycle. The single-module-instance connection-cache singleton is a *consequence* of that co-location, not its root cause), and `@open-code-review/config` (`runtime-config` + `team-config` + `models`). - **Shared packages are source-only, private, and inlined — never published**: each `packages/shared/*` package mirrors `platform` exactly — `private: true`, `version 0.0.0`, every `exports` condition (`types`/`source`/`default`) points at `./src/*.ts` (no `build.mjs`, no `dist`), and it is declared by its **consumers** as a `devDependency: workspace:*` (consumer-side rule). A shared package still declares its own runtime third-party deps in its `dependencies` — they are inlined into the consumer's bundle, so they must resolve at build time. esbuild inlines the `.ts` source into each app's published bundle, so these packages are **excluded from the release set** (`!packages/shared/*` in `nx.json`) and do not join the fixed `cli`+`agents` release group. Do NOT give a shared package a `build` target or a `dist` — that machinery was removed in the cutover and must not return. - **Graduation is by cause, not by count**: a slice graduates from an app package into a `packages/shared/*` package the moment it is consumed across a package boundary (by the other app, an e2e package, or another shared package) rather than only by its owning app's own code. There is no subpath-count trigger. A genuinely app-internal module stays in its app; the goal is to keep the dependency graph a DAG of `app → shared → shared`, never `app → app`. diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..1f0b38a --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,108 @@ +// Flat ESLint config — SCOPED to exactly ONE job: enforce the module-boundary +// DAG. It is the CI-enforced version of the CLAUDE.md invariant "apps never +// depend on apps; shared depends only on shared" — the app->shared->shared +// (a.k.a. app→shared→shared) DAG, code-review SF#1 — keyed off the `scope:*` +// tags every project.json already carries. +// +// Deliberately minimal: we register ONLY `@nx/enforce-module-boundaries` and no +// typescript-eslint recommended set, so this stays a dependency-graph gate — not +// a repo-wide style lint that would flag thousands of pre-existing issues. Add +// other rules in a separate, intentional change if/when the team wants them. +// +// Single-axis by design: every project carries both `scope:*` and `type:*` tags +// (e.g. type:app / type:e2e / type:util / type:assets), but these constraints +// consume only `scope:*`. That is sufficient for this invariant; future rules +// (e.g. "apps may not depend on tests") can grow into the `type:*` axis. +// +// A behavioral canary (packages/shared/platform/src/__tests__/ +// module-boundary-gate.test.ts) runs ESLint on a planted violation and asserts +// the rule fires — so an option rename, an error->warn downgrade, or a widened +// allow-list cannot silently disarm this gate. + +import nx from '@nx/eslint-plugin' +import tsParser from '@typescript-eslint/parser' +import tsPlugin from '@typescript-eslint/eslint-plugin' +import reactHooks from 'eslint-plugin-react-hooks' + +export default [ + { + ignores: [ + '**/dist/**', + '**/node_modules/**', + '**/coverage/**', + '**/.ocr/**', + '**/vendor/**', + '**/*.config.{js,mjs,cjs,ts,mts,cts}', + // NOTE: agent *assets* (markdown/JSON under packages/agents/{commands, + // skills}) are excluded simply by not matching the `.ts` `files` glob + // below — we deliberately do NOT blanket-ignore `packages/agents/**`, so + // the one real TS file there (release/version-actions.ts) IS boundary- + // checked and a future workspace import from it cannot slip the gate. + ], + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.cts', '**/*.mts'], + languageOptions: { + parser: tsParser, + parserOptions: { sourceType: 'module' }, + }, + // `@nx` carries the boundary rule. `@typescript-eslint` and `react-hooks` + // are registered ONLY so the codebase's existing, intentional inline + // `eslint-disable` directives (e.g. `react-hooks/exhaustive-deps`, + // `@typescript-eslint/no-unused-vars`) resolve to a known rule — their rule + // SUITES are deliberately NOT enabled here. (The lone `no-control-regex` + // directive in persistence is a CORE rule, always defined, so it needs no + // plugin.) `reportUnusedDisableDirectives: 'off'` keeps those now-inert + // suppressions from being flagged; turning the suites on — and re-enabling + // unused-directive reporting — is a separate, intentional change. + plugins: { '@nx': nx, '@typescript-eslint': tsPlugin, 'react-hooks': reactHooks }, + linterOptions: { reportUnusedDisableDirectives: 'off' }, + rules: { + '@nx/enforce-module-boundaries': [ + 'error', + { + // Both options are the rule's defaults, stated explicitly: + // `allow: []` — no per-import escape hatches; `enforceBuildableLib...` + // is irrelevant here (source-only inlined libs, no buildable-lib graph). + enforceBuildableLibDependency: false, + allow: [], + // This gate enforces the dependency *DAG* (app->shared->shared), not + // lazy-load discipline. The CLI intentionally `await import()`s + // `@open-code-review/persistence` on hot paths (e.g. `progress`) to + // defer the `node:sqlite` load while static-importing it elsewhere; + // exempt our workspace libs from the "static import of a lazy-loaded + // library" check so that legitimate mix is not flagged here. Enforcing + // lazy-load consistency is a separate, intentional change. + checkDynamicDependenciesExceptions: ['@open-code-review/.*'], + // NB: the `app -> app` prohibition is enforced by TWO layers — these + // allow-lists AND the rule's `projectType: "application"` default + // (which yields the "Imports of apps are forbidden" message). Today a + // `dashboard -> cli` import trips both; degrading the gate would + // require changing both. The canary test re-validates the combination. + depConstraints: [ + // Shared libraries may depend ONLY on other shared libraries — + // never on an application. Keeps the graph a DAG of app -> shared. + { sourceTag: 'scope:shared', onlyDependOnLibsWithTags: ['scope:shared'] }, + // The CLI app bundles the agent assets and the shared libs; it must + // NOT depend on the dashboard app. (`scope:cli` also covers cli-e2e.) + { + sourceTag: 'scope:cli', + onlyDependOnLibsWithTags: ['scope:cli', 'scope:shared', 'scope:agents'], + }, + // The dashboard app depends on shared libs only; it must NOT depend + // on the CLI app (the inverted edge this PR's predecessor removed). + // (`scope:dashboard` also covers dashboard-{api,ui}-e2e.) + { + sourceTag: 'scope:dashboard', + onlyDependOnLibsWithTags: ['scope:dashboard', 'scope:shared'], + }, + // Agent assets are leaf content — no workspace dependencies. + { sourceTag: 'scope:agents', onlyDependOnLibsWithTags: ['scope:agents'] }, + // e2e packages currently share their target app's `scope:*`; introduce + // a `scope:e2e` tag + constraint here if they ever need distinct rules. + ], + }, + ], + }, + }, +] diff --git a/nx.json b/nx.json index 700e1f8..db35296 100644 --- a/nx.json +++ b/nx.json @@ -1,6 +1,14 @@ { "$schema": "./node_modules/nx/schemas/nx-schema.json", "defaultBase": "main", + "plugins": [ + { + "plugin": "@nx/eslint/plugin", + "options": { + "targetName": "lint" + } + } + ], "namedInputs": { "default": [ "{projectRoot}/**/*", diff --git a/package.json b/package.json index 491772e..28d94b8 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,8 @@ "devDependencies": { "@nx/devkit": "^22.0.0", "@nx/esbuild": "^22.0.0", + "@nx/eslint": "^22.0.0", + "@nx/eslint-plugin": "^22.0.0", "@nx/js": "^22.0.0", "@nx/playwright": "^22.6.4", "@nx/vitest": "^22.6.4", @@ -35,8 +37,12 @@ "@swc-node/register": "^1.11.1", "@swc/core": "^1.15.18", "@types/node": "^22.10.5", + "@typescript-eslint/eslint-plugin": "^8", + "@typescript-eslint/parser": "^8", "@vitest/coverage-v8": "^3.0.0", "esbuild": "^0.24.0", + "eslint": "^9", + "eslint-plugin-react-hooks": "^5", "nx": "^22.0.0", "tsx": "^4.19.0", "typescript": "^5.7.3", diff --git a/packages/shared/platform/src/__tests__/module-boundary-gate.test.ts b/packages/shared/platform/src/__tests__/module-boundary-gate.test.ts new file mode 100644 index 0000000..3b17ffb --- /dev/null +++ b/packages/shared/platform/src/__tests__/module-boundary-gate.test.ts @@ -0,0 +1,79 @@ +/** + * Fitness-function self-test (code-review SF#1): proves the module-boundary gate + * (`@nx/enforce-module-boundaries`, root `eslint.config.mjs`) is actually ARMED. + * + * A lint gate verified only by hand at authoring time can silently rot back into + * a no-op — a `@nx/eslint-plugin` option rename, an `error` -> `warn` downgrade, + * a widened `allow`, or a `projectType` change could leave CI green while the gate + * does nothing. This test runs the REAL ESLint over a planted forbidden import + * (`dashboard -> cli`, the exact inverted edge a predecessor PR removed) and + * asserts it fails — and that a legal `dashboard -> shared` import passes. + * + * It spawns ESLint via `node ` (not `.bin/eslint`) so it is robust on + * Windows too, where the unit suite also runs. + */ + +import { execFileSync } from 'node:child_process' +import { createRequire } from 'node:module' +import { writeFileSync, rmSync } from 'node:fs' +import { dirname, join, resolve } from 'node:path' +import { describe, it, expect } from 'vitest' + +const require = createRequire(import.meta.url) +const REPO_ROOT = resolve(import.meta.dirname, '../../../../..') +// eslint's `exports` map blocks `require.resolve('eslint/bin/eslint.js')`; +// derive it from the (exported) package.json, falling back to the hoisted path. +function resolveEslintEntry(): string { + try { + return join(dirname(require.resolve('eslint/package.json')), 'bin/eslint.js') + } catch { + return resolve(REPO_ROOT, 'node_modules/eslint/bin/eslint.js') + } +} +const ESLINT_JS = resolveEslintEntry() + +// Planted files must live inside a tagged application project so the boundary +// rule resolves their source project (here: the dashboard app, `scope:dashboard`). +const DASHBOARD_SRC = resolve(REPO_ROOT, 'packages/dashboard/src/server') + +type LintResult = { code: number; output: string } + +function lintSnippet(fileName: string, contents: string): LintResult { + const file = join(DASHBOARD_SRC, fileName) + writeFileSync(file, contents) + try { + execFileSync(process.execPath, [ESLINT_JS, file], { + cwd: REPO_ROOT, + stdio: 'pipe', + env: { ...process.env, NX_DAEMON: 'false' }, + }) + return { code: 0, output: '' } + } catch (err) { + const e = err as { status?: number; stdout?: Buffer; stderr?: Buffer } + return { + code: e.status ?? 1, + output: `${e.stdout?.toString() ?? ''}\n${e.stderr?.toString() ?? ''}`, + } + } finally { + rmSync(file, { force: true }) + } +} + +describe('module-boundary gate is armed', () => { + it('FAILS on a forbidden app->app import (dashboard -> cli)', () => { + const result = lintSnippet( + '__boundary_canary_violation__.ts', + "import '@open-code-review/cli'\nexport {}\n", + ) + expect(result.code).not.toBe(0) + expect(result.output).toMatch(/enforce-module-boundaries/) + }, 60_000) + + it('PASSES on a legal app->shared import (dashboard -> platform)', () => { + const result = lintSnippet( + '__boundary_canary_ok__.ts', + "import '@open-code-review/platform'\nexport {}\n", + ) + expect(result.code, result.output).toBe(0) + }, 60_000) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 031b445..787e34e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,12 +14,18 @@ importers: '@nx/esbuild': specifier: ^22.0.0 version: 22.4.1(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(esbuild@0.24.2)(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) + '@nx/eslint': + specifier: ^22.0.0 + version: 22.6.4(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@zkochan/js-yaml@0.0.7)(eslint@9.39.4(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) + '@nx/eslint-plugin': + specifier: ^22.0.0 + version: 22.4.5(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))(typescript@5.9.3) '@nx/js': specifier: ^22.0.0 version: 22.4.1(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) '@nx/playwright': specifier: ^22.6.4 - version: 22.6.4(@babel/traverse@7.29.0)(@playwright/test@1.59.1)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@zkochan/js-yaml@0.0.7)(eslint@10.1.0(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) + version: 22.6.4(@babel/traverse@7.29.0)(@playwright/test@1.59.1)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@zkochan/js-yaml@0.0.7)(eslint@9.39.4(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) '@nx/vitest': specifier: ^22.6.4 version: 22.6.4(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.3)) @@ -35,12 +41,24 @@ importers: '@types/node': specifier: ^22.10.5 version: 22.19.7 + '@typescript-eslint/eslint-plugin': + specifier: ^8 + version: 8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8 + version: 8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-v8': specifier: ^3.0.0 version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.3)) esbuild: specifier: ^0.24.0 version: 0.24.2 + eslint: + specifier: ^9 + version: 9.39.4(jiti@2.6.1) + eslint-plugin-react-hooks: + specifier: ^5 + version: 5.2.0(eslint@9.39.4(jiti@2.6.1)) nx: specifier: ^22.0.0 version: 22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18) @@ -1337,25 +1355,33 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.23.3': - resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.5.3': - resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.1.1': - resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@3.0.3': - resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.6.1': - resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -1574,6 +1600,11 @@ packages: peerDependencies: nx: '>= 21 <= 23 || ^22.0.0-0' + '@nx/devkit@22.4.5': + resolution: {integrity: sha512-mw5G6k/XTkL675eVIcFpyZdfdIc3wQMSSGWzfA6tQGmANDYc/NFGeZR9wDqXDceHXnYKoRO6g6GhKTOHUCW23Q==} + peerDependencies: + nx: '>= 21 <= 23 || ^22.0.0-0' + '@nx/devkit@22.6.1': resolution: {integrity: sha512-/mwG9zWY1phsWvMKzP0yZ4pE6aH0kLH31DuCYj4eLbhuUu0STL3xSdjPPzhDHf71R4K3YnuvG97e2qiGDbG5Qw==} peerDependencies: @@ -1592,6 +1623,15 @@ packages: esbuild: optional: true + '@nx/eslint-plugin@22.4.5': + resolution: {integrity: sha512-Kb3owVrbhRkJAjqEDsgDs8eSlI2/uEFOS35a8Z1drHIpMF6Zt9OHQf6bKELeXzG3fC2AGM3pyunauhbJ/ZmqMw==} + peerDependencies: + '@typescript-eslint/parser': ^6.13.2 || ^7.0.0 || ^8.0.0 + eslint-config-prettier: ^10.0.0 + peerDependenciesMeta: + eslint-config-prettier: + optional: true + '@nx/eslint@22.6.4': resolution: {integrity: sha512-J1MS4INO1ZK2InIhg/qBgCLu7jmkxf+FAgDpQo2XqLJQ69RcwRRiG7oArrbYc4tRSIs67iANYDPmkcy9JO1zQg==} peerDependencies: @@ -1609,6 +1649,14 @@ packages: verdaccio: optional: true + '@nx/js@22.4.5': + resolution: {integrity: sha512-t8972z2uF6X5i4FFmTlnvSwwxfHkk87zBpKQK0yMH5CzOENViVFNbiPnbvCIJcGNrgVUSALL3f2ngwKcTZObmA==} + peerDependencies: + verdaccio: ^6.0.5 + peerDependenciesMeta: + verdaccio: + optional: true + '@nx/js@22.6.4': resolution: {integrity: sha512-5437z2lHT1Xq+xuzn9WjcaYcUnTh6qHfICO6d/rY6n9x34pYYTNdNPdabekL1pEEAeKcFAh6fCV7O8E8vIFBLQ==} peerDependencies: @@ -1622,6 +1670,11 @@ packages: cpu: [arm64] os: [darwin] + '@nx/nx-darwin-arm64@22.4.5': + resolution: {integrity: sha512-zdRHZv1AMvzgp+5g2VZNXXuqk0/n1wOFksOeZ6BRyKg6hC2YkjGyn5xle/UK668MDAwe9KKm4jizvztK/LlPuA==} + cpu: [arm64] + os: [darwin] + '@nx/nx-darwin-arm64@22.6.4': resolution: {integrity: sha512-KuUQ9t8pxIO+Px1kbjA0XDLOU6XoAsijl0ssIMRYN1w5ly+0k/KglWt7qgwDockkaLRHkQ3YSR8I2LJXJE+Vig==} cpu: [arm64] @@ -1632,6 +1685,11 @@ packages: cpu: [x64] os: [darwin] + '@nx/nx-darwin-x64@22.4.5': + resolution: {integrity: sha512-1NVWaSgpa8yawi2UILX4NE9UcMuNzAAGh95JSV2yJovRfKxFQgQSB6hj0gpJu+TLLVCroTqy4woSQ2a0SPodeQ==} + cpu: [x64] + os: [darwin] + '@nx/nx-darwin-x64@22.6.4': resolution: {integrity: sha512-FB2XL2+ixbRI1fddz4oW+9MhoJASoTD8Ai4q5+B1OUPftgarIPLxaqI8TWba30Bos2AiYDofMJPf9uhBmLDH5Q==} cpu: [x64] @@ -1642,6 +1700,11 @@ packages: cpu: [x64] os: [freebsd] + '@nx/nx-freebsd-x64@22.4.5': + resolution: {integrity: sha512-baaLz53wr/HsVfSJ7ZgIFCPAb/OtP7yPPasb3eIu65oVhSswGfgvz9+YINhuInUgW7x7STmRnhGeR8pj6iqFqw==} + cpu: [x64] + os: [freebsd] + '@nx/nx-freebsd-x64@22.6.4': resolution: {integrity: sha512-qNsXhlflc77afjcRKCn7bqI8l/HPEjKhQRFs8wfKbAfNw3XEASc0EZtBV/TStLGV6PEZQldVBaId5FBMp8GW6Q==} cpu: [x64] @@ -1652,6 +1715,11 @@ packages: cpu: [arm] os: [linux] + '@nx/nx-linux-arm-gnueabihf@22.4.5': + resolution: {integrity: sha512-wRBPv/l39tz+sQjZUH4hygCsd/DoUXUbDYkR6lnNXWHAVyPUh48/27JozM8hD3o/G3O2Vd8PFQasIXtvy2GS0Q==} + cpu: [arm] + os: [linux] + '@nx/nx-linux-arm-gnueabihf@22.6.4': resolution: {integrity: sha512-rjfnii0xGe8SQqsO/DDHeJSjbqp2H5fOEgZlaYXDGOwQeLZ1TQplEdx8hyI/ErAUwVO3YHnzoMtmachBQOlspw==} cpu: [arm] @@ -1662,6 +1730,11 @@ packages: cpu: [arm64] os: [linux] + '@nx/nx-linux-arm64-gnu@22.4.5': + resolution: {integrity: sha512-6B/yCFiqjvV2Bkz6MKUtfFWjwtiF53DN07K1BFksMpQef+h2yE1IrGaG/OCl6VaVl4VRzQgLOluqP96M1yhDgg==} + cpu: [arm64] + os: [linux] + '@nx/nx-linux-arm64-gnu@22.6.4': resolution: {integrity: sha512-x6Zim1STewCXuHBCgoy2TO0586UlwH4RNCobn0mTiPd1jt7nU+fNqo3SpY8RzY1KmBfgcO48BBrfykPE9YWMpg==} cpu: [arm64] @@ -1672,6 +1745,11 @@ packages: cpu: [arm64] os: [linux] + '@nx/nx-linux-arm64-musl@22.4.5': + resolution: {integrity: sha512-n0v60vRYn7BDHWB588snPZntLO2XC8/pvLd+QunneM2VGEPf51n5llX5U3AwTt/ybaZHWhbuHv0sJBIbT4I0GA==} + cpu: [arm64] + os: [linux] + '@nx/nx-linux-arm64-musl@22.6.4': resolution: {integrity: sha512-vYOqdgXIhtHFWdtnonp/jFfmfkyNPTu1JEdXuJpSxwUQdV2dWqS/l3HVPVWHXDrVKofPafK3M72jMvoWoaOQ6g==} cpu: [arm64] @@ -1682,6 +1760,11 @@ packages: cpu: [x64] os: [linux] + '@nx/nx-linux-x64-gnu@22.4.5': + resolution: {integrity: sha512-zT7nb1PRE3NcW/HFnbgKJ9ZPtCOeVDpbJ5J4ZhHj36ZAUWZVXFEIPq9VTIZFy5+0pioLUIClQQY7OUfwnV/Zig==} + cpu: [x64] + os: [linux] + '@nx/nx-linux-x64-gnu@22.6.4': resolution: {integrity: sha512-UfWUDlOzlvQNVa1mnqOFxzvUwoGfM2o9ruhwYRoFm3XJbVYnjINyQsdcHwwDJItJP04LZzLPxA1+O8sU+Oqg6A==} cpu: [x64] @@ -1692,6 +1775,11 @@ packages: cpu: [x64] os: [linux] + '@nx/nx-linux-x64-musl@22.4.5': + resolution: {integrity: sha512-r8Rls5BS7lGQbUNX1Z1S370XrOacOU1bQ/dxY8i7qahFQKnMwpFo0W8odhgzjk+vrC/WLf9jOgz5/JPzehQBIw==} + cpu: [x64] + os: [linux] + '@nx/nx-linux-x64-musl@22.6.4': resolution: {integrity: sha512-dwXpcyin4ScD5gH9FdhiNnOqFXclXLFBDTyRCEOlRUbOPayF9YEcH0PPIf9uWmwP3tshhAdr5sg9DLN+r7M3xg==} cpu: [x64] @@ -1702,6 +1790,11 @@ packages: cpu: [arm64] os: [win32] + '@nx/nx-win32-arm64-msvc@22.4.5': + resolution: {integrity: sha512-Lv81LTnG6sSvBOq2vDSeyfzpF9X0cTGlJdzJOJzPZXCZGFhTV1ig9TdLiij/GM2JwV4Kvq5Co6YzA5dxtGUphQ==} + cpu: [arm64] + os: [win32] + '@nx/nx-win32-arm64-msvc@22.6.4': resolution: {integrity: sha512-KqjJbFWhKJaKjET3Ep8hltXPizO0EstF4yfmp3oepWVn11poagc2MT1pf/tnRf6cdD88wd0bmw/83Ng6WUQ3Uw==} cpu: [arm64] @@ -1712,6 +1805,11 @@ packages: cpu: [x64] os: [win32] + '@nx/nx-win32-x64-msvc@22.4.5': + resolution: {integrity: sha512-52RfBcq9PXt76soCAZAJcNmCYrdsg6BvhBmjf0IFTMZ8IaeqZ9ktxAy1TZf/gCkOaM3ly4htbYMStiZ4MHX7Eg==} + cpu: [x64] + os: [win32] + '@nx/nx-win32-x64-msvc@22.6.4': resolution: {integrity: sha512-CIL9m6uilGGr/eU+41/+aVWUnEcq+j1EDynUX2A4InLTbAN0ylte4Af+72mvipNiqJgDkjKaNzOCQDnp8QBjEQ==} cpu: [x64] @@ -1739,6 +1837,9 @@ packages: '@nx/workspace@22.4.1': resolution: {integrity: sha512-aaOLAsO8/0akXXUXQr0tZBwd/PDaqdfdxKHKB8LHD53XtkugAp/ceRpmWh1ZiSNT5JSYYCKmchBkqTKBhY9QbQ==} + '@nx/workspace@22.4.5': + resolution: {integrity: sha512-QGapABrqBnRpEWbnd5UpbVCBzsYD+RlC1lWShXPpCM+dosR3qkGb+pSmxeSCsKbNVtCwYyyuRW+PvlF5Q5sU9A==} + '@nx/workspace@22.6.4': resolution: {integrity: sha512-7t7sEjTjhINUC2aOze0K/hLuK6s6lyg+mH+/dSnkePfMVauZoodxhknHwZ3n50+lW9jyYEd7GqeiXn45TqpTpQ==} @@ -2314,9 +2415,6 @@ packages: '@types/esquery@1.5.4': resolution: {integrity: sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA==} - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -2382,6 +2480,65 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript-eslint/eslint-plugin@8.61.0': + resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.61.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.61.0': + resolution: {integrity: sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.61.0': + resolution: {integrity: sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.61.0': + resolution: {integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.61.0': + resolution: {integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.61.0': + resolution: {integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.61.0': + resolution: {integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.61.0': + resolution: {integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.61.0': + resolution: {integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.61.0': + resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher @@ -2579,6 +2736,9 @@ packages: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} @@ -2738,9 +2898,15 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -3147,21 +3313,31 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + 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-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.1.0: - resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' @@ -3169,9 +3345,13 @@ packages: jiti: optional: true - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -3339,6 +3519,14 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -3569,6 +3757,10 @@ packages: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + hasBin: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -3591,6 +3783,10 @@ packages: engines: {node: '>=6'} hasBin: true + jsonc-eslint-parser@2.4.2: + resolution: {integrity: sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} @@ -3705,6 +3901,9 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -3931,6 +4130,9 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} @@ -3993,6 +4195,18 @@ packages: '@swc/core': optional: true + nx@22.4.5: + resolution: {integrity: sha512-l68kzhnemXXGCDS9/W8eccZ7Bzse9pw1oJ466pzDM89MbA6hEaOQ0p+eDXZI++iWl0T+lYJ56EDhO23syKzt9g==} + hasBin: true + peerDependencies: + '@swc-node/register': ^1.8.0 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + nx@22.6.4: resolution: {integrity: sha512-WEaCnLKeO9RhQAOBMfXgYO/Lx5wL4ARCtRGiYCjJtAJIZ5kcVn4uPKL2Xz1xekpF7ef/+YNrUQSrblx47Ms9Rg==} hasBin: true @@ -4463,6 +4677,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} @@ -4545,6 +4763,12 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -6481,34 +6705,50 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': dependencies: - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.3': + '@eslint/config-array@0.21.2': dependencies: - '@eslint/object-schema': 3.0.3 + '@eslint/object-schema': 2.1.7 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.3': + '@eslint/config-helpers@0.4.2': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 0.17.0 - '@eslint/core@1.1.1': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/object-schema@3.0.3': {} + '@eslint/eslintrc@3.3.5': + dependencies: + ajv: 6.14.0 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.2.0 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.4': {} - '@eslint/plugin-kit@0.6.1': + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 0.17.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -6729,6 +6969,28 @@ snapshots: tslib: 2.8.1 yargs-parser: 21.1.1 + '@nx/devkit@22.4.5(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))': + dependencies: + '@zkochan/js-yaml': 0.0.7 + ejs: 3.1.10 + enquirer: 2.3.6 + minimatch: 10.1.1 + nx: 22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18) + semver: 7.7.3 + tslib: 2.8.1 + yargs-parser: 21.1.1 + + '@nx/devkit@22.4.5(nx@22.4.5(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))': + dependencies: + '@zkochan/js-yaml': 0.0.7 + ejs: 3.1.10 + enquirer: 2.3.6 + minimatch: 10.1.1 + nx: 22.4.5(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18) + semver: 7.7.3 + tslib: 2.8.1 + yargs-parser: 21.1.1 + '@nx/devkit@22.6.1(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))': dependencies: '@zkochan/js-yaml': 0.0.7 @@ -6781,11 +7043,36 @@ snapshots: - supports-color - verdaccio - '@nx/eslint@22.6.4(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@zkochan/js-yaml@0.0.7)(eslint@10.1.0(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))': + '@nx/eslint-plugin@22.4.5(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))(typescript@5.9.3)': + dependencies: + '@nx/devkit': 22.4.5(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) + '@nx/js': 22.4.5(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) + '@phenomnomnominal/tsquery': 6.1.4(typescript@5.9.3) + '@typescript-eslint/parser': 8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + chalk: 4.1.2 + confusing-browser-globals: 1.0.11 + globals: 15.15.0 + jsonc-eslint-parser: 2.4.2 + semver: 7.7.3 + tslib: 2.8.1 + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - debug + - eslint + - nx + - supports-color + - typescript + - verdaccio + + '@nx/eslint@22.6.4(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@zkochan/js-yaml@0.0.7)(eslint@9.39.4(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))': dependencies: '@nx/devkit': 22.6.4(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) '@nx/js': 22.6.4(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) - eslint: 10.1.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) semver: 7.7.3 tslib: 2.8.1 typescript: 5.9.3 @@ -6836,6 +7123,42 @@ snapshots: - nx - supports-color + '@nx/js@22.4.5(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-proposal-decorators': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.29.0) + '@babel/preset-env': 7.28.6(@babel/core@7.29.0) + '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) + '@babel/runtime': 7.28.6 + '@nx/devkit': 22.4.5(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) + '@nx/workspace': 22.4.5(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18) + '@zkochan/js-yaml': 0.0.7 + babel-plugin-const-enum: 1.2.0(@babel/core@7.29.0) + babel-plugin-macros: 3.1.0 + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.29.0)(@babel/traverse@7.29.0) + chalk: 4.1.2 + columnify: 1.6.0 + detect-port: 1.6.1 + ignore: 5.3.2 + js-tokens: 4.0.0 + jsonc-parser: 3.2.0 + npm-run-path: 4.0.1 + picocolors: 1.1.1 + picomatch: 4.0.2 + semver: 7.7.3 + source-map-support: 0.5.19 + tinyglobby: 0.2.15 + tslib: 2.8.1 + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - debug + - nx + - supports-color + '@nx/js@22.6.4(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))': dependencies: '@babel/core': 7.29.0 @@ -6875,67 +7198,97 @@ snapshots: '@nx/nx-darwin-arm64@22.4.1': optional: true + '@nx/nx-darwin-arm64@22.4.5': + optional: true + '@nx/nx-darwin-arm64@22.6.4': optional: true '@nx/nx-darwin-x64@22.4.1': optional: true + '@nx/nx-darwin-x64@22.4.5': + optional: true + '@nx/nx-darwin-x64@22.6.4': optional: true '@nx/nx-freebsd-x64@22.4.1': optional: true + '@nx/nx-freebsd-x64@22.4.5': + optional: true + '@nx/nx-freebsd-x64@22.6.4': optional: true '@nx/nx-linux-arm-gnueabihf@22.4.1': optional: true + '@nx/nx-linux-arm-gnueabihf@22.4.5': + optional: true + '@nx/nx-linux-arm-gnueabihf@22.6.4': optional: true '@nx/nx-linux-arm64-gnu@22.4.1': optional: true + '@nx/nx-linux-arm64-gnu@22.4.5': + optional: true + '@nx/nx-linux-arm64-gnu@22.6.4': optional: true '@nx/nx-linux-arm64-musl@22.4.1': optional: true + '@nx/nx-linux-arm64-musl@22.4.5': + optional: true + '@nx/nx-linux-arm64-musl@22.6.4': optional: true '@nx/nx-linux-x64-gnu@22.4.1': optional: true + '@nx/nx-linux-x64-gnu@22.4.5': + optional: true + '@nx/nx-linux-x64-gnu@22.6.4': optional: true '@nx/nx-linux-x64-musl@22.4.1': optional: true + '@nx/nx-linux-x64-musl@22.4.5': + optional: true + '@nx/nx-linux-x64-musl@22.6.4': optional: true '@nx/nx-win32-arm64-msvc@22.4.1': optional: true + '@nx/nx-win32-arm64-msvc@22.4.5': + optional: true + '@nx/nx-win32-arm64-msvc@22.6.4': optional: true '@nx/nx-win32-x64-msvc@22.4.1': optional: true + '@nx/nx-win32-x64-msvc@22.4.5': + optional: true + '@nx/nx-win32-x64-msvc@22.6.4': optional: true - '@nx/playwright@22.6.4(@babel/traverse@7.29.0)(@playwright/test@1.59.1)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@zkochan/js-yaml@0.0.7)(eslint@10.1.0(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))': + '@nx/playwright@22.6.4(@babel/traverse@7.29.0)(@playwright/test@1.59.1)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@zkochan/js-yaml@0.0.7)(eslint@9.39.4(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18))': dependencies: '@nx/devkit': 22.6.4(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) - '@nx/eslint': 22.6.4(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@zkochan/js-yaml@0.0.7)(eslint@10.1.0(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) + '@nx/eslint': 22.6.4(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(@zkochan/js-yaml@0.0.7)(eslint@9.39.4(jiti@2.6.1))(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) '@nx/js': 22.6.4(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)(nx@22.4.1(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) minimatch: 10.2.4 tslib: 2.8.1 @@ -6988,6 +7341,22 @@ snapshots: - '@swc/core' - debug + '@nx/workspace@22.4.5(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)': + dependencies: + '@nx/devkit': 22.4.5(nx@22.4.5(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) + '@zkochan/js-yaml': 0.0.7 + chalk: 4.1.2 + enquirer: 2.3.6 + nx: 22.4.5(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18) + picomatch: 4.0.2 + semver: 7.7.3 + tslib: 2.8.1 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + '@nx/workspace@22.6.4(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)': dependencies: '@nx/devkit': 22.6.4(nx@22.6.4(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18)) @@ -7491,8 +7860,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - '@types/esrecurse@4.3.1': {} - '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -7562,6 +7929,97 @@ snapshots: '@types/unist@3.0.3': {} + '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.61.0 + '@typescript-eslint/type-utils': 8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.61.0 + eslint: 9.39.4(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.61.0 + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.61.0 + debug: 4.4.3 + eslint: 9.39.4(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.61.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@5.9.3) + '@typescript-eslint/types': 8.61.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.61.0': + dependencies: + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/visitor-keys': 8.61.0 + + '@typescript-eslint/tsconfig-utils@8.61.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.4(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.61.0': {} + + '@typescript-eslint/typescript-estree@8.61.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.61.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@5.9.3) + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/visitor-keys': 8.61.0 + debug: 4.4.3 + minimatch: 10.2.4 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.61.0 + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) + eslint: 9.39.4(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.61.0': + dependencies: + '@typescript-eslint/types': 8.61.0 + eslint-visitor-keys: 5.0.1 + '@ungap/structured-clone@1.3.0': {} '@vitejs/plugin-react@5.1.4(vite@6.4.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.3))': @@ -7843,6 +8301,11 @@ snapshots: transitivePeerDependencies: - supports-color + brace-expansion@1.1.15: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -7988,8 +8451,12 @@ snapshots: commander@8.3.0: {} + concat-map@0.0.1: {} + confbox@0.1.8: {} + confusing-browser-globals@1.0.11: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -8475,36 +8942,43 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-scope@9.1.2: + eslint-plugin-react-hooks@5.2.0(eslint@9.39.4(jiti@2.6.1)): + dependencies: + eslint: 9.39.4(jiti@2.6.1) + + eslint-scope@8.4.0: dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} - eslint@10.1.0(jiti@2.6.1): + eslint@9.39.4(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.3 - '@eslint/config-helpers': 0.5.3 - '@eslint/core': 1.1.1 - '@eslint/plugin-kit': 0.6.1 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 ajv: 6.14.0 + chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -8515,7 +8989,8 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.4 + lodash.merge: 4.6.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -8523,11 +8998,17 @@ snapshots: transitivePeerDependencies: - supports-color - espree@11.2.0: + espree@10.4.0: dependencies: acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 5.0.1 + eslint-visitor-keys: 4.2.1 + + espree@9.6.1: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -8713,6 +9194,10 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + globals@14.0.0: {} + + globals@15.15.0: {} + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -8927,6 +9412,10 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -8939,6 +9428,13 @@ snapshots: json5@2.2.3: {} + jsonc-eslint-parser@2.4.2: + dependencies: + acorn: 8.16.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.7.3 + jsonc-parser@3.2.0: {} katex@0.16.33: @@ -9029,6 +9525,8 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.merge@4.6.2: {} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 @@ -9480,6 +9978,10 @@ snapshots: dependencies: brace-expansion: 5.0.4 + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.15 + minimatch@5.1.6: dependencies: brace-expansion: 2.0.2 @@ -9572,6 +10074,59 @@ snapshots: transitivePeerDependencies: - debug + nx@22.4.5(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18): + dependencies: + '@napi-rs/wasm-runtime': 0.2.4 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.2 + '@zkochan/js-yaml': 0.0.7 + axios: 1.13.3 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 8.0.1 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + enquirer: 2.3.6 + figures: 3.2.0 + flat: 5.0.2 + front-matter: 4.0.2 + ignore: 7.0.5 + jest-diff: 30.2.0 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.3 + minimatch: 10.1.1 + node-machine-id: 1.1.12 + npm-run-path: 4.0.1 + open: 8.4.2 + ora: 5.3.0 + resolve.exports: 2.0.3 + semver: 7.7.3 + string-width: 4.2.3 + tar-stream: 2.2.0 + tmp: 0.2.5 + tree-kill: 1.2.2 + tsconfig-paths: 4.2.0 + tslib: 2.8.1 + yaml: 2.8.3 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 22.4.5 + '@nx/nx-darwin-x64': 22.4.5 + '@nx/nx-freebsd-x64': 22.4.5 + '@nx/nx-linux-arm-gnueabihf': 22.4.5 + '@nx/nx-linux-arm64-gnu': 22.4.5 + '@nx/nx-linux-arm64-musl': 22.4.5 + '@nx/nx-linux-x64-gnu': 22.4.5 + '@nx/nx-linux-x64-musl': 22.4.5 + '@nx/nx-win32-arm64-msvc': 22.4.5 + '@nx/nx-win32-x64-msvc': 22.4.5 + '@swc-node/register': 1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3) + '@swc/core': 1.15.18 + transitivePeerDependencies: + - debug + nx@22.6.4(@swc-node/register@1.11.1(@swc/core@1.15.18)(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.18): dependencies: '@ltd/j-toml': 1.38.0 @@ -10211,6 +10766,8 @@ snapshots: strip-bom@3.0.0: {} + strip-json-comments@3.1.1: {} + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 @@ -10278,6 +10835,10 @@ snapshots: trough@2.2.0: {} + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-dedent@2.2.0: {} tsconfig-paths@4.2.0: