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,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