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,180 @@
|
|
|
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.buildService = exports.BuildService = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
class BuildService {
|
|
12
|
+
async build(options) {
|
|
13
|
+
const startTime = Date.now();
|
|
14
|
+
const { projectPath, projectType, projectName, packageManager, envFile } = options;
|
|
15
|
+
// Static projects don't need building
|
|
16
|
+
if (projectType === 'static') {
|
|
17
|
+
logger_1.logger.info('Static project - no build required');
|
|
18
|
+
return {
|
|
19
|
+
success: true,
|
|
20
|
+
outputDir: projectPath,
|
|
21
|
+
duration: Date.now() - startTime,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
// Check if build script exists (especially important for Node.js)
|
|
25
|
+
const pkgPath = path_1.default.join(projectPath, 'package.json');
|
|
26
|
+
if (fs_1.default.existsSync(pkgPath)) {
|
|
27
|
+
const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath, 'utf-8'));
|
|
28
|
+
if (!pkg.scripts?.build) {
|
|
29
|
+
// Node.js projects often don't have a build script
|
|
30
|
+
if (projectType === 'node') {
|
|
31
|
+
logger_1.logger.info('Node.js project - no build script found, skipping build');
|
|
32
|
+
return {
|
|
33
|
+
success: true,
|
|
34
|
+
outputDir: projectPath,
|
|
35
|
+
duration: Date.now() - startTime,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// For React/Next, a build script is required
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
outputDir: projectPath,
|
|
42
|
+
duration: Date.now() - startTime,
|
|
43
|
+
error: 'Missing "build" script in package.json',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Load environment variables from file if provided
|
|
48
|
+
const env = { ...process.env };
|
|
49
|
+
if (envFile && fs_1.default.existsSync(envFile)) {
|
|
50
|
+
const envContent = fs_1.default.readFileSync(envFile, 'utf-8');
|
|
51
|
+
for (const line of envContent.split('\n')) {
|
|
52
|
+
const trimmed = line.trim();
|
|
53
|
+
if (trimmed && !trimmed.startsWith('#')) {
|
|
54
|
+
const [key, ...valueParts] = trimmed.split('=');
|
|
55
|
+
if (key) {
|
|
56
|
+
env[key] = valueParts.join('=');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Check if dependencies need to be installed
|
|
62
|
+
const nodeModulesPath = path_1.default.join(projectPath, 'node_modules');
|
|
63
|
+
if (!fs_1.default.existsSync(nodeModulesPath)) {
|
|
64
|
+
logger_1.logger.info('Installing dependencies...');
|
|
65
|
+
const installArgs = packageManager === 'yarn' ? [] : ['install'];
|
|
66
|
+
try {
|
|
67
|
+
await this.runCommand(packageManager, installArgs, projectPath, env);
|
|
68
|
+
logger_1.logger.success('Dependencies installed');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
outputDir: projectPath,
|
|
74
|
+
duration: Date.now() - startTime,
|
|
75
|
+
error: `Failed to install dependencies: ${error instanceof Error ? error.message : String(error)}`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Determine build command based on project type
|
|
80
|
+
const buildArgs = this.getBuildArgs(projectType, projectName, packageManager);
|
|
81
|
+
const outputDir = this.getOutputDir(projectPath, projectType);
|
|
82
|
+
logger_1.logger.info(`Building ${projectType} project...`);
|
|
83
|
+
logger_1.logger.dim(`Command: ${packageManager} ${buildArgs.join(' ')}`);
|
|
84
|
+
try {
|
|
85
|
+
await this.runCommand(packageManager, buildArgs, projectPath, env);
|
|
86
|
+
// Verify build output exists
|
|
87
|
+
if (!fs_1.default.existsSync(outputDir)) {
|
|
88
|
+
return {
|
|
89
|
+
success: false,
|
|
90
|
+
outputDir,
|
|
91
|
+
duration: Date.now() - startTime,
|
|
92
|
+
error: `Build output directory not found: ${outputDir}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
success: true,
|
|
97
|
+
outputDir,
|
|
98
|
+
duration: Date.now() - startTime,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return {
|
|
103
|
+
success: false,
|
|
104
|
+
outputDir,
|
|
105
|
+
duration: Date.now() - startTime,
|
|
106
|
+
error: error instanceof Error ? error.message : String(error),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
getBuildArgs(projectType, projectName, packageManager) {
|
|
111
|
+
const safeName = projectName.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
112
|
+
const basePath = `/app/${safeName}`;
|
|
113
|
+
const baseArgs = ['run', 'build'];
|
|
114
|
+
if (projectType === 'react') {
|
|
115
|
+
// Pass base path for Vite or CRA
|
|
116
|
+
if (packageManager === 'npm') {
|
|
117
|
+
return [...baseArgs, '--', `--base=${basePath}`];
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return [...baseArgs, `--base=${basePath}`];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// For Next.js and Node.js, just run the build script
|
|
124
|
+
return baseArgs;
|
|
125
|
+
}
|
|
126
|
+
getOutputDir(projectPath, projectType) {
|
|
127
|
+
switch (projectType) {
|
|
128
|
+
case 'react':
|
|
129
|
+
// Check for Vite vs CRA
|
|
130
|
+
if (fs_1.default.existsSync(path_1.default.join(projectPath, 'vite.config.ts')) ||
|
|
131
|
+
fs_1.default.existsSync(path_1.default.join(projectPath, 'vite.config.js'))) {
|
|
132
|
+
return path_1.default.join(projectPath, 'dist');
|
|
133
|
+
}
|
|
134
|
+
return path_1.default.join(projectPath, 'build');
|
|
135
|
+
case 'next':
|
|
136
|
+
return path_1.default.join(projectPath, '.next');
|
|
137
|
+
case 'node':
|
|
138
|
+
// For Node.js, the project root is the "output"
|
|
139
|
+
return projectPath;
|
|
140
|
+
case 'static':
|
|
141
|
+
// For static sites, the project root is the "output"
|
|
142
|
+
return projectPath;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
runCommand(command, args, cwd, env) {
|
|
146
|
+
return new Promise((resolve, reject) => {
|
|
147
|
+
const proc = (0, child_process_1.spawn)(command, args, {
|
|
148
|
+
cwd,
|
|
149
|
+
env,
|
|
150
|
+
stdio: 'pipe',
|
|
151
|
+
shell: true,
|
|
152
|
+
});
|
|
153
|
+
let stdout = '';
|
|
154
|
+
let stderr = '';
|
|
155
|
+
proc.stdout?.on('data', (data) => {
|
|
156
|
+
stdout += data.toString();
|
|
157
|
+
// Print build output in real-time
|
|
158
|
+
process.stdout.write(data);
|
|
159
|
+
});
|
|
160
|
+
proc.stderr?.on('data', (data) => {
|
|
161
|
+
stderr += data.toString();
|
|
162
|
+
process.stderr.write(data);
|
|
163
|
+
});
|
|
164
|
+
proc.on('close', (code) => {
|
|
165
|
+
if (code === 0) {
|
|
166
|
+
resolve();
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
reject(new Error(`Build failed with exit code ${code}\n${stderr}`));
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
proc.on('error', (error) => {
|
|
173
|
+
reject(error);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.BuildService = BuildService;
|
|
179
|
+
exports.buildService = new BuildService();
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2J1aWxkU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxpREFBc0M7QUFDdEMsZ0RBQXdCO0FBQ3hCLDRDQUFvQjtBQUVwQiw0Q0FBeUM7QUFpQnpDLE1BQWEsWUFBWTtJQUN2QixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQXFCO1FBQy9CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUVuRixzQ0FBc0M7UUFDdEMsSUFBSSxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsZUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQ2xELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsU0FBUyxFQUFFLFdBQVc7Z0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUzthQUNqQyxDQUFDO1FBQ0osQ0FBQztRQUVELGtFQUFrRTtRQUNsRSxNQUFNLE9BQU8sR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN2RCxJQUFJLFlBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0JBQ3hCLG1EQUFtRDtnQkFDbkQsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQzNC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QUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBMUxELG9DQTBMQztBQUVZLFFBQUEsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgUHJvamVjdFR5cGUsIFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICBwcm9qZWN0UGF0aDogc3RyaW5nO1xuICBwcm9qZWN0VHlwZTogUHJvamVjdFR5cGU7XG4gIHByb2plY3ROYW1lOiBzdHJpbmc7XG4gIHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlcjtcbiAgZW52RmlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG91dHB1dERpcjogc3RyaW5nO1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkU2VydmljZSB7XG4gIGFzeW5jIGJ1aWxkKG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyk6IFByb21pc2U8QnVpbGRSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgcHJvamVjdFBhdGgsIHByb2plY3RUeXBlLCBwcm9qZWN0TmFtZSwgcGFja2FnZU1hbmFnZXIsIGVudkZpbGUgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBTdGF0aWMgcHJvamVjdHMgZG9uJ3QgbmVlZCBidWlsZGluZ1xuICAgIGlmIChwcm9qZWN0VHlwZSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdTdGF0aWMgcHJvamVjdCAtIG5vIGJ1aWxkIHJlcXVpcmVkJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBvdXRwdXREaXI6IHByb2plY3RQYXRoLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYnVpbGQgc2NyaXB0IGV4aXN0cyAoZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIE5vZGUuanMpXG4gICAgY29uc3QgcGtnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBrZ1BhdGgpKSB7XG4gICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwa2dQYXRoLCAndXRmLTgnKSk7XG4gICAgICBpZiAoIXBrZy5zY3JpcHRzPy5idWlsZCkge1xuICAgICAgICAvLyBOb2RlLmpzIHByb2plY3RzIG9mdGVuIGRvbid0IGhhdmUgYSBidWlsZCBzY3JpcHRcbiAgICAgICAgaWYgKHByb2plY3RUeXBlID09PSAnbm9kZScpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnTm9kZS5qcyBwcm9qZWN0IC0gbm8gYnVpbGQgc2NyaXB0IGZvdW5kLCBza2lwcGluZyBidWlsZCcpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgb3V0cHV0RGlyOiBwcm9qZWN0UGF0aCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIFJlYWN0L05leHQsIGEgYnVpbGQgc2NyaXB0IGlzIHJlcXVpcmVkXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgb3V0cHV0RGlyOiBwcm9qZWN0UGF0aCxcbiAgICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgICBlcnJvcjogJ01pc3NpbmcgXCJidWlsZFwiIHNjcmlwdCBpbiBwYWNrYWdlLmpzb24nLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gZmlsZSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgLi4ucHJvY2Vzcy5lbnYgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9O1xuXG4gICAgaWYgKGVudkZpbGUgJiYgZnMuZXhpc3RzU3luYyhlbnZGaWxlKSkge1xuICAgICAgY29uc3QgZW52Q29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhlbnZGaWxlLCAndXRmLTgnKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBlbnZDb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICAgIGlmICh0cmltbWVkICYmICF0cmltbWVkLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICAgIGNvbnN0IFtrZXksIC4uLnZhbHVlUGFydHNdID0gdHJpbW1lZC5zcGxpdCgnPScpO1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGVudltrZXldID0gdmFsdWVQYXJ0cy5qb2luKCc9Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZGVwZW5kZW5jaWVzIG5lZWQgdG8gYmUgaW5zdGFsbGVkXG4gICAgY29uc3Qgbm9kZU1vZHVsZXNQYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnbm9kZV9tb2R1bGVzJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG5vZGVNb2R1bGVzUGF0aCkpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLicpO1xuICAgICAgY29uc3QgaW5zdGFsbEFyZ3MgPSBwYWNrYWdlTWFuYWdlciA9PT0gJ3lhcm4nID8gW10gOiBbJ2luc3RhbGwnXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuQ29tbWFuZChwYWNrYWdlTWFuYWdlciwgaW5zdGFsbEFyZ3MsIHByb2plY3RQYXRoLCBlbnYpO1xuICAgICAgICBsb2dnZXIuc3VjY2VzcygnRGVwZW5kZW5jaWVzIGluc3RhbGxlZCcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBvdXRwdXREaXI6IHByb2plY3RQYXRoLFxuICAgICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICAgIGVycm9yOiBgRmFpbGVkIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZSBidWlsZCBjb21tYW5kIGJhc2VkIG9uIHByb2plY3QgdHlwZVxuICAgIGNvbnN0IGJ1aWxkQXJncyA9IHRoaXMuZ2V0QnVpbGRBcmdzKHByb2plY3RUeXBlLCBwcm9qZWN0TmFtZSwgcGFja2FnZU1hbmFnZXIpO1xuICAgIGNvbnN0IG91dHB1dERpciA9IHRoaXMuZ2V0T3V0cHV0RGlyKHByb2plY3RQYXRoLCBwcm9qZWN0VHlwZSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgQnVpbGRpbmcgJHtwcm9qZWN0VHlwZX0gcHJvamVjdC4uLmApO1xuICAgIGxvZ2dlci5kaW0oYENvbW1hbmQ6ICR7cGFja2FnZU1hbmFnZXJ9ICR7YnVpbGRBcmdzLmpvaW4oJyAnKX1gKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJ1bkNvbW1hbmQocGFja2FnZU1hbmFnZXIsIGJ1aWxkQXJncywgcHJvamVjdFBhdGgsIGVudik7XG5cbiAgICAgIC8vIFZlcmlmeSBidWlsZCBvdXRwdXQgZXhpc3RzXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG91dHB1dERpcixcbiAgICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgICBlcnJvcjogYEJ1aWxkIG91dHB1dCBkaXJlY3Rvcnkgbm90IGZvdW5kOiAke291dHB1dERpcn1gLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBvdXRwdXREaXIsXG4gICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG91dHB1dERpcixcbiAgICAgICAgZHVyYXRpb246IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGRBcmdzKHByb2plY3RUeXBlOiBQcm9qZWN0VHlwZSwgcHJvamVjdE5hbWU6IHN0cmluZywgcGFja2FnZU1hbmFnZXI6IFBhY2thZ2VNYW5hZ2VyKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNhZmVOYW1lID0gcHJvamVjdE5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywgJy0nKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IGAvYXBwLyR7c2FmZU5hbWV9YDtcblxuICAgIGNvbnN0IGJhc2VBcmdzID0gWydydW4nLCAnYnVpbGQnXTtcblxuICAgIGlmIChwcm9qZWN0VHlwZSA9PT0gJ3JlYWN0Jykge1xuICAgICAgLy8gUGFzcyBiYXNlIHBhdGggZm9yIFZpdGUgb3IgQ1JBXG4gICAgICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICducG0nKSB7XG4gICAgICAgIHJldHVybiBbLi4uYmFzZUFyZ3MsICctLScsIGAtLWJhc2U9JHtiYXNlUGF0aH1gXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbLi4uYmFzZUFyZ3MsIGAtLWJhc2U9JHtiYXNlUGF0aH1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3IgTmV4dC5qcyBhbmQgTm9kZS5qcywganVzdCBydW4gdGhlIGJ1aWxkIHNjcmlwdFxuICAgIHJldHVybiBiYXNlQXJncztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3V0cHV0RGlyKHByb2plY3RQYXRoOiBzdHJpbmcsIHByb2plY3RUeXBlOiBQcm9qZWN0VHlwZSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChwcm9qZWN0VHlwZSkge1xuICAgICAgY2FzZSAncmVhY3QnOlxuICAgICAgICAvLyBDaGVjayBmb3IgVml0ZSB2cyBDUkFcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3RQYXRoLCAndml0ZS5jb25maWcudHMnKSkgfHxcbiAgICAgICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3RQYXRoLCAndml0ZS5jb25maWcuanMnKSkpIHtcbiAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnZGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICdidWlsZCcpO1xuXG4gICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5uZXh0Jyk7XG5cbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICAvLyBGb3IgTm9kZS5qcywgdGhlIHByb2plY3Qgcm9vdCBpcyB0aGUgXCJvdXRwdXRcIlxuICAgICAgICByZXR1cm4gcHJvamVjdFBhdGg7XG5cbiAgICAgIGNhc2UgJ3N0YXRpYyc6XG4gICAgICAgIC8vIEZvciBzdGF0aWMgc2l0ZXMsIHRoZSBwcm9qZWN0IHJvb3QgaXMgdGhlIFwib3V0cHV0XCJcbiAgICAgICAgcmV0dXJuIHByb2plY3RQYXRoO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgZW52LFxuICAgICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG5cbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vIFByaW50IGJ1aWxkIG91dHB1dCBpbiByZWFsLXRpbWVcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICB9KTtcblxuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3RkZXJyICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICB9KTtcblxuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBCdWlsZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtjb2RlfVxcbiR7c3RkZXJyfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYnVpbGRTZXJ2aWNlID0gbmV3IEJ1aWxkU2VydmljZSgpO1xuIl19
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ProjectType } from '../types';
|
|
2
|
+
export interface PackageOptions {
|
|
3
|
+
projectPath: string;
|
|
4
|
+
projectType: ProjectType;
|
|
5
|
+
buildOutputDir: string;
|
|
6
|
+
includeSource: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface PackageResult {
|
|
9
|
+
zipPath: string;
|
|
10
|
+
size: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class PackageService {
|
|
13
|
+
package(options: PackageOptions): Promise<PackageResult>;
|
|
14
|
+
private addSourceFiles;
|
|
15
|
+
private addBuildArtifacts;
|
|
16
|
+
private addDirectory;
|
|
17
|
+
private addLockFile;
|
|
18
|
+
cleanup(zipPath: string): void;
|
|
19
|
+
}
|
|
20
|
+
export declare const packageService: PackageService;
|
|
@@ -0,0 +1,153 @@
|
|
|
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.packageService = exports.PackageService = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const archiver_1 = __importDefault(require("archiver"));
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
class PackageService {
|
|
12
|
+
async package(options) {
|
|
13
|
+
const { projectPath, projectType, buildOutputDir, includeSource } = options;
|
|
14
|
+
const zipPath = path_1.default.join(projectPath, '.runway-deploy.zip');
|
|
15
|
+
// Remove existing zip if present
|
|
16
|
+
if (fs_1.default.existsSync(zipPath)) {
|
|
17
|
+
fs_1.default.unlinkSync(zipPath);
|
|
18
|
+
}
|
|
19
|
+
logger_1.logger.info('Creating deployment package...');
|
|
20
|
+
const output = fs_1.default.createWriteStream(zipPath);
|
|
21
|
+
const archive = (0, archiver_1.default)('zip', {
|
|
22
|
+
zlib: { level: 9 }, // Maximum compression
|
|
23
|
+
});
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
output.on('close', () => {
|
|
26
|
+
const size = archive.pointer();
|
|
27
|
+
logger_1.logger.success(`Package created: ${(size / 1024 / 1024).toFixed(2)} MB`);
|
|
28
|
+
resolve({ zipPath, size });
|
|
29
|
+
});
|
|
30
|
+
archive.on('error', (err) => {
|
|
31
|
+
reject(err);
|
|
32
|
+
});
|
|
33
|
+
archive.pipe(output);
|
|
34
|
+
if (includeSource) {
|
|
35
|
+
// Server-build mode: include source files
|
|
36
|
+
this.addSourceFiles(archive, projectPath);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Local-build mode: include only build artifacts
|
|
40
|
+
this.addBuildArtifacts(archive, projectPath, projectType, buildOutputDir);
|
|
41
|
+
}
|
|
42
|
+
archive.finalize();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
addSourceFiles(archive, projectPath) {
|
|
46
|
+
// Include all files except node_modules, .git, and build outputs
|
|
47
|
+
const ignorePatterns = [
|
|
48
|
+
'node_modules/**',
|
|
49
|
+
'.git/**',
|
|
50
|
+
'.next/**',
|
|
51
|
+
'dist/**',
|
|
52
|
+
'build/**',
|
|
53
|
+
'.runway-deploy.zip',
|
|
54
|
+
'*.log',
|
|
55
|
+
'.env.local',
|
|
56
|
+
'.env.*.local',
|
|
57
|
+
];
|
|
58
|
+
archive.glob('**/*', {
|
|
59
|
+
cwd: projectPath,
|
|
60
|
+
ignore: ignorePatterns,
|
|
61
|
+
dot: true, // Include dotfiles
|
|
62
|
+
});
|
|
63
|
+
logger_1.logger.dim('Including source files for server-side build');
|
|
64
|
+
}
|
|
65
|
+
addBuildArtifacts(archive, projectPath, projectType, buildOutputDir) {
|
|
66
|
+
// Include package.json if it exists (optional for static sites)
|
|
67
|
+
const packageJsonPath = path_1.default.join(projectPath, 'package.json');
|
|
68
|
+
if (fs_1.default.existsSync(packageJsonPath)) {
|
|
69
|
+
archive.file(packageJsonPath, { name: 'package.json' });
|
|
70
|
+
}
|
|
71
|
+
switch (projectType) {
|
|
72
|
+
case 'react':
|
|
73
|
+
// Include built static files
|
|
74
|
+
this.addDirectory(archive, buildOutputDir, 'dist');
|
|
75
|
+
logger_1.logger.dim(`Including build output from ${buildOutputDir}`);
|
|
76
|
+
break;
|
|
77
|
+
case 'next':
|
|
78
|
+
// Include .next directory
|
|
79
|
+
this.addDirectory(archive, path_1.default.join(projectPath, '.next'), '.next');
|
|
80
|
+
// Include public directory if exists
|
|
81
|
+
const publicDir = path_1.default.join(projectPath, 'public');
|
|
82
|
+
if (fs_1.default.existsSync(publicDir)) {
|
|
83
|
+
this.addDirectory(archive, publicDir, 'public');
|
|
84
|
+
}
|
|
85
|
+
// Include next.config.js if exists
|
|
86
|
+
for (const configFile of ['next.config.js', 'next.config.mjs', 'next.config.ts']) {
|
|
87
|
+
const configPath = path_1.default.join(projectPath, configFile);
|
|
88
|
+
if (fs_1.default.existsSync(configPath)) {
|
|
89
|
+
archive.file(configPath, { name: configFile });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Include package-lock.json or yarn.lock for production dependencies
|
|
93
|
+
this.addLockFile(archive, projectPath);
|
|
94
|
+
logger_1.logger.dim('Including Next.js build artifacts');
|
|
95
|
+
break;
|
|
96
|
+
case 'node':
|
|
97
|
+
// For Node.js, include everything except node_modules
|
|
98
|
+
const nodeIgnorePatterns = [
|
|
99
|
+
'node_modules/**',
|
|
100
|
+
'.git/**',
|
|
101
|
+
'.runway-deploy.zip',
|
|
102
|
+
'*.log',
|
|
103
|
+
];
|
|
104
|
+
archive.glob('**/*', {
|
|
105
|
+
cwd: projectPath,
|
|
106
|
+
ignore: nodeIgnorePatterns,
|
|
107
|
+
dot: true,
|
|
108
|
+
});
|
|
109
|
+
logger_1.logger.dim('Including Node.js project files');
|
|
110
|
+
break;
|
|
111
|
+
case 'static':
|
|
112
|
+
// For static sites, include HTML, CSS, JS, and common assets
|
|
113
|
+
const staticIgnorePatterns = [
|
|
114
|
+
'node_modules/**',
|
|
115
|
+
'.git/**',
|
|
116
|
+
'.runway-deploy.zip',
|
|
117
|
+
'*.log',
|
|
118
|
+
'.env',
|
|
119
|
+
'.env.*',
|
|
120
|
+
];
|
|
121
|
+
archive.glob('**/*', {
|
|
122
|
+
cwd: projectPath,
|
|
123
|
+
ignore: staticIgnorePatterns,
|
|
124
|
+
dot: false, // Don't include dotfiles for static sites
|
|
125
|
+
});
|
|
126
|
+
logger_1.logger.dim('Including static site files');
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
addDirectory(archive, dirPath, destPath) {
|
|
131
|
+
if (fs_1.default.existsSync(dirPath)) {
|
|
132
|
+
archive.directory(dirPath, destPath);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
addLockFile(archive, projectPath) {
|
|
136
|
+
const lockFiles = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml'];
|
|
137
|
+
for (const lockFile of lockFiles) {
|
|
138
|
+
const lockPath = path_1.default.join(projectPath, lockFile);
|
|
139
|
+
if (fs_1.default.existsSync(lockPath)) {
|
|
140
|
+
archive.file(lockPath, { name: lockFile });
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
cleanup(zipPath) {
|
|
146
|
+
if (fs_1.default.existsSync(zipPath)) {
|
|
147
|
+
fs_1.default.unlinkSync(zipPath);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.PackageService = PackageService;
|
|
152
|
+
exports.packageService = new PackageService();
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcGFja2FnZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qix3REFBZ0M7QUFFaEMsNENBQXlDO0FBY3pDLE1BQWEsY0FBYztJQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQXVCO1FBQ25DLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFNUUsTUFBTSxPQUFPLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUU3RCxpQ0FBaUM7UUFDakMsSUFBSSxZQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsWUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsZUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sTUFBTSxHQUFHLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFBLGtCQUFRLEVBQUMsS0FBSyxFQUFFO1lBQzlCLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxzQkFBc0I7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7Z0JBQ3RCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDL0IsZUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEdB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QUFDLDZCQUE2QixDQUFDLENBQUM7Z0JBQzFDLE1BQU07UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVPLFlBQVksQ0FBQyxPQUEwQixFQUFFLE9BQWUsRUFBRSxRQUFnQjtRQUNoRixJQUFJLFlBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxPQUEwQixFQUFFLFdBQW1CO1FBQ2pFLE1BQU0sU0FBUyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFdkUsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNsRCxJQUFJLFlBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDM0MsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUFlO1FBQ3JCLElBQUksWUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNCLFlBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTVLRCx3Q0E0S0M7QUFFWSxRQUFBLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGFyY2hpdmVyIGZyb20gJ2FyY2hpdmVyJztcbmltcG9ydCB7IFByb2plY3RUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlT3B0aW9ucyB7XG4gIHByb2plY3RQYXRoOiBzdHJpbmc7XG4gIHByb2plY3RUeXBlOiBQcm9qZWN0VHlwZTtcbiAgYnVpbGRPdXRwdXREaXI6IHN0cmluZztcbiAgaW5jbHVkZVNvdXJjZTogYm9vbGVhbjsgLy8gRm9yIHNlcnZlci1idWlsZCBtb2RlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZVJlc3VsdCB7XG4gIHppcFBhdGg6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUGFja2FnZVNlcnZpY2Uge1xuICBhc3luYyBwYWNrYWdlKG9wdGlvbnM6IFBhY2thZ2VPcHRpb25zKTogUHJvbWlzZTxQYWNrYWdlUmVzdWx0PiB7XG4gICAgY29uc3QgeyBwcm9qZWN0UGF0aCwgcHJvamVjdFR5cGUsIGJ1aWxkT3V0cHV0RGlyLCBpbmNsdWRlU291cmNlIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgemlwUGF0aCA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5ydW53YXktZGVwbG95LnppcCcpO1xuXG4gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHppcCBpZiBwcmVzZW50XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoemlwUGF0aCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMoemlwUGF0aCk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oJ0NyZWF0aW5nIGRlcGxveW1lbnQgcGFja2FnZS4uLicpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oemlwUGF0aCk7XG4gICAgY29uc3QgYXJjaGl2ZSA9IGFyY2hpdmVyKCd6aXAnLCB7XG4gICAgICB6bGliOiB7IGxldmVsOiA5IH0sIC8vIE1heGltdW0gY29tcHJlc3Npb25cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBvdXRwdXQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBzaXplID0gYXJjaGl2ZS5wb2ludGVyKCk7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBQYWNrYWdlIGNyZWF0ZWQ6ICR7KHNpemUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgyKX0gTUJgKTtcbiAgICAgICAgcmVzb2x2ZSh7IHppcFBhdGgsIHNpemUgfSk7XG4gICAgICB9KTtcblxuICAgICAgYXJjaGl2ZS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIGFyY2hpdmUucGlwZShvdXRwdXQpO1xuXG4gICAgICBpZiAoaW5jbHVkZVNvdXJjZSkge1xuICAgICAgICAvLyBTZXJ2ZXItYnVpbGQgbW9kZTogaW5jbHVkZSBzb3VyY2UgZmlsZXNcbiAgICAgICAgdGhpcy5hZGRTb3VyY2VGaWxlcyhhcmNoaXZlLCBwcm9qZWN0UGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMb2NhbC1idWlsZCBtb2RlOiBpbmNsdWRlIG9ubHkgYnVpbGQgYXJ0aWZhY3RzXG4gICAgICAgIHRoaXMuYWRkQnVpbGRBcnRpZmFjdHMoYXJjaGl2ZSwgcHJvamVjdFBhdGgsIHByb2plY3RUeXBlLCBidWlsZE91dHB1dERpcik7XG4gICAgICB9XG5cbiAgICAgIGFyY2hpdmUuZmluYWxpemUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU291cmNlRmlsZXMoYXJjaGl2ZTogYXJjaGl2ZXIuQXJjaGl2ZXIsIHByb2plY3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBJbmNsdWRlIGFsbCBmaWxlcyBleGNlcHQgbm9kZV9tb2R1bGVzLCAuZ2l0LCBhbmQgYnVpbGQgb3V0cHV0c1xuICAgIGNvbnN0IGlnbm9yZVBhdHRlcm5zID0gW1xuICAgICAgJ25vZGVfbW9kdWxlcy8qKicsXG4gICAgICAnLmdpdC8qKicsXG4gICAgICAnLm5leHQvKionLFxuICAgICAgJ2Rpc3QvKionLFxuICAgICAgJ2J1aWxkLyoqJyxcbiAgICAgICcucnVud2F5LWRlcGxveS56aXAnLFxuICAgICAgJyoubG9nJyxcbiAgICAgICcuZW52LmxvY2FsJyxcbiAgICAgICcuZW52LioubG9jYWwnLFxuICAgIF07XG5cbiAgICBhcmNoaXZlLmdsb2IoJyoqLyonLCB7XG4gICAgICBjd2Q6IHByb2plY3RQYXRoLFxuICAgICAgaWdub3JlOiBpZ25vcmVQYXR0ZXJucyxcbiAgICAgIGRvdDogdHJ1ZSwgLy8gSW5jbHVkZSBkb3RmaWxlc1xuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmRpbSgnSW5jbHVkaW5nIHNvdXJjZSBmaWxlcyBmb3Igc2VydmVyLXNpZGUgYnVpbGQnKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQnVpbGRBcnRpZmFjdHMoXG4gICAgYXJjaGl2ZTogYXJjaGl2ZXIuQXJjaGl2ZXIsXG4gICAgcHJvamVjdFBhdGg6IHN0cmluZyxcbiAgICBwcm9qZWN0VHlwZTogUHJvamVjdFR5cGUsXG4gICAgYnVpbGRPdXRwdXREaXI6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICAvLyBJbmNsdWRlIHBhY2thZ2UuanNvbiBpZiBpdCBleGlzdHMgKG9wdGlvbmFsIGZvciBzdGF0aWMgc2l0ZXMpXG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgYXJjaGl2ZS5maWxlKHBhY2thZ2VKc29uUGF0aCwgeyBuYW1lOiAncGFja2FnZS5qc29uJyB9KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHByb2plY3RUeXBlKSB7XG4gICAgICBjYXNlICdyZWFjdCc6XG4gICAgICAgIC8vIEluY2x1ZGUgYnVpbHQgc3RhdGljIGZpbGVzXG4gICAgICAgIHRoaXMuYWRkRGlyZWN0b3J5KGFyY2hpdmUsIGJ1aWxkT3V0cHV0RGlyLCAnZGlzdCcpO1xuICAgICAgICBsb2dnZXIuZGltKGBJbmNsdWRpbmcgYnVpbGQgb3V0cHV0IGZyb20gJHtidWlsZE91dHB1dERpcn1gKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ25leHQnOlxuICAgICAgICAvLyBJbmNsdWRlIC5uZXh0IGRpcmVjdG9yeVxuICAgICAgICB0aGlzLmFkZERpcmVjdG9yeShhcmNoaXZlLCBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICcubmV4dCcpLCAnLm5leHQnKTtcblxuICAgICAgICAvLyBJbmNsdWRlIHB1YmxpYyBkaXJlY3RvcnkgaWYgZXhpc3RzXG4gICAgICAgIGNvbnN0IHB1YmxpY0RpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJ3B1YmxpYycpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwdWJsaWNEaXIpKSB7XG4gICAgICAgICAgdGhpcy5hZGREaXJlY3RvcnkoYXJjaGl2ZSwgcHVibGljRGlyLCAncHVibGljJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNsdWRlIG5leHQuY29uZmlnLmpzIGlmIGV4aXN0c1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZ0ZpbGUgb2YgWyduZXh0LmNvbmZpZy5qcycsICduZXh0LmNvbmZpZy5tanMnLCAnbmV4dC5jb25maWcudHMnXSkge1xuICAgICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsIGNvbmZpZ0ZpbGUpO1xuICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgICAgICAgICBhcmNoaXZlLmZpbGUoY29uZmlnUGF0aCwgeyBuYW1lOiBjb25maWdGaWxlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY2x1ZGUgcGFja2FnZS1sb2NrLmpzb24gb3IgeWFybi5sb2NrIGZvciBwcm9kdWN0aW9uIGRlcGVuZGVuY2llc1xuICAgICAgICB0aGlzLmFkZExvY2tGaWxlKGFyY2hpdmUsIHByb2plY3RQYXRoKTtcblxuICAgICAgICBsb2dnZXIuZGltKCdJbmNsdWRpbmcgTmV4dC5qcyBidWlsZCBhcnRpZmFjdHMnKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICAvLyBGb3IgTm9kZS5qcywgaW5jbHVkZSBldmVyeXRoaW5nIGV4Y2VwdCBub2RlX21vZHVsZXNcbiAgICAgICAgY29uc3Qgbm9kZUlnbm9yZVBhdHRlcm5zID0gW1xuICAgICAgICAgICdub2RlX21vZHVsZXMvKionLFxuICAgICAgICAgICcuZ2l0LyoqJyxcbiAgICAgICAgICAnLnJ1bndheS1kZXBsb3kuemlwJyxcbiAgICAgICAgICAnKi5sb2cnLFxuICAgICAgICBdO1xuXG4gICAgICAgIGFyY2hpdmUuZ2xvYignKiovKicsIHtcbiAgICAgICAgICBjd2Q6IHByb2plY3RQYXRoLFxuICAgICAgICAgIGlnbm9yZTogbm9kZUlnbm9yZVBhdHRlcm5zLFxuICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbG9nZ2VyLmRpbSgnSW5jbHVkaW5nIE5vZGUuanMgcHJvamVjdCBmaWxlcycpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc3RhdGljJzpcbiAgICAgICAgLy8gRm9yIHN0YXRpYyBzaXRlcywgaW5jbHVkZSBIVE1MLCBDU1MsIEpTLCBhbmQgY29tbW9uIGFzc2V0c1xuICAgICAgICBjb25zdCBzdGF0aWNJZ25vcmVQYXR0ZXJucyA9IFtcbiAgICAgICAgICAnbm9kZV9tb2R1bGVzLyoqJyxcbiAgICAgICAgICAnLmdpdC8qKicsXG4gICAgICAgICAgJy5ydW53YXktZGVwbG95LnppcCcsXG4gICAgICAgICAgJyoubG9nJyxcbiAgICAgICAgICAnLmVudicsXG4gICAgICAgICAgJy5lbnYuKicsXG4gICAgICAgIF07XG5cbiAgICAgICAgYXJjaGl2ZS5nbG9iKCcqKi8qJywge1xuICAgICAgICAgIGN3ZDogcHJvamVjdFBhdGgsXG4gICAgICAgICAgaWdub3JlOiBzdGF0aWNJZ25vcmVQYXR0ZXJucyxcbiAgICAgICAgICBkb3Q6IGZhbHNlLCAvLyBEb24ndCBpbmNsdWRlIGRvdGZpbGVzIGZvciBzdGF0aWMgc2l0ZXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbG9nZ2VyLmRpbSgnSW5jbHVkaW5nIHN0YXRpYyBzaXRlIGZpbGVzJyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRGlyZWN0b3J5KGFyY2hpdmU6IGFyY2hpdmVyLkFyY2hpdmVyLCBkaXJQYXRoOiBzdHJpbmcsIGRlc3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgYXJjaGl2ZS5kaXJlY3RvcnkoZGlyUGF0aCwgZGVzdFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkTG9ja0ZpbGUoYXJjaGl2ZTogYXJjaGl2ZXIuQXJjaGl2ZXIsIHByb2plY3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBsb2NrRmlsZXMgPSBbJ3BhY2thZ2UtbG9jay5qc29uJywgJ3lhcm4ubG9jaycsICdwbnBtLWxvY2sueWFtbCddO1xuXG4gICAgZm9yIChjb25zdCBsb2NrRmlsZSBvZiBsb2NrRmlsZXMpIHtcbiAgICAgIGNvbnN0IGxvY2tQYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCBsb2NrRmlsZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrUGF0aCkpIHtcbiAgICAgICAgYXJjaGl2ZS5maWxlKGxvY2tQYXRoLCB7IG5hbWU6IGxvY2tGaWxlIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbGVhbnVwKHppcFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHppcFBhdGgpKSB7XG4gICAgICBmcy51bmxpbmtTeW5jKHppcFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGFja2FnZVNlcnZpY2UgPSBuZXcgUGFja2FnZVNlcnZpY2UoKTtcbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ProjectType, PackageManager } from '../types';
|
|
2
|
+
export interface DetectedProject {
|
|
3
|
+
type: ProjectType;
|
|
4
|
+
name: string;
|
|
5
|
+
version: string;
|
|
6
|
+
packageManager: PackageManager;
|
|
7
|
+
buildScript: string | null;
|
|
8
|
+
startScript: string | null;
|
|
9
|
+
buildOutputDir: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class ProjectDetector {
|
|
12
|
+
private projectPath;
|
|
13
|
+
constructor(projectPath?: string);
|
|
14
|
+
detect(): Promise<DetectedProject>;
|
|
15
|
+
private readPackageJson;
|
|
16
|
+
private detectProjectType;
|
|
17
|
+
private detectPackageManager;
|
|
18
|
+
private getBuildOutputDir;
|
|
19
|
+
validateBuildOutput(): boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare const detectProject: (projectPath?: string) => Promise<DetectedProject>;
|
|
@@ -0,0 +1,165 @@
|
|
|
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.detectProject = exports.ProjectDetector = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
class ProjectDetector {
|
|
10
|
+
constructor(projectPath = process.cwd()) {
|
|
11
|
+
this.projectPath = projectPath;
|
|
12
|
+
}
|
|
13
|
+
async detect() {
|
|
14
|
+
// Check for static site first (index.html without package.json or with minimal package.json)
|
|
15
|
+
const hasIndexHtml = fs_1.default.existsSync(path_1.default.join(this.projectPath, 'index.html'));
|
|
16
|
+
const hasPackageJson = fs_1.default.existsSync(path_1.default.join(this.projectPath, 'package.json'));
|
|
17
|
+
// Static site: has index.html but no package.json
|
|
18
|
+
if (hasIndexHtml && !hasPackageJson) {
|
|
19
|
+
return {
|
|
20
|
+
type: 'static',
|
|
21
|
+
name: path_1.default.basename(this.projectPath),
|
|
22
|
+
version: '1.0.0',
|
|
23
|
+
packageManager: 'none',
|
|
24
|
+
buildScript: null,
|
|
25
|
+
startScript: null,
|
|
26
|
+
buildOutputDir: '.',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// If no package.json and no index.html, unsupported
|
|
30
|
+
if (!hasPackageJson && !hasIndexHtml) {
|
|
31
|
+
throw new Error(`No package.json or index.html found in ${this.projectPath}\n\n` +
|
|
32
|
+
`Runway CLI supports:\n` +
|
|
33
|
+
` - Static sites (with index.html)\n` +
|
|
34
|
+
` - React/Next.js/Node.js projects (with package.json)\n\n` +
|
|
35
|
+
`Python, Ruby, Go, and other runtimes are not supported.`);
|
|
36
|
+
}
|
|
37
|
+
const packageJson = this.readPackageJson();
|
|
38
|
+
const type = this.detectProjectType(packageJson, hasIndexHtml);
|
|
39
|
+
const packageManager = this.detectPackageManager();
|
|
40
|
+
const buildOutputDir = this.getBuildOutputDir(type);
|
|
41
|
+
return {
|
|
42
|
+
type,
|
|
43
|
+
name: packageJson.name || path_1.default.basename(this.projectPath),
|
|
44
|
+
version: packageJson.version || '0.0.1',
|
|
45
|
+
packageManager,
|
|
46
|
+
buildScript: packageJson.scripts?.build || null,
|
|
47
|
+
startScript: packageJson.scripts?.start || null,
|
|
48
|
+
buildOutputDir,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
readPackageJson() {
|
|
52
|
+
const packageJsonPath = path_1.default.join(this.projectPath, 'package.json');
|
|
53
|
+
try {
|
|
54
|
+
const content = fs_1.default.readFileSync(packageJsonPath, 'utf-8');
|
|
55
|
+
return JSON.parse(content);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new Error(`Failed to parse package.json: ${error}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
detectProjectType(packageJson, hasIndexHtml) {
|
|
62
|
+
const deps = {
|
|
63
|
+
...packageJson.dependencies,
|
|
64
|
+
...packageJson.devDependencies,
|
|
65
|
+
};
|
|
66
|
+
// Check for Next.js
|
|
67
|
+
if (deps['next']) {
|
|
68
|
+
return 'next';
|
|
69
|
+
}
|
|
70
|
+
// Check for React (and not Next.js)
|
|
71
|
+
if (deps['react'] || deps['react-dom']) {
|
|
72
|
+
const hasVite = deps['vite'] !== undefined;
|
|
73
|
+
const hasCRA = deps['react-scripts'] !== undefined;
|
|
74
|
+
if (hasVite || hasCRA || packageJson.scripts?.build) {
|
|
75
|
+
return 'react';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Check for Node.js indicators
|
|
79
|
+
const hasStartScript = packageJson.scripts?.start !== undefined;
|
|
80
|
+
const hasMainEntry = fs_1.default.existsSync(path_1.default.join(this.projectPath, 'index.js')) ||
|
|
81
|
+
fs_1.default.existsSync(path_1.default.join(this.projectPath, 'src/index.js')) ||
|
|
82
|
+
fs_1.default.existsSync(path_1.default.join(this.projectPath, 'src/index.ts')) ||
|
|
83
|
+
fs_1.default.existsSync(path_1.default.join(this.projectPath, 'server.js')) ||
|
|
84
|
+
fs_1.default.existsSync(path_1.default.join(this.projectPath, 'app.js'));
|
|
85
|
+
if (hasStartScript || hasMainEntry) {
|
|
86
|
+
return 'node';
|
|
87
|
+
}
|
|
88
|
+
// If has index.html with package.json but no framework detected, treat as static
|
|
89
|
+
if (hasIndexHtml) {
|
|
90
|
+
return 'static';
|
|
91
|
+
}
|
|
92
|
+
// If has a build script, assume it's a frontend project that compiles to static
|
|
93
|
+
if (packageJson.scripts?.build) {
|
|
94
|
+
return 'static';
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`Could not detect a supported project type.\n\n` +
|
|
97
|
+
`Runway supports: React, Next.js, Node.js, and Static HTML.\n\n` +
|
|
98
|
+
`For Node.js apps, add a "start" script to package.json.\n` +
|
|
99
|
+
`For static sites, ensure index.html exists at the project root.`);
|
|
100
|
+
}
|
|
101
|
+
detectPackageManager() {
|
|
102
|
+
if (fs_1.default.existsSync(path_1.default.join(this.projectPath, 'pnpm-lock.yaml'))) {
|
|
103
|
+
return 'pnpm';
|
|
104
|
+
}
|
|
105
|
+
if (fs_1.default.existsSync(path_1.default.join(this.projectPath, 'yarn.lock'))) {
|
|
106
|
+
return 'yarn';
|
|
107
|
+
}
|
|
108
|
+
if (fs_1.default.existsSync(path_1.default.join(this.projectPath, 'package-lock.json'))) {
|
|
109
|
+
return 'npm';
|
|
110
|
+
}
|
|
111
|
+
// No lock file found
|
|
112
|
+
return 'npm';
|
|
113
|
+
}
|
|
114
|
+
getBuildOutputDir(type) {
|
|
115
|
+
switch (type) {
|
|
116
|
+
case 'react':
|
|
117
|
+
if (fs_1.default.existsSync(path_1.default.join(this.projectPath, 'vite.config.ts')) ||
|
|
118
|
+
fs_1.default.existsSync(path_1.default.join(this.projectPath, 'vite.config.js'))) {
|
|
119
|
+
return 'dist';
|
|
120
|
+
}
|
|
121
|
+
return 'build';
|
|
122
|
+
case 'next':
|
|
123
|
+
return '.next';
|
|
124
|
+
case 'node':
|
|
125
|
+
return '.';
|
|
126
|
+
case 'static':
|
|
127
|
+
return '.';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
validateBuildOutput() {
|
|
131
|
+
const hasPackageJson = fs_1.default.existsSync(path_1.default.join(this.projectPath, 'package.json'));
|
|
132
|
+
const hasIndexHtml = fs_1.default.existsSync(path_1.default.join(this.projectPath, 'index.html'));
|
|
133
|
+
// For static without package.json
|
|
134
|
+
if (!hasPackageJson) {
|
|
135
|
+
return hasIndexHtml;
|
|
136
|
+
}
|
|
137
|
+
const packageJson = this.readPackageJson();
|
|
138
|
+
const type = this.detectProjectType(packageJson, hasIndexHtml);
|
|
139
|
+
const outputDir = this.getBuildOutputDir(type);
|
|
140
|
+
const outputPath = path_1.default.join(this.projectPath, outputDir);
|
|
141
|
+
if (type === 'node') {
|
|
142
|
+
return fs_1.default.existsSync(path_1.default.join(this.projectPath, 'package.json'));
|
|
143
|
+
}
|
|
144
|
+
if (type === 'static') {
|
|
145
|
+
return fs_1.default.existsSync(path_1.default.join(this.projectPath, 'index.html'));
|
|
146
|
+
}
|
|
147
|
+
if (!fs_1.default.existsSync(outputPath)) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
if (type === 'react') {
|
|
151
|
+
return fs_1.default.existsSync(path_1.default.join(outputPath, 'index.html'));
|
|
152
|
+
}
|
|
153
|
+
if (type === 'next') {
|
|
154
|
+
return fs_1.default.existsSync(path_1.default.join(outputPath, 'server'));
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.ProjectDetector = ProjectDetector;
|
|
160
|
+
const detectProject = async (projectPath) => {
|
|
161
|
+
const detector = new ProjectDetector(projectPath);
|
|
162
|
+
return detector.detect();
|
|
163
|
+
};
|
|
164
|
+
exports.detectProject = detectProject;
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdERldGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3Byb2plY3REZXRlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBcUJ4QixNQUFhLGVBQWU7SUFHMUIsWUFBWSxjQUFzQixPQUFPLENBQUMsR0FBRyxFQUFFO1FBQzdDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTTtRQUNWLDZGQUE2RjtRQUM3RixNQUFNLFlBQVksR0FBRyxZQUFFLENBQUMsVUFBVSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sY0FBYyxHQUFHLFlBQUUsQ0FBQyxVQUFVLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFbEYsa0RBQWtEO1FBQ2xELElBQUksWUFBWSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEMsT0FBTztnQkFDTCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsY0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUNyQyxPQUFPLEVBQUUsT0FBTztnQkFDaEIsY0FBYyxFQUFFLE1BQU07Z0JBQ3RCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixXQUFXLEVBQUUsSUFBSTtnQkFDakIsY0FBYyxFQUFFLEdBQUc7YUFDcEIsQ0FBQztRQUNKLENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQ2IsMENBQTBDLElBQUksQ0FBQyxXQUFXLE1BQU07Z0JBQ2hFLHdCQUF3QjtnQkFD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ICdwYXRoJztcbmltcG9ydCB7IFByb2plY3RUeXBlLCBQYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBEZXRlY3RlZFByb2plY3Qge1xuICB0eXBlOiBQcm9qZWN0VHlwZTtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlcjtcbiAgYnVpbGRTY3JpcHQ6IHN0cmluZyB8IG51bGw7XG4gIHN0YXJ0U2NyaXB0OiBzdHJpbmcgfCBudWxsO1xuICBidWlsZE91dHB1dERpcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGFja2FnZUpzb24ge1xuICBuYW1lPzogc3RyaW5nO1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICBzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZGV2RGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGNsYXNzIFByb2plY3REZXRlY3RvciB7XG4gIHByaXZhdGUgcHJvamVjdFBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0UGF0aDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSkge1xuICAgIHRoaXMucHJvamVjdFBhdGggPSBwcm9qZWN0UGF0aDtcbiAgfVxuXG4gIGFzeW5jIGRldGVjdCgpOiBQcm9taXNlPERldGVjdGVkUHJvamVjdD4ge1xuICAgIC8vIENoZWNrIGZvciBzdGF0aWMgc2l0ZSBmaXJzdCAoaW5kZXguaHRtbCB3aXRob3V0IHBhY2thZ2UuanNvbiBvciB3aXRoIG1pbmltYWwgcGFja2FnZS5qc29uKVxuICAgIGNvbnN0IGhhc0luZGV4SHRtbCA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucHJvamVjdFBhdGgsICdpbmRleC5odG1sJykpO1xuICAgIGNvbnN0IGhhc1BhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0UGF0aCwgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIC8vIFN0YXRpYyBzaXRlOiBoYXMgaW5kZXguaHRtbCBidXQgbm8gcGFja2FnZS5qc29uXG4gICAgaWYgKGhhc0luZGV4SHRtbCAmJiAhaGFzUGFja2FnZUpzb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdzdGF0aWMnLFxuICAgICAgICBuYW1lOiBwYXRoLmJhc2VuYW1lKHRoaXMucHJvamVjdFBhdGgpLFxuICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgICBwYWNrYWdlTWFuYWdlcjogJ25vbmUnLFxuICAgICAgICBidWlsZFNjcmlwdDogbnVsbCxcbiAgICAgICAgc3RhcnRTY3JpcHQ6IG51bGwsXG4gICAgICAgIGJ1aWxkT3V0cHV0RGlyOiAnLicsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIG5vIHBhY2thZ2UuanNvbiBhbmQgbm8gaW5kZXguaHRtbCwgdW5zdXBwb3J0ZWRcbiAgICBpZiAoIWhhc1BhY2thZ2VKc29uICYmICFoYXNJbmRleEh0bWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIHBhY2thZ2UuanNvbiBvciBpbmRleC5odG1sIGZvdW5kIGluICR7dGhpcy5wcm9qZWN0UGF0aH1cXG5cXG5gICtcbiAgICAgICAgYFJ1bndheSBDTEkgc3VwcG9ydHM6XFxuYCArXG4gICAgICAgIGAgIC0gU3RhdGljIHNpdGVzICh3aXRoIGluZGV4Lmh0bWwpXFxuYCArXG4gICAgICAgIGAgIC0gUmVhY3QvTmV4dC5qcy9Ob2RlLmpzIHByb2plY3RzICh3aXRoIHBhY2thZ2UuanNvbilcXG5cXG5gICtcbiAgICAgICAgYFB5dGhvbiwgUnVieSwgR28sIGFuZCBvdGhlciBydW50aW1lcyBhcmUgbm90IHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gdGhpcy5yZWFkUGFja2FnZUpzb24oKTtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5kZXRlY3RQcm9qZWN0VHlwZShwYWNrYWdlSnNvbiwgaGFzSW5kZXhIdG1sKTtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHRoaXMuZGV0ZWN0UGFja2FnZU1hbmFnZXIoKTtcbiAgICBjb25zdCBidWlsZE91dHB1dERpciA9IHRoaXMuZ2V0QnVpbGRPdXRwdXREaXIodHlwZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZSxcbiAgICAgIG5hbWU6IHBhY2thZ2VKc29uLm5hbWUgfHwgcGF0aC5iYXNlbmFtZSh0aGlzLnByb2plY3RQYXRoKSxcbiAgICAgIHZlcnNpb246IHBhY2thZ2VKc29uLnZlcnNpb24gfHwgJzAuMC4xJyxcbiAgICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgYnVpbGRTY3JpcHQ6IHBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkIHx8IG51bGwsXG4gICAgICBzdGFydFNjcmlwdDogcGFja2FnZUpzb24uc2NyaXB0cz8uc3RhcnQgfHwgbnVsbCxcbiAgICAgIGJ1aWxkT3V0cHV0RGlyLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlYWRQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHRoaXMucHJvamVjdFBhdGgsICdwYWNrYWdlLmpzb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0UHJvamVjdFR5cGUocGFja2FnZUpzb246IFBhY2thZ2VKc29uLCBoYXNJbmRleEh0bWw6IGJvb2xlYW4pOiBQcm9qZWN0VHlwZSB7XG4gICAgY29uc3QgZGVwcyA9IHtcbiAgICAgIC4uLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyxcbiAgICAgIC4uLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgZm9yIE5leHQuanNcbiAgICBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICByZXR1cm4gJ25leHQnO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBSZWFjdCAoYW5kIG5vdCBOZXh0LmpzKVxuICAgIGlmIChkZXBzWydyZWFjdCddIHx8IGRlcHNbJ3JlYWN0LWRvbSddKSB7XG4gICAgICBjb25zdCBoYXNWaXRlID0gZGVwc1sndml0ZSddICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNDUkEgPSBkZXBzWydyZWFjdC1zY3JpcHRzJ10gIT09IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGhhc1ZpdGUgfHwgaGFzQ1JBIHx8IHBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgICAgIHJldHVybiAncmVhY3QnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBOb2RlLmpzIGluZGljYXRvcnNcbiAgICBjb25zdCBoYXNTdGFydFNjcmlwdCA9IHBhY2thZ2VKc29uLnNjcmlwdHM/LnN0YXJ0ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaGFzTWFpbkVudHJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0UGF0aCwgJ2luZGV4LmpzJykpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0UGF0aCwgJ3NyYy9pbmRleC5qcycpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucHJvamVjdFBhdGgsICdzcmMvaW5kZXgudHMnKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnByb2plY3RQYXRoLCAnc2VydmVyLmpzJykpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0UGF0aCwgJ2FwcC5qcycpKTtcblxuICAgIGlmIChoYXNTdGFydFNjcmlwdCB8fCBoYXNNYWluRW50cnkpIHtcbiAgICAgIHJldHVybiAnbm9kZSc7XG4gICAgfVxuXG4gICAgLy8gSWYgaGFzIGluZGV4Lmh0bWwgd2l0aCBwYWNrYWdlLmpzb24gYnV0IG5vIGZyYW1ld29yayBkZXRlY3RlZCwgdHJlYXQgYXMgc3RhdGljXG4gICAgaWYgKGhhc0luZGV4SHRtbCkge1xuICAgICAgcmV0dXJuICdzdGF0aWMnO1xuICAgIH1cblxuICAgIC8vIElmIGhhcyBhIGJ1aWxkIHNjcmlwdCwgYXNzdW1lIGl0J3MgYSBmcm9udGVuZCBwcm9qZWN0IHRoYXQgY29tcGlsZXMgdG8gc3RhdGljXG4gICAgaWYgKHBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgICByZXR1cm4gJ3N0YXRpYyc7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBkZXRlY3QgYSBzdXBwb3J0ZWQgcHJvamVjdCB0eXBlLlxcblxcbmAgK1xuICAgICAgYFJ1bndheSBzdXBwb3J0czogUmVhY3QsIE5leHQuanMsIE5vZGUuanMsIGFuZCBTdGF0aWMgSFRNTC5cXG5cXG5gICtcbiAgICAgIGBGb3IgTm9kZS5qcyBhcHBzLCBhZGQgYSBcInN0YXJ0XCIgc2NyaXB0IHRvIHBhY2thZ2UuanNvbi5cXG5gICtcbiAgICAgIGBGb3Igc3RhdGljIHNpdGVzLCBlbnN1cmUgaW5kZXguaHRtbCBleGlzdHMgYXQgdGhlIHByb2plY3Qgcm9vdC5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0UGFja2FnZU1hbmFnZXIoKTogUGFja2FnZU1hbmFnZXIge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnByb2plY3RQYXRoLCAncG5wbS1sb2NrLnlhbWwnKSkpIHtcbiAgICAgIHJldHVybiAncG5wbSc7XG4gICAgfVxuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucHJvamVjdFBhdGgsICd5YXJuLmxvY2snKSkpIHtcbiAgICAgIHJldHVybiAneWFybic7XG4gICAgfVxuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucHJvamVjdFBhdGgsICdwYWNrYWdlLWxvY2suanNvbicpKSkge1xuICAgICAgcmV0dXJuICducG0nO1xuICAgIH1cblxuICAgIC8vIE5vIGxvY2sgZmlsZSBmb3VuZFxuICAgIHJldHVybiAnbnBtJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGRPdXRwdXREaXIodHlwZTogUHJvamVjdFR5cGUpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAncmVhY3QnOlxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0UGF0aCwgJ3ZpdGUuY29uZmlnLnRzJykpIHx8XG4gICAgICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnByb2plY3RQYXRoLCAndml0ZS5jb25maWcuanMnKSkpIHtcbiAgICAgICAgICByZXR1cm4gJ2Rpc3QnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnYnVpbGQnO1xuXG4gICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgcmV0dXJuICcubmV4dCc7XG5cbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICByZXR1cm4gJy4nO1xuXG4gICAgICBjYXNlICdzdGF0aWMnOlxuICAgICAgICByZXR1cm4gJy4nO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlQnVpbGRPdXRwdXQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnByb2plY3RQYXRoLCAncGFja2FnZS5qc29uJykpO1xuICAgIGNvbnN0IGhhc0luZGV4SHRtbCA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucHJvamVjdFBhdGgsICdpbmRleC5odG1sJykpO1xuXG4gICAgLy8gRm9yIHN0YXRpYyB3aXRob3V0IHBhY2thZ2UuanNvblxuICAgIGlmICghaGFzUGFja2FnZUpzb24pIHtcbiAgICAgIHJldHVybiBoYXNJbmRleEh0bWw7XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZUpzb24gPSB0aGlzLnJlYWRQYWNrYWdlSnNvbigpO1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmRldGVjdFByb2plY3RUeXBlKHBhY2thZ2VKc29uLCBoYXNJbmRleEh0bWwpO1xuICAgIGNvbnN0IG91dHB1dERpciA9IHRoaXMuZ2V0QnVpbGRPdXRwdXREaXIodHlwZSk7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbih0aGlzLnByb2plY3RQYXRoLCBvdXRwdXREaXIpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdub2RlJykge1xuICAgICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucHJvamVjdFBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzdGF0aWMnKSB7XG4gICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0UGF0aCwgJ2luZGV4Lmh0bWwnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dFBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdyZWFjdCcpIHtcbiAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihvdXRwdXRQYXRoLCAnaW5kZXguaHRtbCcpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ob3V0cHV0UGF0aCwgJ3NlcnZlcicpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRldGVjdFByb2plY3QgPSBhc3luYyAocHJvamVjdFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPERldGVjdGVkUHJvamVjdD4gPT4ge1xuICBjb25zdCBkZXRlY3RvciA9IG5ldyBQcm9qZWN0RGV0ZWN0b3IocHJvamVjdFBhdGgpO1xuICByZXR1cm4gZGV0ZWN0b3IuZGV0ZWN0KCk7XG59O1xuIl19
|