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 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../../../src/generators/deploy/aws/dev/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,263 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { fetchEnvExample } from "../../core/fetch.js";
4
+ import { parseEnv, parseEnvString } from "../../core/env.js";
5
+ import { generateSecret } from "../../core/secrets.js";
6
+ import { generateJWKS } from "../../core/jwks.js";
7
+ export async function generateDockerCompose(root, options) {
8
+ const { compose, shared } = await buildCompose(options, root);
9
+ fs.writeFileSync(path.join(root, "docker-compose.yml"), compose.trim() + "\n");
10
+ console.log("Docker compose created.");
11
+ return shared;
12
+ }
13
+ async function buildCompose(options, root) {
14
+ const { authMode, adminMode, includeAdmin } = options;
15
+ const { service: authBlock, shared } = await authService(authMode, root);
16
+ return {
17
+ compose: `
18
+ services:
19
+ db:
20
+ image: postgres:16
21
+ container_name: seamless-db
22
+ ports:
23
+ - "5432:5432"
24
+ environment:
25
+ POSTGRES_USER: myuser
26
+ POSTGRES_PASSWORD: mypassword
27
+ POSTGRES_DB: postgres
28
+ volumes:
29
+ - pgdata:/var/lib/postgresql/data
30
+
31
+ ${authBlock}
32
+
33
+ ${apiService(shared)}
34
+
35
+ ${webService()}
36
+
37
+ ${includeAdmin ? adminService(adminMode) : ""}
38
+
39
+ volumes:
40
+ pgdata:
41
+ `,
42
+ shared,
43
+ };
44
+ }
45
+ async function authService(mode, root) {
46
+ if (mode === "local") {
47
+ const shared = await configureAuthLocalEnv(root);
48
+ return {
49
+ service: `
50
+ auth:
51
+ container_name: seamless-auth
52
+ build:
53
+ context: ./auth
54
+ dockerfile: Dockerfile.dev
55
+ ports:
56
+ - "5312:5312"
57
+ env_file:
58
+ - ./auth/.env
59
+ environment:
60
+ DB_HOST: db
61
+ ISSUER: http://auth:5312
62
+ volumes:
63
+ - ./auth:/app
64
+ - /app/node_modules
65
+ depends_on:
66
+ - db
67
+ `,
68
+ shared,
69
+ };
70
+ }
71
+ return await authServiceDocker();
72
+ }
73
+ function apiService(shared) {
74
+ return `
75
+ api:
76
+ container_name: api
77
+ build: ./api
78
+ ports:
79
+ - "3000:3000"
80
+ env_file:
81
+ - ./api/.env
82
+ environment:
83
+ AUTH_SERVER_URL: http://auth:5312
84
+ UI_ORIGINS: http://localhost:5173,http://localhost:5174
85
+ DB_HOST: db
86
+ API_SERVICE_TOKEN: ${shared.apiToken}
87
+ JWKS_KID: ${shared.kid}
88
+ volumes:
89
+ - ./api:/app
90
+ - /app/node_modules
91
+ depends_on:
92
+ - db
93
+ - auth
94
+ `;
95
+ }
96
+ function webService() {
97
+ return `
98
+ web:
99
+ container_name: web
100
+ build: ./web
101
+ ports:
102
+ - "5173:80"
103
+ environment:
104
+ API_URL: http://localhost:3000/
105
+ volumes:
106
+ - ./web:/app
107
+ - /app/node_modules
108
+ depends_on:
109
+ - api
110
+ `;
111
+ }
112
+ async function authServiceDocker() {
113
+ const raw = await fetchEnvExample();
114
+ const parsed = parseEnvString(raw);
115
+ const { env, shared } = buildAuthEnv(parsed, "docker");
116
+ const envBlock = envToDockerBlock(env);
117
+ return {
118
+ service: `
119
+ auth:
120
+ image: ghcr.io/fells-code/seamless-auth-api:latest
121
+ container_name: seamless-auth
122
+ ports:
123
+ - "5312:5312"
124
+ environment:
125
+ ${envBlock}
126
+ depends_on:
127
+ - db
128
+ `,
129
+ shared,
130
+ };
131
+ }
132
+ function adminService(mode) {
133
+ if (mode === "source") {
134
+ return `
135
+ admin:
136
+ container_name: admin
137
+ build: ./admin
138
+ ports:
139
+ - "5174:80"
140
+ environment:
141
+ API_URL: http://localhost:3000/
142
+ AUTH_MODE: server
143
+ volumes:
144
+ - ./admin:/app
145
+ - /app/node_modules
146
+ depends_on:
147
+ - api
148
+ `;
149
+ }
150
+ return `
151
+ admin:
152
+ image: ghcr.io/fells-code/seamless-auth-admin-dashboard:latest
153
+ container_name: admin
154
+ ports:
155
+ - "5174:80"
156
+ environment:
157
+ API_URL: http://localhost:3000/
158
+ depends_on:
159
+ - api
160
+ `;
161
+ }
162
+ function buildAuthEnv(env, mode) {
163
+ const apiToken = generateSecret(32);
164
+ const bootstrapSecret = generateSecret(32);
165
+ env.SEAMLESS_BOOTSTRAP_ENABLED = "true";
166
+ env.SEAMLESS_BOOTSTRAP_SECRET = bootstrapSecret;
167
+ env.PORT = "5312";
168
+ env.NODE_ENV = "development";
169
+ env.AUTH_MODE = "server";
170
+ env.ISSUER = "http://auth:5312";
171
+ env.DB_HOST = mode === "docker" ? "db" : "localhost";
172
+ env.DB_PORT = "5432";
173
+ env.API_SERVICE_TOKEN = apiToken;
174
+ let kid = "main";
175
+ env.JWKS_ACTIVE_KID = kid;
176
+ if (mode === "docker") {
177
+ const jwks = buildJWKSConfig();
178
+ kid = jwks.kid;
179
+ env.SEAMLESS_JWKS_ACTIVE_KID = jwks.kid;
180
+ env.JWKS_ACTIVE_KID = jwks.kid;
181
+ env[`SEAMLESS_JWKS_KEY_${jwks.kid}_PRIVATE`] = jwks.privateKey;
182
+ env.JWKS_PUBLIC_KEYS = jwks.publicJwksJson;
183
+ }
184
+ env.APP_ORIGINS = "http://localhost:3000";
185
+ env.ORIGINS = "http://localhost:5173";
186
+ return {
187
+ env,
188
+ shared: {
189
+ apiToken,
190
+ kid,
191
+ bootstrapSecret,
192
+ },
193
+ };
194
+ }
195
+ export function envToDockerBlock(env) {
196
+ return Object.entries(env)
197
+ .map(([k, v]) => {
198
+ if (v.includes("\n")) {
199
+ return ` ${k}: |\n${indentMultiline(v, 8)}`;
200
+ }
201
+ return ` ${k}: ${v}`;
202
+ })
203
+ .join("\n");
204
+ }
205
+ function indentMultiline(value, spaces) {
206
+ const indent = " ".repeat(spaces);
207
+ return value
208
+ .split("\n")
209
+ .map((line) => `${indent}${line}`)
210
+ .join("\n");
211
+ }
212
+ export function buildJWKSConfig() {
213
+ const kid = "main";
214
+ const { publicKey, privateKey } = generateJWKS();
215
+ return {
216
+ kid,
217
+ privateKey,
218
+ publicKey,
219
+ publicJwksJson: JSON.stringify({
220
+ keys: [
221
+ {
222
+ kid,
223
+ pem: publicKey,
224
+ },
225
+ ],
226
+ }, null, 2),
227
+ };
228
+ }
229
+ export async function configureAuthLocalEnv(root) {
230
+ const authDir = path.join(root, "auth");
231
+ const envExamplePath = path.join(authDir, ".env.example");
232
+ const envPath = path.join(authDir, ".env");
233
+ if (!fs.existsSync(envExamplePath)) {
234
+ throw new Error(".env.example not found in auth directory");
235
+ }
236
+ const raw = fs.readFileSync(envExamplePath, "utf-8");
237
+ const parsed = parseEnvString(raw);
238
+ const { env, shared } = buildAuthEnv(parsed, "local");
239
+ writeEnvFile(envPath, env);
240
+ return shared;
241
+ }
242
+ function writeEnvFile(filePath, env) {
243
+ const content = Object.entries(env)
244
+ .map(([k, v]) => {
245
+ if (v.includes("\n")) {
246
+ return `${k}="${escapeMultiline(v)}"`;
247
+ }
248
+ return `${k}=${v}`;
249
+ })
250
+ .join("\n");
251
+ fs.writeFileSync(filePath, content + "\n");
252
+ }
253
+ function escapeMultiline(value) {
254
+ return value.replace(/\n/g, "\\n");
255
+ }
256
+ export function extractSharedFromExistingEnv(root) {
257
+ const env = parseEnv(path.join(root, "auth", ".env"));
258
+ return {
259
+ apiToken: env.API_SERVICE_TOKEN,
260
+ kid: env.JWKS_ACTIVE_KID || "main",
261
+ };
262
+ }
263
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/generators/docker/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import path from "path";
2
+ import { cloneRepo, removeGitDir, copyEnvExample, } from "../../utils/repoUtils.js";
3
+ const WEB_STARTER_REPO = "https://github.com/fells-code/seamless-auth-starter-react.git";
4
+ export async function generateReactStarter(context) {
5
+ const { root } = context;
6
+ const webDir = path.join(root, "web");
7
+ console.log("Cloning Seamless Auth React starter...");
8
+ await cloneRepo(WEB_STARTER_REPO, webDir);
9
+ removeGitDir(webDir);
10
+ copyEnvExample(webDir);
11
+ console.log("Web starter ready.");
12
+ }
13
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/generators/frontend/react.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,MAAM,gBAAgB,GACpB,+DAA+D,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAyB;IAClE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEtC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAEtD,MAAM,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAE1C,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACpC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import { runCLI } from "./commands/init.js";
3
+ import { runCheck } from "./commands/check.js";
4
+ import { printHelp } from "./commands/help.js";
5
+ import pkg from "../package.json" with { type: "json" };
6
+ import { runBootstrapAdmin } from "./commands/bootstrapAdmin.js";
7
+ export const VERSION = pkg.version;
8
+ const args = process.argv.slice(2);
9
+ const command = args[0];
10
+ async function main() {
11
+ if (!command) {
12
+ printHelp();
13
+ return;
14
+ }
15
+ if (command === "-h" || command === "--help") {
16
+ printHelp();
17
+ return;
18
+ }
19
+ if (command === "-v" || command === "--version") {
20
+ console.log(VERSION);
21
+ return;
22
+ }
23
+ if (command === "init") {
24
+ const projectName = args[1];
25
+ await runCLI(projectName);
26
+ return;
27
+ }
28
+ if (command === "check") {
29
+ await runCheck();
30
+ return;
31
+ }
32
+ if (command === "bootstrap-admin") {
33
+ const email = args[1];
34
+ await runBootstrapAdmin(email);
35
+ return;
36
+ }
37
+ await runCLI(command);
38
+ }
39
+ main().catch((err) => {
40
+ console.error("Error:", err.message);
41
+ process.exit(1);
42
+ });
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AACnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC7C,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,iBAAiB,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { isCancel, multiselect, text } from "@clack/prompts";
2
+ import { CONTRIBUTOR_COMPONENTS, formatPublicRef, } from "../contributor/catalog.js";
3
+ export async function runContributorSetupPrompts(initialWorkspaceName) {
4
+ let workspaceName = initialWorkspaceName?.trim();
5
+ if (!workspaceName) {
6
+ const workspaceNameResult = await text({
7
+ message: "Workspace directory",
8
+ placeholder: "seamless-contrib",
9
+ initialValue: "seamless-contrib",
10
+ validate(value) {
11
+ if (!value || !value.trim()) {
12
+ return "Workspace directory is required";
13
+ }
14
+ return;
15
+ },
16
+ });
17
+ if (isCancel(workspaceNameResult)) {
18
+ throw new Error("Contributor setup canceled");
19
+ }
20
+ workspaceName = workspaceNameResult.trim();
21
+ }
22
+ const localComponentsResult = await multiselect({
23
+ message: "Select components to clone as editable local source",
24
+ required: false,
25
+ options: CONTRIBUTOR_COMPONENTS.map((component) => ({
26
+ value: component.id,
27
+ label: component.label,
28
+ hint: `public: ${component.publicSurface} ${formatPublicRef(component.publicRef)}`,
29
+ })),
30
+ });
31
+ if (isCancel(localComponentsResult)) {
32
+ throw new Error("Contributor setup canceled");
33
+ }
34
+ return {
35
+ workspaceName,
36
+ localComponents: localComponentsResult,
37
+ };
38
+ }
39
+ //# sourceMappingURL=contributeSetup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contributeSetup.js","sourceRoot":"","sources":["../../src/prompts/contributeSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EACL,sBAAsB,EAEtB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AAOnC,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,oBAA6B;IAE7B,IAAI,aAAa,GAAG,oBAAoB,EAAE,IAAI,EAAE,CAAC;IAEjD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC;YACrC,OAAO,EAAE,qBAAqB;YAC9B,WAAW,EAAE,kBAAkB;YAC/B,YAAY,EAAE,kBAAkB;YAChC,QAAQ,CAAC,KAAK;gBACZ,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC5B,OAAO,iCAAiC,CAAC;gBAC3C,CAAC;gBAED,OAAO;YACT,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,aAAa,GAAG,mBAAmB,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,qBAAqB,GAAG,MAAM,WAAW,CAAC;QAC9C,OAAO,EAAE,qDAAqD;QAC9D,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAClD,KAAK,EAAE,SAAS,CAAC,EAAE;YACnB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,IAAI,EAAE,WAAW,SAAS,CAAC,aAAa,IAAI,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;SACnF,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,OAAO;QACL,aAAa;QACb,eAAe,EAAE,qBAAiD;KACnE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,244 @@
1
+ import * as p from "@clack/prompts";
2
+ import pc from "picocolors";
3
+ import { buildDefaultDomainConfig, getExistingDeployDefaults, } from "../core/deployConfig.js";
4
+ import { listHostedZones } from "../core/aws.js";
5
+ function ensureNonEmptyString(value, label) {
6
+ const trimmed = value.trim();
7
+ if (!trimmed) {
8
+ throw new Error(`${label} is required`);
9
+ }
10
+ return trimmed;
11
+ }
12
+ function ensurePositiveNumber(value, label) {
13
+ const parsed = Number(value);
14
+ if (!Number.isFinite(parsed) || parsed <= 0) {
15
+ throw new Error(`${label} must be a positive number`);
16
+ }
17
+ return parsed;
18
+ }
19
+ function validateRequiredText(label) {
20
+ return (value) => {
21
+ if (!value || value.trim().length === 0) {
22
+ return `${label} is required`;
23
+ }
24
+ return undefined;
25
+ };
26
+ }
27
+ function validatePositiveNumber(label) {
28
+ return (value) => {
29
+ if (!value || value.trim().length === 0) {
30
+ return `${label} is required`;
31
+ }
32
+ const parsed = Number(value);
33
+ if (!Number.isFinite(parsed) || parsed <= 0) {
34
+ return `${label} must be a positive number`;
35
+ }
36
+ return undefined;
37
+ };
38
+ }
39
+ export async function promptDeploySetup(config) {
40
+ const defaults = getExistingDeployDefaults(config);
41
+ p.intro(pc.cyan("Seamless deploy"));
42
+ const shouldContinue = await p.confirm({
43
+ message: "This will provision AWS infrastructure and may create billable resources. Continue?",
44
+ initialValue: true,
45
+ });
46
+ if (p.isCancel(shouldContinue) || !shouldContinue) {
47
+ p.cancel("Deploy cancelled");
48
+ process.exit(0);
49
+ }
50
+ const tier = await p.select({
51
+ message: "Select deployment tier",
52
+ options: [
53
+ { value: "dev", label: "dev", hint: "lowest cost, single-instance MVP" },
54
+ {
55
+ value: "standard",
56
+ label: "standard",
57
+ hint: "reserved for future implementation",
58
+ },
59
+ {
60
+ value: "enterprise",
61
+ label: "enterprise",
62
+ hint: "reserved for future implementation",
63
+ },
64
+ ],
65
+ initialValue: defaults.tier ?? "dev",
66
+ });
67
+ if (p.isCancel(tier)) {
68
+ p.cancel("Deploy cancelled");
69
+ process.exit(0);
70
+ }
71
+ const region = await p.text({
72
+ message: "AWS region",
73
+ initialValue: defaults.region ?? "us-east-1",
74
+ validate: validateRequiredText("Region"),
75
+ });
76
+ if (p.isCancel(region)) {
77
+ p.cancel("Deploy cancelled");
78
+ process.exit(0);
79
+ }
80
+ const awsProfile = await p.text({
81
+ message: "AWS profile",
82
+ initialValue: defaults.awsProfile ?? "default",
83
+ validate: validateRequiredText("AWS profile"),
84
+ });
85
+ if (p.isCancel(awsProfile)) {
86
+ p.cancel("Deploy cancelled");
87
+ process.exit(0);
88
+ }
89
+ const zoneSpinner = p.spinner();
90
+ zoneSpinner.start("Loading hosted zones from Route 53");
91
+ let hostedZones = [];
92
+ try {
93
+ hostedZones = await listHostedZones(awsProfile, region);
94
+ zoneSpinner.stop("Hosted zones loaded");
95
+ }
96
+ catch (error) {
97
+ zoneSpinner.stop("Failed to load hosted zones");
98
+ const message = error instanceof Error ? error.message : "Unknown error";
99
+ p.log.error(message);
100
+ process.exit(1);
101
+ }
102
+ if (hostedZones.length === 0) {
103
+ p.log.error("No public Route 53 hosted zones were found in this AWS account.");
104
+ process.exit(1);
105
+ }
106
+ const hostedZone = await p.select({
107
+ message: "Select hosted zone",
108
+ options: hostedZones.map((zone) => ({
109
+ value: JSON.stringify({ name: zone.name, id: zone.id }),
110
+ label: zone.name,
111
+ hint: zone.id,
112
+ })),
113
+ initialValue: defaults.domain?.hostedZoneId && defaults.domain?.hostedZoneDomain
114
+ ? JSON.stringify({
115
+ name: defaults.domain.hostedZoneDomain,
116
+ id: defaults.domain.hostedZoneId,
117
+ })
118
+ : JSON.stringify({
119
+ name: hostedZones[0]?.name,
120
+ id: hostedZones[0]?.id,
121
+ }),
122
+ });
123
+ const rootDomain = await p.text({
124
+ message: "Root domain for this deployment",
125
+ initialValue: defaults.domain?.root ?? "",
126
+ placeholder: "seamlessreviewboard.com",
127
+ validate: validateRequiredText("Root domain"),
128
+ });
129
+ if (p.isCancel(hostedZone)) {
130
+ p.cancel("Deploy cancelled");
131
+ process.exit(0);
132
+ }
133
+ const selectedHostedZone = JSON.parse(hostedZone);
134
+ const hostedZoneDomain = selectedHostedZone.name;
135
+ const hostedZoneId = selectedHostedZone.id;
136
+ const domainDefaults = buildDefaultDomainConfig(ensureNonEmptyString(rootDomain, "Root domain"), ensureNonEmptyString(hostedZoneDomain, "Hosted zone domain"), ensureNonEmptyString(hostedZoneId, "Hosted zone id"));
137
+ const webHost = await p.text({
138
+ message: "Web host",
139
+ initialValue: defaults.domain?.webHost ?? domainDefaults.webHost,
140
+ validate: validateRequiredText("Web host"),
141
+ });
142
+ if (p.isCancel(webHost)) {
143
+ p.cancel("Deploy cancelled");
144
+ process.exit(0);
145
+ }
146
+ const apiHost = await p.text({
147
+ message: "API host",
148
+ initialValue: defaults.domain?.apiHost ?? domainDefaults.apiHost,
149
+ validate: validateRequiredText("API host"),
150
+ });
151
+ if (p.isCancel(apiHost)) {
152
+ p.cancel("Deploy cancelled");
153
+ process.exit(0);
154
+ }
155
+ const authHost = await p.text({
156
+ message: "Auth host",
157
+ initialValue: defaults.domain?.authHost ?? domainDefaults.authHost,
158
+ validate: validateRequiredText("Auth host"),
159
+ });
160
+ if (p.isCancel(authHost)) {
161
+ p.cancel("Deploy cancelled");
162
+ process.exit(0);
163
+ }
164
+ const adminHost = await p.text({
165
+ message: "Admin host",
166
+ initialValue: defaults.domain?.adminHost ?? domainDefaults.adminHost,
167
+ validate: validateRequiredText("Admin host"),
168
+ });
169
+ if (p.isCancel(adminHost)) {
170
+ p.cancel("Deploy cancelled");
171
+ process.exit(0);
172
+ }
173
+ const backupEnabled = await p.confirm({
174
+ message: "Enable scheduled Postgres backups to S3?",
175
+ initialValue: defaults.backup?.enabled ?? true,
176
+ });
177
+ if (p.isCancel(backupEnabled)) {
178
+ p.cancel("Deploy cancelled");
179
+ process.exit(0);
180
+ }
181
+ let backup = {
182
+ enabled: false,
183
+ schedule: defaults.backup?.schedule ?? "daily",
184
+ retentionDays: defaults.backup?.retentionDays ?? 30,
185
+ };
186
+ if (backupEnabled) {
187
+ const backupSchedule = await p.select({
188
+ message: "Backup schedule",
189
+ options: [
190
+ { value: "hourly", label: "hourly" },
191
+ { value: "daily", label: "daily" },
192
+ { value: "weekly", label: "weekly" },
193
+ ],
194
+ initialValue: defaults.backup?.schedule ?? "daily",
195
+ });
196
+ if (p.isCancel(backupSchedule)) {
197
+ p.cancel("Deploy cancelled");
198
+ process.exit(0);
199
+ }
200
+ const retentionDays = await p.text({
201
+ message: "Backup retention days",
202
+ initialValue: String(defaults.backup?.retentionDays ?? 30),
203
+ validate: validatePositiveNumber("Backup retention days"),
204
+ });
205
+ if (p.isCancel(retentionDays)) {
206
+ p.cancel("Deploy cancelled");
207
+ process.exit(0);
208
+ }
209
+ backup = {
210
+ enabled: true,
211
+ schedule: backupSchedule,
212
+ retentionDays: ensurePositiveNumber(retentionDays, "Backup retention days"),
213
+ };
214
+ }
215
+ const answers = {
216
+ provider: "aws",
217
+ tier: tier,
218
+ region: ensureNonEmptyString(region, "AWS region"),
219
+ awsProfile: ensureNonEmptyString(awsProfile, "AWS profile"),
220
+ domain: {
221
+ root: ensureNonEmptyString(rootDomain, "Root domain"),
222
+ hostedZoneDomain: ensureNonEmptyString(hostedZoneDomain, "Hosted zone domain"),
223
+ hostedZoneId: ensureNonEmptyString(hostedZoneId, "Hosted zone id"),
224
+ webHost: ensureNonEmptyString(webHost, "Web host"),
225
+ apiHost: ensureNonEmptyString(apiHost, "API host"),
226
+ authHost: ensureNonEmptyString(authHost, "Auth host"),
227
+ adminHost: ensureNonEmptyString(adminHost, "Admin host"),
228
+ },
229
+ backup,
230
+ };
231
+ p.note([
232
+ `Tier: ${answers.tier}`,
233
+ `Region: ${answers.region}`,
234
+ `Profile: ${answers.awsProfile}`,
235
+ `Hosted zone: ${answers.domain.hostedZoneDomain}`,
236
+ `Web: https://${answers.domain.webHost}`,
237
+ `API: https://${answers.domain.apiHost}`,
238
+ `Auth: https://${answers.domain.authHost}`,
239
+ `Admin: https://${answers.domain.adminHost}`,
240
+ `Backups: ${answers.backup.enabled ? `${answers.backup.schedule}, ${answers.backup.retentionDays} days` : "disabled"}`,
241
+ ].join("\n"), "Deployment summary");
242
+ return answers;
243
+ }
244
+ //# sourceMappingURL=deploySetup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploySetup.js","sourceRoot":"","sources":["../../src/prompts/deploySetup.ts"],"names":[],"mappings":"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"}