seamless-cli 0.4.0 → 0.5.1
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/help.js +3 -1
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.js +39 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/core/images.js +1 -1
- package/dist/core/oauthProviders.js +89 -0
- package/dist/core/oauthProviders.js.map +1 -0
- package/dist/core/templates.js.map +1 -1
- package/dist/generators/auth/auth.js +4 -4
- package/dist/generators/auth/auth.js.map +1 -1
- package/dist/generators/docker/docker.js +31 -10
- package/dist/generators/docker/docker.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/prompts/oauthSetup.js +36 -0
- package/dist/prompts/oauthSetup.js.map +1 -0
- package/package.json +1 -1
- package/dist/commands/contribute.js +0 -121
- package/dist/commands/contribute.js.map +0 -1
- package/dist/commands/deploy.js +0 -190
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/destroy.js +0 -122
- package/dist/commands/destroy.js.map +0 -1
- package/dist/contributor/catalog.js +0 -129
- package/dist/contributor/catalog.js.map +0 -1
- package/dist/contributor/workspace.js +0 -551
- package/dist/contributor/workspace.js.map +0 -1
- package/dist/core/acm.js +0 -24
- package/dist/core/acm.js.map +0 -1
- package/dist/core/aws.js +0 -374
- package/dist/core/aws.js.map +0 -1
- package/dist/core/buildPush.js +0 -91
- package/dist/core/buildPush.js.map +0 -1
- package/dist/core/configure.js +0 -25
- package/dist/core/configure.js.map +0 -1
- package/dist/core/deployConfig.js +0 -66
- package/dist/core/deployConfig.js.map +0 -1
- package/dist/core/deployManifest.js +0 -163
- package/dist/core/deployManifest.js.map +0 -1
- package/dist/core/deploySecrets.js +0 -31
- package/dist/core/deploySecrets.js.map +0 -1
- package/dist/core/destroy.js +0 -38
- package/dist/core/destroy.js.map +0 -1
- package/dist/core/envDiscovery.js +0 -153
- package/dist/core/envDiscovery.js.map +0 -1
- package/dist/core/envRegistry.js +0 -76
- package/dist/core/envRegistry.js.map +0 -1
- package/dist/core/health.js +0 -11
- package/dist/core/health.js.map +0 -1
- package/dist/core/help.js +0 -75
- package/dist/core/help.js.map +0 -1
- package/dist/core/preReqs.js +0 -14
- package/dist/core/preReqs.js.map +0 -1
- package/dist/core/terraform.js +0 -34
- package/dist/core/terraform.js.map +0 -1
- package/dist/core/tfVars.js +0 -69
- package/dist/core/tfVars.js.map +0 -1
- package/dist/generators/backend/express.js +0 -13
- package/dist/generators/backend/express.js.map +0 -1
- package/dist/generators/deploy/aws/dev/files.js +0 -36
- package/dist/generators/deploy/aws/dev/files.js.map +0 -1
- package/dist/generators/deploy/aws/dev/template.js +0 -1240
- package/dist/generators/deploy/aws/dev/template.js.map +0 -1
- package/dist/generators/frontend/react.js +0 -13
- package/dist/generators/frontend/react.js.map +0 -1
- package/dist/prompts/contributeSetup.js +0 -39
- package/dist/prompts/contributeSetup.js.map +0 -1
- package/dist/prompts/deploySetup.js +0 -244
- package/dist/prompts/deploySetup.js.map +0 -1
- package/dist/utils/repoUtils.js +0 -23
- package/dist/utils/repoUtils.js.map +0 -1
package/dist/commands/help.js
CHANGED
|
@@ -31,6 +31,8 @@ COMMANDS
|
|
|
31
31
|
|
|
32
32
|
With an example flag (e.g. --oauth):
|
|
33
33
|
• Scaffolds that use-case starter and skips the web prompt
|
|
34
|
+
• --oauth also prompts for OIDC providers (Google, GitHub, Microsoft,
|
|
35
|
+
GitLab) and wires the ones you configure into the auth server
|
|
34
36
|
• Run an unknown flag to see the available examples
|
|
35
37
|
|
|
36
38
|
check
|
|
@@ -81,7 +83,7 @@ GETTING STARTED
|
|
|
81
83
|
|
|
82
84
|
WHAT YOU GET
|
|
83
85
|
|
|
84
|
-
• Web application (React starter)
|
|
86
|
+
• Web application (React starter, or a use-case example like --oauth)
|
|
85
87
|
• API server (Express)
|
|
86
88
|
• SeamlessAuth server (Docker or local)
|
|
87
89
|
• Admin dashboard (Docker or source)
|
|
@@ -1 +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;YACF,OAAO
|
|
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;YACF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoHlB,CAAC,CAAC;AACH,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -6,6 +6,7 @@ import { generateDockerCompose } from "../generators/docker/docker.js";
|
|
|
6
6
|
import { printSuccessOutput } from "../core/output.js";
|
|
7
7
|
import { generateSeamlessConfig } from "../generators/config/config.js";
|
|
8
8
|
import { applyTemplateEnv, assertCliSupports, openTemplateSource, } from "../core/templates.js";
|
|
9
|
+
import { runOAuthSetupPrompts } from "../prompts/oauthSetup.js";
|
|
9
10
|
const AUTH_SERVER_URL = "http://localhost:5312";
|
|
10
11
|
const API_URL = "http://localhost:3000";
|
|
11
12
|
export async function runCLI(projectName, aliases = []) {
|
|
@@ -36,27 +37,38 @@ export async function runCLI(projectName, aliases = []) {
|
|
|
36
37
|
}
|
|
37
38
|
return entry;
|
|
38
39
|
};
|
|
39
|
-
// Resolve the chosen templates
|
|
40
|
-
//
|
|
40
|
+
// Resolve the chosen templates (read manifests) before writing anything, so every
|
|
41
|
+
// prompt finishes before files are placed. Env wiring waits until the shared auth
|
|
42
|
+
// config (tokens, key id) exists below.
|
|
41
43
|
const selected = [];
|
|
42
44
|
for (const id of [answers.webTemplateId, answers.apiTemplateId]) {
|
|
43
45
|
const entry = findEntry(id);
|
|
44
46
|
const manifest = await source.readManifest(entry);
|
|
45
47
|
assertCliSupports(manifest, entry.label);
|
|
46
48
|
const dir = path.join(root, manifest.targetDir);
|
|
49
|
+
selected.push({ entry, manifest, dir });
|
|
50
|
+
}
|
|
51
|
+
// Templates can opt into OAuth setup (manifest setup.oauth). Collect providers now,
|
|
52
|
+
// before scaffolding, so the auth server can be wired up with them below.
|
|
53
|
+
const webSelection = selected.find((s) => s.entry.kind === "web");
|
|
54
|
+
let oauthProviders = [];
|
|
55
|
+
if (webSelection?.manifest.setup?.oauth) {
|
|
56
|
+
oauthProviders = await runOAuthSetupPrompts();
|
|
57
|
+
}
|
|
58
|
+
for (const { entry, dir } of selected) {
|
|
47
59
|
console.log(`Adding ${entry.label} starter...`);
|
|
48
60
|
await source.copyInto(entry, dir);
|
|
49
|
-
selected.push({ entry, manifest, dir });
|
|
50
61
|
}
|
|
51
62
|
let sharedConfig = {};
|
|
52
63
|
if (answers.authMode === "local") {
|
|
53
|
-
sharedConfig = await generateAuthServer({ root }, "local");
|
|
64
|
+
sharedConfig = await generateAuthServer({ root }, "local", oauthProviders);
|
|
54
65
|
}
|
|
55
66
|
if (answers.useDocker) {
|
|
56
67
|
const dockerShared = await generateDockerCompose(root, {
|
|
57
68
|
authMode: answers.authMode,
|
|
58
69
|
adminMode: answers.adminMode,
|
|
59
70
|
includeAdmin: answers.includeAdmin,
|
|
71
|
+
oauth: oauthProviders,
|
|
60
72
|
});
|
|
61
73
|
if (answers.authMode === "docker") {
|
|
62
74
|
sharedConfig = dockerShared;
|
|
@@ -88,6 +100,29 @@ export async function runCLI(projectName, aliases = []) {
|
|
|
88
100
|
authMode: answers.authMode,
|
|
89
101
|
useDocker: answers.useDocker,
|
|
90
102
|
});
|
|
103
|
+
printOAuthNextSteps(oauthProviders);
|
|
104
|
+
}
|
|
105
|
+
// Summarizes the OAuth wiring after scaffolding: which providers are ready and which
|
|
106
|
+
// still need credentials, plus the redirect URI to register with each provider.
|
|
107
|
+
function printOAuthNextSteps(providers) {
|
|
108
|
+
if (providers.length === 0)
|
|
109
|
+
return;
|
|
110
|
+
const ready = providers
|
|
111
|
+
.filter((p) => p.clientId && p.clientSecret)
|
|
112
|
+
.map((p) => p.catalog.label);
|
|
113
|
+
const pending = providers
|
|
114
|
+
.filter((p) => !p.clientId || !p.clientSecret)
|
|
115
|
+
.map((p) => p.catalog.label);
|
|
116
|
+
console.log("\nOAuth providers");
|
|
117
|
+
if (ready.length) {
|
|
118
|
+
console.log(` Enabled: ${ready.join(", ")}`);
|
|
119
|
+
}
|
|
120
|
+
if (pending.length) {
|
|
121
|
+
console.log(` Needs credentials before use: ${pending.join(", ")}`);
|
|
122
|
+
console.log(" Add the client id/secret in the auth environment (OAUTH_PROVIDERS and the");
|
|
123
|
+
console.log(' matching *_CLIENT_SECRET), then set that provider\'s "enabled" to true.');
|
|
124
|
+
}
|
|
125
|
+
console.log(" Register this redirect URI with each provider: http://localhost:5173/oauth/callback");
|
|
91
126
|
}
|
|
92
127
|
// Resolves `--<alias>` flags (e.g. --oauth) to specific templates from the registry,
|
|
93
128
|
// so a matching layer's prompt can be skipped. Aliases live in the registry, so no
|
|
@@ -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;AAEpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GAGnB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/core/images.js
CHANGED
|
@@ -7,5 +7,5 @@ export const SEAMLESS_AUTH_ADMIN_DASHBOARD_IMAGE = `ghcr.io/fells-code/seamless-
|
|
|
7
7
|
// CLI version always produces the same project. Override the ref with
|
|
8
8
|
// SEAMLESS_TEMPLATES_REF, or point at a local checkout with SEAMLESS_TEMPLATES_DIR.
|
|
9
9
|
export const SEAMLESS_TEMPLATES_REPO = "fells-code/seamless-templates";
|
|
10
|
-
export const SEAMLESS_TEMPLATES_REF = "v0.2.
|
|
10
|
+
export const SEAMLESS_TEMPLATES_REF = "v0.2.2";
|
|
11
11
|
//# sourceMappingURL=images.js.map
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { generateSecret } from "./secrets.js";
|
|
2
|
+
// The web app's OAuth callback route. The scaffolded web container serves the app
|
|
3
|
+
// at :5173, and the react-oauth template redirects to /oauth/callback there.
|
|
4
|
+
const REDIRECT_URI = "http://localhost:5173/oauth/callback";
|
|
5
|
+
export const OAUTH_PROVIDER_CATALOG = [
|
|
6
|
+
{
|
|
7
|
+
id: "google",
|
|
8
|
+
label: "Google",
|
|
9
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
10
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
11
|
+
userInfoUrl: "https://openidconnect.googleapis.com/v1/userinfo",
|
|
12
|
+
scopes: ["openid", "email", "profile"],
|
|
13
|
+
pkce: true,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "github",
|
|
17
|
+
label: "GitHub",
|
|
18
|
+
authorizationUrl: "https://github.com/login/oauth/authorize",
|
|
19
|
+
tokenUrl: "https://github.com/login/oauth/access_token",
|
|
20
|
+
userInfoUrl: "https://api.github.com/user",
|
|
21
|
+
scopes: ["read:user", "user:email"],
|
|
22
|
+
extra: { subjectJsonPath: "id", nameJsonPath: "name" },
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "microsoft",
|
|
26
|
+
label: "Microsoft",
|
|
27
|
+
authorizationUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
|
|
28
|
+
tokenUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/token",
|
|
29
|
+
userInfoUrl: "https://graph.microsoft.com/oidc/userinfo",
|
|
30
|
+
scopes: ["openid", "email", "profile"],
|
|
31
|
+
pkce: true,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "gitlab",
|
|
35
|
+
label: "GitLab",
|
|
36
|
+
authorizationUrl: "https://gitlab.com/oauth/authorize",
|
|
37
|
+
tokenUrl: "https://gitlab.com/oauth/token",
|
|
38
|
+
userInfoUrl: "https://gitlab.com/oauth/userinfo",
|
|
39
|
+
scopes: ["openid", "email", "profile"],
|
|
40
|
+
pkce: true,
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
function secretEnvName(id) {
|
|
44
|
+
return `${id.toUpperCase().replace(/-/g, "_")}_CLIENT_SECRET`;
|
|
45
|
+
}
|
|
46
|
+
// Turns the chosen providers into the auth-server env: the OAUTH_PROVIDERS JSON, a
|
|
47
|
+
// per-provider client-secret env var, and OAUTH_STATE_SECRET. A provider missing
|
|
48
|
+
// either credential is scaffolded disabled (so the stack still boots) and reported
|
|
49
|
+
// in `pending` so the CLI can tell the user what to fill in.
|
|
50
|
+
export function buildOAuthAuthEnv(providers) {
|
|
51
|
+
const env = {};
|
|
52
|
+
const pending = [];
|
|
53
|
+
const configs = providers.map(({ catalog, clientId, clientSecret }) => {
|
|
54
|
+
const envName = secretEnvName(catalog.id);
|
|
55
|
+
const ready = clientId.length > 0 && clientSecret.length > 0;
|
|
56
|
+
if (!ready)
|
|
57
|
+
pending.push(catalog.label);
|
|
58
|
+
env[envName] = clientSecret;
|
|
59
|
+
return {
|
|
60
|
+
id: catalog.id,
|
|
61
|
+
name: catalog.label,
|
|
62
|
+
enabled: ready,
|
|
63
|
+
clientId: clientId || `REPLACE_WITH_${catalog.id.toUpperCase()}_CLIENT_ID`,
|
|
64
|
+
clientSecretEnv: envName,
|
|
65
|
+
authorizationUrl: catalog.authorizationUrl,
|
|
66
|
+
tokenUrl: catalog.tokenUrl,
|
|
67
|
+
userInfoUrl: catalog.userInfoUrl,
|
|
68
|
+
scopes: catalog.scopes,
|
|
69
|
+
redirectUri: REDIRECT_URI,
|
|
70
|
+
redirectUris: [REDIRECT_URI],
|
|
71
|
+
...(catalog.pkce ? { pkce: true } : {}),
|
|
72
|
+
...(catalog.extra ?? {}),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
env.OAUTH_PROVIDERS = JSON.stringify(configs);
|
|
76
|
+
env.OAUTH_STATE_SECRET = generateSecret(32);
|
|
77
|
+
return { env, pending };
|
|
78
|
+
}
|
|
79
|
+
// Ensures a login method is present in a comma-separated LOGIN_METHODS value.
|
|
80
|
+
export function withLoginMethod(current, method) {
|
|
81
|
+
const methods = (current ?? "passkey,magic_link")
|
|
82
|
+
.split(",")
|
|
83
|
+
.map((m) => m.trim())
|
|
84
|
+
.filter(Boolean);
|
|
85
|
+
if (!methods.includes(method))
|
|
86
|
+
methods.push(method);
|
|
87
|
+
return methods.join(",");
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=oauthProviders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthProviders.js","sourceRoot":"","sources":["../../src/core/oauthProviders.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,MAAM,MAAM,SAAS,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,19 +6,19 @@ import { fetchEnvExample } from "../../core/fetch.js";
|
|
|
6
6
|
import { POSTGRES_IMAGE, SEAMLESS_AUTH_API_IMAGE } from "../../core/images.js";
|
|
7
7
|
import { buildAuthEnv, configureAuthLocalEnv, envToDockerBlock, } from "../docker/docker.js";
|
|
8
8
|
const AUTH_REPO = "https://github.com/fells-code/seamless-auth-api";
|
|
9
|
-
export async function generateAuthServer(context, mode) {
|
|
9
|
+
export async function generateAuthServer(context, mode, oauth = []) {
|
|
10
10
|
const { root } = context;
|
|
11
11
|
if (mode === "local") {
|
|
12
|
-
return await setupLocalAuth(root);
|
|
12
|
+
return await setupLocalAuth(root, oauth);
|
|
13
13
|
}
|
|
14
14
|
return await setupDockerAuth(root);
|
|
15
15
|
}
|
|
16
|
-
async function setupLocalAuth(root) {
|
|
16
|
+
async function setupLocalAuth(root, oauth = []) {
|
|
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
|
-
const shared = await configureAuthLocalEnv(root);
|
|
21
|
+
const shared = await configureAuthLocalEnv(root, oauth);
|
|
22
22
|
console.log("Auth server ready in /auth");
|
|
23
23
|
return shared;
|
|
24
24
|
}
|
|
@@ -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,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;
|
|
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;AAG7B,MAAM,SAAS,GAAG,iDAAiD,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAY,EACZ,IAAiC,EACjC,QAAkC,EAAE;IAEpC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,MAAM,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,QAAkC,EAAE;IAC9E,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,EAAE,KAAK,CAAC,CAAC;IAExD,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"}
|
|
@@ -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 { buildOAuthAuthEnv, withLoginMethod, } from "../../core/oauthProviders.js";
|
|
7
8
|
import { POSTGRES_IMAGE, SEAMLESS_AUTH_ADMIN_DASHBOARD_IMAGE, SEAMLESS_AUTH_API_IMAGE, } from "../../core/images.js";
|
|
8
9
|
export async function generateDockerCompose(root, options) {
|
|
9
10
|
const { compose, shared } = await buildCompose(options, root);
|
|
@@ -12,8 +13,8 @@ export async function generateDockerCompose(root, options) {
|
|
|
12
13
|
return shared;
|
|
13
14
|
}
|
|
14
15
|
async function buildCompose(options, root) {
|
|
15
|
-
const { authMode, adminMode, includeAdmin } = options;
|
|
16
|
-
const { service: authBlock, shared } = await authService(authMode, root);
|
|
16
|
+
const { authMode, adminMode, includeAdmin, oauth } = options;
|
|
17
|
+
const { service: authBlock, shared } = await authService(authMode, root, oauth);
|
|
17
18
|
return {
|
|
18
19
|
compose: `
|
|
19
20
|
services:
|
|
@@ -48,9 +49,12 @@ volumes:
|
|
|
48
49
|
shared,
|
|
49
50
|
};
|
|
50
51
|
}
|
|
51
|
-
async function authService(mode, root) {
|
|
52
|
+
async function authService(mode, root, oauth = []) {
|
|
52
53
|
if (mode === "local") {
|
|
53
|
-
|
|
54
|
+
// auth/.env was already written by generateAuthServer (with its secrets and any
|
|
55
|
+
// OAuth config). Read those values back rather than regenerating, which would mint
|
|
56
|
+
// a new API_SERVICE_TOKEN that no longer matches the one the API was given.
|
|
57
|
+
const shared = extractSharedFromExistingEnv(root);
|
|
54
58
|
return {
|
|
55
59
|
service: `
|
|
56
60
|
auth:
|
|
@@ -75,7 +79,7 @@ async function authService(mode, root) {
|
|
|
75
79
|
shared,
|
|
76
80
|
};
|
|
77
81
|
}
|
|
78
|
-
return await authServiceDocker();
|
|
82
|
+
return await authServiceDocker(oauth);
|
|
79
83
|
}
|
|
80
84
|
function apiService(shared) {
|
|
81
85
|
return `
|
|
@@ -116,12 +120,17 @@ function webService() {
|
|
|
116
120
|
- /app/node_modules
|
|
117
121
|
depends_on:
|
|
118
122
|
- api
|
|
123
|
+
healthcheck:
|
|
124
|
+
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost/health"]
|
|
125
|
+
interval: 5s
|
|
126
|
+
timeout: 5s
|
|
127
|
+
retries: 10
|
|
119
128
|
`;
|
|
120
129
|
}
|
|
121
|
-
async function authServiceDocker() {
|
|
130
|
+
async function authServiceDocker(oauth = []) {
|
|
122
131
|
const raw = await fetchEnvExample();
|
|
123
132
|
const parsed = parseEnvString(raw);
|
|
124
|
-
const { env, shared } = buildAuthEnv(parsed, "docker");
|
|
133
|
+
const { env, shared } = buildAuthEnv(parsed, "docker", oauth);
|
|
125
134
|
const envBlock = envToDockerBlock(env);
|
|
126
135
|
return {
|
|
127
136
|
service: `
|
|
@@ -169,7 +178,7 @@ function adminService(mode) {
|
|
|
169
178
|
- api
|
|
170
179
|
`;
|
|
171
180
|
}
|
|
172
|
-
export function buildAuthEnv(env, mode) {
|
|
181
|
+
export function buildAuthEnv(env, mode, oauth = []) {
|
|
173
182
|
const apiToken = generateSecret(32);
|
|
174
183
|
const bootstrapSecret = generateSecret(32);
|
|
175
184
|
const kid = "dev-main";
|
|
@@ -183,8 +192,20 @@ export function buildAuthEnv(env, mode) {
|
|
|
183
192
|
env.DB_HOST = mode === "docker" ? "db" : "localhost";
|
|
184
193
|
env.DB_PORT = "5432";
|
|
185
194
|
env.API_SERVICE_TOKEN = apiToken;
|
|
195
|
+
// Dedicated secrets the auth server otherwise leaves empty (falling back to the
|
|
196
|
+
// service token). Generate real ones so a scaffolded stack is production-shaped.
|
|
197
|
+
env.REFRESH_TOKEN_LOOKUP_SECRET = generateSecret(32);
|
|
198
|
+
env.TOTP_SECRET_ENCRYPTION_KEY = generateSecret(32);
|
|
186
199
|
env.APP_ORIGINS = "http://localhost:3000";
|
|
187
200
|
env.ORIGINS = "http://localhost:5173,http://localhost:5174";
|
|
201
|
+
// When the OAuth template collected providers, wire them into the auth server
|
|
202
|
+
// (OAUTH_PROVIDERS, per-provider secret env vars, OAUTH_STATE_SECRET) and enable
|
|
203
|
+
// the oauth login method.
|
|
204
|
+
if (oauth.length > 0) {
|
|
205
|
+
const { env: oauthEnv } = buildOAuthAuthEnv(oauth);
|
|
206
|
+
Object.assign(env, oauthEnv);
|
|
207
|
+
env.LOGIN_METHODS = withLoginMethod(env.LOGIN_METHODS, "oauth");
|
|
208
|
+
}
|
|
188
209
|
return {
|
|
189
210
|
env,
|
|
190
211
|
shared: {
|
|
@@ -228,7 +249,7 @@ export function buildJWKSConfig() {
|
|
|
228
249
|
}, null, 2),
|
|
229
250
|
};
|
|
230
251
|
}
|
|
231
|
-
export async function configureAuthLocalEnv(root) {
|
|
252
|
+
export async function configureAuthLocalEnv(root, oauth = []) {
|
|
232
253
|
const authDir = path.join(root, "auth");
|
|
233
254
|
const envExamplePath = path.join(authDir, ".env.example");
|
|
234
255
|
const envPath = path.join(authDir, ".env");
|
|
@@ -237,7 +258,7 @@ export async function configureAuthLocalEnv(root) {
|
|
|
237
258
|
}
|
|
238
259
|
const raw = fs.readFileSync(envExamplePath, "utf-8");
|
|
239
260
|
const parsed = parseEnvString(raw);
|
|
240
|
-
const { env, shared } = buildAuthEnv(parsed, "local");
|
|
261
|
+
const { env, shared } = buildAuthEnv(parsed, "local", oauth);
|
|
241
262
|
writeEnvFile(envPath, env);
|
|
242
263
|
return shared;
|
|
243
264
|
}
|
|
@@ -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;AAClD,OAAO,EACL,cAAc,EACd,mCAAmC,EACnC,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/generators/docker/docker.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { multiselect, password, text } from "@clack/prompts";
|
|
2
|
+
import { OAUTH_PROVIDER_CATALOG, } from "../core/oauthProviders.js";
|
|
3
|
+
// Runs when the selected web template opts into OAuth setup. Lets the user pick
|
|
4
|
+
// providers and paste each one's client id and secret, so the scaffolded auth
|
|
5
|
+
// server has OAuth working right after `docker compose up`. Blank credentials are
|
|
6
|
+
// allowed (the provider is scaffolded disabled for the user to fill in later).
|
|
7
|
+
export async function runOAuthSetupPrompts() {
|
|
8
|
+
const chosen = (await multiselect({
|
|
9
|
+
message: "Which OAuth providers do you want to enable? (space to select)",
|
|
10
|
+
options: OAUTH_PROVIDER_CATALOG.map((p) => ({ value: p.id, label: p.label })),
|
|
11
|
+
required: false,
|
|
12
|
+
}));
|
|
13
|
+
if (!Array.isArray(chosen) || chosen.length === 0) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const collected = [];
|
|
17
|
+
for (const id of chosen) {
|
|
18
|
+
const catalog = OAUTH_PROVIDER_CATALOG.find((p) => p.id === id);
|
|
19
|
+
if (!catalog)
|
|
20
|
+
continue;
|
|
21
|
+
const clientId = (await text({
|
|
22
|
+
message: `${catalog.label} client ID`,
|
|
23
|
+
placeholder: "leave blank to configure later",
|
|
24
|
+
}));
|
|
25
|
+
const clientSecret = (await password({
|
|
26
|
+
message: `${catalog.label} client secret`,
|
|
27
|
+
}));
|
|
28
|
+
collected.push({
|
|
29
|
+
catalog,
|
|
30
|
+
clientId: (clientId ?? "").trim(),
|
|
31
|
+
clientSecret: (clientSecret ?? "").trim(),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return collected;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=oauthSetup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthSetup.js","sourceRoot":"","sources":["../../src/prompts/oauthSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EACL,sBAAsB,GAEvB,MAAM,2BAA2B,CAAC;AAEnC,gFAAgF;AAChF,8EAA8E;AAC9E,kFAAkF;AAClF,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,MAAM,GAAG,CAAC,MAAM,WAAW,CAAC;QAChC,OAAO,EAAE,gEAAgE;QACzE,OAAO,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7E,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAa,CAAC;IAEhB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAA6B,EAAE,CAAC;IAE/C,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC;YAC3B,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,YAAY;YACrC,WAAW,EAAE,gCAAgC;SAC9C,CAAC,CAAW,CAAC;QAEd,MAAM,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC;YACnC,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,gBAAgB;SAC1C,CAAC,CAAW,CAAC;QAEd,SAAS,CAAC,IAAI,CAAC;YACb,OAAO;YACP,QAAQ,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACjC,YAAY,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import path from "path";
|
|
3
|
-
import kleur from "kleur";
|
|
4
|
-
import * as p from "@clack/prompts";
|
|
5
|
-
import { CONTRIBUTOR_COMPONENTS, formatPublicRef, resolveCloneSource, resolveWorkspaceDir, } from "../contributor/catalog.js";
|
|
6
|
-
import { configureContributorWorkspace } from "../contributor/workspace.js";
|
|
7
|
-
import { runContributorSetupPrompts } from "../prompts/contributeSetup.js";
|
|
8
|
-
import { cloneRepo } from "../utils/repoUtils.js";
|
|
9
|
-
import { runCommand } from "../core/exec.js";
|
|
10
|
-
const WORKSPACE_MANIFEST = "seamless.workspace.json";
|
|
11
|
-
export async function runContributeCommand(args) {
|
|
12
|
-
const subcommand = args[0] ?? "setup";
|
|
13
|
-
if (subcommand === "setup") {
|
|
14
|
-
await runContributorSetup(args[1]);
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
if (subcommand === "start") {
|
|
18
|
-
await runContributorStart();
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
throw new Error(`Unknown contribute subcommand: ${subcommand}`);
|
|
22
|
-
}
|
|
23
|
-
async function runContributorSetup(initialWorkspaceName) {
|
|
24
|
-
p.intro(kleur.cyan("Seamless Contributor Setup"));
|
|
25
|
-
const answers = await runContributorSetupPrompts(initialWorkspaceName);
|
|
26
|
-
const workspaceRoot = path.resolve(process.cwd(), answers.workspaceName);
|
|
27
|
-
ensureWorkspaceRoot(workspaceRoot);
|
|
28
|
-
const manifest = {
|
|
29
|
-
version: 1,
|
|
30
|
-
createdAt: new Date().toISOString(),
|
|
31
|
-
packageManager: "npm",
|
|
32
|
-
workspaceRoot,
|
|
33
|
-
components: [],
|
|
34
|
-
};
|
|
35
|
-
for (const component of CONTRIBUTOR_COMPONENTS) {
|
|
36
|
-
const mode = answers.localComponents.includes(component.id)
|
|
37
|
-
? "local"
|
|
38
|
-
: "public";
|
|
39
|
-
const workspaceDir = resolveWorkspaceDir(component, mode);
|
|
40
|
-
const localPath = mode === "local" || component.publicSurface === "github-repo"
|
|
41
|
-
? path.join(workspaceRoot, workspaceDir)
|
|
42
|
-
: undefined;
|
|
43
|
-
if (localPath) {
|
|
44
|
-
const cloneSource = resolveCloneSource(component);
|
|
45
|
-
await cloneRepo(cloneSource, localPath);
|
|
46
|
-
}
|
|
47
|
-
manifest.components.push({
|
|
48
|
-
id: component.id,
|
|
49
|
-
mode,
|
|
50
|
-
publicSurface: component.publicSurface,
|
|
51
|
-
publicRef: component.publicRef,
|
|
52
|
-
gitUrl: component.gitUrl,
|
|
53
|
-
localPath,
|
|
54
|
-
localPackages: component.localPackages,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
const configuredManifest = configureContributorWorkspace(workspaceRoot, manifest);
|
|
58
|
-
fs.mkdirSync(workspaceRoot, { recursive: true });
|
|
59
|
-
fs.writeFileSync(path.join(workspaceRoot, WORKSPACE_MANIFEST), JSON.stringify(configuredManifest, null, 2) + "\n");
|
|
60
|
-
printContributorSetupOutput(workspaceRoot, configuredManifest);
|
|
61
|
-
p.outro(kleur.green("Contributor workspace provisioned"));
|
|
62
|
-
}
|
|
63
|
-
async function runContributorStart() {
|
|
64
|
-
const workspaceRoot = process.cwd();
|
|
65
|
-
const manifestPath = path.join(workspaceRoot, WORKSPACE_MANIFEST);
|
|
66
|
-
if (!fs.existsSync(manifestPath)) {
|
|
67
|
-
throw new Error(`Contributor manifest not found in current directory: ${WORKSPACE_MANIFEST}`);
|
|
68
|
-
}
|
|
69
|
-
await runCommand("docker", ["compose", "up", "--build"], workspaceRoot);
|
|
70
|
-
}
|
|
71
|
-
function ensureWorkspaceRoot(workspaceRoot) {
|
|
72
|
-
if (!fs.existsSync(workspaceRoot)) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
const contents = fs.readdirSync(workspaceRoot);
|
|
76
|
-
if (contents.length > 0) {
|
|
77
|
-
throw new Error(`Workspace directory is not empty: ${workspaceRoot}`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
function printContributorSetupOutput(workspaceRoot, manifest) {
|
|
81
|
-
console.log("");
|
|
82
|
-
console.log(kleur.bold("Workspace"));
|
|
83
|
-
console.log(` ${kleur.white("Directory:")} ${workspaceRoot}`);
|
|
84
|
-
console.log(` ${kleur.white("Manifest:")} ${WORKSPACE_MANIFEST}`);
|
|
85
|
-
console.log(` ${kleur.white("Package manager:")} npm`);
|
|
86
|
-
console.log(` ${kleur.white("Docker Compose:")} ${manifest.docker?.composeFile ?? "docker-compose.yml"}`);
|
|
87
|
-
console.log("");
|
|
88
|
-
console.log(kleur.bold("Component plan"));
|
|
89
|
-
for (const component of manifest.components) {
|
|
90
|
-
const modeLabel = component.mode === "local"
|
|
91
|
-
? kleur.green("local source")
|
|
92
|
-
: kleur.cyan(`public ${component.publicSurface}`);
|
|
93
|
-
console.log(` • ${component.id} ${kleur.dim(`(${modeLabel})`)}`);
|
|
94
|
-
if (component.localPath) {
|
|
95
|
-
const relativePath = path.relative(workspaceRoot, component.localPath);
|
|
96
|
-
console.log(` path: ${relativePath || "."}`);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
console.log(` source: ${formatPublicRef(component.publicRef)}`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (manifest.packageLinks && manifest.packageLinks.length > 0) {
|
|
103
|
-
console.log("");
|
|
104
|
-
console.log(kleur.bold("Local package links"));
|
|
105
|
-
for (const link of manifest.packageLinks) {
|
|
106
|
-
console.log(` • ${link.consumerComponentId} uses ${link.packageName} from ${link.targetPath}`);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (manifest.warnings && manifest.warnings.length > 0) {
|
|
110
|
-
console.log("");
|
|
111
|
-
console.log(kleur.bold("Warnings"));
|
|
112
|
-
for (const warning of manifest.warnings) {
|
|
113
|
-
console.log(` • ${kleur.yellow(warning)}`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
console.log("");
|
|
117
|
-
console.log(kleur.bold("Next step"));
|
|
118
|
-
console.log(` cd ${workspaceRoot}`);
|
|
119
|
-
console.log(" docker compose up --build");
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=contribute.js.map
|