create-authenik8-app 2.4.11 ā 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 -7
- 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 +13 -6
- 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,100 +1,68 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
try {
|
|
6
|
-
execSync(command, { stdio: "ignore" });
|
|
7
|
-
return true;
|
|
8
|
-
}
|
|
9
|
-
catch {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
export function detectPackageManager() {
|
|
14
|
-
try {
|
|
15
|
-
if (process.env.npm_execpath?.includes("pnpm"))
|
|
16
|
-
return "pnpm";
|
|
17
|
-
if (process.env.npm_execpath?.includes("bun"))
|
|
18
|
-
return "bun";
|
|
19
|
-
if (process.env.npm_execpath?.includes("npm"))
|
|
20
|
-
return "npm";
|
|
21
|
-
execSync("pnpm --version", { stdio: "ignore" });
|
|
1
|
+
import { commandExists, run, getCommand, exitForInterrupt } from "../lib/process.js";
|
|
2
|
+
function packageManagerFrom(value) {
|
|
3
|
+
const normalized = value?.toLowerCase() ?? "";
|
|
4
|
+
if (normalized.includes("pnpm"))
|
|
22
5
|
return "pnpm";
|
|
23
|
-
|
|
24
|
-
catch { }
|
|
25
|
-
try {
|
|
26
|
-
execSync("bun --version", { stdio: "ignore" });
|
|
6
|
+
if (normalized.includes("bun"))
|
|
27
7
|
return "bun";
|
|
28
|
-
|
|
29
|
-
|
|
8
|
+
if (normalized.includes("npm"))
|
|
9
|
+
return "npm";
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
export function detectPackageManager(env = process.env) {
|
|
13
|
+
const userAgentManager = packageManagerFrom(env.npm_config_user_agent?.split(" ")[0]);
|
|
14
|
+
if (userAgentManager)
|
|
15
|
+
return userAgentManager;
|
|
16
|
+
const executableManager = packageManagerFrom(env.npm_execpath);
|
|
17
|
+
if (executableManager)
|
|
18
|
+
return executableManager;
|
|
30
19
|
return "npm";
|
|
31
20
|
}
|
|
32
|
-
function
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (process.platform === "win32" && commandSucceeds("npm.cmd -v")) {
|
|
37
|
-
return "npm.cmd -y install redis-server";
|
|
38
|
-
}
|
|
39
|
-
if (process.platform === "linux") {
|
|
40
|
-
if (commandSucceeds("apt-get --version")) {
|
|
41
|
-
return "sudo apt-get update && sudo apt-get install -y redis-server";
|
|
42
|
-
}
|
|
43
|
-
if (commandSucceeds("dnf --version")) {
|
|
44
|
-
return "sudo dnf install -y redis";
|
|
45
|
-
}
|
|
46
|
-
if (commandSucceeds("yum --version")) {
|
|
47
|
-
return "sudo yum install -y redis";
|
|
48
|
-
}
|
|
49
|
-
if (commandSucceeds("pacman --version")) {
|
|
50
|
-
return "sudo pacman -Sy --noconfirm redis";
|
|
21
|
+
export function resolvePackageManagerForPreset(authMode, requested, env = process.env) {
|
|
22
|
+
if (authMode === "fullstack") {
|
|
23
|
+
if (requested && requested !== "npm") {
|
|
24
|
+
throw new Error("The full-stack preset uses npm workspaces. Select npm or omit --package-manager.");
|
|
51
25
|
}
|
|
26
|
+
return "npm";
|
|
52
27
|
}
|
|
53
|
-
return
|
|
28
|
+
return requested ?? detectPackageManager(env);
|
|
54
29
|
}
|
|
55
|
-
export function
|
|
56
|
-
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const installCommand = getRedisInstallCommand();
|
|
60
|
-
if (!installCommand) {
|
|
61
|
-
throw new Error("Redis server is required but could not be installed automatically.");
|
|
62
|
-
}
|
|
63
|
-
execSync(installCommand, { stdio: "inherit" });
|
|
30
|
+
export function isPackageManagerAvailable(pm) {
|
|
31
|
+
return commandExists(pm);
|
|
64
32
|
}
|
|
65
|
-
function getInstallArgs(pm
|
|
33
|
+
export function getInstallArgs(pm) {
|
|
66
34
|
switch (pm) {
|
|
67
35
|
case "pnpm":
|
|
68
|
-
return ["install", "--prefer-offline"];
|
|
36
|
+
return ["install", "--prefer-offline", "--reporter=append-only"];
|
|
69
37
|
case "bun":
|
|
70
|
-
return ["install"];
|
|
38
|
+
return ["install", "--no-progress"];
|
|
71
39
|
case "npm":
|
|
72
40
|
default:
|
|
73
|
-
return [
|
|
41
|
+
return [
|
|
42
|
+
"install",
|
|
43
|
+
"--prefer-offline",
|
|
44
|
+
"--no-audit",
|
|
45
|
+
"--no-fund",
|
|
46
|
+
"--progress=false",
|
|
47
|
+
"--no-update-notifier",
|
|
48
|
+
];
|
|
74
49
|
}
|
|
75
50
|
}
|
|
76
|
-
export async function installDependencies(targetDir) {
|
|
77
|
-
const pm = detectPackageManager();
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
ensureRedisServerInstalled();
|
|
81
|
-
spinner.stop();
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
spinner.fail("Failed to install Redis server");
|
|
85
|
-
await exitForInterrupt(err);
|
|
86
|
-
throw err;
|
|
87
|
-
}
|
|
88
|
-
spinner.start("Installing dependencies...(this may take a few minutes)");
|
|
51
|
+
export async function installDependencies(targetDir, packageManager) {
|
|
52
|
+
const pm = packageManager ?? detectPackageManager();
|
|
53
|
+
const startedAt = Date.now();
|
|
54
|
+
const hideProgress = Boolean(process.stderr.isTTY && !process.env.CI && process.env.AUTHENIK8_VERBOSE !== "1");
|
|
89
55
|
try {
|
|
90
|
-
await run(getCommand(pm), getInstallArgs(pm
|
|
56
|
+
await run(getCommand(pm), getInstallArgs(pm), {
|
|
91
57
|
cwd: targetDir,
|
|
92
|
-
stdio: "
|
|
58
|
+
stdio: hideProgress ? "pipe" : "inherit",
|
|
93
59
|
});
|
|
94
|
-
|
|
60
|
+
return {
|
|
61
|
+
packageManager: pm,
|
|
62
|
+
durationMs: Date.now() - startedAt,
|
|
63
|
+
};
|
|
95
64
|
}
|
|
96
65
|
catch (err) {
|
|
97
|
-
spinner.fail("Failed to install dependencies");
|
|
98
66
|
await exitForInterrupt(err);
|
|
99
67
|
throw err;
|
|
100
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installDeps.js","sourceRoot":"","sources":["../../../src/steps/installDeps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"installDeps.js","sourceRoot":"","sources":["../../../src/steps/installDeps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { CliState } from "../lib/types.js";
|
|
2
|
-
export declare function runPrompts(
|
|
2
|
+
export declare function runPrompts(_state: CliState, isProduction: boolean): Promise<Partial<CliState>>;
|
|
3
3
|
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/steps/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/steps/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAiBhD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,QAAQ,EAChB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAgG5B"}
|
|
@@ -1,65 +1,71 @@
|
|
|
1
1
|
import inquirer from "inquirer";
|
|
2
|
+
import { authMethodSelectionSchema, firstZodIssue, oauthProviderSelectionSchema, promptAnswersSchema, } from "../lib/schemas.js";
|
|
2
3
|
import { hasBun } from "./finalSetup.js";
|
|
3
|
-
|
|
4
|
-
const
|
|
4
|
+
function validateSelection(schema, choices) {
|
|
5
|
+
const result = schema.safeParse(choices);
|
|
6
|
+
return result.success ? true : firstZodIssue(result.error);
|
|
7
|
+
}
|
|
8
|
+
export async function runPrompts(_state, isProduction) {
|
|
9
|
+
const bunAvailable = isProduction && hasBun();
|
|
5
10
|
return inquirer.prompt([
|
|
6
11
|
{
|
|
7
12
|
type: "list",
|
|
8
|
-
name: "
|
|
9
|
-
message: "
|
|
13
|
+
name: "authMode",
|
|
14
|
+
message: "Select a preset:",
|
|
10
15
|
choices: [
|
|
11
|
-
"
|
|
12
|
-
{ name: "
|
|
16
|
+
{ name: "Full-stack application (recommended)", value: "fullstack" },
|
|
17
|
+
{ name: "Express API (JWT only)", value: "base" },
|
|
18
|
+
{ name: "Express API + email/password", value: "auth" },
|
|
19
|
+
{ name: "Express API + OAuth", value: "auth-oauth" },
|
|
13
20
|
],
|
|
14
|
-
default: "
|
|
21
|
+
default: "fullstack",
|
|
15
22
|
},
|
|
16
23
|
{
|
|
17
|
-
type: "
|
|
18
|
-
name: "
|
|
19
|
-
message: "
|
|
24
|
+
type: "checkbox",
|
|
25
|
+
name: "authMethods",
|
|
26
|
+
message: "Select authentication methods:",
|
|
20
27
|
choices: [
|
|
21
|
-
{ name: "
|
|
22
|
-
{ name: "
|
|
23
|
-
{ name: "
|
|
28
|
+
{ name: "Email and password (required)", value: "password", checked: true },
|
|
29
|
+
{ name: "Google", value: "google", checked: true },
|
|
30
|
+
{ name: "GitHub", value: "github", checked: true },
|
|
24
31
|
],
|
|
25
|
-
|
|
32
|
+
when: (answers) => answers.authMode === "fullstack",
|
|
33
|
+
validate: (choices) => validateSelection(authMethodSelectionSchema, choices),
|
|
26
34
|
},
|
|
27
35
|
{
|
|
28
36
|
type: "checkbox",
|
|
29
37
|
name: "oauthProviders",
|
|
30
|
-
message: "
|
|
38
|
+
message: "Select OAuth providers:",
|
|
31
39
|
choices: [
|
|
32
40
|
{ name: "Google", value: "google" },
|
|
33
41
|
{ name: "GitHub", value: "github" },
|
|
34
42
|
],
|
|
35
|
-
//default: ["google"],
|
|
36
43
|
when: (answers) => answers.authMode === "auth-oauth",
|
|
37
|
-
validate: (choices) =>
|
|
38
|
-
? true
|
|
39
|
-
: "Select at least one OAuth provider",
|
|
44
|
+
validate: (choices) => validateSelection(oauthProviderSelectionSchema, choices),
|
|
40
45
|
},
|
|
41
46
|
{
|
|
42
47
|
type: "confirm",
|
|
43
48
|
name: "usePrisma",
|
|
44
|
-
message: "
|
|
49
|
+
message: "Add Prisma?",
|
|
45
50
|
default: true,
|
|
46
|
-
when: (answers) => answers.authMode === "base"
|
|
51
|
+
when: (answers) => answers.authMode === "base",
|
|
47
52
|
},
|
|
48
53
|
{
|
|
49
54
|
type: "list",
|
|
50
55
|
name: "database",
|
|
51
|
-
message: "
|
|
56
|
+
message: "Select a database:",
|
|
52
57
|
choices: [
|
|
58
|
+
{ name: "SQLite", value: "sqlite" },
|
|
53
59
|
{ name: "PostgreSQL", value: "postgresql" },
|
|
54
|
-
{ name: "SQLite ", value: "sqlite" },
|
|
55
60
|
],
|
|
56
|
-
when: (answers) => answers.
|
|
61
|
+
when: (answers) => answers.authMode !== "fullstack"
|
|
62
|
+
&& (answers.usePrisma || ["auth", "auth-oauth"].includes(answers.authMode)),
|
|
57
63
|
default: "sqlite",
|
|
58
64
|
},
|
|
59
65
|
{
|
|
60
66
|
type: "confirm",
|
|
61
67
|
name: "useGit",
|
|
62
|
-
message: "Initialize
|
|
68
|
+
message: "Initialize a Git repository?",
|
|
63
69
|
default: true,
|
|
64
70
|
},
|
|
65
71
|
{
|
|
@@ -79,15 +85,21 @@ export async function runPrompts(state, isProduction) {
|
|
|
79
85
|
value: "node",
|
|
80
86
|
},
|
|
81
87
|
],
|
|
82
|
-
when: () => isProduction,
|
|
83
|
-
default: bunAvailable ? "bun" : "node"
|
|
88
|
+
when: (answers) => isProduction && answers.authMode !== "fullstack",
|
|
89
|
+
default: bunAvailable ? "bun" : "node",
|
|
84
90
|
},
|
|
85
91
|
])
|
|
86
92
|
.then((result) => {
|
|
87
|
-
|
|
88
|
-
result
|
|
93
|
+
const answers = {
|
|
94
|
+
...result,
|
|
95
|
+
framework: "Express",
|
|
96
|
+
...(result.runtime === "bun" && !bunAvailable ? { runtime: "node" } : {}),
|
|
97
|
+
};
|
|
98
|
+
const validation = promptAnswersSchema.safeParse(answers);
|
|
99
|
+
if (!validation.success) {
|
|
100
|
+
throw new Error(`Invalid prompt input: ${firstZodIssue(validation.error)}`);
|
|
89
101
|
}
|
|
90
|
-
return
|
|
102
|
+
return validation.data;
|
|
91
103
|
});
|
|
92
104
|
}
|
|
93
105
|
//# sourceMappingURL=prompts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/steps/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/steps/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwk.d.ts","sourceRoot":"","sources":["../../../src/utils/jwk.ts"],"names":[],"mappings":"AAmCA,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { generateKeyPairSync, randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import fs from "fs-extra";
|
|
4
|
+
const managedNames = [
|
|
5
|
+
"JWT_SECRET",
|
|
6
|
+
"AUTHENIK8_PRIVATE_JWK",
|
|
7
|
+
"AUTHENIK8_SIGNING_JWKS",
|
|
8
|
+
"AUTHENIK8_ACTIVE_KID",
|
|
9
|
+
"AUTHENIK8_ISSUER",
|
|
10
|
+
"AUTHENIK8_AUDIENCE",
|
|
11
|
+
"REFRESH_SECRET",
|
|
12
|
+
];
|
|
13
|
+
function withoutManagedValues(source) {
|
|
14
|
+
const names = new Set(managedNames);
|
|
15
|
+
return source
|
|
16
|
+
.replace(/\r\n/g, "\n")
|
|
17
|
+
.split("\n")
|
|
18
|
+
.filter((line) => !names.has(line.split("=", 1)[0] ?? ""))
|
|
19
|
+
.join("\n")
|
|
20
|
+
.replace(/\n*$/, "\n");
|
|
21
|
+
}
|
|
22
|
+
function signingJwk() {
|
|
23
|
+
const { privateKey } = generateKeyPairSync("ec", { namedCurve: "P-256" });
|
|
24
|
+
return {
|
|
25
|
+
...privateKey.export({ format: "jwk" }),
|
|
26
|
+
alg: "ES256",
|
|
27
|
+
use: "sig",
|
|
28
|
+
key_ops: ["sign"],
|
|
29
|
+
kid: randomUUID(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function configureSigningKeys(targetDir, projectName) {
|
|
33
|
+
const envPath = path.join(targetDir, ".env");
|
|
34
|
+
const examplePath = path.join(targetDir, ".env.example");
|
|
35
|
+
const issuer = "http://localhost:3000";
|
|
36
|
+
const audience = `${projectName}-api`;
|
|
37
|
+
const key = signingJwk();
|
|
38
|
+
const refreshSecret = randomBytes(48).toString("base64url");
|
|
39
|
+
const env = await fs.readFile(envPath, "utf8");
|
|
40
|
+
const example = await fs.readFile(examplePath, "utf8");
|
|
41
|
+
await fs.writeFile(envPath, `${withoutManagedValues(env)}AUTHENIK8_SIGNING_JWKS='${JSON.stringify([key])}'\nAUTHENIK8_ACTIVE_KID=${key.kid}\nAUTHENIK8_ISSUER=${issuer}\nAUTHENIK8_AUDIENCE=${audience}\nREFRESH_SECRET=${refreshSecret}\n`);
|
|
42
|
+
await fs.writeFile(examplePath, `${withoutManagedValues(example)}AUTHENIK8_SIGNING_JWKS=\nAUTHENIK8_ACTIVE_KID=\nAUTHENIK8_ISSUER=${issuer}\nAUTHENIK8_AUDIENCE=${audience}\nREFRESH_SECRET=replace-with-at-least-32-random-characters\n`);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=jwk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwk.js","sourceRoot":"","sources":["../../../src/utils/jwk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,MAAM,YAAY,GAAG;IACnB,YAAY;IACZ,uBAAuB;IACvB,wBAAwB;IACxB,sBAAsB;IACtB,kBAAkB;IAClB,oBAAoB;IACpB,gBAAgB;CACjB,CAAC;AAEF,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IACpC,OAAO,MAAM;SACV,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SACzD,IAAI,CAAC,IAAI,CAAC;SACV,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1E,OAAO;QACL,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACvC,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,CAAC,MAAM,CAAC;QACjB,GAAG,EAAE,UAAU,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,WAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,uBAAuB,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,WAAW,MAAM,CAAC;IACtC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,aAAa,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEvD,MAAM,EAAE,CAAC,SAAS,CAChB,OAAO,EACP,GAAG,oBAAoB,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,2BAA2B,GAAG,CAAC,GAAG,sBAAsB,MAAM,wBAAwB,QAAQ,oBAAoB,aAAa,IAAI,CAChN,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAChB,WAAW,EACX,GAAG,oBAAoB,CAAC,OAAO,CAAC,oEAAoE,MAAM,wBAAwB,QAAQ,+DAA+D,CAC1M,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { CliState } from "../lib/types.js";
|
|
2
|
-
export declare function printSummary(state: CliState, isProduction: boolean): void;
|
|
2
|
+
export declare function printSummary(state: CliState, isProduction: boolean, hasDockerCompose?: boolean, hasDockerDaemon?: boolean): void;
|
|
3
3
|
//# sourceMappingURL=output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/utils/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/utils/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAuChD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE,OAAO,EACrB,gBAAgB,UAAO,EACvB,eAAe,UAAO,GACrB,IAAI,CAqDN"}
|
package/dist/src/utils/output.js
CHANGED
|
@@ -1,81 +1,88 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
function selectedOAuthProviders(state) {
|
|
3
3
|
const providers = state.oauthProviders?.filter((provider) => provider === "google" || provider === "github");
|
|
4
|
-
return providers
|
|
4
|
+
return providers ?? ["google", "github"];
|
|
5
5
|
}
|
|
6
6
|
function oauthProviderLabel(state) {
|
|
7
7
|
return selectedOAuthProviders(state)
|
|
8
8
|
.map((provider) => provider === "github" ? "GitHub" : "Google")
|
|
9
9
|
.join("/");
|
|
10
10
|
}
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
function authLabel(state) {
|
|
12
|
+
if (state.authMode === "base")
|
|
13
|
+
return "JWT";
|
|
14
|
+
if (state.authMode === "auth")
|
|
15
|
+
return "Email and password";
|
|
16
|
+
const providers = oauthProviderLabel(state);
|
|
17
|
+
return providers ? `Email, password, and ${providers}` : "Email and password";
|
|
18
|
+
}
|
|
19
|
+
function presetLabel(state) {
|
|
20
|
+
if (state.authMode === "fullstack")
|
|
21
|
+
return "Full-stack application";
|
|
22
|
+
if (state.authMode === "auth-oauth")
|
|
23
|
+
return "Express API + OAuth";
|
|
24
|
+
if (state.authMode === "auth")
|
|
25
|
+
return "Express API + email/password";
|
|
26
|
+
return "Express API (JWT only)";
|
|
27
|
+
}
|
|
28
|
+
function databaseLabel(state) {
|
|
29
|
+
if (!state.usePrisma)
|
|
30
|
+
return "None";
|
|
31
|
+
return state.database === "postgresql" ? "PostgreSQL with Prisma" : "SQLite with Prisma";
|
|
15
32
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
${state.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
`));
|
|
68
|
-
if (isProduction) {
|
|
69
|
-
console.log(`
|
|
70
|
-
š Production Ready Enabled:
|
|
71
|
-
|
|
72
|
-
ā PM2 installed
|
|
73
|
-
ā Cluster mode enabled
|
|
74
|
-
ā Memory auto-restart (300MB)
|
|
75
|
-
|
|
76
|
-
Run:
|
|
77
|
-
npm run pm2:start
|
|
78
|
-
`);
|
|
33
|
+
function runCommand(state, script) {
|
|
34
|
+
return `${state.packageManager ?? "npm"} run ${script}`;
|
|
35
|
+
}
|
|
36
|
+
export function printSummary(state, isProduction, hasDockerCompose = true, hasDockerDaemon = true) {
|
|
37
|
+
const packageManager = state.packageManager ?? "npm";
|
|
38
|
+
const commands = [
|
|
39
|
+
`cd ${state.projectName}`,
|
|
40
|
+
...(state.installDeps === false ? [`${packageManager} install`] : []),
|
|
41
|
+
...(hasDockerCompose && hasDockerDaemon ? [runCommand(state, "docker:up")] : []),
|
|
42
|
+
...(state.usePrisma
|
|
43
|
+
? [runCommand(state, state.authMode === "fullstack" ? "db:migrate" : "prisma:migrate")]
|
|
44
|
+
: []),
|
|
45
|
+
...(state.authMode === "fullstack" ? [runCommand(state, "db:seed")] : []),
|
|
46
|
+
runCommand(state, "dev"),
|
|
47
|
+
];
|
|
48
|
+
const details = [
|
|
49
|
+
["Location", `./${state.projectName}`],
|
|
50
|
+
["Preset", presetLabel(state)],
|
|
51
|
+
["Authentication", authLabel(state)],
|
|
52
|
+
["Database", databaseLabel(state)],
|
|
53
|
+
["Package manager", packageManager],
|
|
54
|
+
];
|
|
55
|
+
const labelWidth = Math.max(...details.map(([label]) => label.length));
|
|
56
|
+
console.log("");
|
|
57
|
+
console.log(`${chalk.green("ā")} ${chalk.green.bold(`${state.projectName} is ready`)}`);
|
|
58
|
+
console.log(chalk.dim("ā"));
|
|
59
|
+
for (const [label, value] of details) {
|
|
60
|
+
console.log(`${chalk.green("ā")} ${chalk.dim(label.padEnd(labelWidth))} ${value}`);
|
|
61
|
+
}
|
|
62
|
+
console.log(chalk.dim("ā"));
|
|
63
|
+
if (!hasDockerCompose) {
|
|
64
|
+
const services = state.database === "postgresql" ? "Redis and PostgreSQL" : "Redis";
|
|
65
|
+
console.log(`${chalk.yellow("!")} Docker Compose was not found. Install it or start ${services} manually.`);
|
|
66
|
+
console.log(chalk.dim("ā"));
|
|
67
|
+
}
|
|
68
|
+
else if (!hasDockerDaemon) {
|
|
69
|
+
console.log(`${chalk.yellow("!")} Docker is installed, but its daemon is not reachable. Start Docker Desktop or the Docker service.`);
|
|
70
|
+
console.log(chalk.dim("ā"));
|
|
71
|
+
}
|
|
72
|
+
console.log(`${chalk.cyan("ā")} ${chalk.bold("Next steps")}`);
|
|
73
|
+
for (const command of commands) {
|
|
74
|
+
console.log(` ${chalk.cyan(command)}`);
|
|
75
|
+
}
|
|
76
|
+
if (state.authMode === "fullstack") {
|
|
77
|
+
console.log(chalk.dim("\n Web http://localhost:5173"));
|
|
78
|
+
console.log(chalk.dim(" API http://localhost:3000/api"));
|
|
79
|
+
}
|
|
80
|
+
if (state.authMode === "auth-oauth") {
|
|
81
|
+
console.log(chalk.dim(`\n Configure ${oauthProviderLabel(state)} OAuth credentials in .env before testing sign-in.`));
|
|
82
|
+
}
|
|
83
|
+
if (isProduction && state.authMode !== "fullstack") {
|
|
84
|
+
console.log(chalk.dim(`\n Production process ${runCommand(state, "pm2:start")}`));
|
|
79
85
|
}
|
|
86
|
+
console.log(chalk.dim("\n Review .env, README.md, and THREAT_MODEL.md before deployment.\n"));
|
|
80
87
|
}
|
|
81
88
|
//# sourceMappingURL=output.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/utils/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,SAAS,sBAAsB,CAAC,KAAe;IAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1D,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAC/C,CAAC;IAEF,OAAO,SAAS,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/utils/output.ts"],"names":[],"mappings":"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"}
|