seamless-cli 0.2.0 → 0.4.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.
- package/README.md +5 -6
- package/dist/commands/help.js +18 -1
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.js +70 -22
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/verify.js +259 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/bootstrapSecret.js +12 -4
- package/dist/core/bootstrapSecret.js.map +1 -1
- package/dist/core/exec.js +2 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/fetch.js +2 -1
- package/dist/core/fetch.js.map +1 -1
- package/dist/core/images.js +11 -0
- package/dist/core/images.js.map +1 -0
- package/dist/core/templates.js +185 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/generators/auth/auth.js +38 -17
- package/dist/generators/auth/auth.js.map +1 -1
- package/dist/generators/config/config.js +3 -4
- package/dist/generators/config/config.js.map +1 -1
- package/dist/generators/docker/docker.js +24 -22
- package/dist/generators/docker/docker.js.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/prompts/projectSetup.js +43 -19
- package/dist/prompts/projectSetup.js.map +1 -1
- package/package.json +6 -1
- package/verify/adapter-app/Dockerfile +14 -0
- package/verify/adapter-app/package.json +13 -0
- package/verify/adapter-app/server.mjs +62 -0
- package/verify/adapter-app/vendor/.gitignore +3 -0
- package/verify/adapter-app/vendor/.gitkeep +0 -0
- package/verify/docker-compose.verify.yml +154 -0
- package/verify/harness/adapter/emailOtpLogin.spec.ts +12 -0
- package/verify/harness/adapter/magicLink.spec.ts +14 -0
- package/verify/harness/adapter/oauth.spec.ts +11 -0
- package/verify/harness/adapter/registration.spec.ts +11 -0
- package/verify/harness/adapter/sessionLifecycle.spec.ts +20 -0
- package/verify/harness/api/adminBootstrap.spec.ts +34 -0
- package/verify/harness/api/emailOtp.spec.ts +17 -0
- package/verify/harness/api/jwks.spec.ts +17 -0
- package/verify/harness/api/magicLink.spec.ts +36 -0
- package/verify/harness/api/oauth.spec.ts +12 -0
- package/verify/harness/api/organizations.spec.ts +28 -0
- package/verify/harness/api/phoneOtp.spec.ts +19 -0
- package/verify/harness/api/sessionLifecycle.spec.ts +26 -0
- package/verify/harness/api/stepUp.spec.ts +39 -0
- package/verify/harness/api/totp.spec.ts +24 -0
- package/verify/harness/global-setup.ts +45 -0
- package/verify/harness/lib/adapterFlows.ts +57 -0
- package/verify/harness/lib/client.ts +32 -0
- package/verify/harness/lib/env.ts +45 -0
- package/verify/harness/lib/fixtures.ts +20 -0
- package/verify/harness/lib/flows.ts +204 -0
- package/verify/harness/lib/matrixReporter.ts +73 -0
- package/verify/harness/lib/reactFlows.ts +117 -0
- package/verify/harness/lib/serviceToken.ts +26 -0
- package/verify/harness/lib/totp.ts +36 -0
- package/verify/harness/mock-oidc.ts +112 -0
- package/verify/harness/package-lock.json +93 -0
- package/verify/harness/package.json +14 -0
- package/verify/harness/playwright.config.ts +30 -0
- package/verify/harness/react/emailOtpLogin.spec.ts +13 -0
- package/verify/harness/react/logout.spec.ts +17 -0
- package/verify/harness/react/magicLinkLogin.spec.ts +29 -0
- package/verify/harness/react/oauth.spec.ts +13 -0
- package/verify/harness/react/passkeyLogin.spec.ts +24 -0
- package/verify/harness/react/passkeyRegister.spec.ts +15 -0
- package/verify/harness/react/register.spec.ts +18 -0
- package/verify/react-vendor/.gitkeep +0 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import AdmZip from "adm-zip";
|
|
4
|
+
import { VERSION } from "../index.js";
|
|
5
|
+
import { parseEnvString, writeEnv } from "./env.js";
|
|
6
|
+
import { generateSecret } from "./secrets.js";
|
|
7
|
+
import { SEAMLESS_TEMPLATES_REF, SEAMLESS_TEMPLATES_REPO } from "./images.js";
|
|
8
|
+
// Build artifacts and local-only files that must never be copied into a scaffold,
|
|
9
|
+
// even if a local template checkout has them lying around.
|
|
10
|
+
const IGNORED_NAMES = new Set([
|
|
11
|
+
"node_modules",
|
|
12
|
+
".git",
|
|
13
|
+
"dist",
|
|
14
|
+
"build",
|
|
15
|
+
".next",
|
|
16
|
+
"out",
|
|
17
|
+
"coverage",
|
|
18
|
+
".DS_Store",
|
|
19
|
+
".env",
|
|
20
|
+
".env.local",
|
|
21
|
+
]);
|
|
22
|
+
export async function openTemplateSource() {
|
|
23
|
+
const localDir = process.env.SEAMLESS_TEMPLATES_DIR;
|
|
24
|
+
if (localDir) {
|
|
25
|
+
return openLocalSource(path.resolve(localDir));
|
|
26
|
+
}
|
|
27
|
+
return openRemoteSource(SEAMLESS_TEMPLATES_REPO, process.env.SEAMLESS_TEMPLATES_REF ?? SEAMLESS_TEMPLATES_REF);
|
|
28
|
+
}
|
|
29
|
+
function readRegistry(raw) {
|
|
30
|
+
const registry = JSON.parse(raw);
|
|
31
|
+
if (!registry || !Array.isArray(registry.templates)) {
|
|
32
|
+
throw new Error("Template registry is malformed (missing templates array).");
|
|
33
|
+
}
|
|
34
|
+
return registry;
|
|
35
|
+
}
|
|
36
|
+
function openLocalSource(dir) {
|
|
37
|
+
const registryPath = path.join(dir, "registry.json");
|
|
38
|
+
if (!fs.existsSync(registryPath)) {
|
|
39
|
+
throw new Error(`SEAMLESS_TEMPLATES_DIR is set to ${dir}, but no registry.json was found there.`);
|
|
40
|
+
}
|
|
41
|
+
const registry = readRegistry(fs.readFileSync(registryPath, "utf-8"));
|
|
42
|
+
return {
|
|
43
|
+
registry,
|
|
44
|
+
async readManifest(entry) {
|
|
45
|
+
const manifestPath = path.join(dir, entry.path, "template.json");
|
|
46
|
+
return JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
47
|
+
},
|
|
48
|
+
async copyInto(entry, destDir) {
|
|
49
|
+
copyDir(path.join(dir, entry.path), destDir);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function openRemoteSource(repo, ref) {
|
|
54
|
+
const registryUrl = `https://raw.githubusercontent.com/${repo}/${ref}/registry.json`;
|
|
55
|
+
const res = await fetch(registryUrl);
|
|
56
|
+
if (!res.ok) {
|
|
57
|
+
throw new Error(`Failed to fetch the template registry (${res.status}) from ${registryUrl}.`);
|
|
58
|
+
}
|
|
59
|
+
const registry = readRegistry(await res.text());
|
|
60
|
+
// The whole monorepo is downloaded once, lazily, and shared across every template
|
|
61
|
+
// a single scaffold pulls in.
|
|
62
|
+
let archive = null;
|
|
63
|
+
const ensureArchive = async () => {
|
|
64
|
+
if (archive)
|
|
65
|
+
return archive;
|
|
66
|
+
const url = `https://github.com/${repo}/archive/${ref}.zip`;
|
|
67
|
+
const zipRes = await fetch(url);
|
|
68
|
+
if (!zipRes.ok) {
|
|
69
|
+
throw new Error(`Failed to download templates (${zipRes.status}) from ${url}.`);
|
|
70
|
+
}
|
|
71
|
+
const zip = new AdmZip(Buffer.from(await zipRes.arrayBuffer()));
|
|
72
|
+
const first = zip.getEntries()[0];
|
|
73
|
+
if (!first) {
|
|
74
|
+
throw new Error("Downloaded templates archive was empty.");
|
|
75
|
+
}
|
|
76
|
+
// GitHub archives nest everything under a single top-level directory.
|
|
77
|
+
const root = first.entryName.split("/")[0];
|
|
78
|
+
archive = { zip, root };
|
|
79
|
+
return archive;
|
|
80
|
+
};
|
|
81
|
+
return {
|
|
82
|
+
registry,
|
|
83
|
+
async readManifest(entry) {
|
|
84
|
+
const { zip, root } = await ensureArchive();
|
|
85
|
+
const name = `${root}/${entry.path}/template.json`;
|
|
86
|
+
const found = zip.getEntry(name);
|
|
87
|
+
if (!found) {
|
|
88
|
+
throw new Error(`Template "${entry.id}" is missing template.json in the registry.`);
|
|
89
|
+
}
|
|
90
|
+
return JSON.parse(found.getData().toString("utf-8"));
|
|
91
|
+
},
|
|
92
|
+
async copyInto(entry, destDir) {
|
|
93
|
+
const { zip, root } = await ensureArchive();
|
|
94
|
+
const prefix = `${root}/${entry.path}/`;
|
|
95
|
+
for (const e of zip.getEntries()) {
|
|
96
|
+
if (e.isDirectory || !e.entryName.startsWith(prefix))
|
|
97
|
+
continue;
|
|
98
|
+
const rel = e.entryName.slice(prefix.length);
|
|
99
|
+
if (rel.split("/").some((seg) => IGNORED_NAMES.has(seg)))
|
|
100
|
+
continue;
|
|
101
|
+
const out = path.join(destDir, rel);
|
|
102
|
+
fs.mkdirSync(path.dirname(out), { recursive: true });
|
|
103
|
+
fs.writeFileSync(out, e.getData());
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function copyDir(src, dest) {
|
|
109
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
110
|
+
for (const name of fs.readdirSync(src)) {
|
|
111
|
+
if (IGNORED_NAMES.has(name))
|
|
112
|
+
continue;
|
|
113
|
+
const from = path.join(src, name);
|
|
114
|
+
const to = path.join(dest, name);
|
|
115
|
+
const stat = fs.statSync(from);
|
|
116
|
+
if (stat.isDirectory()) {
|
|
117
|
+
copyDir(from, to);
|
|
118
|
+
}
|
|
119
|
+
else if (stat.isFile()) {
|
|
120
|
+
fs.copyFileSync(from, to);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export function assertCliSupports(manifest, label) {
|
|
125
|
+
const min = manifest.requires?.cliMin;
|
|
126
|
+
if (min && compareSemver(VERSION, min) < 0) {
|
|
127
|
+
throw new Error(`Template "${label}" requires seamless-cli >= ${min}, but this is ${VERSION}. Please upgrade.`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Copies the template's example env to .env (if declared), then applies the
|
|
131
|
+
// manifest's env.set, resolving {{placeholders}} against the scaffold context.
|
|
132
|
+
// This replaces the per-framework configure step.
|
|
133
|
+
export function applyTemplateEnv(destDir, manifest, ctx) {
|
|
134
|
+
const env = manifest.env ?? {};
|
|
135
|
+
const envPath = path.join(destDir, ".env");
|
|
136
|
+
let values = {};
|
|
137
|
+
if (env.fromExample) {
|
|
138
|
+
const examplePath = path.join(destDir, env.fromExample);
|
|
139
|
+
if (fs.existsSync(examplePath)) {
|
|
140
|
+
values = parseEnvString(fs.readFileSync(examplePath, "utf-8"));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else if (fs.existsSync(envPath)) {
|
|
144
|
+
values = parseEnvString(fs.readFileSync(envPath, "utf-8"));
|
|
145
|
+
}
|
|
146
|
+
for (const [key, raw] of Object.entries(env.set ?? {})) {
|
|
147
|
+
values[key] = resolvePlaceholders(raw, ctx);
|
|
148
|
+
}
|
|
149
|
+
writeEnv(envPath, values);
|
|
150
|
+
}
|
|
151
|
+
function resolvePlaceholders(value, ctx) {
|
|
152
|
+
return value.replace(/\{\{\s*([\w:]+)\s*\}\}/g, (_match, token) => resolveToken(token, ctx));
|
|
153
|
+
}
|
|
154
|
+
function resolveToken(token, ctx) {
|
|
155
|
+
const secret = /^secret:(\d+)$/.exec(token);
|
|
156
|
+
if (secret) {
|
|
157
|
+
return generateSecret(Number(secret[1]));
|
|
158
|
+
}
|
|
159
|
+
const known = {
|
|
160
|
+
authServerUrl: ctx.authServerUrl,
|
|
161
|
+
apiUrl: ctx.apiUrl,
|
|
162
|
+
apiToken: ctx.apiToken,
|
|
163
|
+
jwksKid: ctx.jwksKid,
|
|
164
|
+
};
|
|
165
|
+
if (token in known) {
|
|
166
|
+
const resolved = known[token];
|
|
167
|
+
if (resolved == null) {
|
|
168
|
+
throw new Error(`Template placeholder {{${token}}} has no value in this configuration.`);
|
|
169
|
+
}
|
|
170
|
+
return resolved;
|
|
171
|
+
}
|
|
172
|
+
throw new Error(`Unknown template placeholder {{${token}}}.`);
|
|
173
|
+
}
|
|
174
|
+
function compareSemver(a, b) {
|
|
175
|
+
const norm = (v) => v.replace(/^v/, "").split("-")[0].split(".").map((n) => parseInt(n, 10) || 0);
|
|
176
|
+
const pa = norm(a);
|
|
177
|
+
const pb = norm(b);
|
|
178
|
+
for (let i = 0; i < 3; i++) {
|
|
179
|
+
const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
180
|
+
if (diff !== 0)
|
|
181
|
+
return diff < 0 ? -1 : 1;
|
|
182
|
+
}
|
|
183
|
+
return 0;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,47 +1,68 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
|
+
import { parseEnvString } from "../../core/env.js";
|
|
3
4
|
import { runCommand } from "../../core/exec.js";
|
|
4
|
-
import {
|
|
5
|
+
import { fetchEnvExample } from "../../core/fetch.js";
|
|
6
|
+
import { POSTGRES_IMAGE, SEAMLESS_AUTH_API_IMAGE } from "../../core/images.js";
|
|
7
|
+
import { buildAuthEnv, configureAuthLocalEnv, envToDockerBlock, } from "../docker/docker.js";
|
|
5
8
|
const AUTH_REPO = "https://github.com/fells-code/seamless-auth-api";
|
|
6
|
-
const AUTH_PORT = 5312;
|
|
7
9
|
export async function generateAuthServer(context, mode) {
|
|
8
10
|
const { root } = context;
|
|
9
11
|
if (mode === "local") {
|
|
10
|
-
await setupLocalAuth(root);
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
await setupDockerAuth(root);
|
|
12
|
+
return await setupLocalAuth(root);
|
|
14
13
|
}
|
|
14
|
+
return await setupDockerAuth(root);
|
|
15
15
|
}
|
|
16
16
|
async function setupLocalAuth(root) {
|
|
17
17
|
const authDir = path.join(root, "auth");
|
|
18
18
|
console.log("Cloning SeamlessAuth server...");
|
|
19
19
|
await runCommand("git", ["clone", AUTH_REPO, "auth"], root);
|
|
20
20
|
console.log("Writing auth environment...");
|
|
21
|
-
|
|
22
|
-
PORT: AUTH_PORT,
|
|
23
|
-
NODE_ENV: "development",
|
|
24
|
-
AUTH_MODE: "server",
|
|
25
|
-
ISSUER: `http://localhost:${AUTH_PORT}`,
|
|
26
|
-
});
|
|
21
|
+
const shared = await configureAuthLocalEnv(root);
|
|
27
22
|
console.log("Auth server ready in /auth");
|
|
23
|
+
return shared;
|
|
28
24
|
}
|
|
29
25
|
async function setupDockerAuth(root) {
|
|
30
26
|
console.log("Creating docker-compose for SeamlessAuth...");
|
|
27
|
+
const raw = await fetchEnvExample();
|
|
28
|
+
const parsed = parseEnvString(raw);
|
|
29
|
+
const { env, shared } = buildAuthEnv(parsed, "docker");
|
|
30
|
+
const envBlock = envToDockerBlock(env);
|
|
31
31
|
const dockerCompose = `
|
|
32
32
|
services:
|
|
33
|
+
db:
|
|
34
|
+
image: ${POSTGRES_IMAGE}
|
|
35
|
+
container_name: seamless-db
|
|
36
|
+
ports:
|
|
37
|
+
- "5432:5432"
|
|
38
|
+
environment:
|
|
39
|
+
POSTGRES_USER: myuser
|
|
40
|
+
POSTGRES_PASSWORD: mypassword
|
|
41
|
+
POSTGRES_DB: postgres
|
|
42
|
+
volumes:
|
|
43
|
+
- pgdata:/var/lib/postgresql/data
|
|
44
|
+
healthcheck:
|
|
45
|
+
test: ["CMD-SHELL", "pg_isready -U myuser -d postgres"]
|
|
46
|
+
interval: 5s
|
|
47
|
+
timeout: 5s
|
|
48
|
+
retries: 5
|
|
49
|
+
|
|
33
50
|
auth:
|
|
34
|
-
image:
|
|
51
|
+
image: ${SEAMLESS_AUTH_API_IMAGE}
|
|
35
52
|
container_name: seamless-auth
|
|
36
53
|
ports:
|
|
37
54
|
- "5312:5312"
|
|
38
55
|
environment:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
56
|
+
${envBlock}
|
|
57
|
+
depends_on:
|
|
58
|
+
db:
|
|
59
|
+
condition: service_healthy
|
|
60
|
+
|
|
61
|
+
volumes:
|
|
62
|
+
pgdata:
|
|
43
63
|
`;
|
|
44
64
|
fs.writeFileSync(path.join(root, "docker-compose.yml"), dockerCompose.trim() + "\n");
|
|
45
65
|
console.log("Docker setup ready.");
|
|
66
|
+
return shared;
|
|
46
67
|
}
|
|
47
68
|
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/generators/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/generators/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,SAAS,GAAG,iDAAiD,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAY,EACZ,IAAiC;IAEjC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAE3D,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEvC,MAAM,aAAa,GAAG;;;aAGX,cAAc;;;;;;;;;;;;;;;;;aAiBd,uBAAuB;;;;;EAKlC,QAAQ;;;;;;;CAOT,CAAC;IAEA,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,EACrC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAC5B,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { VERSION } from "../../index.js";
|
|
4
|
+
import { SEAMLESS_AUTH_ADMIN_DASHBOARD_IMAGE, SEAMLESS_AUTH_API_IMAGE, } from "../../core/images.js";
|
|
4
5
|
export function generateSeamlessConfig(root, options) {
|
|
5
6
|
const config = {
|
|
6
7
|
version: VERSION,
|
|
@@ -17,15 +18,13 @@ export function generateSeamlessConfig(root, options) {
|
|
|
17
18
|
},
|
|
18
19
|
auth: {
|
|
19
20
|
mode: options.authMode,
|
|
20
|
-
image: options.authMode === "docker"
|
|
21
|
-
? "ghcr.io/fells-code/seamless-auth-api:latest"
|
|
22
|
-
: null,
|
|
21
|
+
image: options.authMode === "docker" ? SEAMLESS_AUTH_API_IMAGE : null,
|
|
23
22
|
path: options.authMode === "local" ? "./auth" : null,
|
|
24
23
|
},
|
|
25
24
|
admin: {
|
|
26
25
|
mode: options.adminMode,
|
|
27
26
|
image: options.adminMode === "image"
|
|
28
|
-
?
|
|
27
|
+
? SEAMLESS_AUTH_ADMIN_DASHBOARD_IMAGE
|
|
29
28
|
: null,
|
|
30
29
|
path: options.adminMode === "source" ? "./admin" : null,
|
|
31
30
|
},
|
|
@@ -1 +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;
|
|
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;AACzC,OAAO,EACL,mCAAmC,EACnC,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,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,EAAE,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI;gBACrE,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,mCAAmC;oBACrC,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"}
|
|
@@ -4,6 +4,7 @@ import { fetchEnvExample } from "../../core/fetch.js";
|
|
|
4
4
|
import { parseEnv, parseEnvString } from "../../core/env.js";
|
|
5
5
|
import { generateSecret } from "../../core/secrets.js";
|
|
6
6
|
import { generateJWKS } from "../../core/jwks.js";
|
|
7
|
+
import { POSTGRES_IMAGE, SEAMLESS_AUTH_ADMIN_DASHBOARD_IMAGE, SEAMLESS_AUTH_API_IMAGE, } from "../../core/images.js";
|
|
7
8
|
export async function generateDockerCompose(root, options) {
|
|
8
9
|
const { compose, shared } = await buildCompose(options, root);
|
|
9
10
|
fs.writeFileSync(path.join(root, "docker-compose.yml"), compose.trim() + "\n");
|
|
@@ -17,7 +18,7 @@ async function buildCompose(options, root) {
|
|
|
17
18
|
compose: `
|
|
18
19
|
services:
|
|
19
20
|
db:
|
|
20
|
-
image:
|
|
21
|
+
image: ${POSTGRES_IMAGE}
|
|
21
22
|
container_name: seamless-db
|
|
22
23
|
ports:
|
|
23
24
|
- "5432:5432"
|
|
@@ -27,6 +28,11 @@ services:
|
|
|
27
28
|
POSTGRES_DB: postgres
|
|
28
29
|
volumes:
|
|
29
30
|
- pgdata:/var/lib/postgresql/data
|
|
31
|
+
healthcheck:
|
|
32
|
+
test: ["CMD-SHELL", "pg_isready -U myuser -d postgres"]
|
|
33
|
+
interval: 5s
|
|
34
|
+
timeout: 5s
|
|
35
|
+
retries: 5
|
|
30
36
|
|
|
31
37
|
${authBlock}
|
|
32
38
|
|
|
@@ -63,7 +69,8 @@ async function authService(mode, root) {
|
|
|
63
69
|
- ./auth:/app
|
|
64
70
|
- /app/node_modules
|
|
65
71
|
depends_on:
|
|
66
|
-
|
|
72
|
+
db:
|
|
73
|
+
condition: service_healthy
|
|
67
74
|
`,
|
|
68
75
|
shared,
|
|
69
76
|
};
|
|
@@ -89,8 +96,10 @@ function apiService(shared) {
|
|
|
89
96
|
- ./api:/app
|
|
90
97
|
- /app/node_modules
|
|
91
98
|
depends_on:
|
|
92
|
-
|
|
93
|
-
|
|
99
|
+
db:
|
|
100
|
+
condition: service_healthy
|
|
101
|
+
auth:
|
|
102
|
+
condition: service_started
|
|
94
103
|
`;
|
|
95
104
|
}
|
|
96
105
|
function webService() {
|
|
@@ -117,14 +126,15 @@ async function authServiceDocker() {
|
|
|
117
126
|
return {
|
|
118
127
|
service: `
|
|
119
128
|
auth:
|
|
120
|
-
image:
|
|
129
|
+
image: ${SEAMLESS_AUTH_API_IMAGE}
|
|
121
130
|
container_name: seamless-auth
|
|
122
131
|
ports:
|
|
123
132
|
- "5312:5312"
|
|
124
133
|
environment:
|
|
125
134
|
${envBlock}
|
|
126
135
|
depends_on:
|
|
127
|
-
|
|
136
|
+
db:
|
|
137
|
+
condition: service_healthy
|
|
128
138
|
`,
|
|
129
139
|
shared,
|
|
130
140
|
};
|
|
@@ -149,7 +159,7 @@ function adminService(mode) {
|
|
|
149
159
|
}
|
|
150
160
|
return `
|
|
151
161
|
admin:
|
|
152
|
-
image:
|
|
162
|
+
image: ${SEAMLESS_AUTH_ADMIN_DASHBOARD_IMAGE}
|
|
153
163
|
container_name: admin
|
|
154
164
|
ports:
|
|
155
165
|
- "5174:80"
|
|
@@ -159,30 +169,22 @@ function adminService(mode) {
|
|
|
159
169
|
- api
|
|
160
170
|
`;
|
|
161
171
|
}
|
|
162
|
-
function buildAuthEnv(env, mode) {
|
|
172
|
+
export function buildAuthEnv(env, mode) {
|
|
163
173
|
const apiToken = generateSecret(32);
|
|
164
174
|
const bootstrapSecret = generateSecret(32);
|
|
175
|
+
const kid = "dev-main";
|
|
165
176
|
env.SEAMLESS_BOOTSTRAP_ENABLED = "true";
|
|
166
177
|
env.SEAMLESS_BOOTSTRAP_SECRET = bootstrapSecret;
|
|
167
178
|
env.PORT = "5312";
|
|
168
179
|
env.NODE_ENV = "development";
|
|
169
180
|
env.AUTH_MODE = "server";
|
|
170
|
-
env.ISSUER =
|
|
181
|
+
env.ISSUER =
|
|
182
|
+
mode === "docker" ? "http://auth:5312" : "http://localhost:5312";
|
|
171
183
|
env.DB_HOST = mode === "docker" ? "db" : "localhost";
|
|
172
184
|
env.DB_PORT = "5432";
|
|
173
185
|
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
186
|
env.APP_ORIGINS = "http://localhost:3000";
|
|
185
|
-
env.ORIGINS = "http://localhost:5173";
|
|
187
|
+
env.ORIGINS = "http://localhost:5173,http://localhost:5174";
|
|
186
188
|
return {
|
|
187
189
|
env,
|
|
188
190
|
shared: {
|
|
@@ -198,7 +200,7 @@ export function envToDockerBlock(env) {
|
|
|
198
200
|
if (v.includes("\n")) {
|
|
199
201
|
return ` ${k}: |\n${indentMultiline(v, 8)}`;
|
|
200
202
|
}
|
|
201
|
-
return ` ${k}: ${v}`;
|
|
203
|
+
return ` ${k}: ${JSON.stringify(v)}`;
|
|
202
204
|
})
|
|
203
205
|
.join("\n");
|
|
204
206
|
}
|
|
@@ -257,7 +259,7 @@ export function extractSharedFromExistingEnv(root) {
|
|
|
257
259
|
const env = parseEnv(path.join(root, "auth", ".env"));
|
|
258
260
|
return {
|
|
259
261
|
apiToken: env.API_SERVICE_TOKEN,
|
|
260
|
-
kid: env.JWKS_ACTIVE_KID || "main",
|
|
262
|
+
kid: env.SEAMLESS_JWKS_ACTIVE_KID || env.JWKS_ACTIVE_KID || "dev-main",
|
|
261
263
|
};
|
|
262
264
|
}
|
|
263
265
|
//# sourceMappingURL=docker.js.map
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/generators/docker/docker.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import { runCheck } from "./commands/check.js";
|
|
|
4
4
|
import { printHelp } from "./commands/help.js";
|
|
5
5
|
import pkg from "../package.json" with { type: "json" };
|
|
6
6
|
import { runBootstrapAdmin } from "./commands/bootstrapAdmin.js";
|
|
7
|
+
import { runVerify } from "./commands/verify.js";
|
|
7
8
|
export const VERSION = pkg.version;
|
|
8
9
|
const args = process.argv.slice(2);
|
|
9
10
|
const command = args[0];
|
|
@@ -21,8 +22,12 @@ async function main() {
|
|
|
21
22
|
return;
|
|
22
23
|
}
|
|
23
24
|
if (command === "init") {
|
|
24
|
-
const
|
|
25
|
-
|
|
25
|
+
const rest = args.slice(1);
|
|
26
|
+
const aliases = rest
|
|
27
|
+
.filter((a) => a.startsWith("--"))
|
|
28
|
+
.map((a) => a.replace(/^--+/, ""));
|
|
29
|
+
const projectName = rest.find((a) => !a.startsWith("--"));
|
|
30
|
+
await runCLI(projectName, aliases);
|
|
26
31
|
return;
|
|
27
32
|
}
|
|
28
33
|
if (command === "check") {
|
|
@@ -34,6 +39,10 @@ async function main() {
|
|
|
34
39
|
await runBootstrapAdmin(email);
|
|
35
40
|
return;
|
|
36
41
|
}
|
|
42
|
+
if (command === "verify") {
|
|
43
|
+
await runVerify(args.slice(1));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
37
46
|
await runCLI(command);
|
|
38
47
|
}
|
|
39
48
|
main().catch((err) => {
|
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,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;
|
|
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;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,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,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnC,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,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,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,21 +1,46 @@
|
|
|
1
1
|
import { confirm, select } from "@clack/prompts";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
2
|
+
// Builds the framework choices for one layer (web or api) from the registry, so
|
|
3
|
+
// adding a template is a registry edit, not a code change here. coming-soon
|
|
4
|
+
// templates show as disabled; beta templates are selectable but labelled.
|
|
5
|
+
function toOptions(templates, kind) {
|
|
6
|
+
const forKind = templates.filter((t) => t.kind === kind);
|
|
7
|
+
if (forKind.length === 0) {
|
|
8
|
+
throw new Error(`The template registry has no ${kind} templates.`);
|
|
9
|
+
}
|
|
10
|
+
return forKind.map((t) => ({
|
|
11
|
+
value: t.id,
|
|
12
|
+
label: t.status === "coming-soon"
|
|
13
|
+
? `${t.label} (coming soon)`
|
|
14
|
+
: t.status === "beta"
|
|
15
|
+
? `${t.label} (beta)`
|
|
16
|
+
: t.label,
|
|
17
|
+
disabled: t.status === "coming-soon",
|
|
18
18
|
}));
|
|
19
|
+
}
|
|
20
|
+
function labelFor(templates, id) {
|
|
21
|
+
return templates.find((t) => t.id === id)?.label ?? id;
|
|
22
|
+
}
|
|
23
|
+
export async function runProjectSetupPrompts(templates, preselect = {}) {
|
|
24
|
+
let webTemplateId = preselect.webTemplateId;
|
|
25
|
+
if (webTemplateId) {
|
|
26
|
+
console.log(`Web example: ${labelFor(templates, webTemplateId)}`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
webTemplateId = (await select({
|
|
30
|
+
message: "Web example",
|
|
31
|
+
options: toOptions(templates, "web"),
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
let apiTemplateId = preselect.apiTemplateId;
|
|
35
|
+
if (apiTemplateId) {
|
|
36
|
+
console.log(`Backend: ${labelFor(templates, apiTemplateId)}`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
apiTemplateId = (await select({
|
|
40
|
+
message: "Backend framework",
|
|
41
|
+
options: toOptions(templates, "api"),
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
19
44
|
const authMode = (await select({
|
|
20
45
|
message: "How would you like to run SeamlessAuth?",
|
|
21
46
|
options: [
|
|
@@ -49,7 +74,6 @@ export async function runProjectSetupPrompts() {
|
|
|
49
74
|
],
|
|
50
75
|
}));
|
|
51
76
|
}
|
|
52
|
-
let useDocker = true;
|
|
53
77
|
if (authMode === "local") {
|
|
54
78
|
const confirmDocker = await confirm({
|
|
55
79
|
message: "Auth server still requires Docker for full stack. Enable Docker?",
|
|
@@ -61,9 +85,9 @@ export async function runProjectSetupPrompts() {
|
|
|
61
85
|
}
|
|
62
86
|
return {
|
|
63
87
|
web: true,
|
|
64
|
-
|
|
88
|
+
webTemplateId,
|
|
65
89
|
api: true,
|
|
66
|
-
|
|
90
|
+
apiTemplateId,
|
|
67
91
|
authMode,
|
|
68
92
|
useDocker: true,
|
|
69
93
|
includeAdmin,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectSetup.js","sourceRoot":"","sources":["../../src/prompts/projectSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"projectSetup.js","sourceRoot":"","sources":["../../src/prompts/projectSetup.ts"],"names":[],"mappings":"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"}
|