create-seamless 0.1.1 → 0.1.2

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.
@@ -0,0 +1,96 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { intro, outro, text, confirm, spinner } from "@clack/prompts";
4
+ import kleur from "kleur";
5
+ import { resolveBootstrapSecret } from "../core/bootstrapSecret.js";
6
+ function loadConfig() {
7
+ const configPath = path.join(process.cwd(), "seamless.config.json");
8
+ if (!fs.existsSync(configPath)) {
9
+ throw new Error("No seamless.config.json found. Run init first.");
10
+ }
11
+ return JSON.parse(fs.readFileSync(configPath, "utf-8"));
12
+ }
13
+ export async function runBootstrapAdmin(emailArg) {
14
+ intro("Seamless Auth Bootstrap");
15
+ const config = loadConfig();
16
+ let email = emailArg;
17
+ if (!email) {
18
+ email = (await text({
19
+ message: "Admin email address",
20
+ placeholder: "admin@example.com",
21
+ validate: (value) => {
22
+ if (!value || !value.includes("@")) {
23
+ return "Enter a valid email address";
24
+ }
25
+ },
26
+ }));
27
+ }
28
+ const proceed = await confirm({
29
+ message: "Create bootstrap admin invite?",
30
+ initialValue: true,
31
+ });
32
+ if (!proceed) {
33
+ outro("Cancelled.");
34
+ return;
35
+ }
36
+ let apiUrl = process.env.SEAMLESS_API_URL;
37
+ if (!apiUrl) {
38
+ apiUrl = "http://localhost:3000";
39
+ }
40
+ let secret = resolveBootstrapSecret();
41
+ if (secret) {
42
+ console.log(kleur.gray("Using bootstrap secret from local environment"));
43
+ }
44
+ else {
45
+ console.log("");
46
+ console.log(kleur.yellow("No bootstrap secret detected automatically."));
47
+ console.log("This may happen if the project is not initialized locally or running in production.");
48
+ secret = (await text({
49
+ message: "Bootstrap secret",
50
+ placeholder: "Enter your bootstrap secret",
51
+ validate: (value) => {
52
+ if (!value)
53
+ return "Bootstrap secret is required";
54
+ },
55
+ }));
56
+ }
57
+ const s = spinner();
58
+ s.start("Creating bootstrap invite...");
59
+ try {
60
+ const res = await fetch(`${apiUrl}/auth/internal/bootstrap/admin-invite`, {
61
+ method: "POST",
62
+ headers: {
63
+ "Content-Type": "application/json",
64
+ Authorization: `Bearer ${secret}`,
65
+ },
66
+ body: JSON.stringify({ email }),
67
+ });
68
+ const data = await res.json();
69
+ if (!res.ok) {
70
+ s.stop("Failed");
71
+ console.error(kleur.red("Error creating bootstrap invite"));
72
+ console.error(data);
73
+ process.exit(1);
74
+ }
75
+ s.stop("Done");
76
+ console.log("");
77
+ if (data?.data?.url) {
78
+ console.log(kleur.bold("Registration URL"));
79
+ console.log(kleur.cyan(data.data.url));
80
+ }
81
+ else {
82
+ console.log(kleur.green(`Invite sent to ${email}`));
83
+ }
84
+ console.log("");
85
+ console.log("Next step:");
86
+ console.log("The invited user must complete registration to receive admin access.");
87
+ outro("Bootstrap complete.");
88
+ }
89
+ catch (err) {
90
+ s.stop("Failed");
91
+ console.error(kleur.red("Unexpected error"));
92
+ console.error(err.message);
93
+ process.exit(1);
94
+ }
95
+ }
96
+ //# sourceMappingURL=bootstrapAdmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrapAdmin.js","sourceRoot":"","sources":["../../src/commands/bootstrapAdmin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { execSync } from "child_process";
4
+ export async function runCheck() {
5
+ console.log("\nSeamless Check\n");
6
+ const root = process.cwd();
7
+ const configPath = path.join(root, "seamless.config.json");
8
+ if (!fs.existsSync(configPath)) {
9
+ console.log("✖ seamless.config.json not found");
10
+ console.log("→ Run: seamless init\n");
11
+ return;
12
+ }
13
+ console.log("✔ Config file found");
14
+ const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
15
+ checkStructure(root, config);
16
+ checkDocker();
17
+ checkCompose(root, config);
18
+ checkContainers();
19
+ await checkHealth();
20
+ console.log("\nCheck complete.\n");
21
+ }
22
+ function checkStructure(root, config) {
23
+ const services = config.services;
24
+ if (fs.existsSync(path.join(root, services.web.path))) {
25
+ console.log("✔ Web project detected");
26
+ }
27
+ else {
28
+ console.log("✖ Web project missing");
29
+ }
30
+ if (fs.existsSync(path.join(root, services.api.path))) {
31
+ console.log("✔ API project detected");
32
+ }
33
+ else {
34
+ console.log("✖ API project missing");
35
+ }
36
+ }
37
+ function checkDocker() {
38
+ try {
39
+ execSync("docker --version", { stdio: "ignore" });
40
+ console.log("✔ Docker is installed");
41
+ }
42
+ catch {
43
+ console.log("✖ Docker not found");
44
+ console.log("→ Install Docker: https://docs.docker.com/get-docker/");
45
+ }
46
+ }
47
+ function checkCompose(root, config) {
48
+ const composePath = path.join(root, config.docker.composeFile);
49
+ if (fs.existsSync(composePath)) {
50
+ console.log("✔ Docker Compose file found");
51
+ }
52
+ else {
53
+ console.log("✖ docker-compose.yml missing");
54
+ }
55
+ }
56
+ function checkContainers() {
57
+ try {
58
+ const output = execSync("docker ps --format '{{.Names}}'").toString();
59
+ if (!output.includes("api")) {
60
+ console.log("✖ API container not running");
61
+ console.log("→ Run: docker compose up\n");
62
+ }
63
+ else {
64
+ console.log("✔ Containers running");
65
+ }
66
+ }
67
+ catch {
68
+ console.log("✖ Failed to check containers");
69
+ }
70
+ }
71
+ async function checkHealth() {
72
+ const checks = [
73
+ { name: "API", url: "http://localhost:3000/" },
74
+ { name: "Auth", url: "http://localhost:5312/health/status" },
75
+ { name: "Admin", url: "http://localhost:5174" },
76
+ ];
77
+ for (const check of checks) {
78
+ try {
79
+ const res = await fetch(check.url);
80
+ if (res.ok) {
81
+ console.log(`✔ ${check.name} is healthy`);
82
+ }
83
+ else {
84
+ console.log(`✖ ${check.name} returned ${res.status}`);
85
+ }
86
+ }
87
+ catch {
88
+ console.log(`✖ ${check.name} not reachable`);
89
+ }
90
+ }
91
+ }
92
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import { VERSION } from "../index.js";
2
+ export function printHelp() {
3
+ console.log(`
4
+ create-seamless v${VERSION}
5
+
6
+ Seamless Auth CLI — scaffold and manage full-stack authentication systems.
7
+
8
+ ────────────────────────────────────────────
9
+
10
+ USAGE
11
+
12
+ seamless init [project-name]
13
+ seamless check
14
+ seamless bootstrap-admin [email]
15
+ seamless --help
16
+ seamless --version
17
+
18
+ ────────────────────────────────────────────
19
+
20
+ COMMANDS
21
+
22
+ init [project-name]
23
+ Scaffold a new Seamless Auth project
24
+
25
+ Without a name:
26
+ • Creates project in current directory
27
+
28
+ With a name:
29
+ • Creates new directory
30
+
31
+ check
32
+ Validate project setup, Docker, and running services
33
+
34
+ bootstrap-admin [email]
35
+ Create a bootstrap admin invite
36
+
37
+ Automatically resolves bootstrap secret from:
38
+ • .env
39
+ • auth/.env
40
+ • docker-compose.yml
41
+
42
+ If not found, you will be prompted.
43
+
44
+ Examples:
45
+ seamless bootstrap-admin
46
+ seamless bootstrap-admin admin@example.com
47
+
48
+ ────────────────────────────────────────────
49
+
50
+ BEHAVIOR
51
+
52
+ seamless <project-name>
53
+
54
+ • Shortcut for: seamless init <project-name>
55
+
56
+ ────────────────────────────────────────────
57
+
58
+ GETTING STARTED
59
+
60
+ 1. seamless init
61
+ 2. docker-compose up
62
+ 3. seamless bootstrap-admin
63
+
64
+ → Complete registration to become admin
65
+
66
+ ────────────────────────────────────────────
67
+
68
+ WHAT YOU GET
69
+
70
+ • Web application (React starter)
71
+ • API server (Express)
72
+ • SeamlessAuth server (Docker or local)
73
+ • Admin dashboard (Docker or source)
74
+ • Docker Compose setup
75
+
76
+ ────────────────────────────────────────────
77
+
78
+ EXAMPLES
79
+
80
+ seamless init
81
+ → Interactive setup in current directory
82
+
83
+ seamless init my-app
84
+ → Create new project in ./my-app
85
+
86
+ seamless my-app
87
+ → Shortcut for init
88
+
89
+ seamless check
90
+ → Validate your project
91
+
92
+ seamless bootstrap-admin
93
+ → Create your first admin user
94
+
95
+ ────────────────────────────────────────────
96
+
97
+ DOCS
98
+
99
+ https://docs.seamlessauth.com
100
+
101
+ `);
102
+ }
103
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;mBACK,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGzB,CAAC,CAAC;AACH,CAAC"}
@@ -7,6 +7,7 @@ import { generateAuthServer } from "../generators/auth/auth.js";
7
7
  import { configureApiEnv, configureWebEnv } from "../core/configure.js";
8
8
  import { configureAuthLocalEnv, generateDockerCompose, } from "../generators/docker/docker.js";
9
9
  import { printSuccessOutput } from "../core/output.js";
10
+ import { generateSeamlessConfig } from "../generators/config/config.js";
10
11
  export async function runCLI(projectName) {
11
12
  const cwd = process.cwd();
12
13
  let root = cwd;
@@ -40,8 +41,8 @@ export async function runCLI(projectName) {
40
41
  if (answers.useDocker) {
41
42
  const dockerShared = await generateDockerCompose(root, {
42
43
  authMode: answers.authMode,
43
- includeApi: answers.api,
44
- includeWeb: answers.web,
44
+ adminMode: answers.adminMode,
45
+ includeAdmin: answers.includeAdmin,
45
46
  });
46
47
  if (answers.authMode === "docker") {
47
48
  sharedConfig = dockerShared;
@@ -53,6 +54,13 @@ export async function runCLI(projectName) {
53
54
  if (answers.web) {
54
55
  configureWebEnv(root);
55
56
  }
57
+ generateSeamlessConfig(root, {
58
+ projectName,
59
+ webFramework: answers.webFramework,
60
+ apiFramework: answers.apiFramework,
61
+ authMode: answers.authMode,
62
+ adminMode: answers.adminMode,
63
+ });
56
64
  printSuccessOutput({
57
65
  projectName,
58
66
  root,
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.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"}
package/dist/core/help.js CHANGED
@@ -1,50 +1,69 @@
1
+ import { VERSION } from "../index.js";
1
2
  export function printHelp() {
2
3
  console.log(`
3
- create-seamless
4
+ create-seamless v${VERSION}
4
5
 
5
- Seamless Auth CLI — scaffold and integrate passwordless authentication.
6
+ Seamless Auth CLI — scaffold and manage full-stack authentication systems.
6
7
 
7
8
  ────────────────────────────────────────────
8
9
 
9
10
  USAGE
10
11
 
11
- npx create-seamless
12
- npx create-seamless <project-name>
13
- npx create-seamless -h
14
- npx create-seamless --help
12
+ seamless init [project-name]
13
+ seamless check
14
+ seamless --help
15
+ seamless --version
15
16
 
16
17
  ────────────────────────────────────────────
17
18
 
18
- BEHAVIOR
19
+ COMMANDS
20
+
21
+ init [project-name]
22
+ Scaffold a new Seamless Auth project
23
+
24
+ Without a name:
25
+ • Creates project in current directory
26
+
27
+ With a name:
28
+ • Creates new directory
29
+
30
+ check
31
+ Validate project setup, Docker, and running services
19
32
 
20
- npx create-seamless
33
+ ────────────────────────────────────────────
34
+
35
+ BEHAVIOR
21
36
 
22
- Without a name:
23
- • If directory is empty → create a new project
37
+ seamless <project-name>
24
38
 
25
- npx create-seamless <project-name>
26
-
27
- With a name:
28
- • Creates a new directory
39
+ Shortcut for: seamless init <project-name>
29
40
 
30
41
  ────────────────────────────────────────────
31
42
 
32
- WHAT YOU CAN BUILD
43
+ WHAT YOU GET
33
44
 
34
- A web application starter with Seamless Auth
35
- An API server starter with Seamless Auth
36
- • SeamlessAuth server (local or Docker)
45
+ Web application (React starter)
46
+ • API server (Express)
47
+ • SeamlessAuth server (Docker or local)
48
+ • Admin dashboard (Docker or source)
49
+ • Docker Compose setup
37
50
 
38
51
  ────────────────────────────────────────────
39
52
 
40
53
  EXAMPLES
41
54
 
42
- npx create-seamless
55
+ seamless init
43
56
  → Interactive setup in current directory
44
57
 
45
- npx create-seamless my-app
58
+ seamless init my-app
46
59
  → Create new project in ./my-app
47
60
 
61
+ seamless my-app
62
+ → Shortcut for init
63
+
64
+ seamless check
65
+ → Validate your project
66
+
48
67
  ────────────────────────────────────────────
49
68
 
50
69
  DOCS
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/core/help.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDb,CAAC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/core/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;mBACK,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEzB,CAAC,CAAC;AACH,CAAC"}
@@ -7,15 +7,15 @@ export function printSuccessOutput(config) {
7
7
  ║ ${title} ║
8
8
  ╚════════════════════════════════════════╝
9
9
  `);
10
- console.log(kleur.green(" Your SeamlessAuth project is ready.\n"));
10
+ console.log(kleur.green("Project initialized successfully.\n"));
11
11
  if (projectName) {
12
- console.log(kleur.dim("Project created in: ") + kleur.bold(projectName));
12
+ console.log(kleur.dim("Project directory: ") + kleur.bold(projectName));
13
13
  console.log(kleur.cyan(`cd ${projectName}\n`));
14
14
  }
15
- console.log(kleur.bold("Project includes:\n"));
15
+ console.log(kleur.bold("Included services:\n"));
16
16
  if (webFramework) {
17
17
  console.log(" • " +
18
- kleur.white("Web app") +
18
+ kleur.white("Web application") +
19
19
  kleur.dim(` (${formatFramework(webFramework)})`));
20
20
  }
21
21
  if (apiFramework) {
@@ -26,15 +26,21 @@ export function printSuccessOutput(config) {
26
26
  console.log(" • " +
27
27
  kleur.white("Auth server") +
28
28
  kleur.dim(authMode === "local" ? " (local source)" : " (Docker image)"));
29
+ console.log(" • " + kleur.white("Admin dashboard") + kleur.dim(" (management UI)"));
29
30
  console.log("");
30
- console.log(kleur.bold("Getting started:\n"));
31
+ console.log(kleur.bold("Next steps:\n"));
31
32
  if (useDocker) {
32
- console.log(kleur.cyan(" docker compose up\n"));
33
+ console.log(" 1. Start services");
34
+ console.log(kleur.cyan(" docker compose up\n"));
35
+ console.log(" 2. Create your first admin user");
36
+ console.log(kleur.cyan(" seamless bootstrap-admin\n"));
37
+ console.log(" 3. Complete registration in the browser");
38
+ console.log(kleur.dim(" This grants admin access to the system\n"));
33
39
  }
34
40
  else {
35
41
  if (authMode === "local") {
36
- console.log(kleur.dim("# Auth server"));
37
- console.log(kleur.yellow(" Requires a local PostgreSQL instance running on localhost, port 5432\n"));
42
+ console.log(kleur.dim(" # Auth server"));
43
+ console.log(kleur.yellow(" Requires a local PostgreSQL instance running on localhost:5432\n"));
38
44
  console.log(" cd auth");
39
45
  console.log(" npm install\n");
40
46
  console.log(kleur.dim(" # Initialize database"));
@@ -44,29 +50,34 @@ export function printSuccessOutput(config) {
44
50
  console.log(" npm run dev\n");
45
51
  }
46
52
  if (apiFramework) {
47
- console.log(kleur.dim("# API server"));
53
+ console.log(kleur.dim(" # API server"));
48
54
  console.log(" cd api && npm install && npm run dev\n");
49
55
  }
50
56
  if (webFramework) {
51
- console.log(kleur.dim("# Web app"));
57
+ console.log(kleur.dim(" # Web app"));
52
58
  console.log(" cd web && npm install && npm run dev\n");
53
59
  }
60
+ console.log(" 2. Create your first admin user");
61
+ console.log(kleur.cyan(" seamless bootstrap-admin\n"));
54
62
  }
55
63
  console.log(kleur.bold("Available services:\n"));
56
- console.log(" Auth: " + kleur.cyan("http://localhost:5312"));
64
+ console.log(" Auth: " + kleur.cyan("http://localhost:5312"));
57
65
  if (apiFramework) {
58
- console.log(" API: " + kleur.cyan("http://localhost:3000"));
66
+ console.log(" API: " + kleur.cyan("http://localhost:3000"));
59
67
  }
60
68
  if (webFramework) {
61
- console.log(" Web: " + kleur.cyan("http://localhost:5173"));
69
+ console.log(" Web: " + kleur.cyan("http://localhost:5173"));
62
70
  }
71
+ console.log(" Admin: " + kleur.cyan("http://localhost:5174"));
63
72
  console.log("");
64
73
  console.log(kleur.bold("Notes:\n"));
65
74
  console.log(kleur.dim(" • Web connects to API automatically"));
66
75
  console.log(kleur.dim(" • API connects to Auth automatically"));
76
+ console.log(kleur.dim(" • Admin dashboard uses the same auth system"));
77
+ console.log(kleur.dim(" • Bootstrap command provisions the first admin user"));
67
78
  console.log(kleur.dim(" • All secrets and keys are pre-configured\n"));
68
79
  console.log(kleur.dim("Docs: ") + kleur.cyan("https://docs.seamlessauth.com\n"));
69
- console.log(kleur.bold().green("Happy hacking. 🚀\n"));
80
+ console.log(kleur.bold().green("Setup complete.\n"));
70
81
  }
71
82
  function formatFramework(name) {
72
83
  const map = {
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,kBAAkB,CAAC,MAOlC;IACC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GACpE,MAAM,CAAC;IAET,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC;;aAED,KAAK;;CAEjB,CAAC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAEhE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAEhD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,MAAM;YACJ,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,KAAK,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CACnD,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,MAAM;YACJ,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,KAAK,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CACnD,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CACT,MAAM;QACJ,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC;QAC1B,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAC1E,CAAC;IAEF,OAAO,CAAC,GAAG,CACT,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CACxE,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAEzC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAE3D,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAE1C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,oEAAoE,CACrE,CACF,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAE/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAEtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAEhE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,uDAAuD,CAAC,CACnE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAExE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CACpE,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,GAAG,GAA2B;QAClC,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,SAAS;QAClB,GAAG,EAAE,KAAK;KACX,CAAC;IAEF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,43 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { VERSION } from "../../index.js";
4
+ export function generateSeamlessConfig(root, options) {
5
+ const config = {
6
+ version: VERSION,
7
+ projectName: options.projectName || path.basename(root),
8
+ createdAt: new Date().toISOString(),
9
+ services: {
10
+ web: {
11
+ framework: options.webFramework,
12
+ path: "./web",
13
+ },
14
+ api: {
15
+ framework: options.apiFramework,
16
+ path: "./api",
17
+ },
18
+ auth: {
19
+ mode: options.authMode,
20
+ image: options.authMode === "docker"
21
+ ? "ghcr.io/fells-code/seamless-auth-api:latest"
22
+ : null,
23
+ path: options.authMode === "local" ? "./auth" : null,
24
+ },
25
+ admin: {
26
+ mode: options.adminMode,
27
+ image: options.adminMode === "image"
28
+ ? "ghcr.io/fells-code/seamless-auth-admin-dashboard:latest"
29
+ : null,
30
+ path: options.adminMode === "source" ? "./admin" : null,
31
+ },
32
+ database: {
33
+ type: "postgres",
34
+ },
35
+ },
36
+ docker: {
37
+ composeFile: "docker-compose.yml",
38
+ },
39
+ };
40
+ fs.writeFileSync(path.join(root, "seamless.config.json"), JSON.stringify(config, null, 2));
41
+ console.log("Seamless config created.");
42
+ }
43
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/generators/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,OAMC;IAED,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAEnC,QAAQ,EAAE;YACR,GAAG,EAAE;gBACH,SAAS,EAAE,OAAO,CAAC,YAAY;gBAC/B,IAAI,EAAE,OAAO;aACd;YACD,GAAG,EAAE;gBACH,SAAS,EAAE,OAAO,CAAC,YAAY;gBAC/B,IAAI,EAAE,OAAO;aACd;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO,CAAC,QAAQ;gBACtB,KAAK,EACH,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC3B,CAAC,CAAC,6CAA6C;oBAC/C,CAAC,CAAC,IAAI;gBACV,IAAI,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;aACrD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO,CAAC,SAAS;gBACvB,KAAK,EACH,OAAO,CAAC,SAAS,KAAK,OAAO;oBAC3B,CAAC,CAAC,yDAAyD;oBAC3D,CAAC,CAAC,IAAI;gBACV,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;aACxD;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,UAAU;aACjB;SACF;QAED,MAAM,EAAE;YACN,WAAW,EAAE,oBAAoB;SAClC;KACF,CAAC;IAEF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAChC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAC1C,CAAC"}
@@ -11,7 +11,7 @@ export async function generateDockerCompose(root, options) {
11
11
  return shared;
12
12
  }
13
13
  async function buildCompose(options, root) {
14
- const { authMode, includeApi, includeWeb } = options;
14
+ const { authMode, adminMode, includeAdmin } = options;
15
15
  const { service: authBlock, shared } = await authService(authMode, root);
16
16
  return {
17
17
  compose: `
@@ -30,9 +30,11 @@ services:
30
30
 
31
31
  ${authBlock}
32
32
 
33
- ${includeApi ? apiService(shared) : ""}
33
+ ${apiService(shared)}
34
34
 
35
- ${includeWeb ? webService() : ""}
35
+ ${webService()}
36
+
37
+ ${includeAdmin ? adminService(adminMode) : ""}
36
38
 
37
39
  volumes:
38
40
  pgdata:
@@ -79,7 +81,7 @@ function apiService(shared) {
79
81
  - ./api/.env
80
82
  environment:
81
83
  AUTH_SERVER_URL: http://auth:5312
82
- UI_ORIGIN: http://localhost:5173
84
+ UI_ORIGINS: http://localhost:5173,http://localhost:5174
83
85
  DB_HOST: db
84
86
  API_SERVICE_TOKEN: ${shared.apiToken}
85
87
  JWKS_KID: ${shared.kid}
@@ -97,17 +99,13 @@ function webService() {
97
99
  container_name: web
98
100
  build: ./web
99
101
  ports:
100
- - "5173:5173"
101
- env_file:
102
- - ./web/.env
102
+ - "5173:80"
103
103
  environment:
104
- VITE_API_URL: http://localhost:3000
105
- VITE_AUTH_SERVER_URL: http://localhost:3000/
104
+ API_URL: http://localhost:3000/
106
105
  volumes:
107
106
  - ./web:/app
108
107
  - /app/node_modules
109
108
  depends_on:
110
- - auth
111
109
  - api
112
110
  `;
113
111
  }
@@ -119,7 +117,7 @@ async function authServiceDocker() {
119
117
  return {
120
118
  service: `
121
119
  auth:
122
- image: ghcr.io/fells-code/seamless-auth-api:v0.1.5
120
+ image: ghcr.io/fells-code/seamless-auth-api:latest
123
121
  container_name: seamless-auth
124
122
  ports:
125
123
  - "5312:5312"
@@ -131,10 +129,43 @@ ${envBlock}
131
129
  shared,
132
130
  };
133
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
+ }
134
162
  function buildAuthEnv(env, mode) {
135
163
  const apiToken = generateSecret(32);
164
+ const bootstrapSecret = generateSecret(32);
165
+ env.SEAMLESS_BOOTSTRAP_ENABLED = "true";
166
+ env.SEAMLESS_BOOTSTRAP_SECRET = bootstrapSecret;
136
167
  env.PORT = "5312";
137
- env.NODE_ENV = mode === "docker" ? "production" : "development";
168
+ env.NODE_ENV = "development";
138
169
  env.AUTH_MODE = "server";
139
170
  env.ISSUER = "http://auth:5312";
140
171
  env.DB_HOST = mode === "docker" ? "db" : "localhost";
@@ -150,13 +181,14 @@ function buildAuthEnv(env, mode) {
150
181
  env[`SEAMLESS_JWKS_KEY_${jwks.kid}_PRIVATE`] = jwks.privateKey;
151
182
  env.JWKS_PUBLIC_KEYS = jwks.publicJwksJson;
152
183
  }
153
- env.APP_ORIGIN = "http://localhost:3000";
184
+ env.APP_ORIGINS = "http://localhost:3000";
154
185
  env.ORIGINS = "http://localhost:5173";
155
186
  return {
156
187
  env,
157
188
  shared: {
158
189
  apiToken,
159
190
  kid,
191
+ bootstrapSecret,
160
192
  },
161
193
  };
162
194
  }
@@ -1 +1 @@
1
- {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/generators/docker/docker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/generators/docker/docker.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,14 +1,40 @@
1
1
  #!/usr/bin/env node
2
2
  import { runCLI } from "./commands/init.js";
3
- import { printHelp } from "./core/help.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;
4
8
  const args = process.argv.slice(2);
5
- const firstArg = args[0];
9
+ const command = args[0];
6
10
  async function main() {
7
- if (firstArg === "-h" || firstArg === "--help") {
11
+ if (!command) {
8
12
  printHelp();
9
13
  return;
10
14
  }
11
- await runCLI(firstArg);
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);
12
38
  }
13
39
  main().catch((err) => {
14
40
  console.error("Error:", err.message);
package/dist/index.js.map CHANGED
@@ -1 +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,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAEzB,KAAK,UAAU,IAAI;IACjB,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/C,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzB,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"}
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"}
@@ -1,64 +1,73 @@
1
1
  import { confirm, select } from "@clack/prompts";
2
2
  export async function runProjectSetupPrompts() {
3
- const web = await confirm({
4
- message: "Do you want to create a web application?",
5
- });
6
- let webFramework = null;
7
- if (web) {
8
- const result = await select({
9
- message: "Which framework?",
10
- options: [
11
- { value: "react", label: "React (Vite)" },
12
- { value: "next", label: "Next.js (coming soon)", disabled: true },
13
- { value: "vue", label: "Vue (coming soon)", disabled: true },
14
- { value: "angular", label: "Angular (coming soon)", disabled: true },
15
- ],
16
- });
17
- webFramework = result;
18
- }
19
- const api = await confirm({
20
- message: "Do you want to create an API server?",
21
- });
22
- let apiFramework = null;
23
- if (api) {
24
- const result = await select({
25
- message: "Which backend?",
26
- options: [
27
- { value: "express", label: "Express" },
28
- { value: "next", label: "Next.js (coming soon)", disabled: true },
29
- { value: "fastify", label: "Fastify (coming soon)", disabled: true },
30
- { value: "fast-api", label: "FastAPI (coming soon)", disabled: true },
31
- ],
32
- });
33
- apiFramework = result;
34
- }
3
+ const webFramework = (await select({
4
+ message: "Web framework",
5
+ options: [
6
+ { value: "react", label: "React (Vite)" },
7
+ { value: "next", label: "Next.js (coming soon)", disabled: true },
8
+ ],
9
+ }));
10
+ const apiFramework = (await select({
11
+ message: "Backend framework",
12
+ options: [
13
+ { value: "express", label: "Express" },
14
+ { value: "fastify", label: "Fastify (coming soon)", disabled: true },
15
+ { value: "fastAPI", label: "FastAPI (coming soon)", disabled: true },
16
+ { value: "axum", label: "Rust Axum (coming soon)", disabled: true },
17
+ ],
18
+ }));
35
19
  const authMode = (await select({
36
20
  message: "How would you like to run SeamlessAuth?",
37
21
  options: [
38
22
  {
39
- value: "local",
40
- label: "Local development server (npm run dev yourself)",
23
+ value: "docker",
24
+ label: "Docker container (recommended)",
41
25
  },
42
26
  {
43
- value: "docker",
44
- label: "Docker container (recommended - just run docker compose up)",
27
+ value: "local",
28
+ label: "Local dev server (advanced)",
45
29
  },
46
30
  ],
47
31
  }));
48
- let useDocker = await confirm({
49
- message: "Do you want to run your stack with Docker?",
32
+ const includeAdmin = await confirm({
33
+ message: "Include Admin Dashboard?",
34
+ initialValue: true,
50
35
  });
51
- if (authMode === "docker" && !useDocker) {
52
- console.log("\nAuth server requires Docker — enabling Docker mode automatically.\n");
53
- useDocker = true;
36
+ let adminMode = "image";
37
+ if (includeAdmin) {
38
+ adminMode = (await select({
39
+ message: "Admin dashboard source",
40
+ options: [
41
+ {
42
+ value: "image",
43
+ label: "Use official Docker image (recommended)",
44
+ },
45
+ {
46
+ value: "source",
47
+ label: "Clone repo for modification",
48
+ },
49
+ ],
50
+ }));
51
+ }
52
+ let useDocker = true;
53
+ if (authMode === "local") {
54
+ const confirmDocker = await confirm({
55
+ message: "Auth server still requires Docker for full stack. Enable Docker?",
56
+ initialValue: true,
57
+ });
58
+ if (!confirmDocker) {
59
+ console.log("\nDocker is required for full seamless stack. Enabling automatically.\n");
60
+ }
54
61
  }
55
62
  return {
56
- web,
63
+ web: true,
57
64
  webFramework,
58
- api,
65
+ api: true,
59
66
  apiFramework,
60
67
  authMode,
61
- useDocker,
68
+ useDocker: true,
69
+ includeAdmin,
70
+ adminMode,
62
71
  };
63
72
  }
64
73
  //# sourceMappingURL=projectSetup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projectSetup.js","sourceRoot":"","sources":["../../src/prompts/projectSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAQ,MAAM,gBAAgB,CAAC;AAMvD,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;QACxB,OAAO,EAAE,0CAA0C;KACpD,CAAC,CAAC;IAEH,IAAI,YAAY,GAAiB,IAAI,CAAC;IAEtC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE;gBACzC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACjE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC5D,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;aACrE;SACF,CAAC,CAAC;QAEH,YAAY,GAAG,MAAsB,CAAC;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;QACxB,OAAO,EAAE,sCAAsC;KAChD,CAAC,CAAC;IAEH,IAAI,YAAY,GAAiB,IAAI,CAAC;IAEtC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACtC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACjE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACpE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;aACtE;SACF,CAAC,CAAC;QAEH,YAAY,GAAG,MAAsB,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC;QAC7B,OAAO,EAAE,yCAAyC;QAClD,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,iDAAiD;aACzD;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,6DAA6D;aACrE;SACF;KACF,CAAC,CAAa,CAAC;IAEhB,IAAI,SAAS,GAAG,MAAM,OAAO,CAAC;QAC5B,OAAO,EAAE,4CAA4C;KACtD,CAAC,CAAC;IAEH,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CACT,uEAAuE,CACxE,CAAC;QACF,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO;QACL,GAAG;QACH,YAAY;QACZ,GAAG;QACH,YAAY;QACZ,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"projectSetup.js","sourceRoot":"","sources":["../../src/prompts/projectSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAOjD,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC;QACjC,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE;YACzC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;SAClE;KACF,CAAC,CAAiB,CAAC;IAEpB,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC;QACjC,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;YACtC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;YACpE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;YACpE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,IAAI,EAAE;SACpE;KACF,CAAC,CAAiB,CAAC;IAEpB,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC;QAC7B,OAAO,EAAE,yCAAyC;QAClD,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,gCAAgC;aACxC;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,6BAA6B;aACrC;SACF;KACF,CAAC,CAAa,CAAC;IAEhB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;QACjC,OAAO,EAAE,0BAA0B;QACnC,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,SAAS,GAAc,OAAO,CAAC;IAEnC,IAAI,YAAY,EAAE,CAAC;QACjB,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC;YACxB,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE;gBACP;oBACE,KAAK,EAAE,OAAO;oBACd,KAAK,EAAE,yCAAyC;iBACjD;gBACD;oBACE,KAAK,EAAE,QAAQ;oBACf,KAAK,EAAE,6BAA6B;iBACrC;aACF;SACF,CAAC,CAAc,CAAC;IACnB,CAAC;IAED,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;YAClC,OAAO,EACL,kEAAkE;YACpE,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CACT,yEAAyE,CAC1E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,EAAE,IAAI;QACT,YAAY;QAEZ,GAAG,EAAE,IAAI;QACT,YAAY;QAEZ,QAAQ;QACR,SAAS,EAAE,IAAI;QAEf,YAAY;QACZ,SAAS;KACV,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-seamless",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "The starter script for Seamless Auth",
5
5
  "homepage": "https://github.com/fells-code/create-seamless#readme",
6
6
  "bugs": {
@@ -13,7 +13,8 @@
13
13
  "license": "AGPL-3.0-only",
14
14
  "author": "Fells Code, LLC",
15
15
  "bin": {
16
- "create-seamless": "dist/index.js"
16
+ "create-seamless": "dist/index.js",
17
+ "seamless": "dist/index.js"
17
18
  },
18
19
  "type": "module",
19
20
  "scripts": {
@@ -40,4 +41,4 @@
40
41
  "tsx": "^4.21.0",
41
42
  "typescript": "^5.9.3"
42
43
  }
43
- }
44
+ }