@devramps/sdk-typescript 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base/base-step.d.ts +9 -12
- package/dist/base/base-step.js +4 -1
- package/dist/base/polling-step.d.ts +21 -4
- package/dist/base/polling-step.js +22 -5
- package/dist/base/simple-step.d.ts +16 -1
- package/dist/base/simple-step.js +17 -2
- package/dist/decorators/step.d.ts +9 -1
- package/dist/decorators/step.js +19 -6
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/registry/step-registry.d.ts +6 -3
- package/dist/registry/step-registry.js +19 -19
- package/package.json +4 -1
- package/scripts/create-step-registry.js +300 -0
package/dist/base/base-step.d.ts
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
import type { ZodType
|
|
1
|
+
import type { ZodType } from "zod";
|
|
2
2
|
import type { StepLogger } from "../logging/step-logger";
|
|
3
3
|
import type { PrepareOutput } from "../output/step-output";
|
|
4
4
|
import type { ZodStandardJSONSchemaPayload } from "zod/v4/core";
|
|
5
5
|
export type StepKind = "simple" | "polling";
|
|
6
|
+
export interface StepData<S extends ZodType = ZodType> {
|
|
7
|
+
schema: S;
|
|
8
|
+
stepType: string;
|
|
9
|
+
stepKind: StepKind;
|
|
10
|
+
requiresApproval: boolean;
|
|
11
|
+
}
|
|
6
12
|
export interface StepMetadata<S extends ZodType = ZodType> {
|
|
7
13
|
name?: string;
|
|
8
14
|
shortDescription?: string;
|
|
9
15
|
longDescription?: string;
|
|
10
16
|
yamlExample?: string;
|
|
11
|
-
schema: S;
|
|
12
|
-
stepKind: StepKind;
|
|
13
|
-
requiresApproval: boolean;
|
|
14
17
|
stepType: string;
|
|
15
|
-
|
|
18
|
+
paramsJsonSchema: ZodStandardJSONSchemaPayload<S>;
|
|
16
19
|
documentationUrl?: string;
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
@@ -31,6 +34,7 @@ export declare abstract class BaseStep<TParams = unknown> {
|
|
|
31
34
|
* Implemented by the @Step decorator.
|
|
32
35
|
*/
|
|
33
36
|
getMetadata(): StepMetadata;
|
|
37
|
+
getData(): StepData;
|
|
34
38
|
/**
|
|
35
39
|
* Optional prepare method for approval flow.
|
|
36
40
|
* Override this to require approval before execution.
|
|
@@ -38,10 +42,3 @@ export declare abstract class BaseStep<TParams = unknown> {
|
|
|
38
42
|
*/
|
|
39
43
|
prepare(_params: TParams): Promise<PrepareOutput>;
|
|
40
44
|
}
|
|
41
|
-
/**
|
|
42
|
-
* Type representing a class constructor that produces a BaseStep instance
|
|
43
|
-
* with the getMetadata method available.
|
|
44
|
-
*/
|
|
45
|
-
export type StepClass<S extends ZodType = ZodType> = new (...args: any[]) => BaseStep<z.infer<S>> & {
|
|
46
|
-
getMetadata(): StepMetadata<S>;
|
|
47
|
-
};
|
package/dist/base/base-step.js
CHANGED
|
@@ -23,6 +23,9 @@ class BaseStep {
|
|
|
23
23
|
getMetadata() {
|
|
24
24
|
throw new Error("getMetadata not implemented. Did you forget to add the @Step decorator?");
|
|
25
25
|
}
|
|
26
|
+
getData() {
|
|
27
|
+
throw new Error("getData not implemented. Did you forget to add the @Step decorator?");
|
|
28
|
+
}
|
|
26
29
|
/**
|
|
27
30
|
* Optional prepare method for approval flow.
|
|
28
31
|
* Override this to require approval before execution.
|
|
@@ -35,4 +38,4 @@ class BaseStep {
|
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
exports.BaseStep = BaseStep;
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2UvYmFzZS1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHdEQUFvRDtBQUVwRCx1REFBb0Q7QUFzQnBEOzs7R0FHRztBQUNILE1BQXNCLFFBQVE7SUFDbEIsTUFBTSxHQUFlLElBQUksd0JBQVUsRUFBRSxDQUFDO0lBRWhEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxNQUFrQjtRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULE1BQU0sSUFBSSxLQUFLLENBQ2IseUVBQXlFLENBQzFFLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sSUFBSSxLQUFLLENBQ2IscUVBQXFFLENBQ3RFLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBZ0I7UUFDNUIsOERBQThEO1FBQzlELGlFQUFpRTtRQUNqRSxPQUFPLHlCQUFXLENBQUMsTUFBTSxDQUN2QixzQ0FBc0MsRUFDdEMseUJBQXlCLENBQzFCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF4Q0QsNEJBd0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBab2RUeXBlIH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwTG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dpbmcvc3RlcC1sb2dnZXJcIjtcbmltcG9ydCB7IE5vT3BMb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2luZy9zdGVwLWxvZ2dlclwiO1xuaW1wb3J0IHR5cGUgeyBQcmVwYXJlT3V0cHV0IH0gZnJvbSBcIi4uL291dHB1dC9zdGVwLW91dHB1dFwiO1xuaW1wb3J0IHsgU3RlcE91dHB1dHMgfSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5pbXBvcnQgdHlwZSB7IFpvZFN0YW5kYXJkSlNPTlNjaGVtYVBheWxvYWQgfSBmcm9tIFwiem9kL3Y0L2NvcmVcIjtcblxuZXhwb3J0IHR5cGUgU3RlcEtpbmQgPSBcInNpbXBsZVwiIHwgXCJwb2xsaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcERhdGE8UyBleHRlbmRzIFpvZFR5cGUgPSBab2RUeXBlPiB7XG4gIHNjaGVtYTogUztcbiAgc3RlcFR5cGU6IHN0cmluZztcbiAgc3RlcEtpbmQ6IFN0ZXBLaW5kO1xuICByZXF1aXJlc0FwcHJvdmFsOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNZXRhZGF0YTxTIGV4dGVuZHMgWm9kVHlwZSA9IFpvZFR5cGU+IHtcbiAgbmFtZT86IHN0cmluZztcbiAgc2hvcnREZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbG9uZ0Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB5YW1sRXhhbXBsZT86IHN0cmluZztcbiAgc3RlcFR5cGU6IHN0cmluZztcbiAgcGFyYW1zSnNvblNjaGVtYTogWm9kU3RhbmRhcmRKU09OU2NoZW1hUGF5bG9hZDxTPjtcbiAgZG9jdW1lbnRhdGlvblVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgc3RlcHMuXG4gKiBQcm92aWRlcyBsb2dnaW5nIGFuZCBjb21tb24gZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTdGVwPFRQYXJhbXMgPSB1bmtub3duPiB7XG4gIHByb3RlY3RlZCBsb2dnZXI6IFN0ZXBMb2dnZXIgPSBuZXcgTm9PcExvZ2dlcigpO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHJlZ2lzdHJ5IHRvIGluamVjdCB0aGUgbG9nZ2VyIGJlZm9yZSBleGVjdXRpb24uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3NldExvZ2dlcihsb2dnZXI6IFN0ZXBMb2dnZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoaXMgc3RlcC5cbiAgICogSW1wbGVtZW50ZWQgYnkgdGhlIEBTdGVwIGRlY29yYXRvci5cbiAgICovXG4gIGdldE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJnZXRNZXRhZGF0YSBub3QgaW1wbGVtZW50ZWQuIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQFN0ZXAgZGVjb3JhdG9yP1wiXG4gICAgKTtcbiAgfVxuXG4gIGdldERhdGEoKTogU3RlcERhdGEge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiZ2V0RGF0YSBub3QgaW1wbGVtZW50ZWQuIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQFN0ZXAgZGVjb3JhdG9yP1wiXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwcmVwYXJlIG1ldGhvZCBmb3IgYXBwcm92YWwgZmxvdy5cbiAgICogT3ZlcnJpZGUgdGhpcyB0byByZXF1aXJlIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRpb24uXG4gICAqIElmIG5vdCBvdmVycmlkZGVuLCB0aGUgc3RlcCB3aWxsIG5vdCByZXF1aXJlIGFwcHJvdmFsLlxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZShfcGFyYW1zOiBUUGFyYW1zKTogUHJvbWlzZTxQcmVwYXJlT3V0cHV0PiB7XG4gICAgLy8gRGVmYXVsdDogbm8gYXBwcm92YWwgcmVxdWlyZWQgLSB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWRcbiAgICAvLyBUaGUgcmVnaXN0cnkgY2hlY2tzIGlmIHByZXBhcmUgaXMgb3ZlcnJpZGRlbiBiZWZvcmUgY2FsbGluZyBpdFxuICAgIHJldHVybiBTdGVwT3V0cHV0cy5mYWlsZWQoXG4gICAgICBcInByZXBhcmUoKSBjYWxsZWQgYnV0IG5vdCBpbXBsZW1lbnRlZFwiLFxuICAgICAgXCJQUkVQQVJFX05PVF9JTVBMRU1FTlRFRFwiXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -10,6 +10,8 @@ import type { ApprovalContext, PollOutput, StepOutput, TriggerOutput } from "../
|
|
|
10
10
|
*
|
|
11
11
|
* Optionally override `prepare` to require approval before triggering.
|
|
12
12
|
*
|
|
13
|
+
* Steps can accept constructor parameters for dependency injection.
|
|
14
|
+
*
|
|
13
15
|
* @typeParam TParams - The input parameters type (validated by schema)
|
|
14
16
|
* @typeParam TPollingState - The polling state type passed between poll calls
|
|
15
17
|
*
|
|
@@ -20,25 +22,36 @@ import type { ApprovalContext, PollOutput, StepOutput, TriggerOutput } from "../
|
|
|
20
22
|
*
|
|
21
23
|
* @Step({ name: "Long Job", type: "long-job", schema: jobSchema })
|
|
22
24
|
* class LongJobStep extends PollingStep<JobParams, JobPollingState> {
|
|
25
|
+
* constructor(private jobService: JobService) {
|
|
26
|
+
* super();
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
23
29
|
* async trigger(params: JobParams): Promise<TriggerOutput<JobPollingState>> {
|
|
24
|
-
* const jobId = await
|
|
30
|
+
* const jobId = await this.jobService.start(params);
|
|
25
31
|
* return StepOutputs.triggered({ jobId, startedAt: Date.now() });
|
|
26
32
|
* }
|
|
27
33
|
*
|
|
28
34
|
* async poll(params: JobParams, state: JobPollingState): Promise<PollOutput<JobPollingState>> {
|
|
29
|
-
* const status = await
|
|
35
|
+
* const status = await this.jobService.checkStatus(state.jobId);
|
|
30
36
|
* if (status === "running") {
|
|
31
37
|
* return StepOutputs.pollAgain(state, 5000);
|
|
32
38
|
* }
|
|
33
39
|
* return StepOutputs.success({ result: status });
|
|
34
40
|
* }
|
|
35
41
|
* }
|
|
42
|
+
*
|
|
43
|
+
* // Register with dependency injected
|
|
44
|
+
* StepRegistry.run([new LongJobStep(jobService)]);
|
|
36
45
|
* ```
|
|
37
46
|
*
|
|
38
47
|
* @example With approval
|
|
39
48
|
* ```typescript
|
|
40
49
|
* @Step({ name: "Dangerous Job", type: "dangerous-job", schema: dangerousSchema })
|
|
41
50
|
* class DangerousJobStep extends PollingStep<DangerousParams, DangerousPollingState> {
|
|
51
|
+
* constructor(private jobService: JobService) {
|
|
52
|
+
* super();
|
|
53
|
+
* }
|
|
54
|
+
*
|
|
42
55
|
* async prepare(params: DangerousParams): Promise<PrepareOutput> {
|
|
43
56
|
* return StepOutputs.approvalRequired({
|
|
44
57
|
* message: `Run dangerous job on ${params.target}?`,
|
|
@@ -46,12 +59,16 @@ import type { ApprovalContext, PollOutput, StepOutput, TriggerOutput } from "../
|
|
|
46
59
|
* }
|
|
47
60
|
*
|
|
48
61
|
* async trigger(params: DangerousParams, approval: ApprovalContext): Promise<TriggerOutput<DangerousPollingState>> {
|
|
49
|
-
* const jobId = await
|
|
62
|
+
* const jobId = await this.jobService.startDangerous(params);
|
|
50
63
|
* return StepOutputs.triggered({ jobId });
|
|
51
64
|
* }
|
|
52
65
|
*
|
|
53
66
|
* async poll(params: DangerousParams, state: DangerousPollingState): Promise<PollOutput<DangerousPollingState>> {
|
|
54
|
-
*
|
|
67
|
+
* const status = await this.jobService.checkStatus(state.jobId);
|
|
68
|
+
* if (status === "running") {
|
|
69
|
+
* return StepOutputs.pollAgain(state, 5000);
|
|
70
|
+
* }
|
|
71
|
+
* return StepOutputs.success();
|
|
55
72
|
* }
|
|
56
73
|
* }
|
|
57
74
|
* ```
|
|
@@ -11,6 +11,8 @@ const base_step_1 = require("./base-step");
|
|
|
11
11
|
*
|
|
12
12
|
* Optionally override `prepare` to require approval before triggering.
|
|
13
13
|
*
|
|
14
|
+
* Steps can accept constructor parameters for dependency injection.
|
|
15
|
+
*
|
|
14
16
|
* @typeParam TParams - The input parameters type (validated by schema)
|
|
15
17
|
* @typeParam TPollingState - The polling state type passed between poll calls
|
|
16
18
|
*
|
|
@@ -21,25 +23,36 @@ const base_step_1 = require("./base-step");
|
|
|
21
23
|
*
|
|
22
24
|
* @Step({ name: "Long Job", type: "long-job", schema: jobSchema })
|
|
23
25
|
* class LongJobStep extends PollingStep<JobParams, JobPollingState> {
|
|
26
|
+
* constructor(private jobService: JobService) {
|
|
27
|
+
* super();
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
24
30
|
* async trigger(params: JobParams): Promise<TriggerOutput<JobPollingState>> {
|
|
25
|
-
* const jobId = await
|
|
31
|
+
* const jobId = await this.jobService.start(params);
|
|
26
32
|
* return StepOutputs.triggered({ jobId, startedAt: Date.now() });
|
|
27
33
|
* }
|
|
28
34
|
*
|
|
29
35
|
* async poll(params: JobParams, state: JobPollingState): Promise<PollOutput<JobPollingState>> {
|
|
30
|
-
* const status = await
|
|
36
|
+
* const status = await this.jobService.checkStatus(state.jobId);
|
|
31
37
|
* if (status === "running") {
|
|
32
38
|
* return StepOutputs.pollAgain(state, 5000);
|
|
33
39
|
* }
|
|
34
40
|
* return StepOutputs.success({ result: status });
|
|
35
41
|
* }
|
|
36
42
|
* }
|
|
43
|
+
*
|
|
44
|
+
* // Register with dependency injected
|
|
45
|
+
* StepRegistry.run([new LongJobStep(jobService)]);
|
|
37
46
|
* ```
|
|
38
47
|
*
|
|
39
48
|
* @example With approval
|
|
40
49
|
* ```typescript
|
|
41
50
|
* @Step({ name: "Dangerous Job", type: "dangerous-job", schema: dangerousSchema })
|
|
42
51
|
* class DangerousJobStep extends PollingStep<DangerousParams, DangerousPollingState> {
|
|
52
|
+
* constructor(private jobService: JobService) {
|
|
53
|
+
* super();
|
|
54
|
+
* }
|
|
55
|
+
*
|
|
43
56
|
* async prepare(params: DangerousParams): Promise<PrepareOutput> {
|
|
44
57
|
* return StepOutputs.approvalRequired({
|
|
45
58
|
* message: `Run dangerous job on ${params.target}?`,
|
|
@@ -47,12 +60,16 @@ const base_step_1 = require("./base-step");
|
|
|
47
60
|
* }
|
|
48
61
|
*
|
|
49
62
|
* async trigger(params: DangerousParams, approval: ApprovalContext): Promise<TriggerOutput<DangerousPollingState>> {
|
|
50
|
-
* const jobId = await
|
|
63
|
+
* const jobId = await this.jobService.startDangerous(params);
|
|
51
64
|
* return StepOutputs.triggered({ jobId });
|
|
52
65
|
* }
|
|
53
66
|
*
|
|
54
67
|
* async poll(params: DangerousParams, state: DangerousPollingState): Promise<PollOutput<DangerousPollingState>> {
|
|
55
|
-
*
|
|
68
|
+
* const status = await this.jobService.checkStatus(state.jobId);
|
|
69
|
+
* if (status === "running") {
|
|
70
|
+
* return StepOutputs.pollAgain(state, 5000);
|
|
71
|
+
* }
|
|
72
|
+
* return StepOutputs.success();
|
|
56
73
|
* }
|
|
57
74
|
* }
|
|
58
75
|
* ```
|
|
@@ -77,4 +94,4 @@ class PollingStep extends base_step_1.BaseStep {
|
|
|
77
94
|
}
|
|
78
95
|
}
|
|
79
96
|
exports.PollingStep = PollingStep;
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9sbGluZy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2UvcG9sbGluZy1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUF1QztBQVF2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RUc7QUFDSCxNQUFzQixXQUdwQixTQUFRLG9CQUFpQjtJQXVCekI7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FDbEIsTUFBZSxFQUNmLFFBQTBCO1FBRTFCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2YsTUFBZSxFQUNmLFlBQTJCO1FBRTNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLElBQUksS0FBSyxDQUNiLHlFQUF5RSxDQUMxRSxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBckRELGtDQXFEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RlcE1ldGFkYXRhIH0gZnJvbSBcIi4vYmFzZS1zdGVwXCI7XG5pbXBvcnQgeyBCYXNlU3RlcCB9IGZyb20gXCIuL2Jhc2Utc3RlcFwiO1xuaW1wb3J0IHR5cGUge1xuICBBcHByb3ZhbENvbnRleHQsXG4gIFBvbGxPdXRwdXQsXG4gIFN0ZXBPdXRwdXQsXG4gIFRyaWdnZXJPdXRwdXQsXG59IGZyb20gXCIuLi9vdXRwdXQvc3RlcC1vdXRwdXRcIjtcblxuLyoqXG4gKiBBIHBvbGxpbmcgc3RlcCBmb3IgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMgdGhhdCBuZWVkIHN0YXR1cyBjaGVja3MuXG4gKlxuICogVXNlcnMgZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIGltcGxlbWVudDpcbiAqIC0gYHRyaWdnZXIocGFyYW1zKWAgLSBTdGFydCB0aGUgb3BlcmF0aW9uLCByZXR1cm4gaW5pdGlhbCBwb2xsaW5nIHN0YXRlXG4gKiAtIGBwb2xsKHBhcmFtcywgcG9sbGluZ1N0YXRlKWAgLSBDaGVjayBzdGF0dXMsIHJldHVybiBQT0xMX0FHQUlOLCBTVUNDRVNTLCBvciBGQUlMRURcbiAqXG4gKiBPcHRpb25hbGx5IG92ZXJyaWRlIGBwcmVwYXJlYCB0byByZXF1aXJlIGFwcHJvdmFsIGJlZm9yZSB0cmlnZ2VyaW5nLlxuICpcbiAqIFN0ZXBzIGNhbiBhY2NlcHQgY29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1zIC0gVGhlIGlucHV0IHBhcmFtZXRlcnMgdHlwZSAodmFsaWRhdGVkIGJ5IHNjaGVtYSlcbiAqIEB0eXBlUGFyYW0gVFBvbGxpbmdTdGF0ZSAtIFRoZSBwb2xsaW5nIHN0YXRlIHR5cGUgcGFzc2VkIGJldHdlZW4gcG9sbCBjYWxsc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0eXBlIEpvYlBhcmFtcyA9IHsgdGFyZ2V0OiBzdHJpbmcgfTtcbiAqIHR5cGUgSm9iUG9sbGluZ1N0YXRlID0geyBqb2JJZDogc3RyaW5nOyBzdGFydGVkQXQ6IG51bWJlciB9O1xuICpcbiAqIEBTdGVwKHsgbmFtZTogXCJMb25nIEpvYlwiLCB0eXBlOiBcImxvbmctam9iXCIsIHNjaGVtYTogam9iU2NoZW1hIH0pXG4gKiBjbGFzcyBMb25nSm9iU3RlcCBleHRlbmRzIFBvbGxpbmdTdGVwPEpvYlBhcmFtcywgSm9iUG9sbGluZ1N0YXRlPiB7XG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgam9iU2VydmljZTogSm9iU2VydmljZSkge1xuICogICAgIHN1cGVyKCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHRyaWdnZXIocGFyYW1zOiBKb2JQYXJhbXMpOiBQcm9taXNlPFRyaWdnZXJPdXRwdXQ8Sm9iUG9sbGluZ1N0YXRlPj4ge1xuICogICAgIGNvbnN0IGpvYklkID0gYXdhaXQgdGhpcy5qb2JTZXJ2aWNlLnN0YXJ0KHBhcmFtcyk7XG4gKiAgICAgcmV0dXJuIFN0ZXBPdXRwdXRzLnRyaWdnZXJlZCh7IGpvYklkLCBzdGFydGVkQXQ6IERhdGUubm93KCkgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHBvbGwocGFyYW1zOiBKb2JQYXJhbXMsIHN0YXRlOiBKb2JQb2xsaW5nU3RhdGUpOiBQcm9taXNlPFBvbGxPdXRwdXQ8Sm9iUG9sbGluZ1N0YXRlPj4ge1xuICogICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuam9iU2VydmljZS5jaGVja1N0YXR1cyhzdGF0ZS5qb2JJZCk7XG4gKiAgICAgaWYgKHN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHtcbiAqICAgICAgIHJldHVybiBTdGVwT3V0cHV0cy5wb2xsQWdhaW4oc3RhdGUsIDUwMDApO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gU3RlcE91dHB1dHMuc3VjY2Vzcyh7IHJlc3VsdDogc3RhdHVzIH0pO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gUmVnaXN0ZXIgd2l0aCBkZXBlbmRlbmN5IGluamVjdGVkXG4gKiBTdGVwUmVnaXN0cnkucnVuKFtuZXcgTG9uZ0pvYlN0ZXAoam9iU2VydmljZSldKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFdpdGggYXBwcm92YWxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBTdGVwKHsgbmFtZTogXCJEYW5nZXJvdXMgSm9iXCIsIHR5cGU6IFwiZGFuZ2Vyb3VzLWpvYlwiLCBzY2hlbWE6IGRhbmdlcm91c1NjaGVtYSB9KVxuICogY2xhc3MgRGFuZ2Vyb3VzSm9iU3RlcCBleHRlbmRzIFBvbGxpbmdTdGVwPERhbmdlcm91c1BhcmFtcywgRGFuZ2Vyb3VzUG9sbGluZ1N0YXRlPiB7XG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgam9iU2VydmljZTogSm9iU2VydmljZSkge1xuICogICAgIHN1cGVyKCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHByZXBhcmUocGFyYW1zOiBEYW5nZXJvdXNQYXJhbXMpOiBQcm9taXNlPFByZXBhcmVPdXRwdXQ+IHtcbiAqICAgICByZXR1cm4gU3RlcE91dHB1dHMuYXBwcm92YWxSZXF1aXJlZCh7XG4gKiAgICAgICBtZXNzYWdlOiBgUnVuIGRhbmdlcm91cyBqb2Igb24gJHtwYXJhbXMudGFyZ2V0fT9gLFxuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICBhc3luYyB0cmlnZ2VyKHBhcmFtczogRGFuZ2Vyb3VzUGFyYW1zLCBhcHByb3ZhbDogQXBwcm92YWxDb250ZXh0KTogUHJvbWlzZTxUcmlnZ2VyT3V0cHV0PERhbmdlcm91c1BvbGxpbmdTdGF0ZT4+IHtcbiAqICAgICBjb25zdCBqb2JJZCA9IGF3YWl0IHRoaXMuam9iU2VydmljZS5zdGFydERhbmdlcm91cyhwYXJhbXMpO1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy50cmlnZ2VyZWQoeyBqb2JJZCB9KTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcG9sbChwYXJhbXM6IERhbmdlcm91c1BhcmFtcywgc3RhdGU6IERhbmdlcm91c1BvbGxpbmdTdGF0ZSk6IFByb21pc2U8UG9sbE91dHB1dDxEYW5nZXJvdXNQb2xsaW5nU3RhdGU+PiB7XG4gKiAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5qb2JTZXJ2aWNlLmNoZWNrU3RhdHVzKHN0YXRlLmpvYklkKTtcbiAqICAgICBpZiAoc3RhdHVzID09PSBcInJ1bm5pbmdcIikge1xuICogICAgICAgcmV0dXJuIFN0ZXBPdXRwdXRzLnBvbGxBZ2FpbihzdGF0ZSwgNTAwMCk7XG4gKiAgICAgfVxuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy5zdWNjZXNzKCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUG9sbGluZ1N0ZXA8XG4gIFRQYXJhbXMsXG4gIFRQb2xsaW5nU3RhdGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4+IGV4dGVuZHMgQmFzZVN0ZXA8VFBhcmFtcz4ge1xuICAvKipcbiAgICogU3RhcnQgdGhlIGxvbmctcnVubmluZyBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgdmFsaWRhdGVkIGlucHV0IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIGFwcHJvdmFsIC0gQXBwcm92YWwgY29udGV4dCBpZiB0aGlzIHN0ZXAgcmVxdWlyZXMgYXBwcm92YWwgKGhhcyBwcmVwYXJlIG1ldGhvZClcbiAgICogQHJldHVybnMgVFJJR0dFUkVEIHdpdGggaW5pdGlhbCBwb2xsaW5nIHN0YXRlLCBvciBGQUlMRURcbiAgICovXG4gIGFic3RyYWN0IHRyaWdnZXIoXG4gICAgcGFyYW1zOiBUUGFyYW1zLFxuICAgIGFwcHJvdmFsPzogQXBwcm92YWxDb250ZXh0XG4gICk6IFByb21pc2U8VHJpZ2dlck91dHB1dDxUUG9sbGluZ1N0YXRlPj47XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBvcmlnaW5hbCBpbnB1dCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBwb2xsaW5nU3RhdGUgLSBTdGF0ZSBmcm9tIHByZXZpb3VzIHRyaWdnZXIoKSBvciBwb2xsKCkgY2FsbFxuICAgKiBAcmV0dXJucyBQT0xMX0FHQUlOIHdpdGggdXBkYXRlZCBzdGF0ZSwgU1VDQ0VTUywgb3IgRkFJTEVEXG4gICAqL1xuICBhYnN0cmFjdCBwb2xsKFxuICAgIHBhcmFtczogVFBhcmFtcyxcbiAgICBwb2xsaW5nU3RhdGU6IFRQb2xsaW5nU3RhdGVcbiAgKTogUHJvbWlzZTxQb2xsT3V0cHV0PFRQb2xsaW5nU3RhdGU+PjtcblxuICAvKipcbiAgICogQ2FsbGVkIGJ5IHRoZSByZWdpc3RyeSB0byBleGVjdXRlIHRoZSB0cmlnZ2VyIHBoYXNlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVUcmlnZ2VyKFxuICAgIHBhcmFtczogVFBhcmFtcyxcbiAgICBhcHByb3ZhbD86IEFwcHJvdmFsQ29udGV4dFxuICApOiBQcm9taXNlPFN0ZXBPdXRwdXQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyKHBhcmFtcywgYXBwcm92YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgcmVnaXN0cnkgdG8gZXhlY3V0ZSB0aGUgcG9sbCBwaGFzZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyBleGVjdXRlUG9sbChcbiAgICBwYXJhbXM6IFRQYXJhbXMsXG4gICAgcG9sbGluZ1N0YXRlOiBUUG9sbGluZ1N0YXRlXG4gICk6IFByb21pc2U8U3RlcE91dHB1dD4ge1xuICAgIHJldHVybiB0aGlzLnBvbGwocGFyYW1zLCBwb2xsaW5nU3RhdGUpO1xuICB9XG5cbiAgZ2V0TWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImdldE1ldGFkYXRhIG5vdCBpbXBsZW1lbnRlZC4gRGlkIHlvdSBmb3JnZXQgdG8gYWRkIHRoZSBAU3RlcCBkZWNvcmF0b3I/XCJcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -7,21 +7,35 @@ import type { ApprovalContext, RunOutput, StepOutput } from "../output/step-outp
|
|
|
7
7
|
* Users extend this class and implement the `run` method.
|
|
8
8
|
* Optionally override `prepare` to require approval before execution.
|
|
9
9
|
*
|
|
10
|
+
* Steps can accept constructor parameters for dependency injection.
|
|
11
|
+
*
|
|
10
12
|
* @example
|
|
11
13
|
* ```typescript
|
|
12
14
|
* @Step({ name: "Deploy", type: "deploy", schema: deploySchema })
|
|
13
15
|
* class DeployStep extends SimpleStep<DeployParams> {
|
|
16
|
+
* constructor(private deployService: DeployService) {
|
|
17
|
+
* super();
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
14
20
|
* async run(params: DeployParams): Promise<RunOutput> {
|
|
15
21
|
* this.logger.info("Deploying", { target: params.target });
|
|
16
|
-
*
|
|
22
|
+
* const result = await this.deployService.deploy(params.target);
|
|
23
|
+
* return StepOutputs.success({ deploymentId: result.id });
|
|
17
24
|
* }
|
|
18
25
|
* }
|
|
26
|
+
*
|
|
27
|
+
* // Register with dependency injected
|
|
28
|
+
* StepRegistry.run([new DeployStep(deployService)]);
|
|
19
29
|
* ```
|
|
20
30
|
*
|
|
21
31
|
* @example With approval
|
|
22
32
|
* ```typescript
|
|
23
33
|
* @Step({ name: "Delete User", type: "delete-user", schema: deleteUserSchema })
|
|
24
34
|
* class DeleteUserStep extends SimpleStep<DeleteUserParams> {
|
|
35
|
+
* constructor(private userService: UserService) {
|
|
36
|
+
* super();
|
|
37
|
+
* }
|
|
38
|
+
*
|
|
25
39
|
* async prepare(params: DeleteUserParams): Promise<PrepareOutput> {
|
|
26
40
|
* return StepOutputs.approvalRequired({
|
|
27
41
|
* message: `Delete user ${params.userId}?`,
|
|
@@ -30,6 +44,7 @@ import type { ApprovalContext, RunOutput, StepOutput } from "../output/step-outp
|
|
|
30
44
|
*
|
|
31
45
|
* async run(params: DeleteUserParams, approval: ApprovalContext): Promise<RunOutput> {
|
|
32
46
|
* this.logger.info("Deleting user", { approvedBy: approval.approverId });
|
|
47
|
+
* await this.userService.delete(params.userId);
|
|
33
48
|
* return StepOutputs.success();
|
|
34
49
|
* }
|
|
35
50
|
* }
|
package/dist/base/simple-step.js
CHANGED
|
@@ -8,21 +8,35 @@ const base_step_1 = require("./base-step");
|
|
|
8
8
|
* Users extend this class and implement the `run` method.
|
|
9
9
|
* Optionally override `prepare` to require approval before execution.
|
|
10
10
|
*
|
|
11
|
+
* Steps can accept constructor parameters for dependency injection.
|
|
12
|
+
*
|
|
11
13
|
* @example
|
|
12
14
|
* ```typescript
|
|
13
15
|
* @Step({ name: "Deploy", type: "deploy", schema: deploySchema })
|
|
14
16
|
* class DeployStep extends SimpleStep<DeployParams> {
|
|
17
|
+
* constructor(private deployService: DeployService) {
|
|
18
|
+
* super();
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
15
21
|
* async run(params: DeployParams): Promise<RunOutput> {
|
|
16
22
|
* this.logger.info("Deploying", { target: params.target });
|
|
17
|
-
*
|
|
23
|
+
* const result = await this.deployService.deploy(params.target);
|
|
24
|
+
* return StepOutputs.success({ deploymentId: result.id });
|
|
18
25
|
* }
|
|
19
26
|
* }
|
|
27
|
+
*
|
|
28
|
+
* // Register with dependency injected
|
|
29
|
+
* StepRegistry.run([new DeployStep(deployService)]);
|
|
20
30
|
* ```
|
|
21
31
|
*
|
|
22
32
|
* @example With approval
|
|
23
33
|
* ```typescript
|
|
24
34
|
* @Step({ name: "Delete User", type: "delete-user", schema: deleteUserSchema })
|
|
25
35
|
* class DeleteUserStep extends SimpleStep<DeleteUserParams> {
|
|
36
|
+
* constructor(private userService: UserService) {
|
|
37
|
+
* super();
|
|
38
|
+
* }
|
|
39
|
+
*
|
|
26
40
|
* async prepare(params: DeleteUserParams): Promise<PrepareOutput> {
|
|
27
41
|
* return StepOutputs.approvalRequired({
|
|
28
42
|
* message: `Delete user ${params.userId}?`,
|
|
@@ -31,6 +45,7 @@ const base_step_1 = require("./base-step");
|
|
|
31
45
|
*
|
|
32
46
|
* async run(params: DeleteUserParams, approval: ApprovalContext): Promise<RunOutput> {
|
|
33
47
|
* this.logger.info("Deleting user", { approvedBy: approval.approverId });
|
|
48
|
+
* await this.userService.delete(params.userId);
|
|
34
49
|
* return StepOutputs.success();
|
|
35
50
|
* }
|
|
36
51
|
* }
|
|
@@ -49,4 +64,4 @@ class SimpleStep extends base_step_1.BaseStep {
|
|
|
49
64
|
}
|
|
50
65
|
}
|
|
51
66
|
exports.SimpleStep = SimpleStep;
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZS9zaW1wbGUtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwyQ0FBdUM7QUFHdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdERztBQUNILE1BQXNCLFVBQW9CLFNBQVEsb0JBQWlCO0lBUWpFOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBZSxFQUFFLFFBQTBCO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLElBQUksS0FBSyxDQUNiLHlFQUF5RSxDQUMxRSxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBckJELGdDQXFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RlcE1ldGFkYXRhIH0gZnJvbSBcIi4vYmFzZS1zdGVwXCI7XG5pbXBvcnQgeyBCYXNlU3RlcCB9IGZyb20gXCIuL2Jhc2Utc3RlcFwiO1xuaW1wb3J0IHR5cGUgeyBBcHByb3ZhbENvbnRleHQsIFJ1bk91dHB1dCwgU3RlcE91dHB1dCB9IGZyb20gXCIuLi9vdXRwdXQvc3RlcC1vdXRwdXRcIjtcblxuLyoqXG4gKiBBIHNpbXBsZSBzdGVwIHRoYXQgcnVucyBvbmNlIHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBVc2VycyBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSBgcnVuYCBtZXRob2QuXG4gKiBPcHRpb25hbGx5IG92ZXJyaWRlIGBwcmVwYXJlYCB0byByZXF1aXJlIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRpb24uXG4gKlxuICogU3RlcHMgY2FuIGFjY2VwdCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogQFN0ZXAoeyBuYW1lOiBcIkRlcGxveVwiLCB0eXBlOiBcImRlcGxveVwiLCBzY2hlbWE6IGRlcGxveVNjaGVtYSB9KVxuICogY2xhc3MgRGVwbG95U3RlcCBleHRlbmRzIFNpbXBsZVN0ZXA8RGVwbG95UGFyYW1zPiB7XG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVwbG95U2VydmljZTogRGVwbG95U2VydmljZSkge1xuICogICAgIHN1cGVyKCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHJ1bihwYXJhbXM6IERlcGxveVBhcmFtcyk6IFByb21pc2U8UnVuT3V0cHV0PiB7XG4gKiAgICAgdGhpcy5sb2dnZXIuaW5mbyhcIkRlcGxveWluZ1wiLCB7IHRhcmdldDogcGFyYW1zLnRhcmdldCB9KTtcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveVNlcnZpY2UuZGVwbG95KHBhcmFtcy50YXJnZXQpO1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy5zdWNjZXNzKHsgZGVwbG95bWVudElkOiByZXN1bHQuaWQgfSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBSZWdpc3RlciB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0ZWRcbiAqIFN0ZXBSZWdpc3RyeS5ydW4oW25ldyBEZXBsb3lTdGVwKGRlcGxveVNlcnZpY2UpXSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBXaXRoIGFwcHJvdmFsXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAU3RlcCh7IG5hbWU6IFwiRGVsZXRlIFVzZXJcIiwgdHlwZTogXCJkZWxldGUtdXNlclwiLCBzY2hlbWE6IGRlbGV0ZVVzZXJTY2hlbWEgfSlcbiAqIGNsYXNzIERlbGV0ZVVzZXJTdGVwIGV4dGVuZHMgU2ltcGxlU3RlcDxEZWxldGVVc2VyUGFyYW1zPiB7XG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlKSB7XG4gKiAgICAgc3VwZXIoKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcHJlcGFyZShwYXJhbXM6IERlbGV0ZVVzZXJQYXJhbXMpOiBQcm9taXNlPFByZXBhcmVPdXRwdXQ+IHtcbiAqICAgICByZXR1cm4gU3RlcE91dHB1dHMuYXBwcm92YWxSZXF1aXJlZCh7XG4gKiAgICAgICBtZXNzYWdlOiBgRGVsZXRlIHVzZXIgJHtwYXJhbXMudXNlcklkfT9gLFxuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICBhc3luYyBydW4ocGFyYW1zOiBEZWxldGVVc2VyUGFyYW1zLCBhcHByb3ZhbDogQXBwcm92YWxDb250ZXh0KTogUHJvbWlzZTxSdW5PdXRwdXQ+IHtcbiAqICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiRGVsZXRpbmcgdXNlclwiLCB7IGFwcHJvdmVkQnk6IGFwcHJvdmFsLmFwcHJvdmVySWQgfSk7XG4gKiAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5kZWxldGUocGFyYW1zLnVzZXJJZCk7XG4gKiAgICAgcmV0dXJuIFN0ZXBPdXRwdXRzLnN1Y2Nlc3MoKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaW1wbGVTdGVwPFRQYXJhbXM+IGV4dGVuZHMgQmFzZVN0ZXA8VFBhcmFtcz4ge1xuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgc3RlcCBsb2dpYy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSB2YWxpZGF0ZWQgaW5wdXQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gYXBwcm92YWwgLSBBcHByb3ZhbCBjb250ZXh0IGlmIHRoaXMgc3RlcCByZXF1aXJlcyBhcHByb3ZhbCAoaGFzIHByZXBhcmUgbWV0aG9kKVxuICAgKi9cbiAgYWJzdHJhY3QgcnVuKHBhcmFtczogVFBhcmFtcywgYXBwcm92YWw/OiBBcHByb3ZhbENvbnRleHQpOiBQcm9taXNlPFJ1bk91dHB1dD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgcmVnaXN0cnkgdG8gZXhlY3V0ZSB0aGlzIHN0ZXAuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShwYXJhbXM6IFRQYXJhbXMsIGFwcHJvdmFsPzogQXBwcm92YWxDb250ZXh0KTogUHJvbWlzZTxTdGVwT3V0cHV0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuKHBhcmFtcywgYXBwcm92YWwpO1xuICB9XG5cbiAgZ2V0TWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImdldE1ldGFkYXRhIG5vdCBpbXBsZW1lbnRlZC4gRGlkIHlvdSBmb3JnZXQgdG8gYWRkIHRoZSBAU3RlcCBkZWNvcmF0b3I/XCJcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ZodType, z } from "zod";
|
|
2
2
|
import { BaseStep } from "../base/base-step";
|
|
3
|
-
export interface StepConfig<S extends ZodType> {
|
|
3
|
+
export interface StepConfig<S extends ZodType = ZodType> {
|
|
4
4
|
name?: string;
|
|
5
5
|
type: string;
|
|
6
6
|
shortDescription?: string;
|
|
@@ -18,10 +18,18 @@ export interface StepConfig<S extends ZodType> {
|
|
|
18
18
|
* ```typescript
|
|
19
19
|
* @Step({ name: "My Step", type: "my-step", schema: mySchema })
|
|
20
20
|
* class MyStep extends SimpleStep<MyParams> {
|
|
21
|
+
* constructor(private apiClient: ApiClient) {
|
|
22
|
+
* super();
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
21
25
|
* async run(params: MyParams): Promise<RunOutput> {
|
|
26
|
+
* await this.apiClient.doSomething();
|
|
22
27
|
* return StepOutputs.success();
|
|
23
28
|
* }
|
|
24
29
|
* }
|
|
30
|
+
*
|
|
31
|
+
* // Register with dependencies injected
|
|
32
|
+
* StepRegistry.run([new MyStep(apiClient)]);
|
|
25
33
|
* ```
|
|
26
34
|
*/
|
|
27
35
|
export declare function Step<S extends ZodType>(config: StepConfig<S>): <T extends new (...args: any[]) => BaseStep<z.infer<S>>>(Base: T) => T;
|
package/dist/decorators/step.js
CHANGED
|
@@ -13,16 +13,34 @@ const base_step_1 = require("../base/base-step");
|
|
|
13
13
|
* ```typescript
|
|
14
14
|
* @Step({ name: "My Step", type: "my-step", schema: mySchema })
|
|
15
15
|
* class MyStep extends SimpleStep<MyParams> {
|
|
16
|
+
* constructor(private apiClient: ApiClient) {
|
|
17
|
+
* super();
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
16
20
|
* async run(params: MyParams): Promise<RunOutput> {
|
|
21
|
+
* await this.apiClient.doSomething();
|
|
17
22
|
* return StepOutputs.success();
|
|
18
23
|
* }
|
|
19
24
|
* }
|
|
25
|
+
*
|
|
26
|
+
* // Register with dependencies injected
|
|
27
|
+
* StepRegistry.run([new MyStep(apiClient)]);
|
|
20
28
|
* ```
|
|
21
29
|
*/
|
|
22
30
|
function Step(config) {
|
|
23
31
|
return function (Base) {
|
|
24
32
|
const Enhanced = class extends Base {
|
|
25
33
|
getMetadata() {
|
|
34
|
+
return {
|
|
35
|
+
name: config.name,
|
|
36
|
+
stepType: config.type,
|
|
37
|
+
shortDescription: config.shortDescription,
|
|
38
|
+
longDescription: config.longDescription,
|
|
39
|
+
yamlExample: config.yamlExample,
|
|
40
|
+
paramsJsonSchema: zod_1.z.toJSONSchema(config.schema),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
getData() {
|
|
26
44
|
// Detect step kind by checking for PollingStep methods
|
|
27
45
|
const hasPollingMethods = "trigger" in this &&
|
|
28
46
|
typeof this.trigger === "function" &&
|
|
@@ -32,13 +50,8 @@ function Step(config) {
|
|
|
32
50
|
// Check if prepare is overridden (not the default BaseStep.prepare)
|
|
33
51
|
const requiresApproval = this.prepare !== base_step_1.BaseStep.prototype.prepare;
|
|
34
52
|
return {
|
|
35
|
-
name: config.name,
|
|
36
53
|
stepType: config.type,
|
|
37
|
-
shortDescription: config.shortDescription,
|
|
38
|
-
longDescription: config.longDescription,
|
|
39
|
-
yamlExample: config.yamlExample,
|
|
40
54
|
schema: config.schema,
|
|
41
|
-
jsonSchema: zod_1.z.toJSONSchema(config.schema),
|
|
42
55
|
stepKind,
|
|
43
56
|
requiresApproval,
|
|
44
57
|
};
|
|
@@ -47,4 +60,4 @@ function Step(config) {
|
|
|
47
60
|
return Enhanced;
|
|
48
61
|
};
|
|
49
62
|
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL3N0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxQ0Esb0JBd0NDO0FBN0VELDZCQUFzQztBQUV0QyxpREFBNkM7QUFXN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFvQixNQUFxQjtJQUMzRCxPQUFPLFVBQ0wsSUFBTztRQUVQLE1BQU0sUUFBUSxHQUFHLEtBQU0sU0FBUSxJQUFJO1lBQ3hCLFdBQVc7Z0JBQ2xCLE9BQU87b0JBQ0wsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNqQixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ3JCLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7b0JBQ3pDLGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZTtvQkFDdkMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO29CQUMvQixnQkFBZ0IsRUFBRSxPQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ2hELENBQUM7WUFDSixDQUFDO1lBRVEsT0FBTztnQkFDZCx1REFBdUQ7Z0JBQ3ZELE1BQU0saUJBQWlCLEdBQ3JCLFNBQVMsSUFBSSxJQUFJO29CQUNqQixPQUFRLElBQVksQ0FBQyxPQUFPLEtBQUssVUFBVTtvQkFDM0MsTUFBTSxJQUFJLElBQUk7b0JBQ2QsT0FBUSxJQUFZLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztnQkFFM0MsTUFBTSxRQUFRLEdBQWEsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUVwRSxvRUFBb0U7Z0JBQ3BFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sS0FBSyxvQkFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBRXJFLE9BQU87b0JBQ0wsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07b0JBQ3JCLFFBQVE7b0JBQ1IsZ0JBQWdCO2lCQUNqQixDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUM7UUFFRixPQUFPLFFBQWEsQ0FBQztJQUN2QixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBab2RUeXBlLCB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwRGF0YSwgU3RlcEtpbmQsIFN0ZXBNZXRhZGF0YSB9IGZyb20gXCIuLi9iYXNlL2Jhc2Utc3RlcFwiO1xuaW1wb3J0IHsgQmFzZVN0ZXAgfSBmcm9tIFwiLi4vYmFzZS9iYXNlLXN0ZXBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTdGVwQ29uZmlnPFMgZXh0ZW5kcyBab2RUeXBlID0gWm9kVHlwZT4ge1xuICBuYW1lPzogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNob3J0RGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGxvbmdEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgeWFtbEV4YW1wbGU/OiBzdHJpbmc7XG4gIHNjaGVtYTogUztcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBhZGRzIG1ldGFkYXRhIHRvIGEgc3RlcCBjbGFzcy5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGFsbCBzdGVwcyB0byBiZSByZWdpc3RlcmVkIHdpdGggU3RlcFJlZ2lzdHJ5LlxuICpcbiAqIFRoZSBkZWNvcmF0ZWQgY2xhc3MgbXVzdCBleHRlbmQgU2ltcGxlU3RlcCBvciBQb2xsaW5nU3RlcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogQFN0ZXAoeyBuYW1lOiBcIk15IFN0ZXBcIiwgdHlwZTogXCJteS1zdGVwXCIsIHNjaGVtYTogbXlTY2hlbWEgfSlcbiAqIGNsYXNzIE15U3RlcCBleHRlbmRzIFNpbXBsZVN0ZXA8TXlQYXJhbXM+IHtcbiAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBhcGlDbGllbnQ6IEFwaUNsaWVudCkge1xuICogICAgIHN1cGVyKCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHJ1bihwYXJhbXM6IE15UGFyYW1zKTogUHJvbWlzZTxSdW5PdXRwdXQ+IHtcbiAqICAgICBhd2FpdCB0aGlzLmFwaUNsaWVudC5kb1NvbWV0aGluZygpO1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy5zdWNjZXNzKCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBSZWdpc3RlciB3aXRoIGRlcGVuZGVuY2llcyBpbmplY3RlZFxuICogU3RlcFJlZ2lzdHJ5LnJ1bihbbmV3IE15U3RlcChhcGlDbGllbnQpXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0ZXA8UyBleHRlbmRzIFpvZFR5cGU+KGNvbmZpZzogU3RlcENvbmZpZzxTPikge1xuICByZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBCYXNlU3RlcDx6LmluZmVyPFM+Pj4oXG4gICAgQmFzZTogVFxuICApOiBUIHtcbiAgICBjb25zdCBFbmhhbmNlZCA9IGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICBvdmVycmlkZSBnZXRNZXRhZGF0YSgpOiBTdGVwTWV0YWRhdGE8Uz4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgIHN0ZXBUeXBlOiBjb25maWcudHlwZSxcbiAgICAgICAgICBzaG9ydERlc2NyaXB0aW9uOiBjb25maWcuc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBsb25nRGVzY3JpcHRpb246IGNvbmZpZy5sb25nRGVzY3JpcHRpb24sXG4gICAgICAgICAgeWFtbEV4YW1wbGU6IGNvbmZpZy55YW1sRXhhbXBsZSxcbiAgICAgICAgICBwYXJhbXNKc29uU2NoZW1hOiB6LnRvSlNPTlNjaGVtYShjb25maWcuc2NoZW1hKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgb3ZlcnJpZGUgZ2V0RGF0YSgpOiBTdGVwRGF0YTxTPiB7XG4gICAgICAgIC8vIERldGVjdCBzdGVwIGtpbmQgYnkgY2hlY2tpbmcgZm9yIFBvbGxpbmdTdGVwIG1ldGhvZHNcbiAgICAgICAgY29uc3QgaGFzUG9sbGluZ01ldGhvZHMgPVxuICAgICAgICAgIFwidHJpZ2dlclwiIGluIHRoaXMgJiZcbiAgICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KS50cmlnZ2VyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICBcInBvbGxcIiBpbiB0aGlzICYmXG4gICAgICAgICAgdHlwZW9mICh0aGlzIGFzIGFueSkucG9sbCA9PT0gXCJmdW5jdGlvblwiO1xuXG4gICAgICAgIGNvbnN0IHN0ZXBLaW5kOiBTdGVwS2luZCA9IGhhc1BvbGxpbmdNZXRob2RzID8gXCJwb2xsaW5nXCIgOiBcInNpbXBsZVwiO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHByZXBhcmUgaXMgb3ZlcnJpZGRlbiAobm90IHRoZSBkZWZhdWx0IEJhc2VTdGVwLnByZXBhcmUpXG4gICAgICAgIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSB0aGlzLnByZXBhcmUgIT09IEJhc2VTdGVwLnByb3RvdHlwZS5wcmVwYXJlO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RlcFR5cGU6IGNvbmZpZy50eXBlLFxuICAgICAgICAgIHNjaGVtYTogY29uZmlnLnNjaGVtYSxcbiAgICAgICAgICBzdGVwS2luZCxcbiAgICAgICAgICByZXF1aXJlc0FwcHJvdmFsLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gRW5oYW5jZWQgYXMgVDtcbiAgfTtcbn1cbiJdfQ==
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { BaseStep,
|
|
1
|
+
export { BaseStep, StepMetadata, StepKind } from "./base/base-step";
|
|
2
2
|
export { SimpleStep } from "./base/simple-step";
|
|
3
3
|
export { PollingStep } from "./base/polling-step";
|
|
4
4
|
export { Step, StepConfig } from "./decorators/step";
|
package/dist/index.js
CHANGED
|
@@ -32,4 +32,4 @@ Object.defineProperty(exports, "StepRegistryInputSchema", { enumerable: true, ge
|
|
|
32
32
|
// Logging
|
|
33
33
|
var step_logger_1 = require("./logging/step-logger");
|
|
34
34
|
Object.defineProperty(exports, "StepLogger", { enumerable: true, get: function () { return step_logger_1.StepLogger; } });
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGdGQUFnRjtBQUNoRix3QkFBd0I7QUFDeEIsZ0ZBQWdGOzs7QUFFaEYsa0NBQWtDO0FBQ2xDLDhDQUFvRTtBQUEzRCxxR0FBQSxRQUFRLE9BQUE7QUFDakIsa0RBQWdEO0FBQXZDLHlHQUFBLFVBQVUsT0FBQTtBQUNuQixvREFBa0Q7QUFBekMsMkdBQUEsV0FBVyxPQUFBO0FBRXBCLHlDQUF5QztBQUN6QywwQ0FBcUQ7QUFBNUMsNEZBQUEsSUFBSSxPQUFBO0FBRWIsb0NBQW9DO0FBQ3BDLG9EQXlCOEI7QUF0QjVCLG9IQUFBLHFCQUFxQixPQUFBO0FBY3JCLGdDQUFnQztBQUNoQyxrSEFBQSxtQkFBbUIsT0FBQTtBQUNuQiw4R0FBQSxlQUFlLE9BQUE7QUFDZixrSEFBQSxtQkFBbUIsT0FBQTtBQUNuQiwrR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiwrR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQixtQkFBbUI7QUFDbkIsMEdBQUEsV0FBVyxPQUFBO0FBR2IsNkJBQTZCO0FBQzdCLDBEQUFvRztBQUEzRiw2R0FBQSxZQUFZLE9BQUE7QUFBcUIsd0hBQUEsdUJBQXVCLE9BQUE7QUFFakUsVUFBVTtBQUNWLHFEQUF5RjtBQUFoRix5R0FBQSxVQUFVLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3RlcCBTREsgLSBQdWJsaWMgQVBJXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBCYXNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIHN0ZXBzXG5leHBvcnQgeyBCYXNlU3RlcCwgU3RlcE1ldGFkYXRhLCBTdGVwS2luZCB9IGZyb20gXCIuL2Jhc2UvYmFzZS1zdGVwXCI7XG5leHBvcnQgeyBTaW1wbGVTdGVwIH0gZnJvbSBcIi4vYmFzZS9zaW1wbGUtc3RlcFwiO1xuZXhwb3J0IHsgUG9sbGluZ1N0ZXAgfSBmcm9tIFwiLi9iYXNlL3BvbGxpbmctc3RlcFwiO1xuXG4vLyBEZWNvcmF0b3IgZm9yIGFkZGluZyBtZXRhZGF0YSB0byBzdGVwc1xuZXhwb3J0IHsgU3RlcCwgU3RlcENvbmZpZyB9IGZyb20gXCIuL2RlY29yYXRvcnMvc3RlcFwiO1xuXG4vLyBPdXRwdXQgdHlwZXMgYW5kIGhlbHBlciBmdW5jdGlvbnNcbmV4cG9ydCB7XG4gIC8vIEFwcHJvdmFsIGNvbnRleHRcbiAgQXBwcm92YWxDb250ZXh0LFxuICBBcHByb3ZhbENvbnRleHRTY2hlbWEsXG4gIC8vIFBoYXNlLXNwZWNpZmljIG91dHB1dHNcbiAgUHJlcGFyZU91dHB1dCxcbiAgUnVuT3V0cHV0LFxuICBUcmlnZ2VyT3V0cHV0LFxuICBUcmlnZ2VyZWRPdXRwdXQsXG4gIFBvbGxPdXRwdXQsXG4gIFBvbGxBZ2Fpbk91dHB1dCxcbiAgLy8gQ29tbW9uIG91dHB1dHNcbiAgU3VjY2Vzc091dHB1dCxcbiAgRmFpbGVkT3V0cHV0LFxuICBBcHByb3ZhbFJlcXVpcmVkT3V0cHV0LFxuICAvLyBDb21iaW5lZCBvdXRwdXQgdHlwZVxuICBTdGVwT3V0cHV0LFxuICAvLyBPdXRwdXQgc2NoZW1hcyBmb3IgdmFsaWRhdGlvblxuICBQcmVwYXJlT3V0cHV0U2NoZW1hLFxuICBSdW5PdXRwdXRTY2hlbWEsXG4gIFRyaWdnZXJPdXRwdXRTY2hlbWEsXG4gIFBvbGxPdXRwdXRTY2hlbWEsXG4gIFN0ZXBPdXRwdXRTY2hlbWEsXG4gIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgU3RlcE91dHB1dHMsXG59IGZyb20gXCIuL291dHB1dC9zdGVwLW91dHB1dFwiO1xuXG4vLyBSZWdpc3RyeSBmb3IgcnVubmluZyBzdGVwc1xuZXhwb3J0IHsgU3RlcFJlZ2lzdHJ5LCBTdGVwUmVnaXN0cnlJbnB1dCwgU3RlcFJlZ2lzdHJ5SW5wdXRTY2hlbWEgfSBmcm9tIFwiLi9yZWdpc3RyeS9zdGVwLXJlZ2lzdHJ5XCI7XG5cbi8vIExvZ2dpbmdcbmV4cG9ydCB7IFN0ZXBMb2dnZXIsIFN0ZXBMb2dnZXJDb25maWcsIExvZ0VudHJ5LCBMb2dMZXZlbCB9IGZyb20gXCIuL2xvZ2dpbmcvc3RlcC1sb2dnZXJcIjtcbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import z from "zod";
|
|
2
|
-
import type {
|
|
2
|
+
import type { BaseStep } from "../base/base-step";
|
|
3
3
|
export declare const StepRegistryInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
4
4
|
job: z.ZodLiteral<"EXECUTE">;
|
|
5
5
|
type: z.ZodString;
|
|
@@ -25,7 +25,10 @@ export declare class StepRegistry {
|
|
|
25
25
|
*
|
|
26
26
|
* Usage in user's entrypoint file:
|
|
27
27
|
* ```
|
|
28
|
-
* StepRegistry.run([
|
|
28
|
+
* StepRegistry.run([
|
|
29
|
+
* new MyStep1(dependency1, dependency2),
|
|
30
|
+
* new MyStep2(config)
|
|
31
|
+
* ]);
|
|
29
32
|
* ```
|
|
30
33
|
*
|
|
31
34
|
* CLI arguments:
|
|
@@ -34,7 +37,7 @@ export declare class StepRegistry {
|
|
|
34
37
|
* - --log-dir: Directory for log files (default: /tmp/step-logs)
|
|
35
38
|
* - --execution-id: Unique ID for this execution (required for logging)
|
|
36
39
|
*/
|
|
37
|
-
static run(steps:
|
|
40
|
+
static run(steps: BaseStep<unknown>[]): Promise<void>;
|
|
38
41
|
private execute;
|
|
39
42
|
private synthesizeMetadata;
|
|
40
43
|
private executeStep;
|
|
@@ -79,10 +79,9 @@ class StepRegistry {
|
|
|
79
79
|
this.outputPath = outputPath;
|
|
80
80
|
this.logDir = logDir;
|
|
81
81
|
this.executionId = executionId;
|
|
82
|
-
for (const
|
|
83
|
-
const instance = new StepCls();
|
|
82
|
+
for (const instance of steps) {
|
|
84
83
|
const metadata = instance.getMetadata();
|
|
85
|
-
this.steps.set(metadata.stepType,
|
|
84
|
+
this.steps.set(metadata.stepType, instance);
|
|
86
85
|
}
|
|
87
86
|
}
|
|
88
87
|
/**
|
|
@@ -91,7 +90,10 @@ class StepRegistry {
|
|
|
91
90
|
*
|
|
92
91
|
* Usage in user's entrypoint file:
|
|
93
92
|
* ```
|
|
94
|
-
* StepRegistry.run([
|
|
93
|
+
* StepRegistry.run([
|
|
94
|
+
* new MyStep1(dependency1, dependency2),
|
|
95
|
+
* new MyStep2(config)
|
|
96
|
+
* ]);
|
|
95
97
|
* ```
|
|
96
98
|
*
|
|
97
99
|
* CLI arguments:
|
|
@@ -130,37 +132,35 @@ class StepRegistry {
|
|
|
130
132
|
}
|
|
131
133
|
synthesizeMetadata() {
|
|
132
134
|
const metadata = [];
|
|
133
|
-
for (const
|
|
134
|
-
const instance = new StepCls();
|
|
135
|
+
for (const instance of this.steps.values()) {
|
|
135
136
|
metadata.push(instance.getMetadata());
|
|
136
137
|
}
|
|
137
138
|
return metadata;
|
|
138
139
|
}
|
|
139
140
|
async executeStep(type, params, approvalContext, pollingState) {
|
|
140
|
-
const
|
|
141
|
-
if (!
|
|
141
|
+
const instance = this.steps.get(type);
|
|
142
|
+
if (!instance) {
|
|
142
143
|
this.writeOutput(step_output_1.StepOutputs.failed(`No step registered with type: ${type}`, "STEP_NOT_FOUND"));
|
|
143
144
|
return;
|
|
144
145
|
}
|
|
145
146
|
try {
|
|
146
|
-
const
|
|
147
|
-
const metadata = instance.getMetadata();
|
|
147
|
+
const data = instance.getData();
|
|
148
148
|
// Inject logger
|
|
149
149
|
const logger = new step_logger_1.StepLogger({
|
|
150
150
|
logDir: this.logDir,
|
|
151
151
|
executionId: this.executionId,
|
|
152
|
-
stepType:
|
|
152
|
+
stepType: data.stepType,
|
|
153
153
|
});
|
|
154
154
|
instance._setLogger(logger);
|
|
155
155
|
// Validate params against the step's schema
|
|
156
|
-
const parseResult =
|
|
156
|
+
const parseResult = data.schema.safeParse(params);
|
|
157
157
|
if (!parseResult.success) {
|
|
158
158
|
this.writeOutput(step_output_1.StepOutputs.failed(`Invalid params: ${parseResult.error.message}`, "INVALID_PARAMS"));
|
|
159
159
|
return;
|
|
160
160
|
}
|
|
161
161
|
const validatedParams = parseResult.data;
|
|
162
162
|
// Route to appropriate phase based on step kind and input context
|
|
163
|
-
const output = await this.routeExecution(instance,
|
|
163
|
+
const output = await this.routeExecution(instance, data, validatedParams, approvalContext, pollingState);
|
|
164
164
|
this.writeOutput(output);
|
|
165
165
|
}
|
|
166
166
|
catch (error) {
|
|
@@ -168,15 +168,15 @@ class StepRegistry {
|
|
|
168
168
|
this.writeOutput(step_output_1.StepOutputs.failed(errorMessage, "EXECUTION_ERROR"));
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
|
-
async routeExecution(instance,
|
|
172
|
-
const requiresApproval =
|
|
173
|
-
if (
|
|
171
|
+
async routeExecution(instance, data, params, approvalContext, pollingState) {
|
|
172
|
+
const requiresApproval = data.requiresApproval;
|
|
173
|
+
if (data.stepKind === "simple") {
|
|
174
174
|
return this.routeSimpleStep(instance, params, requiresApproval, approvalContext);
|
|
175
175
|
}
|
|
176
|
-
if (
|
|
176
|
+
if (data.stepKind === "polling") {
|
|
177
177
|
return this.routePollingStep(instance, params, requiresApproval, approvalContext, pollingState);
|
|
178
178
|
}
|
|
179
|
-
return step_output_1.StepOutputs.failed(`Unknown step kind: ${
|
|
179
|
+
return step_output_1.StepOutputs.failed(`Unknown step kind: ${data.stepKind}`, "UNKNOWN_STEP_KIND");
|
|
180
180
|
}
|
|
181
181
|
/**
|
|
182
182
|
* Route SimpleStep execution based on approval state.
|
|
@@ -235,4 +235,4 @@ class StepRegistry {
|
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
237
|
exports.StepRegistry = StepRegistry;
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWdpc3RyeS9zdGVwLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0Isd0RBQWdDO0FBQ2hDLDhDQUFvQjtBQUlwQix3REFBb0Q7QUFFcEQsdURBQTJFO0FBRTNFLGdGQUFnRjtBQUNoRixnQkFBZ0I7QUFDaEIsZ0ZBQWdGO0FBRWhGLE1BQU0sNEJBQTRCLEdBQUcsYUFBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QyxHQUFHLEVBQUUsYUFBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztDQUN0QyxDQUFDLENBQUM7QUFFSCxNQUFNLHlCQUF5QixHQUFHLGFBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekMsR0FBRyxFQUFFLGFBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ3pCLElBQUksRUFBRSxhQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLE1BQU0sRUFBRSxhQUFDLENBQUMsTUFBTSxDQUFDLGFBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDckMsNERBQTREO0lBQzVELGVBQWUsRUFBRSxtQ0FBcUIsQ0FBQyxRQUFRLEVBQUU7SUFDakQsWUFBWSxFQUFFLGFBQUMsQ0FBQyxNQUFNLENBQUMsYUFBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLGFBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtDQUN2RCxDQUFDLENBQUM7QUFFVSxRQUFBLHVCQUF1QixHQUFHLGFBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7SUFDakUseUJBQXlCO0lBQ3pCLDRCQUE0QjtDQUM3QixDQUFDLENBQUM7QUFJSCxnRkFBZ0Y7QUFDaEYsZ0JBQWdCO0FBQ2hCLGdGQUFn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QztRQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLHdDQUF3QztZQUN4QyxPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsc0RBQXNEO1lBQ3RELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsZ0RBQWdEO1FBQ2hELE9BQU8sUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUFrQjtRQUNwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0Y7QUFqUUQsb0NBaVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgbWluaW1pc3QgZnJvbSBcIm1pbmltaXN0XCI7XG5pbXBvcnQgeiBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VTdGVwLCBTdGVwQ2xhc3MsIFN0ZXBNZXRhZGF0YSB9IGZyb20gXCIuLi9iYXNlL2Jhc2Utc3RlcFwiO1xuaW1wb3J0IHR5cGUgeyBTaW1wbGVTdGVwIH0gZnJvbSBcIi4uL2Jhc2Uvc2ltcGxlLXN0ZXBcIjtcbmltcG9ydCB0eXBlIHsgUG9sbGluZ1N0ZXAgfSBmcm9tIFwiLi4vYmFzZS9wb2xsaW5nLXN0ZXBcIjtcbmltcG9ydCB7IFN0ZXBMb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2luZy9zdGVwLWxvZ2dlclwiO1xuaW1wb3J0IHR5cGUgeyBBcHByb3ZhbENvbnRleHQsIFN0ZXBPdXRwdXQgfSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5pbXBvcnQgeyBBcHByb3ZhbENvbnRleHRTY2hlbWEsIFN0ZXBPdXRwdXRzIH0gZnJvbSBcIi4uL291dHB1dC9zdGVwLW91dHB1dFwiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSW5wdXQgU2NoZW1hc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgU3RlcFJlZ2lzdHJ5U3ludGhlc2l6ZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgam9iOiB6LmxpdGVyYWwoXCJTWU5USEVTSVpFLU1FVEFEQVRBXCIpLFxufSk7XG5cbmNvbnN0IFN0ZXBSZWdpc3RyeUV4ZWN1dGVTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGpvYjogei5saXRlcmFsKFwiRVhFQ1VURVwiKSxcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgcGFyYW1zOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSxcbiAgLy8gT3B0aW9uYWwgY29udGV4dCAtIHByZXNlbmNlIGRldGVybWluZXMgd2hpY2ggcGhhc2UgdG8gcnVuXG4gIGFwcHJvdmFsQ29udGV4dDogQXBwcm92YWxDb250ZXh0U2NoZW1hLm9wdGlvbmFsKCksXG4gIHBvbGxpbmdTdGF0ZTogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU3RlcFJlZ2lzdHJ5SW5wdXRTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImpvYlwiLCBbXG4gIFN0ZXBSZWdpc3RyeUV4ZWN1dGVTY2hlbWEsXG4gIFN0ZXBSZWdpc3RyeVN5bnRoZXNpemVTY2hlbWEsXG5dKTtcblxuZXhwb3J0IHR5cGUgU3RlcFJlZ2lzdHJ5SW5wdXQgPSB6LmluZmVyPHR5cGVvZiBTdGVwUmVnaXN0cnlJbnB1dFNjaGVtYT47XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb25maWd1cmF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jb25zdCBERUZBVUxUX09VVFBVVF9QQVRIID0gXCIvdG1wL3N0ZXAtb3V0cHV0Lmpzb25cIjtcbmNvbnN0IERFRkFVTFRfTE9HX0RJUiA9IFwiL3RtcC9zdGVwLWxvZ3NcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFN0ZXBSZWdpc3RyeVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFN0ZXBSZWdpc3RyeSB7XG4gIHByaXZhdGUgc3RlcHM6IE1hcDxzdHJpbmcsIFN0ZXBDbGFzcz47XG4gIHByaXZhdGUgb3V0cHV0UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGxvZ0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBzdGVwczogU3RlcENsYXNzW10sXG4gICAgb3V0cHV0UGF0aDogc3RyaW5nLFxuICAgIGxvZ0Rpcjogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbklkOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5zdGVwcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm91dHB1dFBhdGggPSBvdXRwdXRQYXRoO1xuICAgIHRoaXMubG9nRGlyID0gbG9nRGlyO1xuICAgIHRoaXMuZXhlY3V0aW9uSWQgPSBleGVjdXRpb25JZDtcblxuICAgIGZvciAoY29uc3QgU3RlcENscyBvZiBzdGVwcykge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgU3RlcENscygpO1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBpbnN0YW5jZS5nZXRNZXRhZGF0YSgpO1xuICAgICAgdGhpcy5zdGVwcy5zZXQobWV0YWRhdGEuc3RlcFR5cGUsIFN0ZXBDbHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYWluIGVudHJ5cG9pbnQgZm9yIHJ1bm5pbmcgc3RlcHMuXG4gICAqIFBhcnNlcyBDTEkgYXJncyBhbmQgZWl0aGVyIHN5bnRoZXNpemVzIG1ldGFkYXRhIG9yIGV4ZWN1dGVzIGEgc3RlcC5cbiAgICpcbiAgICogVXNhZ2UgaW4gdXNlcidzIGVudHJ5cG9pbnQgZmlsZTpcbiAgICogYGBgXG4gICAqIFN0ZXBSZWdpc3RyeS5ydW4oW015U3RlcDEsIE15U3RlcDIsIC4uLl0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQ0xJIGFyZ3VtZW50czpcbiAgICogLSAtLWlucHV0OiBKU09OIGJsb2Igd2l0aCBqb2IgdHlwZSBhbmQgcGFyYW1ldGVyc1xuICAgKiAtIC0tb3V0cHV0OiBQYXRoIHRvIHdyaXRlIG91dHB1dCBKU09OIChkZWZhdWx0OiAvdG1wL3N0ZXAtb3V0cHV0Lmpzb24pXG4gICAqIC0gLS1sb2ctZGlyOiBEaXJlY3RvcnkgZm9yIGxvZyBmaWxlcyAoZGVmYXVsdDogL3RtcC9zdGVwLWxvZ3MpXG4gICAqIC0gLS1leGVjdXRpb24taWQ6IFVuaXF1ZSBJRCBmb3IgdGhpcyBleGVjdXRpb24gKHJlcXVpcmVkIGZvciBsb2dnaW5nKVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJ1bihzdGVwczogU3RlcENsYXNzW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzID0gbWluaW1pc3QocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gYXJnc1tcIm91dHB1dFwiXSB8fCBERUZBVUxUX09VVFBVVF9QQVRIO1xuICAgIGNvbnN0IGxvZ0RpciA9IGFyZ3NbXCJsb2ctZGlyXCJdIHx8IERFRkFVTFRfTE9HX0RJUjtcbiAgICBjb25zdCBleGVjdXRpb25JZCA9IGFyZ3NbXCJleGVjdXRpb24taWRcIl0gfHwgYGV4ZWMtJHtEYXRlLm5vdygpfWA7XG5cbiAgICBjb25zdCByZWdpc3RyeSA9IG5ldyBTdGVwUmVnaXN0cnkoc3RlcHMsIG91dHB1dFBhdGgsIGxvZ0RpciwgZXhlY3V0aW9uSWQpO1xuICAgIGF3YWl0IHJlZ2lzdHJ5LmV4ZWN1dGUoYXJncyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGUoYXJnczogbWluaW1pc3QuUGFyc2VkQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnB1dCA9IFN0ZXBSZWdpc3RyeUlucHV0U2NoZW1hLnBhcnNlKEpTT04ucGFyc2UoYXJnc1tcImlucHV0XCJdKSk7XG5cbiAgICAgIHN3aXRjaCAoaW5wdXQuam9iKSB7XG4gICAgICAgIGNhc2UgXCJTWU5USEVTSVpFLU1FVEFEQVRBXCI6IHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuc3ludGhlc2l6ZU1ldGFkYXRhKCk7XG4gICAgICAgICAgdGhpcy53cml0ZU91dHB1dCh7IHN0YXR1czogXCJTVUNDRVNTXCIsIGRhdGE6IHsgbWV0YWRhdGEgfSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJFWEVDVVRFXCI6IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVTdGVwKFxuICAgICAgICAgICAgaW5wdXQudHlwZSxcbiAgICAgICAgICAgIGlucHV0LnBhcmFtcyxcbiAgICAgICAgICAgIGlucHV0LmFwcHJvdmFsQ29udGV4dCxcbiAgICAgICAgICAgIGlucHV0LnBvbGxpbmdTdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgdGhpcy53cml0ZU91dHB1dChTdGVwT3V0cHV0cy5mYWlsZWQoZXJyb3JNZXNzYWdlLCBcIlJFR0lTVFJZX0VSUk9SXCIpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN5bnRoZXNpemVNZXRhZGF0YSgpOiBTdGVwTWV0YWRhdGFbXSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFN0ZXBNZXRhZGF0YVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFN0ZXBDbHMgb2YgdGhpcy5zdGVwcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgU3RlcENscygpO1xuICAgICAgbWV0YWRhdGEucHVzaChpbnN0YW5jZS5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdGVwKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGFwcHJvdmFsQ29udGV4dD86IEFwcHJvdmFsQ29udGV4dCxcbiAgICBwb2xsaW5nU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBTdGVwQ2xzID0gdGhpcy5zdGVwcy5nZXQodHlwZSk7XG5cbiAgICBpZiAoIVN0ZXBDbHMpIHtcbiAgICAgIHRoaXMud3JpdGVPdXRwdXQoXG4gICAgICAgIFN0ZXBPdXRwdXRzLmZhaWxlZChcbiAgICAgICAgICBgTm8gc3RlcCByZWdpc3RlcmVkIHdpdGggdHlwZTogJHt0eXBlfWAsXG4gICAgICAgICAgXCJTVEVQX05PVF9GT1VORFwiXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFN0ZXBDbHMoKTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gaW5zdGFuY2UuZ2V0TWV0YWRhdGEoKTtcblxuICAgICAgLy8gSW5qZWN0IGxvZ2dlclxuICAgICAgY29uc3QgbG9nZ2VyID0gbmV3IFN0ZXBMb2dnZXIoe1xuICAgICAgICBsb2dEaXI6IHRoaXMubG9nRGlyLFxuICAgICAgICBleGVjdXRpb25JZDogdGhpcy5leGVjdXRpb25JZCxcbiAgICAgICAgc3RlcFR5cGU6IG1ldGFkYXRhLnN0ZXBUeXBlLFxuICAgICAgfSk7XG4gICAgICBpbnN0YW5jZS5fc2V0TG9nZ2VyKGxvZ2dlcik7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHBhcmFtcyBhZ2FpbnN0IHRoZSBzdGVwJ3Mgc2NoZW1hXG4gICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IG1ldGFkYXRhLnNjaGVtYS5zYWZlUGFyc2UocGFyYW1zKTtcbiAgICAgIGlmICghcGFyc2VSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aGlzLndyaXRlT3V0cHV0KFxuICAgICAgICAgIFN0ZXBPdXRwdXRzLmZhaWxlZChcbiAgICAgICAgICAgIGBJbnZhbGlkIHBhcmFtczogJHtwYXJzZVJlc3VsdC5lcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICBcIklOVkFMSURfUEFSQU1TXCJcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWRhdGVkUGFyYW1zID0gcGFyc2VSZXN1bHQuZGF0YTtcblxuICAgICAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcGhhc2UgYmFzZWQgb24gc3RlcCBraW5kIGFuZCBpbnB1dCBjb250ZXh0XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnJvdXRlRXhlY3V0aW9uKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIHZhbGlkYXRlZFBhcmFtcyxcbiAgICAgICAgYXBwcm92YWxDb250ZXh0LFxuICAgICAgICBwb2xsaW5nU3RhdGVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMud3JpdGVPdXRwdXQob3V0cHV0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgdGhpcy53cml0ZU91dHB1dChTdGVwT3V0cHV0cy5mYWlsZWQoZXJyb3JNZXNzYWdlLCBcIkVYRUNVVElPTl9FUlJPUlwiKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByb3V0ZUV4ZWN1dGlvbihcbiAgICBpbnN0YW5jZTogQmFzZVN0ZXA8dW5rbm93bj4sXG4gICAgbWV0YWRhdGE6IFN0ZXBNZXRhZGF0YSxcbiAgICBwYXJhbXM6IHVua25vd24sXG4gICAgYXBwcm92YWxDb250ZXh0PzogQXBwcm92YWxDb250ZXh0LFxuICAgIHBvbGxpbmdTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8U3RlcE91dHB1dD4ge1xuICAgIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSBtZXRhZGF0YS5yZXF1aXJlc0FwcHJvdmFsO1xuXG4gICAgaWYgKG1ldGFkYXRhLnN0ZXBLaW5kID09PSBcInNpbXBsZVwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZVNpbXBsZVN0ZXAoXG4gICAgICAgIGluc3RhbmNlIGFzIFNpbXBsZVN0ZXA8dW5rbm93bj4sXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgcmVxdWlyZXNBcHByb3ZhbCxcbiAgICAgICAgYXBwcm92YWxDb250ZXh0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5zdGVwS2luZCA9PT0gXCJwb2xsaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUG9sbGluZ1N0ZXAoXG4gICAgICAgIGluc3RhbmNlIGFzIFBvbGxpbmdTdGVwPHVua25vd24sIFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsLFxuICAgICAgICBhcHByb3ZhbENvbnRleHQsXG4gICAgICAgIHBvbGxpbmdTdGF0ZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RlcE91dHB1dHMuZmFpbGVkKFxuICAgICAgYFVua25vd24gc3RlcCBraW5kOiAke21ldGFkYXRhLnN0ZXBLaW5kfWAsXG4gICAgICBcIlVOS05PV05fU1RFUF9LSU5EXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIFNpbXBsZVN0ZXAgZXhlY3V0aW9uIGJhc2VkIG9uIGFwcHJvdmFsIHN0YXRlLlxuICAgKlxuICAgKiB8IHJlcXVpcmVzQXBwcm92YWwgfCBhcHByb3ZhbENvbnRleHQgcHJvdmlkZWQ/IHwgQWN0aW9uICAgICAgICAgICAgICB8XG4gICAqIHwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICogfCBObyAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgICAgICAgICB8IENhbGwgcnVuKHBhcmFtcykgICAgfFxuICAgKiB8IFllcyAgICAgICAgICAgICAgfCBObyAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2FsbCBwcmVwYXJlKHBhcmFtcyl8XG4gICAqIHwgWWVzICAgICAgICAgICAgICB8IFllcyAgICAgICAgICAgICAgICAgICAgICAgfCBDYWxsIHJ1bihwYXJhbXMsIGFwcHJvdmFsKSB8XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJvdXRlU2ltcGxlU3RlcChcbiAgICBpbnN0YW5jZTogU2ltcGxlU3RlcDx1bmtub3duPixcbiAgICBwYXJhbXM6IHVua25vd24sXG4gICAgcmVxdWlyZXNBcHByb3ZhbDogYm9vbGVhbixcbiAgICBhcHByb3ZhbENvbnRleHQ/OiBBcHByb3ZhbENvbnRleHRcbiAgKTogUHJvbWlzZTxTdGVwT3V0cHV0PiB7XG4gICAgaWYgKCFyZXF1aXJlc0FwcHJvdmFsKSB7XG4gICAgICAvLyBObyBhcHByb3ZhbCBuZWVkZWQgLSBqdXN0IHJ1blxuICAgICAgcmV0dXJuIGluc3RhbmNlLmV4ZWN1dGUocGFyYW1zLCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGlmICghYXBwcm92YWxDb250ZXh0KSB7XG4gICAgICAvLyBOZWVkcyBhcHByb3ZhbCBidXQgZG9uJ3QgaGF2ZSBpdCB5ZXQgLSBjYWxsIHByZXBhcmVcbiAgICAgIHJldHVybiBpbnN0YW5jZS5wcmVwYXJlKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gSGF2ZSBhcHByb3ZhbCAtIHJ1biB3aXRoIGFwcHJvdmFsIGNvbnRleHRcbiAgICByZXR1cm4gaW5zdGFuY2UuZXhlY3V0ZShwYXJhbXMsIGFwcHJvdmFsQ29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgUG9sbGluZ1N0ZXAgZXhlY3V0aW9uIGJhc2VkIG9uIGFwcHJvdmFsIGFuZCBwb2xsaW5nIHN0YXRlLlxuICAgKlxuICAgKiB8IHJlcXVpcmVzQXBwcm92YWwgfCBhcHByb3ZhbENvbnRleHQ/IHwgcG9sbGluZ1N0YXRlPyB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gICAqIHwgTm8gICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgfCBObyAgICAgICAgICAgIHwgQ2FsbCB0cmlnZ2VyKHBhcmFtcykgICAgICAgICAgfFxuICAgKiB8IE5vICAgICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgIHwgWWVzICAgICAgICAgICB8IENhbGwgcG9sbChwYXJhbXMsIHBvbGxpbmdTdGF0ZSl8XG4gICAqIHwgWWVzICAgICAgICAgICAgICB8IE5vICAgICAgICAgICAgICAgfCBObyAgICAgICAgICAgIHwgQ2FsbCBwcmVwYXJlKHBhcmFtcykgICAgICAgICAgfFxuICAgKiB8IFllcyAgICAgICAgICAgICAgfCBZZXMgICAgICAgICAgICAgIHwgTm8gICAgICAgICAgICB8IENhbGwgdHJpZ2dlcihwYXJhbXMsIGFwcHJvdmFsKXxcbiAgICogfCBZZXMgICAgICAgICAgICAgIHwgWWVzICAgICAgICAgICAgICB8IFllcyAgICAgICAgICAgfCBDYWxsIHBvbGwocGFyYW1zLCBwb2xsaW5nU3RhdGUpfFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByb3V0ZVBvbGxpbmdTdGVwKFxuICAgIGluc3RhbmNlOiBQb2xsaW5nU3RlcDx1bmtub3duLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgcGFyYW1zOiB1bmtub3duLFxuICAgIHJlcXVpcmVzQXBwcm92YWw6IGJvb2xlYW4sXG4gICAgYXBwcm92YWxDb250ZXh0PzogQXBwcm92YWxDb250ZXh0LFxuICAgIHBvbGxpbmdTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8U3RlcE91dHB1dD4ge1xuICAgIC8vIElmIHdlIGhhdmUgcG9sbGluZyBzdGF0ZSwgd2UncmUgaW4gdGhlIHBvbGwgcGhhc2UgKHJlZ2FyZGxlc3Mgb2YgYXBwcm92YWwpXG4gICAgaWYgKHBvbGxpbmdTdGF0ZSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLmV4ZWN1dGVQb2xsKHBhcmFtcywgcG9sbGluZ1N0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVpcmVzQXBwcm92YWwpIHtcbiAgICAgIC8vIE5vIGFwcHJvdmFsIG5lZWRlZCAtIHRyaWdnZXIgZGlyZWN0bHlcbiAgICAgIHJldHVybiBpbnN0YW5jZS5leGVjdXRlVHJpZ2dlcihwYXJhbXMsIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgaWYgKCFhcHByb3ZhbENvbnRleHQpIHtcbiAgICAgIC8vIE5lZWRzIGFwcHJvdmFsIGJ1dCBkb24ndCBoYXZlIGl0IHlldCAtIGNhbGwgcHJlcGFyZVxuICAgICAgcmV0dXJuIGluc3RhbmNlLnByZXBhcmUocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBIYXZlIGFwcHJvdmFsIC0gdHJpZ2dlciB3aXRoIGFwcHJvdmFsIGNvbnRleHRcbiAgICByZXR1cm4gaW5zdGFuY2UuZXhlY3V0ZVRyaWdnZXIocGFyYW1zLCBhcHByb3ZhbENvbnRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSB3cml0ZU91dHB1dChvdXRwdXQ6IFN0ZXBPdXRwdXQpOiB2b2lkIHtcbiAgICBjb25zdCBvdXRwdXREaXIgPSBwYXRoLmRpcm5hbWUodGhpcy5vdXRwdXRQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKG91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLm91dHB1dFBhdGgsIEpTT04uc3RyaW5naWZ5KG91dHB1dCwgbnVsbCwgMikpO1xuICB9XG59XG4iXX0=
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWdpc3RyeS9zdGVwLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0Isd0RBQWdDO0FBQ2hDLDhDQUFvQjtBQUlwQix3REFBb0Q7QUFFcEQsdURBQTJFO0FBRTNFLGdGQUFnRjtBQUNoRixnQkFBZ0I7QUFDaEIsZ0ZBQWdGO0FBRWhGLE1BQU0sNEJBQTRCLEdBQUcsYUFBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QyxHQUFHLEVBQUUsYUFBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztDQUN0QyxDQUFDLENBQUM7QUFFSCxNQUFNLHlCQUF5QixHQUFHLGFBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekMsR0FBRyxFQUFFLGFBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ3pCLElBQUksRUFBRSxhQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLE1BQU0sRUFBRSxhQUFDLENBQUMsTUFBTSxDQUFDLGFBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDckMsNERBQTREO0lBQzVELGVBQWUsRUFBRSxtQ0FBcUIsQ0FBQyxRQUFRLEVBQUU7SUFDakQsWUFBWSxFQUFFLGFBQUMsQ0FBQyxNQUFNLENBQUMsYUFBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLGFBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtDQUN2RCxDQUFDLENBQUM7QUFFVSxRQUFBLHVCQUF1QixHQUFHLGFBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7SUFDakUseUJBQXlCO0lBQ3pCLDRCQUE0QjtDQUM3QixDQUFDLENBQUM7QUFJSCxnRkFBZ0Y7QUFDaEYsZ0JBQWdCO0FBQ2hCLGdGQUFn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QUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQixzREFBc0Q7WUFDdEQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU8sV0FBVyxDQUFDLE1BQWtCO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDOUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQWpRRCxvQ0FpUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBtaW5pbWlzdCBmcm9tIFwibWluaW1pc3RcIjtcbmltcG9ydCB6IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQmFzZVN0ZXAsIFN0ZXBEYXRhLCBTdGVwTWV0YWRhdGEgfSBmcm9tIFwiLi4vYmFzZS9iYXNlLXN0ZXBcIjtcbmltcG9ydCB0eXBlIHsgU2ltcGxlU3RlcCB9IGZyb20gXCIuLi9iYXNlL3NpbXBsZS1zdGVwXCI7XG5pbXBvcnQgdHlwZSB7IFBvbGxpbmdTdGVwIH0gZnJvbSBcIi4uL2Jhc2UvcG9sbGluZy1zdGVwXCI7XG5pbXBvcnQgeyBTdGVwTG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dpbmcvc3RlcC1sb2dnZXJcIjtcbmltcG9ydCB0eXBlIHsgQXBwcm92YWxDb250ZXh0LCBTdGVwT3V0cHV0IH0gZnJvbSBcIi4uL291dHB1dC9zdGVwLW91dHB1dFwiO1xuaW1wb3J0IHsgQXBwcm92YWxDb250ZXh0U2NoZW1hLCBTdGVwT3V0cHV0cyB9IGZyb20gXCIuLi9vdXRwdXQvc3RlcC1vdXRwdXRcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElucHV0IFNjaGVtYXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IFN0ZXBSZWdpc3RyeVN5bnRoZXNpemVTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGpvYjogei5saXRlcmFsKFwiU1lOVEhFU0laRS1NRVRBREFUQVwiKSxcbn0pO1xuXG5jb25zdCBTdGVwUmVnaXN0cnlFeGVjdXRlU2NoZW1hID0gei5vYmplY3Qoe1xuICBqb2I6IHoubGl0ZXJhbChcIkVYRUNVVEVcIiksXG4gIHR5cGU6IHouc3RyaW5nKCksXG4gIHBhcmFtczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSksXG4gIC8vIE9wdGlvbmFsIGNvbnRleHQgLSBwcmVzZW5jZSBkZXRlcm1pbmVzIHdoaWNoIHBoYXNlIHRvIHJ1blxuICBhcHByb3ZhbENvbnRleHQ6IEFwcHJvdmFsQ29udGV4dFNjaGVtYS5vcHRpb25hbCgpLFxuICBwb2xsaW5nU3RhdGU6IHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFN0ZXBSZWdpc3RyeUlucHV0U2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJqb2JcIiwgW1xuICBTdGVwUmVnaXN0cnlFeGVjdXRlU2NoZW1hLFxuICBTdGVwUmVnaXN0cnlTeW50aGVzaXplU2NoZW1hLFxuXSk7XG5cbmV4cG9ydCB0eXBlIFN0ZXBSZWdpc3RyeUlucHV0ID0gei5pbmZlcjx0eXBlb2YgU3RlcFJlZ2lzdHJ5SW5wdXRTY2hlbWE+O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29uZmlndXJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgREVGQVVMVF9PVVRQVVRfUEFUSCA9IFwiL3RtcC9zdGVwLW91dHB1dC5qc29uXCI7XG5jb25zdCBERUZBVUxUX0xPR19ESVIgPSBcIi90bXAvc3RlcC1sb2dzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTdGVwUmVnaXN0cnlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBTdGVwUmVnaXN0cnkge1xuICBwcml2YXRlIHN0ZXBzOiBNYXA8c3RyaW5nLCBCYXNlU3RlcDx1bmtub3duPj47XG4gIHByaXZhdGUgb3V0cHV0UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGxvZ0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBzdGVwczogQmFzZVN0ZXA8dW5rbm93bj5bXSxcbiAgICBvdXRwdXRQYXRoOiBzdHJpbmcsXG4gICAgbG9nRGlyOiBzdHJpbmcsXG4gICAgZXhlY3V0aW9uSWQ6IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLnN0ZXBzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7XG4gICAgdGhpcy5sb2dEaXIgPSBsb2dEaXI7XG4gICAgdGhpcy5leGVjdXRpb25JZCA9IGV4ZWN1dGlvbklkO1xuXG4gICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBzdGVwcykge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBpbnN0YW5jZS5nZXRNZXRhZGF0YSgpO1xuICAgICAgdGhpcy5zdGVwcy5zZXQobWV0YWRhdGEuc3RlcFR5cGUsIGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFpbiBlbnRyeXBvaW50IGZvciBydW5uaW5nIHN0ZXBzLlxuICAgKiBQYXJzZXMgQ0xJIGFyZ3MgYW5kIGVpdGhlciBzeW50aGVzaXplcyBtZXRhZGF0YSBvciBleGVjdXRlcyBhIHN0ZXAuXG4gICAqXG4gICAqIFVzYWdlIGluIHVzZXIncyBlbnRyeXBvaW50IGZpbGU6XG4gICAqIGBgYFxuICAgKiBTdGVwUmVnaXN0cnkucnVuKFtcbiAgICogICBuZXcgTXlTdGVwMShkZXBlbmRlbmN5MSwgZGVwZW5kZW5jeTIpLFxuICAgKiAgIG5ldyBNeVN0ZXAyKGNvbmZpZylcbiAgICogXSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBDTEkgYXJndW1lbnRzOlxuICAgKiAtIC0taW5wdXQ6IEpTT04gYmxvYiB3aXRoIGpvYiB0eXBlIGFuZCBwYXJhbWV0ZXJzXG4gICAqIC0gLS1vdXRwdXQ6IFBhdGggdG8gd3JpdGUgb3V0cHV0IEpTT04gKGRlZmF1bHQ6IC90bXAvc3RlcC1vdXRwdXQuanNvbilcbiAgICogLSAtLWxvZy1kaXI6IERpcmVjdG9yeSBmb3IgbG9nIGZpbGVzIChkZWZhdWx0OiAvdG1wL3N0ZXAtbG9ncylcbiAgICogLSAtLWV4ZWN1dGlvbi1pZDogVW5pcXVlIElEIGZvciB0aGlzIGV4ZWN1dGlvbiAocmVxdWlyZWQgZm9yIGxvZ2dpbmcpXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcnVuKHN0ZXBzOiBCYXNlU3RlcDx1bmtub3duPltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXJncyA9IG1pbmltaXN0KHByb2Nlc3MuYXJndi5zbGljZSgyKSk7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IGFyZ3NbXCJvdXRwdXRcIl0gfHwgREVGQVVMVF9PVVRQVVRfUEFUSDtcbiAgICBjb25zdCBsb2dEaXIgPSBhcmdzW1wibG9nLWRpclwiXSB8fCBERUZBVUxUX0xPR19ESVI7XG4gICAgY29uc3QgZXhlY3V0aW9uSWQgPSBhcmdzW1wiZXhlY3V0aW9uLWlkXCJdIHx8IGBleGVjLSR7RGF0ZS5ub3coKX1gO1xuXG4gICAgY29uc3QgcmVnaXN0cnkgPSBuZXcgU3RlcFJlZ2lzdHJ5KHN0ZXBzLCBvdXRwdXRQYXRoLCBsb2dEaXIsIGV4ZWN1dGlvbklkKTtcbiAgICBhd2FpdCByZWdpc3RyeS5leGVjdXRlKGFyZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlKGFyZ3M6IG1pbmltaXN0LlBhcnNlZEFyZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5wdXQgPSBTdGVwUmVnaXN0cnlJbnB1dFNjaGVtYS5wYXJzZShKU09OLnBhcnNlKGFyZ3NbXCJpbnB1dFwiXSkpO1xuXG4gICAgICBzd2l0Y2ggKGlucHV0LmpvYikge1xuICAgICAgICBjYXNlIFwiU1lOVEhFU0laRS1NRVRBREFUQVwiOiB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnN5bnRoZXNpemVNZXRhZGF0YSgpO1xuICAgICAgICAgIHRoaXMud3JpdGVPdXRwdXQoeyBzdGF0dXM6IFwiU1VDQ0VTU1wiLCBkYXRhOiB7IG1ldGFkYXRhIH0gfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwiRVhFQ1VURVwiOiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlU3RlcChcbiAgICAgICAgICAgIGlucHV0LnR5cGUsXG4gICAgICAgICAgICBpbnB1dC5wYXJhbXMsXG4gICAgICAgICAgICBpbnB1dC5hcHByb3ZhbENvbnRleHQsXG4gICAgICAgICAgICBpbnB1dC5wb2xsaW5nU3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIHRoaXMud3JpdGVPdXRwdXQoU3RlcE91dHB1dHMuZmFpbGVkKGVycm9yTWVzc2FnZSwgXCJSRUdJU1RSWV9FUlJPUlwiKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW50aGVzaXplTWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhW10ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBTdGVwTWV0YWRhdGFbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiB0aGlzLnN0ZXBzLnZhbHVlcygpKSB7XG4gICAgICBtZXRhZGF0YS5wdXNoKGluc3RhbmNlLmdldE1ldGFkYXRhKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVN0ZXAoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgYXBwcm92YWxDb250ZXh0PzogQXBwcm92YWxDb250ZXh0LFxuICAgIHBvbGxpbmdTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5zdGVwcy5nZXQodHlwZSk7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICB0aGlzLndyaXRlT3V0cHV0KFxuICAgICAgICBTdGVwT3V0cHV0cy5mYWlsZWQoXG4gICAgICAgICAgYE5vIHN0ZXAgcmVnaXN0ZXJlZCB3aXRoIHR5cGU6ICR7dHlwZX1gLFxuICAgICAgICAgIFwiU1RFUF9OT1RfRk9VTkRcIlxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gaW5zdGFuY2UuZ2V0RGF0YSgpO1xuXG4gICAgICAvLyBJbmplY3QgbG9nZ2VyXG4gICAgICBjb25zdCBsb2dnZXIgPSBuZXcgU3RlcExvZ2dlcih7XG4gICAgICAgIGxvZ0RpcjogdGhpcy5sb2dEaXIsXG4gICAgICAgIGV4ZWN1dGlvbklkOiB0aGlzLmV4ZWN1dGlvbklkLFxuICAgICAgICBzdGVwVHlwZTogZGF0YS5zdGVwVHlwZSxcbiAgICAgIH0pO1xuICAgICAgaW5zdGFuY2UuX3NldExvZ2dlcihsb2dnZXIpO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBwYXJhbXMgYWdhaW5zdCB0aGUgc3RlcCdzIHNjaGVtYVxuICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBkYXRhLnNjaGVtYS5zYWZlUGFyc2UocGFyYW1zKTtcbiAgICAgIGlmICghcGFyc2VSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aGlzLndyaXRlT3V0cHV0KFxuICAgICAgICAgIFN0ZXBPdXRwdXRzLmZhaWxlZChcbiAgICAgICAgICAgIGBJbnZhbGlkIHBhcmFtczogJHtwYXJzZVJlc3VsdC5lcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICBcIklOVkFMSURfUEFSQU1TXCJcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWRhdGVkUGFyYW1zID0gcGFyc2VSZXN1bHQuZGF0YTtcblxuICAgICAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcGhhc2UgYmFzZWQgb24gc3RlcCBraW5kIGFuZCBpbnB1dCBjb250ZXh0XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnJvdXRlRXhlY3V0aW9uKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdmFsaWRhdGVkUGFyYW1zLFxuICAgICAgICBhcHByb3ZhbENvbnRleHQsXG4gICAgICAgIHBvbGxpbmdTdGF0ZVxuICAgICAgKTtcblxuICAgICAgdGhpcy53cml0ZU91dHB1dChvdXRwdXQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICB0aGlzLndyaXRlT3V0cHV0KFN0ZXBPdXRwdXRzLmZhaWxlZChlcnJvck1lc3NhZ2UsIFwiRVhFQ1VUSU9OX0VSUk9SXCIpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJvdXRlRXhlY3V0aW9uKFxuICAgIGluc3RhbmNlOiBCYXNlU3RlcDx1bmtub3duPixcbiAgICBkYXRhOiBTdGVwRGF0YSxcbiAgICBwYXJhbXM6IHVua25vd24sXG4gICAgYXBwcm92YWxDb250ZXh0PzogQXBwcm92YWxDb250ZXh0LFxuICAgIHBvbGxpbmdTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8U3RlcE91dHB1dD4ge1xuICAgIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSBkYXRhLnJlcXVpcmVzQXBwcm92YWw7XG5cbiAgICBpZiAoZGF0YS5zdGVwS2luZCA9PT0gXCJzaW1wbGVcIikge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVTaW1wbGVTdGVwKFxuICAgICAgICBpbnN0YW5jZSBhcyBTaW1wbGVTdGVwPHVua25vd24+LFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlcXVpcmVzQXBwcm92YWwsXG4gICAgICAgIGFwcHJvdmFsQ29udGV4dFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5zdGVwS2luZCA9PT0gXCJwb2xsaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUG9sbGluZ1N0ZXAoXG4gICAgICAgIGluc3RhbmNlIGFzIFBvbGxpbmdTdGVwPHVua25vd24sIFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsLFxuICAgICAgICBhcHByb3ZhbENvbnRleHQsXG4gICAgICAgIHBvbGxpbmdTdGF0ZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RlcE91dHB1dHMuZmFpbGVkKFxuICAgICAgYFVua25vd24gc3RlcCBraW5kOiAke2RhdGEuc3RlcEtpbmR9YCxcbiAgICAgIFwiVU5LTk9XTl9TVEVQX0tJTkRcIlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgU2ltcGxlU3RlcCBleGVjdXRpb24gYmFzZWQgb24gYXBwcm92YWwgc3RhdGUuXG4gICAqXG4gICAqIHwgcmVxdWlyZXNBcHByb3ZhbCB8IGFwcHJvdmFsQ29udGV4dCBwcm92aWRlZD8gfCBBY3Rpb24gICAgICAgICAgICAgIHxcbiAgICogfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgKiB8IE5vICAgICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2FsbCBydW4ocGFyYW1zKSAgICB8XG4gICAqIHwgWWVzICAgICAgICAgICAgICB8IE5vICAgICAgICAgICAgICAgICAgICAgICAgfCBDYWxsIHByZXBhcmUocGFyYW1zKXxcbiAgICogfCBZZXMgICAgICAgICAgICAgIHwgWWVzICAgICAgICAgICAgICAgICAgICAgICB8IENhbGwgcnVuKHBhcmFtcywgYXBwcm92YWwpIHxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcm91dGVTaW1wbGVTdGVwKFxuICAgIGluc3RhbmNlOiBTaW1wbGVTdGVwPHVua25vd24+LFxuICAgIHBhcmFtczogdW5rbm93bixcbiAgICByZXF1aXJlc0FwcHJvdmFsOiBib29sZWFuLFxuICAgIGFwcHJvdmFsQ29udGV4dD86IEFwcHJvdmFsQ29udGV4dFxuICApOiBQcm9taXNlPFN0ZXBPdXRwdXQ+IHtcbiAgICBpZiAoIXJlcXVpcmVzQXBwcm92YWwpIHtcbiAgICAgIC8vIE5vIGFwcHJvdmFsIG5lZWRlZCAtIGp1c3QgcnVuXG4gICAgICByZXR1cm4gaW5zdGFuY2UuZXhlY3V0ZShwYXJhbXMsIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgaWYgKCFhcHByb3ZhbENvbnRleHQpIHtcbiAgICAgIC8vIE5lZWRzIGFwcHJvdmFsIGJ1dCBkb24ndCBoYXZlIGl0IHlldCAtIGNhbGwgcHJlcGFyZVxuICAgICAgcmV0dXJuIGluc3RhbmNlLnByZXBhcmUocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBIYXZlIGFwcHJvdmFsIC0gcnVuIHdpdGggYXBwcm92YWwgY29udGV4dFxuICAgIHJldHVybiBpbnN0YW5jZS5leGVjdXRlKHBhcmFtcywgYXBwcm92YWxDb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZSBQb2xsaW5nU3RlcCBleGVjdXRpb24gYmFzZWQgb24gYXBwcm92YWwgYW5kIHBvbGxpbmcgc3RhdGUuXG4gICAqXG4gICAqIHwgcmVxdWlyZXNBcHByb3ZhbCB8IGFwcHJvdmFsQ29udGV4dD8gfCBwb2xsaW5nU3RhdGU/IHwgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICogfCBObyAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICB8IE5vICAgICAgICAgICAgfCBDYWxsIHRyaWdnZXIocGFyYW1zKSAgICAgICAgICB8XG4gICAqIHwgTm8gICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgfCBZZXMgICAgICAgICAgIHwgQ2FsbCBwb2xsKHBhcmFtcywgcG9sbGluZ1N0YXRlKXxcbiAgICogfCBZZXMgICAgICAgICAgICAgIHwgTm8gICAgICAgICAgICAgICB8IE5vICAgICAgICAgICAgfCBDYWxsIHByZXBhcmUocGFyYW1zKSAgICAgICAgICB8XG4gICAqIHwgWWVzICAgICAgICAgICAgICB8IFllcyAgICAgICAgICAgICAgfCBObyAgICAgICAgICAgIHwgQ2FsbCB0cmlnZ2VyKHBhcmFtcywgYXBwcm92YWwpfFxuICAgKiB8IFllcyAgICAgICAgICAgICAgfCBZZXMgICAgICAgICAgICAgIHwgWWVzICAgICAgICAgICB8IENhbGwgcG9sbChwYXJhbXMsIHBvbGxpbmdTdGF0ZSl8XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJvdXRlUG9sbGluZ1N0ZXAoXG4gICAgaW5zdGFuY2U6IFBvbGxpbmdTdGVwPHVua25vd24sIFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBwYXJhbXM6IHVua25vd24sXG4gICAgcmVxdWlyZXNBcHByb3ZhbDogYm9vbGVhbixcbiAgICBhcHByb3ZhbENvbnRleHQ/OiBBcHByb3ZhbENvbnRleHQsXG4gICAgcG9sbGluZ1N0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTxTdGVwT3V0cHV0PiB7XG4gICAgLy8gSWYgd2UgaGF2ZSBwb2xsaW5nIHN0YXRlLCB3ZSdyZSBpbiB0aGUgcG9sbCBwaGFzZSAocmVnYXJkbGVzcyBvZiBhcHByb3ZhbClcbiAgICBpZiAocG9sbGluZ1N0YXRlKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuZXhlY3V0ZVBvbGwocGFyYW1zLCBwb2xsaW5nU3RhdGUpO1xuICAgIH1cblxuICAgIGlmICghcmVxdWlyZXNBcHByb3ZhbCkge1xuICAgICAgLy8gTm8gYXBwcm92YWwgbmVlZGVkIC0gdHJpZ2dlciBkaXJlY3RseVxuICAgICAgcmV0dXJuIGluc3RhbmNlLmV4ZWN1dGVUcmlnZ2VyKHBhcmFtcywgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBpZiAoIWFwcHJvdmFsQ29udGV4dCkge1xuICAgICAgLy8gTmVlZHMgYXBwcm92YWwgYnV0IGRvbid0IGhhdmUgaXQgeWV0IC0gY2FsbCBwcmVwYXJlXG4gICAgICByZXR1cm4gaW5zdGFuY2UucHJlcGFyZShwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIEhhdmUgYXBwcm92YWwgLSB0cmlnZ2VyIHdpdGggYXBwcm92YWwgY29udGV4dFxuICAgIHJldHVybiBpbnN0YW5jZS5leGVjdXRlVHJpZ2dlcihwYXJhbXMsIGFwcHJvdmFsQ29udGV4dCk7XG4gIH1cblxuICBwcml2YXRlIHdyaXRlT3V0cHV0KG91dHB1dDogU3RlcE91dHB1dCk6IHZvaWQge1xuICAgIGNvbnN0IG91dHB1dERpciA9IHBhdGguZGlybmFtZSh0aGlzLm91dHB1dFBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhvdXRwdXREaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMub3V0cHV0UGF0aCwgSlNPTi5zdHJpbmdpZnkob3V0cHV0LCBudWxsLCAyKSk7XG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devramps/sdk-typescript",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "SDK for building custom deployment steps for DevRamps",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
"LICENSE",
|
|
11
11
|
"README.md"
|
|
12
12
|
],
|
|
13
|
+
"bin": {
|
|
14
|
+
"create-step-registry": "./scripts/create-step-registry.js"
|
|
15
|
+
},
|
|
13
16
|
"exports": {
|
|
14
17
|
".": {
|
|
15
18
|
"import": "./dist/index.js",
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const { execSync } = require("child_process");
|
|
6
|
+
|
|
7
|
+
// Get optional folder name from command line args, default to "step-registry"
|
|
8
|
+
const folderName = process.argv[3] || "step-registry";
|
|
9
|
+
|
|
10
|
+
// Define the base directory
|
|
11
|
+
const baseDir = path.join(process.cwd(), folderName);
|
|
12
|
+
|
|
13
|
+
// Create the folder
|
|
14
|
+
console.log(`Creating ${folderName} folder...`);
|
|
15
|
+
if (!fs.existsSync(baseDir)) {
|
|
16
|
+
fs.mkdirSync(baseDir);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Initialize NPM project
|
|
20
|
+
console.log("Initializing NPM project...");
|
|
21
|
+
execSync("npm init -y", { cwd: baseDir, stdio: "inherit" });
|
|
22
|
+
|
|
23
|
+
// Install dependencies
|
|
24
|
+
console.log("Installing dependencies...");
|
|
25
|
+
execSync("npm install @devramps/sdk-typescript zod", {
|
|
26
|
+
cwd: baseDir,
|
|
27
|
+
stdio: "inherit",
|
|
28
|
+
});
|
|
29
|
+
execSync("npm install --save-dev @types/node jest ts-jest @types/jest", {
|
|
30
|
+
cwd: baseDir,
|
|
31
|
+
stdio: "inherit",
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Create src folder structure
|
|
35
|
+
const srcDir = path.join(baseDir, "src");
|
|
36
|
+
const stepsDir = path.join(srcDir, "steps");
|
|
37
|
+
console.log("Creating src/steps folder structure...");
|
|
38
|
+
if (!fs.existsSync(srcDir)) {
|
|
39
|
+
fs.mkdirSync(srcDir);
|
|
40
|
+
}
|
|
41
|
+
if (!fs.existsSync(stepsDir)) {
|
|
42
|
+
fs.mkdirSync(stepsDir, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Create tst folder structure
|
|
46
|
+
const tstDir = path.join(baseDir, "tst");
|
|
47
|
+
const tstStepsDir = path.join(tstDir, "steps");
|
|
48
|
+
console.log("Creating tst/steps folder structure...");
|
|
49
|
+
if (!fs.existsSync(tstDir)) {
|
|
50
|
+
fs.mkdirSync(tstDir);
|
|
51
|
+
}
|
|
52
|
+
if (!fs.existsSync(tstStepsDir)) {
|
|
53
|
+
fs.mkdirSync(tstStepsDir, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Create deployment-service.ts (dependency example)
|
|
57
|
+
console.log("Creating deployment-service.ts...");
|
|
58
|
+
const deploymentServiceContent = `export interface DeploymentService {
|
|
59
|
+
deploy(target: string, version?: string): Promise<{ deploymentId: string }>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export class RealDeploymentService implements DeploymentService {
|
|
63
|
+
async deploy(target: string, version?: string): Promise<{ deploymentId: string }> {
|
|
64
|
+
// Simulate a deployment
|
|
65
|
+
console.log(\`Deploying to \${target}\${version ? \` version \${version}\` : ""}\`);
|
|
66
|
+
return { deploymentId: \`deploy-\${Date.now()}\` };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
`;
|
|
70
|
+
fs.writeFileSync(
|
|
71
|
+
path.join(srcDir, "deployment-service.ts"),
|
|
72
|
+
deploymentServiceContent
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
// Create my-first-step.ts
|
|
76
|
+
console.log("Creating my-first-step.ts...");
|
|
77
|
+
const myFirstStepContent = `import {
|
|
78
|
+
RunOutput,
|
|
79
|
+
SimpleStep,
|
|
80
|
+
Step,
|
|
81
|
+
StepOutputs,
|
|
82
|
+
} from "@devramps/sdk-typescript";
|
|
83
|
+
import z from "zod";
|
|
84
|
+
import { DeploymentService } from "../deployment-service";
|
|
85
|
+
|
|
86
|
+
const DeploySchema = z.object({
|
|
87
|
+
target: z.string().describe("A Target"),
|
|
88
|
+
version: z.string().optional(),
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
type DeployParams = z.infer<typeof DeploySchema>;
|
|
92
|
+
|
|
93
|
+
@Step({
|
|
94
|
+
name: "Custom Deployment Action",
|
|
95
|
+
type: "CUSTOM:SCRIPT:DEPLOY",
|
|
96
|
+
schema: DeploySchema,
|
|
97
|
+
})
|
|
98
|
+
export class MyFirstStep extends SimpleStep<DeployParams> {
|
|
99
|
+
constructor(private deploymentService: DeploymentService) {
|
|
100
|
+
super();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async run(params: DeployParams): Promise<RunOutput> {
|
|
104
|
+
this.logger.info(\`Deploying with params: \${JSON.stringify(params)}\`);
|
|
105
|
+
|
|
106
|
+
const result = await this.deploymentService.deploy(
|
|
107
|
+
params.target,
|
|
108
|
+
params.version
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
this.logger.info(\`Deployment completed: \${result.deploymentId}\`);
|
|
112
|
+
|
|
113
|
+
return StepOutputs.success({
|
|
114
|
+
deploymentId: result.deploymentId,
|
|
115
|
+
target: params.target,
|
|
116
|
+
version: params.version,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
`;
|
|
121
|
+
fs.writeFileSync(path.join(stepsDir, "my-first-step.ts"), myFirstStepContent);
|
|
122
|
+
|
|
123
|
+
// Create src/index.ts
|
|
124
|
+
console.log("Creating src/index.ts...");
|
|
125
|
+
const indexContent = `import { StepRegistry } from "@devramps/sdk-typescript";
|
|
126
|
+
import { MyFirstStep } from "./steps/my-first-step";
|
|
127
|
+
import { RealDeploymentService } from "./deployment-service";
|
|
128
|
+
|
|
129
|
+
// Instantiate dependencies
|
|
130
|
+
const deploymentService = new RealDeploymentService();
|
|
131
|
+
|
|
132
|
+
// Instantiate steps with their dependencies
|
|
133
|
+
const myFirstStep = new MyFirstStep(deploymentService);
|
|
134
|
+
|
|
135
|
+
// Register step instances
|
|
136
|
+
StepRegistry.run([myFirstStep]);
|
|
137
|
+
`;
|
|
138
|
+
fs.writeFileSync(path.join(srcDir, "index.ts"), indexContent);
|
|
139
|
+
|
|
140
|
+
// Create tsconfig.json
|
|
141
|
+
console.log("Creating tsconfig.json...");
|
|
142
|
+
const tsconfigContent = `{
|
|
143
|
+
"compilerOptions": {
|
|
144
|
+
"target": "ES2022",
|
|
145
|
+
"module": "commonjs",
|
|
146
|
+
"lib": ["ES2022"],
|
|
147
|
+
"types": ["node", "jest"],
|
|
148
|
+
"declaration": true,
|
|
149
|
+
"strict": true,
|
|
150
|
+
"noImplicitAny": true,
|
|
151
|
+
"strictNullChecks": true,
|
|
152
|
+
"noImplicitThis": true,
|
|
153
|
+
"alwaysStrict": true,
|
|
154
|
+
"noUnusedLocals": false,
|
|
155
|
+
"noUnusedParameters": false,
|
|
156
|
+
"noImplicitReturns": true,
|
|
157
|
+
"noFallthroughCasesInSwitch": false,
|
|
158
|
+
"inlineSourceMap": true,
|
|
159
|
+
"inlineSources": true,
|
|
160
|
+
"experimentalDecorators": true,
|
|
161
|
+
"emitDecoratorMetadata": true,
|
|
162
|
+
"strictPropertyInitialization": false,
|
|
163
|
+
"esModuleInterop": true,
|
|
164
|
+
"skipLibCheck": true,
|
|
165
|
+
"outDir": "./dist",
|
|
166
|
+
"rootDir": "./src"
|
|
167
|
+
},
|
|
168
|
+
"include": ["src/**/*"],
|
|
169
|
+
"exclude": ["node_modules", "dist"]
|
|
170
|
+
}
|
|
171
|
+
`;
|
|
172
|
+
fs.writeFileSync(path.join(baseDir, "tsconfig.json"), tsconfigContent);
|
|
173
|
+
|
|
174
|
+
// Create jest.config.js
|
|
175
|
+
console.log("Creating jest.config.js...");
|
|
176
|
+
const jestConfigContent = `module.exports = {
|
|
177
|
+
preset: 'ts-jest',
|
|
178
|
+
testEnvironment: 'node',
|
|
179
|
+
roots: ['<rootDir>/tst'],
|
|
180
|
+
testMatch: ['**/*.test.ts'],
|
|
181
|
+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
|
|
182
|
+
collectCoverageFrom: [
|
|
183
|
+
'src/**/*.ts',
|
|
184
|
+
'!src/**/*.d.ts',
|
|
185
|
+
],
|
|
186
|
+
};
|
|
187
|
+
`;
|
|
188
|
+
fs.writeFileSync(path.join(baseDir, "jest.config.js"), jestConfigContent);
|
|
189
|
+
|
|
190
|
+
// Create test file for my-first-step
|
|
191
|
+
console.log("Creating tst/steps/my-first-step.test.ts...");
|
|
192
|
+
const testContent = `import { MyFirstStep } from "../../src/steps/my-first-step";
|
|
193
|
+
import { DeploymentService } from "../../src/deployment-service";
|
|
194
|
+
import { StepOutputs } from "@devramps/sdk-typescript";
|
|
195
|
+
|
|
196
|
+
// Mock implementation of DeploymentService for testing
|
|
197
|
+
class MockDeploymentService implements DeploymentService {
|
|
198
|
+
async deploy(target: string, version?: string): Promise<{ deploymentId: string }> {
|
|
199
|
+
return { deploymentId: \`mock-deploy-\${target}-\${version || "latest"}\` };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
describe("MyFirstStep", () => {
|
|
204
|
+
let mockDeploymentService: MockDeploymentService;
|
|
205
|
+
let step: MyFirstStep;
|
|
206
|
+
|
|
207
|
+
beforeEach(() => {
|
|
208
|
+
// Create mock dependency
|
|
209
|
+
mockDeploymentService = new MockDeploymentService();
|
|
210
|
+
// Inject mock into step
|
|
211
|
+
step = new MyFirstStep(mockDeploymentService);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it("should run successfully with valid parameters", async () => {
|
|
215
|
+
const params = {
|
|
216
|
+
target: "production",
|
|
217
|
+
version: "1.0.0",
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const result = await step.run(params);
|
|
221
|
+
|
|
222
|
+
expect(result.status).toBe("SUCCESS");
|
|
223
|
+
if (result.status === "SUCCESS") {
|
|
224
|
+
expect(result.data).toEqual({
|
|
225
|
+
deploymentId: "mock-deploy-production-1.0.0",
|
|
226
|
+
target: "production",
|
|
227
|
+
version: "1.0.0",
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it("should run successfully without optional version parameter", async () => {
|
|
233
|
+
const params = {
|
|
234
|
+
target: "staging",
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
const result = await step.run(params);
|
|
238
|
+
|
|
239
|
+
expect(result.status).toBe("SUCCESS");
|
|
240
|
+
if (result.status === "SUCCESS") {
|
|
241
|
+
expect(result.data).toEqual({
|
|
242
|
+
deploymentId: "mock-deploy-staging-latest",
|
|
243
|
+
target: "staging",
|
|
244
|
+
version: undefined,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it("should call deployment service with correct parameters", async () => {
|
|
250
|
+
const deploySpy = jest.spyOn(mockDeploymentService, "deploy");
|
|
251
|
+
const params = {
|
|
252
|
+
target: "development",
|
|
253
|
+
version: "2.0.0",
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
await step.run(params);
|
|
257
|
+
|
|
258
|
+
expect(deploySpy).toHaveBeenCalledWith("development", "2.0.0");
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it("should log deployment information", async () => {
|
|
262
|
+
// Access the logger through type assertion to test logging behavior
|
|
263
|
+
const logSpy = jest.spyOn((step as any).logger, "info");
|
|
264
|
+
const params = {
|
|
265
|
+
target: "production",
|
|
266
|
+
version: "3.0.0",
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
await step.run(params);
|
|
270
|
+
|
|
271
|
+
expect(logSpy).toHaveBeenCalledWith(
|
|
272
|
+
\`Deploying with params: \${JSON.stringify(params)}\`
|
|
273
|
+
);
|
|
274
|
+
expect(logSpy).toHaveBeenCalledWith(
|
|
275
|
+
"Deployment completed: mock-deploy-production-3.0.0"
|
|
276
|
+
);
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
`;
|
|
280
|
+
fs.writeFileSync(path.join(tstStepsDir, "my-first-step.test.ts"), testContent);
|
|
281
|
+
|
|
282
|
+
// Update package.json to add build and start scripts
|
|
283
|
+
console.log("Adding build and start scripts to package.json...");
|
|
284
|
+
const packageJsonPath = path.join(baseDir, "package.json");
|
|
285
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
286
|
+
packageJson.scripts = {
|
|
287
|
+
...packageJson.scripts,
|
|
288
|
+
"build-step-registry": "tsc -p tsconfig.json",
|
|
289
|
+
"start-step-registry": "node ./dist/index.js",
|
|
290
|
+
test: "jest",
|
|
291
|
+
"test:watch": "jest --watch",
|
|
292
|
+
"test:coverage": "jest --coverage",
|
|
293
|
+
};
|
|
294
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
295
|
+
|
|
296
|
+
console.log(`\nStep registry created successfully in '${folderName}'!`);
|
|
297
|
+
console.log(`\nNext steps:`);
|
|
298
|
+
console.log(` cd ${folderName}`);
|
|
299
|
+
console.log(` npm run build-step-registry`);
|
|
300
|
+
console.log(` npm run test`);
|