-
Notifications
You must be signed in to change notification settings - Fork 680
Expand file tree
/
Copy pathRunScriptPlugin.ts
More file actions
73 lines (65 loc) · 2.41 KB
/
RunScriptPlugin.ts
File metadata and controls
73 lines (65 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
import * as path from 'node:path';
import type { HeftConfiguration } from '../configuration/HeftConfiguration';
import type { IHeftTaskPlugin } from '../pluginFramework/IHeftPlugin';
import type { IHeftTaskSession, IHeftTaskRunHookOptions } from '../pluginFramework/HeftTaskSession';
import type { RunScriptHeftTaskEventOptions as IRunScriptPluginOptions } from '../schemas/run-script-options.schema.json.d.ts';
/**
* Options provided to scripts that are run using the RunScriptPlugin.
*
* @beta
*/
export interface IRunScriptOptions {
heftTaskSession: IHeftTaskSession;
heftConfiguration: HeftConfiguration;
runOptions: IHeftTaskRunHookOptions;
scriptOptions: Record<string, unknown> | undefined;
}
/**
* Interface used by scripts that are run by the RunScriptPlugin.
*
* @beta
*/
export interface IRunScript {
/**
* The method that is called by the RunScriptPlugin to run the script.
*/
runAsync: (options: IRunScriptOptions) => Promise<void>;
}
const PLUGIN_NAME: 'run-script-plugin' = 'run-script-plugin';
export default class RunScriptPlugin implements IHeftTaskPlugin<IRunScriptPluginOptions> {
public apply(
heftTaskSession: IHeftTaskSession,
heftConfiguration: HeftConfiguration,
pluginOptions: IRunScriptPluginOptions
): void {
heftTaskSession.hooks.run.tapPromise(PLUGIN_NAME, async (runOptions: IHeftTaskRunHookOptions) => {
await this._runScriptAsync(heftTaskSession, heftConfiguration, pluginOptions, runOptions);
});
}
private async _runScriptAsync(
heftTaskSession: IHeftTaskSession,
heftConfiguration: HeftConfiguration,
pluginOptions: IRunScriptPluginOptions,
runOptions: IHeftTaskRunHookOptions
): Promise<void> {
const resolvedModulePath: string = path.resolve(
heftConfiguration.buildFolderPath,
pluginOptions.scriptPath
);
const runScript: IRunScript = await import(resolvedModulePath);
if (!runScript.runAsync) {
throw new Error(
`The script at ${JSON.stringify(resolvedModulePath)} doesn\'t export a "runAsync" function.`
);
}
const runScriptOptions: IRunScriptOptions = {
heftTaskSession,
heftConfiguration,
runOptions,
scriptOptions: pluginOptions.scriptOptions
};
await runScript.runAsync(runScriptOptions);
}
}