diff --git a/src/commands.ts b/src/commands.ts index d7ef0c6..7aef8ff 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -21,6 +21,7 @@ import * as deploy_helpers from './helpers'; import * as deploy_log from './log'; import * as deploy_values from './values'; import * as deploy_workspaces from './workspaces'; +import * as Events from 'events'; import * as vscode from 'vscode'; @@ -187,6 +188,7 @@ export async function reloadCommands(newCfg: deploy_contracts.Configuration) { const CTX: ScriptCommandExecutionContext = { button: btn, command: id, + events: ME.sessionState['commands']['events'], globalEvents: deploy_events.EVENTS, globals: ME.globals, globalState: GLOBAL_STATE, @@ -221,7 +223,7 @@ export async function reloadCommands(newCfg: deploy_contracts.Configuration) { return await Promise.resolve( EXECUTE.apply(SCRIPT_MODULE, - args.concat( deploy_helpers.toArray(arguments) )) + args.concat( deploy_helpers.toArray(arguments) )) ); } else { diff --git a/src/contracts.ts b/src/contracts.ts index e5c786c..949867b 100644 --- a/src/contracts.ts +++ b/src/contracts.ts @@ -365,6 +365,10 @@ export interface PlatformItem { * Arguments for a script. */ export interface ScriptArguments { + /** + * Event emitter for scripts of that kind. + */ + readonly events: NodeJS.EventEmitter; /** * Gets the emitter for global extension events. */ diff --git a/src/plugins.ts b/src/plugins.ts index 1524aac..9ed6563 100644 --- a/src/plugins.ts +++ b/src/plugins.ts @@ -534,6 +534,7 @@ export abstract class FileToUploadBase implements FileToUpload { ); const CONTEXT: deploy_transformers.DataTransformerContext = { + events: ME.workspace.sessionState['upload']['events'], globalEvents: deploy_events.EVENTS, globals: ME.workspace.globals, globalState: ME.workspace.sessionState['upload']['states']['global'], diff --git a/src/plugins/script.ts b/src/plugins/script.ts index f888429..d1394c5 100644 --- a/src/plugins/script.ts +++ b/src/plugins/script.ts @@ -23,6 +23,7 @@ import * as deploy_log from '../log'; import * as deploy_plugins from '../plugins'; import * as deploy_targets from '../targets'; import * as deploy_workspaces from '../workspaces'; +import * as Events from 'events'; /** @@ -95,6 +96,7 @@ export interface ScriptTarget extends deploy_targets.Target { class ScriptPlugin extends deploy_plugins.PluginBase { + private readonly _EVENTS = new Events.EventEmitter(); private readonly _GLOBAL_STATE: deploy_contracts.KeyValuePairs = {}; private readonly _SCRIPT_STATES: deploy_contracts.KeyValuePairs = {}; @@ -119,6 +121,7 @@ class ScriptPlugin extends deploy_plugins.PluginBase { const ARGS: ScriptArguments = { cancellationToken: undefined, dir: context['dir'], + events: ME._EVENTS, files: context['files'], globalEvents: deploy_events.EVENTS, globals: context.target.__workspace.globals, @@ -269,6 +272,10 @@ class ScriptPlugin extends deploy_plugins.PluginBase { return RESULT; } + protected onDispose() { + this._EVENTS.removeAllListeners(); + } + public async uploadFiles(context: deploy_plugins.UploadContext): Promise { const ARGS = await this.createScriptArgsFromContext(context, deploy_contracts.DeployOperation.Deploy); diff --git a/src/pull.ts b/src/pull.ts index c9e557c..65fd67d 100644 --- a/src/pull.ts +++ b/src/pull.ts @@ -268,6 +268,7 @@ export async function pullFilesFrom(files: string[], ); const CONTEXT: deploy_transformers.DataTransformerContext = { + events: ME.sessionState['pull']['events'], globalEvents: deploy_events.EVENTS, globals: ME.globals, globalState: ME.sessionState['pull']['states']['global'], diff --git a/src/targets/operations/http.ts b/src/targets/operations/http.ts index 0f9c9bc..7dd3854 100644 --- a/src/targets/operations/http.ts +++ b/src/targets/operations/http.ts @@ -203,6 +203,7 @@ export async function execute(context: deploy_targets.TargetOperationExecutionCo getBodyToSend = async () => { const ARGS: HttpBodyModuleExecutionArguments = { context: context, + events: WORKSPACE.sessionState['target_operations']['http']['events'], globalEvents: deploy_events.EVENTS, globals: WORKSPACE.globals, globalState: WORKSPACE.sessionState['target_operations']['http']['global'], diff --git a/src/targets/operations/script.ts b/src/targets/operations/script.ts index ab3993c..71b935e 100644 --- a/src/targets/operations/script.ts +++ b/src/targets/operations/script.ts @@ -101,6 +101,7 @@ export async function execute(context: deploy_targets.TargetOperationExecutionCo if (EXECUTE) { const ARGS: ScriptTargetOperationExecutionArguments = { context: context, + events: WORKSPACE.sessionState['target_operations']['script']['events'], globalEvents: deploy_events.EVENTS, globals: WORKSPACE.globals, globalState: WORKSPACE.sessionState['target_operations']['script']['global'], diff --git a/src/workspaces.ts b/src/workspaces.ts index 2e67fe2..7e74dc4 100644 --- a/src/workspaces.ts +++ b/src/workspaces.ts @@ -34,6 +34,7 @@ import * as deploy_transformers from './transformers'; import * as deploy_tasks from './tasks'; import * as deploy_values from './values'; import * as Enumerable from 'node-enumerable'; +import * as Events from 'events'; import * as Glob from 'glob'; import * as i18 from './i18'; import * as i18next from 'i18next'; @@ -427,8 +428,12 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c private createSessionState(newCfg: WorkspaceSettings) { const NEW_SESSION_STATE: deploy_contracts.KeyValuePairs = {}; - + + NEW_SESSION_STATE['commands'] = {}; + NEW_SESSION_STATE['commands']['events'] = new Events.EventEmitter(); + NEW_SESSION_STATE['pull'] = {}; + NEW_SESSION_STATE['pull']['events'] = new Events.EventEmitter(); NEW_SESSION_STATE['pull']['states'] = {}; NEW_SESSION_STATE['pull']['states']['global'] = {}; NEW_SESSION_STATE['pull']['states']['data_transformers'] = {}; @@ -438,15 +443,18 @@ export class Workspace extends deploy_objects.DisposableBase implements deploy_c NEW_SESSION_STATE['sync']['whenOpen']['states'] = {}; NEW_SESSION_STATE['upload'] = {}; + NEW_SESSION_STATE['upload']['events'] = new Events.EventEmitter(); NEW_SESSION_STATE['upload']['states'] = {}; NEW_SESSION_STATE['upload']['states']['global'] = {}; NEW_SESSION_STATE['upload']['states']['data_transformers'] = {}; NEW_SESSION_STATE['target_operations'] = {}; NEW_SESSION_STATE['target_operations']['http'] = {}; + NEW_SESSION_STATE['target_operations']['http']['events'] = new Events.EventEmitter(); NEW_SESSION_STATE['target_operations']['http']['global'] = {}; NEW_SESSION_STATE['target_operations']['http']['body_scripts'] = {}; NEW_SESSION_STATE['target_operations']['script'] = {}; + NEW_SESSION_STATE['target_operations']['script']['events'] = new Events.EventEmitter(); NEW_SESSION_STATE['target_operations']['script']['global'] = {}; NEW_SESSION_STATE['target_operations']['script']['scripts'] = {};