@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.
@@ -1,18 +1,21 @@
1
- import type { ZodType, z } from "zod";
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
- jsonSchema: ZodStandardJSONSchemaPayload<S>;
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
- };
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2UvYmFzZS1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHdEQUFvRDtBQUVwRCx1REFBb0Q7QUFrQnBEOzs7R0FHRztBQUNILE1BQXNCLFFBQVE7SUFDbEIsTUFBTSxHQUFlLElBQUksd0JBQVUsRUFBRSxDQUFDO0lBRWhEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxNQUFrQjtRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULE1BQU0sSUFBSSxLQUFLLENBQ2IseUVBQXlFLENBQzFFLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBZ0I7UUFDNUIsOERBQThEO1FBQzlELGlFQUFpRTtRQUNqRSxPQUFPLHlCQUFXLENBQUMsTUFBTSxDQUN2QixzQ0FBc0MsRUFDdEMseUJBQXlCLENBQzFCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsQ0QsNEJBa0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBab2RUeXBlLCB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwTG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dpbmcvc3RlcC1sb2dnZXJcIjtcbmltcG9ydCB7IE5vT3BMb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2luZy9zdGVwLWxvZ2dlclwiO1xuaW1wb3J0IHR5cGUgeyBQcmVwYXJlT3V0cHV0IH0gZnJvbSBcIi4uL291dHB1dC9zdGVwLW91dHB1dFwiO1xuaW1wb3J0IHsgU3RlcE91dHB1dHMgfSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5pbXBvcnQgdHlwZSB7IFpvZFN0YW5kYXJkSlNPTlNjaGVtYVBheWxvYWQgfSBmcm9tIFwiem9kL3Y0L2NvcmVcIjtcblxuZXhwb3J0IHR5cGUgU3RlcEtpbmQgPSBcInNpbXBsZVwiIHwgXCJwb2xsaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcE1ldGFkYXRhPFMgZXh0ZW5kcyBab2RUeXBlID0gWm9kVHlwZT4ge1xuICBuYW1lPzogc3RyaW5nO1xuICBzaG9ydERlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBsb25nRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHlhbWxFeGFtcGxlPzogc3RyaW5nO1xuICBzY2hlbWE6IFM7XG4gIHN0ZXBLaW5kOiBTdGVwS2luZDtcbiAgcmVxdWlyZXNBcHByb3ZhbDogYm9vbGVhbjtcbiAgc3RlcFR5cGU6IHN0cmluZztcbiAganNvblNjaGVtYTogWm9kU3RhbmRhcmRKU09OU2NoZW1hUGF5bG9hZDxTPjtcbiAgZG9jdW1lbnRhdGlvblVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgc3RlcHMuXG4gKiBQcm92aWRlcyBsb2dnaW5nIGFuZCBjb21tb24gZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTdGVwPFRQYXJhbXMgPSB1bmtub3duPiB7XG4gIHByb3RlY3RlZCBsb2dnZXI6IFN0ZXBMb2dnZXIgPSBuZXcgTm9PcExvZ2dlcigpO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHJlZ2lzdHJ5IHRvIGluamVjdCB0aGUgbG9nZ2VyIGJlZm9yZSBleGVjdXRpb24uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3NldExvZ2dlcihsb2dnZXI6IFN0ZXBMb2dnZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoaXMgc3RlcC5cbiAgICogSW1wbGVtZW50ZWQgYnkgdGhlIEBTdGVwIGRlY29yYXRvci5cbiAgICovXG4gIGdldE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJnZXRNZXRhZGF0YSBub3QgaW1wbGVtZW50ZWQuIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQFN0ZXAgZGVjb3JhdG9yP1wiXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwcmVwYXJlIG1ldGhvZCBmb3IgYXBwcm92YWwgZmxvdy5cbiAgICogT3ZlcnJpZGUgdGhpcyB0byByZXF1aXJlIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRpb24uXG4gICAqIElmIG5vdCBvdmVycmlkZGVuLCB0aGUgc3RlcCB3aWxsIG5vdCByZXF1aXJlIGFwcHJvdmFsLlxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZShfcGFyYW1zOiBUUGFyYW1zKTogUHJvbWlzZTxQcmVwYXJlT3V0cHV0PiB7XG4gICAgLy8gRGVmYXVsdDogbm8gYXBwcm92YWwgcmVxdWlyZWQgLSB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWRcbiAgICAvLyBUaGUgcmVnaXN0cnkgY2hlY2tzIGlmIHByZXBhcmUgaXMgb3ZlcnJpZGRlbiBiZWZvcmUgY2FsbGluZyBpdFxuICAgIHJldHVybiBTdGVwT3V0cHV0cy5mYWlsZWQoXG4gICAgICBcInByZXBhcmUoKSBjYWxsZWQgYnV0IG5vdCBpbXBsZW1lbnRlZFwiLFxuICAgICAgXCJQUkVQQVJFX05PVF9JTVBMRU1FTlRFRFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgcmVwcmVzZW50aW5nIGEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBwcm9kdWNlcyBhIEJhc2VTdGVwIGluc3RhbmNlXG4gKiB3aXRoIHRoZSBnZXRNZXRhZGF0YSBtZXRob2QgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgdHlwZSBTdGVwQ2xhc3M8UyBleHRlbmRzIFpvZFR5cGUgPSBab2RUeXBlPiA9IG5ldyAoXG4gIC4uLmFyZ3M6IGFueVtdXG4pID0+IEJhc2VTdGVwPHouaW5mZXI8Uz4+ICYge1xuICBnZXRNZXRhZGF0YSgpOiBTdGVwTWV0YWRhdGE8Uz47XG59O1xuIl19
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 startJob(params);
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 checkJob(state.jobId);
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 startDangerousJob(params);
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
- * // ... check status
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 startJob(params);
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 checkJob(state.jobId);
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 startDangerousJob(params);
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
- * // ... check status
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9sbGluZy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2UvcG9sbGluZy1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUF1QztBQVF2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RHO0FBQ0gsTUFBc0IsV0FHcEIsU0FBUSxvQkFBaUI7SUF1QnpCOzs7T0FHRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQ2xCLE1BQWUsRUFDZixRQUEwQjtRQUUxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNmLE1BQWUsRUFDZixZQUEyQjtRQUUzQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FDYix5RUFBeUUsQ0FDMUUsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXJERCxrQ0FxREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0ZXBNZXRhZGF0YSB9IGZyb20gXCIuL2Jhc2Utc3RlcFwiO1xuaW1wb3J0IHsgQmFzZVN0ZXAgfSBmcm9tIFwiLi9iYXNlLXN0ZXBcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXBwcm92YWxDb250ZXh0LFxuICBQb2xsT3V0cHV0LFxuICBTdGVwT3V0cHV0LFxuICBUcmlnZ2VyT3V0cHV0LFxufSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5cbi8qKlxuICogQSBwb2xsaW5nIHN0ZXAgZm9yIGxvbmctcnVubmluZyBvcGVyYXRpb25zIHRoYXQgbmVlZCBzdGF0dXMgY2hlY2tzLlxuICpcbiAqIFVzZXJzIGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBpbXBsZW1lbnQ6XG4gKiAtIGB0cmlnZ2VyKHBhcmFtcylgIC0gU3RhcnQgdGhlIG9wZXJhdGlvbiwgcmV0dXJuIGluaXRpYWwgcG9sbGluZyBzdGF0ZVxuICogLSBgcG9sbChwYXJhbXMsIHBvbGxpbmdTdGF0ZSlgIC0gQ2hlY2sgc3RhdHVzLCByZXR1cm4gUE9MTF9BR0FJTiwgU1VDQ0VTUywgb3IgRkFJTEVEXG4gKlxuICogT3B0aW9uYWxseSBvdmVycmlkZSBgcHJlcGFyZWAgdG8gcmVxdWlyZSBhcHByb3ZhbCBiZWZvcmUgdHJpZ2dlcmluZy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXJhbXMgLSBUaGUgaW5wdXQgcGFyYW1ldGVycyB0eXBlICh2YWxpZGF0ZWQgYnkgc2NoZW1hKVxuICogQHR5cGVQYXJhbSBUUG9sbGluZ1N0YXRlIC0gVGhlIHBvbGxpbmcgc3RhdGUgdHlwZSBwYXNzZWQgYmV0d2VlbiBwb2xsIGNhbGxzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHR5cGUgSm9iUGFyYW1zID0geyB0YXJnZXQ6IHN0cmluZyB9O1xuICogdHlwZSBKb2JQb2xsaW5nU3RhdGUgPSB7IGpvYklkOiBzdHJpbmc7IHN0YXJ0ZWRBdDogbnVtYmVyIH07XG4gKlxuICogQFN0ZXAoeyBuYW1lOiBcIkxvbmcgSm9iXCIsIHR5cGU6IFwibG9uZy1qb2JcIiwgc2NoZW1hOiBqb2JTY2hlbWEgfSlcbiAqIGNsYXNzIExvbmdKb2JTdGVwIGV4dGVuZHMgUG9sbGluZ1N0ZXA8Sm9iUGFyYW1zLCBKb2JQb2xsaW5nU3RhdGU+IHtcbiAqICAgYXN5bmMgdHJpZ2dlcihwYXJhbXM6IEpvYlBhcmFtcyk6IFByb21pc2U8VHJpZ2dlck91dHB1dDxKb2JQb2xsaW5nU3RhdGU+PiB7XG4gKiAgICAgY29uc3Qgam9iSWQgPSBhd2FpdCBzdGFydEpvYihwYXJhbXMpO1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy50cmlnZ2VyZWQoeyBqb2JJZCwgc3RhcnRlZEF0OiBEYXRlLm5vdygpIH0pO1xuICogICB9XG4gKlxuICogICBhc3luYyBwb2xsKHBhcmFtczogSm9iUGFyYW1zLCBzdGF0ZTogSm9iUG9sbGluZ1N0YXRlKTogUHJvbWlzZTxQb2xsT3V0cHV0PEpvYlBvbGxpbmdTdGF0ZT4+IHtcbiAqICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBjaGVja0pvYihzdGF0ZS5qb2JJZCk7XG4gKiAgICAgaWYgKHN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHtcbiAqICAgICAgIHJldHVybiBTdGVwT3V0cHV0cy5wb2xsQWdhaW4oc3RhdGUsIDUwMDApO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gU3RlcE91dHB1dHMuc3VjY2Vzcyh7IHJlc3VsdDogc3RhdHVzIH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBXaXRoIGFwcHJvdmFsXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAU3RlcCh7IG5hbWU6IFwiRGFuZ2Vyb3VzIEpvYlwiLCB0eXBlOiBcImRhbmdlcm91cy1qb2JcIiwgc2NoZW1hOiBkYW5nZXJvdXNTY2hlbWEgfSlcbiAqIGNsYXNzIERhbmdlcm91c0pvYlN0ZXAgZXh0ZW5kcyBQb2xsaW5nU3RlcDxEYW5nZXJvdXNQYXJhbXMsIERhbmdlcm91c1BvbGxpbmdTdGF0ZT4ge1xuICogICBhc3luYyBwcmVwYXJlKHBhcmFtczogRGFuZ2Vyb3VzUGFyYW1zKTogUHJvbWlzZTxQcmVwYXJlT3V0cHV0PiB7XG4gKiAgICAgcmV0dXJuIFN0ZXBPdXRwdXRzLmFwcHJvdmFsUmVxdWlyZWQoe1xuICogICAgICAgbWVzc2FnZTogYFJ1biBkYW5nZXJvdXMgam9iIG9uICR7cGFyYW1zLnRhcmdldH0/YCxcbiAqICAgICB9KTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgdHJpZ2dlcihwYXJhbXM6IERhbmdlcm91c1BhcmFtcywgYXBwcm92YWw6IEFwcHJvdmFsQ29udGV4dCk6IFByb21pc2U8VHJpZ2dlck91dHB1dDxEYW5nZXJvdXNQb2xsaW5nU3RhdGU+PiB7XG4gKiAgICAgY29uc3Qgam9iSWQgPSBhd2FpdCBzdGFydERhbmdlcm91c0pvYihwYXJhbXMpO1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy50cmlnZ2VyZWQoeyBqb2JJZCB9KTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcG9sbChwYXJhbXM6IERhbmdlcm91c1BhcmFtcywgc3RhdGU6IERhbmdlcm91c1BvbGxpbmdTdGF0ZSk6IFByb21pc2U8UG9sbE91dHB1dDxEYW5nZXJvdXNQb2xsaW5nU3RhdGU+PiB7XG4gKiAgICAgLy8gLi4uIGNoZWNrIHN0YXR1c1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvbGxpbmdTdGVwPFxuICBUUGFyYW1zLFxuICBUUG9sbGluZ1N0YXRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuPiBleHRlbmRzIEJhc2VTdGVwPFRQYXJhbXM+IHtcbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHZhbGlkYXRlZCBpbnB1dCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBhcHByb3ZhbCAtIEFwcHJvdmFsIGNvbnRleHQgaWYgdGhpcyBzdGVwIHJlcXVpcmVzIGFwcHJvdmFsIChoYXMgcHJlcGFyZSBtZXRob2QpXG4gICAqIEByZXR1cm5zIFRSSUdHRVJFRCB3aXRoIGluaXRpYWwgcG9sbGluZyBzdGF0ZSwgb3IgRkFJTEVEXG4gICAqL1xuICBhYnN0cmFjdCB0cmlnZ2VyKFxuICAgIHBhcmFtczogVFBhcmFtcyxcbiAgICBhcHByb3ZhbD86IEFwcHJvdmFsQ29udGV4dFxuICApOiBQcm9taXNlPFRyaWdnZXJPdXRwdXQ8VFBvbGxpbmdTdGF0ZT4+O1xuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgb3JpZ2luYWwgaW5wdXQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gcG9sbGluZ1N0YXRlIC0gU3RhdGUgZnJvbSBwcmV2aW91cyB0cmlnZ2VyKCkgb3IgcG9sbCgpIGNhbGxcbiAgICogQHJldHVybnMgUE9MTF9BR0FJTiB3aXRoIHVwZGF0ZWQgc3RhdGUsIFNVQ0NFU1MsIG9yIEZBSUxFRFxuICAgKi9cbiAgYWJzdHJhY3QgcG9sbChcbiAgICBwYXJhbXM6IFRQYXJhbXMsXG4gICAgcG9sbGluZ1N0YXRlOiBUUG9sbGluZ1N0YXRlXG4gICk6IFByb21pc2U8UG9sbE91dHB1dDxUUG9sbGluZ1N0YXRlPj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgcmVnaXN0cnkgdG8gZXhlY3V0ZSB0aGUgdHJpZ2dlciBwaGFzZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyBleGVjdXRlVHJpZ2dlcihcbiAgICBwYXJhbXM6IFRQYXJhbXMsXG4gICAgYXBwcm92YWw/OiBBcHByb3ZhbENvbnRleHRcbiAgKTogUHJvbWlzZTxTdGVwT3V0cHV0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlcihwYXJhbXMsIGFwcHJvdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHJlZ2lzdHJ5IHRvIGV4ZWN1dGUgdGhlIHBvbGwgcGhhc2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVBvbGwoXG4gICAgcGFyYW1zOiBUUGFyYW1zLFxuICAgIHBvbGxpbmdTdGF0ZTogVFBvbGxpbmdTdGF0ZVxuICApOiBQcm9taXNlPFN0ZXBPdXRwdXQ+IHtcbiAgICByZXR1cm4gdGhpcy5wb2xsKHBhcmFtcywgcG9sbGluZ1N0YXRlKTtcbiAgfVxuXG4gIGdldE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJnZXRNZXRhZGF0YSBub3QgaW1wbGVtZW50ZWQuIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQFN0ZXAgZGVjb3JhdG9yP1wiXG4gICAgKTtcbiAgfVxufVxuIl19
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
- * return StepOutputs.success({ deploymentId: "123" });
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
  * }
@@ -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
- * return StepOutputs.success({ deploymentId: "123" });
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZS9zaW1wbGUtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwyQ0FBdUM7QUFHdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILE1BQXNCLFVBQW9CLFNBQVEsb0JBQWlCO0lBUWpFOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBZSxFQUFFLFFBQTBCO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLElBQUksS0FBSyxDQUNiLHlFQUF5RSxDQUMxRSxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBckJELGdDQXFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RlcE1ldGFkYXRhIH0gZnJvbSBcIi4vYmFzZS1zdGVwXCI7XG5pbXBvcnQgeyBCYXNlU3RlcCB9IGZyb20gXCIuL2Jhc2Utc3RlcFwiO1xuaW1wb3J0IHR5cGUgeyBBcHByb3ZhbENvbnRleHQsIFJ1bk91dHB1dCwgU3RlcE91dHB1dCB9IGZyb20gXCIuLi9vdXRwdXQvc3RlcC1vdXRwdXRcIjtcblxuLyoqXG4gKiBBIHNpbXBsZSBzdGVwIHRoYXQgcnVucyBvbmNlIHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBVc2VycyBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSBgcnVuYCBtZXRob2QuXG4gKiBPcHRpb25hbGx5IG92ZXJyaWRlIGBwcmVwYXJlYCB0byByZXF1aXJlIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBTdGVwKHsgbmFtZTogXCJEZXBsb3lcIiwgdHlwZTogXCJkZXBsb3lcIiwgc2NoZW1hOiBkZXBsb3lTY2hlbWEgfSlcbiAqIGNsYXNzIERlcGxveVN0ZXAgZXh0ZW5kcyBTaW1wbGVTdGVwPERlcGxveVBhcmFtcz4ge1xuICogICBhc3luYyBydW4ocGFyYW1zOiBEZXBsb3lQYXJhbXMpOiBQcm9taXNlPFJ1bk91dHB1dD4ge1xuICogICAgIHRoaXMubG9nZ2VyLmluZm8oXCJEZXBsb3lpbmdcIiwgeyB0YXJnZXQ6IHBhcmFtcy50YXJnZXQgfSk7XG4gKiAgICAgcmV0dXJuIFN0ZXBPdXRwdXRzLnN1Y2Nlc3MoeyBkZXBsb3ltZW50SWQ6IFwiMTIzXCIgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFdpdGggYXBwcm92YWxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBTdGVwKHsgbmFtZTogXCJEZWxldGUgVXNlclwiLCB0eXBlOiBcImRlbGV0ZS11c2VyXCIsIHNjaGVtYTogZGVsZXRlVXNlclNjaGVtYSB9KVxuICogY2xhc3MgRGVsZXRlVXNlclN0ZXAgZXh0ZW5kcyBTaW1wbGVTdGVwPERlbGV0ZVVzZXJQYXJhbXM+IHtcbiAqICAgYXN5bmMgcHJlcGFyZShwYXJhbXM6IERlbGV0ZVVzZXJQYXJhbXMpOiBQcm9taXNlPFByZXBhcmVPdXRwdXQ+IHtcbiAqICAgICByZXR1cm4gU3RlcE91dHB1dHMuYXBwcm92YWxSZXF1aXJlZCh7XG4gKiAgICAgICBtZXNzYWdlOiBgRGVsZXRlIHVzZXIgJHtwYXJhbXMudXNlcklkfT9gLFxuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICBhc3luYyBydW4ocGFyYW1zOiBEZWxldGVVc2VyUGFyYW1zLCBhcHByb3ZhbDogQXBwcm92YWxDb250ZXh0KTogUHJvbWlzZTxSdW5PdXRwdXQ+IHtcbiAqICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiRGVsZXRpbmcgdXNlclwiLCB7IGFwcHJvdmVkQnk6IGFwcHJvdmFsLmFwcHJvdmVySWQgfSk7XG4gKiAgICAgcmV0dXJuIFN0ZXBPdXRwdXRzLnN1Y2Nlc3MoKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaW1wbGVTdGVwPFRQYXJhbXM+IGV4dGVuZHMgQmFzZVN0ZXA8VFBhcmFtcz4ge1xuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgc3RlcCBsb2dpYy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSB2YWxpZGF0ZWQgaW5wdXQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gYXBwcm92YWwgLSBBcHByb3ZhbCBjb250ZXh0IGlmIHRoaXMgc3RlcCByZXF1aXJlcyBhcHByb3ZhbCAoaGFzIHByZXBhcmUgbWV0aG9kKVxuICAgKi9cbiAgYWJzdHJhY3QgcnVuKHBhcmFtczogVFBhcmFtcywgYXBwcm92YWw/OiBBcHByb3ZhbENvbnRleHQpOiBQcm9taXNlPFJ1bk91dHB1dD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgcmVnaXN0cnkgdG8gZXhlY3V0ZSB0aGlzIHN0ZXAuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShwYXJhbXM6IFRQYXJhbXMsIGFwcHJvdmFsPzogQXBwcm92YWxDb250ZXh0KTogUHJvbWlzZTxTdGVwT3V0cHV0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuKHBhcmFtcywgYXBwcm92YWwpO1xuICB9XG5cbiAgZ2V0TWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImdldE1ldGFkYXRhIG5vdCBpbXBsZW1lbnRlZC4gRGlkIHlvdSBmb3JnZXQgdG8gYWRkIHRoZSBAU3RlcCBkZWNvcmF0b3I/XCJcbiAgICApO1xuICB9XG59XG4iXX0=
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;
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL3N0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2QkEsb0JBa0NDO0FBL0RELDZCQUFzQztBQUV0QyxpREFBNkM7QUFXN0M7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFvQixNQUFxQjtJQUMzRCxPQUFPLFVBQ0wsSUFBTztRQUVQLE1BQU0sUUFBUSxHQUFHLEtBQU0sU0FBUSxJQUFJO1lBQ3hCLFdBQVc7Z0JBQ2xCLHVEQUF1RDtnQkFDdkQsTUFBTSxpQkFBaUIsR0FDckIsU0FBUyxJQUFJLElBQUk7b0JBQ2pCLE9BQVEsSUFBWSxDQUFDLE9BQU8sS0FBSyxVQUFVO29CQUMzQyxNQUFNLElBQUksSUFBSTtvQkFDZCxPQUFRLElBQVksQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO2dCQUUzQyxNQUFNLFFBQVEsR0FBYSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBRXBFLG9FQUFvRTtnQkFDcEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxLQUFLLG9CQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFFckUsT0FBTztvQkFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ2pCLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDckIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtvQkFDekMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlO29CQUN2QyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7b0JBQy9CLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtvQkFDckIsVUFBVSxFQUFFLE9BQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztvQkFDekMsUUFBUTtvQkFDUixnQkFBZ0I7aUJBQ2pCLENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQztRQUVGLE9BQU8sUUFBYSxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFpvZFR5cGUsIHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFN0ZXBLaW5kLCBTdGVwTWV0YWRhdGEgfSBmcm9tIFwiLi4vYmFzZS9iYXNlLXN0ZXBcIjtcbmltcG9ydCB7IEJhc2VTdGVwIH0gZnJvbSBcIi4uL2Jhc2UvYmFzZS1zdGVwXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcENvbmZpZzxTIGV4dGVuZHMgWm9kVHlwZT4ge1xuICBuYW1lPzogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNob3J0RGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGxvbmdEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgeWFtbEV4YW1wbGU/OiBzdHJpbmc7XG4gIHNjaGVtYTogUztcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBhZGRzIG1ldGFkYXRhIHRvIGEgc3RlcCBjbGFzcy5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGFsbCBzdGVwcyB0byBiZSByZWdpc3RlcmVkIHdpdGggU3RlcFJlZ2lzdHJ5LlxuICpcbiAqIFRoZSBkZWNvcmF0ZWQgY2xhc3MgbXVzdCBleHRlbmQgU2ltcGxlU3RlcCBvciBQb2xsaW5nU3RlcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogQFN0ZXAoeyBuYW1lOiBcIk15IFN0ZXBcIiwgdHlwZTogXCJteS1zdGVwXCIsIHNjaGVtYTogbXlTY2hlbWEgfSlcbiAqIGNsYXNzIE15U3RlcCBleHRlbmRzIFNpbXBsZVN0ZXA8TXlQYXJhbXM+IHtcbiAqICAgYXN5bmMgcnVuKHBhcmFtczogTXlQYXJhbXMpOiBQcm9taXNlPFJ1bk91dHB1dD4ge1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy5zdWNjZXNzKCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gU3RlcDxTIGV4dGVuZHMgWm9kVHlwZT4oY29uZmlnOiBTdGVwQ29uZmlnPFM+KSB7XG4gIHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IEJhc2VTdGVwPHouaW5mZXI8Uz4+PihcbiAgICBCYXNlOiBUXG4gICk6IFQge1xuICAgIGNvbnN0IEVuaGFuY2VkID0gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgIG92ZXJyaWRlIGdldE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YTxTPiB7XG4gICAgICAgIC8vIERldGVjdCBzdGVwIGtpbmQgYnkgY2hlY2tpbmcgZm9yIFBvbGxpbmdTdGVwIG1ldGhvZHNcbiAgICAgICAgY29uc3QgaGFzUG9sbGluZ01ldGhvZHMgPVxuICAgICAgICAgIFwidHJpZ2dlclwiIGluIHRoaXMgJiZcbiAgICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KS50cmlnZ2VyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICBcInBvbGxcIiBpbiB0aGlzICYmXG4gICAgICAgICAgdHlwZW9mICh0aGlzIGFzIGFueSkucG9sbCA9PT0gXCJmdW5jdGlvblwiO1xuXG4gICAgICAgIGNvbnN0IHN0ZXBLaW5kOiBTdGVwS2luZCA9IGhhc1BvbGxpbmdNZXRob2RzID8gXCJwb2xsaW5nXCIgOiBcInNpbXBsZVwiO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHByZXBhcmUgaXMgb3ZlcnJpZGRlbiAobm90IHRoZSBkZWZhdWx0IEJhc2VTdGVwLnByZXBhcmUpXG4gICAgICAgIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSB0aGlzLnByZXBhcmUgIT09IEJhc2VTdGVwLnByb3RvdHlwZS5wcmVwYXJlO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgc3RlcFR5cGU6IGNvbmZpZy50eXBlLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb246IGNvbmZpZy5zaG9ydERlc2NyaXB0aW9uLFxuICAgICAgICAgIGxvbmdEZXNjcmlwdGlvbjogY29uZmlnLmxvbmdEZXNjcmlwdGlvbixcbiAgICAgICAgICB5YW1sRXhhbXBsZTogY29uZmlnLnlhbWxFeGFtcGxlLFxuICAgICAgICAgIHNjaGVtYTogY29uZmlnLnNjaGVtYSxcbiAgICAgICAgICBqc29uU2NoZW1hOiB6LnRvSlNPTlNjaGVtYShjb25maWcuc2NoZW1hKSxcbiAgICAgICAgICBzdGVwS2luZCxcbiAgICAgICAgICByZXF1aXJlc0FwcHJvdmFsLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gRW5oYW5jZWQgYXMgVDtcbiAgfTtcbn1cbiJdfQ==
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, StepClass, StepMetadata, StepKind } from "./base/base-step";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGdGQUFnRjtBQUNoRix3QkFBd0I7QUFDeEIsZ0ZBQWdGOzs7QUFFaEYsa0NBQWtDO0FBQ2xDLDhDQUErRTtBQUF0RSxxR0FBQSxRQUFRLE9BQUE7QUFDakIsa0RBQWdEO0FBQXZDLHlHQUFBLFVBQVUsT0FBQTtBQUNuQixvREFBa0Q7QUFBekMsMkdBQUEsV0FBVyxPQUFBO0FBRXBCLHlDQUF5QztBQUN6QywwQ0FBcUQ7QUFBNUMsNEZBQUEsSUFBSSxPQUFBO0FBRWIsb0NBQW9DO0FBQ3BDLG9EQXlCOEI7QUF0QjVCLG9IQUFBLHFCQUFxQixPQUFBO0FBY3JCLGdDQUFnQztBQUNoQyxrSEFBQSxtQkFBbUIsT0FBQTtBQUNuQiw4R0FBQSxlQUFlLE9BQUE7QUFDZixrSEFBQSxtQkFBbUIsT0FBQTtBQUNuQiwrR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiwrR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQixtQkFBbUI7QUFDbkIsMEdBQUEsV0FBVyxPQUFBO0FBR2IsNkJBQTZCO0FBQzdCLDBEQUFvRztBQUEzRiw2R0FBQSxZQUFZLE9BQUE7QUFBcUIsd0hBQUEsdUJBQXVCLE9BQUE7QUFFakUsVUFBVTtBQUNWLHFEQUF5RjtBQUFoRix5R0FBQSxVQUFVLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3RlcCBTREsgLSBQdWJsaWMgQVBJXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBCYXNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIHN0ZXBzXG5leHBvcnQgeyBCYXNlU3RlcCwgU3RlcENsYXNzLCBTdGVwTWV0YWRhdGEsIFN0ZXBLaW5kIH0gZnJvbSBcIi4vYmFzZS9iYXNlLXN0ZXBcIjtcbmV4cG9ydCB7IFNpbXBsZVN0ZXAgfSBmcm9tIFwiLi9iYXNlL3NpbXBsZS1zdGVwXCI7XG5leHBvcnQgeyBQb2xsaW5nU3RlcCB9IGZyb20gXCIuL2Jhc2UvcG9sbGluZy1zdGVwXCI7XG5cbi8vIERlY29yYXRvciBmb3IgYWRkaW5nIG1ldGFkYXRhIHRvIHN0ZXBzXG5leHBvcnQgeyBTdGVwLCBTdGVwQ29uZmlnIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy9zdGVwXCI7XG5cbi8vIE91dHB1dCB0eXBlcyBhbmQgaGVscGVyIGZ1bmN0aW9uc1xuZXhwb3J0IHtcbiAgLy8gQXBwcm92YWwgY29udGV4dFxuICBBcHByb3ZhbENvbnRleHQsXG4gIEFwcHJvdmFsQ29udGV4dFNjaGVtYSxcbiAgLy8gUGhhc2Utc3BlY2lmaWMgb3V0cHV0c1xuICBQcmVwYXJlT3V0cHV0LFxuICBSdW5PdXRwdXQsXG4gIFRyaWdnZXJPdXRwdXQsXG4gIFRyaWdnZXJlZE91dHB1dCxcbiAgUG9sbE91dHB1dCxcbiAgUG9sbEFnYWluT3V0cHV0LFxuICAvLyBDb21tb24gb3V0cHV0c1xuICBTdWNjZXNzT3V0cHV0LFxuICBGYWlsZWRPdXRwdXQsXG4gIEFwcHJvdmFsUmVxdWlyZWRPdXRwdXQsXG4gIC8vIENvbWJpbmVkIG91dHB1dCB0eXBlXG4gIFN0ZXBPdXRwdXQsXG4gIC8vIE91dHB1dCBzY2hlbWFzIGZvciB2YWxpZGF0aW9uXG4gIFByZXBhcmVPdXRwdXRTY2hlbWEsXG4gIFJ1bk91dHB1dFNjaGVtYSxcbiAgVHJpZ2dlck91dHB1dFNjaGVtYSxcbiAgUG9sbE91dHB1dFNjaGVtYSxcbiAgU3RlcE91dHB1dFNjaGVtYSxcbiAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuICBTdGVwT3V0cHV0cyxcbn0gZnJvbSBcIi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5cbi8vIFJlZ2lzdHJ5IGZvciBydW5uaW5nIHN0ZXBzXG5leHBvcnQgeyBTdGVwUmVnaXN0cnksIFN0ZXBSZWdpc3RyeUlucHV0LCBTdGVwUmVnaXN0cnlJbnB1dFNjaGVtYSB9IGZyb20gXCIuL3JlZ2lzdHJ5L3N0ZXAtcmVnaXN0cnlcIjtcblxuLy8gTG9nZ2luZ1xuZXhwb3J0IHsgU3RlcExvZ2dlciwgU3RlcExvZ2dlckNvbmZpZywgTG9nRW50cnksIExvZ0xldmVsIH0gZnJvbSBcIi4vbG9nZ2luZy9zdGVwLWxvZ2dlclwiO1xuIl19
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGdGQUFnRjtBQUNoRix3QkFBd0I7QUFDeEIsZ0ZBQWdGOzs7QUFFaEYsa0NBQWtDO0FBQ2xDLDhDQUFvRTtBQUEzRCxxR0FBQSxRQUFRLE9BQUE7QUFDakIsa0RBQWdEO0FBQXZDLHlHQUFBLFVBQVUsT0FBQTtBQUNuQixvREFBa0Q7QUFBekMsMkdBQUEsV0FBVyxPQUFBO0FBRXBCLHlDQUF5QztBQUN6QywwQ0FBcUQ7QUFBNUMsNEZBQUEsSUFBSSxPQUFBO0FBRWIsb0NBQW9DO0FBQ3BDLG9EQXlCOEI7QUF0QjVCLG9IQUFBLHFCQUFxQixPQUFBO0FBY3JCLGdDQUFnQztBQUNoQyxrSEFBQSxtQkFBbUIsT0FBQTtBQUNuQiw4R0FBQSxlQUFlLE9BQUE7QUFDZixrSEFBQSxtQkFBbUIsT0FBQTtBQUNuQiwrR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiwrR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQixtQkFBbUI7QUFDbkIsMEdBQUEsV0FBVyxPQUFBO0FBR2IsNkJBQTZCO0FBQzdCLDBEQUFvRztBQUEzRiw2R0FBQSxZQUFZLE9BQUE7QUFBcUIsd0hBQUEsdUJBQXVCLE9BQUE7QUFFakUsVUFBVTtBQUNWLHFEQUF5RjtBQUFoRix5R0FBQSxVQUFVLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3RlcCBTREsgLSBQdWJsaWMgQVBJXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBCYXNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIHN0ZXBzXG5leHBvcnQgeyBCYXNlU3RlcCwgU3RlcE1ldGFkYXRhLCBTdGVwS2luZCB9IGZyb20gXCIuL2Jhc2UvYmFzZS1zdGVwXCI7XG5leHBvcnQgeyBTaW1wbGVTdGVwIH0gZnJvbSBcIi4vYmFzZS9zaW1wbGUtc3RlcFwiO1xuZXhwb3J0IHsgUG9sbGluZ1N0ZXAgfSBmcm9tIFwiLi9iYXNlL3BvbGxpbmctc3RlcFwiO1xuXG4vLyBEZWNvcmF0b3IgZm9yIGFkZGluZyBtZXRhZGF0YSB0byBzdGVwc1xuZXhwb3J0IHsgU3RlcCwgU3RlcENvbmZpZyB9IGZyb20gXCIuL2RlY29yYXRvcnMvc3RlcFwiO1xuXG4vLyBPdXRwdXQgdHlwZXMgYW5kIGhlbHBlciBmdW5jdGlvbnNcbmV4cG9ydCB7XG4gIC8vIEFwcHJvdmFsIGNvbnRleHRcbiAgQXBwcm92YWxDb250ZXh0LFxuICBBcHByb3ZhbENvbnRleHRTY2hlbWEsXG4gIC8vIFBoYXNlLXNwZWNpZmljIG91dHB1dHNcbiAgUHJlcGFyZU91dHB1dCxcbiAgUnVuT3V0cHV0LFxuICBUcmlnZ2VyT3V0cHV0LFxuICBUcmlnZ2VyZWRPdXRwdXQsXG4gIFBvbGxPdXRwdXQsXG4gIFBvbGxBZ2Fpbk91dHB1dCxcbiAgLy8gQ29tbW9uIG91dHB1dHNcbiAgU3VjY2Vzc091dHB1dCxcbiAgRmFpbGVkT3V0cHV0LFxuICBBcHByb3ZhbFJlcXVpcmVkT3V0cHV0LFxuICAvLyBDb21iaW5lZCBvdXRwdXQgdHlwZVxuICBTdGVwT3V0cHV0LFxuICAvLyBPdXRwdXQgc2NoZW1hcyBmb3IgdmFsaWRhdGlvblxuICBQcmVwYXJlT3V0cHV0U2NoZW1hLFxuICBSdW5PdXRwdXRTY2hlbWEsXG4gIFRyaWdnZXJPdXRwdXRTY2hlbWEsXG4gIFBvbGxPdXRwdXRTY2hlbWEsXG4gIFN0ZXBPdXRwdXRTY2hlbWEsXG4gIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgU3RlcE91dHB1dHMsXG59IGZyb20gXCIuL291dHB1dC9zdGVwLW91dHB1dFwiO1xuXG4vLyBSZWdpc3RyeSBmb3IgcnVubmluZyBzdGVwc1xuZXhwb3J0IHsgU3RlcFJlZ2lzdHJ5LCBTdGVwUmVnaXN0cnlJbnB1dCwgU3RlcFJlZ2lzdHJ5SW5wdXRTY2hlbWEgfSBmcm9tIFwiLi9yZWdpc3RyeS9zdGVwLXJlZ2lzdHJ5XCI7XG5cbi8vIExvZ2dpbmdcbmV4cG9ydCB7IFN0ZXBMb2dnZXIsIFN0ZXBMb2dnZXJDb25maWcsIExvZ0VudHJ5LCBMb2dMZXZlbCB9IGZyb20gXCIuL2xvZ2dpbmcvc3RlcC1sb2dnZXJcIjtcbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import z from "zod";
2
- import type { StepClass } from "../base/base-step";
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([MyStep1, MyStep2, ...]);
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: StepClass[]): Promise<void>;
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 StepCls of steps) {
83
- const instance = new StepCls();
82
+ for (const instance of steps) {
84
83
  const metadata = instance.getMetadata();
85
- this.steps.set(metadata.stepType, StepCls);
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([MyStep1, MyStep2, ...]);
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 StepCls of this.steps.values()) {
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 StepCls = this.steps.get(type);
141
- if (!StepCls) {
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 instance = new StepCls();
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: metadata.stepType,
152
+ stepType: data.stepType,
153
153
  });
154
154
  instance._setLogger(logger);
155
155
  // Validate params against the step's schema
156
- const parseResult = metadata.schema.safeParse(params);
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, metadata, validatedParams, approvalContext, pollingState);
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, metadata, params, approvalContext, pollingState) {
172
- const requiresApproval = metadata.requiresApproval;
173
- if (metadata.stepKind === "simple") {
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 (metadata.stepKind === "polling") {
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: ${metadata.stepKind}`, "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",
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`);