dispatch-deploy 1.0.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 +86 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +148 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/check.d.ts +15 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +107 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/delete.d.ts +6 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +107 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/deploy.d.ts +9 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +275 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +34 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +15 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +6 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +129 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/poll.d.ts +10 -0
- package/dist/commands/poll.d.ts.map +1 -0
- package/dist/commands/poll.js +72 -0
- package/dist/commands/poll.js.map +1 -0
- package/dist/commands/projects.d.ts +5 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +49 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/register.d.ts +5 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +46 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/trigger.d.ts +11 -0
- package/dist/commands/trigger.d.ts.map +1 -0
- package/dist/commands/trigger.js +52 -0
- package/dist/commands/trigger.js.map +1 -0
- package/dist/config/runtime.d.ts +18 -0
- package/dist/config/runtime.d.ts.map +1 -0
- package/dist/config/runtime.js +32 -0
- package/dist/config/runtime.js.map +1 -0
- package/dist/services/auth.d.ts +18 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +122 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/builder.d.ts +4 -0
- package/dist/services/builder.d.ts.map +1 -0
- package/dist/services/builder.js +89 -0
- package/dist/services/builder.js.map +1 -0
- package/dist/services/controlPlane.d.ts +16 -0
- package/dist/services/controlPlane.d.ts.map +1 -0
- package/dist/services/controlPlane.js +155 -0
- package/dist/services/controlPlane.js.map +1 -0
- package/dist/services/deployer.d.ts +2 -0
- package/dist/services/deployer.d.ts.map +1 -0
- package/dist/services/deployer.js +49 -0
- package/dist/services/deployer.js.map +1 -0
- package/dist/services/project.d.ts +9 -0
- package/dist/services/project.d.ts.map +1 -0
- package/dist/services/project.js +29 -0
- package/dist/services/project.js.map +1 -0
- package/dist/services/sourceUploader.d.ts +9 -0
- package/dist/services/sourceUploader.d.ts.map +1 -0
- package/dist/services/sourceUploader.js +250 -0
- package/dist/services/sourceUploader.js.map +1 -0
- package/dist/services/uploader.d.ts +2 -0
- package/dist/services/uploader.d.ts.map +1 -0
- package/dist/services/uploader.js +59 -0
- package/dist/services/uploader.js.map +1 -0
- package/dist/types/deployment.d.ts +43 -0
- package/dist/types/deployment.d.ts.map +1 -0
- package/dist/types/deployment.js +6 -0
- package/dist/types/deployment.js.map +1 -0
- package/dist/types.d.ts +53 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +17 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +85 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/credentials.d.ts +16 -0
- package/dist/utils/credentials.d.ts.map +1 -0
- package/dist/utils/credentials.js +72 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/debug.d.ts +7 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +21 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/input.d.ts +3 -0
- package/dist/utils/input.d.ts.map +1 -0
- package/dist/utils/input.js +94 -0
- package/dist/utils/input.js.map +1 -0
- package/dist/utils/loader.d.ts +22 -0
- package/dist/utils/loader.d.ts.map +1 -0
- package/dist/utils/loader.js +139 -0
- package/dist/utils/loader.js.map +1 -0
- package/dist/utils/normalizer.d.ts +10 -0
- package/dist/utils/normalizer.d.ts.map +1 -0
- package/dist/utils/normalizer.js +115 -0
- package/dist/utils/normalizer.js.map +1 -0
- package/dist/utils/safety.d.ts +18 -0
- package/dist/utils/safety.d.ts.map +1 -0
- package/dist/utils/safety.js +140 -0
- package/dist/utils/safety.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.authFetch = authFetch;
|
|
4
|
+
exports.createDeployment = createDeployment;
|
|
5
|
+
exports.pollDeploymentStatus = pollDeploymentStatus;
|
|
6
|
+
exports.waitForDeployment = waitForDeployment;
|
|
7
|
+
const auth_1 = require("./auth");
|
|
8
|
+
const debug_1 = require("../utils/debug");
|
|
9
|
+
const runtime_1 = require("../config/runtime");
|
|
10
|
+
// Configuration - determined at runtime
|
|
11
|
+
const getControlPlane = () => (0, runtime_1.getControlPlaneUrl)();
|
|
12
|
+
async function authFetch(path, options = {}) {
|
|
13
|
+
const token = await (0, auth_1.getValidToken)();
|
|
14
|
+
if (!token) {
|
|
15
|
+
throw new Error('Not authenticated. Please run: dispatch login');
|
|
16
|
+
}
|
|
17
|
+
const headers = {
|
|
18
|
+
'Content-Type': 'application/json',
|
|
19
|
+
'Authorization': `Bearer ${token}`,
|
|
20
|
+
...options.headers || {}
|
|
21
|
+
};
|
|
22
|
+
const response = await fetch(`${getControlPlane()}${path}`, {
|
|
23
|
+
...options,
|
|
24
|
+
headers
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
const body = await response.json().catch(() => ({}));
|
|
28
|
+
const errorMsg = body.error || body.message || `HTTP ${response.status}: ${response.statusText}`;
|
|
29
|
+
// Include more details if available
|
|
30
|
+
if (body.details) {
|
|
31
|
+
throw new Error(`${errorMsg}\nDetails: ${JSON.stringify(body.details)}`);
|
|
32
|
+
}
|
|
33
|
+
throw new Error(errorMsg);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
return await response.json();
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a new deployment
|
|
44
|
+
*
|
|
45
|
+
* For cloud builds: POST /deploy without s3_key, control plane enqueues build job
|
|
46
|
+
*/
|
|
47
|
+
async function createDeployment(request) {
|
|
48
|
+
console.log('Creating deployment in control plane...');
|
|
49
|
+
const payload = {
|
|
50
|
+
project_id: request.projectId,
|
|
51
|
+
project_name: request.projectName,
|
|
52
|
+
metadata: {
|
|
53
|
+
runtime: request.runtime,
|
|
54
|
+
handler: request.handler,
|
|
55
|
+
architecture: request.architecture,
|
|
56
|
+
openApiSpec: request.openApiSpec,
|
|
57
|
+
safetyFindings: request.safetyFindings
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
(0, debug_1.debugLog)('Sending deploy payload:', JSON.stringify(payload, null, 2));
|
|
61
|
+
const result = await authFetch('/deploy', {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
body: JSON.stringify(payload)
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
deploymentId: result.id,
|
|
67
|
+
uploadUrl: result.upload_url || '',
|
|
68
|
+
status: result.status,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async function pollDeploymentStatus(deploymentId) {
|
|
72
|
+
const res = await authFetch(`/deploy/${deploymentId}`);
|
|
73
|
+
(0, debug_1.debugLog)('Polling response:', JSON.stringify(res, null, 2));
|
|
74
|
+
return {
|
|
75
|
+
deploymentId: res.id,
|
|
76
|
+
status: res.status,
|
|
77
|
+
url: res.url,
|
|
78
|
+
build_logs: res.build_logs
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Poll deployment until completion
|
|
83
|
+
* Cloud builds take longer (building + deploying), so increase timeout
|
|
84
|
+
*/
|
|
85
|
+
async function waitForDeployment(deploymentId, maxAttempts = 120, // 4 minutes (for build + deploy)
|
|
86
|
+
intervalMs = 2000) {
|
|
87
|
+
let lastStatus = '';
|
|
88
|
+
let currentStep = '';
|
|
89
|
+
let lastLogLength = 0;
|
|
90
|
+
const getStatusMessage = (status) => {
|
|
91
|
+
switch (status) {
|
|
92
|
+
case 'pending': return '[QUEUE] Queuing deployment';
|
|
93
|
+
case 'building': return '[BUILD] Building artifact';
|
|
94
|
+
case 'iam-setup': return '[IAM] Setting up IAM role';
|
|
95
|
+
case 'lambda-deploying': return '[DEPLOY] Deploying Lambda function';
|
|
96
|
+
case 'lambda-verifying': return '[VERIFY] Verifying Lambda deployment';
|
|
97
|
+
case 'api-setup': return '[API] Setting up API Gateway';
|
|
98
|
+
case 'api-verifying': return '[VERIFY] Verifying API Gateway';
|
|
99
|
+
case 'finalizing': return '[FINAL] Performing final checks';
|
|
100
|
+
case 'deploying': return '[DEPLOY] Finalizing deployment';
|
|
101
|
+
case 'live': return '[SUCCESS] Deployment complete';
|
|
102
|
+
case 'failed': return '[ERROR] Deployment failed';
|
|
103
|
+
default: return `[STATUS] ${status}`;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const displayNewLogs = (buildLogs) => {
|
|
107
|
+
if (!buildLogs)
|
|
108
|
+
return;
|
|
109
|
+
const lines = buildLogs.split('\n');
|
|
110
|
+
const newLines = lines.slice(lastLogLength);
|
|
111
|
+
if (newLines.length > 0) {
|
|
112
|
+
// Show new log lines with indentation for readability
|
|
113
|
+
newLines.forEach(line => {
|
|
114
|
+
if (line.trim()) {
|
|
115
|
+
console.log(` LOG: ${line}`);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
lastLogLength = lines.length;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
console.log('\n[DEPLOY] Starting deployment...\n');
|
|
122
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
123
|
+
const status = await pollDeploymentStatus(deploymentId);
|
|
124
|
+
(0, debug_1.debugLog)(`Poll attempt ${i + 1}: status="${status.status}", url="${status.url}"`);
|
|
125
|
+
// Show status change messages
|
|
126
|
+
if (status.status !== lastStatus) {
|
|
127
|
+
if (currentStep) {
|
|
128
|
+
console.log(' [OK]');
|
|
129
|
+
}
|
|
130
|
+
currentStep = getStatusMessage(status.status);
|
|
131
|
+
console.log(`${currentStep}...`);
|
|
132
|
+
lastStatus = status.status;
|
|
133
|
+
}
|
|
134
|
+
// Display any new build logs
|
|
135
|
+
displayNewLogs(status.build_logs || '');
|
|
136
|
+
if (status.status === 'live' || status.status === 'failed') {
|
|
137
|
+
if (status.status === 'live') {
|
|
138
|
+
console.log('✅ Deployment successful!');
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
console.log('❌ Deployment failed!');
|
|
142
|
+
// Show any final logs on failure
|
|
143
|
+
if (status.build_logs) {
|
|
144
|
+
console.log('\n📋 Build logs:');
|
|
145
|
+
console.log(status.build_logs);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return status;
|
|
149
|
+
}
|
|
150
|
+
await new Promise(resolve => setTimeout(resolve, intervalMs));
|
|
151
|
+
}
|
|
152
|
+
console.log('⏱️ Deployment timed out');
|
|
153
|
+
return { deploymentId, status: 'failed' };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=controlPlane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controlPlane.js","sourceRoot":"","sources":["../../src/services/controlPlane.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployer.d.ts","sourceRoot":"","sources":["../../src/services/deployer.ts"],"names":[],"mappings":"AAWA,wBAAsB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC7F"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deployToAws = deployToAws;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
/**
|
|
6
|
+
* LEGACY/DEVELOPMENT SERVICE
|
|
7
|
+
* This service is for local development only.
|
|
8
|
+
* Production CLI uses cloud deployments via control plane - no local deployment required.
|
|
9
|
+
*/
|
|
10
|
+
// Hardcoded for Phase 2 Dev Environment - not used in production
|
|
11
|
+
const DEPLOY_SCRIPT = 'c:\\Users\\alexd\\Documents\\Repositories\\dispatch\\dispatch-runtime-adapters\\scripts\\manual_deploy.py';
|
|
12
|
+
async function deployToAws(artifactPath, functionName) {
|
|
13
|
+
console.log(`Deploying to AWS using ${DEPLOY_SCRIPT}...`);
|
|
14
|
+
// python manual_deploy.py --artifact <path> --function-name <name>
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const pythonProcess = (0, child_process_1.spawn)('python', [
|
|
17
|
+
DEPLOY_SCRIPT,
|
|
18
|
+
'--artifact', artifactPath,
|
|
19
|
+
'--function-name', functionName,
|
|
20
|
+
'--region', 'eu-west-2' // Hardcoded region
|
|
21
|
+
]);
|
|
22
|
+
let stdout = '';
|
|
23
|
+
pythonProcess.stdout.on('data', (data) => {
|
|
24
|
+
stdout += data.toString();
|
|
25
|
+
process.stdout.write(data);
|
|
26
|
+
});
|
|
27
|
+
pythonProcess.stderr.on('data', (data) => {
|
|
28
|
+
process.stderr.write(data);
|
|
29
|
+
});
|
|
30
|
+
pythonProcess.on('close', (code) => {
|
|
31
|
+
if (code !== 0) {
|
|
32
|
+
reject(new Error(`Deploy failed with code ${code}`));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// "API Endpoint: https://..."
|
|
36
|
+
const match = stdout.match(/API Endpoint: (https:\/\/[^\s]+)/);
|
|
37
|
+
if (match) {
|
|
38
|
+
resolve(match[1]);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Try finding it in another format or just return empty string
|
|
42
|
+
// and let CLI try to construct it or fail gracefully
|
|
43
|
+
resolve('');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=deployer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployer.js","sourceRoot":"","sources":["../../src/services/deployer.ts"],"names":[],"mappings":";;AAWA,kCAuCC;AAlDD,iDAAsC;AAEtC;;;;GAIG;AAEH,iEAAiE;AACjE,MAAM,aAAa,GAAG,2GAA2G,CAAC;AAE3H,KAAK,UAAU,WAAW,CAAC,YAAoB,EAAE,YAAoB;IACxE,OAAO,CAAC,GAAG,CAAC,0BAA0B,aAAa,KAAK,CAAC,CAAC;IAC1D,mEAAmE;IAEnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,aAAa,GAAG,IAAA,qBAAK,EAAC,QAAQ,EAAE;YAClC,aAAa;YACb,YAAY,EAAE,YAAY;YAC1B,iBAAiB,EAAE,YAAY;YAC/B,UAAU,EAAE,WAAW,CAAC,mBAAmB;SAC9C,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACrC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACJ,8BAA8B;gBAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAC/D,IAAI,KAAK,EAAE,CAAC;oBACR,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACJ,gEAAgE;oBAChE,qDAAqD;oBACrD,OAAO,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACL,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Project {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
created_at: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function listProjects(): Promise<Project[]>;
|
|
7
|
+
export declare function createProject(name: string): Promise<Project>;
|
|
8
|
+
export declare function deleteProject(projectId: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/services/project.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAQvD;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMlE;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listProjects = listProjects;
|
|
4
|
+
exports.createProject = createProject;
|
|
5
|
+
exports.deleteProject = deleteProject;
|
|
6
|
+
const controlPlane_1 = require("./controlPlane");
|
|
7
|
+
async function listProjects() {
|
|
8
|
+
try {
|
|
9
|
+
const response = await (0, controlPlane_1.authFetch)('/projects');
|
|
10
|
+
return response.projects || [];
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
console.error('Debug: listProjects error:', error.message);
|
|
14
|
+
throw new Error(`Failed to list projects: ${error.message}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function createProject(name) {
|
|
18
|
+
const response = await (0, controlPlane_1.authFetch)('/projects', {
|
|
19
|
+
method: 'POST',
|
|
20
|
+
body: JSON.stringify({ name })
|
|
21
|
+
});
|
|
22
|
+
return response;
|
|
23
|
+
}
|
|
24
|
+
async function deleteProject(projectId) {
|
|
25
|
+
await (0, controlPlane_1.authFetch)(`/projects/${projectId}`, {
|
|
26
|
+
method: 'DELETE'
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/services/project.ts"],"names":[],"mappings":";;AAQA,oCAQC;AAED,sCAMC;AAED,sCAIC;AA9BD,iDAA2C;AAQpC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAS,EAAC,WAAW,CAAQ,CAAC;QACrD,OAAO,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAS,EAAC,WAAW,EAAE;QAC5C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;KAC/B,CAAQ,CAAC;IACV,OAAO,QAAQ,CAAC;AAClB,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,IAAA,wBAAS,EAAC,aAAa,SAAS,EAAE,EAAE;QACxC,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source code uploader for cloud builds
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Create zip archive of source code, save to .dispatch folder, and return as Buffer
|
|
6
|
+
* Returns the zipped source code for upload
|
|
7
|
+
*/
|
|
8
|
+
export declare function uploadSourceCode(projectRoot: string, projectName: string, deploymentId: string, userTier?: string): Promise<Buffer>;
|
|
9
|
+
//# sourceMappingURL=sourceUploader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceUploader.d.ts","sourceRoot":"","sources":["../../src/services/sourceUploader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuCH;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAsMjB"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Source code uploader for cloud builds
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.uploadSourceCode = uploadSourceCode;
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const archiver_1 = __importDefault(require("archiver"));
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
/**
|
|
47
|
+
* Read .gitignore patterns from project root
|
|
48
|
+
*/
|
|
49
|
+
function readGitignorePatterns(projectRoot) {
|
|
50
|
+
const fs = require('fs');
|
|
51
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
52
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const content = fs.readFileSync(gitignorePath, 'utf-8');
|
|
57
|
+
return content
|
|
58
|
+
.split('\n')
|
|
59
|
+
.map((line) => line.trim())
|
|
60
|
+
.filter((line) => line && !line.startsWith('#')) // Remove empty lines and comments
|
|
61
|
+
.map((line) => {
|
|
62
|
+
// Convert gitignore patterns to glob patterns
|
|
63
|
+
if (line.endsWith('/')) {
|
|
64
|
+
return line + '**'; // Directory patterns
|
|
65
|
+
}
|
|
66
|
+
if (!line.includes('/') && !line.includes('*')) {
|
|
67
|
+
return '**/' + line; // File patterns anywhere in tree
|
|
68
|
+
}
|
|
69
|
+
return line;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.log(chalk_1.default.yellow('⚠️ Could not read .gitignore file, using default patterns'));
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create zip archive of source code, save to .dispatch folder, and return as Buffer
|
|
79
|
+
* Returns the zipped source code for upload
|
|
80
|
+
*/
|
|
81
|
+
async function uploadSourceCode(projectRoot, projectName, deploymentId, userTier) {
|
|
82
|
+
const fs = require('fs');
|
|
83
|
+
// Create .dispatch folder if it doesn't exist
|
|
84
|
+
const dispatchFolder = path.join(projectRoot, '.dispatch');
|
|
85
|
+
if (!fs.existsSync(dispatchFolder)) {
|
|
86
|
+
fs.mkdirSync(dispatchFolder, { recursive: true });
|
|
87
|
+
console.log(chalk_1.default.gray('Created .dispatch folder for build artifacts'));
|
|
88
|
+
// Create .gitignore in .dispatch folder to ignore build artifacts
|
|
89
|
+
const gitignorePath = path.join(dispatchFolder, '.gitignore');
|
|
90
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
91
|
+
fs.writeFileSync(gitignorePath, '# Build artifacts\n*.zip\n*.tar.gz\n');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Create archive filename
|
|
95
|
+
const archiveFilename = `${deploymentId}.zip`;
|
|
96
|
+
const archivePath = path.join(dispatchFolder, archiveFilename);
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
const chunks = [];
|
|
99
|
+
const archive = (0, archiver_1.default)('zip', { zlib: { level: 9 } });
|
|
100
|
+
// Also save to file
|
|
101
|
+
const output = fs.createWriteStream(archivePath);
|
|
102
|
+
archive.pipe(output);
|
|
103
|
+
archive.on('data', (chunk) => chunks.push(chunk));
|
|
104
|
+
archive.on('end', () => {
|
|
105
|
+
const buffer = Buffer.concat(chunks);
|
|
106
|
+
const sizeKB = (buffer.length / 1024).toFixed(1);
|
|
107
|
+
const sizeMB = (buffer.length / (1024 * 1024)).toFixed(2);
|
|
108
|
+
// Validate package size based on tier
|
|
109
|
+
const sizeBytes = buffer.length;
|
|
110
|
+
const sizeLimits = {
|
|
111
|
+
free: 25 * 1024 * 1024, // 25 MB
|
|
112
|
+
pro: 100 * 1024 * 1024, // 100 MB
|
|
113
|
+
enterprise: Infinity // Unlimited
|
|
114
|
+
};
|
|
115
|
+
const tierLimit = sizeLimits[userTier] || sizeLimits.free;
|
|
116
|
+
if (sizeBytes > tierLimit) {
|
|
117
|
+
const limitMB = tierLimit === Infinity ? 'unlimited' : (tierLimit / (1024 * 1024)).toString();
|
|
118
|
+
let upgradeMessage = '';
|
|
119
|
+
if (userTier === 'free') {
|
|
120
|
+
upgradeMessage = ' Consider upgrading to Pro tier (100 MB limit) or reducing package size.';
|
|
121
|
+
}
|
|
122
|
+
else if (userTier === 'pro') {
|
|
123
|
+
upgradeMessage = ' Consider upgrading to Enterprise tier (unlimited) or reducing package size.';
|
|
124
|
+
}
|
|
125
|
+
const error = new Error(`Package size (${sizeMB} MB) exceeds ${userTier || 'free'} tier limit of ${limitMB} MB.${upgradeMessage}`);
|
|
126
|
+
reject(error);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
console.log(chalk_1.default.gray(`Source code zipped: ${sizeKB} KB`));
|
|
130
|
+
if (parseFloat(sizeMB) >= 1) {
|
|
131
|
+
console.log(chalk_1.default.gray(`Package size: ${sizeMB} MB`));
|
|
132
|
+
}
|
|
133
|
+
console.log(chalk_1.default.gray(`Saved to: .dispatch/${archiveFilename}`));
|
|
134
|
+
// Show tier-specific size info
|
|
135
|
+
const currentSizeMB = parseFloat(sizeMB);
|
|
136
|
+
if (userTier === 'free') {
|
|
137
|
+
const remainingMB = (25 - currentSizeMB).toFixed(2);
|
|
138
|
+
if (parseFloat(remainingMB) < 5) {
|
|
139
|
+
console.log(chalk_1.default.yellow(`⚠️ Free tier: ${remainingMB} MB remaining (25 MB limit)`));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (userTier === 'pro') {
|
|
143
|
+
const remainingMB = (100 - currentSizeMB).toFixed(2);
|
|
144
|
+
if (parseFloat(remainingMB) < 10) {
|
|
145
|
+
console.log(chalk_1.default.yellow(`⚠️ Pro tier: ${remainingMB} MB remaining (100 MB limit)`));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else if (userTier === 'enterprise') {
|
|
149
|
+
if (currentSizeMB > 50) {
|
|
150
|
+
console.log(chalk_1.default.gray(`📦 Enterprise tier: ${sizeMB} MB (unlimited)`));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Create deployment metadata file
|
|
154
|
+
const metadata = {
|
|
155
|
+
deploymentId,
|
|
156
|
+
projectName,
|
|
157
|
+
timestamp: new Date().toISOString(),
|
|
158
|
+
archiveSize: buffer.length,
|
|
159
|
+
archiveFilename
|
|
160
|
+
};
|
|
161
|
+
const metadataPath = path.join(dispatchFolder, `${deploymentId}.json`);
|
|
162
|
+
fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
|
|
163
|
+
resolve(buffer);
|
|
164
|
+
});
|
|
165
|
+
archive.on('error', reject);
|
|
166
|
+
// Read project .gitignore patterns
|
|
167
|
+
const gitignorePatterns = readGitignorePatterns(projectRoot);
|
|
168
|
+
// Add all files except common ignore patterns
|
|
169
|
+
const defaultIgnore = [
|
|
170
|
+
// Node.js
|
|
171
|
+
'node_modules/**',
|
|
172
|
+
// Git
|
|
173
|
+
'.git/**',
|
|
174
|
+
'.gitignore',
|
|
175
|
+
// Python virtual environments
|
|
176
|
+
'.venv/**',
|
|
177
|
+
'venv/**',
|
|
178
|
+
'env/**',
|
|
179
|
+
'.env/**',
|
|
180
|
+
'virtualenv/**',
|
|
181
|
+
'.virtualenv/**',
|
|
182
|
+
// Python compiled files and cache
|
|
183
|
+
'__pycache__/**',
|
|
184
|
+
'**/__pycache__/**',
|
|
185
|
+
'*.pyc',
|
|
186
|
+
'*.pyo',
|
|
187
|
+
'*.pyd',
|
|
188
|
+
'.Python',
|
|
189
|
+
// Python distribution / packaging
|
|
190
|
+
'build/**',
|
|
191
|
+
'develop-eggs/**',
|
|
192
|
+
'dist/**',
|
|
193
|
+
'downloads/**',
|
|
194
|
+
'eggs/**',
|
|
195
|
+
'.eggs/**',
|
|
196
|
+
'lib/**',
|
|
197
|
+
'lib64/**',
|
|
198
|
+
'parts/**',
|
|
199
|
+
'sdist/**',
|
|
200
|
+
'var/**',
|
|
201
|
+
'wheels/**',
|
|
202
|
+
'*.egg-info/**',
|
|
203
|
+
'.installed.cfg',
|
|
204
|
+
'*.egg',
|
|
205
|
+
'MANIFEST',
|
|
206
|
+
// Python testing
|
|
207
|
+
'.tox/**',
|
|
208
|
+
'.coverage',
|
|
209
|
+
'.coverage.*',
|
|
210
|
+
'.cache',
|
|
211
|
+
'.pytest_cache/**',
|
|
212
|
+
'nosetests.xml',
|
|
213
|
+
'coverage.xml',
|
|
214
|
+
'*.cover',
|
|
215
|
+
'.hypothesis/**',
|
|
216
|
+
// Python IDEs
|
|
217
|
+
'.idea/**',
|
|
218
|
+
'.vscode/**',
|
|
219
|
+
'*.swp',
|
|
220
|
+
'*.swo',
|
|
221
|
+
'*~',
|
|
222
|
+
// Environment files
|
|
223
|
+
'.env',
|
|
224
|
+
'.env.local',
|
|
225
|
+
'.env.*.local',
|
|
226
|
+
// OS files
|
|
227
|
+
'.DS_Store',
|
|
228
|
+
'Thumbs.db',
|
|
229
|
+
// Archive files
|
|
230
|
+
'*.zip',
|
|
231
|
+
'*.tar.gz',
|
|
232
|
+
'*.tar',
|
|
233
|
+
// Dispatch build artifacts
|
|
234
|
+
'.dispatch/**', // Ignore the .dispatch folder itself
|
|
235
|
+
];
|
|
236
|
+
// Combine default patterns with .gitignore patterns
|
|
237
|
+
const allIgnorePatterns = [...defaultIgnore, ...gitignorePatterns];
|
|
238
|
+
console.log(chalk_1.default.gray(`Excluding ${allIgnorePatterns.length} patterns from deployment package`));
|
|
239
|
+
if (gitignorePatterns.length > 0) {
|
|
240
|
+
console.log(chalk_1.default.gray(`Found ${gitignorePatterns.length} additional patterns from .gitignore`));
|
|
241
|
+
}
|
|
242
|
+
archive.glob('**/*', {
|
|
243
|
+
cwd: projectRoot,
|
|
244
|
+
ignore: allIgnorePatterns,
|
|
245
|
+
dot: true,
|
|
246
|
+
});
|
|
247
|
+
archive.finalize();
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=sourceUploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceUploader.js","sourceRoot":"","sources":["../../src/services/sourceUploader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../../src/services/uploader.ts"],"names":[],"mappings":"AAcA,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe/F"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.uploadArtifact = uploadArtifact;
|
|
37
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const REGION = process.env.AWS_REGION || 'eu-west-2';
|
|
41
|
+
const BUCKET_NAME = process.env.DISPATCH_ARTIFACT_BUCKET || '';
|
|
42
|
+
if (!BUCKET_NAME) {
|
|
43
|
+
console.error('❌ DISPATCH_ARTIFACT_BUCKET environment variable required');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
const s3 = new client_s3_1.S3Client({ region: REGION });
|
|
47
|
+
async function uploadArtifact(artifactPath, projectName) {
|
|
48
|
+
const filename = path.basename(artifactPath);
|
|
49
|
+
const key = `projects/${projectName}/${Date.now()}_${filename}`;
|
|
50
|
+
console.log(`Uploading artifact to s3://${BUCKET_NAME}/${key}...`);
|
|
51
|
+
const fileStream = fs.createReadStream(artifactPath);
|
|
52
|
+
await s3.send(new client_s3_1.PutObjectCommand({
|
|
53
|
+
Bucket: BUCKET_NAME,
|
|
54
|
+
Key: key,
|
|
55
|
+
Body: fileStream
|
|
56
|
+
}));
|
|
57
|
+
return key;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=uploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.js","sourceRoot":"","sources":["../../src/services/uploader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,wCAeC;AA7BD,kDAAgE;AAChE,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAC;AACrD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC;AAE/D,IAAI,CAAC,WAAW,EAAE,CAAC;IACjB,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,EAAE,GAAG,IAAI,oBAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAErC,KAAK,UAAU,cAAc,CAAC,YAAoB,EAAE,WAAmB;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,YAAY,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,8BAA8B,WAAW,IAAI,GAAG,KAAK,CAAC,CAAC;IAEnE,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAErD,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,4BAAgB,CAAC;QAC/B,MAAM,EAAE,WAAW;QACnB,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,UAAU;KACnB,CAAC,CAAC,CAAC;IAEJ,OAAO,GAAG,CAAC;AACf,CAAC"}
|