create-authenik8-app 2.4.12 → 2.4.13
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 +160 -57
- package/assets/logo.svg +53 -0
- package/dist/src/bin/index.js +199 -125
- package/dist/src/bin/index.js.map +1 -1
- package/dist/src/lib/args.d.ts +18 -0
- package/dist/src/lib/args.d.ts.map +1 -0
- package/dist/src/lib/args.js +82 -0
- package/dist/src/lib/args.js.map +1 -0
- package/dist/src/lib/constants.d.ts +1 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +10 -11
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/preflight.d.ts +3 -0
- package/dist/src/lib/preflight.d.ts.map +1 -0
- package/dist/src/lib/preflight.js +21 -0
- package/dist/src/lib/preflight.js.map +1 -0
- package/dist/src/lib/process.d.ts +6 -2
- package/dist/src/lib/process.d.ts.map +1 -1
- package/dist/src/lib/process.js +66 -8
- package/dist/src/lib/process.js.map +1 -1
- package/dist/src/lib/projectName.d.ts +2 -0
- package/dist/src/lib/projectName.d.ts.map +1 -0
- package/dist/src/lib/projectName.js +6 -0
- package/dist/src/lib/projectName.js.map +1 -0
- package/dist/src/lib/schemas.d.ts +192 -0
- package/dist/src/lib/schemas.d.ts.map +1 -0
- package/dist/src/lib/schemas.js +171 -0
- package/dist/src/lib/schemas.js.map +1 -0
- package/dist/src/lib/state.d.ts.map +1 -1
- package/dist/src/lib/state.js +20 -3
- package/dist/src/lib/state.js.map +1 -1
- package/dist/src/lib/types.d.ts +6 -13
- package/dist/src/lib/types.d.ts.map +1 -1
- package/dist/src/lib/ui.d.ts +8 -3
- package/dist/src/lib/ui.d.ts.map +1 -1
- package/dist/src/lib/ui.js +76 -112
- package/dist/src/lib/ui.js.map +1 -1
- package/dist/src/steps/configurePrisma.d.ts.map +1 -1
- package/dist/src/steps/configurePrisma.js +83 -9
- package/dist/src/steps/configurePrisma.js.map +1 -1
- package/dist/src/steps/createProject.d.ts +2 -1
- package/dist/src/steps/createProject.d.ts.map +1 -1
- package/dist/src/steps/createProject.js +149 -28
- package/dist/src/steps/createProject.js.map +1 -1
- package/dist/src/steps/finalSetup.d.ts +3 -3
- package/dist/src/steps/finalSetup.d.ts.map +1 -1
- package/dist/src/steps/finalSetup.js +24 -28
- package/dist/src/steps/finalSetup.js.map +1 -1
- package/dist/src/steps/installAuth.d.ts +1 -1
- package/dist/src/steps/installAuth.d.ts.map +1 -1
- package/dist/src/steps/installAuth.js +5 -4
- package/dist/src/steps/installAuth.js.map +1 -1
- package/dist/src/steps/installDeps.d.ts +11 -4
- package/dist/src/steps/installDeps.d.ts.map +1 -1
- package/dist/src/steps/installDeps.js +45 -77
- package/dist/src/steps/installDeps.js.map +1 -1
- package/dist/src/steps/prompts.d.ts +1 -1
- package/dist/src/steps/prompts.d.ts.map +1 -1
- package/dist/src/steps/prompts.js +42 -30
- package/dist/src/steps/prompts.js.map +1 -1
- package/dist/src/utils/jwk.d.ts +2 -0
- package/dist/src/utils/jwk.d.ts.map +1 -0
- package/dist/src/utils/jwk.js +44 -0
- package/dist/src/utils/jwk.js.map +1 -0
- package/dist/src/utils/output.d.ts +1 -1
- package/dist/src/utils/output.d.ts.map +1 -1
- package/dist/src/utils/output.js +75 -68
- package/dist/src/utils/output.js.map +1 -1
- package/package.json +17 -9
- package/templates/AGENT_IDENTITY.md +112 -0
- package/templates/THREAT_MODEL.md +27 -5
- package/templates/express-auth/README.md +13 -10
- package/templates/express-auth/docker-compose.yml +10 -0
- package/templates/express-auth/gitignore.template +6 -0
- package/templates/express-auth/package.json +13 -6
- package/templates/express-auth/src/app.ts +2 -0
- package/templates/express-auth/src/controllers/auth.controller.ts +2 -6
- package/templates/express-auth/src/controllers/protected.controller.ts +25 -10
- package/templates/express-auth/src/middleware/auth.middleware.ts +1 -0
- package/templates/express-auth/src/routes/protected.routes.ts +3 -1
- package/templates/express-auth/src/server.ts +6 -12
- package/templates/express-auth/src/utils/security.ts +119 -32
- package/templates/express-auth+/README.md +13 -10
- package/templates/express-auth+/docker-compose.yml +10 -0
- package/templates/express-auth+/gitignore.template +6 -0
- package/templates/express-auth+/package.json +12 -5
- package/templates/express-auth+/src/auth/auth.ts +3 -2
- package/templates/express-auth+/src/auth/controllers/password.controller.ts +3 -7
- package/templates/express-auth+/src/auth/controllers/protected.controller.ts +26 -11
- package/templates/express-auth+/src/auth/identity.adapter.ts +90 -0
- package/templates/express-auth+/src/auth/middleware/auth.middleware.ts +3 -4
- package/templates/express-auth+/src/auth/routes/protected.routes.ts +2 -2
- package/templates/express-auth+/src/oauth-providers/github/src/auth/auth.ts +3 -2
- package/templates/express-auth+/src/oauth-providers/google/src/auth/auth.ts +3 -2
- package/templates/express-auth+/src/oauth-providers/google-github/src/auth/auth.ts +3 -2
- package/templates/express-auth+/src/server.ts +5 -10
- package/templates/express-auth+/src/utils/security.ts +109 -28
- package/templates/express-base/README.md +13 -6
- package/templates/express-base/app.ts +2 -0
- package/templates/express-base/controllers/base.controller.ts +33 -19
- package/templates/express-base/docker-compose.yml +10 -0
- package/templates/express-base/gitignore.template +6 -0
- package/templates/express-base/package.json +11 -5
- package/templates/express-base/routes/base.routes.ts +1 -1
- package/templates/express-base/src/.env.example +7 -2
- package/templates/express-base/src/server.ts +6 -12
- package/templates/express-base/tsconfig.json +7 -40
- package/templates/express-base/utils/security.ts +111 -15
- package/templates/fullstack/.env.example +24 -0
- package/templates/fullstack/PRESET_CONTRACT.md +46 -0
- package/templates/fullstack/README.md +65 -0
- package/templates/fullstack/THREAT_MODEL.md +30 -0
- package/templates/fullstack/apps/api/package.json +48 -0
- package/templates/fullstack/apps/api/prisma/schema.prisma +124 -0
- package/templates/fullstack/apps/api/prisma/seed.ts +36 -0
- package/templates/fullstack/apps/api/prisma.config.ts +18 -0
- package/templates/fullstack/apps/api/src/app.ts +68 -0
- package/templates/fullstack/apps/api/src/auth/auth.controller.ts +125 -0
- package/templates/fullstack/apps/api/src/auth/auth.routes.ts +50 -0
- package/templates/fullstack/apps/api/src/auth/auth.service.ts +257 -0
- package/templates/fullstack/apps/api/src/auth/authenik8.ts +67 -0
- package/templates/fullstack/apps/api/src/auth/cookies.ts +36 -0
- package/templates/fullstack/apps/api/src/config/env.ts +72 -0
- package/templates/fullstack/apps/api/src/config/logger.ts +17 -0
- package/templates/fullstack/apps/api/src/config/mailer.ts +32 -0
- package/templates/fullstack/apps/api/src/config/origins.ts +27 -0
- package/templates/fullstack/apps/api/src/config/prisma.ts +9 -0
- package/templates/fullstack/apps/api/src/middleware/authenticate.ts +35 -0
- package/templates/fullstack/apps/api/src/middleware/csrf.ts +60 -0
- package/templates/fullstack/apps/api/src/middleware/origin.ts +12 -0
- package/templates/fullstack/apps/api/src/middleware/request-id.ts +9 -0
- package/templates/fullstack/apps/api/src/modules/admin/admin.controller.ts +17 -0
- package/templates/fullstack/apps/api/src/modules/admin/admin.routes.ts +14 -0
- package/templates/fullstack/apps/api/src/modules/admin/admin.service.ts +54 -0
- package/templates/fullstack/apps/api/src/modules/projects/project.controller.ts +22 -0
- package/templates/fullstack/apps/api/src/modules/projects/project.policy.ts +14 -0
- package/templates/fullstack/apps/api/src/modules/projects/project.repository.ts +20 -0
- package/templates/fullstack/apps/api/src/modules/projects/project.routes.ts +21 -0
- package/templates/fullstack/apps/api/src/modules/projects/project.service.ts +41 -0
- package/templates/fullstack/apps/api/src/modules/users/user.controller.ts +26 -0
- package/templates/fullstack/apps/api/src/modules/users/user.presenter.ts +13 -0
- package/templates/fullstack/apps/api/src/modules/users/user.routes.ts +21 -0
- package/templates/fullstack/apps/api/src/modules/users/user.service.ts +71 -0
- package/templates/fullstack/apps/api/src/openapi.ts +32 -0
- package/templates/fullstack/apps/api/src/server.ts +29 -0
- package/templates/fullstack/apps/api/src/types.ts +15 -0
- package/templates/fullstack/apps/api/src/utils/crypto.ts +4 -0
- package/templates/fullstack/apps/api/src/utils/http.ts +33 -0
- package/templates/fullstack/apps/api/src/utils/sealed-value.ts +37 -0
- package/templates/fullstack/apps/api/tests/project.policy.test.ts +26 -0
- package/templates/fullstack/apps/api/tests/registration.test.ts +69 -0
- package/templates/fullstack/apps/api/tests/security.test.ts +98 -0
- package/templates/fullstack/apps/api/tests/validation.test.ts +37 -0
- package/templates/fullstack/apps/api/tsconfig.json +16 -0
- package/templates/fullstack/apps/api/vitest.config.ts +9 -0
- package/templates/fullstack/apps/web/index.html +14 -0
- package/templates/fullstack/apps/web/package.json +31 -0
- package/templates/fullstack/apps/web/public/authenik8-logo.svg +53 -0
- package/templates/fullstack/apps/web/src/App.tsx +45 -0
- package/templates/fullstack/apps/web/src/auth/AuthProvider.tsx +53 -0
- package/templates/fullstack/apps/web/src/auth/RouteGuards.tsx +16 -0
- package/templates/fullstack/apps/web/src/auth/providers.ts +3 -0
- package/templates/fullstack/apps/web/src/components/AppShell.tsx +80 -0
- package/templates/fullstack/apps/web/src/components/AuthShell.tsx +26 -0
- package/templates/fullstack/apps/web/src/components/Page.tsx +30 -0
- package/templates/fullstack/apps/web/src/features/projects/ProjectPages.tsx +79 -0
- package/templates/fullstack/apps/web/src/main.tsx +24 -0
- package/templates/fullstack/apps/web/src/pages/DashboardPage.tsx +48 -0
- package/templates/fullstack/apps/web/src/pages/StatusPages.tsx +8 -0
- package/templates/fullstack/apps/web/src/pages/admin/AuditPage.tsx +19 -0
- package/templates/fullstack/apps/web/src/pages/admin/UsersPage.tsx +24 -0
- package/templates/fullstack/apps/web/src/pages/auth/LoginPage.tsx +51 -0
- package/templates/fullstack/apps/web/src/pages/auth/OAuthCallbackPage.tsx +26 -0
- package/templates/fullstack/apps/web/src/pages/auth/RecoveryPages.tsx +53 -0
- package/templates/fullstack/apps/web/src/pages/auth/RegisterPage.tsx +86 -0
- package/templates/fullstack/apps/web/src/pages/auth/VerifyEmailPage.tsx +24 -0
- package/templates/fullstack/apps/web/src/pages/settings/ProfilePage.tsx +34 -0
- package/templates/fullstack/apps/web/src/pages/settings/SecurityPage.tsx +57 -0
- package/templates/fullstack/apps/web/src/styles.css +289 -0
- package/templates/fullstack/apps/web/src/token-storage.test.ts +12 -0
- package/templates/fullstack/apps/web/tsconfig.app.json +19 -0
- package/templates/fullstack/apps/web/tsconfig.json +7 -0
- package/templates/fullstack/apps/web/tsconfig.node.json +10 -0
- package/templates/fullstack/apps/web/vite.config.ts +18 -0
- package/templates/fullstack/docker-compose.yml +35 -0
- package/templates/fullstack/docs/PRODUCTION.md +30 -0
- package/templates/fullstack/gitignore.template +8 -0
- package/templates/fullstack/package.json +39 -0
- package/templates/fullstack/packages/api-client/package.json +20 -0
- package/templates/fullstack/packages/api-client/src/index.ts +203 -0
- package/templates/fullstack/packages/api-client/tsconfig.json +14 -0
- package/templates/fullstack/packages/contracts/package.json +20 -0
- package/templates/fullstack/packages/contracts/src/index.ts +146 -0
- package/templates/fullstack/packages/contracts/tsconfig.json +13 -0
- package/templates/fullstack/packages/ui/package.json +22 -0
- package/templates/fullstack/packages/ui/src/index.tsx +33 -0
- package/templates/fullstack/packages/ui/tsconfig.json +14 -0
- package/templates/prisma/postgresql/.env.example +6 -2
- package/templates/prisma/postgresql/client.ts +17 -0
- package/templates/prisma/postgresql/prisma.config.ts +12 -0
- package/templates/prisma/postgresql/schema.prisma +0 -1
- package/templates/prisma/sqlite/.env.example +6 -2
- package/templates/prisma/sqlite/client.ts +16 -0
- package/templates/prisma/sqlite/prisma.config.ts +12 -0
- package/templates/prisma/sqlite/schema.prisma +0 -1
- package/dist/src/tests/templated-routes.test.d.ts +0 -2
- package/dist/src/tests/templated-routes.test.d.ts.map +0 -1
- package/dist/src/tests/templated-routes.test.js +0 -325
- package/dist/src/tests/templated-routes.test.js.map +0 -1
- package/dist/templates/THREAT_MODEL.md +0 -138
- package/dist/templates/express-auth/src/controllers/protected.controller.d.ts +0 -8
- package/dist/templates/express-auth/src/controllers/protected.controller.d.ts.map +0 -1
- package/dist/templates/express-auth/src/controllers/protected.controller.js +0 -50
- package/dist/templates/express-auth/src/controllers/protected.controller.js.map +0 -1
- package/dist/templates/express-auth/src/routes/protected.routes.d.ts +0 -2
- package/dist/templates/express-auth/src/routes/protected.routes.d.ts.map +0 -1
- package/dist/templates/express-auth/src/routes/protected.routes.js +0 -16
- package/dist/templates/express-auth/src/routes/protected.routes.js.map +0 -1
- package/dist/templates/express-auth/src/utils/security.d.ts +0 -8
- package/dist/templates/express-auth/src/utils/security.d.ts.map +0 -1
- package/dist/templates/express-auth/src/utils/security.js +0 -55
- package/dist/templates/express-auth/src/utils/security.js.map +0 -1
- package/dist/templates/express-base/controllers/base.controller.d.ts +0 -12
- package/dist/templates/express-base/controllers/base.controller.d.ts.map +0 -1
- package/dist/templates/express-base/controllers/base.controller.js +0 -77
- package/dist/templates/express-base/controllers/base.controller.js.map +0 -1
- package/dist/templates/express-base/routes/base.routes.d.ts +0 -2
- package/dist/templates/express-base/routes/base.routes.d.ts.map +0 -1
- package/dist/templates/express-base/routes/base.routes.js +0 -20
- package/dist/templates/express-base/routes/base.routes.js.map +0 -1
- package/dist/templates/express-base/utils/security.d.ts +0 -5
- package/dist/templates/express-base/utils/security.d.ts.map +0 -1
- package/dist/templates/express-base/utils/security.js +0 -40
- package/dist/templates/express-base/utils/security.js.map +0 -1
- package/dist/templates/package.json +0 -27
|
@@ -1,26 +1,69 @@
|
|
|
1
1
|
import fs from "fs-extra";
|
|
2
2
|
import path from "path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { PRISMA_VERSION } from "../lib/constants.js";
|
|
3
5
|
const supportedOAuthProviders = ["google", "github"];
|
|
4
6
|
export function resolveTemplateName(authMode) {
|
|
7
|
+
if (authMode === "fullstack")
|
|
8
|
+
return "fullstack";
|
|
5
9
|
if (authMode === "auth")
|
|
6
10
|
return "express-auth";
|
|
7
11
|
if (authMode === "auth-oauth")
|
|
8
12
|
return "express-auth+";
|
|
9
13
|
return "express-base";
|
|
10
14
|
}
|
|
11
|
-
export function configurePackageJson(targetDir, usePrisma) {
|
|
15
|
+
export function configurePackageJson(targetDir, usePrisma, packageManager = "npm") {
|
|
12
16
|
const pkgPath = path.join(targetDir, "package.json");
|
|
13
17
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
14
|
-
if (
|
|
15
|
-
|
|
16
|
-
}
|
|
18
|
+
if (Array.isArray(pkg.workspaces))
|
|
19
|
+
return;
|
|
20
|
+
pkg.scripts ??= {};
|
|
17
21
|
if (usePrisma) {
|
|
22
|
+
if (!pkg.scripts.postinstall?.includes("prisma")) {
|
|
23
|
+
pkg.scripts.postinstall = "prisma generate";
|
|
24
|
+
}
|
|
18
25
|
const currentDev = pkg.scripts.dev || "tsx watch src/index.ts";
|
|
19
|
-
if (!currentDev.includes("prisma
|
|
20
|
-
pkg.scripts.dev = `
|
|
26
|
+
if (!currentDev.includes("prisma generate")) {
|
|
27
|
+
pkg.scripts.dev = `prisma generate && ${currentDev}`;
|
|
28
|
+
}
|
|
29
|
+
if (packageManager === "bun") {
|
|
30
|
+
pkg.trustedDependencies = ["@prisma/engines", "better-sqlite3", "prisma"];
|
|
31
|
+
}
|
|
32
|
+
if (packageManager === "pnpm") {
|
|
33
|
+
fs.writeFileSync(path.join(targetDir, "pnpm-workspace.yaml"), [
|
|
34
|
+
"allowBuilds:",
|
|
35
|
+
' "@prisma/engines": true',
|
|
36
|
+
" better-sqlite3: true",
|
|
37
|
+
" prisma: true",
|
|
38
|
+
"overrides:",
|
|
39
|
+
' "@hono/node-server": "1.19.13"',
|
|
40
|
+
"",
|
|
41
|
+
].join("\n"));
|
|
42
|
+
}
|
|
43
|
+
if (packageManager === "npm") {
|
|
44
|
+
pkg.allowScripts = {
|
|
45
|
+
[`prisma@${PRISMA_VERSION}`]: true,
|
|
46
|
+
[`@prisma/engines@${PRISMA_VERSION}`]: true,
|
|
47
|
+
...(pkg.dependencies?.["@prisma/adapter-better-sqlite3"]
|
|
48
|
+
? { "better-sqlite3": true }
|
|
49
|
+
: {}),
|
|
50
|
+
};
|
|
21
51
|
}
|
|
22
52
|
}
|
|
23
|
-
|
|
53
|
+
else {
|
|
54
|
+
for (const scriptName of ["postinstall", "prisma:generate", "prisma:migrate"]) {
|
|
55
|
+
if (pkg.scripts[scriptName]?.includes("prisma")) {
|
|
56
|
+
delete pkg.scripts[scriptName];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
delete pkg.dependencies?.["@prisma/client"];
|
|
60
|
+
delete pkg.dependencies?.["@prisma/adapter-pg"];
|
|
61
|
+
delete pkg.dependencies?.["@prisma/adapter-better-sqlite3"];
|
|
62
|
+
delete pkg.devDependencies?.prisma;
|
|
63
|
+
delete pkg.trustedDependencies;
|
|
64
|
+
delete pkg.allowScripts;
|
|
65
|
+
}
|
|
66
|
+
fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
24
67
|
}
|
|
25
68
|
function resolveOAuthProviders(state) {
|
|
26
69
|
const selected = state.oauthProviders?.filter((provider) => supportedOAuthProviders.includes(provider));
|
|
@@ -38,24 +81,67 @@ function providerEnvBlock(provider) {
|
|
|
38
81
|
},`;
|
|
39
82
|
}
|
|
40
83
|
function providerControllerBlock(provider) {
|
|
41
|
-
return
|
|
42
|
-
|
|
84
|
+
return `async ${provider}Redirect(req: Request, res: Response) {
|
|
85
|
+
try {
|
|
86
|
+
await requireProvider("${provider}", res)?.redirect(req, res);
|
|
87
|
+
} catch {
|
|
88
|
+
if (!res.headersSent) res.status(500).json({ error: "OAuth redirect failed" });
|
|
89
|
+
}
|
|
43
90
|
},
|
|
44
91
|
|
|
45
92
|
async ${provider}Callback(req: Request, res: Response) {
|
|
46
|
-
|
|
47
|
-
|
|
93
|
+
try {
|
|
94
|
+
const provider = requireProvider("${provider}", res);
|
|
95
|
+
if (!provider) return;
|
|
96
|
+
|
|
97
|
+
const result = await provider.handleCallback(req);
|
|
98
|
+
let response = result;
|
|
99
|
+
|
|
100
|
+
if (result.mode === "link" && !result.identity) {
|
|
101
|
+
if (!result.userId) {
|
|
102
|
+
return res.status(400).json({ error: "Authenticated user is required to link a provider" });
|
|
103
|
+
}
|
|
48
104
|
|
|
49
|
-
|
|
105
|
+
await identityAdapter.linkProvider(
|
|
106
|
+
result.userId,
|
|
107
|
+
result.profile.provider,
|
|
108
|
+
result.profile.providerId,
|
|
109
|
+
);
|
|
110
|
+
response = {
|
|
111
|
+
...result,
|
|
112
|
+
identity: { type: "LINK_PROVIDER", success: true },
|
|
113
|
+
};
|
|
114
|
+
}
|
|
50
115
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
116
|
+
if (
|
|
117
|
+
result.identity?.type === "LINK_REQUIRED" ||
|
|
118
|
+
result.identity?.type === "EXISTING_EMAIL_CONFLICT"
|
|
119
|
+
) {
|
|
120
|
+
return res.status(409).json({ provider: "${provider}", ...result });
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (result.identity?.type === "INVALID_LINK_REQUEST") {
|
|
124
|
+
return res.status(400).json({ provider: "${provider}", ...result });
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (result.mode === "login" && (!result.accessToken || !result.refreshToken)) {
|
|
128
|
+
throw new Error("OAuth callback did not return an application session");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
res.json({ provider: "${provider}", ...response });
|
|
132
|
+
} catch (error) {
|
|
133
|
+
res.status(400).json({
|
|
134
|
+
error: error instanceof Error ? error.message : "OAuth callback failed",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
55
137
|
},
|
|
56
138
|
|
|
57
|
-
${provider}Link(req: Request, res: Response) {
|
|
58
|
-
|
|
139
|
+
async ${provider}Link(req: Request, res: Response) {
|
|
140
|
+
try {
|
|
141
|
+
await requireProvider("${provider}", res)?.redirect(req, res, "link");
|
|
142
|
+
} catch {
|
|
143
|
+
if (!res.headersSent) res.status(500).json({ error: "OAuth link redirect failed" });
|
|
144
|
+
}
|
|
59
145
|
},`;
|
|
60
146
|
}
|
|
61
147
|
function providerRoutesBlock(provider) {
|
|
@@ -71,7 +157,8 @@ async function writeProviderSpecificOAuthFiles(targetDir, providers) {
|
|
|
71
157
|
const providerUnion = providers.map((provider) => `"${provider}"`).join(" | ");
|
|
72
158
|
await fs.writeFile(authPath, `import { createAuthenik8 } from "authenik8-core";
|
|
73
159
|
import dotenv from "dotenv";
|
|
74
|
-
import { requiredEnv, requiredSecret } from "../utils/security";
|
|
160
|
+
import { agentIdentityConfig, authJwkConfig, requiredEnv, requiredSecret } from "../utils/security";
|
|
161
|
+
import { identityAdapter } from "./identity.adapter";
|
|
75
162
|
|
|
76
163
|
dotenv.config();
|
|
77
164
|
|
|
@@ -85,9 +172,11 @@ function oauthConfig() {
|
|
|
85
172
|
|
|
86
173
|
export async function initAuth() {
|
|
87
174
|
authInstance= await createAuthenik8({
|
|
88
|
-
|
|
175
|
+
jwt: authJwkConfig(),
|
|
89
176
|
refreshSecret: requiredSecret("REFRESH_SECRET"),
|
|
177
|
+
agent: agentIdentityConfig(),
|
|
90
178
|
oauth: oauthConfig(),
|
|
179
|
+
identityAdapter,
|
|
91
180
|
});
|
|
92
181
|
|
|
93
182
|
}
|
|
@@ -119,7 +208,8 @@ ${providers.map(providerRoutesBlock).join("\n")}
|
|
|
119
208
|
export default router;
|
|
120
209
|
`);
|
|
121
210
|
await fs.writeFile(controllerPath, `import { Request, Response } from "express";
|
|
122
|
-
import { getAuth } from "../auth";
|
|
211
|
+
import { getAuth } from "../auth.js";
|
|
212
|
+
import { identityAdapter } from "../identity.adapter";
|
|
123
213
|
|
|
124
214
|
type OAuthProvider = ${providerUnion};
|
|
125
215
|
|
|
@@ -151,7 +241,7 @@ export const oauthController = {
|
|
|
151
241
|
const callbackUrls = providers
|
|
152
242
|
.map((provider) => `${providerTitle(provider)} callback URL:\n\n\`\`\`text\nhttp://localhost:3000/auth/${provider}/callback\n\`\`\``)
|
|
153
243
|
.join("\n\n");
|
|
154
|
-
let readme = await fs.readFile(readmePath, "utf-8");
|
|
244
|
+
let readme = (await fs.readFile(readmePath, "utf-8")).replace(/\r\n/g, "\n");
|
|
155
245
|
readme = readme.replace("AUTHENIK8_OAUTH_PROVIDERS=google,github", `AUTHENIK8_OAUTH_PROVIDERS=${selectedList}`);
|
|
156
246
|
readme = readme.replace(/GOOGLE_CLIENT_ID=your-google-client-id\nGOOGLE_CLIENT_SECRET=your-google-client-secret\nGOOGLE_REDIRECT_URI=http:\/\/localhost:3000\/auth\/google\/callback\nGITHUB_CLIENT_ID=your-github-client-id\nGITHUB_CLIENT_SECRET=your-github-client-secret\nGITHUB_REDIRECT_URI=http:\/\/localhost:3000\/auth\/github\/callback/, providers
|
|
157
247
|
.flatMap((provider) => {
|
|
@@ -191,12 +281,43 @@ export async function createProject(state, targetDir, templateRoot) {
|
|
|
191
281
|
if (!pkgExists) {
|
|
192
282
|
throw new Error(`Template "${templateName}" is missing package.json at ${templatePath}`);
|
|
193
283
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
284
|
+
const stageDir = path.join(path.dirname(targetDir), `.${path.basename(targetDir)}.authenik8-${randomUUID()}`);
|
|
285
|
+
try {
|
|
286
|
+
await fs.copy(templatePath, stageDir, {
|
|
287
|
+
filter: (source) => !source.split(path.sep).includes("oauth-providers"),
|
|
288
|
+
});
|
|
289
|
+
const generatedPkgPath = path.join(stageDir, "package.json");
|
|
290
|
+
const generatedPkg = await fs.readJson(generatedPkgPath);
|
|
291
|
+
generatedPkg.name = state.projectName;
|
|
292
|
+
await fs.writeJson(generatedPkgPath, generatedPkg, { spaces: 2 });
|
|
293
|
+
const packagedGitignore = path.join(stageDir, "gitignore.template");
|
|
294
|
+
if (await fs.pathExists(packagedGitignore)) {
|
|
295
|
+
await fs.move(packagedGitignore, path.join(stageDir, ".gitignore"), {
|
|
296
|
+
overwrite: true,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
if (state.authMode === "fullstack") {
|
|
300
|
+
await fs.copy(path.join(templatePath, ".env.example"), path.join(stageDir, ".env"));
|
|
301
|
+
const providers = state.oauthProviders === undefined
|
|
302
|
+
? [...supportedOAuthProviders]
|
|
303
|
+
: resolveOAuthProviders(state).filter((provider) => state.oauthProviders?.includes(provider));
|
|
304
|
+
await fs.writeFile(path.join(stageDir, "apps/web/src/auth/providers.ts"), `export type OAuthProvider = "google" | "github";\n\nexport const enabledOAuthProviders: readonly OAuthProvider[] = ${JSON.stringify(providers)};\n`);
|
|
305
|
+
}
|
|
306
|
+
if (state.authMode !== "fullstack") {
|
|
307
|
+
await fs.copy(path.join(templateRoot, "THREAT_MODEL.md"), path.join(stageDir, "THREAT_MODEL.md"));
|
|
308
|
+
}
|
|
309
|
+
await fs.copy(path.join(templateRoot, "AGENT_IDENTITY.md"), path.join(stageDir, "AGENT_IDENTITY.md"));
|
|
310
|
+
if (state.authMode === "auth-oauth") {
|
|
311
|
+
await writeProviderSpecificOAuthFiles(stageDir, resolveOAuthProviders(state));
|
|
312
|
+
}
|
|
313
|
+
if (await fs.pathExists(targetDir)) {
|
|
314
|
+
throw new Error(`Directory "${path.basename(targetDir)}" was created while setup was running.`);
|
|
315
|
+
}
|
|
316
|
+
await fs.move(stageDir, targetDir);
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
await fs.remove(stageDir);
|
|
320
|
+
throw error;
|
|
200
321
|
}
|
|
201
322
|
}
|
|
202
323
|
//# sourceMappingURL=createProject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createProject.js","sourceRoot":"","sources":["../../../src/steps/createProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"createProject.js","sourceRoot":"","sources":["../../../src/steps/createProject.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare function hasBun(): boolean;
|
|
2
|
-
export declare function resolveRuntime(runtime:
|
|
3
|
-
export declare function createPm2Config(targetDir: string, projectName: string, runtime: "node" | "bun"): void;
|
|
2
|
+
export declare function resolveRuntime(runtime: unknown): "node" | "bun";
|
|
3
|
+
export declare function createPm2Config(targetDir: string, projectName: string, runtime: "node" | "bun", productionEntry?: string): void;
|
|
4
4
|
export declare function configureProduction(targetDir: string, projectName: string, runtime: "node" | "bun"): Promise<void>;
|
|
5
|
-
export declare function initGit(targetDir: string): Promise<
|
|
5
|
+
export declare function initGit(targetDir: string): Promise<boolean>;
|
|
6
6
|
export declare function appendProductionReadme(targetDir: string, projectName: string): void;
|
|
7
7
|
//# sourceMappingURL=finalSetup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finalSetup.d.ts","sourceRoot":"","sources":["../../../src/steps/finalSetup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"finalSetup.d.ts","sourceRoot":"","sources":["../../../src/steps/finalSetup.ts"],"names":[],"mappings":"AAWA,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAO/D;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GAAG,KAAK,EACvB,eAAe,SAAmB,GACjC,IAAI,CAsCN;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GAAG,KAAK,GACtB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAejE;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAuBnF"}
|
|
@@ -1,29 +1,20 @@
|
|
|
1
1
|
import fs from "fs-extra";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import { run, getCommand } from "../lib/process.js";
|
|
4
|
-
import { spinner } from "../lib/ui.js";
|
|
5
|
-
import { execSync } from "child_process";
|
|
3
|
+
import { commandExists, run, getCommand, exitForInterrupt, } from "../lib/process.js";
|
|
6
4
|
const PM2_VERSION = "^5.4.2";
|
|
7
|
-
const TS_NODE_VERSION = "^10.9.2";
|
|
8
5
|
export function hasBun() {
|
|
9
|
-
|
|
10
|
-
execSync("bun --version", { stdio: "ignore" });
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
6
|
+
return commandExists("bun");
|
|
16
7
|
}
|
|
17
8
|
export function resolveRuntime(runtime) {
|
|
18
9
|
if (runtime === "bun" && !hasBun()) {
|
|
19
|
-
console.log("
|
|
10
|
+
console.log("Bun was not found; using Node instead.");
|
|
20
11
|
return "node";
|
|
21
12
|
}
|
|
22
13
|
if (runtime === "bun")
|
|
23
14
|
return "bun";
|
|
24
15
|
return "node";
|
|
25
16
|
}
|
|
26
|
-
export function createPm2Config(targetDir, projectName, runtime) {
|
|
17
|
+
export function createPm2Config(targetDir, projectName, runtime, productionEntry = "dist/server.js") {
|
|
27
18
|
const configPath = path.join(targetDir, "ecosystem.config.js");
|
|
28
19
|
const useBun = runtime === "bun";
|
|
29
20
|
const content = useBun
|
|
@@ -31,7 +22,7 @@ export function createPm2Config(targetDir, projectName, runtime) {
|
|
|
31
22
|
apps: [
|
|
32
23
|
{
|
|
33
24
|
name: "${projectName}",
|
|
34
|
-
script: "
|
|
25
|
+
script: "${productionEntry}",
|
|
35
26
|
interpreter: "bun",
|
|
36
27
|
instances: "max",
|
|
37
28
|
exec_mode: "cluster",
|
|
@@ -41,15 +32,14 @@ export function createPm2Config(targetDir, projectName, runtime) {
|
|
|
41
32
|
}
|
|
42
33
|
}
|
|
43
34
|
]
|
|
44
|
-
}`
|
|
45
|
-
`module.exports = {
|
|
35
|
+
}`
|
|
36
|
+
: `module.exports = {
|
|
46
37
|
apps: [
|
|
47
38
|
{
|
|
48
39
|
name: "${projectName}",
|
|
49
|
-
script: "
|
|
40
|
+
script: "${productionEntry}",
|
|
50
41
|
instances: "max",
|
|
51
42
|
interpreter:"node",
|
|
52
|
-
interpreter_args: "-r ts-node/register",
|
|
53
43
|
exec_mode: "cluster",
|
|
54
44
|
watch: false,
|
|
55
45
|
max_memory_restart: "300M",
|
|
@@ -65,35 +55,41 @@ export async function configureProduction(targetDir, projectName, runtime) {
|
|
|
65
55
|
const pkgPath = path.join(targetDir, "package.json");
|
|
66
56
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
67
57
|
pkg.dependencies["pm2"] = PM2_VERSION;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
58
|
+
delete pkg.dependencies["ts-node"];
|
|
59
|
+
const productionEntry = String(pkg.scripts.start ?? "node dist/server.js")
|
|
60
|
+
.replace(/^node\s+/, "")
|
|
61
|
+
.trim();
|
|
62
|
+
pkg.scripts["pm2:start"] = "npm run build && npx pm2 start ecosystem.config.js";
|
|
72
63
|
pkg.scripts["pm2:stop"] = `npx pm2 stop ${projectName}`;
|
|
73
64
|
pkg.scripts["pm2:logs"] = "npx pm2 logs";
|
|
74
65
|
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
|
|
75
|
-
createPm2Config(targetDir, projectName, runtime);
|
|
66
|
+
createPm2Config(targetDir, projectName, runtime, productionEntry);
|
|
76
67
|
}
|
|
77
68
|
export async function initGit(targetDir) {
|
|
69
|
+
if (!commandExists("git"))
|
|
70
|
+
return false;
|
|
78
71
|
try {
|
|
79
72
|
await run(getCommand("git"), ["init"], {
|
|
80
73
|
cwd: targetDir,
|
|
81
74
|
stdio: "ignore",
|
|
82
75
|
});
|
|
83
|
-
|
|
76
|
+
return true;
|
|
84
77
|
}
|
|
85
|
-
catch {
|
|
86
|
-
|
|
78
|
+
catch (error) {
|
|
79
|
+
await exitForInterrupt(error);
|
|
80
|
+
const message = error instanceof Error ? error.message.split("\n")[0] : String(error);
|
|
81
|
+
console.warn(`Git initialization skipped: ${message}`);
|
|
82
|
+
return false;
|
|
87
83
|
}
|
|
88
84
|
}
|
|
89
85
|
export function appendProductionReadme(targetDir, projectName) {
|
|
90
86
|
fs.appendFileSync(path.join(targetDir, "README.md"), `
|
|
91
87
|
|
|
92
|
-
|
|
88
|
+
## Production Mode
|
|
93
89
|
|
|
94
90
|
This project is configured for production using PM2.
|
|
95
91
|
|
|
96
|
-
|
|
92
|
+
Build and start the compiled app in cluster mode:
|
|
97
93
|
|
|
98
94
|
npm run pm2:start
|
|
99
95
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finalSetup.js","sourceRoot":"","sources":["../../../src/steps/finalSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"finalSetup.js","sourceRoot":"","sources":["../../../src/steps/finalSetup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { PackageManager } from "./installDeps.js";
|
|
2
|
-
export declare function installAuth(targetDir: string, pm: PackageManager): Promise<
|
|
2
|
+
export declare function installAuth(targetDir: string, pm: PackageManager): Promise<"bcryptjs">;
|
|
3
3
|
//# sourceMappingURL=installAuth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installAuth.d.ts","sourceRoot":"","sources":["../../../src/steps/installAuth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"installAuth.d.ts","sourceRoot":"","sources":["../../../src/steps/installAuth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,cAAc,GACjB,OAAO,CAAC,UAAU,CAAC,CAoBrB"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import fs from "fs-extra";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { getBestHashLib, generateHashModule } from "../utils/hash.js";
|
|
4
|
-
import { spinner } from "../lib/ui.js";
|
|
5
4
|
export async function installAuth(targetDir, pm) {
|
|
6
|
-
|
|
7
|
-
spinner.start("Installing password auth...");
|
|
5
|
+
const selectedHash = getBestHashLib(pm);
|
|
8
6
|
const pkgPath = path.join(targetDir, "package.json");
|
|
9
7
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
10
8
|
pkg.dependencies.bcryptjs = "^2.4.3";
|
|
9
|
+
pkg.devDependencies = {
|
|
10
|
+
...pkg.devDependencies,
|
|
11
|
+
"@types/bcryptjs": "^2.4.6",
|
|
12
|
+
};
|
|
11
13
|
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
|
|
12
|
-
spinner.stop();
|
|
13
14
|
await fs.writeFile(path.join(targetDir, "src/utils/hash.ts"), generateHashModule("bcryptjs"));
|
|
14
15
|
return selectedHash;
|
|
15
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installAuth.js","sourceRoot":"","sources":["../../../src/steps/installAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"installAuth.js","sourceRoot":"","sources":["../../../src/steps/installAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,EAAkB;IAElB,MAAM,YAAY,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1D,GAAG,CAAC,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACrC,GAAG,CAAC,eAAe,GAAG;QACpB,GAAG,GAAG,CAAC,eAAe;QACtB,iBAAiB,EAAE,QAAQ;KAC5B,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAExD,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EACzC,kBAAkB,CAAC,UAAU,CAAC,CAC/B,CAAC;IAEF,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
|
|
1
|
+
import type { PackageManager } from "../lib/types.js";
|
|
2
|
+
export type { PackageManager } from "../lib/types.js";
|
|
3
|
+
export type InstallResult = {
|
|
4
|
+
packageManager: PackageManager;
|
|
5
|
+
durationMs: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function detectPackageManager(env?: NodeJS.ProcessEnv): PackageManager;
|
|
8
|
+
export declare function resolvePackageManagerForPreset(authMode: string | undefined, requested?: PackageManager, env?: NodeJS.ProcessEnv): PackageManager;
|
|
9
|
+
export declare function isPackageManagerAvailable(pm: PackageManager): boolean;
|
|
10
|
+
export declare function getInstallArgs(pm: PackageManager): string[];
|
|
11
|
+
export declare function installDependencies(targetDir: string, packageManager?: PackageManager): Promise<InstallResult>;
|
|
5
12
|
//# sourceMappingURL=installDeps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installDeps.d.ts","sourceRoot":"","sources":["../../../src/steps/installDeps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"installDeps.d.ts","sourceRoot":"","sources":["../../../src/steps/installDeps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CAQzF;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,CAAC,EAAE,cAAc,EAC1B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,cAAc,CAShB;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAErE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,EAAE,CAiB3D;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,aAAa,CAAC,CAoBxB"}
|