diff --git a/packages/vscode-extension/CHANGELOG.md b/packages/vscode-extension/CHANGELOG.md index e16d2d8..0ab7bdc 100644 --- a/packages/vscode-extension/CHANGELOG.md +++ b/packages/vscode-extension/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.13.0 + +- Added a new command that will generate local `yaml.schemas` settings. + ## 0.12.0 - Requires VS Code ^1.77.0. diff --git a/packages/vscode-extension/package.json b/packages/vscode-extension/package.json index a8bc8d6..a9ef14d 100644 --- a/packages/vscode-extension/package.json +++ b/packages/vscode-extension/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "0.12.1", + "version": "0.13.0", "name": "moon-console", "publisher": "moonrepo", "displayName": "moon console", @@ -104,6 +104,10 @@ "command": "moon.openSettings", "title": "moon: Open settings" }, + { + "command": "moon.appendSchemasConfig", + "title": "moon: Append YAML schemas configuration to settings" + }, { "command": "moon.runTaskByInput", "title": "moon: Run one or many tasks" diff --git a/packages/vscode-extension/src/commands.ts b/packages/vscode-extension/src/commands.ts index 813173e..820f35d 100644 --- a/packages/vscode-extension/src/commands.ts +++ b/packages/vscode-extension/src/commands.ts @@ -1,3 +1,6 @@ +import fs from 'fs'; +import path from 'path'; +import { satisfies } from 'semver'; import vscode, { ShellExecution, Task, TaskScope } from 'vscode'; import { GraphVisualizerView } from './graphVisualizerView'; import type { Workspace } from './workspace'; @@ -90,3 +93,49 @@ export async function viewActionGraph(context: vscode.ExtensionContext, workspac export async function viewProjectGraph(context: vscode.ExtensionContext, workspace: Workspace) { await new GraphVisualizerView(context, workspace, 'project-graph').renderPanel(); } + +export async function appendSchemasConfig(context: vscode.ExtensionContext, workspace: Workspace) { + const version = await workspace.getMoonVersion(); + + if (satisfies(version, '<1.27.0')) { + await vscode.window.showErrorMessage('YAML schemas require moon >= 1.27.0'); + + return; + } + + const vscodeDir = path.join(workspace.folder!.uri.fsPath, '.vscode'); + const settingsPath = path.join(vscodeDir, 'settings.json'); + + const settings = ( + fs.existsSync(settingsPath) ? JSON.parse(fs.readFileSync(settingsPath, 'utf8')) : {} + ) as Record; + + const schemas = + typeof settings['yaml.schemas'] === 'object' && !!settings['yaml.schemas'] + ? settings['yaml.schemas'] + : {}; + + settings['yaml.schemas'] = { + ...schemas, + './.moon/cache/schemas/project.json': ['**/moon.yml'], + './.moon/cache/schemas/tasks.json': [ + path.join(workspace.rootPrefix, '.moon/tasks.yml'), + path.join(workspace.rootPrefix, '.moon/tasks/**/*.yml'), + ], + './.moon/cache/schemas/template.json': ['**/template.yml'], + './.moon/cache/schemas/toolchain.json': [ + path.join(workspace.rootPrefix, '.moon/toolchain.yml'), + ], + './.moon/cache/schemas/workspace.json': [ + path.join(workspace.rootPrefix, '.moon/workspace.yml'), + ], + }; + + if (!fs.existsSync(vscodeDir)) { + fs.mkdirSync(vscodeDir); + } + + fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2)); + + await vscode.window.showInformationMessage('Added `yaml.schemas` to `.vscode/settings.json`'); +} diff --git a/packages/vscode-extension/src/extension.ts b/packages/vscode-extension/src/extension.ts index 50231fb..02d6ce6 100644 --- a/packages/vscode-extension/src/extension.ts +++ b/packages/vscode-extension/src/extension.ts @@ -1,5 +1,5 @@ import vscode from 'vscode'; -import { runTaskByInput, viewActionGraph, viewProjectGraph } from './commands'; +import { appendSchemasConfig, runTaskByInput, viewActionGraph, viewProjectGraph } from './commands'; import { LastRunProvider } from './lastRunView'; import { ProjectsProvider } from './projectsView'; import { Workspace } from './workspace'; @@ -22,6 +22,9 @@ export function activate(context: vscode.ExtensionContext) { vscode.commands.registerCommand('moon.viewProjectGraph', () => viewProjectGraph(context, workspace), ), + vscode.commands.registerCommand('moon.appendSchemasConfig', () => + appendSchemasConfig(context, workspace), + ), // Create a tree view for all moon projects vscode.window.createTreeView('moonProjects', {