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.
- package/dist/commands/bootstrapAdmin.js +96 -0
- package/dist/commands/bootstrapAdmin.js.map +1 -0
- package/dist/commands/check.js +92 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/help.js +103 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/init.js +10 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/core/bootstrapSecret.js +31 -0
- package/dist/core/bootstrapSecret.js.map +1 -0
- package/dist/core/help.js +39 -20
- package/dist/core/help.js.map +1 -1
- package/dist/core/output.js +25 -14
- package/dist/core/output.js.map +1 -1
- package/dist/generators/config/config.js +43 -0
- package/dist/generators/config/config.js.map +1 -0
- package/dist/generators/docker/docker.js +45 -13
- package/dist/generators/docker/docker.js.map +1 -1
- package/dist/index.js +30 -4
- package/dist/index.js.map +1 -1
- package/dist/prompts/projectSetup.js +53 -44
- package/dist/prompts/projectSetup.js.map +1 -1
- package/package.json +4 -3
|
@@ -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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -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
|
-
|
|
44
|
-
|
|
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":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
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
|
|
6
|
+
Seamless Auth CLI — scaffold and manage full-stack authentication systems.
|
|
6
7
|
|
|
7
8
|
────────────────────────────────────────────
|
|
8
9
|
|
|
9
10
|
USAGE
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
seamless init [project-name]
|
|
13
|
+
seamless check
|
|
14
|
+
seamless --help
|
|
15
|
+
seamless --version
|
|
15
16
|
|
|
16
17
|
────────────────────────────────────────────
|
|
17
18
|
|
|
18
|
-
|
|
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
|
-
|
|
33
|
+
────────────────────────────────────────────
|
|
34
|
+
|
|
35
|
+
BEHAVIOR
|
|
21
36
|
|
|
22
|
-
|
|
23
|
-
• If directory is empty → create a new project
|
|
37
|
+
seamless <project-name>
|
|
24
38
|
|
|
25
|
-
|
|
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
|
|
43
|
+
WHAT YOU GET
|
|
33
44
|
|
|
34
|
-
•
|
|
35
|
-
•
|
|
36
|
-
• SeamlessAuth server (
|
|
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
|
-
|
|
55
|
+
seamless init
|
|
43
56
|
→ Interactive setup in current directory
|
|
44
57
|
|
|
45
|
-
|
|
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
|
package/dist/core/help.js.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/core/output.js
CHANGED
|
@@ -7,15 +7,15 @@ export function printSuccessOutput(config) {
|
|
|
7
7
|
║ ${title} ║
|
|
8
8
|
╚════════════════════════════════════════╝
|
|
9
9
|
`);
|
|
10
|
-
console.log(kleur.green("
|
|
10
|
+
console.log(kleur.green("Project initialized successfully.\n"));
|
|
11
11
|
if (projectName) {
|
|
12
|
-
console.log(kleur.dim("Project
|
|
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("
|
|
15
|
+
console.log(kleur.bold("Included services:\n"));
|
|
16
16
|
if (webFramework) {
|
|
17
17
|
console.log(" • " +
|
|
18
|
-
kleur.white("Web
|
|
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("
|
|
31
|
+
console.log(kleur.bold("Next steps:\n"));
|
|
31
32
|
if (useDocker) {
|
|
32
|
-
console.log(
|
|
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("
|
|
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:
|
|
64
|
+
console.log(" Auth: " + kleur.cyan("http://localhost:5312"));
|
|
57
65
|
if (apiFramework) {
|
|
58
|
-
console.log(" API:
|
|
66
|
+
console.log(" API: " + kleur.cyan("http://localhost:3000"));
|
|
59
67
|
}
|
|
60
68
|
if (webFramework) {
|
|
61
|
-
console.log(" Web:
|
|
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("
|
|
80
|
+
console.log(kleur.bold().green("Setup complete.\n"));
|
|
70
81
|
}
|
|
71
82
|
function formatFramework(name) {
|
|
72
83
|
const map = {
|
package/dist/core/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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
|
-
${
|
|
33
|
+
${apiService(shared)}
|
|
34
34
|
|
|
35
|
-
${
|
|
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
|
-
|
|
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:
|
|
101
|
-
env_file:
|
|
102
|
-
- ./web/.env
|
|
102
|
+
- "5173:80"
|
|
103
103
|
environment:
|
|
104
|
-
|
|
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:
|
|
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 =
|
|
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.
|
|
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":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,OAIC;IAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE9D,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,EACrC,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CACtB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,YAAY,
|
|
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 {
|
|
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
|
|
9
|
+
const command = args[0];
|
|
6
10
|
async function main() {
|
|
7
|
-
if (
|
|
11
|
+
if (!command) {
|
|
8
12
|
printHelp();
|
|
9
13
|
return;
|
|
10
14
|
}
|
|
11
|
-
|
|
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,
|
|
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
|
|
4
|
-
message: "
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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: "
|
|
40
|
-
label: "
|
|
23
|
+
value: "docker",
|
|
24
|
+
label: "Docker container (recommended)",
|
|
41
25
|
},
|
|
42
26
|
{
|
|
43
|
-
value: "
|
|
44
|
-
label: "
|
|
27
|
+
value: "local",
|
|
28
|
+
label: "Local dev server (advanced)",
|
|
45
29
|
},
|
|
46
30
|
],
|
|
47
31
|
}));
|
|
48
|
-
|
|
49
|
-
message: "
|
|
32
|
+
const includeAdmin = await confirm({
|
|
33
|
+
message: "Include Admin Dashboard?",
|
|
34
|
+
initialValue: true,
|
|
50
35
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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,
|
|
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.
|
|
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
|
+
}
|