seamless-cli 0.2.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 (100) hide show
  1. package/LICENSE +79 -0
  2. package/LICENSE.md +26 -0
  3. package/README.md +238 -0
  4. package/dist/commands/bootstrapAdmin.js +96 -0
  5. package/dist/commands/bootstrapAdmin.js.map +1 -0
  6. package/dist/commands/check.js +92 -0
  7. package/dist/commands/check.js.map +1 -0
  8. package/dist/commands/contribute.js +121 -0
  9. package/dist/commands/contribute.js.map +1 -0
  10. package/dist/commands/deploy.js +190 -0
  11. package/dist/commands/deploy.js.map +1 -0
  12. package/dist/commands/destroy.js +122 -0
  13. package/dist/commands/destroy.js.map +1 -0
  14. package/dist/commands/help.js +103 -0
  15. package/dist/commands/help.js.map +1 -0
  16. package/dist/commands/init.js +73 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/contributor/catalog.js +129 -0
  19. package/dist/contributor/catalog.js.map +1 -0
  20. package/dist/contributor/workspace.js +551 -0
  21. package/dist/contributor/workspace.js.map +1 -0
  22. package/dist/core/acm.js +24 -0
  23. package/dist/core/acm.js.map +1 -0
  24. package/dist/core/aws.js +374 -0
  25. package/dist/core/aws.js.map +1 -0
  26. package/dist/core/bootstrapSecret.js +31 -0
  27. package/dist/core/bootstrapSecret.js.map +1 -0
  28. package/dist/core/buildPush.js +91 -0
  29. package/dist/core/buildPush.js.map +1 -0
  30. package/dist/core/configure.js +25 -0
  31. package/dist/core/configure.js.map +1 -0
  32. package/dist/core/deployConfig.js +66 -0
  33. package/dist/core/deployConfig.js.map +1 -0
  34. package/dist/core/deployManifest.js +163 -0
  35. package/dist/core/deployManifest.js.map +1 -0
  36. package/dist/core/deploySecrets.js +31 -0
  37. package/dist/core/deploySecrets.js.map +1 -0
  38. package/dist/core/destroy.js +38 -0
  39. package/dist/core/destroy.js.map +1 -0
  40. package/dist/core/env.js +35 -0
  41. package/dist/core/env.js.map +1 -0
  42. package/dist/core/envDiscovery.js +153 -0
  43. package/dist/core/envDiscovery.js.map +1 -0
  44. package/dist/core/envRegistry.js +76 -0
  45. package/dist/core/envRegistry.js.map +1 -0
  46. package/dist/core/exec.js +17 -0
  47. package/dist/core/exec.js.map +1 -0
  48. package/dist/core/fetch.js +9 -0
  49. package/dist/core/fetch.js.map +1 -0
  50. package/dist/core/health.js +11 -0
  51. package/dist/core/health.js.map +1 -0
  52. package/dist/core/help.js +75 -0
  53. package/dist/core/help.js.map +1 -0
  54. package/dist/core/inspect.js +15 -0
  55. package/dist/core/inspect.js.map +1 -0
  56. package/dist/core/jwks.js +19 -0
  57. package/dist/core/jwks.js.map +1 -0
  58. package/dist/core/output.js +94 -0
  59. package/dist/core/output.js.map +1 -0
  60. package/dist/core/packageManager.js +10 -0
  61. package/dist/core/packageManager.js.map +1 -0
  62. package/dist/core/paths.js +7 -0
  63. package/dist/core/paths.js.map +1 -0
  64. package/dist/core/preReqs.js +14 -0
  65. package/dist/core/preReqs.js.map +1 -0
  66. package/dist/core/secrets.js +8 -0
  67. package/dist/core/secrets.js.map +1 -0
  68. package/dist/core/terraform.js +34 -0
  69. package/dist/core/terraform.js.map +1 -0
  70. package/dist/core/tfVars.js +69 -0
  71. package/dist/core/tfVars.js.map +1 -0
  72. package/dist/generators/admin/admin.js +2 -0
  73. package/dist/generators/admin/admin.js.map +1 -0
  74. package/dist/generators/auth/auth.js +47 -0
  75. package/dist/generators/auth/auth.js.map +1 -0
  76. package/dist/generators/backend/express.js +13 -0
  77. package/dist/generators/backend/express.js.map +1 -0
  78. package/dist/generators/config/config.js +43 -0
  79. package/dist/generators/config/config.js.map +1 -0
  80. package/dist/generators/deploy/aws/dev/files.js +36 -0
  81. package/dist/generators/deploy/aws/dev/files.js.map +1 -0
  82. package/dist/generators/deploy/aws/dev/template.js +1240 -0
  83. package/dist/generators/deploy/aws/dev/template.js.map +1 -0
  84. package/dist/generators/docker/docker.js +263 -0
  85. package/dist/generators/docker/docker.js.map +1 -0
  86. package/dist/generators/frontend/react.js +13 -0
  87. package/dist/generators/frontend/react.js.map +1 -0
  88. package/dist/index.js +43 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/prompts/contributeSetup.js +39 -0
  91. package/dist/prompts/contributeSetup.js.map +1 -0
  92. package/dist/prompts/deploySetup.js +244 -0
  93. package/dist/prompts/deploySetup.js.map +1 -0
  94. package/dist/prompts/projectSetup.js +73 -0
  95. package/dist/prompts/projectSetup.js.map +1 -0
  96. package/dist/utils/repoUtils.js +23 -0
  97. package/dist/utils/repoUtils.js.map +1 -0
  98. package/dist/utils/writeEnv.js +9 -0
  99. package/dist/utils/writeEnv.js.map +1 -0
  100. package/package.json +43 -0
@@ -0,0 +1,374 @@
1
+ import { execCommand } from "./exec.js";
2
+ export async function getAwsIdentity(profile, region) {
3
+ const result = await execCommand("aws", [
4
+ "--profile",
5
+ profile,
6
+ "--region",
7
+ region,
8
+ "sts",
9
+ "get-caller-identity",
10
+ "--output",
11
+ "json",
12
+ ], { quiet: true });
13
+ const parsed = JSON.parse(result.stdout);
14
+ return {
15
+ accountId: parsed.Account,
16
+ arn: parsed.Arn,
17
+ userId: parsed.UserId,
18
+ };
19
+ }
20
+ export async function listHostedZones(profile, region) {
21
+ const result = await execCommand("aws", [
22
+ "--profile",
23
+ profile,
24
+ "--region",
25
+ region,
26
+ "route53",
27
+ "list-hosted-zones",
28
+ "--output",
29
+ "json",
30
+ ], { quiet: true });
31
+ const parsed = JSON.parse(result.stdout);
32
+ return (parsed.HostedZones ?? [])
33
+ .map((zone) => ({
34
+ id: zone.Id.replace("/hostedzone/", ""),
35
+ name: zone.Name.replace(/\.$/, ""),
36
+ privateZone: Boolean(zone.Config?.PrivateZone),
37
+ }))
38
+ .filter((zone) => !zone.privateZone)
39
+ .sort((a, b) => a.name.localeCompare(b.name));
40
+ }
41
+ export async function ensureRoute53ZoneExistsByName(profile, region, hostedZoneDomain) {
42
+ const zones = await listHostedZones(profile, region);
43
+ const match = zones.find((zone) => zone.name === hostedZoneDomain);
44
+ if (!match) {
45
+ throw new Error(`Route 53 hosted zone not found for domain: ${hostedZoneDomain}`);
46
+ }
47
+ return match;
48
+ }
49
+ export async function getEcrLoginPassword(profile, region) {
50
+ const result = await execCommand("aws", ["--profile", profile, "--region", region, "ecr", "get-login-password"], { quiet: true });
51
+ return result.stdout.trim();
52
+ }
53
+ export function buildEcrRegistry(accountId, region) {
54
+ return `${accountId}.dkr.ecr.${region}.amazonaws.com`;
55
+ }
56
+ export function buildEcrImageUri(registry, repositoryName, tag) {
57
+ return `${registry}/${repositoryName}:${tag}`;
58
+ }
59
+ export async function describeEcrRepository(profile, region, repositoryName) {
60
+ try {
61
+ const result = await execCommand("aws", [
62
+ "--profile",
63
+ profile,
64
+ "--region",
65
+ region,
66
+ "ecr",
67
+ "describe-repositories",
68
+ "--repository-names",
69
+ repositoryName,
70
+ "--output",
71
+ "json",
72
+ ], { quiet: true });
73
+ const parsed = JSON.parse(result.stdout);
74
+ const repo = parsed.repositories?.[0];
75
+ if (!repo)
76
+ return null;
77
+ return {
78
+ repositoryName: repo.repositoryName,
79
+ repositoryUri: repo.repositoryUri,
80
+ };
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ export async function ensureEcrRepository(profile, region, repositoryName) {
87
+ const existing = await describeEcrRepository(profile, region, repositoryName);
88
+ if (existing)
89
+ return existing;
90
+ const result = await execCommand("aws", [
91
+ "--profile",
92
+ profile,
93
+ "--region",
94
+ region,
95
+ "ecr",
96
+ "create-repository",
97
+ "--repository-name",
98
+ repositoryName,
99
+ "--image-tag-mutability",
100
+ "MUTABLE",
101
+ "--image-scanning-configuration",
102
+ "scanOnPush=true",
103
+ "--output",
104
+ "json",
105
+ ], { quiet: true });
106
+ const parsed = JSON.parse(result.stdout);
107
+ return {
108
+ repositoryName: parsed.repository.repositoryName,
109
+ repositoryUri: parsed.repository.repositoryUri,
110
+ };
111
+ }
112
+ export async function ensureEcrRepositories(profile, region, repositoryNames) {
113
+ const repositories = [];
114
+ for (const repositoryName of repositoryNames) {
115
+ const repository = await ensureEcrRepository(profile, region, repositoryName);
116
+ repositories.push(repository);
117
+ }
118
+ return repositories;
119
+ }
120
+ export async function listEcrImages(profile, region, repositoryName) {
121
+ try {
122
+ const result = await execCommand("aws", [
123
+ "--profile",
124
+ profile,
125
+ "--region",
126
+ region,
127
+ "ecr",
128
+ "list-images",
129
+ "--repository-name",
130
+ repositoryName,
131
+ "--query",
132
+ "imageIds[*].imageTag",
133
+ "--output",
134
+ "json",
135
+ ], { quiet: true });
136
+ const parsed = JSON.parse(result.stdout);
137
+ return parsed.filter((tag) => Boolean(tag));
138
+ }
139
+ catch {
140
+ return [];
141
+ }
142
+ }
143
+ export async function deleteEcrImages(profile, region, repositoryName) {
144
+ const result = await execCommand("aws", [
145
+ "--profile",
146
+ profile,
147
+ "--region",
148
+ region,
149
+ "ecr",
150
+ "list-images",
151
+ "--repository-name",
152
+ repositoryName,
153
+ "--output",
154
+ "json",
155
+ ], { quiet: true });
156
+ const parsed = JSON.parse(result.stdout);
157
+ const imageIds = parsed.imageIds ?? [];
158
+ if (imageIds.length === 0)
159
+ return;
160
+ const payload = JSON.stringify({
161
+ imageIds: imageIds.map((image) => {
162
+ if (image.imageDigest) {
163
+ return { imageDigest: image.imageDigest };
164
+ }
165
+ return { imageTag: image.imageTag };
166
+ }),
167
+ });
168
+ await execCommand("aws", [
169
+ "--profile",
170
+ profile,
171
+ "--region",
172
+ region,
173
+ "ecr",
174
+ "batch-delete-image",
175
+ "--repository-name",
176
+ repositoryName,
177
+ "--cli-input-json",
178
+ payload,
179
+ ], { quiet: true });
180
+ }
181
+ export async function deleteEcrRepository(profile, region, repositoryName) {
182
+ try {
183
+ await execCommand("aws", [
184
+ "--profile",
185
+ profile,
186
+ "--region",
187
+ region,
188
+ "ecr",
189
+ "delete-repository",
190
+ "--repository-name",
191
+ repositoryName,
192
+ "--force",
193
+ ], { quiet: true });
194
+ }
195
+ catch { }
196
+ }
197
+ export async function listAllS3ObjectVersions(profile, region, bucketName) {
198
+ const result = await execCommand("aws", [
199
+ "--profile",
200
+ profile,
201
+ "--region",
202
+ region,
203
+ "s3api",
204
+ "list-object-versions",
205
+ "--bucket",
206
+ bucketName,
207
+ "--output",
208
+ "json",
209
+ ], { quiet: true });
210
+ const parsed = JSON.parse(result.stdout);
211
+ const versions = (parsed.Versions ?? [])
212
+ .filter((item) => Boolean(item.Key) && Boolean(item.VersionId))
213
+ .map((item) => ({
214
+ Key: item.Key,
215
+ VersionId: item.VersionId,
216
+ }));
217
+ const deleteMarkers = (parsed.DeleteMarkers ?? [])
218
+ .filter((item) => Boolean(item.Key) && Boolean(item.VersionId))
219
+ .map((item) => ({
220
+ Key: item.Key,
221
+ VersionId: item.VersionId,
222
+ }));
223
+ return [...versions, ...deleteMarkers];
224
+ }
225
+ export async function deleteS3ObjectVersionsBatch(profile, region, bucketName, objects) {
226
+ if (objects.length === 0)
227
+ return;
228
+ const payload = JSON.stringify({
229
+ Bucket: bucketName,
230
+ Delete: {
231
+ Objects: objects.map((item) => ({
232
+ Key: item.Key,
233
+ VersionId: item.VersionId,
234
+ })),
235
+ Quiet: true,
236
+ },
237
+ });
238
+ await execCommand("aws", [
239
+ "--profile",
240
+ profile,
241
+ "--region",
242
+ region,
243
+ "s3api",
244
+ "delete-objects",
245
+ "--cli-input-json",
246
+ payload,
247
+ ], { quiet: true });
248
+ }
249
+ export async function emptyVersionedS3Bucket(profile, region, bucketName) {
250
+ while (true) {
251
+ const objects = await listAllS3ObjectVersions(profile, region, bucketName);
252
+ if (objects.length === 0)
253
+ break;
254
+ const batchSize = 500;
255
+ for (let i = 0; i < objects.length; i += batchSize) {
256
+ const batch = objects.slice(i, i + batchSize);
257
+ await deleteS3ObjectVersionsBatch(profile, region, bucketName, batch);
258
+ }
259
+ }
260
+ }
261
+ export async function findExistingAcmCertificate(profile, region, rootDomain) {
262
+ const result = await execCommand("aws", [
263
+ "--profile",
264
+ profile,
265
+ "--region",
266
+ region,
267
+ "acm",
268
+ "list-certificates",
269
+ "--output",
270
+ "json",
271
+ ], { quiet: true });
272
+ const parsed = JSON.parse(result.stdout);
273
+ const match = (parsed.CertificateSummaryList ?? []).find((cert) => cert.DomainName === rootDomain && cert.CertificateArn);
274
+ return match?.CertificateArn ?? null;
275
+ }
276
+ export async function requestAcmCertificate(profile, region, rootDomain, sans) {
277
+ const result = await execCommand("aws", [
278
+ "--profile",
279
+ profile,
280
+ "--region",
281
+ region,
282
+ "acm",
283
+ "request-certificate",
284
+ "--domain-name",
285
+ rootDomain,
286
+ "--subject-alternative-names",
287
+ ...sans,
288
+ "--validation-method",
289
+ "DNS",
290
+ "--output",
291
+ "json",
292
+ ], { quiet: true });
293
+ const parsed = JSON.parse(result.stdout);
294
+ return parsed.CertificateArn;
295
+ }
296
+ export async function describeAcmCertificate(profile, region, certificateArn) {
297
+ const result = await execCommand("aws", [
298
+ "--profile",
299
+ profile,
300
+ "--region",
301
+ region,
302
+ "acm",
303
+ "describe-certificate",
304
+ "--certificate-arn",
305
+ certificateArn,
306
+ "--output",
307
+ "json",
308
+ ], { quiet: true });
309
+ const parsed = JSON.parse(result.stdout);
310
+ const validationRecords = (parsed.Certificate?.DomainValidationOptions ?? [])
311
+ .map((option) => option.ResourceRecord)
312
+ .filter((record) => Boolean(record?.Name) &&
313
+ Boolean(record?.Type) &&
314
+ Boolean(record?.Value))
315
+ .map((record) => ({
316
+ name: record.Name,
317
+ type: record.Type,
318
+ value: record.Value,
319
+ }));
320
+ return {
321
+ status: parsed.Certificate?.Status ?? "UNKNOWN",
322
+ validationRecords,
323
+ };
324
+ }
325
+ export async function upsertRoute53Records(profile, hostedZoneId, records) {
326
+ if (records.length === 0) {
327
+ throw new Error("No ACM validation records available yet");
328
+ }
329
+ const payload = JSON.stringify({
330
+ Changes: records.map((record) => ({
331
+ Action: "UPSERT",
332
+ ResourceRecordSet: {
333
+ Name: record.name,
334
+ Type: record.type,
335
+ TTL: 60,
336
+ ResourceRecords: [{ Value: record.value }],
337
+ },
338
+ })),
339
+ });
340
+ await execCommand("aws", [
341
+ "--profile",
342
+ profile,
343
+ "route53",
344
+ "change-resource-record-sets",
345
+ "--hosted-zone-id",
346
+ hostedZoneId,
347
+ "--change-batch",
348
+ payload,
349
+ ], { quiet: true });
350
+ }
351
+ export async function waitForAcmValidationRecords(profile, region, certificateArn, maxAttempts = 20) {
352
+ for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
353
+ const description = await describeAcmCertificate(profile, region, certificateArn);
354
+ if (description.validationRecords.length > 0) {
355
+ return description.validationRecords;
356
+ }
357
+ await new Promise((resolve) => setTimeout(resolve, 5000));
358
+ }
359
+ throw new Error(`Timed out waiting for ACM validation records: ${certificateArn}`);
360
+ }
361
+ export async function waitForAcmCertificateIssued(profile, region, certificateArn, maxAttempts = 40) {
362
+ for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
363
+ const description = await describeAcmCertificate(profile, region, certificateArn);
364
+ if (description.status === "ISSUED") {
365
+ return;
366
+ }
367
+ if (description.status === "FAILED") {
368
+ throw new Error(`ACM certificate failed validation: ${certificateArn}`);
369
+ }
370
+ await new Promise((resolve) => setTimeout(resolve, 15000));
371
+ }
372
+ throw new Error(`Timed out waiting for ACM certificate issuance: ${certificateArn}`);
373
+ }
374
+ //# sourceMappingURL=aws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws.js","sourceRoot":"","sources":["../../src/core/aws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ export function resolveBootstrapSecret() {
4
+ const root = process.cwd();
5
+ if (process.env.SEAMLESS_BOOTSTRAP_SECRET) {
6
+ return process.env.SEAMLESS_BOOTSTRAP_SECRET;
7
+ }
8
+ const rootEnv = path.join(root, ".env");
9
+ if (fs.existsSync(rootEnv)) {
10
+ const content = fs.readFileSync(rootEnv, "utf-8");
11
+ const match = content.match(/SEAMLESS_BOOTSTRAP_SECRET=(.*)/);
12
+ if (match)
13
+ return match[1].trim();
14
+ }
15
+ const authEnv = path.join(root, "auth", ".env");
16
+ if (fs.existsSync(authEnv)) {
17
+ const content = fs.readFileSync(authEnv, "utf-8");
18
+ const match = content.match(/SEAMLESS_BOOTSTRAP_SECRET=(.*)/);
19
+ if (match)
20
+ return match[1].trim();
21
+ }
22
+ const compose = path.join(root, "docker-compose.yml");
23
+ if (fs.existsSync(compose)) {
24
+ const content = fs.readFileSync(compose, "utf-8");
25
+ const match = content.match(/SEAMLESS_BOOTSTRAP_SECRET:\s*(.*)/);
26
+ if (match)
27
+ return match[1].trim();
28
+ }
29
+ return null;
30
+ }
31
+ //# sourceMappingURL=bootstrapSecret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrapSecret.js","sourceRoot":"","sources":["../../src/core/bootstrapSecret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC/C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC9D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC9D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACtD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAElD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACjE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,91 @@
1
+ import path from "node:path";
2
+ import { spawn } from "node:child_process";
3
+ import { execCommand } from "./exec.js";
4
+ import { buildEcrImageUri, buildEcrRegistry, ensureEcrRepositories, getEcrLoginPassword, } from "./aws.js";
5
+ import { getAwsDevInfraDir } from "./paths.js";
6
+ async function dockerLogin(registry, password) {
7
+ await new Promise((resolve, reject) => {
8
+ const child = spawn("docker", ["login", "--username", "AWS", "--password-stdin", registry], { stdio: ["pipe", "pipe", "pipe"] });
9
+ let stderr = "";
10
+ child.stderr.on("data", (chunk) => {
11
+ stderr += String(chunk);
12
+ });
13
+ child.on("error", reject);
14
+ child.on("close", (code) => {
15
+ if ((code ?? 0) !== 0) {
16
+ reject(new Error(`Docker login failed: ${stderr}`));
17
+ return;
18
+ }
19
+ resolve();
20
+ });
21
+ child.stdin.write(password);
22
+ child.stdin.end();
23
+ });
24
+ }
25
+ async function buildAndPushOne(buildDir, imageUri) {
26
+ await execCommand("docker", ["build", "-t", imageUri, "."], {
27
+ cwd: buildDir,
28
+ });
29
+ await execCommand("docker", ["push", imageUri], {
30
+ cwd: buildDir,
31
+ });
32
+ }
33
+ function requireServicePath(service, name) {
34
+ if (!service.path) {
35
+ throw new Error(`${name} service is source-backed but no local path was configured`);
36
+ }
37
+ return service.path;
38
+ }
39
+ function requireServiceImage(service, name) {
40
+ if (!service.image) {
41
+ throw new Error(`${name} service is image-backed but no image reference was configured`);
42
+ }
43
+ return service.image;
44
+ }
45
+ export async function buildAndPushImages(projectDir, manifest, accountId) {
46
+ const reposToEnsure = [
47
+ manifest.images.web.repositoryName,
48
+ manifest.images.api.repositoryName,
49
+ manifest.images.postgres.repositoryName,
50
+ ];
51
+ if (manifest.services.auth.mode === "source") {
52
+ reposToEnsure.push(manifest.images.auth.repositoryName);
53
+ }
54
+ if (manifest.services.admin.mode === "source") {
55
+ reposToEnsure.push(manifest.images.admin.repositoryName);
56
+ }
57
+ await ensureEcrRepositories(manifest.awsProfile, manifest.region, reposToEnsure);
58
+ const registry = buildEcrRegistry(accountId, manifest.region);
59
+ const password = await getEcrLoginPassword(manifest.awsProfile, manifest.region);
60
+ await dockerLogin(registry, password);
61
+ const webImage = buildEcrImageUri(registry, manifest.images.web.repositoryName, manifest.images.web.tag);
62
+ const apiImage = buildEcrImageUri(registry, manifest.images.api.repositoryName, manifest.images.api.tag);
63
+ const postgresImage = buildEcrImageUri(registry, manifest.images.postgres.repositoryName, manifest.images.postgres.tag);
64
+ await buildAndPushOne(path.resolve(projectDir, requireServicePath(manifest.services.web, "web")), webImage);
65
+ await buildAndPushOne(path.resolve(projectDir, requireServicePath(manifest.services.api, "api")), apiImage);
66
+ await buildAndPushOne(path.join(getAwsDevInfraDir(projectDir), "postgres"), postgresImage);
67
+ let authImage = "";
68
+ if (manifest.services.auth.mode === "source") {
69
+ authImage = buildEcrImageUri(registry, manifest.images.auth.repositoryName, manifest.images.auth.tag);
70
+ await buildAndPushOne(path.resolve(projectDir, requireServicePath(manifest.services.auth, "auth")), authImage);
71
+ }
72
+ else {
73
+ authImage = requireServiceImage(manifest.services.auth, "auth");
74
+ }
75
+ let adminImage = "";
76
+ if (manifest.services.admin.mode === "source") {
77
+ adminImage = buildEcrImageUri(registry, manifest.images.admin.repositoryName, manifest.images.admin.tag);
78
+ await buildAndPushOne(path.resolve(projectDir, requireServicePath(manifest.services.admin, "admin")), adminImage);
79
+ }
80
+ else {
81
+ adminImage = requireServiceImage(manifest.services.admin, "admin");
82
+ }
83
+ return {
84
+ web_image: webImage,
85
+ api_image: apiImage,
86
+ auth_image: authImage,
87
+ admin_image: adminImage,
88
+ postgres_image: postgresImage,
89
+ };
90
+ }
91
+ //# sourceMappingURL=buildPush.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildPush.js","sourceRoot":"","sources":["../../src/core/buildPush.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import { parseEnv, writeEnv } from "./env.js";
4
+ import { generateSecret } from "./secrets.js";
5
+ export function configureApiEnv(root, shared) {
6
+ const apiEnvPath = path.join(root, "api", ".env");
7
+ if (!fs.existsSync(apiEnvPath))
8
+ return;
9
+ const env = parseEnv(apiEnvPath);
10
+ env.AUTH_SERVER_URL = "http://localhost:5312";
11
+ env.API_SERVICE_TOKEN = shared.apiToken;
12
+ env.JWKS_KID = shared.kid;
13
+ env.COOKIE_SIGNING_KEY = generateSecret(32);
14
+ writeEnv(apiEnvPath, env);
15
+ }
16
+ export function configureWebEnv(root) {
17
+ const webEnvPath = path.join(root, "web", ".env");
18
+ if (!fs.existsSync(webEnvPath))
19
+ return;
20
+ const env = parseEnv(webEnvPath);
21
+ env.VITE_AUTH_SERVER_URL = "http://localhost:5312";
22
+ env.VITE_API_URL = "http://localhost:3000";
23
+ writeEnv(webEnvPath, env);
24
+ }
25
+ //# sourceMappingURL=configure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/core/configure.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAAW;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IAEvC,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEjC,GAAG,CAAC,eAAe,GAAG,uBAAuB,CAAC;IAC9C,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC;IACxC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC;IAC1B,GAAG,CAAC,kBAAkB,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IAE5C,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IAEvC,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEjC,GAAG,CAAC,oBAAoB,GAAG,uBAAuB,CAAC;IACnD,GAAG,CAAC,YAAY,GAAG,uBAAuB,CAAC;IAE3C,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,66 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ export function getSeamlessConfigPath(projectDir) {
4
+ return path.join(projectDir, "seamless.config.json");
5
+ }
6
+ export function readSeamlessConfig(projectDir) {
7
+ const configPath = getSeamlessConfigPath(projectDir);
8
+ if (!fs.existsSync(configPath)) {
9
+ throw new Error(`Missing seamless.config.json in ${projectDir}`);
10
+ }
11
+ const raw = fs.readFileSync(configPath, "utf8");
12
+ return JSON.parse(raw);
13
+ }
14
+ export function writeSeamlessConfig(projectDir, config) {
15
+ const configPath = getSeamlessConfigPath(projectDir);
16
+ fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
17
+ }
18
+ export function mergeDeployConfig(config, deploy) {
19
+ return {
20
+ ...config,
21
+ deploy: {
22
+ provider: deploy.provider,
23
+ tier: deploy.tier,
24
+ region: deploy.region,
25
+ awsProfile: deploy.awsProfile,
26
+ domain: deploy.domain,
27
+ backup: deploy.backup,
28
+ },
29
+ };
30
+ }
31
+ export function validateRequiredServices(config) {
32
+ const missing = [];
33
+ if (!config.services.web)
34
+ missing.push("web");
35
+ if (!config.services.api)
36
+ missing.push("api");
37
+ if (!config.services.auth)
38
+ missing.push("auth");
39
+ if (!config.services.admin)
40
+ missing.push("admin");
41
+ if (missing.length > 0) {
42
+ throw new Error(`Project is missing required services for deploy: ${missing.join(", ")}`);
43
+ }
44
+ }
45
+ export function buildDefaultDomainConfig(root, hostedZoneDomain, hostedZoneId) {
46
+ return {
47
+ root,
48
+ webHost: root,
49
+ apiHost: `api.${root}`,
50
+ authHost: `auth.${root}`,
51
+ adminHost: `admin.${root}`,
52
+ hostedZoneDomain: hostedZoneDomain ?? root,
53
+ hostedZoneId,
54
+ };
55
+ }
56
+ export function getExistingDeployDefaults(config) {
57
+ return {
58
+ provider: config.deploy?.provider ?? "aws",
59
+ tier: config.deploy?.tier,
60
+ region: config.deploy?.region,
61
+ awsProfile: config.deploy?.awsProfile,
62
+ domain: config.deploy?.domain,
63
+ backup: config.deploy?.backup,
64
+ };
65
+ }
66
+ //# sourceMappingURL=deployConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployConfig.js","sourceRoot":"","sources":["../../src/core/deployConfig.ts"],"names":[],"mappings":"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"}