runway-cli 0.8.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/README.md +376 -0
- package/dist/commands/deploy.d.ts +12 -0
- package/dist/commands/deploy.js +334 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.js +196 -0
- package/dist/commands/list.d.ts +1 -0
- package/dist/commands/list.js +84 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +117 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +44 -0
- package/dist/services/authService.d.ts +64 -0
- package/dist/services/authService.js +162 -0
- package/dist/services/buildService.d.ts +21 -0
- package/dist/services/buildService.js +180 -0
- package/dist/services/packageService.d.ts +20 -0
- package/dist/services/packageService.js +153 -0
- package/dist/services/projectDetector.d.ts +21 -0
- package/dist/services/projectDetector.js +165 -0
- package/dist/services/uploadService.d.ts +78 -0
- package/dist/services/uploadService.js +222 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.js +4 -0
- package/dist/utils/config.d.ts +19 -0
- package/dist/utils/config.js +102 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.js +38 -0
- package/package.json +51 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.deployCommand = deployCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const projectDetector_1 = require("../services/projectDetector");
|
|
12
|
+
const buildService_1 = require("../services/buildService");
|
|
13
|
+
const packageService_1 = require("../services/packageService");
|
|
14
|
+
const uploadService_1 = require("../services/uploadService");
|
|
15
|
+
const config_1 = require("../utils/config");
|
|
16
|
+
const logger_1 = require("../utils/logger");
|
|
17
|
+
/**
|
|
18
|
+
* Parse a .env file into a Record
|
|
19
|
+
*/
|
|
20
|
+
function parseEnvFile(filePath) {
|
|
21
|
+
const content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
22
|
+
const vars = {};
|
|
23
|
+
for (const line of content.split('\n')) {
|
|
24
|
+
const trimmed = line.trim();
|
|
25
|
+
// Skip empty lines and comments
|
|
26
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
27
|
+
continue;
|
|
28
|
+
const eqIndex = trimmed.indexOf('=');
|
|
29
|
+
if (eqIndex > 0) {
|
|
30
|
+
const key = trimmed.slice(0, eqIndex).trim();
|
|
31
|
+
let value = trimmed.slice(eqIndex + 1).trim();
|
|
32
|
+
// Remove surrounding quotes if present
|
|
33
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
34
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
35
|
+
value = value.slice(1, -1);
|
|
36
|
+
}
|
|
37
|
+
vars[key] = value;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return vars;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Prompt user for manual ENV variable entry
|
|
44
|
+
*/
|
|
45
|
+
async function promptManualEnvVars() {
|
|
46
|
+
const vars = {};
|
|
47
|
+
logger_1.logger.dim('Enter environment variables (empty name to finish):');
|
|
48
|
+
while (true) {
|
|
49
|
+
const { key } = await inquirer_1.default.prompt([
|
|
50
|
+
{
|
|
51
|
+
type: 'input',
|
|
52
|
+
name: 'key',
|
|
53
|
+
message: 'Variable name:',
|
|
54
|
+
},
|
|
55
|
+
]);
|
|
56
|
+
if (!key || !key.trim()) {
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
const { value } = await inquirer_1.default.prompt([
|
|
60
|
+
{
|
|
61
|
+
type: 'input',
|
|
62
|
+
name: 'value',
|
|
63
|
+
message: `Value for ${key}:`,
|
|
64
|
+
},
|
|
65
|
+
]);
|
|
66
|
+
vars[key.toUpperCase().replace(/[^A-Z0-9_]/g, '')] = value;
|
|
67
|
+
}
|
|
68
|
+
return vars;
|
|
69
|
+
}
|
|
70
|
+
async function deployCommand(options) {
|
|
71
|
+
logger_1.logger.header('Runway Deploy');
|
|
72
|
+
// Check configuration
|
|
73
|
+
if (!(0, config_1.isConfigured)()) {
|
|
74
|
+
logger_1.logger.error('CLI not configured. Run "runway init" first.');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const config = (0, config_1.getConfig)();
|
|
78
|
+
logger_1.logger.dim(`Server: ${config.serverUrl}`);
|
|
79
|
+
logger_1.logger.blank();
|
|
80
|
+
// Detect project
|
|
81
|
+
const spinner = (0, ora_1.default)('Detecting project...').start();
|
|
82
|
+
let detectedProject;
|
|
83
|
+
try {
|
|
84
|
+
detectedProject = await (0, projectDetector_1.detectProject)();
|
|
85
|
+
spinner.succeed(`Detected: ${detectedProject.type} project (${detectedProject.packageManager})`);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
spinner.fail('Failed to detect project');
|
|
89
|
+
logger_1.logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Determine project name
|
|
93
|
+
let projectName = options.name || detectedProject.name;
|
|
94
|
+
// Interactive mode if name not provided
|
|
95
|
+
if (!options.name) {
|
|
96
|
+
const answers = await inquirer_1.default.prompt([
|
|
97
|
+
{
|
|
98
|
+
type: 'input',
|
|
99
|
+
name: 'name',
|
|
100
|
+
message: 'Project name:',
|
|
101
|
+
default: projectName,
|
|
102
|
+
validate: (input) => {
|
|
103
|
+
if (input.length < 2)
|
|
104
|
+
return 'Name must be at least 2 characters';
|
|
105
|
+
if (!/^[a-zA-Z0-9-_]+$/.test(input))
|
|
106
|
+
return 'Name can only contain letters, numbers, hyphens, and underscores';
|
|
107
|
+
return true;
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
111
|
+
projectName = answers.name;
|
|
112
|
+
}
|
|
113
|
+
// Determine project type
|
|
114
|
+
const projectType = options.type || detectedProject.type;
|
|
115
|
+
// Determine build mode
|
|
116
|
+
let buildMode;
|
|
117
|
+
if (options.buildServer) {
|
|
118
|
+
buildMode = 'server';
|
|
119
|
+
}
|
|
120
|
+
else if (options.buildLocal) {
|
|
121
|
+
buildMode = 'local';
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
buildMode = config.defaultBuildMode || 'local';
|
|
125
|
+
}
|
|
126
|
+
logger_1.logger.blank();
|
|
127
|
+
logger_1.logger.info(`Project: ${projectName}`);
|
|
128
|
+
logger_1.logger.info(`Type: ${projectType}`);
|
|
129
|
+
logger_1.logger.info(`Build mode: ${buildMode}`);
|
|
130
|
+
if (options.version) {
|
|
131
|
+
logger_1.logger.info(`Version: ${options.version}`);
|
|
132
|
+
}
|
|
133
|
+
logger_1.logger.blank();
|
|
134
|
+
// Confirm deployment
|
|
135
|
+
const { confirm } = await inquirer_1.default.prompt([
|
|
136
|
+
{
|
|
137
|
+
type: 'confirm',
|
|
138
|
+
name: 'confirm',
|
|
139
|
+
message: 'Proceed with deployment?',
|
|
140
|
+
default: true,
|
|
141
|
+
},
|
|
142
|
+
]);
|
|
143
|
+
if (!confirm) {
|
|
144
|
+
logger_1.logger.warn('Deployment cancelled.');
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
logger_1.logger.blank();
|
|
148
|
+
// ENV source prompt for React/Next local builds
|
|
149
|
+
let envVars = {};
|
|
150
|
+
let envInjected = false;
|
|
151
|
+
let envFilePath = options.envFile;
|
|
152
|
+
if (buildMode === 'local' && (projectType === 'react' || projectType === 'next')) {
|
|
153
|
+
const defaultEnvPath = path_1.default.join(process.cwd(), '.env');
|
|
154
|
+
const hasEnvFile = fs_1.default.existsSync(defaultEnvPath);
|
|
155
|
+
if (!options.skipEnvPrompt && !options.envFile) {
|
|
156
|
+
const envChoices = [
|
|
157
|
+
...(hasEnvFile ? [{ name: 'Use .env file', value: 'file' }] : []),
|
|
158
|
+
{ name: 'Enter variables manually', value: 'manual' },
|
|
159
|
+
{ name: 'Skip (ENV will be locked after deploy)', value: 'skip' },
|
|
160
|
+
];
|
|
161
|
+
const { envSource } = await inquirer_1.default.prompt([
|
|
162
|
+
{
|
|
163
|
+
type: 'list',
|
|
164
|
+
name: 'envSource',
|
|
165
|
+
message: 'Environment variables for build:',
|
|
166
|
+
choices: envChoices,
|
|
167
|
+
default: hasEnvFile ? 'file' : 'skip',
|
|
168
|
+
},
|
|
169
|
+
]);
|
|
170
|
+
if (envSource === 'file') {
|
|
171
|
+
envFilePath = defaultEnvPath;
|
|
172
|
+
envVars = parseEnvFile(defaultEnvPath);
|
|
173
|
+
envInjected = Object.keys(envVars).length > 0;
|
|
174
|
+
logger_1.logger.success(`Loaded ${Object.keys(envVars).length} variables from .env`);
|
|
175
|
+
}
|
|
176
|
+
else if (envSource === 'manual') {
|
|
177
|
+
envVars = await promptManualEnvVars();
|
|
178
|
+
envInjected = Object.keys(envVars).length > 0;
|
|
179
|
+
if (envInjected) {
|
|
180
|
+
logger_1.logger.success(`Added ${Object.keys(envVars).length} environment variables`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
logger_1.logger.warn('Skipping ENV injection - environment variables will be locked after deployment.');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (options.envFile && fs_1.default.existsSync(options.envFile)) {
|
|
188
|
+
envVars = parseEnvFile(options.envFile);
|
|
189
|
+
envInjected = Object.keys(envVars).length > 0;
|
|
190
|
+
logger_1.logger.success(`Loaded ${Object.keys(envVars).length} variables from ${options.envFile}`);
|
|
191
|
+
}
|
|
192
|
+
logger_1.logger.blank();
|
|
193
|
+
}
|
|
194
|
+
// Step 1: Build (for local-build mode)
|
|
195
|
+
let buildOutputDir = detectedProject.buildOutputDir;
|
|
196
|
+
if (buildMode === 'local') {
|
|
197
|
+
logger_1.logger.step(1, 4, 'Building project...');
|
|
198
|
+
const buildResult = await buildService_1.buildService.build({
|
|
199
|
+
projectPath: process.cwd(),
|
|
200
|
+
projectType,
|
|
201
|
+
projectName,
|
|
202
|
+
packageManager: detectedProject.packageManager,
|
|
203
|
+
envFile: envFilePath,
|
|
204
|
+
});
|
|
205
|
+
if (!buildResult.success) {
|
|
206
|
+
logger_1.logger.error(`Build failed: ${buildResult.error}`);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
buildOutputDir = buildResult.outputDir;
|
|
210
|
+
logger_1.logger.success(`Build completed in ${(buildResult.duration / 1000).toFixed(1)}s`);
|
|
211
|
+
logger_1.logger.blank();
|
|
212
|
+
}
|
|
213
|
+
// Step 2: Package
|
|
214
|
+
const packageStep = buildMode === 'local' ? 2 : 1;
|
|
215
|
+
const totalSteps = buildMode === 'local' ? 4 : 3;
|
|
216
|
+
logger_1.logger.step(packageStep, totalSteps, 'Creating deployment package...');
|
|
217
|
+
let packageResult;
|
|
218
|
+
try {
|
|
219
|
+
packageResult = await packageService_1.packageService.package({
|
|
220
|
+
projectPath: process.cwd(),
|
|
221
|
+
projectType,
|
|
222
|
+
buildOutputDir,
|
|
223
|
+
includeSource: buildMode === 'server',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
logger_1.logger.error(`Packaging failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
logger_1.logger.blank();
|
|
231
|
+
// Step 3: Analyze & Upload
|
|
232
|
+
logger_1.logger.step(packageStep + 1, totalSteps, 'Analyzing and uploading to server...');
|
|
233
|
+
let uploadService;
|
|
234
|
+
try {
|
|
235
|
+
uploadService = (0, uploadService_1.createUploadService)();
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
logger_1.logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
239
|
+
packageService_1.packageService.cleanup(packageResult.zipPath);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
// Analyze package first (for server-build mode to get warnings)
|
|
243
|
+
let confirmServerBuild = false;
|
|
244
|
+
if (buildMode === 'server') {
|
|
245
|
+
const analyzeResult = await uploadService.analyzePackage(packageResult.zipPath, projectType);
|
|
246
|
+
if (analyzeResult.success && analyzeResult.analysis) {
|
|
247
|
+
const analysis = analyzeResult.analysis;
|
|
248
|
+
// Display warnings
|
|
249
|
+
if (analysis.warnings && analysis.warnings.length > 0) {
|
|
250
|
+
logger_1.logger.blank();
|
|
251
|
+
logger_1.logger.warn('Server Analysis:');
|
|
252
|
+
for (const warning of analysis.warnings) {
|
|
253
|
+
const prefix = warning.level === 'critical' ? '❌' : warning.level === 'warning' ? '⚠️' : 'ℹ️';
|
|
254
|
+
logger_1.logger.dim(` ${prefix} ${warning.message}`);
|
|
255
|
+
}
|
|
256
|
+
logger_1.logger.blank();
|
|
257
|
+
}
|
|
258
|
+
// Handle confirmation for server-side build
|
|
259
|
+
if (analysis.requiresConfirmation) {
|
|
260
|
+
const { confirmBuild } = await inquirer_1.default.prompt([
|
|
261
|
+
{
|
|
262
|
+
type: 'confirm',
|
|
263
|
+
name: 'confirmBuild',
|
|
264
|
+
message: `${analysis.confirmationReason || 'Server-side build required'}. This may consume significant resources. Continue?`,
|
|
265
|
+
default: true,
|
|
266
|
+
},
|
|
267
|
+
]);
|
|
268
|
+
if (!confirmBuild) {
|
|
269
|
+
logger_1.logger.warn('Deployment cancelled by user.');
|
|
270
|
+
packageService_1.packageService.cleanup(packageResult.zipPath);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
confirmServerBuild = true;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const uploadResult = await uploadService.upload({
|
|
278
|
+
zipPath: packageResult.zipPath,
|
|
279
|
+
projectName,
|
|
280
|
+
projectType,
|
|
281
|
+
version: options.version,
|
|
282
|
+
buildMode,
|
|
283
|
+
confirmServerBuild,
|
|
284
|
+
// ENV mutability tracking
|
|
285
|
+
deploymentSource: 'cli',
|
|
286
|
+
envInjected,
|
|
287
|
+
});
|
|
288
|
+
// Cleanup zip file
|
|
289
|
+
packageService_1.packageService.cleanup(packageResult.zipPath);
|
|
290
|
+
if (!uploadResult.success) {
|
|
291
|
+
logger_1.logger.error(`Upload failed: ${uploadResult.error}`);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
logger_1.logger.success('Upload complete');
|
|
295
|
+
logger_1.logger.blank();
|
|
296
|
+
// Step 4: Wait for deployment (if deployment ID available)
|
|
297
|
+
if (uploadResult.deploymentId) {
|
|
298
|
+
logger_1.logger.step(packageStep + 2, totalSteps, 'Waiting for deployment to complete...');
|
|
299
|
+
try {
|
|
300
|
+
const finalStatus = await uploadService.pollDeploymentStatus(uploadResult.deploymentId, (status) => {
|
|
301
|
+
if (status.progress !== undefined) {
|
|
302
|
+
process.stdout.write(`\r Progress: ${status.progress}%`);
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
process.stdout.write('\n');
|
|
306
|
+
if (finalStatus.status === 'success') {
|
|
307
|
+
logger_1.logger.blank();
|
|
308
|
+
logger_1.logger.success('Deployment successful!');
|
|
309
|
+
const safeName = projectName.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
310
|
+
logger_1.logger.blank();
|
|
311
|
+
logger_1.logger.info(`Your app is available at: ${config.serverUrl}/app/${safeName}`);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
logger_1.logger.error(`Deployment failed: ${finalStatus.error || 'Unknown error'}`);
|
|
315
|
+
if (finalStatus.logs) {
|
|
316
|
+
logger_1.logger.blank();
|
|
317
|
+
logger_1.logger.dim('Logs:');
|
|
318
|
+
console.log(finalStatus.logs);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
logger_1.logger.warn('Could not track deployment status');
|
|
324
|
+
logger_1.logger.dim('Check the web UI for deployment status');
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
logger_1.logger.blank();
|
|
329
|
+
logger_1.logger.success('Upload successful!');
|
|
330
|
+
logger_1.logger.dim('Deployment is being processed. Check the web UI for status.');
|
|
331
|
+
}
|
|
332
|
+
logger_1.logger.blank();
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2RlcGxveS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXFGQSxzQ0F5U0M7QUE5WEQsd0RBQWdDO0FBQ2hDLDhDQUFzQjtBQUN0Qiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBRXhCLGlFQUE0RDtBQUM1RCwyREFBd0Q7QUFDeEQsK0RBQTREO0FBQzVELDZEQUFnRTtBQUNoRSw0Q0FBMEQ7QUFDMUQsNENBQXlDO0FBWXpDOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsUUFBZ0I7SUFDcEMsTUFBTSxPQUFPLEdBQUcsWUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQTJCLEVBQUUsQ0FBQztJQUV4QyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFBRSxTQUFTO1FBRWxELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0MsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FB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QUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdEUsZUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLGVBQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLE1BQU0sQ0FBQyxTQUFTLFFBQVEsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMvRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sZUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsV0FBVyxDQUFDLEtBQUssSUFBSSxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDckIsZUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNmLGVBQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQ2pELGVBQU0sQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixlQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixlQUFNLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDckMsZUFBTSxDQUFDLEdBQUcsQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxlQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbnF1aXJlciBmcm9tICdpbnF1aXJlcic7XG5pbXBvcnQgb3JhIGZyb20gJ29yYSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBQcm9qZWN0VHlwZSwgQnVpbGRNb2RlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGV0ZWN0UHJvamVjdCB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2plY3REZXRlY3Rvcic7XG5pbXBvcnQgeyBidWlsZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9idWlsZFNlcnZpY2UnO1xuaW1wb3J0IHsgcGFja2FnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wYWNrYWdlU2VydmljZSc7XG5pbXBvcnQgeyBjcmVhdGVVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdXBsb2FkU2VydmljZSc7XG5pbXBvcnQgeyBpc0NvbmZpZ3VyZWQsIGdldENvbmZpZyB9IGZyb20gJy4uL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXInO1xuXG5pbnRlcmZhY2UgRGVwbG95T3B0aW9ucyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHR5cGU/OiBQcm9qZWN0VHlwZTtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYnVpbGRMb2NhbD86IGJvb2xlYW47XG4gIGJ1aWxkU2VydmVyPzogYm9vbGVhbjtcbiAgZW52RmlsZT86IHN0cmluZztcbiAgc2tpcEVudlByb21wdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyc2UgYSAuZW52IGZpbGUgaW50byBhIFJlY29yZFxuICovXG5mdW5jdGlvbiBwYXJzZUVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgdmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAvLyBTa2lwIGVtcHR5IGxpbmVzIGFuZCBjb21tZW50c1xuICAgIGlmICghdHJpbW1lZCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoJyMnKSkgY29udGludWU7XG5cbiAgICBjb25zdCBlcUluZGV4ID0gdHJpbW1lZC5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKGVxSW5kZXggPiAwKSB7XG4gICAgICBjb25zdCBrZXkgPSB0cmltbWVkLnNsaWNlKDAsIGVxSW5kZXgpLnRyaW0oKTtcbiAgICAgIGxldCB2YWx1ZSA9IHRyaW1tZWQuc2xpY2UoZXFJbmRleCArIDEpLnRyaW0oKTtcbiAgICAgIC8vIFJlbW92ZSBzdXJyb3VuZGluZyBxdW90ZXMgaWYgcHJlc2VudFxuICAgICAgaWYgKCh2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKSB8fFxuICAgICAgICAgICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIidcIikpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgICAgfVxuICAgICAgdmFyc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhcnM7XG59XG5cbi8qKlxuICogUHJvbXB0IHVzZXIgZm9yIG1hbnVhbCBFTlYgdmFyaWFibGUgZW50cnlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvbXB0TWFudWFsRW52VmFycygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGxvZ2dlci5kaW0oJ0VudGVyIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZW1wdHkgbmFtZSB0byBmaW5pc2gpOicpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgeyBrZXkgfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICdrZXknLFxuICAgICAgICBtZXNzYWdlOiAnVmFyaWFibGUgbmFtZTonLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIGlmICgha2V5IHx8ICFrZXkudHJpbSgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCB7IHZhbHVlIH0gPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICBtZXNzYWdlOiBgVmFsdWUgZm9yICR7a2V5fTpgLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIHZhcnNba2V5LnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvW15BLVowLTlfXS9nLCAnJyldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFycztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcGxveUNvbW1hbmQob3B0aW9uczogRGVwbG95T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2dnZXIuaGVhZGVyKCdSdW53YXkgRGVwbG95Jyk7XG5cbiAgLy8gQ2hlY2sgY29uZmlndXJhdGlvblxuICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdDTEkgbm90IGNvbmZpZ3VyZWQuIFJ1biBcInJ1bndheSBpbml0XCIgZmlyc3QuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gIGxvZ2dlci5kaW0oYFNlcnZlcjogJHtjb25maWcuc2VydmVyVXJsfWApO1xuICBsb2dnZXIuYmxhbmsoKTtcblxuICAvLyBEZXRlY3QgcHJvamVjdFxuICBjb25zdCBzcGlubmVyID0gb3JhKCdEZXRlY3RpbmcgcHJvamVjdC4uLicpLnN0YXJ0KCk7XG4gIGxldCBkZXRlY3RlZFByb2plY3Q7XG5cbiAgdHJ5IHtcbiAgICBkZXRlY3RlZFByb2plY3QgPSBhd2FpdCBkZXRlY3RQcm9qZWN0KCk7XG4gICAgc3Bpbm5lci5zdWNjZWVkKGBEZXRlY3RlZDogJHtkZXRlY3RlZFByb2plY3QudHlwZX0gcHJvamVjdCAoJHtkZXRlY3RlZFByb2plY3QucGFja2FnZU1hbmFnZXJ9KWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIGRldGVjdCBwcm9qZWN0Jyk7XG4gICAgbG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZXRlcm1pbmUgcHJvamVjdCBuYW1lXG4gIGxldCBwcm9qZWN0TmFtZSA9IG9wdGlvbnMubmFtZSB8fCBkZXRlY3RlZFByb2plY3QubmFtZTtcblxuICAvLyBJbnRlcmFjdGl2ZSBtb2RlIGlmIG5hbWUgbm90IHByb3ZpZGVkXG4gIGlmICghb3B0aW9ucy5uYW1lKSB7XG4gICAgY29uc3QgYW5zd2VycyA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgICAgbWVzc2FnZTogJ1Byb2plY3QgbmFtZTonLFxuICAgICAgICBkZWZhdWx0OiBwcm9qZWN0TmFtZSxcbiAgICAgICAgdmFsaWRhdGU6IChpbnB1dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA8IDIpIHJldHVybiAnTmFtZSBtdXN0IGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyc7XG4gICAgICAgICAgaWYgKCEvXlthLXpBLVowLTktX10rJC8udGVzdChpbnB1dCkpIHJldHVybiAnTmFtZSBjYW4gb25seSBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcyc7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHByb2plY3ROYW1lID0gYW5zd2Vycy5uYW1lO1xuICB9XG5cbiAgLy8gRGV0ZXJtaW5lIHByb2plY3QgdHlwZVxuICBjb25zdCBwcm9qZWN0VHlwZSA9IG9wdGlvbnMudHlwZSB8fCBkZXRlY3RlZFByb2plY3QudHlwZTtcblxuICAvLyBEZXRlcm1pbmUgYnVpbGQgbW9kZVxuICBsZXQgYnVpbGRNb2RlOiBCdWlsZE1vZGU7XG4gIGlmIChvcHRpb25zLmJ1aWxkU2VydmVyKSB7XG4gICAgYnVpbGRNb2RlID0gJ3NlcnZlcic7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5idWlsZExvY2FsKSB7XG4gICAgYnVpbGRNb2RlID0gJ2xvY2FsJztcbiAgfSBlbHNlIHtcbiAgICBidWlsZE1vZGUgPSBjb25maWcuZGVmYXVsdEJ1aWxkTW9kZSB8fCAnbG9jYWwnO1xuICB9XG5cbiAgbG9nZ2VyLmJsYW5rKCk7XG4gIGxvZ2dlci5pbmZvKGBQcm9qZWN0OiAke3Byb2plY3ROYW1lfWApO1xuICBsb2dnZXIuaW5mbyhgVHlwZTogJHtwcm9qZWN0VHlwZX1gKTtcbiAgbG9nZ2VyLmluZm8oYEJ1aWxkIG1vZGU6ICR7YnVpbGRNb2RlfWApO1xuICBpZiAob3B0aW9ucy52ZXJzaW9uKSB7XG4gICAgbG9nZ2VyLmluZm8oYFZlcnNpb246ICR7b3B0aW9ucy52ZXJzaW9ufWApO1xuICB9XG4gIGxvZ2dlci5ibGFuaygpO1xuXG4gIC8vIENvbmZpcm0gZGVwbG95bWVudFxuICBjb25zdCB7IGNvbmZpcm0gfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAge1xuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxuICAgICAgbmFtZTogJ2NvbmZpcm0nLFxuICAgICAgbWVzc2FnZTogJ1Byb2NlZWQgd2l0aCBkZXBsb3ltZW50PycsXG4gICAgICBkZWZhdWx0OiB0cnVlLFxuICAgIH0sXG4gIF0pO1xuXG4gIGlmICghY29uZmlybSkge1xuICAgIGxvZ2dlci53YXJuKCdEZXBsb3ltZW50IGNhbmNlbGxlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2dnZXIuYmxhbmsoKTtcblxuICAvLyBFTlYgc291cmNlIHByb21wdCBmb3IgUmVhY3QvTmV4dCBsb2NhbCBidWlsZHNcbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgbGV0IGVudkluamVjdGVkID0gZmFsc2U7XG4gIGxldCBlbnZGaWxlUGF0aCA9IG9wdGlvbnMuZW52RmlsZTtcblxuICBpZiAoYnVpbGRNb2RlID09PSAnbG9jYWwnICYmIChwcm9qZWN0VHlwZSA9PT0gJ3JlYWN0JyB8fCBwcm9qZWN0VHlwZSA9PT0gJ25leHQnKSkge1xuICAgIGNvbnN0IGRlZmF1bHRFbnZQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuZW52Jyk7XG4gICAgY29uc3QgaGFzRW52RmlsZSA9IGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudlBhdGgpO1xuXG4gICAgaWYgKCFvcHRpb25zLnNraXBFbnZQcm9tcHQgJiYgIW9wdGlvbnMuZW52RmlsZSkge1xuICAgICAgY29uc3QgZW52Q2hvaWNlcyA9IFtcbiAgICAgICAgLi4uKGhhc0VudkZpbGUgPyBbeyBuYW1lOiAnVXNlIC5lbnYgZmlsZScsIHZhbHVlOiAnZmlsZScgfV0gOiBbXSksXG4gICAgICAgIHsgbmFtZTogJ0VudGVyIHZhcmlhYmxlcyBtYW51YWxseScsIHZhbHVlOiAnbWFudWFsJyB9LFxuICAgICAgICB7IG5hbWU6ICdTa2lwIChFTlYgd2lsbCBiZSBsb2NrZWQgYWZ0ZXIgZGVwbG95KScsIHZhbHVlOiAnc2tpcCcgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgZW52U291cmNlIH0gPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICAgIG5hbWU6ICdlbnZTb3VyY2UnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGJ1aWxkOicsXG4gICAgICAgICAgY2hvaWNlczogZW52Q2hvaWNlcyxcbiAgICAgICAgICBkZWZhdWx0OiBoYXNFbnZGaWxlID8gJ2ZpbGUnIDogJ3NraXAnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICAgIGlmIChlbnZTb3VyY2UgPT09ICdmaWxlJykge1xuICAgICAgICBlbnZGaWxlUGF0aCA9IGRlZmF1bHRFbnZQYXRoO1xuICAgICAgICBlbnZWYXJzID0gcGFyc2VFbnZGaWxlKGRlZmF1bHRFbnZQYXRoKTtcbiAgICAgICAgZW52SW5qZWN0ZWQgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGggPiAwO1xuICAgICAgICBsb2dnZXIuc3VjY2VzcyhgTG9hZGVkICR7T2JqZWN0LmtleXMoZW52VmFycykubGVuZ3RofSB2YXJpYWJsZXMgZnJvbSAuZW52YCk7XG4gICAgICB9IGVsc2UgaWYgKGVudlNvdXJjZSA9PT0gJ21hbnVhbCcpIHtcbiAgICAgICAgZW52VmFycyA9IGF3YWl0IHByb21wdE1hbnVhbEVudlZhcnMoKTtcbiAgICAgICAgZW52SW5qZWN0ZWQgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoZW52SW5qZWN0ZWQpIHtcbiAgICAgICAgICBsb2dnZXIuc3VjY2VzcyhgQWRkZWQgJHtPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlc2ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignU2tpcHBpbmcgRU5WIGluamVjdGlvbiAtIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGJlIGxvY2tlZCBhZnRlciBkZXBsb3ltZW50LicpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lbnZGaWxlICYmIGZzLmV4aXN0c1N5bmMob3B0aW9ucy5lbnZGaWxlKSkge1xuICAgICAgZW52VmFycyA9IHBhcnNlRW52RmlsZShvcHRpb25zLmVudkZpbGUpO1xuICAgICAgZW52SW5qZWN0ZWQgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGggPiAwO1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYExvYWRlZCAke09iamVjdC5rZXlzKGVudlZhcnMpLmxlbmd0aH0gdmFyaWFibGVzIGZyb20gJHtvcHRpb25zLmVudkZpbGV9YCk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmJsYW5rKCk7XG4gIH1cblxuICAvLyBTdGVwIDE6IEJ1aWxkIChmb3IgbG9jYWwtYnVpbGQgbW9kZSlcbiAgbGV0IGJ1aWxkT3V0cHV0RGlyID0gZGV0ZWN0ZWRQcm9qZWN0LmJ1aWxkT3V0cHV0RGlyO1xuXG4gIGlmIChidWlsZE1vZGUgPT09ICdsb2NhbCcpIHtcbiAgICBsb2dnZXIuc3RlcCgxLCA0LCAnQnVpbGRpbmcgcHJvamVjdC4uLicpO1xuXG4gICAgY29uc3QgYnVpbGRSZXN1bHQgPSBhd2FpdCBidWlsZFNlcnZpY2UuYnVpbGQoe1xuICAgICAgcHJvamVjdFBhdGg6IHByb2Nlc3MuY3dkKCksXG4gICAgICBwcm9qZWN0VHlwZSxcbiAgICAgIHByb2plY3ROYW1lLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IGRldGVjdGVkUHJvamVjdC5wYWNrYWdlTWFuYWdlcixcbiAgICAgIGVudkZpbGU6IGVudkZpbGVQYXRoLFxuICAgIH0pO1xuXG4gICAgaWYgKCFidWlsZFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEJ1aWxkIGZhaWxlZDogJHtidWlsZFJlc3VsdC5lcnJvcn1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBidWlsZE91dHB1dERpciA9IGJ1aWxkUmVzdWx0Lm91dHB1dERpcjtcbiAgICBsb2dnZXIuc3VjY2VzcyhgQnVpbGQgY29tcGxldGVkIGluICR7KGJ1aWxkUmVzdWx0LmR1cmF0aW9uIC8gMTAwMCkudG9GaXhlZCgxKX1zYCk7XG4gICAgbG9nZ2VyLmJsYW5rKCk7XG4gIH1cblxuICAvLyBTdGVwIDI6IFBhY2thZ2VcbiAgY29uc3QgcGFja2FnZVN0ZXAgPSBidWlsZE1vZGUgPT09ICdsb2NhbCcgPyAyIDogMTtcbiAgY29uc3QgdG90YWxTdGVwcyA9IGJ1aWxkTW9kZSA9PT0gJ2xvY2FsJyA/IDQgOiAzO1xuXG4gIGxvZ2dlci5zdGVwKHBhY2thZ2VTdGVwLCB0b3RhbFN0ZXBzLCAnQ3JlYXRpbmcgZGVwbG95bWVudCBwYWNrYWdlLi4uJyk7XG5cbiAgbGV0IHBhY2thZ2VSZXN1bHQ7XG4gIHRyeSB7XG4gICAgcGFja2FnZVJlc3VsdCA9IGF3YWl0IHBhY2thZ2VTZXJ2aWNlLnBhY2thZ2Uoe1xuICAgICAgcHJvamVjdFBhdGg6IHByb2Nlc3MuY3dkKCksXG4gICAgICBwcm9qZWN0VHlwZSxcbiAgICAgIGJ1aWxkT3V0cHV0RGlyLFxuICAgICAgaW5jbHVkZVNvdXJjZTogYnVpbGRNb2RlID09PSAnc2VydmVyJyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoYFBhY2thZ2luZyBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nZ2VyLmJsYW5rKCk7XG5cbiAgLy8gU3RlcCAzOiBBbmFseXplICYgVXBsb2FkXG4gIGxvZ2dlci5zdGVwKHBhY2thZ2VTdGVwICsgMSwgdG90YWxTdGVwcywgJ0FuYWx5emluZyBhbmQgdXBsb2FkaW5nIHRvIHNlcnZlci4uLicpO1xuXG4gIGxldCB1cGxvYWRTZXJ2aWNlO1xuICB0cnkge1xuICAgIHVwbG9hZFNlcnZpY2UgPSBjcmVhdGVVcGxvYWRTZXJ2aWNlKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICBwYWNrYWdlU2VydmljZS5jbGVhbnVwKHBhY2thZ2VSZXN1bHQuemlwUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQW5hbHl6ZSBwYWNrYWdlIGZpcnN0IChmb3Igc2VydmVyLWJ1aWxkIG1vZGUgdG8gZ2V0IHdhcm5pbmdzKVxuICBsZXQgY29uZmlybVNlcnZlckJ1aWxkID0gZmFsc2U7XG4gIGlmIChidWlsZE1vZGUgPT09ICdzZXJ2ZXInKSB7XG4gICAgY29uc3QgYW5hbHl6ZVJlc3VsdCA9IGF3YWl0IHVwbG9hZFNlcnZpY2UuYW5hbHl6ZVBhY2thZ2UocGFja2FnZVJlc3VsdC56aXBQYXRoLCBwcm9qZWN0VHlwZSk7XG5cbiAgICBpZiAoYW5hbHl6ZVJlc3VsdC5zdWNjZXNzICYmIGFuYWx5emVSZXN1bHQuYW5hbHlzaXMpIHtcbiAgICAgIGNvbnN0IGFuYWx5c2lzID0gYW5hbHl6ZVJlc3VsdC5hbmFseXNpcztcblxuICAgICAgLy8gRGlzcGxheSB3YXJuaW5nc1xuICAgICAgaWYgKGFuYWx5c2lzLndhcm5pbmdzICYmIGFuYWx5c2lzLndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTZXJ2ZXIgQW5hbHlzaXM6Jyk7XG4gICAgICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiBhbmFseXNpcy53YXJuaW5ncykge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHdhcm5pbmcubGV2ZWwgPT09ICdjcml0aWNhbCcgPyAn4p2MJyA6IHdhcm5pbmcubGV2ZWwgPT09ICd3YXJuaW5nJyA/ICfimqDvuI8nIDogJ+KEue+4jyc7XG4gICAgICAgICAgbG9nZ2VyLmRpbShgICAke3ByZWZpeH0gJHt3YXJuaW5nLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBjb25maXJtYXRpb24gZm9yIHNlcnZlci1zaWRlIGJ1aWxkXG4gICAgICBpZiAoYW5hbHlzaXMucmVxdWlyZXNDb25maXJtYXRpb24pIHtcbiAgICAgICAgY29uc3QgeyBjb25maXJtQnVpbGQgfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2NvbmZpcm0nLFxuICAgICAgICAgICAgbmFtZTogJ2NvbmZpcm1CdWlsZCcsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHthbmFseXNpcy5jb25maXJtYXRpb25SZWFzb24gfHwgJ1NlcnZlci1zaWRlIGJ1aWxkIHJlcXVpcmVkJ30uIFRoaXMgbWF5IGNvbnN1bWUgc2lnbmlmaWNhbnQgcmVzb3VyY2VzLiBDb250aW51ZT9gLFxuICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoIWNvbmZpcm1CdWlsZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdEZXBsb3ltZW50IGNhbmNlbGxlZCBieSB1c2VyLicpO1xuICAgICAgICAgIHBhY2thZ2VTZXJ2aWNlLmNsZWFudXAocGFja2FnZVJlc3VsdC56aXBQYXRoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlybVNlcnZlckJ1aWxkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB1cGxvYWRSZXN1bHQgPSBhd2FpdCB1cGxvYWRTZXJ2aWNlLnVwbG9hZCh7XG4gICAgemlwUGF0aDogcGFja2FnZVJlc3VsdC56aXBQYXRoLFxuICAgIHByb2plY3ROYW1lLFxuICAgIHByb2plY3RUeXBlLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICBidWlsZE1vZGUsXG4gICAgY29uZmlybVNlcnZlckJ1aWxkLFxuICAgIC8vIEVOViBtdXRhYmlsaXR5IHRyYWNraW5nXG4gICAgZGVwbG95bWVudFNvdXJjZTogJ2NsaScsXG4gICAgZW52SW5qZWN0ZWQsXG4gIH0pO1xuXG4gIC8vIENsZWFudXAgemlwIGZpbGVcbiAgcGFja2FnZVNlcnZpY2UuY2xlYW51cChwYWNrYWdlUmVzdWx0LnppcFBhdGgpO1xuXG4gIGlmICghdXBsb2FkUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICBsb2dnZXIuZXJyb3IoYFVwbG9hZCBmYWlsZWQ6ICR7dXBsb2FkUmVzdWx0LmVycm9yfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZ2dlci5zdWNjZXNzKCdVcGxvYWQgY29tcGxldGUnKTtcbiAgbG9nZ2VyLmJsYW5rKCk7XG5cbiAgLy8gU3RlcCA0OiBXYWl0IGZvciBkZXBsb3ltZW50IChpZiBkZXBsb3ltZW50IElEIGF2YWlsYWJsZSlcbiAgaWYgKHVwbG9hZFJlc3VsdC5kZXBsb3ltZW50SWQpIHtcbiAgICBsb2dnZXIuc3RlcChwYWNrYWdlU3RlcCArIDIsIHRvdGFsU3RlcHMsICdXYWl0aW5nIGZvciBkZXBsb3ltZW50IHRvIGNvbXBsZXRlLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmluYWxTdGF0dXMgPSBhd2FpdCB1cGxvYWRTZXJ2aWNlLnBvbGxEZXBsb3ltZW50U3RhdHVzKFxuICAgICAgICB1cGxvYWRSZXN1bHQuZGVwbG95bWVudElkLFxuICAgICAgICAoc3RhdHVzKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXR1cy5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgXFxyICBQcm9ncmVzczogJHtzdGF0dXMucHJvZ3Jlc3N9JWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuXG4gICAgICBpZiAoZmluYWxTdGF0dXMuc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKCdEZXBsb3ltZW50IHN1Y2Nlc3NmdWwhJyk7XG5cbiAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBwcm9qZWN0TmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XS9nLCAnLScpO1xuICAgICAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFlvdXIgYXBwIGlzIGF2YWlsYWJsZSBhdDogJHtjb25maWcuc2VydmVyVXJsfS9hcHAvJHtzYWZlTmFtZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRGVwbG95bWVudCBmYWlsZWQ6ICR7ZmluYWxTdGF0dXMuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgICBpZiAoZmluYWxTdGF0dXMubG9ncykge1xuICAgICAgICAgIGxvZ2dlci5ibGFuaygpO1xuICAgICAgICAgIGxvZ2dlci5kaW0oJ0xvZ3M6Jyk7XG4gICAgICAgICAgY29uc29sZS5sb2coZmluYWxTdGF0dXMubG9ncyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCB0cmFjayBkZXBsb3ltZW50IHN0YXR1cycpO1xuICAgICAgbG9nZ2VyLmRpbSgnQ2hlY2sgdGhlIHdlYiBVSSBmb3IgZGVwbG95bWVudCBzdGF0dXMnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ1VwbG9hZCBzdWNjZXNzZnVsIScpO1xuICAgIGxvZ2dlci5kaW0oJ0RlcGxveW1lbnQgaXMgYmVpbmcgcHJvY2Vzc2VkLiBDaGVjayB0aGUgd2ViIFVJIGZvciBzdGF0dXMuJyk7XG4gIH1cblxuICBsb2dnZXIuYmxhbmsoKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initCommand = initCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const config_1 = require("../utils/config");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const authService_1 = require("../services/authService");
|
|
12
|
+
async function initCommand(options) {
|
|
13
|
+
logger_1.logger.header('Runway CLI Setup');
|
|
14
|
+
// Check if already configured
|
|
15
|
+
if ((0, config_1.isConfigured)()) {
|
|
16
|
+
const config = (0, config_1.getConfig)();
|
|
17
|
+
logger_1.logger.info(`Currently configured to: ${config.serverUrl}`);
|
|
18
|
+
if (config.securityMode) {
|
|
19
|
+
logger_1.logger.dim(`Security mode: ${config.securityMode === 'domain-https' ? 'HTTPS (secure)' : 'HTTP (limited)'}`);
|
|
20
|
+
}
|
|
21
|
+
const { reconfigure } = await inquirer_1.default.prompt([
|
|
22
|
+
{
|
|
23
|
+
type: 'confirm',
|
|
24
|
+
name: 'reconfigure',
|
|
25
|
+
message: 'Do you want to reconfigure?',
|
|
26
|
+
default: false,
|
|
27
|
+
},
|
|
28
|
+
]);
|
|
29
|
+
if (!reconfigure) {
|
|
30
|
+
logger_1.logger.info('Configuration unchanged.');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Get server URL
|
|
35
|
+
let serverUrl = options.server;
|
|
36
|
+
if (!serverUrl) {
|
|
37
|
+
const answers = await inquirer_1.default.prompt([
|
|
38
|
+
{
|
|
39
|
+
type: 'input',
|
|
40
|
+
name: 'serverUrl',
|
|
41
|
+
message: 'Enter your Runway server URL:',
|
|
42
|
+
default: 'https://deploy.example.com',
|
|
43
|
+
validate: (input) => {
|
|
44
|
+
try {
|
|
45
|
+
new URL(input);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return 'Please enter a valid URL';
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
]);
|
|
54
|
+
serverUrl = answers.serverUrl;
|
|
55
|
+
}
|
|
56
|
+
// Normalize URL
|
|
57
|
+
serverUrl = serverUrl.replace(/\/+$/, '');
|
|
58
|
+
// Test connection
|
|
59
|
+
logger_1.logger.info('Testing connection...');
|
|
60
|
+
try {
|
|
61
|
+
await axios_1.default.get(`${serverUrl}/health`, { timeout: 10000 });
|
|
62
|
+
logger_1.logger.success('Server is reachable');
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logger_1.logger.error(`Cannot reach server at ${serverUrl}`);
|
|
66
|
+
logger_1.logger.dim('Make sure the server is running and the URL is correct.');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Initialize auth service
|
|
70
|
+
const authService = new authService_1.AuthService(serverUrl);
|
|
71
|
+
// Check security mode
|
|
72
|
+
logger_1.logger.info('Checking server security mode...');
|
|
73
|
+
let securityInfo;
|
|
74
|
+
try {
|
|
75
|
+
securityInfo = await authService.getSecurityMode();
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger_1.logger.error('Failed to get server security mode');
|
|
79
|
+
logger_1.logger.dim('The server may be running an older version without CLI auth support.');
|
|
80
|
+
logger_1.logger.dim('Falling back to legacy authentication...');
|
|
81
|
+
await legacyAuth(serverUrl);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Display security info
|
|
85
|
+
if (securityInfo.securityMode === 'domain-https') {
|
|
86
|
+
logger_1.logger.success(`Server has HTTPS enabled: ${securityInfo.domain}`);
|
|
87
|
+
logger_1.logger.dim('Authentication will use secure TLS connection.');
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
logger_1.logger.warn('Server is running in HTTP mode (no domain configured)');
|
|
91
|
+
logger_1.logger.dim('Authentication will use RSA key exchange (MITM vulnerable).');
|
|
92
|
+
logger_1.logger.blank();
|
|
93
|
+
const { proceed } = await inquirer_1.default.prompt([
|
|
94
|
+
{
|
|
95
|
+
type: 'confirm',
|
|
96
|
+
name: 'proceed',
|
|
97
|
+
message: 'Continue with RSA authentication?',
|
|
98
|
+
default: true,
|
|
99
|
+
},
|
|
100
|
+
]);
|
|
101
|
+
if (!proceed) {
|
|
102
|
+
logger_1.logger.blank();
|
|
103
|
+
logger_1.logger.info('To enable secure authentication:');
|
|
104
|
+
logger_1.logger.dim(' 1. Configure a domain on your Runway server');
|
|
105
|
+
logger_1.logger.dim(' 2. Enable HTTPS through the Settings page');
|
|
106
|
+
logger_1.logger.dim(' 3. Run `runway init` again');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Get credentials
|
|
111
|
+
logger_1.logger.blank();
|
|
112
|
+
const credentials = await inquirer_1.default.prompt([
|
|
113
|
+
{
|
|
114
|
+
type: 'input',
|
|
115
|
+
name: 'username',
|
|
116
|
+
message: 'Username:',
|
|
117
|
+
validate: (input) => input.length > 0 || 'Username is required',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'password',
|
|
121
|
+
name: 'password',
|
|
122
|
+
message: 'Password:',
|
|
123
|
+
validate: (input) => input.length > 0 || 'Password is required',
|
|
124
|
+
},
|
|
125
|
+
]);
|
|
126
|
+
// Authenticate using the auth service
|
|
127
|
+
logger_1.logger.info('Authenticating...');
|
|
128
|
+
try {
|
|
129
|
+
const authResult = await authService.authenticate(credentials.username, credentials.password);
|
|
130
|
+
// Save configuration with all auth data
|
|
131
|
+
(0, config_1.setServerUrl)(serverUrl);
|
|
132
|
+
(0, config_1.setAuthData)(authResult.token, authResult.expiresAt, authResult.securityMode);
|
|
133
|
+
logger_1.logger.blank();
|
|
134
|
+
logger_1.logger.success('Configuration saved successfully!');
|
|
135
|
+
logger_1.logger.blank();
|
|
136
|
+
logger_1.logger.info('You can now deploy projects with:');
|
|
137
|
+
logger_1.logger.dim(' runway deploy');
|
|
138
|
+
logger_1.logger.blank();
|
|
139
|
+
// Show token expiry warning for HTTP mode
|
|
140
|
+
if (authResult.securityMode === 'ip-http') {
|
|
141
|
+
logger_1.logger.warn('Note: Token expires in 15 minutes due to HTTP mode.');
|
|
142
|
+
logger_1.logger.dim('Run `runway init` to re-authenticate when needed.');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
// Error already logged by AuthService
|
|
147
|
+
logger_1.logger.blank();
|
|
148
|
+
logger_1.logger.dim('Check your credentials and try again.');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Legacy authentication for servers without CLI auth support
|
|
153
|
+
*/
|
|
154
|
+
async function legacyAuth(serverUrl) {
|
|
155
|
+
const credentials = await inquirer_1.default.prompt([
|
|
156
|
+
{
|
|
157
|
+
type: 'input',
|
|
158
|
+
name: 'username',
|
|
159
|
+
message: 'Username:',
|
|
160
|
+
validate: (input) => input.length > 0 || 'Username is required',
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'password',
|
|
164
|
+
name: 'password',
|
|
165
|
+
message: 'Password:',
|
|
166
|
+
validate: (input) => input.length > 0 || 'Password is required',
|
|
167
|
+
},
|
|
168
|
+
]);
|
|
169
|
+
logger_1.logger.info('Authenticating...');
|
|
170
|
+
try {
|
|
171
|
+
const response = await axios_1.default.post(`${serverUrl}/api/auth/login`, credentials, { timeout: 10000 });
|
|
172
|
+
if (response.data.success && response.data?.token) {
|
|
173
|
+
// Save configuration (legacy mode without expiry tracking)
|
|
174
|
+
(0, config_1.setServerUrl)(serverUrl);
|
|
175
|
+
(0, config_1.setAuthData)(response.data.token, '', 'ip-http');
|
|
176
|
+
logger_1.logger.blank();
|
|
177
|
+
logger_1.logger.success('Configuration saved successfully!');
|
|
178
|
+
logger_1.logger.blank();
|
|
179
|
+
logger_1.logger.info('You can now deploy projects with:');
|
|
180
|
+
logger_1.logger.dim(' runway deploy');
|
|
181
|
+
logger_1.logger.blank();
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
logger_1.logger.error('Authentication failed: ' + (response.data.error || 'Unknown error'));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
189
|
+
logger_1.logger.error('Authentication failed: ' + (error.response?.data?.error || error.message));
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
logger_1.logger.error('Authentication failed: ' + (error instanceof Error ? error.message : 'Unknown error'));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9pbml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBVUEsa0NBeUpDO0FBbktELHdEQUFnQztBQUNoQyxrREFBMEI7QUFDMUIsNENBQXFGO0FBQ3JGLDRDQUF5QztBQUN6Qyx5REFBc0Q7QUFNL0MsS0FBSyxVQUFVLFdBQVcsQ0FBQyxPQUFvQjtJQUNwRCxlQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFbEMsOEJBQThCO0lBQzlCLElBQUksSUFBQSxxQkFBWSxHQUFFLEVBQUUsQ0FBQztRQUNuQixNQUFNLE1BQU0sR0FBRyxJQUFBLGtCQUFTLEdBQUUsQ0FBQztRQUMzQixlQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1RCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixlQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixNQUFNLENBQUMsWUFBWSxLQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO1FBRUQsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sa0JBQVEsQ0FBQyxNQUFNLENBQUM7WUFDNUM7Z0JBQ0UsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLE9BQU8sRUFBRSw2QkFBNkI7Z0JBQ3RDLE9BQU8sRUFBRSxLQUFLO2FBQ2Y7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsZUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ3hDLE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixJQUFJLFNBQVMsR0FBRyxPQUFPLENB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QyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMzRixDQUFDO2FBQU0sQ0FBQztZQUNOLGVBQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEdBQUcsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbnF1aXJlciBmcm9tICdpbnF1aXJlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgc2V0U2VydmVyVXJsLCBzZXRBdXRoRGF0YSwgZ2V0Q29uZmlnLCBpc0NvbmZpZ3VyZWQgfSBmcm9tICcuLi91dGlscy9jb25maWcnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aFNlcnZpY2UnO1xuXG5pbnRlcmZhY2UgSW5pdE9wdGlvbnMge1xuICBzZXJ2ZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0Q29tbWFuZChvcHRpb25zOiBJbml0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2dnZXIuaGVhZGVyKCdSdW53YXkgQ0xJIFNldHVwJyk7XG5cbiAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBjb25maWd1cmVkXG4gIGlmIChpc0NvbmZpZ3VyZWQoKSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZygpO1xuICAgIGxvZ2dlci5pbmZvKGBDdXJyZW50bHkgY29uZmlndXJlZCB0bzogJHtjb25maWcuc2VydmVyVXJsfWApO1xuICAgIGlmIChjb25maWcuc2VjdXJpdHlNb2RlKSB7XG4gICAgICBsb2dnZXIuZGltKGBTZWN1cml0eSBtb2RlOiAke2NvbmZpZy5zZWN1cml0eU1vZGUgPT09ICdkb21haW4taHR0cHMnID8gJ0hUVFBTIChzZWN1cmUpJyA6ICdIVFRQIChsaW1pdGVkKSd9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyByZWNvbmZpZ3VyZSB9ID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NvbmZpcm0nLFxuICAgICAgICBuYW1lOiAncmVjb25maWd1cmUnLFxuICAgICAgICBtZXNzYWdlOiAnRG8geW91IHdhbnQgdG8gcmVjb25maWd1cmU/JyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgaWYgKCFyZWNvbmZpZ3VyZSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ0NvbmZpZ3VyYXRpb24gdW5jaGFuZ2VkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBzZXJ2ZXIgVVJMXG4gIGxldCBzZXJ2ZXJVcmwgPSBvcHRpb25zLnNlcnZlcjtcblxuICBpZiAoIXNlcnZlclVybCkge1xuICAgIGNvbnN0IGFuc3dlcnMgPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnc2VydmVyVXJsJyxcbiAgICAgICAgbWVzc2FnZTogJ0VudGVyIHlvdXIgUnVud2F5IHNlcnZlciBVUkw6JyxcbiAgICAgICAgZGVmYXVsdDogJ2h0dHBzOi8vZGVwbG95LmV4YW1wbGUuY29tJyxcbiAgICAgICAgdmFsaWRhdGU6IChpbnB1dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBVUkwoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCc7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBzZXJ2ZXJVcmwgPSBhbnN3ZXJzLnNlcnZlclVybCBhcyBzdHJpbmc7XG4gIH1cblxuICAvLyBOb3JtYWxpemUgVVJMXG4gIHNlcnZlclVybCA9IHNlcnZlclVybCEucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG5cbiAgLy8gVGVzdCBjb25uZWN0aW9uXG4gIGxvZ2dlci5pbmZvKCdUZXN0aW5nIGNvbm5lY3Rpb24uLi4nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBheGlvcy5nZXQoYCR7c2VydmVyVXJsfS9oZWFsdGhgLCB7IHRpbWVvdXQ6IDEwMDAwIH0pO1xuICAgIGxvZ2dlci5zdWNjZXNzKCdTZXJ2ZXIgaXMgcmVhY2hhYmxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBDYW5ub3QgcmVhY2ggc2VydmVyIGF0ICR7c2VydmVyVXJsfWApO1xuICAgIGxvZ2dlci5kaW0oJ01ha2Ugc3VyZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgYW5kIHRoZSBVUkwgaXMgY29ycmVjdC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJbml0aWFsaXplIGF1dGggc2VydmljZVxuICBjb25zdCBhdXRoU2VydmljZSA9IG5ldyBBdXRoU2VydmljZShzZXJ2ZXJVcmwpO1xuXG4gIC8vIENoZWNrIHNlY3VyaXR5IG1vZGVcbiAgbG9nZ2VyLmluZm8oJ0NoZWNraW5nIHNlcnZlciBzZWN1cml0eSBtb2RlLi4uJyk7XG4gIGxldCBzZWN1cml0eUluZm87XG4gIHRyeSB7XG4gICAgc2VjdXJpdHlJbmZvID0gYXdhaXQgYXV0aFNlcnZpY2UuZ2V0U2VjdXJpdHlNb2RlKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZ2V0IHNlcnZlciBzZWN1cml0eSBtb2RlJyk7XG4gICAgbG9nZ2VyLmRpbSgnVGhlIHNlcnZlciBtYXkgYmUgcnVubmluZyBhbiBvbGRlciB2ZXJzaW9uIHdpdGhvdXQgQ0xJIGF1dGggc3VwcG9ydC4nKTtcbiAgICBsb2dnZXIuZGltKCdGYWxsaW5nIGJhY2sgdG8gbGVnYWN5IGF1dGhlbnRpY2F0aW9uLi4uJyk7XG4gICAgYXdhaXQgbGVnYWN5QXV0aChzZXJ2ZXJVcmwpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERpc3BsYXkgc2VjdXJpdHkgaW5mb1xuICBpZiAoc2VjdXJpdHlJbmZvLnNlY3VyaXR5TW9kZSA9PT0gJ2RvbWFpbi1odHRwcycpIHtcbiAgICBsb2dnZXIuc3VjY2VzcyhgU2VydmVyIGhhcyBIVFRQUyBlbmFibGVkOiAke3NlY3VyaXR5SW5mby5kb21haW59YCk7XG4gICAgbG9nZ2VyLmRpbSgnQXV0aGVudGljYXRpb24gd2lsbCB1c2Ugc2VjdXJlIFRMUyBjb25uZWN0aW9uLicpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci53YXJuKCdTZXJ2ZXIgaXMgcnVubmluZyBpbiBIVFRQIG1vZGUgKG5vIGRvbWFpbiBjb25maWd1cmVkKScpO1xuICAgIGxvZ2dlci5kaW0oJ0F1dGhlbnRpY2F0aW9uIHdpbGwgdXNlIFJTQSBrZXkgZXhjaGFuZ2UgKE1JVE0gdnVsbmVyYWJsZSkuJyk7XG4gICAgbG9nZ2VyLmJsYW5rKCk7XG5cbiAgICBjb25zdCB7IHByb2NlZWQgfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjb25maXJtJyxcbiAgICAgICAgbmFtZTogJ3Byb2NlZWQnLFxuICAgICAgICBtZXNzYWdlOiAnQ29udGludWUgd2l0aCBSU0EgYXV0aGVudGljYXRpb24/JyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICBpZiAoIXByb2NlZWQpIHtcbiAgICAgIGxvZ2dlci5ibGFuaygpO1xuICAgICAgbG9nZ2VyLmluZm8oJ1RvIGVuYWJsZSBzZWN1cmUgYXV0aGVudGljYXRpb246Jyk7XG4gICAgICBsb2dnZXIuZGltKCcgIDEuIENvbmZpZ3VyZSBhIGRvbWFpbiBvbiB5b3VyIFJ1bndheSBzZXJ2ZXInKTtcbiAgICAgIGxvZ2dlci5kaW0oJyAgMi4gRW5hYmxlIEhUVFBTIHRocm91Z2ggdGhlIFNldHRpbmdzIHBhZ2UnKTtcbiAgICAgIGxvZ2dlci5kaW0oJyAgMy4gUnVuIGBydW53YXkgaW5pdGAgYWdhaW4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgY3JlZGVudGlhbHNcbiAgbG9nZ2VyLmJsYW5rKCk7XG4gIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICB7XG4gICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgbmFtZTogJ3VzZXJuYW1lJyxcbiAgICAgIG1lc3NhZ2U6ICdVc2VybmFtZTonLFxuICAgICAgdmFsaWRhdGU6IChpbnB1dDogc3RyaW5nKSA9PiBpbnB1dC5sZW5ndGggPiAwIHx8ICdVc2VybmFtZSBpcyByZXF1aXJlZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcbiAgICAgIG1lc3NhZ2U6ICdQYXNzd29yZDonLFxuICAgICAgdmFsaWRhdGU6IChpbnB1dDogc3RyaW5nKSA9PiBpbnB1dC5sZW5ndGggPiAwIHx8ICdQYXNzd29yZCBpcyByZXF1aXJlZCcsXG4gICAgfSxcbiAgXSk7XG5cbiAgLy8gQXV0aGVudGljYXRlIHVzaW5nIHRoZSBhdXRoIHNlcnZpY2VcbiAgbG9nZ2VyLmluZm8oJ0F1dGhlbnRpY2F0aW5nLi4uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgYXV0aFJlc3VsdCA9IGF3YWl0IGF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0ZShcbiAgICAgIGNyZWRlbnRpYWxzLnVzZXJuYW1lLFxuICAgICAgY3JlZGVudGlhbHMucGFzc3dvcmRcbiAgICApO1xuXG4gICAgLy8gU2F2ZSBjb25maWd1cmF0aW9uIHdpdGggYWxsIGF1dGggZGF0YVxuICAgIHNldFNlcnZlclVybChzZXJ2ZXJVcmwpO1xuICAgIHNldEF1dGhEYXRhKGF1dGhSZXN1bHQudG9rZW4sIGF1dGhSZXN1bHQuZXhwaXJlc0F0LCBhdXRoUmVzdWx0LnNlY3VyaXR5TW9kZSk7XG5cbiAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICBsb2dnZXIuc3VjY2VzcygnQ29uZmlndXJhdGlvbiBzYXZlZCBzdWNjZXNzZnVsbHkhJyk7XG4gICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgbG9nZ2VyLmluZm8oJ1lvdSBjYW4gbm93IGRlcGxveSBwcm9qZWN0cyB3aXRoOicpO1xuICAgIGxvZ2dlci5kaW0oJyAgcnVud2F5IGRlcGxveScpO1xuICAgIGxvZ2dlci5ibGFuaygpO1xuXG4gICAgLy8gU2hvdyB0b2tlbiBleHBpcnkgd2FybmluZyBmb3IgSFRUUCBtb2RlXG4gICAgaWYgKGF1dGhSZXN1bHQuc2VjdXJpdHlNb2RlID09PSAnaXAtaHR0cCcpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdOb3RlOiBUb2tlbiBleHBpcmVzIGluIDE1IG1pbnV0ZXMgZHVlIHRvIEhUVFAgbW9kZS4nKTtcbiAgICAgIGxvZ2dlci5kaW0oJ1J1biBgcnVud2F5IGluaXRgIHRvIHJlLWF1dGhlbnRpY2F0ZSB3aGVuIG5lZWRlZC4nKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgQXV0aFNlcnZpY2VcbiAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICBsb2dnZXIuZGltKCdDaGVjayB5b3VyIGNyZWRlbnRpYWxzIGFuZCB0cnkgYWdhaW4uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBMZWdhY3kgYXV0aGVudGljYXRpb24gZm9yIHNlcnZlcnMgd2l0aG91dCBDTEkgYXV0aCBzdXBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxlZ2FjeUF1dGgoc2VydmVyVXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgIHtcbiAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICBuYW1lOiAndXNlcm5hbWUnLFxuICAgICAgbWVzc2FnZTogJ1VzZXJuYW1lOicsXG4gICAgICB2YWxpZGF0ZTogKGlucHV0OiBzdHJpbmcpID0+IGlucHV0Lmxlbmd0aCA+IDAgfHwgJ1VzZXJuYW1lIGlzIHJlcXVpcmVkJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgICBuYW1lOiAncGFzc3dvcmQnLFxuICAgICAgbWVzc2FnZTogJ1Bhc3N3b3JkOicsXG4gICAgICB2YWxpZGF0ZTogKGlucHV0OiBzdHJpbmcpID0+IGlucHV0Lmxlbmd0aCA+IDAgfHwgJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyxcbiAgICB9LFxuICBdKTtcblxuICBsb2dnZXIuaW5mbygnQXV0aGVudGljYXRpbmcuLi4nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICBgJHtzZXJ2ZXJVcmx9L2FwaS9hdXRoL2xvZ2luYCxcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgeyB0aW1lb3V0OiAxMDAwMCB9XG4gICAgKTtcblxuICAgIGlmIChyZXNwb25zZS5kYXRhLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YT8udG9rZW4pIHtcbiAgICAgIC8vIFNhdmUgY29uZmlndXJhdGlvbiAobGVnYWN5IG1vZGUgd2l0aG91dCBleHBpcnkgdHJhY2tpbmcpXG4gICAgICBzZXRTZXJ2ZXJVcmwoc2VydmVyVXJsKTtcbiAgICAgIHNldEF1dGhEYXRhKHJlc3BvbnNlLmRhdGEudG9rZW4sICcnLCAnaXAtaHR0cCcpO1xuXG4gICAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdDb25maWd1cmF0aW9uIHNhdmVkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgICAgIGxvZ2dlci5ibGFuaygpO1xuICAgICAgbG9nZ2VyLmluZm8oJ1lvdSBjYW4gbm93IGRlcGxveSBwcm9qZWN0cyB3aXRoOicpO1xuICAgICAgbG9nZ2VyLmRpbSgnICBydW53YXkgZGVwbG95Jyk7XG4gICAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmVycm9yKCdBdXRoZW50aWNhdGlvbiBmYWlsZWQ6ICcgKyAocmVzcG9uc2UuZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGF4aW9zLmlzQXhpb3NFcnJvcihlcnJvcikpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkOiAnICsgKGVycm9yLnJlc3BvbnNlPy5kYXRhPy5lcnJvciB8fCBlcnJvci5tZXNzYWdlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkOiAnICsgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function listCommand(): Promise<void>;
|