diff --git a/packages/typespec-vscode/package.json b/packages/typespec-vscode/package.json index 623efce53e..d789c2cca2 100644 --- a/packages/typespec-vscode/package.json +++ b/packages/typespec-vscode/package.json @@ -109,7 +109,7 @@ "default": "off", "description": "Define whether/how the TypeSpec language server should send traces to client. For the traces to show properly in vscode Output, make sure 'Log Level' is also set to 'Trace' so that they won't be filtered at client side, which can be set through 'Developer: Set Log Level...' command." }, - "typespec.client.emitter": { + "typespec.emitters": { "scope": "window", "type": "array", "items": { @@ -122,99 +122,65 @@ "Java", "JavaScript", "Python", - "Go" + "Go", + "OpenAPI3", + "ProtoBuf", + "JsonSchema" ], "description": "Define the language the emitter will emit." }, "package": { "type": "string", "description": "Define the emitter package.\n\nExample (with version): @typespec/http-client-csharp@1.0.0\n\nExample (without version): @typespec/http-client-csharp" + }, + "kind": { + "type": "string", + "enum": [ + "client", + "server", + "schema" + ], + "description": "Define the emitter kind." } } }, "default": [ { "language": "DotNet", - "package": "@typespec/http-client-csharp" + "package": "@typespec/http-client-csharp", + "kind": "client" }, { "language": "Java", - "package": "@typespec/http-client-java" + "package": "@typespec/http-client-java", + "kind": "client" }, { "language": "JavaScript", - "package": "@azure-tools/typespec-ts" + "package": "@azure-tools/typespec-ts", + "kind": "client" }, { "language": "Python", - "package": "@typespec/http-client-python" - } - ], - "description": "Define the emitter for a language client sdk generation." - }, - "typespec.server.emitter": { - "scope": "window", - "type": "array", - "items": { - "type": "object", - "properties": { - "language": { - "type": "string", - "enum": [ - "DotNet", - "Java", - "JavaScript", - "Python", - "Go" - ], - "description": "Define the language for the emitter." - }, - "package": { - "type": "string", - "description": "Define the emitter package.\n\nExample (with version): @typespec/http-server-csharp@1.0.0\n\nExample (without version): @typespec/http-server-csharp" - } - } - }, - "default": [ + "package": "@typespec/http-client-python", + "kind": "client" + }, { "language": "DotNet", - "package": "@typespec/http-server-csharp" + "package": "@typespec/http-server-csharp", + "kind": "server" }, { "language": "JavaScript", - "package": "@typespec/http-server-javascript" - } - ], - "description": "Define the emitter for server code generation." - }, - "typespec.schema.emitter": { - "scope": "window", - "type": "array", - "items": { - "type": "object", - "properties": { - "language": { - "type": "string", - "enum": [ - "OpenAPI3", - "ProtoBuf", - "JsonSchema" - ], - "description": "Define the language for the emitter." - }, - "package": { - "type": "string", - "description": "Define the emitter package.\n\nExample (with version): @typespec/openapi3@1.0.0\n\nExample (without version): @typespec/openapi3" - } - } - }, - "default": [ + "package": "@typespec/http-server-javascript", + "kind": "server" + }, { "language": "OpenAPI3", - "package": "@typespec/openapi3" + "package": "@typespec/openapi3", + "kind": "schema" } - ], - "description": "Define the emitter for a schema." + ] } } } @@ -249,8 +215,8 @@ "category": "TypeSpec" }, { - "command": "typespec.emit", - "title": "TypeSpec: Emit Code", + "command": "typespec.generate", + "title": "Generate from TypeSpec", "category": "TypeSpec" }, { @@ -267,14 +233,14 @@ "menus": { "explorer/context": [ { - "command": "typespec.emit", + "command": "typespec.generate", "when": "explorerResourceIsFolder || resourceLangId == typespec", "group": "code_generation" } ], "editor/context": [ { - "command": "typespec.emit", + "command": "typespec.generate", "when": "resourceLangId == typespec", "group": "code_generation" } @@ -336,9 +302,6 @@ "test:e2e": "pnpm test:web", "test:web": "vscode-test-web --extensionDevelopmentPath=. --headless --extensionTestsPath=dist/test/web/suite.js ./test/web/data" }, - "dependencies": { - "@typespec/compiler": "workspace:~" - }, "devDependencies": { "@rollup/plugin-commonjs": "~28.0.0", "@rollup/plugin-node-resolve": "~15.3.0", diff --git a/packages/typespec-vscode/src/const.ts b/packages/typespec-vscode/src/const.ts index 9216ab4e34..e7b898f945 100644 --- a/packages/typespec-vscode/src/const.ts +++ b/packages/typespec-vscode/src/const.ts @@ -1,9 +1 @@ -import { SettingName } from "./types.js"; - -export const EmitterSettingName: Record = { - client: SettingName.ClientEmitter, - server: SettingName.ServerEmitter, - schema: SettingName.SchemaEmitter, -}; - export const StartFileName = "main.tsp"; diff --git a/packages/typespec-vscode/src/emit/emit.ts b/packages/typespec-vscode/src/emit/emit.ts index 0f88688fcc..a01f7aba89 100644 --- a/packages/typespec-vscode/src/emit/emit.ts +++ b/packages/typespec-vscode/src/emit/emit.ts @@ -2,6 +2,7 @@ import path, { dirname } from "path"; import vscode, { Uri } from "vscode"; import { Executable } from "vscode-languageclient/node.js"; +import { StartFileName } from "../const.js"; import logger from "../log/logger.js"; import { InstallationAction, npmDependencyType, NpmUtil } from "../npm-utils.js"; import { @@ -23,7 +24,7 @@ export async function doEmit( ) { if (!mainTspFile || !(await isFile(mainTspFile))) { logger.info( - "Invalid typespec project. There is no main tsp file in the project. Emit canceled.", + "Invalid typespec project. There is no main tsp file in the project. Generating Cancelled.", [], { showOutput: false, showPopup: true, progress: overallProgress }, ); @@ -49,16 +50,16 @@ export async function doEmit( const all = [...registerEmitters].map((e) => toQuickPickItem(e)); const selectedEmitter = await vscode.window.showQuickPick(all, { - title: "Select the Language", + title: "Select a Language", canPickMany: false, placeHolder: "Pick a Language", ignoreFocusOut: true, }); if (!selectedEmitter) { - logger.info("No emitters selected. Emit canceled.", [], { + logger.info("No emitter selected. Generating Cancelled.", [], { showOutput: false, - showPopup: true, + showPopup: false, progress: overallProgress, }); return; @@ -66,17 +67,17 @@ export async function doEmit( /* TODO: verify the sdk runtime installation. */ /* inform to install needed runtime. */ - const { valid, required } = await check(`${baseDir}/main.tsp`); + const { valid, required } = await check(`${baseDir}/${StartFileName}`, selectedEmitter.package); if (!valid) { const toInstall = required.map((e) => e.name).join(", "); await vscode.window .showInformationMessage( - `Please install the required runtime for the selected emitters\n\n.net (>= 0.8.0) ${toInstall}`, + `Please install the required runtime for the selected emitters\n\n. ${toInstall}`, "OK", ) .then((selection) => { if (selection === "OK") { - logger.info("Emit canceled.", [], { + logger.info("Generating Cancelled.", [], { showOutput: false, showPopup: true, progress: overallProgress, @@ -86,8 +87,6 @@ export async function doEmit( return; } - /* TODO: verify packages to install. */ - logger.info("npm install...", [], { showOutput: false, showPopup: false, @@ -96,68 +95,73 @@ export async function doEmit( const npmUtil = new NpmUtil(baseDir); const packagesToInstall: string[] = []; - const packagesToVerify: { package: string; version?: string }[] = []; - // packagesToVerify.push({ package: "@typespec/compiler" }); + /* install emitter package. */ logger.info(`select ${selectedEmitter.package}`); - packagesToVerify.push({ package: selectedEmitter.package, version: selectedEmitter.version }); - for (const p of packagesToVerify) { - const { action, version } = await npmUtil.ensureNpmPackageInstall(p.package, p.version); - /* TODO: check the dependent compiler version. */ - if (action === InstallationAction.Upgrade) { - logger.info(`Upgrading ${p.package} to version ${version}`); - const options = { - ok: `OK (install ${p.package}@${version} by 'npm install'`, - recheck: `Check again (install ${p.package} manually)`, - ignore: `Ignore emitter ${p.package}`, - cancel: "Cancel", - }; - const selected = await vscode.window.showQuickPick(Object.values(options), { - canPickMany: false, - ignoreFocusOut: true, - placeHolder: `Package '${p.package}' needs to be installed for emitting`, - title: `TypeSpec Emit...`, + const { action, version } = await npmUtil.ensureNpmPackageInstall( + selectedEmitter.package, + selectedEmitter.version, + ); + + if (action === InstallationAction.Upgrade) { + logger.info(`Upgrading ${selectedEmitter.package} to version ${version}`); + const options = { + ok: `OK (install ${selectedEmitter.package}@${version} by 'npm install'`, + recheck: `Check again (install ${selectedEmitter.package} manually)`, + ignore: `Ignore (don't upgrade emitter ${selectedEmitter.package})`, + }; + const selected = await vscode.window.showQuickPick(Object.values(options), { + canPickMany: false, + ignoreFocusOut: true, + placeHolder: `Package '${selectedEmitter.package}' needs to be upgraded for generating`, + title: `TypeSpec Generating...`, + }); + if (selected === options.ok) { + packagesToInstall.push(`${selectedEmitter.package}@${version}`); + } else if (selected === options.ignore) { + logger.info(`Ignore upgrading emitter ${selectedEmitter.package} for generating`, [], { + showOutput: false, + showPopup: false, + progress: overallProgress, }); - if (selected === options.ok) { - packagesToInstall.push(`${p.package}@${version}`); - } - } else if (action === InstallationAction.Install) { - let packageFullName = p.package; - if (version) { - packageFullName = `${p.package}@${version}`; - } - logger.info(`Installing ${packageFullName}`); - /* verify dependency packages. */ - const dependenciesToInstall = await npmUtil.ensureNpmPackageDependencyInstall( - p.package, - version, - npmDependencyType.peerDependencies, + } else { + logger.info( + `Need to manually install the package ${selectedEmitter.package}@${version}. Generating Cancelled.`, + [], + { + showOutput: false, + showPopup: true, + progress: overallProgress, + }, ); - logger.info(`${dependenciesToInstall}`); - for (const dependency of dependenciesToInstall) { - const options = { - ok: `OK (Upgrade ${dependency} by 'npm install'`, - recheck: `Check again (install ${p.package} manually)`, - ignore: `Ignore emitter ${p.package}`, - cancel: "Cancel", - }; - const selected = await vscode.window.showQuickPick(Object.values(options), { - canPickMany: false, - ignoreFocusOut: true, - placeHolder: `Package '${dependency}' needs to be upgraded for emitting`, - title: `TypeSpec Emit...`, - }); - if (selected === options.ok) { - packagesToInstall.push(dependency); - } - } - packagesToInstall.push(`${packageFullName}`); + return; + } + } else if (action === InstallationAction.Install) { + let packageFullName = selectedEmitter.package; + if (version) { + packageFullName = `${selectedEmitter.package}@${version}`; + } + logger.info(`Installing ${packageFullName}`); + /* verify dependency packages. */ + const dependenciesToInstall = await npmUtil.ensureNpmPackageDependencyInstall( + selectedEmitter.package, + version, + npmDependencyType.peerDependencies, + ); + logger.info(`${dependenciesToInstall}`); + if (dependenciesToInstall.length > 0) { + vscode.window.showInformationMessage( + `Need to manually upgrade following dependency packages: ${dependenciesToInstall.join("\\n")}. \nGenerating Cancelled`, + "OK", + ); + return; } + packagesToInstall.push(`${packageFullName}`); } /* npm install packages. */ if (packagesToInstall.length > 0) { - logger.info(`Installing ${packagesToInstall.join("\n\n")}, baseDir: ${baseDir}`, [], { + logger.info(`Installing ${packagesToInstall.join("\n\n")} under ${baseDir}`, [], { showOutput: true, showPopup: true, progress: overallProgress, @@ -167,17 +171,17 @@ export async function doEmit( onStdioOut: toOutput, onStdioError: toError, }); - logger.info("completed install..."); if (npmInstallResult.exitCode !== 0) { - logger.error(`Error occurred when installing packages: ${npmInstallResult.stderr}`, [], { + logger.error(`Error occurred when installing packages.`, [`${npmInstallResult.stderr}`], { showOutput: true, showPopup: true, progress: overallProgress, }); return; } + logger.info("completed install..."); } catch (err) { - logger.error(`Exception occurred when installing packages: ${err}`, [], { + logger.error(`Exception occurred when installing packages.`, [err], { showOutput: true, showPopup: true, progress: overallProgress, @@ -187,7 +191,7 @@ export async function doEmit( } /* emit */ - logger.info("Emit code ...", [], { + logger.info("Generating ...", [], { showOutput: false, showPopup: false, progress: overallProgress, @@ -195,11 +199,15 @@ export async function doEmit( const cli = await resolveTypeSpecCli(baseDir); if (!cli) { - logger.error("Cannot find TypeSpec CLI. Please install @typespec/compiler. Cancel emit.", [], { - showOutput: true, - showPopup: true, - progress: overallProgress, - }); + logger.error( + "Cannot find TypeSpec CLI. Please install @typespec/compiler. Generating Cancelled.", + [], + { + showOutput: true, + showPopup: true, + progress: overallProgress, + }, + ); return; } const outputDir = path.resolve(baseDir, selectedEmitter.emitterKind, selectedEmitter.language); @@ -207,29 +215,41 @@ export async function doEmit( const options: Record = {}; options["emitter-output-dir"] = outputDir; logger.info( - `Generate ${selectedEmitter.language} ${selectedEmitter.emitterKind} code under ${outputDir}...`, + `Start to generate ${selectedEmitter.language} ${selectedEmitter.emitterKind} code under ${outputDir}...`, [], { showOutput: true, - showPopup: true, + showPopup: false, progress: overallProgress, }, ); - const compileResult = await compile(cli, mainTspFile, selectedEmitter.package, options); - if (compileResult.exitCode !== 0) { + try { + const compileResult = await compile(cli, mainTspFile, selectedEmitter.package, options); + if (compileResult.exitCode !== 0) { + logger.error( + `Failed to generate ${selectedEmitter.emitterKind} code for ${selectedEmitter.language}.`, + [], + { + showOutput: true, + showPopup: true, + progress: overallProgress, + }, + ); + } else { + logger.info( + `Generating ${selectedEmitter.emitterKind} code for ${selectedEmitter.language}...Succeeded`, + [], + { + showOutput: true, + showPopup: true, + progress: overallProgress, + }, + ); + } + } catch (err) { logger.error( - `Failed to generate ${selectedEmitter.language} ${selectedEmitter.emitterKind} code.`, - [], - { - showOutput: true, - showPopup: true, - progress: overallProgress, - }, - ); - } else { - logger.info( - `complete generating ${selectedEmitter.language} ${selectedEmitter.emitterKind} code.`, - [], + `Exception occurred when generating ${selectedEmitter.emitterKind} code for ${selectedEmitter.language}.`, + [err], { showOutput: true, showPopup: true, @@ -249,9 +269,9 @@ export async function emitCode( let tspProjectFile: string = ""; if (!uri) { const targetPathes = await TraverseMainTspFileInWorkspace(); - logger.info(`Found ${targetPathes.length} main.tsp files`); + logger.info(`Found ${targetPathes.length} ${StartFileName} files`); if (targetPathes.length === 0) { - logger.info("No main.tsp file found. Emit canceled.", [], { + logger.info("No main tsp file found. Generating Cancelled.", [], { showOutput: false, showPopup: true, progress: overallProgress, @@ -272,13 +292,13 @@ export async function emitCode( toProjectPickItem(filePath), ); const selectedProjectFile = await vscode.window.showQuickPick(typespecProjectQuickPickItems, { - title: "Select TypeSpec Project", + title: "Select a TypeSpec Project", canPickMany: false, placeHolder: "Pick a project", ignoreFocusOut: true, }); if (!selectedProjectFile) { - logger.info("No project selected. Emit canceled.", [], { + logger.info("No project selected. Generating Cancelled.", [], { showOutput: false, showPopup: true, progress: overallProgress, @@ -305,34 +325,34 @@ export async function emitCode( const codesToEmit = [ { - label: "Client SDK", - detail: "Generate client SDK library from typespec.", + label: "Protocol Schema", + detail: "Generating Protocol schema (OpenAPI for example) from TypeSpec", + iconPath: Uri.file(context.asAbsolutePath(`./icons/schema.svg`)), + emitterKind: EmitterKind.Schema, + }, + { + label: "Client Code", + detail: "Generating Client Code from TypeSpec.", iconPath: Uri.file(context.asAbsolutePath(`./icons/sdk.svg`)), emitterKind: EmitterKind.Client, }, { - label: "Server Stub", - detail: "Generate server codes from typespec", + label: " Server Stub", + detail: "Generating Server Stub from TypeSpec", iconPath: Uri.file(context.asAbsolutePath(`./icons/serverstub.svg`)), emitterKind: EmitterKind.Server, }, - { - label: "Protocol Schema", - detail: "Generate protocol schema (e.g. OpenAPI, Protobuf) from typespec", - iconPath: Uri.file(context.asAbsolutePath(`./icons/schema.svg`)), - emitterKind: EmitterKind.Schema, - }, ]; const codeType = await vscode.window.showQuickPick(codesToEmit, { - title: "Emit Code", + title: "Select an Emitter Type", canPickMany: false, - placeHolder: "Select an option", + placeHolder: "Select an emitter type", ignoreFocusOut: true, }); if (!codeType) { - logger.info("No emitters selected. Emit canceled.", [], { + logger.info("No emitter Type selected. Generating Cancelled.", [], { showOutput: false, - showPopup: true, + showPopup: false, progress: overallProgress, }); return; @@ -363,7 +383,10 @@ export async function compile( }); } -export async function check(startFile: string): Promise<{ +export async function check( + startFile: string, + emitter: string, +): Promise<{ valid: boolean; required: { name: string; version: string }[]; }> { diff --git a/packages/typespec-vscode/src/emit/emitter.ts b/packages/typespec-vscode/src/emit/emitter.ts index 555bd03157..bb6a760327 100644 --- a/packages/typespec-vscode/src/emit/emitter.ts +++ b/packages/typespec-vscode/src/emit/emitter.ts @@ -1,5 +1,5 @@ import vscode from "vscode"; -import { EmitterSettingName } from "../const.js"; +import { SettingName } from "../types.js"; export enum EmitterKind { Schema = "schema", @@ -35,8 +35,8 @@ function getEmitter(kind: EmitterKind, emitter: Emitter): Emitter { } export function getRegisterEmitters(kind: EmitterKind): ReadonlyArray { - const emitters: ReadonlyArray = - extensionConfig.get(EmitterSettingName[kind] ?? "") ?? []; - - return emitters.map((emitter) => getEmitter(kind, emitter)); + const emitters: ReadonlyArray = extensionConfig.get(SettingName.Emitters) ?? []; + return emitters + .filter((emitter) => emitter.kind === kind) + .map((emitter) => getEmitter(kind, emitter)); } diff --git a/packages/typespec-vscode/src/extension.ts b/packages/typespec-vscode/src/extension.ts index da8edc5860..f5882c3324 100644 --- a/packages/typespec-vscode/src/extension.ts +++ b/packages/typespec-vscode/src/extension.ts @@ -47,11 +47,11 @@ export async function activate(context: ExtensionContext) { /* emit command. */ context.subscriptions.push( - commands.registerCommand("typespec.emit", async (uri: vscode.Uri) => { + commands.registerCommand(CommandName.Generate, async (uri: vscode.Uri) => { await vscode.window.withProgress( { location: vscode.ProgressLocation.Window, - title: "Emit Code...", + title: "Generate from TypeSpec...", cancellable: false, }, async (progress) => await emitCode(context, uri, progress), diff --git a/packages/typespec-vscode/src/npm-utils.ts b/packages/typespec-vscode/src/npm-utils.ts index f7e6d3b18c..542f270e2d 100644 --- a/packages/typespec-vscode/src/npm-utils.ts +++ b/packages/typespec-vscode/src/npm-utils.ts @@ -48,9 +48,12 @@ export class NpmUtil { await this.isPackageInstalled(packageName); if (isPackageInstalled) { if (version && installedVersion !== version) { - return { action: InstallationAction.Upgrade, version: version }; + return { + action: InstallationAction.Upgrade, + version: version, + }; } - return { action: InstallationAction.Cancel, version: installedVersion }; + return { action: InstallationAction.Skip, version: installedVersion }; } else { return { action: InstallationAction.Install, version: version }; } @@ -60,7 +63,6 @@ export class NpmUtil { packageName: string, version?: string, dependencyType: npmDependencyType = npmDependencyType.dependencies, - options: any = {}, on?: spawnExecutionEvents, ): Promise { const dependenciesToInstall: string[] = []; @@ -73,7 +75,7 @@ export class NpmUtil { const dependenciesResult = await spawnExecution( "npm", ["view", packageFullName, dependencyType], - this.cwd , + this.cwd, on, ); diff --git a/packages/typespec-vscode/src/task-provider.ts b/packages/typespec-vscode/src/task-provider.ts index 39d8da558e..c0f0c16ee5 100644 --- a/packages/typespec-vscode/src/task-provider.ts +++ b/packages/typespec-vscode/src/task-provider.ts @@ -1,6 +1,7 @@ import { resolve } from "path"; import vscode, { workspace } from "vscode"; import { Executable } from "vscode-languageclient/node.js"; +import { StartFileName } from "./const.js"; import logger from "./log/logger.js"; import { normalizeSlashes } from "./path-utils.js"; import { resolveTypeSpecCli } from "./tsp-executable-resolver.js"; @@ -11,13 +12,13 @@ export function createTaskProvider() { provideTasks: async () => { logger.info("Providing tsp tasks"); const targetPathes = await vscode.workspace - .findFiles("**/main.tsp", "**/node_modules/**") + .findFiles(`**/${StartFileName}`, "**/node_modules/**") .then((uris) => uris .filter((uri) => uri.scheme === "file" && !uri.fsPath.includes("node_modules")) .map((uri) => normalizeSlashes(uri.fsPath)), ); - logger.info(`Found ${targetPathes.length} main.tsp files`); + logger.info(`Found ${targetPathes.length} ${StartFileName} files`); const tasks: vscode.Task[] = []; for (const targetPath of targetPathes) { tasks.push(...(await createBuiltInTasks(targetPath))); diff --git a/packages/typespec-vscode/src/types.ts b/packages/typespec-vscode/src/types.ts index c13f5ce9c1..6c748d6be8 100644 --- a/packages/typespec-vscode/src/types.ts +++ b/packages/typespec-vscode/src/types.ts @@ -1,9 +1,7 @@ export const enum SettingName { TspServerPath = "typespec.tsp-server.path", InitTemplatesUrls = "typespec.initTemplatesUrls", - ClientEmitter = "typespec.client.emitter", - ServerEmitter = "typespec.server.emitter", - SchemaEmitter = "typespec.schema.emitter", + Emitters = "typespec.emitters", } export const enum CommandName { @@ -12,6 +10,7 @@ export const enum CommandName { InstallGlobalCompilerCli = "typespec.installGlobalCompilerCli", CreateProject = "typespec.createProject", OpenUrl = "typespec.openUrl", + Generate = "typespec.generate", } export interface InstallGlobalCliCommandArgs { diff --git a/packages/typespec-vscode/src/typespec-utils.ts b/packages/typespec-vscode/src/typespec-utils.ts index e40834e5f4..f111f8b912 100644 --- a/packages/typespec-vscode/src/typespec-utils.ts +++ b/packages/typespec-vscode/src/typespec-utils.ts @@ -30,7 +30,6 @@ export async function resolveTypeSpecCli(absolutePath: string): Promise exe.name === "tsp"); const cmdPath = path.resolve(modelInfo.path, "cmd/tsp.js"); return { command: "node", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 47d1467efb..4d84583b8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: version: 22.7.9 '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) c8: specifier: ^10.1.2 version: 10.1.2 @@ -67,7 +67,7 @@ importers: version: 56.0.1(eslint@9.15.0(jiti@1.21.6)) eslint-plugin-vitest: specifier: ^0.5.4 - version: 0.5.4(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 0.5.4(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.5) micromatch: specifier: ^4.0.8 version: 4.0.8 @@ -151,7 +151,7 @@ importers: version: link:../compiler '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -200,7 +200,7 @@ importers: version: 7.5.8 '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -258,7 +258,7 @@ importers: version: 17.0.33 '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -346,7 +346,7 @@ importers: version: link:../internal-build-utils '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -398,7 +398,7 @@ importers: version: 8.15.0 '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -434,7 +434,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -504,7 +504,7 @@ importers: version: 4.3.3(vite@5.4.11(@types/node@22.7.9)) '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -549,7 +549,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -598,7 +598,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -712,7 +712,7 @@ importers: version: 17.0.33 '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -755,7 +755,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -788,7 +788,7 @@ importers: version: link:../compiler '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -816,7 +816,7 @@ importers: version: 22.7.9 '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -858,7 +858,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -919,7 +919,7 @@ importers: version: link:../xml '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1161,7 +1161,7 @@ importers: version: 4.3.3(vite@5.4.11(@types/node@22.7.9)) '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1237,7 +1237,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1298,7 +1298,7 @@ importers: version: 4.3.3(vite@5.4.11(@types/node@22.7.9)) '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1343,7 +1343,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1413,7 +1413,7 @@ importers: version: link:../internal-build-utils '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1507,7 +1507,7 @@ importers: version: 17.0.33 '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1729,7 +1729,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1762,7 +1762,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1830,7 +1830,7 @@ importers: version: link:../prettier-plugin-typespec '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1866,10 +1866,6 @@ importers: version: link:../typespec-vscode packages/typespec-vscode: - dependencies: - '@typespec/compiler': - specifier: workspace:~ - version: link:../compiler devDependencies: '@rollup/plugin-commonjs': specifier: ~28.0.0 @@ -1892,12 +1888,15 @@ importers: '@types/vscode': specifier: ~1.94.0 version: 1.94.0 + '@typespec/compiler': + specifier: workspace:~ + version: link:../compiler '@typespec/internal-build-utils': specifier: workspace:~ version: link:../internal-build-utils '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1948,7 +1947,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -1981,7 +1980,7 @@ importers: version: link:../tspd '@vitest/coverage-v8': specifier: ^2.1.5 - version: 2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)) + version: 2.1.5(vitest@2.1.5) '@vitest/ui': specifier: ^2.1.2 version: 2.1.5(vitest@2.1.5) @@ -16378,7 +16377,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.5(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0))': + '@vitest/coverage-v8@2.1.5(vitest@2.1.5)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -18557,7 +18556,7 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-vitest@0.5.4(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.5(@types/node@22.7.9)(@vitest/ui@2.1.5)(happy-dom@15.11.6)(jsdom@19.0.0)): + eslint-plugin-vitest@0.5.4(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.5): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) eslint: 9.15.0(jiti@1.21.6)