From 0a8d477035a38bc224ae5c4a06cd4d81583250da Mon Sep 17 00:00:00 2001 From: Gabriel Terwesten Date: Thu, 15 Sep 2022 17:34:20 +0200 Subject: [PATCH] feat: don't touch `dart.runPubGetOnPubspecChanges` when `usePubspecOverrides` is enabled Also uses the new format for `dart.runPubGetOnPubspecChanges`. Fixes #36 Fixes #37 --- src/settings.ts | 25 ++++++++++++++--- .../default-settings/default-settings.test.ts | 2 +- src/workspace-config.ts | 27 +++++++++++++++++++ 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/settings.ts b/src/settings.ts index 5c2aca6..fe4c60a 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,6 +1,7 @@ import * as vscode from 'vscode' import { error, info } from './logging' import { melosWorkspaces } from './melos-workspace' +import { loadMelosWorkspaceConfig } from './workspace-config' /** * Ensure that Melos workspaces have default VS Code settings. @@ -9,14 +10,16 @@ export async function registerDefaultMelosWorkspaceSettings( context: vscode.ExtensionContext ) { await Promise.all( - melosWorkspaces.workspaceFolders.map(applyDefaultMelosWorkspaceSettings) + melosWorkspaces.workspaceFolders.map((folder) => + applyDefaultMelosWorkspaceSettings(context, folder) + ) ) context.subscriptions.push( melosWorkspaces.onDidChangeWorkspaceFolders(async (event) => { for (const folder of event.added) { try { - await applyDefaultMelosWorkspaceSettings(folder) + await applyDefaultMelosWorkspaceSettings(context, folder) } catch (e) { error( `Failed to apply default Melos workspace settings in '${folder.name}' folder`, @@ -31,13 +34,27 @@ export async function registerDefaultMelosWorkspaceSettings( /** * The default VS Code settings to apply to a Melos workspace. */ -const melosWorkspaceDefaultSettings = { - 'dart.runPubGetOnPubspecChanges': false, +const melosWorkspaceDefaultSettings: { + 'dart.runPubGetOnPubspecChanges'?: string +} = { + 'dart.runPubGetOnPubspecChanges': 'never', } async function applyDefaultMelosWorkspaceSettings( + context: vscode.ExtensionContext, folder: vscode.WorkspaceFolder ) { + const defaultSettings = { ...melosWorkspaceDefaultSettings } + + const melosConfig = await loadMelosWorkspaceConfig(context, folder) + if (melosConfig?.command?.bootstrap?.usePubspecOverrides === true) { + delete defaultSettings['dart.runPubGetOnPubspecChanges'] + } + + if (Object.keys(defaultSettings).length === 0) { + return + } + const settings = vscode.workspace.getConfiguration(undefined, folder) for (const [key, value] of Object.entries(melosWorkspaceDefaultSettings)) { diff --git a/src/test/default-settings/default-settings.test.ts b/src/test/default-settings/default-settings.test.ts index c3c1b71..c999922 100644 --- a/src/test/default-settings/default-settings.test.ts +++ b/src/test/default-settings/default-settings.test.ts @@ -14,7 +14,7 @@ suite('Default settings', () => { await openMelosYamlInEditor() const melosWorkspaceDefaultSettings = { - 'dart.runPubGetOnPubspecChanges': false, + 'dart.runPubGetOnPubspecChanges': 'never', } // Check that all default settings have the correct values. diff --git a/src/workspace-config.ts b/src/workspace-config.ts index e62f615..1da9d2f 100644 --- a/src/workspace-config.ts +++ b/src/workspace-config.ts @@ -21,12 +21,38 @@ export interface MelosWorkspaceConfig { * The YAML document from which the configuration was parsed. */ readonly yamlDoc: Document + + /** + * Configuration for Melos commands. + */ + readonly command?: MelosCommandsConfig + /** * The configured Melos scripts. */ readonly scripts: readonly MelosScriptConfig[] } +/** + * Configuration for Melos commands. + */ +export interface MelosCommandsConfig { + /** + * Configuration for the `melos bootstrap` command. + */ + readonly bootstrap: MelosBootstrapConfig +} + +/** + * Configuration for the `melos bootstrap` command. + */ +export interface MelosBootstrapConfig { + /** + * Whether Melos should use `pubspec_overrides.yaml` files to override dependencies. + */ + readonly usePubspecOverrides?: boolean +} + /** * Configuration for a Melos script. */ @@ -158,6 +184,7 @@ function showInvalidMelosYamlMessage(folder: vscode.WorkspaceFolder) { function melosWorkspaceConfigFromYamlDoc(doc: Document): MelosWorkspaceConfig { return { yamlDoc: doc, + command: doc.toJSON()['command'], scripts: melosScriptsConfigsFromYaml(doc.get('scripts')), } }