From ba3c6e7c271e872535d58c278c4dc03dd04d5125 Mon Sep 17 00:00:00 2001 From: Wes Date: Thu, 18 Apr 2024 08:11:08 -0700 Subject: [PATCH] fix: add startup prompt to extension (#1301) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1275 Fixes #1284 ![Screenshot 2024-04-18 at 7 24 14 AM](https://github.com/TBD54566975/ftl/assets/51647/8ba046e8-f2ac-448d-a2dd-c006b9b2386d) Also updated our icon ![Screenshot 2024-04-18 at 8 03 43 AM](https://github.com/TBD54566975/ftl/assets/51647/20ce9c36-776e-4391-a5d8-4503c4082a4e) --- extensions/vscode/README.md | 41 +++++++----- extensions/vscode/images/icon.png | Bin 0 -> 30115 bytes extensions/vscode/package-lock.json | 4 +- extensions/vscode/package.json | 12 +++- extensions/vscode/src/extension.ts | 96 +++++++++++++++++++--------- 5 files changed, 105 insertions(+), 48 deletions(-) create mode 100644 extensions/vscode/images/icon.png diff --git a/extensions/vscode/README.md b/extensions/vscode/README.md index 46d4ea4dc7..f247686e62 100644 --- a/extensions/vscode/README.md +++ b/extensions/vscode/README.md @@ -16,25 +16,34 @@ provides support for 3. Open any FTL project with a `ftl-project.toml` or `ftl.toml` file. -4. The extension will automatically activate and provide support for FTL projects. +4. The extension will prompt to start the FTL development server. -> [!IMPORTANT] -> If you have installed FTL with hermit (or other dependency management tools), you may need to specify the path to the FTL binary in the extension settings. +## Settings -Example: +Configure the FTL extension by setting the following options in your Visual Studio Code settings.json: -```json -{ - "ftl.executablePath": "bin/ftl" -} -``` +- `ftl.executablePath`: Specifies the path to the FTL executable. The default is "ftl", which uses the system's PATH to find the executable. -You can also configure additional command line arguments for the FTL binary in the settings. + > [!IMPORTANT] + > If you have installed FTL with hermit (or other dependency management tools), you may need to specify the path to the FTL binary in the extension settings. -Example: + ```json + { + "ftl.executablePath": "bin/ftl"` + } + ``` -```json -{ - "ftl.devCommandFlags": ["--recreate", "--parallelism=4"] -} -``` +- `ftl.devCommandFlags`: Defines flags to pass to the FTL executable when starting the development environment. The default is ["--recreate"]. + + ```json + { + "ftl.devCommandFlags": ["--recreate", "--parallelism=4"] + } + ``` + +- `ftl.startClientOption`: Controls if and when to automatically start the FTL development server. Available options are "always" and "never". If not set, the extension will prompt to start the server when opening a FTL project. + ```json + { + "ftl.startClientOption": "always" + } + ``` diff --git a/extensions/vscode/images/icon.png b/extensions/vscode/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9b140a44c6023f920bfbf7142ad2bb811aa03561 GIT binary patch literal 30115 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 literal 0 HcmV?d00001 diff --git a/extensions/vscode/package-lock.json b/extensions/vscode/package-lock.json index c3575c34cd..2afeb54ded 100644 --- a/extensions/vscode/package-lock.json +++ b/extensions/vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "ftl", - "version": "0.0.3", + "version": "0.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ftl", - "version": "0.0.3", + "version": "0.0.5", "dependencies": { "semver": "^7.6.0", "vscode-languageclient": "^9.0.1" diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index f55978a299..60b9588341 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -3,7 +3,8 @@ "displayName": "FTL", "publisher": "ftl", "description": "VSCode extension for FTL", - "version": "0.0.3", + "icon": "images/icon.png", + "version": "0.0.5", "repository": { "type": "git", "url": "https://github.com/TBD54566975/ftl-vscode" @@ -36,6 +37,15 @@ "type": "string" }, "description": "Flags to pass to the FTL executable when starting ftl dev" + }, + "ftl.startClientOption": { + "type": "string", + "enum": [ + "always", + "never" + ], + "default": null, + "description": "Control if and when to automatically start the FTL client." } } }, diff --git a/extensions/vscode/src/extension.ts b/extensions/vscode/src/extension.ts index ee7ea46f6c..0a2b012a73 100644 --- a/extensions/vscode/src/extension.ts +++ b/extensions/vscode/src/extension.ts @@ -61,7 +61,7 @@ export async function activate(context: ExtensionContext) { statusBarItem.command = "ftl.statusItemClicked" statusBarItem.show() - await startClient(context) + await promptStartClient(context) context.subscriptions.push( restartCmd, @@ -76,6 +76,71 @@ export async function deactivate() { await stopClient() } +async function FTLPreflightCheck(ftlPath: string) { + const ftlRunning = await isFTLRunning(ftlPath) + if (ftlRunning) { + vscode.window.showErrorMessage( + "FTL is already running. Please stop the other instance and restart the service." + ) + return false + } + + let version: string + try { + version = await getFTLVersion(ftlPath) + } catch (error: any) { + vscode.window.showErrorMessage(`${error.message}`) + return false + } + + const versionOK = checkMinimumVersion(version, MIN_FTL_VERSION) + if (!versionOK) { + vscode.window.showErrorMessage( + `FTL version ${version} is not supported. Please upgrade to at least ${MIN_FTL_VERSION}.` + ) + return false + } + + return true +} + +async function promptStartClient(context: vscode.ExtensionContext): Promise { + const configuration = vscode.workspace.getConfiguration('ftl') + const startClientOption = configuration.get('startClientOption') + + if (startClientOption === 'always') { + await startClient(context) + return + } else if (startClientOption === 'never') { + FTLStatus.disabled(statusBarItem) + return + } + + + const options = ['Always', 'Yes', 'No', 'Never'] + const result = await vscode.window.showInformationMessage( + 'FTL project detected. Would you like to start the FTL development server?', + ...options + ) + + switch (result) { + case 'Always': + configuration.update('startClientOption', 'always', vscode.ConfigurationTarget.Global) + await startClient(context) + break + case 'Yes': + await startClient(context) + break + case 'No': + FTLStatus.disabled(statusBarItem) + break + case 'Never': + configuration.update('startClientOption', 'never', vscode.ConfigurationTarget.Global) + FTLStatus.disabled(statusBarItem) + break + } +} + async function startClient(context: ExtensionContext) { console.log("Starting client") @@ -150,6 +215,7 @@ async function stopClient() { } console.log("Disposing client") + client.diagnostics?.clear() if (client["_serverProcess"]) { process.kill(client["_serverProcess"].pid, "SIGINT") } @@ -162,31 +228,3 @@ async function stopClient() { console.log("Output channel disposed") FTLStatus.stopped(statusBarItem) } - -async function FTLPreflightCheck(ftlPath: string) { - const ftlRunning = await isFTLRunning(ftlPath) - if (ftlRunning) { - vscode.window.showErrorMessage( - "FTL is already running. Please stop the other instance and restart the service." - ) - return false - } - - let version: string - try { - version = await getFTLVersion(ftlPath) - } catch (error: any) { - vscode.window.showErrorMessage(`${error.message}`) - return false - } - - const versionOK = checkMinimumVersion(version, MIN_FTL_VERSION) - if (!versionOK) { - vscode.window.showErrorMessage( - `FTL version ${version} is not supported. Please upgrade to at least ${MIN_FTL_VERSION}.` - ) - return false - } - - return true -}