Barazo lexicon schemas and TypeScript types barazo.forum
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore(lexicons): P2.9 prettier, lint-staged, husky, and Copilot setup (#22)

* chore(lexicons): add prettier, lint-staged, husky hooks, and commitlint

Add prettier, lint-staged, husky, and commitlint as devDependencies
using pnpm catalog references. Add format/format:check scripts and husky
prepare script. Create prettier config (matching workspace standard),
lint-staged config, commitlint config, prettierignore, and husky
pre-commit/commit-msg hooks for conventional commit enforcement.

* chore(lexicons): add copilot-setup-steps.yml for AI coding agents

Add GitHub Copilot coding agent setup workflow with pnpm install,
typecheck, and test steps. Enables AI agents to work on the lexicons
repo with proper build and test infrastructure.

* fix(lexicons): add prettier and lint-staged to standalone CI catalog

Add prettier and lint-staged version entries to the per-repo
pnpm-workspace.yaml catalog so pnpm install works in standalone CI
environments (without the workspace root).

* fix(lexicons): regenerate lockfile for catalog: specifiers

The lockfile was out of date after adding devDependencies with
catalog: references. Regenerated to include @commitlint/cli,
@commitlint/config-conventional, husky, lint-staged, and prettier.

authored by

Guido X Jansen and committed by
GitHub
97ffcd69 48d8eb9f

+3231 -1357
+4
.github/SECURITY.md
··· 27 27 barazo-lexicons defines AT Protocol lexicon schemas and generates TypeScript types. The following areas are in scope for security reports: 28 28 29 29 ### Schema Validation 30 + 30 31 - **Schema bypass** -- crafted AT Protocol records that pass lexicon validation but contain malicious or unexpected data 31 32 - **Type generation flaws** -- generated TypeScript types that are more permissive than the lexicon schema allows, enabling invalid data to pass type checks 32 33 - **Missing constraints** -- fields that should have length limits, pattern restrictions, or enum constraints but don't 33 34 34 35 ### Supply Chain 36 + 35 37 - **npm package tampering** -- the published `@barazo-forum/lexicons` package containing code or types not present in the source repo 36 38 - **Build script injection** -- malicious code in the type generation pipeline that could execute during `npm install` or build 37 39 - **Dependency confusion** -- packages with similar names that could be installed instead of the legitimate package 38 40 39 41 ### AT Protocol Compliance 42 + 40 43 - **Namespace violations** -- schemas using namespaces outside `forum.barazo.*` that could conflict with other AT Protocol applications 41 44 - **Record size abuse** -- schemas that permit records large enough to cause storage or processing issues in downstream consumers (AppView, PDS) 42 45 ··· 51 54 ## Disclosure Policy 52 55 53 56 We follow responsible disclosure: 57 + 54 58 - 90 days before public disclosure 55 59 - Credit given to reporter (if desired) 56 60 - CVE assigned when applicable
+13 -13
.github/dependabot.yml
··· 1 1 version: 2 2 2 updates: 3 3 # Keep GitHub Actions pinned SHAs up-to-date 4 - - package-ecosystem: "github-actions" 5 - directory: "/" 4 + - package-ecosystem: 'github-actions' 5 + directory: '/' 6 6 schedule: 7 - interval: "weekly" 7 + interval: 'weekly' 8 8 open-pull-requests-limit: 5 9 9 labels: 10 - - "dependencies" 11 - - "ci" 10 + - 'dependencies' 11 + - 'ci' 12 12 13 13 # Enable security updates for npm dependencies 14 - - package-ecosystem: "npm" 15 - directory: "/" 14 + - package-ecosystem: 'npm' 15 + directory: '/' 16 16 schedule: 17 - interval: "weekly" 17 + interval: 'weekly' 18 18 # Automatically create PRs for security updates 19 19 open-pull-requests-limit: 10 20 20 # Group minor and patch updates 21 21 groups: 22 22 dependencies: 23 23 patterns: 24 - - "*" 24 + - '*' 25 25 update-types: 26 - - "minor" 27 - - "patch" 26 + - 'minor' 27 + - 'patch' 28 28 # Auto-label PRs 29 29 labels: 30 - - "dependencies" 31 - - "security" 30 + - 'dependencies' 31 + - 'security'
+2 -2
.github/workflows/cla.yml
··· 1 - name: "CLA Assistant" 1 + name: 'CLA Assistant' 2 2 on: 3 3 issue_comment: 4 4 types: [created] ··· 15 15 cla: 16 16 runs-on: ubuntu-latest 17 17 steps: 18 - - name: "CLA Assistant" 18 + - name: 'CLA Assistant' 19 19 if: (github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA' || github.event_name == 'pull_request_target') 20 20 uses: contributor-assistant/github-action@ca4a40a7d1004f18d9960b404b97e5f30a505a08 # v2.6.1 21 21 env:
+28
.github/workflows/copilot-setup-steps.yml
··· 1 + name: 'Copilot Setup Steps' 2 + 3 + on: 4 + workflow_dispatch: 5 + push: 6 + paths: 7 + - .github/workflows/copilot-setup-steps.yml 8 + pull_request: 9 + paths: 10 + - .github/workflows/copilot-setup-steps.yml 11 + 12 + jobs: 13 + copilot-setup-steps: 14 + runs-on: ubuntu-latest 15 + permissions: 16 + contents: read 17 + steps: 18 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 19 + - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 20 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 21 + with: 22 + node-version: 24 23 + - name: Install dependencies 24 + run: pnpm install 25 + - name: Typecheck 26 + run: pnpm typecheck 27 + - name: Test 28 + run: pnpm test
+3 -3
.github/workflows/publish.yml
··· 3 3 on: 4 4 push: 5 5 tags: 6 - - "v*" 6 + - 'v*' 7 7 8 8 permissions: 9 9 contents: read ··· 19 19 20 20 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 21 21 with: 22 - node-version: "24" 23 - registry-url: "https://npm.pkg.github.com" 22 + node-version: '24' 23 + registry-url: 'https://npm.pkg.github.com' 24 24 25 25 - run: pnpm install 26 26
+1
.husky/commit-msg
··· 1 + pnpm exec commitlint --edit "$1"
+1
.husky/pre-commit
··· 1 + pnpm exec lint-staged
+5
.prettierignore
··· 1 + dist/ 2 + node_modules/ 3 + coverage/ 4 + *.min.js 5 + src/generated/
+25 -25
README.md
··· 30 30 31 31 ## Lexicon Schemas 32 32 33 - | Lexicon ID | Description | Key | 34 - |---|---|---| 35 - | `forum.barazo.topic.post` | Forum topic with title, markdown content, community, category, tags, and optional self-labels | `tid` | 36 - | `forum.barazo.topic.reply` | Threaded reply to a topic or another reply, with root and parent references | `tid` | 37 - | `forum.barazo.interaction.reaction` | Reaction to a topic or reply (e.g., like, heart), scoped to a community's configured set | `tid` | 38 - | `forum.barazo.actor.preferences` | User-level moderation and safety preferences: maturity filter, muted words, blocked/muted accounts, cross-post defaults | `literal:self` | 39 - | `forum.barazo.authForumAccess` | OAuth permission set granting repo access to all Barazo record collections | -- | 40 - | `forum.barazo.defs` | Shared type definitions (reserved for future reusable types) | -- | 33 + | Lexicon ID | Description | Key | 34 + | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -------------- | 35 + | `forum.barazo.topic.post` | Forum topic with title, markdown content, community, category, tags, and optional self-labels | `tid` | 36 + | `forum.barazo.topic.reply` | Threaded reply to a topic or another reply, with root and parent references | `tid` | 37 + | `forum.barazo.interaction.reaction` | Reaction to a topic or reply (e.g., like, heart), scoped to a community's configured set | `tid` | 38 + | `forum.barazo.actor.preferences` | User-level moderation and safety preferences: maturity filter, muted words, blocked/muted accounts, cross-post defaults | `literal:self` | 39 + | `forum.barazo.authForumAccess` | OAuth permission set granting repo access to all Barazo record collections | -- | 40 + | `forum.barazo.defs` | Shared type definitions (reserved for future reusable types) | -- | 41 41 42 42 --- 43 43 ··· 51 51 ForumBarazoTopicReply, 52 52 ForumBarazoInteractionReaction, 53 53 ForumBarazoActorPreferences, 54 - } from "@barazo-forum/lexicons"; 54 + } from '@barazo-forum/lexicons' 55 55 56 56 // Record type 57 - type Post = ForumBarazoTopicPost.Record; 57 + type Post = ForumBarazoTopicPost.Record 58 58 59 59 // Type guard 60 60 if (ForumBarazoTopicPost.isRecord(record)) { 61 - console.log(record.title); 61 + console.log(record.title) 62 62 } 63 63 64 64 // Lexicon validation 65 - const result = ForumBarazoTopicPost.validateRecord(record); 65 + const result = ForumBarazoTopicPost.validateRecord(record) 66 66 ``` 67 67 68 68 **Zod Validation Schemas:** ··· 73 73 topicReplySchema, 74 74 reactionSchema, 75 75 actorPreferencesSchema, 76 - } from "@barazo-forum/lexicons"; 76 + } from '@barazo-forum/lexicons' 77 77 78 - const result = topicPostSchema.safeParse(input); 78 + const result = topicPostSchema.safeParse(input) 79 79 if (result.success) { 80 80 // result.data is typed as TopicPostInput 81 81 } ··· 84 84 **Lexicon ID Constants:** 85 85 86 86 ```typescript 87 - import { LEXICON_IDS, ids } from "@barazo-forum/lexicons"; 87 + import { LEXICON_IDS, ids } from '@barazo-forum/lexicons' 88 88 89 - LEXICON_IDS.TopicPost // "forum.barazo.topic.post" 90 - LEXICON_IDS.TopicReply // "forum.barazo.topic.reply" 91 - LEXICON_IDS.Reaction // "forum.barazo.interaction.reaction" 89 + LEXICON_IDS.TopicPost // "forum.barazo.topic.post" 90 + LEXICON_IDS.TopicReply // "forum.barazo.topic.reply" 91 + LEXICON_IDS.Reaction // "forum.barazo.interaction.reaction" 92 92 LEXICON_IDS.ActorPreferences // "forum.barazo.actor.preferences" 93 93 LEXICON_IDS.AuthForumAccess // "forum.barazo.authForumAccess" 94 94 ``` ··· 96 96 **Raw Lexicon Schemas:** 97 97 98 98 ```typescript 99 - import { schemas } from "@barazo-forum/lexicons"; 99 + import { schemas } from '@barazo-forum/lexicons' 100 100 // Array of LexiconDoc objects for all forum.barazo.* schemas 101 101 ``` 102 102 ··· 139 139 140 140 ## Related Repositories 141 141 142 - | Repository | Description | License | 143 - |------------|-------------|---------| 144 - | [barazo-api](https://github.com/barazo-forum/barazo-api) | AppView backend (Fastify, firehose, REST API) | AGPL-3.0 | 145 - | [barazo-web](https://github.com/barazo-forum/barazo-web) | Forum frontend (Next.js, Tailwind) | MIT | 146 - | [barazo-deploy](https://github.com/barazo-forum/barazo-deploy) | Docker Compose deployment templates | MIT | 147 - | [barazo-website](https://github.com/barazo-forum/barazo-website) | Marketing + documentation site | MIT | 142 + | Repository | Description | License | 143 + | ---------------------------------------------------------------- | --------------------------------------------- | -------- | 144 + | [barazo-api](https://github.com/barazo-forum/barazo-api) | AppView backend (Fastify, firehose, REST API) | AGPL-3.0 | 145 + | [barazo-web](https://github.com/barazo-forum/barazo-web) | Forum frontend (Next.js, Tailwind) | MIT | 146 + | [barazo-deploy](https://github.com/barazo-forum/barazo-deploy) | Docker Compose deployment templates | MIT | 147 + | [barazo-website](https://github.com/barazo-forum/barazo-website) | Marketing + documentation site | MIT | 148 148 149 149 --- 150 150
+31
commitlint.config.mjs
··· 1 + /** 2 + * Commitlint configuration 3 + * Conventional Commits enforced per CLAUDE.md 4 + * @see https://commitlint.js.org/#/reference-configuration 5 + */ 6 + export default { 7 + extends: ['@commitlint/config-conventional'], 8 + rules: { 9 + 'type-enum': [ 10 + 2, 11 + 'always', 12 + [ 13 + 'build', 14 + 'chore', 15 + 'ci', 16 + 'docs', 17 + 'feat', 18 + 'fix', 19 + 'perf', 20 + 'refactor', 21 + 'revert', 22 + 'style', 23 + 'test', 24 + 'a11y', 25 + 'security', 26 + ], 27 + ], 28 + 'scope-empty': [0], 29 + 'subject-case': [0], 30 + }, 31 + }
+12 -15
eslint.config.js
··· 1 - import tseslint from "typescript-eslint"; 1 + import tseslint from 'typescript-eslint' 2 2 3 3 export default tseslint.config( 4 4 ...tseslint.configs.strictTypeChecked, 5 5 { 6 6 rules: { 7 - "no-console": "error", 8 - "@typescript-eslint/no-explicit-any": "error", 9 - "@typescript-eslint/no-unused-vars": [ 10 - "error", 11 - { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }, 7 + 'no-console': 'error', 8 + '@typescript-eslint/no-explicit-any': 'error', 9 + '@typescript-eslint/no-unused-vars': [ 10 + 'error', 11 + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, 12 12 ], 13 - "@typescript-eslint/consistent-type-imports": [ 14 - "error", 15 - { prefer: "type-imports" }, 16 - ], 13 + '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }], 17 14 }, 18 15 }, 19 16 { 20 - ignores: ["dist/", "node_modules/", "*.config.*"], 17 + ignores: ['dist/', 'node_modules/', '*.config.*'], 21 18 }, 22 19 { 23 20 languageOptions: { 24 21 parserOptions: { 25 22 projectService: { 26 - allowDefaultProject: ["tests/*.ts", "tests/fixtures/*.ts"], 23 + allowDefaultProject: ['tests/*.ts', 'tests/fixtures/*.ts'], 27 24 }, 28 25 tsconfigRootDir: import.meta.dirname, 29 26 }, 30 27 }, 31 28 }, 32 29 { 33 - ignores: ["src/generated/**"], 34 - }, 35 - ); 30 + ignores: ['src/generated/**'], 31 + } 32 + )
+5
lint-staged.config.mjs
··· 1 + export default { 2 + '*.ts': ['prettier --write', 'eslint --fix'], 3 + '*.{mjs,cjs}': ['prettier --write', 'eslint --fix'], 4 + '*.{js,json,md,yml,yaml}': ['prettier --write'], 5 + }
+9 -1
package.json
··· 33 33 "test:compat": "vitest run tests/backward-compatibility.test.ts", 34 34 "test:coverage": "vitest run --coverage", 35 35 "generate": "lex gen-server ./src/generated ./lexicons/**/*.json && node scripts/fixup-generated.js", 36 - "clean": "rm -rf dist" 36 + "clean": "rm -rf dist", 37 + "format": "prettier --write .", 38 + "format:check": "prettier --check .", 39 + "prepare": "husky" 37 40 }, 38 41 "dependencies": { 39 42 "@atproto/lexicon": "^0.6.1", ··· 42 45 }, 43 46 "devDependencies": { 44 47 "@atproto/lex-cli": "^0.9.8", 48 + "@commitlint/cli": "catalog:", 49 + "@commitlint/config-conventional": "catalog:", 45 50 "@types/node": "catalog:", 46 51 "@vitest/coverage-v8": "catalog:", 47 52 "eslint": "catalog:", 53 + "husky": "catalog:", 54 + "lint-staged": "catalog:", 55 + "prettier": "catalog:", 48 56 "typescript": "catalog:", 49 57 "typescript-eslint": "catalog:", 50 58 "vitest": "catalog:"
+2260 -399
pnpm-lock.yaml
··· 6 6 7 7 catalogs: 8 8 default: 9 + '@commitlint/cli': 10 + specifier: ^20.4.1 11 + version: 20.4.2 12 + '@commitlint/config-conventional': 13 + specifier: ^20.4.1 14 + version: 20.4.2 9 15 '@types/node': 10 16 specifier: ^25.2.3 11 17 version: 25.2.3 ··· 15 21 eslint: 16 22 specifier: ^9.39.2 17 23 version: 9.39.2 24 + husky: 25 + specifier: ^9.1.7 26 + version: 9.1.7 27 + lint-staged: 28 + specifier: ^16.2.7 29 + version: 16.2.7 18 30 multiformats: 19 31 specifier: ^13.4.2 20 32 version: 13.4.2 33 + prettier: 34 + specifier: ^3.8.1 35 + version: 3.8.1 21 36 typescript: 22 37 specifier: ^5.9.3 23 38 version: 5.9.3 ··· 32 47 version: 4.3.6 33 48 34 49 importers: 35 - 36 50 .: 37 51 dependencies: 38 52 '@atproto/lexicon': ··· 48 62 '@atproto/lex-cli': 49 63 specifier: ^0.9.8 50 64 version: 0.9.8 65 + '@commitlint/cli': 66 + specifier: 'catalog:' 67 + version: 20.4.2(@types/node@25.2.3)(typescript@5.9.3) 68 + '@commitlint/config-conventional': 69 + specifier: 'catalog:' 70 + version: 20.4.2 51 71 '@types/node': 52 72 specifier: 'catalog:' 53 73 version: 25.2.3 54 74 '@vitest/coverage-v8': 55 75 specifier: 'catalog:' 56 - version: 4.0.18(vitest@4.0.18(@types/node@25.2.3)) 76 + version: 4.0.18(vitest@4.0.18(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2)) 57 77 eslint: 58 78 specifier: 'catalog:' 59 - version: 9.39.2 79 + version: 9.39.2(jiti@2.6.1) 80 + husky: 81 + specifier: 'catalog:' 82 + version: 9.1.7 83 + lint-staged: 84 + specifier: 'catalog:' 85 + version: 16.2.7 86 + prettier: 87 + specifier: 'catalog:' 88 + version: 3.8.1 60 89 typescript: 61 90 specifier: 'catalog:' 62 91 version: 5.9.3 63 92 typescript-eslint: 64 93 specifier: 'catalog:' 65 - version: 8.55.0(eslint@9.39.2)(typescript@5.9.3) 94 + version: 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 66 95 vitest: 67 96 specifier: 'catalog:' 68 - version: 4.0.18(@types/node@25.2.3) 97 + version: 4.0.18(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2) 69 98 70 99 packages: 71 - 72 100 '@atproto/common-web@0.4.16': 73 - resolution: {integrity: sha512-Ufvaff5JgxUyUyTAG0/3o7ltpy3lnZ1DvLjyAnvAf+hHfiK7OMQg+8byr+orN+KP9MtIQaRTsCgYPX+PxMKUoA==} 101 + resolution: 102 + { 103 + integrity: sha512-Ufvaff5JgxUyUyTAG0/3o7ltpy3lnZ1DvLjyAnvAf+hHfiK7OMQg+8byr+orN+KP9MtIQaRTsCgYPX+PxMKUoA==, 104 + } 74 105 75 106 '@atproto/lex-cli@0.9.8': 76 - resolution: {integrity: sha512-0ebVyp12i3S8oE77+BxahbTmyrXcqeC9GTx2HGa/PA9KjnThapkGkgVQjIWw74DNQprzbg9EkiQsaKU2xFYhmA==} 77 - engines: {node: '>=18.7.0'} 107 + resolution: 108 + { 109 + integrity: sha512-0ebVyp12i3S8oE77+BxahbTmyrXcqeC9GTx2HGa/PA9KjnThapkGkgVQjIWw74DNQprzbg9EkiQsaKU2xFYhmA==, 110 + } 111 + engines: { node: '>=18.7.0' } 78 112 hasBin: true 79 113 80 114 '@atproto/lex-data@0.0.11': 81 - resolution: {integrity: sha512-4+KTtHdqwlhiTKA7D4SACea4jprsNpCQsNALW09wsZ6IHhCDGO5tr1cmV+QnLYe3G3mu1E1yXHXbPUHrUUDT/A==} 115 + resolution: 116 + { 117 + integrity: sha512-4+KTtHdqwlhiTKA7D4SACea4jprsNpCQsNALW09wsZ6IHhCDGO5tr1cmV+QnLYe3G3mu1E1yXHXbPUHrUUDT/A==, 118 + } 82 119 83 120 '@atproto/lex-json@0.0.11': 84 - resolution: {integrity: sha512-2IExAoQ4KsR5fyPa1JjIvtR316PvdgRH/l3BVGLBd3cSxM3m5MftIv1B6qZ9HjNiK60SgkWp0mi9574bTNDhBQ==} 121 + resolution: 122 + { 123 + integrity: sha512-2IExAoQ4KsR5fyPa1JjIvtR316PvdgRH/l3BVGLBd3cSxM3m5MftIv1B6qZ9HjNiK60SgkWp0mi9574bTNDhBQ==, 124 + } 85 125 86 126 '@atproto/lexicon@0.6.1': 87 - resolution: {integrity: sha512-/vI1kVlY50Si+5MXpvOucelnYwb0UJ6Qto5mCp+7Q5C+Jtp+SoSykAPVvjVtTnQUH2vrKOFOwpb3C375vSKzXw==} 127 + resolution: 128 + { 129 + integrity: sha512-/vI1kVlY50Si+5MXpvOucelnYwb0UJ6Qto5mCp+7Q5C+Jtp+SoSykAPVvjVtTnQUH2vrKOFOwpb3C375vSKzXw==, 130 + } 88 131 89 132 '@atproto/syntax@0.4.3': 90 - resolution: {integrity: sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==} 133 + resolution: 134 + { 135 + integrity: sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==, 136 + } 137 + 138 + '@babel/code-frame@7.29.0': 139 + resolution: 140 + { 141 + integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==, 142 + } 143 + engines: { node: '>=6.9.0' } 91 144 92 145 '@babel/helper-string-parser@7.27.1': 93 - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 94 - engines: {node: '>=6.9.0'} 146 + resolution: 147 + { 148 + integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, 149 + } 150 + engines: { node: '>=6.9.0' } 95 151 96 152 '@babel/helper-validator-identifier@7.28.5': 97 - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 98 - engines: {node: '>=6.9.0'} 153 + resolution: 154 + { 155 + integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, 156 + } 157 + engines: { node: '>=6.9.0' } 99 158 100 159 '@babel/parser@7.29.0': 101 - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} 102 - engines: {node: '>=6.0.0'} 160 + resolution: 161 + { 162 + integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==, 163 + } 164 + engines: { node: '>=6.0.0' } 103 165 hasBin: true 104 166 105 167 '@babel/types@7.29.0': 106 - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} 107 - engines: {node: '>=6.9.0'} 168 + resolution: 169 + { 170 + integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==, 171 + } 172 + engines: { node: '>=6.9.0' } 108 173 109 174 '@bcoe/v8-coverage@1.0.2': 110 - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} 111 - engines: {node: '>=18'} 175 + resolution: 176 + { 177 + integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==, 178 + } 179 + engines: { node: '>=18' } 180 + 181 + '@commitlint/cli@20.4.2': 182 + resolution: 183 + { 184 + integrity: sha512-YjYSX2yj/WsVoxh9mNiymfFS2ADbg2EK4+1WAsMuckwKMCqJ5PDG0CJU/8GvmHWcv4VRB2V02KqSiecRksWqZQ==, 185 + } 186 + engines: { node: '>=v18' } 187 + hasBin: true 188 + 189 + '@commitlint/config-conventional@20.4.2': 190 + resolution: 191 + { 192 + integrity: sha512-rwkTF55q7Q+6dpSKUmJoScV0f3EpDlWKw2UPzklkLS4o5krMN1tPWAVOgHRtyUTMneIapLeQwaCjn44Td6OzBQ==, 193 + } 194 + engines: { node: '>=v18' } 195 + 196 + '@commitlint/config-validator@20.4.0': 197 + resolution: 198 + { 199 + integrity: sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w==, 200 + } 201 + engines: { node: '>=v18' } 202 + 203 + '@commitlint/ensure@20.4.1': 204 + resolution: 205 + { 206 + integrity: sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw==, 207 + } 208 + engines: { node: '>=v18' } 209 + 210 + '@commitlint/execute-rule@20.0.0': 211 + resolution: 212 + { 213 + integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==, 214 + } 215 + engines: { node: '>=v18' } 216 + 217 + '@commitlint/format@20.4.0': 218 + resolution: 219 + { 220 + integrity: sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ==, 221 + } 222 + engines: { node: '>=v18' } 223 + 224 + '@commitlint/is-ignored@20.4.1': 225 + resolution: 226 + { 227 + integrity: sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA==, 228 + } 229 + engines: { node: '>=v18' } 230 + 231 + '@commitlint/lint@20.4.2': 232 + resolution: 233 + { 234 + integrity: sha512-buquzNRtFng6xjXvBU1abY/WPEEjCgUipNQrNmIWe8QuJ6LWLtei/LDBAzEe5ASm45+Q9L2Xi3/GVvlj50GAug==, 235 + } 236 + engines: { node: '>=v18' } 237 + 238 + '@commitlint/load@20.4.0': 239 + resolution: 240 + { 241 + integrity: sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A==, 242 + } 243 + engines: { node: '>=v18' } 244 + 245 + '@commitlint/message@20.4.0': 246 + resolution: 247 + { 248 + integrity: sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA==, 249 + } 250 + engines: { node: '>=v18' } 251 + 252 + '@commitlint/parse@20.4.1': 253 + resolution: 254 + { 255 + integrity: sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w==, 256 + } 257 + engines: { node: '>=v18' } 258 + 259 + '@commitlint/read@20.4.0': 260 + resolution: 261 + { 262 + integrity: sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg==, 263 + } 264 + engines: { node: '>=v18' } 265 + 266 + '@commitlint/resolve-extends@20.4.0': 267 + resolution: 268 + { 269 + integrity: sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g==, 270 + } 271 + engines: { node: '>=v18' } 272 + 273 + '@commitlint/rules@20.4.2': 274 + resolution: 275 + { 276 + integrity: sha512-oz83pnp5Yq6uwwTAabuVQPNlPfeD2Y5ZjMb7Wx8FSUlu4sLYJjbBWt8031Z0osCFPfHzAwSYrjnfDFKtuSMdKg==, 277 + } 278 + engines: { node: '>=v18' } 279 + 280 + '@commitlint/to-lines@20.0.0': 281 + resolution: 282 + { 283 + integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==, 284 + } 285 + engines: { node: '>=v18' } 286 + 287 + '@commitlint/top-level@20.4.0': 288 + resolution: 289 + { 290 + integrity: sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA==, 291 + } 292 + engines: { node: '>=v18' } 293 + 294 + '@commitlint/types@20.4.0': 295 + resolution: 296 + { 297 + integrity: sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw==, 298 + } 299 + engines: { node: '>=v18' } 112 300 113 301 '@esbuild/aix-ppc64@0.27.3': 114 - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} 115 - engines: {node: '>=18'} 302 + resolution: 303 + { 304 + integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==, 305 + } 306 + engines: { node: '>=18' } 116 307 cpu: [ppc64] 117 308 os: [aix] 118 309 119 310 '@esbuild/android-arm64@0.27.3': 120 - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} 121 - engines: {node: '>=18'} 311 + resolution: 312 + { 313 + integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==, 314 + } 315 + engines: { node: '>=18' } 122 316 cpu: [arm64] 123 317 os: [android] 124 318 125 319 '@esbuild/android-arm@0.27.3': 126 - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} 127 - engines: {node: '>=18'} 320 + resolution: 321 + { 322 + integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==, 323 + } 324 + engines: { node: '>=18' } 128 325 cpu: [arm] 129 326 os: [android] 130 327 131 328 '@esbuild/android-x64@0.27.3': 132 - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} 133 - engines: {node: '>=18'} 329 + resolution: 330 + { 331 + integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==, 332 + } 333 + engines: { node: '>=18' } 134 334 cpu: [x64] 135 335 os: [android] 136 336 137 337 '@esbuild/darwin-arm64@0.27.3': 138 - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} 139 - engines: {node: '>=18'} 338 + resolution: 339 + { 340 + integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==, 341 + } 342 + engines: { node: '>=18' } 140 343 cpu: [arm64] 141 344 os: [darwin] 142 345 143 346 '@esbuild/darwin-x64@0.27.3': 144 - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} 145 - engines: {node: '>=18'} 347 + resolution: 348 + { 349 + integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==, 350 + } 351 + engines: { node: '>=18' } 146 352 cpu: [x64] 147 353 os: [darwin] 148 354 149 355 '@esbuild/freebsd-arm64@0.27.3': 150 - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} 151 - engines: {node: '>=18'} 356 + resolution: 357 + { 358 + integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==, 359 + } 360 + engines: { node: '>=18' } 152 361 cpu: [arm64] 153 362 os: [freebsd] 154 363 155 364 '@esbuild/freebsd-x64@0.27.3': 156 - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} 157 - engines: {node: '>=18'} 365 + resolution: 366 + { 367 + integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==, 368 + } 369 + engines: { node: '>=18' } 158 370 cpu: [x64] 159 371 os: [freebsd] 160 372 161 373 '@esbuild/linux-arm64@0.27.3': 162 - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} 163 - engines: {node: '>=18'} 374 + resolution: 375 + { 376 + integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==, 377 + } 378 + engines: { node: '>=18' } 164 379 cpu: [arm64] 165 380 os: [linux] 166 381 167 382 '@esbuild/linux-arm@0.27.3': 168 - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} 169 - engines: {node: '>=18'} 383 + resolution: 384 + { 385 + integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==, 386 + } 387 + engines: { node: '>=18' } 170 388 cpu: [arm] 171 389 os: [linux] 172 390 173 391 '@esbuild/linux-ia32@0.27.3': 174 - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} 175 - engines: {node: '>=18'} 392 + resolution: 393 + { 394 + integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==, 395 + } 396 + engines: { node: '>=18' } 176 397 cpu: [ia32] 177 398 os: [linux] 178 399 179 400 '@esbuild/linux-loong64@0.27.3': 180 - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} 181 - engines: {node: '>=18'} 401 + resolution: 402 + { 403 + integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==, 404 + } 405 + engines: { node: '>=18' } 182 406 cpu: [loong64] 183 407 os: [linux] 184 408 185 409 '@esbuild/linux-mips64el@0.27.3': 186 - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} 187 - engines: {node: '>=18'} 410 + resolution: 411 + { 412 + integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==, 413 + } 414 + engines: { node: '>=18' } 188 415 cpu: [mips64el] 189 416 os: [linux] 190 417 191 418 '@esbuild/linux-ppc64@0.27.3': 192 - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} 193 - engines: {node: '>=18'} 419 + resolution: 420 + { 421 + integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==, 422 + } 423 + engines: { node: '>=18' } 194 424 cpu: [ppc64] 195 425 os: [linux] 196 426 197 427 '@esbuild/linux-riscv64@0.27.3': 198 - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} 199 - engines: {node: '>=18'} 428 + resolution: 429 + { 430 + integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==, 431 + } 432 + engines: { node: '>=18' } 200 433 cpu: [riscv64] 201 434 os: [linux] 202 435 203 436 '@esbuild/linux-s390x@0.27.3': 204 - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} 205 - engines: {node: '>=18'} 437 + resolution: 438 + { 439 + integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==, 440 + } 441 + engines: { node: '>=18' } 206 442 cpu: [s390x] 207 443 os: [linux] 208 444 209 445 '@esbuild/linux-x64@0.27.3': 210 - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} 211 - engines: {node: '>=18'} 446 + resolution: 447 + { 448 + integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==, 449 + } 450 + engines: { node: '>=18' } 212 451 cpu: [x64] 213 452 os: [linux] 214 453 215 454 '@esbuild/netbsd-arm64@0.27.3': 216 - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} 217 - engines: {node: '>=18'} 455 + resolution: 456 + { 457 + integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==, 458 + } 459 + engines: { node: '>=18' } 218 460 cpu: [arm64] 219 461 os: [netbsd] 220 462 221 463 '@esbuild/netbsd-x64@0.27.3': 222 - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} 223 - engines: {node: '>=18'} 464 + resolution: 465 + { 466 + integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==, 467 + } 468 + engines: { node: '>=18' } 224 469 cpu: [x64] 225 470 os: [netbsd] 226 471 227 472 '@esbuild/openbsd-arm64@0.27.3': 228 - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} 229 - engines: {node: '>=18'} 473 + resolution: 474 + { 475 + integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==, 476 + } 477 + engines: { node: '>=18' } 230 478 cpu: [arm64] 231 479 os: [openbsd] 232 480 233 481 '@esbuild/openbsd-x64@0.27.3': 234 - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} 235 - engines: {node: '>=18'} 482 + resolution: 483 + { 484 + integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==, 485 + } 486 + engines: { node: '>=18' } 236 487 cpu: [x64] 237 488 os: [openbsd] 238 489 239 490 '@esbuild/openharmony-arm64@0.27.3': 240 - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} 241 - engines: {node: '>=18'} 491 + resolution: 492 + { 493 + integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==, 494 + } 495 + engines: { node: '>=18' } 242 496 cpu: [arm64] 243 497 os: [openharmony] 244 498 245 499 '@esbuild/sunos-x64@0.27.3': 246 - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} 247 - engines: {node: '>=18'} 500 + resolution: 501 + { 502 + integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==, 503 + } 504 + engines: { node: '>=18' } 248 505 cpu: [x64] 249 506 os: [sunos] 250 507 251 508 '@esbuild/win32-arm64@0.27.3': 252 - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} 253 - engines: {node: '>=18'} 509 + resolution: 510 + { 511 + integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==, 512 + } 513 + engines: { node: '>=18' } 254 514 cpu: [arm64] 255 515 os: [win32] 256 516 257 517 '@esbuild/win32-ia32@0.27.3': 258 - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} 259 - engines: {node: '>=18'} 518 + resolution: 519 + { 520 + integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==, 521 + } 522 + engines: { node: '>=18' } 260 523 cpu: [ia32] 261 524 os: [win32] 262 525 263 526 '@esbuild/win32-x64@0.27.3': 264 - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} 265 - engines: {node: '>=18'} 527 + resolution: 528 + { 529 + integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==, 530 + } 531 + engines: { node: '>=18' } 266 532 cpu: [x64] 267 533 os: [win32] 268 534 269 535 '@eslint-community/eslint-utils@4.9.1': 270 - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} 271 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 536 + resolution: 537 + { 538 + integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==, 539 + } 540 + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } 272 541 peerDependencies: 273 542 eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 274 543 275 544 '@eslint-community/regexpp@4.12.2': 276 - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 277 - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 545 + resolution: 546 + { 547 + integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==, 548 + } 549 + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } 278 550 279 551 '@eslint/config-array@0.21.1': 280 - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 281 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 552 + resolution: 553 + { 554 + integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==, 555 + } 556 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 282 557 283 558 '@eslint/config-helpers@0.4.2': 284 - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 285 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 559 + resolution: 560 + { 561 + integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==, 562 + } 563 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 286 564 287 565 '@eslint/core@0.17.0': 288 - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 289 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 566 + resolution: 567 + { 568 + integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==, 569 + } 570 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 290 571 291 572 '@eslint/eslintrc@3.3.3': 292 - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} 293 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 573 + resolution: 574 + { 575 + integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==, 576 + } 577 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 294 578 295 579 '@eslint/js@9.39.2': 296 - resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} 297 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 580 + resolution: 581 + { 582 + integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==, 583 + } 584 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 298 585 299 586 '@eslint/object-schema@2.1.7': 300 - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 301 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 587 + resolution: 588 + { 589 + integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==, 590 + } 591 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 302 592 303 593 '@eslint/plugin-kit@0.4.1': 304 - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 305 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 594 + resolution: 595 + { 596 + integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==, 597 + } 598 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 306 599 307 600 '@humanfs/core@0.19.1': 308 - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 309 - engines: {node: '>=18.18.0'} 601 + resolution: 602 + { 603 + integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, 604 + } 605 + engines: { node: '>=18.18.0' } 310 606 311 607 '@humanfs/node@0.16.7': 312 - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 313 - engines: {node: '>=18.18.0'} 608 + resolution: 609 + { 610 + integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==, 611 + } 612 + engines: { node: '>=18.18.0' } 314 613 315 614 '@humanwhocodes/module-importer@1.0.1': 316 - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 317 - engines: {node: '>=12.22'} 615 + resolution: 616 + { 617 + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, 618 + } 619 + engines: { node: '>=12.22' } 318 620 319 621 '@humanwhocodes/retry@0.4.3': 320 - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 321 - engines: {node: '>=18.18'} 622 + resolution: 623 + { 624 + integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==, 625 + } 626 + engines: { node: '>=18.18' } 322 627 323 628 '@jridgewell/resolve-uri@3.1.2': 324 - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 325 - engines: {node: '>=6.0.0'} 629 + resolution: 630 + { 631 + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, 632 + } 633 + engines: { node: '>=6.0.0' } 326 634 327 635 '@jridgewell/sourcemap-codec@1.5.5': 328 - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 636 + resolution: 637 + { 638 + integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, 639 + } 329 640 330 641 '@jridgewell/trace-mapping@0.3.31': 331 - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 642 + resolution: 643 + { 644 + integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, 645 + } 332 646 333 647 '@rollup/rollup-android-arm-eabi@4.57.1': 334 - resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} 648 + resolution: 649 + { 650 + integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==, 651 + } 335 652 cpu: [arm] 336 653 os: [android] 337 654 338 655 '@rollup/rollup-android-arm64@4.57.1': 339 - resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} 656 + resolution: 657 + { 658 + integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==, 659 + } 340 660 cpu: [arm64] 341 661 os: [android] 342 662 343 663 '@rollup/rollup-darwin-arm64@4.57.1': 344 - resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} 664 + resolution: 665 + { 666 + integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==, 667 + } 345 668 cpu: [arm64] 346 669 os: [darwin] 347 670 348 671 '@rollup/rollup-darwin-x64@4.57.1': 349 - resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} 672 + resolution: 673 + { 674 + integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==, 675 + } 350 676 cpu: [x64] 351 677 os: [darwin] 352 678 353 679 '@rollup/rollup-freebsd-arm64@4.57.1': 354 - resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} 680 + resolution: 681 + { 682 + integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==, 683 + } 355 684 cpu: [arm64] 356 685 os: [freebsd] 357 686 358 687 '@rollup/rollup-freebsd-x64@4.57.1': 359 - resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} 688 + resolution: 689 + { 690 + integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==, 691 + } 360 692 cpu: [x64] 361 693 os: [freebsd] 362 694 363 695 '@rollup/rollup-linux-arm-gnueabihf@4.57.1': 364 - resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} 696 + resolution: 697 + { 698 + integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==, 699 + } 365 700 cpu: [arm] 366 701 os: [linux] 367 702 libc: [glibc] 368 703 369 704 '@rollup/rollup-linux-arm-musleabihf@4.57.1': 370 - resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} 705 + resolution: 706 + { 707 + integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==, 708 + } 371 709 cpu: [arm] 372 710 os: [linux] 373 711 libc: [musl] 374 712 375 713 '@rollup/rollup-linux-arm64-gnu@4.57.1': 376 - resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} 714 + resolution: 715 + { 716 + integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==, 717 + } 377 718 cpu: [arm64] 378 719 os: [linux] 379 720 libc: [glibc] 380 721 381 722 '@rollup/rollup-linux-arm64-musl@4.57.1': 382 - resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} 723 + resolution: 724 + { 725 + integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==, 726 + } 383 727 cpu: [arm64] 384 728 os: [linux] 385 729 libc: [musl] 386 730 387 731 '@rollup/rollup-linux-loong64-gnu@4.57.1': 388 - resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} 732 + resolution: 733 + { 734 + integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==, 735 + } 389 736 cpu: [loong64] 390 737 os: [linux] 391 738 libc: [glibc] 392 739 393 740 '@rollup/rollup-linux-loong64-musl@4.57.1': 394 - resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} 741 + resolution: 742 + { 743 + integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==, 744 + } 395 745 cpu: [loong64] 396 746 os: [linux] 397 747 libc: [musl] 398 748 399 749 '@rollup/rollup-linux-ppc64-gnu@4.57.1': 400 - resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} 750 + resolution: 751 + { 752 + integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==, 753 + } 401 754 cpu: [ppc64] 402 755 os: [linux] 403 756 libc: [glibc] 404 757 405 758 '@rollup/rollup-linux-ppc64-musl@4.57.1': 406 - resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} 759 + resolution: 760 + { 761 + integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==, 762 + } 407 763 cpu: [ppc64] 408 764 os: [linux] 409 765 libc: [musl] 410 766 411 767 '@rollup/rollup-linux-riscv64-gnu@4.57.1': 412 - resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} 768 + resolution: 769 + { 770 + integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==, 771 + } 413 772 cpu: [riscv64] 414 773 os: [linux] 415 774 libc: [glibc] 416 775 417 776 '@rollup/rollup-linux-riscv64-musl@4.57.1': 418 - resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} 777 + resolution: 778 + { 779 + integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==, 780 + } 419 781 cpu: [riscv64] 420 782 os: [linux] 421 783 libc: [musl] 422 784 423 785 '@rollup/rollup-linux-s390x-gnu@4.57.1': 424 - resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} 786 + resolution: 787 + { 788 + integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==, 789 + } 425 790 cpu: [s390x] 426 791 os: [linux] 427 792 libc: [glibc] 428 793 429 794 '@rollup/rollup-linux-x64-gnu@4.57.1': 430 - resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} 795 + resolution: 796 + { 797 + integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==, 798 + } 431 799 cpu: [x64] 432 800 os: [linux] 433 801 libc: [glibc] 434 802 435 803 '@rollup/rollup-linux-x64-musl@4.57.1': 436 - resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} 804 + resolution: 805 + { 806 + integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==, 807 + } 437 808 cpu: [x64] 438 809 os: [linux] 439 810 libc: [musl] 440 811 441 812 '@rollup/rollup-openbsd-x64@4.57.1': 442 - resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} 813 + resolution: 814 + { 815 + integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==, 816 + } 443 817 cpu: [x64] 444 818 os: [openbsd] 445 819 446 820 '@rollup/rollup-openharmony-arm64@4.57.1': 447 - resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} 821 + resolution: 822 + { 823 + integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==, 824 + } 448 825 cpu: [arm64] 449 826 os: [openharmony] 450 827 451 828 '@rollup/rollup-win32-arm64-msvc@4.57.1': 452 - resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} 829 + resolution: 830 + { 831 + integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==, 832 + } 453 833 cpu: [arm64] 454 834 os: [win32] 455 835 456 836 '@rollup/rollup-win32-ia32-msvc@4.57.1': 457 - resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} 837 + resolution: 838 + { 839 + integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==, 840 + } 458 841 cpu: [ia32] 459 842 os: [win32] 460 843 461 844 '@rollup/rollup-win32-x64-gnu@4.57.1': 462 - resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} 845 + resolution: 846 + { 847 + integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==, 848 + } 463 849 cpu: [x64] 464 850 os: [win32] 465 851 466 852 '@rollup/rollup-win32-x64-msvc@4.57.1': 467 - resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} 853 + resolution: 854 + { 855 + integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==, 856 + } 468 857 cpu: [x64] 469 858 os: [win32] 470 859 471 860 '@standard-schema/spec@1.1.0': 472 - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} 861 + resolution: 862 + { 863 + integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==, 864 + } 473 865 474 866 '@ts-morph/common@0.25.0': 475 - resolution: {integrity: sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==} 867 + resolution: 868 + { 869 + integrity: sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==, 870 + } 476 871 477 872 '@types/chai@5.2.3': 478 - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} 873 + resolution: 874 + { 875 + integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==, 876 + } 479 877 480 878 '@types/deep-eql@4.0.2': 481 - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 879 + resolution: 880 + { 881 + integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, 882 + } 482 883 483 884 '@types/estree@1.0.8': 484 - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 885 + resolution: 886 + { 887 + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, 888 + } 485 889 486 890 '@types/json-schema@7.0.15': 487 - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 891 + resolution: 892 + { 893 + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, 894 + } 488 895 489 896 '@types/node@25.2.3': 490 - resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} 897 + resolution: 898 + { 899 + integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==, 900 + } 491 901 492 902 '@typescript-eslint/eslint-plugin@8.55.0': 493 - resolution: {integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==} 494 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 903 + resolution: 904 + { 905 + integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==, 906 + } 907 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 495 908 peerDependencies: 496 909 '@typescript-eslint/parser': ^8.55.0 497 910 eslint: ^8.57.0 || ^9.0.0 498 911 typescript: '>=4.8.4 <6.0.0' 499 912 500 913 '@typescript-eslint/parser@8.55.0': 501 - resolution: {integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==} 502 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 914 + resolution: 915 + { 916 + integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==, 917 + } 918 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 503 919 peerDependencies: 504 920 eslint: ^8.57.0 || ^9.0.0 505 921 typescript: '>=4.8.4 <6.0.0' 506 922 507 923 '@typescript-eslint/project-service@8.55.0': 508 - resolution: {integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==} 509 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 924 + resolution: 925 + { 926 + integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==, 927 + } 928 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 510 929 peerDependencies: 511 930 typescript: '>=4.8.4 <6.0.0' 512 931 513 932 '@typescript-eslint/scope-manager@8.55.0': 514 - resolution: {integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==} 515 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 933 + resolution: 934 + { 935 + integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==, 936 + } 937 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 516 938 517 939 '@typescript-eslint/tsconfig-utils@8.55.0': 518 - resolution: {integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==} 519 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 940 + resolution: 941 + { 942 + integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==, 943 + } 944 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 520 945 peerDependencies: 521 946 typescript: '>=4.8.4 <6.0.0' 522 947 523 948 '@typescript-eslint/type-utils@8.55.0': 524 - resolution: {integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==} 525 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 949 + resolution: 950 + { 951 + integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==, 952 + } 953 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 526 954 peerDependencies: 527 955 eslint: ^8.57.0 || ^9.0.0 528 956 typescript: '>=4.8.4 <6.0.0' 529 957 530 958 '@typescript-eslint/types@8.55.0': 531 - resolution: {integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==} 532 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 959 + resolution: 960 + { 961 + integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==, 962 + } 963 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 533 964 534 965 '@typescript-eslint/typescript-estree@8.55.0': 535 - resolution: {integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==} 536 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 966 + resolution: 967 + { 968 + integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==, 969 + } 970 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 537 971 peerDependencies: 538 972 typescript: '>=4.8.4 <6.0.0' 539 973 540 974 '@typescript-eslint/utils@8.55.0': 541 - resolution: {integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==} 542 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 975 + resolution: 976 + { 977 + integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==, 978 + } 979 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 543 980 peerDependencies: 544 981 eslint: ^8.57.0 || ^9.0.0 545 982 typescript: '>=4.8.4 <6.0.0' 546 983 547 984 '@typescript-eslint/visitor-keys@8.55.0': 548 - resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} 549 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 985 + resolution: 986 + { 987 + integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==, 988 + } 989 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 550 990 551 991 '@vitest/coverage-v8@4.0.18': 552 - resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} 992 + resolution: 993 + { 994 + integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==, 995 + } 553 996 peerDependencies: 554 997 '@vitest/browser': 4.0.18 555 998 vitest: 4.0.18 ··· 558 1001 optional: true 559 1002 560 1003 '@vitest/expect@4.0.18': 561 - resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} 1004 + resolution: 1005 + { 1006 + integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==, 1007 + } 562 1008 563 1009 '@vitest/mocker@4.0.18': 564 - resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} 1010 + resolution: 1011 + { 1012 + integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==, 1013 + } 565 1014 peerDependencies: 566 1015 msw: ^2.4.9 567 1016 vite: ^6.0.0 || ^7.0.0-0 ··· 572 1021 optional: true 573 1022 574 1023 '@vitest/pretty-format@4.0.18': 575 - resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} 1024 + resolution: 1025 + { 1026 + integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==, 1027 + } 576 1028 577 1029 '@vitest/runner@4.0.18': 578 - resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} 1030 + resolution: 1031 + { 1032 + integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==, 1033 + } 579 1034 580 1035 '@vitest/snapshot@4.0.18': 581 - resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} 1036 + resolution: 1037 + { 1038 + integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==, 1039 + } 582 1040 583 1041 '@vitest/spy@4.0.18': 584 - resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} 1042 + resolution: 1043 + { 1044 + integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==, 1045 + } 585 1046 586 1047 '@vitest/utils@4.0.18': 587 - resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} 1048 + resolution: 1049 + { 1050 + integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==, 1051 + } 588 1052 589 1053 acorn-jsx@5.3.2: 590 - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 1054 + resolution: 1055 + { 1056 + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, 1057 + } 591 1058 peerDependencies: 592 1059 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 593 1060 594 1061 acorn@8.15.0: 595 - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 596 - engines: {node: '>=0.4.0'} 1062 + resolution: 1063 + { 1064 + integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, 1065 + } 1066 + engines: { node: '>=0.4.0' } 597 1067 hasBin: true 598 1068 599 1069 ajv@6.12.6: 600 - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 1070 + resolution: 1071 + { 1072 + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, 1073 + } 1074 + 1075 + ajv@8.18.0: 1076 + resolution: 1077 + { 1078 + integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==, 1079 + } 1080 + 1081 + ansi-escapes@7.3.0: 1082 + resolution: 1083 + { 1084 + integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==, 1085 + } 1086 + engines: { node: '>=18' } 1087 + 1088 + ansi-regex@5.0.1: 1089 + resolution: 1090 + { 1091 + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, 1092 + } 1093 + engines: { node: '>=8' } 1094 + 1095 + ansi-regex@6.2.2: 1096 + resolution: 1097 + { 1098 + integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==, 1099 + } 1100 + engines: { node: '>=12' } 601 1101 602 1102 ansi-styles@4.3.0: 603 - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 604 - engines: {node: '>=8'} 1103 + resolution: 1104 + { 1105 + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, 1106 + } 1107 + engines: { node: '>=8' } 1108 + 1109 + ansi-styles@6.2.3: 1110 + resolution: 1111 + { 1112 + integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==, 1113 + } 1114 + engines: { node: '>=12' } 605 1115 606 1116 argparse@2.0.1: 607 - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1117 + resolution: 1118 + { 1119 + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, 1120 + } 1121 + 1122 + array-ify@1.0.0: 1123 + resolution: 1124 + { 1125 + integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, 1126 + } 608 1127 609 1128 assertion-error@2.0.1: 610 - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 611 - engines: {node: '>=12'} 1129 + resolution: 1130 + { 1131 + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, 1132 + } 1133 + engines: { node: '>=12' } 612 1134 613 1135 ast-v8-to-istanbul@0.3.11: 614 - resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} 1136 + resolution: 1137 + { 1138 + integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==, 1139 + } 615 1140 616 1141 balanced-match@1.0.2: 617 - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1142 + resolution: 1143 + { 1144 + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, 1145 + } 618 1146 619 1147 brace-expansion@1.1.12: 620 - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 1148 + resolution: 1149 + { 1150 + integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==, 1151 + } 621 1152 622 1153 brace-expansion@2.0.2: 623 - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 1154 + resolution: 1155 + { 1156 + integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, 1157 + } 1158 + 1159 + braces@3.0.3: 1160 + resolution: 1161 + { 1162 + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, 1163 + } 1164 + engines: { node: '>=8' } 624 1165 625 1166 callsites@3.1.0: 626 - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 627 - engines: {node: '>=6'} 1167 + resolution: 1168 + { 1169 + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, 1170 + } 1171 + engines: { node: '>=6' } 628 1172 629 1173 chai@6.2.2: 630 - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} 631 - engines: {node: '>=18'} 1174 + resolution: 1175 + { 1176 + integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==, 1177 + } 1178 + engines: { node: '>=18' } 632 1179 633 1180 chalk@4.1.2: 634 - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 635 - engines: {node: '>=10'} 1181 + resolution: 1182 + { 1183 + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, 1184 + } 1185 + engines: { node: '>=10' } 1186 + 1187 + cli-cursor@5.0.0: 1188 + resolution: 1189 + { 1190 + integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==, 1191 + } 1192 + engines: { node: '>=18' } 1193 + 1194 + cli-truncate@5.1.1: 1195 + resolution: 1196 + { 1197 + integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==, 1198 + } 1199 + engines: { node: '>=20' } 1200 + 1201 + cliui@8.0.1: 1202 + resolution: 1203 + { 1204 + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, 1205 + } 1206 + engines: { node: '>=12' } 636 1207 637 1208 code-block-writer@13.0.3: 638 - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} 1209 + resolution: 1210 + { 1211 + integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==, 1212 + } 639 1213 640 1214 color-convert@2.0.1: 641 - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 642 - engines: {node: '>=7.0.0'} 1215 + resolution: 1216 + { 1217 + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, 1218 + } 1219 + engines: { node: '>=7.0.0' } 643 1220 644 1221 color-name@1.1.4: 645 - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1222 + resolution: 1223 + { 1224 + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, 1225 + } 1226 + 1227 + colorette@2.0.20: 1228 + resolution: 1229 + { 1230 + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, 1231 + } 1232 + 1233 + commander@14.0.3: 1234 + resolution: 1235 + { 1236 + integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==, 1237 + } 1238 + engines: { node: '>=20' } 646 1239 647 1240 commander@9.5.0: 648 - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 649 - engines: {node: ^12.20.0 || >=14} 1241 + resolution: 1242 + { 1243 + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, 1244 + } 1245 + engines: { node: ^12.20.0 || >=14 } 1246 + 1247 + compare-func@2.0.0: 1248 + resolution: 1249 + { 1250 + integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, 1251 + } 650 1252 651 1253 concat-map@0.0.1: 652 - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1254 + resolution: 1255 + { 1256 + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, 1257 + } 1258 + 1259 + conventional-changelog-angular@8.1.0: 1260 + resolution: 1261 + { 1262 + integrity: sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==, 1263 + } 1264 + engines: { node: '>=18' } 1265 + 1266 + conventional-changelog-conventionalcommits@9.1.0: 1267 + resolution: 1268 + { 1269 + integrity: sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==, 1270 + } 1271 + engines: { node: '>=18' } 1272 + 1273 + conventional-commits-parser@6.2.1: 1274 + resolution: 1275 + { 1276 + integrity: sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==, 1277 + } 1278 + engines: { node: '>=18' } 1279 + hasBin: true 1280 + 1281 + cosmiconfig-typescript-loader@6.2.0: 1282 + resolution: 1283 + { 1284 + integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==, 1285 + } 1286 + engines: { node: '>=v18' } 1287 + peerDependencies: 1288 + '@types/node': '*' 1289 + cosmiconfig: '>=9' 1290 + typescript: '>=5' 1291 + 1292 + cosmiconfig@9.0.0: 1293 + resolution: 1294 + { 1295 + integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, 1296 + } 1297 + engines: { node: '>=14' } 1298 + peerDependencies: 1299 + typescript: '>=4.9.5' 1300 + peerDependenciesMeta: 1301 + typescript: 1302 + optional: true 653 1303 654 1304 cross-spawn@7.0.6: 655 - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 656 - engines: {node: '>= 8'} 1305 + resolution: 1306 + { 1307 + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, 1308 + } 1309 + engines: { node: '>= 8' } 1310 + 1311 + dargs@8.1.0: 1312 + resolution: 1313 + { 1314 + integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==, 1315 + } 1316 + engines: { node: '>=12' } 657 1317 658 1318 debug@4.4.3: 659 - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 660 - engines: {node: '>=6.0'} 1319 + resolution: 1320 + { 1321 + integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, 1322 + } 1323 + engines: { node: '>=6.0' } 661 1324 peerDependencies: 662 1325 supports-color: '*' 663 1326 peerDependenciesMeta: ··· 665 1328 optional: true 666 1329 667 1330 deep-is@0.1.4: 668 - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1331 + resolution: 1332 + { 1333 + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, 1334 + } 1335 + 1336 + dot-prop@5.3.0: 1337 + resolution: 1338 + { 1339 + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, 1340 + } 1341 + engines: { node: '>=8' } 1342 + 1343 + emoji-regex@10.6.0: 1344 + resolution: 1345 + { 1346 + integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==, 1347 + } 1348 + 1349 + emoji-regex@8.0.0: 1350 + resolution: 1351 + { 1352 + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, 1353 + } 1354 + 1355 + env-paths@2.2.1: 1356 + resolution: 1357 + { 1358 + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, 1359 + } 1360 + engines: { node: '>=6' } 1361 + 1362 + environment@1.1.0: 1363 + resolution: 1364 + { 1365 + integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==, 1366 + } 1367 + engines: { node: '>=18' } 1368 + 1369 + error-ex@1.3.4: 1370 + resolution: 1371 + { 1372 + integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==, 1373 + } 669 1374 670 1375 es-module-lexer@1.7.0: 671 - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 1376 + resolution: 1377 + { 1378 + integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, 1379 + } 672 1380 673 1381 esbuild@0.27.3: 674 - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} 675 - engines: {node: '>=18'} 1382 + resolution: 1383 + { 1384 + integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==, 1385 + } 1386 + engines: { node: '>=18' } 676 1387 hasBin: true 677 1388 1389 + escalade@3.2.0: 1390 + resolution: 1391 + { 1392 + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, 1393 + } 1394 + engines: { node: '>=6' } 1395 + 678 1396 escape-string-regexp@4.0.0: 679 - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 680 - engines: {node: '>=10'} 1397 + resolution: 1398 + { 1399 + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, 1400 + } 1401 + engines: { node: '>=10' } 681 1402 682 1403 eslint-scope@8.4.0: 683 - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 684 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1404 + resolution: 1405 + { 1406 + integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==, 1407 + } 1408 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 685 1409 686 1410 eslint-visitor-keys@3.4.3: 687 - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 688 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1411 + resolution: 1412 + { 1413 + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, 1414 + } 1415 + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } 689 1416 690 1417 eslint-visitor-keys@4.2.1: 691 - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 692 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1418 + resolution: 1419 + { 1420 + integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, 1421 + } 1422 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 693 1423 694 1424 eslint@9.39.2: 695 - resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} 696 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1425 + resolution: 1426 + { 1427 + integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==, 1428 + } 1429 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 697 1430 hasBin: true 698 1431 peerDependencies: 699 1432 jiti: '*' ··· 702 1435 optional: true 703 1436 704 1437 espree@10.4.0: 705 - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 706 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1438 + resolution: 1439 + { 1440 + integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, 1441 + } 1442 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 707 1443 708 1444 esquery@1.7.0: 709 - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} 710 - engines: {node: '>=0.10'} 1445 + resolution: 1446 + { 1447 + integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==, 1448 + } 1449 + engines: { node: '>=0.10' } 711 1450 712 1451 esrecurse@4.3.0: 713 - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 714 - engines: {node: '>=4.0'} 1452 + resolution: 1453 + { 1454 + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, 1455 + } 1456 + engines: { node: '>=4.0' } 715 1457 716 1458 estraverse@5.3.0: 717 - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 718 - engines: {node: '>=4.0'} 1459 + resolution: 1460 + { 1461 + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, 1462 + } 1463 + engines: { node: '>=4.0' } 719 1464 720 1465 estree-walker@3.0.3: 721 - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1466 + resolution: 1467 + { 1468 + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, 1469 + } 722 1470 723 1471 esutils@2.0.3: 724 - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 725 - engines: {node: '>=0.10.0'} 1472 + resolution: 1473 + { 1474 + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, 1475 + } 1476 + engines: { node: '>=0.10.0' } 1477 + 1478 + eventemitter3@5.0.4: 1479 + resolution: 1480 + { 1481 + integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==, 1482 + } 726 1483 727 1484 expect-type@1.3.0: 728 - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} 729 - engines: {node: '>=12.0.0'} 1485 + resolution: 1486 + { 1487 + integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==, 1488 + } 1489 + engines: { node: '>=12.0.0' } 730 1490 731 1491 fast-deep-equal@3.1.3: 732 - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1492 + resolution: 1493 + { 1494 + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, 1495 + } 733 1496 734 1497 fast-json-stable-stringify@2.1.0: 735 - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1498 + resolution: 1499 + { 1500 + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, 1501 + } 736 1502 737 1503 fast-levenshtein@2.0.6: 738 - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1504 + resolution: 1505 + { 1506 + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, 1507 + } 1508 + 1509 + fast-uri@3.1.0: 1510 + resolution: 1511 + { 1512 + integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==, 1513 + } 739 1514 740 1515 fdir@6.5.0: 741 - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 742 - engines: {node: '>=12.0.0'} 1516 + resolution: 1517 + { 1518 + integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, 1519 + } 1520 + engines: { node: '>=12.0.0' } 743 1521 peerDependencies: 744 1522 picomatch: ^3 || ^4 745 1523 peerDependenciesMeta: ··· 747 1525 optional: true 748 1526 749 1527 file-entry-cache@8.0.0: 750 - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 751 - engines: {node: '>=16.0.0'} 1528 + resolution: 1529 + { 1530 + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, 1531 + } 1532 + engines: { node: '>=16.0.0' } 1533 + 1534 + fill-range@7.1.1: 1535 + resolution: 1536 + { 1537 + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, 1538 + } 1539 + engines: { node: '>=8' } 752 1540 753 1541 find-up@5.0.0: 754 - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 755 - engines: {node: '>=10'} 1542 + resolution: 1543 + { 1544 + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, 1545 + } 1546 + engines: { node: '>=10' } 756 1547 757 1548 flat-cache@4.0.1: 758 - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 759 - engines: {node: '>=16'} 1549 + resolution: 1550 + { 1551 + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, 1552 + } 1553 + engines: { node: '>=16' } 760 1554 761 1555 flatted@3.3.3: 762 - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 1556 + resolution: 1557 + { 1558 + integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, 1559 + } 763 1560 764 1561 fsevents@2.3.3: 765 - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 766 - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1562 + resolution: 1563 + { 1564 + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, 1565 + } 1566 + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } 767 1567 os: [darwin] 768 1568 1569 + get-caller-file@2.0.5: 1570 + resolution: 1571 + { 1572 + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, 1573 + } 1574 + engines: { node: 6.* || 8.* || >= 10.* } 1575 + 1576 + get-east-asian-width@1.5.0: 1577 + resolution: 1578 + { 1579 + integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==, 1580 + } 1581 + engines: { node: '>=18' } 1582 + 1583 + git-raw-commits@4.0.0: 1584 + resolution: 1585 + { 1586 + integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==, 1587 + } 1588 + engines: { node: '>=16' } 1589 + hasBin: true 1590 + 769 1591 glob-parent@6.0.2: 770 - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 771 - engines: {node: '>=10.13.0'} 1592 + resolution: 1593 + { 1594 + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, 1595 + } 1596 + engines: { node: '>=10.13.0' } 1597 + 1598 + global-directory@4.0.1: 1599 + resolution: 1600 + { 1601 + integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==, 1602 + } 1603 + engines: { node: '>=18' } 772 1604 773 1605 globals@14.0.0: 774 - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 775 - engines: {node: '>=18'} 1606 + resolution: 1607 + { 1608 + integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, 1609 + } 1610 + engines: { node: '>=18' } 776 1611 777 1612 has-flag@4.0.0: 778 - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 779 - engines: {node: '>=8'} 1613 + resolution: 1614 + { 1615 + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, 1616 + } 1617 + engines: { node: '>=8' } 780 1618 781 1619 html-escaper@2.0.2: 782 - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1620 + resolution: 1621 + { 1622 + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, 1623 + } 1624 + 1625 + husky@9.1.7: 1626 + resolution: 1627 + { 1628 + integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==, 1629 + } 1630 + engines: { node: '>=18' } 1631 + hasBin: true 783 1632 784 1633 ignore@5.3.2: 785 - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 786 - engines: {node: '>= 4'} 1634 + resolution: 1635 + { 1636 + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, 1637 + } 1638 + engines: { node: '>= 4' } 787 1639 788 1640 ignore@7.0.5: 789 - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 790 - engines: {node: '>= 4'} 1641 + resolution: 1642 + { 1643 + integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, 1644 + } 1645 + engines: { node: '>= 4' } 791 1646 792 1647 import-fresh@3.3.1: 793 - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 794 - engines: {node: '>=6'} 1648 + resolution: 1649 + { 1650 + integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, 1651 + } 1652 + engines: { node: '>=6' } 1653 + 1654 + import-meta-resolve@4.2.0: 1655 + resolution: 1656 + { 1657 + integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==, 1658 + } 795 1659 796 1660 imurmurhash@0.1.4: 797 - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 798 - engines: {node: '>=0.8.19'} 1661 + resolution: 1662 + { 1663 + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, 1664 + } 1665 + engines: { node: '>=0.8.19' } 1666 + 1667 + ini@4.1.1: 1668 + resolution: 1669 + { 1670 + integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==, 1671 + } 1672 + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } 1673 + 1674 + is-arrayish@0.2.1: 1675 + resolution: 1676 + { 1677 + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, 1678 + } 799 1679 800 1680 is-extglob@2.1.1: 801 - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 802 - engines: {node: '>=0.10.0'} 1681 + resolution: 1682 + { 1683 + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, 1684 + } 1685 + engines: { node: '>=0.10.0' } 1686 + 1687 + is-fullwidth-code-point@3.0.0: 1688 + resolution: 1689 + { 1690 + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, 1691 + } 1692 + engines: { node: '>=8' } 1693 + 1694 + is-fullwidth-code-point@5.1.0: 1695 + resolution: 1696 + { 1697 + integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==, 1698 + } 1699 + engines: { node: '>=18' } 803 1700 804 1701 is-glob@4.0.3: 805 - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 806 - engines: {node: '>=0.10.0'} 1702 + resolution: 1703 + { 1704 + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, 1705 + } 1706 + engines: { node: '>=0.10.0' } 1707 + 1708 + is-number@7.0.0: 1709 + resolution: 1710 + { 1711 + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, 1712 + } 1713 + engines: { node: '>=0.12.0' } 1714 + 1715 + is-obj@2.0.0: 1716 + resolution: 1717 + { 1718 + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, 1719 + } 1720 + engines: { node: '>=8' } 1721 + 1722 + is-plain-obj@4.1.0: 1723 + resolution: 1724 + { 1725 + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, 1726 + } 1727 + engines: { node: '>=12' } 807 1728 808 1729 isexe@2.0.0: 809 - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1730 + resolution: 1731 + { 1732 + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, 1733 + } 810 1734 811 1735 iso-datestring-validator@2.2.2: 812 - resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==} 1736 + resolution: 1737 + { 1738 + integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==, 1739 + } 813 1740 814 1741 istanbul-lib-coverage@3.2.2: 815 - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 816 - engines: {node: '>=8'} 1742 + resolution: 1743 + { 1744 + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, 1745 + } 1746 + engines: { node: '>=8' } 817 1747 818 1748 istanbul-lib-report@3.0.1: 819 - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 820 - engines: {node: '>=10'} 1749 + resolution: 1750 + { 1751 + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, 1752 + } 1753 + engines: { node: '>=10' } 821 1754 822 1755 istanbul-reports@3.2.0: 823 - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} 824 - engines: {node: '>=8'} 1756 + resolution: 1757 + { 1758 + integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==, 1759 + } 1760 + engines: { node: '>=8' } 1761 + 1762 + jiti@2.6.1: 1763 + resolution: 1764 + { 1765 + integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==, 1766 + } 1767 + hasBin: true 825 1768 826 1769 js-tokens@10.0.0: 827 - resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} 1770 + resolution: 1771 + { 1772 + integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==, 1773 + } 1774 + 1775 + js-tokens@4.0.0: 1776 + resolution: 1777 + { 1778 + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, 1779 + } 828 1780 829 1781 js-yaml@4.1.1: 830 - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 1782 + resolution: 1783 + { 1784 + integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==, 1785 + } 831 1786 hasBin: true 832 1787 833 1788 json-buffer@3.0.1: 834 - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1789 + resolution: 1790 + { 1791 + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, 1792 + } 1793 + 1794 + json-parse-even-better-errors@2.3.1: 1795 + resolution: 1796 + { 1797 + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, 1798 + } 835 1799 836 1800 json-schema-traverse@0.4.1: 837 - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1801 + resolution: 1802 + { 1803 + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, 1804 + } 1805 + 1806 + json-schema-traverse@1.0.0: 1807 + resolution: 1808 + { 1809 + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, 1810 + } 838 1811 839 1812 json-stable-stringify-without-jsonify@1.0.1: 840 - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1813 + resolution: 1814 + { 1815 + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, 1816 + } 841 1817 842 1818 keyv@4.5.4: 843 - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1819 + resolution: 1820 + { 1821 + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, 1822 + } 844 1823 845 1824 levn@0.4.1: 846 - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 847 - engines: {node: '>= 0.8.0'} 1825 + resolution: 1826 + { 1827 + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, 1828 + } 1829 + engines: { node: '>= 0.8.0' } 1830 + 1831 + lines-and-columns@1.2.4: 1832 + resolution: 1833 + { 1834 + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, 1835 + } 1836 + 1837 + lint-staged@16.2.7: 1838 + resolution: 1839 + { 1840 + integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==, 1841 + } 1842 + engines: { node: '>=20.17' } 1843 + hasBin: true 1844 + 1845 + listr2@9.0.5: 1846 + resolution: 1847 + { 1848 + integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==, 1849 + } 1850 + engines: { node: '>=20.0.0' } 848 1851 849 1852 locate-path@6.0.0: 850 - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 851 - engines: {node: '>=10'} 1853 + resolution: 1854 + { 1855 + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, 1856 + } 1857 + engines: { node: '>=10' } 1858 + 1859 + lodash.camelcase@4.3.0: 1860 + resolution: 1861 + { 1862 + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, 1863 + } 1864 + 1865 + lodash.kebabcase@4.1.1: 1866 + resolution: 1867 + { 1868 + integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==, 1869 + } 852 1870 853 1871 lodash.merge@4.6.2: 854 - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1872 + resolution: 1873 + { 1874 + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, 1875 + } 1876 + 1877 + lodash.mergewith@4.6.2: 1878 + resolution: 1879 + { 1880 + integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, 1881 + } 1882 + 1883 + lodash.snakecase@4.1.1: 1884 + resolution: 1885 + { 1886 + integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==, 1887 + } 1888 + 1889 + lodash.startcase@4.4.0: 1890 + resolution: 1891 + { 1892 + integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, 1893 + } 1894 + 1895 + lodash.upperfirst@4.3.1: 1896 + resolution: 1897 + { 1898 + integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==, 1899 + } 1900 + 1901 + log-update@6.1.0: 1902 + resolution: 1903 + { 1904 + integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==, 1905 + } 1906 + engines: { node: '>=18' } 855 1907 856 1908 magic-string@0.30.21: 857 - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1909 + resolution: 1910 + { 1911 + integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, 1912 + } 858 1913 859 1914 magicast@0.5.2: 860 - resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} 1915 + resolution: 1916 + { 1917 + integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==, 1918 + } 861 1919 862 1920 make-dir@4.0.0: 863 - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 864 - engines: {node: '>=10'} 1921 + resolution: 1922 + { 1923 + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, 1924 + } 1925 + engines: { node: '>=10' } 1926 + 1927 + meow@12.1.1: 1928 + resolution: 1929 + { 1930 + integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==, 1931 + } 1932 + engines: { node: '>=16.10' } 1933 + 1934 + meow@13.2.0: 1935 + resolution: 1936 + { 1937 + integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==, 1938 + } 1939 + engines: { node: '>=18' } 1940 + 1941 + micromatch@4.0.8: 1942 + resolution: 1943 + { 1944 + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, 1945 + } 1946 + engines: { node: '>=8.6' } 1947 + 1948 + mimic-function@5.0.1: 1949 + resolution: 1950 + { 1951 + integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==, 1952 + } 1953 + engines: { node: '>=18' } 865 1954 866 1955 minimatch@3.1.2: 867 - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1956 + resolution: 1957 + { 1958 + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, 1959 + } 868 1960 869 1961 minimatch@9.0.5: 870 - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 871 - engines: {node: '>=16 || 14 >=14.17'} 1962 + resolution: 1963 + { 1964 + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, 1965 + } 1966 + engines: { node: '>=16 || 14 >=14.17' } 1967 + 1968 + minimist@1.2.8: 1969 + resolution: 1970 + { 1971 + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, 1972 + } 872 1973 873 1974 ms@2.1.3: 874 - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1975 + resolution: 1976 + { 1977 + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, 1978 + } 875 1979 876 1980 multiformats@13.4.2: 877 - resolution: {integrity: sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==} 1981 + resolution: 1982 + { 1983 + integrity: sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==, 1984 + } 878 1985 879 1986 multiformats@9.9.0: 880 - resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} 1987 + resolution: 1988 + { 1989 + integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==, 1990 + } 1991 + 1992 + nano-spawn@2.0.0: 1993 + resolution: 1994 + { 1995 + integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==, 1996 + } 1997 + engines: { node: '>=20.17' } 881 1998 882 1999 nanoid@3.3.11: 883 - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 884 - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2000 + resolution: 2001 + { 2002 + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, 2003 + } 2004 + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } 885 2005 hasBin: true 886 2006 887 2007 natural-compare@1.4.0: 888 - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2008 + resolution: 2009 + { 2010 + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, 2011 + } 889 2012 890 2013 obug@2.1.1: 891 - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} 2014 + resolution: 2015 + { 2016 + integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==, 2017 + } 2018 + 2019 + onetime@7.0.0: 2020 + resolution: 2021 + { 2022 + integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==, 2023 + } 2024 + engines: { node: '>=18' } 892 2025 893 2026 optionator@0.9.4: 894 - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 895 - engines: {node: '>= 0.8.0'} 2027 + resolution: 2028 + { 2029 + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, 2030 + } 2031 + engines: { node: '>= 0.8.0' } 896 2032 897 2033 p-limit@3.1.0: 898 - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 899 - engines: {node: '>=10'} 2034 + resolution: 2035 + { 2036 + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, 2037 + } 2038 + engines: { node: '>=10' } 900 2039 901 2040 p-locate@5.0.0: 902 - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 903 - engines: {node: '>=10'} 2041 + resolution: 2042 + { 2043 + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, 2044 + } 2045 + engines: { node: '>=10' } 904 2046 905 2047 parent-module@1.0.1: 906 - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 907 - engines: {node: '>=6'} 2048 + resolution: 2049 + { 2050 + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, 2051 + } 2052 + engines: { node: '>=6' } 2053 + 2054 + parse-json@5.2.0: 2055 + resolution: 2056 + { 2057 + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, 2058 + } 2059 + engines: { node: '>=8' } 908 2060 909 2061 path-browserify@1.0.1: 910 - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 2062 + resolution: 2063 + { 2064 + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, 2065 + } 911 2066 912 2067 path-exists@4.0.0: 913 - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 914 - engines: {node: '>=8'} 2068 + resolution: 2069 + { 2070 + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, 2071 + } 2072 + engines: { node: '>=8' } 915 2073 916 2074 path-key@3.1.1: 917 - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 918 - engines: {node: '>=8'} 2075 + resolution: 2076 + { 2077 + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, 2078 + } 2079 + engines: { node: '>=8' } 919 2080 920 2081 pathe@2.0.3: 921 - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 2082 + resolution: 2083 + { 2084 + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, 2085 + } 922 2086 923 2087 picocolors@1.1.1: 924 - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 2088 + resolution: 2089 + { 2090 + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, 2091 + } 2092 + 2093 + picomatch@2.3.1: 2094 + resolution: 2095 + { 2096 + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, 2097 + } 2098 + engines: { node: '>=8.6' } 925 2099 926 2100 picomatch@4.0.3: 927 - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 928 - engines: {node: '>=12'} 2101 + resolution: 2102 + { 2103 + integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, 2104 + } 2105 + engines: { node: '>=12' } 2106 + 2107 + pidtree@0.6.0: 2108 + resolution: 2109 + { 2110 + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, 2111 + } 2112 + engines: { node: '>=0.10' } 2113 + hasBin: true 929 2114 930 2115 postcss@8.5.6: 931 - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 932 - engines: {node: ^10 || ^12 || >=14} 2116 + resolution: 2117 + { 2118 + integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, 2119 + } 2120 + engines: { node: ^10 || ^12 || >=14 } 933 2121 934 2122 prelude-ls@1.2.1: 935 - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 936 - engines: {node: '>= 0.8.0'} 2123 + resolution: 2124 + { 2125 + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, 2126 + } 2127 + engines: { node: '>= 0.8.0' } 937 2128 938 2129 prettier@3.8.1: 939 - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} 940 - engines: {node: '>=14'} 2130 + resolution: 2131 + { 2132 + integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==, 2133 + } 2134 + engines: { node: '>=14' } 941 2135 hasBin: true 942 2136 943 2137 punycode@2.3.1: 944 - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 945 - engines: {node: '>=6'} 2138 + resolution: 2139 + { 2140 + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, 2141 + } 2142 + engines: { node: '>=6' } 2143 + 2144 + require-directory@2.1.1: 2145 + resolution: 2146 + { 2147 + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, 2148 + } 2149 + engines: { node: '>=0.10.0' } 2150 + 2151 + require-from-string@2.0.2: 2152 + resolution: 2153 + { 2154 + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, 2155 + } 2156 + engines: { node: '>=0.10.0' } 946 2157 947 2158 resolve-from@4.0.0: 948 - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 949 - engines: {node: '>=4'} 2159 + resolution: 2160 + { 2161 + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, 2162 + } 2163 + engines: { node: '>=4' } 2164 + 2165 + resolve-from@5.0.0: 2166 + resolution: 2167 + { 2168 + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, 2169 + } 2170 + engines: { node: '>=8' } 2171 + 2172 + restore-cursor@5.1.0: 2173 + resolution: 2174 + { 2175 + integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==, 2176 + } 2177 + engines: { node: '>=18' } 2178 + 2179 + rfdc@1.4.1: 2180 + resolution: 2181 + { 2182 + integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, 2183 + } 950 2184 951 2185 rollup@4.57.1: 952 - resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} 953 - engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2186 + resolution: 2187 + { 2188 + integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==, 2189 + } 2190 + engines: { node: '>=18.0.0', npm: '>=8.0.0' } 954 2191 hasBin: true 955 2192 956 2193 semver@7.7.4: 957 - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} 958 - engines: {node: '>=10'} 2194 + resolution: 2195 + { 2196 + integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==, 2197 + } 2198 + engines: { node: '>=10' } 959 2199 hasBin: true 960 2200 961 2201 shebang-command@2.0.0: 962 - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 963 - engines: {node: '>=8'} 2202 + resolution: 2203 + { 2204 + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, 2205 + } 2206 + engines: { node: '>=8' } 964 2207 965 2208 shebang-regex@3.0.0: 966 - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 967 - engines: {node: '>=8'} 2209 + resolution: 2210 + { 2211 + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, 2212 + } 2213 + engines: { node: '>=8' } 968 2214 969 2215 siginfo@2.0.0: 970 - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 2216 + resolution: 2217 + { 2218 + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, 2219 + } 2220 + 2221 + signal-exit@4.1.0: 2222 + resolution: 2223 + { 2224 + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, 2225 + } 2226 + engines: { node: '>=14' } 2227 + 2228 + slice-ansi@7.1.2: 2229 + resolution: 2230 + { 2231 + integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==, 2232 + } 2233 + engines: { node: '>=18' } 971 2234 972 2235 source-map-js@1.2.1: 973 - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 974 - engines: {node: '>=0.10.0'} 2236 + resolution: 2237 + { 2238 + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, 2239 + } 2240 + engines: { node: '>=0.10.0' } 2241 + 2242 + split2@4.2.0: 2243 + resolution: 2244 + { 2245 + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, 2246 + } 2247 + engines: { node: '>= 10.x' } 975 2248 976 2249 stackback@0.0.2: 977 - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 2250 + resolution: 2251 + { 2252 + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, 2253 + } 978 2254 979 2255 std-env@3.10.0: 980 - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} 2256 + resolution: 2257 + { 2258 + integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==, 2259 + } 2260 + 2261 + string-argv@0.3.2: 2262 + resolution: 2263 + { 2264 + integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, 2265 + } 2266 + engines: { node: '>=0.6.19' } 2267 + 2268 + string-width@4.2.3: 2269 + resolution: 2270 + { 2271 + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, 2272 + } 2273 + engines: { node: '>=8' } 2274 + 2275 + string-width@7.2.0: 2276 + resolution: 2277 + { 2278 + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, 2279 + } 2280 + engines: { node: '>=18' } 2281 + 2282 + string-width@8.2.0: 2283 + resolution: 2284 + { 2285 + integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==, 2286 + } 2287 + engines: { node: '>=20' } 2288 + 2289 + strip-ansi@6.0.1: 2290 + resolution: 2291 + { 2292 + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, 2293 + } 2294 + engines: { node: '>=8' } 2295 + 2296 + strip-ansi@7.1.2: 2297 + resolution: 2298 + { 2299 + integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==, 2300 + } 2301 + engines: { node: '>=12' } 981 2302 982 2303 strip-json-comments@3.1.1: 983 - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 984 - engines: {node: '>=8'} 2304 + resolution: 2305 + { 2306 + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, 2307 + } 2308 + engines: { node: '>=8' } 985 2309 986 2310 supports-color@7.2.0: 987 - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 988 - engines: {node: '>=8'} 2311 + resolution: 2312 + { 2313 + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, 2314 + } 2315 + engines: { node: '>=8' } 989 2316 990 2317 tinybench@2.9.0: 991 - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 2318 + resolution: 2319 + { 2320 + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, 2321 + } 992 2322 993 2323 tinyexec@1.0.2: 994 - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} 995 - engines: {node: '>=18'} 2324 + resolution: 2325 + { 2326 + integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==, 2327 + } 2328 + engines: { node: '>=18' } 996 2329 997 2330 tinyglobby@0.2.15: 998 - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 999 - engines: {node: '>=12.0.0'} 2331 + resolution: 2332 + { 2333 + integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, 2334 + } 2335 + engines: { node: '>=12.0.0' } 1000 2336 1001 2337 tinyrainbow@3.0.3: 1002 - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} 1003 - engines: {node: '>=14.0.0'} 2338 + resolution: 2339 + { 2340 + integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==, 2341 + } 2342 + engines: { node: '>=14.0.0' } 2343 + 2344 + to-regex-range@5.0.1: 2345 + resolution: 2346 + { 2347 + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, 2348 + } 2349 + engines: { node: '>=8.0' } 1004 2350 1005 2351 ts-api-utils@2.4.0: 1006 - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} 1007 - engines: {node: '>=18.12'} 2352 + resolution: 2353 + { 2354 + integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==, 2355 + } 2356 + engines: { node: '>=18.12' } 1008 2357 peerDependencies: 1009 2358 typescript: '>=4.8.4' 1010 2359 1011 2360 ts-morph@24.0.0: 1012 - resolution: {integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==} 2361 + resolution: 2362 + { 2363 + integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==, 2364 + } 1013 2365 1014 2366 tslib@2.8.1: 1015 - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 2367 + resolution: 2368 + { 2369 + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, 2370 + } 1016 2371 1017 2372 type-check@0.4.0: 1018 - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1019 - engines: {node: '>= 0.8.0'} 2373 + resolution: 2374 + { 2375 + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, 2376 + } 2377 + engines: { node: '>= 0.8.0' } 1020 2378 1021 2379 typescript-eslint@8.55.0: 1022 - resolution: {integrity: sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==} 1023 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2380 + resolution: 2381 + { 2382 + integrity: sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==, 2383 + } 2384 + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } 1024 2385 peerDependencies: 1025 2386 eslint: ^8.57.0 || ^9.0.0 1026 2387 typescript: '>=4.8.4 <6.0.0' 1027 2388 1028 2389 typescript@5.9.3: 1029 - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1030 - engines: {node: '>=14.17'} 2390 + resolution: 2391 + { 2392 + integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==, 2393 + } 2394 + engines: { node: '>=14.17' } 1031 2395 hasBin: true 1032 2396 1033 2397 uint8arrays@3.0.0: 1034 - resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==} 2398 + resolution: 2399 + { 2400 + integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==, 2401 + } 1035 2402 1036 2403 undici-types@7.16.0: 1037 - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 2404 + resolution: 2405 + { 2406 + integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==, 2407 + } 1038 2408 1039 2409 unicode-segmenter@0.14.5: 1040 - resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==} 2410 + resolution: 2411 + { 2412 + integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==, 2413 + } 1041 2414 1042 2415 uri-js@4.4.1: 1043 - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2416 + resolution: 2417 + { 2418 + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, 2419 + } 1044 2420 1045 2421 vite@7.3.1: 1046 - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} 1047 - engines: {node: ^20.19.0 || >=22.12.0} 2422 + resolution: 2423 + { 2424 + integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==, 2425 + } 2426 + engines: { node: ^20.19.0 || >=22.12.0 } 1048 2427 hasBin: true 1049 2428 peerDependencies: 1050 2429 '@types/node': ^20.19.0 || >=22.12.0 ··· 1083 2462 optional: true 1084 2463 1085 2464 vitest@4.0.18: 1086 - resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} 1087 - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} 2465 + resolution: 2466 + { 2467 + integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==, 2468 + } 2469 + engines: { node: ^20.0.0 || ^22.0.0 || >=24.0.0 } 1088 2470 hasBin: true 1089 2471 peerDependencies: 1090 2472 '@edge-runtime/vm': '*' ··· 1117 2499 optional: true 1118 2500 1119 2501 which@2.0.2: 1120 - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1121 - engines: {node: '>= 8'} 2502 + resolution: 2503 + { 2504 + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, 2505 + } 2506 + engines: { node: '>= 8' } 1122 2507 hasBin: true 1123 2508 1124 2509 why-is-node-running@2.3.0: 1125 - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1126 - engines: {node: '>=8'} 2510 + resolution: 2511 + { 2512 + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, 2513 + } 2514 + engines: { node: '>=8' } 1127 2515 hasBin: true 1128 2516 1129 2517 word-wrap@1.2.5: 1130 - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1131 - engines: {node: '>=0.10.0'} 2518 + resolution: 2519 + { 2520 + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, 2521 + } 2522 + engines: { node: '>=0.10.0' } 2523 + 2524 + wrap-ansi@7.0.0: 2525 + resolution: 2526 + { 2527 + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, 2528 + } 2529 + engines: { node: '>=10' } 2530 + 2531 + wrap-ansi@9.0.2: 2532 + resolution: 2533 + { 2534 + integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==, 2535 + } 2536 + engines: { node: '>=18' } 2537 + 2538 + y18n@5.0.8: 2539 + resolution: 2540 + { 2541 + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, 2542 + } 2543 + engines: { node: '>=10' } 2544 + 2545 + yaml@2.8.2: 2546 + resolution: 2547 + { 2548 + integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==, 2549 + } 2550 + engines: { node: '>= 14.6' } 2551 + hasBin: true 2552 + 2553 + yargs-parser@21.1.1: 2554 + resolution: 2555 + { 2556 + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, 2557 + } 2558 + engines: { node: '>=12' } 2559 + 2560 + yargs@17.7.2: 2561 + resolution: 2562 + { 2563 + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, 2564 + } 2565 + engines: { node: '>=12' } 1132 2566 1133 2567 yesno@0.4.0: 1134 - resolution: {integrity: sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==} 2568 + resolution: 2569 + { 2570 + integrity: sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==, 2571 + } 1135 2572 1136 2573 yocto-queue@0.1.0: 1137 - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1138 - engines: {node: '>=10'} 2574 + resolution: 2575 + { 2576 + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, 2577 + } 2578 + engines: { node: '>=10' } 1139 2579 1140 2580 zod@3.25.76: 1141 - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 2581 + resolution: 2582 + { 2583 + integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==, 2584 + } 1142 2585 1143 2586 zod@4.3.6: 1144 - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} 2587 + resolution: 2588 + { 2589 + integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==, 2590 + } 1145 2591 1146 2592 snapshots: 1147 - 1148 2593 '@atproto/common-web@0.4.16': 1149 2594 dependencies: 1150 2595 '@atproto/lex-data': 0.0.11 ··· 1187 2632 dependencies: 1188 2633 tslib: 2.8.1 1189 2634 2635 + '@babel/code-frame@7.29.0': 2636 + dependencies: 2637 + '@babel/helper-validator-identifier': 7.28.5 2638 + js-tokens: 4.0.0 2639 + picocolors: 1.1.1 2640 + 1190 2641 '@babel/helper-string-parser@7.27.1': {} 1191 2642 1192 2643 '@babel/helper-validator-identifier@7.28.5': {} ··· 1202 2653 1203 2654 '@bcoe/v8-coverage@1.0.2': {} 1204 2655 2656 + '@commitlint/cli@20.4.2(@types/node@25.2.3)(typescript@5.9.3)': 2657 + dependencies: 2658 + '@commitlint/format': 20.4.0 2659 + '@commitlint/lint': 20.4.2 2660 + '@commitlint/load': 20.4.0(@types/node@25.2.3)(typescript@5.9.3) 2661 + '@commitlint/read': 20.4.0 2662 + '@commitlint/types': 20.4.0 2663 + tinyexec: 1.0.2 2664 + yargs: 17.7.2 2665 + transitivePeerDependencies: 2666 + - '@types/node' 2667 + - typescript 2668 + 2669 + '@commitlint/config-conventional@20.4.2': 2670 + dependencies: 2671 + '@commitlint/types': 20.4.0 2672 + conventional-changelog-conventionalcommits: 9.1.0 2673 + 2674 + '@commitlint/config-validator@20.4.0': 2675 + dependencies: 2676 + '@commitlint/types': 20.4.0 2677 + ajv: 8.18.0 2678 + 2679 + '@commitlint/ensure@20.4.1': 2680 + dependencies: 2681 + '@commitlint/types': 20.4.0 2682 + lodash.camelcase: 4.3.0 2683 + lodash.kebabcase: 4.1.1 2684 + lodash.snakecase: 4.1.1 2685 + lodash.startcase: 4.4.0 2686 + lodash.upperfirst: 4.3.1 2687 + 2688 + '@commitlint/execute-rule@20.0.0': {} 2689 + 2690 + '@commitlint/format@20.4.0': 2691 + dependencies: 2692 + '@commitlint/types': 20.4.0 2693 + picocolors: 1.1.1 2694 + 2695 + '@commitlint/is-ignored@20.4.1': 2696 + dependencies: 2697 + '@commitlint/types': 20.4.0 2698 + semver: 7.7.4 2699 + 2700 + '@commitlint/lint@20.4.2': 2701 + dependencies: 2702 + '@commitlint/is-ignored': 20.4.1 2703 + '@commitlint/parse': 20.4.1 2704 + '@commitlint/rules': 20.4.2 2705 + '@commitlint/types': 20.4.0 2706 + 2707 + '@commitlint/load@20.4.0(@types/node@25.2.3)(typescript@5.9.3)': 2708 + dependencies: 2709 + '@commitlint/config-validator': 20.4.0 2710 + '@commitlint/execute-rule': 20.0.0 2711 + '@commitlint/resolve-extends': 20.4.0 2712 + '@commitlint/types': 20.4.0 2713 + cosmiconfig: 9.0.0(typescript@5.9.3) 2714 + cosmiconfig-typescript-loader: 6.2.0(@types/node@25.2.3)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) 2715 + is-plain-obj: 4.1.0 2716 + lodash.mergewith: 4.6.2 2717 + picocolors: 1.1.1 2718 + transitivePeerDependencies: 2719 + - '@types/node' 2720 + - typescript 2721 + 2722 + '@commitlint/message@20.4.0': {} 2723 + 2724 + '@commitlint/parse@20.4.1': 2725 + dependencies: 2726 + '@commitlint/types': 20.4.0 2727 + conventional-changelog-angular: 8.1.0 2728 + conventional-commits-parser: 6.2.1 2729 + 2730 + '@commitlint/read@20.4.0': 2731 + dependencies: 2732 + '@commitlint/top-level': 20.4.0 2733 + '@commitlint/types': 20.4.0 2734 + git-raw-commits: 4.0.0 2735 + minimist: 1.2.8 2736 + tinyexec: 1.0.2 2737 + 2738 + '@commitlint/resolve-extends@20.4.0': 2739 + dependencies: 2740 + '@commitlint/config-validator': 20.4.0 2741 + '@commitlint/types': 20.4.0 2742 + global-directory: 4.0.1 2743 + import-meta-resolve: 4.2.0 2744 + lodash.mergewith: 4.6.2 2745 + resolve-from: 5.0.0 2746 + 2747 + '@commitlint/rules@20.4.2': 2748 + dependencies: 2749 + '@commitlint/ensure': 20.4.1 2750 + '@commitlint/message': 20.4.0 2751 + '@commitlint/to-lines': 20.0.0 2752 + '@commitlint/types': 20.4.0 2753 + 2754 + '@commitlint/to-lines@20.0.0': {} 2755 + 2756 + '@commitlint/top-level@20.4.0': 2757 + dependencies: 2758 + escalade: 3.2.0 2759 + 2760 + '@commitlint/types@20.4.0': 2761 + dependencies: 2762 + conventional-commits-parser: 6.2.1 2763 + picocolors: 1.1.1 2764 + 1205 2765 '@esbuild/aix-ppc64@0.27.3': 1206 2766 optional: true 1207 2767 ··· 1280 2840 '@esbuild/win32-x64@0.27.3': 1281 2841 optional: true 1282 2842 1283 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)': 2843 + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': 1284 2844 dependencies: 1285 - eslint: 9.39.2 2845 + eslint: 9.39.2(jiti@2.6.1) 1286 2846 eslint-visitor-keys: 3.4.3 1287 2847 1288 2848 '@eslint-community/regexpp@4.12.2': {} ··· 1444 3004 dependencies: 1445 3005 undici-types: 7.16.0 1446 3006 1447 - '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': 3007 + '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 1448 3008 dependencies: 1449 3009 '@eslint-community/regexpp': 4.12.2 1450 - '@typescript-eslint/parser': 8.55.0(eslint@9.39.2)(typescript@5.9.3) 3010 + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 1451 3011 '@typescript-eslint/scope-manager': 8.55.0 1452 - '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.2)(typescript@5.9.3) 1453 - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2)(typescript@5.9.3) 3012 + '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3013 + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 1454 3014 '@typescript-eslint/visitor-keys': 8.55.0 1455 - eslint: 9.39.2 3015 + eslint: 9.39.2(jiti@2.6.1) 1456 3016 ignore: 7.0.5 1457 3017 natural-compare: 1.4.0 1458 3018 ts-api-utils: 2.4.0(typescript@5.9.3) ··· 1460 3020 transitivePeerDependencies: 1461 3021 - supports-color 1462 3022 1463 - '@typescript-eslint/parser@8.55.0(eslint@9.39.2)(typescript@5.9.3)': 3023 + '@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 1464 3024 dependencies: 1465 3025 '@typescript-eslint/scope-manager': 8.55.0 1466 3026 '@typescript-eslint/types': 8.55.0 1467 3027 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) 1468 3028 '@typescript-eslint/visitor-keys': 8.55.0 1469 3029 debug: 4.4.3 1470 - eslint: 9.39.2 3030 + eslint: 9.39.2(jiti@2.6.1) 1471 3031 typescript: 5.9.3 1472 3032 transitivePeerDependencies: 1473 3033 - supports-color ··· 1490 3050 dependencies: 1491 3051 typescript: 5.9.3 1492 3052 1493 - '@typescript-eslint/type-utils@8.55.0(eslint@9.39.2)(typescript@5.9.3)': 3053 + '@typescript-eslint/type-utils@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 1494 3054 dependencies: 1495 3055 '@typescript-eslint/types': 8.55.0 1496 3056 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) 1497 - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2)(typescript@5.9.3) 3057 + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 1498 3058 debug: 4.4.3 1499 - eslint: 9.39.2 3059 + eslint: 9.39.2(jiti@2.6.1) 1500 3060 ts-api-utils: 2.4.0(typescript@5.9.3) 1501 3061 typescript: 5.9.3 1502 3062 transitivePeerDependencies: ··· 1519 3079 transitivePeerDependencies: 1520 3080 - supports-color 1521 3081 1522 - '@typescript-eslint/utils@8.55.0(eslint@9.39.2)(typescript@5.9.3)': 3082 + '@typescript-eslint/utils@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 1523 3083 dependencies: 1524 - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) 3084 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) 1525 3085 '@typescript-eslint/scope-manager': 8.55.0 1526 3086 '@typescript-eslint/types': 8.55.0 1527 3087 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) 1528 - eslint: 9.39.2 3088 + eslint: 9.39.2(jiti@2.6.1) 1529 3089 typescript: 5.9.3 1530 3090 transitivePeerDependencies: 1531 3091 - supports-color ··· 1535 3095 '@typescript-eslint/types': 8.55.0 1536 3096 eslint-visitor-keys: 4.2.1 1537 3097 1538 - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.2.3))': 3098 + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2))': 1539 3099 dependencies: 1540 3100 '@bcoe/v8-coverage': 1.0.2 1541 3101 '@vitest/utils': 4.0.18 ··· 1547 3107 obug: 2.1.1 1548 3108 std-env: 3.10.0 1549 3109 tinyrainbow: 3.0.3 1550 - vitest: 4.0.18(@types/node@25.2.3) 3110 + vitest: 4.0.18(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2) 1551 3111 1552 3112 '@vitest/expect@4.0.18': 1553 3113 dependencies: ··· 1558 3118 chai: 6.2.2 1559 3119 tinyrainbow: 3.0.3 1560 3120 1561 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3))': 3121 + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2))': 1562 3122 dependencies: 1563 3123 '@vitest/spy': 4.0.18 1564 3124 estree-walker: 3.0.3 1565 3125 magic-string: 0.30.21 1566 3126 optionalDependencies: 1567 - vite: 7.3.1(@types/node@25.2.3) 3127 + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2) 1568 3128 1569 3129 '@vitest/pretty-format@4.0.18': 1570 3130 dependencies: ··· 1601 3161 json-schema-traverse: 0.4.1 1602 3162 uri-js: 4.4.1 1603 3163 3164 + ajv@8.18.0: 3165 + dependencies: 3166 + fast-deep-equal: 3.1.3 3167 + fast-uri: 3.1.0 3168 + json-schema-traverse: 1.0.0 3169 + require-from-string: 2.0.2 3170 + 3171 + ansi-escapes@7.3.0: 3172 + dependencies: 3173 + environment: 1.1.0 3174 + 3175 + ansi-regex@5.0.1: {} 3176 + 3177 + ansi-regex@6.2.2: {} 3178 + 1604 3179 ansi-styles@4.3.0: 1605 3180 dependencies: 1606 3181 color-convert: 2.0.1 1607 3182 3183 + ansi-styles@6.2.3: {} 3184 + 1608 3185 argparse@2.0.1: {} 3186 + 3187 + array-ify@1.0.0: {} 1609 3188 1610 3189 assertion-error@2.0.1: {} 1611 3190 ··· 1625 3204 brace-expansion@2.0.2: 1626 3205 dependencies: 1627 3206 balanced-match: 1.0.2 3207 + 3208 + braces@3.0.3: 3209 + dependencies: 3210 + fill-range: 7.1.1 1628 3211 1629 3212 callsites@3.1.0: {} 1630 3213 ··· 1635 3218 ansi-styles: 4.3.0 1636 3219 supports-color: 7.2.0 1637 3220 3221 + cli-cursor@5.0.0: 3222 + dependencies: 3223 + restore-cursor: 5.1.0 3224 + 3225 + cli-truncate@5.1.1: 3226 + dependencies: 3227 + slice-ansi: 7.1.2 3228 + string-width: 8.2.0 3229 + 3230 + cliui@8.0.1: 3231 + dependencies: 3232 + string-width: 4.2.3 3233 + strip-ansi: 6.0.1 3234 + wrap-ansi: 7.0.0 3235 + 1638 3236 code-block-writer@13.0.3: {} 1639 3237 1640 3238 color-convert@2.0.1: ··· 1643 3241 1644 3242 color-name@1.1.4: {} 1645 3243 3244 + colorette@2.0.20: {} 3245 + 3246 + commander@14.0.3: {} 3247 + 1646 3248 commander@9.5.0: {} 1647 3249 3250 + compare-func@2.0.0: 3251 + dependencies: 3252 + array-ify: 1.0.0 3253 + dot-prop: 5.3.0 3254 + 1648 3255 concat-map@0.0.1: {} 1649 3256 3257 + conventional-changelog-angular@8.1.0: 3258 + dependencies: 3259 + compare-func: 2.0.0 3260 + 3261 + conventional-changelog-conventionalcommits@9.1.0: 3262 + dependencies: 3263 + compare-func: 2.0.0 3264 + 3265 + conventional-commits-parser@6.2.1: 3266 + dependencies: 3267 + meow: 13.2.0 3268 + 3269 + cosmiconfig-typescript-loader@6.2.0(@types/node@25.2.3)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): 3270 + dependencies: 3271 + '@types/node': 25.2.3 3272 + cosmiconfig: 9.0.0(typescript@5.9.3) 3273 + jiti: 2.6.1 3274 + typescript: 5.9.3 3275 + 3276 + cosmiconfig@9.0.0(typescript@5.9.3): 3277 + dependencies: 3278 + env-paths: 2.2.1 3279 + import-fresh: 3.3.1 3280 + js-yaml: 4.1.1 3281 + parse-json: 5.2.0 3282 + optionalDependencies: 3283 + typescript: 5.9.3 3284 + 1650 3285 cross-spawn@7.0.6: 1651 3286 dependencies: 1652 3287 path-key: 3.1.1 1653 3288 shebang-command: 2.0.0 1654 3289 which: 2.0.2 3290 + 3291 + dargs@8.1.0: {} 1655 3292 1656 3293 debug@4.4.3: 1657 3294 dependencies: ··· 1659 3296 1660 3297 deep-is@0.1.4: {} 1661 3298 3299 + dot-prop@5.3.0: 3300 + dependencies: 3301 + is-obj: 2.0.0 3302 + 3303 + emoji-regex@10.6.0: {} 3304 + 3305 + emoji-regex@8.0.0: {} 3306 + 3307 + env-paths@2.2.1: {} 3308 + 3309 + environment@1.1.0: {} 3310 + 3311 + error-ex@1.3.4: 3312 + dependencies: 3313 + is-arrayish: 0.2.1 3314 + 1662 3315 es-module-lexer@1.7.0: {} 1663 3316 1664 3317 esbuild@0.27.3: ··· 1689 3342 '@esbuild/win32-arm64': 0.27.3 1690 3343 '@esbuild/win32-ia32': 0.27.3 1691 3344 '@esbuild/win32-x64': 0.27.3 3345 + 3346 + escalade@3.2.0: {} 1692 3347 1693 3348 escape-string-regexp@4.0.0: {} 1694 3349 ··· 1701 3356 1702 3357 eslint-visitor-keys@4.2.1: {} 1703 3358 1704 - eslint@9.39.2: 3359 + eslint@9.39.2(jiti@2.6.1): 1705 3360 dependencies: 1706 - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) 3361 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) 1707 3362 '@eslint-community/regexpp': 4.12.2 1708 3363 '@eslint/config-array': 0.21.1 1709 3364 '@eslint/config-helpers': 0.4.2 ··· 1737 3392 minimatch: 3.1.2 1738 3393 natural-compare: 1.4.0 1739 3394 optionator: 0.9.4 3395 + optionalDependencies: 3396 + jiti: 2.6.1 1740 3397 transitivePeerDependencies: 1741 3398 - supports-color 1742 3399 ··· 1762 3419 1763 3420 esutils@2.0.3: {} 1764 3421 3422 + eventemitter3@5.0.4: {} 3423 + 1765 3424 expect-type@1.3.0: {} 1766 3425 1767 3426 fast-deep-equal@3.1.3: {} ··· 1770 3429 1771 3430 fast-levenshtein@2.0.6: {} 1772 3431 3432 + fast-uri@3.1.0: {} 3433 + 1773 3434 fdir@6.5.0(picomatch@4.0.3): 1774 3435 optionalDependencies: 1775 3436 picomatch: 4.0.3 ··· 1778 3439 dependencies: 1779 3440 flat-cache: 4.0.1 1780 3441 3442 + fill-range@7.1.1: 3443 + dependencies: 3444 + to-regex-range: 5.0.1 3445 + 1781 3446 find-up@5.0.0: 1782 3447 dependencies: 1783 3448 locate-path: 6.0.0 ··· 1793 3458 fsevents@2.3.3: 1794 3459 optional: true 1795 3460 3461 + get-caller-file@2.0.5: {} 3462 + 3463 + get-east-asian-width@1.5.0: {} 3464 + 3465 + git-raw-commits@4.0.0: 3466 + dependencies: 3467 + dargs: 8.1.0 3468 + meow: 12.1.1 3469 + split2: 4.2.0 3470 + 1796 3471 glob-parent@6.0.2: 1797 3472 dependencies: 1798 3473 is-glob: 4.0.3 1799 3474 3475 + global-directory@4.0.1: 3476 + dependencies: 3477 + ini: 4.1.1 3478 + 1800 3479 globals@14.0.0: {} 1801 3480 1802 3481 has-flag@4.0.0: {} 1803 3482 1804 3483 html-escaper@2.0.2: {} 3484 + 3485 + husky@9.1.7: {} 1805 3486 1806 3487 ignore@5.3.2: {} 1807 3488 ··· 1811 3492 dependencies: 1812 3493 parent-module: 1.0.1 1813 3494 resolve-from: 4.0.0 3495 + 3496 + import-meta-resolve@4.2.0: {} 1814 3497 1815 3498 imurmurhash@0.1.4: {} 1816 3499 3500 + ini@4.1.1: {} 3501 + 3502 + is-arrayish@0.2.1: {} 3503 + 1817 3504 is-extglob@2.1.1: {} 3505 + 3506 + is-fullwidth-code-point@3.0.0: {} 3507 + 3508 + is-fullwidth-code-point@5.1.0: 3509 + dependencies: 3510 + get-east-asian-width: 1.5.0 1818 3511 1819 3512 is-glob@4.0.3: 1820 3513 dependencies: 1821 3514 is-extglob: 2.1.1 1822 3515 3516 + is-number@7.0.0: {} 3517 + 3518 + is-obj@2.0.0: {} 3519 + 3520 + is-plain-obj@4.1.0: {} 3521 + 1823 3522 isexe@2.0.0: {} 1824 3523 1825 3524 iso-datestring-validator@2.2.2: {} ··· 1837 3536 html-escaper: 2.0.2 1838 3537 istanbul-lib-report: 3.0.1 1839 3538 3539 + jiti@2.6.1: {} 3540 + 1840 3541 js-tokens@10.0.0: {} 3542 + 3543 + js-tokens@4.0.0: {} 1841 3544 1842 3545 js-yaml@4.1.1: 1843 3546 dependencies: ··· 1845 3548 1846 3549 json-buffer@3.0.1: {} 1847 3550 3551 + json-parse-even-better-errors@2.3.1: {} 3552 + 1848 3553 json-schema-traverse@0.4.1: {} 3554 + 3555 + json-schema-traverse@1.0.0: {} 1849 3556 1850 3557 json-stable-stringify-without-jsonify@1.0.1: {} 1851 3558 ··· 1858 3565 prelude-ls: 1.2.1 1859 3566 type-check: 0.4.0 1860 3567 3568 + lines-and-columns@1.2.4: {} 3569 + 3570 + lint-staged@16.2.7: 3571 + dependencies: 3572 + commander: 14.0.3 3573 + listr2: 9.0.5 3574 + micromatch: 4.0.8 3575 + nano-spawn: 2.0.0 3576 + pidtree: 0.6.0 3577 + string-argv: 0.3.2 3578 + yaml: 2.8.2 3579 + 3580 + listr2@9.0.5: 3581 + dependencies: 3582 + cli-truncate: 5.1.1 3583 + colorette: 2.0.20 3584 + eventemitter3: 5.0.4 3585 + log-update: 6.1.0 3586 + rfdc: 1.4.1 3587 + wrap-ansi: 9.0.2 3588 + 1861 3589 locate-path@6.0.0: 1862 3590 dependencies: 1863 3591 p-locate: 5.0.0 1864 3592 3593 + lodash.camelcase@4.3.0: {} 3594 + 3595 + lodash.kebabcase@4.1.1: {} 3596 + 1865 3597 lodash.merge@4.6.2: {} 1866 3598 3599 + lodash.mergewith@4.6.2: {} 3600 + 3601 + lodash.snakecase@4.1.1: {} 3602 + 3603 + lodash.startcase@4.4.0: {} 3604 + 3605 + lodash.upperfirst@4.3.1: {} 3606 + 3607 + log-update@6.1.0: 3608 + dependencies: 3609 + ansi-escapes: 7.3.0 3610 + cli-cursor: 5.0.0 3611 + slice-ansi: 7.1.2 3612 + strip-ansi: 7.1.2 3613 + wrap-ansi: 9.0.2 3614 + 1867 3615 magic-string@0.30.21: 1868 3616 dependencies: 1869 3617 '@jridgewell/sourcemap-codec': 1.5.5 ··· 1878 3626 dependencies: 1879 3627 semver: 7.7.4 1880 3628 3629 + meow@12.1.1: {} 3630 + 3631 + meow@13.2.0: {} 3632 + 3633 + micromatch@4.0.8: 3634 + dependencies: 3635 + braces: 3.0.3 3636 + picomatch: 2.3.1 3637 + 3638 + mimic-function@5.0.1: {} 3639 + 1881 3640 minimatch@3.1.2: 1882 3641 dependencies: 1883 3642 brace-expansion: 1.1.12 ··· 1885 3644 minimatch@9.0.5: 1886 3645 dependencies: 1887 3646 brace-expansion: 2.0.2 3647 + 3648 + minimist@1.2.8: {} 1888 3649 1889 3650 ms@2.1.3: {} 1890 3651 ··· 1892 3653 1893 3654 multiformats@9.9.0: {} 1894 3655 3656 + nano-spawn@2.0.0: {} 3657 + 1895 3658 nanoid@3.3.11: {} 1896 3659 1897 3660 natural-compare@1.4.0: {} 1898 3661 1899 3662 obug@2.1.1: {} 1900 3663 3664 + onetime@7.0.0: 3665 + dependencies: 3666 + mimic-function: 5.0.1 3667 + 1901 3668 optionator@0.9.4: 1902 3669 dependencies: 1903 3670 deep-is: 0.1.4 ··· 1919 3686 dependencies: 1920 3687 callsites: 3.1.0 1921 3688 3689 + parse-json@5.2.0: 3690 + dependencies: 3691 + '@babel/code-frame': 7.29.0 3692 + error-ex: 1.3.4 3693 + json-parse-even-better-errors: 2.3.1 3694 + lines-and-columns: 1.2.4 3695 + 1922 3696 path-browserify@1.0.1: {} 1923 3697 1924 3698 path-exists@4.0.0: {} ··· 1928 3702 pathe@2.0.3: {} 1929 3703 1930 3704 picocolors@1.1.1: {} 3705 + 3706 + picomatch@2.3.1: {} 1931 3707 1932 3708 picomatch@4.0.3: {} 1933 3709 3710 + pidtree@0.6.0: {} 3711 + 1934 3712 postcss@8.5.6: 1935 3713 dependencies: 1936 3714 nanoid: 3.3.11 ··· 1943 3721 1944 3722 punycode@2.3.1: {} 1945 3723 3724 + require-directory@2.1.1: {} 3725 + 3726 + require-from-string@2.0.2: {} 3727 + 1946 3728 resolve-from@4.0.0: {} 3729 + 3730 + resolve-from@5.0.0: {} 3731 + 3732 + restore-cursor@5.1.0: 3733 + dependencies: 3734 + onetime: 7.0.0 3735 + signal-exit: 4.1.0 3736 + 3737 + rfdc@1.4.1: {} 1947 3738 1948 3739 rollup@4.57.1: 1949 3740 dependencies: ··· 1986 3777 1987 3778 siginfo@2.0.0: {} 1988 3779 3780 + signal-exit@4.1.0: {} 3781 + 3782 + slice-ansi@7.1.2: 3783 + dependencies: 3784 + ansi-styles: 6.2.3 3785 + is-fullwidth-code-point: 5.1.0 3786 + 1989 3787 source-map-js@1.2.1: {} 1990 3788 3789 + split2@4.2.0: {} 3790 + 1991 3791 stackback@0.0.2: {} 1992 3792 1993 3793 std-env@3.10.0: {} 1994 3794 3795 + string-argv@0.3.2: {} 3796 + 3797 + string-width@4.2.3: 3798 + dependencies: 3799 + emoji-regex: 8.0.0 3800 + is-fullwidth-code-point: 3.0.0 3801 + strip-ansi: 6.0.1 3802 + 3803 + string-width@7.2.0: 3804 + dependencies: 3805 + emoji-regex: 10.6.0 3806 + get-east-asian-width: 1.5.0 3807 + strip-ansi: 7.1.2 3808 + 3809 + string-width@8.2.0: 3810 + dependencies: 3811 + get-east-asian-width: 1.5.0 3812 + strip-ansi: 7.1.2 3813 + 3814 + strip-ansi@6.0.1: 3815 + dependencies: 3816 + ansi-regex: 5.0.1 3817 + 3818 + strip-ansi@7.1.2: 3819 + dependencies: 3820 + ansi-regex: 6.2.2 3821 + 1995 3822 strip-json-comments@3.1.1: {} 1996 3823 1997 3824 supports-color@7.2.0: ··· 2009 3836 2010 3837 tinyrainbow@3.0.3: {} 2011 3838 3839 + to-regex-range@5.0.1: 3840 + dependencies: 3841 + is-number: 7.0.0 3842 + 2012 3843 ts-api-utils@2.4.0(typescript@5.9.3): 2013 3844 dependencies: 2014 3845 typescript: 5.9.3 ··· 2024 3855 dependencies: 2025 3856 prelude-ls: 1.2.1 2026 3857 2027 - typescript-eslint@8.55.0(eslint@9.39.2)(typescript@5.9.3): 3858 + typescript-eslint@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): 2028 3859 dependencies: 2029 - '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) 2030 - '@typescript-eslint/parser': 8.55.0(eslint@9.39.2)(typescript@5.9.3) 3860 + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3861 + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 2031 3862 '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) 2032 - '@typescript-eslint/utils': 8.55.0(eslint@9.39.2)(typescript@5.9.3) 2033 - eslint: 9.39.2 3863 + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3864 + eslint: 9.39.2(jiti@2.6.1) 2034 3865 typescript: 5.9.3 2035 3866 transitivePeerDependencies: 2036 3867 - supports-color ··· 2049 3880 dependencies: 2050 3881 punycode: 2.3.1 2051 3882 2052 - vite@7.3.1(@types/node@25.2.3): 3883 + vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2): 2053 3884 dependencies: 2054 3885 esbuild: 0.27.3 2055 3886 fdir: 6.5.0(picomatch@4.0.3) ··· 2060 3891 optionalDependencies: 2061 3892 '@types/node': 25.2.3 2062 3893 fsevents: 2.3.3 3894 + jiti: 2.6.1 3895 + yaml: 2.8.2 2063 3896 2064 - vitest@4.0.18(@types/node@25.2.3): 3897 + vitest@4.0.18(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2): 2065 3898 dependencies: 2066 3899 '@vitest/expect': 4.0.18 2067 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)) 3900 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2)) 2068 3901 '@vitest/pretty-format': 4.0.18 2069 3902 '@vitest/runner': 4.0.18 2070 3903 '@vitest/snapshot': 4.0.18 ··· 2081 3914 tinyexec: 1.0.2 2082 3915 tinyglobby: 0.2.15 2083 3916 tinyrainbow: 3.0.3 2084 - vite: 7.3.1(@types/node@25.2.3) 3917 + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(yaml@2.8.2) 2085 3918 why-is-node-running: 2.3.0 2086 3919 optionalDependencies: 2087 3920 '@types/node': 25.2.3 ··· 2108 3941 stackback: 0.0.2 2109 3942 2110 3943 word-wrap@1.2.5: {} 3944 + 3945 + wrap-ansi@7.0.0: 3946 + dependencies: 3947 + ansi-styles: 4.3.0 3948 + string-width: 4.2.3 3949 + strip-ansi: 6.0.1 3950 + 3951 + wrap-ansi@9.0.2: 3952 + dependencies: 3953 + ansi-styles: 6.2.3 3954 + string-width: 7.2.0 3955 + strip-ansi: 7.1.2 3956 + 3957 + y18n@5.0.8: {} 3958 + 3959 + yaml@2.8.2: {} 3960 + 3961 + yargs-parser@21.1.1: {} 3962 + 3963 + yargs@17.7.2: 3964 + dependencies: 3965 + cliui: 8.0.1 3966 + escalade: 3.2.0 3967 + get-caller-file: 2.0.5 3968 + require-directory: 2.1.1 3969 + string-width: 4.2.3 3970 + y18n: 5.0.8 3971 + yargs-parser: 21.1.1 2111 3972 2112 3973 yesno@0.4.0: {} 2113 3974
+13 -11
pnpm-workspace.yaml
··· 2 2 # When running in the workspace root, the root pnpm-workspace.yaml takes precedence. 3 3 # Keep these versions in sync with the workspace root catalog. 4 4 catalog: 5 - zod: "^4.3.6" 6 - vitest: "^4.0.18" 7 - typescript: "^5.9.3" 8 - typescript-eslint: "^8.55.0" 9 - eslint: "^9.39.2" 10 - "@types/node": "^25.2.3" 11 - "@commitlint/cli": "^20.4.1" 12 - "@commitlint/config-conventional": "^20.4.1" 13 - "@vitest/coverage-v8": "^4.0.18" 14 - husky: "^9.1.7" 15 - multiformats: "^13.4.2" 5 + zod: '^4.3.6' 6 + vitest: '^4.0.18' 7 + typescript: '^5.9.3' 8 + typescript-eslint: '^8.55.0' 9 + eslint: '^9.39.2' 10 + '@types/node': '^25.2.3' 11 + '@commitlint/cli': '^20.4.1' 12 + '@commitlint/config-conventional': '^20.4.1' 13 + '@vitest/coverage-v8': '^4.0.18' 14 + husky: '^9.1.7' 15 + lint-staged: '^16.2.7' 16 + multiformats: '^13.4.2' 17 + prettier: '^3.8.1'
+10
prettier.config.mjs
··· 1 + const config = { 2 + semi: false, 3 + singleQuote: true, 4 + tabWidth: 2, 5 + trailingComma: 'es5', 6 + printWidth: 100, 7 + plugins: [], 8 + } 9 + 10 + export default config
+19 -22
scripts/fixup-generated.js
··· 8 8 * This script fixes the imports and replaces the generated index.ts 9 9 * with a clean re-export file. 10 10 */ 11 - import { readdir, readFile, writeFile } from "node:fs/promises"; 12 - import { join } from "node:path"; 11 + import { readdir, readFile, writeFile } from 'node:fs/promises' 12 + import { join } from 'node:path' 13 13 14 - const GENERATED_DIR = new URL("../src/generated", import.meta.url).pathname; 14 + const GENERATED_DIR = new URL('../src/generated', import.meta.url).pathname 15 15 16 16 const REPLACEMENT_INDEX = `/** 17 17 * GENERATED CODE - Re-exports only. ··· 26 26 export * as ForumBarazoTopicPost from "./types/forum/barazo/topic/post.js"; 27 27 export * as ForumBarazoTopicReply from "./types/forum/barazo/topic/reply.js"; 28 28 export { schemas, validate } from "./lexicons.js"; 29 - `; 29 + ` 30 30 31 31 async function getTypeFiles(dir) { 32 - const entries = await readdir(dir, { withFileTypes: true, recursive: true }); 32 + const entries = await readdir(dir, { withFileTypes: true, recursive: true }) 33 33 return entries 34 - .filter((e) => e.isFile() && e.name.endsWith(".ts")) 35 - .map((e) => join(e.parentPath ?? e.path, e.name)); 34 + .filter((e) => e.isFile() && e.name.endsWith('.ts')) 35 + .map((e) => join(e.parentPath ?? e.path, e.name)) 36 36 } 37 37 38 38 async function fixImportExtensions(filePath) { 39 - let content = await readFile(filePath, "utf-8"); 40 - const original = content; 39 + let content = await readFile(filePath, 'utf-8') 40 + const original = content 41 41 42 42 // Fix relative imports missing .js extension 43 43 // Match: from './foo' or from '../foo' but NOT from './foo.js' or from '@scope/pkg' 44 - content = content.replace( 45 - /from '(\.\.?\/[^']+?)(?<!\.js)'/g, 46 - "from '$1.js'", 47 - ); 44 + content = content.replace(/from '(\.\.?\/[^']+?)(?<!\.js)'/g, "from '$1.js'") 48 45 49 46 if (content !== original) { 50 - await writeFile(filePath, content); 47 + await writeFile(filePath, content) 51 48 } 52 49 } 53 50 54 51 async function main() { 55 52 // Replace the generated index.ts 56 - await writeFile(join(GENERATED_DIR, "index.ts"), REPLACEMENT_INDEX); 53 + await writeFile(join(GENERATED_DIR, 'index.ts'), REPLACEMENT_INDEX) 57 54 58 55 // Fix import extensions in all generated type files 59 - const files = await getTypeFiles(join(GENERATED_DIR, "types")); 56 + const files = await getTypeFiles(join(GENERATED_DIR, 'types')) 60 57 for (const file of files) { 61 - await fixImportExtensions(file); 58 + await fixImportExtensions(file) 62 59 } 63 60 64 61 // Also fix lexicons.ts and util.ts 65 - await fixImportExtensions(join(GENERATED_DIR, "lexicons.ts")); 66 - await fixImportExtensions(join(GENERATED_DIR, "util.ts")); 62 + await fixImportExtensions(join(GENERATED_DIR, 'lexicons.ts')) 63 + await fixImportExtensions(join(GENERATED_DIR, 'util.ts')) 67 64 68 65 console.log( 69 - `Fixed ${files.length + 2} generated files (${files.length} types + lexicons.ts + util.ts)`, 70 - ); 66 + `Fixed ${files.length + 2} generated files (${files.length} types + lexicons.ts + util.ts)` 67 + ) 71 68 } 72 69 73 - main(); 70 + main()
+10 -10
src/index.ts
··· 15 15 ForumBarazoActorPreferences, 16 16 ComAtprotoRepoStrongRef, 17 17 ComAtprotoLabelDefs, 18 - } from "./generated/index.js"; 18 + } from './generated/index.js' 19 19 20 20 // Generated lexicon schemas and validation (from lex-cli) 21 - export { schemas, validate } from "./generated/index.js"; 22 - export { ids } from "./generated/lexicons.js"; 21 + export { schemas, validate } from './generated/index.js' 22 + export { ids } from './generated/lexicons.js' 23 23 24 24 // Zod validation schemas (hand-written, mirrors lexicon constraints) 25 25 export { ··· 35 35 type TopicReplyInput, 36 36 type ReactionInput, 37 37 type ActorPreferencesInput, 38 - } from "./validation/index.js"; 38 + } from './validation/index.js' 39 39 40 40 // Lexicon ID constants 41 41 export const LEXICON_IDS = { 42 - TopicPost: "forum.barazo.topic.post", 43 - TopicReply: "forum.barazo.topic.reply", 44 - Reaction: "forum.barazo.interaction.reaction", 45 - ActorPreferences: "forum.barazo.actor.preferences", 46 - AuthForumAccess: "forum.barazo.authForumAccess", 47 - } as const; 42 + TopicPost: 'forum.barazo.topic.post', 43 + TopicReply: 'forum.barazo.topic.reply', 44 + Reaction: 'forum.barazo.interaction.reaction', 45 + ActorPreferences: 'forum.barazo.actor.preferences', 46 + AuthForumAccess: 'forum.barazo.authForumAccess', 47 + } as const
+6 -6
src/validation/actor-preferences.ts
··· 1 - import { z } from "zod"; 1 + import { z } from 'zod' 2 2 3 - const didRegex = /^did:[a-z]+:[a-zA-Z0-9._:%-]+$/; 3 + const didRegex = /^did:[a-z]+:[a-zA-Z0-9._:%-]+$/ 4 4 5 5 /** Cross-post configuration for new topics. */ 6 6 export const crossPostConfigSchema = z.object({ 7 7 bluesky: z.boolean().optional(), 8 8 frontpage: z.boolean().optional(), 9 - }); 9 + }) 10 10 11 11 /** 12 12 * Zod schema for forum.barazo.actor.preferences records. ··· 15 15 * Singleton record (key: literal:self). 16 16 */ 17 17 export const actorPreferencesSchema = z.object({ 18 - maturityLevel: z.enum(["safe", "mature", "all"]), 18 + maturityLevel: z.enum(['safe', 'mature', 'all']), 19 19 mutedWords: z.array(z.string().max(1000)).max(100).optional(), 20 20 blockedDids: z.array(z.string().regex(didRegex)).max(1000).optional(), 21 21 mutedDids: z.array(z.string().regex(didRegex)).max(1000).optional(), 22 22 crossPostDefaults: crossPostConfigSchema.optional(), 23 23 updatedAt: z.iso.datetime(), 24 - }); 24 + }) 25 25 26 - export type ActorPreferencesInput = z.input<typeof actorPreferencesSchema>; 26 + export type ActorPreferencesInput = z.input<typeof actorPreferencesSchema>
+6 -6
src/validation/index.ts
··· 1 - export { topicPostSchema, type TopicPostInput } from "./topic-post.js"; 2 - export { topicReplySchema, type TopicReplyInput } from "./topic-reply.js"; 3 - export { reactionSchema, type ReactionInput } from "./reaction.js"; 1 + export { topicPostSchema, type TopicPostInput } from './topic-post.js' 2 + export { topicReplySchema, type TopicReplyInput } from './topic-reply.js' 3 + export { reactionSchema, type ReactionInput } from './reaction.js' 4 4 export { 5 5 actorPreferencesSchema, 6 6 crossPostConfigSchema, 7 7 type ActorPreferencesInput, 8 - } from "./actor-preferences.js"; 9 - export { strongRefSchema } from "./strong-ref.js"; 10 - export { selfLabelsSchema, selfLabelSchema } from "./self-labels.js"; 8 + } from './actor-preferences.js' 9 + export { strongRefSchema } from './strong-ref.js' 10 + export { selfLabelsSchema, selfLabelSchema } from './self-labels.js'
+5 -5
src/validation/reaction.ts
··· 1 - import { z } from "zod"; 2 - import { strongRefSchema } from "./strong-ref.js"; 1 + import { z } from 'zod' 2 + import { strongRefSchema } from './strong-ref.js' 3 3 4 - const didRegex = /^did:[a-z]+:[a-zA-Z0-9._:%-]+$/; 4 + const didRegex = /^did:[a-z]+:[a-zA-Z0-9._:%-]+$/ 5 5 6 6 /** 7 7 * Zod schema for forum.barazo.interaction.reaction records. ··· 13 13 type: z.string().min(1).max(300), 14 14 community: z.string().regex(didRegex), 15 15 createdAt: z.iso.datetime(), 16 - }); 16 + }) 17 17 18 - export type ReactionInput = z.input<typeof reactionSchema>; 18 + export type ReactionInput = z.input<typeof reactionSchema>
+3 -3
src/validation/self-labels.ts
··· 1 - import { z } from "zod"; 1 + import { z } from 'zod' 2 2 3 3 /** Self-label value (matches com.atproto.label.defs#selfLabel). */ 4 4 export const selfLabelSchema = z.object({ 5 5 val: z.string().max(128), 6 - }); 6 + }) 7 7 8 8 /** Self-labels object (matches com.atproto.label.defs#selfLabels). */ 9 9 export const selfLabelsSchema = z.object({ 10 10 values: z.array(selfLabelSchema).max(10), 11 - }); 11 + })
+3 -3
src/validation/strong-ref.ts
··· 1 - import { z } from "zod"; 1 + import { z } from 'zod' 2 2 3 3 /** AT Protocol strong reference (AT URI + CID pair). */ 4 4 export const strongRefSchema = z.object({ 5 - uri: z.string().startsWith("at://"), 5 + uri: z.string().startsWith('at://'), 6 6 cid: z.string().min(1), 7 - }); 7 + })
+7 -10
src/validation/topic-post.ts
··· 1 - import { z } from "zod"; 2 - import { selfLabelsSchema } from "./self-labels.js"; 1 + import { z } from 'zod' 2 + import { selfLabelsSchema } from './self-labels.js' 3 3 4 4 /** DID format regex (simplified, catches obvious malformed DIDs). */ 5 - const didRegex = /^did:[a-z]+:[a-zA-Z0-9._:%-]+$/; 5 + const didRegex = /^did:[a-z]+:[a-zA-Z0-9._:%-]+$/ 6 6 7 7 /** 8 8 * Zod schema for forum.barazo.topic.post records. ··· 16 16 export const topicPostSchema = z.object({ 17 17 title: z.string().min(1).max(2000), 18 18 content: z.string().min(1).max(100_000), 19 - contentFormat: z.literal("markdown").optional(), 19 + contentFormat: z.literal('markdown').optional(), 20 20 community: z.string().regex(didRegex), 21 21 category: z.string().min(1).max(640), 22 - tags: z 23 - .array(z.string().min(1).max(300)) 24 - .max(5) 25 - .optional(), 22 + tags: z.array(z.string().min(1).max(300)).max(5).optional(), 26 23 labels: selfLabelsSchema.optional(), 27 24 createdAt: z.iso.datetime(), 28 - }); 25 + }) 29 26 30 - export type TopicPostInput = z.input<typeof topicPostSchema>; 27 + export type TopicPostInput = z.input<typeof topicPostSchema>
+7 -7
src/validation/topic-reply.ts
··· 1 - import { z } from "zod"; 2 - import { strongRefSchema } from "./strong-ref.js"; 3 - import { selfLabelsSchema } from "./self-labels.js"; 1 + import { z } from 'zod' 2 + import { strongRefSchema } from './strong-ref.js' 3 + import { selfLabelsSchema } from './self-labels.js' 4 4 5 - const didRegex = /^did:[a-z]+:[a-zA-Z0-9._:%-]+$/; 5 + const didRegex = /^did:[a-z]+:[a-zA-Z0-9._:%-]+$/ 6 6 7 7 /** 8 8 * Zod schema for forum.barazo.topic.reply records. ··· 11 11 */ 12 12 export const topicReplySchema = z.object({ 13 13 content: z.string().min(1).max(50_000), 14 - contentFormat: z.literal("markdown").optional(), 14 + contentFormat: z.literal('markdown').optional(), 15 15 root: strongRefSchema, 16 16 parent: strongRefSchema, 17 17 community: z.string().regex(didRegex), 18 18 labels: selfLabelsSchema.optional(), 19 19 createdAt: z.iso.datetime(), 20 - }); 20 + }) 21 21 22 - export type TopicReplyInput = z.input<typeof topicReplySchema>; 22 + export type TopicReplyInput = z.input<typeof topicReplySchema>
+260 -280
tests/backward-compatibility.test.ts
··· 17 17 * 4. If any test fails after a schema change, the change is backward-incompatible 18 18 */ 19 19 20 - import { describe, it, expect } from "vitest"; 21 - import * as fs from "node:fs"; 22 - import * as path from "node:path"; 20 + import { describe, it, expect } from 'vitest' 21 + import * as fs from 'node:fs' 22 + import * as path from 'node:path' 23 23 import { 24 24 topicPostSchema, 25 25 topicReplySchema, 26 26 reactionSchema, 27 27 actorPreferencesSchema, 28 - } from "../src/validation/index.js"; 28 + } from '../src/validation/index.js' 29 29 import { 30 30 ForumBarazoTopicPost, 31 31 ForumBarazoTopicReply, 32 32 ForumBarazoInteractionReaction, 33 33 ForumBarazoActorPreferences, 34 - } from "../src/generated/index.js"; 34 + } from '../src/generated/index.js' 35 35 import { 36 36 topicPostMinimal, 37 37 topicPostFull, ··· 41 41 reactionFull, 42 42 actorPreferencesMinimal, 43 43 actorPreferencesFull, 44 - } from "./fixtures/baseline-records.js"; 44 + } from './fixtures/baseline-records.js' 45 45 46 46 // ── Helpers ───────────────────────────────────────────────────────── 47 47 48 48 function loadLexiconJson(lexiconPath: string): Record<string, unknown> { 49 - const fullPath = path.resolve( 50 - import.meta.dirname, 51 - "..", 52 - "lexicons", 53 - lexiconPath, 54 - ); 55 - return JSON.parse(fs.readFileSync(fullPath, "utf-8")) as Record< 56 - string, 57 - unknown 58 - >; 49 + const fullPath = path.resolve(import.meta.dirname, '..', 'lexicons', lexiconPath) 50 + return JSON.parse(fs.readFileSync(fullPath, 'utf-8')) as Record<string, unknown> 59 51 } 60 52 61 - function getRecordProperties( 62 - lexicon: Record<string, unknown>, 63 - ): Record<string, unknown> { 64 - const defs = lexicon["defs"] as Record<string, unknown>; 65 - const main = defs["main"] as Record<string, unknown>; 66 - const record = main["record"] as Record<string, unknown>; 67 - return record["properties"] as Record<string, unknown>; 53 + function getRecordProperties(lexicon: Record<string, unknown>): Record<string, unknown> { 54 + const defs = lexicon['defs'] as Record<string, unknown> 55 + const main = defs['main'] as Record<string, unknown> 56 + const record = main['record'] as Record<string, unknown> 57 + return record['properties'] as Record<string, unknown> 68 58 } 69 59 70 60 function getRequiredFields(lexicon: Record<string, unknown>): string[] { 71 - const defs = lexicon["defs"] as Record<string, unknown>; 72 - const main = defs["main"] as Record<string, unknown>; 73 - const record = main["record"] as Record<string, unknown>; 74 - return record["required"] as string[]; 61 + const defs = lexicon['defs'] as Record<string, unknown> 62 + const main = defs['main'] as Record<string, unknown> 63 + const record = main['record'] as Record<string, unknown> 64 + return record['required'] as string[] 75 65 } 76 66 77 67 // Adds $type to a record for lexicon validator (which requires it) 78 68 function withType<T extends Record<string, unknown>>( 79 69 record: T, 80 - type: string, 70 + type: string 81 71 ): T & { $type: string } { 82 - return { ...record, $type: type }; 72 + return { ...record, $type: type } 83 73 } 84 74 85 75 // ── Schema Structural Snapshots ───────────────────────────────────── ··· 87 77 // forcing the developer to consider backward compatibility implications. 88 78 89 79 const SCHEMA_SNAPSHOTS = { 90 - "forum.barazo.topic.post": { 91 - requiredFields: ["title", "content", "community", "category", "createdAt"], 80 + 'forum.barazo.topic.post': { 81 + requiredFields: ['title', 'content', 'community', 'category', 'createdAt'], 92 82 allProperties: [ 93 - "title", 94 - "content", 95 - "contentFormat", 96 - "community", 97 - "category", 98 - "tags", 99 - "labels", 100 - "createdAt", 83 + 'title', 84 + 'content', 85 + 'contentFormat', 86 + 'community', 87 + 'category', 88 + 'tags', 89 + 'labels', 90 + 'createdAt', 101 91 ], 102 92 }, 103 - "forum.barazo.topic.reply": { 104 - requiredFields: ["content", "root", "parent", "community", "createdAt"], 93 + 'forum.barazo.topic.reply': { 94 + requiredFields: ['content', 'root', 'parent', 'community', 'createdAt'], 105 95 allProperties: [ 106 - "content", 107 - "contentFormat", 108 - "root", 109 - "parent", 110 - "community", 111 - "labels", 112 - "createdAt", 96 + 'content', 97 + 'contentFormat', 98 + 'root', 99 + 'parent', 100 + 'community', 101 + 'labels', 102 + 'createdAt', 113 103 ], 114 104 }, 115 - "forum.barazo.interaction.reaction": { 116 - requiredFields: ["subject", "type", "community", "createdAt"], 117 - allProperties: ["subject", "type", "community", "createdAt"], 105 + 'forum.barazo.interaction.reaction': { 106 + requiredFields: ['subject', 'type', 'community', 'createdAt'], 107 + allProperties: ['subject', 'type', 'community', 'createdAt'], 118 108 }, 119 - "forum.barazo.actor.preferences": { 120 - requiredFields: ["maturityLevel", "updatedAt"], 109 + 'forum.barazo.actor.preferences': { 110 + requiredFields: ['maturityLevel', 'updatedAt'], 121 111 allProperties: [ 122 - "maturityLevel", 123 - "mutedWords", 124 - "blockedDids", 125 - "mutedDids", 126 - "crossPostDefaults", 127 - "updatedAt", 112 + 'maturityLevel', 113 + 'mutedWords', 114 + 'blockedDids', 115 + 'mutedDids', 116 + 'crossPostDefaults', 117 + 'updatedAt', 128 118 ], 129 119 }, 130 - } as const; 120 + } as const 131 121 132 122 // ── Baseline Record Validation (Zod) ──────────────────────────────── 133 123 134 - describe("backward compatibility: Zod validation of baseline records", () => { 135 - describe("forum.barazo.topic.post", () => { 136 - it("validates minimal baseline record", () => { 137 - const result = topicPostSchema.safeParse(topicPostMinimal); 138 - expect(result.success).toBe(true); 139 - }); 124 + describe('backward compatibility: Zod validation of baseline records', () => { 125 + describe('forum.barazo.topic.post', () => { 126 + it('validates minimal baseline record', () => { 127 + const result = topicPostSchema.safeParse(topicPostMinimal) 128 + expect(result.success).toBe(true) 129 + }) 140 130 141 - it("validates full baseline record", () => { 142 - const result = topicPostSchema.safeParse(topicPostFull); 143 - expect(result.success).toBe(true); 144 - }); 145 - }); 131 + it('validates full baseline record', () => { 132 + const result = topicPostSchema.safeParse(topicPostFull) 133 + expect(result.success).toBe(true) 134 + }) 135 + }) 146 136 147 - describe("forum.barazo.topic.reply", () => { 148 - it("validates minimal baseline record", () => { 149 - const result = topicReplySchema.safeParse(topicReplyMinimal); 150 - expect(result.success).toBe(true); 151 - }); 137 + describe('forum.barazo.topic.reply', () => { 138 + it('validates minimal baseline record', () => { 139 + const result = topicReplySchema.safeParse(topicReplyMinimal) 140 + expect(result.success).toBe(true) 141 + }) 152 142 153 - it("validates full baseline record", () => { 154 - const result = topicReplySchema.safeParse(topicReplyFull); 155 - expect(result.success).toBe(true); 156 - }); 157 - }); 143 + it('validates full baseline record', () => { 144 + const result = topicReplySchema.safeParse(topicReplyFull) 145 + expect(result.success).toBe(true) 146 + }) 147 + }) 158 148 159 - describe("forum.barazo.interaction.reaction", () => { 160 - it("validates minimal baseline record", () => { 161 - const result = reactionSchema.safeParse(reactionMinimal); 162 - expect(result.success).toBe(true); 163 - }); 149 + describe('forum.barazo.interaction.reaction', () => { 150 + it('validates minimal baseline record', () => { 151 + const result = reactionSchema.safeParse(reactionMinimal) 152 + expect(result.success).toBe(true) 153 + }) 164 154 165 - it("validates full baseline record", () => { 166 - const result = reactionSchema.safeParse(reactionFull); 167 - expect(result.success).toBe(true); 168 - }); 169 - }); 155 + it('validates full baseline record', () => { 156 + const result = reactionSchema.safeParse(reactionFull) 157 + expect(result.success).toBe(true) 158 + }) 159 + }) 170 160 171 - describe("forum.barazo.actor.preferences", () => { 172 - it("validates minimal baseline record", () => { 173 - const result = actorPreferencesSchema.safeParse(actorPreferencesMinimal); 174 - expect(result.success).toBe(true); 175 - }); 161 + describe('forum.barazo.actor.preferences', () => { 162 + it('validates minimal baseline record', () => { 163 + const result = actorPreferencesSchema.safeParse(actorPreferencesMinimal) 164 + expect(result.success).toBe(true) 165 + }) 176 166 177 - it("validates full baseline record", () => { 178 - const result = actorPreferencesSchema.safeParse(actorPreferencesFull); 179 - expect(result.success).toBe(true); 180 - }); 181 - }); 182 - }); 167 + it('validates full baseline record', () => { 168 + const result = actorPreferencesSchema.safeParse(actorPreferencesFull) 169 + expect(result.success).toBe(true) 170 + }) 171 + }) 172 + }) 183 173 184 174 // ── Baseline Record Validation (Lexicon/AT Protocol) ──────────────── 185 175 186 - describe("backward compatibility: lexicon validation of baseline records", () => { 187 - describe("forum.barazo.topic.post", () => { 188 - it("validates minimal baseline record", () => { 176 + describe('backward compatibility: lexicon validation of baseline records', () => { 177 + describe('forum.barazo.topic.post', () => { 178 + it('validates minimal baseline record', () => { 189 179 const result = ForumBarazoTopicPost.validateRecord( 190 - withType(topicPostMinimal, "forum.barazo.topic.post"), 191 - ); 192 - expect(result.success).toBe(true); 193 - }); 180 + withType(topicPostMinimal, 'forum.barazo.topic.post') 181 + ) 182 + expect(result.success).toBe(true) 183 + }) 194 184 195 - it("validates full baseline record", () => { 185 + it('validates full baseline record', () => { 196 186 const result = ForumBarazoTopicPost.validateRecord( 197 - withType(topicPostFull, "forum.barazo.topic.post"), 198 - ); 199 - expect(result.success).toBe(true); 200 - }); 201 - }); 187 + withType(topicPostFull, 'forum.barazo.topic.post') 188 + ) 189 + expect(result.success).toBe(true) 190 + }) 191 + }) 202 192 203 - describe("forum.barazo.topic.reply", () => { 204 - it("validates minimal baseline record", () => { 193 + describe('forum.barazo.topic.reply', () => { 194 + it('validates minimal baseline record', () => { 205 195 const result = ForumBarazoTopicReply.validateRecord( 206 - withType(topicReplyMinimal, "forum.barazo.topic.reply"), 207 - ); 208 - expect(result.success).toBe(true); 209 - }); 196 + withType(topicReplyMinimal, 'forum.barazo.topic.reply') 197 + ) 198 + expect(result.success).toBe(true) 199 + }) 210 200 211 - it("validates full baseline record", () => { 201 + it('validates full baseline record', () => { 212 202 const result = ForumBarazoTopicReply.validateRecord( 213 - withType(topicReplyFull, "forum.barazo.topic.reply"), 214 - ); 215 - expect(result.success).toBe(true); 216 - }); 217 - }); 203 + withType(topicReplyFull, 'forum.barazo.topic.reply') 204 + ) 205 + expect(result.success).toBe(true) 206 + }) 207 + }) 218 208 219 - describe("forum.barazo.interaction.reaction", () => { 220 - it("validates minimal baseline record", () => { 209 + describe('forum.barazo.interaction.reaction', () => { 210 + it('validates minimal baseline record', () => { 221 211 const result = ForumBarazoInteractionReaction.validateRecord( 222 - withType(reactionMinimal, "forum.barazo.interaction.reaction"), 223 - ); 224 - expect(result.success).toBe(true); 225 - }); 212 + withType(reactionMinimal, 'forum.barazo.interaction.reaction') 213 + ) 214 + expect(result.success).toBe(true) 215 + }) 226 216 227 - it("validates full baseline record", () => { 217 + it('validates full baseline record', () => { 228 218 const result = ForumBarazoInteractionReaction.validateRecord( 229 - withType(reactionFull, "forum.barazo.interaction.reaction"), 230 - ); 231 - expect(result.success).toBe(true); 232 - }); 233 - }); 219 + withType(reactionFull, 'forum.barazo.interaction.reaction') 220 + ) 221 + expect(result.success).toBe(true) 222 + }) 223 + }) 234 224 235 - describe("forum.barazo.actor.preferences", () => { 236 - it("validates minimal baseline record", () => { 225 + describe('forum.barazo.actor.preferences', () => { 226 + it('validates minimal baseline record', () => { 237 227 const result = ForumBarazoActorPreferences.validateRecord( 238 - withType(actorPreferencesMinimal, "forum.barazo.actor.preferences"), 239 - ); 240 - expect(result.success).toBe(true); 241 - }); 228 + withType(actorPreferencesMinimal, 'forum.barazo.actor.preferences') 229 + ) 230 + expect(result.success).toBe(true) 231 + }) 242 232 243 - it("validates full baseline record", () => { 233 + it('validates full baseline record', () => { 244 234 const result = ForumBarazoActorPreferences.validateRecord( 245 - withType(actorPreferencesFull, "forum.barazo.actor.preferences"), 246 - ); 247 - expect(result.success).toBe(true); 248 - }); 249 - }); 250 - }); 235 + withType(actorPreferencesFull, 'forum.barazo.actor.preferences') 236 + ) 237 + expect(result.success).toBe(true) 238 + }) 239 + }) 240 + }) 251 241 252 242 // ── Schema Structural Invariants ──────────────────────────────────── 253 243 // These tests catch accidental changes to required fields, removed 254 244 // properties, or changed field types. 255 245 256 - describe("backward compatibility: schema structural invariants", () => { 246 + describe('backward compatibility: schema structural invariants', () => { 257 247 const lexiconFiles: Array<{ 258 - name: string; 259 - path: string; 260 - snapshot: (typeof SCHEMA_SNAPSHOTS)[keyof typeof SCHEMA_SNAPSHOTS]; 248 + name: string 249 + path: string 250 + snapshot: (typeof SCHEMA_SNAPSHOTS)[keyof typeof SCHEMA_SNAPSHOTS] 261 251 }> = [ 262 252 { 263 - name: "forum.barazo.topic.post", 264 - path: "forum/barazo/topic/post.json", 265 - snapshot: SCHEMA_SNAPSHOTS["forum.barazo.topic.post"], 253 + name: 'forum.barazo.topic.post', 254 + path: 'forum/barazo/topic/post.json', 255 + snapshot: SCHEMA_SNAPSHOTS['forum.barazo.topic.post'], 266 256 }, 267 257 { 268 - name: "forum.barazo.topic.reply", 269 - path: "forum/barazo/topic/reply.json", 270 - snapshot: SCHEMA_SNAPSHOTS["forum.barazo.topic.reply"], 258 + name: 'forum.barazo.topic.reply', 259 + path: 'forum/barazo/topic/reply.json', 260 + snapshot: SCHEMA_SNAPSHOTS['forum.barazo.topic.reply'], 271 261 }, 272 262 { 273 - name: "forum.barazo.interaction.reaction", 274 - path: "forum/barazo/interaction/reaction.json", 275 - snapshot: SCHEMA_SNAPSHOTS["forum.barazo.interaction.reaction"], 263 + name: 'forum.barazo.interaction.reaction', 264 + path: 'forum/barazo/interaction/reaction.json', 265 + snapshot: SCHEMA_SNAPSHOTS['forum.barazo.interaction.reaction'], 276 266 }, 277 267 { 278 - name: "forum.barazo.actor.preferences", 279 - path: "forum/barazo/actor/preferences.json", 280 - snapshot: SCHEMA_SNAPSHOTS["forum.barazo.actor.preferences"], 268 + name: 'forum.barazo.actor.preferences', 269 + path: 'forum/barazo/actor/preferences.json', 270 + snapshot: SCHEMA_SNAPSHOTS['forum.barazo.actor.preferences'], 281 271 }, 282 - ]; 272 + ] 283 273 284 274 for (const { name, path: lexPath, snapshot } of lexiconFiles) { 285 275 describe(name, () => { 286 - const lexicon = loadLexiconJson(lexPath); 276 + const lexicon = loadLexiconJson(lexPath) 287 277 288 - it("has not removed any required fields", () => { 289 - const currentRequired = getRequiredFields(lexicon); 278 + it('has not removed any required fields', () => { 279 + const currentRequired = getRequiredFields(lexicon) 290 280 for (const field of snapshot.requiredFields) { 291 281 expect( 292 282 currentRequired, 293 283 `Required field "${field}" was removed from ${name}. ` + 294 - "This breaks existing records that rely on this field being required. " + 295 - "Use a new lexicon ID for breaking changes.", 296 - ).toContain(field); 284 + 'This breaks existing records that rely on this field being required. ' + 285 + 'Use a new lexicon ID for breaking changes.' 286 + ).toContain(field) 297 287 } 298 - }); 288 + }) 299 289 300 - it("has not added new required fields", () => { 301 - const currentRequired = getRequiredFields(lexicon); 290 + it('has not added new required fields', () => { 291 + const currentRequired = getRequiredFields(lexicon) 302 292 for (const field of currentRequired) { 303 293 expect( 304 294 snapshot.requiredFields, 305 295 `New required field "${field}" was added to ${name}. ` + 306 296 "Existing records on PDSes don't have this field. " + 307 - "New fields must be optional, or use a new lexicon ID.", 308 - ).toContain(field); 297 + 'New fields must be optional, or use a new lexicon ID.' 298 + ).toContain(field) 309 299 } 310 - }); 300 + }) 311 301 312 - it("has not removed any properties", () => { 313 - const currentProperties = Object.keys(getRecordProperties(lexicon)); 302 + it('has not removed any properties', () => { 303 + const currentProperties = Object.keys(getRecordProperties(lexicon)) 314 304 for (const prop of snapshot.allProperties) { 315 305 expect( 316 306 currentProperties, 317 307 `Property "${prop}" was removed from ${name}. ` + 318 - "Existing records on PDSes may contain this field. " + 319 - "Fields cannot be removed from published schemas.", 320 - ).toContain(prop); 308 + 'Existing records on PDSes may contain this field. ' + 309 + 'Fields cannot be removed from published schemas.' 310 + ).toContain(prop) 321 311 } 322 - }); 312 + }) 323 313 324 - it("may have added new optional properties (allowed)", () => { 314 + it('may have added new optional properties (allowed)', () => { 325 315 // This test documents that new properties were added. 326 316 // New properties are allowed as long as they are optional (not in required[]). 327 - const currentProperties = Object.keys(getRecordProperties(lexicon)); 328 - const currentRequired = getRequiredFields(lexicon); 329 - const newProperties = currentProperties.filter( 330 - (p) => !snapshot.allProperties.includes(p), 331 - ); 317 + const currentProperties = Object.keys(getRecordProperties(lexicon)) 318 + const currentRequired = getRequiredFields(lexicon) 319 + const newProperties = currentProperties.filter((p) => !snapshot.allProperties.includes(p)) 332 320 333 321 for (const prop of newProperties) { 334 322 expect( 335 323 currentRequired, 336 324 `New property "${prop}" in ${name} is required. ` + 337 - "New properties must be optional to maintain backward compatibility.", 338 - ).not.toContain(prop); 325 + 'New properties must be optional to maintain backward compatibility.' 326 + ).not.toContain(prop) 339 327 } 340 - }); 341 - }); 328 + }) 329 + }) 342 330 } 343 - }); 331 + }) 344 332 345 333 // ── Forward Compatibility (extra fields) ──────────────────────────── 346 334 // AT Protocol records may contain extra fields (from future schema versions). 347 335 // The lexicon validator must not reject records with unknown properties. 348 336 349 - describe("backward compatibility: records with extra unknown fields", () => { 350 - it("lexicon validator accepts topic.post with extra fields", () => { 337 + describe('backward compatibility: records with extra unknown fields', () => { 338 + it('lexicon validator accepts topic.post with extra fields', () => { 351 339 const record = withType( 352 - { ...topicPostMinimal, futureField: "some-value", anotherNew: 42 }, 353 - "forum.barazo.topic.post", 354 - ); 355 - const result = ForumBarazoTopicPost.validateRecord(record); 356 - expect(result.success).toBe(true); 357 - }); 340 + { ...topicPostMinimal, futureField: 'some-value', anotherNew: 42 }, 341 + 'forum.barazo.topic.post' 342 + ) 343 + const result = ForumBarazoTopicPost.validateRecord(record) 344 + expect(result.success).toBe(true) 345 + }) 358 346 359 - it("lexicon validator accepts topic.reply with extra fields", () => { 360 - const record = withType( 361 - { ...topicReplyMinimal, futureField: true }, 362 - "forum.barazo.topic.reply", 363 - ); 364 - const result = ForumBarazoTopicReply.validateRecord(record); 365 - expect(result.success).toBe(true); 366 - }); 347 + it('lexicon validator accepts topic.reply with extra fields', () => { 348 + const record = withType({ ...topicReplyMinimal, futureField: true }, 'forum.barazo.topic.reply') 349 + const result = ForumBarazoTopicReply.validateRecord(record) 350 + expect(result.success).toBe(true) 351 + }) 367 352 368 - it("lexicon validator accepts reaction with extra fields", () => { 353 + it('lexicon validator accepts reaction with extra fields', () => { 369 354 const record = withType( 370 - { ...reactionMinimal, futureField: ["a", "b"] }, 371 - "forum.barazo.interaction.reaction", 372 - ); 373 - const result = ForumBarazoInteractionReaction.validateRecord(record); 374 - expect(result.success).toBe(true); 375 - }); 355 + { ...reactionMinimal, futureField: ['a', 'b'] }, 356 + 'forum.barazo.interaction.reaction' 357 + ) 358 + const result = ForumBarazoInteractionReaction.validateRecord(record) 359 + expect(result.success).toBe(true) 360 + }) 376 361 377 - it("lexicon validator accepts actor.preferences with extra fields", () => { 362 + it('lexicon validator accepts actor.preferences with extra fields', () => { 378 363 const record = withType( 379 364 { ...actorPreferencesMinimal, futureField: { nested: true } }, 380 - "forum.barazo.actor.preferences", 381 - ); 382 - const result = ForumBarazoActorPreferences.validateRecord(record); 383 - expect(result.success).toBe(true); 384 - }); 385 - }); 365 + 'forum.barazo.actor.preferences' 366 + ) 367 + const result = ForumBarazoActorPreferences.validateRecord(record) 368 + expect(result.success).toBe(true) 369 + }) 370 + }) 386 371 387 372 // ── Field Type Stability ──────────────────────────────────────────── 388 373 // Ensures field types haven't changed in the lexicon JSON schemas. 389 374 390 - describe("backward compatibility: field type stability", () => { 391 - const FIELD_TYPE_SNAPSHOTS: Record< 392 - string, 393 - { path: string; types: Record<string, string> } 394 - > = { 395 - "forum.barazo.topic.post": { 396 - path: "forum/barazo/topic/post.json", 375 + describe('backward compatibility: field type stability', () => { 376 + const FIELD_TYPE_SNAPSHOTS: Record<string, { path: string; types: Record<string, string> }> = { 377 + 'forum.barazo.topic.post': { 378 + path: 'forum/barazo/topic/post.json', 397 379 types: { 398 - title: "string", 399 - content: "string", 400 - contentFormat: "string", 401 - community: "string", 402 - category: "string", 403 - tags: "array", 404 - labels: "union", 405 - createdAt: "string", 380 + title: 'string', 381 + content: 'string', 382 + contentFormat: 'string', 383 + community: 'string', 384 + category: 'string', 385 + tags: 'array', 386 + labels: 'union', 387 + createdAt: 'string', 406 388 }, 407 389 }, 408 - "forum.barazo.topic.reply": { 409 - path: "forum/barazo/topic/reply.json", 390 + 'forum.barazo.topic.reply': { 391 + path: 'forum/barazo/topic/reply.json', 410 392 types: { 411 - content: "string", 412 - contentFormat: "string", 413 - root: "ref", 414 - parent: "ref", 415 - community: "string", 416 - labels: "union", 417 - createdAt: "string", 393 + content: 'string', 394 + contentFormat: 'string', 395 + root: 'ref', 396 + parent: 'ref', 397 + community: 'string', 398 + labels: 'union', 399 + createdAt: 'string', 418 400 }, 419 401 }, 420 - "forum.barazo.interaction.reaction": { 421 - path: "forum/barazo/interaction/reaction.json", 402 + 'forum.barazo.interaction.reaction': { 403 + path: 'forum/barazo/interaction/reaction.json', 422 404 types: { 423 - subject: "ref", 424 - type: "string", 425 - community: "string", 426 - createdAt: "string", 405 + subject: 'ref', 406 + type: 'string', 407 + community: 'string', 408 + createdAt: 'string', 427 409 }, 428 410 }, 429 - "forum.barazo.actor.preferences": { 430 - path: "forum/barazo/actor/preferences.json", 411 + 'forum.barazo.actor.preferences': { 412 + path: 'forum/barazo/actor/preferences.json', 431 413 types: { 432 - maturityLevel: "string", 433 - mutedWords: "array", 434 - blockedDids: "array", 435 - mutedDids: "array", 436 - crossPostDefaults: "ref", 437 - updatedAt: "string", 414 + maturityLevel: 'string', 415 + mutedWords: 'array', 416 + blockedDids: 'array', 417 + mutedDids: 'array', 418 + crossPostDefaults: 'ref', 419 + updatedAt: 'string', 438 420 }, 439 421 }, 440 - }; 422 + } 441 423 442 - for (const [name, { path: lexPath, types }] of Object.entries( 443 - FIELD_TYPE_SNAPSHOTS, 444 - )) { 424 + for (const [name, { path: lexPath, types }] of Object.entries(FIELD_TYPE_SNAPSHOTS)) { 445 425 describe(name, () => { 446 - const lexicon = loadLexiconJson(lexPath); 447 - const properties = getRecordProperties(lexicon); 426 + const lexicon = loadLexiconJson(lexPath) 427 + const properties = getRecordProperties(lexicon) 448 428 449 429 for (const [field, expectedType] of Object.entries(types)) { 450 430 it(`field "${field}" remains type "${expectedType}"`, () => { 451 - const prop = properties[field] as Record<string, unknown>; 431 + const prop = properties[field] as Record<string, unknown> 452 432 expect( 453 - prop["type"], 454 - `Field "${field}" in ${name} changed type from "${expectedType}" to "${String(prop["type"])}". ` + 455 - "Field types cannot change in published schemas.", 456 - ).toBe(expectedType); 457 - }); 433 + prop['type'], 434 + `Field "${field}" in ${name} changed type from "${expectedType}" to "${String(prop['type'])}". ` + 435 + 'Field types cannot change in published schemas.' 436 + ).toBe(expectedType) 437 + }) 458 438 } 459 - }); 439 + }) 460 440 } 461 - }); 441 + })
+34 -34
tests/fixtures/baseline-records.ts
··· 16 16 * The existing fixtures must remain unchanged to prove backward compatibility. 17 17 */ 18 18 19 - const VALID_DID = "did:plc:abc123def456"; 20 - const VALID_DATETIME = "2026-02-12T10:00:00.000Z"; 19 + const VALID_DID = 'did:plc:abc123def456' 20 + const VALID_DATETIME = '2026-02-12T10:00:00.000Z' 21 21 const VALID_STRONG_REF = { 22 - uri: "at://did:plc:abc123/forum.barazo.topic.post/3jzfcijpj2z2a", 23 - cid: "bafyreibouvacvqhc2vkwwtdkfynpcaoatmkde7uhrw47ne4gu63cnzc7yq", 24 - }; 22 + uri: 'at://did:plc:abc123/forum.barazo.topic.post/3jzfcijpj2z2a', 23 + cid: 'bafyreibouvacvqhc2vkwwtdkfynpcaoatmkde7uhrw47ne4gu63cnzc7yq', 24 + } 25 25 26 26 // ── topic.post ────────────────────────────────────────────────────── 27 27 28 28 export const topicPostMinimal = { 29 - title: "My First Topic", 30 - content: "Hello, this is the body of my first topic post.", 29 + title: 'My First Topic', 30 + content: 'Hello, this is the body of my first topic post.', 31 31 community: VALID_DID, 32 - category: "general", 32 + category: 'general', 33 33 createdAt: VALID_DATETIME, 34 - }; 34 + } 35 35 36 36 export const topicPostFull = { 37 - title: "Full Featured Topic", 38 - content: "This topic includes every optional field available at v0.1.0.", 39 - contentFormat: "markdown" as const, 37 + title: 'Full Featured Topic', 38 + content: 'This topic includes every optional field available at v0.1.0.', 39 + contentFormat: 'markdown' as const, 40 40 community: VALID_DID, 41 - category: "announcements", 42 - tags: ["release", "v1"], 41 + category: 'announcements', 42 + tags: ['release', 'v1'], 43 43 labels: { 44 - $type: "com.atproto.label.defs#selfLabels", 45 - values: [{ val: "nudity" }], 44 + $type: 'com.atproto.label.defs#selfLabels', 45 + values: [{ val: 'nudity' }], 46 46 }, 47 47 createdAt: VALID_DATETIME, 48 - }; 48 + } 49 49 50 50 // ── topic.reply ───────────────────────────────────────────────────── 51 51 52 52 export const topicReplyMinimal = { 53 - content: "Great post, thanks for sharing!", 53 + content: 'Great post, thanks for sharing!', 54 54 root: VALID_STRONG_REF, 55 55 parent: VALID_STRONG_REF, 56 56 community: VALID_DID, 57 57 createdAt: VALID_DATETIME, 58 - }; 58 + } 59 59 60 60 export const topicReplyFull = { 61 - content: "This reply uses all optional fields available at v0.1.0.", 62 - contentFormat: "markdown" as const, 61 + content: 'This reply uses all optional fields available at v0.1.0.', 62 + contentFormat: 'markdown' as const, 63 63 root: VALID_STRONG_REF, 64 64 parent: VALID_STRONG_REF, 65 65 community: VALID_DID, 66 66 labels: { 67 - $type: "com.atproto.label.defs#selfLabels", 68 - values: [{ val: "graphic-media" }], 67 + $type: 'com.atproto.label.defs#selfLabels', 68 + values: [{ val: 'graphic-media' }], 69 69 }, 70 70 createdAt: VALID_DATETIME, 71 - }; 71 + } 72 72 73 73 // ── interaction.reaction ──────────────────────────────────────────── 74 74 75 75 export const reactionMinimal = { 76 76 subject: VALID_STRONG_REF, 77 - type: "like", 77 + type: 'like', 78 78 community: VALID_DID, 79 79 createdAt: VALID_DATETIME, 80 - }; 80 + } 81 81 82 82 // Reaction has no optional fields beyond the required ones 83 - export const reactionFull = { ...reactionMinimal }; 83 + export const reactionFull = { ...reactionMinimal } 84 84 85 85 // ── actor.preferences ─────────────────────────────────────────────── 86 86 87 87 export const actorPreferencesMinimal = { 88 - maturityLevel: "safe" as const, 88 + maturityLevel: 'safe' as const, 89 89 updatedAt: VALID_DATETIME, 90 - }; 90 + } 91 91 92 92 export const actorPreferencesFull = { 93 - maturityLevel: "all" as const, 94 - mutedWords: ["spam", "crypto-scam"], 95 - blockedDids: ["did:plc:blocked1", "did:plc:blocked2"], 96 - mutedDids: ["did:plc:muted1"], 93 + maturityLevel: 'all' as const, 94 + mutedWords: ['spam', 'crypto-scam'], 95 + blockedDids: ['did:plc:blocked1', 'did:plc:blocked2'], 96 + mutedDids: ['did:plc:muted1'], 97 97 crossPostDefaults: { 98 98 bluesky: true, 99 99 frontpage: false, 100 100 }, 101 101 updatedAt: VALID_DATETIME, 102 - }; 102 + }
+211 -223
tests/lexicon-schemas.test.ts
··· 1 - import { describe, it, expect } from "vitest"; 2 - import { readFile, readdir } from "node:fs/promises"; 3 - import { join, resolve } from "node:path"; 1 + import { describe, it, expect } from 'vitest' 2 + import { readFile, readdir } from 'node:fs/promises' 3 + import { join, resolve } from 'node:path' 4 4 5 - const LEXICONS_DIR = resolve(import.meta.dirname, "../lexicons/forum/barazo"); 5 + const LEXICONS_DIR = resolve(import.meta.dirname, '../lexicons/forum/barazo') 6 6 7 7 async function loadJson(path: string): Promise<unknown> { 8 - const content = await readFile(path, "utf-8"); 9 - return JSON.parse(content); 8 + const content = await readFile(path, 'utf-8') 9 + return JSON.parse(content) 10 10 } 11 11 12 12 async function getAllLexiconFiles(dir: string): Promise<string[]> { 13 - const entries = await readdir(dir, { withFileTypes: true, recursive: true }); 13 + const entries = await readdir(dir, { withFileTypes: true, recursive: true }) 14 14 return entries 15 - .filter((e) => e.isFile() && e.name.endsWith(".json")) 16 - .map((e) => join(e.parentPath, e.name)); 15 + .filter((e) => e.isFile() && e.name.endsWith('.json')) 16 + .map((e) => join(e.parentPath, e.name)) 17 17 } 18 18 19 - describe("Lexicon JSON schema structure", () => { 20 - it("all lexicon files are valid JSON", async () => { 21 - const files = await getAllLexiconFiles(LEXICONS_DIR); 22 - expect(files.length).toBeGreaterThanOrEqual(5); 19 + describe('Lexicon JSON schema structure', () => { 20 + it('all lexicon files are valid JSON', async () => { 21 + const files = await getAllLexiconFiles(LEXICONS_DIR) 22 + expect(files.length).toBeGreaterThanOrEqual(5) 23 23 for (const file of files) { 24 - await expect(loadJson(file)).resolves.toBeDefined(); 24 + await expect(loadJson(file)).resolves.toBeDefined() 25 25 } 26 - }); 26 + }) 27 27 28 - it("all lexicons have required top-level fields", async () => { 29 - const files = await getAllLexiconFiles(LEXICONS_DIR); 28 + it('all lexicons have required top-level fields', async () => { 29 + const files = await getAllLexiconFiles(LEXICONS_DIR) 30 30 for (const file of files) { 31 - const lexicon = (await loadJson(file)) as Record<string, unknown>; 32 - expect(lexicon).toHaveProperty("lexicon", 1); 33 - expect(lexicon).toHaveProperty("id"); 34 - expect(lexicon).toHaveProperty("defs"); 35 - expect(typeof lexicon["id"]).toBe("string"); 31 + const lexicon = (await loadJson(file)) as Record<string, unknown> 32 + expect(lexicon).toHaveProperty('lexicon', 1) 33 + expect(lexicon).toHaveProperty('id') 34 + expect(lexicon).toHaveProperty('defs') 35 + expect(typeof lexicon['id']).toBe('string') 36 36 } 37 - }); 37 + }) 38 38 39 - it("lexicon ids match file paths", async () => { 40 - const files = await getAllLexiconFiles(LEXICONS_DIR); 39 + it('lexicon ids match file paths', async () => { 40 + const files = await getAllLexiconFiles(LEXICONS_DIR) 41 41 for (const file of files) { 42 - const lexicon = (await loadJson(file)) as Record<string, unknown>; 43 - const id = lexicon["id"] as string; 42 + const lexicon = (await loadJson(file)) as Record<string, unknown> 43 + const id = lexicon['id'] as string 44 44 // Convert "forum.barazo.topic.post" to a path fragment "forum/barazo/topic/post.json" 45 - const expectedPath = id.replace(/\./g, "/") + ".json"; 46 - expect(file).toContain(expectedPath); 45 + const expectedPath = id.replace(/\./g, '/') + '.json' 46 + expect(file).toContain(expectedPath) 47 47 } 48 - }); 49 - }); 48 + }) 49 + }) 50 50 51 - describe("forum.barazo.topic.post lexicon", () => { 52 - let schema: Record<string, unknown>; 51 + describe('forum.barazo.topic.post lexicon', () => { 52 + let schema: Record<string, unknown> 53 53 54 - it("loads successfully", async () => { 55 - schema = (await loadJson( 56 - join(LEXICONS_DIR, "topic/post.json"), 57 - )) as Record<string, unknown>; 58 - expect(schema["id"]).toBe("forum.barazo.topic.post"); 59 - }); 54 + it('loads successfully', async () => { 55 + schema = (await loadJson(join(LEXICONS_DIR, 'topic/post.json'))) as Record<string, unknown> 56 + expect(schema['id']).toBe('forum.barazo.topic.post') 57 + }) 60 58 61 - it("defines a record with key type tid", () => { 62 - const defs = schema["defs"] as Record<string, unknown>; 63 - const main = defs["main"] as Record<string, unknown>; 64 - expect(main["type"]).toBe("record"); 65 - expect(main["key"]).toBe("tid"); 66 - }); 59 + it('defines a record with key type tid', () => { 60 + const defs = schema['defs'] as Record<string, unknown> 61 + const main = defs['main'] as Record<string, unknown> 62 + expect(main['type']).toBe('record') 63 + expect(main['key']).toBe('tid') 64 + }) 67 65 68 - it("has required fields: title, content, community, category, createdAt", () => { 69 - const defs = schema["defs"] as Record<string, unknown>; 70 - const main = defs["main"] as Record<string, unknown>; 71 - const record = main["record"] as Record<string, unknown>; 72 - const required = record["required"] as string[]; 73 - expect(required).toContain("title"); 74 - expect(required).toContain("content"); 75 - expect(required).toContain("community"); 76 - expect(required).toContain("category"); 77 - expect(required).toContain("createdAt"); 78 - }); 66 + it('has required fields: title, content, community, category, createdAt', () => { 67 + const defs = schema['defs'] as Record<string, unknown> 68 + const main = defs['main'] as Record<string, unknown> 69 + const record = main['record'] as Record<string, unknown> 70 + const required = record['required'] as string[] 71 + expect(required).toContain('title') 72 + expect(required).toContain('content') 73 + expect(required).toContain('community') 74 + expect(required).toContain('category') 75 + expect(required).toContain('createdAt') 76 + }) 79 77 80 - it("title has maxGraphemes: 200 and maxLength: 2000", () => { 81 - const defs = schema["defs"] as Record<string, unknown>; 82 - const main = defs["main"] as Record<string, unknown>; 83 - const record = main["record"] as Record<string, unknown>; 84 - const props = record["properties"] as Record<string, unknown>; 85 - const title = props["title"] as Record<string, unknown>; 86 - expect(title["maxGraphemes"]).toBe(200); 87 - expect(title["maxLength"]).toBe(2000); 88 - expect(title["minLength"]).toBe(1); 89 - }); 78 + it('title has maxGraphemes: 200 and maxLength: 2000', () => { 79 + const defs = schema['defs'] as Record<string, unknown> 80 + const main = defs['main'] as Record<string, unknown> 81 + const record = main['record'] as Record<string, unknown> 82 + const props = record['properties'] as Record<string, unknown> 83 + const title = props['title'] as Record<string, unknown> 84 + expect(title['maxGraphemes']).toBe(200) 85 + expect(title['maxLength']).toBe(2000) 86 + expect(title['minLength']).toBe(1) 87 + }) 90 88 91 - it("community field uses DID format", () => { 92 - const defs = schema["defs"] as Record<string, unknown>; 93 - const main = defs["main"] as Record<string, unknown>; 94 - const record = main["record"] as Record<string, unknown>; 95 - const props = record["properties"] as Record<string, unknown>; 96 - const community = props["community"] as Record<string, unknown>; 97 - expect(community["type"]).toBe("string"); 98 - expect(community["format"]).toBe("did"); 99 - }); 89 + it('community field uses DID format', () => { 90 + const defs = schema['defs'] as Record<string, unknown> 91 + const main = defs['main'] as Record<string, unknown> 92 + const record = main['record'] as Record<string, unknown> 93 + const props = record['properties'] as Record<string, unknown> 94 + const community = props['community'] as Record<string, unknown> 95 + expect(community['type']).toBe('string') 96 + expect(community['format']).toBe('did') 97 + }) 100 98 101 - it("labels uses union with selfLabels ref", () => { 102 - const defs = schema["defs"] as Record<string, unknown>; 103 - const main = defs["main"] as Record<string, unknown>; 104 - const record = main["record"] as Record<string, unknown>; 105 - const props = record["properties"] as Record<string, unknown>; 106 - const labels = props["labels"] as Record<string, unknown>; 107 - expect(labels["type"]).toBe("union"); 108 - expect(labels["refs"]).toContain("com.atproto.label.defs#selfLabels"); 109 - }); 99 + it('labels uses union with selfLabels ref', () => { 100 + const defs = schema['defs'] as Record<string, unknown> 101 + const main = defs['main'] as Record<string, unknown> 102 + const record = main['record'] as Record<string, unknown> 103 + const props = record['properties'] as Record<string, unknown> 104 + const labels = props['labels'] as Record<string, unknown> 105 + expect(labels['type']).toBe('union') 106 + expect(labels['refs']).toContain('com.atproto.label.defs#selfLabels') 107 + }) 110 108 111 - it("tags is optional with max 5 items", () => { 112 - const defs = schema["defs"] as Record<string, unknown>; 113 - const main = defs["main"] as Record<string, unknown>; 114 - const record = main["record"] as Record<string, unknown>; 115 - const required = record["required"] as string[]; 116 - expect(required).not.toContain("tags"); 117 - const props = record["properties"] as Record<string, unknown>; 118 - const tags = props["tags"] as Record<string, unknown>; 119 - expect(tags["maxLength"]).toBe(5); 120 - }); 121 - }); 109 + it('tags is optional with max 5 items', () => { 110 + const defs = schema['defs'] as Record<string, unknown> 111 + const main = defs['main'] as Record<string, unknown> 112 + const record = main['record'] as Record<string, unknown> 113 + const required = record['required'] as string[] 114 + expect(required).not.toContain('tags') 115 + const props = record['properties'] as Record<string, unknown> 116 + const tags = props['tags'] as Record<string, unknown> 117 + expect(tags['maxLength']).toBe(5) 118 + }) 119 + }) 122 120 123 - describe("forum.barazo.topic.reply lexicon", () => { 124 - let schema: Record<string, unknown>; 121 + describe('forum.barazo.topic.reply lexicon', () => { 122 + let schema: Record<string, unknown> 125 123 126 - it("loads successfully", async () => { 127 - schema = (await loadJson( 128 - join(LEXICONS_DIR, "topic/reply.json"), 129 - )) as Record<string, unknown>; 130 - expect(schema["id"]).toBe("forum.barazo.topic.reply"); 131 - }); 124 + it('loads successfully', async () => { 125 + schema = (await loadJson(join(LEXICONS_DIR, 'topic/reply.json'))) as Record<string, unknown> 126 + expect(schema['id']).toBe('forum.barazo.topic.reply') 127 + }) 132 128 133 - it("has required fields: content, root, parent, community, createdAt", () => { 134 - const defs = schema["defs"] as Record<string, unknown>; 135 - const main = defs["main"] as Record<string, unknown>; 136 - const record = main["record"] as Record<string, unknown>; 137 - const required = record["required"] as string[]; 129 + it('has required fields: content, root, parent, community, createdAt', () => { 130 + const defs = schema['defs'] as Record<string, unknown> 131 + const main = defs['main'] as Record<string, unknown> 132 + const record = main['record'] as Record<string, unknown> 133 + const required = record['required'] as string[] 138 134 expect(required).toEqual( 139 - expect.arrayContaining([ 140 - "content", 141 - "root", 142 - "parent", 143 - "community", 144 - "createdAt", 145 - ]), 146 - ); 147 - }); 135 + expect.arrayContaining(['content', 'root', 'parent', 'community', 'createdAt']) 136 + ) 137 + }) 148 138 149 - it("root and parent use strongRef", () => { 150 - const defs = schema["defs"] as Record<string, unknown>; 151 - const main = defs["main"] as Record<string, unknown>; 152 - const record = main["record"] as Record<string, unknown>; 153 - const props = record["properties"] as Record<string, unknown>; 154 - const root = props["root"] as Record<string, unknown>; 155 - const parent = props["parent"] as Record<string, unknown>; 156 - expect(root["type"]).toBe("ref"); 157 - expect(root["ref"]).toBe("com.atproto.repo.strongRef"); 158 - expect(parent["type"]).toBe("ref"); 159 - expect(parent["ref"]).toBe("com.atproto.repo.strongRef"); 160 - }); 161 - }); 139 + it('root and parent use strongRef', () => { 140 + const defs = schema['defs'] as Record<string, unknown> 141 + const main = defs['main'] as Record<string, unknown> 142 + const record = main['record'] as Record<string, unknown> 143 + const props = record['properties'] as Record<string, unknown> 144 + const root = props['root'] as Record<string, unknown> 145 + const parent = props['parent'] as Record<string, unknown> 146 + expect(root['type']).toBe('ref') 147 + expect(root['ref']).toBe('com.atproto.repo.strongRef') 148 + expect(parent['type']).toBe('ref') 149 + expect(parent['ref']).toBe('com.atproto.repo.strongRef') 150 + }) 151 + }) 162 152 163 - describe("forum.barazo.interaction.reaction lexicon", () => { 164 - let schema: Record<string, unknown>; 153 + describe('forum.barazo.interaction.reaction lexicon', () => { 154 + let schema: Record<string, unknown> 165 155 166 - it("loads successfully", async () => { 167 - schema = (await loadJson( 168 - join(LEXICONS_DIR, "interaction/reaction.json"), 169 - )) as Record<string, unknown>; 170 - expect(schema["id"]).toBe("forum.barazo.interaction.reaction"); 171 - }); 156 + it('loads successfully', async () => { 157 + schema = (await loadJson(join(LEXICONS_DIR, 'interaction/reaction.json'))) as Record< 158 + string, 159 + unknown 160 + > 161 + expect(schema['id']).toBe('forum.barazo.interaction.reaction') 162 + }) 172 163 173 - it("has required fields: subject, type, community, createdAt", () => { 174 - const defs = schema["defs"] as Record<string, unknown>; 175 - const main = defs["main"] as Record<string, unknown>; 176 - const record = main["record"] as Record<string, unknown>; 177 - const required = record["required"] as string[]; 178 - expect(required).toEqual( 179 - expect.arrayContaining(["subject", "type", "community", "createdAt"]), 180 - ); 181 - }); 164 + it('has required fields: subject, type, community, createdAt', () => { 165 + const defs = schema['defs'] as Record<string, unknown> 166 + const main = defs['main'] as Record<string, unknown> 167 + const record = main['record'] as Record<string, unknown> 168 + const required = record['required'] as string[] 169 + expect(required).toEqual(expect.arrayContaining(['subject', 'type', 'community', 'createdAt'])) 170 + }) 182 171 183 - it("subject uses strongRef", () => { 184 - const defs = schema["defs"] as Record<string, unknown>; 185 - const main = defs["main"] as Record<string, unknown>; 186 - const record = main["record"] as Record<string, unknown>; 187 - const props = record["properties"] as Record<string, unknown>; 188 - const subject = props["subject"] as Record<string, unknown>; 189 - expect(subject["type"]).toBe("ref"); 190 - expect(subject["ref"]).toBe("com.atproto.repo.strongRef"); 191 - }); 192 - }); 172 + it('subject uses strongRef', () => { 173 + const defs = schema['defs'] as Record<string, unknown> 174 + const main = defs['main'] as Record<string, unknown> 175 + const record = main['record'] as Record<string, unknown> 176 + const props = record['properties'] as Record<string, unknown> 177 + const subject = props['subject'] as Record<string, unknown> 178 + expect(subject['type']).toBe('ref') 179 + expect(subject['ref']).toBe('com.atproto.repo.strongRef') 180 + }) 181 + }) 193 182 194 - describe("forum.barazo.authForumAccess lexicon", () => { 195 - let schema: Record<string, unknown>; 183 + describe('forum.barazo.authForumAccess lexicon', () => { 184 + let schema: Record<string, unknown> 196 185 197 - it("loads successfully", async () => { 198 - schema = (await loadJson( 199 - join(LEXICONS_DIR, "authForumAccess.json"), 200 - )) as Record<string, unknown>; 201 - expect(schema["id"]).toBe("forum.barazo.authForumAccess"); 202 - }); 186 + it('loads successfully', async () => { 187 + schema = (await loadJson(join(LEXICONS_DIR, 'authForumAccess.json'))) as Record<string, unknown> 188 + expect(schema['id']).toBe('forum.barazo.authForumAccess') 189 + }) 203 190 204 - it("has a top-level description", () => { 205 - expect(schema["description"]).toBeTypeOf("string"); 206 - expect((schema["description"] as string).length).toBeGreaterThan(0); 207 - }); 191 + it('has a top-level description', () => { 192 + expect(schema['description']).toBeTypeOf('string') 193 + expect((schema['description'] as string).length).toBeGreaterThan(0) 194 + }) 208 195 209 - it("defines a permission-set type", () => { 210 - const defs = schema["defs"] as Record<string, unknown>; 211 - const main = defs["main"] as Record<string, unknown>; 212 - expect(main["type"]).toBe("permission-set"); 213 - }); 196 + it('defines a permission-set type', () => { 197 + const defs = schema['defs'] as Record<string, unknown> 198 + const main = defs['main'] as Record<string, unknown> 199 + expect(main['type']).toBe('permission-set') 200 + }) 214 201 215 - it("has title and detail strings", () => { 216 - const defs = schema["defs"] as Record<string, unknown>; 217 - const main = defs["main"] as Record<string, unknown>; 218 - expect(main["title"]).toBeTypeOf("string"); 219 - expect(main["detail"]).toBeTypeOf("string"); 220 - }); 202 + it('has title and detail strings', () => { 203 + const defs = schema['defs'] as Record<string, unknown> 204 + const main = defs['main'] as Record<string, unknown> 205 + expect(main['title']).toBeTypeOf('string') 206 + expect(main['detail']).toBeTypeOf('string') 207 + }) 221 208 222 - it("declares repo permissions for all Barazo record collections", () => { 223 - const defs = schema["defs"] as Record<string, unknown>; 224 - const main = defs["main"] as Record<string, unknown>; 225 - const permissions = main["permissions"] as Record<string, unknown>[]; 226 - expect(permissions).toHaveLength(1); 209 + it('declares repo permissions for all Barazo record collections', () => { 210 + const defs = schema['defs'] as Record<string, unknown> 211 + const main = defs['main'] as Record<string, unknown> 212 + const permissions = main['permissions'] as Record<string, unknown>[] 213 + expect(permissions).toHaveLength(1) 227 214 228 - const repoPerm = permissions[0] as Record<string, unknown>; 229 - expect(repoPerm["type"]).toBe("permission"); 230 - expect(repoPerm["resource"]).toBe("repo"); 215 + const repoPerm = permissions[0] as Record<string, unknown> 216 + expect(repoPerm['type']).toBe('permission') 217 + expect(repoPerm['resource']).toBe('repo') 231 218 232 - const collections = repoPerm["collection"] as string[]; 233 - expect(collections).toContain("forum.barazo.topic.post"); 234 - expect(collections).toContain("forum.barazo.topic.reply"); 235 - expect(collections).toContain("forum.barazo.interaction.reaction"); 236 - expect(collections).toContain("forum.barazo.actor.preferences"); 237 - }); 238 - }); 219 + const collections = repoPerm['collection'] as string[] 220 + expect(collections).toContain('forum.barazo.topic.post') 221 + expect(collections).toContain('forum.barazo.topic.reply') 222 + expect(collections).toContain('forum.barazo.interaction.reaction') 223 + expect(collections).toContain('forum.barazo.actor.preferences') 224 + }) 225 + }) 239 226 240 - describe("forum.barazo.actor.preferences lexicon", () => { 241 - let schema: Record<string, unknown>; 227 + describe('forum.barazo.actor.preferences lexicon', () => { 228 + let schema: Record<string, unknown> 242 229 243 - it("loads successfully", async () => { 244 - schema = (await loadJson( 245 - join(LEXICONS_DIR, "actor/preferences.json"), 246 - )) as Record<string, unknown>; 247 - expect(schema["id"]).toBe("forum.barazo.actor.preferences"); 248 - }); 230 + it('loads successfully', async () => { 231 + schema = (await loadJson(join(LEXICONS_DIR, 'actor/preferences.json'))) as Record< 232 + string, 233 + unknown 234 + > 235 + expect(schema['id']).toBe('forum.barazo.actor.preferences') 236 + }) 249 237 250 - it("uses literal:self key (singleton record)", () => { 251 - const defs = schema["defs"] as Record<string, unknown>; 252 - const main = defs["main"] as Record<string, unknown>; 253 - expect(main["key"]).toBe("literal:self"); 254 - }); 238 + it('uses literal:self key (singleton record)', () => { 239 + const defs = schema['defs'] as Record<string, unknown> 240 + const main = defs['main'] as Record<string, unknown> 241 + expect(main['key']).toBe('literal:self') 242 + }) 255 243 256 - it("has maturityLevel enum with safe, mature, all", () => { 257 - const defs = schema["defs"] as Record<string, unknown>; 258 - const main = defs["main"] as Record<string, unknown>; 259 - const record = main["record"] as Record<string, unknown>; 260 - const props = record["properties"] as Record<string, unknown>; 261 - const ml = props["maturityLevel"] as Record<string, unknown>; 262 - expect(ml["enum"]).toEqual(["safe", "mature", "all"]); 263 - }); 244 + it('has maturityLevel enum with safe, mature, all', () => { 245 + const defs = schema['defs'] as Record<string, unknown> 246 + const main = defs['main'] as Record<string, unknown> 247 + const record = main['record'] as Record<string, unknown> 248 + const props = record['properties'] as Record<string, unknown> 249 + const ml = props['maturityLevel'] as Record<string, unknown> 250 + expect(ml['enum']).toEqual(['safe', 'mature', 'all']) 251 + }) 264 252 265 - it("defines crossPostConfig as a separate def", () => { 266 - const defs = schema["defs"] as Record<string, unknown>; 267 - expect(defs["crossPostConfig"]).toBeDefined(); 268 - const cpc = defs["crossPostConfig"] as Record<string, unknown>; 269 - expect(cpc["type"]).toBe("object"); 270 - }); 271 - }); 253 + it('defines crossPostConfig as a separate def', () => { 254 + const defs = schema['defs'] as Record<string, unknown> 255 + expect(defs['crossPostConfig']).toBeDefined() 256 + const cpc = defs['crossPostConfig'] as Record<string, unknown> 257 + expect(cpc['type']).toBe('object') 258 + }) 259 + })
+87 -99
tests/type-generation.test.ts
··· 1 - import { describe, it, expect } from "vitest"; 1 + import { describe, it, expect } from 'vitest' 2 2 import { 3 3 ForumBarazoTopicPost, 4 4 ForumBarazoTopicReply, ··· 7 7 LEXICON_IDS, 8 8 schemas, 9 9 ids, 10 - } from "../src/index.js"; 10 + } from '../src/index.js' 11 11 12 - describe("generated type exports", () => { 13 - it("exports ForumBarazoTopicPost with Record type and validators", () => { 14 - expect(ForumBarazoTopicPost.isRecord).toBeTypeOf("function"); 15 - expect(ForumBarazoTopicPost.validateRecord).toBeTypeOf("function"); 16 - }); 12 + describe('generated type exports', () => { 13 + it('exports ForumBarazoTopicPost with Record type and validators', () => { 14 + expect(ForumBarazoTopicPost.isRecord).toBeTypeOf('function') 15 + expect(ForumBarazoTopicPost.validateRecord).toBeTypeOf('function') 16 + }) 17 17 18 - it("exports ForumBarazoTopicReply with Record type and validators", () => { 19 - expect(ForumBarazoTopicReply.isRecord).toBeTypeOf("function"); 20 - expect(ForumBarazoTopicReply.validateRecord).toBeTypeOf("function"); 21 - }); 18 + it('exports ForumBarazoTopicReply with Record type and validators', () => { 19 + expect(ForumBarazoTopicReply.isRecord).toBeTypeOf('function') 20 + expect(ForumBarazoTopicReply.validateRecord).toBeTypeOf('function') 21 + }) 22 22 23 - it("exports ForumBarazoInteractionReaction with Record type and validators", () => { 24 - expect(ForumBarazoInteractionReaction.isRecord).toBeTypeOf("function"); 25 - expect(ForumBarazoInteractionReaction.validateRecord).toBeTypeOf( 26 - "function", 27 - ); 28 - }); 23 + it('exports ForumBarazoInteractionReaction with Record type and validators', () => { 24 + expect(ForumBarazoInteractionReaction.isRecord).toBeTypeOf('function') 25 + expect(ForumBarazoInteractionReaction.validateRecord).toBeTypeOf('function') 26 + }) 29 27 30 - it("exports ForumBarazoActorPreferences with Record type and validators", () => { 31 - expect(ForumBarazoActorPreferences.isRecord).toBeTypeOf("function"); 32 - expect(ForumBarazoActorPreferences.validateRecord).toBeTypeOf("function"); 33 - }); 34 - }); 28 + it('exports ForumBarazoActorPreferences with Record type and validators', () => { 29 + expect(ForumBarazoActorPreferences.isRecord).toBeTypeOf('function') 30 + expect(ForumBarazoActorPreferences.validateRecord).toBeTypeOf('function') 31 + }) 32 + }) 35 33 36 - describe("LEXICON_IDS constants", () => { 37 - it("has correct TopicPost ID", () => { 38 - expect(LEXICON_IDS.TopicPost).toBe("forum.barazo.topic.post"); 39 - }); 34 + describe('LEXICON_IDS constants', () => { 35 + it('has correct TopicPost ID', () => { 36 + expect(LEXICON_IDS.TopicPost).toBe('forum.barazo.topic.post') 37 + }) 40 38 41 - it("has correct TopicReply ID", () => { 42 - expect(LEXICON_IDS.TopicReply).toBe("forum.barazo.topic.reply"); 43 - }); 39 + it('has correct TopicReply ID', () => { 40 + expect(LEXICON_IDS.TopicReply).toBe('forum.barazo.topic.reply') 41 + }) 44 42 45 - it("has correct Reaction ID", () => { 46 - expect(LEXICON_IDS.Reaction).toBe("forum.barazo.interaction.reaction"); 47 - }); 43 + it('has correct Reaction ID', () => { 44 + expect(LEXICON_IDS.Reaction).toBe('forum.barazo.interaction.reaction') 45 + }) 48 46 49 - it("has correct ActorPreferences ID", () => { 50 - expect(LEXICON_IDS.ActorPreferences).toBe( 51 - "forum.barazo.actor.preferences", 52 - ); 53 - }); 47 + it('has correct ActorPreferences ID', () => { 48 + expect(LEXICON_IDS.ActorPreferences).toBe('forum.barazo.actor.preferences') 49 + }) 54 50 55 - it("has correct AuthForumAccess ID", () => { 56 - expect(LEXICON_IDS.AuthForumAccess).toBe("forum.barazo.authForumAccess"); 57 - }); 58 - }); 51 + it('has correct AuthForumAccess ID', () => { 52 + expect(LEXICON_IDS.AuthForumAccess).toBe('forum.barazo.authForumAccess') 53 + }) 54 + }) 59 55 60 - describe("generated schemas", () => { 61 - it("exports schemas array", () => { 62 - expect(Array.isArray(schemas)).toBe(true); 63 - expect(schemas.length).toBeGreaterThan(0); 64 - }); 56 + describe('generated schemas', () => { 57 + it('exports schemas array', () => { 58 + expect(Array.isArray(schemas)).toBe(true) 59 + expect(schemas.length).toBeGreaterThan(0) 60 + }) 65 61 66 - it("schemas contain all Barazo lexicon IDs", () => { 67 - const schemaIds = schemas.map( 68 - (s: Record<string, unknown>) => s["id"] as string, 69 - ); 70 - expect(schemaIds).toContain("forum.barazo.topic.post"); 71 - expect(schemaIds).toContain("forum.barazo.topic.reply"); 72 - expect(schemaIds).toContain("forum.barazo.interaction.reaction"); 73 - expect(schemaIds).toContain("forum.barazo.actor.preferences"); 74 - expect(schemaIds).toContain("forum.barazo.authForumAccess"); 75 - }); 76 - }); 62 + it('schemas contain all Barazo lexicon IDs', () => { 63 + const schemaIds = schemas.map((s: Record<string, unknown>) => s['id'] as string) 64 + expect(schemaIds).toContain('forum.barazo.topic.post') 65 + expect(schemaIds).toContain('forum.barazo.topic.reply') 66 + expect(schemaIds).toContain('forum.barazo.interaction.reaction') 67 + expect(schemaIds).toContain('forum.barazo.actor.preferences') 68 + expect(schemaIds).toContain('forum.barazo.authForumAccess') 69 + }) 70 + }) 77 71 78 - describe("generated ids map", () => { 79 - it("maps ForumBarazoTopicPost correctly", () => { 80 - expect(ids.ForumBarazoTopicPost).toBe("forum.barazo.topic.post"); 81 - }); 72 + describe('generated ids map', () => { 73 + it('maps ForumBarazoTopicPost correctly', () => { 74 + expect(ids.ForumBarazoTopicPost).toBe('forum.barazo.topic.post') 75 + }) 82 76 83 - it("maps ForumBarazoTopicReply correctly", () => { 84 - expect(ids.ForumBarazoTopicReply).toBe("forum.barazo.topic.reply"); 85 - }); 77 + it('maps ForumBarazoTopicReply correctly', () => { 78 + expect(ids.ForumBarazoTopicReply).toBe('forum.barazo.topic.reply') 79 + }) 86 80 87 - it("maps ForumBarazoInteractionReaction correctly", () => { 88 - expect(ids.ForumBarazoInteractionReaction).toBe( 89 - "forum.barazo.interaction.reaction", 90 - ); 91 - }); 81 + it('maps ForumBarazoInteractionReaction correctly', () => { 82 + expect(ids.ForumBarazoInteractionReaction).toBe('forum.barazo.interaction.reaction') 83 + }) 92 84 93 - it("maps ForumBarazoActorPreferences correctly", () => { 94 - expect(ids.ForumBarazoActorPreferences).toBe( 95 - "forum.barazo.actor.preferences", 96 - ); 97 - }); 85 + it('maps ForumBarazoActorPreferences correctly', () => { 86 + expect(ids.ForumBarazoActorPreferences).toBe('forum.barazo.actor.preferences') 87 + }) 98 88 99 - it("maps ForumBarazoAuthForumAccess correctly", () => { 100 - expect(ids.ForumBarazoAuthForumAccess).toBe( 101 - "forum.barazo.authForumAccess", 102 - ); 103 - }); 104 - }); 89 + it('maps ForumBarazoAuthForumAccess correctly', () => { 90 + expect(ids.ForumBarazoAuthForumAccess).toBe('forum.barazo.authForumAccess') 91 + }) 92 + }) 105 93 106 - describe("isRecord type guards", () => { 107 - it("ForumBarazoTopicPost.isRecord identifies correct $type", () => { 94 + describe('isRecord type guards', () => { 95 + it('ForumBarazoTopicPost.isRecord identifies correct $type', () => { 108 96 expect( 109 97 ForumBarazoTopicPost.isRecord({ 110 - $type: "forum.barazo.topic.post", 111 - title: "Test", 112 - }), 113 - ).toBe(true); 114 - }); 98 + $type: 'forum.barazo.topic.post', 99 + title: 'Test', 100 + }) 101 + ).toBe(true) 102 + }) 115 103 116 - it("ForumBarazoTopicPost.isRecord rejects wrong $type", () => { 104 + it('ForumBarazoTopicPost.isRecord rejects wrong $type', () => { 117 105 expect( 118 106 ForumBarazoTopicPost.isRecord({ 119 - $type: "forum.barazo.topic.reply", 120 - content: "Test", 121 - }), 122 - ).toBe(false); 123 - }); 107 + $type: 'forum.barazo.topic.reply', 108 + content: 'Test', 109 + }) 110 + ).toBe(false) 111 + }) 124 112 125 - it("ForumBarazoTopicPost.isRecord rejects non-objects", () => { 126 - expect(ForumBarazoTopicPost.isRecord("string")).toBe(false); 127 - expect(ForumBarazoTopicPost.isRecord(null)).toBe(false); 128 - expect(ForumBarazoTopicPost.isRecord(undefined)).toBe(false); 129 - }); 130 - }); 113 + it('ForumBarazoTopicPost.isRecord rejects non-objects', () => { 114 + expect(ForumBarazoTopicPost.isRecord('string')).toBe(false) 115 + expect(ForumBarazoTopicPost.isRecord(null)).toBe(false) 116 + expect(ForumBarazoTopicPost.isRecord(undefined)).toBe(false) 117 + }) 118 + })
+146 -175
tests/zod-validation.test.ts
··· 1 - import { describe, it, expect } from "vitest"; 1 + import { describe, it, expect } from 'vitest' 2 2 import { 3 3 topicPostSchema, 4 4 topicReplySchema, 5 5 reactionSchema, 6 6 actorPreferencesSchema, 7 - } from "../src/validation/index.js"; 7 + } from '../src/validation/index.js' 8 8 9 - const VALID_DID = "did:plc:abc123def456"; 10 - const VALID_DATETIME = "2026-02-12T10:00:00.000Z"; 9 + const VALID_DID = 'did:plc:abc123def456' 10 + const VALID_DATETIME = '2026-02-12T10:00:00.000Z' 11 11 const VALID_STRONG_REF = { 12 - uri: "at://did:plc:abc123/forum.barazo.topic.post/3jzfcijpj2z2a", 13 - cid: "bafyreibouvacvqhc2vkwwtdkfynpcaoatmkde7uhrw47ne4gu63cnzc7yq", 14 - }; 12 + uri: 'at://did:plc:abc123/forum.barazo.topic.post/3jzfcijpj2z2a', 13 + cid: 'bafyreibouvacvqhc2vkwwtdkfynpcaoatmkde7uhrw47ne4gu63cnzc7yq', 14 + } 15 15 16 - describe("topicPostSchema", () => { 16 + describe('topicPostSchema', () => { 17 17 const validPost = { 18 - title: "Test Topic", 19 - content: "This is a test topic body.", 18 + title: 'Test Topic', 19 + content: 'This is a test topic body.', 20 20 community: VALID_DID, 21 - category: "general", 21 + category: 'general', 22 22 createdAt: VALID_DATETIME, 23 - }; 23 + } 24 24 25 - it("accepts a valid minimal post", () => { 26 - expect(topicPostSchema.safeParse(validPost).success).toBe(true); 27 - }); 25 + it('accepts a valid minimal post', () => { 26 + expect(topicPostSchema.safeParse(validPost).success).toBe(true) 27 + }) 28 28 29 - it("accepts a post with all optional fields", () => { 29 + it('accepts a post with all optional fields', () => { 30 30 const full = { 31 31 ...validPost, 32 - contentFormat: "markdown" as const, 33 - tags: ["test", "poc"], 34 - labels: { values: [{ val: "sexual" }] }, 35 - }; 36 - expect(topicPostSchema.safeParse(full).success).toBe(true); 37 - }); 32 + contentFormat: 'markdown' as const, 33 + tags: ['test', 'poc'], 34 + labels: { values: [{ val: 'sexual' }] }, 35 + } 36 + expect(topicPostSchema.safeParse(full).success).toBe(true) 37 + }) 38 38 39 - it("rejects empty title", () => { 40 - expect( 41 - topicPostSchema.safeParse({ ...validPost, title: "" }).success, 42 - ).toBe(false); 43 - }); 39 + it('rejects empty title', () => { 40 + expect(topicPostSchema.safeParse({ ...validPost, title: '' }).success).toBe(false) 41 + }) 44 42 45 - it("rejects title exceeding maxLength (2000 bytes)", () => { 46 - const longTitle = "x".repeat(2001); 47 - expect( 48 - topicPostSchema.safeParse({ ...validPost, title: longTitle }).success, 49 - ).toBe(false); 50 - }); 43 + it('rejects title exceeding maxLength (2000 bytes)', () => { 44 + const longTitle = 'x'.repeat(2001) 45 + expect(topicPostSchema.safeParse({ ...validPost, title: longTitle }).success).toBe(false) 46 + }) 51 47 52 - it("rejects empty content", () => { 53 - expect( 54 - topicPostSchema.safeParse({ ...validPost, content: "" }).success, 55 - ).toBe(false); 56 - }); 48 + it('rejects empty content', () => { 49 + expect(topicPostSchema.safeParse({ ...validPost, content: '' }).success).toBe(false) 50 + }) 57 51 58 - it("rejects content exceeding maxLength (100000)", () => { 59 - const longContent = "x".repeat(100_001); 60 - expect( 61 - topicPostSchema.safeParse({ ...validPost, content: longContent }).success, 62 - ).toBe(false); 63 - }); 52 + it('rejects content exceeding maxLength (100000)', () => { 53 + const longContent = 'x'.repeat(100_001) 54 + expect(topicPostSchema.safeParse({ ...validPost, content: longContent }).success).toBe(false) 55 + }) 64 56 65 - it("rejects invalid DID format for community", () => { 66 - expect( 67 - topicPostSchema.safeParse({ ...validPost, community: "not-a-did" }) 68 - .success, 69 - ).toBe(false); 70 - }); 57 + it('rejects invalid DID format for community', () => { 58 + expect(topicPostSchema.safeParse({ ...validPost, community: 'not-a-did' }).success).toBe(false) 59 + }) 71 60 72 - it("rejects more than 5 tags", () => { 61 + it('rejects more than 5 tags', () => { 73 62 const tooManyTags = { 74 63 ...validPost, 75 - tags: ["a", "b", "c", "d", "e", "f"], 76 - }; 77 - expect(topicPostSchema.safeParse(tooManyTags).success).toBe(false); 78 - }); 64 + tags: ['a', 'b', 'c', 'd', 'e', 'f'], 65 + } 66 + expect(topicPostSchema.safeParse(tooManyTags).success).toBe(false) 67 + }) 79 68 80 - it("rejects empty tag strings", () => { 81 - expect( 82 - topicPostSchema.safeParse({ ...validPost, tags: [""] }).success, 83 - ).toBe(false); 84 - }); 69 + it('rejects empty tag strings', () => { 70 + expect(topicPostSchema.safeParse({ ...validPost, tags: [''] }).success).toBe(false) 71 + }) 85 72 86 - it("rejects invalid datetime format", () => { 87 - expect( 88 - topicPostSchema.safeParse({ ...validPost, createdAt: "not-a-date" }) 89 - .success, 90 - ).toBe(false); 91 - }); 73 + it('rejects invalid datetime format', () => { 74 + expect(topicPostSchema.safeParse({ ...validPost, createdAt: 'not-a-date' }).success).toBe(false) 75 + }) 92 76 93 - it("rejects empty category", () => { 94 - expect( 95 - topicPostSchema.safeParse({ ...validPost, category: "" }).success, 96 - ).toBe(false); 97 - }); 77 + it('rejects empty category', () => { 78 + expect(topicPostSchema.safeParse({ ...validPost, category: '' }).success).toBe(false) 79 + }) 98 80 99 - it("rejects missing required fields", () => { 100 - expect(topicPostSchema.safeParse({}).success).toBe(false); 101 - expect( 102 - topicPostSchema.safeParse({ title: "Test" }).success, 103 - ).toBe(false); 104 - }); 81 + it('rejects missing required fields', () => { 82 + expect(topicPostSchema.safeParse({}).success).toBe(false) 83 + expect(topicPostSchema.safeParse({ title: 'Test' }).success).toBe(false) 84 + }) 105 85 106 - it("rejects invalid contentFormat", () => { 107 - expect( 108 - topicPostSchema.safeParse({ ...validPost, contentFormat: "html" }) 109 - .success, 110 - ).toBe(false); 111 - }); 86 + it('rejects invalid contentFormat', () => { 87 + expect(topicPostSchema.safeParse({ ...validPost, contentFormat: 'html' }).success).toBe(false) 88 + }) 112 89 113 - it("rejects labels with more than 10 values", () => { 90 + it('rejects labels with more than 10 values', () => { 114 91 const tooManyLabels = { 115 92 ...validPost, 116 93 labels: { 117 94 values: Array.from({ length: 11 }, (_, i) => ({ val: `label-${String(i)}` })), 118 95 }, 119 - }; 120 - expect(topicPostSchema.safeParse(tooManyLabels).success).toBe(false); 121 - }); 122 - }); 96 + } 97 + expect(topicPostSchema.safeParse(tooManyLabels).success).toBe(false) 98 + }) 99 + }) 123 100 124 - describe("topicReplySchema", () => { 101 + describe('topicReplySchema', () => { 125 102 const validReply = { 126 - content: "This is a reply.", 103 + content: 'This is a reply.', 127 104 root: VALID_STRONG_REF, 128 105 parent: VALID_STRONG_REF, 129 106 community: VALID_DID, 130 107 createdAt: VALID_DATETIME, 131 - }; 108 + } 132 109 133 - it("accepts a valid reply", () => { 134 - expect(topicReplySchema.safeParse(validReply).success).toBe(true); 135 - }); 110 + it('accepts a valid reply', () => { 111 + expect(topicReplySchema.safeParse(validReply).success).toBe(true) 112 + }) 136 113 137 - it("rejects missing root", () => { 138 - const { root: _, ...noRoot } = validReply; 139 - expect(topicReplySchema.safeParse(noRoot).success).toBe(false); 140 - }); 114 + it('rejects missing root', () => { 115 + const { root: _, ...noRoot } = validReply 116 + expect(topicReplySchema.safeParse(noRoot).success).toBe(false) 117 + }) 141 118 142 - it("rejects missing parent", () => { 143 - const { parent: _, ...noParent } = validReply; 144 - expect(topicReplySchema.safeParse(noParent).success).toBe(false); 145 - }); 119 + it('rejects missing parent', () => { 120 + const { parent: _, ...noParent } = validReply 121 + expect(topicReplySchema.safeParse(noParent).success).toBe(false) 122 + }) 146 123 147 - it("rejects invalid strongRef (missing cid)", () => { 124 + it('rejects invalid strongRef (missing cid)', () => { 148 125 expect( 149 126 topicReplySchema.safeParse({ 150 127 ...validReply, 151 - root: { uri: "at://did:plc:abc/test/123" }, 152 - }).success, 153 - ).toBe(false); 154 - }); 128 + root: { uri: 'at://did:plc:abc/test/123' }, 129 + }).success 130 + ).toBe(false) 131 + }) 155 132 156 - it("rejects content exceeding 50000 bytes", () => { 133 + it('rejects content exceeding 50000 bytes', () => { 157 134 expect( 158 135 topicReplySchema.safeParse({ 159 136 ...validReply, 160 - content: "x".repeat(50_001), 161 - }).success, 162 - ).toBe(false); 163 - }); 164 - }); 137 + content: 'x'.repeat(50_001), 138 + }).success 139 + ).toBe(false) 140 + }) 141 + }) 165 142 166 - describe("reactionSchema", () => { 143 + describe('reactionSchema', () => { 167 144 const validReaction = { 168 145 subject: VALID_STRONG_REF, 169 - type: "like", 146 + type: 'like', 170 147 community: VALID_DID, 171 148 createdAt: VALID_DATETIME, 172 - }; 149 + } 173 150 174 - it("accepts a valid reaction", () => { 175 - expect(reactionSchema.safeParse(validReaction).success).toBe(true); 176 - }); 151 + it('accepts a valid reaction', () => { 152 + expect(reactionSchema.safeParse(validReaction).success).toBe(true) 153 + }) 177 154 178 - it("rejects empty type string", () => { 179 - expect( 180 - reactionSchema.safeParse({ ...validReaction, type: "" }).success, 181 - ).toBe(false); 182 - }); 155 + it('rejects empty type string', () => { 156 + expect(reactionSchema.safeParse({ ...validReaction, type: '' }).success).toBe(false) 157 + }) 183 158 184 - it("rejects type exceeding 300 bytes", () => { 185 - expect( 186 - reactionSchema.safeParse({ ...validReaction, type: "x".repeat(301) }) 187 - .success, 188 - ).toBe(false); 189 - }); 159 + it('rejects type exceeding 300 bytes', () => { 160 + expect(reactionSchema.safeParse({ ...validReaction, type: 'x'.repeat(301) }).success).toBe( 161 + false 162 + ) 163 + }) 190 164 191 - it("rejects invalid subject (not a strongRef)", () => { 165 + it('rejects invalid subject (not a strongRef)', () => { 192 166 expect( 193 167 reactionSchema.safeParse({ 194 168 ...validReaction, 195 - subject: { uri: "not-an-at-uri", cid: "test" }, 196 - }).success, 197 - ).toBe(false); 198 - }); 199 - }); 169 + subject: { uri: 'not-an-at-uri', cid: 'test' }, 170 + }).success 171 + ).toBe(false) 172 + }) 173 + }) 200 174 201 - describe("actorPreferencesSchema", () => { 175 + describe('actorPreferencesSchema', () => { 202 176 const validPrefs = { 203 - maturityLevel: "safe" as const, 177 + maturityLevel: 'safe' as const, 204 178 updatedAt: VALID_DATETIME, 205 - }; 179 + } 206 180 207 - it("accepts valid minimal preferences", () => { 208 - expect(actorPreferencesSchema.safeParse(validPrefs).success).toBe(true); 209 - }); 181 + it('accepts valid minimal preferences', () => { 182 + expect(actorPreferencesSchema.safeParse(validPrefs).success).toBe(true) 183 + }) 210 184 211 - it("accepts all maturity levels", () => { 212 - for (const level of ["safe", "mature", "all"]) { 185 + it('accepts all maturity levels', () => { 186 + for (const level of ['safe', 'mature', 'all']) { 213 187 expect( 214 188 actorPreferencesSchema.safeParse({ 215 189 ...validPrefs, 216 190 maturityLevel: level, 217 - }).success, 218 - ).toBe(true); 191 + }).success 192 + ).toBe(true) 219 193 } 220 - }); 194 + }) 221 195 222 - it("rejects invalid maturity level", () => { 196 + it('rejects invalid maturity level', () => { 223 197 expect( 224 198 actorPreferencesSchema.safeParse({ 225 199 ...validPrefs, 226 - maturityLevel: "extreme", 227 - }).success, 228 - ).toBe(false); 229 - }); 200 + maturityLevel: 'extreme', 201 + }).success 202 + ).toBe(false) 203 + }) 230 204 231 - it("accepts preferences with all optional fields", () => { 205 + it('accepts preferences with all optional fields', () => { 232 206 const full = { 233 207 ...validPrefs, 234 - mutedWords: ["spam", "crypto"], 208 + mutedWords: ['spam', 'crypto'], 235 209 blockedDids: [VALID_DID], 236 210 mutedDids: [VALID_DID], 237 211 crossPostDefaults: { bluesky: true, frontpage: false }, 238 - }; 239 - expect(actorPreferencesSchema.safeParse(full).success).toBe(true); 240 - }); 212 + } 213 + expect(actorPreferencesSchema.safeParse(full).success).toBe(true) 214 + }) 241 215 242 - it("rejects more than 100 muted words", () => { 216 + it('rejects more than 100 muted words', () => { 243 217 const tooMany = { 244 218 ...validPrefs, 245 219 mutedWords: Array.from({ length: 101 }, (_, i) => `word-${String(i)}`), 246 - }; 247 - expect(actorPreferencesSchema.safeParse(tooMany).success).toBe(false); 248 - }); 220 + } 221 + expect(actorPreferencesSchema.safeParse(tooMany).success).toBe(false) 222 + }) 249 223 250 - it("rejects more than 1000 blocked DIDs", () => { 224 + it('rejects more than 1000 blocked DIDs', () => { 251 225 const tooMany = { 252 226 ...validPrefs, 253 - blockedDids: Array.from( 254 - { length: 1001 }, 255 - (_, i) => `did:plc:blocked${String(i)}`, 256 - ), 257 - }; 258 - expect(actorPreferencesSchema.safeParse(tooMany).success).toBe(false); 259 - }); 227 + blockedDids: Array.from({ length: 1001 }, (_, i) => `did:plc:blocked${String(i)}`), 228 + } 229 + expect(actorPreferencesSchema.safeParse(tooMany).success).toBe(false) 230 + }) 260 231 261 - it("rejects invalid DID in blockedDids", () => { 232 + it('rejects invalid DID in blockedDids', () => { 262 233 expect( 263 234 actorPreferencesSchema.safeParse({ 264 235 ...validPrefs, 265 - blockedDids: ["not-a-did"], 266 - }).success, 267 - ).toBe(false); 268 - }); 269 - }); 236 + blockedDids: ['not-a-did'], 237 + }).success 238 + ).toBe(false) 239 + }) 240 + })
+5 -5
vitest.config.ts
··· 1 - import { defineConfig } from "vitest/config"; 1 + import { defineConfig } from 'vitest/config' 2 2 3 3 export default defineConfig({ 4 4 test: { 5 5 globals: true, 6 - root: ".", 6 + root: '.', 7 7 coverage: { 8 - provider: "v8", 9 - reporter: ["text", "lcov"], 8 + provider: 'v8', 9 + reporter: ['text', 'lcov'], 10 10 thresholds: { 11 11 statements: 80, 12 12 branches: 80, ··· 16 16 }, 17 17 testTimeout: 10_000, 18 18 }, 19 - }); 19 + })