@brainfish-ai/devdoc 0.1.44 → 0.1.46

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.
@@ -0,0 +1,365 @@
1
+ "use strict";
2
+ /**
3
+ * SDK Generation CLI Commands
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.sdkInit = sdkInit;
43
+ exports.sdkGenerate = sdkGenerate;
44
+ exports.sdkValidate = sdkValidate;
45
+ exports.sdkList = sdkList;
46
+ const path_1 = __importDefault(require("path"));
47
+ const fs_extra_1 = __importDefault(require("fs-extra"));
48
+ const logger_1 = require("../../utils/logger");
49
+ const sdk_1 = require("../../sdk");
50
+ // Simple prompt helper
51
+ async function prompt(question, defaultValue) {
52
+ const readline = await Promise.resolve().then(() => __importStar(require('readline')));
53
+ const rl = readline.createInterface({
54
+ input: process.stdin,
55
+ output: process.stdout,
56
+ });
57
+ return new Promise((resolve) => {
58
+ const displayQuestion = defaultValue
59
+ ? `${question} (${defaultValue}): `
60
+ : `${question}: `;
61
+ rl.question(displayQuestion, (answer) => {
62
+ rl.close();
63
+ resolve(answer.trim() || defaultValue || '');
64
+ });
65
+ });
66
+ }
67
+ async function promptMultiSelect(question, choices) {
68
+ console.log(`\n${question}\n`);
69
+ choices.forEach((choice, i) => {
70
+ const marker = choice.checked ? '[x]' : '[ ]';
71
+ console.log(` ${i + 1}. ${marker} ${choice.label}`);
72
+ });
73
+ console.log();
74
+ console.log('Enter numbers separated by commas (e.g., 1,2,3):');
75
+ const readline = await Promise.resolve().then(() => __importStar(require('readline')));
76
+ const rl = readline.createInterface({
77
+ input: process.stdin,
78
+ output: process.stdout,
79
+ });
80
+ return new Promise((resolve) => {
81
+ rl.question('> ', (answer) => {
82
+ rl.close();
83
+ if (!answer.trim()) {
84
+ // Return defaults
85
+ resolve(choices.filter((c) => c.checked).map((c) => c.value));
86
+ return;
87
+ }
88
+ const indices = answer
89
+ .split(',')
90
+ .map((s) => parseInt(s.trim(), 10) - 1)
91
+ .filter((i) => i >= 0 && i < choices.length);
92
+ resolve(indices.map((i) => choices[i].value));
93
+ });
94
+ });
95
+ }
96
+ /**
97
+ * Initialize SDK configuration
98
+ */
99
+ async function sdkInit(options) {
100
+ console.log();
101
+ logger_1.logger.info('🔧 Initialize SDK Generation');
102
+ console.log();
103
+ const projectRoot = process.cwd();
104
+ // Find OpenAPI spec if not provided
105
+ let openapiPath = options.openapi;
106
+ if (!openapiPath) {
107
+ // Look for common OpenAPI spec locations
108
+ const commonPaths = [
109
+ 'openapi.json',
110
+ 'openapi.yaml',
111
+ 'openapi.yml',
112
+ 'api-reference/openapi.json',
113
+ 'api-reference/openapi.yaml',
114
+ 'api-reference/openapi.yml',
115
+ 'docs/openapi.json',
116
+ 'spec/openapi.json',
117
+ ];
118
+ for (const p of commonPaths) {
119
+ if (await fs_extra_1.default.pathExists(path_1.default.join(projectRoot, p))) {
120
+ openapiPath = p;
121
+ logger_1.logger.info(`Found OpenAPI spec at: ${p}`);
122
+ break;
123
+ }
124
+ }
125
+ if (!openapiPath) {
126
+ openapiPath = await prompt('Path to OpenAPI specification', './openapi.json');
127
+ }
128
+ }
129
+ // Validate spec exists
130
+ const fullSpecPath = path_1.default.resolve(projectRoot, openapiPath);
131
+ if (!(await fs_extra_1.default.pathExists(fullSpecPath))) {
132
+ logger_1.logger.error(`OpenAPI specification not found: ${openapiPath}`);
133
+ process.exit(1);
134
+ }
135
+ // Get package name
136
+ let packageName = options.packageName;
137
+ if (!packageName) {
138
+ // Try to get from docs.json or package.json
139
+ const docsJsonPath = path_1.default.join(projectRoot, 'docs.json');
140
+ const pkgJsonPath = path_1.default.join(projectRoot, 'package.json');
141
+ if (await fs_extra_1.default.pathExists(docsJsonPath)) {
142
+ const docsJson = await fs_extra_1.default.readJson(docsJsonPath);
143
+ packageName = docsJson.name?.toLowerCase().replace(/\s+/g, '-');
144
+ }
145
+ else if (await fs_extra_1.default.pathExists(pkgJsonPath)) {
146
+ const pkgJson = await fs_extra_1.default.readJson(pkgJsonPath);
147
+ packageName = pkgJson.name;
148
+ }
149
+ packageName = await prompt('Base package name', packageName || 'api-sdk');
150
+ }
151
+ // Select languages
152
+ const generators = (0, sdk_1.getGeneratorInfo)();
153
+ const languageChoices = generators.map((g) => ({
154
+ value: g.language,
155
+ label: `${g.displayName}${g.native ? ' (recommended)' : g.requiresJava ? ' (requires Java)' : ''}`,
156
+ checked: g.language === 'typescript' || g.language === 'python',
157
+ }));
158
+ const selectedLanguages = (await promptMultiSelect('Select languages to generate:', languageChoices));
159
+ if (selectedLanguages.length === 0) {
160
+ logger_1.logger.error('At least one language must be selected');
161
+ process.exit(1);
162
+ }
163
+ // Create configuration
164
+ try {
165
+ const { configPath, config } = await (0, sdk_1.initSDKConfig)(projectRoot, {
166
+ openapi: openapiPath,
167
+ packageName,
168
+ languages: selectedLanguages,
169
+ force: options.force,
170
+ });
171
+ console.log();
172
+ logger_1.logger.success(`Created ${path_1.default.basename(configPath)}`);
173
+ console.log();
174
+ console.log('Configuration:');
175
+ console.log(` OpenAPI spec: ${config.openapi}`);
176
+ console.log(` Package name: ${config.packageName}`);
177
+ console.log(` Languages: ${selectedLanguages.join(', ')}`);
178
+ console.log(` Output: ${config.output}`);
179
+ console.log();
180
+ console.log('Next steps:');
181
+ console.log(" Run 'devdoc sdk generate' to generate SDKs");
182
+ console.log(" Run 'devdoc sdk generate --preview' to preview without overwriting");
183
+ console.log();
184
+ }
185
+ catch (error) {
186
+ logger_1.logger.error(error instanceof Error ? error.message : String(error));
187
+ process.exit(1);
188
+ }
189
+ }
190
+ /**
191
+ * Generate SDKs
192
+ */
193
+ async function sdkGenerate(options) {
194
+ console.log();
195
+ logger_1.logger.info('📦 Generate SDKs');
196
+ console.log();
197
+ const projectRoot = process.cwd();
198
+ // Validate language option if provided
199
+ if (options.lang && !sdk_1.SUPPORTED_LANGUAGES.includes(options.lang)) {
200
+ logger_1.logger.error(`Unsupported language: ${options.lang}`);
201
+ console.log();
202
+ console.log('Supported languages:');
203
+ sdk_1.SUPPORTED_LANGUAGES.forEach((lang) => {
204
+ console.log(` - ${lang}`);
205
+ });
206
+ process.exit(1);
207
+ }
208
+ try {
209
+ // Check if config exists
210
+ const { config, error } = await (0, sdk_1.loadSDKConfig)(projectRoot);
211
+ if (!config) {
212
+ logger_1.logger.error(error || 'SDK configuration not found');
213
+ console.log();
214
+ console.log("Run 'devdoc sdk init' to create a configuration");
215
+ process.exit(1);
216
+ }
217
+ // Validate spec first
218
+ const specPath = (0, sdk_1.resolveSpecPath)(projectRoot, config.openapi);
219
+ logger_1.logger.info('Validating OpenAPI spec...');
220
+ const validation = await (0, sdk_1.validateSpec)(specPath);
221
+ if (!validation.valid) {
222
+ logger_1.logger.error('OpenAPI specification is invalid:');
223
+ validation.errors.forEach((err) => console.log(` - ${err}`));
224
+ process.exit(1);
225
+ }
226
+ if (validation.warnings.length > 0) {
227
+ validation.warnings.forEach((warn) => logger_1.logger.warn(warn));
228
+ }
229
+ logger_1.logger.success('OpenAPI spec is valid');
230
+ console.log();
231
+ // Generate SDKs
232
+ logger_1.logger.info('Generating SDKs...');
233
+ console.log();
234
+ const result = await (0, sdk_1.generateSDKs)(projectRoot, {
235
+ language: options.lang,
236
+ preview: options.preview,
237
+ outputDir: options.output,
238
+ });
239
+ // Display results
240
+ for (const r of result.results) {
241
+ const generator = (0, sdk_1.getGeneratorInfo)().find((g) => g.language === r.language);
242
+ const displayName = generator?.displayName || r.language;
243
+ if (r.success) {
244
+ const relPath = path_1.default.relative(projectRoot, r.outputPath);
245
+ logger_1.logger.success(`${displayName.padEnd(12)} ./${relPath.padEnd(25)} ${(r.duration / 1000).toFixed(1)}s`);
246
+ }
247
+ else {
248
+ logger_1.logger.error(`${displayName.padEnd(12)} Failed: ${r.error}`);
249
+ }
250
+ }
251
+ console.log();
252
+ if (result.failureCount > 0) {
253
+ logger_1.logger.warn(`Generated ${result.successCount} SDK(s), ${result.failureCount} failed`);
254
+ }
255
+ else {
256
+ logger_1.logger.success(`Generated ${result.successCount} SDK(s) in ${(result.totalDuration / 1000).toFixed(1)}s`);
257
+ }
258
+ // Show next steps
259
+ if (result.successCount > 0) {
260
+ console.log();
261
+ console.log('Next steps:');
262
+ for (const r of result.results.filter((r) => r.success)) {
263
+ const relPath = path_1.default.relative(projectRoot, r.outputPath);
264
+ switch (r.language) {
265
+ case 'typescript':
266
+ console.log(` cd ${relPath} && npm install`);
267
+ break;
268
+ case 'python':
269
+ console.log(` cd ${relPath} && pip install -e .`);
270
+ break;
271
+ case 'go':
272
+ console.log(` # Import from ${relPath}`);
273
+ break;
274
+ default:
275
+ console.log(` # See ${relPath}/README.md`);
276
+ }
277
+ }
278
+ console.log();
279
+ }
280
+ }
281
+ catch (error) {
282
+ logger_1.logger.error(error instanceof Error ? error.message : String(error));
283
+ process.exit(1);
284
+ }
285
+ }
286
+ /**
287
+ * Validate OpenAPI specification
288
+ */
289
+ async function sdkValidate(specPath) {
290
+ console.log();
291
+ logger_1.logger.info('🔍 Validate OpenAPI Specification');
292
+ console.log();
293
+ const projectRoot = process.cwd();
294
+ // Get spec path from config if not provided
295
+ if (!specPath) {
296
+ const { config } = await (0, sdk_1.loadSDKConfig)(projectRoot);
297
+ if (config) {
298
+ specPath = config.openapi;
299
+ }
300
+ else {
301
+ logger_1.logger.error('No spec path provided and no sdk.json found');
302
+ process.exit(1);
303
+ }
304
+ }
305
+ const fullPath = (0, sdk_1.resolveSpecPath)(projectRoot, specPath);
306
+ logger_1.logger.info(`Validating: ${specPath}`);
307
+ console.log();
308
+ const result = await (0, sdk_1.validateSpec)(fullPath);
309
+ if (result.errors.length > 0) {
310
+ logger_1.logger.error('Errors:');
311
+ result.errors.forEach((err) => console.log(` ✗ ${err}`));
312
+ console.log();
313
+ }
314
+ if (result.warnings.length > 0) {
315
+ logger_1.logger.warn('Warnings:');
316
+ result.warnings.forEach((warn) => console.log(` ⚠ ${warn}`));
317
+ console.log();
318
+ }
319
+ if (result.valid) {
320
+ logger_1.logger.success('Specification is valid');
321
+ }
322
+ else {
323
+ logger_1.logger.error('Specification is invalid');
324
+ process.exit(1);
325
+ }
326
+ }
327
+ /**
328
+ * List available generators and their status
329
+ */
330
+ async function sdkList() {
331
+ console.log();
332
+ logger_1.logger.info('📋 SDK Generators');
333
+ console.log();
334
+ const projectRoot = process.cwd();
335
+ const { config } = await (0, sdk_1.loadSDKConfig)(projectRoot);
336
+ const enabledLanguages = config ? (0, sdk_1.getEnabledGenerators)(config) : [];
337
+ const generators = (0, sdk_1.getGeneratorInfo)();
338
+ console.log('Available generators:\n');
339
+ // Native generators (no Java required)
340
+ console.log('Native (no Java required):');
341
+ for (const g of generators.filter((g) => g.native)) {
342
+ const enabled = enabledLanguages.includes(g.language);
343
+ const status = enabled ? logger_1.logger.green('enabled') : logger_1.logger.yellow('disabled');
344
+ console.log(` ${g.displayName.padEnd(12)} ${status}`);
345
+ }
346
+ console.log();
347
+ // Java-based generators
348
+ console.log('OpenAPI Generator (requires Java):');
349
+ for (const g of generators.filter((g) => g.requiresJava)) {
350
+ const enabled = enabledLanguages.includes(g.language);
351
+ const status = enabled ? logger_1.logger.green('enabled') : logger_1.logger.yellow('disabled');
352
+ console.log(` ${g.displayName.padEnd(12)} ${status}`);
353
+ }
354
+ console.log();
355
+ if (!config) {
356
+ console.log("No sdk.json found. Run 'devdoc sdk init' to configure generators.");
357
+ }
358
+ else {
359
+ console.log(`Configuration: sdk.json`);
360
+ console.log(`OpenAPI spec: ${config.openapi}`);
361
+ console.log(`Enabled: ${enabledLanguages.join(', ') || 'none'}`);
362
+ }
363
+ console.log();
364
+ }
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9zZGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9GSCwwQkF5R0M7QUFXRCxrQ0EyR0M7QUFLRCxrQ0EyQ0M7QUFLRCwwQkEwQ0M7QUFoWkQsZ0RBQXdCO0FBQ3hCLHdEQUEwQjtBQUMxQiwrQ0FBNEM7QUFDNUMsbUNBV21CO0FBRW5CLHVCQUF1QjtBQUN2QixLQUFLLFVBQVUsTUFBTSxDQUFDLFFBQWdCLEVBQUUsWUFBcUI7SUFDM0QsTUFBTSxRQUFRLEdBQUcsd0RBQWEsVUFBVSxHQUFDLENBQUM7SUFDMUMsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUNsQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO0tBQ3ZCLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QixNQUFNLGVBQWUsR0FBRyxZQUFZO1lBQ2xDLENBQUMsQ0FBQyxHQUFHLFFBQVEsS0FBSyxZQUFZLEtBQUs7WUFDbkMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxJQUFJLENBQUM7UUFFcEIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN0QyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxpQkFBaUIsQ0FDOUIsUUFBZ0IsRUFDaEIsT0FBOEQ7SUFFOUQsT0FBTyxDQUFDLEdBQUcs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VUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDekQsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUVkLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUVBQW1FLENBQUMsQ0FBQztJQUNuRixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTREsgR2VuZXJhdGlvbiBDTEkgQ29tbWFuZHNcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVTREtzLFxuICB2YWxpZGF0ZVNwZWMsXG4gIGluaXRTREtDb25maWcsXG4gIGxvYWRTREtDb25maWcsXG4gIGdldEVuYWJsZWRHZW5lcmF0b3JzLFxuICBnZXRHZW5lcmF0b3JJbmZvLFxuICByZXNvbHZlU3BlY1BhdGgsXG4gIGlzTmF0aXZlR2VuZXJhdG9yLFxuICBTREtMYW5ndWFnZSxcbiAgU1VQUE9SVEVEX0xBTkdVQUdFUyxcbn0gZnJvbSAnLi4vLi4vc2RrJztcblxuLy8gU2ltcGxlIHByb21wdCBoZWxwZXJcbmFzeW5jIGZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlRdWVzdGlvbiA9IGRlZmF1bHRWYWx1ZVxuICAgICAgPyBgJHtxdWVzdGlvbn0gKCR7ZGVmYXVsdFZhbHVlfSk6IGBcbiAgICAgIDogYCR7cXVlc3Rpb259OiBgO1xuXG4gICAgcmwucXVlc3Rpb24oZGlzcGxheVF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpIHx8IGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRNdWx0aVNlbGVjdChcbiAgcXVlc3Rpb246IHN0cmluZyxcbiAgY2hvaWNlczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBjaGVja2VkPzogYm9vbGVhbiB9W11cbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc29sZS5sb2coYFxcbiR7cXVlc3Rpb259XFxuYCk7XG4gIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpKSA9PiB7XG4gICAgY29uc3QgbWFya2VyID0gY2hvaWNlLmNoZWNrZWQgPyAnW3hdJyA6ICdbIF0nO1xuICAgIGNvbnNvbGUubG9nKGAgICR7aSArIDF9LiAke21hcmtlcn0gJHtjaG9pY2UubGFiZWx9YCk7XG4gIH0pO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZygnRW50ZXIgbnVtYmVycyBzZXBhcmF0ZWQgYnkgY29tbWFzIChlLmcuLCAxLDIsMyk6Jyk7XG5cbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJyk7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbignPiAnLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgaWYgKCFhbnN3ZXIudHJpbSgpKSB7XG4gICAgICAgIC8vIFJldHVybiBkZWZhdWx0c1xuICAgICAgICByZXNvbHZlKGNob2ljZXMuZmlsdGVyKChjKSA9PiBjLmNoZWNrZWQpLm1hcCgoYykgPT4gYy52YWx1ZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZGljZXMgPSBhbnN3ZXJcbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcCgocykgPT4gcGFyc2VJbnQocy50cmltKCksIDEwKSAtIDEpXG4gICAgICAgIC5maWx0ZXIoKGkpID0+IGkgPj0gMCAmJiBpIDwgY2hvaWNlcy5sZW5ndGgpO1xuXG4gICAgICByZXNvbHZlKGluZGljZXMubWFwKChpKSA9PiBjaG9pY2VzW2ldLnZhbHVlKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5pbnRlcmZhY2UgU0RLSW5pdE9wdGlvbnMge1xuICBvcGVuYXBpPzogc3RyaW5nO1xuICBwYWNrYWdlTmFtZT86IHN0cmluZztcbiAgZm9yY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgU0RLIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNka0luaXQob3B0aW9uczogU0RLSW5pdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLmluZm8oJ/CflKcgSW5pdGlhbGl6ZSBTREsgR2VuZXJhdGlvbicpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIGNvbnN0IHByb2plY3RSb290ID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBGaW5kIE9wZW5BUEkgc3BlYyBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IG9wZW5hcGlQYXRoID0gb3B0aW9ucy5vcGVuYXBpO1xuXG4gIGlmICghb3BlbmFwaVBhdGgpIHtcbiAgICAvLyBMb29rIGZvciBjb21tb24gT3BlbkFQSSBzcGVjIGxvY2F0aW9uc1xuICAgIGNvbnN0IGNvbW1vblBhdGhzID0gW1xuICAgICAgJ29wZW5hcGkuanNvbicsXG4gICAgICAnb3BlbmFwaS55YW1sJyxcbiAgICAgICdvcGVuYXBpLnltbCcsXG4gICAgICAnYXBpLXJlZmVyZW5jZS9vcGVuYXBpLmpzb24nLFxuICAgICAgJ2FwaS1yZWZlcmVuY2Uvb3BlbmFwaS55YW1sJyxcbiAgICAgICdhcGktcmVmZXJlbmNlL29wZW5hcGkueW1sJyxcbiAgICAgICdkb2NzL29wZW5hcGkuanNvbicsXG4gICAgICAnc3BlYy9vcGVuYXBpLmpzb24nLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHAgb2YgY29tbW9uUGF0aHMpIHtcbiAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKHBhdGguam9pbihwcm9qZWN0Um9vdCwgcCkpKSB7XG4gICAgICAgIG9wZW5hcGlQYXRoID0gcDtcbiAgICAgICAgbG9nZ2VyLmluZm8oYEZvdW5kIE9wZW5BUEkgc3BlYyBhdDogJHtwfWApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wZW5hcGlQYXRoKSB7XG4gICAgICBvcGVuYXBpUGF0aCA9IGF3YWl0IHByb21wdCgnUGF0aCB0byBPcGVuQVBJIHNwZWNpZmljYXRpb24nLCAnLi9vcGVuYXBpLmpzb24nKTtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBzcGVjIGV4aXN0c1xuICBjb25zdCBmdWxsU3BlY1BhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdFJvb3QsIG9wZW5hcGlQYXRoKTtcbiAgaWYgKCEoYXdhaXQgZnMucGF0aEV4aXN0cyhmdWxsU3BlY1BhdGgpKSkge1xuICAgIGxvZ2dlci5lcnJvcihgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIG5vdCBmb3VuZDogJHtvcGVuYXBpUGF0aH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyBHZXQgcGFja2FnZSBuYW1lXG4gIGxldCBwYWNrYWdlTmFtZSA9IG9wdGlvbnMucGFja2FnZU5hbWU7XG4gIGlmICghcGFja2FnZU5hbWUpIHtcbiAgICAvLyBUcnkgdG8gZ2V0IGZyb20gZG9jcy5qc29uIG9yIHBhY2thZ2UuanNvblxuICAgIGNvbnN0IGRvY3NKc29uUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2RvY3MuanNvbicpO1xuICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJyk7XG5cbiAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhkb2NzSnNvblBhdGgpKSB7XG4gICAgICBjb25zdCBkb2NzSnNvbiA9IGF3YWl0IGZzLnJlYWRKc29uKGRvY3NKc29uUGF0aCk7XG4gICAgICBwYWNrYWdlTmFtZSA9IGRvY3NKc29uLm5hbWU/LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpO1xuICAgIH0gZWxzZSBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhwa2dKc29uUGF0aCkpIHtcbiAgICAgIGNvbnN0IHBrZ0pzb24gPSBhd2FpdCBmcy5yZWFkSnNvbihwa2dKc29uUGF0aCk7XG4gICAgICBwYWNrYWdlTmFtZSA9IHBrZ0pzb24ubmFtZTtcbiAgICB9XG5cbiAgICBwYWNrYWdlTmFtZSA9IGF3YWl0IHByb21wdCgnQmFzZSBwYWNrYWdlIG5hbWUnLCBwYWNrYWdlTmFtZSB8fCAnYXBpLXNkaycpO1xuICB9XG5cbiAgLy8gU2VsZWN0IGxhbmd1YWdlc1xuICBjb25zdCBnZW5lcmF0b3JzID0gZ2V0R2VuZXJhdG9ySW5mbygpO1xuICBjb25zdCBsYW5ndWFnZUNob2ljZXMgPSBnZW5lcmF0b3JzLm1hcCgoZykgPT4gKHtcbiAgICB2YWx1ZTogZy5sYW5ndWFnZSxcbiAgICBsYWJlbDogYCR7Zy5kaXNwbGF5TmFtZX0ke2cubmF0aXZlID8gJyAocmVjb21tZW5kZWQpJyA6IGcucmVxdWlyZXNKYXZhID8gJyAocmVxdWlyZXMgSmF2YSknIDogJyd9YCxcbiAgICBjaGVja2VkOiBnLmxhbmd1YWdlID09PSAndHlwZXNjcmlwdCcgfHwgZy5sYW5ndWFnZSA9PT0gJ3B5dGhvbicsXG4gIH0pKTtcblxuICBjb25zdCBzZWxlY3RlZExhbmd1YWdlcyA9IChhd2FpdCBwcm9tcHRNdWx0aVNlbGVjdChcbiAgICAnU2VsZWN0IGxhbmd1YWdlcyB0byBnZW5lcmF0ZTonLFxuICAgIGxhbmd1YWdlQ2hvaWNlc1xuICApKSBhcyBTREtMYW5ndWFnZVtdO1xuXG4gIGlmIChzZWxlY3RlZExhbmd1YWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0F0IGxlYXN0IG9uZSBsYW5ndWFnZSBtdXN0IGJlIHNlbGVjdGVkJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGNvbmZpZ3VyYXRpb25cbiAgdHJ5IHtcbiAgICBjb25zdCB7IGNvbmZpZ1BhdGgsIGNvbmZpZyB9ID0gYXdhaXQgaW5pdFNES0NvbmZpZyhwcm9qZWN0Um9vdCwge1xuICAgICAgb3BlbmFwaTogb3BlbmFwaVBhdGgsXG4gICAgICBwYWNrYWdlTmFtZSxcbiAgICAgIGxhbmd1YWdlczogc2VsZWN0ZWRMYW5ndWFnZXMsXG4gICAgICBmb3JjZTogb3B0aW9ucy5mb3JjZSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYENyZWF0ZWQgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZ1BhdGgpfWApO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coJ0NvbmZpZ3VyYXRpb246Jyk7XG4gICAgY29uc29sZS5sb2coYCAgT3BlbkFQSSBzcGVjOiAke2NvbmZpZy5vcGVuYXBpfWApO1xuICAgIGNvbnNvbGUubG9nKGAgIFBhY2thZ2UgbmFtZTogJHtjb25maWcucGFja2FnZU5hbWV9YCk7XG4gICAgY29uc29sZS5sb2coYCAgTGFuZ3VhZ2VzOiAke3NlbGVjdGVkTGFuZ3VhZ2VzLmpvaW4oJywgJyl9YCk7XG4gICAgY29uc29sZS5sb2coYCAgT3V0cHV0OiAke2NvbmZpZy5vdXRwdXR9YCk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZygnTmV4dCBzdGVwczonKTtcbiAgICBjb25zb2xlLmxvZyhcIiAgUnVuICdkZXZkb2Mgc2RrIGdlbmVyYXRlJyB0byBnZW5lcmF0ZSBTREtzXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiICBSdW4gJ2RldmRvYyBzZGsgZ2VuZXJhdGUgLS1wcmV2aWV3JyB0byBwcmV2aWV3IHdpdGhvdXQgb3ZlcndyaXRpbmdcIik7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNES0dlbmVyYXRlT3B0aW9ucyB7XG4gIGxhbmc/OiBzdHJpbmc7XG4gIHByZXZpZXc/OiBib29sZWFuO1xuICBvdXRwdXQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgU0RLc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2RrR2VuZXJhdGUob3B0aW9uczogU0RLR2VuZXJhdGVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGxvZ2dlci5pbmZvKCfwn5OmIEdlbmVyYXRlIFNES3MnKTtcbiAgY29uc29sZS5sb2coKTtcblxuICBjb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gVmFsaWRhdGUgbGFuZ3VhZ2Ugb3B0aW9uIGlmIHByb3ZpZGVkXG4gIGlmIChvcHRpb25zLmxhbmcgJiYgIVNVUFBPUlRFRF9MQU5HVUFHRVMuaW5jbHVkZXMob3B0aW9ucy5sYW5nIGFzIFNES0xhbmd1YWdlKSkge1xuICAgIGxvZ2dlci5lcnJvcihgVW5zdXBwb3J0ZWQgbGFuZ3VhZ2U6ICR7b3B0aW9ucy5sYW5nfWApO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coJ1N1cHBvcnRlZCBsYW5ndWFnZXM6Jyk7XG4gICAgU1VQUE9SVEVEX0xBTkdVQUdFUy5mb3JFYWNoKChsYW5nKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgICAtICR7bGFuZ31gKTtcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIGNvbmZpZyBleGlzdHNcbiAgICBjb25zdCB7IGNvbmZpZywgZXJyb3IgfSA9IGF3YWl0IGxvYWRTREtDb25maWcocHJvamVjdFJvb3QpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihlcnJvciB8fCAnU0RLIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kJyk7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coXCJSdW4gJ2RldmRvYyBzZGsgaW5pdCcgdG8gY3JlYXRlIGEgY29uZmlndXJhdGlvblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBzcGVjIGZpcnN0XG4gICAgY29uc3Qgc3BlY1BhdGggPSByZXNvbHZlU3BlY1BhdGgocHJvamVjdFJvb3QsIGNvbmZpZy5vcGVuYXBpKTtcbiAgICBsb2dnZXIuaW5mbygnVmFsaWRhdGluZyBPcGVuQVBJIHNwZWMuLi4nKTtcbiAgICBcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gYXdhaXQgdmFsaWRhdGVTcGVjKHNwZWNQYXRoKTtcbiAgICBcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGlzIGludmFsaWQ6Jyk7XG4gICAgICB2YWxpZGF0aW9uLmVycm9ycy5mb3JFYWNoKChlcnIpID0+IGNvbnNvbGUubG9nKGAgIC0gJHtlcnJ9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodmFsaWRhdGlvbi53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICB2YWxpZGF0aW9uLndhcm5pbmdzLmZvckVhY2goKHdhcm4pID0+IGxvZ2dlci53YXJuKHdhcm4pKTtcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ09wZW5BUEkgc3BlYyBpcyB2YWxpZCcpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBTREtzXG4gICAgbG9nZ2VyLmluZm8oJ0dlbmVyYXRpbmcgU0RLcy4uLicpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZVNES3MocHJvamVjdFJvb3QsIHtcbiAgICAgIGxhbmd1YWdlOiBvcHRpb25zLmxhbmcgYXMgU0RLTGFuZ3VhZ2UgfCB1bmRlZmluZWQsXG4gICAgICBwcmV2aWV3OiBvcHRpb25zLnByZXZpZXcsXG4gICAgICBvdXRwdXREaXI6IG9wdGlvbnMub3V0cHV0LFxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGxheSByZXN1bHRzXG4gICAgZm9yIChjb25zdCByIG9mIHJlc3VsdC5yZXN1bHRzKSB7XG4gICAgICBjb25zdCBnZW5lcmF0b3IgPSBnZXRHZW5lcmF0b3JJbmZvKCkuZmluZCgoZykgPT4gZy5sYW5ndWFnZSA9PT0gci5sYW5ndWFnZSk7XG4gICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGdlbmVyYXRvcj8uZGlzcGxheU5hbWUgfHwgci5sYW5ndWFnZTtcblxuICAgICAgaWYgKHIuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0Um9vdCwgci5vdXRwdXRQYXRoKTtcbiAgICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYCR7ZGlzcGxheU5hbWUucGFkRW5kKDEyKX0gLi8ke3JlbFBhdGgucGFkRW5kKDI1KX0gJHsoci5kdXJhdGlvbiAvIDEwMDApLnRvRml4ZWQoMSl9c2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGAke2Rpc3BsYXlOYW1lLnBhZEVuZCgxMil9IEZhaWxlZDogJHtyLmVycm9yfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBpZiAocmVzdWx0LmZhaWx1cmVDb3VudCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBHZW5lcmF0ZWQgJHtyZXN1bHQuc3VjY2Vzc0NvdW50fSBTREsocyksICR7cmVzdWx0LmZhaWx1cmVDb3VudH0gZmFpbGVkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKGBHZW5lcmF0ZWQgJHtyZXN1bHQuc3VjY2Vzc0NvdW50fSBTREsocykgaW4gJHsocmVzdWx0LnRvdGFsRHVyYXRpb24gLyAxMDAwKS50b0ZpeGVkKDEpfXNgKTtcbiAgICB9XG5cbiAgICAvLyBTaG93IG5leHQgc3RlcHNcbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3NDb3VudCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBjb25zb2xlLmxvZygnTmV4dCBzdGVwczonKTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCByIG9mIHJlc3VsdC5yZXN1bHRzLmZpbHRlcigocikgPT4gci5zdWNjZXNzKSkge1xuICAgICAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0Um9vdCwgci5vdXRwdXRQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIHN3aXRjaCAoci5sYW5ndWFnZSkge1xuICAgICAgICAgIGNhc2UgJ3R5cGVzY3JpcHQnOlxuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgY2QgJHtyZWxQYXRofSAmJiBucG0gaW5zdGFsbGApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncHl0aG9uJzpcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgIGNkICR7cmVsUGF0aH0gJiYgcGlwIGluc3RhbGwgLWUgLmApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZ28nOlxuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgIyBJbXBvcnQgZnJvbSAke3JlbFBhdGh9YCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgIyBTZWUgJHtyZWxQYXRofS9SRUFETUUubWRgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZGtWYWxpZGF0ZShzcGVjUGF0aD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuaW5mbygn8J+UjSBWYWxpZGF0ZSBPcGVuQVBJIFNwZWNpZmljYXRpb24nKTtcbiAgY29uc29sZS5sb2coKTtcblxuICBjb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gR2V0IHNwZWMgcGF0aCBmcm9tIGNvbmZpZyBpZiBub3QgcHJvdmlkZWRcbiAgaWYgKCFzcGVjUGF0aCkge1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSBhd2FpdCBsb2FkU0RLQ29uZmlnKHByb2plY3RSb290KTtcbiAgICBcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICBzcGVjUGF0aCA9IGNvbmZpZy5vcGVuYXBpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ05vIHNwZWMgcGF0aCBwcm92aWRlZCBhbmQgbm8gc2RrLmpzb24gZm91bmQnKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmVTcGVjUGF0aChwcm9qZWN0Um9vdCwgc3BlY1BhdGgpO1xuICBsb2dnZXIuaW5mbyhgVmFsaWRhdGluZzogJHtzcGVjUGF0aH1gKTtcbiAgY29uc29sZS5sb2coKTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0ZVNwZWMoZnVsbFBhdGgpO1xuXG4gIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yczonKTtcbiAgICByZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycikgPT4gY29uc29sZS5sb2coYCAg4pyXICR7ZXJyfWApKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgaWYgKHJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1dhcm5pbmdzOicpO1xuICAgIHJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuKSA9PiBjb25zb2xlLmxvZyhgICDimqAgJHt3YXJufWApKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgaWYgKHJlc3VsdC52YWxpZCkge1xuICAgIGxvZ2dlci5zdWNjZXNzKCdTcGVjaWZpY2F0aW9uIGlzIHZhbGlkJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmVycm9yKCdTcGVjaWZpY2F0aW9uIGlzIGludmFsaWQnKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IGF2YWlsYWJsZSBnZW5lcmF0b3JzIGFuZCB0aGVpciBzdGF0dXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNka0xpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGxvZ2dlci5pbmZvKCfwn5OLIFNESyBHZW5lcmF0b3JzJyk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB7IGNvbmZpZyB9ID0gYXdhaXQgbG9hZFNES0NvbmZpZyhwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IGVuYWJsZWRMYW5ndWFnZXMgPSBjb25maWcgPyBnZXRFbmFibGVkR2VuZXJhdG9ycyhjb25maWcpIDogW107XG5cbiAgY29uc3QgZ2VuZXJhdG9ycyA9IGdldEdlbmVyYXRvckluZm8oKTtcblxuICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIGdlbmVyYXRvcnM6XFxuJyk7XG5cbiAgLy8gTmF0aXZlIGdlbmVyYXRvcnMgKG5vIEphdmEgcmVxdWlyZWQpXG4gIGNvbnNvbGUubG9nKCdOYXRpdmUgKG5vIEphdmEgcmVxdWlyZWQpOicpO1xuICBmb3IgKGNvbnN0IGcgb2YgZ2VuZXJhdG9ycy5maWx0ZXIoKGcpID0+IGcubmF0aXZlKSkge1xuICAgIGNvbnN0IGVuYWJsZWQgPSBlbmFibGVkTGFuZ3VhZ2VzLmluY2x1ZGVzKGcubGFuZ3VhZ2UpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGVuYWJsZWQgPyBsb2dnZXIuZ3JlZW4oJ2VuYWJsZWQnKSA6IGxvZ2dlci55ZWxsb3coJ2Rpc2FibGVkJyk7XG4gICAgY29uc29sZS5sb2coYCAgJHtnLmRpc3BsYXlOYW1lLnBhZEVuZCgxMil9ICR7c3RhdHVzfWApO1xuICB9XG5cbiAgY29uc29sZS5sb2coKTtcblxuICAvLyBKYXZhLWJhc2VkIGdlbmVyYXRvcnNcbiAgY29uc29sZS5sb2coJ09wZW5BUEkgR2VuZXJhdG9yIChyZXF1aXJlcyBKYXZhKTonKTtcbiAgZm9yIChjb25zdCBnIG9mIGdlbmVyYXRvcnMuZmlsdGVyKChnKSA9PiBnLnJlcXVpcmVzSmF2YSkpIHtcbiAgICBjb25zdCBlbmFibGVkID0gZW5hYmxlZExhbmd1YWdlcy5pbmNsdWRlcyhnLmxhbmd1YWdlKTtcbiAgICBjb25zdCBzdGF0dXMgPSBlbmFibGVkID8gbG9nZ2VyLmdyZWVuKCdlbmFibGVkJykgOiBsb2dnZXIueWVsbG93KCdkaXNhYmxlZCcpO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Zy5kaXNwbGF5TmFtZS5wYWRFbmQoMTIpfSAke3N0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgaWYgKCFjb25maWcpIHtcbiAgICBjb25zb2xlLmxvZyhcIk5vIHNkay5qc29uIGZvdW5kLiBSdW4gJ2RldmRvYyBzZGsgaW5pdCcgdG8gY29uZmlndXJlIGdlbmVyYXRvcnMuXCIpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGBDb25maWd1cmF0aW9uOiBzZGsuanNvbmApO1xuICAgIGNvbnNvbGUubG9nKGBPcGVuQVBJIHNwZWM6ICR7Y29uZmlnLm9wZW5hcGl9YCk7XG4gICAgY29uc29sZS5sb2coYEVuYWJsZWQ6ICR7ZW5hYmxlZExhbmd1YWdlcy5qb2luKCcsICcpIHx8ICdub25lJ31gKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCk7XG59XG4iXX0=
package/dist/cli/index.js CHANGED
@@ -13,6 +13,7 @@ const whoami_1 = require("./commands/whoami");
13
13
  const upload_1 = require("./commands/upload");
14
14
  const ai_1 = require("./commands/ai");
15
15
  const domain_1 = require("./commands/domain");
16
+ const sdk_1 = require("./commands/sdk");
16
17
  const packageJson = require('../../package.json');
17
18
  const program = new commander_1.Command();
18
19
  program
@@ -142,5 +143,31 @@ domainCmd
142
143
  .option('-u, --url <url>', 'API URL')
143
144
  .option('-k, --api-key <key>', 'API key for authentication')
144
145
  .action(domain_1.domainRemove);
146
+ // SDK generation
147
+ const sdkCmd = program
148
+ .command('sdk')
149
+ .description('Generate client SDKs from OpenAPI specification');
150
+ sdkCmd
151
+ .command('init')
152
+ .description('Initialize SDK generation configuration')
153
+ .option('-o, --openapi <path>', 'Path to OpenAPI specification')
154
+ .option('-n, --package-name <name>', 'Base package name for generated SDKs')
155
+ .option('-f, --force', 'Overwrite existing configuration')
156
+ .action(sdk_1.sdkInit);
157
+ sdkCmd
158
+ .command('generate')
159
+ .description('Generate SDKs for configured languages')
160
+ .option('-l, --lang <language>', 'Generate only for specific language')
161
+ .option('-p, --preview', 'Preview what would be generated without writing files')
162
+ .option('-o, --output <dir>', 'Override output directory')
163
+ .action(sdk_1.sdkGenerate);
164
+ sdkCmd
165
+ .command('validate [spec]')
166
+ .description('Validate OpenAPI specification')
167
+ .action(sdk_1.sdkValidate);
168
+ sdkCmd
169
+ .command('list')
170
+ .description('List available generators and their status')
171
+ .action(sdk_1.sdkList);
145
172
  program.parse(process.argv);
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQW9DO0FBQ3BDLDhDQUEyQztBQUMzQywwQ0FBdUM7QUFDdkMsd0NBQXFDO0FBQ3JDLDRDQUF5QztBQUN6Qyw0Q0FBeUM7QUFDekMsNENBQXlDO0FBQ3pDLDhDQUEyQztBQUMzQywwQ0FBMEQ7QUFDMUQsOENBQTJDO0FBQzNDLDhDQUF1RDtBQUN2RCxzQ0FBbUM7QUFDbkMsOENBQXdGO0FBRXhGLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRWxELE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMsUUFBUSxDQUFDO0tBQ2QsV0FBVyxDQUFDLHdDQUF3QyxDQUFDO0tBQ3JELE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFaEMsT0FBTztLQUNKLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQztLQUNyQyxXQUFXLENBQUMsd0NBQXdDLENBQUM7S0FDckQsTUFBTSxDQUFDLHVCQUF1QixFQUFFLDJDQUEyQyxDQUFDO0tBQzVFLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSx1Q0FBdUMsQ0FBQztLQUN4RSxNQUFNLENBQUMsNkJBQTZCLEVBQUUsbURBQW1ELENBQUM7S0FDMUYsTUFBTSxDQUFDLFVBQVUsRUFBRSx5QkFBeUIsQ0FBQztLQUM3QyxNQUFNLENBQUMsY0FBYyxFQUFFLDhCQUE4QixDQUFDO0tBQ3RELE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxzQ0FBc0MsQ0FBQztLQUNqRSxNQUFNLENBQUMsZUFBTSxDQUFDLENBQUM7QUFFbEIsT0FBTztLQUNKLE9BQU8sQ0FBQyxNQUFNLENBQUM7S0FDZixXQUFXLENBQUMsNENBQTRDLENBQUM7S0FDekQsTUFBTSxDQUFDLG1CQUFtQixFQUFFLGNBQWMs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QVMsQ0FBQztLQUNwQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsNEJBQTRCLENBQUM7S0FDM0QsTUFBTSxDQUFDLHFCQUFZLENBQUMsQ0FBQztBQUV4QixTQUFTO0tBQ04sT0FBTyxDQUFDLFFBQVEsQ0FBQztLQUNqQixXQUFXLENBQUMsaURBQWlELENBQUM7S0FDOUQsTUFBTSxDQUFDLGlCQUFpQixFQUFFLFNBQVMsQ0FBQztLQUNwQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsNEJBQTRCLENBQUM7S0FDM0QsTUFBTSxDQUFDLHFCQUFZLENBQUMsQ0FBQztBQUV4QixTQUFTO0tBQ04sT0FBTyxDQUFDLHdCQUF3QixDQUFDO0tBQ2pDLFdBQVcsQ0FBQyxtQ0FBbUMsQ0FBQztLQUNoRCxNQUFNLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0tBQ3BDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSw0QkFBNEIsQ0FBQztLQUMzRCxNQUFNLENBQUMscUJBQVksQ0FBQyxDQUFDO0FBRXhCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZSc7XG5pbXBvcnQgeyBpbml0IH0gZnJvbSAnLi9jb21tYW5kcy9pbml0JztcbmltcG9ydCB7IGRldiB9IGZyb20gJy4vY29tbWFuZHMvZGV2JztcbmltcG9ydCB7IGJ1aWxkIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZCc7XG5pbXBvcnQgeyBzdGFydCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQnO1xuaW1wb3J0IHsgY2hlY2sgfSBmcm9tICcuL2NvbW1hbmRzL2NoZWNrJztcbmltcG9ydCB7IGRlcGxveSB9IGZyb20gJy4vY29tbWFuZHMvZGVwbG95JztcbmltcG9ydCB7IGxpc3RLZXlzLCByZWdlbmVyYXRlS2V5IH0gZnJvbSAnLi9jb21tYW5kcy9rZXlzJztcbmltcG9ydCB7IHdob2FtaSB9IGZyb20gJy4vY29tbWFuZHMvd2hvYW1pJztcbmltcG9ydCB7IHVwbG9hZCwgbGlzdEFzc2V0cyB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkJztcbmltcG9ydCB7IGFpIH0gZnJvbSAnLi9jb21tYW5kcy9haSc7XG5pbXBvcnQgeyBkb21haW5BZGQsIGRvbWFpblN0YXR1cywgZG9tYWluVmVyaWZ5LCBkb21haW5SZW1vdmUgfSBmcm9tICcuL2NvbW1hbmRzL2RvbWFpbic7XG5cbmNvbnN0IHBhY2thZ2VKc29uID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKCdkZXZkb2MnKVxuICAuZGVzY3JpcHRpb24oJ0RvY3VtZW50YXRpb24gZnJhbWV3b3JrIGZvciBkZXZlbG9wZXJzJylcbiAgLnZlcnNpb24ocGFja2FnZUpzb24udmVyc2lvbik7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2NyZWF0ZSBbcHJvamVjdC1kaXJlY3RvcnldJylcbiAgLmRlc2NyaXB0aW9uKCdDcmVhdGUgYSBuZXcgRGV2RG9jIGRvY3VtZW50YXRpb24gc2l0ZScpXG4gIC5vcHRpb24oJy10LCAtLXRlbXBsYXRlIDx0eXBlPicsICdUZW1wbGF0ZSB0byB1c2UgKGJhc2ljLCBvcGVuYXBpLCBncmFwaHFsKScpXG4gIC5vcHRpb24oJy1kLCAtLWRvYy10eXBlIDx0eXBlPicsICdEb2N1bWVudGF0aW9uIHR5cGUgKHB1YmxpYywgaW50ZXJuYWwpJylcbiAgLm9wdGlvbignLXMsIC0tc3ViZG9tYWluIDxzdWJkb21haW4+JywgJ1N1YmRvbWFpbiBmb3IgeW91ciBkb2NzIChlLmcuLCBteS1kb2NzLmRldmRvYy5zaCknKVxuICAub3B0aW9uKCctLW5vLWdpdCcsICdTa2lwIGdpdCBpbml0aWFsaXphdGlvbicpXG4gIC5vcHRpb24oJy0tbm8taW5zdGFsbCcsICdTa2lwIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwgKGRlZmF1bHQ6IGh0dHBzOi8vZGV2ZG9jLnNoKScpXG4gIC5hY3Rpb24oY3JlYXRlKTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnaW5pdCcpXG4gIC5kZXNjcmlwdGlvbignSW5pdGlhbGl6ZS9yZWdpc3RlciBwcm9qZWN0IHdpdGggQnJhaW5maXNoJylcbiAgLm9wdGlvbignLXMsIC0tc2x1ZyA8c2x1Zz4nLCAnUHJvamVjdCBzbHVnJylcbiAgLm9wdGlvbignLS1zdWJkb21haW4gPHN1YmRvbWFpbj4nLCAnU3ViZG9tYWluIGZvciB5b3VyIGRvY3MgKGUuZy4sIG15LWRvY3MuZGV2ZG9jLnNoKScpXG4gIC5vcHRpb24oJy1mLCAtLWZvcmNlJywgJ092ZXJ3cml0ZSBleGlzdGluZyAuZGV2ZG9jLmpzb24nKVxuICAub3B0aW9uKCctLWFpIFt0b29sXScsICdTZXQgdXAgQUkgYWdlbnRzIChjbGF1ZGUsIGN1cnNvciwgYm90aCwgb3IganVzdCAtLWFpIHRvIGNob29zZSknKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9kZXZkb2Muc2gpJylcbiAgLmFjdGlvbihpbml0KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnZGV2JylcbiAgLmRlc2NyaXB0aW9uKCdTdGFydCBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aCBob3QgcmVsb2FkJylcbiAgLm9wdGlvbignLXAsIC0tcG9ydCA8cG9ydD4nLCAnUG9ydCB0byBydW4gdGhlIHNlcnZlciBvbicsICczMzMzJylcbiAgLm9wdGlvbignLUgsIC0taG9zdCA8aG9zdD4nLCAnSG9zdCB0byBiaW5kIHRoZSBzZXJ2ZXIgdG8nLCAnbG9jYWxob3N0JylcbiAgLm9wdGlvbignLW8sIC0tb3BlbicsICdPcGVuIGJyb3dzZXIgYXV0b21hdGljYWxseScsIHRydWUpXG4gIC5vcHRpb24oJy0tbm8tb3BlbicsICdEbyBub3Qgb3BlbiBicm93c2VyIGF1dG9tYXRpY2FsbHknKVxuICAuYWN0aW9uKGRldik7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2J1aWxkJylcbiAgLmRlc2NyaXB0aW9uKCdCdWlsZCBkb2N1bWVudGF0aW9uIGZvciBwcm9kdWN0aW9uJylcbiAgLm9wdGlvbignLW8sIC0tb3V0cHV0IDxkaXI+JywgJ091dHB1dCBkaXJlY3RvcnknLCAnZGlzdCcpXG4gIC5hY3Rpb24oYnVpbGQpO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdzdGFydCcpXG4gIC5kZXNjcmlwdGlvbignU3RhcnQgcHJvZHVjdGlvbiBzZXJ2ZXInKVxuICAub3B0aW9uKCctcCwgLS1wb3J0IDxwb3J0PicsICdQb3J0IHRvIHJ1biB0aGUgc2VydmVyIG9uJywgJzMwMDAnKVxuICAuYWN0aW9uKHN0YXJ0KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnY2hlY2snKVxuICAuZGVzY3JpcHRpb24oJ1ZhbGlkYXRlIGRvY3MuanNvbiBhbmQgTURYIGZpbGVzJylcbiAgLmFjdGlvbihjaGVjayk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2FpJylcbiAgLmRlc2NyaXB0aW9uKCdTZXQgdXAgb3IgdXBkYXRlIEFJIGFnZW50IGNvbmZpZ3VyYXRpb24gKENsYXVkZSBDb2RlIHNraWxscywgQ3Vyc29yIHJ1bGVzKScpXG4gIC5vcHRpb24oJy10LCAtLXRvb2wgPHRvb2w+JywgJ0FJIHRvb2wgdG8gY29uZmlndXJlIChjbGF1ZGUsIGN1cnNvciwgYm90aCknKVxuICAub3B0aW9uKCctLXVwZGF0ZScsICdVcGRhdGUgZXhpc3Rpbmcgc2tpbGxzL3J1bGVzIHRvIGxhdGVzdCB2ZXJzaW9uJylcbiAgLmFjdGlvbihhaSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2RlcGxveScpXG4gIC5kZXNjcmlwdGlvbignRGVwbG95IGRvY3VtZW50YXRpb24gdG8gRGV2RG9jIHBsYXRmb3JtJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwgKGRlZmF1bHQ6IGh0dHBzOi8vZGV2ZG9jLnNoKScpXG4gIC5vcHRpb24oJy1rLCAtLWFwaS1rZXkgPGtleT4nLCAnQVBJIGtleSBmb3IgYXV0aGVudGljYXRpb24nKVxuICAuYWN0aW9uKGRlcGxveSk7XG5cbi8vIEtleXMgbWFuYWdlbWVudFxuY29uc3Qga2V5c0NtZCA9IHByb2dyYW1cbiAgLmNvbW1hbmQoJ2tleXMnKVxuICAuZGVzY3JpcHRpb24oJ01hbmFnZSBBUEkga2V5cyBmb3IgeW91ciBwcm9qZWN0Jyk7XG5cbmtleXNDbWRcbiAgLmNvbW1hbmQoJ2xpc3QnKVxuICAuZGVzY3JpcHRpb24oJ1Nob3cgY3VycmVudCBBUEkga2V5IGluZm8nKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCcpXG4gIC5hY3Rpb24obGlzdEtleXMpO1xuXG5rZXlzQ21kXG4gIC5jb21tYW5kKCdyZWdlbmVyYXRlJylcbiAgLmRlc2NyaXB0aW9uKCdHZW5lcmF0ZSBhIG5ldyBBUEkga2V5IChpbnZhbGlkYXRlcyB0aGUgb2xkIG9uZSknKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCcpXG4gIC5hY3Rpb24ocmVnZW5lcmF0ZUtleSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3dob2FtaScpXG4gIC5kZXNjcmlwdGlvbignU2hvdyBjdXJyZW50IHByb2plY3QgaW5mb3JtYXRpb24nKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCcpXG4gIC5hY3Rpb24od2hvYW1pKTtcblxuLy8gQXNzZXRzIG1hbmFnZW1lbnRcbmNvbnN0IGFzc2V0c0NtZCA9IHByb2dyYW1cbiAgLmNvbW1hbmQoJ2Fzc2V0cycpXG4gIC5kZXNjcmlwdGlvbignTWFuYWdlIHByb2plY3QgYXNzZXRzIChpbWFnZXMsIGZpbGVzKScpO1xuXG5hc3NldHNDbWRcbiAgLmNvbW1hbmQoJ3VwbG9hZCA8ZmlsZXMuLi4+JylcbiAgLmRlc2NyaXB0aW9uKCdVcGxvYWQgYXNzZXRzIHRvIHN0b3JhZ2UgKG1heCAyNU1CIHBlciBmaWxlKScpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLm9wdGlvbignLWssIC0tYXBpLWtleSA8a2V5PicsICdBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicpXG4gIC5hY3Rpb24odXBsb2FkKTtcblxuYXNzZXRzQ21kXG4gIC5jb21tYW5kKCdsaXN0JylcbiAgLmRlc2NyaXB0aW9uKCdMaXN0IHVwbG9hZGVkIGFzc2V0cycpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLm9wdGlvbignLWssIC0tYXBpLWtleSA8a2V5PicsICdBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicpXG4gIC5hY3Rpb24obGlzdEFzc2V0cyk7XG5cbi8vIFNob3J0Y3V0IGZvciB1cGxvYWRcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3VwbG9hZCA8ZmlsZXMuLi4+JylcbiAgLmRlc2NyaXB0aW9uKCdVcGxvYWQgYXNzZXRzIHRvIHN0b3JhZ2UgKHNob3J0Y3V0IGZvciBcImRldmRvYyBhc3NldHMgdXBsb2FkXCIpJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwnKVxuICAub3B0aW9uKCctaywgLS1hcGkta2V5IDxrZXk+JywgJ0FQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uJylcbiAgLmFjdGlvbih1cGxvYWQpO1xuXG4vLyBEb21haW4gbWFuYWdlbWVudCAtIGN1c3RvbSBkb21haW5zIChvbmUgcGVyIHByb2plY3QsIGZyZWUpXG5jb25zdCBkb21haW5DbWQgPSBwcm9ncmFtXG4gIC5jb21tYW5kKCdkb21haW4nKVxuICAuZGVzY3JpcHRpb24oJ01hbmFnZSBjdXN0b20gZG9tYWluIGZvciB5b3VyIGRvY3VtZW50YXRpb24nKTtcblxuZG9tYWluQ21kXG4gIC5jb21tYW5kKCdhZGQgPGN1c3RvbS1kb21haW4+JylcbiAgLmRlc2NyaXB0aW9uKCdBZGQgYSBjdXN0b20gZG9tYWluIChlLmcuLCBkb2NzLmV4YW1wbGUuY29tKScpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLm9wdGlvbignLWssIC0tYXBpLWtleSA8a2V5PicsICdBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicpXG4gIC5hY3Rpb24oZG9tYWluQWRkKTtcblxuZG9tYWluQ21kXG4gIC5jb21tYW5kKCdzdGF0dXMnKVxuICAuZGVzY3JpcHRpb24oJ0NoZWNrIGN1c3RvbSBkb21haW4gc3RhdHVzIGFuZCBETlMgY29uZmlndXJhdGlvbicpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLm9wdGlvbignLWssIC0tYXBpLWtleSA8a2V5PicsICdBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicpXG4gIC5hY3Rpb24oZG9tYWluU3RhdHVzKTtcblxuZG9tYWluQ21kXG4gIC5jb21tYW5kKCd2ZXJpZnknKVxuICAuZGVzY3JpcHRpb24oJ1ZlcmlmeSBETlMgY29uZmlndXJhdGlvbiBmb3IgeW91ciBjdXN0b20gZG9tYWluJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwnKVxuICAub3B0aW9uKCctaywgLS1hcGkta2V5IDxrZXk+JywgJ0FQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uJylcbiAgLmFjdGlvbihkb21haW5WZXJpZnkpO1xuXG5kb21haW5DbWRcbiAgLmNvbW1hbmQoJ3JlbW92ZSBbY3VzdG9tLWRvbWFpbl0nKVxuICAuZGVzY3JpcHRpb24oJ1JlbW92ZSBjdXN0b20gZG9tYWluIGZyb20gcHJvamVjdCcpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLm9wdGlvbignLWssIC0tYXBpLWtleSA8a2V5PicsICdBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicpXG4gIC5hY3Rpb24oZG9tYWluUmVtb3ZlKTtcblxucHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuIl19
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQW9DO0FBQ3BDLDhDQUEyQztBQUMzQywwQ0FBdUM7QUFDdkMsd0NBQXFDO0FBQ3JDLDRDQUF5QztBQUN6Qyw0Q0FBeUM7QUFDekMsNENBQXlDO0FBQ3pDLDhDQUEyQztBQUMzQywwQ0FBMEQ7QUFDMUQsOENBQTJDO0FBQzNDLDhDQUF1RDtBQUN2RCxzQ0FBbUM7QUFDbkMsOENBQXdGO0FBQ3hGLHdDQUE0RTtBQUU1RSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUVsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQztLQUNkLFdBQVcsQ0FBQyx3Q0FBd0MsQ0FBQztLQUNyRCxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRWhDLE9BQU87S0FDSixPQUFPLENBQUMsNEJBQTRCLENBQUM7S0FDckMsV0FBVyxDQUFDLHdDQUF3QyxDQUFDO0tBQ3JELE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSwyQ0FBMkMsQ0FBQztLQUM1RSxNQUFNLENBQUMsdUJBQXVCLEVBQUUsdUNBQXVDLENBQUM7S0FDeEUsTUFBTSxDQUFDLDZCQUE2QixFQUFFLG1EQUFtRCxDQUFDO0tBQzFGLE1BQU0sQ0FBQyxVQUFVLEVBQUUseUJBQXlCLENBQUM7S0FDN0MsTUFBTSxDQUFDLGNBQWMsRUFBRSw4QkFBOEIsQ0FBQztLQUN0RCxNQUFNLENBQUMsaUJBQWlCLEVBQUUsc0NBQXNDLENBQUM7S0FDakUsTUFBTSxDQUFDLGVBQU0sQ0FBQyxDQUFDO0FBRWxCLE9BQU87S0FDSixPQUFPLENBQUMsTUFBTSxDQUFDO0tBQ2YsV0FBVyxDQUFDLDRDQUE0QyxDQUFDO0tBQ3pELE1BQU0sQ0FBQyxtQkFB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TUFBTSxDQUFDLG9CQUFvQixFQUFFLDJCQUEyQixDQUFDO0tBQ3pELE1BQU0sQ0FBQyxpQkFBVyxDQUFDLENBQUM7QUFFdkIsTUFBTTtLQUNILE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztLQUMxQixXQUFXLENBQUMsZ0NBQWdDLENBQUM7S0FDN0MsTUFBTSxDQUFDLGlCQUFXLENBQUMsQ0FBQztBQUV2QixNQUFNO0tBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUNmLFdBQVcsQ0FBQyw0Q0FBNEMsQ0FBQztLQUN6RCxNQUFNLENBQUMsYUFBTyxDQUFDLENBQUM7QUFFbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJy4vY29tbWFuZHMvY3JlYXRlJztcbmltcG9ydCB7IGluaXQgfSBmcm9tICcuL2NvbW1hbmRzL2luaXQnO1xuaW1wb3J0IHsgZGV2IH0gZnJvbSAnLi9jb21tYW5kcy9kZXYnO1xuaW1wb3J0IHsgYnVpbGQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkJztcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydCc7XG5pbXBvcnQgeyBjaGVjayB9IGZyb20gJy4vY29tbWFuZHMvY2hlY2snO1xuaW1wb3J0IHsgZGVwbG95IH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3knO1xuaW1wb3J0IHsgbGlzdEtleXMsIHJlZ2VuZXJhdGVLZXkgfSBmcm9tICcuL2NvbW1hbmRzL2tleXMnO1xuaW1wb3J0IHsgd2hvYW1pIH0gZnJvbSAnLi9jb21tYW5kcy93aG9hbWknO1xuaW1wb3J0IHsgdXBsb2FkLCBsaXN0QXNzZXRzIH0gZnJvbSAnLi9jb21tYW5kcy91cGxvYWQnO1xuaW1wb3J0IHsgYWkgfSBmcm9tICcuL2NvbW1hbmRzL2FpJztcbmltcG9ydCB7IGRvbWFpbkFkZCwgZG9tYWluU3RhdHVzLCBkb21haW5WZXJpZnksIGRvbWFpblJlbW92ZSB9IGZyb20gJy4vY29tbWFuZHMvZG9tYWluJztcbmltcG9ydCB7IHNka0luaXQsIHNka0dlbmVyYXRlLCBzZGtWYWxpZGF0ZSwgc2RrTGlzdCB9IGZyb20gJy4vY29tbWFuZHMvc2RrJztcblxuY29uc3QgcGFja2FnZUpzb24gPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKTtcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2RldmRvYycpXG4gIC5kZXNjcmlwdGlvbignRG9jdW1lbnRhdGlvbiBmcmFtZXdvcmsgZm9yIGRldmVsb3BlcnMnKVxuICAudmVyc2lvbihwYWNrYWdlSnNvbi52ZXJzaW9uKTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnY3JlYXRlIFtwcm9qZWN0LWRpcmVjdG9yeV0nKVxuICAuZGVzY3JpcHRpb24oJ0NyZWF0ZSBhIG5ldyBEZXZEb2MgZG9jdW1lbnRhdGlvbiBzaXRlJylcbiAgLm9wdGlvbignLXQsIC0tdGVtcGxhdGUgPHR5cGU+JywgJ1RlbXBsYXRlIHRvIHVzZSAoYmFzaWMsIG9wZW5hcGksIGdyYXBocWwpJylcbiAgLm9wdGlvbignLWQsIC0tZG9jLXR5cGUgPHR5cGU+JywgJ0RvY3VtZW50YXRpb24gdHlwZSAocHVibGljLCBpbnRlcm5hbCknKVxuICAub3B0aW9uKCctcywgLS1zdWJkb21haW4gPHN1YmRvbWFpbj4nLCAnU3ViZG9tYWluIGZvciB5b3VyIGRvY3MgKGUuZy4sIG15LWRvY3MuZGV2ZG9jLnNoKScpXG4gIC5vcHRpb24oJy0tbm8tZ2l0JywgJ1NraXAgZ2l0IGluaXRpYWxpemF0aW9uJylcbiAgLm9wdGlvbignLS1uby1pbnN0YWxsJywgJ1NraXAgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMnKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9kZXZkb2Muc2gpJylcbiAgLmFjdGlvbihjcmVhdGUpO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdpbml0JylcbiAgLmRlc2NyaXB0aW9uKCdJbml0aWFsaXplL3JlZ2lzdGVyIHByb2plY3Qgd2l0aCBCcmFpbmZpc2gnKVxuICAub3B0aW9uKCctcywgLS1zbHVnIDxzbHVnPicsICdQcm9qZWN0IHNsdWcnKVxuICAub3B0aW9uKCctLXN1YmRvbWFpbiA8c3ViZG9tYWluPicsICdTdWJkb21haW4gZm9yIHlvdXIgZG9jcyAoZS5nLiwgbXktZG9jcy5kZXZkb2Muc2gpJylcbiAgLm9wdGlvbignLWYsIC0tZm9yY2UnLCAnT3ZlcndyaXRlIGV4aXN0aW5nIC5kZXZkb2MuanNvbicpXG4gIC5vcHRpb24oJy0tYWkgW3Rvb2xdJywgJ1NldCB1cCBBSSBhZ2VudHMgKGNsYXVkZSwgY3Vyc29yLCBib3RoLCBvciBqdXN0IC0tYWkgdG8gY2hvb3NlKScpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMIChkZWZhdWx0OiBodHRwczovL2RldmRvYy5zaCknKVxuICAuYWN0aW9uKGluaXQpO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdkZXYnKVxuICAuZGVzY3JpcHRpb24oJ1N0YXJ0IGRldmVsb3BtZW50IHNlcnZlciB3aXRoIGhvdCByZWxvYWQnKVxuICAub3B0aW9uKCctcCwgLS1wb3J0IDxwb3J0PicsICdQb3J0IHRvIHJ1biB0aGUgc2VydmVyIG9uJywgJzMzMzMnKVxuICAub3B0aW9uKCctSCwgLS1ob3N0IDxob3N0PicsICdIb3N0IHRvIGJpbmQgdGhlIHNlcnZlciB0bycsICdsb2NhbGhvc3QnKVxuICAub3B0aW9uKCctbywgLS1vcGVuJywgJ09wZW4gYnJvd3NlciBhdXRvbWF0aWNhbGx5JywgdHJ1ZSlcbiAgLm9wdGlvbignLS1uby1vcGVuJywgJ0RvIG5vdCBvcGVuIGJyb3dzZXIgYXV0b21hdGljYWxseScpXG4gIC5hY3Rpb24oZGV2KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnYnVpbGQnKVxuICAuZGVzY3JpcHRpb24oJ0J1aWxkIGRvY3VtZW50YXRpb24gZm9yIHByb2R1Y3Rpb24nKVxuICAub3B0aW9uKCctbywgLS1vdXRwdXQgPGRpcj4nLCAnT3V0cHV0IGRpcmVjdG9yeScsICdkaXN0JylcbiAgLmFjdGlvbihidWlsZCk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3N0YXJ0JylcbiAgLmRlc2NyaXB0aW9uKCdTdGFydCBwcm9kdWN0aW9uIHNlcnZlcicpXG4gIC5vcHRpb24oJy1wLCAtLXBvcnQgPHBvcnQ+JywgJ1BvcnQgdG8gcnVuIHRoZSBzZXJ2ZXIgb24nLCAnMzAwMCcpXG4gIC5hY3Rpb24oc3RhcnQpO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdjaGVjaycpXG4gIC5kZXNjcmlwdGlvbignVmFsaWRhdGUgZG9jcy5qc29uIGFuZCBNRFggZmlsZXMnKVxuICAuYWN0aW9uKGNoZWNrKTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnYWknKVxuICAuZGVzY3JpcHRpb24oJ1NldCB1cCBvciB1cGRhdGUgQUkgYWdlbnQgY29uZmlndXJhdGlvbiAoQ2xhdWRlIENvZGUgc2tpbGxzLCBDdXJzb3IgcnVsZXMpJylcbiAgLm9wdGlvbignLXQsIC0tdG9vbCA8dG9vbD4nLCAnQUkgdG9vbCB0byBjb25maWd1cmUgKGNsYXVkZSwgY3Vyc29yLCBib3RoKScpXG4gIC5vcHRpb24oJy0tdXBkYXRlJywgJ1VwZGF0ZSBleGlzdGluZyBza2lsbHMvcnVsZXMgdG8gbGF0ZXN0IHZlcnNpb24nKVxuICAuYWN0aW9uKGFpKTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnZGVwbG95JylcbiAgLmRlc2NyaXB0aW9uKCdEZXBsb3kgZG9jdW1lbnRhdGlvbiB0byBEZXZEb2MgcGxhdGZvcm0nKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9kZXZkb2Muc2gpJylcbiAgLm9wdGlvbignLWssIC0tYXBpLWtleSA8a2V5PicsICdBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicpXG4gIC5hY3Rpb24oZGVwbG95KTtcblxuLy8gS2V5cyBtYW5hZ2VtZW50XG5jb25zdCBrZXlzQ21kID0gcHJvZ3JhbVxuICAuY29tbWFuZCgna2V5cycpXG4gIC5kZXNjcmlwdGlvbignTWFuYWdlIEFQSSBrZXlzIGZvciB5b3VyIHByb2plY3QnKTtcblxua2V5c0NtZFxuICAuY29tbWFuZCgnbGlzdCcpXG4gIC5kZXNjcmlwdGlvbignU2hvdyBjdXJyZW50IEFQSSBrZXkgaW5mbycpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLmFjdGlvbihsaXN0S2V5cyk7XG5cbmtleXNDbWRcbiAgLmNvbW1hbmQoJ3JlZ2VuZXJhdGUnKVxuICAuZGVzY3JpcHRpb24oJ0dlbmVyYXRlIGEgbmV3IEFQSSBrZXkgKGludmFsaWRhdGVzIHRoZSBvbGQgb25lKScpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLmFjdGlvbihyZWdlbmVyYXRlS2V5KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnd2hvYW1pJylcbiAgLmRlc2NyaXB0aW9uKCdTaG93IGN1cnJlbnQgcHJvamVjdCBpbmZvcm1hdGlvbicpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLmFjdGlvbih3aG9hbWkpO1xuXG4vLyBBc3NldHMgbWFuYWdlbWVudFxuY29uc3QgYXNzZXRzQ21kID0gcHJvZ3JhbVxuICAuY29tbWFuZCgnYXNzZXRzJylcbiAgLmRlc2NyaXB0aW9uKCdNYW5hZ2UgcHJvamVjdCBhc3NldHMgKGltYWdlcywgZmlsZXMpJyk7XG5cbmFzc2V0c0NtZFxuICAuY29tbWFuZCgndXBsb2FkIDxmaWxlcy4uLj4nKVxuICAuZGVzY3JpcHRpb24oJ1VwbG9hZCBhc3NldHMgdG8gc3RvcmFnZSAobWF4IDI1TUIgcGVyIGZpbGUpJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwnKVxuICAub3B0aW9uKCctaywgLS1hcGkta2V5IDxrZXk+JywgJ0FQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uJylcbiAgLmFjdGlvbih1cGxvYWQpO1xuXG5hc3NldHNDbWRcbiAgLmNvbW1hbmQoJ2xpc3QnKVxuICAuZGVzY3JpcHRpb24oJ0xpc3QgdXBsb2FkZWQgYXNzZXRzJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwnKVxuICAub3B0aW9uKCctaywgLS1hcGkta2V5IDxrZXk+JywgJ0FQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uJylcbiAgLmFjdGlvbihsaXN0QXNzZXRzKTtcblxuLy8gU2hvcnRjdXQgZm9yIHVwbG9hZFxucHJvZ3JhbVxuICAuY29tbWFuZCgndXBsb2FkIDxmaWxlcy4uLj4nKVxuICAuZGVzY3JpcHRpb24oJ1VwbG9hZCBhc3NldHMgdG8gc3RvcmFnZSAoc2hvcnRjdXQgZm9yIFwiZGV2ZG9jIGFzc2V0cyB1cGxvYWRcIiknKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCcpXG4gIC5vcHRpb24oJy1rLCAtLWFwaS1rZXkgPGtleT4nLCAnQVBJIGtleSBmb3IgYXV0aGVudGljYXRpb24nKVxuICAuYWN0aW9uKHVwbG9hZCk7XG5cbi8vIERvbWFpbiBtYW5hZ2VtZW50IC0gY3VzdG9tIGRvbWFpbnMgKG9uZSBwZXIgcHJvamVjdCwgZnJlZSlcbmNvbnN0IGRvbWFpbkNtZCA9IHByb2dyYW1cbiAgLmNvbW1hbmQoJ2RvbWFpbicpXG4gIC5kZXNjcmlwdGlvbignTWFuYWdlIGN1c3RvbSBkb21haW4gZm9yIHlvdXIgZG9jdW1lbnRhdGlvbicpO1xuXG5kb21haW5DbWRcbiAgLmNvbW1hbmQoJ2FkZCA8Y3VzdG9tLWRvbWFpbj4nKVxuICAuZGVzY3JpcHRpb24oJ0FkZCBhIGN1c3RvbSBkb21haW4gKGUuZy4sIGRvY3MuZXhhbXBsZS5jb20pJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwnKVxuICAub3B0aW9uKCctaywgLS1hcGkta2V5IDxrZXk+JywgJ0FQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uJylcbiAgLmFjdGlvbihkb21haW5BZGQpO1xuXG5kb21haW5DbWRcbiAgLmNvbW1hbmQoJ3N0YXR1cycpXG4gIC5kZXNjcmlwdGlvbignQ2hlY2sgY3VzdG9tIGRvbWFpbiBzdGF0dXMgYW5kIEROUyBjb25maWd1cmF0aW9uJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwnKVxuICAub3B0aW9uKCctaywgLS1hcGkta2V5IDxrZXk+JywgJ0FQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uJylcbiAgLmFjdGlvbihkb21haW5TdGF0dXMpO1xuXG5kb21haW5DbWRcbiAgLmNvbW1hbmQoJ3ZlcmlmeScpXG4gIC5kZXNjcmlwdGlvbignVmVyaWZ5IEROUyBjb25maWd1cmF0aW9uIGZvciB5b3VyIGN1c3RvbSBkb21haW4nKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCcpXG4gIC5vcHRpb24oJy1rLCAtLWFwaS1rZXkgPGtleT4nLCAnQVBJIGtleSBmb3IgYXV0aGVudGljYXRpb24nKVxuICAuYWN0aW9uKGRvbWFpblZlcmlmeSk7XG5cbmRvbWFpbkNtZFxuICAuY29tbWFuZCgncmVtb3ZlIFtjdXN0b20tZG9tYWluXScpXG4gIC5kZXNjcmlwdGlvbignUmVtb3ZlIGN1c3RvbSBkb21haW4gZnJvbSBwcm9qZWN0JylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwnKVxuICAub3B0aW9uKCctaywgLS1hcGkta2V5IDxrZXk+JywgJ0FQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uJylcbiAgLmFjdGlvbihkb21haW5SZW1vdmUpO1xuXG4vLyBTREsgZ2VuZXJhdGlvblxuY29uc3Qgc2RrQ21kID0gcHJvZ3JhbVxuICAuY29tbWFuZCgnc2RrJylcbiAgLmRlc2NyaXB0aW9uKCdHZW5lcmF0ZSBjbGllbnQgU0RLcyBmcm9tIE9wZW5BUEkgc3BlY2lmaWNhdGlvbicpO1xuXG5zZGtDbWRcbiAgLmNvbW1hbmQoJ2luaXQnKVxuICAuZGVzY3JpcHRpb24oJ0luaXRpYWxpemUgU0RLIGdlbmVyYXRpb24gY29uZmlndXJhdGlvbicpXG4gIC5vcHRpb24oJy1vLCAtLW9wZW5hcGkgPHBhdGg+JywgJ1BhdGggdG8gT3BlbkFQSSBzcGVjaWZpY2F0aW9uJylcbiAgLm9wdGlvbignLW4sIC0tcGFja2FnZS1uYW1lIDxuYW1lPicsICdCYXNlIHBhY2thZ2UgbmFtZSBmb3IgZ2VuZXJhdGVkIFNES3MnKVxuICAub3B0aW9uKCctZiwgLS1mb3JjZScsICdPdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlndXJhdGlvbicpXG4gIC5hY3Rpb24oc2RrSW5pdCk7XG5cbnNka0NtZFxuICAuY29tbWFuZCgnZ2VuZXJhdGUnKVxuICAuZGVzY3JpcHRpb24oJ0dlbmVyYXRlIFNES3MgZm9yIGNvbmZpZ3VyZWQgbGFuZ3VhZ2VzJylcbiAgLm9wdGlvbignLWwsIC0tbGFuZyA8bGFuZ3VhZ2U+JywgJ0dlbmVyYXRlIG9ubHkgZm9yIHNwZWNpZmljIGxhbmd1YWdlJylcbiAgLm9wdGlvbignLXAsIC0tcHJldmlldycsICdQcmV2aWV3IHdoYXQgd291bGQgYmUgZ2VuZXJhdGVkIHdpdGhvdXQgd3JpdGluZyBmaWxlcycpXG4gIC5vcHRpb24oJy1vLCAtLW91dHB1dCA8ZGlyPicsICdPdmVycmlkZSBvdXRwdXQgZGlyZWN0b3J5JylcbiAgLmFjdGlvbihzZGtHZW5lcmF0ZSk7XG5cbnNka0NtZFxuICAuY29tbWFuZCgndmFsaWRhdGUgW3NwZWNdJylcbiAgLmRlc2NyaXB0aW9uKCdWYWxpZGF0ZSBPcGVuQVBJIHNwZWNpZmljYXRpb24nKVxuICAuYWN0aW9uKHNka1ZhbGlkYXRlKTtcblxuc2RrQ21kXG4gIC5jb21tYW5kKCdsaXN0JylcbiAgLmRlc2NyaXB0aW9uKCdMaXN0IGF2YWlsYWJsZSBnZW5lcmF0b3JzIGFuZCB0aGVpciBzdGF0dXMnKVxuICAuYWN0aW9uKHNka0xpc3QpO1xuXG5wcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG4iXX0=
@@ -0,0 +1,126 @@
1
+ /**
2
+ * SDK Generation Module
3
+ *
4
+ * This module provides functionality for generating client SDKs from OpenAPI specifications.
5
+ * It supports multiple languages using both native generators and OpenAPI Generator.
6
+ */
7
+ /**
8
+ * Supported SDK languages
9
+ */
10
+ export type SDKLanguage = 'typescript' | 'python' | 'go' | 'java' | 'csharp' | 'ruby' | 'php' | 'swift' | 'kotlin' | 'rust';
11
+ /**
12
+ * SDK configuration file (sdk.json)
13
+ */
14
+ export interface SDKConfig {
15
+ openapi: string;
16
+ packageName: string;
17
+ output: string;
18
+ languages: {
19
+ [key in SDKLanguage]?: LanguageConfig;
20
+ };
21
+ }
22
+ /**
23
+ * Language-specific configuration
24
+ */
25
+ export interface LanguageConfig {
26
+ enabled: boolean;
27
+ packageName?: string;
28
+ output?: string;
29
+ additionalOptions?: Record<string, string>;
30
+ }
31
+ /**
32
+ * Generator information
33
+ */
34
+ export interface GeneratorInfo {
35
+ language: SDKLanguage;
36
+ displayName: string;
37
+ native: boolean;
38
+ requiresJava: boolean;
39
+ generatorName?: string;
40
+ }
41
+ /**
42
+ * SDK generation result for a single language
43
+ */
44
+ export interface SDKGenerationResult {
45
+ language: SDKLanguage;
46
+ success: boolean;
47
+ outputPath: string;
48
+ error?: string;
49
+ duration: number;
50
+ }
51
+ /**
52
+ * Overall SDK generation result
53
+ */
54
+ export interface GenerateSDKsResult {
55
+ results: SDKGenerationResult[];
56
+ successCount: number;
57
+ failureCount: number;
58
+ totalDuration: number;
59
+ }
60
+ /**
61
+ * Validation result
62
+ */
63
+ export interface ValidationResult {
64
+ valid: boolean;
65
+ errors: string[];
66
+ warnings: string[];
67
+ }
68
+ /**
69
+ * Options for SDK generation
70
+ */
71
+ export interface GenerateOptions {
72
+ language?: SDKLanguage;
73
+ preview?: boolean;
74
+ outputDir?: string;
75
+ }
76
+ /**
77
+ * Options for SDK config initialization
78
+ */
79
+ export interface InitConfigOptions {
80
+ openapi: string;
81
+ packageName: string;
82
+ languages: SDKLanguage[];
83
+ force?: boolean;
84
+ }
85
+ /**
86
+ * All supported languages
87
+ */
88
+ export declare const SUPPORTED_LANGUAGES: SDKLanguage[];
89
+ /**
90
+ * Load SDK configuration from project directory
91
+ */
92
+ export declare function loadSDKConfig(projectRoot: string): Promise<{
93
+ config: SDKConfig | null;
94
+ error?: string;
95
+ }>;
96
+ /**
97
+ * Initialize SDK configuration
98
+ */
99
+ export declare function initSDKConfig(projectRoot: string, options: InitConfigOptions): Promise<{
100
+ configPath: string;
101
+ config: SDKConfig;
102
+ }>;
103
+ /**
104
+ * Get enabled generators from config
105
+ */
106
+ export declare function getEnabledGenerators(config: SDKConfig): SDKLanguage[];
107
+ /**
108
+ * Get generator information for all languages
109
+ */
110
+ export declare function getGeneratorInfo(): GeneratorInfo[];
111
+ /**
112
+ * Check if a generator is native (doesn't require Java)
113
+ */
114
+ export declare function isNativeGenerator(language: SDKLanguage): boolean;
115
+ /**
116
+ * Resolve OpenAPI spec path relative to project root
117
+ */
118
+ export declare function resolveSpecPath(projectRoot: string, specPath: string): string;
119
+ /**
120
+ * Validate an OpenAPI specification
121
+ */
122
+ export declare function validateSpec(specPath: string): Promise<ValidationResult>;
123
+ /**
124
+ * Generate SDKs for configured languages
125
+ */
126
+ export declare function generateSDKs(projectRoot: string, options?: GenerateOptions): Promise<GenerateSDKsResult>;