├── .gitattributes ├── .envrc ├── src ├── core │ ├── index.ts │ ├── plugin.ts │ └── generator.ts ├── utils │ ├── index.ts │ ├── hashing.ts │ ├── fragments.ts │ ├── transforms.ts │ └── __tests__ │ │ ├── transforms.test.ts │ │ └── fragments.test.ts ├── index.ts ├── __tests__ │ ├── fixtures │ │ ├── test-schema.graphql │ │ └── test-documents.graphql │ ├── integration.test.ts │ └── __snapshots__ │ │ └── integration.test.ts.snap └── types │ └── index.ts ├── .prettierrc ├── vitest.config.ts ├── tsup.config.ts ├── eslint.config.mjs ├── tsconfig.json ├── LICENSE ├── flake.nix ├── .github └── workflows │ └── ci.yml ├── flake.lock ├── package.json ├── .gitignore ├── README.md └── pnpm-lock.yaml /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | dotenv_if_exists 3 | PATH_add ./node_modules/.bin -------------------------------------------------------------------------------- /src/core/index.ts: -------------------------------------------------------------------------------- 1 | export * from './generator'; 2 | export * from './plugin'; 3 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './fragments'; 2 | export * from './hashing'; 3 | export * from './transforms'; 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "quoteProps": "as-needed", 3 | "trailingComma": "all", 4 | "tabWidth": 2, 5 | "semi": true, 6 | "singleQuote": true, 7 | "bracketSpacing": true, 8 | "useTabs": false, 9 | "arrowParens": "always" 10 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * GraphQL CodeGen Plugin for Persisted Query Lists 3 | * 4 | * The plugin can generate manifests in two formats: 5 | * - Client format: Maps operation names to query hashes 6 | * - Server format: Maps query hashes to full operation details 7 | */ 8 | 9 | export * from './types'; 10 | export * from './core'; 11 | export * from './utils'; 12 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | globals: true, 6 | environment: 'node', 7 | include: ['src/**/__tests__/**/*.test.ts', 'src/**/*.test.ts'], 8 | coverage: { 9 | reporter: ['text', 'json', 'html'], 10 | exclude: ['node_modules/'], 11 | }, 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig({ 4 | clean: true, 5 | dts: true, 6 | entry: ['src/index.ts'], 7 | format: ['esm', 'cjs'], 8 | sourcemap: true, 9 | minify: true, 10 | target: 'esnext', 11 | outDir: 'dist', 12 | treeshake: true, 13 | outExtension({ format }) { 14 | return { 15 | js: format === 'esm' ? '.mjs' : '.js', 16 | }; 17 | }, 18 | }); 19 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js'; 2 | import tseslint from 'typescript-eslint'; 3 | import prettierRecommended from 'eslint-plugin-prettier/recommended'; 4 | 5 | export default tseslint.config( 6 | eslint.configs.recommended, 7 | { 8 | ignores: ["dist/**/*", "eslint.config.mjs"], 9 | }, 10 | ...tseslint.configs.strict, 11 | ...tseslint.configs.stylistic, 12 | { 13 | languageOptions: { 14 | parserOptions: { 15 | project: "./tsconfig.json", 16 | }, 17 | }, 18 | }, 19 | prettierRecommended, 20 | ); -------------------------------------------------------------------------------- /src/__tests__/fixtures/test-schema.graphql: -------------------------------------------------------------------------------- 1 | type User { 2 | id: ID! 3 | name: String! 4 | email: String 5 | posts: [Post!] 6 | } 7 | 8 | type Post { 9 | id: ID! 10 | title: String! 11 | content: String 12 | author: User! 13 | } 14 | 15 | type Query { 16 | hello: String! 17 | user(id: ID!): User 18 | users: [User!]! 19 | post(id: ID!): Post 20 | posts: [Post!]! 21 | } 22 | 23 | type Mutation { 24 | createUser(name: String!, email: String): User! 25 | updateUser(id: ID!, name: String, email: String): User 26 | deleteUser(id: ID!): Boolean! 27 | createPost(title: String!, content: String, authorId: ID!): Post! 28 | } 29 | 30 | type Subscription { 31 | userCreated: User! 32 | postCreated: Post! 33 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "declaration": true, 6 | "declarationDir": "dist", 7 | "declarationMap": true, 8 | "outDir": "./dist", 9 | "strict": true, 10 | "noImplicitAny": true, 11 | "strictNullChecks": true, 12 | "strictFunctionTypes": true, 13 | "strictBindCallApply": true, 14 | "strictPropertyInitialization": true, 15 | "noImplicitThis": true, 16 | "alwaysStrict": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noImplicitReturns": true, 20 | "resolveJsonModule": true, 21 | "moduleResolution": "bundler", 22 | "esModuleInterop": true, 23 | "skipLibCheck": true, 24 | "forceConsistentCasingInFileNames": true 25 | } 26 | } -------------------------------------------------------------------------------- /src/utils/hashing.ts: -------------------------------------------------------------------------------- 1 | import * as crypto from 'node:crypto'; 2 | import { PluginConfig } from '../types'; 3 | 4 | /** 5 | * Creates a hash for a given string using the specified algorithm 6 | * 7 | * @param content - The content string to hash 8 | * @param config - Plugin configuration 9 | * @returns A hex string hash of the content by default, or a prefixed hash (e.g. "sha256:abc123...") 10 | * when includeAlgorithmPrefix is true for GraphQL over HTTP specification compliance 11 | */ 12 | export function createHash(content: string, config: PluginConfig): string { 13 | const algorithm = config.algorithm || 'sha256'; 14 | 15 | const digest = crypto 16 | .createHash(algorithm) 17 | .update(content, 'utf8') 18 | .digest() 19 | .toString('hex'); 20 | 21 | // Only prefix with algorithm if includeAlgorithmPrefix is true 22 | return config.includeAlgorithmPrefix === true 23 | ? `${algorithm}:${digest}` 24 | : digest; 25 | } 26 | -------------------------------------------------------------------------------- /src/__tests__/fixtures/test-documents.graphql: -------------------------------------------------------------------------------- 1 | fragment UserFields on User { 2 | id 3 | name 4 | email 5 | } 6 | 7 | fragment PostFields on Post { 8 | id 9 | title 10 | content 11 | } 12 | 13 | query HelloQuery { 14 | hello 15 | } 16 | 17 | query GetUser($id: ID!) { 18 | user(id: $id) { 19 | ...UserFields 20 | posts { 21 | ...PostFields 22 | } 23 | } 24 | } 25 | 26 | query GetUsers { 27 | users { 28 | ...UserFields 29 | } 30 | } 31 | 32 | query GetPost($id: ID!) { 33 | post(id: $id) { 34 | ...PostFields 35 | author { 36 | ...UserFields 37 | } 38 | } 39 | } 40 | 41 | query GetPosts { 42 | posts { 43 | ...PostFields 44 | } 45 | } 46 | 47 | mutation CreateUser($name: String!, $email: String) { 48 | createUser(name: $name, email: $email) { 49 | ...UserFields 50 | } 51 | } 52 | 53 | mutation UpdateUser($id: ID!, $name: String, $email: String) { 54 | updateUser(id: $id, name: $name, email: $email) { 55 | ...UserFields 56 | } 57 | } 58 | 59 | subscription OnUserCreated { 60 | userCreated { 61 | ...UserFields 62 | } 63 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Replit 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 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs = { 3 | nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; 4 | flake-utils.url = "github:numtide/flake-utils"; 5 | }; 6 | 7 | outputs = { self, nixpkgs, flake-utils }: 8 | let 9 | mkDevShell = system: 10 | let 11 | pkgs = nixpkgs.legacyPackages.${system}; 12 | in 13 | pkgs.mkShell { 14 | buildInputs = with pkgs; [ 15 | nodejs_20 16 | nodePackages.typescript 17 | nodePackages.typescript-language-server 18 | nodePackages.prettier 19 | nodePackages.pnpm 20 | ]; 21 | 22 | shellHook = '' 23 | echo "Node.js: $(node --version)" 24 | echo "pnpm: $(pnpm --version)" 25 | ''; 26 | }; 27 | in 28 | (flake-utils.lib.eachDefaultSystem (system: { 29 | devShells.default = mkDevShell system; 30 | })) // { 31 | devShells.aarch64-darwin.default = mkDevShell "aarch64-darwin"; 32 | devShells.x86_64-darwin.default = mkDevShell "x86_64-darwin"; 33 | devShells.aarch64-linux.default = mkDevShell "aarch64-linux"; 34 | devShells.x86_64-linux.default = mkDevShell "x86_64-linux"; 35 | }; 36 | } -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Build and Test 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - '**' 7 | push: 8 | branches: 9 | - main 10 | 11 | jobs: 12 | build-and-test: 13 | runs-on: ubuntu-latest 14 | permissions: 15 | contents: write 16 | actions: read 17 | checks: write 18 | steps: 19 | - uses: actions/checkout@v3 20 | with: 21 | fetch-depth: 0 22 | 23 | - name: Setup Node 24 | uses: actions/setup-node@v3 25 | with: 26 | node-version: 22 27 | 28 | - name: Setup pnpm 29 | uses: pnpm/action-setup@v2 30 | with: 31 | version: 8.15.5 32 | run_install: false 33 | 34 | - name: Get pnpm store directory 35 | shell: bash 36 | run: | 37 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV 38 | 39 | - name: Cache pnpm dependencies 40 | uses: actions/cache@v3 41 | with: 42 | path: ${{ env.STORE_PATH }} 43 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 44 | restore-keys: | 45 | ${{ runner.os }}-pnpm-store- 46 | 47 | - name: Install dependencies 48 | run: pnpm install --frozen-lockfile 49 | 50 | - name: Typecheck 51 | run: pnpm typecheck 52 | 53 | - name: Lint 54 | run: pnpm lint 55 | 56 | - name: Build 57 | run: pnpm build 58 | 59 | - name: Test 60 | run: pnpm test 61 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "inputs": { 5 | "systems": "systems" 6 | }, 7 | "locked": { 8 | "lastModified": 1731533236, 9 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 10 | "owner": "numtide", 11 | "repo": "flake-utils", 12 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 13 | "type": "github" 14 | }, 15 | "original": { 16 | "owner": "numtide", 17 | "repo": "flake-utils", 18 | "type": "github" 19 | } 20 | }, 21 | "nixpkgs": { 22 | "locked": { 23 | "lastModified": 1735563628, 24 | "narHash": "sha256-OnSAY7XDSx7CtDoqNh8jwVwh4xNL/2HaJxGjryLWzX8=", 25 | "owner": "nixos", 26 | "repo": "nixpkgs", 27 | "rev": "b134951a4c9f3c995fd7be05f3243f8ecd65d798", 28 | "type": "github" 29 | }, 30 | "original": { 31 | "owner": "nixos", 32 | "ref": "nixos-24.05", 33 | "repo": "nixpkgs", 34 | "type": "github" 35 | } 36 | }, 37 | "root": { 38 | "inputs": { 39 | "flake-utils": "flake-utils", 40 | "nixpkgs": "nixpkgs" 41 | } 42 | }, 43 | "systems": { 44 | "locked": { 45 | "lastModified": 1681028828, 46 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 47 | "owner": "nix-systems", 48 | "repo": "default", 49 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 50 | "type": "github" 51 | }, 52 | "original": { 53 | "owner": "nix-systems", 54 | "repo": "default", 55 | "type": "github" 56 | } 57 | } 58 | }, 59 | "root": "root", 60 | "version": 7 61 | } 62 | -------------------------------------------------------------------------------- /src/core/plugin.ts: -------------------------------------------------------------------------------- 1 | import { DocumentNode } from 'graphql'; 2 | import { PersistedQueryPlugin } from '../types'; 3 | import { generateClientManifest, generateServerManifest } from './generator'; 4 | 5 | /** 6 | * GraphQL CodeGen plugin for generating persisted operation manifests 7 | * 8 | * @param _schema - GraphQL schema (unused) 9 | * @param documents - GraphQL documents to process 10 | * @param config - Plugin configuration 11 | * @returns JSON string representation of the generated manifest 12 | * @throws Error if no documents are provided or output format is not specified 13 | * 14 | * For GraphQL over HTTP specification compliance, set `includeAlgorithmPrefix: true` 15 | * to enable the "Prefixed Document Identifier" format (e.g., `sha256:abc123...`). 16 | */ 17 | export const plugin: PersistedQueryPlugin = (_schema, documents, config) => { 18 | // Validate input documents 19 | if ( 20 | !documents || 21 | documents.length === 0 || 22 | documents.some((doc) => !doc?.document) 23 | ) { 24 | throw new Error('Found no documents to generate persisted operation ids.'); 25 | } 26 | 27 | // Extract document nodes 28 | const documentNodes: DocumentNode[] = documents 29 | .map((doc) => doc.document) 30 | .filter((doc): doc is DocumentNode => doc !== undefined); 31 | 32 | // Generate appropriate manifest format based on configuration 33 | if (config.output === 'client') { 34 | return JSON.stringify( 35 | generateClientManifest(documentNodes, config), 36 | null, 37 | ' ', 38 | ); 39 | } else if (config.output === 'server') { 40 | return JSON.stringify( 41 | generateServerManifest(documentNodes, config), 42 | null, 43 | ' ', 44 | ); 45 | } else { 46 | throw new Error("Must configure output to 'server' or 'client'"); 47 | } 48 | }; 49 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@replit/graphql-codegen-persisted-queries", 3 | "version": "0.1.2", 4 | "description": "GraphQL Codegen plugin to generate persisted query manifests for server and client", 5 | "main": "dist/index.js", 6 | "module": "dist/index.mjs", 7 | "types": "dist/index.d.ts", 8 | "exports": { 9 | ".": { 10 | "import": { 11 | "types": "./dist/index.d.mts", 12 | "default": "./dist/index.mjs" 13 | }, 14 | "require": { 15 | "types": "./dist/index.d.ts", 16 | "default": "./dist/index.js" 17 | } 18 | } 19 | }, 20 | "files": [ 21 | "dist", 22 | "README.md" 23 | ], 24 | "scripts": { 25 | "build": "tsup", 26 | "dev": "tsup --watch", 27 | "typecheck": "tsc --noEmit", 28 | "lint": "eslint . --ext .ts", 29 | "clean": "rm -rf dist", 30 | "prepare": "npm run build", 31 | "test": "vitest run", 32 | "test:watch": "vitest" 33 | }, 34 | "repository": { 35 | "type": "git", 36 | "url": "git+https://github.com/replit/graphql-codegen-persisted-queries.git" 37 | }, 38 | "keywords": [ 39 | "GraphQL", 40 | "Codegen", 41 | "PQL", 42 | "Persisted", 43 | "Queries" 44 | ], 45 | "author": "darsh.patel@repl.it", 46 | "license": "MIT", 47 | "bugs": { 48 | "url": "https://github.com/replit/graphql-codegen-persisted-queries/issues" 49 | }, 50 | "homepage": "https://github.com/replit/graphql-codegen-persisted-queries#readme", 51 | "packageManager": "pnpm@8.15.5", 52 | "peerDependencies": { 53 | "@graphql-codegen/plugin-helpers": "^5.0.0", 54 | "graphql": "^16.0.0" 55 | }, 56 | "devDependencies": { 57 | "@graphql-codegen/plugin-helpers": "^5.0.0", 58 | "@stylistic/eslint-plugin-js": "^4.2.0", 59 | "@stylistic/eslint-plugin-ts": "^4.2.0", 60 | "@types/node": "^22.13.10", 61 | "@typescript-eslint/eslint-plugin": "^8.26.1", 62 | "@typescript-eslint/parser": "^8.26.1", 63 | "eslint": "^9.22.0", 64 | "eslint-config-prettier": "^10.1.1", 65 | "eslint-plugin-prettier": "^5.2.3", 66 | "graphql": "^16.8.1", 67 | "prettier": "^3.5.3", 68 | "tsup": "^8.4.0", 69 | "typescript-eslint": "^8.26.1", 70 | "vitest": "^3.0.9" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/utils/fragments.ts: -------------------------------------------------------------------------------- 1 | import { 2 | DocumentNode, 3 | FragmentDefinitionNode, 4 | OperationDefinitionNode, 5 | visit, 6 | } from 'graphql'; 7 | 8 | /** 9 | * Extracts all fragment definitions from an array of documents 10 | * 11 | * @param docs - Array of GraphQL document nodes to scan 12 | * @returns A map of fragment names to their definitions 13 | */ 14 | export function findFragments( 15 | docs: (DocumentNode | FragmentDefinitionNode)[], 16 | ): Map { 17 | const fragments = new Map(); 18 | 19 | for (const doc of docs) { 20 | visit(doc, { 21 | FragmentDefinition: { 22 | enter(node) { 23 | fragments.set(node.name.value, node); 24 | }, 25 | }, 26 | }); 27 | } 28 | 29 | return fragments; 30 | } 31 | 32 | /** 33 | * Finds all fragments used in an operation or fragment, including nested fragments 34 | * 35 | * @param operation - The operation or fragment to analyze 36 | * @param knownFragments - Map of all available fragments 37 | * @param _usedFragments - Optional accumulator for recursive calls 38 | * @returns Map of all fragments used by the operation 39 | * @throws Error if a referenced fragment cannot be found 40 | */ 41 | export function findUsedFragments( 42 | operation: OperationDefinitionNode | FragmentDefinitionNode, 43 | knownFragments: ReadonlyMap, 44 | _usedFragments?: Map, 45 | ): Map { 46 | const usedFragments = _usedFragments 47 | ? _usedFragments 48 | : new Map(); 49 | 50 | visit(operation, { 51 | FragmentSpread: { 52 | enter(node) { 53 | const fragmentName = node.name.value; 54 | const fragment = knownFragments.get(fragmentName); 55 | 56 | if (fragment) { 57 | // Skip if we've already processed this fragment to avoid circular references 58 | if (usedFragments.has(fragmentName)) { 59 | return; 60 | } 61 | 62 | usedFragments.set(fragmentName, fragment); 63 | // Recursively find nested fragments 64 | findUsedFragments(fragment, knownFragments, usedFragments); 65 | } else { 66 | throw new Error(`Unknown fragment: ${fragmentName}`); 67 | } 68 | }, 69 | }, 70 | }); 71 | 72 | return usedFragments; 73 | } 74 | -------------------------------------------------------------------------------- /src/utils/transforms.ts: -------------------------------------------------------------------------------- 1 | import { 2 | DocumentNode, 3 | FieldNode, 4 | Kind, 5 | OperationDefinitionNode, 6 | print, 7 | visit, 8 | } from 'graphql'; 9 | import { Definition } from '../types'; 10 | 11 | /** 12 | * Typename field definition to add to selection sets 13 | */ 14 | const TYPENAME_FIELD: FieldNode = { 15 | kind: Kind.FIELD, 16 | name: { 17 | kind: Kind.NAME, 18 | value: '__typename', 19 | }, 20 | }; 21 | 22 | /** 23 | * Prints an array of definitions as a single string 24 | * 25 | * @param definitions - Array of GraphQL definitions to print 26 | * @returns Printed string representation 27 | */ 28 | export function printDefinitions( 29 | definitions: (Definition | DocumentNode)[], 30 | ): string { 31 | return definitions.map(print).join('\n\n'); 32 | } 33 | 34 | /** 35 | * Adds __typename to all selection sets in a document 36 | * Adapted from Apollo Client 37 | * 38 | * @param doc - GraphQL document node 39 | * @returns Document with __typename fields added 40 | */ 41 | export function addTypenameToDocument(doc: DocumentNode): DocumentNode { 42 | return visit(doc, { 43 | SelectionSet: { 44 | enter(node, _key, parent) { 45 | // Don't add __typename to OperationDefinitions 46 | if ( 47 | parent && 48 | (parent as OperationDefinitionNode).kind === 'OperationDefinition' 49 | ) { 50 | return; 51 | } 52 | 53 | // No changes if no selections 54 | const { selections } = node; 55 | if (!selections) { 56 | return; 57 | } 58 | 59 | // Skip if selection already has __typename 60 | const hasTypename = selections.some((selection) => { 61 | return ( 62 | selection.kind === 'Field' && 63 | (selection as FieldNode).name.value === '__typename' 64 | ); 65 | }); 66 | 67 | // Skip if this is an introspection query 68 | const isIntrospection = selections.some((selection) => { 69 | return ( 70 | selection.kind === 'Field' && 71 | (selection as FieldNode).name.value.startsWith('__') 72 | ); 73 | }); 74 | 75 | if (hasTypename || isIntrospection) { 76 | return; 77 | } 78 | 79 | // Create and return a new SelectionSet with a __typename Field 80 | return { 81 | ...node, 82 | selections: [...selections, TYPENAME_FIELD], 83 | }; 84 | }, 85 | }, 86 | }); 87 | } 88 | -------------------------------------------------------------------------------- /src/types/index.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | FragmentDefinitionNode, 3 | OperationDefinitionNode, 4 | OperationTypeNode, 5 | } from 'graphql'; 6 | import type { PluginFunction } from '@graphql-codegen/plugin-helpers'; 7 | 8 | /** 9 | * Configuration for the persisted query generator plugin 10 | */ 11 | export interface PluginConfig { 12 | /** 13 | * Output format - 'server' generates hash->operation mapping, 14 | * 'client' generates operation->hash mapping 15 | */ 16 | output: 'server' | 'client'; 17 | 18 | /** 19 | * Hash algorithm to use (defaults to 'sha256') 20 | */ 21 | algorithm?: string; 22 | 23 | /** 24 | * Whether to prefix the hash with the algorithm name (e.g. "sha256:abc123...") 25 | * Follows the GraphQL over HTTP specification when enabled 26 | * @see https://github.com/graphql/graphql-over-http/blob/52d56fb36d51c17e08a920510a23bdc2f6a720be/spec/Appendix%20A%20--%20Persisted%20Documents.md#sha256-hex-document-identifier 27 | * @default false 28 | */ 29 | includeAlgorithmPrefix?: boolean; 30 | } 31 | 32 | /** 33 | * Represents a single operation in the persisted query manifest 34 | */ 35 | export interface PersistedQueryManifestOperation { 36 | /** Operation type (query, mutation, subscription) */ 37 | type: OperationTypeNode; 38 | /** Operation name */ 39 | name: string; 40 | /** Full operation body text */ 41 | body: string; 42 | } 43 | 44 | /** 45 | * Server-side persisted operation manifest format 46 | */ 47 | export interface ServerOperationListManifest { 48 | format: 'apollo-persisted-query-manifest'; 49 | version: 1; 50 | operations: Record; 51 | } 52 | 53 | /** 54 | * Client-side persisted operation manifest format 55 | */ 56 | export type ClientOperationListManifest = Record; 57 | 58 | /** 59 | * Union type for both manifest formats 60 | */ 61 | export type OperationListManifest = 62 | | ServerOperationListManifest 63 | | ClientOperationListManifest; 64 | 65 | /** 66 | * Internal type for a GraphQL definition 67 | */ 68 | export type Definition = FragmentDefinitionNode | OperationDefinitionNode; 69 | 70 | /** 71 | * Represents a processed GraphQL operation with hash and query details 72 | */ 73 | export interface ProcessedOperation { 74 | name: string; 75 | hash: string; 76 | type: OperationTypeNode; 77 | query: string; 78 | definition: OperationDefinitionNode; 79 | fragments: FragmentDefinitionNode[]; 80 | } 81 | 82 | /** 83 | * Plugin function type 84 | */ 85 | export type PersistedQueryPlugin = PluginFunction; 86 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # vitepress build output 108 | **/.vitepress/dist 109 | 110 | # vitepress cache directory 111 | **/.vitepress/cache 112 | 113 | # Docusaurus cache and generated files 114 | .docusaurus 115 | 116 | # Serverless directories 117 | .serverless/ 118 | 119 | # FuseBox cache 120 | .fusebox/ 121 | 122 | # DynamoDB Local files 123 | .dynamodb/ 124 | 125 | # TernJS port file 126 | .tern-port 127 | 128 | # Stores VSCode versions used for testing VSCode extensions 129 | .vscode-test 130 | 131 | # yarn v2 132 | .yarn/cache 133 | .yarn/unplugged 134 | .yarn/build-state.yml 135 | .yarn/install-state.gz 136 | .pnp.* 137 | 138 | # Nix 139 | .direnv/ 140 | result 141 | result-* 142 | -------------------------------------------------------------------------------- /src/__tests__/integration.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, test, expect } from 'vitest'; 2 | import { plugin } from '../core/plugin'; 3 | import { parse, buildSchema } from 'graphql'; 4 | import { Types } from '@graphql-codegen/plugin-helpers'; 5 | import { readFileSync } from 'fs'; 6 | import { join } from 'path'; 7 | 8 | describe('Persisted Query Plugin Integration Tests', () => { 9 | // Load test schema and documents 10 | const schemaPath = join(__dirname, 'fixtures/test-schema.graphql'); 11 | const documentsPath = join(__dirname, 'fixtures/test-documents.graphql'); 12 | 13 | const schemaDoc = readFileSync(schemaPath, 'utf8'); 14 | const documentsDoc = readFileSync(documentsPath, 'utf8'); 15 | 16 | const schema = buildSchema(schemaDoc); 17 | const documentNode = parse(documentsDoc); 18 | 19 | const documents: Types.DocumentFile[] = [ 20 | { 21 | document: documentNode, 22 | location: documentsPath, 23 | }, 24 | ]; 25 | 26 | describe('Client Manifest Generation', () => { 27 | test('generates valid client manifest with default options', () => { 28 | const result = plugin(schema, documents, { output: 'client' }); 29 | // We know result is a string, but TypeScript sees it as Promisable 30 | const manifest = JSON.parse(result as string); 31 | 32 | // Use snapshot for client manifest 33 | expect(manifest).toMatchSnapshot(); 34 | }); 35 | 36 | test('generates valid client manifest with algorithm prefix', () => { 37 | const result = plugin(schema, documents, { 38 | output: 'client', 39 | includeAlgorithmPrefix: true, 40 | }); 41 | // We know result is a string, but TypeScript sees it as Promisable 42 | const manifest = JSON.parse(result as string); 43 | 44 | // Use snapshot for client manifest with algorithm prefix 45 | expect(manifest).toMatchSnapshot(); 46 | }); 47 | 48 | test('generates valid client manifest with custom algorithm', () => { 49 | const result = plugin(schema, documents, { 50 | output: 'client', 51 | algorithm: 'md5', 52 | }); 53 | // We know result is a string, but TypeScript sees it as Promisable 54 | const manifest = JSON.parse(result as string); 55 | 56 | // Use snapshot for client manifest with custom algorithm 57 | expect(manifest).toMatchSnapshot(); 58 | }); 59 | }); 60 | 61 | describe('Server Manifest Generation', () => { 62 | test('generates valid server manifest with default options', () => { 63 | const result = plugin(schema, documents, { output: 'server' }); 64 | // We know result is a string, but TypeScript sees it as Promisable 65 | const manifest = JSON.parse(result as string); 66 | 67 | // Use snapshot for server manifest 68 | expect(manifest).toMatchSnapshot(); 69 | }); 70 | }); 71 | 72 | describe('Error Handling', () => { 73 | test('throws error on missing operation names', () => { 74 | const docWithUnnamedOperation = parse(` 75 | query { 76 | hello 77 | } 78 | `); 79 | 80 | const docs: Types.DocumentFile[] = [ 81 | { 82 | document: docWithUnnamedOperation, 83 | location: 'test.graphql', 84 | }, 85 | ]; 86 | 87 | expect(() => plugin(schema, docs, { output: 'client' })).toThrow( 88 | 'OperationDefinition missing name', 89 | ); 90 | }); 91 | }); 92 | }); 93 | -------------------------------------------------------------------------------- /src/core/generator.ts: -------------------------------------------------------------------------------- 1 | import { DocumentNode, visit } from 'graphql'; 2 | import { 3 | PluginConfig, 4 | ClientOperationListManifest, 5 | ServerOperationListManifest, 6 | PersistedQueryManifestOperation, 7 | ProcessedOperation, 8 | } from '../types'; 9 | import { createHash } from '../utils/hashing'; 10 | import { addTypenameToDocument } from '../utils/transforms'; 11 | import { findFragments, findUsedFragments } from '../utils/fragments'; 12 | import { printDefinitions } from '../utils/transforms'; 13 | 14 | /** 15 | * Process documents and generate operation hashes with their details 16 | * 17 | * @param docs - Array of GraphQL document nodes 18 | * @param config - Plugin configuration 19 | * @returns Array of processed operations with their details 20 | * @throws Error if an operation is missing a name 21 | */ 22 | function processOperations( 23 | docs: DocumentNode[], 24 | config: PluginConfig, 25 | ): ProcessedOperation[] { 26 | // Add __typename to all selection sets 27 | const processedDocs = docs.map(addTypenameToDocument); 28 | const operations: ProcessedOperation[] = []; 29 | 30 | const knownFragments = findFragments(processedDocs); 31 | 32 | for (const doc of processedDocs) { 33 | visit(doc, { 34 | OperationDefinition: { 35 | enter(def) { 36 | if (!def.name) { 37 | throw new Error('OperationDefinition missing name'); 38 | } 39 | 40 | const operationName = def.name.value; 41 | const usedFragments = findUsedFragments(def, knownFragments); 42 | 43 | // The order is important here. We want to have the operation definition first, 44 | // then the fragments as they are included. 45 | // Otherwise, the generated hashes won't match with the one generated on the server. 46 | const query = printDefinitions([def, ...usedFragments.values()]); 47 | 48 | const hash = createHash(query, config); 49 | 50 | operations.push({ 51 | name: operationName, 52 | hash, 53 | type: def.operation, 54 | query, 55 | definition: def, 56 | fragments: Array.from(usedFragments.values()), 57 | }); 58 | }, 59 | }, 60 | }); 61 | } 62 | 63 | return operations; 64 | } 65 | 66 | /** 67 | * Generates a client-side persisted query manifest 68 | * Client manifests map operation names to their hash 69 | * 70 | * @param docs - Array of GraphQL document nodes 71 | * @param config - Plugin configuration 72 | * @returns Client-side manifest object 73 | * @throws Error if an operation is missing a name 74 | */ 75 | export function generateClientManifest( 76 | docs: DocumentNode[], 77 | config: PluginConfig, 78 | ): ClientOperationListManifest { 79 | const operations = processOperations(docs, config); 80 | const manifest: ClientOperationListManifest = {}; 81 | 82 | for (const operation of operations) { 83 | manifest[operation.name] = operation.hash; 84 | } 85 | 86 | return manifest; 87 | } 88 | 89 | /** 90 | * Generates a server-side persisted query manifest 91 | * Server manifests map query hashes to operation details 92 | * 93 | * @param docs - Array of GraphQL document nodes 94 | * @param config - Plugin configuration 95 | * @returns Server-side manifest object 96 | * @throws Error if an operation is missing a name 97 | */ 98 | export function generateServerManifest( 99 | docs: DocumentNode[], 100 | config: PluginConfig, 101 | ): ServerOperationListManifest { 102 | const operations = processOperations(docs, config); 103 | 104 | const manifest: ServerOperationListManifest = { 105 | format: 'apollo-persisted-query-manifest', 106 | version: 1, 107 | operations: {}, 108 | }; 109 | 110 | for (const operation of operations) { 111 | const operationDetails: PersistedQueryManifestOperation = { 112 | type: operation.type, 113 | name: operation.name, 114 | body: operation.query, 115 | }; 116 | 117 | manifest.operations[operation.hash] = operationDetails; 118 | } 119 | 120 | return manifest; 121 | } 122 | -------------------------------------------------------------------------------- /src/utils/__tests__/transforms.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, test, expect } from 'vitest'; 2 | import { printDefinitions, addTypenameToDocument } from '../transforms'; 3 | import { parse } from 'graphql'; 4 | import { Definition } from '../../types'; 5 | 6 | describe('Transform Utilities', () => { 7 | describe('printDefinitions', () => { 8 | test('prints a single definition', () => { 9 | const doc = parse(` 10 | query TestQuery { 11 | hello 12 | } 13 | `); 14 | 15 | const output = printDefinitions([doc.definitions[0] as Definition]); 16 | 17 | expect(output).toContain('query TestQuery'); 18 | expect(output).toContain('hello'); 19 | }); 20 | 21 | test('prints multiple definitions with spacing', () => { 22 | const doc = parse(` 23 | query TestQuery { 24 | hello 25 | } 26 | 27 | fragment UserFragment on User { 28 | id 29 | name 30 | } 31 | `); 32 | 33 | const output = printDefinitions([ 34 | doc.definitions[0] as Definition, 35 | doc.definitions[1] as Definition, 36 | ]); 37 | 38 | expect(output).toContain('query TestQuery'); 39 | expect(output).toContain('fragment UserFragment on User'); 40 | expect(output.split('\n\n').length).toBe(2); // Definitions separated by 2 newlines 41 | }); 42 | }); 43 | 44 | describe('addTypenameToDocument', () => { 45 | test('adds __typename to a simple query', () => { 46 | const doc = parse(` 47 | query TestQuery { 48 | user { 49 | id 50 | name 51 | } 52 | } 53 | `); 54 | 55 | const result = addTypenameToDocument(doc); 56 | const printed = printDefinitions([result]); 57 | 58 | expect(printed).toContain('__typename'); 59 | expect(printed).toMatch(/user\s*{\s*id\s*name\s*__typename\s*}/s); 60 | }); 61 | 62 | test('does not add __typename to operation definitions', () => { 63 | const doc = parse(` 64 | query TestQuery { 65 | hello 66 | } 67 | `); 68 | 69 | const result = addTypenameToDocument(doc); 70 | const printed = printDefinitions([result]); 71 | 72 | // __typename should not be at the top level 73 | expect(printed).not.toMatch( 74 | /query TestQuery\s*{\s*hello\s*__typename\s*}/s, 75 | ); 76 | }); 77 | 78 | test('does not add duplicate __typename fields', () => { 79 | const doc = parse(` 80 | query TestQuery { 81 | user { 82 | id 83 | name 84 | __typename 85 | } 86 | } 87 | `); 88 | 89 | const result = addTypenameToDocument(doc); 90 | const printed = printDefinitions([result]); 91 | 92 | // Check that there's exactly one __typename 93 | const matches = printed.match(/__typename/g); 94 | expect(matches).toHaveLength(1); 95 | }); 96 | 97 | test('does not add __typename to empty selection sets', () => { 98 | const doc = parse(` 99 | query TestQuery { 100 | scalar 101 | } 102 | `); 103 | 104 | const result = addTypenameToDocument(doc); 105 | const printed = printDefinitions([result]); 106 | 107 | expect(printed).not.toContain('__typename'); 108 | }); 109 | 110 | test('handles introspection fields correctly', () => { 111 | const doc = parse(` 112 | query IntrospectionQuery { 113 | __schema { 114 | types { 115 | name 116 | } 117 | } 118 | } 119 | `); 120 | 121 | const result = addTypenameToDocument(doc); 122 | const printed = printDefinitions([result]); 123 | 124 | // The implementation treats introspection fields special - but still adds 125 | // __typename to selection sets inside them. 126 | // This is the current implementation behavior which we're documenting with this test. 127 | expect(printed).toContain('__typename'); 128 | 129 | // Verify that it doesn't add __typename at the operation level 130 | // (already checked by another test, but double-checking here) 131 | expect(printed).not.toContain('query IntrospectionQuery { __typename'); 132 | }); 133 | }); 134 | }); 135 | -------------------------------------------------------------------------------- /src/utils/__tests__/fragments.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, test, expect } from 'vitest'; 2 | import { findFragments, findUsedFragments } from '../fragments'; 3 | import { parse } from 'graphql'; 4 | 5 | describe('Fragment Utilities', () => { 6 | describe('findFragments', () => { 7 | test('finds all fragments in documents', () => { 8 | const doc = parse(` 9 | fragment UserFragment on User { 10 | id 11 | name 12 | } 13 | 14 | fragment PostFragment on Post { 15 | id 16 | title 17 | } 18 | 19 | query GetUser { 20 | user { 21 | ...UserFragment 22 | } 23 | } 24 | `); 25 | 26 | const fragments = findFragments([doc]); 27 | 28 | expect(fragments.size).toBe(2); 29 | expect(fragments.has('UserFragment')).toBe(true); 30 | expect(fragments.has('PostFragment')).toBe(true); 31 | expect(fragments.has('NonExistentFragment')).toBe(false); 32 | }); 33 | 34 | test('returns empty map when no fragments are found', () => { 35 | const doc = parse(` 36 | query SimpleQuery { 37 | hello 38 | } 39 | `); 40 | 41 | const fragments = findFragments([doc]); 42 | 43 | expect(fragments.size).toBe(0); 44 | }); 45 | 46 | test('finds fragments across multiple documents', () => { 47 | const doc1 = parse(` 48 | fragment UserFragment on User { 49 | id 50 | name 51 | } 52 | `); 53 | 54 | const doc2 = parse(` 55 | fragment PostFragment on Post { 56 | id 57 | title 58 | } 59 | `); 60 | 61 | const fragments = findFragments([doc1, doc2]); 62 | 63 | expect(fragments.size).toBe(2); 64 | expect(fragments.has('UserFragment')).toBe(true); 65 | expect(fragments.has('PostFragment')).toBe(true); 66 | }); 67 | }); 68 | 69 | describe('findUsedFragments', () => { 70 | test('finds directly used fragments', () => { 71 | const doc = parse(` 72 | fragment UserFragment on User { 73 | id 74 | name 75 | } 76 | 77 | fragment PostFragment on Post { 78 | id 79 | title 80 | } 81 | 82 | query GetUser { 83 | user { 84 | ...UserFragment 85 | } 86 | } 87 | `); 88 | 89 | const fragments = findFragments([doc]); 90 | const operation = doc.definitions.find( 91 | (def) => def.kind === 'OperationDefinition', 92 | ); 93 | 94 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 95 | const usedFragments = findUsedFragments(operation as any, fragments); 96 | 97 | expect(usedFragments.size).toBe(1); 98 | expect(usedFragments.has('UserFragment')).toBe(true); 99 | expect(usedFragments.has('PostFragment')).toBe(false); 100 | }); 101 | 102 | test('finds nested fragments', () => { 103 | const doc = parse(` 104 | fragment NameFragment on User { 105 | firstName 106 | lastName 107 | } 108 | 109 | fragment UserFragment on User { 110 | id 111 | ...NameFragment 112 | } 113 | 114 | query GetUser { 115 | user { 116 | ...UserFragment 117 | } 118 | } 119 | `); 120 | 121 | const fragments = findFragments([doc]); 122 | const operation = doc.definitions.find( 123 | (def) => def.kind === 'OperationDefinition', 124 | ); 125 | 126 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 127 | const usedFragments = findUsedFragments(operation as any, fragments); 128 | 129 | expect(usedFragments.size).toBe(2); 130 | expect(usedFragments.has('UserFragment')).toBe(true); 131 | expect(usedFragments.has('NameFragment')).toBe(true); 132 | }); 133 | 134 | test('throws error on unknown fragment', () => { 135 | const doc = parse(` 136 | query GetUser { 137 | user { 138 | ...UnknownFragment 139 | } 140 | } 141 | `); 142 | 143 | const fragments = new Map(); 144 | const operation = doc.definitions.find( 145 | (def) => def.kind === 'OperationDefinition', 146 | ); 147 | 148 | expect(() => 149 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 150 | findUsedFragments(operation as any, fragments), 151 | ).toThrow('Unknown fragment: UnknownFragment'); 152 | }); 153 | 154 | test('handles circular fragment references', () => { 155 | const doc = parse(` 156 | fragment Fragment1 on Type { 157 | field1 158 | ...Fragment2 159 | } 160 | 161 | fragment Fragment2 on Type { 162 | field2 163 | ...Fragment1 164 | } 165 | 166 | query Test { 167 | ...Fragment1 168 | } 169 | `); 170 | 171 | const fragments = findFragments([doc]); 172 | const operation = doc.definitions.find( 173 | (def) => def.kind === 'OperationDefinition', 174 | ); 175 | 176 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 177 | const usedFragments = findUsedFragments(operation as any, fragments); 178 | 179 | expect(usedFragments.size).toBe(2); 180 | expect(usedFragments.has('Fragment1')).toBe(true); 181 | expect(usedFragments.has('Fragment2')).toBe(true); 182 | }); 183 | }); 184 | }); 185 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GraphQL CodeGen Persisted Queries 2 | 3 | A GraphQL Codegen plugin for generating persisted query manifests for server and client. 4 | 5 | ## Installation 6 | 7 | ```bash 8 | pnpm add -D @replit/graphql-codegen-persisted-queries 9 | ``` 10 | 11 | ## Usage 12 | 13 | ### YAML Config 14 | 15 | ```yml 16 | # codegen.yml 17 | generates: 18 | ./generated-gql/persisted-query-manifest/client.json: 19 | plugins: 20 | - @replit/graphql-codegen-persisted-queries 21 | config: 22 | output: client 23 | 24 | ./generated-gql/persisted-query-manifest/server.json: 25 | plugins: 26 | - @replit/graphql-codegen-persisted-queries 27 | config: 28 | output: server 29 | includeAlgorithmPrefix: true # Enable prefixed document identifiers for compliance with GraphQL over HTTP spec 30 | ``` 31 | 32 | ### TypeScript Config 33 | 34 | ```typescript 35 | // codegen.ts 36 | import type { CodegenConfig } from '@graphql-codegen/cli'; 37 | 38 | const config: CodegenConfig = { 39 | // ... other config 40 | generates: { 41 | './generated-gql/persisted-query-manifest/client.json': { 42 | documents: ['./client/**/*.{graphql,gql}', './pages/**/*.{graphql,gql}'], 43 | plugins: ['@replit/graphql-codegen-persisted-queries'], 44 | config: { 45 | output: 'client', 46 | }, 47 | }, 48 | './generated-gql/persisted-query-manifest/server.json': { 49 | documents: ['./client/**/*.{graphql,gql}', './pages/**/*.{graphql,gql}'], 50 | plugins: ['@replit/graphql-codegen-persisted-queries'], 51 | config: { 52 | output: 'server', 53 | includeAlgorithmPrefix: true, // Enable prefixed document identifiers for compliance with GraphQL over HTTP spec 54 | }, 55 | } 56 | } 57 | }; 58 | 59 | export default config; 60 | ``` 61 | 62 | ## Configuration Options 63 | 64 | | Option | Type | Default | Description | 65 | |-------------------------|------------------------|------------|------------------------------------------------------------------------| 66 | | `output` | `'client' \| 'server'` | (required) | Format of the generated manifest | 67 | | `algorithm` | `string` | `'sha256'` | Hash algorithm to use for generating operation IDs | 68 | | `includeAlgorithmPrefix`| `boolean` | `false` | Whether to prefix hashes with algorithm name (e.g., `sha256:abc123...`) | 69 | 70 | ## Output Formats 71 | 72 | ### Client Format 73 | 74 | The client format provides a simple mapping between operation names and their hashes, making it easy for clients to reference operations by name: 75 | 76 | ```json 77 | { 78 | "GetUser": "abcdef123456...", 79 | "UpdateUser": "fedcba654321..." 80 | } 81 | ``` 82 | 83 | With `includeAlgorithmPrefix: true`: 84 | 85 | ```json 86 | { 87 | "GetUser": "sha256:abcdef123456...", 88 | "UpdateUser": "sha256:fedcba654321..." 89 | } 90 | ``` 91 | 92 | ### Server Format 93 | 94 | The server format is more comprehensive, mapping operation hashes to their complete details (type, name, and body). This is ideal for server-side lookup and validation: 95 | 96 | ```json 97 | { 98 | "format": "apollo-persisted-query-manifest", 99 | "version": 1, 100 | "operations": { 101 | "abcdef123456...": { 102 | "type": "query", 103 | "name": "GetUser", 104 | "body": "query GetUser { user { id name } }" 105 | }, 106 | "fedcba654321...": { 107 | "type": "mutation", 108 | "name": "UpdateUser", 109 | "body": "mutation UpdateUser($id: ID!, $name: String!) { updateUser(id: $id, name: $name) { id name } }" 110 | } 111 | } 112 | } 113 | ``` 114 | 115 | With `includeAlgorithmPrefix: true`: 116 | 117 | ```json 118 | { 119 | "format": "apollo-persisted-query-manifest", 120 | "version": 1, 121 | "operations": { 122 | "sha256:abcdef123456...": { 123 | "type": "query", 124 | "name": "GetUser", 125 | "body": "query GetUser { user { id name } }" 126 | }, 127 | "sha256:fedcba654321...": { 128 | "type": "mutation", 129 | "name": "UpdateUser", 130 | "body": "mutation UpdateUser($id: ID!, $name: String!) { updateUser(id: $id, name: $name) { id name } }" 131 | } 132 | } 133 | } 134 | ``` 135 | 136 | ## How It Works 137 | 138 | The plugin's workflow is straightforward: 139 | 140 | 1. It collects all GraphQL operations from your codebase 141 | 2. It adds `__typename` to all selection sets in the operations for proper type resolution 142 | 3. It identifies all fragments used in each operation, resolving them recursively to ensure all nested fragments are included 143 | 4. It orders the documents with operation definitions first, followed by fragments to ensure hash consistency 144 | 5. It generates operation hashes using the specified algorithm (default: `sha256`) 145 | 6. It outputs a manifest file in your chosen format (client or server) 146 | 147 | You can enable the "Prefixed Document Identifier" format (e.g., `sha256:abc123...`) for compliance with the [GraphQL over HTTP specification (RFC at the time of publishing this package)](https://github.com/graphql/graphql-over-http/blob/52d56fb36d51c17e08a920510a23bdc2f6a720be/spec/Appendix%20A%20--%20Persisted%20Documents.md#sha256-hex-document-identifier) by setting `includeAlgorithmPrefix: true`. 148 | 149 | ## Development 150 | 151 | ### Setup 152 | 153 | ```bash 154 | # Install dependencies 155 | pnpm install 156 | 157 | # Watch mode for development 158 | pnpm dev 159 | ``` 160 | 161 | ### Testing 162 | 163 | The plugin includes a comprehensive test suite built with Vitest: 164 | 165 | ```bash 166 | # Run tests 167 | pnpm test 168 | 169 | # Run tests in watch mode 170 | pnpm test:watch 171 | ``` 172 | 173 | ## License 174 | 175 | MIT 176 | -------------------------------------------------------------------------------- /src/__tests__/__snapshots__/integration.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`Persisted Query Plugin Integration Tests > Client Manifest Generation > generates valid client manifest with algorithm prefix 1`] = ` 4 | { 5 | "CreateUser": "sha256:ba9e16c83890d5d9ecabcb415610364fee2932887b2bc393c7143b71aab269b3", 6 | "GetPost": "sha256:3c6302a47f6243d487fac04c0af0f5f95e0187c17cb1a27e06c7a7c9f0488fd4", 7 | "GetPosts": "sha256:ae215a6ca2480a8c5c721801d9f943cbb54055ce3bdf855ef21bd255b6bbfdde", 8 | "GetUser": "sha256:3ac4d5cb7197d3811eedb53feb1db0615ce67aaa91fe1f8d9175e12d37eb6239", 9 | "GetUsers": "sha256:85306f39b57686912f3e429274c2448e2b4a94f39293875f42d674a7363574ca", 10 | "HelloQuery": "sha256:789ccee2f24e6bec795f6d345529a1fc195e282453956a69eef4209b06b347a9", 11 | "OnUserCreated": "sha256:3af4547b737d2086c4a7f6f74f61e310c1c9d1a54c6218f34edfa592a43bf7b5", 12 | "UpdateUser": "sha256:2ed387ebd9ffea9ea9b42fb1c4c2d149d3c5c45c2c8603ba4ffc755d296dc794", 13 | } 14 | `; 15 | 16 | exports[`Persisted Query Plugin Integration Tests > Client Manifest Generation > generates valid client manifest with custom algorithm 1`] = ` 17 | { 18 | "CreateUser": "08382963981d862dd2fd2bfe0e9cd207", 19 | "GetPost": "79c0b9239ad347d5710bf729c8fdfe66", 20 | "GetPosts": "69714bf6547e845a36de493b21f754c8", 21 | "GetUser": "0b03e148029a42a67ed0f9c84b96c1ad", 22 | "GetUsers": "b584a3ef5982a75fa6ea872c867c4a53", 23 | "HelloQuery": "7a65e58a5f2108e855f55246308323a3", 24 | "OnUserCreated": "5cdc0f7772d519dd6543d8c1858f0a79", 25 | "UpdateUser": "fdec2e64f7bea659f50032796d8e84a6", 26 | } 27 | `; 28 | 29 | exports[`Persisted Query Plugin Integration Tests > Client Manifest Generation > generates valid client manifest with default options 1`] = ` 30 | { 31 | "CreateUser": "ba9e16c83890d5d9ecabcb415610364fee2932887b2bc393c7143b71aab269b3", 32 | "GetPost": "3c6302a47f6243d487fac04c0af0f5f95e0187c17cb1a27e06c7a7c9f0488fd4", 33 | "GetPosts": "ae215a6ca2480a8c5c721801d9f943cbb54055ce3bdf855ef21bd255b6bbfdde", 34 | "GetUser": "3ac4d5cb7197d3811eedb53feb1db0615ce67aaa91fe1f8d9175e12d37eb6239", 35 | "GetUsers": "85306f39b57686912f3e429274c2448e2b4a94f39293875f42d674a7363574ca", 36 | "HelloQuery": "789ccee2f24e6bec795f6d345529a1fc195e282453956a69eef4209b06b347a9", 37 | "OnUserCreated": "3af4547b737d2086c4a7f6f74f61e310c1c9d1a54c6218f34edfa592a43bf7b5", 38 | "UpdateUser": "2ed387ebd9ffea9ea9b42fb1c4c2d149d3c5c45c2c8603ba4ffc755d296dc794", 39 | } 40 | `; 41 | 42 | exports[`Persisted Query Plugin Integration Tests > Server Manifest Generation > generates valid server manifest with default options 1`] = ` 43 | { 44 | "format": "apollo-persisted-query-manifest", 45 | "operations": { 46 | "2ed387ebd9ffea9ea9b42fb1c4c2d149d3c5c45c2c8603ba4ffc755d296dc794": { 47 | "body": "mutation UpdateUser($id: ID!, $name: String, $email: String) { 48 | updateUser(id: $id, name: $name, email: $email) { 49 | ...UserFields 50 | __typename 51 | } 52 | } 53 | 54 | fragment UserFields on User { 55 | id 56 | name 57 | email 58 | __typename 59 | }", 60 | "name": "UpdateUser", 61 | "type": "mutation", 62 | }, 63 | "3ac4d5cb7197d3811eedb53feb1db0615ce67aaa91fe1f8d9175e12d37eb6239": { 64 | "body": "query GetUser($id: ID!) { 65 | user(id: $id) { 66 | ...UserFields 67 | posts { 68 | ...PostFields 69 | __typename 70 | } 71 | __typename 72 | } 73 | } 74 | 75 | fragment UserFields on User { 76 | id 77 | name 78 | email 79 | __typename 80 | } 81 | 82 | fragment PostFields on Post { 83 | id 84 | title 85 | content 86 | __typename 87 | }", 88 | "name": "GetUser", 89 | "type": "query", 90 | }, 91 | "3af4547b737d2086c4a7f6f74f61e310c1c9d1a54c6218f34edfa592a43bf7b5": { 92 | "body": "subscription OnUserCreated { 93 | userCreated { 94 | ...UserFields 95 | __typename 96 | } 97 | } 98 | 99 | fragment UserFields on User { 100 | id 101 | name 102 | email 103 | __typename 104 | }", 105 | "name": "OnUserCreated", 106 | "type": "subscription", 107 | }, 108 | "3c6302a47f6243d487fac04c0af0f5f95e0187c17cb1a27e06c7a7c9f0488fd4": { 109 | "body": "query GetPost($id: ID!) { 110 | post(id: $id) { 111 | ...PostFields 112 | author { 113 | ...UserFields 114 | __typename 115 | } 116 | __typename 117 | } 118 | } 119 | 120 | fragment PostFields on Post { 121 | id 122 | title 123 | content 124 | __typename 125 | } 126 | 127 | fragment UserFields on User { 128 | id 129 | name 130 | email 131 | __typename 132 | }", 133 | "name": "GetPost", 134 | "type": "query", 135 | }, 136 | "789ccee2f24e6bec795f6d345529a1fc195e282453956a69eef4209b06b347a9": { 137 | "body": "query HelloQuery { 138 | hello 139 | }", 140 | "name": "HelloQuery", 141 | "type": "query", 142 | }, 143 | "85306f39b57686912f3e429274c2448e2b4a94f39293875f42d674a7363574ca": { 144 | "body": "query GetUsers { 145 | users { 146 | ...UserFields 147 | __typename 148 | } 149 | } 150 | 151 | fragment UserFields on User { 152 | id 153 | name 154 | email 155 | __typename 156 | }", 157 | "name": "GetUsers", 158 | "type": "query", 159 | }, 160 | "ae215a6ca2480a8c5c721801d9f943cbb54055ce3bdf855ef21bd255b6bbfdde": { 161 | "body": "query GetPosts { 162 | posts { 163 | ...PostFields 164 | __typename 165 | } 166 | } 167 | 168 | fragment PostFields on Post { 169 | id 170 | title 171 | content 172 | __typename 173 | }", 174 | "name": "GetPosts", 175 | "type": "query", 176 | }, 177 | "ba9e16c83890d5d9ecabcb415610364fee2932887b2bc393c7143b71aab269b3": { 178 | "body": "mutation CreateUser($name: String!, $email: String) { 179 | createUser(name: $name, email: $email) { 180 | ...UserFields 181 | __typename 182 | } 183 | } 184 | 185 | fragment UserFields on User { 186 | id 187 | name 188 | email 189 | __typename 190 | }", 191 | "name": "CreateUser", 192 | "type": "mutation", 193 | }, 194 | }, 195 | "version": 1, 196 | } 197 | `; 198 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | '@graphql-codegen/plugin-helpers': 9 | specifier: ^5.0.0 10 | version: 5.1.0(graphql@16.10.0) 11 | '@stylistic/eslint-plugin-js': 12 | specifier: ^4.2.0 13 | version: 4.2.0(eslint@9.22.0) 14 | '@stylistic/eslint-plugin-ts': 15 | specifier: ^4.2.0 16 | version: 4.2.0(eslint@9.22.0)(typescript@5.8.2) 17 | '@types/node': 18 | specifier: ^22.13.10 19 | version: 22.13.10 20 | '@typescript-eslint/eslint-plugin': 21 | specifier: ^8.26.1 22 | version: 8.26.1(@typescript-eslint/parser@8.26.1)(eslint@9.22.0)(typescript@5.8.2) 23 | '@typescript-eslint/parser': 24 | specifier: ^8.26.1 25 | version: 8.26.1(eslint@9.22.0)(typescript@5.8.2) 26 | eslint: 27 | specifier: ^9.22.0 28 | version: 9.22.0 29 | eslint-config-prettier: 30 | specifier: ^10.1.1 31 | version: 10.1.1(eslint@9.22.0) 32 | eslint-plugin-prettier: 33 | specifier: ^5.2.3 34 | version: 5.2.3(eslint-config-prettier@10.1.1)(eslint@9.22.0)(prettier@3.5.3) 35 | graphql: 36 | specifier: ^16.8.1 37 | version: 16.10.0 38 | prettier: 39 | specifier: ^3.5.3 40 | version: 3.5.3 41 | tsup: 42 | specifier: ^8.4.0 43 | version: 8.4.0(typescript@5.8.2) 44 | typescript-eslint: 45 | specifier: ^8.26.1 46 | version: 8.26.1(eslint@9.22.0)(typescript@5.8.2) 47 | vitest: 48 | specifier: ^3.0.9 49 | version: 3.0.9(@types/node@22.13.10) 50 | 51 | packages: 52 | 53 | /@esbuild/aix-ppc64@0.25.1: 54 | resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} 55 | engines: {node: '>=18'} 56 | cpu: [ppc64] 57 | os: [aix] 58 | requiresBuild: true 59 | dev: true 60 | optional: true 61 | 62 | /@esbuild/android-arm64@0.25.1: 63 | resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} 64 | engines: {node: '>=18'} 65 | cpu: [arm64] 66 | os: [android] 67 | requiresBuild: true 68 | dev: true 69 | optional: true 70 | 71 | /@esbuild/android-arm@0.25.1: 72 | resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} 73 | engines: {node: '>=18'} 74 | cpu: [arm] 75 | os: [android] 76 | requiresBuild: true 77 | dev: true 78 | optional: true 79 | 80 | /@esbuild/android-x64@0.25.1: 81 | resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} 82 | engines: {node: '>=18'} 83 | cpu: [x64] 84 | os: [android] 85 | requiresBuild: true 86 | dev: true 87 | optional: true 88 | 89 | /@esbuild/darwin-arm64@0.25.1: 90 | resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} 91 | engines: {node: '>=18'} 92 | cpu: [arm64] 93 | os: [darwin] 94 | requiresBuild: true 95 | dev: true 96 | optional: true 97 | 98 | /@esbuild/darwin-x64@0.25.1: 99 | resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} 100 | engines: {node: '>=18'} 101 | cpu: [x64] 102 | os: [darwin] 103 | requiresBuild: true 104 | dev: true 105 | optional: true 106 | 107 | /@esbuild/freebsd-arm64@0.25.1: 108 | resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} 109 | engines: {node: '>=18'} 110 | cpu: [arm64] 111 | os: [freebsd] 112 | requiresBuild: true 113 | dev: true 114 | optional: true 115 | 116 | /@esbuild/freebsd-x64@0.25.1: 117 | resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} 118 | engines: {node: '>=18'} 119 | cpu: [x64] 120 | os: [freebsd] 121 | requiresBuild: true 122 | dev: true 123 | optional: true 124 | 125 | /@esbuild/linux-arm64@0.25.1: 126 | resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} 127 | engines: {node: '>=18'} 128 | cpu: [arm64] 129 | os: [linux] 130 | requiresBuild: true 131 | dev: true 132 | optional: true 133 | 134 | /@esbuild/linux-arm@0.25.1: 135 | resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} 136 | engines: {node: '>=18'} 137 | cpu: [arm] 138 | os: [linux] 139 | requiresBuild: true 140 | dev: true 141 | optional: true 142 | 143 | /@esbuild/linux-ia32@0.25.1: 144 | resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} 145 | engines: {node: '>=18'} 146 | cpu: [ia32] 147 | os: [linux] 148 | requiresBuild: true 149 | dev: true 150 | optional: true 151 | 152 | /@esbuild/linux-loong64@0.25.1: 153 | resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} 154 | engines: {node: '>=18'} 155 | cpu: [loong64] 156 | os: [linux] 157 | requiresBuild: true 158 | dev: true 159 | optional: true 160 | 161 | /@esbuild/linux-mips64el@0.25.1: 162 | resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} 163 | engines: {node: '>=18'} 164 | cpu: [mips64el] 165 | os: [linux] 166 | requiresBuild: true 167 | dev: true 168 | optional: true 169 | 170 | /@esbuild/linux-ppc64@0.25.1: 171 | resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} 172 | engines: {node: '>=18'} 173 | cpu: [ppc64] 174 | os: [linux] 175 | requiresBuild: true 176 | dev: true 177 | optional: true 178 | 179 | /@esbuild/linux-riscv64@0.25.1: 180 | resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} 181 | engines: {node: '>=18'} 182 | cpu: [riscv64] 183 | os: [linux] 184 | requiresBuild: true 185 | dev: true 186 | optional: true 187 | 188 | /@esbuild/linux-s390x@0.25.1: 189 | resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} 190 | engines: {node: '>=18'} 191 | cpu: [s390x] 192 | os: [linux] 193 | requiresBuild: true 194 | dev: true 195 | optional: true 196 | 197 | /@esbuild/linux-x64@0.25.1: 198 | resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} 199 | engines: {node: '>=18'} 200 | cpu: [x64] 201 | os: [linux] 202 | requiresBuild: true 203 | dev: true 204 | optional: true 205 | 206 | /@esbuild/netbsd-arm64@0.25.1: 207 | resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} 208 | engines: {node: '>=18'} 209 | cpu: [arm64] 210 | os: [netbsd] 211 | requiresBuild: true 212 | dev: true 213 | optional: true 214 | 215 | /@esbuild/netbsd-x64@0.25.1: 216 | resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} 217 | engines: {node: '>=18'} 218 | cpu: [x64] 219 | os: [netbsd] 220 | requiresBuild: true 221 | dev: true 222 | optional: true 223 | 224 | /@esbuild/openbsd-arm64@0.25.1: 225 | resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} 226 | engines: {node: '>=18'} 227 | cpu: [arm64] 228 | os: [openbsd] 229 | requiresBuild: true 230 | dev: true 231 | optional: true 232 | 233 | /@esbuild/openbsd-x64@0.25.1: 234 | resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} 235 | engines: {node: '>=18'} 236 | cpu: [x64] 237 | os: [openbsd] 238 | requiresBuild: true 239 | dev: true 240 | optional: true 241 | 242 | /@esbuild/sunos-x64@0.25.1: 243 | resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} 244 | engines: {node: '>=18'} 245 | cpu: [x64] 246 | os: [sunos] 247 | requiresBuild: true 248 | dev: true 249 | optional: true 250 | 251 | /@esbuild/win32-arm64@0.25.1: 252 | resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} 253 | engines: {node: '>=18'} 254 | cpu: [arm64] 255 | os: [win32] 256 | requiresBuild: true 257 | dev: true 258 | optional: true 259 | 260 | /@esbuild/win32-ia32@0.25.1: 261 | resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} 262 | engines: {node: '>=18'} 263 | cpu: [ia32] 264 | os: [win32] 265 | requiresBuild: true 266 | dev: true 267 | optional: true 268 | 269 | /@esbuild/win32-x64@0.25.1: 270 | resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} 271 | engines: {node: '>=18'} 272 | cpu: [x64] 273 | os: [win32] 274 | requiresBuild: true 275 | dev: true 276 | optional: true 277 | 278 | /@eslint-community/eslint-utils@4.5.1(eslint@9.22.0): 279 | resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} 280 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 281 | peerDependencies: 282 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 283 | dependencies: 284 | eslint: 9.22.0 285 | eslint-visitor-keys: 3.4.3 286 | dev: true 287 | 288 | /@eslint-community/regexpp@4.12.1: 289 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 290 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 291 | dev: true 292 | 293 | /@eslint/config-array@0.19.2: 294 | resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} 295 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 296 | dependencies: 297 | '@eslint/object-schema': 2.1.6 298 | debug: 4.4.0 299 | minimatch: 3.1.2 300 | transitivePeerDependencies: 301 | - supports-color 302 | dev: true 303 | 304 | /@eslint/config-helpers@0.1.0: 305 | resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} 306 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 307 | dev: true 308 | 309 | /@eslint/core@0.12.0: 310 | resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} 311 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 312 | dependencies: 313 | '@types/json-schema': 7.0.15 314 | dev: true 315 | 316 | /@eslint/eslintrc@3.3.0: 317 | resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} 318 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 319 | dependencies: 320 | ajv: 6.12.6 321 | debug: 4.4.0 322 | espree: 10.3.0 323 | globals: 14.0.0 324 | ignore: 5.3.2 325 | import-fresh: 3.3.1 326 | js-yaml: 4.1.0 327 | minimatch: 3.1.2 328 | strip-json-comments: 3.1.1 329 | transitivePeerDependencies: 330 | - supports-color 331 | dev: true 332 | 333 | /@eslint/js@9.22.0: 334 | resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} 335 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 336 | dev: true 337 | 338 | /@eslint/object-schema@2.1.6: 339 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 340 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 341 | dev: true 342 | 343 | /@eslint/plugin-kit@0.2.7: 344 | resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} 345 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 346 | dependencies: 347 | '@eslint/core': 0.12.0 348 | levn: 0.4.1 349 | dev: true 350 | 351 | /@graphql-codegen/plugin-helpers@5.1.0(graphql@16.10.0): 352 | resolution: {integrity: sha512-Y7cwEAkprbTKzVIe436TIw4w03jorsMruvCvu0HJkavaKMQbWY+lQ1RIuROgszDbxAyM35twB5/sUvYG5oW+yg==} 353 | engines: {node: '>=16'} 354 | peerDependencies: 355 | graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 356 | dependencies: 357 | '@graphql-tools/utils': 10.8.6(graphql@16.10.0) 358 | change-case-all: 1.0.15 359 | common-tags: 1.8.2 360 | graphql: 16.10.0 361 | import-from: 4.0.0 362 | lodash: 4.17.21 363 | tslib: 2.6.3 364 | dev: true 365 | 366 | /@graphql-tools/utils@10.8.6(graphql@16.10.0): 367 | resolution: {integrity: sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==} 368 | engines: {node: '>=16.0.0'} 369 | peerDependencies: 370 | graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 371 | dependencies: 372 | '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) 373 | '@whatwg-node/promise-helpers': 1.3.0 374 | cross-inspect: 1.0.1 375 | dset: 3.1.4 376 | graphql: 16.10.0 377 | tslib: 2.8.1 378 | dev: true 379 | 380 | /@graphql-typed-document-node/core@3.2.0(graphql@16.10.0): 381 | resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} 382 | peerDependencies: 383 | graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 384 | dependencies: 385 | graphql: 16.10.0 386 | dev: true 387 | 388 | /@humanfs/core@0.19.1: 389 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 390 | engines: {node: '>=18.18.0'} 391 | dev: true 392 | 393 | /@humanfs/node@0.16.6: 394 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 395 | engines: {node: '>=18.18.0'} 396 | dependencies: 397 | '@humanfs/core': 0.19.1 398 | '@humanwhocodes/retry': 0.3.1 399 | dev: true 400 | 401 | /@humanwhocodes/module-importer@1.0.1: 402 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 403 | engines: {node: '>=12.22'} 404 | dev: true 405 | 406 | /@humanwhocodes/retry@0.3.1: 407 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 408 | engines: {node: '>=18.18'} 409 | dev: true 410 | 411 | /@humanwhocodes/retry@0.4.2: 412 | resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} 413 | engines: {node: '>=18.18'} 414 | dev: true 415 | 416 | /@isaacs/cliui@8.0.2: 417 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 418 | engines: {node: '>=12'} 419 | dependencies: 420 | string-width: 5.1.2 421 | string-width-cjs: /string-width@4.2.3 422 | strip-ansi: 7.1.0 423 | strip-ansi-cjs: /strip-ansi@6.0.1 424 | wrap-ansi: 8.1.0 425 | wrap-ansi-cjs: /wrap-ansi@7.0.0 426 | dev: true 427 | 428 | /@jridgewell/gen-mapping@0.3.8: 429 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 430 | engines: {node: '>=6.0.0'} 431 | dependencies: 432 | '@jridgewell/set-array': 1.2.1 433 | '@jridgewell/sourcemap-codec': 1.5.0 434 | '@jridgewell/trace-mapping': 0.3.25 435 | dev: true 436 | 437 | /@jridgewell/resolve-uri@3.1.2: 438 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 439 | engines: {node: '>=6.0.0'} 440 | dev: true 441 | 442 | /@jridgewell/set-array@1.2.1: 443 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 444 | engines: {node: '>=6.0.0'} 445 | dev: true 446 | 447 | /@jridgewell/sourcemap-codec@1.5.0: 448 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 449 | dev: true 450 | 451 | /@jridgewell/trace-mapping@0.3.25: 452 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 453 | dependencies: 454 | '@jridgewell/resolve-uri': 3.1.2 455 | '@jridgewell/sourcemap-codec': 1.5.0 456 | dev: true 457 | 458 | /@nodelib/fs.scandir@2.1.5: 459 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 460 | engines: {node: '>= 8'} 461 | dependencies: 462 | '@nodelib/fs.stat': 2.0.5 463 | run-parallel: 1.2.0 464 | dev: true 465 | 466 | /@nodelib/fs.stat@2.0.5: 467 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 468 | engines: {node: '>= 8'} 469 | dev: true 470 | 471 | /@nodelib/fs.walk@1.2.8: 472 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 473 | engines: {node: '>= 8'} 474 | dependencies: 475 | '@nodelib/fs.scandir': 2.1.5 476 | fastq: 1.19.1 477 | dev: true 478 | 479 | /@pkgjs/parseargs@0.11.0: 480 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 481 | engines: {node: '>=14'} 482 | requiresBuild: true 483 | dev: true 484 | optional: true 485 | 486 | /@pkgr/core@0.1.1: 487 | resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} 488 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 489 | dev: true 490 | 491 | /@rollup/rollup-android-arm-eabi@4.36.0: 492 | resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} 493 | cpu: [arm] 494 | os: [android] 495 | requiresBuild: true 496 | dev: true 497 | optional: true 498 | 499 | /@rollup/rollup-android-arm64@4.36.0: 500 | resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} 501 | cpu: [arm64] 502 | os: [android] 503 | requiresBuild: true 504 | dev: true 505 | optional: true 506 | 507 | /@rollup/rollup-darwin-arm64@4.36.0: 508 | resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} 509 | cpu: [arm64] 510 | os: [darwin] 511 | requiresBuild: true 512 | dev: true 513 | optional: true 514 | 515 | /@rollup/rollup-darwin-x64@4.36.0: 516 | resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} 517 | cpu: [x64] 518 | os: [darwin] 519 | requiresBuild: true 520 | dev: true 521 | optional: true 522 | 523 | /@rollup/rollup-freebsd-arm64@4.36.0: 524 | resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} 525 | cpu: [arm64] 526 | os: [freebsd] 527 | requiresBuild: true 528 | dev: true 529 | optional: true 530 | 531 | /@rollup/rollup-freebsd-x64@4.36.0: 532 | resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} 533 | cpu: [x64] 534 | os: [freebsd] 535 | requiresBuild: true 536 | dev: true 537 | optional: true 538 | 539 | /@rollup/rollup-linux-arm-gnueabihf@4.36.0: 540 | resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} 541 | cpu: [arm] 542 | os: [linux] 543 | requiresBuild: true 544 | dev: true 545 | optional: true 546 | 547 | /@rollup/rollup-linux-arm-musleabihf@4.36.0: 548 | resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} 549 | cpu: [arm] 550 | os: [linux] 551 | requiresBuild: true 552 | dev: true 553 | optional: true 554 | 555 | /@rollup/rollup-linux-arm64-gnu@4.36.0: 556 | resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} 557 | cpu: [arm64] 558 | os: [linux] 559 | requiresBuild: true 560 | dev: true 561 | optional: true 562 | 563 | /@rollup/rollup-linux-arm64-musl@4.36.0: 564 | resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} 565 | cpu: [arm64] 566 | os: [linux] 567 | requiresBuild: true 568 | dev: true 569 | optional: true 570 | 571 | /@rollup/rollup-linux-loongarch64-gnu@4.36.0: 572 | resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} 573 | cpu: [loong64] 574 | os: [linux] 575 | requiresBuild: true 576 | dev: true 577 | optional: true 578 | 579 | /@rollup/rollup-linux-powerpc64le-gnu@4.36.0: 580 | resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} 581 | cpu: [ppc64] 582 | os: [linux] 583 | requiresBuild: true 584 | dev: true 585 | optional: true 586 | 587 | /@rollup/rollup-linux-riscv64-gnu@4.36.0: 588 | resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} 589 | cpu: [riscv64] 590 | os: [linux] 591 | requiresBuild: true 592 | dev: true 593 | optional: true 594 | 595 | /@rollup/rollup-linux-s390x-gnu@4.36.0: 596 | resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} 597 | cpu: [s390x] 598 | os: [linux] 599 | requiresBuild: true 600 | dev: true 601 | optional: true 602 | 603 | /@rollup/rollup-linux-x64-gnu@4.36.0: 604 | resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} 605 | cpu: [x64] 606 | os: [linux] 607 | requiresBuild: true 608 | dev: true 609 | optional: true 610 | 611 | /@rollup/rollup-linux-x64-musl@4.36.0: 612 | resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} 613 | cpu: [x64] 614 | os: [linux] 615 | requiresBuild: true 616 | dev: true 617 | optional: true 618 | 619 | /@rollup/rollup-win32-arm64-msvc@4.36.0: 620 | resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} 621 | cpu: [arm64] 622 | os: [win32] 623 | requiresBuild: true 624 | dev: true 625 | optional: true 626 | 627 | /@rollup/rollup-win32-ia32-msvc@4.36.0: 628 | resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} 629 | cpu: [ia32] 630 | os: [win32] 631 | requiresBuild: true 632 | dev: true 633 | optional: true 634 | 635 | /@rollup/rollup-win32-x64-msvc@4.36.0: 636 | resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} 637 | cpu: [x64] 638 | os: [win32] 639 | requiresBuild: true 640 | dev: true 641 | optional: true 642 | 643 | /@stylistic/eslint-plugin-js@4.2.0(eslint@9.22.0): 644 | resolution: {integrity: sha512-MiJr6wvyzMYl/wElmj8Jns8zH7Q1w8XoVtm+WM6yDaTrfxryMyb8n0CMxt82fo42RoLIfxAEtM6tmQVxqhk0/A==} 645 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 646 | peerDependencies: 647 | eslint: '>=9.0.0' 648 | dependencies: 649 | eslint: 9.22.0 650 | eslint-visitor-keys: 4.2.0 651 | espree: 10.3.0 652 | dev: true 653 | 654 | /@stylistic/eslint-plugin-ts@4.2.0(eslint@9.22.0)(typescript@5.8.2): 655 | resolution: {integrity: sha512-j2o2GvOx9v66x8hmp/HJ+0T+nOppiO5ycGsCkifh7JPGgjxEhpkGmIGx3RWsoxpWbad3VCX8e8/T8n3+7ze1Zg==} 656 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 657 | peerDependencies: 658 | eslint: '>=9.0.0' 659 | dependencies: 660 | '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 661 | eslint: 9.22.0 662 | eslint-visitor-keys: 4.2.0 663 | espree: 10.3.0 664 | transitivePeerDependencies: 665 | - supports-color 666 | - typescript 667 | dev: true 668 | 669 | /@types/estree@1.0.6: 670 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 671 | dev: true 672 | 673 | /@types/json-schema@7.0.15: 674 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 675 | dev: true 676 | 677 | /@types/node@22.13.10: 678 | resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} 679 | dependencies: 680 | undici-types: 6.20.0 681 | dev: true 682 | 683 | /@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1)(eslint@9.22.0)(typescript@5.8.2): 684 | resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==} 685 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 686 | peerDependencies: 687 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 688 | eslint: ^8.57.0 || ^9.0.0 689 | typescript: '>=4.8.4 <5.9.0' 690 | dependencies: 691 | '@eslint-community/regexpp': 4.12.1 692 | '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 693 | '@typescript-eslint/scope-manager': 8.26.1 694 | '@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 695 | '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 696 | '@typescript-eslint/visitor-keys': 8.26.1 697 | eslint: 9.22.0 698 | graphemer: 1.4.0 699 | ignore: 5.3.2 700 | natural-compare: 1.4.0 701 | ts-api-utils: 2.0.1(typescript@5.8.2) 702 | typescript: 5.8.2 703 | transitivePeerDependencies: 704 | - supports-color 705 | dev: true 706 | 707 | /@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2): 708 | resolution: {integrity: sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==} 709 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 710 | peerDependencies: 711 | eslint: ^8.57.0 || ^9.0.0 712 | typescript: '>=4.8.4 <5.9.0' 713 | dependencies: 714 | '@typescript-eslint/scope-manager': 8.26.1 715 | '@typescript-eslint/types': 8.26.1 716 | '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) 717 | '@typescript-eslint/visitor-keys': 8.26.1 718 | debug: 4.4.0 719 | eslint: 9.22.0 720 | typescript: 5.8.2 721 | transitivePeerDependencies: 722 | - supports-color 723 | dev: true 724 | 725 | /@typescript-eslint/scope-manager@8.26.1: 726 | resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} 727 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 728 | dependencies: 729 | '@typescript-eslint/types': 8.26.1 730 | '@typescript-eslint/visitor-keys': 8.26.1 731 | dev: true 732 | 733 | /@typescript-eslint/type-utils@8.26.1(eslint@9.22.0)(typescript@5.8.2): 734 | resolution: {integrity: sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==} 735 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 736 | peerDependencies: 737 | eslint: ^8.57.0 || ^9.0.0 738 | typescript: '>=4.8.4 <5.9.0' 739 | dependencies: 740 | '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) 741 | '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 742 | debug: 4.4.0 743 | eslint: 9.22.0 744 | ts-api-utils: 2.0.1(typescript@5.8.2) 745 | typescript: 5.8.2 746 | transitivePeerDependencies: 747 | - supports-color 748 | dev: true 749 | 750 | /@typescript-eslint/types@8.26.1: 751 | resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} 752 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 753 | dev: true 754 | 755 | /@typescript-eslint/typescript-estree@8.26.1(typescript@5.8.2): 756 | resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==} 757 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 758 | peerDependencies: 759 | typescript: '>=4.8.4 <5.9.0' 760 | dependencies: 761 | '@typescript-eslint/types': 8.26.1 762 | '@typescript-eslint/visitor-keys': 8.26.1 763 | debug: 4.4.0 764 | fast-glob: 3.3.3 765 | is-glob: 4.0.3 766 | minimatch: 9.0.5 767 | semver: 7.7.1 768 | ts-api-utils: 2.0.1(typescript@5.8.2) 769 | typescript: 5.8.2 770 | transitivePeerDependencies: 771 | - supports-color 772 | dev: true 773 | 774 | /@typescript-eslint/utils@8.26.1(eslint@9.22.0)(typescript@5.8.2): 775 | resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==} 776 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 777 | peerDependencies: 778 | eslint: ^8.57.0 || ^9.0.0 779 | typescript: '>=4.8.4 <5.9.0' 780 | dependencies: 781 | '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) 782 | '@typescript-eslint/scope-manager': 8.26.1 783 | '@typescript-eslint/types': 8.26.1 784 | '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) 785 | eslint: 9.22.0 786 | typescript: 5.8.2 787 | transitivePeerDependencies: 788 | - supports-color 789 | dev: true 790 | 791 | /@typescript-eslint/visitor-keys@8.26.1: 792 | resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} 793 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 794 | dependencies: 795 | '@typescript-eslint/types': 8.26.1 796 | eslint-visitor-keys: 4.2.0 797 | dev: true 798 | 799 | /@vitest/expect@3.0.9: 800 | resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} 801 | dependencies: 802 | '@vitest/spy': 3.0.9 803 | '@vitest/utils': 3.0.9 804 | chai: 5.2.0 805 | tinyrainbow: 2.0.0 806 | dev: true 807 | 808 | /@vitest/mocker@3.0.9(vite@6.2.2): 809 | resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} 810 | peerDependencies: 811 | msw: ^2.4.9 812 | vite: ^5.0.0 || ^6.0.0 813 | peerDependenciesMeta: 814 | msw: 815 | optional: true 816 | vite: 817 | optional: true 818 | dependencies: 819 | '@vitest/spy': 3.0.9 820 | estree-walker: 3.0.3 821 | magic-string: 0.30.17 822 | vite: 6.2.2(@types/node@22.13.10) 823 | dev: true 824 | 825 | /@vitest/pretty-format@3.0.9: 826 | resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} 827 | dependencies: 828 | tinyrainbow: 2.0.0 829 | dev: true 830 | 831 | /@vitest/runner@3.0.9: 832 | resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} 833 | dependencies: 834 | '@vitest/utils': 3.0.9 835 | pathe: 2.0.3 836 | dev: true 837 | 838 | /@vitest/snapshot@3.0.9: 839 | resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} 840 | dependencies: 841 | '@vitest/pretty-format': 3.0.9 842 | magic-string: 0.30.17 843 | pathe: 2.0.3 844 | dev: true 845 | 846 | /@vitest/spy@3.0.9: 847 | resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} 848 | dependencies: 849 | tinyspy: 3.0.2 850 | dev: true 851 | 852 | /@vitest/utils@3.0.9: 853 | resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} 854 | dependencies: 855 | '@vitest/pretty-format': 3.0.9 856 | loupe: 3.1.3 857 | tinyrainbow: 2.0.0 858 | dev: true 859 | 860 | /@whatwg-node/promise-helpers@1.3.0: 861 | resolution: {integrity: sha512-486CouizxHXucj8Ky153DDragfkMcHtVEToF5Pn/fInhUUSiCmt9Q4JVBa6UK5q4RammFBtGQ4C9qhGlXU9YbA==} 862 | engines: {node: '>=16.0.0'} 863 | dependencies: 864 | tslib: 2.8.1 865 | dev: true 866 | 867 | /acorn-jsx@5.3.2(acorn@8.14.1): 868 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 869 | peerDependencies: 870 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 871 | dependencies: 872 | acorn: 8.14.1 873 | dev: true 874 | 875 | /acorn@8.14.1: 876 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 877 | engines: {node: '>=0.4.0'} 878 | hasBin: true 879 | dev: true 880 | 881 | /ajv@6.12.6: 882 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 883 | dependencies: 884 | fast-deep-equal: 3.1.3 885 | fast-json-stable-stringify: 2.1.0 886 | json-schema-traverse: 0.4.1 887 | uri-js: 4.4.1 888 | dev: true 889 | 890 | /ansi-regex@5.0.1: 891 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 892 | engines: {node: '>=8'} 893 | dev: true 894 | 895 | /ansi-regex@6.1.0: 896 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 897 | engines: {node: '>=12'} 898 | dev: true 899 | 900 | /ansi-styles@4.3.0: 901 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 902 | engines: {node: '>=8'} 903 | dependencies: 904 | color-convert: 2.0.1 905 | dev: true 906 | 907 | /ansi-styles@6.2.1: 908 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 909 | engines: {node: '>=12'} 910 | dev: true 911 | 912 | /any-promise@1.3.0: 913 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 914 | dev: true 915 | 916 | /argparse@2.0.1: 917 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 918 | dev: true 919 | 920 | /assertion-error@2.0.1: 921 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 922 | engines: {node: '>=12'} 923 | dev: true 924 | 925 | /balanced-match@1.0.2: 926 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 927 | dev: true 928 | 929 | /brace-expansion@1.1.11: 930 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 931 | dependencies: 932 | balanced-match: 1.0.2 933 | concat-map: 0.0.1 934 | dev: true 935 | 936 | /brace-expansion@2.0.1: 937 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 938 | dependencies: 939 | balanced-match: 1.0.2 940 | dev: true 941 | 942 | /braces@3.0.3: 943 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 944 | engines: {node: '>=8'} 945 | dependencies: 946 | fill-range: 7.1.1 947 | dev: true 948 | 949 | /bundle-require@5.1.0(esbuild@0.25.1): 950 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 951 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 952 | peerDependencies: 953 | esbuild: '>=0.18' 954 | dependencies: 955 | esbuild: 0.25.1 956 | load-tsconfig: 0.2.5 957 | dev: true 958 | 959 | /cac@6.7.14: 960 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 961 | engines: {node: '>=8'} 962 | dev: true 963 | 964 | /callsites@3.1.0: 965 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 966 | engines: {node: '>=6'} 967 | dev: true 968 | 969 | /camel-case@4.1.2: 970 | resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} 971 | dependencies: 972 | pascal-case: 3.1.2 973 | tslib: 2.8.1 974 | dev: true 975 | 976 | /capital-case@1.0.4: 977 | resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} 978 | dependencies: 979 | no-case: 3.0.4 980 | tslib: 2.8.1 981 | upper-case-first: 2.0.2 982 | dev: true 983 | 984 | /chai@5.2.0: 985 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 986 | engines: {node: '>=12'} 987 | dependencies: 988 | assertion-error: 2.0.1 989 | check-error: 2.1.1 990 | deep-eql: 5.0.2 991 | loupe: 3.1.3 992 | pathval: 2.0.0 993 | dev: true 994 | 995 | /chalk@4.1.2: 996 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 997 | engines: {node: '>=10'} 998 | dependencies: 999 | ansi-styles: 4.3.0 1000 | supports-color: 7.2.0 1001 | dev: true 1002 | 1003 | /change-case-all@1.0.15: 1004 | resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==} 1005 | dependencies: 1006 | change-case: 4.1.2 1007 | is-lower-case: 2.0.2 1008 | is-upper-case: 2.0.2 1009 | lower-case: 2.0.2 1010 | lower-case-first: 2.0.2 1011 | sponge-case: 1.0.1 1012 | swap-case: 2.0.2 1013 | title-case: 3.0.3 1014 | upper-case: 2.0.2 1015 | upper-case-first: 2.0.2 1016 | dev: true 1017 | 1018 | /change-case@4.1.2: 1019 | resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} 1020 | dependencies: 1021 | camel-case: 4.1.2 1022 | capital-case: 1.0.4 1023 | constant-case: 3.0.4 1024 | dot-case: 3.0.4 1025 | header-case: 2.0.4 1026 | no-case: 3.0.4 1027 | param-case: 3.0.4 1028 | pascal-case: 3.1.2 1029 | path-case: 3.0.4 1030 | sentence-case: 3.0.4 1031 | snake-case: 3.0.4 1032 | tslib: 2.8.1 1033 | dev: true 1034 | 1035 | /check-error@2.1.1: 1036 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 1037 | engines: {node: '>= 16'} 1038 | dev: true 1039 | 1040 | /chokidar@4.0.3: 1041 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 1042 | engines: {node: '>= 14.16.0'} 1043 | dependencies: 1044 | readdirp: 4.1.2 1045 | dev: true 1046 | 1047 | /color-convert@2.0.1: 1048 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1049 | engines: {node: '>=7.0.0'} 1050 | dependencies: 1051 | color-name: 1.1.4 1052 | dev: true 1053 | 1054 | /color-name@1.1.4: 1055 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1056 | dev: true 1057 | 1058 | /commander@4.1.1: 1059 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1060 | engines: {node: '>= 6'} 1061 | dev: true 1062 | 1063 | /common-tags@1.8.2: 1064 | resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} 1065 | engines: {node: '>=4.0.0'} 1066 | dev: true 1067 | 1068 | /concat-map@0.0.1: 1069 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1070 | dev: true 1071 | 1072 | /consola@3.4.1: 1073 | resolution: {integrity: sha512-zaUUWockhqxFf4bSXS+kTJwxWvAyMuKtShx0BWcGrMEUqbETcBCT91iQs9pECNx7yz8VH4VeWW/1KAbhE8kiww==} 1074 | engines: {node: ^14.18.0 || >=16.10.0} 1075 | dev: true 1076 | 1077 | /constant-case@3.0.4: 1078 | resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} 1079 | dependencies: 1080 | no-case: 3.0.4 1081 | tslib: 2.8.1 1082 | upper-case: 2.0.2 1083 | dev: true 1084 | 1085 | /cross-inspect@1.0.1: 1086 | resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} 1087 | engines: {node: '>=16.0.0'} 1088 | dependencies: 1089 | tslib: 2.8.1 1090 | dev: true 1091 | 1092 | /cross-spawn@7.0.6: 1093 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1094 | engines: {node: '>= 8'} 1095 | dependencies: 1096 | path-key: 3.1.1 1097 | shebang-command: 2.0.0 1098 | which: 2.0.2 1099 | dev: true 1100 | 1101 | /debug@4.4.0: 1102 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 1103 | engines: {node: '>=6.0'} 1104 | peerDependencies: 1105 | supports-color: '*' 1106 | peerDependenciesMeta: 1107 | supports-color: 1108 | optional: true 1109 | dependencies: 1110 | ms: 2.1.3 1111 | dev: true 1112 | 1113 | /deep-eql@5.0.2: 1114 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 1115 | engines: {node: '>=6'} 1116 | dev: true 1117 | 1118 | /deep-is@0.1.4: 1119 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1120 | dev: true 1121 | 1122 | /dot-case@3.0.4: 1123 | resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 1124 | dependencies: 1125 | no-case: 3.0.4 1126 | tslib: 2.8.1 1127 | dev: true 1128 | 1129 | /dset@3.1.4: 1130 | resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} 1131 | engines: {node: '>=4'} 1132 | dev: true 1133 | 1134 | /eastasianwidth@0.2.0: 1135 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1136 | dev: true 1137 | 1138 | /emoji-regex@8.0.0: 1139 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1140 | dev: true 1141 | 1142 | /emoji-regex@9.2.2: 1143 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1144 | dev: true 1145 | 1146 | /es-module-lexer@1.6.0: 1147 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 1148 | dev: true 1149 | 1150 | /esbuild@0.25.1: 1151 | resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} 1152 | engines: {node: '>=18'} 1153 | hasBin: true 1154 | requiresBuild: true 1155 | optionalDependencies: 1156 | '@esbuild/aix-ppc64': 0.25.1 1157 | '@esbuild/android-arm': 0.25.1 1158 | '@esbuild/android-arm64': 0.25.1 1159 | '@esbuild/android-x64': 0.25.1 1160 | '@esbuild/darwin-arm64': 0.25.1 1161 | '@esbuild/darwin-x64': 0.25.1 1162 | '@esbuild/freebsd-arm64': 0.25.1 1163 | '@esbuild/freebsd-x64': 0.25.1 1164 | '@esbuild/linux-arm': 0.25.1 1165 | '@esbuild/linux-arm64': 0.25.1 1166 | '@esbuild/linux-ia32': 0.25.1 1167 | '@esbuild/linux-loong64': 0.25.1 1168 | '@esbuild/linux-mips64el': 0.25.1 1169 | '@esbuild/linux-ppc64': 0.25.1 1170 | '@esbuild/linux-riscv64': 0.25.1 1171 | '@esbuild/linux-s390x': 0.25.1 1172 | '@esbuild/linux-x64': 0.25.1 1173 | '@esbuild/netbsd-arm64': 0.25.1 1174 | '@esbuild/netbsd-x64': 0.25.1 1175 | '@esbuild/openbsd-arm64': 0.25.1 1176 | '@esbuild/openbsd-x64': 0.25.1 1177 | '@esbuild/sunos-x64': 0.25.1 1178 | '@esbuild/win32-arm64': 0.25.1 1179 | '@esbuild/win32-ia32': 0.25.1 1180 | '@esbuild/win32-x64': 0.25.1 1181 | dev: true 1182 | 1183 | /escape-string-regexp@4.0.0: 1184 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1185 | engines: {node: '>=10'} 1186 | dev: true 1187 | 1188 | /eslint-config-prettier@10.1.1(eslint@9.22.0): 1189 | resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} 1190 | hasBin: true 1191 | peerDependencies: 1192 | eslint: '>=7.0.0' 1193 | dependencies: 1194 | eslint: 9.22.0 1195 | dev: true 1196 | 1197 | /eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.1.1)(eslint@9.22.0)(prettier@3.5.3): 1198 | resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} 1199 | engines: {node: ^14.18.0 || >=16.0.0} 1200 | peerDependencies: 1201 | '@types/eslint': '>=8.0.0' 1202 | eslint: '>=8.0.0' 1203 | eslint-config-prettier: '*' 1204 | prettier: '>=3.0.0' 1205 | peerDependenciesMeta: 1206 | '@types/eslint': 1207 | optional: true 1208 | eslint-config-prettier: 1209 | optional: true 1210 | dependencies: 1211 | eslint: 9.22.0 1212 | eslint-config-prettier: 10.1.1(eslint@9.22.0) 1213 | prettier: 3.5.3 1214 | prettier-linter-helpers: 1.0.0 1215 | synckit: 0.9.2 1216 | dev: true 1217 | 1218 | /eslint-scope@8.3.0: 1219 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 1220 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1221 | dependencies: 1222 | esrecurse: 4.3.0 1223 | estraverse: 5.3.0 1224 | dev: true 1225 | 1226 | /eslint-visitor-keys@3.4.3: 1227 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1228 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1229 | dev: true 1230 | 1231 | /eslint-visitor-keys@4.2.0: 1232 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 1233 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1234 | dev: true 1235 | 1236 | /eslint@9.22.0: 1237 | resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} 1238 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1239 | hasBin: true 1240 | peerDependencies: 1241 | jiti: '*' 1242 | peerDependenciesMeta: 1243 | jiti: 1244 | optional: true 1245 | dependencies: 1246 | '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) 1247 | '@eslint-community/regexpp': 4.12.1 1248 | '@eslint/config-array': 0.19.2 1249 | '@eslint/config-helpers': 0.1.0 1250 | '@eslint/core': 0.12.0 1251 | '@eslint/eslintrc': 3.3.0 1252 | '@eslint/js': 9.22.0 1253 | '@eslint/plugin-kit': 0.2.7 1254 | '@humanfs/node': 0.16.6 1255 | '@humanwhocodes/module-importer': 1.0.1 1256 | '@humanwhocodes/retry': 0.4.2 1257 | '@types/estree': 1.0.6 1258 | '@types/json-schema': 7.0.15 1259 | ajv: 6.12.6 1260 | chalk: 4.1.2 1261 | cross-spawn: 7.0.6 1262 | debug: 4.4.0 1263 | escape-string-regexp: 4.0.0 1264 | eslint-scope: 8.3.0 1265 | eslint-visitor-keys: 4.2.0 1266 | espree: 10.3.0 1267 | esquery: 1.6.0 1268 | esutils: 2.0.3 1269 | fast-deep-equal: 3.1.3 1270 | file-entry-cache: 8.0.0 1271 | find-up: 5.0.0 1272 | glob-parent: 6.0.2 1273 | ignore: 5.3.2 1274 | imurmurhash: 0.1.4 1275 | is-glob: 4.0.3 1276 | json-stable-stringify-without-jsonify: 1.0.1 1277 | lodash.merge: 4.6.2 1278 | minimatch: 3.1.2 1279 | natural-compare: 1.4.0 1280 | optionator: 0.9.4 1281 | transitivePeerDependencies: 1282 | - supports-color 1283 | dev: true 1284 | 1285 | /espree@10.3.0: 1286 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 1287 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1288 | dependencies: 1289 | acorn: 8.14.1 1290 | acorn-jsx: 5.3.2(acorn@8.14.1) 1291 | eslint-visitor-keys: 4.2.0 1292 | dev: true 1293 | 1294 | /esquery@1.6.0: 1295 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 1296 | engines: {node: '>=0.10'} 1297 | dependencies: 1298 | estraverse: 5.3.0 1299 | dev: true 1300 | 1301 | /esrecurse@4.3.0: 1302 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1303 | engines: {node: '>=4.0'} 1304 | dependencies: 1305 | estraverse: 5.3.0 1306 | dev: true 1307 | 1308 | /estraverse@5.3.0: 1309 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1310 | engines: {node: '>=4.0'} 1311 | dev: true 1312 | 1313 | /estree-walker@3.0.3: 1314 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1315 | dependencies: 1316 | '@types/estree': 1.0.6 1317 | dev: true 1318 | 1319 | /esutils@2.0.3: 1320 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1321 | engines: {node: '>=0.10.0'} 1322 | dev: true 1323 | 1324 | /expect-type@1.2.0: 1325 | resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} 1326 | engines: {node: '>=12.0.0'} 1327 | dev: true 1328 | 1329 | /fast-deep-equal@3.1.3: 1330 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1331 | dev: true 1332 | 1333 | /fast-diff@1.3.0: 1334 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 1335 | dev: true 1336 | 1337 | /fast-glob@3.3.3: 1338 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 1339 | engines: {node: '>=8.6.0'} 1340 | dependencies: 1341 | '@nodelib/fs.stat': 2.0.5 1342 | '@nodelib/fs.walk': 1.2.8 1343 | glob-parent: 5.1.2 1344 | merge2: 1.4.1 1345 | micromatch: 4.0.8 1346 | dev: true 1347 | 1348 | /fast-json-stable-stringify@2.1.0: 1349 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1350 | dev: true 1351 | 1352 | /fast-levenshtein@2.0.6: 1353 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1354 | dev: true 1355 | 1356 | /fastq@1.19.1: 1357 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 1358 | dependencies: 1359 | reusify: 1.1.0 1360 | dev: true 1361 | 1362 | /fdir@6.4.3(picomatch@4.0.2): 1363 | resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 1364 | peerDependencies: 1365 | picomatch: ^3 || ^4 1366 | peerDependenciesMeta: 1367 | picomatch: 1368 | optional: true 1369 | dependencies: 1370 | picomatch: 4.0.2 1371 | dev: true 1372 | 1373 | /file-entry-cache@8.0.0: 1374 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1375 | engines: {node: '>=16.0.0'} 1376 | dependencies: 1377 | flat-cache: 4.0.1 1378 | dev: true 1379 | 1380 | /fill-range@7.1.1: 1381 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1382 | engines: {node: '>=8'} 1383 | dependencies: 1384 | to-regex-range: 5.0.1 1385 | dev: true 1386 | 1387 | /find-up@5.0.0: 1388 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1389 | engines: {node: '>=10'} 1390 | dependencies: 1391 | locate-path: 6.0.0 1392 | path-exists: 4.0.0 1393 | dev: true 1394 | 1395 | /flat-cache@4.0.1: 1396 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 1397 | engines: {node: '>=16'} 1398 | dependencies: 1399 | flatted: 3.3.3 1400 | keyv: 4.5.4 1401 | dev: true 1402 | 1403 | /flatted@3.3.3: 1404 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 1405 | dev: true 1406 | 1407 | /foreground-child@3.3.1: 1408 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 1409 | engines: {node: '>=14'} 1410 | dependencies: 1411 | cross-spawn: 7.0.6 1412 | signal-exit: 4.1.0 1413 | dev: true 1414 | 1415 | /fsevents@2.3.3: 1416 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1417 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1418 | os: [darwin] 1419 | requiresBuild: true 1420 | dev: true 1421 | optional: true 1422 | 1423 | /glob-parent@5.1.2: 1424 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1425 | engines: {node: '>= 6'} 1426 | dependencies: 1427 | is-glob: 4.0.3 1428 | dev: true 1429 | 1430 | /glob-parent@6.0.2: 1431 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1432 | engines: {node: '>=10.13.0'} 1433 | dependencies: 1434 | is-glob: 4.0.3 1435 | dev: true 1436 | 1437 | /glob@10.4.5: 1438 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 1439 | hasBin: true 1440 | dependencies: 1441 | foreground-child: 3.3.1 1442 | jackspeak: 3.4.3 1443 | minimatch: 9.0.5 1444 | minipass: 7.1.2 1445 | package-json-from-dist: 1.0.1 1446 | path-scurry: 1.11.1 1447 | dev: true 1448 | 1449 | /globals@14.0.0: 1450 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1451 | engines: {node: '>=18'} 1452 | dev: true 1453 | 1454 | /graphemer@1.4.0: 1455 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1456 | dev: true 1457 | 1458 | /graphql@16.10.0: 1459 | resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} 1460 | engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} 1461 | dev: true 1462 | 1463 | /has-flag@4.0.0: 1464 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1465 | engines: {node: '>=8'} 1466 | dev: true 1467 | 1468 | /header-case@2.0.4: 1469 | resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} 1470 | dependencies: 1471 | capital-case: 1.0.4 1472 | tslib: 2.8.1 1473 | dev: true 1474 | 1475 | /ignore@5.3.2: 1476 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1477 | engines: {node: '>= 4'} 1478 | dev: true 1479 | 1480 | /import-fresh@3.3.1: 1481 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1482 | engines: {node: '>=6'} 1483 | dependencies: 1484 | parent-module: 1.0.1 1485 | resolve-from: 4.0.0 1486 | dev: true 1487 | 1488 | /import-from@4.0.0: 1489 | resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} 1490 | engines: {node: '>=12.2'} 1491 | dev: true 1492 | 1493 | /imurmurhash@0.1.4: 1494 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1495 | engines: {node: '>=0.8.19'} 1496 | dev: true 1497 | 1498 | /is-extglob@2.1.1: 1499 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1500 | engines: {node: '>=0.10.0'} 1501 | dev: true 1502 | 1503 | /is-fullwidth-code-point@3.0.0: 1504 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1505 | engines: {node: '>=8'} 1506 | dev: true 1507 | 1508 | /is-glob@4.0.3: 1509 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1510 | engines: {node: '>=0.10.0'} 1511 | dependencies: 1512 | is-extglob: 2.1.1 1513 | dev: true 1514 | 1515 | /is-lower-case@2.0.2: 1516 | resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} 1517 | dependencies: 1518 | tslib: 2.8.1 1519 | dev: true 1520 | 1521 | /is-number@7.0.0: 1522 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1523 | engines: {node: '>=0.12.0'} 1524 | dev: true 1525 | 1526 | /is-upper-case@2.0.2: 1527 | resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} 1528 | dependencies: 1529 | tslib: 2.8.1 1530 | dev: true 1531 | 1532 | /isexe@2.0.0: 1533 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1534 | dev: true 1535 | 1536 | /jackspeak@3.4.3: 1537 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 1538 | dependencies: 1539 | '@isaacs/cliui': 8.0.2 1540 | optionalDependencies: 1541 | '@pkgjs/parseargs': 0.11.0 1542 | dev: true 1543 | 1544 | /joycon@3.1.1: 1545 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 1546 | engines: {node: '>=10'} 1547 | dev: true 1548 | 1549 | /js-yaml@4.1.0: 1550 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1551 | hasBin: true 1552 | dependencies: 1553 | argparse: 2.0.1 1554 | dev: true 1555 | 1556 | /json-buffer@3.0.1: 1557 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1558 | dev: true 1559 | 1560 | /json-schema-traverse@0.4.1: 1561 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1562 | dev: true 1563 | 1564 | /json-stable-stringify-without-jsonify@1.0.1: 1565 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1566 | dev: true 1567 | 1568 | /keyv@4.5.4: 1569 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1570 | dependencies: 1571 | json-buffer: 3.0.1 1572 | dev: true 1573 | 1574 | /levn@0.4.1: 1575 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1576 | engines: {node: '>= 0.8.0'} 1577 | dependencies: 1578 | prelude-ls: 1.2.1 1579 | type-check: 0.4.0 1580 | dev: true 1581 | 1582 | /lilconfig@3.1.3: 1583 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 1584 | engines: {node: '>=14'} 1585 | dev: true 1586 | 1587 | /lines-and-columns@1.2.4: 1588 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1589 | dev: true 1590 | 1591 | /load-tsconfig@0.2.5: 1592 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 1593 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1594 | dev: true 1595 | 1596 | /locate-path@6.0.0: 1597 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1598 | engines: {node: '>=10'} 1599 | dependencies: 1600 | p-locate: 5.0.0 1601 | dev: true 1602 | 1603 | /lodash.merge@4.6.2: 1604 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1605 | dev: true 1606 | 1607 | /lodash.sortby@4.7.0: 1608 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 1609 | dev: true 1610 | 1611 | /lodash@4.17.21: 1612 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1613 | dev: true 1614 | 1615 | /loupe@3.1.3: 1616 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 1617 | dev: true 1618 | 1619 | /lower-case-first@2.0.2: 1620 | resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} 1621 | dependencies: 1622 | tslib: 2.8.1 1623 | dev: true 1624 | 1625 | /lower-case@2.0.2: 1626 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1627 | dependencies: 1628 | tslib: 2.8.1 1629 | dev: true 1630 | 1631 | /lru-cache@10.4.3: 1632 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1633 | dev: true 1634 | 1635 | /magic-string@0.30.17: 1636 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1637 | dependencies: 1638 | '@jridgewell/sourcemap-codec': 1.5.0 1639 | dev: true 1640 | 1641 | /merge2@1.4.1: 1642 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1643 | engines: {node: '>= 8'} 1644 | dev: true 1645 | 1646 | /micromatch@4.0.8: 1647 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1648 | engines: {node: '>=8.6'} 1649 | dependencies: 1650 | braces: 3.0.3 1651 | picomatch: 2.3.1 1652 | dev: true 1653 | 1654 | /minimatch@3.1.2: 1655 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1656 | dependencies: 1657 | brace-expansion: 1.1.11 1658 | dev: true 1659 | 1660 | /minimatch@9.0.5: 1661 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1662 | engines: {node: '>=16 || 14 >=14.17'} 1663 | dependencies: 1664 | brace-expansion: 2.0.1 1665 | dev: true 1666 | 1667 | /minipass@7.1.2: 1668 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1669 | engines: {node: '>=16 || 14 >=14.17'} 1670 | dev: true 1671 | 1672 | /ms@2.1.3: 1673 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1674 | dev: true 1675 | 1676 | /mz@2.7.0: 1677 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1678 | dependencies: 1679 | any-promise: 1.3.0 1680 | object-assign: 4.1.1 1681 | thenify-all: 1.6.0 1682 | dev: true 1683 | 1684 | /nanoid@3.3.10: 1685 | resolution: {integrity: sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==} 1686 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1687 | hasBin: true 1688 | dev: true 1689 | 1690 | /natural-compare@1.4.0: 1691 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1692 | dev: true 1693 | 1694 | /no-case@3.0.4: 1695 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 1696 | dependencies: 1697 | lower-case: 2.0.2 1698 | tslib: 2.8.1 1699 | dev: true 1700 | 1701 | /object-assign@4.1.1: 1702 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1703 | engines: {node: '>=0.10.0'} 1704 | dev: true 1705 | 1706 | /optionator@0.9.4: 1707 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1708 | engines: {node: '>= 0.8.0'} 1709 | dependencies: 1710 | deep-is: 0.1.4 1711 | fast-levenshtein: 2.0.6 1712 | levn: 0.4.1 1713 | prelude-ls: 1.2.1 1714 | type-check: 0.4.0 1715 | word-wrap: 1.2.5 1716 | dev: true 1717 | 1718 | /p-limit@3.1.0: 1719 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1720 | engines: {node: '>=10'} 1721 | dependencies: 1722 | yocto-queue: 0.1.0 1723 | dev: true 1724 | 1725 | /p-locate@5.0.0: 1726 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1727 | engines: {node: '>=10'} 1728 | dependencies: 1729 | p-limit: 3.1.0 1730 | dev: true 1731 | 1732 | /package-json-from-dist@1.0.1: 1733 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1734 | dev: true 1735 | 1736 | /param-case@3.0.4: 1737 | resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} 1738 | dependencies: 1739 | dot-case: 3.0.4 1740 | tslib: 2.8.1 1741 | dev: true 1742 | 1743 | /parent-module@1.0.1: 1744 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1745 | engines: {node: '>=6'} 1746 | dependencies: 1747 | callsites: 3.1.0 1748 | dev: true 1749 | 1750 | /pascal-case@3.1.2: 1751 | resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 1752 | dependencies: 1753 | no-case: 3.0.4 1754 | tslib: 2.8.1 1755 | dev: true 1756 | 1757 | /path-case@3.0.4: 1758 | resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} 1759 | dependencies: 1760 | dot-case: 3.0.4 1761 | tslib: 2.8.1 1762 | dev: true 1763 | 1764 | /path-exists@4.0.0: 1765 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1766 | engines: {node: '>=8'} 1767 | dev: true 1768 | 1769 | /path-key@3.1.1: 1770 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1771 | engines: {node: '>=8'} 1772 | dev: true 1773 | 1774 | /path-scurry@1.11.1: 1775 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1776 | engines: {node: '>=16 || 14 >=14.18'} 1777 | dependencies: 1778 | lru-cache: 10.4.3 1779 | minipass: 7.1.2 1780 | dev: true 1781 | 1782 | /pathe@2.0.3: 1783 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1784 | dev: true 1785 | 1786 | /pathval@2.0.0: 1787 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1788 | engines: {node: '>= 14.16'} 1789 | dev: true 1790 | 1791 | /picocolors@1.1.1: 1792 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1793 | dev: true 1794 | 1795 | /picomatch@2.3.1: 1796 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1797 | engines: {node: '>=8.6'} 1798 | dev: true 1799 | 1800 | /picomatch@4.0.2: 1801 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1802 | engines: {node: '>=12'} 1803 | dev: true 1804 | 1805 | /pirates@4.0.6: 1806 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1807 | engines: {node: '>= 6'} 1808 | dev: true 1809 | 1810 | /postcss-load-config@6.0.1: 1811 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 1812 | engines: {node: '>= 18'} 1813 | peerDependencies: 1814 | jiti: '>=1.21.0' 1815 | postcss: '>=8.0.9' 1816 | tsx: ^4.8.1 1817 | yaml: ^2.4.2 1818 | peerDependenciesMeta: 1819 | jiti: 1820 | optional: true 1821 | postcss: 1822 | optional: true 1823 | tsx: 1824 | optional: true 1825 | yaml: 1826 | optional: true 1827 | dependencies: 1828 | lilconfig: 3.1.3 1829 | dev: true 1830 | 1831 | /postcss@8.5.3: 1832 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1833 | engines: {node: ^10 || ^12 || >=14} 1834 | dependencies: 1835 | nanoid: 3.3.10 1836 | picocolors: 1.1.1 1837 | source-map-js: 1.2.1 1838 | dev: true 1839 | 1840 | /prelude-ls@1.2.1: 1841 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1842 | engines: {node: '>= 0.8.0'} 1843 | dev: true 1844 | 1845 | /prettier-linter-helpers@1.0.0: 1846 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 1847 | engines: {node: '>=6.0.0'} 1848 | dependencies: 1849 | fast-diff: 1.3.0 1850 | dev: true 1851 | 1852 | /prettier@3.5.3: 1853 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 1854 | engines: {node: '>=14'} 1855 | hasBin: true 1856 | dev: true 1857 | 1858 | /punycode@2.3.1: 1859 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1860 | engines: {node: '>=6'} 1861 | dev: true 1862 | 1863 | /queue-microtask@1.2.3: 1864 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1865 | dev: true 1866 | 1867 | /readdirp@4.1.2: 1868 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1869 | engines: {node: '>= 14.18.0'} 1870 | dev: true 1871 | 1872 | /resolve-from@4.0.0: 1873 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1874 | engines: {node: '>=4'} 1875 | dev: true 1876 | 1877 | /resolve-from@5.0.0: 1878 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1879 | engines: {node: '>=8'} 1880 | dev: true 1881 | 1882 | /reusify@1.1.0: 1883 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1884 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1885 | dev: true 1886 | 1887 | /rollup@4.36.0: 1888 | resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} 1889 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1890 | hasBin: true 1891 | dependencies: 1892 | '@types/estree': 1.0.6 1893 | optionalDependencies: 1894 | '@rollup/rollup-android-arm-eabi': 4.36.0 1895 | '@rollup/rollup-android-arm64': 4.36.0 1896 | '@rollup/rollup-darwin-arm64': 4.36.0 1897 | '@rollup/rollup-darwin-x64': 4.36.0 1898 | '@rollup/rollup-freebsd-arm64': 4.36.0 1899 | '@rollup/rollup-freebsd-x64': 4.36.0 1900 | '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 1901 | '@rollup/rollup-linux-arm-musleabihf': 4.36.0 1902 | '@rollup/rollup-linux-arm64-gnu': 4.36.0 1903 | '@rollup/rollup-linux-arm64-musl': 4.36.0 1904 | '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 1905 | '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 1906 | '@rollup/rollup-linux-riscv64-gnu': 4.36.0 1907 | '@rollup/rollup-linux-s390x-gnu': 4.36.0 1908 | '@rollup/rollup-linux-x64-gnu': 4.36.0 1909 | '@rollup/rollup-linux-x64-musl': 4.36.0 1910 | '@rollup/rollup-win32-arm64-msvc': 4.36.0 1911 | '@rollup/rollup-win32-ia32-msvc': 4.36.0 1912 | '@rollup/rollup-win32-x64-msvc': 4.36.0 1913 | fsevents: 2.3.3 1914 | dev: true 1915 | 1916 | /run-parallel@1.2.0: 1917 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1918 | dependencies: 1919 | queue-microtask: 1.2.3 1920 | dev: true 1921 | 1922 | /semver@7.7.1: 1923 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1924 | engines: {node: '>=10'} 1925 | hasBin: true 1926 | dev: true 1927 | 1928 | /sentence-case@3.0.4: 1929 | resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} 1930 | dependencies: 1931 | no-case: 3.0.4 1932 | tslib: 2.8.1 1933 | upper-case-first: 2.0.2 1934 | dev: true 1935 | 1936 | /shebang-command@2.0.0: 1937 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1938 | engines: {node: '>=8'} 1939 | dependencies: 1940 | shebang-regex: 3.0.0 1941 | dev: true 1942 | 1943 | /shebang-regex@3.0.0: 1944 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1945 | engines: {node: '>=8'} 1946 | dev: true 1947 | 1948 | /siginfo@2.0.0: 1949 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1950 | dev: true 1951 | 1952 | /signal-exit@4.1.0: 1953 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1954 | engines: {node: '>=14'} 1955 | dev: true 1956 | 1957 | /snake-case@3.0.4: 1958 | resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} 1959 | dependencies: 1960 | dot-case: 3.0.4 1961 | tslib: 2.8.1 1962 | dev: true 1963 | 1964 | /source-map-js@1.2.1: 1965 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1966 | engines: {node: '>=0.10.0'} 1967 | dev: true 1968 | 1969 | /source-map@0.8.0-beta.0: 1970 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1971 | engines: {node: '>= 8'} 1972 | dependencies: 1973 | whatwg-url: 7.1.0 1974 | dev: true 1975 | 1976 | /sponge-case@1.0.1: 1977 | resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} 1978 | dependencies: 1979 | tslib: 2.8.1 1980 | dev: true 1981 | 1982 | /stackback@0.0.2: 1983 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1984 | dev: true 1985 | 1986 | /std-env@3.8.1: 1987 | resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} 1988 | dev: true 1989 | 1990 | /string-width@4.2.3: 1991 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1992 | engines: {node: '>=8'} 1993 | dependencies: 1994 | emoji-regex: 8.0.0 1995 | is-fullwidth-code-point: 3.0.0 1996 | strip-ansi: 6.0.1 1997 | dev: true 1998 | 1999 | /string-width@5.1.2: 2000 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 2001 | engines: {node: '>=12'} 2002 | dependencies: 2003 | eastasianwidth: 0.2.0 2004 | emoji-regex: 9.2.2 2005 | strip-ansi: 7.1.0 2006 | dev: true 2007 | 2008 | /strip-ansi@6.0.1: 2009 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2010 | engines: {node: '>=8'} 2011 | dependencies: 2012 | ansi-regex: 5.0.1 2013 | dev: true 2014 | 2015 | /strip-ansi@7.1.0: 2016 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 2017 | engines: {node: '>=12'} 2018 | dependencies: 2019 | ansi-regex: 6.1.0 2020 | dev: true 2021 | 2022 | /strip-json-comments@3.1.1: 2023 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2024 | engines: {node: '>=8'} 2025 | dev: true 2026 | 2027 | /sucrase@3.35.0: 2028 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 2029 | engines: {node: '>=16 || 14 >=14.17'} 2030 | hasBin: true 2031 | dependencies: 2032 | '@jridgewell/gen-mapping': 0.3.8 2033 | commander: 4.1.1 2034 | glob: 10.4.5 2035 | lines-and-columns: 1.2.4 2036 | mz: 2.7.0 2037 | pirates: 4.0.6 2038 | ts-interface-checker: 0.1.13 2039 | dev: true 2040 | 2041 | /supports-color@7.2.0: 2042 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2043 | engines: {node: '>=8'} 2044 | dependencies: 2045 | has-flag: 4.0.0 2046 | dev: true 2047 | 2048 | /swap-case@2.0.2: 2049 | resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} 2050 | dependencies: 2051 | tslib: 2.8.1 2052 | dev: true 2053 | 2054 | /synckit@0.9.2: 2055 | resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} 2056 | engines: {node: ^14.18.0 || >=16.0.0} 2057 | dependencies: 2058 | '@pkgr/core': 0.1.1 2059 | tslib: 2.8.1 2060 | dev: true 2061 | 2062 | /thenify-all@1.6.0: 2063 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2064 | engines: {node: '>=0.8'} 2065 | dependencies: 2066 | thenify: 3.3.1 2067 | dev: true 2068 | 2069 | /thenify@3.3.1: 2070 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2071 | dependencies: 2072 | any-promise: 1.3.0 2073 | dev: true 2074 | 2075 | /tinybench@2.9.0: 2076 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 2077 | dev: true 2078 | 2079 | /tinyexec@0.3.2: 2080 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 2081 | dev: true 2082 | 2083 | /tinyglobby@0.2.12: 2084 | resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} 2085 | engines: {node: '>=12.0.0'} 2086 | dependencies: 2087 | fdir: 6.4.3(picomatch@4.0.2) 2088 | picomatch: 4.0.2 2089 | dev: true 2090 | 2091 | /tinypool@1.0.2: 2092 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 2093 | engines: {node: ^18.0.0 || >=20.0.0} 2094 | dev: true 2095 | 2096 | /tinyrainbow@2.0.0: 2097 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 2098 | engines: {node: '>=14.0.0'} 2099 | dev: true 2100 | 2101 | /tinyspy@3.0.2: 2102 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 2103 | engines: {node: '>=14.0.0'} 2104 | dev: true 2105 | 2106 | /title-case@3.0.3: 2107 | resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} 2108 | dependencies: 2109 | tslib: 2.8.1 2110 | dev: true 2111 | 2112 | /to-regex-range@5.0.1: 2113 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2114 | engines: {node: '>=8.0'} 2115 | dependencies: 2116 | is-number: 7.0.0 2117 | dev: true 2118 | 2119 | /tr46@1.0.1: 2120 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 2121 | dependencies: 2122 | punycode: 2.3.1 2123 | dev: true 2124 | 2125 | /tree-kill@1.2.2: 2126 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 2127 | hasBin: true 2128 | dev: true 2129 | 2130 | /ts-api-utils@2.0.1(typescript@5.8.2): 2131 | resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} 2132 | engines: {node: '>=18.12'} 2133 | peerDependencies: 2134 | typescript: '>=4.8.4' 2135 | dependencies: 2136 | typescript: 5.8.2 2137 | dev: true 2138 | 2139 | /ts-interface-checker@0.1.13: 2140 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2141 | dev: true 2142 | 2143 | /tslib@2.6.3: 2144 | resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} 2145 | dev: true 2146 | 2147 | /tslib@2.8.1: 2148 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 2149 | dev: true 2150 | 2151 | /tsup@8.4.0(typescript@5.8.2): 2152 | resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} 2153 | engines: {node: '>=18'} 2154 | hasBin: true 2155 | peerDependencies: 2156 | '@microsoft/api-extractor': ^7.36.0 2157 | '@swc/core': ^1 2158 | postcss: ^8.4.12 2159 | typescript: '>=4.5.0' 2160 | peerDependenciesMeta: 2161 | '@microsoft/api-extractor': 2162 | optional: true 2163 | '@swc/core': 2164 | optional: true 2165 | postcss: 2166 | optional: true 2167 | typescript: 2168 | optional: true 2169 | dependencies: 2170 | bundle-require: 5.1.0(esbuild@0.25.1) 2171 | cac: 6.7.14 2172 | chokidar: 4.0.3 2173 | consola: 3.4.1 2174 | debug: 4.4.0 2175 | esbuild: 0.25.1 2176 | joycon: 3.1.1 2177 | picocolors: 1.1.1 2178 | postcss-load-config: 6.0.1 2179 | resolve-from: 5.0.0 2180 | rollup: 4.36.0 2181 | source-map: 0.8.0-beta.0 2182 | sucrase: 3.35.0 2183 | tinyexec: 0.3.2 2184 | tinyglobby: 0.2.12 2185 | tree-kill: 1.2.2 2186 | typescript: 5.8.2 2187 | transitivePeerDependencies: 2188 | - jiti 2189 | - supports-color 2190 | - tsx 2191 | - yaml 2192 | dev: true 2193 | 2194 | /type-check@0.4.0: 2195 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2196 | engines: {node: '>= 0.8.0'} 2197 | dependencies: 2198 | prelude-ls: 1.2.1 2199 | dev: true 2200 | 2201 | /typescript-eslint@8.26.1(eslint@9.22.0)(typescript@5.8.2): 2202 | resolution: {integrity: sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==} 2203 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2204 | peerDependencies: 2205 | eslint: ^8.57.0 || ^9.0.0 2206 | typescript: '>=4.8.4 <5.9.0' 2207 | dependencies: 2208 | '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1)(eslint@9.22.0)(typescript@5.8.2) 2209 | '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 2210 | '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 2211 | eslint: 9.22.0 2212 | typescript: 5.8.2 2213 | transitivePeerDependencies: 2214 | - supports-color 2215 | dev: true 2216 | 2217 | /typescript@5.8.2: 2218 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 2219 | engines: {node: '>=14.17'} 2220 | hasBin: true 2221 | dev: true 2222 | 2223 | /undici-types@6.20.0: 2224 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 2225 | dev: true 2226 | 2227 | /upper-case-first@2.0.2: 2228 | resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} 2229 | dependencies: 2230 | tslib: 2.8.1 2231 | dev: true 2232 | 2233 | /upper-case@2.0.2: 2234 | resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} 2235 | dependencies: 2236 | tslib: 2.8.1 2237 | dev: true 2238 | 2239 | /uri-js@4.4.1: 2240 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2241 | dependencies: 2242 | punycode: 2.3.1 2243 | dev: true 2244 | 2245 | /vite-node@3.0.9(@types/node@22.13.10): 2246 | resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} 2247 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2248 | hasBin: true 2249 | dependencies: 2250 | cac: 6.7.14 2251 | debug: 4.4.0 2252 | es-module-lexer: 1.6.0 2253 | pathe: 2.0.3 2254 | vite: 6.2.2(@types/node@22.13.10) 2255 | transitivePeerDependencies: 2256 | - '@types/node' 2257 | - jiti 2258 | - less 2259 | - lightningcss 2260 | - sass 2261 | - sass-embedded 2262 | - stylus 2263 | - sugarss 2264 | - supports-color 2265 | - terser 2266 | - tsx 2267 | - yaml 2268 | dev: true 2269 | 2270 | /vite@6.2.2(@types/node@22.13.10): 2271 | resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==} 2272 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2273 | hasBin: true 2274 | peerDependencies: 2275 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 2276 | jiti: '>=1.21.0' 2277 | less: '*' 2278 | lightningcss: ^1.21.0 2279 | sass: '*' 2280 | sass-embedded: '*' 2281 | stylus: '*' 2282 | sugarss: '*' 2283 | terser: ^5.16.0 2284 | tsx: ^4.8.1 2285 | yaml: ^2.4.2 2286 | peerDependenciesMeta: 2287 | '@types/node': 2288 | optional: true 2289 | jiti: 2290 | optional: true 2291 | less: 2292 | optional: true 2293 | lightningcss: 2294 | optional: true 2295 | sass: 2296 | optional: true 2297 | sass-embedded: 2298 | optional: true 2299 | stylus: 2300 | optional: true 2301 | sugarss: 2302 | optional: true 2303 | terser: 2304 | optional: true 2305 | tsx: 2306 | optional: true 2307 | yaml: 2308 | optional: true 2309 | dependencies: 2310 | '@types/node': 22.13.10 2311 | esbuild: 0.25.1 2312 | postcss: 8.5.3 2313 | rollup: 4.36.0 2314 | optionalDependencies: 2315 | fsevents: 2.3.3 2316 | dev: true 2317 | 2318 | /vitest@3.0.9(@types/node@22.13.10): 2319 | resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} 2320 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2321 | hasBin: true 2322 | peerDependencies: 2323 | '@edge-runtime/vm': '*' 2324 | '@types/debug': ^4.1.12 2325 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 2326 | '@vitest/browser': 3.0.9 2327 | '@vitest/ui': 3.0.9 2328 | happy-dom: '*' 2329 | jsdom: '*' 2330 | peerDependenciesMeta: 2331 | '@edge-runtime/vm': 2332 | optional: true 2333 | '@types/debug': 2334 | optional: true 2335 | '@types/node': 2336 | optional: true 2337 | '@vitest/browser': 2338 | optional: true 2339 | '@vitest/ui': 2340 | optional: true 2341 | happy-dom: 2342 | optional: true 2343 | jsdom: 2344 | optional: true 2345 | dependencies: 2346 | '@types/node': 22.13.10 2347 | '@vitest/expect': 3.0.9 2348 | '@vitest/mocker': 3.0.9(vite@6.2.2) 2349 | '@vitest/pretty-format': 3.0.9 2350 | '@vitest/runner': 3.0.9 2351 | '@vitest/snapshot': 3.0.9 2352 | '@vitest/spy': 3.0.9 2353 | '@vitest/utils': 3.0.9 2354 | chai: 5.2.0 2355 | debug: 4.4.0 2356 | expect-type: 1.2.0 2357 | magic-string: 0.30.17 2358 | pathe: 2.0.3 2359 | std-env: 3.8.1 2360 | tinybench: 2.9.0 2361 | tinyexec: 0.3.2 2362 | tinypool: 1.0.2 2363 | tinyrainbow: 2.0.0 2364 | vite: 6.2.2(@types/node@22.13.10) 2365 | vite-node: 3.0.9(@types/node@22.13.10) 2366 | why-is-node-running: 2.3.0 2367 | transitivePeerDependencies: 2368 | - jiti 2369 | - less 2370 | - lightningcss 2371 | - msw 2372 | - sass 2373 | - sass-embedded 2374 | - stylus 2375 | - sugarss 2376 | - supports-color 2377 | - terser 2378 | - tsx 2379 | - yaml 2380 | dev: true 2381 | 2382 | /webidl-conversions@4.0.2: 2383 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 2384 | dev: true 2385 | 2386 | /whatwg-url@7.1.0: 2387 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 2388 | dependencies: 2389 | lodash.sortby: 4.7.0 2390 | tr46: 1.0.1 2391 | webidl-conversions: 4.0.2 2392 | dev: true 2393 | 2394 | /which@2.0.2: 2395 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2396 | engines: {node: '>= 8'} 2397 | hasBin: true 2398 | dependencies: 2399 | isexe: 2.0.0 2400 | dev: true 2401 | 2402 | /why-is-node-running@2.3.0: 2403 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 2404 | engines: {node: '>=8'} 2405 | hasBin: true 2406 | dependencies: 2407 | siginfo: 2.0.0 2408 | stackback: 0.0.2 2409 | dev: true 2410 | 2411 | /word-wrap@1.2.5: 2412 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 2413 | engines: {node: '>=0.10.0'} 2414 | dev: true 2415 | 2416 | /wrap-ansi@7.0.0: 2417 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2418 | engines: {node: '>=10'} 2419 | dependencies: 2420 | ansi-styles: 4.3.0 2421 | string-width: 4.2.3 2422 | strip-ansi: 6.0.1 2423 | dev: true 2424 | 2425 | /wrap-ansi@8.1.0: 2426 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2427 | engines: {node: '>=12'} 2428 | dependencies: 2429 | ansi-styles: 6.2.1 2430 | string-width: 5.1.2 2431 | strip-ansi: 7.1.0 2432 | dev: true 2433 | 2434 | /yocto-queue@0.1.0: 2435 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2436 | engines: {node: '>=10'} 2437 | dev: true 2438 | --------------------------------------------------------------------------------