@devramps/sdk-typescript 0.1.2 → 0.1.4

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,13 +1,19 @@
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
+ import type { ZodStandardJSONSchemaPayload } from "zod/v4/core";
4
5
  export type StepKind = "simple" | "polling";
5
6
  export interface StepMetadata<S extends ZodType = ZodType> {
6
- name: string;
7
- type: string;
7
+ name?: string;
8
+ shortDescription?: string;
9
+ longDescription?: string;
10
+ yamlExample?: string;
8
11
  schema: S;
9
12
  stepKind: StepKind;
10
13
  requiresApproval: boolean;
14
+ stepType: string;
15
+ jsonSchema: ZodStandardJSONSchemaPayload<S>;
16
+ documentationUrl?: string;
11
17
  }
12
18
  /**
13
19
  * Base class for all steps.
@@ -32,10 +38,3 @@ export declare abstract class BaseStep<TParams = unknown> {
32
38
  */
33
39
  prepare(_params: TParams): Promise<PrepareOutput>;
34
40
  }
35
- /**
36
- * Type representing a class constructor that produces a BaseStep instance
37
- * with the getMetadata method available.
38
- */
39
- export type StepClass<S extends ZodType = ZodType> = new (...args: any[]) => BaseStep<z.infer<S>> & {
40
- getMetadata(): StepMetadata<S>;
41
- };
@@ -35,4 +35,4 @@ class BaseStep {
35
35
  }
36
36
  }
37
37
  exports.BaseStep = BaseStep;
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2UvYmFzZS1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHdEQUFvRDtBQUVwRCx1REFBb0Q7QUFZcEQ7OztHQUdHO0FBQ0gsTUFBc0IsUUFBUTtJQUNsQixNQUFNLEdBQWUsSUFBSSx3QkFBVSxFQUFFLENBQUM7SUFFaEQ7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLE1BQWtCO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FDYix5RUFBeUUsQ0FDMUUsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFnQjtRQUM1Qiw4REFBOEQ7UUFDOUQsaUVBQWlFO1FBQ2pFLE9BQU8seUJBQVcsQ0FBQyxNQUFNLENBQ3ZCLHNDQUFzQyxFQUN0Qyx5QkFBeUIsQ0FDMUIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWxDRCw0QkFrQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFpvZFR5cGUsIHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFN0ZXBMb2dnZXJ9IGZyb20gXCIuLi9sb2dnaW5nL3N0ZXAtbG9nZ2VyXCI7XG5pbXBvcnQgeyBOb09wTG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dpbmcvc3RlcC1sb2dnZXJcIjtcbmltcG9ydCB0eXBlIHsgUHJlcGFyZU91dHB1dH0gZnJvbSBcIi4uL291dHB1dC9zdGVwLW91dHB1dFwiO1xuaW1wb3J0IHsgU3RlcE91dHB1dHMgfSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5cbmV4cG9ydCB0eXBlIFN0ZXBLaW5kID0gXCJzaW1wbGVcIiB8IFwicG9sbGluZ1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNZXRhZGF0YTxTIGV4dGVuZHMgWm9kVHlwZSA9IFpvZFR5cGU+IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNjaGVtYTogUztcbiAgc3RlcEtpbmQ6IFN0ZXBLaW5kO1xuICByZXF1aXJlc0FwcHJvdmFsOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBzdGVwcy5cbiAqIFByb3ZpZGVzIGxvZ2dpbmcgYW5kIGNvbW1vbiBmdW5jdGlvbmFsaXR5LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVN0ZXA8VFBhcmFtcyA9IHVua25vd24+IHtcbiAgcHJvdGVjdGVkIGxvZ2dlcjogU3RlcExvZ2dlciA9IG5ldyBOb09wTG9nZ2VyKCk7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgcmVnaXN0cnkgdG8gaW5qZWN0IHRoZSBsb2dnZXIgYmVmb3JlIGV4ZWN1dGlvbi5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBfc2V0TG9nZ2VyKGxvZ2dlcjogU3RlcExvZ2dlcik6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWV0YWRhdGEgYWJvdXQgdGhpcyBzdGVwLlxuICAgKiBJbXBsZW1lbnRlZCBieSB0aGUgQFN0ZXAgZGVjb3JhdG9yLlxuICAgKi9cbiAgZ2V0TWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImdldE1ldGFkYXRhIG5vdCBpbXBsZW1lbnRlZC4gRGlkIHlvdSBmb3JnZXQgdG8gYWRkIHRoZSBAU3RlcCBkZWNvcmF0b3I/XCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHByZXBhcmUgbWV0aG9kIGZvciBhcHByb3ZhbCBmbG93LlxuICAgKiBPdmVycmlkZSB0aGlzIHRvIHJlcXVpcmUgYXBwcm92YWwgYmVmb3JlIGV4ZWN1dGlvbi5cbiAgICogSWYgbm90IG92ZXJyaWRkZW4sIHRoZSBzdGVwIHdpbGwgbm90IHJlcXVpcmUgYXBwcm92YWwuXG4gICAqL1xuICBhc3luYyBwcmVwYXJlKF9wYXJhbXM6IFRQYXJhbXMpOiBQcm9taXNlPFByZXBhcmVPdXRwdXQ+IHtcbiAgICAvLyBEZWZhdWx0OiBubyBhcHByb3ZhbCByZXF1aXJlZCAtIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZFxuICAgIC8vIFRoZSByZWdpc3RyeSBjaGVja3MgaWYgcHJlcGFyZSBpcyBvdmVycmlkZGVuIGJlZm9yZSBjYWxsaW5nIGl0XG4gICAgcmV0dXJuIFN0ZXBPdXRwdXRzLmZhaWxlZChcbiAgICAgIFwicHJlcGFyZSgpIGNhbGxlZCBidXQgbm90IGltcGxlbWVudGVkXCIsXG4gICAgICBcIlBSRVBBUkVfTk9UX0lNUExFTUVOVEVEXCJcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVHlwZSByZXByZXNlbnRpbmcgYSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IHByb2R1Y2VzIGEgQmFzZVN0ZXAgaW5zdGFuY2VcbiAqIHdpdGggdGhlIGdldE1ldGFkYXRhIG1ldGhvZCBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0ZXBDbGFzczxTIGV4dGVuZHMgWm9kVHlwZSA9IFpvZFR5cGU+ID0gbmV3IChcbiAgLi4uYXJnczogYW55W11cbikgPT4gQmFzZVN0ZXA8ei5pbmZlcjxTPj4gJiB7XG4gIGdldE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YTxTPjtcbn07XG4iXX0=
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2UvYmFzZS1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHdEQUFvRDtBQUVwRCx1REFBb0Q7QUFrQnBEOzs7R0FHRztBQUNILE1BQXNCLFFBQVE7SUFDbEIsTUFBTSxHQUFlLElBQUksd0JBQVUsRUFBRSxDQUFDO0lBRWhEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxNQUFrQjtRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULE1BQU0sSUFBSSxLQUFLLENBQ2IseUVBQXlFLENBQzFFLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBZ0I7UUFDNUIsOERBQThEO1FBQzlELGlFQUFpRTtRQUNqRSxPQUFPLHlCQUFXLENBQUMsTUFBTSxDQUN2QixzQ0FBc0MsRUFDdEMseUJBQXlCLENBQzFCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsQ0QsNEJBa0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBab2RUeXBlIH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwTG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dpbmcvc3RlcC1sb2dnZXJcIjtcbmltcG9ydCB7IE5vT3BMb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2luZy9zdGVwLWxvZ2dlclwiO1xuaW1wb3J0IHR5cGUgeyBQcmVwYXJlT3V0cHV0IH0gZnJvbSBcIi4uL291dHB1dC9zdGVwLW91dHB1dFwiO1xuaW1wb3J0IHsgU3RlcE91dHB1dHMgfSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5pbXBvcnQgdHlwZSB7IFpvZFN0YW5kYXJkSlNPTlNjaGVtYVBheWxvYWQgfSBmcm9tIFwiem9kL3Y0L2NvcmVcIjtcblxuZXhwb3J0IHR5cGUgU3RlcEtpbmQgPSBcInNpbXBsZVwiIHwgXCJwb2xsaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcE1ldGFkYXRhPFMgZXh0ZW5kcyBab2RUeXBlID0gWm9kVHlwZT4ge1xuICBuYW1lPzogc3RyaW5nO1xuICBzaG9ydERlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBsb25nRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHlhbWxFeGFtcGxlPzogc3RyaW5nO1xuICBzY2hlbWE6IFM7XG4gIHN0ZXBLaW5kOiBTdGVwS2luZDtcbiAgcmVxdWlyZXNBcHByb3ZhbDogYm9vbGVhbjtcbiAgc3RlcFR5cGU6IHN0cmluZztcbiAganNvblNjaGVtYTogWm9kU3RhbmRhcmRKU09OU2NoZW1hUGF5bG9hZDxTPjtcbiAgZG9jdW1lbnRhdGlvblVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgc3RlcHMuXG4gKiBQcm92aWRlcyBsb2dnaW5nIGFuZCBjb21tb24gZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTdGVwPFRQYXJhbXMgPSB1bmtub3duPiB7XG4gIHByb3RlY3RlZCBsb2dnZXI6IFN0ZXBMb2dnZXIgPSBuZXcgTm9PcExvZ2dlcigpO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHJlZ2lzdHJ5IHRvIGluamVjdCB0aGUgbG9nZ2VyIGJlZm9yZSBleGVjdXRpb24uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3NldExvZ2dlcihsb2dnZXI6IFN0ZXBMb2dnZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoaXMgc3RlcC5cbiAgICogSW1wbGVtZW50ZWQgYnkgdGhlIEBTdGVwIGRlY29yYXRvci5cbiAgICovXG4gIGdldE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJnZXRNZXRhZGF0YSBub3QgaW1wbGVtZW50ZWQuIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQFN0ZXAgZGVjb3JhdG9yP1wiXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwcmVwYXJlIG1ldGhvZCBmb3IgYXBwcm92YWwgZmxvdy5cbiAgICogT3ZlcnJpZGUgdGhpcyB0byByZXF1aXJlIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRpb24uXG4gICAqIElmIG5vdCBvdmVycmlkZGVuLCB0aGUgc3RlcCB3aWxsIG5vdCByZXF1aXJlIGFwcHJvdmFsLlxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZShfcGFyYW1zOiBUUGFyYW1zKTogUHJvbWlzZTxQcmVwYXJlT3V0cHV0PiB7XG4gICAgLy8gRGVmYXVsdDogbm8gYXBwcm92YWwgcmVxdWlyZWQgLSB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWRcbiAgICAvLyBUaGUgcmVnaXN0cnkgY2hlY2tzIGlmIHByZXBhcmUgaXMgb3ZlcnJpZGRlbiBiZWZvcmUgY2FsbGluZyBpdFxuICAgIHJldHVybiBTdGVwT3V0cHV0cy5mYWlsZWQoXG4gICAgICBcInByZXBhcmUoKSBjYWxsZWQgYnV0IG5vdCBpbXBsZW1lbnRlZFwiLFxuICAgICAgXCJQUkVQQVJFX05PVF9JTVBMRU1FTlRFRFwiXG4gICAgKTtcbiAgfVxufVxuXG4iXX0=
@@ -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,8 +1,11 @@
1
- import type { ZodType, z } from "zod";
1
+ import { type ZodType, z } from "zod";
2
2
  import { BaseStep } from "../base/base-step";
3
3
  export interface StepConfig<S extends ZodType> {
4
- name: string;
4
+ name?: string;
5
5
  type: string;
6
+ shortDescription?: string;
7
+ longDescription?: string;
8
+ yamlExample?: string;
6
9
  schema: S;
7
10
  }
8
11
  /**
@@ -15,10 +18,18 @@ export interface StepConfig<S extends ZodType> {
15
18
  * ```typescript
16
19
  * @Step({ name: "My Step", type: "my-step", schema: mySchema })
17
20
  * class MyStep extends SimpleStep<MyParams> {
21
+ * constructor(private apiClient: ApiClient) {
22
+ * super();
23
+ * }
24
+ *
18
25
  * async run(params: MyParams): Promise<RunOutput> {
26
+ * await this.apiClient.doSomething();
19
27
  * return StepOutputs.success();
20
28
  * }
21
29
  * }
30
+ *
31
+ * // Register with dependencies injected
32
+ * StepRegistry.run([new MyStep(apiClient)]);
22
33
  * ```
23
34
  */
24
35
  export declare function Step<S extends ZodType>(config: StepConfig<S>): <T extends new (...args: any[]) => BaseStep<z.infer<S>>>(Base: T) => T;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Step = Step;
4
+ const zod_1 = require("zod");
4
5
  const base_step_1 = require("../base/base-step");
5
6
  /**
6
7
  * Decorator that adds metadata to a step class.
@@ -12,10 +13,18 @@ const base_step_1 = require("../base/base-step");
12
13
  * ```typescript
13
14
  * @Step({ name: "My Step", type: "my-step", schema: mySchema })
14
15
  * class MyStep extends SimpleStep<MyParams> {
16
+ * constructor(private apiClient: ApiClient) {
17
+ * super();
18
+ * }
19
+ *
15
20
  * async run(params: MyParams): Promise<RunOutput> {
21
+ * await this.apiClient.doSomething();
16
22
  * return StepOutputs.success();
17
23
  * }
18
24
  * }
25
+ *
26
+ * // Register with dependencies injected
27
+ * StepRegistry.run([new MyStep(apiClient)]);
19
28
  * ```
20
29
  */
21
30
  function Step(config) {
@@ -31,9 +40,13 @@ function Step(config) {
31
40
  // Check if prepare is overridden (not the default BaseStep.prepare)
32
41
  const requiresApproval = this.prepare !== base_step_1.BaseStep.prototype.prepare;
33
42
  return {
34
- type: config.type,
35
43
  name: config.name,
44
+ stepType: config.type,
45
+ shortDescription: config.shortDescription,
46
+ longDescription: config.longDescription,
47
+ yamlExample: config.yamlExample,
36
48
  schema: config.schema,
49
+ jsonSchema: zod_1.z.toJSONSchema(config.schema),
37
50
  stepKind,
38
51
  requiresApproval,
39
52
  };
@@ -42,4 +55,4 @@ function Step(config) {
42
55
  return Enhanced;
43
56
  };
44
57
  }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL3N0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsb0JBOEJDO0FBdERELGlEQUE2QztBQVE3Qzs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFnQixJQUFJLENBQW9CLE1BQXFCO0lBQzNELE9BQU8sVUFDTCxJQUFPO1FBRVAsTUFBTSxRQUFRLEdBQUcsS0FBTSxTQUFRLElBQUk7WUFDeEIsV0FBVztnQkFDbEIsdURBQXVEO2dCQUN2RCxNQUFNLGlCQUFpQixHQUNyQixTQUFTLElBQUksSUFBSTtvQkFDakIsT0FBUSxJQUFZLENBQUMsT0FBTyxLQUFLLFVBQVU7b0JBQzNDLE1BQU0sSUFBSSxJQUFJO29CQUNkLE9BQVEsSUFBWSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7Z0JBRTNDLE1BQU0sUUFBUSxHQUFhLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFFcEUsb0VBQW9FO2dCQUNwRSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLEtBQUssb0JBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUVyRSxPQUFPO29CQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNqQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07b0JBQ3JCLFFBQVE7b0JBQ1IsZ0JBQWdCO2lCQUNqQixDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUM7UUFFRixPQUFPLFFBQWEsQ0FBQztJQUN2QixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBab2RUeXBlLCB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwS2luZCwgU3RlcE1ldGFkYXRhIH0gZnJvbSBcIi4uL2Jhc2UvYmFzZS1zdGVwXCI7XG5pbXBvcnQgeyBCYXNlU3RlcCB9IGZyb20gXCIuLi9iYXNlL2Jhc2Utc3RlcFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBDb25maWc8UyBleHRlbmRzIFpvZFR5cGU+IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNjaGVtYTogUztcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBhZGRzIG1ldGFkYXRhIHRvIGEgc3RlcCBjbGFzcy5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGFsbCBzdGVwcyB0byBiZSByZWdpc3RlcmVkIHdpdGggU3RlcFJlZ2lzdHJ5LlxuICpcbiAqIFRoZSBkZWNvcmF0ZWQgY2xhc3MgbXVzdCBleHRlbmQgU2ltcGxlU3RlcCBvciBQb2xsaW5nU3RlcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogQFN0ZXAoeyBuYW1lOiBcIk15IFN0ZXBcIiwgdHlwZTogXCJteS1zdGVwXCIsIHNjaGVtYTogbXlTY2hlbWEgfSlcbiAqIGNsYXNzIE15U3RlcCBleHRlbmRzIFNpbXBsZVN0ZXA8TXlQYXJhbXM+IHtcbiAqICAgYXN5bmMgcnVuKHBhcmFtczogTXlQYXJhbXMpOiBQcm9taXNlPFJ1bk91dHB1dD4ge1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy5zdWNjZXNzKCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gU3RlcDxTIGV4dGVuZHMgWm9kVHlwZT4oY29uZmlnOiBTdGVwQ29uZmlnPFM+KSB7XG4gIHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IEJhc2VTdGVwPHouaW5mZXI8Uz4+PihcbiAgICBCYXNlOiBUXG4gICk6IFQge1xuICAgIGNvbnN0IEVuaGFuY2VkID0gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgIG92ZXJyaWRlIGdldE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YTxTPiB7XG4gICAgICAgIC8vIERldGVjdCBzdGVwIGtpbmQgYnkgY2hlY2tpbmcgZm9yIFBvbGxpbmdTdGVwIG1ldGhvZHNcbiAgICAgICAgY29uc3QgaGFzUG9sbGluZ01ldGhvZHMgPVxuICAgICAgICAgIFwidHJpZ2dlclwiIGluIHRoaXMgJiZcbiAgICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KS50cmlnZ2VyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICBcInBvbGxcIiBpbiB0aGlzICYmXG4gICAgICAgICAgdHlwZW9mICh0aGlzIGFzIGFueSkucG9sbCA9PT0gXCJmdW5jdGlvblwiO1xuXG4gICAgICAgIGNvbnN0IHN0ZXBLaW5kOiBTdGVwS2luZCA9IGhhc1BvbGxpbmdNZXRob2RzID8gXCJwb2xsaW5nXCIgOiBcInNpbXBsZVwiO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHByZXBhcmUgaXMgb3ZlcnJpZGRlbiAobm90IHRoZSBkZWZhdWx0IEJhc2VTdGVwLnByZXBhcmUpXG4gICAgICAgIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSB0aGlzLnByZXBhcmUgIT09IEJhc2VTdGVwLnByb3RvdHlwZS5wcmVwYXJlO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogY29uZmlnLnR5cGUsXG4gICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgc2NoZW1hOiBjb25maWcuc2NoZW1hLFxuICAgICAgICAgIHN0ZXBLaW5kLFxuICAgICAgICAgIHJlcXVpcmVzQXBwcm92YWwsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBFbmhhbmNlZCBhcyBUO1xuICB9O1xufVxuIl19
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL3N0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxQ0Esb0JBa0NDO0FBdkVELDZCQUFzQztBQUV0QyxpREFBNkM7QUFXN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFvQixNQUFxQjtJQUMzRCxPQUFPLFVBQ0wsSUFBTztRQUVQLE1BQU0sUUFBUSxHQUFHLEtBQU0sU0FBUSxJQUFJO1lBQ3hCLFdBQVc7Z0JBQ2xCLHVEQUF1RDtnQkFDdkQsTUFBTSxpQkFBaUIsR0FDckIsU0FBUyxJQUFJLElBQUk7b0JBQ2pCLE9BQVEsSUFBWSxDQUFDLE9BQU8sS0FBSyxVQUFVO29CQUMzQyxNQUFNLElBQUksSUFBSTtvQkFDZCxPQUFRLElBQVksQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO2dCQUUzQyxNQUFNLFFBQVEsR0FBYSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBRXBFLG9FQUFvRTtnQkFDcEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxLQUFLLG9CQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFFckUsT0FBTztvQkFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ2pCLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDckIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtvQkFDekMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlO29CQUN2QyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7b0JBQy9CLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtvQkFDckIsVUFBVSxFQUFFLE9BQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztvQkFDekMsUUFBUTtvQkFDUixnQkFBZ0I7aUJBQ2pCLENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQztRQUVGLE9BQU8sUUFBYSxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFpvZFR5cGUsIHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFN0ZXBLaW5kLCBTdGVwTWV0YWRhdGEgfSBmcm9tIFwiLi4vYmFzZS9iYXNlLXN0ZXBcIjtcbmltcG9ydCB7IEJhc2VTdGVwIH0gZnJvbSBcIi4uL2Jhc2UvYmFzZS1zdGVwXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcENvbmZpZzxTIGV4dGVuZHMgWm9kVHlwZT4ge1xuICBuYW1lPzogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNob3J0RGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGxvbmdEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgeWFtbEV4YW1wbGU/OiBzdHJpbmc7XG4gIHNjaGVtYTogUztcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBhZGRzIG1ldGFkYXRhIHRvIGEgc3RlcCBjbGFzcy5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGFsbCBzdGVwcyB0byBiZSByZWdpc3RlcmVkIHdpdGggU3RlcFJlZ2lzdHJ5LlxuICpcbiAqIFRoZSBkZWNvcmF0ZWQgY2xhc3MgbXVzdCBleHRlbmQgU2ltcGxlU3RlcCBvciBQb2xsaW5nU3RlcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogQFN0ZXAoeyBuYW1lOiBcIk15IFN0ZXBcIiwgdHlwZTogXCJteS1zdGVwXCIsIHNjaGVtYTogbXlTY2hlbWEgfSlcbiAqIGNsYXNzIE15U3RlcCBleHRlbmRzIFNpbXBsZVN0ZXA8TXlQYXJhbXM+IHtcbiAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBhcGlDbGllbnQ6IEFwaUNsaWVudCkge1xuICogICAgIHN1cGVyKCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHJ1bihwYXJhbXM6IE15UGFyYW1zKTogUHJvbWlzZTxSdW5PdXRwdXQ+IHtcbiAqICAgICBhd2FpdCB0aGlzLmFwaUNsaWVudC5kb1NvbWV0aGluZygpO1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy5zdWNjZXNzKCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBSZWdpc3RlciB3aXRoIGRlcGVuZGVuY2llcyBpbmplY3RlZFxuICogU3RlcFJlZ2lzdHJ5LnJ1bihbbmV3IE15U3RlcChhcGlDbGllbnQpXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0ZXA8UyBleHRlbmRzIFpvZFR5cGU+KGNvbmZpZzogU3RlcENvbmZpZzxTPikge1xuICByZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBCYXNlU3RlcDx6LmluZmVyPFM+Pj4oXG4gICAgQmFzZTogVFxuICApOiBUIHtcbiAgICBjb25zdCBFbmhhbmNlZCA9IGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICBvdmVycmlkZSBnZXRNZXRhZGF0YSgpOiBTdGVwTWV0YWRhdGE8Uz4ge1xuICAgICAgICAvLyBEZXRlY3Qgc3RlcCBraW5kIGJ5IGNoZWNraW5nIGZvciBQb2xsaW5nU3RlcCBtZXRob2RzXG4gICAgICAgIGNvbnN0IGhhc1BvbGxpbmdNZXRob2RzID1cbiAgICAgICAgICBcInRyaWdnZXJcIiBpbiB0aGlzICYmXG4gICAgICAgICAgdHlwZW9mICh0aGlzIGFzIGFueSkudHJpZ2dlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgXCJwb2xsXCIgaW4gdGhpcyAmJlxuICAgICAgICAgIHR5cGVvZiAodGhpcyBhcyBhbnkpLnBvbGwgPT09IFwiZnVuY3Rpb25cIjtcblxuICAgICAgICBjb25zdCBzdGVwS2luZDogU3RlcEtpbmQgPSBoYXNQb2xsaW5nTWV0aG9kcyA/IFwicG9sbGluZ1wiIDogXCJzaW1wbGVcIjtcblxuICAgICAgICAvLyBDaGVjayBpZiBwcmVwYXJlIGlzIG92ZXJyaWRkZW4gKG5vdCB0aGUgZGVmYXVsdCBCYXNlU3RlcC5wcmVwYXJlKVxuICAgICAgICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gdGhpcy5wcmVwYXJlICE9PSBCYXNlU3RlcC5wcm90b3R5cGUucHJlcGFyZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgIHN0ZXBUeXBlOiBjb25maWcudHlwZSxcbiAgICAgICAgICBzaG9ydERlc2NyaXB0aW9uOiBjb25maWcuc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBsb25nRGVzY3JpcHRpb246IGNvbmZpZy5sb25nRGVzY3JpcHRpb24sXG4gICAgICAgICAgeWFtbEV4YW1wbGU6IGNvbmZpZy55YW1sRXhhbXBsZSxcbiAgICAgICAgICBzY2hlbWE6IGNvbmZpZy5zY2hlbWEsXG4gICAgICAgICAganNvblNjaGVtYTogei50b0pTT05TY2hlbWEoY29uZmlnLnNjaGVtYSksXG4gICAgICAgICAgc3RlcEtpbmQsXG4gICAgICAgICAgcmVxdWlyZXNBcHByb3ZhbCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIEVuaGFuY2VkIGFzIFQ7XG4gIH07XG59XG4iXX0=
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.type, 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,26 +132,24 @@ 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
147
  const metadata = instance.getMetadata();
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.type,
152
+ stepType: metadata.stepType,
153
153
  });
154
154
  instance._setLogger(logger);
155
155
  // Validate params against the step's schema
@@ -235,4 +235,4 @@ class StepRegistry {
235
235
  }
236
236
  }
237
237
  exports.StepRegistry = StepRegistry;
238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWdpc3RyeS9zdGVwLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0Isd0RBQWdDO0FBQ2hDLDhDQUFvQjtBQUlwQix3REFBb0Q7QUFJcEQsdURBRytCO0FBRS9CLGdGQUFnRjtBQUNoRixnQkFBZ0I7QUFDaEIsZ0ZBQWdGO0FBRWhGLE1BQU0sNEJBQTRCLEdBQUcsYUFBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QyxHQUFHLEVBQUUsYUFBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztDQUN0QyxDQUFDLENBQUM7QUFFSCxNQUFNLHlCQUF5QixHQUFHLGFBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekMsR0FBRyxFQUFFLGFBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ3pCLElBQUksRUFBRSxhQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLE1BQU0sRUFBRSxhQUFDLENBQUMsTUFBTSxDQUFDLGFBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDckMsNERBQTREO0lBQzVELGVBQWUsRUFBRSxtQ0FBcUIsQ0FBQyxRQUFRLEVBQUU7SUFDakQsWUFBWSxFQUFFLGFBQUMsQ0FBQyxNQUFNLENBQUMsYUFBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLGFBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtDQUN2RCxDQUFDLENBQUM7QUFFVSxRQUFBLHVCQUF1QixHQUFHLGFBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7SUFDakUseUJBQXlCO0lBQ3pCLDRCQUE0QjtDQUM3QixDQUFDLENBQUM7QUFJSCxnRkFBZ0Y7QUFDaEYsZ0JBQWdCO0FBQ2hCLGdGQUFn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UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN0Qix3Q0FBd0M7WUFDeEMsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLHNEQUFzRDtZQUN0RCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTyxXQUFXLENBQUMsTUFBa0I7UUFDcEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM5QixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBOVBELG9DQThQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IG1pbmltaXN0IGZyb20gXCJtaW5pbWlzdFwiO1xuaW1wb3J0IHogZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlU3RlcCwgU3RlcENsYXNzLCBTdGVwTWV0YWRhdGEgfSBmcm9tIFwiLi4vYmFzZS9iYXNlLXN0ZXBcIjtcbmltcG9ydCB0eXBlIHsgU2ltcGxlU3RlcCB9IGZyb20gXCIuLi9iYXNlL3NpbXBsZS1zdGVwXCI7XG5pbXBvcnQgdHlwZSB7IFBvbGxpbmdTdGVwIH0gZnJvbSBcIi4uL2Jhc2UvcG9sbGluZy1zdGVwXCI7XG5pbXBvcnQgeyBTdGVwTG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dpbmcvc3RlcC1sb2dnZXJcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXBwcm92YWxDb250ZXh0LFxuICBTdGVwT3V0cHV0fSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5pbXBvcnQge1xuICBBcHByb3ZhbENvbnRleHRTY2hlbWEsXG4gIFN0ZXBPdXRwdXRzLFxufSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbnB1dCBTY2hlbWFzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jb25zdCBTdGVwUmVnaXN0cnlTeW50aGVzaXplU2NoZW1hID0gei5vYmplY3Qoe1xuICBqb2I6IHoubGl0ZXJhbChcIlNZTlRIRVNJWkUtTUVUQURBVEFcIiksXG59KTtcblxuY29uc3QgU3RlcFJlZ2lzdHJ5RXhlY3V0ZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgam9iOiB6LmxpdGVyYWwoXCJFWEVDVVRFXCIpLFxuICB0eXBlOiB6LnN0cmluZygpLFxuICBwYXJhbXM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpLFxuICAvLyBPcHRpb25hbCBjb250ZXh0IC0gcHJlc2VuY2UgZGV0ZXJtaW5lcyB3aGljaCBwaGFzZSB0byBydW5cbiAgYXBwcm92YWxDb250ZXh0OiBBcHByb3ZhbENvbnRleHRTY2hlbWEub3B0aW9uYWwoKSxcbiAgcG9sbGluZ1N0YXRlOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTdGVwUmVnaXN0cnlJbnB1dFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwiam9iXCIsIFtcbiAgU3RlcFJlZ2lzdHJ5RXhlY3V0ZVNjaGVtYSxcbiAgU3RlcFJlZ2lzdHJ5U3ludGhlc2l6ZVNjaGVtYSxcbl0pO1xuXG5leHBvcnQgdHlwZSBTdGVwUmVnaXN0cnlJbnB1dCA9IHouaW5mZXI8dHlwZW9mIFN0ZXBSZWdpc3RyeUlucHV0U2NoZW1hPjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IERFRkFVTFRfT1VUUFVUX1BBVEggPSBcIi90bXAvc3RlcC1vdXRwdXQuanNvblwiO1xuY29uc3QgREVGQVVMVF9MT0dfRElSID0gXCIvdG1wL3N0ZXAtbG9nc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3RlcFJlZ2lzdHJ5XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgU3RlcFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBzdGVwczogTWFwPHN0cmluZywgU3RlcENsYXNzPjtcbiAgcHJpdmF0ZSBvdXRwdXRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgbG9nRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgZXhlY3V0aW9uSWQ6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHN0ZXBzOiBTdGVwQ2xhc3NbXSxcbiAgICBvdXRwdXRQYXRoOiBzdHJpbmcsXG4gICAgbG9nRGlyOiBzdHJpbmcsXG4gICAgZXhlY3V0aW9uSWQ6IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLnN0ZXBzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7XG4gICAgdGhpcy5sb2dEaXIgPSBsb2dEaXI7XG4gICAgdGhpcy5leGVjdXRpb25JZCA9IGV4ZWN1dGlvbklkO1xuXG4gICAgZm9yIChjb25zdCBTdGVwQ2xzIG9mIHN0ZXBzKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBTdGVwQ2xzKCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGluc3RhbmNlLmdldE1ldGFkYXRhKCk7XG4gICAgICB0aGlzLnN0ZXBzLnNldChtZXRhZGF0YS50eXBlLCBTdGVwQ2xzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFpbiBlbnRyeXBvaW50IGZvciBydW5uaW5nIHN0ZXBzLlxuICAgKiBQYXJzZXMgQ0xJIGFyZ3MgYW5kIGVpdGhlciBzeW50aGVzaXplcyBtZXRhZGF0YSBvciBleGVjdXRlcyBhIHN0ZXAuXG4gICAqXG4gICAqIFVzYWdlIGluIHVzZXIncyBlbnRyeXBvaW50IGZpbGU6XG4gICAqIGBgYFxuICAgKiBTdGVwUmVnaXN0cnkucnVuKFtNeVN0ZXAxLCBNeVN0ZXAyLCAuLi5dKTtcbiAgICogYGBgXG4gICAqXG4gICAqIENMSSBhcmd1bWVudHM6XG4gICAqIC0gLS1pbnB1dDogSlNPTiBibG9iIHdpdGggam9iIHR5cGUgYW5kIHBhcmFtZXRlcnNcbiAgICogLSAtLW91dHB1dDogUGF0aCB0byB3cml0ZSBvdXRwdXQgSlNPTiAoZGVmYXVsdDogL3RtcC9zdGVwLW91dHB1dC5qc29uKVxuICAgKiAtIC0tbG9nLWRpcjogRGlyZWN0b3J5IGZvciBsb2cgZmlsZXMgKGRlZmF1bHQ6IC90bXAvc3RlcC1sb2dzKVxuICAgKiAtIC0tZXhlY3V0aW9uLWlkOiBVbmlxdWUgSUQgZm9yIHRoaXMgZXhlY3V0aW9uIChyZXF1aXJlZCBmb3IgbG9nZ2luZylcbiAgICovXG4gIHN0YXRpYyBhc3luYyBydW4oc3RlcHM6IFN0ZXBDbGFzc1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXJncyA9IG1pbmltaXN0KHByb2Nlc3MuYXJndi5zbGljZSgyKSk7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IGFyZ3NbXCJvdXRwdXRcIl0gfHwgREVGQVVMVF9PVVRQVVRfUEFUSDtcbiAgICBjb25zdCBsb2dEaXIgPSBhcmdzW1wibG9nLWRpclwiXSB8fCBERUZBVUxUX0xPR19ESVI7XG4gICAgY29uc3QgZXhlY3V0aW9uSWQgPSBhcmdzW1wiZXhlY3V0aW9uLWlkXCJdIHx8IGBleGVjLSR7RGF0ZS5ub3coKX1gO1xuXG4gICAgY29uc3QgcmVnaXN0cnkgPSBuZXcgU3RlcFJlZ2lzdHJ5KHN0ZXBzLCBvdXRwdXRQYXRoLCBsb2dEaXIsIGV4ZWN1dGlvbklkKTtcbiAgICBhd2FpdCByZWdpc3RyeS5leGVjdXRlKGFyZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlKGFyZ3M6IG1pbmltaXN0LlBhcnNlZEFyZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5wdXQgPSBTdGVwUmVnaXN0cnlJbnB1dFNjaGVtYS5wYXJzZShKU09OLnBhcnNlKGFyZ3NbXCJpbnB1dFwiXSkpO1xuXG4gICAgICBzd2l0Y2ggKGlucHV0LmpvYikge1xuICAgICAgICBjYXNlIFwiU1lOVEhFU0laRS1NRVRBREFUQVwiOiB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnN5bnRoZXNpemVNZXRhZGF0YSgpO1xuICAgICAgICAgIHRoaXMud3JpdGVPdXRwdXQoeyBzdGF0dXM6IFwiU1VDQ0VTU1wiLCBkYXRhOiB7IG1ldGFkYXRhIH0gfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwiRVhFQ1VURVwiOiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlU3RlcChcbiAgICAgICAgICAgIGlucHV0LnR5cGUsXG4gICAgICAgICAgICBpbnB1dC5wYXJhbXMsXG4gICAgICAgICAgICBpbnB1dC5hcHByb3ZhbENvbnRleHQsXG4gICAgICAgICAgICBpbnB1dC5wb2xsaW5nU3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIHRoaXMud3JpdGVPdXRwdXQoU3RlcE91dHB1dHMuZmFpbGVkKGVycm9yTWVzc2FnZSwgXCJSRUdJU1RSWV9FUlJPUlwiKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW50aGVzaXplTWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhW10ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBTdGVwTWV0YWRhdGFbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBTdGVwQ2xzIG9mIHRoaXMuc3RlcHMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFN0ZXBDbHMoKTtcbiAgICAgIG1ldGFkYXRhLnB1c2goaW5zdGFuY2UuZ2V0TWV0YWRhdGEoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlU3RlcChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBhcHByb3ZhbENvbnRleHQ/OiBBcHByb3ZhbENvbnRleHQsXG4gICAgcG9sbGluZ1N0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgU3RlcENscyA9IHRoaXMuc3RlcHMuZ2V0KHR5cGUpO1xuXG4gICAgaWYgKCFTdGVwQ2xzKSB7XG4gICAgICB0aGlzLndyaXRlT3V0cHV0KFxuICAgICAgICBTdGVwT3V0cHV0cy5mYWlsZWQoYE5vIHN0ZXAgcmVnaXN0ZXJlZCB3aXRoIHR5cGU6ICR7dHlwZX1gLCBcIlNURVBfTk9UX0ZPVU5EXCIpXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBTdGVwQ2xzKCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGluc3RhbmNlLmdldE1ldGFkYXRhKCk7XG5cbiAgICAgIC8vIEluamVjdCBsb2dnZXJcbiAgICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBTdGVwTG9nZ2VyKHtcbiAgICAgICAgbG9nRGlyOiB0aGlzLmxvZ0RpcixcbiAgICAgICAgZXhlY3V0aW9uSWQ6IHRoaXMuZXhlY3V0aW9uSWQsXG4gICAgICAgIHN0ZXBUeXBlOiBtZXRhZGF0YS50eXBlLFxuICAgICAgfSk7XG4gICAgICBpbnN0YW5jZS5fc2V0TG9nZ2VyKGxvZ2dlcik7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHBhcmFtcyBhZ2FpbnN0IHRoZSBzdGVwJ3Mgc2NoZW1hXG4gICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IG1ldGFkYXRhLnNjaGVtYS5zYWZlUGFyc2UocGFyYW1zKTtcbiAgICAgIGlmICghcGFyc2VSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aGlzLndyaXRlT3V0cHV0KFxuICAgICAgICAgIFN0ZXBPdXRwdXRzLmZhaWxlZChcbiAgICAgICAgICAgIGBJbnZhbGlkIHBhcmFtczogJHtwYXJzZVJlc3VsdC5lcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICBcIklOVkFMSURfUEFSQU1TXCJcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWRhdGVkUGFyYW1zID0gcGFyc2VSZXN1bHQuZGF0YTtcblxuICAgICAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcGhhc2UgYmFzZWQgb24gc3RlcCBraW5kIGFuZCBpbnB1dCBjb250ZXh0XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnJvdXRlRXhlY3V0aW9uKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIHZhbGlkYXRlZFBhcmFtcyxcbiAgICAgICAgYXBwcm92YWxDb250ZXh0LFxuICAgICAgICBwb2xsaW5nU3RhdGVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMud3JpdGVPdXRwdXQob3V0cHV0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgdGhpcy53cml0ZU91dHB1dChTdGVwT3V0cHV0cy5mYWlsZWQoZXJyb3JNZXNzYWdlLCBcIkVYRUNVVElPTl9FUlJPUlwiKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByb3V0ZUV4ZWN1dGlvbihcbiAgICBpbnN0YW5jZTogQmFzZVN0ZXA8dW5rbm93bj4sXG4gICAgbWV0YWRhdGE6IFN0ZXBNZXRhZGF0YSxcbiAgICBwYXJhbXM6IHVua25vd24sXG4gICAgYXBwcm92YWxDb250ZXh0PzogQXBwcm92YWxDb250ZXh0LFxuICAgIHBvbGxpbmdTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8U3RlcE91dHB1dD4ge1xuICAgIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSBtZXRhZGF0YS5yZXF1aXJlc0FwcHJvdmFsO1xuXG4gICAgaWYgKG1ldGFkYXRhLnN0ZXBLaW5kID09PSBcInNpbXBsZVwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZVNpbXBsZVN0ZXAoXG4gICAgICAgIGluc3RhbmNlIGFzIFNpbXBsZVN0ZXA8dW5rbm93bj4sXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgcmVxdWlyZXNBcHByb3ZhbCxcbiAgICAgICAgYXBwcm92YWxDb250ZXh0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5zdGVwS2luZCA9PT0gXCJwb2xsaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUG9sbGluZ1N0ZXAoXG4gICAgICAgIGluc3RhbmNlIGFzIFBvbGxpbmdTdGVwPHVua25vd24sIFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsLFxuICAgICAgICBhcHByb3ZhbENvbnRleHQsXG4gICAgICAgIHBvbGxpbmdTdGF0ZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RlcE91dHB1dHMuZmFpbGVkKFxuICAgICAgYFVua25vd24gc3RlcCBraW5kOiAke21ldGFkYXRhLnN0ZXBLaW5kfWAsXG4gICAgICBcIlVOS05PV05fU1RFUF9LSU5EXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIFNpbXBsZVN0ZXAgZXhlY3V0aW9uIGJhc2VkIG9uIGFwcHJvdmFsIHN0YXRlLlxuICAgKlxuICAgKiB8IHJlcXVpcmVzQXBwcm92YWwgfCBhcHByb3ZhbENvbnRleHQgcHJvdmlkZWQ/IHwgQWN0aW9uICAgICAgICAgICAgICB8XG4gICAqIHwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICogfCBObyAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgICAgICAgICB8IENhbGwgcnVuKHBhcmFtcykgICAgfFxuICAgKiB8IFllcyAgICAgICAgICAgICAgfCBObyAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2FsbCBwcmVwYXJlKHBhcmFtcyl8XG4gICAqIHwgWWVzICAgICAgICAgICAgICB8IFllcyAgICAgICAgICAgICAgICAgICAgICAgfCBDYWxsIHJ1bihwYXJhbXMsIGFwcHJvdmFsKSB8XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJvdXRlU2ltcGxlU3RlcChcbiAgICBpbnN0YW5jZTogU2ltcGxlU3RlcDx1bmtub3duPixcbiAgICBwYXJhbXM6IHVua25vd24sXG4gICAgcmVxdWlyZXNBcHByb3ZhbDogYm9vbGVhbixcbiAgICBhcHByb3ZhbENvbnRleHQ/OiBBcHByb3ZhbENvbnRleHRcbiAgKTogUHJvbWlzZTxTdGVwT3V0cHV0PiB7XG4gICAgaWYgKCFyZXF1aXJlc0FwcHJvdmFsKSB7XG4gICAgICAvLyBObyBhcHByb3ZhbCBuZWVkZWQgLSBqdXN0IHJ1blxuICAgICAgcmV0dXJuIGluc3RhbmNlLmV4ZWN1dGUocGFyYW1zLCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGlmICghYXBwcm92YWxDb250ZXh0KSB7XG4gICAgICAvLyBOZWVkcyBhcHByb3ZhbCBidXQgZG9uJ3QgaGF2ZSBpdCB5ZXQgLSBjYWxsIHByZXBhcmVcbiAgICAgIHJldHVybiBpbnN0YW5jZS5wcmVwYXJlKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gSGF2ZSBhcHByb3ZhbCAtIHJ1biB3aXRoIGFwcHJvdmFsIGNvbnRleHRcbiAgICByZXR1cm4gaW5zdGFuY2UuZXhlY3V0ZShwYXJhbXMsIGFwcHJvdmFsQ29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgUG9sbGluZ1N0ZXAgZXhlY3V0aW9uIGJhc2VkIG9uIGFwcHJvdmFsIGFuZCBwb2xsaW5nIHN0YXRlLlxuICAgKlxuICAgKiB8IHJlcXVpcmVzQXBwcm92YWwgfCBhcHByb3ZhbENvbnRleHQ/IHwgcG9sbGluZ1N0YXRlPyB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gICAqIHwgTm8gICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgfCBObyAgICAgICAgICAgIHwgQ2FsbCB0cmlnZ2VyKHBhcmFtcykgICAgICAgICAgfFxuICAgKiB8IE5vICAgICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgIHwgWWVzICAgICAgICAgICB8IENhbGwgcG9sbChwYXJhbXMsIHBvbGxpbmdTdGF0ZSl8XG4gICAqIHwgWWVzICAgICAgICAgICAgICB8IE5vICAgICAgICAgICAgICAgfCBObyAgICAgICAgICAgIHwgQ2FsbCBwcmVwYXJlKHBhcmFtcykgICAgICAgICAgfFxuICAgKiB8IFllcyAgICAgICAgICAgICAgfCBZZXMgICAgICAgICAgICAgIHwgTm8gICAgICAgICAgICB8IENhbGwgdHJpZ2dlcihwYXJhbXMsIGFwcHJvdmFsKXxcbiAgICogfCBZZXMgICAgICAgICAgICAgIHwgWWVzICAgICAgICAgICAgICB8IFllcyAgICAgICAgICAgfCBDYWxsIHBvbGwocGFyYW1zLCBwb2xsaW5nU3RhdGUpfFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByb3V0ZVBvbGxpbmdTdGVwKFxuICAgIGluc3RhbmNlOiBQb2xsaW5nU3RlcDx1bmtub3duLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgcGFyYW1zOiB1bmtub3duLFxuICAgIHJlcXVpcmVzQXBwcm92YWw6IGJvb2xlYW4sXG4gICAgYXBwcm92YWxDb250ZXh0PzogQXBwcm92YWxDb250ZXh0LFxuICAgIHBvbGxpbmdTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8U3RlcE91dHB1dD4ge1xuICAgIC8vIElmIHdlIGhhdmUgcG9sbGluZyBzdGF0ZSwgd2UncmUgaW4gdGhlIHBvbGwgcGhhc2UgKHJlZ2FyZGxlc3Mgb2YgYXBwcm92YWwpXG4gICAgaWYgKHBvbGxpbmdTdGF0ZSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLmV4ZWN1dGVQb2xsKHBhcmFtcywgcG9sbGluZ1N0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVpcmVzQXBwcm92YWwpIHtcbiAgICAgIC8vIE5vIGFwcHJvdmFsIG5lZWRlZCAtIHRyaWdnZXIgZGlyZWN0bHlcbiAgICAgIHJldHVybiBpbnN0YW5jZS5leGVjdXRlVHJpZ2dlcihwYXJhbXMsIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgaWYgKCFhcHByb3ZhbENvbnRleHQpIHtcbiAgICAgIC8vIE5lZWRzIGFwcHJvdmFsIGJ1dCBkb24ndCBoYXZlIGl0IHlldCAtIGNhbGwgcHJlcGFyZVxuICAgICAgcmV0dXJuIGluc3RhbmNlLnByZXBhcmUocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBIYXZlIGFwcHJvdmFsIC0gdHJpZ2dlciB3aXRoIGFwcHJvdmFsIGNvbnRleHRcbiAgICByZXR1cm4gaW5zdGFuY2UuZXhlY3V0ZVRyaWdnZXIocGFyYW1zLCBhcHByb3ZhbENvbnRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSB3cml0ZU91dHB1dChvdXRwdXQ6IFN0ZXBPdXRwdXQpOiB2b2lkIHtcbiAgICBjb25zdCBvdXRwdXREaXIgPSBwYXRoLmRpcm5hbWUodGhpcy5vdXRwdXRQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKG91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLm91dHB1dFBhdGgsIEpTT04uc3RyaW5naWZ5KG91dHB1dCwgbnVsbCwgMikpO1xuICB9XG59XG4iXX0=
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWdpc3RyeS9zdGVwLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0Isd0RBQWdDO0FBQ2hDLDhDQUFvQjtBQUlwQix3REFBb0Q7QUFFcEQsdURBQTJFO0FBRTNFLGdGQUFnRjtBQUNoRixnQkFBZ0I7QUFDaEIsZ0ZBQWdGO0FBRWhGLE1BQU0sNEJBQTRCLEdBQUcsYUFBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QyxHQUFHLEVBQUUsYUFBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztDQUN0QyxDQUFDLENBQUM7QUFFSCxNQUFNLHlCQUF5QixHQUFHLGFBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekMsR0FBRyxFQUFFLGFBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ3pCLElBQUksRUFBRSxhQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLE1BQU0sRUFBRSxhQUFDLENBQUMsTUFBTSxDQUFDLGFBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDckMsNERBQTREO0lBQzVELGVBQWUsRUFBRSxtQ0FBcUIsQ0FBQyxRQUFRLEVBQUU7SUFDakQsWUFBWSxFQUFFLGFBQUMsQ0FBQyxNQUFNLENBQUMsYUFBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLGFBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtDQUN2RCxDQUFDLENBQUM7QUFFVSxRQUFBLHVCQUF1QixHQUFHLGFBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7SUFDakUseUJBQXlCO0lBQ3pCLDRCQUE0QjtDQUM3QixDQUFDLENBQUM7QUFJSCxnRkFBZ0Y7QUFDaEYsZ0JBQWdCO0FBQ2hCLGdGQUFn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SUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLHNEQUFzRDtZQUN0RCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTyxXQUFXLENBQUMsTUFBa0I7UUFDcEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM5QixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBalFELG9DQWlRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IG1pbmltaXN0IGZyb20gXCJtaW5pbWlzdFwiO1xuaW1wb3J0IHogZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlU3RlcCwgU3RlcE1ldGFkYXRhIH0gZnJvbSBcIi4uL2Jhc2UvYmFzZS1zdGVwXCI7XG5pbXBvcnQgdHlwZSB7IFNpbXBsZVN0ZXAgfSBmcm9tIFwiLi4vYmFzZS9zaW1wbGUtc3RlcFwiO1xuaW1wb3J0IHR5cGUgeyBQb2xsaW5nU3RlcCB9IGZyb20gXCIuLi9iYXNlL3BvbGxpbmctc3RlcFwiO1xuaW1wb3J0IHsgU3RlcExvZ2dlciB9IGZyb20gXCIuLi9sb2dnaW5nL3N0ZXAtbG9nZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEFwcHJvdmFsQ29udGV4dCwgU3RlcE91dHB1dCB9IGZyb20gXCIuLi9vdXRwdXQvc3RlcC1vdXRwdXRcIjtcbmltcG9ydCB7IEFwcHJvdmFsQ29udGV4dFNjaGVtYSwgU3RlcE91dHB1dHMgfSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbnB1dCBTY2hlbWFzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jb25zdCBTdGVwUmVnaXN0cnlTeW50aGVzaXplU2NoZW1hID0gei5vYmplY3Qoe1xuICBqb2I6IHoubGl0ZXJhbChcIlNZTlRIRVNJWkUtTUVUQURBVEFcIiksXG59KTtcblxuY29uc3QgU3RlcFJlZ2lzdHJ5RXhlY3V0ZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgam9iOiB6LmxpdGVyYWwoXCJFWEVDVVRFXCIpLFxuICB0eXBlOiB6LnN0cmluZygpLFxuICBwYXJhbXM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpLFxuICAvLyBPcHRpb25hbCBjb250ZXh0IC0gcHJlc2VuY2UgZGV0ZXJtaW5lcyB3aGljaCBwaGFzZSB0byBydW5cbiAgYXBwcm92YWxDb250ZXh0OiBBcHByb3ZhbENvbnRleHRTY2hlbWEub3B0aW9uYWwoKSxcbiAgcG9sbGluZ1N0YXRlOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTdGVwUmVnaXN0cnlJbnB1dFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwiam9iXCIsIFtcbiAgU3RlcFJlZ2lzdHJ5RXhlY3V0ZVNjaGVtYSxcbiAgU3RlcFJlZ2lzdHJ5U3ludGhlc2l6ZVNjaGVtYSxcbl0pO1xuXG5leHBvcnQgdHlwZSBTdGVwUmVnaXN0cnlJbnB1dCA9IHouaW5mZXI8dHlwZW9mIFN0ZXBSZWdpc3RyeUlucHV0U2NoZW1hPjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IERFRkFVTFRfT1VUUFVUX1BBVEggPSBcIi90bXAvc3RlcC1vdXRwdXQuanNvblwiO1xuY29uc3QgREVGQVVMVF9MT0dfRElSID0gXCIvdG1wL3N0ZXAtbG9nc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3RlcFJlZ2lzdHJ5XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgU3RlcFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBzdGVwczogTWFwPHN0cmluZywgQmFzZVN0ZXA8dW5rbm93bj4+O1xuICBwcml2YXRlIG91dHB1dFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBsb2dEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBleGVjdXRpb25JZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgc3RlcHM6IEJhc2VTdGVwPHVua25vd24+W10sXG4gICAgb3V0cHV0UGF0aDogc3RyaW5nLFxuICAgIGxvZ0Rpcjogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbklkOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5zdGVwcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm91dHB1dFBhdGggPSBvdXRwdXRQYXRoO1xuICAgIHRoaXMubG9nRGlyID0gbG9nRGlyO1xuICAgIHRoaXMuZXhlY3V0aW9uSWQgPSBleGVjdXRpb25JZDtcblxuICAgIGZvciAoY29uc3QgaW5zdGFuY2Ugb2Ygc3RlcHMpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gaW5zdGFuY2UuZ2V0TWV0YWRhdGEoKTtcbiAgICAgIHRoaXMuc3RlcHMuc2V0KG1ldGFkYXRhLnN0ZXBUeXBlLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1haW4gZW50cnlwb2ludCBmb3IgcnVubmluZyBzdGVwcy5cbiAgICogUGFyc2VzIENMSSBhcmdzIGFuZCBlaXRoZXIgc3ludGhlc2l6ZXMgbWV0YWRhdGEgb3IgZXhlY3V0ZXMgYSBzdGVwLlxuICAgKlxuICAgKiBVc2FnZSBpbiB1c2VyJ3MgZW50cnlwb2ludCBmaWxlOlxuICAgKiBgYGBcbiAgICogU3RlcFJlZ2lzdHJ5LnJ1bihbXG4gICAqICAgbmV3IE15U3RlcDEoZGVwZW5kZW5jeTEsIGRlcGVuZGVuY3kyKSxcbiAgICogICBuZXcgTXlTdGVwMihjb25maWcpXG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQ0xJIGFyZ3VtZW50czpcbiAgICogLSAtLWlucHV0OiBKU09OIGJsb2Igd2l0aCBqb2IgdHlwZSBhbmQgcGFyYW1ldGVyc1xuICAgKiAtIC0tb3V0cHV0OiBQYXRoIHRvIHdyaXRlIG91dHB1dCBKU09OIChkZWZhdWx0OiAvdG1wL3N0ZXAtb3V0cHV0Lmpzb24pXG4gICAqIC0gLS1sb2ctZGlyOiBEaXJlY3RvcnkgZm9yIGxvZyBmaWxlcyAoZGVmYXVsdDogL3RtcC9zdGVwLWxvZ3MpXG4gICAqIC0gLS1leGVjdXRpb24taWQ6IFVuaXF1ZSBJRCBmb3IgdGhpcyBleGVjdXRpb24gKHJlcXVpcmVkIGZvciBsb2dnaW5nKVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJ1bihzdGVwczogQmFzZVN0ZXA8dW5rbm93bj5bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFyZ3MgPSBtaW5pbWlzdChwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpO1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBhcmdzW1wib3V0cHV0XCJdIHx8IERFRkFVTFRfT1VUUFVUX1BBVEg7XG4gICAgY29uc3QgbG9nRGlyID0gYXJnc1tcImxvZy1kaXJcIl0gfHwgREVGQVVMVF9MT0dfRElSO1xuICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gYXJnc1tcImV4ZWN1dGlvbi1pZFwiXSB8fCBgZXhlYy0ke0RhdGUubm93KCl9YDtcblxuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IFN0ZXBSZWdpc3RyeShzdGVwcywgb3V0cHV0UGF0aCwgbG9nRGlyLCBleGVjdXRpb25JZCk7XG4gICAgYXdhaXQgcmVnaXN0cnkuZXhlY3V0ZShhcmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZShhcmdzOiBtaW5pbWlzdC5QYXJzZWRBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gU3RlcFJlZ2lzdHJ5SW5wdXRTY2hlbWEucGFyc2UoSlNPTi5wYXJzZShhcmdzW1wiaW5wdXRcIl0pKTtcblxuICAgICAgc3dpdGNoIChpbnB1dC5qb2IpIHtcbiAgICAgICAgY2FzZSBcIlNZTlRIRVNJWkUtTUVUQURBVEFcIjoge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5zeW50aGVzaXplTWV0YWRhdGEoKTtcbiAgICAgICAgICB0aGlzLndyaXRlT3V0cHV0KHsgc3RhdHVzOiBcIlNVQ0NFU1NcIiwgZGF0YTogeyBtZXRhZGF0YSB9IH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcIkVYRUNVVEVcIjoge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVN0ZXAoXG4gICAgICAgICAgICBpbnB1dC50eXBlLFxuICAgICAgICAgICAgaW5wdXQucGFyYW1zLFxuICAgICAgICAgICAgaW5wdXQuYXBwcm92YWxDb250ZXh0LFxuICAgICAgICAgICAgaW5wdXQucG9sbGluZ1N0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICB0aGlzLndyaXRlT3V0cHV0KFN0ZXBPdXRwdXRzLmZhaWxlZChlcnJvck1lc3NhZ2UsIFwiUkVHSVNUUllfRVJST1JcIikpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3ludGhlc2l6ZU1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YVtdIHtcbiAgICBjb25zdCBtZXRhZGF0YTogU3RlcE1ldGFkYXRhW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgaW5zdGFuY2Ugb2YgdGhpcy5zdGVwcy52YWx1ZXMoKSkge1xuICAgICAgbWV0YWRhdGEucHVzaChpbnN0YW5jZS5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdGVwKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGFwcHJvdmFsQ29udGV4dD86IEFwcHJvdmFsQ29udGV4dCxcbiAgICBwb2xsaW5nU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuc3RlcHMuZ2V0KHR5cGUpO1xuXG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgdGhpcy53cml0ZU91dHB1dChcbiAgICAgICAgU3RlcE91dHB1dHMuZmFpbGVkKFxuICAgICAgICAgIGBObyBzdGVwIHJlZ2lzdGVyZWQgd2l0aCB0eXBlOiAke3R5cGV9YCxcbiAgICAgICAgICBcIlNURVBfTk9UX0ZPVU5EXCJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBpbnN0YW5jZS5nZXRNZXRhZGF0YSgpO1xuXG4gICAgICAvLyBJbmplY3QgbG9nZ2VyXG4gICAgICBjb25zdCBsb2dnZXIgPSBuZXcgU3RlcExvZ2dlcih7XG4gICAgICAgIGxvZ0RpcjogdGhpcy5sb2dEaXIsXG4gICAgICAgIGV4ZWN1dGlvbklkOiB0aGlzLmV4ZWN1dGlvbklkLFxuICAgICAgICBzdGVwVHlwZTogbWV0YWRhdGEuc3RlcFR5cGUsXG4gICAgICB9KTtcbiAgICAgIGluc3RhbmNlLl9zZXRMb2dnZXIobG9nZ2VyKTtcblxuICAgICAgLy8gVmFsaWRhdGUgcGFyYW1zIGFnYWluc3QgdGhlIHN0ZXAncyBzY2hlbWFcbiAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gbWV0YWRhdGEuc2NoZW1hLnNhZmVQYXJzZShwYXJhbXMpO1xuICAgICAgaWYgKCFwYXJzZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRoaXMud3JpdGVPdXRwdXQoXG4gICAgICAgICAgU3RlcE91dHB1dHMuZmFpbGVkKFxuICAgICAgICAgICAgYEludmFsaWQgcGFyYW1zOiAke3BhcnNlUmVzdWx0LmVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIFwiSU5WQUxJRF9QQVJBTVNcIlxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWxpZGF0ZWRQYXJhbXMgPSBwYXJzZVJlc3VsdC5kYXRhO1xuXG4gICAgICAvLyBSb3V0ZSB0byBhcHByb3ByaWF0ZSBwaGFzZSBiYXNlZCBvbiBzdGVwIGtpbmQgYW5kIGlucHV0IGNvbnRleHRcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMucm91dGVFeGVjdXRpb24oXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgdmFsaWRhdGVkUGFyYW1zLFxuICAgICAgICBhcHByb3ZhbENvbnRleHQsXG4gICAgICAgIHBvbGxpbmdTdGF0ZVxuICAgICAgKTtcblxuICAgICAgdGhpcy53cml0ZU91dHB1dChvdXRwdXQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICB0aGlzLndyaXRlT3V0cHV0KFN0ZXBPdXRwdXRzLmZhaWxlZChlcnJvck1lc3NhZ2UsIFwiRVhFQ1VUSU9OX0VSUk9SXCIpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJvdXRlRXhlY3V0aW9uKFxuICAgIGluc3RhbmNlOiBCYXNlU3RlcDx1bmtub3duPixcbiAgICBtZXRhZGF0YTogU3RlcE1ldGFkYXRhLFxuICAgIHBhcmFtczogdW5rbm93bixcbiAgICBhcHByb3ZhbENvbnRleHQ/OiBBcHByb3ZhbENvbnRleHQsXG4gICAgcG9sbGluZ1N0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTxTdGVwT3V0cHV0PiB7XG4gICAgY29uc3QgcmVxdWlyZXNBcHByb3ZhbCA9IG1ldGFkYXRhLnJlcXVpcmVzQXBwcm92YWw7XG5cbiAgICBpZiAobWV0YWRhdGEuc3RlcEtpbmQgPT09IFwic2ltcGxlXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlU2ltcGxlU3RlcChcbiAgICAgICAgaW5zdGFuY2UgYXMgU2ltcGxlU3RlcDx1bmtub3duPixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsLFxuICAgICAgICBhcHByb3ZhbENvbnRleHRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnN0ZXBLaW5kID09PSBcInBvbGxpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVQb2xsaW5nU3RlcChcbiAgICAgICAgaW5zdGFuY2UgYXMgUG9sbGluZ1N0ZXA8dW5rbm93biwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlcXVpcmVzQXBwcm92YWwsXG4gICAgICAgIGFwcHJvdmFsQ29udGV4dCxcbiAgICAgICAgcG9sbGluZ1N0YXRlXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBTdGVwT3V0cHV0cy5mYWlsZWQoXG4gICAgICBgVW5rbm93biBzdGVwIGtpbmQ6ICR7bWV0YWRhdGEuc3RlcEtpbmR9YCxcbiAgICAgIFwiVU5LTk9XTl9TVEVQX0tJTkRcIlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgU2ltcGxlU3RlcCBleGVjdXRpb24gYmFzZWQgb24gYXBwcm92YWwgc3RhdGUuXG4gICAqXG4gICAqIHwgcmVxdWlyZXNBcHByb3ZhbCB8IGFwcHJvdmFsQ29udGV4dCBwcm92aWRlZD8gfCBBY3Rpb24gICAgICAgICAgICAgIHxcbiAgICogfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgKiB8IE5vICAgICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2FsbCBydW4ocGFyYW1zKSAgICB8XG4gICAqIHwgWWVzICAgICAgICAgICAgICB8IE5vICAgICAgICAgICAgICAgICAgICAgICAgfCBDYWxsIHByZXBhcmUocGFyYW1zKXxcbiAgICogfCBZZXMgICAgICAgICAgICAgIHwgWWVzICAgICAgICAgICAgICAgICAgICAgICB8IENhbGwgcnVuKHBhcmFtcywgYXBwcm92YWwpIHxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcm91dGVTaW1wbGVTdGVwKFxuICAgIGluc3RhbmNlOiBTaW1wbGVTdGVwPHVua25vd24+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.2",
3
+ "version": "0.1.4",
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,297 @@
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[2] || "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(path.join(srcDir, "deployment-service.ts"), deploymentServiceContent);
71
+
72
+ // Create my-first-step.ts
73
+ console.log("Creating my-first-step.ts...");
74
+ const myFirstStepContent = `import {
75
+ RunOutput,
76
+ SimpleStep,
77
+ Step,
78
+ StepOutputs,
79
+ } from "@devramps/sdk-typescript";
80
+ import z from "zod";
81
+ import { DeploymentService } from "../deployment-service";
82
+
83
+ const DeploySchema = z.object({
84
+ target: z.string().describe("A Target"),
85
+ version: z.string().optional(),
86
+ });
87
+
88
+ type DeployParams = z.infer<typeof DeploySchema>;
89
+
90
+ @Step({
91
+ name: "Custom Deployment Action",
92
+ type: "CUSTOM:SCRIPT:DEPLOY",
93
+ schema: DeploySchema,
94
+ })
95
+ export class MyFirstStep extends SimpleStep<DeployParams> {
96
+ constructor(private deploymentService: DeploymentService) {
97
+ super();
98
+ }
99
+
100
+ async run(params: DeployParams): Promise<RunOutput> {
101
+ this.logger.info(\`Deploying with params: \${JSON.stringify(params)}\`);
102
+
103
+ const result = await this.deploymentService.deploy(
104
+ params.target,
105
+ params.version
106
+ );
107
+
108
+ this.logger.info(\`Deployment completed: \${result.deploymentId}\`);
109
+
110
+ return StepOutputs.success({
111
+ deploymentId: result.deploymentId,
112
+ target: params.target,
113
+ version: params.version,
114
+ });
115
+ }
116
+ }
117
+ `;
118
+ fs.writeFileSync(path.join(stepsDir, "my-first-step.ts"), myFirstStepContent);
119
+
120
+ // Create src/index.ts
121
+ console.log("Creating src/index.ts...");
122
+ const indexContent = `import { StepRegistry } from "@devramps/sdk-typescript";
123
+ import { MyFirstStep } from "./steps/my-first-step";
124
+ import { RealDeploymentService } from "./deployment-service";
125
+
126
+ // Instantiate dependencies
127
+ const deploymentService = new RealDeploymentService();
128
+
129
+ // Instantiate steps with their dependencies
130
+ const myFirstStep = new MyFirstStep(deploymentService);
131
+
132
+ // Register step instances
133
+ StepRegistry.run([myFirstStep]);
134
+ `;
135
+ fs.writeFileSync(path.join(srcDir, "index.ts"), indexContent);
136
+
137
+ // Create tsconfig.json
138
+ console.log("Creating tsconfig.json...");
139
+ const tsconfigContent = `{
140
+ "compilerOptions": {
141
+ "target": "ES2022",
142
+ "module": "commonjs",
143
+ "lib": ["ES2022"],
144
+ "types": ["node", "jest"],
145
+ "declaration": true,
146
+ "strict": true,
147
+ "noImplicitAny": true,
148
+ "strictNullChecks": true,
149
+ "noImplicitThis": true,
150
+ "alwaysStrict": true,
151
+ "noUnusedLocals": false,
152
+ "noUnusedParameters": false,
153
+ "noImplicitReturns": true,
154
+ "noFallthroughCasesInSwitch": false,
155
+ "inlineSourceMap": true,
156
+ "inlineSources": true,
157
+ "experimentalDecorators": true,
158
+ "emitDecoratorMetadata": true,
159
+ "strictPropertyInitialization": false,
160
+ "esModuleInterop": true,
161
+ "skipLibCheck": true,
162
+ "outDir": "./dist",
163
+ "rootDir": "./src"
164
+ },
165
+ "include": ["src/**/*", "tst/**/*"],
166
+ "exclude": ["node_modules", "dist"]
167
+ }
168
+ `;
169
+ fs.writeFileSync(path.join(baseDir, "tsconfig.json"), tsconfigContent);
170
+
171
+ // Create jest.config.js
172
+ console.log("Creating jest.config.js...");
173
+ const jestConfigContent = `module.exports = {
174
+ preset: 'ts-jest',
175
+ testEnvironment: 'node',
176
+ roots: ['<rootDir>/tst'],
177
+ testMatch: ['**/*.test.ts'],
178
+ moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
179
+ collectCoverageFrom: [
180
+ 'src/**/*.ts',
181
+ '!src/**/*.d.ts',
182
+ ],
183
+ };
184
+ `;
185
+ fs.writeFileSync(path.join(baseDir, "jest.config.js"), jestConfigContent);
186
+
187
+ // Create test file for my-first-step
188
+ console.log("Creating tst/steps/my-first-step.test.ts...");
189
+ const testContent = `import { MyFirstStep } from "../../src/steps/my-first-step";
190
+ import { DeploymentService } from "../../src/deployment-service";
191
+ import { StepOutputs } from "@devramps/sdk-typescript";
192
+
193
+ // Mock implementation of DeploymentService for testing
194
+ class MockDeploymentService implements DeploymentService {
195
+ async deploy(target: string, version?: string): Promise<{ deploymentId: string }> {
196
+ return { deploymentId: \`mock-deploy-\${target}-\${version || "latest"}\` };
197
+ }
198
+ }
199
+
200
+ describe("MyFirstStep", () => {
201
+ let mockDeploymentService: MockDeploymentService;
202
+ let step: MyFirstStep;
203
+
204
+ beforeEach(() => {
205
+ // Create mock dependency
206
+ mockDeploymentService = new MockDeploymentService();
207
+ // Inject mock into step
208
+ step = new MyFirstStep(mockDeploymentService);
209
+ });
210
+
211
+ it("should run successfully with valid parameters", async () => {
212
+ const params = {
213
+ target: "production",
214
+ version: "1.0.0",
215
+ };
216
+
217
+ const result = await step.run(params);
218
+
219
+ expect(result.status).toBe("SUCCESS");
220
+ if (result.status === "SUCCESS") {
221
+ expect(result.data).toEqual({
222
+ deploymentId: "mock-deploy-production-1.0.0",
223
+ target: "production",
224
+ version: "1.0.0",
225
+ });
226
+ }
227
+ });
228
+
229
+ it("should run successfully without optional version parameter", async () => {
230
+ const params = {
231
+ target: "staging",
232
+ };
233
+
234
+ const result = await step.run(params);
235
+
236
+ expect(result.status).toBe("SUCCESS");
237
+ if (result.status === "SUCCESS") {
238
+ expect(result.data).toEqual({
239
+ deploymentId: "mock-deploy-staging-latest",
240
+ target: "staging",
241
+ version: undefined,
242
+ });
243
+ }
244
+ });
245
+
246
+ it("should call deployment service with correct parameters", async () => {
247
+ const deploySpy = jest.spyOn(mockDeploymentService, "deploy");
248
+ const params = {
249
+ target: "development",
250
+ version: "2.0.0",
251
+ };
252
+
253
+ await step.run(params);
254
+
255
+ expect(deploySpy).toHaveBeenCalledWith("development", "2.0.0");
256
+ });
257
+
258
+ it("should log deployment information", async () => {
259
+ // Access the logger through type assertion to test logging behavior
260
+ const logSpy = jest.spyOn((step as any).logger, "info");
261
+ const params = {
262
+ target: "production",
263
+ version: "3.0.0",
264
+ };
265
+
266
+ await step.run(params);
267
+
268
+ expect(logSpy).toHaveBeenCalledWith(
269
+ \`Deploying with params: \${JSON.stringify(params)}\`
270
+ );
271
+ expect(logSpy).toHaveBeenCalledWith(
272
+ "Deployment completed: mock-deploy-production-3.0.0"
273
+ );
274
+ });
275
+ });
276
+ `;
277
+ fs.writeFileSync(path.join(tstStepsDir, "my-first-step.test.ts"), testContent);
278
+
279
+ // Update package.json to add build and start scripts
280
+ console.log('Adding build and start scripts to package.json...');
281
+ const packageJsonPath = path.join(baseDir, 'package.json');
282
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
283
+ packageJson.scripts = {
284
+ ...packageJson.scripts,
285
+ "build-step-registry": "tsc -p tsconfig.json",
286
+ "start-step-registry": "node ./dist/index.js",
287
+ "test": "jest",
288
+ "test:watch": "jest --watch",
289
+ "test:coverage": "jest --coverage"
290
+ };
291
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
292
+
293
+ console.log(`\nStep registry created successfully in '${folderName}'!`);
294
+ console.log(`\nNext steps:`);
295
+ console.log(` cd ${folderName}`);
296
+ console.log(` npm run build-step-registry`);
297
+ console.log(` npm run test`);