From 22063e48780de898e11ab4df81cdb70bf701e842 Mon Sep 17 00:00:00 2001 From: Roman Nikitenko Date: Mon, 11 May 2020 22:59:49 +0300 Subject: [PATCH 1/6] Separate creating task terminal and running process logic Signed-off-by: Roman Nikitenko --- .../src/browser/che-frontend-module.ts | 7 +- .../che-task-terminal-widget-manager.ts | 70 +++++++++++++++++ .../src/browser/task-config-service.ts | 78 ++++++++++++++----- .../task-plugin/src/task/che-task-runner.ts | 29 ++++--- yarn.lock | 39 ++-------- 5 files changed, 156 insertions(+), 67 deletions(-) create mode 100644 extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-terminal-widget-manager.ts diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/che-frontend-module.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-frontend-module.ts index b670a9149..6b5f891c6 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/browser/che-frontend-module.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-frontend-module.ts @@ -50,6 +50,8 @@ import { PluginFrontendViewContribution } from '@theia/plugin-ext/lib/main/brows import { OauthUtils } from './oauth-utils'; import { TaskService } from '@theia/task/lib/browser'; import { TaskConfigurationsService } from './task-config-service'; +import { CheTaskTerminalWidgetManager } from './che-task-terminal-widget-manager'; +import { TaskTerminalWidgetManager } from '@theia/task/lib/browser/task-terminal-widget-manager'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(CheApiProvider).toSelf().inSingletonScope(); @@ -111,5 +113,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(OauthUtils).toSelf().inSingletonScope(); bind(TaskConfigurationsService).toSelf().inSingletonScope(); - rebind(TaskService).to(TaskConfigurationsService).inSingletonScope(); + rebind(TaskService).toService(TaskConfigurationsService); + + bind(CheTaskTerminalWidgetManager).toSelf().inSingletonScope(); + rebind(TaskTerminalWidgetManager).toService(CheTaskTerminalWidgetManager); }); diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-terminal-widget-manager.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-terminal-widget-manager.ts new file mode 100644 index 000000000..3d08f660d --- /dev/null +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-terminal-widget-manager.ts @@ -0,0 +1,70 @@ +/********************************************************************* + * Copyright (c) 2020 Red Hat, Inc. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ + +import { TaskTerminalWidgetManager, TaskTerminalWidgetOpenerOptions } from '@theia/task/lib/browser/task-terminal-widget-manager'; +import { TerminalWidget, TerminalWidgetOptions } from '@theia/terminal/lib/browser/base/terminal-widget'; +import { TerminalWidgetFactoryOptions } from '@theia/terminal/lib/browser/terminal-widget-impl'; +import { injectable } from 'inversify'; + +export const CHE_TASK_TYPE: string = 'che'; +export const TASK_KIND: string = 'task'; +export const REMOTE_TASK_KIND: string = 'remote-task'; + +export interface RemoteTaskTerminalWidget extends TerminalWidget { + readonly kind: 'remote-task'; +} +export namespace RemoteTaskTerminalWidget { + export function is(widget: TerminalWidget): widget is RemoteTaskTerminalWidget { + return widget.kind === REMOTE_TASK_KIND; + } +} + +export namespace RemoteTerminalOptions { + export function isRemoteTerminal(options: TerminalWidgetOptions): boolean { + const attributes = options.attributes; + if (!attributes) { + return false; + } + + const containerName = attributes['CHE_MACHINE_NAME']; + if (containerName) { + return true; + } + + const isRemoteValue = attributes['remote']; + if (isRemoteValue) { + return isRemoteValue.toLowerCase() === 'true' ? true : false; + } + return false; + } +} + +@injectable() +export class CheTaskTerminalWidgetManager extends TaskTerminalWidgetManager { + + async newTaskTerminal(factoryOptions: TerminalWidgetFactoryOptions): Promise { + const attributes = factoryOptions.attributes || {}; + if (!RemoteTerminalOptions.isRemoteTerminal(factoryOptions)) { + attributes['remote'] = 'false'; + } + + return this.terminalService.newTerminal({ ...factoryOptions, attributes }); + } + + async open(factoryOptions: TerminalWidgetFactoryOptions, openerOptions: TaskTerminalWidgetOpenerOptions): Promise { + if (RemoteTerminalOptions.isRemoteTerminal(factoryOptions)) { + const terminal = await this.newTaskTerminal(factoryOptions); + this.terminalService.open(terminal, openerOptions); + return terminal; + } + + return super.open(factoryOptions, openerOptions); + } +} diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts index 2f9765287..4981d435e 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts @@ -11,63 +11,105 @@ import { WidgetOpenMode } from '@theia/core/lib/browser'; import { TaskService } from '@theia/task/lib/browser'; import { TaskTerminalWidgetOpenerOptions } from '@theia/task/lib/browser/task-terminal-widget-manager'; -import { TaskInfo, TaskOutputPresentation, TaskConfiguration } from '@theia/task/lib/common'; +import { RunTaskOption, TaskConfiguration, TaskInfo, TaskOutputPresentation } from '@theia/task/lib/common'; import { TerminalWidgetFactoryOptions } from '@theia/terminal/lib/browser/terminal-widget-impl'; +import { injectable } from 'inversify'; +import { CHE_TASK_TYPE, REMOTE_TASK_KIND, TASK_KIND } from './che-task-terminal-widget-manager'; +@injectable() export class TaskConfigurationsService extends TaskService { + protected async runResolvedTask(resolvedTask: TaskConfiguration, option?: RunTaskOption): Promise { + const source = resolvedTask._source; + const taskLabel = resolvedTask.label; + + const terminal = await this.taskTerminalWidgetManager.open(this.getFactoryOptions(resolvedTask), this.getOpenerOptions(resolvedTask)); + + try { + const taskInfo = await this.taskServer.run(resolvedTask, this.getContext(), option); + terminal.start(taskInfo.terminalId); + + this.lastTask = { source, taskLabel, scope: resolvedTask._scope }; + + this.logger.debug(`Task created. Task id: ${taskInfo.taskId}`); + + return taskInfo; + } catch (error) { + const errorMessage = `Error launching task '${taskLabel}': ${error.message}`; + terminal.writeLine(`\x1b[31m ${errorMessage} \x1b[0m\n`); + + console.error(errorMessage, error); + this.messageService.error(errorMessage); + + return undefined; + } + } + async attach(terminalId: number, taskId: number): Promise { const runningTasks = await this.getRunningTasks(); + const taskInfo = runningTasks.find((t: TaskInfo) => t.taskId === taskId); if (taskInfo) { - const terminalWidget = this.terminalService.getByTerminalId(terminalId); + const kind = this.isRemoteTask(taskInfo.config) ? REMOTE_TASK_KIND : TASK_KIND; + const terminalWidget = this.terminalService.all.find(terminal => terminal.kind === kind && terminal.terminalId === terminalId); if (terminalWidget) { // Task is already running in terminal return this.terminalService.open(terminalWidget, { mode: 'activate' }); } } + const taskConfig = taskInfo ? taskInfo.config : undefined; const widget = await this.taskTerminalWidgetManager.open( - this.getFactoryOptions(taskId, terminalId, taskInfo), - this.getOpenerOptions(taskId, taskInfo)); + this.getFactoryOptions(taskConfig), + this.getOpenerOptions(taskConfig)); widget.start(terminalId); } - protected getFactoryOptions(taskId: number, terminalId: number, taskInfo?: TaskInfo): TerminalWidgetFactoryOptions { + protected getFactoryOptions(config?: TaskConfiguration): TerminalWidgetFactoryOptions { + const isRemote = config ? this.isRemoteTask(config) : false; + return { - id: this.getTerminalWidgetId(terminalId), - title: taskInfo - ? `Task: ${taskInfo.config.label}` - : `Task: #${taskId}`, + kind: isRemote ? REMOTE_TASK_KIND : TASK_KIND, + title: isRemote && config ? config.label : config ? `Task: ${config.label}` : 'Task', created: new Date().toString(), destroyTermOnClose: true, attributes: { - 'remote': taskInfo && this.isRemoteTask(taskInfo.config) ? 'true' : 'false' + 'remote': isRemote ? 'true' : 'false', + 'closeWidgetExitOrError': 'false', + 'interruptProcessOnClose': 'true', + 'CHE_MACHINE_NAME': isRemote ? this.getContainerName(config) || '' : '' } }; } - protected getOpenerOptions(taskId: number, taskInfo?: TaskInfo): TaskTerminalWidgetOpenerOptions { + protected getOpenerOptions(taskConfig?: TaskConfiguration): TaskTerminalWidgetOpenerOptions { return { - taskId, widgetOptions: { area: 'bottom' }, - mode: this.getWidgetOpenMode(taskInfo), - taskInfo + mode: this.getWidgetOpenMode(taskConfig), + taskConfig }; } - protected getWidgetOpenMode(taskInfo?: TaskInfo): WidgetOpenMode { - if (!taskInfo || !TaskOutputPresentation.shouldAlwaysRevealTerminal(taskInfo.config)) { + protected getWidgetOpenMode(config?: TaskConfiguration): WidgetOpenMode { + if (!config || !TaskOutputPresentation.shouldAlwaysRevealTerminal(config)) { return 'open'; } - if (TaskOutputPresentation.shouldSetFocusToTerminal(taskInfo.config)) { + if (TaskOutputPresentation.shouldSetFocusToTerminal(config)) { return 'activate'; } return 'reveal'; } + protected getContainerName(config?: TaskConfiguration): string | undefined { + if (config && config.target && config.target.containerName) { + return config.target.containerName; + } + return undefined; + } + protected isRemoteTask(task: TaskConfiguration): boolean { - return task.target && task.target.containerName; + const target = task.target; + return target && target.containerName || (target && target.component) || task.type === CHE_TASK_TYPE; // unresolved task doesn't have 'containerName' } } diff --git a/plugins/task-plugin/src/task/che-task-runner.ts b/plugins/task-plugin/src/task/che-task-runner.ts index 75f5231a8..353f63629 100644 --- a/plugins/task-plugin/src/task/che-task-runner.ts +++ b/plugins/task-plugin/src/task/che-task-runner.ts @@ -11,7 +11,7 @@ import { injectable, inject, postConstruct } from 'inversify'; import * as che from '@eclipse-che/plugin'; import { CHE_TASK_TYPE, Target } from './task-protocol'; -import { MachineExecClient } from '../machine/machine-exec-client'; +import { MachineExecClient, MachineExec } from '../machine/machine-exec-client'; import { ProjectPathVariableResolver } from '../variable/project-path-variable-resolver'; import { MachineExecWatcher } from '../machine/machine-exec-watcher'; import * as startPoint from '../task-plugin-backend'; @@ -61,27 +61,24 @@ export class CheTaskRunner { } try { - const terminalOptions: theia.TerminalOptions = { - cwd: target.workingDir, - name: taskConfig.label, - shellPath: 'sh', - shellArgs: ['-c', `${taskConfig.command}`], - - attributes: { - CHE_MACHINE_NAME: containerName, - closeWidgetExitOrError: 'false', - interruptProcessOnClose: 'true' - } + const machineExec: MachineExec = { + identifier: { + machineName: containerName, + workspaceId: target.workspaceId || '' + }, + cmd: ['sh', '-c', taskConfig.command], + tty: true, + cwd: target.workingDir }; - const terminal = theia.window.createTerminal(terminalOptions); - terminal.show(); - const execId = await terminal.processId; + + const execId = await this.machineExecClient.getExecId(machineExec); return { taskId: STUB_TASK_ID, ctx: ctx, config: taskConfig, - execId: execId + execId: execId, + terminalId: execId }; } catch (error) { console.error('Failed to execute Che command:', error); diff --git a/yarn.lock b/yarn.lock index 53d232683..df851fd69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4594,7 +4594,7 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.6: +debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -4821,7 +4821,7 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= -detect-libc@^1.0.2, detect-libc@^1.0.3: +detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= @@ -6677,7 +6677,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -9297,15 +9297,6 @@ ncp@~2.0.0: resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= -needle@^2.2.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.1.tgz#14af48732463d7475696f937626b1b993247a56a" - integrity sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -9432,22 +9423,6 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - noop-logger@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" @@ -9531,7 +9506,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.6, npm-packlist@^1.4.4: +npm-packlist@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== @@ -9570,7 +9545,7 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2: +npmlog@^4.0.1, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -10528,7 +10503,7 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.1.6, rc@^1.2.7: +rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -11951,7 +11926,7 @@ tar-stream@^1.1.2, tar-stream@^1.5.0, tar-stream@^1.5.2: to-buffer "^1.1.1" xtend "^4.0.0" -tar@^4.0.0, tar@^4.4.10, tar@^4.4.12, tar@^4.4.2, tar@^4.4.8: +tar@^4.0.0, tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== From 8872f4dfdb28a12e886f40ffa9bbd51132493b70 Mon Sep 17 00:00:00 2001 From: Roman Nikitenko Date: Mon, 11 May 2020 23:39:07 +0300 Subject: [PATCH 2/6] Reduce delay at resolving task Signed-off-by: Roman Nikitenko --- .../src/browser/che-frontend-module.ts | 5 + .../src/browser/che-task-resolver.ts | 154 ++++++++++++++++ .../src/browser/container-picker.ts | 171 ++++++++++++++++++ .../src/browser/task-config-service.ts | 6 +- .../task-plugin/src/task-plugin-backend.ts | 5 - 5 files changed, 335 insertions(+), 6 deletions(-) create mode 100644 extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-resolver.ts create mode 100644 extensions/eclipse-che-theia-plugin-ext/src/browser/container-picker.ts diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/che-frontend-module.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-frontend-module.ts index 6b5f891c6..d5ca2ac8d 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/browser/che-frontend-module.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-frontend-module.ts @@ -50,8 +50,10 @@ import { PluginFrontendViewContribution } from '@theia/plugin-ext/lib/main/brows import { OauthUtils } from './oauth-utils'; import { TaskService } from '@theia/task/lib/browser'; import { TaskConfigurationsService } from './task-config-service'; +import { CheTaskResolver } from './che-task-resolver'; import { CheTaskTerminalWidgetManager } from './che-task-terminal-widget-manager'; import { TaskTerminalWidgetManager } from '@theia/task/lib/browser/task-terminal-widget-manager'; +import { ContainerPicker } from './container-picker'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(CheApiProvider).toSelf().inSingletonScope(); @@ -115,6 +117,9 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(TaskConfigurationsService).toSelf().inSingletonScope(); rebind(TaskService).toService(TaskConfigurationsService); + bind(CheTaskResolver).toSelf().inSingletonScope(); + bind(ContainerPicker).toSelf().inSingletonScope(); + bind(CheTaskTerminalWidgetManager).toSelf().inSingletonScope(); rebind(TaskTerminalWidgetManager).toService(CheTaskTerminalWidgetManager); }); diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-resolver.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-resolver.ts new file mode 100644 index 000000000..d94a19722 --- /dev/null +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-resolver.ts @@ -0,0 +1,154 @@ +/********************************************************************* + * Copyright (c) 2020 Red Hat, Inc. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ +import { che as cheApi } from '@eclipse-che/api'; +import { TaskResolver, TaskResolverRegistry } from '@theia/task/lib/browser'; +import { TaskConfiguration } from '@theia/task/lib/common'; +import { VariableResolverService } from '@theia/variable-resolver/lib/browser'; +import { inject, injectable, postConstruct } from 'inversify'; +import { CheApiService } from '../common/che-protocol'; +import { ContainerPicker } from './container-picker'; + +const COMPONENT_ATTRIBUTE: string = 'component'; + +@injectable() +export class CheTaskResolver implements TaskResolver { + + @inject(CheApiService) + protected readonly cheApi: CheApiService; + + @inject(VariableResolverService) + protected readonly variableResolverService: VariableResolverService; + + @inject(ContainerPicker) + protected readonly containerPicker: ContainerPicker; + + @inject(TaskResolverRegistry) + protected readonly taskResolverRegistry: TaskResolverRegistry; + + private workspaceId: string | undefined; + private containers: { name: string, container: cheApi.workspace.Machine }[] = []; + + @postConstruct() + protected init(): void { + this.taskResolverRegistry.register('che', this); + + this.getWorkspaceId(); + this.getWorkspaceContainers(); + } + + async resolveTask(taskConfig: TaskConfiguration): Promise { + const taskType = taskConfig.type; + if (taskType !== 'che') { + throw new Error(`Unsupported task type: ${taskType}`); + } + + const target = taskConfig.target; + const resultTarget: { [key: string]: string | undefined } = {}; + + resultTarget.workspaceId = target && target.workspaceId ? target.workspaceId : await this.getWorkspaceId(); + resultTarget.containerName = await this.getContainerName(target); + + if (target && target.workingDir) { + resultTarget.workingDir = await this.variableResolverService.resolve(target.workingDir); + } + + let commandLine = undefined; + const command = taskConfig.command; + if (command) { + commandLine = await this.variableResolverService.resolve(command) || command; + } + + return { ...taskConfig, command: commandLine, target: resultTarget }; + } + + private async getContainerName(target?: { containerName?: string, component?: string }): Promise { + if (!target) { + return this.containerPicker.pick(); + } + + const containers = await this.getWorkspaceContainers(); + + const containerName = target && target.containerName; + if (containerName && containers.find(container => container.name === containerName)) { + return containerName; + } + + return await this.getContainerNameByComponent(target && target.component) || this.containerPicker.pick(); + } + + private async getContainerNameByComponent(targetComponent: string | undefined): Promise { + if (!targetComponent) { + return undefined; + } + + const containers = await this.getWorkspaceContainers(); + const names = []; + for (const containerEntity of containers) { + const container = containerEntity.container; + const component = getAttribute(COMPONENT_ATTRIBUTE, container.attributes); + if (component && component === targetComponent) { + names.push(containerEntity.name); + } + } + + if (names.length === 1) { + return names[0]; + } + + if (names.length > 1) { + return this.containerPicker.pick(names); + } + return undefined; + } + + private async getWorkspaceId(): Promise { + if (this.workspaceId) { + return this.workspaceId; + } + + this.workspaceId = await this.cheApi.getCurrentWorkspaceId(); + return this.workspaceId; + } + + private async getWorkspaceContainers(): Promise<{ name: string, container: cheApi.workspace.Machine }[]> { + if (this.containers.length > 0) { + return this.containers; + } + + this.containers = []; + try { + const containersList = await this.cheApi.getCurrentWorkspacesContainers(); + for (const containerName in containersList) { + if (!containersList.hasOwnProperty(containerName)) { + continue; + } + const container = { name: containerName, container: containersList[containerName] }; + this.containers.push(container); + } + } catch (e) { + throw new Error('Unable to get list workspace containers. Cause: ' + e); + } + + return this.containers; + } +} + +export function getAttribute(attributeName: string, attributes?: { [key: string]: string; }): string | undefined { + if (!attributes) { + return undefined; + } + + for (const attribute in attributes) { + if (attribute === attributeName) { + return attributes[attribute]; + } + } + return undefined; +} diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/container-picker.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/container-picker.ts new file mode 100644 index 000000000..8b8c704a9 --- /dev/null +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/container-picker.ts @@ -0,0 +1,171 @@ +/********************************************************************* + * Copyright (c) 2020 Red Hat, Inc. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ +import { che as cheApi } from '@eclipse-che/api'; +import { QuickOpenHandler } from '@theia/core/lib/browser/quick-open'; +import { QuickOpenOptions, QuickOpenService } from '@theia/core/lib/browser/quick-open/quick-open-service'; +import { QuickOpenGroupItem, QuickOpenItem, QuickOpenMode, QuickOpenModel } from '@theia/core/lib/common/quick-open-model'; +import { inject, injectable } from 'inversify'; +import { CheApiService } from '../common/che-protocol'; + +const CONTAINERS_PLACE_HOLDER = 'Pick a container to run the task'; +const RECIPE_CONTAINER_SOURCE = 'recipe'; +const CONTAINER_SOURCE_ATTRIBUTE = 'source'; + +@injectable() +export class ContainerPicker implements QuickOpenHandler, QuickOpenModel { + prefix: string = 'container '; + description: string = 'Pick a container name.'; + + @inject(CheApiService) + protected readonly cheApi: CheApiService; + + @inject(QuickOpenService) + protected readonly quickOpenService: QuickOpenService; + + private containers: { name: string, container: cheApi.workspace.Machine }[] = []; + protected items: QuickOpenGroupItem[]; + + /** + * Returns a container name if there's just one container in the current workspace. + * Shows a quick open widget and allows to pick a container if there are several ones. + * @param containerNames containers for displaying in quick open widget, + * all containers of the current workspace will be displayed if the optional parameter is absent + */ + + async pick(containerNames?: string[]): Promise { + this.items = []; + + if (!containerNames || containerNames.length < 1) { + return this.pickContainers(); + } + + if (containerNames.length === 1) { + return containerNames[0]; + } + + return new Promise(resolve => { + this.items.push(...containerNames.map(containerName => + new QuickOpenGroupItem({ + label: containerName, + showBorder: false, + run(mode: QuickOpenMode): boolean { + if (mode !== QuickOpenMode.OPEN) { + return false; + } + resolve(containerName); + return true; + } + }) + )); + + this.quickOpenService.open(this, this.getOptions()); + }); + } + + protected async pickContainers(): Promise { + this.items = []; + + const containers = await this.getWorkspaceContainers(); + if (containers.length === 1) { + return containers[0].name; + } + + return new Promise(resolve => { + this.items = this.toQuickPickItems(containers, container => { + resolve(container); + }); + this.quickOpenService.open(this, this.getOptions()); + }); + } + + private toQuickPickItems(containers: { name: string, container: cheApi.workspace.Machine }[], handler: { (containerName: string): void }): QuickOpenGroupItem[] { + const items: QuickOpenGroupItem[] = []; + + const devContainers = containers.filter(container => this.isDevContainer(container)); + const toolingContainers = containers.filter(container => !this.isDevContainer(container)); + + items.push(...devContainers.map((container, index) => + new QuickOpenGroupItem({ + label: container.name, + groupLabel: index === 0 ? devContainers.length === 1 ? 'Developer Container' : 'Developer Containers' : '', + showBorder: false, + run(mode: QuickOpenMode): boolean { + if (mode !== QuickOpenMode.OPEN) { + return false; + } + handler(container.name); + return true; + } + }) + )); + + items.push(...toolingContainers.map((container, index) => + new QuickOpenGroupItem({ + label: container.name, + groupLabel: devContainers.length <= 0 ? '' : index === 0 ? toolingContainers.length === 1 ? 'Tooling Container' : 'Tooling Containers' : '', + showBorder: devContainers.length <= 0 ? false : index === 0 ? true : false, + run(mode: QuickOpenMode): boolean { + if (mode !== QuickOpenMode.OPEN) { + return false; + } + handler(container.name); + return true; + } + }) + )); + + return items; + } + + protected isDevContainer(entity: { name: string, container: cheApi.workspace.Machine }): boolean { + const container = entity.container; + return container.attributes !== undefined && (!container.attributes[CONTAINER_SOURCE_ATTRIBUTE] || + container.attributes[CONTAINER_SOURCE_ATTRIBUTE] === RECIPE_CONTAINER_SOURCE); + } + + protected async getWorkspaceContainers(): Promise<{ name: string, container: cheApi.workspace.Machine }[]> { + if (this.containers.length > 0) { + return this.containers; + } + + this.containers = []; + try { + const containersList = await this.cheApi.getCurrentWorkspacesContainers(); + for (const containerName in containersList) { + if (!containersList.hasOwnProperty(containerName)) { + continue; + } + const container = { name: containerName, container: containersList[containerName] }; + this.containers.push(container); + } + } catch (e) { + throw new Error('Unable to get list workspace containers. Cause: ' + e); + } + + return this.containers; + } + + getOptions(): QuickOpenOptions { + return { + placeholder: CONTAINERS_PLACE_HOLDER, + fuzzyMatchLabel: true, + fuzzyMatchDescription: true, + fuzzySort: false + }; + } + + onType(lookFor: string, acceptor: (items: QuickOpenItem[]) => void): void { + acceptor(this.items); + } + + getModel(): QuickOpenModel { + return this; + } +} diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts index 4981d435e..5f89cc244 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts @@ -13,12 +13,16 @@ import { TaskService } from '@theia/task/lib/browser'; import { TaskTerminalWidgetOpenerOptions } from '@theia/task/lib/browser/task-terminal-widget-manager'; import { RunTaskOption, TaskConfiguration, TaskInfo, TaskOutputPresentation } from '@theia/task/lib/common'; import { TerminalWidgetFactoryOptions } from '@theia/terminal/lib/browser/terminal-widget-impl'; -import { injectable } from 'inversify'; +import { inject, injectable } from 'inversify'; +import { CheTaskResolver } from './che-task-resolver'; import { CHE_TASK_TYPE, REMOTE_TASK_KIND, TASK_KIND } from './che-task-terminal-widget-manager'; @injectable() export class TaskConfigurationsService extends TaskService { + @inject(CheTaskResolver) + protected readonly cheTaskResolver: CheTaskResolver; + protected async runResolvedTask(resolvedTask: TaskConfiguration, option?: RunTaskOption): Promise { const source = resolvedTask._source; const taskLabel = resolvedTask.label; diff --git a/plugins/task-plugin/src/task-plugin-backend.ts b/plugins/task-plugin/src/task-plugin-backend.ts index 263141c01..1ee4324af 100644 --- a/plugins/task-plugin/src/task-plugin-backend.ts +++ b/plugins/task-plugin/src/task-plugin-backend.ts @@ -14,7 +14,6 @@ import * as theia from '@theia/plugin'; import * as che from '@eclipse-che/plugin'; import { CHE_TASK_TYPE } from './task/task-protocol'; import { CHE_TASK_SCHEMA } from './schema/che-task-schema'; -import { CheTaskProvider } from './task/che-task-provider'; import { CheTaskRunner } from './task/che-task-runner'; import { ServerVariableResolver } from './variable/server-variable-resolver'; import { ProjectPathVariableResolver } from './variable/project-path-variable-resolver'; @@ -45,10 +44,6 @@ export async function start(context: theia.PluginContext): Promise { const projectPathVariableResolver = container.get(ProjectPathVariableResolver); projectPathVariableResolver.registerVariables(); - const cheTaskProvider = container.get(CheTaskProvider); - const taskProviderSubscription = theia.tasks.registerTaskProvider(CHE_TASK_TYPE, cheTaskProvider); - getSubscriptions().push(taskProviderSubscription); - const cheTaskRunner = container.get(CheTaskRunner); const taskRunnerSubscription = await che.task.registerTaskRunner(CHE_TASK_TYPE, cheTaskRunner); getSubscriptions().push(taskRunnerSubscription); From 0a5de933b93424fdc5be13fdf7f9e1dc9295fa02 Mon Sep 17 00:00:00 2001 From: Roman Nikitenko Date: Mon, 11 May 2020 23:49:03 +0300 Subject: [PATCH 3/6] Reduce delay at creating terminal widget Signed-off-by: Roman Nikitenko --- .../exec-terminal-contribution.ts | 13 ++++++++- .../src/browser/terminal-frontend-module.ts | 9 +++++- .../terminal-widget/remote-terminal-widget.ts | 28 +++++++++++-------- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/extensions/eclipse-che-theia-terminal/src/browser/contribution/exec-terminal-contribution.ts b/extensions/eclipse-che-theia-terminal/src/browser/contribution/exec-terminal-contribution.ts index d35c9c850..96102c4b4 100644 --- a/extensions/eclipse-che-theia-terminal/src/browser/contribution/exec-terminal-contribution.ts +++ b/extensions/eclipse-che-theia-terminal/src/browser/contribution/exec-terminal-contribution.ts @@ -58,6 +58,7 @@ export class ExecTerminalFrontendContribution extends TerminalFrontendContributi private readonly mainMenuId = 'theia:menubar'; private editorContainerName: string | undefined; + private workspaceId: string | undefined; async registerCommands(registry: CommandRegistry): Promise { const serverUrl = await this.termApiEndPointProvider(); @@ -166,7 +167,7 @@ export class ExecTerminalFrontendContribution extends TerminalFrontendContributi public async newTerminalPerContainer(containerName: string, options: TerminalWidgetOptions, closeWidgetOnExitOrError: boolean = true): Promise { try { - const workspaceId = await this.baseEnvVariablesServer.getValue('CHE_WORKSPACE_ID').then(v => v ? v.value : undefined); + const workspaceId = await this.getWorkspaceId(); const termApiEndPoint = await this.termApiEndPointProvider(); const widget = await this.widgetManager.getOrCreateWidget(REMOTE_TERMINAL_WIDGET_FACTORY_ID, { @@ -197,6 +198,16 @@ export class ExecTerminalFrontendContribution extends TerminalFrontendContributi termWidget.start(); } + protected async getWorkspaceId(): Promise { + if (this.workspaceId) { + return this.workspaceId; + } + + this.workspaceId = await this.baseEnvVariablesServer.getValue('CHE_WORKSPACE_ID').then(v => v ? v.value : undefined); + + return this.workspaceId; + } + async getEditorContainerName(): Promise { if (!this.editorContainerName) { this.editorContainerName = await this.cheWorkspaceService.findEditorMachineName(); diff --git a/extensions/eclipse-che-theia-terminal/src/browser/terminal-frontend-module.ts b/extensions/eclipse-che-theia-terminal/src/browser/terminal-frontend-module.ts index f603236e4..41aeebc90 100644 --- a/extensions/eclipse-che-theia-terminal/src/browser/terminal-frontend-module.ts +++ b/extensions/eclipse-che-theia-terminal/src/browser/terminal-frontend-module.ts @@ -80,8 +80,13 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un return provider.createProxy(cheWorkspaceServicePath); }).inSingletonScope(); + let terminalApiEndPoint: URI | undefined = undefined; bind('TerminalApiEndPointProvider').toProvider(context => async () => { + if (terminalApiEndPoint) { + return terminalApiEndPoint; + } + const workspaceService = context.container.get(CHEWorkspaceService); const envServer = context.container.get(EnvVariablesServer); try { @@ -97,13 +102,15 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un if (token && token.value) { uri = uri.withQuery('token=' + token.value); } + terminalApiEndPoint = uri; return uri; } } catch (err) { console.error('Failed to get remote terminal server api end point url. Cause: ', err); } return undefined; - }); + } + ); bind('TerminalProxyCreatorProvider').toProvider(context => () => diff --git a/extensions/eclipse-che-theia-terminal/src/browser/terminal-widget/remote-terminal-widget.ts b/extensions/eclipse-che-theia-terminal/src/browser/terminal-widget/remote-terminal-widget.ts index fff87af12..2f3ba85be 100644 --- a/extensions/eclipse-che-theia-terminal/src/browser/terminal-widget/remote-terminal-widget.ts +++ b/extensions/eclipse-che-theia-terminal/src/browser/terminal-widget/remote-terminal-widget.ts @@ -22,6 +22,7 @@ import { OutputChannelManager, OutputChannel } from '@theia/output/lib/common/ou import URI from '@theia/core/lib/common/uri'; import ReconnectingWebSocket from 'reconnecting-websocket'; import { IDisposable } from 'xterm'; +import { Message } from '@theia/core/lib/browser'; export const REMOTE_TERMINAL_TARGET_SCOPE = 'remote-terminal'; export const REMOTE_TERMINAL_WIDGET_FACTORY_ID = 'remote-terminal'; export const RemoteTerminalWidgetOptions = Symbol('RemoteTerminalWidgetOptions'); @@ -46,6 +47,7 @@ export class RemoteTerminalWidget extends TerminalWidgetImpl { @inject('TerminalProxyCreatorProvider') protected readonly termProxyCreatorProvider: TerminalProxyCreatorProvider; + @inject(RemoteWebSocketConnectionProvider) protected readonly remoteWebSocketConnectionProvider: RemoteWebSocketConnectionProvider; @@ -137,16 +139,7 @@ export class RemoteTerminalWidget extends TerminalWidgetImpl { throw new Error('Failed to create terminal server proxy. Cause: ' + err); } - try { - this._terminalId = typeof id !== 'number' ? await this.createTerminal() : await this.attachTerminal(id); - } catch (error) { - if (IBaseTerminalServer.validateId(id)) { - this._terminalId = id!; - this.onDidOpenEmitter.fire(undefined); - return this.terminalId; - } - throw new Error('Failed to start terminal. Cause: ' + error); - } + this._terminalId = typeof id !== 'number' ? await this.createTerminal() : await this.attachTerminal(id); this.connectTerminalProcess(); @@ -254,8 +247,14 @@ export class RemoteTerminalWidget extends TerminalWidgetImpl { } protected async attachTerminal(id: number): Promise { - const termId = await this.termServer!.check({ id: id }); - if (IBaseTerminalServer.validateId(termId)) { + let termId; + try { + termId = await this.termServer!.check({ id: id }); + } catch (error) { + termId = -1; + } + + if (IBaseTerminalServer.validateId(termId) || this.kind !== 'user') { return termId; } this.logger.error(`Error attaching to terminal id ${id}, the terminal is most likely gone. Starting up a new terminal instead.`); @@ -312,6 +311,11 @@ export class RemoteTerminalWidget extends TerminalWidgetImpl { } } + protected onCloseRequest(msg: Message): void { + this.closeOnDispose = true; + super.onCloseRequest(msg); + } + dispose(): void { if (!this.closeOnDispose || !this.options.attributes || !this.options.attributes.interruptProcessOnClose) { super.dispose(); From df04b4942997ffc6b459e22ee03539aa1645a096 Mon Sep 17 00:00:00 2001 From: Roman Nikitenko Date: Tue, 12 May 2020 00:08:47 +0300 Subject: [PATCH 4/6] Fix status marker for vs code tasks Signed-off-by: Roman Nikitenko --- .../src/browser/task-status-handler.ts | 65 ++++++++----------- .../src/plugin/che-api.ts | 5 +- .../src/plugin/che-task-impl.ts | 5 ++ .../src/che-proposed.d.ts | 10 ++- plugins/task-plugin/src/task/task-status.ts | 10 +-- 5 files changed, 45 insertions(+), 50 deletions(-) diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-status-handler.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-status-handler.ts index d36a33e75..ea23b85c9 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-status-handler.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-status-handler.ts @@ -7,10 +7,11 @@ * * SPDX-License-Identifier: EPL-2.0 **********************************************************************/ -import { TaskStatusOptions, TerminalWidgetIdentifier } from '@eclipse-che/plugin'; -import { Widget, WidgetManager } from '@theia/core/lib/browser'; +import { TaskStatusOptions } from '@eclipse-che/plugin'; +import { TerminalService } from '@theia/terminal/lib/browser/base/terminal-service'; import { TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget'; import { inject, injectable } from 'inversify'; +import { TaskConfigurationsService } from './task-config-service'; const StatusIcon = { SUCCESS: 'fa fa-check task-status-success', @@ -18,52 +19,40 @@ const StatusIcon = { UNKNOWN: 'fa-question' }; +enum TaskStatus { + Success = 'SUCCESS', + Error = 'ERROR', + Unknown = 'UNKNOWN' +} + @injectable() export class TaskStatusHandler { - @inject(WidgetManager) - private readonly widgetManager: WidgetManager; - - async setTaskStatus(options: TaskStatusOptions): Promise { - const terminal = await this.getTerminalWidget(options.terminalIdentifier); - if (terminal) { - terminal.title.iconClass = StatusIcon[options.status]; - } else { - console.log('Failed to set task status: the corresponding terminal is not found'); - } - } + @inject(TerminalService) + protected readonly terminalService: TerminalService; - protected async getTerminalWidget(terminalIdentifier: TerminalWidgetIdentifier): Promise { - const widgets = this.widgetManager.getWidgets(terminalIdentifier.factoryId); + @inject(TaskConfigurationsService) + protected readonly taskService: TaskConfigurationsService; - const widgetId = terminalIdentifier.widgetId; - if (widgetId !== undefined) { - return this.getTerminalByWidgetId(widgetId, widgets); - } + async setTaskStatus(options: TaskStatusOptions): Promise { + const terminalIdentifier = options.terminalIdentifier; + const kind = terminalIdentifier.kind; + const terminalId = terminalIdentifier.terminalId; - const processId = terminalIdentifier.processId; - if (typeof processId === 'number') { - return this.getTerminalByProcessId(processId, widgets); - } + const terminalWidget = this.terminalService.all.find(terminal => kind === terminal.kind && terminalId === terminal.terminalId); + this.setStatus(options.status, terminalWidget); } - private async getTerminalByWidgetId(id: string, widgets: Widget[]): Promise { - const terminalWidget = widgets.find(widget => id === widget.id); - if (terminalWidget instanceof TerminalWidget) { - return terminalWidget; + setStatus(status: TaskStatus, terminal?: TerminalWidget): void { + if (!terminal) { + console.log('Failed to set task status: the corresponding terminal is not found'); + return; } - } - - private async getTerminalByProcessId(id: number, widgets: Widget[]): Promise { - for (const widget of widgets) { - if (!(widget instanceof TerminalWidget)) { - continue; - } - const processId = await widget.processId; - if (id === processId) { - return widget; - } + const currentIcon = terminal.title.iconClass; + const newStatusIcon = StatusIcon[status]; + if (currentIcon !== newStatusIcon) { + terminal.title.iconClass = newStatusIcon; } } } diff --git a/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-api.ts b/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-api.ts index a31198ab1..6acf04a7c 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-api.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-api.ts @@ -20,7 +20,7 @@ import { CheGithubImpl } from './che-github'; import { CheProductImpl } from './che-product'; import { CheSideCarContentReaderImpl } from './che-sidecar-content-reader'; import { CheSshImpl } from './che-ssh'; -import { CheTaskImpl, TaskStatus } from './che-task-impl'; +import { CheTaskImpl, TaskStatus, TaskTerminallKind } from './che-task-impl'; import { CheTelemetryImpl } from './che-telemetry'; import { CheUserImpl } from './che-user'; import { CheVariablesImpl } from './che-variables'; @@ -238,7 +238,8 @@ export function createAPIFactory(rpc: RPCProtocol): CheApiFactory { openshift, oAuth, telemetry, - TaskStatus + TaskStatus, + TaskTerminallKind }; }; diff --git a/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts b/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts index 0119f3bea..72f46d063 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts @@ -18,6 +18,11 @@ export enum TaskStatus { Unknown = 'UNKNOWN' } +export enum TaskTerminallKind { + Task = 'task', + RemoteTask = 'remote-task' +} + export class CheTaskImpl implements CheTask { private readonly cheTaskMain: CheTaskMain; private readonly runnerMap: Map; diff --git a/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts b/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts index 288e9c970..9c8da42ce 100644 --- a/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts +++ b/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts @@ -166,9 +166,13 @@ declare module '@eclipse-che/plugin' { } export interface TerminalWidgetIdentifier { - factoryId: string; - widgetId?: string; - processId?: number; + kind: TaskTerminallKind; + terminalId: number; + } + + export enum TaskTerminallKind { + Task = 'task', + RemoteTask = 'remote-task' } export enum TaskStatus { diff --git a/plugins/task-plugin/src/task/task-status.ts b/plugins/task-plugin/src/task/task-status.ts index 23984ab2f..6afb7d0f7 100644 --- a/plugins/task-plugin/src/task/task-status.ts +++ b/plugins/task-plugin/src/task/task-status.ts @@ -9,12 +9,9 @@ **********************************************************************/ import * as che from '@eclipse-che/plugin'; +import { injectable } from 'inversify'; import * as startPoint from '../task-plugin-backend'; import { CHE_TASK_TYPE } from './task-protocol'; -import { injectable } from 'inversify'; - -const TERMINAL_WIDGET_FACTORY_ID = 'terminal'; -const REMOTE_TERMINAL_WIDGET_FACTORY_ID = 'remote-terminal'; @injectable() export class TaskStatusHandler { @@ -31,10 +28,9 @@ export class TaskStatusHandler { private getTerminalIdentifier(event: che.TaskInfo | che.TaskExitedEvent): che.TerminalWidgetIdentifier { const taskConfig = event.config; if (taskConfig && taskConfig.type === CHE_TASK_TYPE) { - return { factoryId: REMOTE_TERMINAL_WIDGET_FACTORY_ID, processId: event.processId }; + return { kind: che.TaskTerminallKind.RemoteTask, terminalId: event.processId }; } else { - const terminalWidgetId = `${TERMINAL_WIDGET_FACTORY_ID}-${event.terminalId}`; - return { factoryId: TERMINAL_WIDGET_FACTORY_ID, widgetId: terminalWidgetId }; + return { kind: che.TaskTerminallKind.Task, terminalId: event.terminalId || -1 }; } } From aa78d70b55a7df139a32972435d1bcf5994844ee Mon Sep 17 00:00:00 2001 From: Roman Nikitenko Date: Tue, 12 May 2020 00:22:17 +0300 Subject: [PATCH 5/6] Display an animated icon for a terminal tab while a task is running Signed-off-by: Roman Nikitenko --- .../che-task-terminal-widget-manager.ts | 10 ++- .../src/browser/style/tasks.css | 14 ++-- .../src/browser/task-config-service.ts | 6 ++ .../src/browser/task-status-handler.ts | 66 ++++++++++++++++++- .../src/plugin/che-task-impl.ts | 1 + .../src/che-proposed.d.ts | 1 + 6 files changed, 87 insertions(+), 11 deletions(-) diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-terminal-widget-manager.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-terminal-widget-manager.ts index 3d08f660d..e870d2ab5 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-terminal-widget-manager.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/che-task-terminal-widget-manager.ts @@ -8,7 +8,7 @@ * SPDX-License-Identifier: EPL-2.0 **********************************************************************/ -import { TaskTerminalWidgetManager, TaskTerminalWidgetOpenerOptions } from '@theia/task/lib/browser/task-terminal-widget-manager'; +import { TaskTerminalWidgetManager, TaskTerminalWidgetOpenerOptions, TaskTerminalWidget } from '@theia/task/lib/browser/task-terminal-widget-manager'; import { TerminalWidget, TerminalWidgetOptions } from '@theia/terminal/lib/browser/base/terminal-widget'; import { TerminalWidgetFactoryOptions } from '@theia/terminal/lib/browser/terminal-widget-impl'; import { injectable } from 'inversify'; @@ -67,4 +67,12 @@ export class CheTaskTerminalWidgetManager extends TaskTerminalWidgetManager { return super.open(factoryOptions, openerOptions); } + + getTaskTerminals(): TerminalWidget[] { + return this.terminalService.all.filter(terminal => this.isTaskTerminal(terminal)); + } + + isTaskTerminal(terminal: TerminalWidget): boolean { + return TaskTerminalWidget.is(terminal) || RemoteTaskTerminalWidget.is(terminal); + } } diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/style/tasks.css b/extensions/eclipse-che-theia-plugin-ext/src/browser/style/tasks.css index 24aa8a8ae..094cf1482 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/browser/style/tasks.css +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/style/tasks.css @@ -14,10 +14,10 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ - .task-status-success:before { - color: #89d185; -} - -.task-status-error:before { - color: var(--theia-notificationsErrorIcon-foreground); -} +.p-TabBar.theia-app-centers .p-TabBar-tabIcon.task-status-in-progress { + background-size: 12px; + background-image: var(--theia-preloader); + background-repeat: no-repeat; + background-position: center; + background-color: transparent; + } diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts index 5f89cc244..fb02126d2 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-config-service.ts @@ -8,6 +8,7 @@ * SPDX-License-Identifier: EPL-2.0 **********************************************************************/ +import { Emitter, Event } from '@theia/core'; import { WidgetOpenMode } from '@theia/core/lib/browser'; import { TaskService } from '@theia/task/lib/browser'; import { TaskTerminalWidgetOpenerOptions } from '@theia/task/lib/browser/task-terminal-widget-manager'; @@ -20,6 +21,9 @@ import { CHE_TASK_TYPE, REMOTE_TASK_KIND, TASK_KIND } from './che-task-terminal- @injectable() export class TaskConfigurationsService extends TaskService { + protected readonly onDidStartTaskFailureEmitter = new Emitter(); + readonly onDidStartTaskFailure: Event = this.onDidStartTaskFailureEmitter.event; + @inject(CheTaskResolver) protected readonly cheTaskResolver: CheTaskResolver; @@ -39,6 +43,8 @@ export class TaskConfigurationsService extends TaskService { return taskInfo; } catch (error) { + this.onDidStartTaskFailureEmitter.fire({ config: resolvedTask, kind: terminal.kind, terminalId: terminal.terminalId, taskId: -1, }); + const errorMessage = `Error launching task '${taskLabel}': ${error.message}`; terminal.writeLine(`\x1b[31m ${errorMessage} \x1b[0m\n`); diff --git a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-status-handler.ts b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-status-handler.ts index ea23b85c9..780ccfbd0 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/browser/task-status-handler.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/browser/task-status-handler.ts @@ -10,18 +10,21 @@ import { TaskStatusOptions } from '@eclipse-che/plugin'; import { TerminalService } from '@theia/terminal/lib/browser/base/terminal-service'; import { TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget'; -import { inject, injectable } from 'inversify'; +import { inject, injectable, postConstruct } from 'inversify'; +import { CheTaskTerminalWidgetManager } from './che-task-terminal-widget-manager'; import { TaskConfigurationsService } from './task-config-service'; const StatusIcon = { - SUCCESS: 'fa fa-check task-status-success', - ERROR: 'fa fa-times-circle task-status-error', + SUCCESS: 'fa fa-check', + ERROR: 'fa fa-times-circle', + IN_PROGRESS: 'task-status-in-progress', UNKNOWN: 'fa-question' }; enum TaskStatus { Success = 'SUCCESS', Error = 'ERROR', + InProgress = 'IN_PROGRESS', Unknown = 'UNKNOWN' } @@ -34,6 +37,34 @@ export class TaskStatusHandler { @inject(TaskConfigurationsService) protected readonly taskService: TaskConfigurationsService; + @inject(CheTaskTerminalWidgetManager) + protected readonly cheTaskTerminalWidgetManager: CheTaskTerminalWidgetManager; + + @postConstruct() + protected init(): void { + this.terminalService.onDidCreateTerminal(async (terminal: TerminalWidget) => { + if (this.cheTaskTerminalWidgetManager.isTaskTerminal(terminal)) { + this.setStatus(TaskStatus.InProgress, terminal); + + this.subscribeOnTaskTerminalEvents(terminal); + } + }); + + this.taskService.onDidStartTaskFailure(taskInfo => { + const kind = taskInfo.kind; + const terminalId = taskInfo.terminalId; + + if (kind && terminalId) { + const status = TaskStatus.Error; + const terminalIdentifier = { kind, terminalId }; + + this.setTaskStatus({ status, terminalIdentifier }); + } + }); + + this.handleOpenTerminals(); + } + async setTaskStatus(options: TaskStatusOptions): Promise { const terminalIdentifier = options.terminalIdentifier; const kind = terminalIdentifier.kind; @@ -55,4 +86,33 @@ export class TaskStatusHandler { terminal.title.iconClass = newStatusIcon; } } + + private async handleOpenTerminals(): Promise { + const taskTerminals = this.cheTaskTerminalWidgetManager.getTaskTerminals(); + for (const terminal of taskTerminals) { + try { + const processId = await terminal.processId; + if (processId) { + this.setStatus(TaskStatus.InProgress, terminal); + } + } catch (error) { + // an error is thrown if a terminal is not started, we are trying to get a process ID for started terminals + } + } + } + + private subscribeOnTaskTerminalEvents(terminal: TerminalWidget): void { + const didOpenListener = terminal.onDidOpen(async () => { + this.setStatus(TaskStatus.InProgress, terminal); + }); + + const didOpenFailureListener = terminal.onDidOpenFailure(async () => { + this.setStatus(TaskStatus.Error, terminal); + }); + + terminal.onDidDispose(() => { + didOpenListener.dispose(); + didOpenFailureListener.dispose(); + }); + } } diff --git a/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts b/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts index 72f46d063..95c58f71d 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts @@ -14,6 +14,7 @@ import { CheTask, CheTaskMain, PLUGIN_RPC_CONTEXT } from '../common/che-protocol export enum TaskStatus { Success = 'SUCCESS', + InProgress = 'IN_PROGRESS', Error = 'ERROR', Unknown = 'UNKNOWN' } diff --git a/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts b/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts index 9c8da42ce..6e669aaad 100644 --- a/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts +++ b/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts @@ -178,6 +178,7 @@ declare module '@eclipse-che/plugin' { export enum TaskStatus { Success = 'SUCCESS', Error = 'ERROR', + InProgress = 'IN_PROGRESS', Unknown = 'UNKNOWN' } From 11debec720ef3da0227b582e2b36fd6be157e996 Mon Sep 17 00:00:00 2001 From: Roman Nikitenko Date: Mon, 18 May 2020 10:08:18 +0300 Subject: [PATCH 6/6] Align with upstream changes Signed-off-by: Roman Nikitenko --- build.include | 2 +- .../src/plugin/che-task-impl.ts | 2 +- .../src/che-proposed.d.ts | 9 +- .../src/export/task-configs-exporter.ts | 2 +- plugins/task-plugin/src/task/converter.ts | 2 +- yarn.lock | 549 +++++++++--------- 6 files changed, 285 insertions(+), 281 deletions(-) diff --git a/build.include b/build.include index f47dab7a4..bd39547ae 100644 --- a/build.include +++ b/build.include @@ -13,7 +13,7 @@ set -u IMAGE_TAG="next" THEIA_VERSION="master" THEIA_BRANCH="master" -THEIA_COMMIT_SHA="3f28503e754bbb4fa6534612af3d1ed6da3ed66a" +THEIA_COMMIT_SHA= THEIA_GIT_REFS="refs\\/heads\\/master" THEIA_DOCKER_IMAGE_VERSION= diff --git a/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts b/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts index 95c58f71d..ce0ba4b38 100644 --- a/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts +++ b/extensions/eclipse-che-theia-plugin-ext/src/plugin/che-task-impl.ts @@ -59,7 +59,7 @@ export class CheTaskImpl implements CheTask { async $killTask(taskInfo: TaskInfo): Promise { const runner = this.runnerMap.get(taskInfo.config.type); if (runner) { - return await runner.kill(taskInfo); + return runner.kill(taskInfo); } throw new Error(`Failed to terminate Che command: ${taskInfo.config.label}: the corresponging executor is not found`); } diff --git a/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts b/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts index 6e669aaad..75ff6548c 100644 --- a/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts +++ b/extensions/eclipse-che-theia-plugin/src/che-proposed.d.ts @@ -225,6 +225,13 @@ declare module '@eclipse-che/plugin' { readonly [key: string]: any; } + export enum TaskScope { + Global = 0, + Workspace = 1 + } + + export type TaskConfigurationScope = string | TaskScope.Workspace | TaskScope.Global; + export interface TaskConfiguration { /** A label that uniquely identifies a task configuration per source */ readonly type: string; @@ -235,7 +242,7 @@ declare module '@eclipse-che/plugin' { * For a configured task, it is workspace URI that task belongs to. * This field is not supposed to be used in `tasks.json` */ - readonly _scope: string | undefined; + readonly _scope: TaskConfigurationScope; /** Additional task type specific properties. */ readonly [key: string]: any; } diff --git a/plugins/task-plugin/src/export/task-configs-exporter.ts b/plugins/task-plugin/src/export/task-configs-exporter.ts index bb27104e8..46420267c 100644 --- a/plugins/task-plugin/src/export/task-configs-exporter.ts +++ b/plugins/task-plugin/src/export/task-configs-exporter.ts @@ -108,7 +108,7 @@ export class TaskConfigurationsExporter implements ConfigurationsExporter { } private saveConfigs(tasksConfigFileUri: string, content: string, configurations: TaskConfiguration[]): void { - const result = modify(content, ['tasks'], configurations, formattingOptions); + const result = modify(content, ['tasks'], configurations.map(config => Object.assign(config, { _scope: undefined })), formattingOptions); writeFileSync(tasksConfigFileUri, result); } diff --git a/plugins/task-plugin/src/task/converter.ts b/plugins/task-plugin/src/task/converter.ts index e0f11533f..d6d1ec8ac 100644 --- a/plugins/task-plugin/src/task/converter.ts +++ b/plugins/task-plugin/src/task/converter.ts @@ -20,7 +20,7 @@ export function toTaskConfiguration(command: cheApi.workspace.Command): TaskConf type: CHE_TASK_TYPE, label: command.name!, command: command.commandLine, - _scope: undefined, // not to put into tasks.json + _scope: '', // not to put into tasks.json target: { workingDir: getAttribute(WORKING_DIR_ATTRIBUTE, command.attributes), component: getAttribute(COMPONENT_ALIAS_ATTRIBUTE, command.attributes) diff --git a/yarn.lock b/yarn.lock index df851fd69..ed3bfc4b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1484,10 +1484,10 @@ dependencies: type-detect "4.0.8" -"@theia/application-package@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.1.0-next.66dd2bc6.tgz#2e2f16d547acbdfdba68e5d8561dad4acc4ebd84" - integrity sha512-PJ6ex7D/AJ2tDMWh52GH8Ocbo7WOt653dwvR6n3wpeLjIle9nCuz62KAIr2lEvALfnLyb6OIwdNs+Nk5KW4fag== +"@theia/application-package@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.2.0-next.bb43e9ea.tgz#4ac96ce80599fb73219e97626a61b2f7fe304815" + integrity sha512-T9XtP/hd3lltm94CcY1Oel/uCEg8ZhP7k8EWJ29kNMBBr7+m0yH/pqWsAUaT+IYdi5W2uUnE4cQx6WQZDEFDEg== dependencies: "@types/fs-extra" "^4.0.2" "@types/request" "^2.0.3" @@ -1500,35 +1500,35 @@ semver "^5.4.1" write-json-file "^2.2.0" -"@theia/callhierarchy@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.1.0-next.66dd2bc6.tgz#da408142cc73eabbad6dc5b4ab00932e49390295" - integrity sha512-/J44Q740GtIVGk13m2j6f0J9E00vao40zFGUfne6RhKDe7AaTBGL6vcJcZPb4QiN5GOzIDYL/d45gUI/e6Q1pA== +"@theia/callhierarchy@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.2.0-next.bb43e9ea.tgz#d05ba5739a449b229ef89ececc40c0c9d11a6cd2" + integrity sha512-jmTxwOorySJizzpmk2mfODzav5g8ZbObAfHTkiG0IlLUldZ3lF5DTFkj3hrEsHwYuFLAQa5kUVsFvLvi71nw6A== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/languages" "1.1.0-next.66dd2bc6" - "@theia/monaco" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/languages" "1.2.0-next.bb43e9ea" + "@theia/monaco" "1.2.0-next.bb43e9ea" ts-md5 "^1.2.2" -"@theia/console@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.1.0-next.66dd2bc6.tgz#120fa508236f12ce0f9471369b0be8344de7eb89" - integrity sha512-BR5GmN3pewExy8DqTnTRRHscJw1mOwtojdIzDAJ+88t4E/PnT9NhDILNTD9A6EAyzg1cweUwfohiPJ3EE++SIA== +"@theia/console@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.2.0-next.bb43e9ea.tgz#a9819cc4584fce45e59885f8eace9483192072fa" + integrity sha512-wG1Rqz4qm2VswvpEDRbqdES9HHuuKriv+OEaZ4E35wm4+a5w2588x0JciwEsuckBN56/kOUOS+qRRFfl3Uon9A== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/monaco" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/monaco" "1.2.0-next.bb43e9ea" anser "^1.4.7" -"@theia/core@1.1.0-next.66dd2bc6", "@theia/core@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.1.0-next.66dd2bc6.tgz#ab287e8f6ee8caab97dae43082cb4bf21b841fd7" - integrity sha512-xEo6yqsUisuT0ZbdoyxQmJ+fEdtF1KxEjQ5sB3CPhiV4bq2rGUGzMtnbmiGSQDeW5J5xxqcbnTAD1T6e5yGF3Q== +"@theia/core@1.2.0-next.bb43e9ea", "@theia/core@next": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.2.0-next.bb43e9ea.tgz#400cb0907d5480bccfc535e7f24adb51f04e8f9b" + integrity sha512-cdIXPbhFaREJG340Q914ET1B/3IzWmLPKNIFpsGv0f//1pWk1IS6vxpICgDsmtzQJyCc48MGRT7ODxCw8EmeeQ== dependencies: "@babel/runtime" "^7.5.5" "@phosphor/widgets" "^1.9.3" "@primer/octicons-react" "^9.0.0" - "@theia/application-package" "1.1.0-next.66dd2bc6" + "@theia/application-package" "1.2.0-next.bb43e9ea" "@types/body-parser" "^1.16.4" "@types/cookie" "^0.3.3" "@types/express" "^4.16.0" @@ -1554,6 +1554,7 @@ lodash.debounce "^4.0.8" lodash.throttle "^4.1.1" nsfw "^1.2.9" + p-debounce "^2.1.0" perfect-scrollbar "^1.3.0" react "^16.4.1" react-dom "^16.4.1" @@ -1567,28 +1568,27 @@ ws "^7.1.2" yargs "^11.1.0" -"@theia/debug@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.1.0-next.66dd2bc6.tgz#c59d5b060ec01c31ca2d2dfa4678074cf6acce9e" - integrity sha512-5fy2koga6x11809Aw0+hdKzCQYqmKvGlUlnQF6YKhxnacHvtlLzN1D0yVn/t6QCZ3TLq7bAVVfZzQ/6WWs1Obw== - dependencies: - "@theia/application-package" "1.1.0-next.66dd2bc6" - "@theia/console" "1.1.0-next.66dd2bc6" - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/languages" "1.1.0-next.66dd2bc6" - "@theia/markers" "1.1.0-next.66dd2bc6" - "@theia/monaco" "1.1.0-next.66dd2bc6" - "@theia/output" "1.1.0-next.66dd2bc6" - "@theia/preferences" "1.1.0-next.66dd2bc6" - "@theia/process" "1.1.0-next.66dd2bc6" - "@theia/task" "1.1.0-next.66dd2bc6" - "@theia/terminal" "1.1.0-next.66dd2bc6" - "@theia/userstorage" "1.1.0-next.66dd2bc6" - "@theia/variable-resolver" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" - "@types/p-debounce" "^1.0.1" +"@theia/debug@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.2.0-next.bb43e9ea.tgz#59d88cbe341e3dbf9b66708eb3d7588ccab97986" + integrity sha512-n2B/6eMf1gk2G/dGN3TxWEIZ7yzwjOyqQ4o3HL9TIq04ojS1ykb2HzFcTTasMZzjBHFh/1QYcqmmfzwrpp0jBA== + dependencies: + "@theia/application-package" "1.2.0-next.bb43e9ea" + "@theia/console" "1.2.0-next.bb43e9ea" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/languages" "1.2.0-next.bb43e9ea" + "@theia/markers" "1.2.0-next.bb43e9ea" + "@theia/monaco" "1.2.0-next.bb43e9ea" + "@theia/output" "1.2.0-next.bb43e9ea" + "@theia/preferences" "1.2.0-next.bb43e9ea" + "@theia/process" "1.2.0-next.bb43e9ea" + "@theia/task" "1.2.0-next.bb43e9ea" + "@theia/terminal" "1.2.0-next.bb43e9ea" + "@theia/userstorage" "1.2.0-next.bb43e9ea" + "@theia/variable-resolver" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" jsonc-parser "^2.0.2" mkdirp "^0.5.0" p-debounce "^2.1.0" @@ -1597,42 +1597,42 @@ unzip-stream "^0.3.0" vscode-debugprotocol "^1.32.0" -"@theia/editor@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.1.0-next.66dd2bc6.tgz#646d7f7a67c3beea6bd79ac1106982171b6316cf" - integrity sha512-DmsiE53Qy9cjnie49NN4+Pd8ocAYA+WvDc5FsCxUvZXhUwNqdZxkTZ+qqURfltXwDq9oaijAxzEv4nFIYqicNQ== +"@theia/editor@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.2.0-next.bb43e9ea.tgz#43155509fd8610bba0c4a67e195539dc564801a8" + integrity sha512-BfMy31S+hfelfhI2k6TNLXW9FT52Ni7Q/HDEp6m+GUlZZgmCJQuoPCc11ygdCP5D77/6Lf6V1zGwFWstHAXXGw== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/languages" "1.1.0-next.66dd2bc6" - "@theia/variable-resolver" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/languages" "1.2.0-next.bb43e9ea" + "@theia/variable-resolver" "1.2.0-next.bb43e9ea" "@types/base64-arraybuffer" "0.1.0" base64-arraybuffer "^0.1.5" -"@theia/file-search@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.1.0-next.66dd2bc6.tgz#3ec683af56f55960f1daa30f2e000defb27e8b4d" - integrity sha512-Tz2trkLC2DHCIyZmWHxTBs00SwVGLZSd05zzMNjdd5lNWQi9r3vimH469pCmESSOUKbOjaDe1AqPMhVTLinlKw== +"@theia/file-search@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.2.0-next.bb43e9ea.tgz#41a37417701cc9fe89782d726a57deec9f9c685e" + integrity sha512-RtYZ/vKu4508CXH2+w/8w4TUiPIeLhD6OoDFuzf3Csp3yGmFjyag/RPBdBzENfF0TBENB0LJgKdNB+Z15hmKCw== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/process" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/process" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" fuzzy "^0.1.3" vscode-ripgrep "^1.2.4" -"@theia/filesystem@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.1.0-next.66dd2bc6.tgz#19e2236e871f92fc2ea5a92ac4c728ab1af1cd65" - integrity sha512-YtEfTLZ1CsREFTJSzOIEoNth6neeoulHx1XrPizLOK6kuC9zFOowQV7YH48Au5vnKvJJHeTk/2Vd5UM7mcT9jg== +"@theia/filesystem@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.2.0-next.bb43e9ea.tgz#f8e882df5d27b53f9669724d1569d4e5095581b5" + integrity sha512-hlB/06PLvjebqdJISefzKm6jZxC7QpF6sZWcVP1Zl4RdVLPqcZUu0TcbB9KeWZwYyUKnce72uSIwkf0TGZ11Zg== dependencies: - "@theia/application-package" "1.1.0-next.66dd2bc6" - "@theia/core" "1.1.0-next.66dd2bc6" + "@theia/application-package" "1.2.0-next.bb43e9ea" + "@theia/core" "1.2.0-next.bb43e9ea" "@types/body-parser" "^1.17.0" "@types/rimraf" "^2.0.2" "@types/tar-fs" "^1.16.1" "@types/touch" "0.0.1" - "@types/uuid" "^3.4.3" + "@types/uuid" "^7.0.3" body-parser "^1.18.3" drivelist "^6.4.3" http-status-codes "^1.3.0" @@ -1644,52 +1644,52 @@ tar-fs "^1.16.2" touch "^3.1.0" trash "^4.0.1" - uuid "^3.2.1" + uuid "^8.0.0" zip-dir "^1.0.2" -"@theia/languages@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/languages/-/languages-1.1.0-next.66dd2bc6.tgz#d45c20c7ec4b94d8912a35331f5ae7c41ca2be61" - integrity sha512-wpAaj7iRzv2Udp41x6cmshr6FxzO1x8AfvSUEZZ4W7U0Om7EmR+/FVhDiBrOAwEeovd9g8skkBJx02zkA8Sm5w== +"@theia/languages@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/languages/-/languages-1.2.0-next.bb43e9ea.tgz#df1385f08de34680372b7837d54dd74239d223b4" + integrity sha512-CzTqMAX22FT/xdkB7swcpRPRv7ZsLpaHHvk1G/wcCmt1OdL6Qun55n6892ZTTntpy8S3MjQTlpMYL0GFBDUZPg== dependencies: - "@theia/application-package" "1.1.0-next.66dd2bc6" - "@theia/core" "1.1.0-next.66dd2bc6" + "@theia/application-package" "1.2.0-next.bb43e9ea" + "@theia/core" "1.2.0-next.bb43e9ea" "@theia/monaco-editor-core" "^0.19.3" - "@theia/output" "1.1.0-next.66dd2bc6" - "@theia/process" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" - "@types/uuid" "^3.4.3" + "@theia/output" "1.2.0-next.bb43e9ea" + "@theia/process" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" + "@types/uuid" "^7.0.3" monaco-languageclient "^0.13.0" - uuid "^3.2.1" + uuid "^8.0.0" -"@theia/markers@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.1.0-next.66dd2bc6.tgz#b2a1547f24bf6b5ae9e17a8b5749ae8e9122fa18" - integrity sha512-xHVejTr91X7b+v8UsGliorceMCT/6C7oTh78zL183shPEcMNmYb7TqaLe4ZZIpVvsm96/qR4nle+Q4pnDZ6jPA== +"@theia/markers@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.2.0-next.bb43e9ea.tgz#27f834139c4e2b9ffe949d80dfce3bc98fb62f4f" + integrity sha512-vZD17x1bmthAWfoXFk2SVRhux+7/WAtqEHxpK50ONsUit8RbI9sCePkcrWun3t0ki+oUjfGx6/EpLY+/U1k5Cw== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/navigator" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/navigator" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" -"@theia/messages@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.1.0-next.66dd2bc6.tgz#e670e7520b597745d3dbeafa8253255aef87b95b" - integrity sha512-FcebmI8PyNpKVxCSEffaKO0uNeYTpUBhLm2epXRp3msJNXscZUKI7xL6OAMJN9UtUMAbzN2PCQE2C15lQaFZCw== +"@theia/messages@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.2.0-next.bb43e9ea.tgz#64ed37c026f58b10427ee15903119f39af08df69" + integrity sha512-92kssiyjeHMWC0xd5iuHvc+mk4t37Jx8a1OIwZOs42EjmyJTRf0cUVFEmoqS+y8ehHcyy9dpgdPo/BtqsPFulA== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" lodash.throttle "^4.1.1" markdown-it "^8.4.0" react-perfect-scrollbar "^1.5.3" ts-md5 "^1.2.2" "@theia/mini-browser@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/mini-browser/-/mini-browser-1.1.0-next.66dd2bc6.tgz#ce1be01e3e9aa79e81e074ac8a5478b95f9b1a7b" - integrity sha512-9SkTDQVEjnS1/dozef2WlVWZOZny026MTwDtISG8veKMzGaSHbsDcj3KNQ9aVcNknnbvQO9/zm89GX3kaVefwA== + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/mini-browser/-/mini-browser-1.2.0-next.bb43e9ea.tgz#5470c7e11c8273997edd34d8ca0e7f0730b64837" + integrity sha512-EU5xNwFOf4USrVRC6EuweKD05v5FfGuYETIb0b/T5jjfUTTi0fipcN9bGbGHcazeqSlMaItYy7rTxS0osUKbbQ== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" "@types/mime-types" "^2.1.0" mime-types "^2.1.18" pdfobject "^2.0.201604172" @@ -1699,18 +1699,18 @@ resolved "https://registry.yarnpkg.com/@theia/monaco-editor-core/-/monaco-editor-core-0.19.3.tgz#8456aaa52f4cdc87c78697a0edfcccb9696a374d" integrity sha512-+2I5pvbK9qxWs+bLFUwto8nYubyI759/p0z86r2w0HnFdcMQ6rcqvcTupO/Cd/YAJ1/IU38PBWS7hwIoVnvCsQ== -"@theia/monaco@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.1.0-next.66dd2bc6.tgz#56c22b31b7dd9189ae58b24fdfcc425d4b69e2fa" - integrity sha512-hmdQexazO3dNamFzqkUueFWXY3JucX4fira9qXxYnYrMJqTyiGbNVBuOCh/DwcG6CxfVOiSeNVaj/IBUGvzLFQ== - dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/languages" "1.1.0-next.66dd2bc6" - "@theia/markers" "1.1.0-next.66dd2bc6" - "@theia/outline-view" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" +"@theia/monaco@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.2.0-next.bb43e9ea.tgz#8cb7ad117f0b7c9e3f966f5ada182fcdfca47db0" + integrity sha512-sDh208wD9xjw7elFMAdIEPsiNlE4eHKQxMJjDZ93lzPjz3F+2G3XT4C3yh7drEv5QtSpPsaxQz8TsPXLUm4eiw== + dependencies: + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/languages" "1.2.0-next.bb43e9ea" + "@theia/markers" "1.2.0-next.bb43e9ea" + "@theia/outline-view" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" deepmerge "2.0.1" fast-plist "^0.1.2" idb "^4.0.5" @@ -1720,14 +1720,14 @@ onigasm "^2.2.0" vscode-textmate "^4.0.1" -"@theia/navigator@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.1.0-next.66dd2bc6.tgz#8d5b8bf0019c0e392f0be1478d02cbe84c841ca1" - integrity sha512-tfszt3r/6ZWyvWD9Cao12e17X1zogUSqwn5rRfxH5ydG3N9TH4vP8Q2mQifUwEqxk32fkNzJceWj95s7v27lJA== +"@theia/navigator@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.2.0-next.bb43e9ea.tgz#e728873a2a558b749011aa111c53c47fc1f3e617" + integrity sha512-zcFJLRZ7pDTUm/KnYn5v4QZCCPpflCq2uEuPV2qCWPL/eeWKsXnMddYUrw4KjNwrG4IuGx2B9n2g6gUiOAyzVg== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" fuzzy "^0.1.3" minimatch "^3.0.4" @@ -1738,80 +1738,80 @@ dependencies: nan "^2.14.0" -"@theia/outline-view@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.1.0-next.66dd2bc6.tgz#de682f70e2033c820e9fbcd17ff76f24198f844a" - integrity sha512-P5AwZcVtU24PaWo36+7Nlxy4z9w/wbbUeOaNjnq5oBRMKwv+Evk2pl8Pf4mWS+AQuGcE8jSUj/rjr68rYtNE9w== +"@theia/outline-view@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.2.0-next.bb43e9ea.tgz#c74d9f304e78dfd8093bb59a048a3657297c44ba" + integrity sha512-JgGNSAQo6M4JLo+1cZIgZqvnX1NDl6YIl6Pn6BjO7nPKiWS7/s8SvcoLbrb0HptMs0HQJtzGwXV8RixQC13MHw== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" -"@theia/output@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.1.0-next.66dd2bc6.tgz#f0540e2ce2b151ff42f37460efb146b6e2f7f2a9" - integrity sha512-2r5hanS6EySIrC6NPDLOXpZmUZKrgn1mpcWuMtgNEdiBPu09nVHrnVy49oQVa6i4cHiW6D1IX300y+yzYtSMKg== +"@theia/output@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.2.0-next.bb43e9ea.tgz#005169683f645d165f2736f4a7cb13ea0f082314" + integrity sha512-MV47YZD2SdxU+xQttAnayADmZyhCkwAfzHoqgSNwLhw0SE8/s15aOfVObptqxlQcpe6E0G9Fb4iGlJHoIBxdOA== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" "@theia/plugin-dev@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/plugin-dev/-/plugin-dev-1.1.0-next.66dd2bc6.tgz#a94200a68fb8e7d8bae86bb06067c677fb9f02aa" - integrity sha512-FMuPJd1Zuy2nkfJx7YTa76FGY5FyQ1k96987Y9B5Ciw49xQlmFJsrFasrdHdbA3A4+wynirTMiGiOxGVT1MJqA== - dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/debug" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/output" "1.1.0-next.66dd2bc6" - "@theia/plugin-ext" "1.1.0-next.66dd2bc6" - "@theia/preferences" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/plugin-dev/-/plugin-dev-1.2.0-next.bb43e9ea.tgz#e7a1fb16b03c600150f48d327e7907cad83b2fb5" + integrity sha512-LP61reKNGI2oV2ZFxTNYjHwEF+kR2LGPB8yDlcEx/Wiuc+xG/fj/x3pLPr5YeKXJRh2x7jD6EQVlzqt9+rTjVQ== + dependencies: + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/debug" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/output" "1.2.0-next.bb43e9ea" + "@theia/plugin-ext" "1.2.0-next.bb43e9ea" + "@theia/preferences" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" "@types/request" "^2.0.3" ps-tree "^1.2.0" request "^2.82.0" "@theia/plugin-ext-vscode@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.1.0-next.66dd2bc6.tgz#3e1a9e87905765a8d4a59f0455452a785883c754" - integrity sha512-H5ETr11M2Q/+tVjBHhzbwpAe62aT3nbXCSCKkaQ+HwG2EHOjn/Gy9KAx4CgiV/hJD65jg3ttFekUbtBLLYcQXQ== - dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/monaco" "1.1.0-next.66dd2bc6" - "@theia/plugin" "1.1.0-next.66dd2bc6" - "@theia/plugin-ext" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.2.0-next.bb43e9ea.tgz#6f59504703abd086dbdfee87eead5cf148ab26a8" + integrity sha512-JKGkHzLkWQQLUUoE0cUd0u0F2DFWZu+Aq4luGlyg6zMVrudtm/iq+6QwiLZx+7gF0GC+F8oa2vkoSDP7X9/jvA== + dependencies: + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/monaco" "1.2.0-next.bb43e9ea" + "@theia/plugin" "1.2.0-next.bb43e9ea" + "@theia/plugin-ext" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" "@types/request" "^2.0.3" filenamify "^4.1.0" request "^2.82.0" -"@theia/plugin-ext@1.1.0-next.66dd2bc6", "@theia/plugin-ext@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.1.0-next.66dd2bc6.tgz#6a98f5a2a76f01b62da4787a7883c8262d08ed64" - integrity sha512-nmU9G6nX+Lv+Cx9NCYVIadAAew9vgJ3dv5epf0sNgJ2TTHXLZ+ApBVGI2tS1JWh8JoXeIW7qo3Zmc3C0F+5Ckg== - dependencies: - "@theia/callhierarchy" "1.1.0-next.66dd2bc6" - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/debug" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/file-search" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/languages" "1.1.0-next.66dd2bc6" - "@theia/markers" "1.1.0-next.66dd2bc6" - "@theia/messages" "1.1.0-next.66dd2bc6" - "@theia/monaco" "1.1.0-next.66dd2bc6" - "@theia/navigator" "1.1.0-next.66dd2bc6" - "@theia/output" "1.1.0-next.66dd2bc6" - "@theia/plugin" "1.1.0-next.66dd2bc6" - "@theia/preferences" "1.1.0-next.66dd2bc6" - "@theia/scm" "1.1.0-next.66dd2bc6" - "@theia/search-in-workspace" "1.1.0-next.66dd2bc6" - "@theia/task" "1.1.0-next.66dd2bc6" - "@theia/terminal" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" +"@theia/plugin-ext@1.2.0-next.bb43e9ea", "@theia/plugin-ext@next": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.2.0-next.bb43e9ea.tgz#a7d66edb995aa29fd5c25de09e3fbcbabae4f516" + integrity sha512-5Ae8CoF26GciL7MiDlfW6zl8Zb5d3W2ZGsr9SbMPvoXryjp/mNUz0D2l+AUKY6Ob35mlv0J065FIFq9spB0grw== + dependencies: + "@theia/callhierarchy" "1.2.0-next.bb43e9ea" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/debug" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/file-search" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/languages" "1.2.0-next.bb43e9ea" + "@theia/markers" "1.2.0-next.bb43e9ea" + "@theia/messages" "1.2.0-next.bb43e9ea" + "@theia/monaco" "1.2.0-next.bb43e9ea" + "@theia/navigator" "1.2.0-next.bb43e9ea" + "@theia/output" "1.2.0-next.bb43e9ea" + "@theia/plugin" "1.2.0-next.bb43e9ea" + "@theia/preferences" "1.2.0-next.bb43e9ea" + "@theia/scm" "1.2.0-next.bb43e9ea" + "@theia/search-in-workspace" "1.2.0-next.bb43e9ea" + "@theia/task" "1.2.0-next.bb43e9ea" + "@theia/terminal" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" "@types/connect" "^3.4.32" "@types/mime" "^2.0.1" "@types/serve-static" "^1.13.3" connect "^3.7.0" - decompress "^4.2.0" + decompress "4.2.0" escape-html "^1.0.3" filenamify "^4.1.0" jsonc-parser "^2.0.2" @@ -1821,7 +1821,7 @@ ps-tree "^1.2.0" request "^2.82.0" serve-static "^1.14.1" - uuid "^3.2.1" + uuid "^8.0.0" vhost "^3.0.2" vscode-debugprotocol "^1.32.0" vscode-textmate "^4.0.1" @@ -1839,121 +1839,120 @@ read-pkg "4.0.1" yargs "12.0.1" -"@theia/plugin@1.1.0-next.66dd2bc6", "@theia/plugin@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.1.0-next.66dd2bc6.tgz#f23f1bbaaa1991d1b38a089d0bc042f4337439ad" - integrity sha512-RJEB3elS7o84lud6ycSHdd6Pc9v8gEXagRjK/8v7bIWKedRLS5gz1Y7T7Oa64wi6e6z9YmKklK/nXwME/9Y13w== - -"@theia/preferences@1.1.0-next.66dd2bc6", "@theia/preferences@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.1.0-next.66dd2bc6.tgz#c2e6ef0a2a88da2f1fc110b0ad6dd378c9750d48" - integrity sha512-zeGtwklz9zPW2jL+bdpukBI7UxReVJozYWgYvTMpGUSHX7tvcRluCHhIeL3xc3rt+kg3W+6LGLWybE+5kTXCHg== - dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/monaco" "1.1.0-next.66dd2bc6" - "@theia/userstorage" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" +"@theia/plugin@1.2.0-next.bb43e9ea", "@theia/plugin@next": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.2.0-next.bb43e9ea.tgz#9bff6442e88ef2da4b162460b957b56916e0487f" + integrity sha512-vSyeGrOq0eBtT5ZMZZOtVugR52RgEkiH89ct2vBiGm9RWz189VAoVPzqu0BGBbGcg+5mXGjhjHR21qKZlWdcjw== + +"@theia/preferences@1.2.0-next.bb43e9ea", "@theia/preferences@next": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.2.0-next.bb43e9ea.tgz#924c723e2aa00e911f4e5b4979f2b227cb60e58c" + integrity sha512-0svIQfoDYAOgYn4Jc6rsiKiTc9n11Ve83UYm2lFl0KpROUWNnAQY19KbeS/sDT1TAQ4V3OS6c69A5tEi5nBUUg== + dependencies: + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/monaco" "1.2.0-next.bb43e9ea" + "@theia/userstorage" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" jsonc-parser "^2.0.2" -"@theia/process@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.1.0-next.66dd2bc6.tgz#0b51b821d1e66a149b558768f950927f3cb26f37" - integrity sha512-BBoo97fDseCh2yHbqmG217W4s9Pshgc3QtgfGH2K3ewLWveEyMyLscmTTOAdcUKCMqFHlJ+GIptFLFFXJjCL0A== +"@theia/process@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.2.0-next.bb43e9ea.tgz#46e79029ec71f90cbbb7389b42cb9d0ce7fdc69b" + integrity sha512-uj69IIXreKFIULN2TVEfaA9Xpy0oN9mq0LICb94N26lY4MH2p970TUpVR6XVxgIa+VyFgyX0h+/Q6TM1taNtlg== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" "@theia/node-pty" "0.9.0-theia.6" string-argv "^0.1.1" -"@theia/scm@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.1.0-next.66dd2bc6.tgz#f85abfbfddfaae0bf34bcbe3b9008b9f220810da" - integrity sha512-0vS5mMq9AtFpWin0e4UxXQsqvcn1P5IJssC6t7X1MDjVykD+j7HffI85G57MVcQ2s38hlFzw9VTSt4TtXL7p/g== +"@theia/scm@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.2.0-next.bb43e9ea.tgz#8e01b76a4004e315378d3ad0ba616f428661ab15" + integrity sha512-Qa0m62lXKWgFt6WiY3n3OSGcBo5KQEa33dq9gtJnnSu1Uf9FvCHOUlQEgsR498sb4hAb9zG0n/36nPN6Ytp1Gg== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/navigator" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/navigator" "1.2.0-next.bb43e9ea" "@types/diff" "^3.2.2" - "@types/p-debounce" "^1.0.1" diff "^3.4.0" p-debounce "^2.1.0" react-autosize-textarea "^7.0.0" ts-md5 "^1.2.2" -"@theia/search-in-workspace@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.1.0-next.66dd2bc6.tgz#0a8e0ad0cad9c41687b3dab4bbdfee0311dcce5f" - integrity sha512-hdhDdYcAP8mioyynp18lH/03XphuKp/JMrnoE7UnqiOEInIVtIWmKrksyhZ2dhwqaofdl7GUgrgMSF/MCDG/gg== - dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/navigator" "1.1.0-next.66dd2bc6" - "@theia/process" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" +"@theia/search-in-workspace@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.2.0-next.bb43e9ea.tgz#8454390c4b8e95c814e08318e078873568d09a4e" + integrity sha512-YYg0tiAMBHXi9kdTnZiG3LkSoOSJ39j+E4NMXWWDcLj+hfMNDuXekOd6lfOPf+oL6YFqGY65bd6gP5aDmpx5iA== + dependencies: + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/navigator" "1.2.0-next.bb43e9ea" + "@theia/process" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" vscode-ripgrep "^1.2.4" -"@theia/task@1.1.0-next.66dd2bc6", "@theia/task@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.1.0-next.66dd2bc6.tgz#dd7a7197311eec74bbbb00fa505ca8c2c246d5b8" - integrity sha512-5G54yT3RPOQmjBwLDKTcLLoG1Tpfa/xq8ciUDX4+Sl4xUk0jg3jL5756Li2lhptgYnYWTm3TkKsRB4OF+J1I/A== - dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/markers" "1.1.0-next.66dd2bc6" - "@theia/monaco" "1.1.0-next.66dd2bc6" - "@theia/preferences" "1.1.0-next.66dd2bc6" - "@theia/process" "1.1.0-next.66dd2bc6" - "@theia/terminal" "1.1.0-next.66dd2bc6" - "@theia/variable-resolver" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" +"@theia/task@1.2.0-next.bb43e9ea", "@theia/task@next": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.2.0-next.bb43e9ea.tgz#2da3a314d901e623ead650ce97644c4b6f059676" + integrity sha512-2ZAsM7y8r438wTcz320hAK3QdYlGjXKtEfk4lyl3LzflBveKuEaCAZk6SMBMS42M/SE60GAODArS/3mfp6u3Lg== + dependencies: + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/markers" "1.2.0-next.bb43e9ea" + "@theia/monaco" "1.2.0-next.bb43e9ea" + "@theia/preferences" "1.2.0-next.bb43e9ea" + "@theia/process" "1.2.0-next.bb43e9ea" + "@theia/terminal" "1.2.0-next.bb43e9ea" + "@theia/variable-resolver" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" ajv "^6.5.3" jsonc-parser "^2.0.2" p-debounce "^2.1.0" -"@theia/terminal@1.1.0-next.66dd2bc6", "@theia/terminal@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.1.0-next.66dd2bc6.tgz#dd8c44174510f77f470da14a06d9a952c7768075" - integrity sha512-WQ+MtTtdZ9X2SKLlDvKullcrwBMlMvJ19A3wtclGQgptiwchBSd1gLiySZzY0I0SJbOaRjVyppnSSr+8x3ODgw== +"@theia/terminal@1.2.0-next.bb43e9ea", "@theia/terminal@next": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.2.0-next.bb43e9ea.tgz#ee2cc006b201341dec793f8a276383932ab16762" + integrity sha512-TOJvqH6SuMFBSW0Xo6MmzVp8LRlrZAucAJDuRvfABYAB6KMNlLq1+c5wXwBIay151s9L9ghpgIKfG90yItR64A== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/editor" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/process" "1.1.0-next.66dd2bc6" - "@theia/workspace" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/editor" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/process" "1.2.0-next.bb43e9ea" + "@theia/workspace" "1.2.0-next.bb43e9ea" xterm "^4.4.0" xterm-addon-fit "^0.3.0" xterm-addon-search "^0.5.0" -"@theia/userstorage@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.1.0-next.66dd2bc6.tgz#6b378e6d1f0a0895684dfc66264135d65f53ef9a" - integrity sha512-bf/78KsoFilIevM/jU+E1hFkJsrNgvQroiS5jwPrmG4A6C0M89SJEzWLduTrCdZxFCAiz7BgR3vkluNSB2pHQg== +"@theia/userstorage@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.2.0-next.bb43e9ea.tgz#f9143debe07a712d81e029c7120cf7ab71ca6e55" + integrity sha512-hePJwTBO4PqcTl19rfGSNMx5p6qWuMCBXj+3MneM8GS2+LVPwXaETeAxl/vQyTYIDGraVYtuwhaOdGRXbBtC7g== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" -"@theia/variable-resolver@1.1.0-next.66dd2bc6": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.1.0-next.66dd2bc6.tgz#10b8b512cd1b5fba61315d9fde75ecdc5a816bfe" - integrity sha512-fmcurJeSvfPam45+bSjwOx6EVQvtDrfJ4mzo9507xTfwPex60Aom2ghVsoAc/2ttf1KYv2k5RlHOnIFHNR51LQ== +"@theia/variable-resolver@1.2.0-next.bb43e9ea": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.2.0-next.bb43e9ea.tgz#8f75d3cc029c7509cf58c613b5eaeb67164adbf9" + integrity sha512-iGWEb9sii7gyoJY9kro0cyctoNil5K4caIO4WgPzltKCO3ENv4GAAEOtoSI+3n/ooM3AeVdpZZYdjkXDXgcsQw== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" -"@theia/workspace@1.1.0-next.66dd2bc6", "@theia/workspace@next": - version "1.1.0-next.66dd2bc6" - resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.1.0-next.66dd2bc6.tgz#0b1279bb3d7711e79073ab2f5dfd953c8287a4c8" - integrity sha512-2OAuMJTpXqecnb17H1lKi9lveNHkgKFvpeJYaQuaONuqWGErV01MrJARnc4SouNDZXqCxAwZsjNKkWmkT6qsdg== +"@theia/workspace@1.2.0-next.bb43e9ea", "@theia/workspace@next": + version "1.2.0-next.bb43e9ea" + resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.2.0-next.bb43e9ea.tgz#35a25da4f9e0b48b116a8c6b07737ca3ba3ea01c" + integrity sha512-x20ASIPLLxlG75s6sIp13ScRW5ua/OZJttEsvqgLE+yIrBE/hORoZS7JhDqssuU87tW+8uSEzemQD+Qae2M7nw== dependencies: - "@theia/core" "1.1.0-next.66dd2bc6" - "@theia/filesystem" "1.1.0-next.66dd2bc6" - "@theia/variable-resolver" "1.1.0-next.66dd2bc6" + "@theia/core" "1.2.0-next.bb43e9ea" + "@theia/filesystem" "1.2.0-next.bb43e9ea" + "@theia/variable-resolver" "1.2.0-next.bb43e9ea" ajv "^6.5.3" jsonc-parser "^2.0.2" - moment "^2.21.0" + moment "2.24.0" valid-filename "^2.0.1" "@types/anymatch@*": @@ -2202,13 +2201,6 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== -"@types/p-debounce@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/p-debounce/-/p-debounce-1.0.1.tgz#c9956067a240dffedf2682a24d0712ffa5e3c8fe" - integrity sha512-zlAn04fH4cGYPAjmYW8Tst/vxn78IJmD3PVMxxBnl3IYAG+9aGKWCu/311fPHnePJMwyxGeOhi63neSiSgM+iw== - dependencies: - p-debounce "*" - "@types/prettier@^1.19.0": version "1.19.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" @@ -2354,10 +2346,10 @@ dependencies: source-map "^0.6.1" -"@types/uuid@^3.4.3": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.8.tgz#4ba887fcef88bd9a7515ca2de336d691e3e18318" - integrity sha512-zHWce3allXWSmRx6/AGXKCtSOA7JjeWd2L3t4aHfysNk8mouQnWCocveaT7a4IEIlPVHp81jzlnknqTgCjCLXA== +"@types/uuid@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.3.tgz#45cd03e98e758f8581c79c535afbd4fc27ba7ac8" + integrity sha512-PUdqTZVrNYTNcIhLHkiaYzoOIaUi5LFg/XLerAdgvwQrUCx+oSbtoBze1AMyvYbcwzUSNC+Isl58SM4Sm/6COw== "@types/webpack-sources@*": version "0.1.7" @@ -4689,10 +4681,10 @@ decompress-unzip@^4.0.1: pify "^2.3.0" yauzl "^2.4.2" -decompress@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" - integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== +decompress@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" + integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= dependencies: decompress-tar "^4.0.0" decompress-tarbz2 "^4.0.0" @@ -9155,7 +9147,7 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -moment@^2.21.0: +moment@2.24.0, moment@^2.21.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== @@ -9770,7 +9762,7 @@ osenv@^0.1.4, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-debounce@*, p-debounce@^2.1.0: +p-debounce@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-debounce/-/p-debounce-2.1.0.tgz#e79f70c6e325cbb9bddbcbec0b81025084671ad3" integrity sha512-M9bMt62TTnozdZhqFgs+V7XD2MnuKCaz+7fZdlu2/T7xruI3uIE5CicQ0vx1hV7HIUYF0jF+4/R1AgfOkl74Qw== @@ -12641,11 +12633,16 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" + integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== + v8-compile-cache@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe"