@devramps/sdk-typescript 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +461 -0
- package/dist/base/base-step.d.ts +41 -0
- package/dist/base/base-step.js +38 -0
- package/dist/base/polling-step.d.ts +85 -0
- package/dist/base/polling-step.js +80 -0
- package/dist/base/requires-approval-step.d.ts +5 -0
- package/dist/base/requires-approval-step.js +8 -0
- package/dist/base/simple-step.d.ts +51 -0
- package/dist/base/simple-step.js +52 -0
- package/dist/decorators/step.d.ts +24 -0
- package/dist/decorators/step.js +45 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +35 -0
- package/dist/logging/step-logger.d.ts +35 -0
- package/dist/logging/step-logger.js +94 -0
- package/dist/output/step-output.d.ts +286 -0
- package/dist/output/step-output.js +108 -0
- package/dist/registry/step-registry.d.ts +93 -0
- package/dist/registry/step-registry.js +238 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +3 -0
- package/package.json +70 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.StepRegistry = exports.StepRegistryInputSchema = void 0;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const minimist_1 = __importDefault(require("minimist"));
|
|
43
|
+
const zod_1 = __importDefault(require("zod"));
|
|
44
|
+
const step_logger_1 = require("../logging/step-logger");
|
|
45
|
+
const step_output_1 = require("../output/step-output");
|
|
46
|
+
// =============================================================================
|
|
47
|
+
// Input Schemas
|
|
48
|
+
// =============================================================================
|
|
49
|
+
const StepRegistrySynthesizeSchema = zod_1.default.object({
|
|
50
|
+
job: zod_1.default.literal("SYNTHESIZE-METADATA"),
|
|
51
|
+
});
|
|
52
|
+
const StepRegistryExecuteSchema = zod_1.default.object({
|
|
53
|
+
job: zod_1.default.literal("EXECUTE"),
|
|
54
|
+
type: zod_1.default.string(),
|
|
55
|
+
params: zod_1.default.record(zod_1.default.string(), zod_1.default.any()),
|
|
56
|
+
// Optional context - presence determines which phase to run
|
|
57
|
+
approvalContext: step_output_1.ApprovalContextSchema.optional(),
|
|
58
|
+
pollingState: zod_1.default.record(zod_1.default.string(), zod_1.default.any()).optional(),
|
|
59
|
+
});
|
|
60
|
+
exports.StepRegistryInputSchema = zod_1.default.discriminatedUnion("job", [
|
|
61
|
+
StepRegistryExecuteSchema,
|
|
62
|
+
StepRegistrySynthesizeSchema,
|
|
63
|
+
]);
|
|
64
|
+
// =============================================================================
|
|
65
|
+
// Configuration
|
|
66
|
+
// =============================================================================
|
|
67
|
+
const DEFAULT_OUTPUT_PATH = "/tmp/step-output.json";
|
|
68
|
+
const DEFAULT_LOG_DIR = "/tmp/step-logs";
|
|
69
|
+
// =============================================================================
|
|
70
|
+
// StepRegistry
|
|
71
|
+
// =============================================================================
|
|
72
|
+
class StepRegistry {
|
|
73
|
+
steps;
|
|
74
|
+
outputPath;
|
|
75
|
+
logDir;
|
|
76
|
+
executionId;
|
|
77
|
+
constructor(steps, outputPath, logDir, executionId) {
|
|
78
|
+
this.steps = new Map();
|
|
79
|
+
this.outputPath = outputPath;
|
|
80
|
+
this.logDir = logDir;
|
|
81
|
+
this.executionId = executionId;
|
|
82
|
+
for (const StepCls of steps) {
|
|
83
|
+
const instance = new StepCls();
|
|
84
|
+
const metadata = instance.getMetadata();
|
|
85
|
+
this.steps.set(metadata.type, StepCls);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Main entrypoint for running steps.
|
|
90
|
+
* Parses CLI args and either synthesizes metadata or executes a step.
|
|
91
|
+
*
|
|
92
|
+
* Usage in user's entrypoint file:
|
|
93
|
+
* ```
|
|
94
|
+
* StepRegistry.run([MyStep1, MyStep2, ...]);
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* CLI arguments:
|
|
98
|
+
* - --input: JSON blob with job type and parameters
|
|
99
|
+
* - --output: Path to write output JSON (default: /tmp/step-output.json)
|
|
100
|
+
* - --log-dir: Directory for log files (default: /tmp/step-logs)
|
|
101
|
+
* - --execution-id: Unique ID for this execution (required for logging)
|
|
102
|
+
*/
|
|
103
|
+
static async run(steps) {
|
|
104
|
+
const args = (0, minimist_1.default)(process.argv.slice(2));
|
|
105
|
+
const outputPath = args["output"] || DEFAULT_OUTPUT_PATH;
|
|
106
|
+
const logDir = args["log-dir"] || DEFAULT_LOG_DIR;
|
|
107
|
+
const executionId = args["execution-id"] || `exec-${Date.now()}`;
|
|
108
|
+
const registry = new StepRegistry(steps, outputPath, logDir, executionId);
|
|
109
|
+
await registry.execute(args);
|
|
110
|
+
}
|
|
111
|
+
async execute(args) {
|
|
112
|
+
try {
|
|
113
|
+
const input = exports.StepRegistryInputSchema.parse(JSON.parse(args["input"]));
|
|
114
|
+
switch (input.job) {
|
|
115
|
+
case "SYNTHESIZE-METADATA": {
|
|
116
|
+
const metadata = this.synthesizeMetadata();
|
|
117
|
+
this.writeOutput({ status: "SUCCESS", data: { metadata } });
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case "EXECUTE": {
|
|
121
|
+
await this.executeStep(input.type, input.params, input.approvalContext, input.pollingState);
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
128
|
+
this.writeOutput(step_output_1.StepOutputs.failed(errorMessage, "REGISTRY_ERROR"));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
synthesizeMetadata() {
|
|
132
|
+
const metadata = [];
|
|
133
|
+
for (const StepCls of this.steps.values()) {
|
|
134
|
+
const instance = new StepCls();
|
|
135
|
+
metadata.push(instance.getMetadata());
|
|
136
|
+
}
|
|
137
|
+
return metadata;
|
|
138
|
+
}
|
|
139
|
+
async executeStep(type, params, approvalContext, pollingState) {
|
|
140
|
+
const StepCls = this.steps.get(type);
|
|
141
|
+
if (!StepCls) {
|
|
142
|
+
this.writeOutput(step_output_1.StepOutputs.failed(`No step registered with type: ${type}`, "STEP_NOT_FOUND"));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const instance = new StepCls();
|
|
147
|
+
const metadata = instance.getMetadata();
|
|
148
|
+
// Inject logger
|
|
149
|
+
const logger = new step_logger_1.StepLogger({
|
|
150
|
+
logDir: this.logDir,
|
|
151
|
+
executionId: this.executionId,
|
|
152
|
+
stepType: metadata.type,
|
|
153
|
+
});
|
|
154
|
+
instance._setLogger(logger);
|
|
155
|
+
// Validate params against the step's schema
|
|
156
|
+
const parseResult = metadata.schema.safeParse(params);
|
|
157
|
+
if (!parseResult.success) {
|
|
158
|
+
this.writeOutput(step_output_1.StepOutputs.failed(`Invalid params: ${parseResult.error.message}`, "INVALID_PARAMS"));
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const validatedParams = parseResult.data;
|
|
162
|
+
// Route to appropriate phase based on step kind and input context
|
|
163
|
+
const output = await this.routeExecution(instance, metadata, validatedParams, approvalContext, pollingState);
|
|
164
|
+
this.writeOutput(output);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
168
|
+
this.writeOutput(step_output_1.StepOutputs.failed(errorMessage, "EXECUTION_ERROR"));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async routeExecution(instance, metadata, params, approvalContext, pollingState) {
|
|
172
|
+
const requiresApproval = metadata.requiresApproval;
|
|
173
|
+
if (metadata.stepKind === "simple") {
|
|
174
|
+
return this.routeSimpleStep(instance, params, requiresApproval, approvalContext);
|
|
175
|
+
}
|
|
176
|
+
if (metadata.stepKind === "polling") {
|
|
177
|
+
return this.routePollingStep(instance, params, requiresApproval, approvalContext, pollingState);
|
|
178
|
+
}
|
|
179
|
+
return step_output_1.StepOutputs.failed(`Unknown step kind: ${metadata.stepKind}`, "UNKNOWN_STEP_KIND");
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Route SimpleStep execution based on approval state.
|
|
183
|
+
*
|
|
184
|
+
* | requiresApproval | approvalContext provided? | Action |
|
|
185
|
+
* |------------------|---------------------------|---------------------|
|
|
186
|
+
* | No | - | Call run(params) |
|
|
187
|
+
* | Yes | No | Call prepare(params)|
|
|
188
|
+
* | Yes | Yes | Call run(params, approval) |
|
|
189
|
+
*/
|
|
190
|
+
async routeSimpleStep(instance, params, requiresApproval, approvalContext) {
|
|
191
|
+
if (!requiresApproval) {
|
|
192
|
+
// No approval needed - just run
|
|
193
|
+
return instance.execute(params, undefined);
|
|
194
|
+
}
|
|
195
|
+
if (!approvalContext) {
|
|
196
|
+
// Needs approval but don't have it yet - call prepare
|
|
197
|
+
return instance.prepare(params);
|
|
198
|
+
}
|
|
199
|
+
// Have approval - run with approval context
|
|
200
|
+
return instance.execute(params, approvalContext);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Route PollingStep execution based on approval and polling state.
|
|
204
|
+
*
|
|
205
|
+
* | requiresApproval | approvalContext? | pollingState? | Action |
|
|
206
|
+
* |------------------|------------------|---------------|-------------------------------|
|
|
207
|
+
* | No | - | No | Call trigger(params) |
|
|
208
|
+
* | No | - | Yes | Call poll(params, pollingState)|
|
|
209
|
+
* | Yes | No | No | Call prepare(params) |
|
|
210
|
+
* | Yes | Yes | No | Call trigger(params, approval)|
|
|
211
|
+
* | Yes | Yes | Yes | Call poll(params, pollingState)|
|
|
212
|
+
*/
|
|
213
|
+
async routePollingStep(instance, params, requiresApproval, approvalContext, pollingState) {
|
|
214
|
+
// If we have polling state, we're in the poll phase (regardless of approval)
|
|
215
|
+
if (pollingState) {
|
|
216
|
+
return instance.executePoll(params, pollingState);
|
|
217
|
+
}
|
|
218
|
+
if (!requiresApproval) {
|
|
219
|
+
// No approval needed - trigger directly
|
|
220
|
+
return instance.executeTrigger(params, undefined);
|
|
221
|
+
}
|
|
222
|
+
if (!approvalContext) {
|
|
223
|
+
// Needs approval but don't have it yet - call prepare
|
|
224
|
+
return instance.prepare(params);
|
|
225
|
+
}
|
|
226
|
+
// Have approval - trigger with approval context
|
|
227
|
+
return instance.executeTrigger(params, approvalContext);
|
|
228
|
+
}
|
|
229
|
+
writeOutput(output) {
|
|
230
|
+
const outputDir = path.dirname(this.outputPath);
|
|
231
|
+
if (!fs.existsSync(outputDir)) {
|
|
232
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
233
|
+
}
|
|
234
|
+
fs.writeFileSync(this.outputPath, JSON.stringify(output, null, 2));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
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=
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Parameters = Record<string, string>;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFBhcmFtZXRlcnMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuIl19
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@devramps/sdk-typescript",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "SDK for building custom deployment steps for DevRamps",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"LICENSE",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"import": "./dist/index.js",
|
|
16
|
+
"require": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc -p tsconfig.json",
|
|
22
|
+
"clean": "rm -rf dist",
|
|
23
|
+
"lint": "eslint src/",
|
|
24
|
+
"lint:fix": "eslint src/ --fix",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"test:coverage": "vitest run --coverage",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
30
|
+
"prepack": "npm run build"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"devramps",
|
|
34
|
+
"deployment",
|
|
35
|
+
"custom-step",
|
|
36
|
+
"ci-cd",
|
|
37
|
+
"workflow",
|
|
38
|
+
"automation"
|
|
39
|
+
],
|
|
40
|
+
"author": "DevRamps",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://github.com/Dev-Ramps/DevRamps-Step-Sdk-TypeScript.git"
|
|
45
|
+
},
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/Dev-Ramps/DevRamps-Step-Sdk-TypeScript/issues"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/Dev-Ramps/DevRamps-Step-Sdk-TypeScript",
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=18.0.0"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"minimist": "^1.2.8",
|
|
55
|
+
"zod": "^3.23.8"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"typescript": ">=5.0.0"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@eslint/js": "^9.17.0",
|
|
62
|
+
"@types/minimist": "^1.2.5",
|
|
63
|
+
"@types/node": "^22.10.0",
|
|
64
|
+
"@vitest/coverage-v8": "^2.1.0",
|
|
65
|
+
"eslint": "^9.17.0",
|
|
66
|
+
"typescript": "^5.7.0",
|
|
67
|
+
"typescript-eslint": "^8.18.0",
|
|
68
|
+
"vitest": "^2.1.0"
|
|
69
|
+
}
|
|
70
|
+
}
|