@pipeline-builder/pipeline-manager 3.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 +202 -0
- package/README.md +74 -0
- package/cdk.json +91 -0
- package/config.yml +94 -0
- package/dist/boilerplate.d.ts +3 -0
- package/dist/boilerplate.d.ts.map +1 -0
- package/dist/boilerplate.js +58 -0
- package/dist/cdk.json +91 -0
- package/dist/cli.d.ts +62 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +372 -0
- package/dist/commands/bootstrap.d.ts +11 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +159 -0
- package/dist/commands/create-pipeline.d.ts +12 -0
- package/dist/commands/create-pipeline.d.ts.map +1 -0
- package/dist/commands/create-pipeline.js +291 -0
- package/dist/commands/deploy.d.ts +15 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +167 -0
- package/dist/commands/get-pipeline.d.ts +13 -0
- package/dist/commands/get-pipeline.d.ts.map +1 -0
- package/dist/commands/get-pipeline.js +97 -0
- package/dist/commands/get-plugin.d.ts +13 -0
- package/dist/commands/get-plugin.d.ts.map +1 -0
- package/dist/commands/get-plugin.js +98 -0
- package/dist/commands/list-pipelines.d.ts +20 -0
- package/dist/commands/list-pipelines.d.ts.map +1 -0
- package/dist/commands/list-pipelines.js +172 -0
- package/dist/commands/list-plugins.d.ts +20 -0
- package/dist/commands/list-plugins.d.ts.map +1 -0
- package/dist/commands/list-plugins.js +167 -0
- package/dist/commands/login.d.ts +21 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +179 -0
- package/dist/commands/setup-events.d.ts +15 -0
- package/dist/commands/setup-events.d.ts.map +1 -0
- package/dist/commands/setup-events.js +177 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/store-token.d.ts +20 -0
- package/dist/commands/store-token.d.ts.map +1 -0
- package/dist/commands/store-token.js +233 -0
- package/dist/commands/synth.d.ts +21 -0
- package/dist/commands/synth.d.ts.map +1 -0
- package/dist/commands/synth.js +143 -0
- package/dist/commands/upload-plugin.d.ts +21 -0
- package/dist/commands/upload-plugin.d.ts.map +1 -0
- package/dist/commands/upload-plugin.js +311 -0
- package/dist/commands/version.d.ts +12 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +223 -0
- package/dist/config/cli.constants.d.ts +101 -0
- package/dist/config/cli.constants.d.ts.map +1 -0
- package/dist/config/cli.constants.js +165 -0
- package/dist/config.yml +94 -0
- package/dist/templates/events-stack.json +141 -0
- package/dist/types/config.d.ts +44 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/error.d.ts +61 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +39 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/pipeline.d.ts +144 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +5 -0
- package/dist/types/plugin.d.ts +160 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +5 -0
- package/dist/utils/api-client.d.ts +26 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +160 -0
- package/dist/utils/audit-log.d.ts +8 -0
- package/dist/utils/audit-log.d.ts.map +1 -0
- package/dist/utils/audit-log.js +53 -0
- package/dist/utils/auth-guard.d.ts +16 -0
- package/dist/utils/auth-guard.d.ts.map +1 -0
- package/dist/utils/auth-guard.js +25 -0
- package/dist/utils/aws-secrets.d.ts +21 -0
- package/dist/utils/aws-secrets.d.ts.map +1 -0
- package/dist/utils/aws-secrets.js +74 -0
- package/dist/utils/banner.d.ts +19 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +59 -0
- package/dist/utils/cdk-utils.d.ts +51 -0
- package/dist/utils/cdk-utils.d.ts.map +1 -0
- package/dist/utils/cdk-utils.js +101 -0
- package/dist/utils/command-utils.d.ts +56 -0
- package/dist/utils/command-utils.d.ts.map +1 -0
- package/dist/utils/command-utils.js +138 -0
- package/dist/utils/config-loader.d.ts +27 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +166 -0
- package/dist/utils/error-handler.d.ts +29 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +255 -0
- package/dist/utils/list-command-utils.d.ts +23 -0
- package/dist/utils/list-command-utils.d.ts.map +1 -0
- package/dist/utils/list-command-utils.js +60 -0
- package/dist/utils/output-utils.d.ts +60 -0
- package/dist/utils/output-utils.d.ts.map +1 -0
- package/dist/utils/output-utils.js +320 -0
- package/dist/utils/rate-limiter.d.ts +14 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +73 -0
- package/package.json +144 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.NetworkError = exports.ValidationError = exports.ERROR_CODES = void 0;
|
|
9
|
+
exports.handleError = handleError;
|
|
10
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
11
|
+
const cli_constants_1 = require("../config/cli.constants");
|
|
12
|
+
const types_1 = require("../types");
|
|
13
|
+
Object.defineProperty(exports, "ERROR_CODES", { enumerable: true, get: function () { return types_1.ERROR_CODES; } });
|
|
14
|
+
const { bold, dim, red, yellow, cyan } = picocolors_1.default;
|
|
15
|
+
/**
|
|
16
|
+
* Format and handle errors with colored output
|
|
17
|
+
*/
|
|
18
|
+
function handleError(err, code = types_1.ERROR_CODES.GENERAL, options = {}) {
|
|
19
|
+
const { debug = false, exit = true, logToConsole = true, context, correlationId = (0, cli_constants_1.generateExecutionId)(), } = options;
|
|
20
|
+
if (logToConsole) {
|
|
21
|
+
const divider = '─'.repeat(process.stdout.columns || 80);
|
|
22
|
+
const errorId = `ERR-${correlationId}`;
|
|
23
|
+
console.error('\n' + red(bold('✗ ERROR')) + dim(` [${errorId}]`) + '\n');
|
|
24
|
+
console.error(dim(divider));
|
|
25
|
+
if (err instanceof Error) {
|
|
26
|
+
console.error(red(bold('Message:')), err.message);
|
|
27
|
+
if (err.name !== 'Error') {
|
|
28
|
+
console.error(red('Type:'), err.name);
|
|
29
|
+
}
|
|
30
|
+
// Show Validation error details
|
|
31
|
+
if (err instanceof ValidationError) {
|
|
32
|
+
if (err.field)
|
|
33
|
+
console.error(red('Field:'), err.field);
|
|
34
|
+
if (err.value !== undefined)
|
|
35
|
+
console.error(red('Value:'), sanitizeValue(err.value));
|
|
36
|
+
if (err.rule)
|
|
37
|
+
console.error(red('Rule:'), err.rule);
|
|
38
|
+
if (err.expected)
|
|
39
|
+
console.error(red('Expected:'), err.expected);
|
|
40
|
+
}
|
|
41
|
+
// Show Network error details
|
|
42
|
+
if (err instanceof NetworkError) {
|
|
43
|
+
if (err.url)
|
|
44
|
+
console.error(red('URL:'), sanitizeUrl(err.url));
|
|
45
|
+
if (err.timeout)
|
|
46
|
+
console.error(red('Timeout:'), `${err.timeout}ms`);
|
|
47
|
+
console.error(red('Request Made:'), err.requestMade ? 'Yes' : 'No');
|
|
48
|
+
console.error(red('Response Received:'), err.responseReceived ? 'Yes' : 'No');
|
|
49
|
+
if (err.cause)
|
|
50
|
+
console.error(red('Caused by:'), err.cause.message);
|
|
51
|
+
}
|
|
52
|
+
// Show Axios error details
|
|
53
|
+
if (isAxiosError(err)) {
|
|
54
|
+
const status = err.response?.status;
|
|
55
|
+
const url = err.config?.url;
|
|
56
|
+
if (status) {
|
|
57
|
+
console.error(red('Status:'), status);
|
|
58
|
+
console.error(red('Status Text:'), getHttpStatusText(status));
|
|
59
|
+
}
|
|
60
|
+
if (url)
|
|
61
|
+
console.error(red('URL:'), sanitizeUrl(url));
|
|
62
|
+
if (err.response?.data) {
|
|
63
|
+
console.error(red('Response:'));
|
|
64
|
+
console.error(dim(sanitizeErrorData(err.response.data)));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Show CDK/execSync error details (stderr captured from child process)
|
|
68
|
+
if ('stderr' in err && err.stderr) {
|
|
69
|
+
const stderr = err.stderr.toString().trim();
|
|
70
|
+
if (stderr) {
|
|
71
|
+
console.error(red('CDK Output:'));
|
|
72
|
+
console.error(dim(stderr));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
console.error(red('Code:'), getErrorCodeName(code));
|
|
76
|
+
console.error(dim('Error ID:'), dim(errorId));
|
|
77
|
+
if (context && Object.keys(context).length > 0) {
|
|
78
|
+
console.error('');
|
|
79
|
+
console.error(red('Context:'));
|
|
80
|
+
Object.entries(context).forEach(([key, value]) => {
|
|
81
|
+
console.error(` ${cyan(key)}:`, dim(sanitizeValue(value)));
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (debug && err.stack) {
|
|
85
|
+
console.error('');
|
|
86
|
+
console.error(dim('Stack trace:'));
|
|
87
|
+
console.error(dim(sanitizeStackTrace(err.stack)));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.error(red('Error:'), String(err));
|
|
92
|
+
console.error(red('Code:'), getErrorCodeName(code));
|
|
93
|
+
console.error(dim('Error ID:'), dim(errorId));
|
|
94
|
+
}
|
|
95
|
+
console.error(dim(divider));
|
|
96
|
+
if (!debug) {
|
|
97
|
+
console.error(yellow('💡 Tip:'), dim('Run with --debug flag to see full stack trace'));
|
|
98
|
+
}
|
|
99
|
+
const suggestion = getErrorSuggestion(err, code);
|
|
100
|
+
if (suggestion) {
|
|
101
|
+
console.error(yellow('💡 Suggestion:'), dim(suggestion));
|
|
102
|
+
}
|
|
103
|
+
console.error('');
|
|
104
|
+
}
|
|
105
|
+
if (exit) {
|
|
106
|
+
process.exitCode = code;
|
|
107
|
+
process.exit(code);
|
|
108
|
+
}
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
111
|
+
// --- Error classes (only those actually used) ---
|
|
112
|
+
/**
|
|
113
|
+
* Validation error class
|
|
114
|
+
*/
|
|
115
|
+
class ValidationError extends Error {
|
|
116
|
+
field;
|
|
117
|
+
value;
|
|
118
|
+
rule;
|
|
119
|
+
expected;
|
|
120
|
+
constructor(message, field, value, rule, expected) {
|
|
121
|
+
super(message);
|
|
122
|
+
this.field = field;
|
|
123
|
+
this.value = value;
|
|
124
|
+
this.rule = rule;
|
|
125
|
+
this.expected = expected;
|
|
126
|
+
this.name = 'ValidationError';
|
|
127
|
+
Error.captureStackTrace(this, this.constructor);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.ValidationError = ValidationError;
|
|
131
|
+
/**
|
|
132
|
+
* Network error class
|
|
133
|
+
*/
|
|
134
|
+
class NetworkError extends Error {
|
|
135
|
+
url;
|
|
136
|
+
cause;
|
|
137
|
+
timeout;
|
|
138
|
+
requestMade;
|
|
139
|
+
responseReceived;
|
|
140
|
+
constructor(message, url, cause, timeout, requestMade = true, responseReceived = false) {
|
|
141
|
+
super(message);
|
|
142
|
+
this.url = url;
|
|
143
|
+
this.cause = cause;
|
|
144
|
+
this.timeout = timeout;
|
|
145
|
+
this.requestMade = requestMade;
|
|
146
|
+
this.responseReceived = responseReceived;
|
|
147
|
+
this.name = 'NetworkError';
|
|
148
|
+
Error.captureStackTrace(this, this.constructor);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.NetworkError = NetworkError;
|
|
152
|
+
// --- Private helpers ---
|
|
153
|
+
function getErrorCodeName(code) {
|
|
154
|
+
const entry = Object.entries(types_1.ERROR_CODES).find(([_, value]) => value === code);
|
|
155
|
+
return entry ? `${entry[0]} (${code})` : String(code);
|
|
156
|
+
}
|
|
157
|
+
function getHttpStatusText(status) {
|
|
158
|
+
const statusTexts = {
|
|
159
|
+
400: 'Bad Request',
|
|
160
|
+
401: 'Unauthorized',
|
|
161
|
+
403: 'Forbidden',
|
|
162
|
+
404: 'Not Found',
|
|
163
|
+
408: 'Request Timeout',
|
|
164
|
+
409: 'Conflict',
|
|
165
|
+
422: 'Unprocessable Entity',
|
|
166
|
+
429: 'Too Many Requests',
|
|
167
|
+
500: 'Internal Server Error',
|
|
168
|
+
502: 'Bad Gateway',
|
|
169
|
+
503: 'Service Unavailable',
|
|
170
|
+
504: 'Gateway Timeout',
|
|
171
|
+
};
|
|
172
|
+
return statusTexts[status] || 'Unknown';
|
|
173
|
+
}
|
|
174
|
+
function getErrorSuggestion(err, code) {
|
|
175
|
+
if (code === types_1.ERROR_CODES.AUTHENTICATION) {
|
|
176
|
+
return 'Check that PLATFORM_TOKEN environment variable is set correctly';
|
|
177
|
+
}
|
|
178
|
+
if (code === types_1.ERROR_CODES.NETWORK) {
|
|
179
|
+
return 'Check your internet connection and API endpoint URL';
|
|
180
|
+
}
|
|
181
|
+
if (code === types_1.ERROR_CODES.CONFIGURATION) {
|
|
182
|
+
return 'Run "cli version --check-config" to verify configuration';
|
|
183
|
+
}
|
|
184
|
+
if (code === types_1.ERROR_CODES.NOT_FOUND) {
|
|
185
|
+
return 'Verify the resource ID exists and you have access to it';
|
|
186
|
+
}
|
|
187
|
+
if (err instanceof Error && err.message.includes('cdk')) {
|
|
188
|
+
return 'Check the CDK output above for CloudFormation errors. Run with --debug for full details';
|
|
189
|
+
}
|
|
190
|
+
if (err instanceof ValidationError && err.field) {
|
|
191
|
+
return `Check the value provided for "${err.field}"`;
|
|
192
|
+
}
|
|
193
|
+
if (isAxiosError(err)) {
|
|
194
|
+
const status = err.response?.status;
|
|
195
|
+
if (status === 401 || status === 403)
|
|
196
|
+
return 'Check your authentication token and permissions';
|
|
197
|
+
if (status === 429)
|
|
198
|
+
return 'Rate limit exceeded - wait a moment before retrying';
|
|
199
|
+
if (status && status >= 500)
|
|
200
|
+
return 'Server error - try again later or contact support';
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
function sanitizeErrorData(data) {
|
|
205
|
+
if (typeof data === 'string')
|
|
206
|
+
return data;
|
|
207
|
+
if (typeof data === 'object' && data !== null) {
|
|
208
|
+
const sanitized = { ...data };
|
|
209
|
+
['token', 'password', 'secret', 'apiKey', 'authorization', 'jwt', 'credential', 'bearer'].forEach(field => {
|
|
210
|
+
if (field in sanitized)
|
|
211
|
+
sanitized[field] = '[REDACTED]';
|
|
212
|
+
});
|
|
213
|
+
return JSON.stringify(sanitized, null, 2);
|
|
214
|
+
}
|
|
215
|
+
return String(data);
|
|
216
|
+
}
|
|
217
|
+
function sanitizeUrl(url) {
|
|
218
|
+
try {
|
|
219
|
+
const urlObj = new URL(url);
|
|
220
|
+
['token', 'key', 'secret', 'password', 'apiKey'].forEach(param => {
|
|
221
|
+
if (urlObj.searchParams.has(param))
|
|
222
|
+
urlObj.searchParams.set(param, '[REDACTED]');
|
|
223
|
+
});
|
|
224
|
+
return urlObj.toString();
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return url;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function sanitizeValue(value) {
|
|
231
|
+
if (value === null)
|
|
232
|
+
return 'null';
|
|
233
|
+
if (value === undefined)
|
|
234
|
+
return 'undefined';
|
|
235
|
+
if (typeof value === 'string') {
|
|
236
|
+
if (value.length > 20 && /^[A-Za-z0-9+/=_-]+$/.test(value)) {
|
|
237
|
+
return `${value.substring(0, 8)}...[REDACTED]`;
|
|
238
|
+
}
|
|
239
|
+
return value.length > 100 ? value.substring(0, 97) + '...' : value;
|
|
240
|
+
}
|
|
241
|
+
if (typeof value === 'object')
|
|
242
|
+
return sanitizeErrorData(value);
|
|
243
|
+
const str = String(value);
|
|
244
|
+
return str.length > 100 ? str.substring(0, 97) + '...' : str;
|
|
245
|
+
}
|
|
246
|
+
function sanitizeStackTrace(stack) {
|
|
247
|
+
return stack.split('\n').slice(0, 10).map(line => line.replace(/\/.*?\//g, '.../')).join('\n');
|
|
248
|
+
}
|
|
249
|
+
function isAxiosError(err) {
|
|
250
|
+
return (typeof err === 'object' &&
|
|
251
|
+
err !== null &&
|
|
252
|
+
'isAxiosError' in err &&
|
|
253
|
+
err.isAxiosError === true);
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9lcnJvci1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7Ozs7QUFvQnRDLGtDQThHQztBQWhJRCw0REFBOEI7QUFDOUIsMkRBQThEO0FBQzlELG9DQUtrQjtBQUtULDRGQVRQLG1CQUFXLE9BU087QUFIcEIsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxvQkFBSSxDQUFDO0FBTTlDOztHQUVHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixHQUFZLEVBQ1osT0FBa0IsbUJBQVcsQ0FBQyxPQUFPLEVBQ3JDLFVBQStCLEVBQUU7SUFFakMsTUFBTSxFQUNKLEtBQUssR0FBRyxLQUFLLEVBQ2IsSUFBSSxHQUFHLElBQUksRUFDWCxZQUFZLEdBQUcsSUFBSSxFQUNuQixPQUFPLEVBQ1AsYUFBYSxHQUFHLElBQUEsbUNBQW1CLEdBQUUsR0FDdEMsR0FBRyxPQUFPLENBQUM7SUFFWixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxhQUFhLEVBQUUsQ0FBQztRQUV2QyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN6RSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRTVCLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRSxDQUFD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LENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsR0FBWTtJQUNoQyxPQUFPLENBQ0wsT0FBTyxHQUFHLEtBQUssUUFBUTtRQUN2QixHQUFHLEtBQUssSUFBSTtRQUNaLGNBQWMsSUFBSSxHQUFHO1FBQ3BCLEdBQStCLENBQUMsWUFBWSxLQUFLLElBQUksQ0FDdkQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUV4ZWN1dGlvbklkIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgRVJST1JfQ09ERVMsXG4gIEVycm9yQ29kZSxcbiAgRXJyb3JIYW5kbGVyT3B0aW9ucyxcbiAgQXhpb3NFcnJvckxpa2UsXG59IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgeyBib2xkLCBkaW0sIHJlZCwgeWVsbG93LCBjeWFuIH0gPSBwaWNvO1xuXG4vLyBSZS1leHBvcnQgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgeyBFUlJPUl9DT0RFUyB9O1xuZXhwb3J0IHR5cGUgeyBFcnJvckNvZGUgfTtcblxuLyoqXG4gKiBGb3JtYXQgYW5kIGhhbmRsZSBlcnJvcnMgd2l0aCBjb2xvcmVkIG91dHB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoXG4gIGVycjogdW5rbm93bixcbiAgY29kZTogRXJyb3JDb2RlID0gRVJST1JfQ09ERVMuR0VORVJBTCxcbiAgb3B0aW9uczogRXJyb3JIYW5kbGVyT3B0aW9ucyA9IHt9LFxuKTogbmV2ZXIge1xuICBjb25zdCB7XG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBleGl0ID0gdHJ1ZSxcbiAgICBsb2dUb0NvbnNvbGUgPSB0cnVlLFxuICAgIGNvbnRleHQsXG4gICAgY29ycmVsYXRpb25JZCA9IGdlbmVyYXRlRXhlY3V0aW9uSWQoKSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKGxvZ1RvQ29uc29sZSkge1xuICAgIGNvbnN0IGRpdmlkZXIgPSAn4pSAJy5yZXBlYXQocHJvY2Vzcy5zdGRvdXQuY29sdW1ucyB8fCA4MCk7XG4gICAgY29uc3QgZXJyb3JJZCA9IGBFUlItJHtjb3JyZWxhdGlvbklkfWA7XG5cbiAgICBjb25zb2xlLmVycm9yKCdcXG4nICsgcmVkKGJvbGQoJ+KclyBFUlJPUicpKSArIGRpbShgIFske2Vycm9ySWR9XWApICsgJ1xcbicpO1xuICAgIGNvbnNvbGUuZXJyb3IoZGltKGRpdmlkZXIpKTtcblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihyZWQoYm9sZCgnTWVzc2FnZTonKSksIGVyci5tZXNzYWdlKTtcblxuICAgICAgaWYgKGVyci5uYW1lICE9PSAnRXJyb3InKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IocmVkKCdUeXBlOicpLCBlcnIubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgVmFsaWRhdGlvbiBlcnJvciBkZXRhaWxzXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgIGlmIChlcnIuZmllbGQpIGNvbnNvbGUuZXJyb3IocmVkKCdGaWVsZDonKSwgZXJyLmZpZWxkKTtcbiAgICAgICAgaWYgKGVyci52YWx1ZSAhPT0gdW5kZWZpbmVkKSBjb25zb2xlLmVycm9yKHJlZCgnVmFsdWU6JyksIHNhbml0aXplVmFsdWUoZXJyLnZhbHVlKSk7XG4gICAgICAgIGlmIChlcnIucnVsZSkgY29uc29sZS5lcnJvcihyZWQoJ1J1bGU6JyksIGVyci5ydWxlKTtcbiAgICAgICAgaWYgKGVyci5leHBlY3RlZCkgY29uc29sZS5lcnJvcihyZWQoJ0V4cGVjdGVkOicpLCBlcnIuZXhwZWN0ZWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG93IE5ldHdvcmsgZXJyb3IgZGV0YWlsc1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5ldHdvcmtFcnJvcikge1xuICAgICAgICBpZiAoZXJyLnVybCkgY29uc29sZS5lcnJvcihyZWQoJ1VSTDonKSwgc2FuaXRpemVVcmwoZXJyLnVybCkpO1xuICAgICAgICBpZiAoZXJyLnRpbWVvdXQpIGNvbnNvbGUuZXJyb3IocmVkKCdUaW1lb3V0OicpLCBgJHtlcnIudGltZW91dH1tc2ApO1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnUmVxdWVzdCBNYWRlOicpLCBlcnIucmVxdWVzdE1hZGUgPyAnWWVzJyA6ICdObycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnUmVzcG9uc2UgUmVjZWl2ZWQ6JyksIGVyci5yZXNwb25zZVJlY2VpdmVkID8gJ1llcycgOiAnTm8nKTtcbiAgICAgICAgaWYgKGVyci5jYXVzZSkgY29uc29sZS5lcnJvcihyZWQoJ0NhdXNlZCBieTonKSwgZXJyLmNhdXNlLm1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG93IEF4aW9zIGVycm9yIGRldGFpbHNcbiAgICAgIGlmIChpc0F4aW9zRXJyb3IoZXJyKSkge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBlcnIucmVzcG9uc2U/LnN0YXR1cztcbiAgICAgICAgY29uc3QgdXJsID0gZXJyLmNvbmZpZz8udXJsO1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihyZWQoJ1N0YXR1czonKSwgc3RhdHVzKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnU3RhdHVzIFRleHQ6JyksIGdldEh0dHBTdGF0dXNUZXh0KHN0YXR1cykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cmwpIGNvbnNvbGUuZXJyb3IocmVkKCdVUkw6JyksIHNhbml0aXplVXJsKHVybCkpO1xuICAgICAgICBpZiAoZXJyLnJlc3BvbnNlPy5kYXRhKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihyZWQoJ1Jlc3BvbnNlOicpKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGRpbShzYW5pdGl6ZUVycm9yRGF0YShlcnIucmVzcG9uc2UuZGF0YSkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTaG93IENESy9leGVjU3luYyBlcnJvciBkZXRhaWxzIChzdGRlcnIgY2FwdHVyZWQgZnJvbSBjaGlsZCBwcm9jZXNzKVxuICAgICAgaWYgKCdzdGRlcnInIGluIGVyciAmJiBlcnIuc3RkZXJyKSB7XG4gICAgICAgIGNvbnN0IHN0ZGVyciA9IChlcnIuc3RkZXJyIGFzIEJ1ZmZlciB8IHN0cmluZykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnQ0RLIE91dHB1dDonKSk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihkaW0oc3RkZXJyKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5lcnJvcihyZWQoJ0NvZGU6JyksIGdldEVycm9yQ29kZU5hbWUoY29kZSkpO1xuICAgICAgY29uc29sZS5lcnJvcihkaW0oJ0Vycm9yIElEOicpLCBkaW0oZXJyb3JJZCkpO1xuXG4gICAgICBpZiAoY29udGV4dCAmJiBPYmplY3Qua2V5cyhjb250ZXh0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnQ29udGV4dDonKSk7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbnRleHQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgJHtjeWFuKGtleSl9OmAsIGRpbShzYW5pdGl6ZVZhbHVlKHZhbHVlKSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlYnVnICYmIGVyci5zdGFjaykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihkaW0oJ1N0YWNrIHRyYWNlOicpKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihkaW0oc2FuaXRpemVTdGFja1RyYWNlKGVyci5zdGFjaykpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihyZWQoJ0Vycm9yOicpLCBTdHJpbmcoZXJyKSk7XG4gICAgICBjb25zb2xlLmVycm9yKHJlZCgnQ29kZTonKSwgZ2V0RXJyb3JDb2RlTmFtZShjb2RlKSk7XG4gICAgICBjb25zb2xlLmVycm9yKGRpbSgnRXJyb3IgSUQ6JyksIGRpbShlcnJvcklkKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcihkaW0oZGl2aWRlcikpO1xuXG4gICAgaWYgKCFkZWJ1Zykge1xuICAgICAgY29uc29sZS5lcnJvcih5ZWxsb3coJ/CfkqEgVGlwOicpLCBkaW0oJ1J1biB3aXRoIC0tZGVidWcgZmxhZyB0byBzZWUgZnVsbCBzdGFjayB0cmFjZScpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWdnZXN0aW9uID0gZ2V0RXJyb3JTdWdnZXN0aW9uKGVyciwgY29kZSk7XG4gICAgaWYgKHN1Z2dlc3Rpb24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoeWVsbG93KCfwn5KhIFN1Z2dlc3Rpb246JyksIGRpbShzdWdnZXN0aW9uKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcignJyk7XG4gIH1cblxuICBpZiAoZXhpdCkge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSBjb2RlO1xuICAgIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfVxuXG4gIHRocm93IGVycjtcbn1cblxuLy8gLS0tIEVycm9yIGNsYXNzZXMgKG9ubHkgdGhvc2UgYWN0dWFsbHkgdXNlZCkgLS0tXG5cbi8qKlxuICogVmFsaWRhdGlvbiBlcnJvciBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIGZpZWxkPzogc3RyaW5nLFxuICAgIHB1YmxpYyB2YWx1ZT86IHVua25vd24sXG4gICAgcHVibGljIHJ1bGU/OiBzdHJpbmcsXG4gICAgcHVibGljIGV4cGVjdGVkPzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIE5ldHdvcmsgZXJyb3IgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyB1cmw/OiBzdHJpbmcsXG4gICAgcHVibGljIGNhdXNlPzogRXJyb3IsXG4gICAgcHVibGljIHRpbWVvdXQ/OiBudW1iZXIsXG4gICAgcHVibGljIHJlcXVlc3RNYWRlOiBib29sZWFuID0gdHJ1ZSxcbiAgICBwdWJsaWMgcmVzcG9uc2VSZWNlaXZlZDogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnTmV0d29ya0Vycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vLyAtLS0gUHJpdmF0ZSBoZWxwZXJzIC0tLVxuXG5mdW5jdGlvbiBnZXRFcnJvckNvZGVOYW1lKGNvZGU6IEVycm9yQ29kZSk6IHN0cmluZyB7XG4gIGNvbnN0IGVudHJ5ID0gT2JqZWN0LmVudHJpZXMoRVJST1JfQ09ERVMpLmZpbmQoKFtfLCB2YWx1ZV0pID0+IHZhbHVlID09PSBjb2RlKTtcbiAgcmV0dXJuIGVudHJ5ID8gYCR7ZW50cnlbMF19ICgke2NvZGV9KWAgOiBTdHJpbmcoY29kZSk7XG59XG5cbmZ1bmN0aW9uIGdldEh0dHBTdGF0dXNUZXh0KHN0YXR1czogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhdHVzVGV4dHM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsXG4gICAgNDAzOiAnRm9yYmlkZGVuJyxcbiAgICA0MDQ6ICdOb3QgRm91bmQnLFxuICAgIDQwODogJ1JlcXVlc3QgVGltZW91dCcsXG4gICAgNDA5OiAnQ29uZmxpY3QnLFxuICAgIDQyMjogJ1VucHJvY2Vzc2FibGUgRW50aXR5JyxcbiAgICA0Mjk6ICdUb28gTWFueSBSZXF1ZXN0cycsXG4gICAgNTAwOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICA1MDI6ICdCYWQgR2F0ZXdheScsXG4gICAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZScsXG4gICAgNTA0OiAnR2F0ZXdheSBUaW1lb3V0JyxcbiAgfTtcbiAgcmV0dXJuIHN0YXR1c1RleHRzW3N0YXR1c10gfHwgJ1Vua25vd24nO1xufVxuXG5mdW5jdGlvbiBnZXRFcnJvclN1Z2dlc3Rpb24oZXJyOiB1bmtub3duLCBjb2RlOiBFcnJvckNvZGUpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGNvZGUgPT09IEVSUk9SX0NPREVTLkFVVEhFTlRJQ0FUSU9OKSB7XG4gICAgcmV0dXJuICdDaGVjayB0aGF0IFBMQVRGT1JNX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCBjb3JyZWN0bHknO1xuICB9XG4gIGlmIChjb2RlID09PSBFUlJPUl9DT0RFUy5ORVRXT1JLKSB7XG4gICAgcmV0dXJuICdDaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24gYW5kIEFQSSBlbmRwb2ludCBVUkwnO1xuICB9XG4gIGlmIChjb2RlID09PSBFUlJPUl9DT0RFUy5DT05GSUdVUkFUSU9OKSB7XG4gICAgcmV0dXJuICdSdW4gXCJjbGkgdmVyc2lvbiAtLWNoZWNrLWNvbmZpZ1wiIHRvIHZlcmlmeSBjb25maWd1cmF0aW9uJztcbiAgfVxuICBpZiAoY29kZSA9PT0gRVJST1JfQ09ERVMuTk9UX0ZPVU5EKSB7XG4gICAgcmV0dXJuICdWZXJpZnkgdGhlIHJlc291cmNlIElEIGV4aXN0cyBhbmQgeW91IGhhdmUgYWNjZXNzIHRvIGl0JztcbiAgfVxuICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ2NkaycpKSB7XG4gICAgcmV0dXJuICdDaGVjayB0aGUgQ0RLIG91dHB1dCBhYm92ZSBmb3IgQ2xvdWRGb3JtYXRpb24gZXJyb3JzLiBSdW4gd2l0aCAtLWRlYnVnIGZvciBmdWxsIGRldGFpbHMnO1xuICB9XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IgJiYgZXJyLmZpZWxkKSB7XG4gICAgcmV0dXJuIGBDaGVjayB0aGUgdmFsdWUgcHJvdmlkZWQgZm9yIFwiJHtlcnIuZmllbGR9XCJgO1xuICB9XG4gIGlmIChpc0F4aW9zRXJyb3IoZXJyKSkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGVyci5yZXNwb25zZT8uc3RhdHVzO1xuICAgIGlmIChzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMykgcmV0dXJuICdDaGVjayB5b3VyIGF1dGhlbnRpY2F0aW9uIHRva2VuIGFuZCBwZXJtaXNzaW9ucyc7XG4gICAgaWYgKHN0YXR1cyA9PT0gNDI5KSByZXR1cm4gJ1JhdGUgbGltaXQgZXhjZWVkZWQgLSB3YWl0IGEgbW9tZW50IGJlZm9yZSByZXRyeWluZyc7XG4gICAgaWYgKHN0YXR1cyAmJiBzdGF0dXMgPj0gNTAwKSByZXR1cm4gJ1NlcnZlciBlcnJvciAtIHRyeSBhZ2FpbiBsYXRlciBvciBjb250YWN0IHN1cHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZUVycm9yRGF0YShkYXRhOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgcmV0dXJuIGRhdGE7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uZGF0YSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIFsndG9rZW4nLCAncGFzc3dvcmQnLCAnc2VjcmV0JywgJ2FwaUtleScsICdhdXRob3JpemF0aW9uJywgJ2p3dCcsICdjcmVkZW50aWFsJywgJ2JlYXJlciddLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgaWYgKGZpZWxkIGluIHNhbml0aXplZCkgc2FuaXRpemVkW2ZpZWxkXSA9ICdbUkVEQUNURURdJztcbiAgICB9KTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2FuaXRpemVkLCBudWxsLCAyKTtcbiAgfVxuICByZXR1cm4gU3RyaW5nKGRhdGEpO1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuICAgIFsndG9rZW4nLCAna2V5JywgJ3NlY3JldCcsICdwYXNzd29yZCcsICdhcGlLZXknXS5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgIGlmICh1cmxPYmouc2VhcmNoUGFyYW1zLmhhcyhwYXJhbSkpIHVybE9iai5zZWFyY2hQYXJhbXMuc2V0KHBhcmFtLCAnW1JFREFDVEVEXScpO1xuICAgIH0pO1xuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZVZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICd1bmRlZmluZWQnO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiAyMCAmJiAvXltBLVphLXowLTkrLz1fLV0rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgJHt2YWx1ZS5zdWJzdHJpbmcoMCwgOCl9Li4uW1JFREFDVEVEXWA7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiAxMDAgPyB2YWx1ZS5zdWJzdHJpbmcoMCwgOTcpICsgJy4uLicgOiB2YWx1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHNhbml0aXplRXJyb3JEYXRhKHZhbHVlKTtcbiAgY29uc3Qgc3RyID0gU3RyaW5nKHZhbHVlKTtcbiAgcmV0dXJuIHN0ci5sZW5ndGggPiAxMDAgPyBzdHIuc3Vic3RyaW5nKDAsIDk3KSArICcuLi4nIDogc3RyO1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZVN0YWNrVHJhY2Uoc3RhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdGFjay5zcGxpdCgnXFxuJykuc2xpY2UoMCwgMTApLm1hcChsaW5lID0+IGxpbmUucmVwbGFjZSgvXFwvLio/XFwvL2csICcuLi4vJykpLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBpc0F4aW9zRXJyb3IoZXJyOiB1bmtub3duKTogZXJyIGlzIEF4aW9zRXJyb3JMaWtlIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgZXJyID09PSAnb2JqZWN0JyAmJlxuICAgIGVyciAhPT0gbnVsbCAmJlxuICAgICdpc0F4aW9zRXJyb3InIGluIGVyciAmJlxuICAgIChlcnIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmlzQXhpb3NFcnJvciA9PT0gdHJ1ZVxuICApO1xufVxuIl19
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common filter parameters shared by all list commands.
|
|
3
|
+
*/
|
|
4
|
+
export interface CommonFilterParams {
|
|
5
|
+
id?: string | string[];
|
|
6
|
+
isActive?: boolean;
|
|
7
|
+
limit?: number;
|
|
8
|
+
offset?: number;
|
|
9
|
+
sort?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Extract common filter parameters (id, isActive, limit, offset, sort) from CLI options.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildCommonFilters(options: Record<string, unknown>): CommonFilterParams;
|
|
15
|
+
/**
|
|
16
|
+
* Display pagination settings for a list command.
|
|
17
|
+
*/
|
|
18
|
+
export declare function displayPaginationInfo(filterParams: CommonFilterParams): void;
|
|
19
|
+
/**
|
|
20
|
+
* Display result summary after a list query completes.
|
|
21
|
+
*/
|
|
22
|
+
export declare function displayListResults(items: unknown[], total: number | undefined, hasMore: boolean, entityName: string, duration: number, filterParams: CommonFilterParams): void;
|
|
23
|
+
//# sourceMappingURL=list-command-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-command-utils.d.ts","sourceRoot":"","sources":["../../src/utils/list-command-utils.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAmBvF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAQ5E;AAGD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EAAE,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,kBAAkB,GAC/B,IAAI,CAgBN"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.buildCommonFilters = buildCommonFilters;
|
|
6
|
+
exports.displayPaginationInfo = displayPaginationInfo;
|
|
7
|
+
exports.displayListResults = displayListResults;
|
|
8
|
+
const output_utils_1 = require("./output-utils");
|
|
9
|
+
const cli_constants_1 = require("../config/cli.constants");
|
|
10
|
+
/**
|
|
11
|
+
* Extract common filter parameters (id, isActive, limit, offset, sort) from CLI options.
|
|
12
|
+
*/
|
|
13
|
+
function buildCommonFilters(options) {
|
|
14
|
+
const params = {};
|
|
15
|
+
if (options.id) {
|
|
16
|
+
const idValue = options.id;
|
|
17
|
+
params.id = idValue.includes(',') ? idValue.split(',').map((s) => s.trim()) : idValue;
|
|
18
|
+
}
|
|
19
|
+
if (options.isActive !== undefined) {
|
|
20
|
+
params.isActive = (0, cli_constants_1.validateBoolean)(options.isActive, 'is-active');
|
|
21
|
+
}
|
|
22
|
+
params.limit = (0, cli_constants_1.validateNumber)(options.limit, 'limit', 1, 1000);
|
|
23
|
+
params.offset = (0, cli_constants_1.validateNumber)(options.offset, 'offset', 0);
|
|
24
|
+
const sort = (0, cli_constants_1.validateSort)(options.sort);
|
|
25
|
+
if (sort)
|
|
26
|
+
params.sort = sort;
|
|
27
|
+
return params;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Display pagination settings for a list command.
|
|
31
|
+
*/
|
|
32
|
+
function displayPaginationInfo(filterParams) {
|
|
33
|
+
console.log('');
|
|
34
|
+
(0, output_utils_1.printInfo)('Pagination Settings');
|
|
35
|
+
(0, output_utils_1.printKeyValue)({
|
|
36
|
+
Limit: (filterParams.limit ?? 50).toString(),
|
|
37
|
+
Offset: (filterParams.offset ?? 0).toString(),
|
|
38
|
+
Sort: filterParams.sort || 'createdAt:desc',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Display result summary after a list query completes.
|
|
43
|
+
*/
|
|
44
|
+
function displayListResults(items, total, hasMore, entityName, duration, filterParams) {
|
|
45
|
+
(0, output_utils_1.printKeyValue)({
|
|
46
|
+
[`${entityName} Found`]: items.length.toString(),
|
|
47
|
+
'Total Available': total !== undefined ? total.toString() : 'Unknown',
|
|
48
|
+
'Has More': hasMore ? 'Yes' : 'No',
|
|
49
|
+
'Request Duration': (0, cli_constants_1.formatDuration)(duration),
|
|
50
|
+
});
|
|
51
|
+
if (hasMore) {
|
|
52
|
+
const currentOffset = filterParams.offset || 0;
|
|
53
|
+
const nextOffset = currentOffset + (filterParams.limit || 50);
|
|
54
|
+
console.log('');
|
|
55
|
+
(0, output_utils_1.printInfo)('More results available', {
|
|
56
|
+
hint: `Use --offset ${nextOffset} to see next page`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1jb21tYW5kLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xpc3QtY29tbWFuZC11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7QUFtQnRDLGdEQW1CQztBQUtELHNEQVFDO0FBTUQsZ0RBdUJDO0FBOUVELGlEQUEwRDtBQUMxRCwyREFBd0c7QUFheEc7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxPQUFnQztJQUNqRSxNQUFNLE1BQU0sR0FBdUIsRUFBRSxDQUFDO0lBRXRDLElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEVBQVksQ0FBQztRQUNyQyxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ2hHLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFBLCtCQUFlLEVBQUMsT0FBTyxDQUFDLFFBQWtCLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBQSw4QkFBYyxFQUFDLE9BQU8sQ0FBQyxLQUF3QixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEYsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFBLDhCQUFjLEVBQUMsT0FBTyxDQUFDLE1BQXlCLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRS9FLE1BQU0sSUFBSSxHQUFHLElBQUEsNEJBQVksRUFBQyxPQUFPLENBQUMsSUFBMEIsQ0FBQyxDQUFDO0lBQzlELElBQUksSUFBSTtRQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBRTdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLFlBQWdDO0lBQ3BFLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsSUFBQSx3QkFBUyxFQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDakMsSUFBQSw0QkFBYSxFQUFDO1FBQ1osS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDNUMsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDN0MsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLElBQUksZ0JBQWdCO0tBQzVDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFHRDs7R0FFRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxLQUFnQixFQUNoQixLQUF5QixFQUN6QixPQUFnQixFQUNoQixVQUFrQixFQUNsQixRQUFnQixFQUNoQixZQUFnQztJQUVoQyxJQUFBLDRCQUFhLEVBQUM7UUFDWixDQUFDLEdBQUcsVUFBVSxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUNoRCxpQkFBaUIsRUFBRSxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDckUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ2xDLGtCQUFrQixFQUFFLElBQUEsOEJBQWMsRUFBQyxRQUFRLENBQUM7S0FDN0MsQ0FBQyxDQUFDO0lBRUgsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLGFBQWEsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixJQUFBLHdCQUFTLEVBQUMsd0JBQXdCLEVBQUU7WUFDbEMsSUFBSSxFQUFFLGdCQUFnQixVQUFVLG1CQUFtQjtTQUNwRCxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50S2V5VmFsdWUgfSBmcm9tICcuL291dHB1dC11dGlscyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiwgdmFsaWRhdGVCb29sZWFuLCB2YWxpZGF0ZU51bWJlciwgdmFsaWRhdGVTb3J0IH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMnO1xuXG4vKipcbiAqIENvbW1vbiBmaWx0ZXIgcGFyYW1ldGVycyBzaGFyZWQgYnkgYWxsIGxpc3QgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uRmlsdGVyUGFyYW1zIHtcbiAgaWQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuICBsaW1pdD86IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBzb3J0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgY29tbW9uIGZpbHRlciBwYXJhbWV0ZXJzIChpZCwgaXNBY3RpdmUsIGxpbWl0LCBvZmZzZXQsIHNvcnQpIGZyb20gQ0xJIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbW1vbkZpbHRlcnMob3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBDb21tb25GaWx0ZXJQYXJhbXMge1xuICBjb25zdCBwYXJhbXM6IENvbW1vbkZpbHRlclBhcmFtcyA9IHt9O1xuXG4gIGlmIChvcHRpb25zLmlkKSB7XG4gICAgY29uc3QgaWRWYWx1ZSA9IG9wdGlvbnMuaWQgYXMgc3RyaW5nO1xuICAgIHBhcmFtcy5pZCA9IGlkVmFsdWUuaW5jbHVkZXMoJywnKSA/IGlkVmFsdWUuc3BsaXQoJywnKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpIDogaWRWYWx1ZTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYXJhbXMuaXNBY3RpdmUgPSB2YWxpZGF0ZUJvb2xlYW4ob3B0aW9ucy5pc0FjdGl2ZSBhcyBzdHJpbmcsICdpcy1hY3RpdmUnKTtcbiAgfVxuXG4gIHBhcmFtcy5saW1pdCA9IHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMubGltaXQgYXMgc3RyaW5nIHwgbnVtYmVyLCAnbGltaXQnLCAxLCAxMDAwKTtcbiAgcGFyYW1zLm9mZnNldCA9IHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMub2Zmc2V0IGFzIHN0cmluZyB8IG51bWJlciwgJ29mZnNldCcsIDApO1xuXG4gIGNvbnN0IHNvcnQgPSB2YWxpZGF0ZVNvcnQob3B0aW9ucy5zb3J0IGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIGlmIChzb3J0KSBwYXJhbXMuc29ydCA9IHNvcnQ7XG5cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuLyoqXG4gKiBEaXNwbGF5IHBhZ2luYXRpb24gc2V0dGluZ3MgZm9yIGEgbGlzdCBjb21tYW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVBhZ2luYXRpb25JbmZvKGZpbHRlclBhcmFtczogQ29tbW9uRmlsdGVyUGFyYW1zKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcHJpbnRJbmZvKCdQYWdpbmF0aW9uIFNldHRpbmdzJyk7XG4gIHByaW50S2V5VmFsdWUoe1xuICAgIExpbWl0OiAoZmlsdGVyUGFyYW1zLmxpbWl0ID8/IDUwKS50b1N0cmluZygpLFxuICAgIE9mZnNldDogKGZpbHRlclBhcmFtcy5vZmZzZXQgPz8gMCkudG9TdHJpbmcoKSxcbiAgICBTb3J0OiBmaWx0ZXJQYXJhbXMuc29ydCB8fCAnY3JlYXRlZEF0OmRlc2MnLFxuICB9KTtcbn1cblxuXG4vKipcbiAqIERpc3BsYXkgcmVzdWx0IHN1bW1hcnkgYWZ0ZXIgYSBsaXN0IHF1ZXJ5IGNvbXBsZXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlMaXN0UmVzdWx0cyhcbiAgaXRlbXM6IHVua25vd25bXSxcbiAgdG90YWw6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgaGFzTW9yZTogYm9vbGVhbixcbiAgZW50aXR5TmFtZTogc3RyaW5nLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICBmaWx0ZXJQYXJhbXM6IENvbW1vbkZpbHRlclBhcmFtcyxcbik6IHZvaWQge1xuICBwcmludEtleVZhbHVlKHtcbiAgICBbYCR7ZW50aXR5TmFtZX0gRm91bmRgXTogaXRlbXMubGVuZ3RoLnRvU3RyaW5nKCksXG4gICAgJ1RvdGFsIEF2YWlsYWJsZSc6IHRvdGFsICE9PSB1bmRlZmluZWQgPyB0b3RhbC50b1N0cmluZygpIDogJ1Vua25vd24nLFxuICAgICdIYXMgTW9yZSc6IGhhc01vcmUgPyAnWWVzJyA6ICdObycsXG4gICAgJ1JlcXVlc3QgRHVyYXRpb24nOiBmb3JtYXREdXJhdGlvbihkdXJhdGlvbiksXG4gIH0pO1xuXG4gIGlmIChoYXNNb3JlKSB7XG4gICAgY29uc3QgY3VycmVudE9mZnNldCA9IGZpbHRlclBhcmFtcy5vZmZzZXQgfHwgMDtcbiAgICBjb25zdCBuZXh0T2Zmc2V0ID0gY3VycmVudE9mZnNldCArIChmaWx0ZXJQYXJhbXMubGltaXQgfHwgNTApO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBwcmludEluZm8oJ01vcmUgcmVzdWx0cyBhdmFpbGFibGUnLCB7XG4gICAgICBoaW50OiBgVXNlIC0tb2Zmc2V0ICR7bmV4dE9mZnNldH0gdG8gc2VlIG5leHQgcGFnZWAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { OutputFormat } from '../config/cli.constants';
|
|
2
|
+
/**
|
|
3
|
+
* Options for outputData function
|
|
4
|
+
*/
|
|
5
|
+
export interface OutputOptions {
|
|
6
|
+
format?: OutputFormat;
|
|
7
|
+
file?: string;
|
|
8
|
+
pretty?: boolean;
|
|
9
|
+
silent?: boolean;
|
|
10
|
+
append?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Table column configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface TableColumn {
|
|
16
|
+
header: string;
|
|
17
|
+
key: string;
|
|
18
|
+
width?: number;
|
|
19
|
+
align?: 'left' | 'center' | 'right';
|
|
20
|
+
formatter?: (value: unknown) => string;
|
|
21
|
+
}
|
|
22
|
+
export declare function printSuccess(message: string, data?: unknown): void;
|
|
23
|
+
export declare function printInfo(message: string, data?: unknown): void;
|
|
24
|
+
export declare function printWarning(message: string, data?: unknown): void;
|
|
25
|
+
export declare function printError(message: string, data?: unknown): void;
|
|
26
|
+
export declare function printDebug(message: string, data?: unknown): void;
|
|
27
|
+
/**
|
|
28
|
+
* Output data in specified format (console or file)
|
|
29
|
+
*/
|
|
30
|
+
export declare function outputData(data: unknown, options?: OutputOptions): void;
|
|
31
|
+
export declare function formatTable(data: unknown[], columns?: TableColumn[]): string;
|
|
32
|
+
export declare function ensureOutputDirectory(outputPath: string): void;
|
|
33
|
+
export declare function fileExists(filePath: string): boolean;
|
|
34
|
+
export declare function printSection(title: string, subtitle?: string): void;
|
|
35
|
+
export declare function printKeyValue(data: Record<string, unknown>, options?: {
|
|
36
|
+
indent?: number;
|
|
37
|
+
separator?: string;
|
|
38
|
+
}): void;
|
|
39
|
+
export declare function printDivider(char?: string, width?: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* Unwrap a sendSuccess API envelope: { success, statusCode, data: { ... } }
|
|
42
|
+
* Returns the inner `data` object, or the original response if not wrapped.
|
|
43
|
+
*/
|
|
44
|
+
export declare function unwrapEnvelope(response: unknown): Record<string, unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* Extract a single entity from an API response, handling envelope formats.
|
|
47
|
+
* Tries: payload[entityKey], payload directly (if identifierKey exists), or undefined.
|
|
48
|
+
*/
|
|
49
|
+
export declare function extractSingleResponse<T>(response: unknown, entityKey: string, identifierKey: string): T | undefined;
|
|
50
|
+
export interface ListResponseResult<T> {
|
|
51
|
+
items: T[];
|
|
52
|
+
total?: number;
|
|
53
|
+
hasMore: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Extract items from an API list response, handling multiple response formats.
|
|
57
|
+
* Supports: `{ <key>: T[] }`, `{ items: T[] }`, `T[]`, or invalid formats.
|
|
58
|
+
*/
|
|
59
|
+
export declare function extractListResponse<T>(response: unknown, itemsKey: string): ListResponseResult<T>;
|
|
60
|
+
//# sourceMappingURL=output-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-utils.d.ts","sourceRoot":"","sources":["../../src/utils/output-utils.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,YAAY,EAGb,MAAM,yBAAyB,CAAC;AAMjC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACxC;AA8BD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAyC;AAC5G,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAsC;AACtG,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAsC;AACzG,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAuC;AAExG,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAEhE;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,IAAI,CAuC3E;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,CA0D5E;AAgED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAY9D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAID,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAOnE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,IAAI,CAWN;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAGrE;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAQnH;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CA6BjG"}
|