├── .prettierrc ├── renovate.json ├── .gitignore ├── vitest.config.ts ├── shims.d.ts ├── .editorconfig ├── eslint.config.mjs ├── src ├── index.ts ├── types.ts ├── debugger.ts ├── utils.ts └── hookable.ts ├── .github └── workflows │ └── ci.yml ├── tsconfig.json ├── test ├── bench.ts ├── bundle.test.ts ├── debuger.test.ts ├── types.test.ts └── hookable.test.ts ├── LICENSE.md ├── package.json ├── README.md ├── CHANGELOG.md └── pnpm-lock.yaml /.prettierrc: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "github>unjs/renovate-config" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | dist 4 | types 5 | .vscode 6 | .DS_Store 7 | .eslintcache 8 | *.log* 9 | *.env* 10 | !vitest.config.ts 11 | tsconfig.tsbuildinfo 12 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vitest/config"; 2 | 3 | export default defineConfig({ 4 | test: { 5 | coverage: { 6 | provider: undefined, 7 | reporter: ["text", "clover", "json"], 8 | }, 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /shims.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | interface Console { 3 | // https://developer.chrome.com/blog/devtools-modern-web-debugging/#linked-stack-traces 4 | createTask(name: string): { run: any>(function_: T) => ReturnType } 5 | } 6 | } 7 | 8 | export {}; 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_size = 2 6 | indent_style = space 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import unjs from "eslint-config-unjs"; 2 | 3 | export default unjs({ 4 | ignores: [ 5 | // ignore paths 6 | ], 7 | rules: { 8 | // rule overrides 9 | }, 10 | markdown: { 11 | rules: { 12 | // markdown rule overrides 13 | }, 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { Hookable, HookableCore, createHooks } from "./hookable.ts"; 2 | 3 | export { 4 | flatHooks, 5 | mergeHooks, 6 | parallelCaller, 7 | serial, 8 | serialCaller, 9 | } from "./utils.ts"; 10 | 11 | export * from "./debugger.ts"; 12 | 13 | export * from "./types.ts"; 14 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | 11 | jobs: 12 | ci: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v6 17 | - run: npm i -fg corepack && corepack enable 18 | - uses: actions/setup-node@v6 19 | with: 20 | node-version: "20" 21 | cache: pnpm 22 | - run: pnpm install 23 | - run: pnpm lint 24 | - run: pnpm test:types 25 | - run: pnpm vitest run --coverage 26 | - uses: codecov/codecov-action@v5 27 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "NodeNext", 5 | "moduleResolution": "NodeNext", 6 | "resolveJsonModule": true, 7 | "esModuleInterop": false, 8 | "allowSyntheticDefaultImports": true, 9 | "skipLibCheck": true, 10 | "strict": true, 11 | "verbatimModuleSyntax": true, 12 | "isolatedModules": true, 13 | "composite": true, 14 | "allowImportingTsExtensions": true, 15 | "isolatedDeclarations": true, 16 | "forceConsistentCasingInFileNames": true, 17 | "noImplicitOverride": true, 18 | "noEmit": true 19 | }, 20 | "include": ["src", "test"] 21 | } 22 | -------------------------------------------------------------------------------- /test/bench.ts: -------------------------------------------------------------------------------- 1 | import { bench, compact, summary, run, do_not_optimize } from "mitata"; 2 | import { Hookable, HookableCore } from "../src/hookable.ts"; 3 | import { Hookable as HookablePrev } from "hookable-prev"; 4 | 5 | const instances = { 6 | hookable: new Hookable(), 7 | hookableCore: new HookableCore(), 8 | hookablePrev: new HookablePrev(), 9 | } as const; 10 | 11 | for (const instance of Object.values(instances)) { 12 | instance.hook("test", (obj) => { 13 | obj.called = true; 14 | }); 15 | } 16 | 17 | summary(() => { 18 | compact(() => { 19 | bench("Hookable", () => 20 | do_not_optimize(instances.hookable.callHook("test", {})), 21 | ); 22 | bench("HookableCore", () => 23 | do_not_optimize(instances.hookableCore.callHook("test", {})), 24 | ); 25 | bench("HookablePrev", () => 26 | do_not_optimize(instances.hookablePrev.callHook("test", {})), 27 | ); 28 | }); 29 | }); 30 | 31 | await run({ throw: true }); 32 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Pooya Parsa 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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hookable", 3 | "version": "6.0.1", 4 | "description": "Awaitable hook system", 5 | "keywords": [ 6 | "hook", 7 | "hookable", 8 | "plugin", 9 | "tapable", 10 | "tappable" 11 | ], 12 | "repository": "unjs/hookable", 13 | "license": "MIT", 14 | "sideEffects": false, 15 | "type": "module", 16 | "exports": { 17 | ".": "./dist/index.mjs" 18 | }, 19 | "main": "./dist/index.mjs", 20 | "types": "./dist/index.d.mts", 21 | "files": [ 22 | "dist" 23 | ], 24 | "scripts": { 25 | "bench": "node --expose-gc --allow-natives-syntax test/bench.ts", 26 | "build": "obuild src/index.ts", 27 | "dev": "vitest", 28 | "lint": "eslint --cache . && prettier -c src test", 29 | "lint:fix": "eslint --cache . --fix && prettier -c src test -w", 30 | "prepublish": "pnpm build", 31 | "release": "pnpm test && pnpm build && changelogen --release --publish --push", 32 | "test": "pnpm lint && vitest run --coverage", 33 | "test:types": "tsc --noEmit" 34 | }, 35 | "devDependencies": { 36 | "@types/node": "^25.0.3", 37 | "@vitest/coverage-v8": "^4.0.16", 38 | "changelogen": "^0.6.2", 39 | "esbuild": "^0.27.2", 40 | "eslint": "^9.39.2", 41 | "eslint-config-unjs": "^0.5.0", 42 | "expect-type": "^1.3.0", 43 | "hookable-prev": "npm:hookable@^5.5.3", 44 | "mitata": "^1.0.34", 45 | "obuild": "^0.4.9", 46 | "prettier": "^3.7.4", 47 | "typescript": "^5.9.3", 48 | "vite": "^7.3.0", 49 | "vitest": "^4.0.16" 50 | }, 51 | "packageManager": "pnpm@10.26.0" 52 | } 53 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type HookCallback = (...arguments_: any) => Promise | void; 2 | export interface Hooks { 3 | [key: string]: HookCallback; 4 | } 5 | export type HookKeys = keyof T & string; 6 | export type DeprecatedHook = { message?: string; to: HookKeys }; 7 | export type DeprecatedHooks = { [name in HookKeys]: DeprecatedHook }; 8 | 9 | // Utilities 10 | type ValueOf = C extends Record ? C[keyof C] : never; 11 | type Strings = Exclude; 12 | type KnownKeys = keyof { 13 | [K in keyof T as string extends K 14 | ? never 15 | : number extends K 16 | ? never 17 | : K]: never; 18 | }; 19 | type StripGeneric = Pick< 20 | T, 21 | KnownKeys extends keyof T ? KnownKeys : never 22 | >; 23 | type OnlyGeneric = Omit< 24 | T, 25 | KnownKeys extends keyof T ? KnownKeys : never 26 | >; 27 | 28 | // Unwrapping utilities 29 | type Namespaces = ValueOf<{ 30 | [key in Strings]: key extends `${infer Namespace}:${string}` 31 | ? Namespace 32 | : never; 33 | }>; 34 | type BareHooks = ValueOf<{ 35 | [key in Strings]: key extends `${string}:${string}` ? never : key; 36 | }>; 37 | type HooksInNamespace = ValueOf<{ 38 | [key in Strings]: key extends `${Namespace}:${infer HookName}` 39 | ? HookName 40 | : never; 41 | }>; 42 | type WithoutNamespace = { 43 | [key in HooksInNamespace]: `${Namespace}:${key}` extends keyof T 44 | ? T[`${Namespace}:${key}`] 45 | : never; 46 | }; 47 | 48 | export type NestedHooks = ( 49 | | Partial> 50 | | Partial> 51 | ) & 52 | Partial<{ 53 | [key in Namespaces>]: NestedHooks>; 54 | }> & 55 | Partial<{ [key in BareHooks>]: T[key] }>; 56 | -------------------------------------------------------------------------------- /test/bundle.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from "vitest"; 2 | import { build } from "esbuild"; 3 | import { fileURLToPath } from "node:url"; 4 | import zlib from "node:zlib"; 5 | 6 | describe("benchmark", () => { 7 | it("new Hookable()", async () => { 8 | const code = /* js */ ` 9 | import { Hookable } from "../src/index.ts"; 10 | export default new Hookable() 11 | `; 12 | const { bytes, gzipSize } = await getBundleSize(code); 13 | if (process.env.DEBUG) { 14 | console.log("new Hookable():", { bytes, gzipSize }); 15 | } 16 | expect(bytes).toBeLessThan(3000); 17 | expect(gzipSize).toBeLessThan(1200); 18 | }); 19 | 20 | it("new HookableCore()", async () => { 21 | const code = /* js */ ` 22 | import { HookableCore } from "../src/index.ts"; 23 | export default new HookableCore() 24 | `; 25 | const { bytes, gzipSize } = await getBundleSize(code); 26 | if (process.env.DEBUG) { 27 | console.log("new HookableCore():", { bytes, gzipSize }); 28 | } 29 | expect(bytes).toBeLessThan(630); 30 | expect(gzipSize).toBeLessThan(370); 31 | }); 32 | }); 33 | 34 | async function getBundleSize(code: string) { 35 | const res = await build({ 36 | bundle: true, 37 | metafile: true, 38 | write: false, 39 | minify: true, 40 | format: "esm", 41 | platform: "node", 42 | outfile: "index.mjs", 43 | stdin: { 44 | contents: code, 45 | resolveDir: fileURLToPath(new URL(".", import.meta.url)), 46 | sourcefile: "index.mjs", 47 | loader: "js", 48 | }, 49 | }); 50 | 51 | const { bytes } = res.metafile.outputs["index.mjs"]; 52 | const gzipSize = zlib.gzipSync(res.outputFiles[0].text).byteLength; 53 | return { 54 | bytes, 55 | gzipSize, 56 | // output: new TextDecoder().decode(res.outputFiles[0].contents), 57 | }; 58 | } 59 | -------------------------------------------------------------------------------- /test/debuger.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | afterAll, 3 | beforeAll, 4 | describe, 5 | it, 6 | beforeEach, 7 | expect, 8 | vi, 9 | } from "vitest"; 10 | import { createDebugger, Hookable } from "../src/index.ts"; 11 | 12 | const consoleMethods = [ 13 | "time", 14 | "timeEnd", 15 | "timeLog", 16 | "groupCollapsed", 17 | "groupEnd", 18 | ] as const; 19 | 20 | describe("debugger", () => { 21 | let hooks: Hookable; 22 | 23 | beforeAll(() => { 24 | for (const l of consoleMethods) { 25 | console[l] = vi.fn(); 26 | } 27 | }); 28 | beforeEach(() => { 29 | hooks = new Hookable(); 30 | vi.clearAllMocks(); 31 | }); 32 | afterAll(() => { 33 | vi.restoreAllMocks(); 34 | }); 35 | 36 | it("should respect `tag` option", async () => { 37 | createDebugger(hooks, { tag: "tag" }); 38 | await hooks.callHook("hook"); 39 | expect(console.time).toBeCalledWith(expect.stringContaining("[tag] hook")); 40 | expect(console.timeEnd).toBeCalledWith( 41 | expect.stringContaining("[tag] hook"), 42 | ); 43 | }); 44 | it("should respect `inspect` option", async () => { 45 | createDebugger(hooks, { inspect: true }); 46 | await hooks.callHook("hook"); 47 | expect(console.time).toBeCalledWith(expect.stringContaining("hook")); 48 | expect(console.timeLog).toBeCalledWith("hook", []); 49 | }); 50 | it("should respect `group` option", async () => { 51 | createDebugger(hooks, { group: true }); 52 | await hooks.callHook("hook"); 53 | expect(console.groupCollapsed).toBeCalled(); 54 | expect(console.groupEnd).toBeCalled(); 55 | }); 56 | it("should respect `filter` option as string", async () => { 57 | createDebugger(hooks, { filter: "other:" }); 58 | await hooks.callHook("hook"); 59 | expect(console.time).not.toBeCalled(); 60 | await hooks.callHook("other:hook"); 61 | expect(console.time).toBeCalled(); 62 | }); 63 | it("should respect `filter` option as function", async () => { 64 | createDebugger(hooks, { filter: (id) => id === "other:hook" }); 65 | await hooks.callHook("hook"); 66 | expect(console.time).not.toBeCalled(); 67 | await hooks.callHook("other:hook"); 68 | expect(console.time).toBeCalled(); 69 | }); 70 | it("should allowing closing debugger", async () => { 71 | const debug = createDebugger(hooks); 72 | await hooks.callHook("hook"); 73 | expect(console.time).toBeCalled(); 74 | debug.close(); 75 | vi.clearAllMocks(); 76 | await hooks.callHook("hook"); 77 | expect(console.time).not.toBeCalled(); 78 | debug.close(); 79 | }); 80 | }); 81 | -------------------------------------------------------------------------------- /src/debugger.ts: -------------------------------------------------------------------------------- 1 | import type { Hookable } from "./hookable.ts"; 2 | 3 | export interface CreateDebuggerOptions { 4 | /** An optional tag to prefix console logs with */ 5 | tag?: string; 6 | 7 | /** 8 | * Show hook params to the console output 9 | * 10 | * Enabled for browsers by default 11 | */ 12 | inspect?: boolean; 13 | 14 | /** 15 | * Use group/groupEnd wrapper around logs happening during a specific hook 16 | * 17 | * Enabled for browsers by default 18 | */ 19 | group?: boolean; 20 | 21 | /** Filter which hooks to enable debugger for. Can be a string prefix or fn. */ 22 | filter?: string | ((event: string) => boolean); 23 | } 24 | 25 | // eslint-disable-next-line unicorn/prefer-global-this 26 | const isBrowser = typeof window !== "undefined"; 27 | 28 | /** Start debugging hook names and timing in console */ 29 | export function createDebugger( 30 | hooks: Hookable, 31 | _options: CreateDebuggerOptions = {}, 32 | ): { 33 | /** Stop debugging and remove listeners */ 34 | close: () => void; 35 | } { 36 | const options = { 37 | inspect: isBrowser, 38 | group: isBrowser, 39 | filter: () => true, 40 | ..._options, 41 | } satisfies CreateDebuggerOptions; 42 | 43 | const _filter = options.filter; 44 | const filter = 45 | typeof _filter === "string" 46 | ? (name: string) => name.startsWith(_filter) 47 | : _filter; 48 | 49 | const _tag = options.tag ? `[${options.tag}] ` : ""; 50 | const logPrefix = (event: any) => 51 | _tag + event.name + "".padEnd(event._id, "\0"); 52 | 53 | const _idCtr: Record = {}; 54 | 55 | // Before each 56 | const unsubscribeBefore = hooks.beforeEach((event: any) => { 57 | if (filter !== undefined && !filter(event.name)) { 58 | return; 59 | } 60 | _idCtr[event.name] = _idCtr[event.name] || 0; 61 | event._id = _idCtr[event.name]++; 62 | console.time(logPrefix(event)); 63 | }); 64 | 65 | // After each 66 | const unsubscribeAfter = hooks.afterEach((event) => { 67 | if (filter !== undefined && !filter(event.name)) { 68 | return; 69 | } 70 | if (options.group) { 71 | console.groupCollapsed(event.name); 72 | } 73 | if (options.inspect) { 74 | console.timeLog(logPrefix(event), event.args); 75 | } else { 76 | console.timeEnd(logPrefix(event)); 77 | } 78 | if (options.group) { 79 | console.groupEnd(); 80 | } 81 | _idCtr[event.name]--; 82 | }); 83 | 84 | return { 85 | /** Stop debugging and remove listeners */ 86 | close: () => { 87 | unsubscribeBefore(); 88 | unsubscribeAfter(); 89 | }, 90 | }; 91 | } 92 | -------------------------------------------------------------------------------- /test/types.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, test } from "vitest"; 2 | import { expectTypeOf } from "expect-type"; 3 | import { createHooks } from "../src/index.ts"; 4 | import type { HookCallback } from "../src/types.ts"; 5 | 6 | describe("hook types", () => { 7 | test("correctly handles non-nested hooks", () => { 8 | const hooks = createHooks<{ 9 | foo: () => true; 10 | bar: (_arg: string) => 42; 11 | }>(); 12 | 13 | expectTypeOf(hooks.hook).parameter(0).not.toBeAny(); 14 | expectTypeOf(hooks.hook).parameter(0).toEqualTypeOf<"foo" | "bar">(); 15 | 16 | // @ts-expect-error 17 | hooks.hook("foo", (_parameter) => true); 18 | }); 19 | 20 | test("deprecates hooks", () => { 21 | const hooks = createHooks<{ 22 | foo: () => true; 23 | bar: (_arg: string) => 42; 24 | }>(); 25 | hooks.deprecateHooks({ 26 | foo: { to: "bar" }, 27 | }); 28 | }); 29 | 30 | test("handles nested hooks", () => { 31 | const hooks = createHooks<{ 32 | "namespace:foo": (argument: number) => void; 33 | bar: (_arg: string) => void; 34 | "namespace:baz": (argument: "42") => void; 35 | }>(); 36 | 37 | // should be valid 38 | hooks.addHooks({ 39 | namespace: { foo: (_arg) => {}, baz: (_arg) => {} }, 40 | bar: (_arg) => {}, 41 | "namespace:foo": () => {}, 42 | }); 43 | // @ts-expect-error 44 | hooks.addHooks({ a: (_arg) => {} }); 45 | // @ts-expect-error 46 | hooks.addHooks({ namespace: { nonexistent: (_arg) => {} } }); 47 | }); 48 | 49 | test("handles nested hooks with signature", () => { 50 | const hooks = createHooks<{ 51 | [key: string]: HookCallback; 52 | "namespace:foo": (argument: number) => void; 53 | bar: (_arg: string) => void; 54 | }>(); 55 | 56 | // should both be valid 57 | hooks.addHooks({ 58 | namespace: { foo: (_arg: any) => {} }, 59 | bar: (_arg) => {}, 60 | "namespace:foo": () => {}, 61 | }); 62 | hooks.addHooks({ namespace: { nothing: (_arg: any) => {} } }); 63 | hooks.addHooks({ nothing: (_arg) => {} }); 64 | }); 65 | 66 | test("beforeEach and afterEach typings", () => { 67 | const hooks = createHooks<{ 68 | foo: () => true; 69 | bar: (_arg: number) => 42; 70 | }>(); 71 | 72 | expectTypeOf(hooks.beforeEach).parameter(0).not.toBeAny(); 73 | expectTypeOf(hooks.afterEach) 74 | .parameter(0) 75 | .parameter(0) 76 | .toEqualTypeOf< 77 | | { name: "foo"; args: []; context: Record } 78 | | { name: "bar"; args: [number]; context: Record } 79 | >(); 80 | 81 | hooks.beforeEach(({ name, args }) => { 82 | expectTypeOf(name).toEqualTypeOf<"foo" | "bar">(); 83 | if (name === "foo") { 84 | expectTypeOf(args).toEqualTypeOf<[]>(); 85 | } 86 | if (name === "bar") { 87 | expectTypeOf(args[0]).toEqualTypeOf(); 88 | } 89 | }); 90 | }); 91 | }); 92 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import type { NestedHooks, HookCallback } from "./types.ts"; 2 | 3 | export function flatHooks( 4 | configHooks: NestedHooks, 5 | hooks: T = {} as T, 6 | parentName?: string, 7 | ): T { 8 | for (const key in configHooks) { 9 | // @ts-ignore 10 | const subHook: T = configHooks[key]; 11 | const name = parentName ? `${parentName}:${key}` : key; 12 | if (typeof subHook === "object" && subHook !== null) { 13 | flatHooks(subHook, hooks, name); 14 | } else if (typeof subHook === "function") { 15 | // @ts-ignore 16 | hooks[name] = subHook; 17 | } 18 | } 19 | return hooks as any; 20 | } 21 | 22 | export function mergeHooks(...hooks: NestedHooks[]): T { 23 | const finalHooks = {} as any; 24 | 25 | for (const hook of hooks) { 26 | const flatenHook = flatHooks(hook); 27 | for (const key in flatenHook) { 28 | if (finalHooks[key]) { 29 | finalHooks[key].push(flatenHook[key]); 30 | } else { 31 | finalHooks[key] = [flatenHook[key]]; 32 | } 33 | } 34 | } 35 | 36 | for (const key in finalHooks) { 37 | if (finalHooks[key].length > 1) { 38 | const array = finalHooks[key]; 39 | finalHooks[key] = (...arguments_: any[]) => 40 | serial(array, (function_: any) => function_(...arguments_)); 41 | } else { 42 | finalHooks[key] = finalHooks[key][0]; 43 | } 44 | } 45 | 46 | return finalHooks as any; 47 | } 48 | 49 | export function serial( 50 | tasks: T[], 51 | function_: (task: T) => Promise | any, 52 | ): Promise { 53 | // eslint-disable-next-line unicorn/no-array-reduce 54 | return tasks.reduce( 55 | (promise, task) => promise.then(() => function_(task)), 56 | Promise.resolve(), 57 | ); 58 | } 59 | 60 | // https://developer.chrome.com/blog/devtools-modern-web-debugging/#linked-stack-traces 61 | 62 | type CreateTask = (name?: string) => { 63 | run: (function_: () => Promise | any) => Promise | any; 64 | }; 65 | 66 | declare global { 67 | interface Console { 68 | createTask?: CreateTask; 69 | } 70 | } 71 | 72 | const createTask = /* @__PURE__ */ (() => { 73 | if (console.createTask) { 74 | return console.createTask; 75 | } 76 | const defaultTask: ReturnType = { run: (fn) => fn() }; 77 | return () => defaultTask; 78 | })(); 79 | 80 | export function callHooks( 81 | hooks: HookCallback[], 82 | args: any[], 83 | startIndex: number, 84 | task?: ReturnType, 85 | ): Promise | void { 86 | for (let i = startIndex; i < hooks.length; i += 1) { 87 | try { 88 | const result = task 89 | ? task.run(() => hooks[i](...args)) 90 | : hooks[i](...args); 91 | if (result instanceof Promise) { 92 | return result.then(() => callHooks(hooks, args, i + 1, task)); 93 | } 94 | } catch (error) { 95 | return Promise.reject(error); 96 | } 97 | } 98 | } 99 | 100 | export function serialTaskCaller( 101 | hooks: HookCallback[], 102 | args: any[], 103 | name: string, 104 | ): Promise | void { 105 | if (hooks.length > 0) { 106 | return callHooks(hooks, args, 0, createTask(name)); 107 | } 108 | } 109 | 110 | export function parallelTaskCaller( 111 | hooks: HookCallback[], 112 | args: any[], 113 | name: string, 114 | ): Promise | void { 115 | if (hooks.length > 0) { 116 | const task = createTask(name); 117 | return Promise.all(hooks.map((hook) => task.run(() => hook(...args)))); 118 | } 119 | } 120 | 121 | /** @deprecated */ 122 | export function serialCaller( 123 | hooks: HookCallback[], 124 | arguments_?: any[], 125 | ): Promise { 126 | // eslint-disable-next-line unicorn/no-array-reduce 127 | return hooks.reduce( 128 | (promise, hookFunction) => 129 | promise.then(() => hookFunction(...(arguments_ || []))), 130 | Promise.resolve(), 131 | ); 132 | } 133 | 134 | /** @deprecated */ 135 | export function parallelCaller( 136 | hooks: HookCallback[], 137 | args?: any[], 138 | ): Promise { 139 | return Promise.all(hooks.map((hook) => hook(...(args || [])))); 140 | } 141 | 142 | export function callEachWith( 143 | callbacks: Array<(arg0: any) => any>, 144 | arg0?: any, 145 | ): void { 146 | // eslint-disable-next-line unicorn/no-useless-spread 147 | for (const callback of [...callbacks]) { 148 | callback(arg0); 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hookable 2 | 3 | [![npm version][npm-version-src]][npm-version-href] 4 | [![npm downloads][npm-downloads-src]][npm-downloads-href] 5 | [![bundle][bundle-src]][bundle-href] 6 | [![Codecov][codecov-src]][codecov-href] 7 | [![License][license-src]][license-href] 8 | 9 | Awaitable hooks system. 10 | 11 | ## Install 12 | 13 | ```bash 14 | npx nypm i hookable 15 | ``` 16 | 17 | ## Usage 18 | 19 | **Method A: Create a hookable instance:** 20 | 21 | ```js 22 | import { Hookable } from "hookable"; 23 | 24 | // Create a hookable instance 25 | const hooks = new Hookable(); 26 | 27 | // Hook on 'hello' 28 | hooks.hook("hello", () => { 29 | console.log("Hello World"); 30 | }); 31 | 32 | // Call 'hello' hook 33 | hooks.callHook("hello"); 34 | ``` 35 | 36 | > [!TIP] 37 | > You can use `HookableCore` alternatively for less bundle and runtime footprint if simple `hook`/`callHook` functionality is only needed. 38 | 39 | **Method B: Extend your base class from Hookable:** 40 | 41 | ```js 42 | import { Hookable } from "hookable"; 43 | 44 | export default class FooLib extends Hookable { 45 | constructor() { 46 | // Call to parent to initialize 47 | super(); 48 | // Initialize Hookable with custom logger 49 | // super(consola) 50 | } 51 | 52 | async someFunction() { 53 | // Call and wait for `hook1` hooks (if any) sequential 54 | await this.callHook("hook1"); 55 | } 56 | } 57 | ``` 58 | 59 | **Inside plugins, register for any hook:** 60 | 61 | ```js 62 | const lib = new FooLib(); 63 | 64 | // Register a handler for `hook2` 65 | lib.hook("hook2", async () => { 66 | /* ... */ 67 | }); 68 | 69 | // Register multiply handlers at once 70 | lib.addHooks({ 71 | hook1: async () => { 72 | /* ... */ 73 | }, 74 | hook2: [ 75 | /* can be also an array */ 76 | ], 77 | }); 78 | ``` 79 | 80 | **Unregistering hooks:** 81 | 82 | ```js 83 | const lib = new FooLib(); 84 | 85 | const hook0 = async () => { 86 | /* ... */ 87 | }; 88 | const hook1 = async () => { 89 | /* ... */ 90 | }; 91 | const hook2 = async () => { 92 | /* ... */ 93 | }; 94 | 95 | // The hook() method returns an "unregister" function 96 | const unregisterHook0 = lib.hook("hook0", hook0); 97 | const unregisterHooks1and2 = lib.addHooks({ hook1, hook2 }); 98 | 99 | /* ... */ 100 | 101 | unregisterHook0(); 102 | unregisterHooks1and2(); 103 | 104 | // or 105 | 106 | lib.removeHooks({ hook0, hook1 }); 107 | lib.removeHook("hook2", hook2); 108 | ``` 109 | 110 | **Triggering a hook handler once:** 111 | 112 | ```js 113 | const lib = new FooLib(); 114 | 115 | const unregister = lib.hook("hook0", async () => { 116 | // Unregister as soon as the hook is executed 117 | unregister(); 118 | 119 | /* ... */ 120 | }); 121 | ``` 122 | 123 | ## Hookable class 124 | 125 | ### `constructor()` 126 | 127 | ### `hook (name, fn)` 128 | 129 | Register a handler for a specific hook. `fn` must be a function. 130 | 131 | Returns an `unregister` function that, when called, will remove the registered handler. 132 | 133 | ### `hookOnce (name, fn)` 134 | 135 | Similar to `hook` but unregisters hook once called. 136 | 137 | Returns an `unregister` function that, when called, will remove the registered handler before first call. 138 | 139 | ### `addHooks(configHooks)` 140 | 141 | Flatten and register hooks object. 142 | 143 | Example: 144 | 145 | ```js 146 | hookable.addHooks({ 147 | test: { 148 | before: () => {}, 149 | after: () => {}, 150 | }, 151 | }); 152 | ``` 153 | 154 | This registers `test:before` and `test:after` hooks at bulk. 155 | 156 | Returns an `unregister` function that, when called, will remove all the registered handlers. 157 | 158 | ### `async callHook (name, ...args)` 159 | 160 | Used by class itself to **sequentially** call handlers of a specific hook. 161 | 162 | ### `callHookWith (name, callerFn)` 163 | 164 | If you need custom control over how hooks are called, you can provide a custom function that will receive an array of handlers of a specific hook. 165 | 166 | `callerFn` if a callback function that accepts 3 arguments, `hooks`, `args` and `name`: 167 | 168 | - `hooks`: Array of user hooks to be called 169 | - `args`: Array of arguments that should be passed each time calling a hook 170 | - `name`: Name of the hook 171 | 172 | ### `deprecateHook (old, name)` 173 | 174 | Deprecate hook called `old` in favor of `name` hook. 175 | 176 | ### `deprecateHooks (deprecatedHooks)` 177 | 178 | Deprecate all hooks from an object (keys are old and values or newer ones). 179 | 180 | ### `removeHook (name, fn)` 181 | 182 | Remove a particular hook handler, if the `fn` handler is present. 183 | 184 | ### `removeHooks (configHooks)` 185 | 186 | Remove multiple hook handlers. 187 | 188 | Example: 189 | 190 | ```js 191 | const handler = async () => { 192 | /* ... */ 193 | }; 194 | 195 | hookable.hook("test:before", handler); 196 | hookable.addHooks({ test: { after: handler } }); 197 | 198 | // ... 199 | 200 | hookable.removeHooks({ 201 | test: { 202 | before: handler, 203 | after: handler, 204 | }, 205 | }); 206 | ``` 207 | 208 | ### `removeAllHooks` 209 | 210 | Remove all hook handlers. 211 | 212 | ### `beforeEach (syncCallback)` 213 | 214 | Registers a (sync) callback to be called before each hook is being called. 215 | 216 | ```js 217 | hookable.beforeEach((event) => { 218 | console.log(`${event.name} hook is being called with ${event.args}`); 219 | }); 220 | hookable.hook("test", () => { 221 | console.log("running test hook"); 222 | }); 223 | 224 | // test hook is being called with [] 225 | // running test hook 226 | await hookable.callHook("test"); 227 | ``` 228 | 229 | ### `afterEach (syncCallback)` 230 | 231 | Registers a (sync) callback to be called after each hook is being called. 232 | 233 | ```js 234 | hookable.afterEach((event) => { 235 | console.log(`${event.name} hook called with ${event.args}`); 236 | }); 237 | hookable.hook("test", () => { 238 | console.log("running test hook"); 239 | }); 240 | 241 | // running test hook 242 | // test hook called with [] 243 | await hookable.callHook("test"); 244 | ``` 245 | 246 | ### `createDebugger` 247 | 248 | Automatically logs each hook that is called and how long it takes to run. 249 | 250 | ```js 251 | const debug = hookable.createDebugger(hooks, { tag: "something" }); 252 | 253 | hooks.callHook("some-hook", "some-arg"); 254 | // [something] some-hook: 0.21ms 255 | 256 | debug.close(); 257 | ``` 258 | 259 | ## Migration 260 | 261 | ### From `4.x` to `5.x` 262 | 263 | - Type checking improved. You can use `Hookable` or `createHooks()` to provide types interface **([c2e1e22](https://github.com/unjs/hookable/commit/c2e1e223d16e7bf87117cd8d72ad3ba211a333d8))** 264 | - We no longer provide an IE11 compatible umd build. Instead, you should use an ESM-aware bundler such as webpack or rollup to transpile if needed. 265 | - Logger param is dropped. We use `console.warn` by default for deprecated hooks. 266 | - Package now uses named exports. You should import `{ Hookable }` instead of `Hookable` or use new `createHooks` util 267 | - `mergeHooks` util is exported standalone. You should replace `Hookable.mergeHooks` and `this.mergeHooks` with new `{ mergeHooks }` export 268 | - In versions < 5.0.0 when using `callHook` if an error happened by one of the hook callbacks, we was handling errors globally and call global `error` hook + `console.error` instead and resolve `callHook` promise! This sometimes makes confusing behavior when we think code worked but it didn't. v5 introduced a breaking change that when a hook throws an error, `callHook` also rejects instead of a global `error` event. This means you should be careful to handle all errors when using `callHook` now. 269 | 270 | ## Credits 271 | 272 | Extracted from [Nuxt](https://github.com/nuxt/nuxt.js) hooks system originally introduced by [Sébastien Chopin](https://github.com/Atinux) 273 | 274 | Thanks to [Joe Paice](https://github.com/RGBboy) for donating [hookable](https://www.npmjs.com/package/hookable) package name. 275 | 276 | ## License 277 | 278 | MIT - Made with 💖 279 | 280 | 281 | 282 | [npm-version-src]: https://img.shields.io/npm/v/hookable?style=flat&colorA=18181B&colorB=F0DB4F 283 | [npm-version-href]: https://npmjs.com/package/hookable 284 | [npm-downloads-src]: https://img.shields.io/npm/dm/hookable?style=flat&colorA=18181B&colorB=F0DB4F 285 | [npm-downloads-href]: https://npmjs.com/package/hookable 286 | [codecov-src]: https://img.shields.io/codecov/c/gh/unjs/hookable/main?style=flat&colorA=18181B&colorB=F0DB4F 287 | [codecov-href]: https://codecov.io/gh/unjs/h3 288 | [bundle-src]: https://img.shields.io/bundlephobia/minzip/hookable?style=flat&colorA=18181B&colorB=F0DB4F 289 | [bundle-href]: https://bundlephobia.com/result?p=hookable 290 | [license-src]: https://img.shields.io/github/license/unjs/hookable.svg?style=flat&colorA=18181B&colorB=F0DB4F 291 | [license-href]: https://github.com/unjs/hookable/blob/main/LICENSE 292 | -------------------------------------------------------------------------------- /src/hookable.ts: -------------------------------------------------------------------------------- 1 | import { 2 | flatHooks, 3 | parallelTaskCaller, 4 | serialTaskCaller, 5 | callEachWith, 6 | callHooks, 7 | } from "./utils.ts"; 8 | 9 | import type { 10 | DeprecatedHook, 11 | NestedHooks, 12 | HookCallback, 13 | HookKeys, 14 | } from "./types.ts"; 15 | 16 | type InferCallback = HT[HN] extends HookCallback 17 | ? HT[HN] 18 | : never; 19 | type InferSpyEvent> = { 20 | [key in keyof HT]: { 21 | name: key; 22 | args: Parameters; 23 | context: Record; 24 | }; 25 | }[keyof HT]; 26 | 27 | export class Hookable< 28 | HooksT extends Record = Record, 29 | HookNameT extends HookKeys = HookKeys, 30 | > { 31 | private _hooks: { [key: string]: HookCallback[] | undefined }; 32 | private _before?: HookCallback[]; 33 | private _after?: HookCallback[]; 34 | private _deprecatedHooks: Record>; 35 | private _deprecatedMessages?: Set; 36 | 37 | constructor() { 38 | this._hooks = {}; 39 | this._before = undefined; 40 | this._after = undefined; 41 | this._deprecatedMessages = undefined; 42 | this._deprecatedHooks = {}; 43 | 44 | // Allow destructuring hook and callHook functions out of instance object 45 | this.hook = this.hook.bind(this); 46 | this.callHook = this.callHook.bind(this); 47 | this.callHookWith = this.callHookWith.bind(this); 48 | } 49 | 50 | hook( 51 | name: NameT, 52 | function_: InferCallback, 53 | options: { allowDeprecated?: boolean } = {}, 54 | ): () => void { 55 | if (!name || typeof function_ !== "function") { 56 | return () => {}; 57 | } 58 | 59 | const originalName = name; 60 | let dep: DeprecatedHook | undefined; 61 | while (this._deprecatedHooks[name]) { 62 | dep = this._deprecatedHooks[name]; 63 | name = dep.to as NameT; 64 | } 65 | if (dep && !options.allowDeprecated) { 66 | let message = dep.message; 67 | if (!message) { 68 | message = 69 | `${originalName} hook has been deprecated` + 70 | (dep.to ? `, please use ${dep.to}` : ""); 71 | } 72 | if (!this._deprecatedMessages) { 73 | this._deprecatedMessages = new Set(); 74 | } 75 | if (!this._deprecatedMessages.has(message)) { 76 | console.warn(message); 77 | this._deprecatedMessages.add(message); 78 | } 79 | } 80 | 81 | // Add name to hook for better debugging experience 82 | if (!function_.name) { 83 | try { 84 | Object.defineProperty(function_, "name", { 85 | get: () => "_" + name.replace(/\W+/g, "_") + "_hook_cb", 86 | configurable: true, 87 | }); 88 | } catch { 89 | // ignore 90 | } 91 | } 92 | 93 | this._hooks[name] = this._hooks[name] || []; 94 | this._hooks[name]!.push(function_); 95 | 96 | return () => { 97 | if (function_) { 98 | this.removeHook(name, function_); 99 | // @ts-ignore 100 | function_ = undefined; // Free memory 101 | } 102 | }; 103 | } 104 | 105 | hookOnce( 106 | name: NameT, 107 | function_: InferCallback, 108 | ): () => void { 109 | let _unreg: (() => void) | undefined; 110 | let _function: ((...arguments_: any) => any) | undefined = ( 111 | ...arguments_: any 112 | ) => { 113 | if (typeof _unreg === "function") { 114 | _unreg(); 115 | } 116 | _unreg = undefined; 117 | _function = undefined; 118 | return function_(...arguments_); 119 | }; 120 | _unreg = this.hook(name, _function as typeof function_); 121 | return _unreg; 122 | } 123 | 124 | removeHook( 125 | name: NameT, 126 | function_: InferCallback, 127 | ): void { 128 | const hooks = this._hooks[name]; 129 | 130 | if (hooks) { 131 | const index = hooks.indexOf(function_); 132 | 133 | if (index !== -1) { 134 | hooks.splice(index, 1); 135 | } 136 | 137 | if (hooks.length === 0) { 138 | this._hooks[name] = undefined; 139 | } 140 | } 141 | } 142 | 143 | deprecateHook( 144 | name: NameT, 145 | deprecated: HookKeys | DeprecatedHook, 146 | ): void { 147 | this._deprecatedHooks[name] = 148 | typeof deprecated === "string" ? { to: deprecated } : deprecated; 149 | const _hooks = this._hooks[name] || []; 150 | this._hooks[name] = undefined; 151 | for (const hook of _hooks) { 152 | this.hook(name, hook as any); 153 | } 154 | } 155 | 156 | deprecateHooks( 157 | deprecatedHooks: Partial>>, 158 | ): void { 159 | for (const name in deprecatedHooks) { 160 | this.deprecateHook(name, deprecatedHooks[name] as DeprecatedHook); 161 | } 162 | } 163 | 164 | addHooks(configHooks: NestedHooks): () => void { 165 | const hooks = flatHooks(configHooks); 166 | // @ts-ignore 167 | const removeFns = Object.keys(hooks).map((key) => 168 | this.hook(key as HookNameT, hooks[key]), 169 | ); 170 | 171 | return () => { 172 | for (const unreg of removeFns) { 173 | unreg(); 174 | } 175 | 176 | // Ensures that all fns are called once, and free all 177 | // unreg functions from memory. 178 | removeFns.length = 0; 179 | }; 180 | } 181 | 182 | removeHooks(configHooks: NestedHooks): void { 183 | const hooks = flatHooks(configHooks); 184 | for (const key in hooks) { 185 | // @ts-ignore 186 | this.removeHook(key, hooks[key]); 187 | } 188 | } 189 | 190 | removeAllHooks(): void { 191 | this._hooks = {}; 192 | } 193 | 194 | callHook( 195 | name: NameT, 196 | ...args: Parameters> 197 | ): Promise | void { 198 | return this.callHookWith(serialTaskCaller, name, args); 199 | } 200 | 201 | callHookParallel( 202 | name: NameT, 203 | ...args: Parameters> 204 | ): Promise | void { 205 | return this.callHookWith(parallelTaskCaller, name, args); 206 | } 207 | 208 | callHookWith< 209 | NameT extends HookNameT, 210 | CallFunction extends ( 211 | hooks: HookCallback[], 212 | args: Parameters>, 213 | name: NameT, 214 | ) => any, 215 | >( 216 | caller: CallFunction, 217 | name: NameT, 218 | args: Parameters>, 219 | ): ReturnType { 220 | const event = 221 | this._before || this._after ? { name, args, context: {} } : undefined; 222 | if (this._before) { 223 | callEachWith(this._before, event); 224 | } 225 | const result = caller( 226 | this._hooks[name] ? [...this._hooks[name]] : [], 227 | args as Parameters>, 228 | name, 229 | ); 230 | if ((result as any) instanceof Promise) { 231 | return result.finally(() => { 232 | if (this._after && event) { 233 | callEachWith(this._after, event); 234 | } 235 | }); 236 | } 237 | if (this._after && event) { 238 | callEachWith(this._after, event); 239 | } 240 | return result; 241 | } 242 | 243 | beforeEach(function_: (event: InferSpyEvent) => void): () => void { 244 | this._before = this._before || []; 245 | this._before.push(function_); 246 | return () => { 247 | if (this._before !== undefined) { 248 | const index = this._before.indexOf(function_); 249 | if (index !== -1) { 250 | this._before.splice(index, 1); 251 | } 252 | } 253 | }; 254 | } 255 | 256 | afterEach(function_: (event: InferSpyEvent) => void): () => void { 257 | this._after = this._after || []; 258 | this._after.push(function_); 259 | return () => { 260 | if (this._after !== undefined) { 261 | const index = this._after.indexOf(function_); 262 | if (index !== -1) { 263 | this._after.splice(index, 1); 264 | } 265 | } 266 | }; 267 | } 268 | } 269 | 270 | export function createHooks>(): Hookable { 271 | return new Hookable(); 272 | } 273 | 274 | export class HookableCore< 275 | HooksT extends Record = Record, 276 | HookNameT extends HookKeys = HookKeys, 277 | > { 278 | protected _hooks: { [key: string]: HookCallback[] | undefined }; 279 | 280 | constructor() { 281 | this._hooks = {}; 282 | } 283 | 284 | hook( 285 | name: NameT, 286 | fn: InferCallback, 287 | ): () => void { 288 | if (!name || typeof fn !== "function") { 289 | return () => {}; 290 | } 291 | this._hooks[name] = this._hooks[name] || []; 292 | this._hooks[name]!.push(fn); 293 | return () => { 294 | if (fn) { 295 | this.removeHook(name, fn); 296 | // @ts-ignore 297 | fn = undefined; // Free memory 298 | } 299 | }; 300 | } 301 | 302 | removeHook( 303 | name: NameT, 304 | function_: InferCallback, 305 | ): void { 306 | const hooks = this._hooks[name]; 307 | 308 | if (hooks) { 309 | const index = hooks.indexOf(function_); 310 | 311 | if (index !== -1) { 312 | hooks.splice(index, 1); 313 | } 314 | 315 | if (hooks.length === 0) { 316 | this._hooks[name] = undefined; 317 | } 318 | } 319 | } 320 | 321 | callHook( 322 | name: NameT, 323 | ...args: Parameters> 324 | ): Promise | void { 325 | const hooks = this._hooks[name]; 326 | if (!hooks || hooks.length === 0) { 327 | return; 328 | } 329 | return callHooks(hooks, args, 0); 330 | } 331 | } 332 | -------------------------------------------------------------------------------- /test/hookable.test.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import { describe, test, beforeEach, expect, vi } from "vitest"; 3 | import { Hookable, HookableCore, flatHooks, mergeHooks } from "../src/index.ts"; 4 | 5 | describe("HookableCore", () => { 6 | test("basic functionality", async () => { 7 | const hookable = new HookableCore<{ test(): void }>(); 8 | hookable.hook("test", async (obj: { called: boolean }) => { 9 | obj.called = true; 10 | }); 11 | const obj = { called: false }; 12 | await hookable.callHook("test", obj); 13 | expect(obj.called).toBe(true); 14 | }); 15 | }); 16 | 17 | describe("hookable", () => { 18 | beforeEach(() => { 19 | for (const l of ["log", "warn", "error", "debug"]) { 20 | console[l] = vi.fn(); 21 | } 22 | }); 23 | 24 | test("should construct hook object", () => { 25 | const hook = new Hookable(); 26 | 27 | expect(hook._hooks).toEqual({}); 28 | expect(hook._deprecatedHooks).toEqual({}); 29 | expect(hook.hook).toBeInstanceOf(Function); 30 | expect(hook.callHook).toBeInstanceOf(Function); 31 | }); 32 | 33 | test("should register hook successfully", () => { 34 | const hook = new Hookable(); 35 | hook.hook("test:hook", () => {}); 36 | hook.hook("test:hook", () => {}); 37 | 38 | expect(hook._hooks["test:hook"]).toHaveLength(2); 39 | expect(hook._hooks["test:hook"]).toBeInstanceOf(Array); 40 | expect(hook._hooks["test:hook"]).toEqual([ 41 | expect.any(Function), 42 | expect.any(Function), 43 | ]); 44 | }); 45 | 46 | test("should ignore empty hook name", () => { 47 | const hook = new Hookable(); 48 | hook.hook(0, () => {}); 49 | hook.hook("", () => {}); 50 | hook.hook(undefined, () => {}); 51 | 52 | expect(hook._hooks[0]).toBeUndefined(); 53 | expect(hook._hooks[""]).toBeUndefined(); 54 | expect(hook._hooks[undefined]).toBeUndefined(); 55 | }); 56 | 57 | test("should ignore non-function hook", () => { 58 | const hook = new Hookable(); 59 | hook.hook("test:hook", ""); 60 | hook.hook("test:hook"); 61 | 62 | expect(hook._hooks["test:hook"]).toBeUndefined(); 63 | }); 64 | 65 | test("should convert and display deprecated hooks", () => { 66 | const hook = new Hookable(); 67 | hook.deprecateHook("a", "b"); 68 | hook.deprecateHook("b", { to: "c" }); 69 | hook.deprecateHook("x", { to: "y", message: "Custom" }); 70 | 71 | hook.hook("a", () => {}); 72 | hook.hook("a", () => {}); 73 | hook.hook("b", () => {}); 74 | hook.hook("c", () => {}); 75 | hook.hook("x", () => {}); 76 | 77 | expect(console.warn).toBeCalledWith( 78 | "a hook has been deprecated, please use c", 79 | ); 80 | expect(console.warn).toBeCalledWith( 81 | "b hook has been deprecated, please use c", 82 | ); 83 | expect(console.warn).toBeCalledWith("Custom"); 84 | expect(console.warn).toBeCalledTimes(3); 85 | expect(hook._hooks.a).toBeUndefined(); 86 | expect(hook._hooks.b).toBeUndefined(); 87 | expect(hook._hooks.c).toEqual([ 88 | expect.any(Function), 89 | expect.any(Function), 90 | expect.any(Function), 91 | expect.any(Function), 92 | ]); 93 | }); 94 | 95 | test("allow hiding deprecation warns", () => { 96 | const hook = new Hookable(); 97 | hook.deprecateHook("a", "b"); 98 | hook.hook("a", () => {}, { allowDeprecated: true }); 99 | expect(console.warn).toBeCalledTimes(0); 100 | }); 101 | 102 | test("should handle deprecation after registering", () => { 103 | const hook = new Hookable(); 104 | hook.hook("a", () => {}); 105 | hook.hook("b", () => {}); 106 | hook.deprecateHook("a", "b"); 107 | expect(console.warn).toBeCalledWith( 108 | "a hook has been deprecated, please use b", 109 | ); 110 | expect(hook._hooks.a).toBeUndefined(); 111 | expect(hook._hooks.b).toEqual([expect.any(Function), expect.any(Function)]); 112 | }); 113 | 114 | test("deprecateHooks", () => { 115 | const hook = new Hookable(); 116 | hook.deprecateHooks({ 117 | "test:hook": "test:before", 118 | }); 119 | 120 | hook.hook("test:hook", () => {}); 121 | 122 | expect(console.warn).toBeCalledWith( 123 | "test:hook hook has been deprecated, please use test:before", 124 | ); 125 | expect(hook._hooks["test:hook"]).toBeUndefined(); 126 | expect(hook._hooks["test:before"]).toEqual([expect.any(Function)]); 127 | }); 128 | 129 | test("should call registered hook", async () => { 130 | const hook = new Hookable(); 131 | hook.hook("test:hook", () => console.log("test:hook called")); 132 | 133 | await hook.callHook("test:hook"); 134 | 135 | expect(console.log).toBeCalledWith("test:hook called"); 136 | }); 137 | 138 | test("should ignore unregistered hook", async () => { 139 | const hook = new Hookable(); 140 | 141 | await hook.callHook("test:hook"); 142 | 143 | expect(console.debug).not.toBeCalled(); 144 | }); 145 | 146 | test("should throw hook error", async () => { 147 | const hook = new Hookable(); 148 | const error = new Error("Hook Error"); 149 | hook.hook("test:hook", () => { 150 | throw error; 151 | }); 152 | await expect(() => hook.callHook("test:hook")).rejects.toThrow(error); 153 | }); 154 | 155 | test("should return a self-removal function", async () => { 156 | const hook = new Hookable(); 157 | const remove = hook.hook("test:hook", () => { 158 | console.log("test:hook called"); 159 | }); 160 | 161 | await hook.callHook("test:hook"); 162 | remove(); 163 | await hook.callHook("test:hook"); 164 | 165 | expect(console.log).toBeCalledTimes(1); 166 | }); 167 | 168 | test("should clear only its own hooks", () => { 169 | const hook = new Hookable(); 170 | const callback = () => {}; 171 | 172 | hook.hook("test:hook", callback); 173 | const remove = hook.hook("test:hook", callback); 174 | hook.hook("test:hook", callback); 175 | 176 | expect(hook._hooks["test:hook"]).toEqual([callback, callback, callback]); 177 | 178 | remove(); 179 | remove(); 180 | remove(); 181 | 182 | expect(hook._hooks["test:hook"]).toEqual([callback, callback]); 183 | }); 184 | 185 | test("should clear removed hooks", () => { 186 | const hook = new Hookable(); 187 | const callback = () => {}; 188 | hook.hook("test:hook", callback); 189 | hook.hook("test:hook", callback); 190 | 191 | expect(hook._hooks["test:hook"]).toHaveLength(2); 192 | 193 | hook.removeHook("test:hook", callback); 194 | 195 | expect(hook._hooks["test:hook"]).toHaveLength(1); 196 | 197 | hook.removeHook("test:hook", callback); 198 | 199 | expect(hook._hooks["test:hook"]).toBeUndefined(); 200 | }); 201 | 202 | test("should call self-removing hooks once", async () => { 203 | const hook = new Hookable(); 204 | const remove = hook.hook("test:hook", () => { 205 | console.log("test:hook called"); 206 | remove(); 207 | }); 208 | 209 | expect(hook._hooks["test:hook"]).toHaveLength(1); 210 | 211 | await hook.callHook("test:hook"); 212 | await hook.callHook("test:hook"); 213 | 214 | expect(console.log).toBeCalledWith("test:hook called"); 215 | expect(console.log).toBeCalledTimes(1); 216 | expect(hook._hooks["test:hook"]).toBeUndefined(); 217 | }); 218 | 219 | test("should return flat hooks", () => { 220 | const hooks = flatHooks({ 221 | test: { 222 | hook: () => {}, 223 | before: () => {}, 224 | }, 225 | }); 226 | 227 | expect(hooks).toEqual({ 228 | "test:hook": expect.any(Function), 229 | "test:before": expect.any(Function), 230 | }); 231 | }); 232 | 233 | test("should add object hooks", () => { 234 | const hook = new Hookable(); 235 | hook.addHooks({ 236 | test: { 237 | hook: () => {}, 238 | before: () => {}, 239 | // eslint-disable-next-line unicorn/no-null 240 | after: null, 241 | }, 242 | }); 243 | 244 | expect(hook._hooks).toEqual({ 245 | "test:hook": expect.any(Array), 246 | "test:before": expect.any(Array), 247 | "test:after": undefined, 248 | }); 249 | expect(hook._hooks["test:hook"]).toHaveLength(1); 250 | expect(hook._hooks["test:before"]).toHaveLength(1); 251 | }); 252 | 253 | test("should clear multiple hooks", () => { 254 | const hook = new Hookable(); 255 | const callback = () => {}; 256 | 257 | const hooks = { 258 | test: { 259 | hook: () => {}, 260 | before: () => {}, 261 | }, 262 | }; 263 | 264 | hook.addHooks(hooks); 265 | 266 | hook.hook("test:hook", callback); 267 | 268 | expect(hook._hooks["test:hook"]).toHaveLength(2); 269 | expect(hook._hooks["test:before"]).toHaveLength(1); 270 | 271 | hook.removeHooks(hooks); 272 | 273 | expect(hook._hooks["test:hook"]).toEqual([callback]); 274 | expect(hook._hooks["test:before"]).toBeUndefined(); 275 | }); 276 | 277 | test("should clear all hooks", () => { 278 | const hook = new Hookable(); 279 | const callback = () => {}; 280 | 281 | const hooks = { 282 | test: { 283 | hook: () => {}, 284 | before: () => {}, 285 | }, 286 | }; 287 | 288 | hook.addHooks(hooks); 289 | 290 | hook.hook("test:hook", callback); 291 | 292 | expect(hook._hooks["test:hook"]).toHaveLength(2); 293 | expect(hook._hooks["test:before"]).toHaveLength(1); 294 | 295 | hook.removeAllHooks(); 296 | 297 | expect(hook._hooks).toEqual({}); 298 | }); 299 | 300 | test("should clear only the hooks added by addHooks", () => { 301 | const hook = new Hookable(); 302 | const callback1 = () => {}; 303 | const callback2 = () => {}; 304 | hook.hook("test:hook", callback1); 305 | 306 | const remove = hook.addHooks({ 307 | test: { 308 | hook: () => {}, 309 | before: () => {}, 310 | }, 311 | }); 312 | 313 | hook.hook("test:hook", callback2); 314 | 315 | expect(hook._hooks["test:hook"]).toHaveLength(3); 316 | expect(hook._hooks["test:before"]).toHaveLength(1); 317 | 318 | remove(); 319 | 320 | expect(hook._hooks["test:hook"]).toEqual([callback1, callback2]); 321 | expect(hook._hooks["test:before"]).toBeUndefined(); 322 | }); 323 | 324 | test("hook once", async () => { 325 | const hook = new Hookable(); 326 | 327 | let x = 0; 328 | 329 | hook.hookOnce("test", () => { 330 | x++; 331 | }); 332 | 333 | await hook.callHook("test"); 334 | await hook.callHook("test"); 335 | 336 | expect(x).toBe(1); 337 | }); 338 | 339 | test("hook sync", () => { 340 | const hook = new Hookable(); 341 | 342 | let x = 0; 343 | 344 | hook.hook("test", () => { 345 | x++; 346 | }); 347 | 348 | const syncCaller = (hooks) => hooks.map((hook) => hook()); 349 | hook.callHookWith(syncCaller, "test"); 350 | hook.callHookWith(syncCaller, "test"); 351 | 352 | expect(x).toBe(2); 353 | }); 354 | 355 | test("beforeEach and afterEach spies", async () => { 356 | const hook = new Hookable<{ test(): void }>(); 357 | 358 | let x = 0; 359 | 360 | const unreg = hook.beforeEach((event) => { 361 | unreg(); 362 | expect(event.context.count).toBeUndefined(); 363 | if (event.name === "test") { 364 | x++; 365 | } 366 | event.context.count = x; 367 | }); 368 | hook.beforeEach((event) => { 369 | if (event.name === "test") { 370 | x++; 371 | } 372 | event.context.count = x; 373 | }); 374 | hook.afterEach((event) => { 375 | expect(event.context.count).toEqual(x); 376 | if (event.name === "test") { 377 | x++; 378 | } 379 | }); 380 | 381 | await hook.callHook("test"); 382 | expect(x).toBe(3); 383 | 384 | await hook.callHookParallel("test"); 385 | expect(x).toBe(5); 386 | }); 387 | 388 | test("mergeHooks", () => { 389 | const function_ = () => {}; 390 | const hooks1 = { 391 | foo: function_, 392 | bar: function_, 393 | "a:b": function_, 394 | "a:c": function_, 395 | }; 396 | const hooks2 = { 397 | foo: function_, 398 | baz: function_, 399 | a: { 400 | b: function_, 401 | d: function_, 402 | }, 403 | }; 404 | 405 | const merged = mergeHooks(hooks1, hooks2); 406 | 407 | expect(Object.keys(merged)).toMatchObject([ 408 | "foo", 409 | "bar", 410 | "a:b", 411 | "a:c", 412 | "baz", 413 | "a:d", 414 | ]); 415 | }); 416 | 417 | test("arguments", async () => { 418 | let result; 419 | const hooks = new Hookable(); 420 | hooks.hook("test", (a: number, b: number) => (result = a + b)); 421 | await hooks.callHook("test", 1, 2); 422 | expect(result).toBe(3); 423 | }); 424 | 425 | test("callEachWith", async () => { 426 | let result = 0; 427 | const hooks = new Hookable(); 428 | hooks.hookOnce("test", () => result++); 429 | hooks.hookOnce("test", () => result++); 430 | hooks.hookOnce("test", () => result++); 431 | const customSerialCaller = (hooks) => { 432 | for (const hook of hooks) { 433 | hook(); 434 | } 435 | }; 436 | await hooks.callHookWith(customSerialCaller, "test"); 437 | expect(result).toBe(3); 438 | }); 439 | }); 440 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | ## v6.0.1 6 | 7 | [compare changes](https://github.com/unjs/hookable/compare/v6.0.0...v6.0.1) 8 | 9 | ### 🔥 Performance 10 | 11 | - Pass name arg to caller seperately ([fc96bce](https://github.com/unjs/hookable/commit/fc96bce)) 12 | 13 | ### ❤️ Contributors 14 | 15 | - Pooya Parsa ([@pi0](https://github.com/pi0)) 16 | 17 | ## v6.0.0-rc.2 18 | 19 | [compare changes](https://github.com/unjs/hookable/compare/v6.0.0-rc.1...v6.0.0-rc.2) 20 | 21 | ### 🩹 Fixes 22 | 23 | - **types:** Return type is normal `Promise` or void ([56f47e1](https://github.com/unjs/hookable/commit/56f47e1)) 24 | 25 | ### 🏡 Chore 26 | 27 | - Update deps ([b23cbe7](https://github.com/unjs/hookable/commit/b23cbe7)) 28 | 29 | ### ❤️ Contributors 30 | 31 | - Pooya Parsa ([@pi0](https://github.com/pi0)) 32 | 33 | ## v6.0.0-rc.1 34 | 35 | [compare changes](https://github.com/unjs/hookable/compare/v5.5.3...v6.0.0-rc.1) 36 | 37 | ### 🚀 Enhancements 38 | 39 | - `HookableCore` ([#127](https://github.com/unjs/hookable/pull/127)) 40 | 41 | ### 🔥 Performance 42 | 43 | - ⚠️ Improve performance, reduce allocations, and avoid promises ([#102](https://github.com/unjs/hookable/pull/102)) 44 | 45 | ### 🩹 Fixes 46 | 47 | - **core:** Only pass args ([0bf8fdd](https://github.com/unjs/hookable/commit/0bf8fdd)) 48 | 49 | ### 💅 Refactors 50 | 51 | - Remove extra `splice` arg ([d13ac6e](https://github.com/unjs/hookable/commit/d13ac6e)) 52 | - More explicit types ([3756887](https://github.com/unjs/hookable/commit/3756887)) 53 | 54 | ### 📦 Build 55 | 56 | - Correct `types` order in `exports ([#122](https://github.com/unjs/hookable/pull/122)) 57 | - ⚠️ Esm-only dist ([89d1bcb](https://github.com/unjs/hookable/commit/89d1bcb)) 58 | - Add `type: "module"` ([93e5d41](https://github.com/unjs/hookable/commit/93e5d41)) 59 | - Add `"sideEffects": false` to package.json ([1eb317a](https://github.com/unjs/hookable/commit/1eb317a)) 60 | 61 | ### 🏡 Chore 62 | 63 | - Update deps ([ccecf5f](https://github.com/unjs/hookable/commit/ccecf5f)) 64 | - Update ci ([00f1b70](https://github.com/unjs/hookable/commit/00f1b70)) 65 | - Lint ([d057046](https://github.com/unjs/hookable/commit/d057046)) 66 | - **test:** Replace vitest config ([#115](https://github.com/unjs/hookable/pull/115)) 67 | - Update dev dependencies ([d3b134a](https://github.com/unjs/hookable/commit/d3b134a)) 68 | - Update eslint config ([ccbe59d](https://github.com/unjs/hookable/commit/ccbe59d)) 69 | - Update deps ([1c3670e](https://github.com/unjs/hookable/commit/1c3670e)) 70 | - Avoid non erasable syntax ([04b5916](https://github.com/unjs/hookable/commit/04b5916)) 71 | - New bench ([b53de70](https://github.com/unjs/hookable/commit/b53de70)) 72 | - Prepare for v6 ([df45aff](https://github.com/unjs/hookable/commit/df45aff)) 73 | 74 | ### ✅ Tests 75 | 76 | - Add bundle size test ([e58f2e7](https://github.com/unjs/hookable/commit/e58f2e7)) 77 | 78 | #### ⚠️ Breaking Changes 79 | 80 | - ⚠️ Improve performance, reduce allocations, and avoid promises ([#102](https://github.com/unjs/hookable/pull/102)) 81 | - ⚠️ Esm-only dist ([89d1bcb](https://github.com/unjs/hookable/commit/89d1bcb)) 82 | 83 | ### ❤️ Contributors 84 | 85 | - Pooya Parsa ([@pi0](https://github.com/pi0)) 86 | - Vlad ([@negezor](https://github.com/negezor)) 87 | - Kricsleo ([@kricsleo](https://github.com/kricsleo)) 88 | - Kanon ([@ysknsid25](https://github.com/ysknsid25)) 89 | 90 | ## v5.5.3 91 | 92 | [compare changes](https://github.com/unjs/hookable/compare/v5.5.2...v5.5.3) 93 | 94 | 95 | ### 🩹 Fixes 96 | 97 | - Clone hook arrays before calling ([#79](https://github.com/unjs/hookable/pull/79)) 98 | 99 | ### 🏡 Chore 100 | 101 | - Update deps ([8b5765f](https://github.com/unjs/hookable/commit/8b5765f)) 102 | 103 | ### ❤️ Contributors 104 | 105 | - Pooya Parsa ([@pi0](http://github.com/pi0)) 106 | - Daniel Roe 107 | 108 | ## v5.5.2 109 | 110 | [compare changes](https://github.com/unjs/hookable/compare/v5.5.1...v5.5.2) 111 | 112 | 113 | ### 📖 Documentation 114 | 115 | - Add `removeAllHooks` and fix typos ([#72](https://github.com/unjs/hookable/pull/72)) 116 | 117 | ### 🌊 Types 118 | 119 | - Work with strict config ([#63](https://github.com/unjs/hookable/pull/63)) 120 | 121 | ### 🏡 Chore 122 | 123 | - **lint:** Run lint:fix to fix formatting ([#77](https://github.com/unjs/hookable/pull/77)) 124 | - Update dependencies ([9443040](https://github.com/unjs/hookable/commit/9443040)) 125 | 126 | ### ❤️ Contributors 127 | 128 | - Pooya Parsa ([@pi0](http://github.com/pi0)) 129 | - Rafał Chłodnicki ([@rchl](http://github.com/rchl)) 130 | - Vinccool96 131 | - Nozomu Ikuta 132 | 133 | ## v5.5.1 134 | 135 | [compare changes](https://github.com/unjs/hookable/compare/v5.5.0...v5.5.1) 136 | 137 | 138 | ### 🩹 Fixes 139 | 140 | - Shift name out of arg array ([#71](https://github.com/unjs/hookable/pull/71)) 141 | 142 | ### 📖 Documentation 143 | 144 | - Update badges ([13b0c90](https://github.com/unjs/hookable/commit/13b0c90)) 145 | 146 | ### ❤️ Contributors 147 | 148 | - Daniel Roe 149 | - Sébastien Chopin 150 | 151 | ## v5.5.0 152 | 153 | [compare changes](https://github.com/unjs/hookable/compare/v5.4.2...v5.5.0) 154 | 155 | 156 | ### 🚀 Enhancements 157 | 158 | - Add function name to hook for better dx in stacktraces ([#68](https://github.com/unjs/hookable/pull/68)) 159 | - Use `console.createTask` to improve traces where supported ([#69](https://github.com/unjs/hookable/pull/69)) 160 | - Add `removeAllHooks` utility ([#61](https://github.com/unjs/hookable/pull/61)) 161 | 162 | ### 🏡 Chore 163 | 164 | - Add latest `@types/node` package ([#66](https://github.com/unjs/hookable/pull/66)) 165 | - Add `.prettierrc` ([4b3e99b](https://github.com/unjs/hookable/commit/4b3e99b)) 166 | - Use changelogen for releases ([151d16b](https://github.com/unjs/hookable/commit/151d16b)) 167 | - Simplify variable names ([369a2fe](https://github.com/unjs/hookable/commit/369a2fe)) 168 | 169 | ### ✅ Tests 170 | 171 | - Fix vitest type issue ([#70](https://github.com/unjs/hookable/pull/70)) 172 | 173 | ### 🎨 Styles 174 | 175 | - Format with prettier ([#65](https://github.com/unjs/hookable/pull/65)) 176 | 177 | ### ❤️ Contributors 178 | 179 | - Nozomu Ikuta 180 | - Pooya Parsa ([@pi0](http://github.com/pi0)) 181 | - Daniel Roe 182 | 183 | ### [5.4.2](https://github.com/unjs/hookable/compare/v5.4.1...v5.4.2) (2022-11-15) 184 | 185 | 186 | ### Bug Fixes 187 | 188 | * add types subpath export ([211ee2e](https://github.com/unjs/hookable/commit/211ee2e36f2cccbf930a5fa1f029301b632f093c)) 189 | 190 | ### [5.4.1](https://github.com/unjs/hookable/compare/v5.4.0...v5.4.1) (2022-10-15) 191 | 192 | 193 | ### Bug Fixes 194 | 195 | * accept any hookable ([#53](https://github.com/unjs/hookable/issues/53)) ([0eac02c](https://github.com/unjs/hookable/commit/0eac02cc6f975990ca458a587007f3bfd33e8a95)) 196 | * allow parallel hooks with unique time strings ([#55](https://github.com/unjs/hookable/issues/55)) ([ee64dc8](https://github.com/unjs/hookable/commit/ee64dc8299d15367eb2c62806c5b96eb1f88db32)) 197 | * handle case where hook adds debugger ([#54](https://github.com/unjs/hookable/issues/54)) ([f6d4475](https://github.com/unjs/hookable/commit/f6d4475166a5941f6fba16f836c2c8e91971b974)) 198 | 199 | ## [5.4.0](https://github.com/unjs/hookable/compare/v5.3.0...v5.4.0) (2022-10-13) 200 | 201 | 202 | ### Features 203 | 204 | * add `createDebugger` utility ([#51](https://github.com/unjs/hookable/issues/51)) ([021eb34](https://github.com/unjs/hookable/commit/021eb34d999b61d8189cc1c10116252588dba34f)) 205 | 206 | ## [5.3.0](https://github.com/unjs/hookable/compare/v5.2.2...v5.3.0) (2022-09-02) 207 | 208 | 209 | ### Features 210 | 211 | * allow registering a hook without showing deprecated message ([0fcd787](https://github.com/unjs/hookable/commit/0fcd787fd2fd0fd8b660dda8706b90cc4bf14ba8)) 212 | 213 | 214 | ### Bug Fixes 215 | 216 | * show deprecation warning only once ([526e4dc](https://github.com/unjs/hookable/commit/526e4dc821e6edae51245f0cd44f0ba938719776)) 217 | 218 | ### [5.2.2](https://github.com/unjs/hookable/compare/v5.2.1...v5.2.2) (2022-08-23) 219 | 220 | 221 | ### Bug Fixes 222 | 223 | * only specify return type for `callHook`/`callHookParallel` ([ed0d6a8](https://github.com/unjs/hookable/commit/ed0d6a82d8aa11044851888ab5c71ccbe4369c69)) 224 | 225 | ### [5.2.1](https://github.com/unjs/hookable/compare/v5.2.0...v5.2.1) (2022-08-23) 226 | 227 | 228 | ### Bug Fixes 229 | 230 | * ensure calling hooks always returns a promise ([44679c8](https://github.com/unjs/hookable/commit/44679c890f7b3b92331bd5dffeac95b61eab2858)) 231 | 232 | ## [5.2.0](https://github.com/unjs/hookable/compare/v5.1.2...v5.2.0) (2022-08-23) 233 | 234 | 235 | ### Features 236 | 237 | * add `beforeEach` and `afterEach` spies ([#46](https://github.com/unjs/hookable/issues/46)) ([949d8b7](https://github.com/unjs/hookable/commit/949d8b76817dfc47e6b1ce4ed09204e7c33d0ec1)) 238 | 239 | 240 | ### Bug Fixes 241 | 242 | * deprecate hooks doesn't have to be passed all hooks ([#48](https://github.com/unjs/hookable/issues/48)) ([0c4fef0](https://github.com/unjs/hookable/commit/0c4fef0d39ccd123efca29a9506854f01ae685f7)) 243 | 244 | ### [5.1.2](https://github.com/unjs/hookable/compare/v5.1.1...v5.1.2) (2022-08-23) 245 | 246 | 247 | ### Bug Fixes 248 | 249 | * handle deprecated hooks after being registred ([23d9ff4](https://github.com/unjs/hookable/commit/23d9ff4f1313148942990e5e078d91838f78e8c2)) 250 | 251 | ### [5.1.1](https://github.com/unjs/hookable/compare/v5.1.0...v5.1.1) (2021-12-21) 252 | 253 | 254 | ### Bug Fixes 255 | 256 | * always return caller result ([e9c51df](https://github.com/unjs/hookable/commit/e9c51df612a2eb5f42cf7c2f2c3f61b2539bcfae)) 257 | 258 | ## [5.1.0](https://github.com/unjs/hookable/compare/v5.0.0...v5.1.0) (2021-12-20) 259 | 260 | 261 | ### Features 262 | 263 | * `callHookParallel` and `callHookWith` ([#35](https://github.com/unjs/hookable/issues/35)) ([4a8cc53](https://github.com/unjs/hookable/commit/4a8cc538a4fb938bfdf13d70a9158714b3d603b9)) 264 | 265 | ## [5.0.0](https://github.com/unjs/hookable/compare/v5.0.0-2...v5.0.0) (2021-09-01) 266 | 267 | 268 | ### Bug Fixes 269 | 270 | * type nested/namespaced hooks ([#32](https://github.com/unjs/hookable/issues/32)) ([a0d9146](https://github.com/unjs/hookable/commit/a0d9146c40fb9767842564225444c6c5a7dce70f)) 271 | 272 | ## [5.0.0-2](https://github.com/unjs/hookable/compare/v5.0.0-1...v5.0.0-2) (2021-08-27) 273 | 274 | 275 | ### Bug Fixes 276 | 277 | * allow type inference for `hook`, `hookOnce` and `removeHook` ([#29](https://github.com/unjs/hookable/issues/29)) ([22b74d3](https://github.com/unjs/hookable/commit/22b74d30805f35000709ba32220e6e4e059f4cc5)) 278 | 279 | ## [5.0.0-1](https://github.com/unjs/hookable/compare/v5.0.0-0...v5.0.0-1) (2021-08-27) 280 | 281 | 282 | ### Bug Fixes 283 | 284 | * allow nested hooks type to omit some hooks ([#28](https://github.com/unjs/hookable/issues/28)) ([75f2a05](https://github.com/unjs/hookable/commit/75f2a057a526d018b9cf39f01ddfd2a3d2a6bbc1)) 285 | 286 | ## [5.0.0-0](https://github.com/unjs/hookable/compare/v4.4.1...v5.0.0-0) (2021-08-26) 287 | 288 | 289 | ### ⚠ BREAKING CHANGES 290 | 291 | * You should directly handle errors with callHook 292 | * use named exports and expose createHooks 293 | * remove mergehooks from Hookable prototype 294 | * drop browser build and use exports field 295 | * improve type checking 296 | 297 | ### Features 298 | 299 | * drop browser build and use exports field ([b626770](https://github.com/unjs/hookable/commit/b626770192a62b23acc1be16b4e4eac2383e9136)) 300 | * drop logger and global error handler ([ee6ea87](https://github.com/unjs/hookable/commit/ee6ea87ad0e15a52252389b9b3112060bd411330)) 301 | * improve type checking ([c2e1e22](https://github.com/unjs/hookable/commit/c2e1e223d16e7bf87117cd8d72ad3ba211a333d8)) 302 | * use named exports and expose createHooks ([fadfcbd](https://github.com/unjs/hookable/commit/fadfcbd07c3e2fa6905d0e31deabc37fc55d8317)) 303 | 304 | 305 | * remove mergehooks from Hookable prototype ([d50af59](https://github.com/unjs/hookable/commit/d50af595d3cb05be8fb5060374f4e28b3d6259fa)) 306 | 307 | ### [4.4.1](https://github.com/unjs/hookable/compare/v4.4.0...v4.4.1) (2021-02-26) 308 | 309 | 310 | ### Bug Fixes 311 | 312 | * avoid creating extra wrapper when merging hooks ([790c1c4](https://github.com/unjs/hookable/commit/790c1c4dbbd1f7b9cb1995b40baeecead5346ed0)) 313 | 314 | ## [4.4.0](https://github.com/unjs/hookable/compare/v4.3.1...v4.4.0) (2021-01-21) 315 | 316 | 317 | ### Features 318 | 319 | * **pkg:** expose module format ([2987b09](https://github.com/unjs/hookable/commit/2987b0901e292eb4570f8141ca51cfd9d2d3f94f)) 320 | 321 | ### [4.3.1](https://github.com/unjs/hookable/compare/v4.3.0...v4.3.1) (2020-11-06) 322 | 323 | 324 | ### Bug Fixes 325 | 326 | * expose types ([0ffbaff](https://github.com/unjs/hookable/commit/0ffbaffa91d38e333e0818cd73a084cf1e8657c8)) 327 | 328 | ## [4.3.0](https://github.com/unjs/hookable/compare/v4.2.0...v4.3.0) (2020-11-06) 329 | 330 | 331 | ### Features 332 | 333 | * `mergeHooks` helper ([#26](https://github.com/unjs/hookable/issues/26)) ([8c52d03](https://github.com/unjs/hookable/commit/8c52d034aa1a40bafb13d0b847c72593c51fcba5)) 334 | 335 | ## [4.2.0](https://github.com/unjs/hookable/compare/v4.1.2...v4.2.0) (2020-10-23) 336 | 337 | 338 | ### Features 339 | 340 | * hookOnce ([225fa8a](https://github.com/unjs/hookable/commit/225fa8af85e1a504916c357f57b047143b6bc5ab)) 341 | 342 | 343 | ### Bug Fixes 344 | 345 | * typecheck for flatHooks ([7800190](https://github.com/unjs/hookable/commit/7800190feb82134be5dd089ca184a18a6644da19)) 346 | 347 | ### [4.1.2](https://github.com/unjs/hookable/compare/v4.1.1...v4.1.2) (2020-08-24) 348 | 349 | 350 | ### Bug Fixes 351 | 352 | * **build:** exclude regenerator and update target to ie 11 ([48acfc5](https://github.com/unjs/hookable/commit/48acfc5c0a4b0fb8edc6e9790b37ad336c966215)) 353 | 354 | ### [4.1.1](https://github.com/unjs/hookable/compare/v4.1.0...v4.1.1) (2020-04-28) 355 | 356 | 357 | ### Bug Fixes 358 | 359 | * **pkg:** typo in types entry name (fixes [#19](https://github.com/unjs/hookable/issues/19)) ([b9ba90f](https://github.com/unjs/hookable/commit/b9ba90fbc725097e41c430d7df4205985c2faaec)) 360 | 361 | ## [4.1.0](https://github.com/unjs/hookable/compare/v4.0.0...v4.1.0) (2020-04-17) 362 | 363 | 364 | ### Features 365 | 366 | * **types:** implement strict types ([823cdca](https://github.com/unjs/hookable/commit/823cdcac728d189b802f75faa9a361ac5ea4883d)) 367 | 368 | ## [4.0.0](https://github.com/unjs/hookable/compare/v3.0.0...v4.0.0) (2020-04-17) 369 | 370 | 371 | ### ⚠ BREAKING CHANGES 372 | 373 | * only dist and types getting published 374 | 375 | ### Features 376 | 377 | * allow disabling logger ([f8fb742](https://github.com/unjs/hookable/commit/f8fb74224f1277ec7f7d5a37bd312af7514fc962)) 378 | * allow removing registered hooks ([#16](https://github.com/unjs/hookable/issues/16)) ([4134c31](https://github.com/unjs/hookable/commit/4134c31c44256cc82cac3a7a3610ece9252431dc)) 379 | * migrate to typescript ([d63ea3e](https://github.com/unjs/hookable/commit/d63ea3e408ebea74ea3855af0c6e51880ebf9cac)) 380 | 381 | ## [3.0.0](https://github.com/unjs/hookable/compare/v2.3.0...v3.0.0) (2020-02-25) 382 | 383 | 384 | ### Bug Fixes 385 | 386 | * revert back hooks ([07f52dc](https://github.com/unjs/hookable/commit/07f52dc)) 387 | 388 | 389 | ### Features 390 | 391 | * advanced deprecation ([5b88628](https://github.com/unjs/hookable/commit/5b88628)) 392 | * bundle package ([53a2a0e](https://github.com/unjs/hookable/commit/53a2a0e)) 393 | 394 | # [2.3.0](https://github.com/unjs/hookable/compare/v2.2.1...v2.3.0) (2019-09-01) 395 | 396 | 397 | ### Features 398 | 399 | * hide deprecate warnings on production builds ([0861df3](https://github.com/unjs/hookable/commit/0861df3)) 400 | 401 | 402 | 403 | ## [2.2.1](https://github.com/unjs/hookable/compare/v2.2.0...v2.2.1) (2019-08-21) 404 | 405 | 406 | 407 | # [2.2.0](https://github.com/unjs/hookable/compare/v2.1.0...v2.2.0) (2019-08-21) 408 | 409 | 410 | ### Features 411 | 412 | * deprecateHooks ([62f2d38](https://github.com/unjs/hookable/commit/62f2d38)) 413 | 414 | 415 | 416 | # [2.1.0](https://github.com/unjs/hookable/compare/v2.0.1...v2.1.0) (2019-08-21) 417 | 418 | 419 | ### Features 420 | 421 | * optional fatal support for logger ([7c7355d](https://github.com/unjs/hookable/commit/7c7355d)) 422 | 423 | 424 | 425 | ## [2.0.1](https://github.com/unjs/hookable/compare/v2.0.0...v2.0.1) (2019-08-21) 426 | 427 | 428 | 429 | # [2.0.0](https://github.com/unjs/hookable/compare/v1.0.1...v2.0.0) (2019-08-21) 430 | 431 | 432 | ### Features 433 | 434 | * custom logger ([ada6e37](https://github.com/unjs/hookable/commit/ada6e37)) 435 | 436 | 437 | ### BREAKING CHANGES 438 | 439 | * console is replaced by consola by default 440 | 441 | 442 | 443 | ## [1.0.1](https://github.com/unjs/hookable/compare/v1.0.0...v1.0.1) (2019-03-16) 444 | 445 | 446 | ### Bug Fixes 447 | 448 | * fix package.json (2) ([7ff4ce9](https://github.com/unjs/hookable/commit/7ff4ce9)) 449 | 450 | 451 | 452 | 453 | # [1.0.0](https://github.com/unjs/hookable/compare/v0.0.7...v1.0.0) (2019-02-11) 454 | 455 | 456 | ### Features 457 | 458 | * rewrite for 1.0.0 ([88decae](https://github.com/unjs/hookable/commit/88decae)) 459 | 460 | 461 | ### BREAKING CHANGES 462 | 463 | * api change 464 | 465 | 466 | 467 | 468 | ## [0.0.7](https://github.com/pi0/hookable/compare/v0.0.6...v0.0.7) (2018-01-28) 469 | 470 | 471 | ### Bug Fixes 472 | 473 | * hook with array or falsy key ([7e90de1](https://github.com/pi0/hookable/commit/7e90de1)) 474 | 475 | 476 | ### Performance Improvements 477 | 478 | * use for in for hookObj ([3c8e2e7](https://github.com/pi0/hookable/commit/3c8e2e7)) 479 | 480 | 481 | 482 | 483 | ## [0.0.6](https://github.com/pi0/hookable/compare/v0.0.5...v0.0.6) (2018-01-26) 484 | 485 | 486 | ### Performance Improvements 487 | 488 | * reduce transpiled dist size ([df607cf](https://github.com/pi0/hookable/commit/df607cf)) 489 | 490 | 491 | 492 | 493 | ## [0.0.5](https://github.com/pi0/hookable/compare/v0.0.4...v0.0.5) (2018-01-26) 494 | 495 | 496 | ### Bug Fixes 497 | 498 | * **package:** lib ~> dist ([34a8d5c](https://github.com/pi0/hookable/commit/34a8d5c)) 499 | 500 | 501 | 502 | 503 | ## [0.0.4](https://github.com/pi0/hookable/compare/v0.0.3...v0.0.4) (2018-01-26) 504 | 505 | 506 | ### Performance Improvements 507 | 508 | * handle fn as array faster ([ec35edc](https://github.com/pi0/hookable/commit/ec35edc)) 509 | 510 | 511 | 512 | 513 | ## [0.0.3](https://github.com/pi0/hookable/compare/v0.0.2...v0.0.3) (2018-01-26) 514 | 515 | 516 | ### Bug Fixes 517 | 518 | * bind hookObj to this context ([6f6f7bc](https://github.com/pi0/hookable/commit/6f6f7bc)) 519 | 520 | 521 | ### Performance Improvements 522 | 523 | * minor refactor ([e4083aa](https://github.com/pi0/hookable/commit/e4083aa)) 524 | 525 | 526 | 527 | 528 | ## 0.0.2 (2018-01-26) 529 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/node': 12 | specifier: ^25.0.3 13 | version: 25.0.3 14 | '@vitest/coverage-v8': 15 | specifier: ^4.0.16 16 | version: 4.0.16(vitest@4.0.16(@types/node@25.0.3)(jiti@2.6.1)) 17 | changelogen: 18 | specifier: ^0.6.2 19 | version: 0.6.2(magicast@0.5.1) 20 | esbuild: 21 | specifier: ^0.27.2 22 | version: 0.27.2 23 | eslint: 24 | specifier: ^9.39.2 25 | version: 9.39.2(jiti@2.6.1) 26 | eslint-config-unjs: 27 | specifier: ^0.5.0 28 | version: 0.5.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 29 | expect-type: 30 | specifier: ^1.3.0 31 | version: 1.3.0 32 | hookable-prev: 33 | specifier: npm:hookable@^5.5.3 34 | version: hookable@5.5.3 35 | mitata: 36 | specifier: ^1.0.34 37 | version: 1.0.34 38 | obuild: 39 | specifier: ^0.4.9 40 | version: 0.4.9(magicast@0.5.1)(typescript@5.9.3) 41 | prettier: 42 | specifier: ^3.7.4 43 | version: 3.7.4 44 | typescript: 45 | specifier: ^5.9.3 46 | version: 5.9.3 47 | vite: 48 | specifier: ^7.3.0 49 | version: 7.3.0(@types/node@25.0.3)(jiti@2.6.1) 50 | vitest: 51 | specifier: ^4.0.16 52 | version: 4.0.16(@types/node@25.0.3)(jiti@2.6.1) 53 | 54 | packages: 55 | 56 | '@babel/generator@7.28.5': 57 | resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 58 | engines: {node: '>=6.9.0'} 59 | 60 | '@babel/helper-string-parser@7.27.1': 61 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 62 | engines: {node: '>=6.9.0'} 63 | 64 | '@babel/helper-validator-identifier@7.28.5': 65 | resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 66 | engines: {node: '>=6.9.0'} 67 | 68 | '@babel/parser@7.28.5': 69 | resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 70 | engines: {node: '>=6.0.0'} 71 | hasBin: true 72 | 73 | '@babel/types@7.28.5': 74 | resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 75 | engines: {node: '>=6.9.0'} 76 | 77 | '@bcoe/v8-coverage@1.0.2': 78 | resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} 79 | engines: {node: '>=18'} 80 | 81 | '@emnapi/core@1.7.1': 82 | resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} 83 | 84 | '@emnapi/runtime@1.7.1': 85 | resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} 86 | 87 | '@emnapi/wasi-threads@1.1.0': 88 | resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} 89 | 90 | '@esbuild/aix-ppc64@0.27.2': 91 | resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} 92 | engines: {node: '>=18'} 93 | cpu: [ppc64] 94 | os: [aix] 95 | 96 | '@esbuild/android-arm64@0.27.2': 97 | resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} 98 | engines: {node: '>=18'} 99 | cpu: [arm64] 100 | os: [android] 101 | 102 | '@esbuild/android-arm@0.27.2': 103 | resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} 104 | engines: {node: '>=18'} 105 | cpu: [arm] 106 | os: [android] 107 | 108 | '@esbuild/android-x64@0.27.2': 109 | resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} 110 | engines: {node: '>=18'} 111 | cpu: [x64] 112 | os: [android] 113 | 114 | '@esbuild/darwin-arm64@0.27.2': 115 | resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} 116 | engines: {node: '>=18'} 117 | cpu: [arm64] 118 | os: [darwin] 119 | 120 | '@esbuild/darwin-x64@0.27.2': 121 | resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} 122 | engines: {node: '>=18'} 123 | cpu: [x64] 124 | os: [darwin] 125 | 126 | '@esbuild/freebsd-arm64@0.27.2': 127 | resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} 128 | engines: {node: '>=18'} 129 | cpu: [arm64] 130 | os: [freebsd] 131 | 132 | '@esbuild/freebsd-x64@0.27.2': 133 | resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} 134 | engines: {node: '>=18'} 135 | cpu: [x64] 136 | os: [freebsd] 137 | 138 | '@esbuild/linux-arm64@0.27.2': 139 | resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} 140 | engines: {node: '>=18'} 141 | cpu: [arm64] 142 | os: [linux] 143 | 144 | '@esbuild/linux-arm@0.27.2': 145 | resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} 146 | engines: {node: '>=18'} 147 | cpu: [arm] 148 | os: [linux] 149 | 150 | '@esbuild/linux-ia32@0.27.2': 151 | resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} 152 | engines: {node: '>=18'} 153 | cpu: [ia32] 154 | os: [linux] 155 | 156 | '@esbuild/linux-loong64@0.27.2': 157 | resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} 158 | engines: {node: '>=18'} 159 | cpu: [loong64] 160 | os: [linux] 161 | 162 | '@esbuild/linux-mips64el@0.27.2': 163 | resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} 164 | engines: {node: '>=18'} 165 | cpu: [mips64el] 166 | os: [linux] 167 | 168 | '@esbuild/linux-ppc64@0.27.2': 169 | resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} 170 | engines: {node: '>=18'} 171 | cpu: [ppc64] 172 | os: [linux] 173 | 174 | '@esbuild/linux-riscv64@0.27.2': 175 | resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} 176 | engines: {node: '>=18'} 177 | cpu: [riscv64] 178 | os: [linux] 179 | 180 | '@esbuild/linux-s390x@0.27.2': 181 | resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} 182 | engines: {node: '>=18'} 183 | cpu: [s390x] 184 | os: [linux] 185 | 186 | '@esbuild/linux-x64@0.27.2': 187 | resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} 188 | engines: {node: '>=18'} 189 | cpu: [x64] 190 | os: [linux] 191 | 192 | '@esbuild/netbsd-arm64@0.27.2': 193 | resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} 194 | engines: {node: '>=18'} 195 | cpu: [arm64] 196 | os: [netbsd] 197 | 198 | '@esbuild/netbsd-x64@0.27.2': 199 | resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} 200 | engines: {node: '>=18'} 201 | cpu: [x64] 202 | os: [netbsd] 203 | 204 | '@esbuild/openbsd-arm64@0.27.2': 205 | resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} 206 | engines: {node: '>=18'} 207 | cpu: [arm64] 208 | os: [openbsd] 209 | 210 | '@esbuild/openbsd-x64@0.27.2': 211 | resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} 212 | engines: {node: '>=18'} 213 | cpu: [x64] 214 | os: [openbsd] 215 | 216 | '@esbuild/openharmony-arm64@0.27.2': 217 | resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} 218 | engines: {node: '>=18'} 219 | cpu: [arm64] 220 | os: [openharmony] 221 | 222 | '@esbuild/sunos-x64@0.27.2': 223 | resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} 224 | engines: {node: '>=18'} 225 | cpu: [x64] 226 | os: [sunos] 227 | 228 | '@esbuild/win32-arm64@0.27.2': 229 | resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} 230 | engines: {node: '>=18'} 231 | cpu: [arm64] 232 | os: [win32] 233 | 234 | '@esbuild/win32-ia32@0.27.2': 235 | resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} 236 | engines: {node: '>=18'} 237 | cpu: [ia32] 238 | os: [win32] 239 | 240 | '@esbuild/win32-x64@0.27.2': 241 | resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} 242 | engines: {node: '>=18'} 243 | cpu: [x64] 244 | os: [win32] 245 | 246 | '@eslint-community/eslint-utils@4.9.0': 247 | resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 248 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 249 | peerDependencies: 250 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 251 | 252 | '@eslint-community/regexpp@4.12.2': 253 | resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 254 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 255 | 256 | '@eslint/config-array@0.21.1': 257 | resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 258 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 259 | 260 | '@eslint/config-helpers@0.4.2': 261 | resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 262 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 263 | 264 | '@eslint/core@0.13.0': 265 | resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} 266 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 267 | 268 | '@eslint/core@0.17.0': 269 | resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 270 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 271 | 272 | '@eslint/eslintrc@3.3.3': 273 | resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} 274 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 275 | 276 | '@eslint/js@9.39.2': 277 | resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} 278 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 279 | 280 | '@eslint/object-schema@2.1.7': 281 | resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 282 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 283 | 284 | '@eslint/plugin-kit@0.2.8': 285 | resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} 286 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 287 | 288 | '@eslint/plugin-kit@0.4.1': 289 | resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 290 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 291 | 292 | '@humanfs/core@0.19.1': 293 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 294 | engines: {node: '>=18.18.0'} 295 | 296 | '@humanfs/node@0.16.7': 297 | resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 298 | engines: {node: '>=18.18.0'} 299 | 300 | '@humanwhocodes/module-importer@1.0.1': 301 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 302 | engines: {node: '>=12.22'} 303 | 304 | '@humanwhocodes/retry@0.4.3': 305 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 306 | engines: {node: '>=18.18'} 307 | 308 | '@jridgewell/gen-mapping@0.3.13': 309 | resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 310 | 311 | '@jridgewell/resolve-uri@3.1.2': 312 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 313 | engines: {node: '>=6.0.0'} 314 | 315 | '@jridgewell/sourcemap-codec@1.5.5': 316 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 317 | 318 | '@jridgewell/trace-mapping@0.3.31': 319 | resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 320 | 321 | '@napi-rs/wasm-runtime@1.1.0': 322 | resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} 323 | 324 | '@oxc-minify/binding-android-arm64@0.103.0': 325 | resolution: {integrity: sha512-6VLDV9zV7TI16hpnUUPaLsFW/J4o0PTL5Cu4O4bYjShEHmovKEv2FKwPF/RDEIKbUfzyNeD8aw/RjZMI7zQo7g==} 326 | engines: {node: ^20.19.0 || >=22.12.0} 327 | cpu: [arm64] 328 | os: [android] 329 | 330 | '@oxc-minify/binding-darwin-arm64@0.103.0': 331 | resolution: {integrity: sha512-FHT8y7mS2tt4pYpi7/x4xiR+JUylzCCLTSeeaPs3cKU56Go/d7xr1igOZsGSSoPrcQ8wJUbHZgFeChza0YcSnA==} 332 | engines: {node: ^20.19.0 || >=22.12.0} 333 | cpu: [arm64] 334 | os: [darwin] 335 | 336 | '@oxc-minify/binding-darwin-x64@0.103.0': 337 | resolution: {integrity: sha512-CBVGkpSR89gT2tl3XFaeC2VHZPo5kwg0EJvxhNZJakelEutLVTvigjLhji11ZhfkdBTvSf6YXSjB16uEWXJCzQ==} 338 | engines: {node: ^20.19.0 || >=22.12.0} 339 | cpu: [x64] 340 | os: [darwin] 341 | 342 | '@oxc-minify/binding-freebsd-x64@0.103.0': 343 | resolution: {integrity: sha512-2s7LrXwmoKeDXx3hCrP7GtqZ86m76o8JhXPU5VW+aK/VDi3+zDhF3bAsyQXEzX3nCk8TQ+vslJTJ0/IQL3F7zw==} 344 | engines: {node: ^20.19.0 || >=22.12.0} 345 | cpu: [x64] 346 | os: [freebsd] 347 | 348 | '@oxc-minify/binding-linux-arm-gnueabihf@0.103.0': 349 | resolution: {integrity: sha512-xjDt5CD4noAwiWj2N6aZlLsu2c2WspTpz3U2cjVIzUizUytmXRQODRWK4elrIpEY7NSpInWiwcS20GHd7bf+lA==} 350 | engines: {node: ^20.19.0 || >=22.12.0} 351 | cpu: [arm] 352 | os: [linux] 353 | 354 | '@oxc-minify/binding-linux-arm64-gnu@0.103.0': 355 | resolution: {integrity: sha512-pHVWL54stumiS4vedm31jCE5zVn6V9ccgQ39aJ1w9mpy/3Fk6ytBAnLY+wCyf9UyBAeXOYo0ACBdF9FSH9xIxA==} 356 | engines: {node: ^20.19.0 || >=22.12.0} 357 | cpu: [arm64] 358 | os: [linux] 359 | 360 | '@oxc-minify/binding-linux-arm64-musl@0.103.0': 361 | resolution: {integrity: sha512-hZ3QtHIYWn0d0nrZxiaeKL9GPNxsCXZLxZOfqtRha/ogjGpSLtz76WfkYY988Gvx0dIOQJN26sWhpilV+2YWFA==} 362 | engines: {node: ^20.19.0 || >=22.12.0} 363 | cpu: [arm64] 364 | os: [linux] 365 | 366 | '@oxc-minify/binding-linux-riscv64-gnu@0.103.0': 367 | resolution: {integrity: sha512-JQZvQQlv3vsC3Vwh/VncCX8G7Z8S9bF7lWcKW7RcL6mtRwEX3N5c6MuS0Hn3LUoI8ZStkX/nSggv4uidgeBvlQ==} 368 | engines: {node: ^20.19.0 || >=22.12.0} 369 | cpu: [riscv64] 370 | os: [linux] 371 | 372 | '@oxc-minify/binding-linux-s390x-gnu@0.103.0': 373 | resolution: {integrity: sha512-Szk3Ol6RS9CtRz38c3vEzck0FUo+B4L7miMTPnq/ShiEoCzgKumg0X7HhBSNurjmBIHDxbcxSlsyqx+V5ff2hw==} 374 | engines: {node: ^20.19.0 || >=22.12.0} 375 | cpu: [s390x] 376 | os: [linux] 377 | 378 | '@oxc-minify/binding-linux-x64-gnu@0.103.0': 379 | resolution: {integrity: sha512-ER2l+4vVeoZS210bT+ZfL1iHMbwF8i+0Gdkr1N8hlRx6UnMgbCqbAhuwl1En27rgpdwVytbd6a/iTI2EbXUtTQ==} 380 | engines: {node: ^20.19.0 || >=22.12.0} 381 | cpu: [x64] 382 | os: [linux] 383 | 384 | '@oxc-minify/binding-linux-x64-musl@0.103.0': 385 | resolution: {integrity: sha512-Pr/oiEEMwYmozfyCyb4rFyu+u/NOgbYM9InNtgB9qRREtiMiT3VB/nTaVmcqp3HIlDDA48tChbq2pbhm29RgPg==} 386 | engines: {node: ^20.19.0 || >=22.12.0} 387 | cpu: [x64] 388 | os: [linux] 389 | 390 | '@oxc-minify/binding-openharmony-arm64@0.103.0': 391 | resolution: {integrity: sha512-1gR6vdSk8f3CWPAHWJzi47bEvG6eSIH3AuvBBKlfXvbwcvUTByQzrHrWhRPv0i2vFXPtqRk+OuFamluFzEatFw==} 392 | engines: {node: ^20.19.0 || >=22.12.0} 393 | cpu: [arm64] 394 | os: [openharmony] 395 | 396 | '@oxc-minify/binding-wasm32-wasi@0.103.0': 397 | resolution: {integrity: sha512-MiurL8lTNsh+IcVzG1KT0MyYE8RdA2xr6nUS2gojeWWMix9MbJtZemP55+mLFKb/4CepsyrpxeFmQX5rIYleTQ==} 398 | engines: {node: '>=14.0.0'} 399 | cpu: [wasm32] 400 | 401 | '@oxc-minify/binding-win32-arm64-msvc@0.103.0': 402 | resolution: {integrity: sha512-o2MXkH/psdjoKN46IgsJuqIy0uAuxk21YYqxW0VDVrP9PnGEXi+Tq9MawW4uIPWfa8h3s70RQz8AGx9jrwvwKA==} 403 | engines: {node: ^20.19.0 || >=22.12.0} 404 | cpu: [arm64] 405 | os: [win32] 406 | 407 | '@oxc-minify/binding-win32-x64-msvc@0.103.0': 408 | resolution: {integrity: sha512-tnVwRbhiYOkyusMdHr7kQt6V+/cF6pEaDR9QQXVNyRk2mbfEmSZ5wPO9S2R+UxfpgsWX6z0wiZ022TPZXM0uQA==} 409 | engines: {node: ^20.19.0 || >=22.12.0} 410 | cpu: [x64] 411 | os: [win32] 412 | 413 | '@oxc-parser/binding-android-arm64@0.103.0': 414 | resolution: {integrity: sha512-btjkdfjWBKgGSKGd1aHFvh7hbywKDddTJ7e0vwo0l46pgx5HqvRVxs9yH4HQDMe13a2dsLu2mfuLLPbYKxmxhw==} 415 | engines: {node: ^20.19.0 || >=22.12.0} 416 | cpu: [arm64] 417 | os: [android] 418 | 419 | '@oxc-parser/binding-darwin-arm64@0.103.0': 420 | resolution: {integrity: sha512-RBGHvJn8qgTeYXP0nEjwhdMVzgIMlXF4fpkBowdmLLmkz0zaHTbzztthxNpTPwt176Ci/i2Cpzox8lEPAqx2LA==} 421 | engines: {node: ^20.19.0 || >=22.12.0} 422 | cpu: [arm64] 423 | os: [darwin] 424 | 425 | '@oxc-parser/binding-darwin-x64@0.103.0': 426 | resolution: {integrity: sha512-Ta2Jr8OLuZTMGR+liW8kZ0mPYbocZT8uHhLEtXSPP08yaRumKk5PvhXLbgi8LUv8TSBNBvtNTTAqH64Eu7Yekw==} 427 | engines: {node: ^20.19.0 || >=22.12.0} 428 | cpu: [x64] 429 | os: [darwin] 430 | 431 | '@oxc-parser/binding-freebsd-x64@0.103.0': 432 | resolution: {integrity: sha512-bwkHaL3FAN/z94ogrvCja2X7dlHylsdR+eoJuvZNwdxBXhDAKfuITddUGB7m9IrY/SGp+ZFeo/rmx3DRfQr4eA==} 433 | engines: {node: ^20.19.0 || >=22.12.0} 434 | cpu: [x64] 435 | os: [freebsd] 436 | 437 | '@oxc-parser/binding-linux-arm-gnueabihf@0.103.0': 438 | resolution: {integrity: sha512-na7LZY6HHTVG0Q6zwmxRfiGmbvfxKFIZVYYqHlNPzI24jiNWYKoe48A/a9WBX0E/kUkWTPN6BqiRzMW7/m5dDw==} 439 | engines: {node: ^20.19.0 || >=22.12.0} 440 | cpu: [arm] 441 | os: [linux] 442 | 443 | '@oxc-parser/binding-linux-arm64-gnu@0.103.0': 444 | resolution: {integrity: sha512-eMOvMOm4SWIDR67Qh+2PDlCzF/XhBrH4H+YS59Op4aFTqiqceLkhEcikG+qprU04lBJekk6ANxMamTNFqnOnww==} 445 | engines: {node: ^20.19.0 || >=22.12.0} 446 | cpu: [arm64] 447 | os: [linux] 448 | 449 | '@oxc-parser/binding-linux-arm64-musl@0.103.0': 450 | resolution: {integrity: sha512-npWj8sdgDAUN9wGYUtRrOMd2SX7Y2gC37Iq3J4jrWrQiLXAkYGhs6fewHqaqOuvixBO7IlLkR20uBs6/k6PCkQ==} 451 | engines: {node: ^20.19.0 || >=22.12.0} 452 | cpu: [arm64] 453 | os: [linux] 454 | 455 | '@oxc-parser/binding-linux-riscv64-gnu@0.103.0': 456 | resolution: {integrity: sha512-quu8yliGNpt2IXgFPJlDIvuBneAWgPjTgl4yAc3HACwqA8/C6kGnYtC31NgEifbi4MM1aIQgx++snv+nUPEA+A==} 457 | engines: {node: ^20.19.0 || >=22.12.0} 458 | cpu: [riscv64] 459 | os: [linux] 460 | 461 | '@oxc-parser/binding-linux-s390x-gnu@0.103.0': 462 | resolution: {integrity: sha512-Vxq8AdcGs8vnjpFyP5hiwUnDKStBrRCR3QyOYKhLnPqGgmCKgGUnht7wm/Y+yif/eC/O2qCigy6J+4ycPKBguA==} 463 | engines: {node: ^20.19.0 || >=22.12.0} 464 | cpu: [s390x] 465 | os: [linux] 466 | 467 | '@oxc-parser/binding-linux-x64-gnu@0.103.0': 468 | resolution: {integrity: sha512-04kgCg2qypEFi53ITpNgYj/uBLvmRjLuCzowIwIUTeyTBcGYRsp8w3IcHcD9PEtbfzoig6z5kO/b98GEMztw4g==} 469 | engines: {node: ^20.19.0 || >=22.12.0} 470 | cpu: [x64] 471 | os: [linux] 472 | 473 | '@oxc-parser/binding-linux-x64-musl@0.103.0': 474 | resolution: {integrity: sha512-OX1jRWdK1uGlTpffqfmdx9AOtP70lxJwUPm36ikkCNiNB4tJhZVgb9XC33jdU6UGmD/iVWovdxmLCYVjzAG7Iw==} 475 | engines: {node: ^20.19.0 || >=22.12.0} 476 | cpu: [x64] 477 | os: [linux] 478 | 479 | '@oxc-parser/binding-openharmony-arm64@0.103.0': 480 | resolution: {integrity: sha512-2eXKmhjLzKOAFoMuRSL946xULU0M03VFQ2oYx07Fo+0JO5NXx6ZxQF/ccC5O4XAnB1g0RJtfKRYDwnhHJ4m1Lw==} 481 | engines: {node: ^20.19.0 || >=22.12.0} 482 | cpu: [arm64] 483 | os: [openharmony] 484 | 485 | '@oxc-parser/binding-wasm32-wasi@0.103.0': 486 | resolution: {integrity: sha512-sJ2D8YNJKBoNKwH1gsr3gd9CcOWDlWc0mhq4f0GIcq6gkJJ3LieZefED1g8nUKV21Utb4I5i02/9Ia2pbpkc7Q==} 487 | engines: {node: '>=14.0.0'} 488 | cpu: [wasm32] 489 | 490 | '@oxc-parser/binding-win32-arm64-msvc@0.103.0': 491 | resolution: {integrity: sha512-4jpNRvrfWGpPXI2hMJE5UgRoI7npQ9Ydu4csGs32DDX6sYTK7H14Z1BW+gm/kW3VR0gIw9xhlUiu/4ONcjAwhg==} 492 | engines: {node: ^20.19.0 || >=22.12.0} 493 | cpu: [arm64] 494 | os: [win32] 495 | 496 | '@oxc-parser/binding-win32-x64-msvc@0.103.0': 497 | resolution: {integrity: sha512-WV3Y/v/oZUSgb6BokUCCdU8/JPBE7UAP6LletpzhB60bjgepV83iaOIUOuhtDzTfwYZ88Y+6CtVFkLnz037gvg==} 498 | engines: {node: ^20.19.0 || >=22.12.0} 499 | cpu: [x64] 500 | os: [win32] 501 | 502 | '@oxc-project/types@0.103.0': 503 | resolution: {integrity: sha512-bkiYX5kaXWwUessFRSoXFkGIQTmc6dLGdxuRTrC+h8PSnIdZyuXHHlLAeTmOue5Br/a0/a7dHH0Gca6eXn9MKg==} 504 | 505 | '@oxc-transform/binding-android-arm64@0.103.0': 506 | resolution: {integrity: sha512-Lw6LN9AI6Ral+Q/qa/lUKziqnM5DU/GajfGKJyeLdajp0lHlGEC4caCXMBpgcAlhEvQM5p+EorXFMexm+eb9MA==} 507 | engines: {node: ^20.19.0 || >=22.12.0} 508 | cpu: [arm64] 509 | os: [android] 510 | 511 | '@oxc-transform/binding-darwin-arm64@0.103.0': 512 | resolution: {integrity: sha512-7l5ablOg7DaDW4CCfVokXfZscmRT0oVrEjA9wGSdBbAtiLCQMgiR4tMKoZ/JCUSRvYoItJJFCVi25Enu4ZJ4EA==} 513 | engines: {node: ^20.19.0 || >=22.12.0} 514 | cpu: [arm64] 515 | os: [darwin] 516 | 517 | '@oxc-transform/binding-darwin-x64@0.103.0': 518 | resolution: {integrity: sha512-0NZhL2etAONmGJ1gi6UtohcPLrD18R3Yk0qTdPCgBWARDu6h8EiKijCiqFe2ioocPkStycOP+rJnCCp1ENlIkg==} 519 | engines: {node: ^20.19.0 || >=22.12.0} 520 | cpu: [x64] 521 | os: [darwin] 522 | 523 | '@oxc-transform/binding-freebsd-x64@0.103.0': 524 | resolution: {integrity: sha512-PeKCsolEr4NiZvfWvK8MdsXBFHwd3/mnTRypDJAfJSLaMoUux+ZW5ZJqlGeqpkkBf/BY5VsEAgwaDbGfnk9+bQ==} 525 | engines: {node: ^20.19.0 || >=22.12.0} 526 | cpu: [x64] 527 | os: [freebsd] 528 | 529 | '@oxc-transform/binding-linux-arm-gnueabihf@0.103.0': 530 | resolution: {integrity: sha512-gg4AhLlm6kcORTMHNkRpHO53Pu/slYhch7KDtbbixBCaNRo7Bjx2gSWTourDgirvsOfi9uTuVX9BD5zRMepoFA==} 531 | engines: {node: ^20.19.0 || >=22.12.0} 532 | cpu: [arm] 533 | os: [linux] 534 | 535 | '@oxc-transform/binding-linux-arm64-gnu@0.103.0': 536 | resolution: {integrity: sha512-X6Wz35DvgBwnSI8bfXJoV7AMFErkZqj1JMLNWOSFFnpO2I7n8ZBPPMiqXSdtQXgEPiym043XvugeNRSGXoGBZA==} 537 | engines: {node: ^20.19.0 || >=22.12.0} 538 | cpu: [arm64] 539 | os: [linux] 540 | 541 | '@oxc-transform/binding-linux-arm64-musl@0.103.0': 542 | resolution: {integrity: sha512-ZEDf0jlI4StFBZ0bYGUCW75Tqv+RUldBGpJciAAVXwmMlZsTGEayVuVgBthjy1zJk+J9D6I9eFQSleotOodpSg==} 543 | engines: {node: ^20.19.0 || >=22.12.0} 544 | cpu: [arm64] 545 | os: [linux] 546 | 547 | '@oxc-transform/binding-linux-riscv64-gnu@0.103.0': 548 | resolution: {integrity: sha512-OCzPRbqNQllD/nXfxqNbQPZU9S6QMD3aatCTzls3OLCWS4YUvApoNmVEU2odRkRXAQ4exptiK0Mu3bdIcJDQ1Q==} 549 | engines: {node: ^20.19.0 || >=22.12.0} 550 | cpu: [riscv64] 551 | os: [linux] 552 | 553 | '@oxc-transform/binding-linux-s390x-gnu@0.103.0': 554 | resolution: {integrity: sha512-OE4EdHFjtx6zx5CaSOENjNEpL91mcFM1BJikgHmh807HXxGt7C08zk3pcRHVynAuZR34NHh8bigYpymh8xad6w==} 555 | engines: {node: ^20.19.0 || >=22.12.0} 556 | cpu: [s390x] 557 | os: [linux] 558 | 559 | '@oxc-transform/binding-linux-x64-gnu@0.103.0': 560 | resolution: {integrity: sha512-c4pi2u5czOFltNY4ybZSMGWDrdIIT+F4PqFhLWAZ82iaUWJClW0JaffURsLb92DgzvB9pJNvMm/6ujOC+nSXrw==} 561 | engines: {node: ^20.19.0 || >=22.12.0} 562 | cpu: [x64] 563 | os: [linux] 564 | 565 | '@oxc-transform/binding-linux-x64-musl@0.103.0': 566 | resolution: {integrity: sha512-SkmHV88mF54mIqwhCxkxfbkTjdsic3DpSx2pnqK0S62LXoUVQ/EgjlH/VZcK/KQDHK8tjewdcCK8fs2PVynxsg==} 567 | engines: {node: ^20.19.0 || >=22.12.0} 568 | cpu: [x64] 569 | os: [linux] 570 | 571 | '@oxc-transform/binding-openharmony-arm64@0.103.0': 572 | resolution: {integrity: sha512-AUx3/9QgqSH8uD+3A+a1L6cAk7aYeNLguE78UuVpkHfcXJ21JfhiQ/LZk9zRFgvu7VBQ+4J194OVgJanPl0OhA==} 573 | engines: {node: ^20.19.0 || >=22.12.0} 574 | cpu: [arm64] 575 | os: [openharmony] 576 | 577 | '@oxc-transform/binding-wasm32-wasi@0.103.0': 578 | resolution: {integrity: sha512-SnVXf64oLI980zXLOJe0MOWTkjvqnJVKbonmSVRRGC6v1fHUKBmvYtYkYcjgGzul3U+bikCFjSeVqxmLdEq+Zw==} 579 | engines: {node: '>=14.0.0'} 580 | cpu: [wasm32] 581 | 582 | '@oxc-transform/binding-win32-arm64-msvc@0.103.0': 583 | resolution: {integrity: sha512-i4qCYGMV0WQ5gZ5AOGAQFxLM2LktBUr8hamJqWHb/9SQo7sRLYSl8asmQtWuo8UgPl+v/UalVKPOFiaLOvwHmQ==} 584 | engines: {node: ^20.19.0 || >=22.12.0} 585 | cpu: [arm64] 586 | os: [win32] 587 | 588 | '@oxc-transform/binding-win32-x64-msvc@0.103.0': 589 | resolution: {integrity: sha512-+/5iMDAhWlVfj4HKhC2JuZMOi3BkIMQhMocDOiDP9tmEhbmQY99bGBuFZyJdEmWaeqDoa7L71Cec20o47jdzxw==} 590 | engines: {node: ^20.19.0 || >=22.12.0} 591 | cpu: [x64] 592 | os: [win32] 593 | 594 | '@rolldown/binding-android-arm64@1.0.0-beta.55': 595 | resolution: {integrity: sha512-5cPpHdO+zp+klznZnIHRO1bMHDq5hS9cqXodEKAaa/dQTPDjnE91OwAsy3o1gT2x4QaY8NzdBXAvutYdaw0WeA==} 596 | engines: {node: ^20.19.0 || >=22.12.0} 597 | cpu: [arm64] 598 | os: [android] 599 | 600 | '@rolldown/binding-darwin-arm64@1.0.0-beta.55': 601 | resolution: {integrity: sha512-l0887CGU2SXZr0UJmeEcXSvtDCOhDTTYXuoWbhrEJ58YQhQk24EVhDhHMTyjJb1PBRniUgNc1G0T51eF8z+TWw==} 602 | engines: {node: ^20.19.0 || >=22.12.0} 603 | cpu: [arm64] 604 | os: [darwin] 605 | 606 | '@rolldown/binding-darwin-x64@1.0.0-beta.55': 607 | resolution: {integrity: sha512-d7qP2AVYzN0tYIP4vJ7nmr26xvmlwdkLD/jWIc9Z9dqh5y0UGPigO3m5eHoHq9BNazmwdD9WzDHbQZyXFZjgtA==} 608 | engines: {node: ^20.19.0 || >=22.12.0} 609 | cpu: [x64] 610 | os: [darwin] 611 | 612 | '@rolldown/binding-freebsd-x64@1.0.0-beta.55': 613 | resolution: {integrity: sha512-j311E4NOB0VMmXHoDDZhrWidUf7L/Sa6bu/+i2cskvHKU40zcUNPSYeD2YiO2MX+hhDFa5bJwhliYfs+bTrSZw==} 614 | engines: {node: ^20.19.0 || >=22.12.0} 615 | cpu: [x64] 616 | os: [freebsd] 617 | 618 | '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.55': 619 | resolution: {integrity: sha512-lAsaYWhfNTW2A/9O7zCpb5eIJBrFeNEatOS/DDOZ5V/95NHy50g4b/5ViCqchfyFqRb7MKUR18/+xWkIcDkeIw==} 620 | engines: {node: ^20.19.0 || >=22.12.0} 621 | cpu: [arm] 622 | os: [linux] 623 | 624 | '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.55': 625 | resolution: {integrity: sha512-2x6ffiVLZrQv7Xii9+JdtyT1U3bQhKj59K3eRnYlrXsKyjkjfmiDUVx2n+zSyijisUqD62fcegmx2oLLfeTkCA==} 626 | engines: {node: ^20.19.0 || >=22.12.0} 627 | cpu: [arm64] 628 | os: [linux] 629 | 630 | '@rolldown/binding-linux-arm64-musl@1.0.0-beta.55': 631 | resolution: {integrity: sha512-QbNncvqAXziya5wleI+OJvmceEE15vE4yn4qfbI/hwT/+8ZcqxyfRZOOh62KjisXxp4D0h3JZspycXYejxAU3w==} 632 | engines: {node: ^20.19.0 || >=22.12.0} 633 | cpu: [arm64] 634 | os: [linux] 635 | 636 | '@rolldown/binding-linux-x64-gnu@1.0.0-beta.55': 637 | resolution: {integrity: sha512-YZCTZZM+rujxwVc6A+QZaNMJXVtmabmFYLG2VGQTKaBfYGvBKUgtbMEttnp/oZ88BMi2DzadBVhOmfQV8SuHhw==} 638 | engines: {node: ^20.19.0 || >=22.12.0} 639 | cpu: [x64] 640 | os: [linux] 641 | 642 | '@rolldown/binding-linux-x64-musl@1.0.0-beta.55': 643 | resolution: {integrity: sha512-28q9OQ/DDpFh2keS4BVAlc3N65/wiqKbk5K1pgLdu/uWbKa8hgUJofhXxqO+a+Ya2HVTUuYHneWsI2u+eu3N5Q==} 644 | engines: {node: ^20.19.0 || >=22.12.0} 645 | cpu: [x64] 646 | os: [linux] 647 | 648 | '@rolldown/binding-openharmony-arm64@1.0.0-beta.55': 649 | resolution: {integrity: sha512-LiCA4BjCnm49B+j1lFzUtlC+4ZphBv0d0g5VqrEJua/uyv9Ey1v9tiaMql1C8c0TVSNDUmrkfHQ71vuQC7YfpQ==} 650 | engines: {node: ^20.19.0 || >=22.12.0} 651 | cpu: [arm64] 652 | os: [openharmony] 653 | 654 | '@rolldown/binding-wasm32-wasi@1.0.0-beta.55': 655 | resolution: {integrity: sha512-nZ76tY7T0Oe8vamz5Cv5CBJvrqeQxwj1WaJ2GxX8Msqs0zsQMMcvoyxOf0glnJlxxgKjtoBxAOxaAU8ERbW6Tg==} 656 | engines: {node: '>=14.0.0'} 657 | cpu: [wasm32] 658 | 659 | '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.55': 660 | resolution: {integrity: sha512-TFVVfLfhL1G+pWspYAgPK/FSqjiBtRKYX9hixfs508QVEZPQlubYAepHPA7kEa6lZXYj5ntzF87KC6RNhxo+ew==} 661 | engines: {node: ^20.19.0 || >=22.12.0} 662 | cpu: [arm64] 663 | os: [win32] 664 | 665 | '@rolldown/binding-win32-x64-msvc@1.0.0-beta.55': 666 | resolution: {integrity: sha512-j1WBlk0p+ISgLzMIgl0xHp1aBGXenoK2+qWYc/wil2Vse7kVOdFq9aeQ8ahK6/oxX2teQ5+eDvgjdywqTL+daA==} 667 | engines: {node: ^20.19.0 || >=22.12.0} 668 | cpu: [x64] 669 | os: [win32] 670 | 671 | '@rolldown/pluginutils@1.0.0-beta.55': 672 | resolution: {integrity: sha512-vajw/B3qoi7aYnnD4BQ4VoCcXQWnF0roSwE2iynbNxgW4l9mFwtLmLmUhpDdcTBfKyZm1p/T0D13qG94XBLohA==} 673 | 674 | '@rollup/rollup-android-arm-eabi@4.53.5': 675 | resolution: {integrity: sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==} 676 | cpu: [arm] 677 | os: [android] 678 | 679 | '@rollup/rollup-android-arm64@4.53.5': 680 | resolution: {integrity: sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==} 681 | cpu: [arm64] 682 | os: [android] 683 | 684 | '@rollup/rollup-darwin-arm64@4.53.5': 685 | resolution: {integrity: sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==} 686 | cpu: [arm64] 687 | os: [darwin] 688 | 689 | '@rollup/rollup-darwin-x64@4.53.5': 690 | resolution: {integrity: sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==} 691 | cpu: [x64] 692 | os: [darwin] 693 | 694 | '@rollup/rollup-freebsd-arm64@4.53.5': 695 | resolution: {integrity: sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==} 696 | cpu: [arm64] 697 | os: [freebsd] 698 | 699 | '@rollup/rollup-freebsd-x64@4.53.5': 700 | resolution: {integrity: sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==} 701 | cpu: [x64] 702 | os: [freebsd] 703 | 704 | '@rollup/rollup-linux-arm-gnueabihf@4.53.5': 705 | resolution: {integrity: sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==} 706 | cpu: [arm] 707 | os: [linux] 708 | 709 | '@rollup/rollup-linux-arm-musleabihf@4.53.5': 710 | resolution: {integrity: sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==} 711 | cpu: [arm] 712 | os: [linux] 713 | 714 | '@rollup/rollup-linux-arm64-gnu@4.53.5': 715 | resolution: {integrity: sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==} 716 | cpu: [arm64] 717 | os: [linux] 718 | 719 | '@rollup/rollup-linux-arm64-musl@4.53.5': 720 | resolution: {integrity: sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==} 721 | cpu: [arm64] 722 | os: [linux] 723 | 724 | '@rollup/rollup-linux-loong64-gnu@4.53.5': 725 | resolution: {integrity: sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==} 726 | cpu: [loong64] 727 | os: [linux] 728 | 729 | '@rollup/rollup-linux-ppc64-gnu@4.53.5': 730 | resolution: {integrity: sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==} 731 | cpu: [ppc64] 732 | os: [linux] 733 | 734 | '@rollup/rollup-linux-riscv64-gnu@4.53.5': 735 | resolution: {integrity: sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==} 736 | cpu: [riscv64] 737 | os: [linux] 738 | 739 | '@rollup/rollup-linux-riscv64-musl@4.53.5': 740 | resolution: {integrity: sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==} 741 | cpu: [riscv64] 742 | os: [linux] 743 | 744 | '@rollup/rollup-linux-s390x-gnu@4.53.5': 745 | resolution: {integrity: sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==} 746 | cpu: [s390x] 747 | os: [linux] 748 | 749 | '@rollup/rollup-linux-x64-gnu@4.53.5': 750 | resolution: {integrity: sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==} 751 | cpu: [x64] 752 | os: [linux] 753 | 754 | '@rollup/rollup-linux-x64-musl@4.53.5': 755 | resolution: {integrity: sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==} 756 | cpu: [x64] 757 | os: [linux] 758 | 759 | '@rollup/rollup-openharmony-arm64@4.53.5': 760 | resolution: {integrity: sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==} 761 | cpu: [arm64] 762 | os: [openharmony] 763 | 764 | '@rollup/rollup-win32-arm64-msvc@4.53.5': 765 | resolution: {integrity: sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==} 766 | cpu: [arm64] 767 | os: [win32] 768 | 769 | '@rollup/rollup-win32-ia32-msvc@4.53.5': 770 | resolution: {integrity: sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==} 771 | cpu: [ia32] 772 | os: [win32] 773 | 774 | '@rollup/rollup-win32-x64-gnu@4.53.5': 775 | resolution: {integrity: sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==} 776 | cpu: [x64] 777 | os: [win32] 778 | 779 | '@rollup/rollup-win32-x64-msvc@4.53.5': 780 | resolution: {integrity: sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==} 781 | cpu: [x64] 782 | os: [win32] 783 | 784 | '@standard-schema/spec@1.1.0': 785 | resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} 786 | 787 | '@tybys/wasm-util@0.10.1': 788 | resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} 789 | 790 | '@types/chai@5.2.3': 791 | resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} 792 | 793 | '@types/deep-eql@4.0.2': 794 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 795 | 796 | '@types/estree@1.0.8': 797 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 798 | 799 | '@types/json-schema@7.0.15': 800 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 801 | 802 | '@types/mdast@3.0.15': 803 | resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} 804 | 805 | '@types/node@25.0.3': 806 | resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} 807 | 808 | '@types/unist@2.0.11': 809 | resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} 810 | 811 | '@typescript-eslint/eslint-plugin@8.50.0': 812 | resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==} 813 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 814 | peerDependencies: 815 | '@typescript-eslint/parser': ^8.50.0 816 | eslint: ^8.57.0 || ^9.0.0 817 | typescript: '>=4.8.4 <6.0.0' 818 | 819 | '@typescript-eslint/parser@8.50.0': 820 | resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==} 821 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 822 | peerDependencies: 823 | eslint: ^8.57.0 || ^9.0.0 824 | typescript: '>=4.8.4 <6.0.0' 825 | 826 | '@typescript-eslint/project-service@8.50.0': 827 | resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==} 828 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 829 | peerDependencies: 830 | typescript: '>=4.8.4 <6.0.0' 831 | 832 | '@typescript-eslint/scope-manager@8.50.0': 833 | resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==} 834 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 835 | 836 | '@typescript-eslint/tsconfig-utils@8.50.0': 837 | resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==} 838 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 839 | peerDependencies: 840 | typescript: '>=4.8.4 <6.0.0' 841 | 842 | '@typescript-eslint/type-utils@8.50.0': 843 | resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==} 844 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 845 | peerDependencies: 846 | eslint: ^8.57.0 || ^9.0.0 847 | typescript: '>=4.8.4 <6.0.0' 848 | 849 | '@typescript-eslint/types@8.50.0': 850 | resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==} 851 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 852 | 853 | '@typescript-eslint/typescript-estree@8.50.0': 854 | resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==} 855 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 856 | peerDependencies: 857 | typescript: '>=4.8.4 <6.0.0' 858 | 859 | '@typescript-eslint/utils@8.50.0': 860 | resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==} 861 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 862 | peerDependencies: 863 | eslint: ^8.57.0 || ^9.0.0 864 | typescript: '>=4.8.4 <6.0.0' 865 | 866 | '@typescript-eslint/visitor-keys@8.50.0': 867 | resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==} 868 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 869 | 870 | '@vitest/coverage-v8@4.0.16': 871 | resolution: {integrity: sha512-2rNdjEIsPRzsdu6/9Eq0AYAzYdpP6Bx9cje9tL3FE5XzXRQF1fNU9pe/1yE8fCrS0HD+fBtt6gLPh6LI57tX7A==} 872 | peerDependencies: 873 | '@vitest/browser': 4.0.16 874 | vitest: 4.0.16 875 | peerDependenciesMeta: 876 | '@vitest/browser': 877 | optional: true 878 | 879 | '@vitest/expect@4.0.16': 880 | resolution: {integrity: sha512-eshqULT2It7McaJkQGLkPjPjNph+uevROGuIMJdG3V+0BSR2w9u6J9Lwu+E8cK5TETlfou8GRijhafIMhXsimA==} 881 | 882 | '@vitest/mocker@4.0.16': 883 | resolution: {integrity: sha512-yb6k4AZxJTB+q9ycAvsoxGn+j/po0UaPgajllBgt1PzoMAAmJGYFdDk0uCcRcxb3BrME34I6u8gHZTQlkqSZpg==} 884 | peerDependencies: 885 | msw: ^2.4.9 886 | vite: ^6.0.0 || ^7.0.0-0 887 | peerDependenciesMeta: 888 | msw: 889 | optional: true 890 | vite: 891 | optional: true 892 | 893 | '@vitest/pretty-format@4.0.16': 894 | resolution: {integrity: sha512-eNCYNsSty9xJKi/UdVD8Ou16alu7AYiS2fCPRs0b1OdhJiV89buAXQLpTbe+X8V9L6qrs9CqyvU7OaAopJYPsA==} 895 | 896 | '@vitest/runner@4.0.16': 897 | resolution: {integrity: sha512-VWEDm5Wv9xEo80ctjORcTQRJ539EGPB3Pb9ApvVRAY1U/WkHXmmYISqU5E79uCwcW7xYUV38gwZD+RV755fu3Q==} 898 | 899 | '@vitest/snapshot@4.0.16': 900 | resolution: {integrity: sha512-sf6NcrYhYBsSYefxnry+DR8n3UV4xWZwWxYbCJUt2YdvtqzSPR7VfGrY0zsv090DAbjFZsi7ZaMi1KnSRyK1XA==} 901 | 902 | '@vitest/spy@4.0.16': 903 | resolution: {integrity: sha512-4jIOWjKP0ZUaEmJm00E0cOBLU+5WE0BpeNr3XN6TEF05ltro6NJqHWxXD0kA8/Zc8Nh23AT8WQxwNG+WeROupw==} 904 | 905 | '@vitest/utils@4.0.16': 906 | resolution: {integrity: sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA==} 907 | 908 | acorn-jsx@5.3.2: 909 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 910 | peerDependencies: 911 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 912 | 913 | acorn@8.15.0: 914 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 915 | engines: {node: '>=0.4.0'} 916 | hasBin: true 917 | 918 | ajv@6.12.6: 919 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 920 | 921 | ansi-styles@4.3.0: 922 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 923 | engines: {node: '>=8'} 924 | 925 | argparse@2.0.1: 926 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 927 | 928 | assertion-error@2.0.1: 929 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 930 | engines: {node: '>=12'} 931 | 932 | ast-kit@2.2.0: 933 | resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} 934 | engines: {node: '>=20.19.0'} 935 | 936 | ast-v8-to-istanbul@0.3.9: 937 | resolution: {integrity: sha512-dSC6tJeOJxbZrPzPbv5mMd6CMiQ1ugaVXXPRad2fXUSsy1kstFn9XQWemV9VW7Y7kpxgQ/4WMoZfwdH8XSU48w==} 938 | 939 | balanced-match@1.0.2: 940 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 941 | 942 | baseline-browser-mapping@2.9.9: 943 | resolution: {integrity: sha512-V8fbOCSeOFvlDj7LLChUcqbZrdKD9RU/VR260piF1790vT0mfLSwGc/Qzxv3IqiTukOpNtItePa0HBpMAj7MDg==} 944 | hasBin: true 945 | 946 | birpc@4.0.0: 947 | resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} 948 | 949 | brace-expansion@1.1.12: 950 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 951 | 952 | brace-expansion@2.0.2: 953 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 954 | 955 | browserslist@4.28.1: 956 | resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} 957 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 958 | hasBin: true 959 | 960 | builtin-modules@5.0.0: 961 | resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} 962 | engines: {node: '>=18.20'} 963 | 964 | bundle-name@4.1.0: 965 | resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} 966 | engines: {node: '>=18'} 967 | 968 | c12@3.3.3: 969 | resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==} 970 | peerDependencies: 971 | magicast: '*' 972 | peerDependenciesMeta: 973 | magicast: 974 | optional: true 975 | 976 | callsites@3.1.0: 977 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 978 | engines: {node: '>=6'} 979 | 980 | caniuse-lite@1.0.30001760: 981 | resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} 982 | 983 | chai@6.2.1: 984 | resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} 985 | engines: {node: '>=18'} 986 | 987 | chalk@4.1.2: 988 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 989 | engines: {node: '>=10'} 990 | 991 | changelogen@0.6.2: 992 | resolution: {integrity: sha512-QtC7+r9BxoUm+XDAwhLbz3CgU134J1ytfE3iCpLpA4KFzX2P1e6s21RrWDwUBzfx66b1Rv+6lOA2nS2btprd+A==} 993 | hasBin: true 994 | 995 | character-entities-legacy@1.1.4: 996 | resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} 997 | 998 | character-entities@1.2.4: 999 | resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} 1000 | 1001 | character-reference-invalid@1.1.4: 1002 | resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} 1003 | 1004 | chokidar@5.0.0: 1005 | resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} 1006 | engines: {node: '>= 20.19.0'} 1007 | 1008 | ci-info@4.3.1: 1009 | resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} 1010 | engines: {node: '>=8'} 1011 | 1012 | citty@0.1.6: 1013 | resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} 1014 | 1015 | clean-regexp@1.0.0: 1016 | resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} 1017 | engines: {node: '>=4'} 1018 | 1019 | color-convert@2.0.1: 1020 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1021 | engines: {node: '>=7.0.0'} 1022 | 1023 | color-name@1.1.4: 1024 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1025 | 1026 | concat-map@0.0.1: 1027 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1028 | 1029 | confbox@0.2.2: 1030 | resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} 1031 | 1032 | consola@3.4.2: 1033 | resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 1034 | engines: {node: ^14.18.0 || >=16.10.0} 1035 | 1036 | convert-gitmoji@0.1.5: 1037 | resolution: {integrity: sha512-4wqOafJdk2tqZC++cjcbGcaJ13BZ3kwldf06PTiAQRAB76Z1KJwZNL1SaRZMi2w1FM9RYTgZ6QErS8NUl/GBmQ==} 1038 | 1039 | core-js-compat@3.47.0: 1040 | resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} 1041 | 1042 | cross-spawn@7.0.6: 1043 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1044 | engines: {node: '>= 8'} 1045 | 1046 | debug@4.4.3: 1047 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 1048 | engines: {node: '>=6.0'} 1049 | peerDependencies: 1050 | supports-color: '*' 1051 | peerDependenciesMeta: 1052 | supports-color: 1053 | optional: true 1054 | 1055 | deep-is@0.1.4: 1056 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1057 | 1058 | default-browser-id@5.0.1: 1059 | resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} 1060 | engines: {node: '>=18'} 1061 | 1062 | default-browser@5.4.0: 1063 | resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} 1064 | engines: {node: '>=18'} 1065 | 1066 | define-lazy-prop@3.0.0: 1067 | resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} 1068 | engines: {node: '>=12'} 1069 | 1070 | defu@6.1.4: 1071 | resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 1072 | 1073 | destr@2.0.5: 1074 | resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} 1075 | 1076 | dotenv@17.2.3: 1077 | resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} 1078 | engines: {node: '>=12'} 1079 | 1080 | dts-resolver@2.1.3: 1081 | resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} 1082 | engines: {node: '>=20.19.0'} 1083 | peerDependencies: 1084 | oxc-resolver: '>=11.0.0' 1085 | peerDependenciesMeta: 1086 | oxc-resolver: 1087 | optional: true 1088 | 1089 | electron-to-chromium@1.5.267: 1090 | resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} 1091 | 1092 | es-module-lexer@1.7.0: 1093 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 1094 | 1095 | esbuild@0.27.2: 1096 | resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} 1097 | engines: {node: '>=18'} 1098 | hasBin: true 1099 | 1100 | escalade@3.2.0: 1101 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1102 | engines: {node: '>=6'} 1103 | 1104 | escape-string-regexp@1.0.5: 1105 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1106 | engines: {node: '>=0.8.0'} 1107 | 1108 | escape-string-regexp@4.0.0: 1109 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1110 | engines: {node: '>=10'} 1111 | 1112 | eslint-config-unjs@0.5.0: 1113 | resolution: {integrity: sha512-yXLFwCShcz0dwfSZjDL6sVu8PKZ0f/3kuOCoXQuuiM1OvggbrIXy0WCKIpWsomlbBM2Oy0jv6eZTML9LhaLpJQ==} 1114 | peerDependencies: 1115 | eslint: '*' 1116 | typescript: '*' 1117 | 1118 | eslint-plugin-markdown@5.1.0: 1119 | resolution: {integrity: sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==} 1120 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1121 | deprecated: Please use @eslint/markdown instead 1122 | peerDependencies: 1123 | eslint: '>=8' 1124 | 1125 | eslint-plugin-unicorn@59.0.1: 1126 | resolution: {integrity: sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==} 1127 | engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0} 1128 | peerDependencies: 1129 | eslint: '>=9.22.0' 1130 | 1131 | eslint-scope@8.4.0: 1132 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 1133 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1134 | 1135 | eslint-visitor-keys@3.4.3: 1136 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1137 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1138 | 1139 | eslint-visitor-keys@4.2.1: 1140 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 1141 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1142 | 1143 | eslint@9.39.2: 1144 | resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} 1145 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1146 | hasBin: true 1147 | peerDependencies: 1148 | jiti: '*' 1149 | peerDependenciesMeta: 1150 | jiti: 1151 | optional: true 1152 | 1153 | espree@10.4.0: 1154 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 1155 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1156 | 1157 | esquery@1.6.0: 1158 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 1159 | engines: {node: '>=0.10'} 1160 | 1161 | esrecurse@4.3.0: 1162 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1163 | engines: {node: '>=4.0'} 1164 | 1165 | estraverse@5.3.0: 1166 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1167 | engines: {node: '>=4.0'} 1168 | 1169 | estree-walker@3.0.3: 1170 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1171 | 1172 | esutils@2.0.3: 1173 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1174 | engines: {node: '>=0.10.0'} 1175 | 1176 | expect-type@1.3.0: 1177 | resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} 1178 | engines: {node: '>=12.0.0'} 1179 | 1180 | exsolve@1.0.8: 1181 | resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} 1182 | 1183 | fast-deep-equal@3.1.3: 1184 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1185 | 1186 | fast-json-stable-stringify@2.1.0: 1187 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1188 | 1189 | fast-levenshtein@2.0.6: 1190 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1191 | 1192 | fdir@6.5.0: 1193 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 1194 | engines: {node: '>=12.0.0'} 1195 | peerDependencies: 1196 | picomatch: ^3 || ^4 1197 | peerDependenciesMeta: 1198 | picomatch: 1199 | optional: true 1200 | 1201 | file-entry-cache@8.0.0: 1202 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1203 | engines: {node: '>=16.0.0'} 1204 | 1205 | find-up-simple@1.0.1: 1206 | resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} 1207 | engines: {node: '>=18'} 1208 | 1209 | find-up@5.0.0: 1210 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1211 | engines: {node: '>=10'} 1212 | 1213 | flat-cache@4.0.1: 1214 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 1215 | engines: {node: '>=16'} 1216 | 1217 | flatted@3.3.3: 1218 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 1219 | 1220 | fsevents@2.3.3: 1221 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1222 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1223 | os: [darwin] 1224 | 1225 | get-tsconfig@4.13.0: 1226 | resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 1227 | 1228 | giget@2.0.0: 1229 | resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} 1230 | hasBin: true 1231 | 1232 | glob-parent@6.0.2: 1233 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1234 | engines: {node: '>=10.13.0'} 1235 | 1236 | globals@14.0.0: 1237 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1238 | engines: {node: '>=18'} 1239 | 1240 | globals@16.5.0: 1241 | resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} 1242 | engines: {node: '>=18'} 1243 | 1244 | has-flag@4.0.0: 1245 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1246 | engines: {node: '>=8'} 1247 | 1248 | hookable@5.5.3: 1249 | resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} 1250 | 1251 | html-escaper@2.0.2: 1252 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1253 | 1254 | ignore@5.3.2: 1255 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1256 | engines: {node: '>= 4'} 1257 | 1258 | ignore@7.0.5: 1259 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 1260 | engines: {node: '>= 4'} 1261 | 1262 | import-fresh@3.3.1: 1263 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1264 | engines: {node: '>=6'} 1265 | 1266 | imurmurhash@0.1.4: 1267 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1268 | engines: {node: '>=0.8.19'} 1269 | 1270 | indent-string@5.0.0: 1271 | resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} 1272 | engines: {node: '>=12'} 1273 | 1274 | is-alphabetical@1.0.4: 1275 | resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} 1276 | 1277 | is-alphanumerical@1.0.4: 1278 | resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} 1279 | 1280 | is-builtin-module@5.0.0: 1281 | resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} 1282 | engines: {node: '>=18.20'} 1283 | 1284 | is-decimal@1.0.4: 1285 | resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} 1286 | 1287 | is-docker@3.0.0: 1288 | resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} 1289 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1290 | hasBin: true 1291 | 1292 | is-extglob@2.1.1: 1293 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1294 | engines: {node: '>=0.10.0'} 1295 | 1296 | is-glob@4.0.3: 1297 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1298 | engines: {node: '>=0.10.0'} 1299 | 1300 | is-hexadecimal@1.0.4: 1301 | resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} 1302 | 1303 | is-inside-container@1.0.0: 1304 | resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} 1305 | engines: {node: '>=14.16'} 1306 | hasBin: true 1307 | 1308 | is-wsl@3.1.0: 1309 | resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} 1310 | engines: {node: '>=16'} 1311 | 1312 | isexe@2.0.0: 1313 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1314 | 1315 | istanbul-lib-coverage@3.2.2: 1316 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1317 | engines: {node: '>=8'} 1318 | 1319 | istanbul-lib-report@3.0.1: 1320 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1321 | engines: {node: '>=10'} 1322 | 1323 | istanbul-lib-source-maps@5.0.6: 1324 | resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} 1325 | engines: {node: '>=10'} 1326 | 1327 | istanbul-reports@3.2.0: 1328 | resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} 1329 | engines: {node: '>=8'} 1330 | 1331 | jiti@2.6.1: 1332 | resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 1333 | hasBin: true 1334 | 1335 | js-tokens@9.0.1: 1336 | resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 1337 | 1338 | js-yaml@4.1.1: 1339 | resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 1340 | hasBin: true 1341 | 1342 | jsesc@3.0.2: 1343 | resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} 1344 | engines: {node: '>=6'} 1345 | hasBin: true 1346 | 1347 | jsesc@3.1.0: 1348 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1349 | engines: {node: '>=6'} 1350 | hasBin: true 1351 | 1352 | json-buffer@3.0.1: 1353 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1354 | 1355 | json-schema-traverse@0.4.1: 1356 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1357 | 1358 | json-stable-stringify-without-jsonify@1.0.1: 1359 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1360 | 1361 | keyv@4.5.4: 1362 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1363 | 1364 | levn@0.4.1: 1365 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1366 | engines: {node: '>= 0.8.0'} 1367 | 1368 | locate-path@6.0.0: 1369 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1370 | engines: {node: '>=10'} 1371 | 1372 | lodash.merge@4.6.2: 1373 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1374 | 1375 | magic-string@0.30.21: 1376 | resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1377 | 1378 | magicast@0.5.1: 1379 | resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} 1380 | 1381 | make-dir@4.0.0: 1382 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1383 | engines: {node: '>=10'} 1384 | 1385 | mdast-util-from-markdown@0.8.5: 1386 | resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} 1387 | 1388 | mdast-util-to-string@2.0.0: 1389 | resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} 1390 | 1391 | micromark@2.11.4: 1392 | resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} 1393 | 1394 | minimatch@3.1.2: 1395 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1396 | 1397 | minimatch@9.0.5: 1398 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1399 | engines: {node: '>=16 || 14 >=14.17'} 1400 | 1401 | mitata@1.0.34: 1402 | resolution: {integrity: sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA==} 1403 | 1404 | mri@1.2.0: 1405 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1406 | engines: {node: '>=4'} 1407 | 1408 | ms@2.1.3: 1409 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1410 | 1411 | nanoid@3.3.11: 1412 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1413 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1414 | hasBin: true 1415 | 1416 | natural-compare@1.4.0: 1417 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1418 | 1419 | node-fetch-native@1.6.7: 1420 | resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} 1421 | 1422 | node-releases@2.0.27: 1423 | resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 1424 | 1425 | nypm@0.6.2: 1426 | resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} 1427 | engines: {node: ^14.16.0 || >=16.10.0} 1428 | hasBin: true 1429 | 1430 | obug@2.1.1: 1431 | resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} 1432 | 1433 | obuild@0.4.9: 1434 | resolution: {integrity: sha512-L/lmcb+/0gQD5T2BXbbhLg7L1G2taK52aQNxIJpIx2ASd1sLNmOjTRhWMun6YdvA41zhLPeWLrNm4j8mFHF+NA==} 1435 | hasBin: true 1436 | 1437 | ofetch@1.5.1: 1438 | resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} 1439 | 1440 | ohash@2.0.11: 1441 | resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} 1442 | 1443 | open@10.2.0: 1444 | resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} 1445 | engines: {node: '>=18'} 1446 | 1447 | optionator@0.9.4: 1448 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1449 | engines: {node: '>= 0.8.0'} 1450 | 1451 | oxc-minify@0.103.0: 1452 | resolution: {integrity: sha512-lm4tmyewdakznpxmQVF3WEPhLG1bX3yq/RuQMFpTkjicHrJToXQeZqUocv5X+Ff43YsbPfCPhfhiVb9PIBU7+w==} 1453 | engines: {node: ^20.19.0 || >=22.12.0} 1454 | 1455 | oxc-parser@0.103.0: 1456 | resolution: {integrity: sha512-UrSUdhwNVUUysWq5yHBCUwe0njFL7k377GGRSSDByAT02IubuMlUiudG+CaQQjP+RgjYXCgoINMVA+enZRJdZA==} 1457 | engines: {node: ^20.19.0 || >=22.12.0} 1458 | 1459 | oxc-transform@0.103.0: 1460 | resolution: {integrity: sha512-KtGMT7NnI1lwphfzyZcvnP4Y9rVCEFgBTHD7ueY2IMe7V3ZFrvacy4h1ylk0BSvMPxU1lGGwNwVHxovHqBaI3A==} 1461 | engines: {node: ^20.19.0 || >=22.12.0} 1462 | 1463 | p-limit@3.1.0: 1464 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1465 | engines: {node: '>=10'} 1466 | 1467 | p-locate@5.0.0: 1468 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1469 | engines: {node: '>=10'} 1470 | 1471 | parent-module@1.0.1: 1472 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1473 | engines: {node: '>=6'} 1474 | 1475 | parse-entities@2.0.0: 1476 | resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} 1477 | 1478 | path-exists@4.0.0: 1479 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1480 | engines: {node: '>=8'} 1481 | 1482 | path-key@3.1.1: 1483 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1484 | engines: {node: '>=8'} 1485 | 1486 | pathe@2.0.3: 1487 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1488 | 1489 | perfect-debounce@2.0.0: 1490 | resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} 1491 | 1492 | picocolors@1.1.1: 1493 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1494 | 1495 | picomatch@4.0.3: 1496 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1497 | engines: {node: '>=12'} 1498 | 1499 | pkg-types@2.3.0: 1500 | resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} 1501 | 1502 | pluralize@8.0.0: 1503 | resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} 1504 | engines: {node: '>=4'} 1505 | 1506 | postcss@8.5.6: 1507 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1508 | engines: {node: ^10 || ^12 || >=14} 1509 | 1510 | prelude-ls@1.2.1: 1511 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1512 | engines: {node: '>= 0.8.0'} 1513 | 1514 | prettier@3.7.4: 1515 | resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} 1516 | engines: {node: '>=14'} 1517 | hasBin: true 1518 | 1519 | pretty-bytes@7.1.0: 1520 | resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} 1521 | engines: {node: '>=20'} 1522 | 1523 | punycode@2.3.1: 1524 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1525 | engines: {node: '>=6'} 1526 | 1527 | rc9@2.1.2: 1528 | resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} 1529 | 1530 | readdirp@5.0.0: 1531 | resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} 1532 | engines: {node: '>= 20.19.0'} 1533 | 1534 | regexp-tree@0.1.27: 1535 | resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} 1536 | hasBin: true 1537 | 1538 | regjsparser@0.12.0: 1539 | resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} 1540 | hasBin: true 1541 | 1542 | resolve-from@4.0.0: 1543 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1544 | engines: {node: '>=4'} 1545 | 1546 | resolve-pkg-maps@1.0.0: 1547 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1548 | 1549 | rolldown-plugin-dts@0.19.1: 1550 | resolution: {integrity: sha512-6z501zDTGq6ZrIEdk57qNUwq7kBRGzv3I3SAN2HMJ2KFYjHLnAuPYOmvfiwdxbRZMJ0iMdkV9rYdC3GjurT2cg==} 1551 | engines: {node: '>=20.19.0'} 1552 | peerDependencies: 1553 | '@ts-macro/tsc': ^0.3.6 1554 | '@typescript/native-preview': '>=7.0.0-dev.20250601.1' 1555 | rolldown: ^1.0.0-beta.55 1556 | typescript: ^5.0.0 1557 | vue-tsc: ~3.1.0 1558 | peerDependenciesMeta: 1559 | '@ts-macro/tsc': 1560 | optional: true 1561 | '@typescript/native-preview': 1562 | optional: true 1563 | typescript: 1564 | optional: true 1565 | vue-tsc: 1566 | optional: true 1567 | 1568 | rolldown@1.0.0-beta.55: 1569 | resolution: {integrity: sha512-r8Ws43aYCnfO07ao0SvQRz4TBAtZJjGWNvScRBOHuiNHvjfECOJBIqJv0nUkL1GYcltjvvHswRilDF1ocsC0+g==} 1570 | engines: {node: ^20.19.0 || >=22.12.0} 1571 | hasBin: true 1572 | 1573 | rollup@4.53.5: 1574 | resolution: {integrity: sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==} 1575 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1576 | hasBin: true 1577 | 1578 | run-applescript@7.1.0: 1579 | resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} 1580 | engines: {node: '>=18'} 1581 | 1582 | scule@1.3.0: 1583 | resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} 1584 | 1585 | semver@7.7.3: 1586 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 1587 | engines: {node: '>=10'} 1588 | hasBin: true 1589 | 1590 | shebang-command@2.0.0: 1591 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1592 | engines: {node: '>=8'} 1593 | 1594 | shebang-regex@3.0.0: 1595 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1596 | engines: {node: '>=8'} 1597 | 1598 | siginfo@2.0.0: 1599 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1600 | 1601 | source-map-js@1.2.1: 1602 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1603 | engines: {node: '>=0.10.0'} 1604 | 1605 | stackback@0.0.2: 1606 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1607 | 1608 | std-env@3.10.0: 1609 | resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} 1610 | 1611 | strip-indent@4.1.1: 1612 | resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} 1613 | engines: {node: '>=12'} 1614 | 1615 | strip-json-comments@3.1.1: 1616 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1617 | engines: {node: '>=8'} 1618 | 1619 | supports-color@7.2.0: 1620 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1621 | engines: {node: '>=8'} 1622 | 1623 | tinybench@2.9.0: 1624 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1625 | 1626 | tinyexec@1.0.2: 1627 | resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} 1628 | engines: {node: '>=18'} 1629 | 1630 | tinyglobby@0.2.15: 1631 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1632 | engines: {node: '>=12.0.0'} 1633 | 1634 | tinyrainbow@3.0.3: 1635 | resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} 1636 | engines: {node: '>=14.0.0'} 1637 | 1638 | ts-api-utils@2.1.0: 1639 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1640 | engines: {node: '>=18.12'} 1641 | peerDependencies: 1642 | typescript: '>=4.8.4' 1643 | 1644 | tslib@2.8.1: 1645 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1646 | 1647 | type-check@0.4.0: 1648 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1649 | engines: {node: '>= 0.8.0'} 1650 | 1651 | typescript-eslint@8.50.0: 1652 | resolution: {integrity: sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==} 1653 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1654 | peerDependencies: 1655 | eslint: ^8.57.0 || ^9.0.0 1656 | typescript: '>=4.8.4 <6.0.0' 1657 | 1658 | typescript@5.9.3: 1659 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1660 | engines: {node: '>=14.17'} 1661 | hasBin: true 1662 | 1663 | ufo@1.6.1: 1664 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1665 | 1666 | undici-types@7.16.0: 1667 | resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 1668 | 1669 | unist-util-stringify-position@2.0.3: 1670 | resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} 1671 | 1672 | update-browserslist-db@1.2.3: 1673 | resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} 1674 | hasBin: true 1675 | peerDependencies: 1676 | browserslist: '>= 4.21.0' 1677 | 1678 | uri-js@4.4.1: 1679 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1680 | 1681 | vite@7.3.0: 1682 | resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} 1683 | engines: {node: ^20.19.0 || >=22.12.0} 1684 | hasBin: true 1685 | peerDependencies: 1686 | '@types/node': ^20.19.0 || >=22.12.0 1687 | jiti: '>=1.21.0' 1688 | less: ^4.0.0 1689 | lightningcss: ^1.21.0 1690 | sass: ^1.70.0 1691 | sass-embedded: ^1.70.0 1692 | stylus: '>=0.54.8' 1693 | sugarss: ^5.0.0 1694 | terser: ^5.16.0 1695 | tsx: ^4.8.1 1696 | yaml: ^2.4.2 1697 | peerDependenciesMeta: 1698 | '@types/node': 1699 | optional: true 1700 | jiti: 1701 | optional: true 1702 | less: 1703 | optional: true 1704 | lightningcss: 1705 | optional: true 1706 | sass: 1707 | optional: true 1708 | sass-embedded: 1709 | optional: true 1710 | stylus: 1711 | optional: true 1712 | sugarss: 1713 | optional: true 1714 | terser: 1715 | optional: true 1716 | tsx: 1717 | optional: true 1718 | yaml: 1719 | optional: true 1720 | 1721 | vitest@4.0.16: 1722 | resolution: {integrity: sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==} 1723 | engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} 1724 | hasBin: true 1725 | peerDependencies: 1726 | '@edge-runtime/vm': '*' 1727 | '@opentelemetry/api': ^1.9.0 1728 | '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 1729 | '@vitest/browser-playwright': 4.0.16 1730 | '@vitest/browser-preview': 4.0.16 1731 | '@vitest/browser-webdriverio': 4.0.16 1732 | '@vitest/ui': 4.0.16 1733 | happy-dom: '*' 1734 | jsdom: '*' 1735 | peerDependenciesMeta: 1736 | '@edge-runtime/vm': 1737 | optional: true 1738 | '@opentelemetry/api': 1739 | optional: true 1740 | '@types/node': 1741 | optional: true 1742 | '@vitest/browser-playwright': 1743 | optional: true 1744 | '@vitest/browser-preview': 1745 | optional: true 1746 | '@vitest/browser-webdriverio': 1747 | optional: true 1748 | '@vitest/ui': 1749 | optional: true 1750 | happy-dom: 1751 | optional: true 1752 | jsdom: 1753 | optional: true 1754 | 1755 | which@2.0.2: 1756 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1757 | engines: {node: '>= 8'} 1758 | hasBin: true 1759 | 1760 | why-is-node-running@2.3.0: 1761 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1762 | engines: {node: '>=8'} 1763 | hasBin: true 1764 | 1765 | word-wrap@1.2.5: 1766 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1767 | engines: {node: '>=0.10.0'} 1768 | 1769 | wsl-utils@0.1.0: 1770 | resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} 1771 | engines: {node: '>=18'} 1772 | 1773 | yocto-queue@0.1.0: 1774 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1775 | engines: {node: '>=10'} 1776 | 1777 | snapshots: 1778 | 1779 | '@babel/generator@7.28.5': 1780 | dependencies: 1781 | '@babel/parser': 7.28.5 1782 | '@babel/types': 7.28.5 1783 | '@jridgewell/gen-mapping': 0.3.13 1784 | '@jridgewell/trace-mapping': 0.3.31 1785 | jsesc: 3.1.0 1786 | 1787 | '@babel/helper-string-parser@7.27.1': {} 1788 | 1789 | '@babel/helper-validator-identifier@7.28.5': {} 1790 | 1791 | '@babel/parser@7.28.5': 1792 | dependencies: 1793 | '@babel/types': 7.28.5 1794 | 1795 | '@babel/types@7.28.5': 1796 | dependencies: 1797 | '@babel/helper-string-parser': 7.27.1 1798 | '@babel/helper-validator-identifier': 7.28.5 1799 | 1800 | '@bcoe/v8-coverage@1.0.2': {} 1801 | 1802 | '@emnapi/core@1.7.1': 1803 | dependencies: 1804 | '@emnapi/wasi-threads': 1.1.0 1805 | tslib: 2.8.1 1806 | optional: true 1807 | 1808 | '@emnapi/runtime@1.7.1': 1809 | dependencies: 1810 | tslib: 2.8.1 1811 | optional: true 1812 | 1813 | '@emnapi/wasi-threads@1.1.0': 1814 | dependencies: 1815 | tslib: 2.8.1 1816 | optional: true 1817 | 1818 | '@esbuild/aix-ppc64@0.27.2': 1819 | optional: true 1820 | 1821 | '@esbuild/android-arm64@0.27.2': 1822 | optional: true 1823 | 1824 | '@esbuild/android-arm@0.27.2': 1825 | optional: true 1826 | 1827 | '@esbuild/android-x64@0.27.2': 1828 | optional: true 1829 | 1830 | '@esbuild/darwin-arm64@0.27.2': 1831 | optional: true 1832 | 1833 | '@esbuild/darwin-x64@0.27.2': 1834 | optional: true 1835 | 1836 | '@esbuild/freebsd-arm64@0.27.2': 1837 | optional: true 1838 | 1839 | '@esbuild/freebsd-x64@0.27.2': 1840 | optional: true 1841 | 1842 | '@esbuild/linux-arm64@0.27.2': 1843 | optional: true 1844 | 1845 | '@esbuild/linux-arm@0.27.2': 1846 | optional: true 1847 | 1848 | '@esbuild/linux-ia32@0.27.2': 1849 | optional: true 1850 | 1851 | '@esbuild/linux-loong64@0.27.2': 1852 | optional: true 1853 | 1854 | '@esbuild/linux-mips64el@0.27.2': 1855 | optional: true 1856 | 1857 | '@esbuild/linux-ppc64@0.27.2': 1858 | optional: true 1859 | 1860 | '@esbuild/linux-riscv64@0.27.2': 1861 | optional: true 1862 | 1863 | '@esbuild/linux-s390x@0.27.2': 1864 | optional: true 1865 | 1866 | '@esbuild/linux-x64@0.27.2': 1867 | optional: true 1868 | 1869 | '@esbuild/netbsd-arm64@0.27.2': 1870 | optional: true 1871 | 1872 | '@esbuild/netbsd-x64@0.27.2': 1873 | optional: true 1874 | 1875 | '@esbuild/openbsd-arm64@0.27.2': 1876 | optional: true 1877 | 1878 | '@esbuild/openbsd-x64@0.27.2': 1879 | optional: true 1880 | 1881 | '@esbuild/openharmony-arm64@0.27.2': 1882 | optional: true 1883 | 1884 | '@esbuild/sunos-x64@0.27.2': 1885 | optional: true 1886 | 1887 | '@esbuild/win32-arm64@0.27.2': 1888 | optional: true 1889 | 1890 | '@esbuild/win32-ia32@0.27.2': 1891 | optional: true 1892 | 1893 | '@esbuild/win32-x64@0.27.2': 1894 | optional: true 1895 | 1896 | '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': 1897 | dependencies: 1898 | eslint: 9.39.2(jiti@2.6.1) 1899 | eslint-visitor-keys: 3.4.3 1900 | 1901 | '@eslint-community/regexpp@4.12.2': {} 1902 | 1903 | '@eslint/config-array@0.21.1': 1904 | dependencies: 1905 | '@eslint/object-schema': 2.1.7 1906 | debug: 4.4.3 1907 | minimatch: 3.1.2 1908 | transitivePeerDependencies: 1909 | - supports-color 1910 | 1911 | '@eslint/config-helpers@0.4.2': 1912 | dependencies: 1913 | '@eslint/core': 0.17.0 1914 | 1915 | '@eslint/core@0.13.0': 1916 | dependencies: 1917 | '@types/json-schema': 7.0.15 1918 | 1919 | '@eslint/core@0.17.0': 1920 | dependencies: 1921 | '@types/json-schema': 7.0.15 1922 | 1923 | '@eslint/eslintrc@3.3.3': 1924 | dependencies: 1925 | ajv: 6.12.6 1926 | debug: 4.4.3 1927 | espree: 10.4.0 1928 | globals: 14.0.0 1929 | ignore: 5.3.2 1930 | import-fresh: 3.3.1 1931 | js-yaml: 4.1.1 1932 | minimatch: 3.1.2 1933 | strip-json-comments: 3.1.1 1934 | transitivePeerDependencies: 1935 | - supports-color 1936 | 1937 | '@eslint/js@9.39.2': {} 1938 | 1939 | '@eslint/object-schema@2.1.7': {} 1940 | 1941 | '@eslint/plugin-kit@0.2.8': 1942 | dependencies: 1943 | '@eslint/core': 0.13.0 1944 | levn: 0.4.1 1945 | 1946 | '@eslint/plugin-kit@0.4.1': 1947 | dependencies: 1948 | '@eslint/core': 0.17.0 1949 | levn: 0.4.1 1950 | 1951 | '@humanfs/core@0.19.1': {} 1952 | 1953 | '@humanfs/node@0.16.7': 1954 | dependencies: 1955 | '@humanfs/core': 0.19.1 1956 | '@humanwhocodes/retry': 0.4.3 1957 | 1958 | '@humanwhocodes/module-importer@1.0.1': {} 1959 | 1960 | '@humanwhocodes/retry@0.4.3': {} 1961 | 1962 | '@jridgewell/gen-mapping@0.3.13': 1963 | dependencies: 1964 | '@jridgewell/sourcemap-codec': 1.5.5 1965 | '@jridgewell/trace-mapping': 0.3.31 1966 | 1967 | '@jridgewell/resolve-uri@3.1.2': {} 1968 | 1969 | '@jridgewell/sourcemap-codec@1.5.5': {} 1970 | 1971 | '@jridgewell/trace-mapping@0.3.31': 1972 | dependencies: 1973 | '@jridgewell/resolve-uri': 3.1.2 1974 | '@jridgewell/sourcemap-codec': 1.5.5 1975 | 1976 | '@napi-rs/wasm-runtime@1.1.0': 1977 | dependencies: 1978 | '@emnapi/core': 1.7.1 1979 | '@emnapi/runtime': 1.7.1 1980 | '@tybys/wasm-util': 0.10.1 1981 | optional: true 1982 | 1983 | '@oxc-minify/binding-android-arm64@0.103.0': 1984 | optional: true 1985 | 1986 | '@oxc-minify/binding-darwin-arm64@0.103.0': 1987 | optional: true 1988 | 1989 | '@oxc-minify/binding-darwin-x64@0.103.0': 1990 | optional: true 1991 | 1992 | '@oxc-minify/binding-freebsd-x64@0.103.0': 1993 | optional: true 1994 | 1995 | '@oxc-minify/binding-linux-arm-gnueabihf@0.103.0': 1996 | optional: true 1997 | 1998 | '@oxc-minify/binding-linux-arm64-gnu@0.103.0': 1999 | optional: true 2000 | 2001 | '@oxc-minify/binding-linux-arm64-musl@0.103.0': 2002 | optional: true 2003 | 2004 | '@oxc-minify/binding-linux-riscv64-gnu@0.103.0': 2005 | optional: true 2006 | 2007 | '@oxc-minify/binding-linux-s390x-gnu@0.103.0': 2008 | optional: true 2009 | 2010 | '@oxc-minify/binding-linux-x64-gnu@0.103.0': 2011 | optional: true 2012 | 2013 | '@oxc-minify/binding-linux-x64-musl@0.103.0': 2014 | optional: true 2015 | 2016 | '@oxc-minify/binding-openharmony-arm64@0.103.0': 2017 | optional: true 2018 | 2019 | '@oxc-minify/binding-wasm32-wasi@0.103.0': 2020 | dependencies: 2021 | '@napi-rs/wasm-runtime': 1.1.0 2022 | optional: true 2023 | 2024 | '@oxc-minify/binding-win32-arm64-msvc@0.103.0': 2025 | optional: true 2026 | 2027 | '@oxc-minify/binding-win32-x64-msvc@0.103.0': 2028 | optional: true 2029 | 2030 | '@oxc-parser/binding-android-arm64@0.103.0': 2031 | optional: true 2032 | 2033 | '@oxc-parser/binding-darwin-arm64@0.103.0': 2034 | optional: true 2035 | 2036 | '@oxc-parser/binding-darwin-x64@0.103.0': 2037 | optional: true 2038 | 2039 | '@oxc-parser/binding-freebsd-x64@0.103.0': 2040 | optional: true 2041 | 2042 | '@oxc-parser/binding-linux-arm-gnueabihf@0.103.0': 2043 | optional: true 2044 | 2045 | '@oxc-parser/binding-linux-arm64-gnu@0.103.0': 2046 | optional: true 2047 | 2048 | '@oxc-parser/binding-linux-arm64-musl@0.103.0': 2049 | optional: true 2050 | 2051 | '@oxc-parser/binding-linux-riscv64-gnu@0.103.0': 2052 | optional: true 2053 | 2054 | '@oxc-parser/binding-linux-s390x-gnu@0.103.0': 2055 | optional: true 2056 | 2057 | '@oxc-parser/binding-linux-x64-gnu@0.103.0': 2058 | optional: true 2059 | 2060 | '@oxc-parser/binding-linux-x64-musl@0.103.0': 2061 | optional: true 2062 | 2063 | '@oxc-parser/binding-openharmony-arm64@0.103.0': 2064 | optional: true 2065 | 2066 | '@oxc-parser/binding-wasm32-wasi@0.103.0': 2067 | dependencies: 2068 | '@napi-rs/wasm-runtime': 1.1.0 2069 | optional: true 2070 | 2071 | '@oxc-parser/binding-win32-arm64-msvc@0.103.0': 2072 | optional: true 2073 | 2074 | '@oxc-parser/binding-win32-x64-msvc@0.103.0': 2075 | optional: true 2076 | 2077 | '@oxc-project/types@0.103.0': {} 2078 | 2079 | '@oxc-transform/binding-android-arm64@0.103.0': 2080 | optional: true 2081 | 2082 | '@oxc-transform/binding-darwin-arm64@0.103.0': 2083 | optional: true 2084 | 2085 | '@oxc-transform/binding-darwin-x64@0.103.0': 2086 | optional: true 2087 | 2088 | '@oxc-transform/binding-freebsd-x64@0.103.0': 2089 | optional: true 2090 | 2091 | '@oxc-transform/binding-linux-arm-gnueabihf@0.103.0': 2092 | optional: true 2093 | 2094 | '@oxc-transform/binding-linux-arm64-gnu@0.103.0': 2095 | optional: true 2096 | 2097 | '@oxc-transform/binding-linux-arm64-musl@0.103.0': 2098 | optional: true 2099 | 2100 | '@oxc-transform/binding-linux-riscv64-gnu@0.103.0': 2101 | optional: true 2102 | 2103 | '@oxc-transform/binding-linux-s390x-gnu@0.103.0': 2104 | optional: true 2105 | 2106 | '@oxc-transform/binding-linux-x64-gnu@0.103.0': 2107 | optional: true 2108 | 2109 | '@oxc-transform/binding-linux-x64-musl@0.103.0': 2110 | optional: true 2111 | 2112 | '@oxc-transform/binding-openharmony-arm64@0.103.0': 2113 | optional: true 2114 | 2115 | '@oxc-transform/binding-wasm32-wasi@0.103.0': 2116 | dependencies: 2117 | '@napi-rs/wasm-runtime': 1.1.0 2118 | optional: true 2119 | 2120 | '@oxc-transform/binding-win32-arm64-msvc@0.103.0': 2121 | optional: true 2122 | 2123 | '@oxc-transform/binding-win32-x64-msvc@0.103.0': 2124 | optional: true 2125 | 2126 | '@rolldown/binding-android-arm64@1.0.0-beta.55': 2127 | optional: true 2128 | 2129 | '@rolldown/binding-darwin-arm64@1.0.0-beta.55': 2130 | optional: true 2131 | 2132 | '@rolldown/binding-darwin-x64@1.0.0-beta.55': 2133 | optional: true 2134 | 2135 | '@rolldown/binding-freebsd-x64@1.0.0-beta.55': 2136 | optional: true 2137 | 2138 | '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.55': 2139 | optional: true 2140 | 2141 | '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.55': 2142 | optional: true 2143 | 2144 | '@rolldown/binding-linux-arm64-musl@1.0.0-beta.55': 2145 | optional: true 2146 | 2147 | '@rolldown/binding-linux-x64-gnu@1.0.0-beta.55': 2148 | optional: true 2149 | 2150 | '@rolldown/binding-linux-x64-musl@1.0.0-beta.55': 2151 | optional: true 2152 | 2153 | '@rolldown/binding-openharmony-arm64@1.0.0-beta.55': 2154 | optional: true 2155 | 2156 | '@rolldown/binding-wasm32-wasi@1.0.0-beta.55': 2157 | dependencies: 2158 | '@napi-rs/wasm-runtime': 1.1.0 2159 | optional: true 2160 | 2161 | '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.55': 2162 | optional: true 2163 | 2164 | '@rolldown/binding-win32-x64-msvc@1.0.0-beta.55': 2165 | optional: true 2166 | 2167 | '@rolldown/pluginutils@1.0.0-beta.55': {} 2168 | 2169 | '@rollup/rollup-android-arm-eabi@4.53.5': 2170 | optional: true 2171 | 2172 | '@rollup/rollup-android-arm64@4.53.5': 2173 | optional: true 2174 | 2175 | '@rollup/rollup-darwin-arm64@4.53.5': 2176 | optional: true 2177 | 2178 | '@rollup/rollup-darwin-x64@4.53.5': 2179 | optional: true 2180 | 2181 | '@rollup/rollup-freebsd-arm64@4.53.5': 2182 | optional: true 2183 | 2184 | '@rollup/rollup-freebsd-x64@4.53.5': 2185 | optional: true 2186 | 2187 | '@rollup/rollup-linux-arm-gnueabihf@4.53.5': 2188 | optional: true 2189 | 2190 | '@rollup/rollup-linux-arm-musleabihf@4.53.5': 2191 | optional: true 2192 | 2193 | '@rollup/rollup-linux-arm64-gnu@4.53.5': 2194 | optional: true 2195 | 2196 | '@rollup/rollup-linux-arm64-musl@4.53.5': 2197 | optional: true 2198 | 2199 | '@rollup/rollup-linux-loong64-gnu@4.53.5': 2200 | optional: true 2201 | 2202 | '@rollup/rollup-linux-ppc64-gnu@4.53.5': 2203 | optional: true 2204 | 2205 | '@rollup/rollup-linux-riscv64-gnu@4.53.5': 2206 | optional: true 2207 | 2208 | '@rollup/rollup-linux-riscv64-musl@4.53.5': 2209 | optional: true 2210 | 2211 | '@rollup/rollup-linux-s390x-gnu@4.53.5': 2212 | optional: true 2213 | 2214 | '@rollup/rollup-linux-x64-gnu@4.53.5': 2215 | optional: true 2216 | 2217 | '@rollup/rollup-linux-x64-musl@4.53.5': 2218 | optional: true 2219 | 2220 | '@rollup/rollup-openharmony-arm64@4.53.5': 2221 | optional: true 2222 | 2223 | '@rollup/rollup-win32-arm64-msvc@4.53.5': 2224 | optional: true 2225 | 2226 | '@rollup/rollup-win32-ia32-msvc@4.53.5': 2227 | optional: true 2228 | 2229 | '@rollup/rollup-win32-x64-gnu@4.53.5': 2230 | optional: true 2231 | 2232 | '@rollup/rollup-win32-x64-msvc@4.53.5': 2233 | optional: true 2234 | 2235 | '@standard-schema/spec@1.1.0': {} 2236 | 2237 | '@tybys/wasm-util@0.10.1': 2238 | dependencies: 2239 | tslib: 2.8.1 2240 | optional: true 2241 | 2242 | '@types/chai@5.2.3': 2243 | dependencies: 2244 | '@types/deep-eql': 4.0.2 2245 | assertion-error: 2.0.1 2246 | 2247 | '@types/deep-eql@4.0.2': {} 2248 | 2249 | '@types/estree@1.0.8': {} 2250 | 2251 | '@types/json-schema@7.0.15': {} 2252 | 2253 | '@types/mdast@3.0.15': 2254 | dependencies: 2255 | '@types/unist': 2.0.11 2256 | 2257 | '@types/node@25.0.3': 2258 | dependencies: 2259 | undici-types: 7.16.0 2260 | 2261 | '@types/unist@2.0.11': {} 2262 | 2263 | '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 2264 | dependencies: 2265 | '@eslint-community/regexpp': 4.12.2 2266 | '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 2267 | '@typescript-eslint/scope-manager': 8.50.0 2268 | '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 2269 | '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 2270 | '@typescript-eslint/visitor-keys': 8.50.0 2271 | eslint: 9.39.2(jiti@2.6.1) 2272 | ignore: 7.0.5 2273 | natural-compare: 1.4.0 2274 | ts-api-utils: 2.1.0(typescript@5.9.3) 2275 | typescript: 5.9.3 2276 | transitivePeerDependencies: 2277 | - supports-color 2278 | 2279 | '@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 2280 | dependencies: 2281 | '@typescript-eslint/scope-manager': 8.50.0 2282 | '@typescript-eslint/types': 8.50.0 2283 | '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) 2284 | '@typescript-eslint/visitor-keys': 8.50.0 2285 | debug: 4.4.3 2286 | eslint: 9.39.2(jiti@2.6.1) 2287 | typescript: 5.9.3 2288 | transitivePeerDependencies: 2289 | - supports-color 2290 | 2291 | '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)': 2292 | dependencies: 2293 | '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) 2294 | '@typescript-eslint/types': 8.50.0 2295 | debug: 4.4.3 2296 | typescript: 5.9.3 2297 | transitivePeerDependencies: 2298 | - supports-color 2299 | 2300 | '@typescript-eslint/scope-manager@8.50.0': 2301 | dependencies: 2302 | '@typescript-eslint/types': 8.50.0 2303 | '@typescript-eslint/visitor-keys': 8.50.0 2304 | 2305 | '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3)': 2306 | dependencies: 2307 | typescript: 5.9.3 2308 | 2309 | '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 2310 | dependencies: 2311 | '@typescript-eslint/types': 8.50.0 2312 | '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) 2313 | '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 2314 | debug: 4.4.3 2315 | eslint: 9.39.2(jiti@2.6.1) 2316 | ts-api-utils: 2.1.0(typescript@5.9.3) 2317 | typescript: 5.9.3 2318 | transitivePeerDependencies: 2319 | - supports-color 2320 | 2321 | '@typescript-eslint/types@8.50.0': {} 2322 | 2323 | '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3)': 2324 | dependencies: 2325 | '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3) 2326 | '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) 2327 | '@typescript-eslint/types': 8.50.0 2328 | '@typescript-eslint/visitor-keys': 8.50.0 2329 | debug: 4.4.3 2330 | minimatch: 9.0.5 2331 | semver: 7.7.3 2332 | tinyglobby: 0.2.15 2333 | ts-api-utils: 2.1.0(typescript@5.9.3) 2334 | typescript: 5.9.3 2335 | transitivePeerDependencies: 2336 | - supports-color 2337 | 2338 | '@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 2339 | dependencies: 2340 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) 2341 | '@typescript-eslint/scope-manager': 8.50.0 2342 | '@typescript-eslint/types': 8.50.0 2343 | '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) 2344 | eslint: 9.39.2(jiti@2.6.1) 2345 | typescript: 5.9.3 2346 | transitivePeerDependencies: 2347 | - supports-color 2348 | 2349 | '@typescript-eslint/visitor-keys@8.50.0': 2350 | dependencies: 2351 | '@typescript-eslint/types': 8.50.0 2352 | eslint-visitor-keys: 4.2.1 2353 | 2354 | '@vitest/coverage-v8@4.0.16(vitest@4.0.16(@types/node@25.0.3)(jiti@2.6.1))': 2355 | dependencies: 2356 | '@bcoe/v8-coverage': 1.0.2 2357 | '@vitest/utils': 4.0.16 2358 | ast-v8-to-istanbul: 0.3.9 2359 | istanbul-lib-coverage: 3.2.2 2360 | istanbul-lib-report: 3.0.1 2361 | istanbul-lib-source-maps: 5.0.6 2362 | istanbul-reports: 3.2.0 2363 | magicast: 0.5.1 2364 | obug: 2.1.1 2365 | std-env: 3.10.0 2366 | tinyrainbow: 3.0.3 2367 | vitest: 4.0.16(@types/node@25.0.3)(jiti@2.6.1) 2368 | transitivePeerDependencies: 2369 | - supports-color 2370 | 2371 | '@vitest/expect@4.0.16': 2372 | dependencies: 2373 | '@standard-schema/spec': 1.1.0 2374 | '@types/chai': 5.2.3 2375 | '@vitest/spy': 4.0.16 2376 | '@vitest/utils': 4.0.16 2377 | chai: 6.2.1 2378 | tinyrainbow: 3.0.3 2379 | 2380 | '@vitest/mocker@4.0.16(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1))': 2381 | dependencies: 2382 | '@vitest/spy': 4.0.16 2383 | estree-walker: 3.0.3 2384 | magic-string: 0.30.21 2385 | optionalDependencies: 2386 | vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1) 2387 | 2388 | '@vitest/pretty-format@4.0.16': 2389 | dependencies: 2390 | tinyrainbow: 3.0.3 2391 | 2392 | '@vitest/runner@4.0.16': 2393 | dependencies: 2394 | '@vitest/utils': 4.0.16 2395 | pathe: 2.0.3 2396 | 2397 | '@vitest/snapshot@4.0.16': 2398 | dependencies: 2399 | '@vitest/pretty-format': 4.0.16 2400 | magic-string: 0.30.21 2401 | pathe: 2.0.3 2402 | 2403 | '@vitest/spy@4.0.16': {} 2404 | 2405 | '@vitest/utils@4.0.16': 2406 | dependencies: 2407 | '@vitest/pretty-format': 4.0.16 2408 | tinyrainbow: 3.0.3 2409 | 2410 | acorn-jsx@5.3.2(acorn@8.15.0): 2411 | dependencies: 2412 | acorn: 8.15.0 2413 | 2414 | acorn@8.15.0: {} 2415 | 2416 | ajv@6.12.6: 2417 | dependencies: 2418 | fast-deep-equal: 3.1.3 2419 | fast-json-stable-stringify: 2.1.0 2420 | json-schema-traverse: 0.4.1 2421 | uri-js: 4.4.1 2422 | 2423 | ansi-styles@4.3.0: 2424 | dependencies: 2425 | color-convert: 2.0.1 2426 | 2427 | argparse@2.0.1: {} 2428 | 2429 | assertion-error@2.0.1: {} 2430 | 2431 | ast-kit@2.2.0: 2432 | dependencies: 2433 | '@babel/parser': 7.28.5 2434 | pathe: 2.0.3 2435 | 2436 | ast-v8-to-istanbul@0.3.9: 2437 | dependencies: 2438 | '@jridgewell/trace-mapping': 0.3.31 2439 | estree-walker: 3.0.3 2440 | js-tokens: 9.0.1 2441 | 2442 | balanced-match@1.0.2: {} 2443 | 2444 | baseline-browser-mapping@2.9.9: {} 2445 | 2446 | birpc@4.0.0: {} 2447 | 2448 | brace-expansion@1.1.12: 2449 | dependencies: 2450 | balanced-match: 1.0.2 2451 | concat-map: 0.0.1 2452 | 2453 | brace-expansion@2.0.2: 2454 | dependencies: 2455 | balanced-match: 1.0.2 2456 | 2457 | browserslist@4.28.1: 2458 | dependencies: 2459 | baseline-browser-mapping: 2.9.9 2460 | caniuse-lite: 1.0.30001760 2461 | electron-to-chromium: 1.5.267 2462 | node-releases: 2.0.27 2463 | update-browserslist-db: 1.2.3(browserslist@4.28.1) 2464 | 2465 | builtin-modules@5.0.0: {} 2466 | 2467 | bundle-name@4.1.0: 2468 | dependencies: 2469 | run-applescript: 7.1.0 2470 | 2471 | c12@3.3.3(magicast@0.5.1): 2472 | dependencies: 2473 | chokidar: 5.0.0 2474 | confbox: 0.2.2 2475 | defu: 6.1.4 2476 | dotenv: 17.2.3 2477 | exsolve: 1.0.8 2478 | giget: 2.0.0 2479 | jiti: 2.6.1 2480 | ohash: 2.0.11 2481 | pathe: 2.0.3 2482 | perfect-debounce: 2.0.0 2483 | pkg-types: 2.3.0 2484 | rc9: 2.1.2 2485 | optionalDependencies: 2486 | magicast: 0.5.1 2487 | 2488 | callsites@3.1.0: {} 2489 | 2490 | caniuse-lite@1.0.30001760: {} 2491 | 2492 | chai@6.2.1: {} 2493 | 2494 | chalk@4.1.2: 2495 | dependencies: 2496 | ansi-styles: 4.3.0 2497 | supports-color: 7.2.0 2498 | 2499 | changelogen@0.6.2(magicast@0.5.1): 2500 | dependencies: 2501 | c12: 3.3.3(magicast@0.5.1) 2502 | confbox: 0.2.2 2503 | consola: 3.4.2 2504 | convert-gitmoji: 0.1.5 2505 | mri: 1.2.0 2506 | node-fetch-native: 1.6.7 2507 | ofetch: 1.5.1 2508 | open: 10.2.0 2509 | pathe: 2.0.3 2510 | pkg-types: 2.3.0 2511 | scule: 1.3.0 2512 | semver: 7.7.3 2513 | std-env: 3.10.0 2514 | transitivePeerDependencies: 2515 | - magicast 2516 | 2517 | character-entities-legacy@1.1.4: {} 2518 | 2519 | character-entities@1.2.4: {} 2520 | 2521 | character-reference-invalid@1.1.4: {} 2522 | 2523 | chokidar@5.0.0: 2524 | dependencies: 2525 | readdirp: 5.0.0 2526 | 2527 | ci-info@4.3.1: {} 2528 | 2529 | citty@0.1.6: 2530 | dependencies: 2531 | consola: 3.4.2 2532 | 2533 | clean-regexp@1.0.0: 2534 | dependencies: 2535 | escape-string-regexp: 1.0.5 2536 | 2537 | color-convert@2.0.1: 2538 | dependencies: 2539 | color-name: 1.1.4 2540 | 2541 | color-name@1.1.4: {} 2542 | 2543 | concat-map@0.0.1: {} 2544 | 2545 | confbox@0.2.2: {} 2546 | 2547 | consola@3.4.2: {} 2548 | 2549 | convert-gitmoji@0.1.5: {} 2550 | 2551 | core-js-compat@3.47.0: 2552 | dependencies: 2553 | browserslist: 4.28.1 2554 | 2555 | cross-spawn@7.0.6: 2556 | dependencies: 2557 | path-key: 3.1.1 2558 | shebang-command: 2.0.0 2559 | which: 2.0.2 2560 | 2561 | debug@4.4.3: 2562 | dependencies: 2563 | ms: 2.1.3 2564 | 2565 | deep-is@0.1.4: {} 2566 | 2567 | default-browser-id@5.0.1: {} 2568 | 2569 | default-browser@5.4.0: 2570 | dependencies: 2571 | bundle-name: 4.1.0 2572 | default-browser-id: 5.0.1 2573 | 2574 | define-lazy-prop@3.0.0: {} 2575 | 2576 | defu@6.1.4: {} 2577 | 2578 | destr@2.0.5: {} 2579 | 2580 | dotenv@17.2.3: {} 2581 | 2582 | dts-resolver@2.1.3: {} 2583 | 2584 | electron-to-chromium@1.5.267: {} 2585 | 2586 | es-module-lexer@1.7.0: {} 2587 | 2588 | esbuild@0.27.2: 2589 | optionalDependencies: 2590 | '@esbuild/aix-ppc64': 0.27.2 2591 | '@esbuild/android-arm': 0.27.2 2592 | '@esbuild/android-arm64': 0.27.2 2593 | '@esbuild/android-x64': 0.27.2 2594 | '@esbuild/darwin-arm64': 0.27.2 2595 | '@esbuild/darwin-x64': 0.27.2 2596 | '@esbuild/freebsd-arm64': 0.27.2 2597 | '@esbuild/freebsd-x64': 0.27.2 2598 | '@esbuild/linux-arm': 0.27.2 2599 | '@esbuild/linux-arm64': 0.27.2 2600 | '@esbuild/linux-ia32': 0.27.2 2601 | '@esbuild/linux-loong64': 0.27.2 2602 | '@esbuild/linux-mips64el': 0.27.2 2603 | '@esbuild/linux-ppc64': 0.27.2 2604 | '@esbuild/linux-riscv64': 0.27.2 2605 | '@esbuild/linux-s390x': 0.27.2 2606 | '@esbuild/linux-x64': 0.27.2 2607 | '@esbuild/netbsd-arm64': 0.27.2 2608 | '@esbuild/netbsd-x64': 0.27.2 2609 | '@esbuild/openbsd-arm64': 0.27.2 2610 | '@esbuild/openbsd-x64': 0.27.2 2611 | '@esbuild/openharmony-arm64': 0.27.2 2612 | '@esbuild/sunos-x64': 0.27.2 2613 | '@esbuild/win32-arm64': 0.27.2 2614 | '@esbuild/win32-ia32': 0.27.2 2615 | '@esbuild/win32-x64': 0.27.2 2616 | 2617 | escalade@3.2.0: {} 2618 | 2619 | escape-string-regexp@1.0.5: {} 2620 | 2621 | escape-string-regexp@4.0.0: {} 2622 | 2623 | eslint-config-unjs@0.5.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): 2624 | dependencies: 2625 | '@eslint/js': 9.39.2 2626 | eslint: 9.39.2(jiti@2.6.1) 2627 | eslint-plugin-markdown: 5.1.0(eslint@9.39.2(jiti@2.6.1)) 2628 | eslint-plugin-unicorn: 59.0.1(eslint@9.39.2(jiti@2.6.1)) 2629 | globals: 16.5.0 2630 | typescript: 5.9.3 2631 | typescript-eslint: 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 2632 | transitivePeerDependencies: 2633 | - supports-color 2634 | 2635 | eslint-plugin-markdown@5.1.0(eslint@9.39.2(jiti@2.6.1)): 2636 | dependencies: 2637 | eslint: 9.39.2(jiti@2.6.1) 2638 | mdast-util-from-markdown: 0.8.5 2639 | transitivePeerDependencies: 2640 | - supports-color 2641 | 2642 | eslint-plugin-unicorn@59.0.1(eslint@9.39.2(jiti@2.6.1)): 2643 | dependencies: 2644 | '@babel/helper-validator-identifier': 7.28.5 2645 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) 2646 | '@eslint/plugin-kit': 0.2.8 2647 | ci-info: 4.3.1 2648 | clean-regexp: 1.0.0 2649 | core-js-compat: 3.47.0 2650 | eslint: 9.39.2(jiti@2.6.1) 2651 | esquery: 1.6.0 2652 | find-up-simple: 1.0.1 2653 | globals: 16.5.0 2654 | indent-string: 5.0.0 2655 | is-builtin-module: 5.0.0 2656 | jsesc: 3.1.0 2657 | pluralize: 8.0.0 2658 | regexp-tree: 0.1.27 2659 | regjsparser: 0.12.0 2660 | semver: 7.7.3 2661 | strip-indent: 4.1.1 2662 | 2663 | eslint-scope@8.4.0: 2664 | dependencies: 2665 | esrecurse: 4.3.0 2666 | estraverse: 5.3.0 2667 | 2668 | eslint-visitor-keys@3.4.3: {} 2669 | 2670 | eslint-visitor-keys@4.2.1: {} 2671 | 2672 | eslint@9.39.2(jiti@2.6.1): 2673 | dependencies: 2674 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) 2675 | '@eslint-community/regexpp': 4.12.2 2676 | '@eslint/config-array': 0.21.1 2677 | '@eslint/config-helpers': 0.4.2 2678 | '@eslint/core': 0.17.0 2679 | '@eslint/eslintrc': 3.3.3 2680 | '@eslint/js': 9.39.2 2681 | '@eslint/plugin-kit': 0.4.1 2682 | '@humanfs/node': 0.16.7 2683 | '@humanwhocodes/module-importer': 1.0.1 2684 | '@humanwhocodes/retry': 0.4.3 2685 | '@types/estree': 1.0.8 2686 | ajv: 6.12.6 2687 | chalk: 4.1.2 2688 | cross-spawn: 7.0.6 2689 | debug: 4.4.3 2690 | escape-string-regexp: 4.0.0 2691 | eslint-scope: 8.4.0 2692 | eslint-visitor-keys: 4.2.1 2693 | espree: 10.4.0 2694 | esquery: 1.6.0 2695 | esutils: 2.0.3 2696 | fast-deep-equal: 3.1.3 2697 | file-entry-cache: 8.0.0 2698 | find-up: 5.0.0 2699 | glob-parent: 6.0.2 2700 | ignore: 5.3.2 2701 | imurmurhash: 0.1.4 2702 | is-glob: 4.0.3 2703 | json-stable-stringify-without-jsonify: 1.0.1 2704 | lodash.merge: 4.6.2 2705 | minimatch: 3.1.2 2706 | natural-compare: 1.4.0 2707 | optionator: 0.9.4 2708 | optionalDependencies: 2709 | jiti: 2.6.1 2710 | transitivePeerDependencies: 2711 | - supports-color 2712 | 2713 | espree@10.4.0: 2714 | dependencies: 2715 | acorn: 8.15.0 2716 | acorn-jsx: 5.3.2(acorn@8.15.0) 2717 | eslint-visitor-keys: 4.2.1 2718 | 2719 | esquery@1.6.0: 2720 | dependencies: 2721 | estraverse: 5.3.0 2722 | 2723 | esrecurse@4.3.0: 2724 | dependencies: 2725 | estraverse: 5.3.0 2726 | 2727 | estraverse@5.3.0: {} 2728 | 2729 | estree-walker@3.0.3: 2730 | dependencies: 2731 | '@types/estree': 1.0.8 2732 | 2733 | esutils@2.0.3: {} 2734 | 2735 | expect-type@1.3.0: {} 2736 | 2737 | exsolve@1.0.8: {} 2738 | 2739 | fast-deep-equal@3.1.3: {} 2740 | 2741 | fast-json-stable-stringify@2.1.0: {} 2742 | 2743 | fast-levenshtein@2.0.6: {} 2744 | 2745 | fdir@6.5.0(picomatch@4.0.3): 2746 | optionalDependencies: 2747 | picomatch: 4.0.3 2748 | 2749 | file-entry-cache@8.0.0: 2750 | dependencies: 2751 | flat-cache: 4.0.1 2752 | 2753 | find-up-simple@1.0.1: {} 2754 | 2755 | find-up@5.0.0: 2756 | dependencies: 2757 | locate-path: 6.0.0 2758 | path-exists: 4.0.0 2759 | 2760 | flat-cache@4.0.1: 2761 | dependencies: 2762 | flatted: 3.3.3 2763 | keyv: 4.5.4 2764 | 2765 | flatted@3.3.3: {} 2766 | 2767 | fsevents@2.3.3: 2768 | optional: true 2769 | 2770 | get-tsconfig@4.13.0: 2771 | dependencies: 2772 | resolve-pkg-maps: 1.0.0 2773 | 2774 | giget@2.0.0: 2775 | dependencies: 2776 | citty: 0.1.6 2777 | consola: 3.4.2 2778 | defu: 6.1.4 2779 | node-fetch-native: 1.6.7 2780 | nypm: 0.6.2 2781 | pathe: 2.0.3 2782 | 2783 | glob-parent@6.0.2: 2784 | dependencies: 2785 | is-glob: 4.0.3 2786 | 2787 | globals@14.0.0: {} 2788 | 2789 | globals@16.5.0: {} 2790 | 2791 | has-flag@4.0.0: {} 2792 | 2793 | hookable@5.5.3: {} 2794 | 2795 | html-escaper@2.0.2: {} 2796 | 2797 | ignore@5.3.2: {} 2798 | 2799 | ignore@7.0.5: {} 2800 | 2801 | import-fresh@3.3.1: 2802 | dependencies: 2803 | parent-module: 1.0.1 2804 | resolve-from: 4.0.0 2805 | 2806 | imurmurhash@0.1.4: {} 2807 | 2808 | indent-string@5.0.0: {} 2809 | 2810 | is-alphabetical@1.0.4: {} 2811 | 2812 | is-alphanumerical@1.0.4: 2813 | dependencies: 2814 | is-alphabetical: 1.0.4 2815 | is-decimal: 1.0.4 2816 | 2817 | is-builtin-module@5.0.0: 2818 | dependencies: 2819 | builtin-modules: 5.0.0 2820 | 2821 | is-decimal@1.0.4: {} 2822 | 2823 | is-docker@3.0.0: {} 2824 | 2825 | is-extglob@2.1.1: {} 2826 | 2827 | is-glob@4.0.3: 2828 | dependencies: 2829 | is-extglob: 2.1.1 2830 | 2831 | is-hexadecimal@1.0.4: {} 2832 | 2833 | is-inside-container@1.0.0: 2834 | dependencies: 2835 | is-docker: 3.0.0 2836 | 2837 | is-wsl@3.1.0: 2838 | dependencies: 2839 | is-inside-container: 1.0.0 2840 | 2841 | isexe@2.0.0: {} 2842 | 2843 | istanbul-lib-coverage@3.2.2: {} 2844 | 2845 | istanbul-lib-report@3.0.1: 2846 | dependencies: 2847 | istanbul-lib-coverage: 3.2.2 2848 | make-dir: 4.0.0 2849 | supports-color: 7.2.0 2850 | 2851 | istanbul-lib-source-maps@5.0.6: 2852 | dependencies: 2853 | '@jridgewell/trace-mapping': 0.3.31 2854 | debug: 4.4.3 2855 | istanbul-lib-coverage: 3.2.2 2856 | transitivePeerDependencies: 2857 | - supports-color 2858 | 2859 | istanbul-reports@3.2.0: 2860 | dependencies: 2861 | html-escaper: 2.0.2 2862 | istanbul-lib-report: 3.0.1 2863 | 2864 | jiti@2.6.1: {} 2865 | 2866 | js-tokens@9.0.1: {} 2867 | 2868 | js-yaml@4.1.1: 2869 | dependencies: 2870 | argparse: 2.0.1 2871 | 2872 | jsesc@3.0.2: {} 2873 | 2874 | jsesc@3.1.0: {} 2875 | 2876 | json-buffer@3.0.1: {} 2877 | 2878 | json-schema-traverse@0.4.1: {} 2879 | 2880 | json-stable-stringify-without-jsonify@1.0.1: {} 2881 | 2882 | keyv@4.5.4: 2883 | dependencies: 2884 | json-buffer: 3.0.1 2885 | 2886 | levn@0.4.1: 2887 | dependencies: 2888 | prelude-ls: 1.2.1 2889 | type-check: 0.4.0 2890 | 2891 | locate-path@6.0.0: 2892 | dependencies: 2893 | p-locate: 5.0.0 2894 | 2895 | lodash.merge@4.6.2: {} 2896 | 2897 | magic-string@0.30.21: 2898 | dependencies: 2899 | '@jridgewell/sourcemap-codec': 1.5.5 2900 | 2901 | magicast@0.5.1: 2902 | dependencies: 2903 | '@babel/parser': 7.28.5 2904 | '@babel/types': 7.28.5 2905 | source-map-js: 1.2.1 2906 | 2907 | make-dir@4.0.0: 2908 | dependencies: 2909 | semver: 7.7.3 2910 | 2911 | mdast-util-from-markdown@0.8.5: 2912 | dependencies: 2913 | '@types/mdast': 3.0.15 2914 | mdast-util-to-string: 2.0.0 2915 | micromark: 2.11.4 2916 | parse-entities: 2.0.0 2917 | unist-util-stringify-position: 2.0.3 2918 | transitivePeerDependencies: 2919 | - supports-color 2920 | 2921 | mdast-util-to-string@2.0.0: {} 2922 | 2923 | micromark@2.11.4: 2924 | dependencies: 2925 | debug: 4.4.3 2926 | parse-entities: 2.0.0 2927 | transitivePeerDependencies: 2928 | - supports-color 2929 | 2930 | minimatch@3.1.2: 2931 | dependencies: 2932 | brace-expansion: 1.1.12 2933 | 2934 | minimatch@9.0.5: 2935 | dependencies: 2936 | brace-expansion: 2.0.2 2937 | 2938 | mitata@1.0.34: {} 2939 | 2940 | mri@1.2.0: {} 2941 | 2942 | ms@2.1.3: {} 2943 | 2944 | nanoid@3.3.11: {} 2945 | 2946 | natural-compare@1.4.0: {} 2947 | 2948 | node-fetch-native@1.6.7: {} 2949 | 2950 | node-releases@2.0.27: {} 2951 | 2952 | nypm@0.6.2: 2953 | dependencies: 2954 | citty: 0.1.6 2955 | consola: 3.4.2 2956 | pathe: 2.0.3 2957 | pkg-types: 2.3.0 2958 | tinyexec: 1.0.2 2959 | 2960 | obug@2.1.1: {} 2961 | 2962 | obuild@0.4.9(magicast@0.5.1)(typescript@5.9.3): 2963 | dependencies: 2964 | c12: 3.3.3(magicast@0.5.1) 2965 | consola: 3.4.2 2966 | defu: 6.1.4 2967 | exsolve: 1.0.8 2968 | magic-string: 0.30.21 2969 | oxc-minify: 0.103.0 2970 | oxc-parser: 0.103.0 2971 | oxc-transform: 0.103.0 2972 | pathe: 2.0.3 2973 | pretty-bytes: 7.1.0 2974 | rolldown: 1.0.0-beta.55 2975 | rolldown-plugin-dts: 0.19.1(rolldown@1.0.0-beta.55)(typescript@5.9.3) 2976 | tinyglobby: 0.2.15 2977 | transitivePeerDependencies: 2978 | - '@ts-macro/tsc' 2979 | - '@typescript/native-preview' 2980 | - magicast 2981 | - oxc-resolver 2982 | - typescript 2983 | - vue-tsc 2984 | 2985 | ofetch@1.5.1: 2986 | dependencies: 2987 | destr: 2.0.5 2988 | node-fetch-native: 1.6.7 2989 | ufo: 1.6.1 2990 | 2991 | ohash@2.0.11: {} 2992 | 2993 | open@10.2.0: 2994 | dependencies: 2995 | default-browser: 5.4.0 2996 | define-lazy-prop: 3.0.0 2997 | is-inside-container: 1.0.0 2998 | wsl-utils: 0.1.0 2999 | 3000 | optionator@0.9.4: 3001 | dependencies: 3002 | deep-is: 0.1.4 3003 | fast-levenshtein: 2.0.6 3004 | levn: 0.4.1 3005 | prelude-ls: 1.2.1 3006 | type-check: 0.4.0 3007 | word-wrap: 1.2.5 3008 | 3009 | oxc-minify@0.103.0: 3010 | optionalDependencies: 3011 | '@oxc-minify/binding-android-arm64': 0.103.0 3012 | '@oxc-minify/binding-darwin-arm64': 0.103.0 3013 | '@oxc-minify/binding-darwin-x64': 0.103.0 3014 | '@oxc-minify/binding-freebsd-x64': 0.103.0 3015 | '@oxc-minify/binding-linux-arm-gnueabihf': 0.103.0 3016 | '@oxc-minify/binding-linux-arm64-gnu': 0.103.0 3017 | '@oxc-minify/binding-linux-arm64-musl': 0.103.0 3018 | '@oxc-minify/binding-linux-riscv64-gnu': 0.103.0 3019 | '@oxc-minify/binding-linux-s390x-gnu': 0.103.0 3020 | '@oxc-minify/binding-linux-x64-gnu': 0.103.0 3021 | '@oxc-minify/binding-linux-x64-musl': 0.103.0 3022 | '@oxc-minify/binding-openharmony-arm64': 0.103.0 3023 | '@oxc-minify/binding-wasm32-wasi': 0.103.0 3024 | '@oxc-minify/binding-win32-arm64-msvc': 0.103.0 3025 | '@oxc-minify/binding-win32-x64-msvc': 0.103.0 3026 | 3027 | oxc-parser@0.103.0: 3028 | dependencies: 3029 | '@oxc-project/types': 0.103.0 3030 | optionalDependencies: 3031 | '@oxc-parser/binding-android-arm64': 0.103.0 3032 | '@oxc-parser/binding-darwin-arm64': 0.103.0 3033 | '@oxc-parser/binding-darwin-x64': 0.103.0 3034 | '@oxc-parser/binding-freebsd-x64': 0.103.0 3035 | '@oxc-parser/binding-linux-arm-gnueabihf': 0.103.0 3036 | '@oxc-parser/binding-linux-arm64-gnu': 0.103.0 3037 | '@oxc-parser/binding-linux-arm64-musl': 0.103.0 3038 | '@oxc-parser/binding-linux-riscv64-gnu': 0.103.0 3039 | '@oxc-parser/binding-linux-s390x-gnu': 0.103.0 3040 | '@oxc-parser/binding-linux-x64-gnu': 0.103.0 3041 | '@oxc-parser/binding-linux-x64-musl': 0.103.0 3042 | '@oxc-parser/binding-openharmony-arm64': 0.103.0 3043 | '@oxc-parser/binding-wasm32-wasi': 0.103.0 3044 | '@oxc-parser/binding-win32-arm64-msvc': 0.103.0 3045 | '@oxc-parser/binding-win32-x64-msvc': 0.103.0 3046 | 3047 | oxc-transform@0.103.0: 3048 | optionalDependencies: 3049 | '@oxc-transform/binding-android-arm64': 0.103.0 3050 | '@oxc-transform/binding-darwin-arm64': 0.103.0 3051 | '@oxc-transform/binding-darwin-x64': 0.103.0 3052 | '@oxc-transform/binding-freebsd-x64': 0.103.0 3053 | '@oxc-transform/binding-linux-arm-gnueabihf': 0.103.0 3054 | '@oxc-transform/binding-linux-arm64-gnu': 0.103.0 3055 | '@oxc-transform/binding-linux-arm64-musl': 0.103.0 3056 | '@oxc-transform/binding-linux-riscv64-gnu': 0.103.0 3057 | '@oxc-transform/binding-linux-s390x-gnu': 0.103.0 3058 | '@oxc-transform/binding-linux-x64-gnu': 0.103.0 3059 | '@oxc-transform/binding-linux-x64-musl': 0.103.0 3060 | '@oxc-transform/binding-openharmony-arm64': 0.103.0 3061 | '@oxc-transform/binding-wasm32-wasi': 0.103.0 3062 | '@oxc-transform/binding-win32-arm64-msvc': 0.103.0 3063 | '@oxc-transform/binding-win32-x64-msvc': 0.103.0 3064 | 3065 | p-limit@3.1.0: 3066 | dependencies: 3067 | yocto-queue: 0.1.0 3068 | 3069 | p-locate@5.0.0: 3070 | dependencies: 3071 | p-limit: 3.1.0 3072 | 3073 | parent-module@1.0.1: 3074 | dependencies: 3075 | callsites: 3.1.0 3076 | 3077 | parse-entities@2.0.0: 3078 | dependencies: 3079 | character-entities: 1.2.4 3080 | character-entities-legacy: 1.1.4 3081 | character-reference-invalid: 1.1.4 3082 | is-alphanumerical: 1.0.4 3083 | is-decimal: 1.0.4 3084 | is-hexadecimal: 1.0.4 3085 | 3086 | path-exists@4.0.0: {} 3087 | 3088 | path-key@3.1.1: {} 3089 | 3090 | pathe@2.0.3: {} 3091 | 3092 | perfect-debounce@2.0.0: {} 3093 | 3094 | picocolors@1.1.1: {} 3095 | 3096 | picomatch@4.0.3: {} 3097 | 3098 | pkg-types@2.3.0: 3099 | dependencies: 3100 | confbox: 0.2.2 3101 | exsolve: 1.0.8 3102 | pathe: 2.0.3 3103 | 3104 | pluralize@8.0.0: {} 3105 | 3106 | postcss@8.5.6: 3107 | dependencies: 3108 | nanoid: 3.3.11 3109 | picocolors: 1.1.1 3110 | source-map-js: 1.2.1 3111 | 3112 | prelude-ls@1.2.1: {} 3113 | 3114 | prettier@3.7.4: {} 3115 | 3116 | pretty-bytes@7.1.0: {} 3117 | 3118 | punycode@2.3.1: {} 3119 | 3120 | rc9@2.1.2: 3121 | dependencies: 3122 | defu: 6.1.4 3123 | destr: 2.0.5 3124 | 3125 | readdirp@5.0.0: {} 3126 | 3127 | regexp-tree@0.1.27: {} 3128 | 3129 | regjsparser@0.12.0: 3130 | dependencies: 3131 | jsesc: 3.0.2 3132 | 3133 | resolve-from@4.0.0: {} 3134 | 3135 | resolve-pkg-maps@1.0.0: {} 3136 | 3137 | rolldown-plugin-dts@0.19.1(rolldown@1.0.0-beta.55)(typescript@5.9.3): 3138 | dependencies: 3139 | '@babel/generator': 7.28.5 3140 | '@babel/parser': 7.28.5 3141 | '@babel/types': 7.28.5 3142 | ast-kit: 2.2.0 3143 | birpc: 4.0.0 3144 | dts-resolver: 2.1.3 3145 | get-tsconfig: 4.13.0 3146 | obug: 2.1.1 3147 | rolldown: 1.0.0-beta.55 3148 | optionalDependencies: 3149 | typescript: 5.9.3 3150 | transitivePeerDependencies: 3151 | - oxc-resolver 3152 | 3153 | rolldown@1.0.0-beta.55: 3154 | dependencies: 3155 | '@oxc-project/types': 0.103.0 3156 | '@rolldown/pluginutils': 1.0.0-beta.55 3157 | optionalDependencies: 3158 | '@rolldown/binding-android-arm64': 1.0.0-beta.55 3159 | '@rolldown/binding-darwin-arm64': 1.0.0-beta.55 3160 | '@rolldown/binding-darwin-x64': 1.0.0-beta.55 3161 | '@rolldown/binding-freebsd-x64': 1.0.0-beta.55 3162 | '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.55 3163 | '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.55 3164 | '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.55 3165 | '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.55 3166 | '@rolldown/binding-linux-x64-musl': 1.0.0-beta.55 3167 | '@rolldown/binding-openharmony-arm64': 1.0.0-beta.55 3168 | '@rolldown/binding-wasm32-wasi': 1.0.0-beta.55 3169 | '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.55 3170 | '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.55 3171 | 3172 | rollup@4.53.5: 3173 | dependencies: 3174 | '@types/estree': 1.0.8 3175 | optionalDependencies: 3176 | '@rollup/rollup-android-arm-eabi': 4.53.5 3177 | '@rollup/rollup-android-arm64': 4.53.5 3178 | '@rollup/rollup-darwin-arm64': 4.53.5 3179 | '@rollup/rollup-darwin-x64': 4.53.5 3180 | '@rollup/rollup-freebsd-arm64': 4.53.5 3181 | '@rollup/rollup-freebsd-x64': 4.53.5 3182 | '@rollup/rollup-linux-arm-gnueabihf': 4.53.5 3183 | '@rollup/rollup-linux-arm-musleabihf': 4.53.5 3184 | '@rollup/rollup-linux-arm64-gnu': 4.53.5 3185 | '@rollup/rollup-linux-arm64-musl': 4.53.5 3186 | '@rollup/rollup-linux-loong64-gnu': 4.53.5 3187 | '@rollup/rollup-linux-ppc64-gnu': 4.53.5 3188 | '@rollup/rollup-linux-riscv64-gnu': 4.53.5 3189 | '@rollup/rollup-linux-riscv64-musl': 4.53.5 3190 | '@rollup/rollup-linux-s390x-gnu': 4.53.5 3191 | '@rollup/rollup-linux-x64-gnu': 4.53.5 3192 | '@rollup/rollup-linux-x64-musl': 4.53.5 3193 | '@rollup/rollup-openharmony-arm64': 4.53.5 3194 | '@rollup/rollup-win32-arm64-msvc': 4.53.5 3195 | '@rollup/rollup-win32-ia32-msvc': 4.53.5 3196 | '@rollup/rollup-win32-x64-gnu': 4.53.5 3197 | '@rollup/rollup-win32-x64-msvc': 4.53.5 3198 | fsevents: 2.3.3 3199 | 3200 | run-applescript@7.1.0: {} 3201 | 3202 | scule@1.3.0: {} 3203 | 3204 | semver@7.7.3: {} 3205 | 3206 | shebang-command@2.0.0: 3207 | dependencies: 3208 | shebang-regex: 3.0.0 3209 | 3210 | shebang-regex@3.0.0: {} 3211 | 3212 | siginfo@2.0.0: {} 3213 | 3214 | source-map-js@1.2.1: {} 3215 | 3216 | stackback@0.0.2: {} 3217 | 3218 | std-env@3.10.0: {} 3219 | 3220 | strip-indent@4.1.1: {} 3221 | 3222 | strip-json-comments@3.1.1: {} 3223 | 3224 | supports-color@7.2.0: 3225 | dependencies: 3226 | has-flag: 4.0.0 3227 | 3228 | tinybench@2.9.0: {} 3229 | 3230 | tinyexec@1.0.2: {} 3231 | 3232 | tinyglobby@0.2.15: 3233 | dependencies: 3234 | fdir: 6.5.0(picomatch@4.0.3) 3235 | picomatch: 4.0.3 3236 | 3237 | tinyrainbow@3.0.3: {} 3238 | 3239 | ts-api-utils@2.1.0(typescript@5.9.3): 3240 | dependencies: 3241 | typescript: 5.9.3 3242 | 3243 | tslib@2.8.1: 3244 | optional: true 3245 | 3246 | type-check@0.4.0: 3247 | dependencies: 3248 | prelude-ls: 1.2.1 3249 | 3250 | typescript-eslint@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): 3251 | dependencies: 3252 | '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3253 | '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3254 | '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) 3255 | '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3256 | eslint: 9.39.2(jiti@2.6.1) 3257 | typescript: 5.9.3 3258 | transitivePeerDependencies: 3259 | - supports-color 3260 | 3261 | typescript@5.9.3: {} 3262 | 3263 | ufo@1.6.1: {} 3264 | 3265 | undici-types@7.16.0: {} 3266 | 3267 | unist-util-stringify-position@2.0.3: 3268 | dependencies: 3269 | '@types/unist': 2.0.11 3270 | 3271 | update-browserslist-db@1.2.3(browserslist@4.28.1): 3272 | dependencies: 3273 | browserslist: 4.28.1 3274 | escalade: 3.2.0 3275 | picocolors: 1.1.1 3276 | 3277 | uri-js@4.4.1: 3278 | dependencies: 3279 | punycode: 2.3.1 3280 | 3281 | vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1): 3282 | dependencies: 3283 | esbuild: 0.27.2 3284 | fdir: 6.5.0(picomatch@4.0.3) 3285 | picomatch: 4.0.3 3286 | postcss: 8.5.6 3287 | rollup: 4.53.5 3288 | tinyglobby: 0.2.15 3289 | optionalDependencies: 3290 | '@types/node': 25.0.3 3291 | fsevents: 2.3.3 3292 | jiti: 2.6.1 3293 | 3294 | vitest@4.0.16(@types/node@25.0.3)(jiti@2.6.1): 3295 | dependencies: 3296 | '@vitest/expect': 4.0.16 3297 | '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)) 3298 | '@vitest/pretty-format': 4.0.16 3299 | '@vitest/runner': 4.0.16 3300 | '@vitest/snapshot': 4.0.16 3301 | '@vitest/spy': 4.0.16 3302 | '@vitest/utils': 4.0.16 3303 | es-module-lexer: 1.7.0 3304 | expect-type: 1.3.0 3305 | magic-string: 0.30.21 3306 | obug: 2.1.1 3307 | pathe: 2.0.3 3308 | picomatch: 4.0.3 3309 | std-env: 3.10.0 3310 | tinybench: 2.9.0 3311 | tinyexec: 1.0.2 3312 | tinyglobby: 0.2.15 3313 | tinyrainbow: 3.0.3 3314 | vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1) 3315 | why-is-node-running: 2.3.0 3316 | optionalDependencies: 3317 | '@types/node': 25.0.3 3318 | transitivePeerDependencies: 3319 | - jiti 3320 | - less 3321 | - lightningcss 3322 | - msw 3323 | - sass 3324 | - sass-embedded 3325 | - stylus 3326 | - sugarss 3327 | - terser 3328 | - tsx 3329 | - yaml 3330 | 3331 | which@2.0.2: 3332 | dependencies: 3333 | isexe: 2.0.0 3334 | 3335 | why-is-node-running@2.3.0: 3336 | dependencies: 3337 | siginfo: 2.0.0 3338 | stackback: 0.0.2 3339 | 3340 | word-wrap@1.2.5: {} 3341 | 3342 | wsl-utils@0.1.0: 3343 | dependencies: 3344 | is-wsl: 3.1.0 3345 | 3346 | yocto-queue@0.1.0: {} 3347 | --------------------------------------------------------------------------------