├── .gitignore ├── src ├── index.d.ts ├── types.d.ts └── walk.js ├── vitest.config.js ├── .prettierrc ├── tsconfig.json ├── .changeset └── config.json ├── test ├── types.d.ts ├── transformation.js └── traversal.js ├── package.json ├── LICENSE ├── .github └── workflows │ ├── release.yml │ └── ci.yml ├── CHANGELOG.md ├── README.md └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /node_modules 3 | /types -------------------------------------------------------------------------------- /src/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './walk.js'; 2 | export * from './types.d.ts'; 3 | -------------------------------------------------------------------------------- /vitest.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | include: ['./test/*.js'] 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "overrides": [ 6 | { 7 | "files": [ 8 | "*.md" 9 | ], 10 | "options": { 11 | "useTabs": false, 12 | "tabWidth": 2 13 | } 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "checkJs": true, 5 | "module": "esnext", 6 | "target": "esnext", 7 | "moduleResolution": "bundler", 8 | "noEmit": true, 9 | "strict": true, 10 | "skipLibCheck": true 11 | }, 12 | "include": ["./src", "./test", "./vitest.config.js"] 13 | } -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@3.0.5/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /src/types.d.ts: -------------------------------------------------------------------------------- 1 | type BaseNode = { type: string }; 2 | 3 | type NodeOf = X extends { type: T } ? X : never; 4 | 5 | type SpecialisedVisitors = { 6 | [K in T['type']]?: Visitor, U, T>; 7 | }; 8 | 9 | export type Visitor = (node: T, context: Context) => V | void; 10 | 11 | export type Visitors = T['type'] extends '_' 12 | ? never 13 | : SpecialisedVisitors & { _?: Visitor }; 14 | 15 | export interface Context { 16 | next: (state?: U) => T | void; 17 | path: T[]; 18 | state: U; 19 | stop: () => void; 20 | visit: (node: T, state?: U) => T; 21 | } 22 | -------------------------------------------------------------------------------- /test/types.d.ts: -------------------------------------------------------------------------------- 1 | export interface Root { 2 | type: 'Root'; 3 | children: TestNode[]; 4 | metadata?: any; 5 | } 6 | 7 | export interface A { 8 | type: 'A'; 9 | metadata?: any; 10 | } 11 | 12 | export interface B { 13 | type: 'B'; 14 | } 15 | 16 | export interface C { 17 | type: 'C'; 18 | } 19 | 20 | export interface TransformedRoot { 21 | type: 'TransformedRoot'; 22 | elements: TestNode[]; 23 | } 24 | 25 | export interface TransformedA { 26 | type: 'TransformedA'; 27 | } 28 | 29 | export interface TransformedB { 30 | type: 'TransformedB'; 31 | } 32 | 33 | export interface TransformedC { 34 | type: 'TransformedC'; 35 | } 36 | 37 | export type TestNode = 38 | | Root 39 | | A 40 | | B 41 | | C 42 | | TransformedRoot 43 | | TransformedA 44 | | TransformedB 45 | | TransformedC; 46 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zimmerframe", 3 | "description": "A tool for walking ASTs", 4 | "version": "1.1.4", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/sveltejs/zimmerframe" 8 | }, 9 | "type": "module", 10 | "exports": { 11 | ".": { 12 | "types": "./types/index.d.ts", 13 | "import": "./src/walk.js" 14 | } 15 | }, 16 | "types": "./types/index.d.ts", 17 | "files": [ 18 | "src", 19 | "types" 20 | ], 21 | "devDependencies": { 22 | "@changesets/cli": "^2.29.7", 23 | "dts-buddy": "^0.6.2", 24 | "typescript": "^5.9.2", 25 | "vitest": "^3.2.4" 26 | }, 27 | "scripts": { 28 | "changeset:version": "changeset version", 29 | "changeset:publish": "changeset publish", 30 | "prepublishOnly": "dts-buddy -m zimmerframe:src/index.d.ts", 31 | "check": "tsc", 32 | "test": "vitest --run", 33 | "test:watch": "vitest" 34 | }, 35 | "license": "MIT", 36 | "packageManager": "pnpm@10.15.1" 37 | } 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 [these people](https://github.com/Rich-Harris/zimmerframe/graphs/contributors) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | permissions: {} 9 | jobs: 10 | release: 11 | # prevents this action from running on forks 12 | if: github.repository == 'sveltejs/zimmerframe' 13 | permissions: 14 | contents: write # to create release (changesets/action) 15 | id-token: write # OpenID Connect token needed for provenance 16 | pull-requests: write # to create pull request (changesets/action) 17 | name: Release 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Checkout Repo 21 | uses: actions/checkout@v4 22 | with: 23 | # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits 24 | fetch-depth: 0 25 | - uses: pnpm/action-setup@v4 26 | - name: Setup Node.js 27 | uses: actions/setup-node@v4 28 | with: 29 | node-version: 24.x 30 | cache: pnpm 31 | 32 | - name: Install 33 | run: pnpm install --frozen-lockfile 34 | 35 | - name: Create Release Pull Request or Publish to npm 36 | id: changesets 37 | uses: changesets/action@v1 38 | with: 39 | publish: pnpm changeset:publish 40 | version: pnpm changeset:version 41 | env: 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | NPM_CONFIG_PROVENANCE: true 44 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | # cancel in-progress runs on new commits to same PR (gitub.event.number) 10 | concurrency: 11 | group: ${{ github.workflow }}-${{ github.event.number || github.sha }} 12 | cancel-in-progress: true 13 | 14 | jobs: 15 | Tests: 16 | runs-on: ${{ matrix.os }} 17 | timeout-minutes: 30 18 | strategy: 19 | fail-fast: false 20 | matrix: 21 | include: 22 | - node-version: 20 23 | os: [ubuntu-latest] 24 | - node-version: 20 25 | os: windows-latest 26 | steps: 27 | - run: git config --global core.autocrlf false 28 | - uses: actions/checkout@v4 29 | - uses: pnpm/action-setup@v4 30 | - uses: actions/setup-node@v4 31 | with: 32 | node-version: ${{ matrix.node-version }} 33 | cache: pnpm 34 | - run: pnpm install --frozen-lockfile 35 | - run: pnpm test 36 | Check: 37 | runs-on: ${{ matrix.os }} 38 | timeout-minutes: 30 39 | strategy: 40 | fail-fast: false 41 | matrix: 42 | include: 43 | - node-version: 20 44 | os: [ubuntu-latest] 45 | - node-version: 20 46 | os: windows-latest 47 | steps: 48 | - run: git config --global core.autocrlf false 49 | - uses: actions/checkout@v4 50 | - uses: pnpm/action-setup@v4 51 | - uses: actions/setup-node@v4 52 | with: 53 | node-version: ${{ matrix.node-version }} 54 | cache: pnpm 55 | - run: pnpm install --frozen-lockfile 56 | - run: pnpm check 57 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # zimmerframe changelog 2 | 3 | ## 1.1.4 4 | 5 | ### Patch Changes 6 | 7 | - e8b889e: chore: speed up array traversal 8 | 9 | ## 1.1.3 10 | 11 | ### Patch Changes 12 | 13 | - 9c17204: fix: update `pkg.repository` 14 | 15 | ## 1.1.2 16 | 17 | - Keep non-enumerable properties non-enumerable ([#20](https://github.com/Rich-Harris/zimmerframe/pull/20)) 18 | 19 | ## 1.1.1 20 | 21 | - Prevent false positive mutations ([#18](https://github.com/Rich-Harris/zimmerframe/pull/18)) 22 | - Keep non-enumerable properties when cloning nodes ([#19](https://github.com/Rich-Harris/zimmerframe/pull/19)) 23 | 24 | ## 1.1.0 25 | 26 | - Return transformed node from `context.next()` ([#17](https://github.com/Rich-Harris/zimmerframe/pull/17)) 27 | 28 | ## 1.0.0 29 | 30 | - Stable release 31 | 32 | ## 0.2.1 33 | 34 | - Push current node to path when calling `visit` 35 | 36 | ## 0.2.0 37 | 38 | - Require `next()` to be called to visit children 39 | 40 | ## 0.1.2 41 | 42 | - Forward state from universal visitors 43 | 44 | ## 0.1.1 45 | 46 | - Skip children after calling `visit` 47 | 48 | ## 0.1.0 49 | 50 | - Rename `context.transform` to `context.visit` 51 | 52 | ## 0.0.11 53 | 54 | - Respect individual visitor transformations if universal visitors calls `next(...)` 55 | 56 | ## 0.0.10 57 | 58 | - Simplify `Context` type arguments 59 | 60 | ## 0.0.9 61 | 62 | - Skip children when transforming 63 | 64 | ## 0.0.8 65 | 66 | - Fix `path` type 67 | 68 | ## 0.0.7 69 | 70 | - Fix package.json 71 | 72 | ## 0.0.6 73 | 74 | - Export types 75 | 76 | ## 0.0.5 77 | 78 | - Fix some type issues 79 | 80 | ## 0.0.4 81 | 82 | - Make visitor signature more forgiving 83 | 84 | ## 0.0.3 85 | 86 | - Allow state to be `null` 87 | 88 | ## 0.0.2 89 | 90 | - Add `pkg.files` 91 | 92 | ## 0.0.1 93 | 94 | - First release 95 | -------------------------------------------------------------------------------- /src/walk.js: -------------------------------------------------------------------------------- 1 | /** @import { Context, Visitor, Visitors } from './types.js' */ 2 | 3 | /** 4 | * @template {{ type: string }} T 5 | * @template {Record | null} U 6 | * @param {T} node 7 | * @param {U} state 8 | * @param {Visitors} visitors 9 | */ 10 | export function walk(node, state, visitors) { 11 | const universal = visitors._; 12 | 13 | let stopped = false; 14 | 15 | /** @type {Visitor} _ */ 16 | function default_visitor(_, { next, state }) { 17 | next(state); 18 | } 19 | 20 | /** 21 | * @param {T} node 22 | * @param {T[]} path 23 | * @param {U} state 24 | * @returns {T | undefined} 25 | */ 26 | function visit(node, path, state) { 27 | // Don't return the node here or it could lead to false-positive mutation detection 28 | if (stopped) return; 29 | if (!node.type) return; 30 | 31 | /** @type {T | void} */ 32 | let result; 33 | 34 | /** @type {Record} */ 35 | const mutations = {}; 36 | 37 | /** @type {Context} */ 38 | const context = { 39 | path, 40 | state, 41 | next: (next_state = state) => { 42 | path.push(node); 43 | for (const key in node) { 44 | if (key === 'type') continue; 45 | 46 | const child_node = node[key]; 47 | if (child_node && typeof child_node === 'object') { 48 | if (Array.isArray(child_node)) { 49 | /** @type {Record} */ 50 | const array_mutations = {}; 51 | const len = child_node.length; 52 | 53 | let mutated = false; 54 | 55 | for (let i = 0; i < len; i++) { 56 | const node = child_node[i]; 57 | if (node && typeof node === 'object') { 58 | const result = visit(node, path, next_state); 59 | if (result) { 60 | array_mutations[i] = result; 61 | mutated = true; 62 | } 63 | } 64 | } 65 | 66 | if (mutated) { 67 | mutations[key] = child_node.map( 68 | (node, i) => array_mutations[i] ?? node 69 | ); 70 | } 71 | } else { 72 | const result = visit( 73 | /** @type {T} */ (child_node), 74 | path, 75 | next_state 76 | ); 77 | 78 | // @ts-ignore 79 | if (result) { 80 | mutations[key] = result; 81 | } 82 | } 83 | } 84 | } 85 | path.pop(); 86 | 87 | if (Object.keys(mutations).length > 0) { 88 | return apply_mutations(node, mutations); 89 | } 90 | }, 91 | stop: () => { 92 | stopped = true; 93 | }, 94 | visit: (next_node, next_state = state) => { 95 | path.push(node); 96 | const result = visit(next_node, path, next_state) ?? next_node; 97 | path.pop(); 98 | return result; 99 | } 100 | }; 101 | 102 | let visitor = /** @type {Visitor} */ ( 103 | visitors[/** @type {T['type']} */ (node.type)] ?? default_visitor 104 | ); 105 | 106 | if (universal) { 107 | /** @type {T | void} */ 108 | let inner_result; 109 | 110 | result = universal(node, { 111 | ...context, 112 | /** @param {U} next_state */ 113 | next: (next_state = state) => { 114 | state = next_state; // make it the default for subsequent specialised visitors 115 | 116 | inner_result = visitor(node, { 117 | ...context, 118 | state: next_state 119 | }); 120 | 121 | return inner_result; 122 | } 123 | }); 124 | 125 | // @ts-expect-error TypeScript doesn't understand that `context.next(...)` is called immediately 126 | if (!result && inner_result) { 127 | result = inner_result; 128 | } 129 | } else { 130 | result = visitor(node, context); 131 | } 132 | 133 | if (!result) { 134 | if (Object.keys(mutations).length > 0) { 135 | result = apply_mutations(node, mutations); 136 | } 137 | } 138 | 139 | if (result) { 140 | return result; 141 | } 142 | } 143 | 144 | return visit(node, [], state) ?? node; 145 | } 146 | 147 | /** 148 | * @template {Record} T 149 | * @param {T} node 150 | * @param {Record} mutations 151 | * @returns {T} 152 | */ 153 | function apply_mutations(node, mutations) { 154 | /** @type {Record} */ 155 | const obj = {}; 156 | 157 | const descriptors = Object.getOwnPropertyDescriptors(node); 158 | 159 | for (const key in descriptors) { 160 | Object.defineProperty(obj, key, descriptors[key]); 161 | } 162 | 163 | for (const key in mutations) { 164 | obj[key] = mutations[key]; 165 | } 166 | 167 | return /** @type {T} */ (obj); 168 | } 169 | -------------------------------------------------------------------------------- /test/transformation.js: -------------------------------------------------------------------------------- 1 | import { expect, test } from 'vitest'; 2 | import { walk } from '../src/walk.js'; 3 | 4 | test('transforms a tree', () => { 5 | /** @type {import('./types').TestNode} */ 6 | const tree = { 7 | type: 'Root', 8 | children: [{ type: 'A' }, { type: 'B' }, { type: 'C' }] 9 | }; 10 | 11 | let count = 0; 12 | 13 | const transformed = /** @type {import('./types').TransformedRoot} */ ( 14 | walk(/** @type {import('./types').TestNode} */ (tree), null, { 15 | Root: (node, { visit }) => { 16 | return { 17 | type: 'TransformedRoot', 18 | elements: node.children.map((child) => visit(child)) 19 | }; 20 | }, 21 | A: (node) => { 22 | count += 1; 23 | return { 24 | type: 'TransformedA' 25 | }; 26 | }, 27 | C: (node) => { 28 | count += 1; 29 | return { 30 | type: 'TransformedC' 31 | }; 32 | } 33 | }) 34 | ); 35 | 36 | expect(count).toBe(2); 37 | 38 | // check that `tree` wasn't mutated 39 | expect(tree).toEqual({ 40 | type: 'Root', 41 | children: [{ type: 'A' }, { type: 'B' }, { type: 'C' }] 42 | }); 43 | 44 | expect(transformed).toEqual({ 45 | type: 'TransformedRoot', 46 | elements: [ 47 | { type: 'TransformedA' }, 48 | { type: 'B' }, 49 | { type: 'TransformedC' } 50 | ] 51 | }); 52 | 53 | // expect the `B` node to have been preserved 54 | expect(transformed.elements[1]).toBe(tree.children[1]); 55 | }); 56 | 57 | test('respects individual visitors if universal visitor calls next()', () => { 58 | /** @type {import('./types').TestNode} */ 59 | const tree = { 60 | type: 'Root', 61 | children: [{ type: 'A' }, { type: 'B' }, { type: 'C' }] 62 | }; 63 | 64 | const transformed = walk( 65 | /** @type {import('./types').TestNode} */ (tree), 66 | null, 67 | { 68 | _(node, { state, next }) { 69 | next(state); 70 | }, 71 | A(node) { 72 | return { 73 | type: 'TransformedA' 74 | }; 75 | } 76 | } 77 | ); 78 | 79 | expect(transformed).toEqual({ 80 | type: 'Root', 81 | children: [{ type: 'TransformedA' }, { type: 'B' }, { type: 'C' }] 82 | }); 83 | }); 84 | 85 | test('returns the result of child transforms when calling next', () => { 86 | /** @type {import('./types').TestNode} */ 87 | const tree = { 88 | type: 'Root', 89 | children: [{ type: 'A' }, { type: 'B' }, { type: 'C' }] 90 | }; 91 | 92 | let count = 0; 93 | let children; 94 | 95 | const transformed = /** @type {import('./types').TestNode} */ ( 96 | walk(/** @type {import('./types').TestNode} */ (tree), null, { 97 | Root: (node, { next }) => { 98 | const result = /** @type {import('./types').Root} */ (next()); 99 | children = result.children; 100 | return node; 101 | }, 102 | A: (node) => { 103 | count += 1; 104 | return { 105 | type: 'TransformedA' 106 | }; 107 | }, 108 | C: (node) => { 109 | count += 1; 110 | return { 111 | type: 'TransformedC' 112 | }; 113 | } 114 | }) 115 | ); 116 | 117 | expect(count).toBe(2); 118 | 119 | // check that `tree` wasn't mutated 120 | expect(tree).toEqual({ 121 | type: 'Root', 122 | children: [{ type: 'A' }, { type: 'B' }, { type: 'C' }] 123 | }); 124 | 125 | expect(transformed).toBe(tree); 126 | 127 | expect(children).toEqual([ 128 | { type: 'TransformedA' }, 129 | { type: 'B' }, 130 | { type: 'TransformedC' } 131 | ]); 132 | }); 133 | 134 | test('returns undefined if there are no child transformations', () => { 135 | /** @type {import('./types').TestNode} */ 136 | const tree = { 137 | type: 'Root', 138 | children: [{ type: 'A' }, { type: 'B' }, { type: 'C' }] 139 | }; 140 | 141 | let result; 142 | 143 | const transformed = /** @type {import('./types').TestNode} */ ( 144 | walk(/** @type {import('./types').TestNode} */ (tree), null, { 145 | Root: (node, { next }) => { 146 | result = next(); 147 | } 148 | }) 149 | ); 150 | 151 | expect(transformed).toBe(tree); 152 | 153 | expect(result).toBe(undefined); 154 | }); 155 | 156 | test('keeps non-enumerable properties', () => { 157 | /** @type {import('./types').TestNode} */ 158 | const tree = { 159 | type: 'Root', 160 | children: [ 161 | { 162 | type: 'Root', 163 | children: [{ type: 'A' }, { type: 'B' }] 164 | }, 165 | { type: 'B' } 166 | ] 167 | }; 168 | 169 | Object.defineProperty(tree.children[0], 'metadata', { 170 | value: { foo: true }, 171 | enumerable: false 172 | }); 173 | 174 | const transformed = walk( 175 | /** @type {import('./types').TestNode} */ (tree), 176 | null, 177 | { 178 | A() { 179 | return { 180 | type: 'TransformedA' 181 | }; 182 | } 183 | } 184 | ); 185 | 186 | // @ts-ignore 187 | const { metadata } = transformed.children[0]; 188 | 189 | expect(metadata).toEqual({ 190 | foo: true 191 | }); 192 | }); 193 | 194 | test('doesnt mutate tree with non-type objects', () => { 195 | const tree = { 196 | type: 'Root', 197 | children: [{ type: 'A', metadata: { foo: true } }, { type: 'B' }] 198 | }; 199 | 200 | const transformed = walk(tree, null, {}); 201 | 202 | expect(transformed).toBe(tree); 203 | }); 204 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # zimmerframe 2 | 3 | A tool for walking. 4 | 5 | Specifically, it's a tool for walking an abstract syntax tree (AST), where every node is an object with a `type: string`. This includes [ESTree](https://github.com/estree/estree) nodes, such as you might generate with [Acorn](https://github.com/acornjs/acorn) or [Meriyah](https://github.com/meriyah/meriyah), but also includes things like [CSSTree](https://github.com/csstree/csstree) or an arbitrary AST of your own devising. 6 | 7 | ## Usage 8 | 9 | ```ts 10 | import { walk } from 'zimmerframe'; 11 | import { parse } from 'acorn'; 12 | import { Node } from 'estree'; 13 | 14 | const program = parse(` 15 | let message = 'hello'; 16 | console.log(message); 17 | 18 | if (true) { 19 | let answer = 42; 20 | console.log(answer); 21 | } 22 | `); 23 | 24 | // You can pass in arbitrary state 25 | const state = { 26 | declarations: [], 27 | depth: 0 28 | }; 29 | 30 | const transformed = walk(program as Node, state, { 31 | _(node, { state, next }) { 32 | // the `_` visitor is 'universal' — if provided, 33 | // it will run for every node, before deferring 34 | // to specialised visitors. you can pass a new 35 | // `state` object to `next` 36 | next({ ...state, answer: 42 }); 37 | }, 38 | VariableDeclarator(node, { state }) { 39 | // `state` is passed into each visitor 40 | if (node.id.type === 'Identifier') { 41 | state.declarations.push({ 42 | depth: state.depth, 43 | name: node.id.name 44 | }); 45 | } 46 | }, 47 | BlockStatement(node, { state, next, stop }) { 48 | // you must call `next()` or `next(childState)` 49 | // to visit child nodes 50 | console.log('entering BlockStatement'); 51 | next({ ...state, depth: state.depth + 1 }); 52 | console.log('leaving BlockStatement'); 53 | }, 54 | Literal(node) { 55 | // if you return something, it will replace 56 | // the current node 57 | if (node.value === 'hello') { 58 | return { 59 | ...node, 60 | value: 'goodbye' 61 | }; 62 | } 63 | }, 64 | IfStatement(node, { visit }) { 65 | // normally, returning a value will halt 66 | // traversal into child nodes. you can 67 | // transform children with the current 68 | // visitors using `visit(node, state?)` 69 | if (node.test.type === 'Literal' && node.test.value === true) { 70 | return visit(node.consequent); 71 | } 72 | } 73 | }); 74 | ``` 75 | 76 | The `transformed` AST would look like this: 77 | 78 | ```js 79 | let message = 'goodbye'; 80 | console.log(message); 81 | 82 | { 83 | let answer = 42; 84 | console.log(answer); 85 | } 86 | ``` 87 | 88 | ## Types 89 | 90 | The type of `node` in each visitor is inferred from the visitor's name. For example: 91 | 92 | ```ts 93 | walk(ast as estree.Node, state, { 94 | ArrowFunctionExpression(node) { 95 | // `node` is of type estree.ArrowFunctionExpression 96 | } 97 | }); 98 | ``` 99 | 100 | For this to work, the first argument should be casted to an union of all the types you plan to visit. 101 | 102 | You can import types from 'zimmerframe': 103 | 104 | ```ts 105 | import { 106 | walk, 107 | type Visitor, 108 | type Visitors, 109 | type Context 110 | } from 'zimmerframe'; 111 | import type { Node } from 'estree'; 112 | 113 | interface State {...} 114 | 115 | const node: Node = {...}; 116 | const state: State = {...}; 117 | const visitors: Visitors = {...} 118 | 119 | walk(node, state, visitors); 120 | ``` 121 | 122 | ## Context 123 | 124 | Each visitor receives a second argument, `context`, which is an object with the following properties and methods: 125 | 126 | - `next(state?: State): void` — a function that allows you to control when child nodes are visited, and which state they are visited with. If child visitors transform their inputs, this will return the transformed node (if not, returns `undefined`) 127 | - `path: Node[]` — an array of parent nodes. For example, to get the root node you would do `path.at(0)`; to get the current node's immediate parent you would do `path.at(-1)` 128 | - `state: State` — an object of the same type as the second argument to `walk`. Visitors can pass new state objects to their children with `next(childState)` or `visit(node, childState)` 129 | - `stop(): void` — prevents any subsequent traversal 130 | - `visit(node: Node, state?: State): Node` — returns the result of visiting `node` with the current set of visitors. If no `state` is provided, children will inherit the current state 131 | 132 | ## Immutability 133 | 134 | ASTs are regarded as immutable. If you return a transformed node from a visitor, then all parents of the node will be replaced with clones, but unchanged subtrees will reuse the existing nodes. 135 | 136 | For example in this case, no transformation takes place, meaning that the returned value is identical to the original AST: 137 | 138 | ```js 139 | const transformed = walk(original, state, { 140 | Literal(node) { 141 | console.log(node.value); 142 | } 143 | }); 144 | 145 | transformed === original; // true 146 | ``` 147 | 148 | In this case, however, we replace one of the nodes: 149 | 150 | ```js 151 | const original = { 152 | type: 'BinaryExpression', 153 | operator: '+', 154 | left: { 155 | type: 'Identifier', 156 | name: 'foo' 157 | }, 158 | right: { 159 | type: 'Identifier', 160 | name: 'bar' 161 | } 162 | }; 163 | 164 | const transformed = walk(original, state, { 165 | Identifier(node) { 166 | if (node.name === 'bar') { 167 | return { ...node, name: 'baz' }; 168 | } 169 | } 170 | }); 171 | 172 | transformed === original; // false, the BinaryExpression node is cloned 173 | transformed.left === original.left; // true, we can safely reuse this node 174 | ``` 175 | 176 | This makes it very easy to transform parts of your AST without incurring the performance and memory overhead of cloning the entire thing, and without the footgun of mutating it in place. 177 | 178 | ## License 179 | 180 | MIT 181 | -------------------------------------------------------------------------------- /test/traversal.js: -------------------------------------------------------------------------------- 1 | import { expect, test } from 'vitest'; 2 | import { walk } from '../src/walk.js'; 3 | 4 | test('traverses a tree', () => { 5 | /** @type {import('./types').TestNode} */ 6 | const tree = { 7 | type: 'Root', 8 | children: [{ type: 'A' }, { type: 'B' }, { type: 'C' }] 9 | }; 10 | 11 | const state = { 12 | /** @type {string[]} */ 13 | visited: [], 14 | depth: 0 15 | }; 16 | 17 | walk(/** @type {import('./types').TestNode} */ (tree), state, { 18 | Root: (node, { state, next }) => { 19 | expect(node.type).toBe('Root'); 20 | state.visited.push(state.depth + 'root'); 21 | 22 | next({ ...state, depth: state.depth + 1 }); 23 | }, 24 | A: (node, { state }) => { 25 | expect(node.type).toBe('A'); 26 | state.visited.push(state.depth + 'a'); 27 | }, 28 | B: (node, { state }) => { 29 | expect(node.type).toBe('B'); 30 | state.visited.push(state.depth + 'b'); 31 | }, 32 | C: (node, { state }) => { 33 | expect(node.type).toBe('C'); 34 | state.visited.push(state.depth + 'c'); 35 | } 36 | }); 37 | 38 | expect(state.visited).toEqual(['0root', '1a', '1b', '1c']); 39 | }); 40 | 41 | test('visits all nodes with _', () => { 42 | /** @type {import('./types').TestNode} */ 43 | const tree = { 44 | type: 'Root', 45 | children: [{ type: 'A' }, { type: 'B' }, { type: 'C' }] 46 | }; 47 | 48 | let uid = 1; 49 | 50 | const state = { 51 | id: uid, 52 | depth: 0 53 | }; 54 | 55 | /** @type {string[]} */ 56 | const log = []; 57 | 58 | walk(/** @type {import('./types').TestNode} */ (tree), state, { 59 | _: (node, { state, next }) => { 60 | log.push(`${state.depth} ${state.id} enter ${node.type}`); 61 | next({ ...state, id: ++uid }); 62 | log.push(`${state.depth} ${state.id} leave ${node.type}`); 63 | }, 64 | Root: (node, { state, next }) => { 65 | log.push(`${state.depth} ${state.id} visit ${node.type}`); 66 | next({ ...state, depth: state.depth + 1 }); 67 | }, 68 | A: (node, { state }) => { 69 | log.push(`${state.depth} ${state.id} visit ${node.type}`); 70 | }, 71 | B: (node, { state }) => { 72 | log.push(`${state.depth} ${state.id} visit ${node.type}`); 73 | }, 74 | C: (node, { state }) => { 75 | log.push(`${state.depth} ${state.id} visit ${node.type}`); 76 | } 77 | }); 78 | 79 | expect(log).toEqual([ 80 | '0 1 enter Root', 81 | '0 2 visit Root', 82 | '1 2 enter A', 83 | '1 3 visit A', 84 | '1 2 leave A', 85 | '1 2 enter B', 86 | '1 4 visit B', 87 | '1 2 leave B', 88 | '1 2 enter C', 89 | '1 5 visit C', 90 | '1 2 leave C', 91 | '0 1 leave Root' 92 | ]); 93 | }); 94 | 95 | test('state is passed to children of specialized visitor when using universal visitor', () => { 96 | /** @type {import('./types').TestNode} */ 97 | const tree = { 98 | type: 'Root', 99 | children: [{ type: 'A' }, { type: 'B' }, { type: 'C' }] 100 | }; 101 | 102 | const state = { 103 | universal: false 104 | }; 105 | 106 | /** @type {string[]} */ 107 | const log = []; 108 | 109 | walk(/** @type {import('./types').TestNode} */ (tree), state, { 110 | _(node, { next }) { 111 | if (node.type === 'Root') { 112 | next({ universal: true }); 113 | } else { 114 | next(); 115 | } 116 | }, 117 | Root(node, { state, visit }) { 118 | log.push(`visited ${node.type} ${state.universal}`); 119 | 120 | for (const child of node.children) { 121 | visit(child); 122 | } 123 | }, 124 | A(node, { state, visit }) { 125 | log.push(`visited ${node.type} ${state.universal}`); 126 | }, 127 | B(node, { state, visit }) { 128 | log.push(`visited ${node.type} ${state.universal}`); 129 | }, 130 | C(node, { state, visit }) { 131 | log.push(`visited ${node.type} ${state.universal}`); 132 | } 133 | }); 134 | 135 | expect(log).toEqual([ 136 | 'visited Root true', 137 | 'visited A true', 138 | 'visited B true', 139 | 'visited C true' 140 | ]); 141 | }); 142 | 143 | test('path is pushed and popped correctly using next', () => { 144 | /** @type {import('./types').TestNode} */ 145 | const tree = { 146 | type: 'Root', 147 | children: [ 148 | { type: 'Root', children: [{ type: 'A' }] }, 149 | { type: 'B' }, 150 | { type: 'C' } 151 | ] 152 | }; 153 | 154 | /** @type {string[]} */ 155 | const log = []; 156 | 157 | /** 158 | * @param {import('./types').TestNode} node 159 | * @param {import('./types').TestNode[]} path 160 | */ 161 | function log_path(node, path) { 162 | log.push(`visited ${node.type} ${JSON.stringify(path.map((n) => n.type))}`); 163 | } 164 | 165 | walk( 166 | /** @type {import('./types').TestNode} */ (tree), 167 | {}, 168 | { 169 | Root(node, { path, next }) { 170 | log_path(node, path); 171 | next(); 172 | }, 173 | A(node, { path }) { 174 | log_path(node, path); 175 | }, 176 | B(node, { path }) { 177 | log_path(node, path); 178 | }, 179 | C(node, { path }) { 180 | log_path(node, path); 181 | } 182 | } 183 | ); 184 | 185 | expect(log).toEqual([ 186 | 'visited Root []', 187 | 'visited Root ["Root"]', 188 | 'visited A ["Root","Root"]', 189 | 'visited B ["Root"]', 190 | 'visited C ["Root"]' 191 | ]); 192 | }); 193 | 194 | test('path is pushed and popped correctly using visit', () => { 195 | /** @type {import('./types').TestNode} */ 196 | const tree = { 197 | type: 'Root', 198 | children: [ 199 | { type: 'Root', children: [{ type: 'A' }] }, 200 | { type: 'B' }, 201 | { type: 'C' } 202 | ] 203 | }; 204 | 205 | /** @type {string[]} */ 206 | const log = []; 207 | 208 | /** 209 | * @param {import('./types').TestNode} node 210 | * @param {import('./types').TestNode[]} path 211 | */ 212 | function log_path(node, path) { 213 | log.push(`visited ${node.type} ${JSON.stringify(path.map((n) => n.type))}`); 214 | } 215 | 216 | walk( 217 | /** @type {import('./types').TestNode} */ (tree), 218 | {}, 219 | { 220 | Root(node, { path, visit }) { 221 | log_path(node, path); 222 | 223 | for (const child of node.children) { 224 | if (child.type !== 'C') { 225 | visit(child); 226 | } 227 | } 228 | }, 229 | A(node, { path }) { 230 | log_path(node, path); 231 | }, 232 | B(node, { path }) { 233 | log_path(node, path); 234 | }, 235 | C(node, { path }) { 236 | log_path(node, path); 237 | } 238 | } 239 | ); 240 | 241 | expect(log).toEqual([ 242 | 'visited Root []', 243 | 'visited Root ["Root"]', 244 | 'visited A ["Root","Root"]', 245 | 'visited B ["Root"]' 246 | ]); 247 | }); 248 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@changesets/cli': 12 | specifier: ^2.29.7 13 | version: 2.29.7(@types/node@24.3.1) 14 | dts-buddy: 15 | specifier: ^0.6.2 16 | version: 0.6.2(typescript@5.9.2) 17 | typescript: 18 | specifier: ^5.9.2 19 | version: 5.9.2 20 | vitest: 21 | specifier: ^3.2.4 22 | version: 3.2.4(@types/node@24.3.1) 23 | 24 | packages: 25 | 26 | '@babel/runtime@7.28.4': 27 | resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} 28 | engines: {node: '>=6.9.0'} 29 | 30 | '@changesets/apply-release-plan@7.0.13': 31 | resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} 32 | 33 | '@changesets/assemble-release-plan@6.0.9': 34 | resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} 35 | 36 | '@changesets/changelog-git@0.2.1': 37 | resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} 38 | 39 | '@changesets/cli@2.29.7': 40 | resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} 41 | hasBin: true 42 | 43 | '@changesets/config@3.1.1': 44 | resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} 45 | 46 | '@changesets/errors@0.2.0': 47 | resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 48 | 49 | '@changesets/get-dependents-graph@2.1.3': 50 | resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} 51 | 52 | '@changesets/get-release-plan@4.0.13': 53 | resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} 54 | 55 | '@changesets/get-version-range-type@0.4.0': 56 | resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 57 | 58 | '@changesets/git@3.0.4': 59 | resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} 60 | 61 | '@changesets/logger@0.1.1': 62 | resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} 63 | 64 | '@changesets/parse@0.4.1': 65 | resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} 66 | 67 | '@changesets/pre@2.0.2': 68 | resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} 69 | 70 | '@changesets/read@0.6.5': 71 | resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} 72 | 73 | '@changesets/should-skip-package@0.1.2': 74 | resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} 75 | 76 | '@changesets/types@4.1.0': 77 | resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 78 | 79 | '@changesets/types@6.1.0': 80 | resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} 81 | 82 | '@changesets/write@0.4.0': 83 | resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} 84 | 85 | '@esbuild/aix-ppc64@0.25.9': 86 | resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} 87 | engines: {node: '>=18'} 88 | cpu: [ppc64] 89 | os: [aix] 90 | 91 | '@esbuild/android-arm64@0.25.9': 92 | resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} 93 | engines: {node: '>=18'} 94 | cpu: [arm64] 95 | os: [android] 96 | 97 | '@esbuild/android-arm@0.25.9': 98 | resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} 99 | engines: {node: '>=18'} 100 | cpu: [arm] 101 | os: [android] 102 | 103 | '@esbuild/android-x64@0.25.9': 104 | resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} 105 | engines: {node: '>=18'} 106 | cpu: [x64] 107 | os: [android] 108 | 109 | '@esbuild/darwin-arm64@0.25.9': 110 | resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} 111 | engines: {node: '>=18'} 112 | cpu: [arm64] 113 | os: [darwin] 114 | 115 | '@esbuild/darwin-x64@0.25.9': 116 | resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} 117 | engines: {node: '>=18'} 118 | cpu: [x64] 119 | os: [darwin] 120 | 121 | '@esbuild/freebsd-arm64@0.25.9': 122 | resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} 123 | engines: {node: '>=18'} 124 | cpu: [arm64] 125 | os: [freebsd] 126 | 127 | '@esbuild/freebsd-x64@0.25.9': 128 | resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} 129 | engines: {node: '>=18'} 130 | cpu: [x64] 131 | os: [freebsd] 132 | 133 | '@esbuild/linux-arm64@0.25.9': 134 | resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} 135 | engines: {node: '>=18'} 136 | cpu: [arm64] 137 | os: [linux] 138 | 139 | '@esbuild/linux-arm@0.25.9': 140 | resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} 141 | engines: {node: '>=18'} 142 | cpu: [arm] 143 | os: [linux] 144 | 145 | '@esbuild/linux-ia32@0.25.9': 146 | resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} 147 | engines: {node: '>=18'} 148 | cpu: [ia32] 149 | os: [linux] 150 | 151 | '@esbuild/linux-loong64@0.25.9': 152 | resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} 153 | engines: {node: '>=18'} 154 | cpu: [loong64] 155 | os: [linux] 156 | 157 | '@esbuild/linux-mips64el@0.25.9': 158 | resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} 159 | engines: {node: '>=18'} 160 | cpu: [mips64el] 161 | os: [linux] 162 | 163 | '@esbuild/linux-ppc64@0.25.9': 164 | resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} 165 | engines: {node: '>=18'} 166 | cpu: [ppc64] 167 | os: [linux] 168 | 169 | '@esbuild/linux-riscv64@0.25.9': 170 | resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} 171 | engines: {node: '>=18'} 172 | cpu: [riscv64] 173 | os: [linux] 174 | 175 | '@esbuild/linux-s390x@0.25.9': 176 | resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} 177 | engines: {node: '>=18'} 178 | cpu: [s390x] 179 | os: [linux] 180 | 181 | '@esbuild/linux-x64@0.25.9': 182 | resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} 183 | engines: {node: '>=18'} 184 | cpu: [x64] 185 | os: [linux] 186 | 187 | '@esbuild/netbsd-arm64@0.25.9': 188 | resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} 189 | engines: {node: '>=18'} 190 | cpu: [arm64] 191 | os: [netbsd] 192 | 193 | '@esbuild/netbsd-x64@0.25.9': 194 | resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} 195 | engines: {node: '>=18'} 196 | cpu: [x64] 197 | os: [netbsd] 198 | 199 | '@esbuild/openbsd-arm64@0.25.9': 200 | resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} 201 | engines: {node: '>=18'} 202 | cpu: [arm64] 203 | os: [openbsd] 204 | 205 | '@esbuild/openbsd-x64@0.25.9': 206 | resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} 207 | engines: {node: '>=18'} 208 | cpu: [x64] 209 | os: [openbsd] 210 | 211 | '@esbuild/openharmony-arm64@0.25.9': 212 | resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} 213 | engines: {node: '>=18'} 214 | cpu: [arm64] 215 | os: [openharmony] 216 | 217 | '@esbuild/sunos-x64@0.25.9': 218 | resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} 219 | engines: {node: '>=18'} 220 | cpu: [x64] 221 | os: [sunos] 222 | 223 | '@esbuild/win32-arm64@0.25.9': 224 | resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} 225 | engines: {node: '>=18'} 226 | cpu: [arm64] 227 | os: [win32] 228 | 229 | '@esbuild/win32-ia32@0.25.9': 230 | resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} 231 | engines: {node: '>=18'} 232 | cpu: [ia32] 233 | os: [win32] 234 | 235 | '@esbuild/win32-x64@0.25.9': 236 | resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} 237 | engines: {node: '>=18'} 238 | cpu: [x64] 239 | os: [win32] 240 | 241 | '@inquirer/external-editor@1.0.1': 242 | resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} 243 | engines: {node: '>=18'} 244 | peerDependencies: 245 | '@types/node': '>=18' 246 | peerDependenciesMeta: 247 | '@types/node': 248 | optional: true 249 | 250 | '@jridgewell/gen-mapping@0.3.13': 251 | resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 252 | 253 | '@jridgewell/resolve-uri@3.1.2': 254 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 255 | engines: {node: '>=6.0.0'} 256 | 257 | '@jridgewell/source-map@0.3.11': 258 | resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} 259 | 260 | '@jridgewell/sourcemap-codec@1.5.5': 261 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 262 | 263 | '@jridgewell/trace-mapping@0.3.30': 264 | resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} 265 | 266 | '@manypkg/find-root@1.1.0': 267 | resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 268 | 269 | '@manypkg/get-packages@1.1.3': 270 | resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 271 | 272 | '@nodelib/fs.scandir@2.1.5': 273 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 274 | engines: {node: '>= 8'} 275 | 276 | '@nodelib/fs.stat@2.0.5': 277 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 278 | engines: {node: '>= 8'} 279 | 280 | '@nodelib/fs.walk@1.2.8': 281 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 282 | engines: {node: '>= 8'} 283 | 284 | '@rollup/rollup-android-arm-eabi@4.50.1': 285 | resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} 286 | cpu: [arm] 287 | os: [android] 288 | 289 | '@rollup/rollup-android-arm64@4.50.1': 290 | resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} 291 | cpu: [arm64] 292 | os: [android] 293 | 294 | '@rollup/rollup-darwin-arm64@4.50.1': 295 | resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} 296 | cpu: [arm64] 297 | os: [darwin] 298 | 299 | '@rollup/rollup-darwin-x64@4.50.1': 300 | resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} 301 | cpu: [x64] 302 | os: [darwin] 303 | 304 | '@rollup/rollup-freebsd-arm64@4.50.1': 305 | resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} 306 | cpu: [arm64] 307 | os: [freebsd] 308 | 309 | '@rollup/rollup-freebsd-x64@4.50.1': 310 | resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} 311 | cpu: [x64] 312 | os: [freebsd] 313 | 314 | '@rollup/rollup-linux-arm-gnueabihf@4.50.1': 315 | resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} 316 | cpu: [arm] 317 | os: [linux] 318 | 319 | '@rollup/rollup-linux-arm-musleabihf@4.50.1': 320 | resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} 321 | cpu: [arm] 322 | os: [linux] 323 | 324 | '@rollup/rollup-linux-arm64-gnu@4.50.1': 325 | resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} 326 | cpu: [arm64] 327 | os: [linux] 328 | 329 | '@rollup/rollup-linux-arm64-musl@4.50.1': 330 | resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} 331 | cpu: [arm64] 332 | os: [linux] 333 | 334 | '@rollup/rollup-linux-loongarch64-gnu@4.50.1': 335 | resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} 336 | cpu: [loong64] 337 | os: [linux] 338 | 339 | '@rollup/rollup-linux-ppc64-gnu@4.50.1': 340 | resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} 341 | cpu: [ppc64] 342 | os: [linux] 343 | 344 | '@rollup/rollup-linux-riscv64-gnu@4.50.1': 345 | resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} 346 | cpu: [riscv64] 347 | os: [linux] 348 | 349 | '@rollup/rollup-linux-riscv64-musl@4.50.1': 350 | resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} 351 | cpu: [riscv64] 352 | os: [linux] 353 | 354 | '@rollup/rollup-linux-s390x-gnu@4.50.1': 355 | resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} 356 | cpu: [s390x] 357 | os: [linux] 358 | 359 | '@rollup/rollup-linux-x64-gnu@4.50.1': 360 | resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} 361 | cpu: [x64] 362 | os: [linux] 363 | 364 | '@rollup/rollup-linux-x64-musl@4.50.1': 365 | resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} 366 | cpu: [x64] 367 | os: [linux] 368 | 369 | '@rollup/rollup-openharmony-arm64@4.50.1': 370 | resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} 371 | cpu: [arm64] 372 | os: [openharmony] 373 | 374 | '@rollup/rollup-win32-arm64-msvc@4.50.1': 375 | resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} 376 | cpu: [arm64] 377 | os: [win32] 378 | 379 | '@rollup/rollup-win32-ia32-msvc@4.50.1': 380 | resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} 381 | cpu: [ia32] 382 | os: [win32] 383 | 384 | '@rollup/rollup-win32-x64-msvc@4.50.1': 385 | resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} 386 | cpu: [x64] 387 | os: [win32] 388 | 389 | '@types/chai@5.2.2': 390 | resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 391 | 392 | '@types/deep-eql@4.0.2': 393 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 394 | 395 | '@types/estree@1.0.8': 396 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 397 | 398 | '@types/node@12.20.55': 399 | resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 400 | 401 | '@types/node@24.3.1': 402 | resolution: {integrity: sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==} 403 | 404 | '@vitest/expect@3.2.4': 405 | resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} 406 | 407 | '@vitest/mocker@3.2.4': 408 | resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} 409 | peerDependencies: 410 | msw: ^2.4.9 411 | vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 412 | peerDependenciesMeta: 413 | msw: 414 | optional: true 415 | vite: 416 | optional: true 417 | 418 | '@vitest/pretty-format@3.2.4': 419 | resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} 420 | 421 | '@vitest/runner@3.2.4': 422 | resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} 423 | 424 | '@vitest/snapshot@3.2.4': 425 | resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} 426 | 427 | '@vitest/spy@3.2.4': 428 | resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} 429 | 430 | '@vitest/utils@3.2.4': 431 | resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} 432 | 433 | ansi-colors@4.1.3: 434 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 435 | engines: {node: '>=6'} 436 | 437 | ansi-regex@5.0.1: 438 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 439 | engines: {node: '>=8'} 440 | 441 | argparse@1.0.10: 442 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 443 | 444 | array-union@2.1.0: 445 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 446 | engines: {node: '>=8'} 447 | 448 | assertion-error@2.0.1: 449 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 450 | engines: {node: '>=12'} 451 | 452 | better-path-resolve@1.0.0: 453 | resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 454 | engines: {node: '>=4'} 455 | 456 | braces@3.0.3: 457 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 458 | engines: {node: '>=8'} 459 | 460 | cac@6.7.14: 461 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 462 | engines: {node: '>=8'} 463 | 464 | chai@5.3.3: 465 | resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} 466 | engines: {node: '>=18'} 467 | 468 | chardet@2.1.0: 469 | resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} 470 | 471 | check-error@2.1.1: 472 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 473 | engines: {node: '>= 16'} 474 | 475 | ci-info@3.9.0: 476 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 477 | engines: {node: '>=8'} 478 | 479 | cross-spawn@7.0.6: 480 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 481 | engines: {node: '>= 8'} 482 | 483 | debug@4.4.1: 484 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 485 | engines: {node: '>=6.0'} 486 | peerDependencies: 487 | supports-color: '*' 488 | peerDependenciesMeta: 489 | supports-color: 490 | optional: true 491 | 492 | deep-eql@5.0.2: 493 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 494 | engines: {node: '>=6'} 495 | 496 | detect-indent@6.1.0: 497 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 498 | engines: {node: '>=8'} 499 | 500 | dir-glob@3.0.1: 501 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 502 | engines: {node: '>=8'} 503 | 504 | dts-buddy@0.6.2: 505 | resolution: {integrity: sha512-KUmYrRKpVpjmnqM/JY93p1PWezMXodKCiMd5CFvfLtRCRc5i2GZiojrkVQXO2Dd8HeaU1C3sgTKDWxCEK5cyXA==} 506 | hasBin: true 507 | peerDependencies: 508 | typescript: '>=5.0.4 <5.9' 509 | 510 | enquirer@2.4.1: 511 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 512 | engines: {node: '>=8.6'} 513 | 514 | es-module-lexer@1.7.0: 515 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 516 | 517 | esbuild@0.25.9: 518 | resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} 519 | engines: {node: '>=18'} 520 | hasBin: true 521 | 522 | esprima@4.0.1: 523 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 524 | engines: {node: '>=4'} 525 | hasBin: true 526 | 527 | estree-walker@3.0.3: 528 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 529 | 530 | expect-type@1.2.2: 531 | resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 532 | engines: {node: '>=12.0.0'} 533 | 534 | extendable-error@0.1.7: 535 | resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 536 | 537 | fast-glob@3.3.3: 538 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 539 | engines: {node: '>=8.6.0'} 540 | 541 | fastq@1.19.1: 542 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 543 | 544 | fdir@6.5.0: 545 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 546 | engines: {node: '>=12.0.0'} 547 | peerDependencies: 548 | picomatch: ^3 || ^4 549 | peerDependenciesMeta: 550 | picomatch: 551 | optional: true 552 | 553 | fill-range@7.1.1: 554 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 555 | engines: {node: '>=8'} 556 | 557 | find-up@4.1.0: 558 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 559 | engines: {node: '>=8'} 560 | 561 | fs-extra@7.0.1: 562 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 563 | engines: {node: '>=6 <7 || >=8'} 564 | 565 | fs-extra@8.1.0: 566 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 567 | engines: {node: '>=6 <7 || >=8'} 568 | 569 | fsevents@2.3.3: 570 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 571 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 572 | os: [darwin] 573 | 574 | glob-parent@5.1.2: 575 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 576 | engines: {node: '>= 6'} 577 | 578 | globby@11.1.0: 579 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 580 | engines: {node: '>=10'} 581 | 582 | graceful-fs@4.2.11: 583 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 584 | 585 | human-id@4.1.1: 586 | resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} 587 | hasBin: true 588 | 589 | iconv-lite@0.6.3: 590 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 591 | engines: {node: '>=0.10.0'} 592 | 593 | ignore@5.3.2: 594 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 595 | engines: {node: '>= 4'} 596 | 597 | is-extglob@2.1.1: 598 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 599 | engines: {node: '>=0.10.0'} 600 | 601 | is-glob@4.0.3: 602 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 603 | engines: {node: '>=0.10.0'} 604 | 605 | is-number@7.0.0: 606 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 607 | engines: {node: '>=0.12.0'} 608 | 609 | is-subdir@1.2.0: 610 | resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 611 | engines: {node: '>=4'} 612 | 613 | is-windows@1.0.2: 614 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 615 | engines: {node: '>=0.10.0'} 616 | 617 | isexe@2.0.0: 618 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 619 | 620 | js-tokens@9.0.1: 621 | resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 622 | 623 | js-yaml@3.14.1: 624 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 625 | hasBin: true 626 | 627 | jsonfile@4.0.0: 628 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 629 | 630 | kleur@4.1.5: 631 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 632 | engines: {node: '>=6'} 633 | 634 | locate-character@3.0.0: 635 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 636 | 637 | locate-path@5.0.0: 638 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 639 | engines: {node: '>=8'} 640 | 641 | lodash.startcase@4.4.0: 642 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 643 | 644 | loupe@3.2.1: 645 | resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} 646 | 647 | magic-string@0.30.19: 648 | resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} 649 | 650 | merge2@1.4.1: 651 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 652 | engines: {node: '>= 8'} 653 | 654 | micromatch@4.0.8: 655 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 656 | engines: {node: '>=8.6'} 657 | 658 | mri@1.2.0: 659 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 660 | engines: {node: '>=4'} 661 | 662 | ms@2.1.3: 663 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 664 | 665 | nanoid@3.3.11: 666 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 667 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 668 | hasBin: true 669 | 670 | outdent@0.5.0: 671 | resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 672 | 673 | p-filter@2.1.0: 674 | resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 675 | engines: {node: '>=8'} 676 | 677 | p-limit@2.3.0: 678 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 679 | engines: {node: '>=6'} 680 | 681 | p-locate@4.1.0: 682 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 683 | engines: {node: '>=8'} 684 | 685 | p-map@2.1.0: 686 | resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 687 | engines: {node: '>=6'} 688 | 689 | p-try@2.2.0: 690 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 691 | engines: {node: '>=6'} 692 | 693 | package-manager-detector@0.2.11: 694 | resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} 695 | 696 | path-exists@4.0.0: 697 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 698 | engines: {node: '>=8'} 699 | 700 | path-key@3.1.1: 701 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 702 | engines: {node: '>=8'} 703 | 704 | path-type@4.0.0: 705 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 706 | engines: {node: '>=8'} 707 | 708 | pathe@2.0.3: 709 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 710 | 711 | pathval@2.0.1: 712 | resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} 713 | engines: {node: '>= 14.16'} 714 | 715 | picocolors@1.1.1: 716 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 717 | 718 | picomatch@2.3.1: 719 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 720 | engines: {node: '>=8.6'} 721 | 722 | picomatch@4.0.3: 723 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 724 | engines: {node: '>=12'} 725 | 726 | pify@4.0.1: 727 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 728 | engines: {node: '>=6'} 729 | 730 | postcss@8.5.6: 731 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 732 | engines: {node: ^10 || ^12 || >=14} 733 | 734 | prettier@2.8.8: 735 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 736 | engines: {node: '>=10.13.0'} 737 | hasBin: true 738 | 739 | quansync@0.2.11: 740 | resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} 741 | 742 | queue-microtask@1.2.3: 743 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 744 | 745 | read-yaml-file@1.1.0: 746 | resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 747 | engines: {node: '>=6'} 748 | 749 | resolve-from@5.0.0: 750 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 751 | engines: {node: '>=8'} 752 | 753 | reusify@1.1.0: 754 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 755 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 756 | 757 | rollup@4.50.1: 758 | resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} 759 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 760 | hasBin: true 761 | 762 | run-parallel@1.2.0: 763 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 764 | 765 | sade@1.8.1: 766 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 767 | engines: {node: '>=6'} 768 | 769 | safer-buffer@2.1.2: 770 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 771 | 772 | semver@7.7.2: 773 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 774 | engines: {node: '>=10'} 775 | hasBin: true 776 | 777 | shebang-command@2.0.0: 778 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 779 | engines: {node: '>=8'} 780 | 781 | shebang-regex@3.0.0: 782 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 783 | engines: {node: '>=8'} 784 | 785 | siginfo@2.0.0: 786 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 787 | 788 | signal-exit@4.1.0: 789 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 790 | engines: {node: '>=14'} 791 | 792 | slash@3.0.0: 793 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 794 | engines: {node: '>=8'} 795 | 796 | source-map-js@1.2.1: 797 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 798 | engines: {node: '>=0.10.0'} 799 | 800 | spawndamnit@3.0.1: 801 | resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} 802 | 803 | sprintf-js@1.0.3: 804 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 805 | 806 | stackback@0.0.2: 807 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 808 | 809 | std-env@3.9.0: 810 | resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 811 | 812 | strip-ansi@6.0.1: 813 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 814 | engines: {node: '>=8'} 815 | 816 | strip-bom@3.0.0: 817 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 818 | engines: {node: '>=4'} 819 | 820 | strip-literal@3.0.0: 821 | resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 822 | 823 | term-size@2.2.1: 824 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 825 | engines: {node: '>=8'} 826 | 827 | tinybench@2.9.0: 828 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 829 | 830 | tinyexec@0.3.2: 831 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 832 | 833 | tinyglobby@0.2.15: 834 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 835 | engines: {node: '>=12.0.0'} 836 | 837 | tinypool@1.1.1: 838 | resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} 839 | engines: {node: ^18.0.0 || >=20.0.0} 840 | 841 | tinyrainbow@2.0.0: 842 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 843 | engines: {node: '>=14.0.0'} 844 | 845 | tinyspy@4.0.3: 846 | resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} 847 | engines: {node: '>=14.0.0'} 848 | 849 | to-regex-range@5.0.1: 850 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 851 | engines: {node: '>=8.0'} 852 | 853 | ts-api-utils@1.4.3: 854 | resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} 855 | engines: {node: '>=16'} 856 | peerDependencies: 857 | typescript: '>=4.2.0' 858 | 859 | typescript@5.9.2: 860 | resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 861 | engines: {node: '>=14.17'} 862 | hasBin: true 863 | 864 | undici-types@7.10.0: 865 | resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} 866 | 867 | universalify@0.1.2: 868 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 869 | engines: {node: '>= 4.0.0'} 870 | 871 | vite-node@3.2.4: 872 | resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} 873 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 874 | hasBin: true 875 | 876 | vite@7.1.5: 877 | resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} 878 | engines: {node: ^20.19.0 || >=22.12.0} 879 | hasBin: true 880 | peerDependencies: 881 | '@types/node': ^20.19.0 || >=22.12.0 882 | jiti: '>=1.21.0' 883 | less: ^4.0.0 884 | lightningcss: ^1.21.0 885 | sass: ^1.70.0 886 | sass-embedded: ^1.70.0 887 | stylus: '>=0.54.8' 888 | sugarss: ^5.0.0 889 | terser: ^5.16.0 890 | tsx: ^4.8.1 891 | yaml: ^2.4.2 892 | peerDependenciesMeta: 893 | '@types/node': 894 | optional: true 895 | jiti: 896 | optional: true 897 | less: 898 | optional: true 899 | lightningcss: 900 | optional: true 901 | sass: 902 | optional: true 903 | sass-embedded: 904 | optional: true 905 | stylus: 906 | optional: true 907 | sugarss: 908 | optional: true 909 | terser: 910 | optional: true 911 | tsx: 912 | optional: true 913 | yaml: 914 | optional: true 915 | 916 | vitest@3.2.4: 917 | resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} 918 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 919 | hasBin: true 920 | peerDependencies: 921 | '@edge-runtime/vm': '*' 922 | '@types/debug': ^4.1.12 923 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 924 | '@vitest/browser': 3.2.4 925 | '@vitest/ui': 3.2.4 926 | happy-dom: '*' 927 | jsdom: '*' 928 | peerDependenciesMeta: 929 | '@edge-runtime/vm': 930 | optional: true 931 | '@types/debug': 932 | optional: true 933 | '@types/node': 934 | optional: true 935 | '@vitest/browser': 936 | optional: true 937 | '@vitest/ui': 938 | optional: true 939 | happy-dom: 940 | optional: true 941 | jsdom: 942 | optional: true 943 | 944 | which@2.0.2: 945 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 946 | engines: {node: '>= 8'} 947 | hasBin: true 948 | 949 | why-is-node-running@2.3.0: 950 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 951 | engines: {node: '>=8'} 952 | hasBin: true 953 | 954 | snapshots: 955 | 956 | '@babel/runtime@7.28.4': {} 957 | 958 | '@changesets/apply-release-plan@7.0.13': 959 | dependencies: 960 | '@changesets/config': 3.1.1 961 | '@changesets/get-version-range-type': 0.4.0 962 | '@changesets/git': 3.0.4 963 | '@changesets/should-skip-package': 0.1.2 964 | '@changesets/types': 6.1.0 965 | '@manypkg/get-packages': 1.1.3 966 | detect-indent: 6.1.0 967 | fs-extra: 7.0.1 968 | lodash.startcase: 4.4.0 969 | outdent: 0.5.0 970 | prettier: 2.8.8 971 | resolve-from: 5.0.0 972 | semver: 7.7.2 973 | 974 | '@changesets/assemble-release-plan@6.0.9': 975 | dependencies: 976 | '@changesets/errors': 0.2.0 977 | '@changesets/get-dependents-graph': 2.1.3 978 | '@changesets/should-skip-package': 0.1.2 979 | '@changesets/types': 6.1.0 980 | '@manypkg/get-packages': 1.1.3 981 | semver: 7.7.2 982 | 983 | '@changesets/changelog-git@0.2.1': 984 | dependencies: 985 | '@changesets/types': 6.1.0 986 | 987 | '@changesets/cli@2.29.7(@types/node@24.3.1)': 988 | dependencies: 989 | '@changesets/apply-release-plan': 7.0.13 990 | '@changesets/assemble-release-plan': 6.0.9 991 | '@changesets/changelog-git': 0.2.1 992 | '@changesets/config': 3.1.1 993 | '@changesets/errors': 0.2.0 994 | '@changesets/get-dependents-graph': 2.1.3 995 | '@changesets/get-release-plan': 4.0.13 996 | '@changesets/git': 3.0.4 997 | '@changesets/logger': 0.1.1 998 | '@changesets/pre': 2.0.2 999 | '@changesets/read': 0.6.5 1000 | '@changesets/should-skip-package': 0.1.2 1001 | '@changesets/types': 6.1.0 1002 | '@changesets/write': 0.4.0 1003 | '@inquirer/external-editor': 1.0.1(@types/node@24.3.1) 1004 | '@manypkg/get-packages': 1.1.3 1005 | ansi-colors: 4.1.3 1006 | ci-info: 3.9.0 1007 | enquirer: 2.4.1 1008 | fs-extra: 7.0.1 1009 | mri: 1.2.0 1010 | p-limit: 2.3.0 1011 | package-manager-detector: 0.2.11 1012 | picocolors: 1.1.1 1013 | resolve-from: 5.0.0 1014 | semver: 7.7.2 1015 | spawndamnit: 3.0.1 1016 | term-size: 2.2.1 1017 | transitivePeerDependencies: 1018 | - '@types/node' 1019 | 1020 | '@changesets/config@3.1.1': 1021 | dependencies: 1022 | '@changesets/errors': 0.2.0 1023 | '@changesets/get-dependents-graph': 2.1.3 1024 | '@changesets/logger': 0.1.1 1025 | '@changesets/types': 6.1.0 1026 | '@manypkg/get-packages': 1.1.3 1027 | fs-extra: 7.0.1 1028 | micromatch: 4.0.8 1029 | 1030 | '@changesets/errors@0.2.0': 1031 | dependencies: 1032 | extendable-error: 0.1.7 1033 | 1034 | '@changesets/get-dependents-graph@2.1.3': 1035 | dependencies: 1036 | '@changesets/types': 6.1.0 1037 | '@manypkg/get-packages': 1.1.3 1038 | picocolors: 1.1.1 1039 | semver: 7.7.2 1040 | 1041 | '@changesets/get-release-plan@4.0.13': 1042 | dependencies: 1043 | '@changesets/assemble-release-plan': 6.0.9 1044 | '@changesets/config': 3.1.1 1045 | '@changesets/pre': 2.0.2 1046 | '@changesets/read': 0.6.5 1047 | '@changesets/types': 6.1.0 1048 | '@manypkg/get-packages': 1.1.3 1049 | 1050 | '@changesets/get-version-range-type@0.4.0': {} 1051 | 1052 | '@changesets/git@3.0.4': 1053 | dependencies: 1054 | '@changesets/errors': 0.2.0 1055 | '@manypkg/get-packages': 1.1.3 1056 | is-subdir: 1.2.0 1057 | micromatch: 4.0.8 1058 | spawndamnit: 3.0.1 1059 | 1060 | '@changesets/logger@0.1.1': 1061 | dependencies: 1062 | picocolors: 1.1.1 1063 | 1064 | '@changesets/parse@0.4.1': 1065 | dependencies: 1066 | '@changesets/types': 6.1.0 1067 | js-yaml: 3.14.1 1068 | 1069 | '@changesets/pre@2.0.2': 1070 | dependencies: 1071 | '@changesets/errors': 0.2.0 1072 | '@changesets/types': 6.1.0 1073 | '@manypkg/get-packages': 1.1.3 1074 | fs-extra: 7.0.1 1075 | 1076 | '@changesets/read@0.6.5': 1077 | dependencies: 1078 | '@changesets/git': 3.0.4 1079 | '@changesets/logger': 0.1.1 1080 | '@changesets/parse': 0.4.1 1081 | '@changesets/types': 6.1.0 1082 | fs-extra: 7.0.1 1083 | p-filter: 2.1.0 1084 | picocolors: 1.1.1 1085 | 1086 | '@changesets/should-skip-package@0.1.2': 1087 | dependencies: 1088 | '@changesets/types': 6.1.0 1089 | '@manypkg/get-packages': 1.1.3 1090 | 1091 | '@changesets/types@4.1.0': {} 1092 | 1093 | '@changesets/types@6.1.0': {} 1094 | 1095 | '@changesets/write@0.4.0': 1096 | dependencies: 1097 | '@changesets/types': 6.1.0 1098 | fs-extra: 7.0.1 1099 | human-id: 4.1.1 1100 | prettier: 2.8.8 1101 | 1102 | '@esbuild/aix-ppc64@0.25.9': 1103 | optional: true 1104 | 1105 | '@esbuild/android-arm64@0.25.9': 1106 | optional: true 1107 | 1108 | '@esbuild/android-arm@0.25.9': 1109 | optional: true 1110 | 1111 | '@esbuild/android-x64@0.25.9': 1112 | optional: true 1113 | 1114 | '@esbuild/darwin-arm64@0.25.9': 1115 | optional: true 1116 | 1117 | '@esbuild/darwin-x64@0.25.9': 1118 | optional: true 1119 | 1120 | '@esbuild/freebsd-arm64@0.25.9': 1121 | optional: true 1122 | 1123 | '@esbuild/freebsd-x64@0.25.9': 1124 | optional: true 1125 | 1126 | '@esbuild/linux-arm64@0.25.9': 1127 | optional: true 1128 | 1129 | '@esbuild/linux-arm@0.25.9': 1130 | optional: true 1131 | 1132 | '@esbuild/linux-ia32@0.25.9': 1133 | optional: true 1134 | 1135 | '@esbuild/linux-loong64@0.25.9': 1136 | optional: true 1137 | 1138 | '@esbuild/linux-mips64el@0.25.9': 1139 | optional: true 1140 | 1141 | '@esbuild/linux-ppc64@0.25.9': 1142 | optional: true 1143 | 1144 | '@esbuild/linux-riscv64@0.25.9': 1145 | optional: true 1146 | 1147 | '@esbuild/linux-s390x@0.25.9': 1148 | optional: true 1149 | 1150 | '@esbuild/linux-x64@0.25.9': 1151 | optional: true 1152 | 1153 | '@esbuild/netbsd-arm64@0.25.9': 1154 | optional: true 1155 | 1156 | '@esbuild/netbsd-x64@0.25.9': 1157 | optional: true 1158 | 1159 | '@esbuild/openbsd-arm64@0.25.9': 1160 | optional: true 1161 | 1162 | '@esbuild/openbsd-x64@0.25.9': 1163 | optional: true 1164 | 1165 | '@esbuild/openharmony-arm64@0.25.9': 1166 | optional: true 1167 | 1168 | '@esbuild/sunos-x64@0.25.9': 1169 | optional: true 1170 | 1171 | '@esbuild/win32-arm64@0.25.9': 1172 | optional: true 1173 | 1174 | '@esbuild/win32-ia32@0.25.9': 1175 | optional: true 1176 | 1177 | '@esbuild/win32-x64@0.25.9': 1178 | optional: true 1179 | 1180 | '@inquirer/external-editor@1.0.1(@types/node@24.3.1)': 1181 | dependencies: 1182 | chardet: 2.1.0 1183 | iconv-lite: 0.6.3 1184 | optionalDependencies: 1185 | '@types/node': 24.3.1 1186 | 1187 | '@jridgewell/gen-mapping@0.3.13': 1188 | dependencies: 1189 | '@jridgewell/sourcemap-codec': 1.5.5 1190 | '@jridgewell/trace-mapping': 0.3.30 1191 | 1192 | '@jridgewell/resolve-uri@3.1.2': {} 1193 | 1194 | '@jridgewell/source-map@0.3.11': 1195 | dependencies: 1196 | '@jridgewell/gen-mapping': 0.3.13 1197 | '@jridgewell/trace-mapping': 0.3.30 1198 | 1199 | '@jridgewell/sourcemap-codec@1.5.5': {} 1200 | 1201 | '@jridgewell/trace-mapping@0.3.30': 1202 | dependencies: 1203 | '@jridgewell/resolve-uri': 3.1.2 1204 | '@jridgewell/sourcemap-codec': 1.5.5 1205 | 1206 | '@manypkg/find-root@1.1.0': 1207 | dependencies: 1208 | '@babel/runtime': 7.28.4 1209 | '@types/node': 12.20.55 1210 | find-up: 4.1.0 1211 | fs-extra: 8.1.0 1212 | 1213 | '@manypkg/get-packages@1.1.3': 1214 | dependencies: 1215 | '@babel/runtime': 7.28.4 1216 | '@changesets/types': 4.1.0 1217 | '@manypkg/find-root': 1.1.0 1218 | fs-extra: 8.1.0 1219 | globby: 11.1.0 1220 | read-yaml-file: 1.1.0 1221 | 1222 | '@nodelib/fs.scandir@2.1.5': 1223 | dependencies: 1224 | '@nodelib/fs.stat': 2.0.5 1225 | run-parallel: 1.2.0 1226 | 1227 | '@nodelib/fs.stat@2.0.5': {} 1228 | 1229 | '@nodelib/fs.walk@1.2.8': 1230 | dependencies: 1231 | '@nodelib/fs.scandir': 2.1.5 1232 | fastq: 1.19.1 1233 | 1234 | '@rollup/rollup-android-arm-eabi@4.50.1': 1235 | optional: true 1236 | 1237 | '@rollup/rollup-android-arm64@4.50.1': 1238 | optional: true 1239 | 1240 | '@rollup/rollup-darwin-arm64@4.50.1': 1241 | optional: true 1242 | 1243 | '@rollup/rollup-darwin-x64@4.50.1': 1244 | optional: true 1245 | 1246 | '@rollup/rollup-freebsd-arm64@4.50.1': 1247 | optional: true 1248 | 1249 | '@rollup/rollup-freebsd-x64@4.50.1': 1250 | optional: true 1251 | 1252 | '@rollup/rollup-linux-arm-gnueabihf@4.50.1': 1253 | optional: true 1254 | 1255 | '@rollup/rollup-linux-arm-musleabihf@4.50.1': 1256 | optional: true 1257 | 1258 | '@rollup/rollup-linux-arm64-gnu@4.50.1': 1259 | optional: true 1260 | 1261 | '@rollup/rollup-linux-arm64-musl@4.50.1': 1262 | optional: true 1263 | 1264 | '@rollup/rollup-linux-loongarch64-gnu@4.50.1': 1265 | optional: true 1266 | 1267 | '@rollup/rollup-linux-ppc64-gnu@4.50.1': 1268 | optional: true 1269 | 1270 | '@rollup/rollup-linux-riscv64-gnu@4.50.1': 1271 | optional: true 1272 | 1273 | '@rollup/rollup-linux-riscv64-musl@4.50.1': 1274 | optional: true 1275 | 1276 | '@rollup/rollup-linux-s390x-gnu@4.50.1': 1277 | optional: true 1278 | 1279 | '@rollup/rollup-linux-x64-gnu@4.50.1': 1280 | optional: true 1281 | 1282 | '@rollup/rollup-linux-x64-musl@4.50.1': 1283 | optional: true 1284 | 1285 | '@rollup/rollup-openharmony-arm64@4.50.1': 1286 | optional: true 1287 | 1288 | '@rollup/rollup-win32-arm64-msvc@4.50.1': 1289 | optional: true 1290 | 1291 | '@rollup/rollup-win32-ia32-msvc@4.50.1': 1292 | optional: true 1293 | 1294 | '@rollup/rollup-win32-x64-msvc@4.50.1': 1295 | optional: true 1296 | 1297 | '@types/chai@5.2.2': 1298 | dependencies: 1299 | '@types/deep-eql': 4.0.2 1300 | 1301 | '@types/deep-eql@4.0.2': {} 1302 | 1303 | '@types/estree@1.0.8': {} 1304 | 1305 | '@types/node@12.20.55': {} 1306 | 1307 | '@types/node@24.3.1': 1308 | dependencies: 1309 | undici-types: 7.10.0 1310 | optional: true 1311 | 1312 | '@vitest/expect@3.2.4': 1313 | dependencies: 1314 | '@types/chai': 5.2.2 1315 | '@vitest/spy': 3.2.4 1316 | '@vitest/utils': 3.2.4 1317 | chai: 5.3.3 1318 | tinyrainbow: 2.0.0 1319 | 1320 | '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@24.3.1))': 1321 | dependencies: 1322 | '@vitest/spy': 3.2.4 1323 | estree-walker: 3.0.3 1324 | magic-string: 0.30.19 1325 | optionalDependencies: 1326 | vite: 7.1.5(@types/node@24.3.1) 1327 | 1328 | '@vitest/pretty-format@3.2.4': 1329 | dependencies: 1330 | tinyrainbow: 2.0.0 1331 | 1332 | '@vitest/runner@3.2.4': 1333 | dependencies: 1334 | '@vitest/utils': 3.2.4 1335 | pathe: 2.0.3 1336 | strip-literal: 3.0.0 1337 | 1338 | '@vitest/snapshot@3.2.4': 1339 | dependencies: 1340 | '@vitest/pretty-format': 3.2.4 1341 | magic-string: 0.30.19 1342 | pathe: 2.0.3 1343 | 1344 | '@vitest/spy@3.2.4': 1345 | dependencies: 1346 | tinyspy: 4.0.3 1347 | 1348 | '@vitest/utils@3.2.4': 1349 | dependencies: 1350 | '@vitest/pretty-format': 3.2.4 1351 | loupe: 3.2.1 1352 | tinyrainbow: 2.0.0 1353 | 1354 | ansi-colors@4.1.3: {} 1355 | 1356 | ansi-regex@5.0.1: {} 1357 | 1358 | argparse@1.0.10: 1359 | dependencies: 1360 | sprintf-js: 1.0.3 1361 | 1362 | array-union@2.1.0: {} 1363 | 1364 | assertion-error@2.0.1: {} 1365 | 1366 | better-path-resolve@1.0.0: 1367 | dependencies: 1368 | is-windows: 1.0.2 1369 | 1370 | braces@3.0.3: 1371 | dependencies: 1372 | fill-range: 7.1.1 1373 | 1374 | cac@6.7.14: {} 1375 | 1376 | chai@5.3.3: 1377 | dependencies: 1378 | assertion-error: 2.0.1 1379 | check-error: 2.1.1 1380 | deep-eql: 5.0.2 1381 | loupe: 3.2.1 1382 | pathval: 2.0.1 1383 | 1384 | chardet@2.1.0: {} 1385 | 1386 | check-error@2.1.1: {} 1387 | 1388 | ci-info@3.9.0: {} 1389 | 1390 | cross-spawn@7.0.6: 1391 | dependencies: 1392 | path-key: 3.1.1 1393 | shebang-command: 2.0.0 1394 | which: 2.0.2 1395 | 1396 | debug@4.4.1: 1397 | dependencies: 1398 | ms: 2.1.3 1399 | 1400 | deep-eql@5.0.2: {} 1401 | 1402 | detect-indent@6.1.0: {} 1403 | 1404 | dir-glob@3.0.1: 1405 | dependencies: 1406 | path-type: 4.0.0 1407 | 1408 | dts-buddy@0.6.2(typescript@5.9.2): 1409 | dependencies: 1410 | '@jridgewell/source-map': 0.3.11 1411 | '@jridgewell/sourcemap-codec': 1.5.5 1412 | kleur: 4.1.5 1413 | locate-character: 3.0.0 1414 | magic-string: 0.30.19 1415 | sade: 1.8.1 1416 | tinyglobby: 0.2.15 1417 | ts-api-utils: 1.4.3(typescript@5.9.2) 1418 | typescript: 5.9.2 1419 | 1420 | enquirer@2.4.1: 1421 | dependencies: 1422 | ansi-colors: 4.1.3 1423 | strip-ansi: 6.0.1 1424 | 1425 | es-module-lexer@1.7.0: {} 1426 | 1427 | esbuild@0.25.9: 1428 | optionalDependencies: 1429 | '@esbuild/aix-ppc64': 0.25.9 1430 | '@esbuild/android-arm': 0.25.9 1431 | '@esbuild/android-arm64': 0.25.9 1432 | '@esbuild/android-x64': 0.25.9 1433 | '@esbuild/darwin-arm64': 0.25.9 1434 | '@esbuild/darwin-x64': 0.25.9 1435 | '@esbuild/freebsd-arm64': 0.25.9 1436 | '@esbuild/freebsd-x64': 0.25.9 1437 | '@esbuild/linux-arm': 0.25.9 1438 | '@esbuild/linux-arm64': 0.25.9 1439 | '@esbuild/linux-ia32': 0.25.9 1440 | '@esbuild/linux-loong64': 0.25.9 1441 | '@esbuild/linux-mips64el': 0.25.9 1442 | '@esbuild/linux-ppc64': 0.25.9 1443 | '@esbuild/linux-riscv64': 0.25.9 1444 | '@esbuild/linux-s390x': 0.25.9 1445 | '@esbuild/linux-x64': 0.25.9 1446 | '@esbuild/netbsd-arm64': 0.25.9 1447 | '@esbuild/netbsd-x64': 0.25.9 1448 | '@esbuild/openbsd-arm64': 0.25.9 1449 | '@esbuild/openbsd-x64': 0.25.9 1450 | '@esbuild/openharmony-arm64': 0.25.9 1451 | '@esbuild/sunos-x64': 0.25.9 1452 | '@esbuild/win32-arm64': 0.25.9 1453 | '@esbuild/win32-ia32': 0.25.9 1454 | '@esbuild/win32-x64': 0.25.9 1455 | 1456 | esprima@4.0.1: {} 1457 | 1458 | estree-walker@3.0.3: 1459 | dependencies: 1460 | '@types/estree': 1.0.8 1461 | 1462 | expect-type@1.2.2: {} 1463 | 1464 | extendable-error@0.1.7: {} 1465 | 1466 | fast-glob@3.3.3: 1467 | dependencies: 1468 | '@nodelib/fs.stat': 2.0.5 1469 | '@nodelib/fs.walk': 1.2.8 1470 | glob-parent: 5.1.2 1471 | merge2: 1.4.1 1472 | micromatch: 4.0.8 1473 | 1474 | fastq@1.19.1: 1475 | dependencies: 1476 | reusify: 1.1.0 1477 | 1478 | fdir@6.5.0(picomatch@4.0.3): 1479 | optionalDependencies: 1480 | picomatch: 4.0.3 1481 | 1482 | fill-range@7.1.1: 1483 | dependencies: 1484 | to-regex-range: 5.0.1 1485 | 1486 | find-up@4.1.0: 1487 | dependencies: 1488 | locate-path: 5.0.0 1489 | path-exists: 4.0.0 1490 | 1491 | fs-extra@7.0.1: 1492 | dependencies: 1493 | graceful-fs: 4.2.11 1494 | jsonfile: 4.0.0 1495 | universalify: 0.1.2 1496 | 1497 | fs-extra@8.1.0: 1498 | dependencies: 1499 | graceful-fs: 4.2.11 1500 | jsonfile: 4.0.0 1501 | universalify: 0.1.2 1502 | 1503 | fsevents@2.3.3: 1504 | optional: true 1505 | 1506 | glob-parent@5.1.2: 1507 | dependencies: 1508 | is-glob: 4.0.3 1509 | 1510 | globby@11.1.0: 1511 | dependencies: 1512 | array-union: 2.1.0 1513 | dir-glob: 3.0.1 1514 | fast-glob: 3.3.3 1515 | ignore: 5.3.2 1516 | merge2: 1.4.1 1517 | slash: 3.0.0 1518 | 1519 | graceful-fs@4.2.11: {} 1520 | 1521 | human-id@4.1.1: {} 1522 | 1523 | iconv-lite@0.6.3: 1524 | dependencies: 1525 | safer-buffer: 2.1.2 1526 | 1527 | ignore@5.3.2: {} 1528 | 1529 | is-extglob@2.1.1: {} 1530 | 1531 | is-glob@4.0.3: 1532 | dependencies: 1533 | is-extglob: 2.1.1 1534 | 1535 | is-number@7.0.0: {} 1536 | 1537 | is-subdir@1.2.0: 1538 | dependencies: 1539 | better-path-resolve: 1.0.0 1540 | 1541 | is-windows@1.0.2: {} 1542 | 1543 | isexe@2.0.0: {} 1544 | 1545 | js-tokens@9.0.1: {} 1546 | 1547 | js-yaml@3.14.1: 1548 | dependencies: 1549 | argparse: 1.0.10 1550 | esprima: 4.0.1 1551 | 1552 | jsonfile@4.0.0: 1553 | optionalDependencies: 1554 | graceful-fs: 4.2.11 1555 | 1556 | kleur@4.1.5: {} 1557 | 1558 | locate-character@3.0.0: {} 1559 | 1560 | locate-path@5.0.0: 1561 | dependencies: 1562 | p-locate: 4.1.0 1563 | 1564 | lodash.startcase@4.4.0: {} 1565 | 1566 | loupe@3.2.1: {} 1567 | 1568 | magic-string@0.30.19: 1569 | dependencies: 1570 | '@jridgewell/sourcemap-codec': 1.5.5 1571 | 1572 | merge2@1.4.1: {} 1573 | 1574 | micromatch@4.0.8: 1575 | dependencies: 1576 | braces: 3.0.3 1577 | picomatch: 2.3.1 1578 | 1579 | mri@1.2.0: {} 1580 | 1581 | ms@2.1.3: {} 1582 | 1583 | nanoid@3.3.11: {} 1584 | 1585 | outdent@0.5.0: {} 1586 | 1587 | p-filter@2.1.0: 1588 | dependencies: 1589 | p-map: 2.1.0 1590 | 1591 | p-limit@2.3.0: 1592 | dependencies: 1593 | p-try: 2.2.0 1594 | 1595 | p-locate@4.1.0: 1596 | dependencies: 1597 | p-limit: 2.3.0 1598 | 1599 | p-map@2.1.0: {} 1600 | 1601 | p-try@2.2.0: {} 1602 | 1603 | package-manager-detector@0.2.11: 1604 | dependencies: 1605 | quansync: 0.2.11 1606 | 1607 | path-exists@4.0.0: {} 1608 | 1609 | path-key@3.1.1: {} 1610 | 1611 | path-type@4.0.0: {} 1612 | 1613 | pathe@2.0.3: {} 1614 | 1615 | pathval@2.0.1: {} 1616 | 1617 | picocolors@1.1.1: {} 1618 | 1619 | picomatch@2.3.1: {} 1620 | 1621 | picomatch@4.0.3: {} 1622 | 1623 | pify@4.0.1: {} 1624 | 1625 | postcss@8.5.6: 1626 | dependencies: 1627 | nanoid: 3.3.11 1628 | picocolors: 1.1.1 1629 | source-map-js: 1.2.1 1630 | 1631 | prettier@2.8.8: {} 1632 | 1633 | quansync@0.2.11: {} 1634 | 1635 | queue-microtask@1.2.3: {} 1636 | 1637 | read-yaml-file@1.1.0: 1638 | dependencies: 1639 | graceful-fs: 4.2.11 1640 | js-yaml: 3.14.1 1641 | pify: 4.0.1 1642 | strip-bom: 3.0.0 1643 | 1644 | resolve-from@5.0.0: {} 1645 | 1646 | reusify@1.1.0: {} 1647 | 1648 | rollup@4.50.1: 1649 | dependencies: 1650 | '@types/estree': 1.0.8 1651 | optionalDependencies: 1652 | '@rollup/rollup-android-arm-eabi': 4.50.1 1653 | '@rollup/rollup-android-arm64': 4.50.1 1654 | '@rollup/rollup-darwin-arm64': 4.50.1 1655 | '@rollup/rollup-darwin-x64': 4.50.1 1656 | '@rollup/rollup-freebsd-arm64': 4.50.1 1657 | '@rollup/rollup-freebsd-x64': 4.50.1 1658 | '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 1659 | '@rollup/rollup-linux-arm-musleabihf': 4.50.1 1660 | '@rollup/rollup-linux-arm64-gnu': 4.50.1 1661 | '@rollup/rollup-linux-arm64-musl': 4.50.1 1662 | '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 1663 | '@rollup/rollup-linux-ppc64-gnu': 4.50.1 1664 | '@rollup/rollup-linux-riscv64-gnu': 4.50.1 1665 | '@rollup/rollup-linux-riscv64-musl': 4.50.1 1666 | '@rollup/rollup-linux-s390x-gnu': 4.50.1 1667 | '@rollup/rollup-linux-x64-gnu': 4.50.1 1668 | '@rollup/rollup-linux-x64-musl': 4.50.1 1669 | '@rollup/rollup-openharmony-arm64': 4.50.1 1670 | '@rollup/rollup-win32-arm64-msvc': 4.50.1 1671 | '@rollup/rollup-win32-ia32-msvc': 4.50.1 1672 | '@rollup/rollup-win32-x64-msvc': 4.50.1 1673 | fsevents: 2.3.3 1674 | 1675 | run-parallel@1.2.0: 1676 | dependencies: 1677 | queue-microtask: 1.2.3 1678 | 1679 | sade@1.8.1: 1680 | dependencies: 1681 | mri: 1.2.0 1682 | 1683 | safer-buffer@2.1.2: {} 1684 | 1685 | semver@7.7.2: {} 1686 | 1687 | shebang-command@2.0.0: 1688 | dependencies: 1689 | shebang-regex: 3.0.0 1690 | 1691 | shebang-regex@3.0.0: {} 1692 | 1693 | siginfo@2.0.0: {} 1694 | 1695 | signal-exit@4.1.0: {} 1696 | 1697 | slash@3.0.0: {} 1698 | 1699 | source-map-js@1.2.1: {} 1700 | 1701 | spawndamnit@3.0.1: 1702 | dependencies: 1703 | cross-spawn: 7.0.6 1704 | signal-exit: 4.1.0 1705 | 1706 | sprintf-js@1.0.3: {} 1707 | 1708 | stackback@0.0.2: {} 1709 | 1710 | std-env@3.9.0: {} 1711 | 1712 | strip-ansi@6.0.1: 1713 | dependencies: 1714 | ansi-regex: 5.0.1 1715 | 1716 | strip-bom@3.0.0: {} 1717 | 1718 | strip-literal@3.0.0: 1719 | dependencies: 1720 | js-tokens: 9.0.1 1721 | 1722 | term-size@2.2.1: {} 1723 | 1724 | tinybench@2.9.0: {} 1725 | 1726 | tinyexec@0.3.2: {} 1727 | 1728 | tinyglobby@0.2.15: 1729 | dependencies: 1730 | fdir: 6.5.0(picomatch@4.0.3) 1731 | picomatch: 4.0.3 1732 | 1733 | tinypool@1.1.1: {} 1734 | 1735 | tinyrainbow@2.0.0: {} 1736 | 1737 | tinyspy@4.0.3: {} 1738 | 1739 | to-regex-range@5.0.1: 1740 | dependencies: 1741 | is-number: 7.0.0 1742 | 1743 | ts-api-utils@1.4.3(typescript@5.9.2): 1744 | dependencies: 1745 | typescript: 5.9.2 1746 | 1747 | typescript@5.9.2: {} 1748 | 1749 | undici-types@7.10.0: 1750 | optional: true 1751 | 1752 | universalify@0.1.2: {} 1753 | 1754 | vite-node@3.2.4(@types/node@24.3.1): 1755 | dependencies: 1756 | cac: 6.7.14 1757 | debug: 4.4.1 1758 | es-module-lexer: 1.7.0 1759 | pathe: 2.0.3 1760 | vite: 7.1.5(@types/node@24.3.1) 1761 | transitivePeerDependencies: 1762 | - '@types/node' 1763 | - jiti 1764 | - less 1765 | - lightningcss 1766 | - sass 1767 | - sass-embedded 1768 | - stylus 1769 | - sugarss 1770 | - supports-color 1771 | - terser 1772 | - tsx 1773 | - yaml 1774 | 1775 | vite@7.1.5(@types/node@24.3.1): 1776 | dependencies: 1777 | esbuild: 0.25.9 1778 | fdir: 6.5.0(picomatch@4.0.3) 1779 | picomatch: 4.0.3 1780 | postcss: 8.5.6 1781 | rollup: 4.50.1 1782 | tinyglobby: 0.2.15 1783 | optionalDependencies: 1784 | '@types/node': 24.3.1 1785 | fsevents: 2.3.3 1786 | 1787 | vitest@3.2.4(@types/node@24.3.1): 1788 | dependencies: 1789 | '@types/chai': 5.2.2 1790 | '@vitest/expect': 3.2.4 1791 | '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@24.3.1)) 1792 | '@vitest/pretty-format': 3.2.4 1793 | '@vitest/runner': 3.2.4 1794 | '@vitest/snapshot': 3.2.4 1795 | '@vitest/spy': 3.2.4 1796 | '@vitest/utils': 3.2.4 1797 | chai: 5.3.3 1798 | debug: 4.4.1 1799 | expect-type: 1.2.2 1800 | magic-string: 0.30.19 1801 | pathe: 2.0.3 1802 | picomatch: 4.0.3 1803 | std-env: 3.9.0 1804 | tinybench: 2.9.0 1805 | tinyexec: 0.3.2 1806 | tinyglobby: 0.2.15 1807 | tinypool: 1.1.1 1808 | tinyrainbow: 2.0.0 1809 | vite: 7.1.5(@types/node@24.3.1) 1810 | vite-node: 3.2.4(@types/node@24.3.1) 1811 | why-is-node-running: 2.3.0 1812 | optionalDependencies: 1813 | '@types/node': 24.3.1 1814 | transitivePeerDependencies: 1815 | - jiti 1816 | - less 1817 | - lightningcss 1818 | - msw 1819 | - sass 1820 | - sass-embedded 1821 | - stylus 1822 | - sugarss 1823 | - supports-color 1824 | - terser 1825 | - tsx 1826 | - yaml 1827 | 1828 | which@2.0.2: 1829 | dependencies: 1830 | isexe: 2.0.0 1831 | 1832 | why-is-node-running@2.3.0: 1833 | dependencies: 1834 | siginfo: 2.0.0 1835 | stackback: 0.0.2 1836 | --------------------------------------------------------------------------------