diff --git a/CHANGELOG.md b/CHANGELOG.md index 6da5b39..de6a8de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,15 @@ [![Share via Facebook](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Facebook.png)](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded"e=vscode-deploy-reloaded) [![Share via Twitter](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Twitter.png)](https://twitter.com/intent/tweet?source=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&text=vscode-deploy-reloaded:%20https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&via=mjkloubert) [![Share via Google+](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Google+.png)](https://plus.google.com/share?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) [![Share via Pinterest](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Pinterest.png)](https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&media=https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/demo1.gif&description=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.) [![Share via Reddit](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Reddit.png)](https://www.reddit.com/submit?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&title=vscode-deploy-reloaded) [![Share via LinkedIn](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/LinkedIn.png)](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&title=vscode-deploy-reloaded&summary=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.&source=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) [![Share via Wordpress](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Wordpress.png)](https://wordpress.com/press-this.php?u=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded"e=vscode-deploy-reloaded&s=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.&i=https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/demo1.gif) [![Share via Email](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Email.png)](mailto:?subject=vscode-deploy-reloaded&body=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20'vs-deploy'%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.:%20https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) +## 0.31.0 (January 25th, 2018; [Bower](https://bower.io)) + +* added tools for handling [Bower](https://bower.io/) packages: + +![Demo Bower helpers](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/demo18.gif) + +* added `initBower` [setting](https://github.com/mkloubert/vscode-deploy-reloaded/wiki#settings--), which runs `bower install` inside the workspace folder on startup, if a `bower.json` file exists and NO `bower_components` sub folder has been found +* bugfixes + ## 0.30.3 (January 24th, 2018; context menu) * can deploy, pull or delete files and folders from context menu now, s. [issue #15](https://github.com/mkloubert/vscode-deploy-reloaded/issues/15) diff --git a/img/demo18.gif b/img/demo18.gif new file mode 100644 index 0000000..28d7741 Binary files /dev/null and b/img/demo18.gif differ diff --git a/package-lock.json b/package-lock.json index a3841f6..5cddae9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-deploy-reloaded", - "version": "0.30.3", + "version": "0.31.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9f3d0eb..384b72d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-deploy-reloaded", "displayName": "Deploy (Reloaded)", "description": "Deploys files of a workspace to a destination.", - "version": "0.30.3", + "version": "0.31.0", "publisher": "mkloubert", "engines": { "vscode": "^1.19.0" @@ -439,6 +439,11 @@ } ] }, + "initBower": { + "description": "Runs 'bower install' inside the workspace folder on startup, if a 'bower.json' file exists and NO 'bower_components' folder has been found.", + "type": "boolean", + "default": false + }, "initComposer": { "description": "Runs 'composer install' inside the workspace folder on startup, if a 'composer.json' file exists and NO 'vendor' folder has been found.", "type": "boolean", diff --git a/src/contracts.ts b/src/contracts.ts index 08becd8..1f92b77 100644 --- a/src/contracts.ts +++ b/src/contracts.ts @@ -191,6 +191,10 @@ export interface Configuration extends deploy_packages.WithFastFileCheckSettings * A list of imports. */ readonly imports?: ImportType | ImportType[]; + /** + * Runs 'bower install' inside the workspace folder on startup, if a 'bower.json' file exists and NO 'bower_components' folder has been found. + */ + readonly initBower?: boolean; /** * Runs 'composer install' inside the workspace folder on startup, if a 'composer.json' file exists and NO 'vendor' folder has been found. */ diff --git a/src/extension.ts b/src/extension.ts index eec2fbb..13991b4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -33,6 +33,7 @@ import * as deploy_pull from './pull'; import * as deploy_switch from './switch'; import * as deploy_targets from './targets'; import * as deploy_tools from './tools'; +import * as deploy_tools_bower from './tools/bower'; import * as deploy_tools_composer from './tools/composer'; import * as deploy_tools_npm from './tools/npm'; import * as deploy_tools_quick_execution from './tools/quickexecution'; @@ -1282,6 +1283,15 @@ async function activateExtension(context: vscode.ExtensionContext) { label: '$(package) ' + i18.t('tools.composer.label'), description: i18.t('tools.composer.description'), state: 6, + }, + + { + action: async () => { + await deploy_tools_bower.showBowerTools(context); + }, + label: '$(package) ' + i18.t('tools.bower.label'), + description: i18.t('tools.bower.description'), + state: 7, } ]; @@ -1432,6 +1442,7 @@ async function activateExtension(context: vscode.ExtensionContext) { }), vscode.workspace.onDidChangeConfiguration((e) => { + deploy_tools_bower.resetBowerToolsUsage(context); deploy_tools_composer.resetComposerToolsUsage(context); deploy_tools_npm.resetNPMToolsUsage(context); deploy_packages.resetPackageUsage(context); diff --git a/src/i18.ts b/src/i18.ts index 3e74272..8daae4e 100644 --- a/src/i18.ts +++ b/src/i18.ts @@ -469,6 +469,26 @@ export interface Translation { dateTimeWithSeconds?: string; }; tools?: { + bower?: { + description?: string; + executing?: string; + label?: string; + packageExample?: string; + runInstall?: { + description?: string; + enterPackageName?: string; + label?: string; + }; + runUninstall?: { + bowerFileContainsNoPackages?: string; + bowerFileNotFound?: string; + description?: string; + errors?: { + loadingBowerFileFailed?: string; + }; + label?: string; + }; + }; composer?: { description?: string; executing?: string; @@ -485,6 +505,7 @@ export interface Translation { }; runRequire?: { description?: string; + enterPackageName?: string; label?: string; }; }; @@ -614,6 +635,14 @@ export interface Translation { noneFound?: string; selectWorkspace?: string; }; + bower?: { + install?: { + errors?: { + failed?: string; + }; + running?: string; + } + }; composer?: { install?: { errors?: { diff --git a/src/lang/de.ts b/src/lang/de.ts index 73b2719..4eba524 100644 --- a/src/lang/de.ts +++ b/src/lang/de.ts @@ -463,6 +463,26 @@ export const translation: Translation = { dateTimeWithSeconds: "DD.MM.YYYY HH:mm:ss", }, tools: { + bower: { + description: "Werkzeuge für das einfache Arbeiten mit 'bower'", + executing: "Führe{0:trim,surround,leading_space} aus ...", + label: "Bower Paket Manager (bower)", + packageExample: "z.B. 'moment'", + runInstall: { + description: "Führt den Befehl 'bower install' im aktuellen Arbeitsbereich aus", + enterPackageName: "Geben Sie den Namen des Bower-Paketes an ...", + label: "'bower install' ausführen ...", + }, + runUninstall: { + bowerFileContainsNoPackages: "{0:trim,surround,ending_space}beinhaltet keine Pakete!", + bowerFileNotFound: "Es wurde keine 'bower.json'-Datei in{0:trim,surround,leading_space} gefunden!", + description: "Führt den Befehl 'bower uninstall' im aktuellen Arbeitsbereich aus", + errors: { + loadingBowerFileFailed: "Das Laden von{0:trim,surround,leading_space} ist fehlgeschlagen:{1:trim,surround,leading_space}", + }, + label: "'bower uninstall' ausführen ...", + }, + }, composer: { description: "Werkzeuge für das einfache Arbeiten mit 'composer'", executing: "Führe{0:trim,surround,leading_space} aus ...", @@ -471,14 +491,15 @@ export const translation: Translation = { runRemove: { composerFileContainsNoPackages: "{0:trim,surround,ending_space}beinhaltet keine Pakete!", composerFileNotFound: "Es wurde keine 'composer.json'-Datei in{0:trim,surround,leading_space} gefunden!", + description: "Führt den Befehl 'composer remove' im aktuellen Arbeitsbereich aus", errors: { loadingComposerFileFailed: "Das Laden von{0:trim,surround,leading_space} ist fehlgeschlagen:{1:trim,surround,leading_space}", }, - description: "Führt den Befehl 'composer remove' im aktuellen Arbeitsbereich aus", label: "'composer remove' ausführen ...", }, runRequire: { description: "Führt den Befehl 'composer require' im aktuellen Arbeitsbereich aus", + enterPackageName: "Geben Sie den Namen des Composer-Paketes an ...", label: "'composer require' ausführen ...", }, }, @@ -608,6 +629,14 @@ export const translation: Translation = { noneFound: "Keine aktiven Arbeitsbereiche gefunden!", selectWorkspace: "Wählen Sie den aktiven Arbeitsbereich aus ...", }, + bower: { + install: { + errors: { + failed: "'bower install' konnte nicht ausgeführt werden:{0:trim,surround,leading_space}", + }, + running: "Führe 'bower install' in{0:trim,surround,leading_space} aus ...", + } + }, composer: { install: { errors: { diff --git a/src/lang/en.ts b/src/lang/en.ts index d2d0a05..bf3796f 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -464,6 +464,26 @@ export const translation: Translation = { dateTimeWithSeconds: "YYYY-MM-DD HH:mm:ss", }, tools: { + bower: { + description: "Tools for simple use of 'bower'", + executing: "Running{0:trim,surround,leading_space} ...", + label: "Bower Package Manager (bower)", + packageExample: "'moment' e.g.", + runInstall: { + description: "Runs 'bower install' inside the current workspace", + enterPackageName: "Enter the name of the Bower package ...", + label: "Run 'bower install' ...", + }, + runUninstall: { + bowerFileContainsNoPackages: "{0:trim,surround,ending_space}contains no packages!", + bowerFileNotFound: "No 'bower.json' file found in{0:trim,surround,leading_space}!", + description: "Runs 'bower uninstall' inside the current workspace", + errors: { + loadingBowerFileFailed: "Loading{0:trim,surround,leading_space} failed:{1:trim,surround,leading_space}", + }, + label: "Run 'bower uninstall' ...", + }, + }, composer: { description: "Tools for simple use of 'composer'", executing: "Running{0:trim,surround,leading_space} ...", @@ -480,6 +500,7 @@ export const translation: Translation = { }, runRequire: { description: "Runs 'composer require' inside the current workspace", + enterPackageName: "Enter the name of the Composer package ...", label: "Run 'composer require' ...", }, }, @@ -609,6 +630,14 @@ export const translation: Translation = { noneFound: "No active workspaces found!", selectWorkspace: "Select the active workspace ...", }, + bower: { + install: { + errors: { + failed: "'bower install' failed:{0:trim,surround,leading_space}", + }, + running: "Running 'bower install' in{0:trim,surround,leading_space} ...", + } + }, composer: { install: { errors: { diff --git a/src/tools/bower.ts b/src/tools/bower.ts new file mode 100644 index 0000000..e62432c --- /dev/null +++ b/src/tools/bower.ts @@ -0,0 +1,260 @@ +/** + * This file is part of the vscode-deploy-reloaded distribution. + * Copyright (c) Marcel Joachim Kloubert. + * + * vscode-deploy-reloaded is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, version 3. + * + * vscode-deploy-reloaded is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import * as deploy_contracts from '../contracts'; +import * as deploy_gui from '../gui'; +import * as deploy_helpers from '../helpers'; +import * as deploy_log from '../log'; +import * as deploy_workspaces from '../workspaces'; +import * as i18 from '../i18'; +import * as Path from 'path'; +import * as vscode from 'vscode'; + + +interface BowerJsonFile { + dependencies?: { + [ module: string ]: any + }; +} + +const KEY_BOWER_TOOLS_USAGE = 'vscdrLastExecutedBowerToolActions'; +const KEY_LAST_RUN_BOWER_INSTALL_PACKAGE = 'vscdrRunBowerInstallLastModule'; + + +/** + * Resets the bower tool usage statistics. + * + * @param {vscode.ExtensionContext} context The extension context. + */ +export function resetBowerToolsUsage(context: vscode.ExtensionContext) { + context.globalState.update(KEY_BOWER_TOOLS_USAGE, undefined).then(() => { + }, (err) => { + deploy_log.CONSOLE + .trace(err, 'tools.bower.resetBowerToolsUsage()'); + }); +} + + +async function runBowerInstall(ws: deploy_workspaces.Workspace) { + const EXTENSION = ws.context.extension; + + const BOWER_PACKAGE = deploy_helpers.normalizeString( + await vscode.window.showInputBox( + { + placeHolder: ws.t('tools.bower.packageExample'), + prompt: ws.t('tools.bower.runInstall.enterPackageName'), + value: deploy_helpers.normalizeString( + EXTENSION.globalState.get(KEY_LAST_RUN_BOWER_INSTALL_PACKAGE) + ) + } + ), + ); + + if ('' === BOWER_PACKAGE) { + return; + } + + EXTENSION.globalState.update(KEY_LAST_RUN_BOWER_INSTALL_PACKAGE, BOWER_PACKAGE).then(() => { + }, (err) => { + deploy_log.CONSOLE + .trace(err, 'tools.bower.runBowerInstall(1)'); + }); + + const CMD = `bower install --save ${BOWER_PACKAGE}`; + + ws.output.appendLine(''); + ws.output.append( + ws.t('tools.bower.executing', CMD) + ' ' + ); + try { + await ws.exec(CMD); + + ws.output.appendLine( + `[${ws.t('ok')}]` + ); + } + catch (e) { + ws.output.appendLine( + `[${ws.t('error', e)}]` + ); + } +} + +async function runBowerUninstall(ws: deploy_workspaces.Workspace) { + const BOWER_JSON = Path.resolve( + Path.join( + ws.rootPath, 'bower.json', + ) + ); + + if (!(await deploy_helpers.exists(BOWER_JSON))) { + ws.showWarningMessage( + ws.t('tools.bower.runUninstall.bowerFileNotFound', + ws.rootPath), + ); + + return; + } + + let file: BowerJsonFile; + try { + file = JSON.parse( + (await deploy_helpers.readFile(BOWER_JSON)).toString('utf8') + ); + } + catch (e) { + ws.showErrorMessage( + ws.t('tools.bower.runUninstall.errors.loadingBowerFileFailed', + BOWER_JSON, e), + ); + + return; + } + + if (!file) { + file = {}; + } + + const PACKAGES: { + name: string, + version: string, + }[] = []; + + if (file.dependencies) { + for (const D in file.dependencies) { + const PACKAGE_NAME = deploy_helpers.toStringSafe(D).trim(); + if ('' === PACKAGE_NAME) { + continue; + } + + PACKAGES.push({ + name: PACKAGE_NAME, + version: deploy_helpers.toStringSafe(file.dependencies[D]).trim(), + }); + } + } + + const QUICK_PICKS: deploy_contracts.ActionQuickPick[] = PACKAGES.sort((x, y) => { + return deploy_helpers.compareValuesBy(x, y, + p => deploy_helpers.normalizeString(p.name)); + }).map(p => { + return { + action: () => { + return p.name; + }, + + label: p.name, + description: p.version, + detail: BOWER_JSON, + }; + }); + + if (QUICK_PICKS.length < 1) { + ws.showWarningMessage( + ws.t('tools.bower.runUninstall.bowerFileContainsNoPackages', + BOWER_JSON), + ); + + return; + } + + const SELECTED_ITEM = await vscode.window.showQuickPick( + QUICK_PICKS + ); + + if (!SELECTED_ITEM) { + return; + } + + const BOWER_PACKAGE: string = SELECTED_ITEM.action(); + + const CMD = `bower uninstall --save ${BOWER_PACKAGE}`; + + ws.output.appendLine(''); + ws.output.append( + ws.t('tools.bower.executing', CMD) + ' ' + ); + try { + await ws.exec(CMD); + + ws.output.appendLine( + `[${ws.t('ok')}]` + ); + } + catch (e) { + ws.output.appendLine( + `[${ws.t('error', e)}]` + ); + } +} + +/** + * Shows bower tools. + * + * @param {vscode.ExtensionContext} context The extension context. + */ +export async function showBowerTools(context: vscode.ExtensionContext) { + const SELECTED_WORKSPACE = await deploy_workspaces.showWorkspaceQuickPick( + context, + deploy_workspaces.getActiveWorkspaces(), + { + placeHolder: i18.t('workspaces.selectWorkspace') + } + ); + + if (!SELECTED_WORKSPACE) { + return; + } + + const QUICK_PICKS: deploy_contracts.ActionQuickPick[] = [ + { + action: async () => { + await runBowerInstall(SELECTED_WORKSPACE); + }, + + description: SELECTED_WORKSPACE.t('tools.bower.runInstall.description'), + detail: SELECTED_WORKSPACE.rootPath, + label: SELECTED_WORKSPACE.t('tools.bower.runInstall.label'), + + state: 0, + }, + + { + action: async () => { + await runBowerUninstall(SELECTED_WORKSPACE); + }, + + description: SELECTED_WORKSPACE.t('tools.bower.runUninstall.description'), + detail: SELECTED_WORKSPACE.rootPath, + label: SELECTED_WORKSPACE.t('tools.bower.runUninstall.label'), + + state: 1, + }, + ]; + + const SELECTED_ITEM = await vscode.window.showQuickPick( + deploy_gui.sortQuickPicksByUsage( + QUICK_PICKS, + SELECTED_WORKSPACE.context.extension.globalState, + KEY_BOWER_TOOLS_USAGE, + ) + ); + + if (SELECTED_ITEM) { + await SELECTED_ITEM.action(); + } +} diff --git a/src/tools/composer.ts b/src/tools/composer.ts index 0bb8bfd..c55d416 100644 --- a/src/tools/composer.ts +++ b/src/tools/composer.ts @@ -162,8 +162,8 @@ async function runComposerRequire(ws: deploy_workspaces.Workspace) { const COMPOSER_PACKAGE = deploy_helpers.normalizeString( await vscode.window.showInputBox( { - placeHolder: i18.t('tools.composer.packageExample'), - prompt: i18.t('tools.composer.runRequire.enterPackageName'), + placeHolder: ws.t('tools.composer.packageExample'), + prompt: ws.t('tools.composer.runRequire.enterPackageName'), value: deploy_helpers.normalizeString( EXTENSION.globalState.get(KEY_LAST_RUN_COMPOSER_REQUIRE_PACKAGE) ) diff --git a/src/tools/npm.ts b/src/tools/npm.ts index 04ea291..44b3505 100644 --- a/src/tools/npm.ts +++ b/src/tools/npm.ts @@ -55,8 +55,8 @@ async function runNPMInstall(ws: deploy_workspaces.Workspace) { const NPM_MODULE = deploy_helpers.normalizeString( await vscode.window.showInputBox( { - placeHolder: i18.t('tools.npm.moduleExample'), - prompt: i18.t('tools.npm.runInstall.enterModuleName'), + placeHolder: ws.t('tools.npm.moduleExample'), + prompt: ws.t('tools.npm.runInstall.enterModuleName'), value: deploy_helpers.normalizeString( EXTENSION.globalState.get(KEY_LAST_RUN_NPM_INSTALL_MODULE) ) @@ -100,8 +100,8 @@ async function runNPMLink(ws: deploy_workspaces.Workspace) { const NPM_MODULE = deploy_helpers.normalizeString( await vscode.window.showInputBox( { - placeHolder: i18.t('tools.npm.moduleExample'), - prompt: i18.t('tools.npm.runLink.enterModuleName'), + placeHolder: ws.t('tools.npm.moduleExample'), + prompt: ws.t('tools.npm.runLink.enterModuleName'), value: deploy_helpers.normalizeString( EXTENSION.globalState.get(KEY_LAST_RUN_NPM_LINK_MODULE) ) diff --git a/src/workspaces.ts b/src/workspaces.ts index 952f3cf..26d73be 100644 --- a/src/workspaces.ts +++ b/src/workspaces.ts @@ -1642,6 +1642,64 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c return deploy_helpers.cloneObject(this.config.globals); } + private async initBower(cfg: WorkspaceSettings) { + if (!cfg) { + return; + } + + if (!deploy_helpers.toBooleanSafe(cfg.initBower)) { + return; + } + + const ME = this; + + try { + const BOWER_JSON = Path.resolve( + Path.join( + ME.rootPath, 'bower.json', + ) + ); + + const BOWER_COMPONENTS = Path.resolve( + Path.join( + ME.rootPath, 'bower_components', + ) + ); + + if (!(await deploy_helpers.exists(BOWER_JSON))) { + return; // no 'bower.json' + } + + if (await deploy_helpers.exists(BOWER_COMPONENTS)) { + return; // 'bower_components' already exist + } + + ME.output.appendLine(''); + ME.output.append( + ME.t('workspaces.bower.install.running', + ME.rootPath) + ' ' + ); + try { + await ME.exec('bower install'); + + ME.output.appendLine( + `[${ME.t('ok')}]` + ); + } + catch (e) { + ME.output.appendLine( + `[${ME.t('error', e)}]` + ); + } + } + catch (e) { + ME.showErrorMessage( + ME.t('workspaces.bower.install.errors.failed', + e) + ); + } + } + private async initComposer(cfg: WorkspaceSettings) { if (!cfg) { return; @@ -2657,6 +2715,7 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c finalizer = async () => { await ME.executeOnStartup(loadedCfg); await ME.initNodeModules(loadedCfg); + await ME.initBower(loadedCfg); await ME.initComposer(loadedCfg); // runBuildTaskOnStartup