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.
Files changed (114) hide show
  1. package/README.md +86 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +148 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/check.d.ts +15 -0
  7. package/dist/commands/check.d.ts.map +1 -0
  8. package/dist/commands/check.js +107 -0
  9. package/dist/commands/check.js.map +1 -0
  10. package/dist/commands/delete.d.ts +6 -0
  11. package/dist/commands/delete.d.ts.map +1 -0
  12. package/dist/commands/delete.js +107 -0
  13. package/dist/commands/delete.js.map +1 -0
  14. package/dist/commands/deploy.d.ts +9 -0
  15. package/dist/commands/deploy.d.ts.map +1 -0
  16. package/dist/commands/deploy.js +275 -0
  17. package/dist/commands/deploy.js.map +1 -0
  18. package/dist/commands/login.d.ts +4 -0
  19. package/dist/commands/login.d.ts.map +1 -0
  20. package/dist/commands/login.js +34 -0
  21. package/dist/commands/login.js.map +1 -0
  22. package/dist/commands/logout.d.ts +2 -0
  23. package/dist/commands/logout.d.ts.map +1 -0
  24. package/dist/commands/logout.js +15 -0
  25. package/dist/commands/logout.js.map +1 -0
  26. package/dist/commands/logs.d.ts +6 -0
  27. package/dist/commands/logs.d.ts.map +1 -0
  28. package/dist/commands/logs.js +129 -0
  29. package/dist/commands/logs.js.map +1 -0
  30. package/dist/commands/poll.d.ts +10 -0
  31. package/dist/commands/poll.d.ts.map +1 -0
  32. package/dist/commands/poll.js +72 -0
  33. package/dist/commands/poll.js.map +1 -0
  34. package/dist/commands/projects.d.ts +5 -0
  35. package/dist/commands/projects.d.ts.map +1 -0
  36. package/dist/commands/projects.js +49 -0
  37. package/dist/commands/projects.js.map +1 -0
  38. package/dist/commands/register.d.ts +5 -0
  39. package/dist/commands/register.d.ts.map +1 -0
  40. package/dist/commands/register.js +46 -0
  41. package/dist/commands/register.js.map +1 -0
  42. package/dist/commands/trigger.d.ts +11 -0
  43. package/dist/commands/trigger.d.ts.map +1 -0
  44. package/dist/commands/trigger.js +52 -0
  45. package/dist/commands/trigger.js.map +1 -0
  46. package/dist/config/runtime.d.ts +18 -0
  47. package/dist/config/runtime.d.ts.map +1 -0
  48. package/dist/config/runtime.js +32 -0
  49. package/dist/config/runtime.js.map +1 -0
  50. package/dist/services/auth.d.ts +18 -0
  51. package/dist/services/auth.d.ts.map +1 -0
  52. package/dist/services/auth.js +122 -0
  53. package/dist/services/auth.js.map +1 -0
  54. package/dist/services/builder.d.ts +4 -0
  55. package/dist/services/builder.d.ts.map +1 -0
  56. package/dist/services/builder.js +89 -0
  57. package/dist/services/builder.js.map +1 -0
  58. package/dist/services/controlPlane.d.ts +16 -0
  59. package/dist/services/controlPlane.d.ts.map +1 -0
  60. package/dist/services/controlPlane.js +155 -0
  61. package/dist/services/controlPlane.js.map +1 -0
  62. package/dist/services/deployer.d.ts +2 -0
  63. package/dist/services/deployer.d.ts.map +1 -0
  64. package/dist/services/deployer.js +49 -0
  65. package/dist/services/deployer.js.map +1 -0
  66. package/dist/services/project.d.ts +9 -0
  67. package/dist/services/project.d.ts.map +1 -0
  68. package/dist/services/project.js +29 -0
  69. package/dist/services/project.js.map +1 -0
  70. package/dist/services/sourceUploader.d.ts +9 -0
  71. package/dist/services/sourceUploader.d.ts.map +1 -0
  72. package/dist/services/sourceUploader.js +250 -0
  73. package/dist/services/sourceUploader.js.map +1 -0
  74. package/dist/services/uploader.d.ts +2 -0
  75. package/dist/services/uploader.d.ts.map +1 -0
  76. package/dist/services/uploader.js +59 -0
  77. package/dist/services/uploader.js.map +1 -0
  78. package/dist/types/deployment.d.ts +43 -0
  79. package/dist/types/deployment.d.ts.map +1 -0
  80. package/dist/types/deployment.js +6 -0
  81. package/dist/types/deployment.js.map +1 -0
  82. package/dist/types.d.ts +53 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +7 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist/utils/config.d.ts +17 -0
  87. package/dist/utils/config.d.ts.map +1 -0
  88. package/dist/utils/config.js +85 -0
  89. package/dist/utils/config.js.map +1 -0
  90. package/dist/utils/credentials.d.ts +16 -0
  91. package/dist/utils/credentials.d.ts.map +1 -0
  92. package/dist/utils/credentials.js +72 -0
  93. package/dist/utils/credentials.js.map +1 -0
  94. package/dist/utils/debug.d.ts +7 -0
  95. package/dist/utils/debug.d.ts.map +1 -0
  96. package/dist/utils/debug.js +21 -0
  97. package/dist/utils/debug.js.map +1 -0
  98. package/dist/utils/input.d.ts +3 -0
  99. package/dist/utils/input.d.ts.map +1 -0
  100. package/dist/utils/input.js +94 -0
  101. package/dist/utils/input.js.map +1 -0
  102. package/dist/utils/loader.d.ts +22 -0
  103. package/dist/utils/loader.d.ts.map +1 -0
  104. package/dist/utils/loader.js +139 -0
  105. package/dist/utils/loader.js.map +1 -0
  106. package/dist/utils/normalizer.d.ts +10 -0
  107. package/dist/utils/normalizer.d.ts.map +1 -0
  108. package/dist/utils/normalizer.js +115 -0
  109. package/dist/utils/normalizer.js.map +1 -0
  110. package/dist/utils/safety.d.ts +18 -0
  111. package/dist/utils/safety.d.ts.map +1 -0
  112. package/dist/utils/safety.js +140 -0
  113. package/dist/utils/safety.js.map +1 -0
  114. 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,2 @@
1
+ export declare function deployToAws(artifactPath: string, functionName: string): Promise<string>;
2
+ //# sourceMappingURL=deployer.d.ts.map
@@ -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,2 @@
1
+ export declare function uploadArtifact(artifactPath: string, projectName: string): Promise<string>;
2
+ //# sourceMappingURL=uploader.d.ts.map
@@ -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"}