An experimental TypeSpec syntax for Lexicon
56
fork

Configure Feed

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

rename

+1875 -208
-40
.github/workflows/test.yml
··· 1 - name: Test 2 - 3 - on: 4 - push: 5 - branches: [ main ] 6 - pull_request: 7 - branches: [ main ] 8 - 9 - jobs: 10 - test: 11 - runs-on: ubuntu-latest 12 - 13 - strategy: 14 - matrix: 15 - node-version: [18.x, 20.x] 16 - 17 - steps: 18 - - uses: actions/checkout@v3 19 - 20 - - name: Use Node.js ${{ matrix.node-version }} 21 - uses: actions/setup-node@v3 22 - with: 23 - node-version: ${{ matrix.node-version }} 24 - 25 - - name: Install dependencies 26 - run: npm ci 27 - 28 - - name: Build emitter 29 - run: npm run build -w @typelex/emitter 30 - 31 - - name: Run tests 32 - run: npm test -w @typelex/emitter 33 - 34 - - name: Test example project 35 - run: | 36 - cd typelex-example 37 - npm link @typelex/emitter 38 - npm run build 39 - # Verify output exists 40 - test -f lexicons/app/example/post.json
+1 -1
.husky/pre-commit
··· 2 2 . "$(dirname -- "$0")/_/husky.sh" 3 3 4 4 # Run tests before commit 5 - npm run test -w @typelex/emitter 5 + npm run test -w @typlex/emitter
-60
CONTRIBUTING.md
··· 1 - # Contributing to TypeLex 2 - 3 - Thank you for your interest in contributing to TypeLex! 4 - 5 - ## Development Setup 6 - 7 - 1. Fork and clone the repository 8 - 2. Install dependencies: 9 - ```bash 10 - npm install 11 - ``` 12 - 13 - 3. Build the emitter: 14 - ```bash 15 - cd typelex-emitter 16 - npm run build 17 - npm link 18 - ``` 19 - 20 - 4. Test your changes: 21 - ```bash 22 - cd ../typelex-example 23 - npm link @typelex/emitter 24 - npm run build 25 - ``` 26 - 27 - ## Project Structure 28 - 29 - - `typelex-emitter/` - The TypeSpec emitter implementation 30 - - `src/` - Source code 31 - - `test/` - Tests (needs work!) 32 - - `typelex-example/` - Example usage of TypeLex 33 - 34 - ## Making Changes 35 - 36 - 1. Create a feature branch 37 - 2. Make your changes 38 - 3. Test with the example project 39 - 4. Submit a pull request 40 - 41 - ## Areas for Contribution 42 - 43 - - [ ] Add support for XRPC queries and procedures 44 - - [ ] Add support for subscriptions 45 - - [ ] Implement union types 46 - - [ ] Add ATProto-specific decorators (@maxGraphemes, etc.) 47 - - [ ] Improve test coverage 48 - - [ ] Add more examples 49 - - [ ] Documentation improvements 50 - 51 - ## Code Style 52 - 53 - - Use TypeScript 54 - - Follow existing patterns in the codebase 55 - - Add comments for complex logic 56 - - Update tests when adding features 57 - 58 - ## Questions? 59 - 60 - Feel free to open an issue for discussion!
+1 -1
LICENSE
··· 1 1 MIT License 2 2 3 - Copyright (c) 2024 TypeLex Contributors 3 + Copyright (c) 2024 typlex Contributors 4 4 5 5 Permission is hereby granted, free of charge, to any person obtaining a copy 6 6 of this software and associated documentation files (the "Software"), to deal
+5 -5
README.md
··· 1 - # TypeLex 1 + # typlex 2 2 3 3 > TypeSpec-based IDL for ATProto Lexicons 4 4 5 - TypeLex allows you to define [ATProto](https://atproto.com) lexicons using [TypeSpec](https://typespec.io), providing type safety, better tooling, and a more ergonomic syntax compared to writing raw JSON. 5 + typlex allows you to define [ATProto](https://atproto.com) lexicons using [TypeSpec](https://typespec.io), providing type safety, better tooling, and a more ergonomic syntax compared to writing raw JSON. 6 6 7 7 ## Features 8 8 ··· 17 17 # Install TypeSpec compiler 18 18 npm install -g @typespec/compiler 19 19 20 - # Install TypeLex emitter 20 + # Install typlex emitter 21 21 npm install --save-dev @typelex/emitter 22 22 ``` 23 23 ··· 57 57 58 58 ## Output 59 59 60 - TypeLex generates standard ATProto lexicon files: 60 + typlex generates standard ATProto lexicon files: 61 61 62 62 ```json 63 63 { ··· 120 120 121 121 ## Current Status 122 122 123 - ⚠️ **Early Development** - TypeLex currently supports basic record types. Support for queries, procedures, and subscriptions is coming soon. 123 + ⚠️ **Early Development** - typlex currently supports basic record types. Support for queries, procedures, and subscriptions is coming soon. 124 124 125 125 ### Supported 126 126
+14 -4
packages/cli/tsconfig.json
··· 1 1 { 2 - "extends": "../../tsconfig.base.json", 3 2 "compilerOptions": { 4 - "outDir": "dist", 5 - "rootDir": "src" 3 + "target": "ES2022", 4 + "module": "NodeNext", 5 + "moduleResolution": "NodeNext", 6 + "rootDir": "./src", 7 + "outDir": "./dist", 8 + "strict": true, 9 + "esModuleInterop": true, 10 + "skipLibCheck": true, 11 + "forceConsistentCasingInFileNames": true, 12 + "declaration": true, 13 + "sourceMap": true, 14 + "resolveJsonModule": true 6 15 }, 7 - "include": ["src/**/*"] 16 + "include": ["src/**/*"], 17 + "exclude": ["node_modules", "dist"] 8 18 }
+4 -4
packages/emitter/README.md
··· 1 - # @typelex/emitter 1 + # @typlex/emitter 2 2 3 3 TypeSpec emitter for generating ATProto Lexicon definitions. 4 4 5 5 ## Installation 6 6 7 7 ```bash 8 - npm install @typelex/emitter 8 + npm install @typlex/emitter 9 9 ``` 10 10 11 11 ## Usage ··· 15 15 ```yaml 16 16 # tspconfig.yaml 17 17 emit: 18 - - "@typelex/emitter" 18 + - "@typlex/emitter" 19 19 options: 20 - "@typelex/emitter": 20 + "@typlex/emitter": 21 21 output-dir: "./lexicons" 22 22 ``` 23 23
+19 -3
packages/emitter/package.json
··· 1 1 { 2 - "name": "@typelex/emitter", 2 + "name": "@typlex/emitter", 3 3 "version": "0.1.0", 4 4 "description": "TypeSpec emitter for ATProto Lexicon definitions", 5 5 "main": "dist/index.js", 6 6 "type": "module", 7 + "exports": { 8 + ".": { 9 + "types": "./dist/index.d.ts", 10 + "default": "./dist/index.js" 11 + }, 12 + "./testing": { 13 + "types": "./dist/testing/index.d.ts", 14 + "default": "./dist/testing/index.js" 15 + } 16 + }, 17 + "tspMain": "lib/main.tsp", 7 18 "scripts": { 8 19 "build": "tsc", 9 20 "test": "npm run build && vitest run", ··· 12 23 "clean": "rm -rf dist", 13 24 "watch": "tsc --watch" 14 25 }, 15 - "keywords": ["typespec", "atproto", "lexicon", "bluesky"], 26 + "keywords": [ 27 + "typespec", 28 + "atproto", 29 + "lexicon", 30 + "bluesky" 31 + ], 16 32 "author": "", 17 33 "license": "MIT", 18 34 "dependencies": { ··· 33 49 "entrypoint": "./dist/index.js" 34 50 } 35 51 } 36 - } 52 + }
+68 -29
packages/emitter/src/emitter.ts
··· 24 24 LexiconUnion, 25 25 LexiconBlob, 26 26 } from "./types.js"; 27 - import { getLexFormat, getMaxGraphemes, getMinGraphemes, getLexKnownValues, isLexiconMain, getBlobAccept, getBlobMaxSize } from "./decorators.js"; 27 + import { 28 + getLexFormat, 29 + getMaxGraphemes, 30 + getMinGraphemes, 31 + getLexKnownValues, 32 + isLexiconMain, 33 + getBlobAccept, 34 + getBlobMaxSize, 35 + } from "./decorators.js"; 28 36 29 37 export interface EmitterOptions { 30 38 outputDir: string; 31 39 } 32 40 33 - export class TypeLexEmitter { 41 + export class TyplexEmitter { 34 42 private lexicons = new Map<string, LexiconDocument>(); 35 43 private currentLexiconId: string | null = null; 36 44 37 45 constructor( 38 46 private program: Program, 39 - private options: EmitterOptions 47 + private options: EmitterOptions, 40 48 ) {} 41 49 42 50 async emit() { 43 51 const globalNs = this.program.getGlobalNamespaceType(); 44 - 52 + 45 53 // Process all namespaces to find models and operations 46 54 this.processNamespace(globalNs); 47 - 55 + 48 56 // Write all lexicon files 49 57 for (const [id, lexicon] of this.lexicons) { 50 58 const filePath = this.getLexiconPath(id); ··· 63 71 const hasChildNamespaces = ns.namespaces.size > 0; 64 72 65 73 // Heuristic: if namespace has models but no operations and no child namespaces 66 - const shouldEmitLexicon = hasModels && !hasOperations && !hasChildNamespaces; 74 + const shouldEmitLexicon = 75 + hasModels && !hasOperations && !hasChildNamespaces; 67 76 68 77 if (shouldEmitLexicon) { 69 78 const models = [...ns.models.values()]; 70 - const standaloneModels = models.filter(m => isLexiconMain(this.program, m)); 71 - const mainModel = models.find(m => m.name === "Main"); 72 - const otherModels = models.filter(m => !isLexiconMain(this.program, m) && m.name !== "Main"); 79 + const standaloneModels = models.filter((m) => 80 + isLexiconMain(this.program, m), 81 + ); 82 + const mainModel = models.find((m) => m.name === "Main"); 83 + const otherModels = models.filter( 84 + (m) => !isLexiconMain(this.program, m) && m.name !== "Main", 85 + ); 73 86 74 87 // Case 1: Models marked with @lexiconMain -> standalone lexicon with ONLY main 75 88 for (const model of standaloneModels) { 76 - const lexiconId = fullName + "." + model.name.charAt(0).toLowerCase() + model.name.slice(1); 89 + const lexiconId = 90 + fullName + 91 + "." + 92 + model.name.charAt(0).toLowerCase() + 93 + model.name.slice(1); 77 94 this.currentLexiconId = lexiconId; 78 95 79 96 const modelDef = this.modelToLexiconObject(model, false); 80 - const description = getDoc(this.program, ns) || getDoc(this.program, model); 97 + const description = 98 + getDoc(this.program, ns) || getDoc(this.program, model); 81 99 82 100 const lexicon: LexiconDocument = { 83 101 lexicon: 1, 84 102 id: lexiconId, 85 103 defs: { 86 - main: modelDef 104 + main: modelDef, 87 105 }, 88 106 }; 89 107 ··· 108 126 lexicon: 1, 109 127 id: lexiconId, 110 128 defs: { 111 - main: mainDef 129 + main: mainDef, 112 130 }, 113 131 }; 114 132 ··· 119 137 120 138 // Add other models as defs 121 139 for (const model of otherModels) { 122 - const defName = model.name.charAt(0).toLowerCase() + model.name.slice(1); 140 + const defName = 141 + model.name.charAt(0).toLowerCase() + model.name.slice(1); 123 142 const modelDef = this.modelToLexiconObject(model); 124 143 lexicon.defs[defName] = modelDef; 125 144 } ··· 139 158 }; 140 159 141 160 for (const model of otherModels) { 142 - const defName = model.name.charAt(0).toLowerCase() + model.name.slice(1); 161 + const defName = 162 + model.name.charAt(0).toLowerCase() + model.name.slice(1); 143 163 const modelDef = this.modelToLexiconObject(model); 144 164 lexicon.defs[defName] = modelDef; 145 165 } ··· 159 179 }; 160 180 161 181 for (const [_, model] of ns.models) { 162 - const defName = model.name.charAt(0).toLowerCase() + model.name.slice(1); 182 + const defName = 183 + model.name.charAt(0).toLowerCase() + model.name.slice(1); 163 184 const modelDef = this.modelToLexiconObject(model); 164 185 lexicon.defs[defName] = modelDef; 165 186 } ··· 173 194 } 174 195 } 175 196 } 176 - 197 + 177 198 // Always recursively process child namespaces 178 199 for (const [_, childNs] of ns.namespaces) { 179 200 this.processNamespace(childNs); ··· 211 232 // Add the model as a definition 212 233 const defName = model.name.charAt(0).toLowerCase() + model.name.slice(1); 213 234 const modelDef = this.modelToLexiconObject(model); 214 - 235 + 215 236 // Check if this is a defs file (ends with .defs) 216 237 if (lexiconId.endsWith(".defs")) { 217 238 // For defs files, all models go directly into defs object ··· 225 246 if (Object.keys(lexicon.defs).length === 0) { 226 247 // Check if this is the lexicon schema special case 227 248 const key = lexiconId === "com.atproto.lexicon.schema" ? "nsid" : "tid"; 228 - 249 + 229 250 const recordDef: any = { 230 251 type: "record", 231 252 key: key, 232 253 record: modelDef, 233 254 }; 234 - 255 + 235 256 // Move description from record object to record def 236 257 const description = getDoc(this.program, model); 237 258 if (description) { 238 259 recordDef.description = description; 239 260 delete modelDef.description; 240 261 } 241 - 262 + 242 263 lexicon.defs.main = recordDef; 243 264 } else { 244 265 lexicon.defs[defName] = modelDef; ··· 246 267 } 247 268 } 248 269 249 - private modelToLexiconObject(model: Model, includeModelDescription: boolean = true): LexiconObject { 250 - const description = includeModelDescription ? getDoc(this.program, model) : undefined; 270 + private modelToLexiconObject( 271 + model: Model, 272 + includeModelDescription: boolean = true, 273 + ): LexiconObject { 274 + const description = includeModelDescription 275 + ? getDoc(this.program, model) 276 + : undefined; 251 277 const required: string[] = []; 252 278 const properties: any = {}; 253 279 ··· 280 306 return obj; 281 307 } 282 308 283 - private typeToLexiconDefinition(type: Type, prop?: ModelProperty): LexiconDefinition | null { 309 + private typeToLexiconDefinition( 310 + type: Type, 311 + prop?: ModelProperty, 312 + ): LexiconDefinition | null { 284 313 switch (type.kind) { 285 314 case "Boolean": { 286 315 // Handle boolean literal types (e.g., `true` or `false`) ··· 386 415 } 387 416 } 388 417 389 - private scalarToLexiconPrimitive(scalar: Scalar, prop?: ModelProperty): LexiconDefinition | null { 418 + private scalarToLexiconPrimitive( 419 + scalar: Scalar, 420 + prop?: ModelProperty, 421 + ): LexiconDefinition | null { 390 422 const primitive: LexiconPrimitive = { 391 423 type: "string", // default 392 424 }; ··· 483 515 private getModelReference(model: Model): string | null { 484 516 // If the model is in the same namespace, use local ref (#modelName) 485 517 // Otherwise use fully qualified ref (namespace.modelName) 486 - if (!model.namespace || model.namespace.name === "" || model.namespace.name === "TypeSpec") { 518 + if ( 519 + !model.namespace || 520 + model.namespace.name === "" || 521 + model.namespace.name === "TypeSpec" 522 + ) { 487 523 return null; 488 524 } 489 525 ··· 512 548 return `${namespaceName}.defs#${defName}`; 513 549 } 514 550 515 - private modelToLexiconArray(model: Model, prop?: ModelProperty): LexiconArray | null { 551 + private modelToLexiconArray( 552 + model: Model, 553 + prop?: ModelProperty, 554 + ): LexiconArray | null { 516 555 // Handle TypeSpec array types 517 556 if (model.templateMapper?.args && model.templateMapper.args.length > 0) { 518 557 const itemType = model.templateMapper.args[0]; ··· 567 606 const parts = lexiconId.split("."); 568 607 const fileName = parts[parts.length - 1] + ".json"; 569 608 const dirs = parts.slice(0, -1); 570 - 609 + 571 610 return join(this.options.outputDir, ...dirs, fileName); 572 611 } 573 612 ··· 576 615 await this.program.host.mkdirp(dir); 577 616 await this.program.host.writeFile(filePath, content); 578 617 } 579 - } 618 + }
+13 -5
packages/emitter/src/index.ts
··· 1 1 import type { EmitContext } from "@typespec/compiler"; 2 - import { TypeLexEmitter } from "./emitter.js"; 2 + import { TyplexEmitter } from "./emitter.js"; 3 3 4 - export interface TypeLexEmitterOptions { 4 + export interface TyplexEmitterOptions { 5 5 "output-dir"?: string; 6 6 } 7 7 8 - export async function $onEmit(context: EmitContext<TypeLexEmitterOptions>) { 9 - const emitter = new TypeLexEmitter(context.program, { 8 + export async function $onEmit(context: EmitContext<TyplexEmitterOptions>) { 9 + const emitter = new TyplexEmitter(context.program, { 10 10 outputDir: context.emitterOutputDir, 11 11 }); 12 12 ··· 14 14 } 15 15 16 16 // Export decorators 17 - export { $lexFormat, $maxGraphemes, $minGraphemes, $lexKnownValues, $lexiconMain, $blobAccept, $blobMaxSize } from "./decorators.js"; 17 + export { 18 + $lexFormat, 19 + $maxGraphemes, 20 + $minGraphemes, 21 + $lexKnownValues, 22 + $lexiconMain, 23 + $blobAccept, 24 + $blobMaxSize, 25 + } from "./decorators.js";
+31 -14
packages/emitter/test/scenarios.test.ts
··· 1 1 import assert from "assert"; 2 2 import path from "path"; 3 3 import { describe, it } from "vitest"; 4 - import { formatDiagnostic, resolvePath, type Diagnostic } from "@typespec/compiler"; 4 + import { 5 + formatDiagnostic, 6 + resolvePath, 7 + type Diagnostic, 8 + } from "@typespec/compiler"; 5 9 import { 6 10 TypeSpecTestLibrary, 7 11 createTestHost, ··· 14 18 const pkgRoot = await findTestPackageRoot(import.meta.url); 15 19 const SCENARIOS_DIRECTORY = resolvePath(pkgRoot, "test/scenarios"); 16 20 17 - const TypeLexTestLibrary: TypeSpecTestLibrary = { 18 - name: "@typelex/emitter", 21 + const TyplexTestLibrary: TypeSpecTestLibrary = { 22 + name: "@typlex/emitter", 19 23 packageRoot: await findTestPackageRoot(import.meta.url), 20 24 files: [ 21 - { realDir: "", pattern: "package.json", virtualPath: "./node_modules/@typelex/emitter" }, 25 + { 26 + realDir: "", 27 + pattern: "package.json", 28 + virtualPath: "./node_modules/@typlex/emitter", 29 + }, 22 30 { 23 31 realDir: "dist", 24 32 pattern: "*.js", 25 - virtualPath: "./node_modules/@typelex/emitter/dist", 33 + virtualPath: "./node_modules/@typlex/emitter/dist", 34 + }, 35 + { 36 + realDir: "lib/", 37 + pattern: "*.tsp", 38 + virtualPath: "./node_modules/@typlex/emitter/lib", 26 39 }, 27 - { realDir: "lib/", pattern: "*.tsp", virtualPath: "./node_modules/@typelex/emitter/lib" }, 28 40 ], 29 41 }; 30 42 ··· 82 94 return formatted; 83 95 }); 84 96 85 - assert.fail(`Expected no diagnostics but got:\n${formattedDiagnostics.join("\n\n")}`); 97 + assert.fail( 98 + `Expected no diagnostics but got:\n${formattedDiagnostics.join("\n\n")}`, 99 + ); 86 100 } 87 101 88 102 assertFilesAsExpected(emitResult.files, expectedFiles); ··· 100 114 const baseOutputPath = resolveVirtualPath("test-output/"); 101 115 102 116 const host = await createTestHost({ 103 - libraries: [TypeLexTestLibrary], 117 + libraries: [TyplexTestLibrary], 104 118 }); 105 119 106 120 for (const [fileName, content] of Object.entries(files)) { ··· 110 124 const [, diagnostics] = await host.compileAndDiagnose("main.tsp", { 111 125 outputDir: baseOutputPath, 112 126 noEmit: false, 113 - emit: ["@typelex/emitter"], 127 + emit: ["@typlex/emitter"], 114 128 }); 115 129 116 130 const outputFiles = Object.fromEntries( ··· 118 132 .filter(([name]) => name.startsWith(baseOutputPath)) 119 133 .map(([name, value]) => { 120 134 let relativePath = name.replace(baseOutputPath, ""); 121 - // Strip the @typelex/emitter/ prefix if present 122 - if (relativePath.startsWith("@typelex/emitter/")) { 123 - relativePath = relativePath.replace("@typelex/emitter/", ""); 135 + // Strip the @typlex/emitter/ prefix if present 136 + if (relativePath.startsWith("@typlex/emitter/")) { 137 + relativePath = relativePath.replace("@typlex/emitter/", ""); 124 138 } 125 139 return [relativePath, value]; 126 140 }), ··· 147 161 for (const [fn, content] of Object.entries(outputFiles)) { 148 162 const expectedContent = expectedFiles[fn]; 149 163 150 - assert.ok(expectedContent, `output file ${fn} has no corresponding expectation`); 164 + assert.ok( 165 + expectedContent, 166 + `output file ${fn} has no corresponding expectation`, 167 + ); 151 168 152 169 // For JSON files, compare parsed objects instead of strings 153 - if (fn.endsWith('.json')) { 170 + if (fn.endsWith(".json")) { 154 171 const parsed = JSON.parse(content); 155 172 const expected = JSON.parse(expectedContent); 156 173 assert.deepStrictEqual(parsed, expected);
+1 -1
packages/emitter/test/scenarios/app-bsky-embed-external/input/main.tsp
··· 13 13 title: string; 14 14 description: string; 15 15 16 - @blobAccept(["image/*"]) 16 + @blobAccept(#["image/*"]) 17 17 @blobMaxSize(1000000) 18 18 thumb?: bytes; 19 19 }
+1 -1
packages/emitter/test/scenarios/app-bsky-embed-images/input/main.tsp
··· 19 19 } 20 20 21 21 model Image { 22 - @blobAccept(["image/*"]) 22 + @blobAccept(#["image/*"]) 23 23 @blobMaxSize(1000000) 24 24 image: bytes; 25 25
+8 -4
packages/emitter/test/unit.test.ts
··· 1 1 import { describe, it, expect } from "vitest"; 2 - import type { LexiconDocument, LexiconObject, LexiconPrimitive } from "../src/types.js"; 2 + import type { 3 + LexiconDocument, 4 + LexiconObject, 5 + LexiconPrimitive, 6 + } from "../src/types.js"; 3 7 4 - describe("TypeLex Types", () => { 8 + describe("typlex Types", () => { 5 9 it("should create a valid lexicon document", () => { 6 10 const lexicon: LexiconDocument = { 7 11 lexicon: 1, ··· 42 46 { type: "string", format: "handle" }, 43 47 ]; 44 48 45 - primitives.forEach(p => { 49 + primitives.forEach((p) => { 46 50 expect(["string", "boolean", "integer", "number"]).toContain(p.type); 47 51 }); 48 52 }); 49 - }); 53 + });
+23
packages/example/@typlex/emitter/com/example/simple/post.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.example.simple.post", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "text", 9 + "createdAt" 10 + ], 11 + "properties": { 12 + "text": { 13 + "type": "string" 14 + }, 15 + "createdAt": { 16 + "type": "string", 17 + "format": "datetime" 18 + } 19 + } 20 + } 21 + }, 22 + "description": "A simple post record" 23 + }
-32
packages/example/README.md
··· 1 - # TypeLex Example 2 - 3 - Example project showing how to use TypeLex to define ATProto lexicons using TypeSpec. 4 - 5 - ## Setup 6 - 7 - 1. Install dependencies: 8 - ```bash 9 - npm install 10 - ``` 11 - 12 - 2. Link the TypeLex emitter (if testing locally): 13 - ```bash 14 - npm link @typelex/emitter 15 - ``` 16 - 17 - ## Building Lexicons 18 - 19 - To generate ATProto lexicon JSON files from the TypeSpec definitions: 20 - 21 - ```bash 22 - npm run build 23 - ``` 24 - 25 - The generated lexicons will be in `lexicons/`. 26 - 27 - ## Project Structure 28 - 29 - - `main.tsp` - TypeSpec definitions for social app lexicons 30 - - `tspconfig.yaml` - TypeSpec configuration 31 - - `tsp-output/` - Generated output (git-ignored) 32 - - `@typelex/emitter/lexicons/` - ATProto lexicon JSON files
packages/example/main.tsp packages/example/typlex/main.tsp
+3 -3
packages/example/tspconfig.yaml
··· 1 1 emit: 2 - - "@typelex/emitter" 2 + - "@typlex/emitter" 3 3 options: 4 - "@typelex/emitter": 5 - output-dir: "./lexicons" 4 + "@typlex/emitter": 5 + output-dir: "./lexicons"
+1683 -1
pnpm-lock.yaml
··· 6 6 7 7 importers: 8 8 9 - .: {} 9 + .: 10 + devDependencies: 11 + typescript: 12 + specifier: ^5.0.0 13 + version: 5.9.3 14 + 15 + packages/cli: 16 + dependencies: 17 + '@typespec/compiler': 18 + specifier: ^0.64.0 19 + version: 0.64.0 20 + '@typlex/emitter': 21 + specifier: workspace:* 22 + version: link:../emitter 23 + devDependencies: 24 + '@types/node': 25 + specifier: ^20.0.0 26 + version: 20.19.19 27 + typescript: 28 + specifier: ^5.0.0 29 + version: 5.9.3 30 + 31 + packages/emitter: 32 + dependencies: 33 + '@typespec/compiler': 34 + specifier: ^0.64.0 35 + version: 0.64.0 36 + devDependencies: 37 + '@types/node': 38 + specifier: ^20.0.0 39 + version: 20.19.19 40 + '@typespec/http': 41 + specifier: ^0.64.0 42 + version: 0.64.0(@typespec/compiler@0.64.0) 43 + '@typespec/openapi': 44 + specifier: ^0.64.0 45 + version: 0.64.0(@typespec/compiler@0.64.0)(@typespec/http@0.64.0(@typespec/compiler@0.64.0)) 46 + typescript: 47 + specifier: ^5.0.0 48 + version: 5.9.3 49 + vitest: 50 + specifier: ^1.0.0 51 + version: 1.6.1(@types/node@20.19.19) 52 + 53 + packages/example: 54 + dependencies: 55 + '@typespec/compiler': 56 + specifier: ^0.64.0 57 + version: 0.64.0 58 + '@typlex/cli': 59 + specifier: workspace:* 60 + version: link:../cli 61 + '@typlex/emitter': 62 + specifier: workspace:* 63 + version: link:../emitter 64 + devDependencies: 65 + typescript: 66 + specifier: ^5.0.0 67 + version: 5.9.3 68 + 69 + packages: 70 + 71 + '@babel/code-frame@7.25.9': 72 + resolution: {integrity: sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==} 73 + engines: {node: '>=6.9.0'} 74 + 75 + '@babel/helper-validator-identifier@7.27.1': 76 + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 77 + engines: {node: '>=6.9.0'} 78 + 79 + '@babel/highlight@7.25.9': 80 + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} 81 + engines: {node: '>=6.9.0'} 82 + 83 + '@esbuild/aix-ppc64@0.21.5': 84 + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 85 + engines: {node: '>=12'} 86 + cpu: [ppc64] 87 + os: [aix] 88 + 89 + '@esbuild/android-arm64@0.21.5': 90 + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 91 + engines: {node: '>=12'} 92 + cpu: [arm64] 93 + os: [android] 94 + 95 + '@esbuild/android-arm@0.21.5': 96 + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 97 + engines: {node: '>=12'} 98 + cpu: [arm] 99 + os: [android] 100 + 101 + '@esbuild/android-x64@0.21.5': 102 + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 103 + engines: {node: '>=12'} 104 + cpu: [x64] 105 + os: [android] 106 + 107 + '@esbuild/darwin-arm64@0.21.5': 108 + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 109 + engines: {node: '>=12'} 110 + cpu: [arm64] 111 + os: [darwin] 112 + 113 + '@esbuild/darwin-x64@0.21.5': 114 + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 115 + engines: {node: '>=12'} 116 + cpu: [x64] 117 + os: [darwin] 118 + 119 + '@esbuild/freebsd-arm64@0.21.5': 120 + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 121 + engines: {node: '>=12'} 122 + cpu: [arm64] 123 + os: [freebsd] 124 + 125 + '@esbuild/freebsd-x64@0.21.5': 126 + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 127 + engines: {node: '>=12'} 128 + cpu: [x64] 129 + os: [freebsd] 130 + 131 + '@esbuild/linux-arm64@0.21.5': 132 + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 133 + engines: {node: '>=12'} 134 + cpu: [arm64] 135 + os: [linux] 136 + 137 + '@esbuild/linux-arm@0.21.5': 138 + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 139 + engines: {node: '>=12'} 140 + cpu: [arm] 141 + os: [linux] 142 + 143 + '@esbuild/linux-ia32@0.21.5': 144 + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 145 + engines: {node: '>=12'} 146 + cpu: [ia32] 147 + os: [linux] 148 + 149 + '@esbuild/linux-loong64@0.21.5': 150 + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 151 + engines: {node: '>=12'} 152 + cpu: [loong64] 153 + os: [linux] 154 + 155 + '@esbuild/linux-mips64el@0.21.5': 156 + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 157 + engines: {node: '>=12'} 158 + cpu: [mips64el] 159 + os: [linux] 160 + 161 + '@esbuild/linux-ppc64@0.21.5': 162 + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 163 + engines: {node: '>=12'} 164 + cpu: [ppc64] 165 + os: [linux] 166 + 167 + '@esbuild/linux-riscv64@0.21.5': 168 + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 169 + engines: {node: '>=12'} 170 + cpu: [riscv64] 171 + os: [linux] 172 + 173 + '@esbuild/linux-s390x@0.21.5': 174 + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 175 + engines: {node: '>=12'} 176 + cpu: [s390x] 177 + os: [linux] 178 + 179 + '@esbuild/linux-x64@0.21.5': 180 + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 181 + engines: {node: '>=12'} 182 + cpu: [x64] 183 + os: [linux] 184 + 185 + '@esbuild/netbsd-x64@0.21.5': 186 + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 187 + engines: {node: '>=12'} 188 + cpu: [x64] 189 + os: [netbsd] 190 + 191 + '@esbuild/openbsd-x64@0.21.5': 192 + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 193 + engines: {node: '>=12'} 194 + cpu: [x64] 195 + os: [openbsd] 196 + 197 + '@esbuild/sunos-x64@0.21.5': 198 + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 199 + engines: {node: '>=12'} 200 + cpu: [x64] 201 + os: [sunos] 202 + 203 + '@esbuild/win32-arm64@0.21.5': 204 + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 205 + engines: {node: '>=12'} 206 + cpu: [arm64] 207 + os: [win32] 208 + 209 + '@esbuild/win32-ia32@0.21.5': 210 + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 211 + engines: {node: '>=12'} 212 + cpu: [ia32] 213 + os: [win32] 214 + 215 + '@esbuild/win32-x64@0.21.5': 216 + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 217 + engines: {node: '>=12'} 218 + cpu: [x64] 219 + os: [win32] 220 + 221 + '@jest/schemas@29.6.3': 222 + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 223 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 224 + 225 + '@jridgewell/sourcemap-codec@1.5.5': 226 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 227 + 228 + '@nodelib/fs.scandir@2.1.5': 229 + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 230 + engines: {node: '>= 8'} 231 + 232 + '@nodelib/fs.stat@2.0.5': 233 + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 234 + engines: {node: '>= 8'} 235 + 236 + '@nodelib/fs.walk@1.2.8': 237 + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 238 + engines: {node: '>= 8'} 239 + 240 + '@rollup/rollup-android-arm-eabi@4.52.4': 241 + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} 242 + cpu: [arm] 243 + os: [android] 244 + 245 + '@rollup/rollup-android-arm64@4.52.4': 246 + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} 247 + cpu: [arm64] 248 + os: [android] 249 + 250 + '@rollup/rollup-darwin-arm64@4.52.4': 251 + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} 252 + cpu: [arm64] 253 + os: [darwin] 254 + 255 + '@rollup/rollup-darwin-x64@4.52.4': 256 + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} 257 + cpu: [x64] 258 + os: [darwin] 259 + 260 + '@rollup/rollup-freebsd-arm64@4.52.4': 261 + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} 262 + cpu: [arm64] 263 + os: [freebsd] 264 + 265 + '@rollup/rollup-freebsd-x64@4.52.4': 266 + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} 267 + cpu: [x64] 268 + os: [freebsd] 269 + 270 + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': 271 + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} 272 + cpu: [arm] 273 + os: [linux] 274 + 275 + '@rollup/rollup-linux-arm-musleabihf@4.52.4': 276 + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} 277 + cpu: [arm] 278 + os: [linux] 279 + 280 + '@rollup/rollup-linux-arm64-gnu@4.52.4': 281 + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} 282 + cpu: [arm64] 283 + os: [linux] 284 + 285 + '@rollup/rollup-linux-arm64-musl@4.52.4': 286 + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} 287 + cpu: [arm64] 288 + os: [linux] 289 + 290 + '@rollup/rollup-linux-loong64-gnu@4.52.4': 291 + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} 292 + cpu: [loong64] 293 + os: [linux] 294 + 295 + '@rollup/rollup-linux-ppc64-gnu@4.52.4': 296 + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} 297 + cpu: [ppc64] 298 + os: [linux] 299 + 300 + '@rollup/rollup-linux-riscv64-gnu@4.52.4': 301 + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} 302 + cpu: [riscv64] 303 + os: [linux] 304 + 305 + '@rollup/rollup-linux-riscv64-musl@4.52.4': 306 + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} 307 + cpu: [riscv64] 308 + os: [linux] 309 + 310 + '@rollup/rollup-linux-s390x-gnu@4.52.4': 311 + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} 312 + cpu: [s390x] 313 + os: [linux] 314 + 315 + '@rollup/rollup-linux-x64-gnu@4.52.4': 316 + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} 317 + cpu: [x64] 318 + os: [linux] 319 + 320 + '@rollup/rollup-linux-x64-musl@4.52.4': 321 + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} 322 + cpu: [x64] 323 + os: [linux] 324 + 325 + '@rollup/rollup-openharmony-arm64@4.52.4': 326 + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} 327 + cpu: [arm64] 328 + os: [openharmony] 329 + 330 + '@rollup/rollup-win32-arm64-msvc@4.52.4': 331 + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} 332 + cpu: [arm64] 333 + os: [win32] 334 + 335 + '@rollup/rollup-win32-ia32-msvc@4.52.4': 336 + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} 337 + cpu: [ia32] 338 + os: [win32] 339 + 340 + '@rollup/rollup-win32-x64-gnu@4.52.4': 341 + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} 342 + cpu: [x64] 343 + os: [win32] 344 + 345 + '@rollup/rollup-win32-x64-msvc@4.52.4': 346 + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} 347 + cpu: [x64] 348 + os: [win32] 349 + 350 + '@sinclair/typebox@0.27.8': 351 + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 352 + 353 + '@sindresorhus/merge-streams@2.3.0': 354 + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} 355 + engines: {node: '>=18'} 356 + 357 + '@types/estree@1.0.8': 358 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 359 + 360 + '@types/node@20.19.19': 361 + resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} 362 + 363 + '@typespec/compiler@0.64.0': 364 + resolution: {integrity: sha512-LnQGlQMWyqvhGg4Z9iyr5qSBTjI9zd49sodbEJbLafrxbj9pbHyjfSFbvt60gVbfuNvLErsdXvZiqqXV5nZdmQ==} 365 + engines: {node: '>=18.0.0'} 366 + hasBin: true 367 + 368 + '@typespec/http@0.64.0': 369 + resolution: {integrity: sha512-vyyZP3Woo7or/2Oiq1fH+R0X/4WOBDjAlGsb9tLQzswfQHp710kNfiecA10y9gDC/9h+PjKsTElS1RcRRanpwA==} 370 + engines: {node: '>=18.0.0'} 371 + peerDependencies: 372 + '@typespec/compiler': ~0.64.0 373 + '@typespec/streams': ~0.64.0 374 + peerDependenciesMeta: 375 + '@typespec/streams': 376 + optional: true 377 + 378 + '@typespec/openapi@0.64.0': 379 + resolution: {integrity: sha512-C4sPdj86ejsNkpmEaAMMqQR+0kq4Ayp4sPKvj4OTtawLXacXKzZ9NYng2jrguO6WbLr5f3NyRZKi7Ys2suT27A==} 380 + engines: {node: '>=18.0.0'} 381 + peerDependencies: 382 + '@typespec/compiler': ~0.64.0 383 + '@typespec/http': ~0.64.0 384 + 385 + '@vitest/expect@1.6.1': 386 + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} 387 + 388 + '@vitest/runner@1.6.1': 389 + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} 390 + 391 + '@vitest/snapshot@1.6.1': 392 + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} 393 + 394 + '@vitest/spy@1.6.1': 395 + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} 396 + 397 + '@vitest/utils@1.6.1': 398 + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} 399 + 400 + acorn-walk@8.3.4: 401 + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 402 + engines: {node: '>=0.4.0'} 403 + 404 + acorn@8.15.0: 405 + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 406 + engines: {node: '>=0.4.0'} 407 + hasBin: true 408 + 409 + ajv@8.17.1: 410 + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 411 + 412 + ansi-regex@5.0.1: 413 + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 414 + engines: {node: '>=8'} 415 + 416 + ansi-styles@3.2.1: 417 + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 418 + engines: {node: '>=4'} 419 + 420 + ansi-styles@4.3.0: 421 + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 422 + engines: {node: '>=8'} 423 + 424 + ansi-styles@5.2.0: 425 + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 426 + engines: {node: '>=10'} 427 + 428 + assertion-error@1.1.0: 429 + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 430 + 431 + braces@3.0.3: 432 + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 433 + engines: {node: '>=8'} 434 + 435 + cac@6.7.14: 436 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 437 + engines: {node: '>=8'} 438 + 439 + chai@4.5.0: 440 + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} 441 + engines: {node: '>=4'} 442 + 443 + chalk@2.4.2: 444 + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 445 + engines: {node: '>=4'} 446 + 447 + change-case@5.4.4: 448 + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} 449 + 450 + check-error@1.0.3: 451 + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} 452 + 453 + cliui@8.0.1: 454 + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 455 + engines: {node: '>=12'} 456 + 457 + color-convert@1.9.3: 458 + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 459 + 460 + color-convert@2.0.1: 461 + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 462 + engines: {node: '>=7.0.0'} 463 + 464 + color-name@1.1.3: 465 + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 466 + 467 + color-name@1.1.4: 468 + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 469 + 470 + confbox@0.1.8: 471 + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 472 + 473 + cross-spawn@7.0.6: 474 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 475 + engines: {node: '>= 8'} 476 + 477 + debug@4.4.3: 478 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 479 + engines: {node: '>=6.0'} 480 + peerDependencies: 481 + supports-color: '*' 482 + peerDependenciesMeta: 483 + supports-color: 484 + optional: true 485 + 486 + deep-eql@4.1.4: 487 + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} 488 + engines: {node: '>=6'} 489 + 490 + diff-sequences@29.6.3: 491 + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 492 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 493 + 494 + emoji-regex@8.0.0: 495 + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 496 + 497 + esbuild@0.21.5: 498 + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 499 + engines: {node: '>=12'} 500 + hasBin: true 501 + 502 + escalade@3.2.0: 503 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 504 + engines: {node: '>=6'} 505 + 506 + escape-string-regexp@1.0.5: 507 + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 508 + engines: {node: '>=0.8.0'} 509 + 510 + estree-walker@3.0.3: 511 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 512 + 513 + execa@8.0.1: 514 + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 515 + engines: {node: '>=16.17'} 516 + 517 + fast-deep-equal@3.1.3: 518 + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 519 + 520 + fast-glob@3.3.3: 521 + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 522 + engines: {node: '>=8.6.0'} 523 + 524 + fast-uri@3.1.0: 525 + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} 526 + 527 + fastq@1.19.1: 528 + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 529 + 530 + fill-range@7.1.1: 531 + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 532 + engines: {node: '>=8'} 533 + 534 + fsevents@2.3.3: 535 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 536 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 537 + os: [darwin] 538 + 539 + get-caller-file@2.0.5: 540 + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 541 + engines: {node: 6.* || 8.* || >= 10.*} 542 + 543 + get-func-name@2.0.2: 544 + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 545 + 546 + get-stream@8.0.1: 547 + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 548 + engines: {node: '>=16'} 549 + 550 + glob-parent@5.1.2: 551 + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 552 + engines: {node: '>= 6'} 553 + 554 + globby@14.0.2: 555 + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} 556 + engines: {node: '>=18'} 557 + 558 + has-flag@3.0.0: 559 + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 560 + engines: {node: '>=4'} 561 + 562 + human-signals@5.0.0: 563 + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 564 + engines: {node: '>=16.17.0'} 565 + 566 + ignore@5.3.2: 567 + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 568 + engines: {node: '>= 4'} 569 + 570 + is-extglob@2.1.1: 571 + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 572 + engines: {node: '>=0.10.0'} 573 + 574 + is-fullwidth-code-point@3.0.0: 575 + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 576 + engines: {node: '>=8'} 577 + 578 + is-glob@4.0.3: 579 + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 580 + engines: {node: '>=0.10.0'} 581 + 582 + is-number@7.0.0: 583 + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 584 + engines: {node: '>=0.12.0'} 585 + 586 + is-stream@3.0.0: 587 + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 588 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 589 + 590 + isexe@2.0.0: 591 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 592 + 593 + js-tokens@4.0.0: 594 + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 595 + 596 + js-tokens@9.0.1: 597 + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 598 + 599 + json-schema-traverse@1.0.0: 600 + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 601 + 602 + kleur@3.0.3: 603 + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 604 + engines: {node: '>=6'} 605 + 606 + local-pkg@0.5.1: 607 + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} 608 + engines: {node: '>=14'} 609 + 610 + loupe@2.3.7: 611 + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} 612 + 613 + magic-string@0.30.19: 614 + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} 615 + 616 + merge-stream@2.0.0: 617 + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 618 + 619 + merge2@1.4.1: 620 + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 621 + engines: {node: '>= 8'} 622 + 623 + micromatch@4.0.8: 624 + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 625 + engines: {node: '>=8.6'} 626 + 627 + mimic-fn@4.0.0: 628 + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 629 + engines: {node: '>=12'} 630 + 631 + mlly@1.8.0: 632 + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 633 + 634 + ms@2.1.3: 635 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 636 + 637 + mustache@4.2.0: 638 + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} 639 + hasBin: true 640 + 641 + nanoid@3.3.11: 642 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 643 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 644 + hasBin: true 645 + 646 + npm-run-path@5.3.0: 647 + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 648 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 649 + 650 + onetime@6.0.0: 651 + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 652 + engines: {node: '>=12'} 653 + 654 + p-limit@5.0.0: 655 + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} 656 + engines: {node: '>=18'} 657 + 658 + path-key@3.1.1: 659 + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 660 + engines: {node: '>=8'} 661 + 662 + path-key@4.0.0: 663 + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 664 + engines: {node: '>=12'} 665 + 666 + path-type@5.0.0: 667 + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} 668 + engines: {node: '>=12'} 669 + 670 + pathe@1.1.2: 671 + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 672 + 673 + pathe@2.0.3: 674 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 675 + 676 + pathval@1.1.1: 677 + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 678 + 679 + picocolors@1.1.1: 680 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 681 + 682 + picomatch@2.3.1: 683 + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 684 + engines: {node: '>=8.6'} 685 + 686 + pkg-types@1.3.1: 687 + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 688 + 689 + postcss@8.5.6: 690 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 691 + engines: {node: ^10 || ^12 || >=14} 692 + 693 + prettier@3.3.3: 694 + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 695 + engines: {node: '>=14'} 696 + hasBin: true 697 + 698 + pretty-format@29.7.0: 699 + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 700 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 701 + 702 + prompts@2.4.2: 703 + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 704 + engines: {node: '>= 6'} 705 + 706 + queue-microtask@1.2.3: 707 + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 708 + 709 + react-is@18.3.1: 710 + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 711 + 712 + require-directory@2.1.1: 713 + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 714 + engines: {node: '>=0.10.0'} 715 + 716 + require-from-string@2.0.2: 717 + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 718 + engines: {node: '>=0.10.0'} 719 + 720 + reusify@1.1.0: 721 + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 722 + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 723 + 724 + rollup@4.52.4: 725 + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} 726 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 727 + hasBin: true 728 + 729 + run-parallel@1.2.0: 730 + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 731 + 732 + semver@7.7.2: 733 + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 734 + engines: {node: '>=10'} 735 + hasBin: true 736 + 737 + shebang-command@2.0.0: 738 + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 739 + engines: {node: '>=8'} 740 + 741 + shebang-regex@3.0.0: 742 + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 743 + engines: {node: '>=8'} 744 + 745 + siginfo@2.0.0: 746 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 747 + 748 + signal-exit@4.1.0: 749 + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 750 + engines: {node: '>=14'} 751 + 752 + sisteransi@1.0.5: 753 + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 754 + 755 + slash@5.1.0: 756 + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} 757 + engines: {node: '>=14.16'} 758 + 759 + source-map-js@1.2.1: 760 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 761 + engines: {node: '>=0.10.0'} 762 + 763 + stackback@0.0.2: 764 + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 765 + 766 + std-env@3.9.0: 767 + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 768 + 769 + string-width@4.2.3: 770 + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 771 + engines: {node: '>=8'} 772 + 773 + strip-ansi@6.0.1: 774 + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 775 + engines: {node: '>=8'} 776 + 777 + strip-final-newline@3.0.0: 778 + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 779 + engines: {node: '>=12'} 780 + 781 + strip-literal@2.1.1: 782 + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} 783 + 784 + supports-color@5.5.0: 785 + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 786 + engines: {node: '>=4'} 787 + 788 + temporal-polyfill@0.2.5: 789 + resolution: {integrity: sha512-ye47xp8Cb0nDguAhrrDS1JT1SzwEV9e26sSsrWzVu+yPZ7LzceEcH0i2gci9jWfOfSCCgM3Qv5nOYShVUUFUXA==} 790 + 791 + temporal-spec@0.2.4: 792 + resolution: {integrity: sha512-lDMFv4nKQrSjlkHKAlHVqKrBG4DyFfa9F74cmBZ3Iy3ed8yvWnlWSIdi4IKfSqwmazAohBNwiN64qGx4y5Q3IQ==} 793 + 794 + tinybench@2.9.0: 795 + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 796 + 797 + tinypool@0.8.4: 798 + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} 799 + engines: {node: '>=14.0.0'} 800 + 801 + tinyspy@2.2.1: 802 + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} 803 + engines: {node: '>=14.0.0'} 804 + 805 + to-regex-range@5.0.1: 806 + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 807 + engines: {node: '>=8.0'} 808 + 809 + type-detect@4.1.0: 810 + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} 811 + engines: {node: '>=4'} 812 + 813 + typescript@5.9.3: 814 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 815 + engines: {node: '>=14.17'} 816 + hasBin: true 817 + 818 + ufo@1.6.1: 819 + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 820 + 821 + undici-types@6.21.0: 822 + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 823 + 824 + unicorn-magic@0.1.0: 825 + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} 826 + engines: {node: '>=18'} 827 + 828 + vite-node@1.6.1: 829 + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} 830 + engines: {node: ^18.0.0 || >=20.0.0} 831 + hasBin: true 832 + 833 + vite@5.4.20: 834 + resolution: {integrity: sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==} 835 + engines: {node: ^18.0.0 || >=20.0.0} 836 + hasBin: true 837 + peerDependencies: 838 + '@types/node': ^18.0.0 || >=20.0.0 839 + less: '*' 840 + lightningcss: ^1.21.0 841 + sass: '*' 842 + sass-embedded: '*' 843 + stylus: '*' 844 + sugarss: '*' 845 + terser: ^5.4.0 846 + peerDependenciesMeta: 847 + '@types/node': 848 + optional: true 849 + less: 850 + optional: true 851 + lightningcss: 852 + optional: true 853 + sass: 854 + optional: true 855 + sass-embedded: 856 + optional: true 857 + stylus: 858 + optional: true 859 + sugarss: 860 + optional: true 861 + terser: 862 + optional: true 863 + 864 + vitest@1.6.1: 865 + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} 866 + engines: {node: ^18.0.0 || >=20.0.0} 867 + hasBin: true 868 + peerDependencies: 869 + '@edge-runtime/vm': '*' 870 + '@types/node': ^18.0.0 || >=20.0.0 871 + '@vitest/browser': 1.6.1 872 + '@vitest/ui': 1.6.1 873 + happy-dom: '*' 874 + jsdom: '*' 875 + peerDependenciesMeta: 876 + '@edge-runtime/vm': 877 + optional: true 878 + '@types/node': 879 + optional: true 880 + '@vitest/browser': 881 + optional: true 882 + '@vitest/ui': 883 + optional: true 884 + happy-dom: 885 + optional: true 886 + jsdom: 887 + optional: true 888 + 889 + vscode-jsonrpc@8.2.0: 890 + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} 891 + engines: {node: '>=14.0.0'} 892 + 893 + vscode-languageserver-protocol@3.17.5: 894 + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} 895 + 896 + vscode-languageserver-textdocument@1.0.12: 897 + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} 898 + 899 + vscode-languageserver-types@3.17.5: 900 + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} 901 + 902 + vscode-languageserver@9.0.1: 903 + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} 904 + hasBin: true 905 + 906 + which@2.0.2: 907 + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 908 + engines: {node: '>= 8'} 909 + hasBin: true 910 + 911 + why-is-node-running@2.3.0: 912 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 913 + engines: {node: '>=8'} 914 + hasBin: true 915 + 916 + wrap-ansi@7.0.0: 917 + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 918 + engines: {node: '>=10'} 919 + 920 + y18n@5.0.8: 921 + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 922 + engines: {node: '>=10'} 923 + 924 + yaml@2.5.1: 925 + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} 926 + engines: {node: '>= 14'} 927 + hasBin: true 928 + 929 + yargs-parser@21.1.1: 930 + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 931 + engines: {node: '>=12'} 932 + 933 + yargs@17.7.2: 934 + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 935 + engines: {node: '>=12'} 936 + 937 + yocto-queue@1.2.1: 938 + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} 939 + engines: {node: '>=12.20'} 940 + 941 + snapshots: 942 + 943 + '@babel/code-frame@7.25.9': 944 + dependencies: 945 + '@babel/highlight': 7.25.9 946 + picocolors: 1.1.1 947 + 948 + '@babel/helper-validator-identifier@7.27.1': {} 949 + 950 + '@babel/highlight@7.25.9': 951 + dependencies: 952 + '@babel/helper-validator-identifier': 7.27.1 953 + chalk: 2.4.2 954 + js-tokens: 4.0.0 955 + picocolors: 1.1.1 956 + 957 + '@esbuild/aix-ppc64@0.21.5': 958 + optional: true 959 + 960 + '@esbuild/android-arm64@0.21.5': 961 + optional: true 962 + 963 + '@esbuild/android-arm@0.21.5': 964 + optional: true 965 + 966 + '@esbuild/android-x64@0.21.5': 967 + optional: true 968 + 969 + '@esbuild/darwin-arm64@0.21.5': 970 + optional: true 971 + 972 + '@esbuild/darwin-x64@0.21.5': 973 + optional: true 974 + 975 + '@esbuild/freebsd-arm64@0.21.5': 976 + optional: true 977 + 978 + '@esbuild/freebsd-x64@0.21.5': 979 + optional: true 980 + 981 + '@esbuild/linux-arm64@0.21.5': 982 + optional: true 983 + 984 + '@esbuild/linux-arm@0.21.5': 985 + optional: true 986 + 987 + '@esbuild/linux-ia32@0.21.5': 988 + optional: true 989 + 990 + '@esbuild/linux-loong64@0.21.5': 991 + optional: true 992 + 993 + '@esbuild/linux-mips64el@0.21.5': 994 + optional: true 995 + 996 + '@esbuild/linux-ppc64@0.21.5': 997 + optional: true 998 + 999 + '@esbuild/linux-riscv64@0.21.5': 1000 + optional: true 1001 + 1002 + '@esbuild/linux-s390x@0.21.5': 1003 + optional: true 1004 + 1005 + '@esbuild/linux-x64@0.21.5': 1006 + optional: true 1007 + 1008 + '@esbuild/netbsd-x64@0.21.5': 1009 + optional: true 1010 + 1011 + '@esbuild/openbsd-x64@0.21.5': 1012 + optional: true 1013 + 1014 + '@esbuild/sunos-x64@0.21.5': 1015 + optional: true 1016 + 1017 + '@esbuild/win32-arm64@0.21.5': 1018 + optional: true 1019 + 1020 + '@esbuild/win32-ia32@0.21.5': 1021 + optional: true 1022 + 1023 + '@esbuild/win32-x64@0.21.5': 1024 + optional: true 1025 + 1026 + '@jest/schemas@29.6.3': 1027 + dependencies: 1028 + '@sinclair/typebox': 0.27.8 1029 + 1030 + '@jridgewell/sourcemap-codec@1.5.5': {} 1031 + 1032 + '@nodelib/fs.scandir@2.1.5': 1033 + dependencies: 1034 + '@nodelib/fs.stat': 2.0.5 1035 + run-parallel: 1.2.0 1036 + 1037 + '@nodelib/fs.stat@2.0.5': {} 1038 + 1039 + '@nodelib/fs.walk@1.2.8': 1040 + dependencies: 1041 + '@nodelib/fs.scandir': 2.1.5 1042 + fastq: 1.19.1 1043 + 1044 + '@rollup/rollup-android-arm-eabi@4.52.4': 1045 + optional: true 1046 + 1047 + '@rollup/rollup-android-arm64@4.52.4': 1048 + optional: true 1049 + 1050 + '@rollup/rollup-darwin-arm64@4.52.4': 1051 + optional: true 1052 + 1053 + '@rollup/rollup-darwin-x64@4.52.4': 1054 + optional: true 1055 + 1056 + '@rollup/rollup-freebsd-arm64@4.52.4': 1057 + optional: true 1058 + 1059 + '@rollup/rollup-freebsd-x64@4.52.4': 1060 + optional: true 1061 + 1062 + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': 1063 + optional: true 1064 + 1065 + '@rollup/rollup-linux-arm-musleabihf@4.52.4': 1066 + optional: true 1067 + 1068 + '@rollup/rollup-linux-arm64-gnu@4.52.4': 1069 + optional: true 1070 + 1071 + '@rollup/rollup-linux-arm64-musl@4.52.4': 1072 + optional: true 1073 + 1074 + '@rollup/rollup-linux-loong64-gnu@4.52.4': 1075 + optional: true 1076 + 1077 + '@rollup/rollup-linux-ppc64-gnu@4.52.4': 1078 + optional: true 1079 + 1080 + '@rollup/rollup-linux-riscv64-gnu@4.52.4': 1081 + optional: true 1082 + 1083 + '@rollup/rollup-linux-riscv64-musl@4.52.4': 1084 + optional: true 1085 + 1086 + '@rollup/rollup-linux-s390x-gnu@4.52.4': 1087 + optional: true 1088 + 1089 + '@rollup/rollup-linux-x64-gnu@4.52.4': 1090 + optional: true 1091 + 1092 + '@rollup/rollup-linux-x64-musl@4.52.4': 1093 + optional: true 1094 + 1095 + '@rollup/rollup-openharmony-arm64@4.52.4': 1096 + optional: true 1097 + 1098 + '@rollup/rollup-win32-arm64-msvc@4.52.4': 1099 + optional: true 1100 + 1101 + '@rollup/rollup-win32-ia32-msvc@4.52.4': 1102 + optional: true 1103 + 1104 + '@rollup/rollup-win32-x64-gnu@4.52.4': 1105 + optional: true 1106 + 1107 + '@rollup/rollup-win32-x64-msvc@4.52.4': 1108 + optional: true 1109 + 1110 + '@sinclair/typebox@0.27.8': {} 1111 + 1112 + '@sindresorhus/merge-streams@2.3.0': {} 1113 + 1114 + '@types/estree@1.0.8': {} 1115 + 1116 + '@types/node@20.19.19': 1117 + dependencies: 1118 + undici-types: 6.21.0 1119 + 1120 + '@typespec/compiler@0.64.0': 1121 + dependencies: 1122 + '@babel/code-frame': 7.25.9 1123 + ajv: 8.17.1 1124 + change-case: 5.4.4 1125 + globby: 14.0.2 1126 + mustache: 4.2.0 1127 + picocolors: 1.1.1 1128 + prettier: 3.3.3 1129 + prompts: 2.4.2 1130 + semver: 7.7.2 1131 + temporal-polyfill: 0.2.5 1132 + vscode-languageserver: 9.0.1 1133 + vscode-languageserver-textdocument: 1.0.12 1134 + yaml: 2.5.1 1135 + yargs: 17.7.2 1136 + 1137 + '@typespec/http@0.64.0(@typespec/compiler@0.64.0)': 1138 + dependencies: 1139 + '@typespec/compiler': 0.64.0 1140 + 1141 + '@typespec/openapi@0.64.0(@typespec/compiler@0.64.0)(@typespec/http@0.64.0(@typespec/compiler@0.64.0))': 1142 + dependencies: 1143 + '@typespec/compiler': 0.64.0 1144 + '@typespec/http': 0.64.0(@typespec/compiler@0.64.0) 1145 + 1146 + '@vitest/expect@1.6.1': 1147 + dependencies: 1148 + '@vitest/spy': 1.6.1 1149 + '@vitest/utils': 1.6.1 1150 + chai: 4.5.0 1151 + 1152 + '@vitest/runner@1.6.1': 1153 + dependencies: 1154 + '@vitest/utils': 1.6.1 1155 + p-limit: 5.0.0 1156 + pathe: 1.1.2 1157 + 1158 + '@vitest/snapshot@1.6.1': 1159 + dependencies: 1160 + magic-string: 0.30.19 1161 + pathe: 1.1.2 1162 + pretty-format: 29.7.0 1163 + 1164 + '@vitest/spy@1.6.1': 1165 + dependencies: 1166 + tinyspy: 2.2.1 1167 + 1168 + '@vitest/utils@1.6.1': 1169 + dependencies: 1170 + diff-sequences: 29.6.3 1171 + estree-walker: 3.0.3 1172 + loupe: 2.3.7 1173 + pretty-format: 29.7.0 1174 + 1175 + acorn-walk@8.3.4: 1176 + dependencies: 1177 + acorn: 8.15.0 1178 + 1179 + acorn@8.15.0: {} 1180 + 1181 + ajv@8.17.1: 1182 + dependencies: 1183 + fast-deep-equal: 3.1.3 1184 + fast-uri: 3.1.0 1185 + json-schema-traverse: 1.0.0 1186 + require-from-string: 2.0.2 1187 + 1188 + ansi-regex@5.0.1: {} 1189 + 1190 + ansi-styles@3.2.1: 1191 + dependencies: 1192 + color-convert: 1.9.3 1193 + 1194 + ansi-styles@4.3.0: 1195 + dependencies: 1196 + color-convert: 2.0.1 1197 + 1198 + ansi-styles@5.2.0: {} 1199 + 1200 + assertion-error@1.1.0: {} 1201 + 1202 + braces@3.0.3: 1203 + dependencies: 1204 + fill-range: 7.1.1 1205 + 1206 + cac@6.7.14: {} 1207 + 1208 + chai@4.5.0: 1209 + dependencies: 1210 + assertion-error: 1.1.0 1211 + check-error: 1.0.3 1212 + deep-eql: 4.1.4 1213 + get-func-name: 2.0.2 1214 + loupe: 2.3.7 1215 + pathval: 1.1.1 1216 + type-detect: 4.1.0 1217 + 1218 + chalk@2.4.2: 1219 + dependencies: 1220 + ansi-styles: 3.2.1 1221 + escape-string-regexp: 1.0.5 1222 + supports-color: 5.5.0 1223 + 1224 + change-case@5.4.4: {} 1225 + 1226 + check-error@1.0.3: 1227 + dependencies: 1228 + get-func-name: 2.0.2 1229 + 1230 + cliui@8.0.1: 1231 + dependencies: 1232 + string-width: 4.2.3 1233 + strip-ansi: 6.0.1 1234 + wrap-ansi: 7.0.0 1235 + 1236 + color-convert@1.9.3: 1237 + dependencies: 1238 + color-name: 1.1.3 1239 + 1240 + color-convert@2.0.1: 1241 + dependencies: 1242 + color-name: 1.1.4 1243 + 1244 + color-name@1.1.3: {} 1245 + 1246 + color-name@1.1.4: {} 1247 + 1248 + confbox@0.1.8: {} 1249 + 1250 + cross-spawn@7.0.6: 1251 + dependencies: 1252 + path-key: 3.1.1 1253 + shebang-command: 2.0.0 1254 + which: 2.0.2 1255 + 1256 + debug@4.4.3: 1257 + dependencies: 1258 + ms: 2.1.3 1259 + 1260 + deep-eql@4.1.4: 1261 + dependencies: 1262 + type-detect: 4.1.0 1263 + 1264 + diff-sequences@29.6.3: {} 1265 + 1266 + emoji-regex@8.0.0: {} 1267 + 1268 + esbuild@0.21.5: 1269 + optionalDependencies: 1270 + '@esbuild/aix-ppc64': 0.21.5 1271 + '@esbuild/android-arm': 0.21.5 1272 + '@esbuild/android-arm64': 0.21.5 1273 + '@esbuild/android-x64': 0.21.5 1274 + '@esbuild/darwin-arm64': 0.21.5 1275 + '@esbuild/darwin-x64': 0.21.5 1276 + '@esbuild/freebsd-arm64': 0.21.5 1277 + '@esbuild/freebsd-x64': 0.21.5 1278 + '@esbuild/linux-arm': 0.21.5 1279 + '@esbuild/linux-arm64': 0.21.5 1280 + '@esbuild/linux-ia32': 0.21.5 1281 + '@esbuild/linux-loong64': 0.21.5 1282 + '@esbuild/linux-mips64el': 0.21.5 1283 + '@esbuild/linux-ppc64': 0.21.5 1284 + '@esbuild/linux-riscv64': 0.21.5 1285 + '@esbuild/linux-s390x': 0.21.5 1286 + '@esbuild/linux-x64': 0.21.5 1287 + '@esbuild/netbsd-x64': 0.21.5 1288 + '@esbuild/openbsd-x64': 0.21.5 1289 + '@esbuild/sunos-x64': 0.21.5 1290 + '@esbuild/win32-arm64': 0.21.5 1291 + '@esbuild/win32-ia32': 0.21.5 1292 + '@esbuild/win32-x64': 0.21.5 1293 + 1294 + escalade@3.2.0: {} 1295 + 1296 + escape-string-regexp@1.0.5: {} 1297 + 1298 + estree-walker@3.0.3: 1299 + dependencies: 1300 + '@types/estree': 1.0.8 1301 + 1302 + execa@8.0.1: 1303 + dependencies: 1304 + cross-spawn: 7.0.6 1305 + get-stream: 8.0.1 1306 + human-signals: 5.0.0 1307 + is-stream: 3.0.0 1308 + merge-stream: 2.0.0 1309 + npm-run-path: 5.3.0 1310 + onetime: 6.0.0 1311 + signal-exit: 4.1.0 1312 + strip-final-newline: 3.0.0 1313 + 1314 + fast-deep-equal@3.1.3: {} 1315 + 1316 + fast-glob@3.3.3: 1317 + dependencies: 1318 + '@nodelib/fs.stat': 2.0.5 1319 + '@nodelib/fs.walk': 1.2.8 1320 + glob-parent: 5.1.2 1321 + merge2: 1.4.1 1322 + micromatch: 4.0.8 1323 + 1324 + fast-uri@3.1.0: {} 1325 + 1326 + fastq@1.19.1: 1327 + dependencies: 1328 + reusify: 1.1.0 1329 + 1330 + fill-range@7.1.1: 1331 + dependencies: 1332 + to-regex-range: 5.0.1 1333 + 1334 + fsevents@2.3.3: 1335 + optional: true 1336 + 1337 + get-caller-file@2.0.5: {} 1338 + 1339 + get-func-name@2.0.2: {} 1340 + 1341 + get-stream@8.0.1: {} 1342 + 1343 + glob-parent@5.1.2: 1344 + dependencies: 1345 + is-glob: 4.0.3 1346 + 1347 + globby@14.0.2: 1348 + dependencies: 1349 + '@sindresorhus/merge-streams': 2.3.0 1350 + fast-glob: 3.3.3 1351 + ignore: 5.3.2 1352 + path-type: 5.0.0 1353 + slash: 5.1.0 1354 + unicorn-magic: 0.1.0 1355 + 1356 + has-flag@3.0.0: {} 1357 + 1358 + human-signals@5.0.0: {} 1359 + 1360 + ignore@5.3.2: {} 1361 + 1362 + is-extglob@2.1.1: {} 1363 + 1364 + is-fullwidth-code-point@3.0.0: {} 1365 + 1366 + is-glob@4.0.3: 1367 + dependencies: 1368 + is-extglob: 2.1.1 1369 + 1370 + is-number@7.0.0: {} 1371 + 1372 + is-stream@3.0.0: {} 1373 + 1374 + isexe@2.0.0: {} 1375 + 1376 + js-tokens@4.0.0: {} 1377 + 1378 + js-tokens@9.0.1: {} 1379 + 1380 + json-schema-traverse@1.0.0: {} 1381 + 1382 + kleur@3.0.3: {} 1383 + 1384 + local-pkg@0.5.1: 1385 + dependencies: 1386 + mlly: 1.8.0 1387 + pkg-types: 1.3.1 1388 + 1389 + loupe@2.3.7: 1390 + dependencies: 1391 + get-func-name: 2.0.2 1392 + 1393 + magic-string@0.30.19: 1394 + dependencies: 1395 + '@jridgewell/sourcemap-codec': 1.5.5 1396 + 1397 + merge-stream@2.0.0: {} 1398 + 1399 + merge2@1.4.1: {} 1400 + 1401 + micromatch@4.0.8: 1402 + dependencies: 1403 + braces: 3.0.3 1404 + picomatch: 2.3.1 1405 + 1406 + mimic-fn@4.0.0: {} 1407 + 1408 + mlly@1.8.0: 1409 + dependencies: 1410 + acorn: 8.15.0 1411 + pathe: 2.0.3 1412 + pkg-types: 1.3.1 1413 + ufo: 1.6.1 1414 + 1415 + ms@2.1.3: {} 1416 + 1417 + mustache@4.2.0: {} 1418 + 1419 + nanoid@3.3.11: {} 1420 + 1421 + npm-run-path@5.3.0: 1422 + dependencies: 1423 + path-key: 4.0.0 1424 + 1425 + onetime@6.0.0: 1426 + dependencies: 1427 + mimic-fn: 4.0.0 1428 + 1429 + p-limit@5.0.0: 1430 + dependencies: 1431 + yocto-queue: 1.2.1 1432 + 1433 + path-key@3.1.1: {} 1434 + 1435 + path-key@4.0.0: {} 1436 + 1437 + path-type@5.0.0: {} 1438 + 1439 + pathe@1.1.2: {} 1440 + 1441 + pathe@2.0.3: {} 1442 + 1443 + pathval@1.1.1: {} 1444 + 1445 + picocolors@1.1.1: {} 1446 + 1447 + picomatch@2.3.1: {} 1448 + 1449 + pkg-types@1.3.1: 1450 + dependencies: 1451 + confbox: 0.1.8 1452 + mlly: 1.8.0 1453 + pathe: 2.0.3 1454 + 1455 + postcss@8.5.6: 1456 + dependencies: 1457 + nanoid: 3.3.11 1458 + picocolors: 1.1.1 1459 + source-map-js: 1.2.1 1460 + 1461 + prettier@3.3.3: {} 1462 + 1463 + pretty-format@29.7.0: 1464 + dependencies: 1465 + '@jest/schemas': 29.6.3 1466 + ansi-styles: 5.2.0 1467 + react-is: 18.3.1 1468 + 1469 + prompts@2.4.2: 1470 + dependencies: 1471 + kleur: 3.0.3 1472 + sisteransi: 1.0.5 1473 + 1474 + queue-microtask@1.2.3: {} 1475 + 1476 + react-is@18.3.1: {} 1477 + 1478 + require-directory@2.1.1: {} 1479 + 1480 + require-from-string@2.0.2: {} 1481 + 1482 + reusify@1.1.0: {} 1483 + 1484 + rollup@4.52.4: 1485 + dependencies: 1486 + '@types/estree': 1.0.8 1487 + optionalDependencies: 1488 + '@rollup/rollup-android-arm-eabi': 4.52.4 1489 + '@rollup/rollup-android-arm64': 4.52.4 1490 + '@rollup/rollup-darwin-arm64': 4.52.4 1491 + '@rollup/rollup-darwin-x64': 4.52.4 1492 + '@rollup/rollup-freebsd-arm64': 4.52.4 1493 + '@rollup/rollup-freebsd-x64': 4.52.4 1494 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 1495 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 1496 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 1497 + '@rollup/rollup-linux-arm64-musl': 4.52.4 1498 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 1499 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 1500 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 1501 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 1502 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 1503 + '@rollup/rollup-linux-x64-gnu': 4.52.4 1504 + '@rollup/rollup-linux-x64-musl': 4.52.4 1505 + '@rollup/rollup-openharmony-arm64': 4.52.4 1506 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 1507 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 1508 + '@rollup/rollup-win32-x64-gnu': 4.52.4 1509 + '@rollup/rollup-win32-x64-msvc': 4.52.4 1510 + fsevents: 2.3.3 1511 + 1512 + run-parallel@1.2.0: 1513 + dependencies: 1514 + queue-microtask: 1.2.3 1515 + 1516 + semver@7.7.2: {} 1517 + 1518 + shebang-command@2.0.0: 1519 + dependencies: 1520 + shebang-regex: 3.0.0 1521 + 1522 + shebang-regex@3.0.0: {} 1523 + 1524 + siginfo@2.0.0: {} 1525 + 1526 + signal-exit@4.1.0: {} 1527 + 1528 + sisteransi@1.0.5: {} 1529 + 1530 + slash@5.1.0: {} 1531 + 1532 + source-map-js@1.2.1: {} 1533 + 1534 + stackback@0.0.2: {} 1535 + 1536 + std-env@3.9.0: {} 1537 + 1538 + string-width@4.2.3: 1539 + dependencies: 1540 + emoji-regex: 8.0.0 1541 + is-fullwidth-code-point: 3.0.0 1542 + strip-ansi: 6.0.1 1543 + 1544 + strip-ansi@6.0.1: 1545 + dependencies: 1546 + ansi-regex: 5.0.1 1547 + 1548 + strip-final-newline@3.0.0: {} 1549 + 1550 + strip-literal@2.1.1: 1551 + dependencies: 1552 + js-tokens: 9.0.1 1553 + 1554 + supports-color@5.5.0: 1555 + dependencies: 1556 + has-flag: 3.0.0 1557 + 1558 + temporal-polyfill@0.2.5: 1559 + dependencies: 1560 + temporal-spec: 0.2.4 1561 + 1562 + temporal-spec@0.2.4: {} 1563 + 1564 + tinybench@2.9.0: {} 1565 + 1566 + tinypool@0.8.4: {} 1567 + 1568 + tinyspy@2.2.1: {} 1569 + 1570 + to-regex-range@5.0.1: 1571 + dependencies: 1572 + is-number: 7.0.0 1573 + 1574 + type-detect@4.1.0: {} 1575 + 1576 + typescript@5.9.3: {} 1577 + 1578 + ufo@1.6.1: {} 1579 + 1580 + undici-types@6.21.0: {} 1581 + 1582 + unicorn-magic@0.1.0: {} 1583 + 1584 + vite-node@1.6.1(@types/node@20.19.19): 1585 + dependencies: 1586 + cac: 6.7.14 1587 + debug: 4.4.3 1588 + pathe: 1.1.2 1589 + picocolors: 1.1.1 1590 + vite: 5.4.20(@types/node@20.19.19) 1591 + transitivePeerDependencies: 1592 + - '@types/node' 1593 + - less 1594 + - lightningcss 1595 + - sass 1596 + - sass-embedded 1597 + - stylus 1598 + - sugarss 1599 + - supports-color 1600 + - terser 1601 + 1602 + vite@5.4.20(@types/node@20.19.19): 1603 + dependencies: 1604 + esbuild: 0.21.5 1605 + postcss: 8.5.6 1606 + rollup: 4.52.4 1607 + optionalDependencies: 1608 + '@types/node': 20.19.19 1609 + fsevents: 2.3.3 1610 + 1611 + vitest@1.6.1(@types/node@20.19.19): 1612 + dependencies: 1613 + '@vitest/expect': 1.6.1 1614 + '@vitest/runner': 1.6.1 1615 + '@vitest/snapshot': 1.6.1 1616 + '@vitest/spy': 1.6.1 1617 + '@vitest/utils': 1.6.1 1618 + acorn-walk: 8.3.4 1619 + chai: 4.5.0 1620 + debug: 4.4.3 1621 + execa: 8.0.1 1622 + local-pkg: 0.5.1 1623 + magic-string: 0.30.19 1624 + pathe: 1.1.2 1625 + picocolors: 1.1.1 1626 + std-env: 3.9.0 1627 + strip-literal: 2.1.1 1628 + tinybench: 2.9.0 1629 + tinypool: 0.8.4 1630 + vite: 5.4.20(@types/node@20.19.19) 1631 + vite-node: 1.6.1(@types/node@20.19.19) 1632 + why-is-node-running: 2.3.0 1633 + optionalDependencies: 1634 + '@types/node': 20.19.19 1635 + transitivePeerDependencies: 1636 + - less 1637 + - lightningcss 1638 + - sass 1639 + - sass-embedded 1640 + - stylus 1641 + - sugarss 1642 + - supports-color 1643 + - terser 1644 + 1645 + vscode-jsonrpc@8.2.0: {} 1646 + 1647 + vscode-languageserver-protocol@3.17.5: 1648 + dependencies: 1649 + vscode-jsonrpc: 8.2.0 1650 + vscode-languageserver-types: 3.17.5 1651 + 1652 + vscode-languageserver-textdocument@1.0.12: {} 1653 + 1654 + vscode-languageserver-types@3.17.5: {} 1655 + 1656 + vscode-languageserver@9.0.1: 1657 + dependencies: 1658 + vscode-languageserver-protocol: 3.17.5 1659 + 1660 + which@2.0.2: 1661 + dependencies: 1662 + isexe: 2.0.0 1663 + 1664 + why-is-node-running@2.3.0: 1665 + dependencies: 1666 + siginfo: 2.0.0 1667 + stackback: 0.0.2 1668 + 1669 + wrap-ansi@7.0.0: 1670 + dependencies: 1671 + ansi-styles: 4.3.0 1672 + string-width: 4.2.3 1673 + strip-ansi: 6.0.1 1674 + 1675 + y18n@5.0.8: {} 1676 + 1677 + yaml@2.5.1: {} 1678 + 1679 + yargs-parser@21.1.1: {} 1680 + 1681 + yargs@17.7.2: 1682 + dependencies: 1683 + cliui: 8.0.1 1684 + escalade: 3.2.0 1685 + get-caller-file: 2.0.5 1686 + require-directory: 2.1.1 1687 + string-width: 4.2.3 1688 + y18n: 5.0.8 1689 + yargs-parser: 21.1.1 1690 + 1691 + yocto-queue@1.2.1: {}