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,78 @@
|
|
|
1
|
+
import { ProjectType, BuildMode } from '../types';
|
|
2
|
+
export interface UploadOptions {
|
|
3
|
+
zipPath: string;
|
|
4
|
+
projectName: string;
|
|
5
|
+
projectType: ProjectType;
|
|
6
|
+
version?: string;
|
|
7
|
+
buildMode: BuildMode;
|
|
8
|
+
confirmServerBuild?: boolean;
|
|
9
|
+
deploymentSource?: 'ui' | 'cli';
|
|
10
|
+
envInjected?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface UploadResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
projectId?: string;
|
|
15
|
+
deploymentId?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DeploymentStatus {
|
|
19
|
+
status: 'queued' | 'building' | 'deploying' | 'success' | 'failed';
|
|
20
|
+
progress?: number;
|
|
21
|
+
logs?: string;
|
|
22
|
+
error?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface DeployWarning {
|
|
25
|
+
level: 'info' | 'warning' | 'critical';
|
|
26
|
+
message: string;
|
|
27
|
+
code: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Analysis result from backend
|
|
31
|
+
* Backend trusts user-declared type - no auto-detection
|
|
32
|
+
*/
|
|
33
|
+
export interface DeployAnalysis {
|
|
34
|
+
declaredType: ProjectType;
|
|
35
|
+
hasPackageJson: boolean;
|
|
36
|
+
hasBuildScript: boolean;
|
|
37
|
+
hasStartScript: boolean;
|
|
38
|
+
hasBuildOutput: boolean;
|
|
39
|
+
buildOutputDir: string | null;
|
|
40
|
+
requiresBuild: boolean;
|
|
41
|
+
isPrebuiltProject: boolean;
|
|
42
|
+
isStaticSite: boolean;
|
|
43
|
+
strategy: 'static' | 'build-and-serve' | 'serve-prebuilt';
|
|
44
|
+
serveMethod: 'caddy-static' | 'pm2-proxy';
|
|
45
|
+
warnings: DeployWarning[];
|
|
46
|
+
requiresConfirmation: boolean;
|
|
47
|
+
confirmationReason?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface AnalyzeResult {
|
|
50
|
+
success: boolean;
|
|
51
|
+
analysis?: DeployAnalysis;
|
|
52
|
+
error?: string;
|
|
53
|
+
}
|
|
54
|
+
export declare class UploadService {
|
|
55
|
+
private serverUrl;
|
|
56
|
+
private token;
|
|
57
|
+
constructor();
|
|
58
|
+
upload(options: UploadOptions): Promise<UploadResult>;
|
|
59
|
+
getDeploymentStatus(deploymentId: string): Promise<DeploymentStatus>;
|
|
60
|
+
pollDeploymentStatus(deploymentId: string, onUpdate: (status: DeploymentStatus) => void, timeoutMs?: number): Promise<DeploymentStatus>;
|
|
61
|
+
login(username: string, password: string): Promise<string>;
|
|
62
|
+
listProjects(): Promise<Array<{
|
|
63
|
+
id: string;
|
|
64
|
+
name: string;
|
|
65
|
+
type: ProjectType;
|
|
66
|
+
status: string;
|
|
67
|
+
}>>;
|
|
68
|
+
/**
|
|
69
|
+
* Analyze a package before deployment to get server warnings and recommendations
|
|
70
|
+
*/
|
|
71
|
+
/**
|
|
72
|
+
* Analyze a package before deployment
|
|
73
|
+
* @param zipPath - Path to the zip file
|
|
74
|
+
* @param declaredType - REQUIRED - User-selected project type (backend trusts this)
|
|
75
|
+
*/
|
|
76
|
+
analyzePackage(zipPath: string, declaredType: ProjectType): Promise<AnalyzeResult>;
|
|
77
|
+
}
|
|
78
|
+
export declare const createUploadService: () => UploadService;
|
|
@@ -0,0 +1,222 @@
|
|
|
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.createUploadService = exports.UploadService = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const form_data_1 = __importDefault(require("form-data"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const config_1 = require("../utils/config");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
class UploadService {
|
|
13
|
+
constructor() {
|
|
14
|
+
const config = (0, config_1.getConfig)();
|
|
15
|
+
if (!config.serverUrl || !config.token) {
|
|
16
|
+
throw new Error('CLI not configured. Run "runway init" first.');
|
|
17
|
+
}
|
|
18
|
+
this.serverUrl = config.serverUrl;
|
|
19
|
+
this.token = config.token;
|
|
20
|
+
}
|
|
21
|
+
async upload(options) {
|
|
22
|
+
const { zipPath, projectName, projectType, version, buildMode, confirmServerBuild, deploymentSource, envInjected } = options;
|
|
23
|
+
if (!fs_1.default.existsSync(zipPath)) {
|
|
24
|
+
return {
|
|
25
|
+
success: false,
|
|
26
|
+
error: `Zip file not found: ${zipPath}`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const formData = new form_data_1.default();
|
|
30
|
+
formData.append('file', fs_1.default.createReadStream(zipPath));
|
|
31
|
+
formData.append('name', projectName);
|
|
32
|
+
formData.append('type', projectType);
|
|
33
|
+
formData.append('buildMode', buildMode);
|
|
34
|
+
if (version) {
|
|
35
|
+
formData.append('version', version);
|
|
36
|
+
}
|
|
37
|
+
if (confirmServerBuild) {
|
|
38
|
+
formData.append('confirmServerBuild', 'true');
|
|
39
|
+
}
|
|
40
|
+
// ENV mutability tracking
|
|
41
|
+
if (deploymentSource) {
|
|
42
|
+
formData.append('deploymentSource', deploymentSource);
|
|
43
|
+
}
|
|
44
|
+
if (envInjected !== undefined) {
|
|
45
|
+
formData.append('envInjected', envInjected ? 'true' : 'false');
|
|
46
|
+
}
|
|
47
|
+
// Choose endpoint based on build mode
|
|
48
|
+
const endpoint = buildMode === 'local'
|
|
49
|
+
? '/api/project/deploy-prebuilt'
|
|
50
|
+
: '/api/project/deploy';
|
|
51
|
+
logger_1.logger.info(`Uploading to ${this.serverUrl}${endpoint}...`);
|
|
52
|
+
try {
|
|
53
|
+
const response = await axios_1.default.post(`${this.serverUrl}${endpoint}`, formData, {
|
|
54
|
+
headers: {
|
|
55
|
+
...formData.getHeaders(),
|
|
56
|
+
Authorization: `Bearer ${this.token}`,
|
|
57
|
+
},
|
|
58
|
+
maxBodyLength: Infinity,
|
|
59
|
+
maxContentLength: Infinity,
|
|
60
|
+
timeout: 300000, // 5 minutes
|
|
61
|
+
onUploadProgress: (progressEvent) => {
|
|
62
|
+
if (progressEvent.total) {
|
|
63
|
+
const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
|
|
64
|
+
process.stdout.write(`\r Uploading: ${percent}%`);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
process.stdout.write('\n');
|
|
69
|
+
if (response.data.success) {
|
|
70
|
+
return {
|
|
71
|
+
success: true,
|
|
72
|
+
projectId: response.data.data?.projectId,
|
|
73
|
+
deploymentId: response.data.data?.deploymentId,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
error: response.data.error || 'Unknown error',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
process.stdout.write('\n');
|
|
85
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
86
|
+
const message = error.response?.data?.error || error.message;
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
error: `Upload failed: ${message}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async getDeploymentStatus(deploymentId) {
|
|
99
|
+
try {
|
|
100
|
+
const response = await axios_1.default.get(`${this.serverUrl}/api/project/status/${deploymentId}`, {
|
|
101
|
+
headers: {
|
|
102
|
+
Authorization: `Bearer ${this.token}`,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
return response.data.data;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
109
|
+
throw new Error(error.response?.data?.error || error.message);
|
|
110
|
+
}
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async pollDeploymentStatus(deploymentId, onUpdate, timeoutMs = 300000 // 5 minutes
|
|
115
|
+
) {
|
|
116
|
+
const startTime = Date.now();
|
|
117
|
+
const pollInterval = 2000; // 2 seconds
|
|
118
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
119
|
+
const status = await this.getDeploymentStatus(deploymentId);
|
|
120
|
+
onUpdate(status);
|
|
121
|
+
if (status.status === 'success' || status.status === 'failed') {
|
|
122
|
+
return status;
|
|
123
|
+
}
|
|
124
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
125
|
+
}
|
|
126
|
+
throw new Error('Deployment timed out');
|
|
127
|
+
}
|
|
128
|
+
async login(username, password) {
|
|
129
|
+
try {
|
|
130
|
+
const response = await axios_1.default.post(`${this.serverUrl}/api/auth/login`, { username, password }, {
|
|
131
|
+
timeout: 10000,
|
|
132
|
+
});
|
|
133
|
+
if (response.data.success && response.data.data?.token) {
|
|
134
|
+
return response.data.data.token;
|
|
135
|
+
}
|
|
136
|
+
throw new Error(response.data.error || 'Login failed');
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
140
|
+
throw new Error(error.response?.data?.error || error.message);
|
|
141
|
+
}
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async listProjects() {
|
|
146
|
+
try {
|
|
147
|
+
const response = await axios_1.default.get(`${this.serverUrl}/api/project`, {
|
|
148
|
+
headers: {
|
|
149
|
+
Authorization: `Bearer ${this.token}`,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
return response.data.data || [];
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
156
|
+
throw new Error(error.response?.data?.error || error.message);
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Analyze a package before deployment to get server warnings and recommendations
|
|
163
|
+
*/
|
|
164
|
+
/**
|
|
165
|
+
* Analyze a package before deployment
|
|
166
|
+
* @param zipPath - Path to the zip file
|
|
167
|
+
* @param declaredType - REQUIRED - User-selected project type (backend trusts this)
|
|
168
|
+
*/
|
|
169
|
+
async analyzePackage(zipPath, declaredType) {
|
|
170
|
+
if (!fs_1.default.existsSync(zipPath)) {
|
|
171
|
+
return {
|
|
172
|
+
success: false,
|
|
173
|
+
error: `Zip file not found: ${zipPath}`,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const formData = new form_data_1.default();
|
|
177
|
+
formData.append('file', fs_1.default.createReadStream(zipPath));
|
|
178
|
+
formData.append('type', declaredType);
|
|
179
|
+
try {
|
|
180
|
+
const response = await axios_1.default.post(`${this.serverUrl}/api/project/analyze`, formData, {
|
|
181
|
+
headers: {
|
|
182
|
+
...formData.getHeaders(),
|
|
183
|
+
Authorization: `Bearer ${this.token}`,
|
|
184
|
+
},
|
|
185
|
+
maxBodyLength: Infinity,
|
|
186
|
+
maxContentLength: Infinity,
|
|
187
|
+
timeout: 60000, // 1 minute for analysis
|
|
188
|
+
});
|
|
189
|
+
if (response.data.success) {
|
|
190
|
+
return {
|
|
191
|
+
success: true,
|
|
192
|
+
analysis: response.data.data,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
return {
|
|
197
|
+
success: false,
|
|
198
|
+
error: response.data.error || 'Analysis failed',
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
204
|
+
const message = error.response?.data?.error || error.message;
|
|
205
|
+
return {
|
|
206
|
+
success: false,
|
|
207
|
+
error: `Analysis failed: ${message}`,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
success: false,
|
|
212
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.UploadService = UploadService;
|
|
218
|
+
const createUploadService = () => {
|
|
219
|
+
return new UploadService();
|
|
220
|
+
};
|
|
221
|
+
exports.createUploadService = createUploadService;
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy91cGxvYWRTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUFrRDtBQUNsRCwwREFBaUM7QUFDakMsNENBQW9CO0FBRXBCLDRDQUE0QztBQUM1Qyw0Q0FBeUM7QUFvRXpDLE1BQWEsYUFBYTtJQUl4QjtRQUNFLE1BQU0sTUFBTSxHQUFHLElBQUEsa0JBQVMsR0FBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFzQjtRQUNqQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFN0gsSUFBSSxDQUFDLFlBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLEtBQUssRUFBRSx1QkFBdUIsT0FBTyxFQUFFO2FBQ3hDLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUSxFQUFFLENBQUM7UUFDaEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdEQsUUFB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QUFPLENBQUM7Z0JBQzdELE9BQU87b0JBQ0wsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsS0FBSyxFQUFFLG9CQUFvQixPQUFPLEVBQUU7aUJBQ3JDLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZTthQUNoRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQXhQRCxzQ0F3UEM7QUFFTSxNQUFNLG1CQUFtQixHQUFHLEdBQWtCLEVBQUU7SUFDckQsT0FBTyxJQUFJLGFBQWEsRUFBRSxDQUFDO0FBQzdCLENBQUMsQ0FBQztBQUZXLFFBQUEsbUJBQW1CLHVCQUU5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcywgeyBBeGlvc1Byb2dyZXNzRXZlbnQgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnZm9ybS1kYXRhJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBQcm9qZWN0VHlwZSwgQnVpbGRNb2RlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkT3B0aW9ucyB7XG4gIHppcFBhdGg6IHN0cmluZztcbiAgcHJvamVjdE5hbWU6IHN0cmluZztcbiAgcHJvamVjdFR5cGU6IFByb2plY3RUeXBlO1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICBidWlsZE1vZGU6IEJ1aWxkTW9kZTtcbiAgY29uZmlybVNlcnZlckJ1aWxkPzogYm9vbGVhbjtcbiAgLy8gRU5WIG11dGFiaWxpdHkgdHJhY2tpbmdcbiAgZGVwbG95bWVudFNvdXJjZT86ICd1aScgfCAnY2xpJztcbiAgZW52SW5qZWN0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZFJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIHByb2plY3RJZD86IHN0cmluZztcbiAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50U3RhdHVzIHtcbiAgc3RhdHVzOiAncXVldWVkJyB8ICdidWlsZGluZycgfCAnZGVwbG95aW5nJyB8ICdzdWNjZXNzJyB8ICdmYWlsZWQnO1xuICBwcm9ncmVzcz86IG51bWJlcjtcbiAgbG9ncz86IHN0cmluZztcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95V2FybmluZyB7XG4gIGxldmVsOiAnaW5mbycgfCAnd2FybmluZycgfCAnY3JpdGljYWwnO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGNvZGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbmFseXNpcyByZXN1bHQgZnJvbSBiYWNrZW5kXG4gKiBCYWNrZW5kIHRydXN0cyB1c2VyLWRlY2xhcmVkIHR5cGUgLSBubyBhdXRvLWRldGVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveUFuYWx5c2lzIHtcbiAgLy8gVXNlcidzIGRlY2xhcmVkIHR5cGUgKHRydXN0ZWQsIG5vdCB2YWxpZGF0ZWQpXG4gIGRlY2xhcmVkVHlwZTogUHJvamVjdFR5cGU7XG4gIC8vIFBhY2thZ2Ugc3RhdGVcbiAgaGFzUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGhhc0J1aWxkU2NyaXB0OiBib29sZWFuO1xuICBoYXNTdGFydFNjcmlwdDogYm9vbGVhbjtcbiAgLy8gQnVpbGQgc3RhdGUgKGdlbmVyaWMgZGV0ZWN0aW9uKVxuICBoYXNCdWlsZE91dHB1dDogYm9vbGVhbjtcbiAgYnVpbGRPdXRwdXREaXI6IHN0cmluZyB8IG51bGw7XG4gIHJlcXVpcmVzQnVpbGQ6IGJvb2xlYW47XG4gIC8vIFByZWJ1aWx0IGRldGVjdGlvbiAoZ2VuZXJpYylcbiAgaXNQcmVidWlsdFByb2plY3Q6IGJvb2xlYW47XG4gIC8vIFN0YXRpYyBzaXRlIGRldGVjdGlvbiAoZ2VuZXJpYylcbiAgaXNTdGF0aWNTaXRlOiBib29sZWFuO1xuICAvLyBEZXBsb3ltZW50IHN0cmF0ZWd5XG4gIHN0cmF0ZWd5OiAnc3RhdGljJyB8ICdidWlsZC1hbmQtc2VydmUnIHwgJ3NlcnZlLXByZWJ1aWx0JztcbiAgc2VydmVNZXRob2Q6ICdjYWRkeS1zdGF0aWMnIHwgJ3BtMi1wcm94eSc7XG4gIC8vIFdhcm5pbmdzXG4gIHdhcm5pbmdzOiBEZXBsb3lXYXJuaW5nW107XG4gIHJlcXVpcmVzQ29uZmlybWF0aW9uOiBib29sZWFuO1xuICBjb25maXJtYXRpb25SZWFzb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHl6ZVJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGFuYWx5c2lzPzogRGVwbG95QW5hbHlzaXM7XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVXBsb2FkU2VydmljZSB7XG4gIHByaXZhdGUgc2VydmVyVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZy5zZXJ2ZXJVcmwgfHwgIWNvbmZpZy50b2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDTEkgbm90IGNvbmZpZ3VyZWQuIFJ1biBcInJ1bndheSBpbml0XCIgZmlyc3QuJyk7XG4gICAgfVxuICAgIHRoaXMuc2VydmVyVXJsID0gY29uZmlnLnNlcnZlclVybDtcbiAgICB0aGlzLnRva2VuID0gY29uZmlnLnRva2VuO1xuICB9XG5cbiAgYXN5bmMgdXBsb2FkKG9wdGlvbnM6IFVwbG9hZE9wdGlvbnMpOiBQcm9taXNlPFVwbG9hZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgemlwUGF0aCwgcHJvamVjdE5hbWUsIHByb2plY3RUeXBlLCB2ZXJzaW9uLCBidWlsZE1vZGUsIGNvbmZpcm1TZXJ2ZXJCdWlsZCwgZGVwbG95bWVudFNvdXJjZSwgZW52SW5qZWN0ZWQgfSA9IG9wdGlvbnM7XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoemlwUGF0aCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYFppcCBmaWxlIG5vdCBmb3VuZDogJHt6aXBQYXRofWAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZnMuY3JlYXRlUmVhZFN0cmVhbSh6aXBQYXRoKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCduYW1lJywgcHJvamVjdE5hbWUpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgndHlwZScsIHByb2plY3RUeXBlKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2J1aWxkTW9kZScsIGJ1aWxkTW9kZSk7XG4gICAgaWYgKHZlcnNpb24pIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgndmVyc2lvbicsIHZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAoY29uZmlybVNlcnZlckJ1aWxkKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2NvbmZpcm1TZXJ2ZXJCdWlsZCcsICd0cnVlJyk7XG4gICAgfVxuICAgIC8vIEVOViBtdXRhYmlsaXR5IHRyYWNraW5nXG4gICAgaWYgKGRlcGxveW1lbnRTb3VyY2UpIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZGVwbG95bWVudFNvdXJjZScsIGRlcGxveW1lbnRTb3VyY2UpO1xuICAgIH1cbiAgICBpZiAoZW52SW5qZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdlbnZJbmplY3RlZCcsIGVudkluamVjdGVkID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gICAgfVxuXG4gICAgLy8gQ2hvb3NlIGVuZHBvaW50IGJhc2VkIG9uIGJ1aWxkIG1vZGVcbiAgICBjb25zdCBlbmRwb2ludCA9IGJ1aWxkTW9kZSA9PT0gJ2xvY2FsJ1xuICAgICAgPyAnL2FwaS9wcm9qZWN0L2RlcGxveS1wcmVidWlsdCdcbiAgICAgIDogJy9hcGkvcHJvamVjdC9kZXBsb3knO1xuXG4gICAgbG9nZ2VyLmluZm8oYFVwbG9hZGluZyB0byAke3RoaXMuc2VydmVyVXJsfSR7ZW5kcG9pbnR9Li4uYCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KFxuICAgICAgICBgJHt0aGlzLnNlcnZlclVybH0ke2VuZHBvaW50fWAsXG4gICAgICAgIGZvcm1EYXRhLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgLi4uZm9ybURhdGEuZ2V0SGVhZGVycygpLFxuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMudG9rZW59YCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1heEJvZHlMZW5ndGg6IEluZmluaXR5LFxuICAgICAgICAgIG1heENvbnRlbnRMZW5ndGg6IEluZmluaXR5LFxuICAgICAgICAgIHRpbWVvdXQ6IDMwMDAwMCwgLy8gNSBtaW51dGVzXG4gICAgICAgICAgb25VcGxvYWRQcm9ncmVzczogKHByb2dyZXNzRXZlbnQ6IEF4aW9zUHJvZ3Jlc3NFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb2dyZXNzRXZlbnQudG90YWwpIHtcbiAgICAgICAgICAgICAgY29uc3QgcGVyY2VudCA9IE1hdGgucm91bmQoKHByb2dyZXNzRXZlbnQubG9hZGVkICogMTAwKSAvIHByb2dyZXNzRXZlbnQudG90YWwpO1xuICAgICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgXFxyICBVcGxvYWRpbmc6ICR7cGVyY2VudH0lYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuXG4gICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHJlc3BvbnNlLmRhdGEuZGF0YT8ucHJvamVjdElkLFxuICAgICAgICAgIGRlcGxveW1lbnRJZDogcmVzcG9uc2UuZGF0YS5kYXRhPy5kZXBsb3ltZW50SWQsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiByZXNwb25zZS5kYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuXG4gICAgICBpZiAoYXhpb3MuaXNBeGlvc0Vycm9yKGVycm9yKSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IucmVzcG9uc2U/LmRhdGE/LmVycm9yIHx8IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IGBVcGxvYWQgZmFpbGVkOiAke21lc3NhZ2V9YCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0RGVwbG95bWVudFN0YXR1cyhkZXBsb3ltZW50SWQ6IHN0cmluZyk6IFByb21pc2U8RGVwbG95bWVudFN0YXR1cz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldChcbiAgICAgICAgYCR7dGhpcy5zZXJ2ZXJVcmx9L2FwaS9wcm9qZWN0L3N0YXR1cy8ke2RlcGxveW1lbnRJZH1gLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMudG9rZW59YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoYXhpb3MuaXNBeGlvc0Vycm9yKGVycm9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IucmVzcG9uc2U/LmRhdGE/LmVycm9yIHx8IGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcG9sbERlcGxveW1lbnRTdGF0dXMoXG4gICAgZGVwbG95bWVudElkOiBzdHJpbmcsXG4gICAgb25VcGRhdGU6IChzdGF0dXM6IERlcGxveW1lbnRTdGF0dXMpID0+IHZvaWQsXG4gICAgdGltZW91dE1zOiBudW1iZXIgPSAzMDAwMDAgLy8gNSBtaW51dGVzXG4gICk6IFByb21pc2U8RGVwbG95bWVudFN0YXR1cz4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcG9sbEludGVydmFsID0gMjAwMDsgLy8gMiBzZWNvbmRzXG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXRNcykge1xuICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXREZXBsb3ltZW50U3RhdHVzKGRlcGxveW1lbnRJZCk7XG4gICAgICBvblVwZGF0ZShzdGF0dXMpO1xuXG4gICAgICBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnIHx8IHN0YXR1cy5zdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBwb2xsSW50ZXJ2YWwpKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlcGxveW1lbnQgdGltZWQgb3V0Jyk7XG4gIH1cblxuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KFxuICAgICAgICBgJHt0aGlzLnNlcnZlclVybH0vYXBpL2F1dGgvbG9naW5gLFxuICAgICAgICB7IHVzZXJuYW1lLCBwYXNzd29yZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGltZW91dDogMTAwMDAsXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YS5kYXRhPy50b2tlbikge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhLnRva2VuO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZGF0YS5lcnJvciB8fCAnTG9naW4gZmFpbGVkJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChheGlvcy5pc0F4aW9zRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5yZXNwb25zZT8uZGF0YT8uZXJyb3IgfHwgZXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsaXN0UHJvamVjdHMoKTogUHJvbWlzZTxBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdHlwZTogUHJvamVjdFR5cGU7IHN0YXR1czogc3RyaW5nIH0+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KFxuICAgICAgICBgJHt0aGlzLnNlcnZlclVybH0vYXBpL3Byb2plY3RgLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMudG9rZW59YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhIHx8IFtdO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoYXhpb3MuaXNBeGlvc0Vycm9yKGVycm9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IucmVzcG9uc2U/LmRhdGE/LmVycm9yIHx8IGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFuYWx5emUgYSBwYWNrYWdlIGJlZm9yZSBkZXBsb3ltZW50IHRvIGdldCBzZXJ2ZXIgd2FybmluZ3MgYW5kIHJlY29tbWVuZGF0aW9uc1xuICAgKi9cbiAgLyoqXG4gICAqIEFuYWx5emUgYSBwYWNrYWdlIGJlZm9yZSBkZXBsb3ltZW50XG4gICAqIEBwYXJhbSB6aXBQYXRoIC0gUGF0aCB0byB0aGUgemlwIGZpbGVcbiAgICogQHBhcmFtIGRlY2xhcmVkVHlwZSAtIFJFUVVJUkVEIC0gVXNlci1zZWxlY3RlZCBwcm9qZWN0IHR5cGUgKGJhY2tlbmQgdHJ1c3RzIHRoaXMpXG4gICAqL1xuICBhc3luYyBhbmFseXplUGFja2FnZSh6aXBQYXRoOiBzdHJpbmcsIGRlY2xhcmVkVHlwZTogUHJvamVjdFR5cGUpOiBQcm9taXNlPEFuYWx5emVSZXN1bHQ+IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoemlwUGF0aCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYFppcCBmaWxlIG5vdCBmb3VuZDogJHt6aXBQYXRofWAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZnMuY3JlYXRlUmVhZFN0cmVhbSh6aXBQYXRoKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCd0eXBlJywgZGVjbGFyZWRUeXBlKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICAgIGAke3RoaXMuc2VydmVyVXJsfS9hcGkvcHJvamVjdC9hbmFseXplYCxcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAuLi5mb3JtRGF0YS5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy50b2tlbn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4Qm9keUxlbmd0aDogSW5maW5pdHksXG4gICAgICAgICAgbWF4Q29udGVudExlbmd0aDogSW5maW5pdHksXG4gICAgICAgICAgdGltZW91dDogNjAwMDAsIC8vIDEgbWludXRlIGZvciBhbmFseXNpc1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBhbmFseXNpczogcmVzcG9uc2UuZGF0YS5kYXRhLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogcmVzcG9uc2UuZGF0YS5lcnJvciB8fCAnQW5hbHlzaXMgZmFpbGVkJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGF4aW9zLmlzQXhpb3NFcnJvcihlcnJvcikpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yLnJlc3BvbnNlPy5kYXRhPy5lcnJvciB8fCBlcnJvci5tZXNzYWdlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBgQW5hbHlzaXMgZmFpbGVkOiAke21lc3NhZ2V9YCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVVcGxvYWRTZXJ2aWNlID0gKCk6IFVwbG9hZFNlcnZpY2UgPT4ge1xuICByZXR1cm4gbmV3IFVwbG9hZFNlcnZpY2UoKTtcbn07XG4iXX0=
|
package/dist/types.d.ts
ADDED
package/dist/types.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Types bundled from @runway/shared for npm distribution
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlEQUF5RCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFR5cGVzIGJ1bmRsZWQgZnJvbSBAcnVud2F5L3NoYXJlZCBmb3IgbnBtIGRpc3RyaWJ1dGlvblxuXG5leHBvcnQgdHlwZSBQcm9qZWN0VHlwZSA9ICdyZWFjdCcgfCAnbmV4dCcgfCAnbm9kZScgfCAnc3RhdGljJztcbmV4cG9ydCB0eXBlIFBhY2thZ2VNYW5hZ2VyID0gJ25wbScgfCAneWFybicgfCAncG5wbScgfCAnbm9uZSc7XG5leHBvcnQgdHlwZSBCdWlsZE1vZGUgPSAnbG9jYWwnIHwgJ3NlcnZlcic7XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type SecurityMode = 'ip-http' | 'domain-https';
|
|
2
|
+
export interface CLIConfig {
|
|
3
|
+
serverUrl?: string;
|
|
4
|
+
token?: string;
|
|
5
|
+
tokenExpiresAt?: string;
|
|
6
|
+
securityMode?: SecurityMode;
|
|
7
|
+
defaultBuildMode?: 'local' | 'server';
|
|
8
|
+
}
|
|
9
|
+
export declare const getConfig: () => CLIConfig;
|
|
10
|
+
export declare const setServerUrl: (url: string) => void;
|
|
11
|
+
export declare const setToken: (token: string) => void;
|
|
12
|
+
export declare const setDefaultBuildMode: (mode: "local" | "server") => void;
|
|
13
|
+
export declare const clearConfig: () => void;
|
|
14
|
+
export declare const isConfigured: () => boolean;
|
|
15
|
+
export declare const setSecurityMode: (mode: SecurityMode) => void;
|
|
16
|
+
export declare const setTokenExpiresAt: (expiresAt: string) => void;
|
|
17
|
+
export declare const setAuthData: (token: string, expiresAt: string, securityMode: SecurityMode) => void;
|
|
18
|
+
export declare const isTokenExpired: () => boolean;
|
|
19
|
+
export declare const getTokenTimeRemaining: () => number;
|
|
@@ -0,0 +1,102 @@
|
|
|
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.getTokenTimeRemaining = exports.isTokenExpired = exports.setAuthData = exports.setTokenExpiresAt = exports.setSecurityMode = exports.isConfigured = exports.clearConfig = exports.setDefaultBuildMode = exports.setToken = exports.setServerUrl = exports.getConfig = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), '.runway');
|
|
11
|
+
const CONFIG_FILE = path_1.default.join(CONFIG_DIR, 'config.json');
|
|
12
|
+
const ensureConfigDir = () => {
|
|
13
|
+
if (!fs_1.default.existsSync(CONFIG_DIR)) {
|
|
14
|
+
fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const readConfig = () => {
|
|
18
|
+
ensureConfigDir();
|
|
19
|
+
if (!fs_1.default.existsSync(CONFIG_FILE)) {
|
|
20
|
+
return { defaultBuildMode: 'local' };
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const content = fs_1.default.readFileSync(CONFIG_FILE, 'utf-8');
|
|
24
|
+
return JSON.parse(content);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return { defaultBuildMode: 'local' };
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const writeConfig = (config) => {
|
|
31
|
+
ensureConfigDir();
|
|
32
|
+
fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
33
|
+
};
|
|
34
|
+
const getConfig = () => {
|
|
35
|
+
return readConfig();
|
|
36
|
+
};
|
|
37
|
+
exports.getConfig = getConfig;
|
|
38
|
+
const setServerUrl = (url) => {
|
|
39
|
+
const config = readConfig();
|
|
40
|
+
config.serverUrl = url;
|
|
41
|
+
writeConfig(config);
|
|
42
|
+
};
|
|
43
|
+
exports.setServerUrl = setServerUrl;
|
|
44
|
+
const setToken = (token) => {
|
|
45
|
+
const config = readConfig();
|
|
46
|
+
config.token = token;
|
|
47
|
+
writeConfig(config);
|
|
48
|
+
};
|
|
49
|
+
exports.setToken = setToken;
|
|
50
|
+
const setDefaultBuildMode = (mode) => {
|
|
51
|
+
const config = readConfig();
|
|
52
|
+
config.defaultBuildMode = mode;
|
|
53
|
+
writeConfig(config);
|
|
54
|
+
};
|
|
55
|
+
exports.setDefaultBuildMode = setDefaultBuildMode;
|
|
56
|
+
const clearConfig = () => {
|
|
57
|
+
if (fs_1.default.existsSync(CONFIG_FILE)) {
|
|
58
|
+
fs_1.default.unlinkSync(CONFIG_FILE);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
exports.clearConfig = clearConfig;
|
|
62
|
+
const isConfigured = () => {
|
|
63
|
+
const cfg = (0, exports.getConfig)();
|
|
64
|
+
return !!(cfg.serverUrl && cfg.token);
|
|
65
|
+
};
|
|
66
|
+
exports.isConfigured = isConfigured;
|
|
67
|
+
const setSecurityMode = (mode) => {
|
|
68
|
+
const config = readConfig();
|
|
69
|
+
config.securityMode = mode;
|
|
70
|
+
writeConfig(config);
|
|
71
|
+
};
|
|
72
|
+
exports.setSecurityMode = setSecurityMode;
|
|
73
|
+
const setTokenExpiresAt = (expiresAt) => {
|
|
74
|
+
const config = readConfig();
|
|
75
|
+
config.tokenExpiresAt = expiresAt;
|
|
76
|
+
writeConfig(config);
|
|
77
|
+
};
|
|
78
|
+
exports.setTokenExpiresAt = setTokenExpiresAt;
|
|
79
|
+
const setAuthData = (token, expiresAt, securityMode) => {
|
|
80
|
+
const config = readConfig();
|
|
81
|
+
config.token = token;
|
|
82
|
+
config.tokenExpiresAt = expiresAt;
|
|
83
|
+
config.securityMode = securityMode;
|
|
84
|
+
writeConfig(config);
|
|
85
|
+
};
|
|
86
|
+
exports.setAuthData = setAuthData;
|
|
87
|
+
const isTokenExpired = () => {
|
|
88
|
+
const config = (0, exports.getConfig)();
|
|
89
|
+
if (!config.tokenExpiresAt)
|
|
90
|
+
return true;
|
|
91
|
+
return new Date(config.tokenExpiresAt) < new Date();
|
|
92
|
+
};
|
|
93
|
+
exports.isTokenExpired = isTokenExpired;
|
|
94
|
+
const getTokenTimeRemaining = () => {
|
|
95
|
+
const config = (0, exports.getConfig)();
|
|
96
|
+
if (!config.tokenExpiresAt)
|
|
97
|
+
return 0;
|
|
98
|
+
const remaining = new Date(config.tokenExpiresAt).getTime() - Date.now();
|
|
99
|
+
return Math.max(0, remaining);
|
|
100
|
+
};
|
|
101
|
+
exports.getTokenTimeRemaining = getTokenTimeRemaining;
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLDRDQUFvQjtBQVlwQixNQUFNLFVBQVUsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN0RCxNQUFNLFdBQVcsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUV6RCxNQUFNLGVBQWUsR0FBRyxHQUFTLEVBQUU7SUFDakMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMvQixZQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxHQUFjLEVBQUU7SUFDakMsZUFBZSxFQUFFLENBQUM7SUFDbEIsSUFBSSxDQUFDLFlBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQWlCLEVB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WSxFQUFFO0lBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUEsaUJBQVMsR0FBRSxDQUFDO0lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3hDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7QUFDdEQsQ0FBQyxDQUFDO0FBSlcsUUFBQSxjQUFjLGtCQUl6QjtBQUVLLE1BQU0scUJBQXFCLEdBQUcsR0FBVyxFQUFFO0lBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUEsaUJBQVMsR0FBRSxDQUFDO0lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDekUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFMVyxRQUFBLHFCQUFxQix5QkFLaEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuXG5leHBvcnQgdHlwZSBTZWN1cml0eU1vZGUgPSAnaXAtaHR0cCcgfCAnZG9tYWluLWh0dHBzJztcblxuZXhwb3J0IGludGVyZmFjZSBDTElDb25maWcge1xuICBzZXJ2ZXJVcmw/OiBzdHJpbmc7XG4gIHRva2VuPzogc3RyaW5nO1xuICB0b2tlbkV4cGlyZXNBdD86IHN0cmluZztcbiAgc2VjdXJpdHlNb2RlPzogU2VjdXJpdHlNb2RlO1xuICBkZWZhdWx0QnVpbGRNb2RlPzogJ2xvY2FsJyB8ICdzZXJ2ZXInO1xufVxuXG5jb25zdCBDT05GSUdfRElSID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5ydW53YXknKTtcbmNvbnN0IENPTkZJR19GSUxFID0gcGF0aC5qb2luKENPTkZJR19ESVIsICdjb25maWcuanNvbicpO1xuXG5jb25zdCBlbnN1cmVDb25maWdEaXIgPSAoKTogdm9pZCA9PiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhDT05GSUdfRElSKSkge1xuICAgIGZzLm1rZGlyU3luYyhDT05GSUdfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxufTtcblxuY29uc3QgcmVhZENvbmZpZyA9ICgpOiBDTElDb25maWcgPT4ge1xuICBlbnN1cmVDb25maWdEaXIoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKENPTkZJR19GSUxFKSkge1xuICAgIHJldHVybiB7IGRlZmF1bHRCdWlsZE1vZGU6ICdsb2NhbCcgfTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoQ09ORklHX0ZJTEUsICd1dGYtOCcpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBkZWZhdWx0QnVpbGRNb2RlOiAnbG9jYWwnIH07XG4gIH1cbn07XG5cbmNvbnN0IHdyaXRlQ29uZmlnID0gKGNvbmZpZzogQ0xJQ29uZmlnKTogdm9pZCA9PiB7XG4gIGVuc3VyZUNvbmZpZ0RpcigpO1xuICBmcy53cml0ZUZpbGVTeW5jKENPTkZJR19GSUxFLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAoKTogQ0xJQ29uZmlnID0+IHtcbiAgcmV0dXJuIHJlYWRDb25maWcoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRTZXJ2ZXJVcmwgPSAodXJsOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgY29uZmlnID0gcmVhZENvbmZpZygpO1xuICBjb25maWcuc2VydmVyVXJsID0gdXJsO1xuICB3cml0ZUNvbmZpZyhjb25maWcpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFRva2VuID0gKHRva2VuOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgY29uZmlnID0gcmVhZENvbmZpZygpO1xuICBjb25maWcudG9rZW4gPSB0b2tlbjtcbiAgd3JpdGVDb25maWcoY29uZmlnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZWZhdWx0QnVpbGRNb2RlID0gKG1vZGU6ICdsb2NhbCcgfCAnc2VydmVyJyk6IHZvaWQgPT4ge1xuICBjb25zdCBjb25maWcgPSByZWFkQ29uZmlnKCk7XG4gIGNvbmZpZy5kZWZhdWx0QnVpbGRNb2RlID0gbW9kZTtcbiAgd3JpdGVDb25maWcoY29uZmlnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbGVhckNvbmZpZyA9ICgpOiB2b2lkID0+IHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoQ09ORklHX0ZJTEUpKSB7XG4gICAgZnMudW5saW5rU3luYyhDT05GSUdfRklMRSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc0NvbmZpZ3VyZWQgPSAoKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNmZyA9IGdldENvbmZpZygpO1xuICByZXR1cm4gISEoY2ZnLnNlcnZlclVybCAmJiBjZmcudG9rZW4pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFNlY3VyaXR5TW9kZSA9IChtb2RlOiBTZWN1cml0eU1vZGUpOiB2b2lkID0+IHtcbiAgY29uc3QgY29uZmlnID0gcmVhZENvbmZpZygpO1xuICBjb25maWcuc2VjdXJpdHlNb2RlID0gbW9kZTtcbiAgd3JpdGVDb25maWcoY29uZmlnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRUb2tlbkV4cGlyZXNBdCA9IChleHBpcmVzQXQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBjb25maWcgPSByZWFkQ29uZmlnKCk7XG4gIGNvbmZpZy50b2tlbkV4cGlyZXNBdCA9IGV4cGlyZXNBdDtcbiAgd3JpdGVDb25maWcoY29uZmlnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRBdXRoRGF0YSA9IChcbiAgdG9rZW46IHN0cmluZyxcbiAgZXhwaXJlc0F0OiBzdHJpbmcsXG4gIHNlY3VyaXR5TW9kZTogU2VjdXJpdHlNb2RlXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgY29uZmlnID0gcmVhZENvbmZpZygpO1xuICBjb25maWcudG9rZW4gPSB0b2tlbjtcbiAgY29uZmlnLnRva2VuRXhwaXJlc0F0ID0gZXhwaXJlc0F0O1xuICBjb25maWcuc2VjdXJpdHlNb2RlID0gc2VjdXJpdHlNb2RlO1xuICB3cml0ZUNvbmZpZyhjb25maWcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVG9rZW5FeHBpcmVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgaWYgKCFjb25maWcudG9rZW5FeHBpcmVzQXQpIHJldHVybiB0cnVlO1xuICByZXR1cm4gbmV3IERhdGUoY29uZmlnLnRva2VuRXhwaXJlc0F0KSA8IG5ldyBEYXRlKCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VG9rZW5UaW1lUmVtYWluaW5nID0gKCk6IG51bWJlciA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZygpO1xuICBpZiAoIWNvbmZpZy50b2tlbkV4cGlyZXNBdCkgcmV0dXJuIDA7XG4gIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBEYXRlKGNvbmZpZy50b2tlbkV4cGlyZXNBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIHJlbWFpbmluZyk7XG59O1xuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const logger: {
|
|
2
|
+
info: (message: string) => void;
|
|
3
|
+
success: (message: string) => void;
|
|
4
|
+
warn: (message: string) => void;
|
|
5
|
+
error: (message: string) => void;
|
|
6
|
+
step: (step: number, total: number, message: string) => void;
|
|
7
|
+
dim: (message: string) => void;
|
|
8
|
+
blank: () => void;
|
|
9
|
+
header: (message: string) => void;
|
|
10
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
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.logger = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
exports.logger = {
|
|
9
|
+
info: (message) => {
|
|
10
|
+
console.log(chalk_1.default.blue('ℹ'), message);
|
|
11
|
+
},
|
|
12
|
+
success: (message) => {
|
|
13
|
+
console.log(chalk_1.default.green('✓'), message);
|
|
14
|
+
},
|
|
15
|
+
warn: (message) => {
|
|
16
|
+
console.log(chalk_1.default.yellow('⚠'), message);
|
|
17
|
+
},
|
|
18
|
+
error: (message) => {
|
|
19
|
+
console.log(chalk_1.default.red('✗'), message);
|
|
20
|
+
},
|
|
21
|
+
step: (step, total, message) => {
|
|
22
|
+
console.log(chalk_1.default.cyan(`[${step}/${total}]`), message);
|
|
23
|
+
},
|
|
24
|
+
dim: (message) => {
|
|
25
|
+
console.log(chalk_1.default.dim(message));
|
|
26
|
+
},
|
|
27
|
+
blank: () => {
|
|
28
|
+
console.log('');
|
|
29
|
+
},
|
|
30
|
+
header: (message) => {
|
|
31
|
+
console.log('');
|
|
32
|
+
console.log(chalk_1.default.bold.cyan('━'.repeat(50)));
|
|
33
|
+
console.log(chalk_1.default.bold.cyan(` ${message}`));
|
|
34
|
+
console.log(chalk_1.default.bold.cyan('━'.repeat(50)));
|
|
35
|
+
console.log('');
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBMEI7QUFFYixRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsQ0FBQyxPQUFlLEVBQUUsRUFBRTtRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDLE9BQWUsRUFBRSxFQUFFO1FBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxFQUFFLENBQUMsT0FBZSxFQUFFLEVBQUU7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLEVBQUUsQ0FBQyxPQUFlLEVBQUUsRUFBRTtRQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksRUFBRSxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsT0FBZSxFQUFFLEVBQUU7UUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELEdBQUcsRUFBRSxDQUFDLE9BQWUsRUFBRSxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxFQUFFLENBQUMsT0FBZSxFQUFFLEVBQUU7UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IHtcbiAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoJ+KEuScpLCBtZXNzYWdlKTtcbiAgfSxcblxuICBzdWNjZXNzOiAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckycpLCBtZXNzYWdlKTtcbiAgfSxcblxuICB3YXJuOiAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCfimqAnKSwgbWVzc2FnZSk7XG4gIH0sXG5cbiAgZXJyb3I6IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJ+KclycpLCBtZXNzYWdlKTtcbiAgfSxcblxuICBzdGVwOiAoc3RlcDogbnVtYmVyLCB0b3RhbDogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBbJHtzdGVwfS8ke3RvdGFsfV1gKSwgbWVzc2FnZSk7XG4gIH0sXG5cbiAgZGltOiAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKG1lc3NhZ2UpKTtcbiAgfSxcblxuICBibGFuazogKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfSxcblxuICBoZWFkZXI6IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZC5jeWFuKCfilIEnLnJlcGVhdCg1MCkpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkLmN5YW4oYCAgJHttZXNzYWdlfWApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkLmN5YW4oJ+KUgScucmVwZWF0KDUwKSkpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfSxcbn07XG4iXX0=
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "runway-cli",
|
|
3
|
+
"version": "0.8.0",
|
|
4
|
+
"description": "CLI tool for deploying projects to Runway",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"runway": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "ts-node src/index.ts",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"cli",
|
|
21
|
+
"deployment",
|
|
22
|
+
"runway",
|
|
23
|
+
"deploy",
|
|
24
|
+
"hosting"
|
|
25
|
+
],
|
|
26
|
+
"author": "",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": ""
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"archiver": "^6.0.0",
|
|
34
|
+
"axios": "^1.7.9",
|
|
35
|
+
"chalk": "^4.1.2",
|
|
36
|
+
"commander": "^11.1.0",
|
|
37
|
+
"form-data": "^4.0.0",
|
|
38
|
+
"inquirer": "^8.2.6",
|
|
39
|
+
"ora": "^5.4.1"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/archiver": "^6.0.3",
|
|
43
|
+
"@types/inquirer": "^8.2.10",
|
|
44
|
+
"@types/node": "^20.0.0",
|
|
45
|
+
"ts-node": "^10.9.1",
|
|
46
|
+
"typescript": "^5.0.0"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=18.0.0"
|
|
50
|
+
}
|
|
51
|
+
}
|