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.
@@ -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=
@@ -0,0 +1,3 @@
1
+ export type ProjectType = 'react' | 'next' | 'node' | 'static';
2
+ export type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'none';
3
+ export type BuildMode = 'local' | 'server';
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
+ }