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,163 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { getDeployManifestPath } from "./paths.js";
4
+ import { buildDeploySecretBundle, } from "./deploySecrets.js";
5
+ function emptyEnvMap() {
6
+ return {
7
+ web: [],
8
+ api: [],
9
+ auth: [],
10
+ admin: [],
11
+ };
12
+ }
13
+ function slugify(value) {
14
+ return value
15
+ .toLowerCase()
16
+ .replace(/[^a-z0-9]+/g, "-")
17
+ .replace(/^-+|-+$/g, "");
18
+ }
19
+ function normalizePath(value) {
20
+ if (!value || value.trim().length === 0) {
21
+ return null;
22
+ }
23
+ return value;
24
+ }
25
+ function normalizeImage(value) {
26
+ if (!value || value.trim().length === 0) {
27
+ return null;
28
+ }
29
+ return value;
30
+ }
31
+ function resolveServiceMode(service, fallback = "source") {
32
+ const hasPath = Boolean(normalizePath(service?.path));
33
+ const hasImage = Boolean(normalizeImage(service?.image));
34
+ if (hasPath)
35
+ return "source";
36
+ if (hasImage)
37
+ return "image";
38
+ return fallback;
39
+ }
40
+ function buildServiceEntry(service, fallback = "source") {
41
+ const normalizedPath = normalizePath(service?.path);
42
+ const normalizedImage = normalizeImage(service?.image);
43
+ const mode = resolveServiceMode(service, fallback);
44
+ if (mode === "source" && !normalizedPath) {
45
+ throw new Error("A source-backed service is missing a local path");
46
+ }
47
+ if (mode === "image" && !normalizedImage) {
48
+ throw new Error("An image-backed service is missing an image reference");
49
+ }
50
+ return {
51
+ mode,
52
+ path: normalizedPath,
53
+ image: normalizedImage,
54
+ };
55
+ }
56
+ function buildOrigins(answers) {
57
+ return {
58
+ webOrigin: `https://${answers.domain.webHost}`,
59
+ apiOrigin: `https://${answers.domain.apiHost}`,
60
+ authIssuer: `https://${answers.domain.authHost}`,
61
+ adminOrigin: `https://${answers.domain.adminHost}`,
62
+ };
63
+ }
64
+ function resolveSecrets(existing) {
65
+ if (existing?.runtime?.secrets) {
66
+ return existing.runtime.secrets;
67
+ }
68
+ return buildDeploySecretBundle();
69
+ }
70
+ export function readDeployManifest(projectDir) {
71
+ const filePath = getDeployManifestPath(projectDir);
72
+ if (!fs.existsSync(filePath)) {
73
+ throw new Error("Missing infra/deploy.json");
74
+ }
75
+ const raw = fs.readFileSync(filePath, "utf8");
76
+ return JSON.parse(raw);
77
+ }
78
+ export function readExistingDeployManifest(projectDir) {
79
+ const filePath = getDeployManifestPath(projectDir);
80
+ if (!fs.existsSync(filePath)) {
81
+ return null;
82
+ }
83
+ const raw = fs.readFileSync(filePath, "utf8");
84
+ return JSON.parse(raw);
85
+ }
86
+ export function buildDeployManifest(config, answers, existing) {
87
+ const slug = slugify(config.projectName);
88
+ const secrets = resolveSecrets(existing);
89
+ const { webOrigin, apiOrigin, authIssuer, adminOrigin } = buildOrigins(answers);
90
+ return {
91
+ version: 1,
92
+ projectName: config.projectName,
93
+ provider: "aws",
94
+ tier: answers.tier,
95
+ region: answers.region,
96
+ awsProfile: answers.awsProfile,
97
+ domain: {
98
+ root: answers.domain.root,
99
+ hostedZoneDomain: answers.domain.hostedZoneDomain,
100
+ hostedZoneId: answers.domain.hostedZoneId,
101
+ webHost: answers.domain.webHost,
102
+ apiHost: answers.domain.apiHost,
103
+ authHost: answers.domain.authHost,
104
+ adminHost: answers.domain.adminHost,
105
+ },
106
+ backup: {
107
+ enabled: answers.backup.enabled,
108
+ schedule: answers.backup.schedule,
109
+ retentionDays: answers.backup.retentionDays,
110
+ },
111
+ services: {
112
+ web: buildServiceEntry(config.services.web, "source"),
113
+ api: buildServiceEntry(config.services.api, "source"),
114
+ auth: buildServiceEntry(config.services.auth, "image"),
115
+ admin: buildServiceEntry(config.services.admin, "image"),
116
+ },
117
+ images: {
118
+ web: { repositoryName: `${slug}-web`, tag: "latest" },
119
+ api: { repositoryName: `${slug}-api`, tag: "latest" },
120
+ auth: { repositoryName: `${slug}-auth`, tag: "latest" },
121
+ admin: { repositoryName: `${slug}-admin`, tag: "latest" },
122
+ postgres: { repositoryName: `${slug}-postgres`, tag: "latest" },
123
+ },
124
+ env: existing?.env ?? emptyEnvMap(),
125
+ runtime: {
126
+ apiOrigin,
127
+ authIssuer,
128
+ webOrigin,
129
+ adminOrigin,
130
+ acmCertificateArn: existing?.runtime?.acmCertificateArn,
131
+ rpid: answers.domain.root,
132
+ secrets,
133
+ },
134
+ };
135
+ }
136
+ export function writeDeployManifest(projectDir, manifest) {
137
+ const filePath = getDeployManifestPath(projectDir);
138
+ const dirPath = path.dirname(filePath);
139
+ fs.mkdirSync(dirPath, { recursive: true });
140
+ fs.writeFileSync(filePath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
141
+ }
142
+ export function updateDeployManifestCertificateArn(projectDir, certificateArn) {
143
+ const existing = readDeployManifest(projectDir);
144
+ const updated = {
145
+ ...existing,
146
+ runtime: {
147
+ ...existing.runtime,
148
+ acmCertificateArn: certificateArn,
149
+ },
150
+ };
151
+ writeDeployManifest(projectDir, updated);
152
+ return updated;
153
+ }
154
+ export function updateDeployManifestEnv(projectDir, env) {
155
+ const existing = readDeployManifest(projectDir);
156
+ const updated = {
157
+ ...existing,
158
+ env,
159
+ };
160
+ writeDeployManifest(projectDir, updated);
161
+ return updated;
162
+ }
163
+ //# sourceMappingURL=deployManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployManifest.js","sourceRoot":"","sources":["../../src/core/deployManifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { generateSecret } from "./secrets.js";
2
+ import { generateJWKS } from "./jwks.js";
3
+ export function buildDeploySecretBundle() {
4
+ const kid = "main";
5
+ const { publicKey, privateKey } = generateJWKS();
6
+ return {
7
+ apiServiceToken: generateSecret(32),
8
+ cookieSigningKey: generateSecret(32),
9
+ bootstrapSecret: generateSecret(32),
10
+ authDbPassword: generateSecret(24),
11
+ apiDbPassword: generateSecret(24),
12
+ authDbUser: "auth_user",
13
+ apiDbUser: "api_user",
14
+ authDbName: "seamless_auth",
15
+ apiDbName: "seamless_api",
16
+ jwks: {
17
+ kid,
18
+ privateKey,
19
+ publicKey,
20
+ publicJwksJson: JSON.stringify({
21
+ keys: [
22
+ {
23
+ kid,
24
+ pem: publicKey,
25
+ },
26
+ ],
27
+ }, null, 2),
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=deploySecrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploySecrets.js","sourceRoot":"","sources":["../../src/core/deploySecrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAoBzC,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,CAAC;IAEjD,OAAO;QACL,eAAe,EAAE,cAAc,CAAC,EAAE,CAAC;QACnC,gBAAgB,EAAE,cAAc,CAAC,EAAE,CAAC;QACpC,eAAe,EAAE,cAAc,CAAC,EAAE,CAAC;QACnC,cAAc,EAAE,cAAc,CAAC,EAAE,CAAC;QAClC,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC;QACjC,UAAU,EAAE,WAAW;QACvB,SAAS,EAAE,UAAU;QACrB,UAAU,EAAE,eAAe;QAC3B,SAAS,EAAE,cAAc;QACzB,IAAI,EAAE;YACJ,GAAG;YACH,UAAU;YACV,SAAS;YACT,cAAc,EAAE,IAAI,CAAC,SAAS,CAC5B;gBACE,IAAI,EAAE;oBACJ;wBACE,GAAG;wBACH,GAAG,EAAE,SAAS;qBACf;iBACF;aACF,EACD,IAAI,EACJ,CAAC,CACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import fs from "node:fs";
2
+ import { getAwsDevInfraDir, getDeployManifestPath, getInfraDir, } from "./paths.js";
3
+ import { deleteEcrImages, deleteEcrRepository } from "./aws.js";
4
+ export async function destroyEcrResources(manifest) {
5
+ const repositories = [
6
+ manifest.images.web.repositoryName,
7
+ manifest.images.api.repositoryName,
8
+ manifest.images.postgres.repositoryName,
9
+ ];
10
+ if (manifest.services.auth.mode === "source") {
11
+ repositories.push(manifest.images.auth.repositoryName);
12
+ }
13
+ if (manifest.services.admin.mode === "source") {
14
+ repositories.push(manifest.images.admin.repositoryName);
15
+ }
16
+ for (const repositoryName of repositories) {
17
+ await deleteEcrImages(manifest.awsProfile, manifest.region, repositoryName);
18
+ await deleteEcrRepository(manifest.awsProfile, manifest.region, repositoryName);
19
+ }
20
+ }
21
+ export function removeGeneratedInfraFiles(projectDir) {
22
+ const manifestPath = getDeployManifestPath(projectDir);
23
+ const awsDevDir = getAwsDevInfraDir(projectDir);
24
+ if (fs.existsSync(manifestPath)) {
25
+ fs.rmSync(manifestPath, { force: true });
26
+ }
27
+ if (fs.existsSync(awsDevDir)) {
28
+ fs.rmSync(awsDevDir, { recursive: true, force: true });
29
+ }
30
+ const infraDir = getInfraDir(projectDir);
31
+ if (fs.existsSync(infraDir)) {
32
+ const remaining = fs.readdirSync(infraDir);
33
+ if (remaining.length === 0) {
34
+ fs.rmSync(infraDir, { recursive: true, force: true });
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/core/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAwB;IAExB,MAAM,YAAY,GAAG;QACnB,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc;QAClC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc;QAClC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc;KACxC,CAAC;IAEF,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7C,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9C,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,MAAM,cAAc,IAAI,YAAY,EAAE,CAAC;QAC1C,MAAM,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC5E,MAAM,mBAAmB,CACvB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,MAAM,EACf,cAAc,CACf,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,MAAM,YAAY,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ import fs from "fs";
2
+ export function parseEnv(filePath) {
3
+ const content = fs.readFileSync(filePath, "utf-8");
4
+ const lines = content.split("\n");
5
+ const env = {};
6
+ for (const line of lines) {
7
+ if (!line || line.startsWith("#"))
8
+ continue;
9
+ const [key, ...rest] = line.split("=");
10
+ if (!key)
11
+ continue;
12
+ env[key.trim()] = rest.join("=").trim();
13
+ }
14
+ return env;
15
+ }
16
+ export function parseEnvString(content) {
17
+ const lines = content.split("\n");
18
+ const env = {};
19
+ for (const line of lines) {
20
+ if (!line || line.startsWith("#"))
21
+ continue;
22
+ const [key, ...rest] = line.split("=");
23
+ if (!key)
24
+ continue;
25
+ env[key.trim()] = rest.join("=").trim();
26
+ }
27
+ return env;
28
+ }
29
+ export function writeEnv(filePath, env) {
30
+ const content = Object.entries(env)
31
+ .map(([k, v]) => `${k}=${v}`)
32
+ .join("\n");
33
+ fs.writeFileSync(filePath, content + "\n");
34
+ }
35
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5C,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5C,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,GAA2B;IACpE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,153 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import * as p from "@clack/prompts";
4
+ import { inferEnvKind, isDeployManagedKey } from "./envRegistry.js";
5
+ function parseEnvFile(filePath) {
6
+ const raw = fs.readFileSync(filePath, "utf8");
7
+ const lines = raw.split(/\r?\n/);
8
+ const result = {};
9
+ for (const line of lines) {
10
+ const trimmed = line.trim();
11
+ if (!trimmed || trimmed.startsWith("#"))
12
+ continue;
13
+ const idx = trimmed.indexOf("=");
14
+ if (idx === -1)
15
+ continue;
16
+ const key = trimmed.slice(0, idx).trim();
17
+ let value = trimmed.slice(idx + 1).trim();
18
+ if ((value.startsWith('"') && value.endsWith('"')) ||
19
+ (value.startsWith("'") && value.endsWith("'"))) {
20
+ value = value.slice(1, -1);
21
+ }
22
+ result[key] = value;
23
+ }
24
+ return result;
25
+ }
26
+ function discoverServiceEnvEntries(root, servicePath) {
27
+ if (!servicePath)
28
+ return [];
29
+ const absolutePath = path.resolve(root, servicePath);
30
+ if (!fs.existsSync(absolutePath))
31
+ return [];
32
+ const envPath = path.join(absolutePath, ".env");
33
+ const envExamplePath = path.join(absolutePath, ".env.example");
34
+ const merged = new Map();
35
+ if (fs.existsSync(envExamplePath)) {
36
+ const parsed = parseEnvFile(envExamplePath);
37
+ for (const [key, value] of Object.entries(parsed)) {
38
+ merged.set(key, {
39
+ key,
40
+ value: value || null,
41
+ source: "env_example",
42
+ });
43
+ }
44
+ }
45
+ if (fs.existsSync(envPath)) {
46
+ const parsed = parseEnvFile(envPath);
47
+ for (const [key, value] of Object.entries(parsed)) {
48
+ merged.set(key, {
49
+ key,
50
+ value: value || null,
51
+ source: "env",
52
+ });
53
+ }
54
+ }
55
+ return [...merged.values()].sort((a, b) => a.key.localeCompare(b.key));
56
+ }
57
+ function mergeServiceEnv(existing, discovered, service) {
58
+ const existingUserMap = new Map(existing.map((entry) => [entry.key, entry]));
59
+ const result = [];
60
+ for (const item of discovered) {
61
+ if (isDeployManagedKey(service, item.key)) {
62
+ continue;
63
+ }
64
+ const prior = existingUserMap.get(item.key);
65
+ const discoveredValue = item.value?.trim() ? item.value : null;
66
+ if (prior) {
67
+ result.push({
68
+ ...prior,
69
+ value: prior.value || discoveredValue || "",
70
+ });
71
+ continue;
72
+ }
73
+ result.push({
74
+ key: item.key,
75
+ value: discoveredValue ?? "",
76
+ kind: inferEnvKind(item.key),
77
+ owner: "user",
78
+ target: "task_definition",
79
+ source: item.source,
80
+ });
81
+ }
82
+ for (const leftover of existing) {
83
+ if (!result.find((entry) => entry.key === leftover.key)) {
84
+ result.push(leftover);
85
+ }
86
+ }
87
+ return result.sort((a, b) => a.key.localeCompare(b.key));
88
+ }
89
+ async function promptForMissingValues(service, vars) {
90
+ const resolved = [];
91
+ for (const envVar of vars) {
92
+ if (envVar.value && envVar.value.trim().length > 0) {
93
+ resolved.push(envVar);
94
+ continue;
95
+ }
96
+ const promptOptions = {
97
+ message: `${service}: enter value for ${envVar.key}`,
98
+ };
99
+ const value = envVar.kind === "secret"
100
+ ? await p.password(promptOptions)
101
+ : await p.text(promptOptions);
102
+ if (p.isCancel(value)) {
103
+ p.cancel("Deploy cancelled");
104
+ process.exit(0);
105
+ }
106
+ resolved.push({
107
+ ...envVar,
108
+ value: value.trim(),
109
+ source: "prompt",
110
+ });
111
+ }
112
+ return resolved;
113
+ }
114
+ function printDetectedEnvSummary(env) {
115
+ const lines = [];
116
+ for (const service of [
117
+ "web",
118
+ "api",
119
+ "auth",
120
+ "admin",
121
+ ]) {
122
+ const entries = env[service];
123
+ if (entries.length === 0)
124
+ continue;
125
+ lines.push(`${service}:`);
126
+ for (const entry of entries) {
127
+ lines.push(` ${entry.key} (${entry.kind}, ${entry.value ? "value found" : "missing value"})`);
128
+ }
129
+ }
130
+ if (lines.length > 0) {
131
+ p.note(lines.join("\n"), "Detected custom environment variables");
132
+ }
133
+ }
134
+ export async function discoverAndResolveCustomEnv(root, manifest) {
135
+ const nextEnv = {
136
+ web: mergeServiceEnv(manifest.env.web, discoverServiceEnvEntries(root, manifest.services.web.path), "web"),
137
+ api: mergeServiceEnv(manifest.env.api, discoverServiceEnvEntries(root, manifest.services.api.path), "api"),
138
+ auth: mergeServiceEnv(manifest.env.auth, manifest.services.auth.mode === "source"
139
+ ? discoverServiceEnvEntries(root, manifest.services.auth.path)
140
+ : [], "auth"),
141
+ admin: mergeServiceEnv(manifest.env.admin, manifest.services.admin.mode === "source"
142
+ ? discoverServiceEnvEntries(root, manifest.services.admin.path)
143
+ : [], "admin"),
144
+ };
145
+ printDetectedEnvSummary(nextEnv);
146
+ return {
147
+ web: await promptForMissingValues("web", nextEnv.web),
148
+ api: await promptForMissingValues("api", nextEnv.api),
149
+ auth: await promptForMissingValues("auth", nextEnv.auth),
150
+ admin: await promptForMissingValues("admin", nextEnv.admin),
151
+ };
152
+ }
153
+ //# sourceMappingURL=envDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envDiscovery.js","sourceRoot":"","sources":["../../src/core/envDiscovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ const DEPLOY_MANAGED_KEYS = {
2
+ web: new Set(["API_URL", "VITE_API_URL"]),
3
+ admin: new Set(["API_URL", "AUTH_MODE", "VITE_API_URL", "VITE_AUTH_MODE"]),
4
+ api: new Set([
5
+ "AUTH_SERVER_URL",
6
+ "APP_ORIGIN",
7
+ "UI_ORIGINS",
8
+ "COOKIE_SIGNING_KEY",
9
+ "API_SERVICE_TOKEN",
10
+ "JWKS_KID",
11
+ "DB_HOST",
12
+ "DB_PORT",
13
+ "DB_USER",
14
+ "DB_PASSWORD",
15
+ "DB_NAME",
16
+ "SQL_LOGGING",
17
+ ]),
18
+ auth: new Set([
19
+ "NODE_ENV",
20
+ "VERSION",
21
+ "APP_NAME",
22
+ "APP_ID",
23
+ "APP_ORIGIN",
24
+ "ISSUER",
25
+ "AUTH_MODE",
26
+ "DEMO",
27
+ "DEFAULT_ROLES",
28
+ "AVAILABLE_ROLES",
29
+ "DB_LOGGING",
30
+ "DB_HOST",
31
+ "DB_PORT",
32
+ "DB_NAME",
33
+ "DB_USER",
34
+ "DB_PASSWORD",
35
+ "ACCESS_TOKEN_TTL",
36
+ "REFRESH_TOKEN_TTL",
37
+ "RATE_LIMIT",
38
+ "DELAY_AFTER",
39
+ "API_SERVICE_TOKEN",
40
+ "JWKS_ACTIVE_KID",
41
+ "SEAMLESS_JWKS_ACTIVE_KID",
42
+ "JWKS_PUBLIC_KEYS",
43
+ "RPID",
44
+ "ORIGINS",
45
+ "SEAMLESS_BOOTSTRAP_ENABLED",
46
+ "SEAMLESS_BOOTSTRAP_SECRET",
47
+ ]),
48
+ };
49
+ export function isDeployManagedKey(service, key) {
50
+ if (DEPLOY_MANAGED_KEYS[service].has(key))
51
+ return true;
52
+ if (service === "auth" && key.startsWith("SEAMLESS_JWKS_KEY_"))
53
+ return true;
54
+ return false;
55
+ }
56
+ export function inferEnvKind(key) {
57
+ const upper = key.toUpperCase();
58
+ const secretHints = [
59
+ "SECRET",
60
+ "TOKEN",
61
+ "PASSWORD",
62
+ "PRIVATE",
63
+ "WEBHOOK",
64
+ "KEY",
65
+ "DSN",
66
+ ];
67
+ const alwaysPlainPrefixes = ["VITE_PUBLIC_", "NEXT_PUBLIC_", "PUBLIC_"];
68
+ if (alwaysPlainPrefixes.some((prefix) => upper.startsWith(prefix))) {
69
+ return "plain";
70
+ }
71
+ if (secretHints.some((hint) => upper.includes(hint))) {
72
+ return "secret";
73
+ }
74
+ return "plain";
75
+ }
76
+ //# sourceMappingURL=envRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envRegistry.js","sourceRoot":"","sources":["../../src/core/envRegistry.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAA2C;IAClE,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACzC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC1E,GAAG,EAAE,IAAI,GAAG,CAAC;QACX,iBAAiB;QACjB,YAAY;QACZ,YAAY;QACZ,oBAAoB;QACpB,mBAAmB;QACnB,UAAU;QACV,SAAS;QACT,SAAS;QACT,SAAS;QACT,aAAa;QACb,SAAS;QACT,aAAa;KACd,CAAC;IACF,IAAI,EAAE,IAAI,GAAG,CAAC;QACZ,UAAU;QACV,SAAS;QACT,UAAU;QACV,QAAQ;QACR,YAAY;QACZ,QAAQ;QACR,WAAW;QACX,MAAM;QACN,eAAe;QACf,iBAAiB;QACjB,YAAY;QACZ,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,aAAa;QACb,kBAAkB;QAClB,mBAAmB;QACnB,YAAY;QACZ,aAAa;QACb,mBAAmB;QACnB,iBAAiB;QACjB,0BAA0B;QAC1B,kBAAkB;QAClB,MAAM;QACN,SAAS;QACT,4BAA4B;QAC5B,2BAA2B;KAC5B,CAAC;CACH,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAChC,OAA0B,EAC1B,GAAW;IAEX,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,IAAI,OAAO,KAAK,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAEhC,MAAM,WAAW,GAAG;QAClB,QAAQ;QACR,OAAO;QACP,UAAU;QACV,SAAS;QACT,SAAS;QACT,KAAK;QACL,KAAK;KACN,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAExE,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { spawn } from "child_process";
2
+ export function runCommand(command, args, cwd) {
3
+ return new Promise((resolve, reject) => {
4
+ const child = spawn(command, args, {
5
+ stdio: "inherit",
6
+ cwd,
7
+ shell: true,
8
+ });
9
+ child.on("close", (code) => {
10
+ if (code === 0)
11
+ resolve();
12
+ else
13
+ reject(new Error(`${command} failed`));
14
+ });
15
+ });
16
+ }
17
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAc,EACd,GAAW;IAEX,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,KAAK,EAAE,SAAS;YAChB,GAAG;YACH,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,SAAS,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ export async function fetchEnvExample() {
2
+ const url = "https://raw.githubusercontent.com/fells-code/seamless-auth-api/main/.env.example";
3
+ const res = await fetch(url);
4
+ if (!res.ok) {
5
+ throw new Error("Failed to fetch auth env.example");
6
+ }
7
+ return await res.text();
8
+ }
9
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/core/fetch.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,GAAG,GACP,kFAAkF,CAAC;IAErF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAE7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { execCommand } from "./exec.js";
2
+ async function fetchStatus(url) {
3
+ await execCommand("curl", ["-f", "-L", url], { quiet: true });
4
+ }
5
+ export async function runPostDeployHealthChecks(urls) {
6
+ await fetchStatus(urls.web);
7
+ await fetchStatus(urls.api);
8
+ await fetchStatus(urls.auth);
9
+ await fetchStatus(urls.admin);
10
+ }
11
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/core/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAK/C;IACC,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}