create-authenik8-app 2.4.12 → 2.4.14

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.
Files changed (235) hide show
  1. package/README.md +160 -57
  2. package/assets/logo.svg +53 -0
  3. package/dist/src/bin/index.js +199 -125
  4. package/dist/src/bin/index.js.map +1 -1
  5. package/dist/src/lib/args.d.ts +18 -0
  6. package/dist/src/lib/args.d.ts.map +1 -0
  7. package/dist/src/lib/args.js +82 -0
  8. package/dist/src/lib/args.js.map +1 -0
  9. package/dist/src/lib/constants.d.ts +1 -0
  10. package/dist/src/lib/constants.d.ts.map +1 -1
  11. package/dist/src/lib/constants.js +10 -11
  12. package/dist/src/lib/constants.js.map +1 -1
  13. package/dist/src/lib/preflight.d.ts +3 -0
  14. package/dist/src/lib/preflight.d.ts.map +1 -0
  15. package/dist/src/lib/preflight.js +21 -0
  16. package/dist/src/lib/preflight.js.map +1 -0
  17. package/dist/src/lib/process.d.ts +6 -2
  18. package/dist/src/lib/process.d.ts.map +1 -1
  19. package/dist/src/lib/process.js +66 -8
  20. package/dist/src/lib/process.js.map +1 -1
  21. package/dist/src/lib/projectName.d.ts +2 -0
  22. package/dist/src/lib/projectName.d.ts.map +1 -0
  23. package/dist/src/lib/projectName.js +6 -0
  24. package/dist/src/lib/projectName.js.map +1 -0
  25. package/dist/src/lib/schemas.d.ts +192 -0
  26. package/dist/src/lib/schemas.d.ts.map +1 -0
  27. package/dist/src/lib/schemas.js +171 -0
  28. package/dist/src/lib/schemas.js.map +1 -0
  29. package/dist/src/lib/state.d.ts.map +1 -1
  30. package/dist/src/lib/state.js +20 -3
  31. package/dist/src/lib/state.js.map +1 -1
  32. package/dist/src/lib/types.d.ts +6 -13
  33. package/dist/src/lib/types.d.ts.map +1 -1
  34. package/dist/src/lib/ui.d.ts +8 -3
  35. package/dist/src/lib/ui.d.ts.map +1 -1
  36. package/dist/src/lib/ui.js +76 -112
  37. package/dist/src/lib/ui.js.map +1 -1
  38. package/dist/src/steps/configurePrisma.d.ts.map +1 -1
  39. package/dist/src/steps/configurePrisma.js +83 -9
  40. package/dist/src/steps/configurePrisma.js.map +1 -1
  41. package/dist/src/steps/createProject.d.ts +2 -1
  42. package/dist/src/steps/createProject.d.ts.map +1 -1
  43. package/dist/src/steps/createProject.js +148 -27
  44. package/dist/src/steps/createProject.js.map +1 -1
  45. package/dist/src/steps/finalSetup.d.ts +3 -3
  46. package/dist/src/steps/finalSetup.d.ts.map +1 -1
  47. package/dist/src/steps/finalSetup.js +24 -28
  48. package/dist/src/steps/finalSetup.js.map +1 -1
  49. package/dist/src/steps/installAuth.d.ts +1 -1
  50. package/dist/src/steps/installAuth.d.ts.map +1 -1
  51. package/dist/src/steps/installAuth.js +5 -4
  52. package/dist/src/steps/installAuth.js.map +1 -1
  53. package/dist/src/steps/installDeps.d.ts +11 -4
  54. package/dist/src/steps/installDeps.d.ts.map +1 -1
  55. package/dist/src/steps/installDeps.js +45 -77
  56. package/dist/src/steps/installDeps.js.map +1 -1
  57. package/dist/src/steps/prompts.d.ts +1 -1
  58. package/dist/src/steps/prompts.d.ts.map +1 -1
  59. package/dist/src/steps/prompts.js +42 -30
  60. package/dist/src/steps/prompts.js.map +1 -1
  61. package/dist/src/utils/jwk.d.ts +2 -0
  62. package/dist/src/utils/jwk.d.ts.map +1 -0
  63. package/dist/src/utils/jwk.js +44 -0
  64. package/dist/src/utils/jwk.js.map +1 -0
  65. package/dist/src/utils/output.d.ts +1 -1
  66. package/dist/src/utils/output.d.ts.map +1 -1
  67. package/dist/src/utils/output.js +75 -68
  68. package/dist/src/utils/output.js.map +1 -1
  69. package/package.json +17 -9
  70. package/templates/AGENT_IDENTITY.md +112 -0
  71. package/templates/THREAT_MODEL.md +27 -5
  72. package/templates/express-auth/README.md +13 -10
  73. package/templates/express-auth/docker-compose.yml +10 -0
  74. package/templates/express-auth/gitignore.template +6 -0
  75. package/templates/express-auth/package.json +12 -5
  76. package/templates/express-auth/src/app.ts +2 -0
  77. package/templates/express-auth/src/controllers/auth.controller.ts +2 -6
  78. package/templates/express-auth/src/controllers/protected.controller.ts +25 -10
  79. package/templates/express-auth/src/middleware/auth.middleware.ts +1 -0
  80. package/templates/express-auth/src/routes/protected.routes.ts +3 -1
  81. package/templates/express-auth/src/server.ts +6 -12
  82. package/templates/express-auth/src/utils/security.ts +119 -32
  83. package/templates/express-auth+/README.md +13 -10
  84. package/templates/express-auth+/docker-compose.yml +10 -0
  85. package/templates/express-auth+/gitignore.template +6 -0
  86. package/templates/express-auth+/package.json +12 -5
  87. package/templates/express-auth+/src/auth/auth.ts +3 -2
  88. package/templates/express-auth+/src/auth/controllers/password.controller.ts +3 -7
  89. package/templates/express-auth+/src/auth/controllers/protected.controller.ts +26 -11
  90. package/templates/express-auth+/src/auth/identity.adapter.ts +90 -0
  91. package/templates/express-auth+/src/auth/middleware/auth.middleware.ts +3 -4
  92. package/templates/express-auth+/src/auth/routes/protected.routes.ts +2 -2
  93. package/templates/express-auth+/src/oauth-providers/github/src/auth/auth.ts +3 -2
  94. package/templates/express-auth+/src/oauth-providers/google/src/auth/auth.ts +3 -2
  95. package/templates/express-auth+/src/oauth-providers/google-github/src/auth/auth.ts +3 -2
  96. package/templates/express-auth+/src/server.ts +5 -10
  97. package/templates/express-auth+/src/utils/security.ts +109 -28
  98. package/templates/express-base/README.md +13 -6
  99. package/templates/express-base/app.ts +2 -0
  100. package/templates/express-base/controllers/base.controller.ts +33 -19
  101. package/templates/express-base/docker-compose.yml +10 -0
  102. package/templates/express-base/gitignore.template +6 -0
  103. package/templates/express-base/package.json +11 -5
  104. package/templates/express-base/routes/base.routes.ts +1 -1
  105. package/templates/express-base/src/.env.example +7 -2
  106. package/templates/express-base/src/server.ts +6 -12
  107. package/templates/express-base/tsconfig.json +7 -40
  108. package/templates/express-base/utils/security.ts +111 -15
  109. package/templates/fullstack/.env.example +24 -0
  110. package/templates/fullstack/PRESET_CONTRACT.md +46 -0
  111. package/templates/fullstack/README.md +65 -0
  112. package/templates/fullstack/THREAT_MODEL.md +30 -0
  113. package/templates/fullstack/apps/api/package.json +48 -0
  114. package/templates/fullstack/apps/api/prisma/schema.prisma +124 -0
  115. package/templates/fullstack/apps/api/prisma/seed.ts +36 -0
  116. package/templates/fullstack/apps/api/prisma.config.ts +18 -0
  117. package/templates/fullstack/apps/api/src/app.ts +68 -0
  118. package/templates/fullstack/apps/api/src/auth/auth.controller.ts +125 -0
  119. package/templates/fullstack/apps/api/src/auth/auth.routes.ts +50 -0
  120. package/templates/fullstack/apps/api/src/auth/auth.service.ts +257 -0
  121. package/templates/fullstack/apps/api/src/auth/authenik8.ts +67 -0
  122. package/templates/fullstack/apps/api/src/auth/cookies.ts +36 -0
  123. package/templates/fullstack/apps/api/src/config/env.ts +72 -0
  124. package/templates/fullstack/apps/api/src/config/logger.ts +17 -0
  125. package/templates/fullstack/apps/api/src/config/mailer.ts +32 -0
  126. package/templates/fullstack/apps/api/src/config/origins.ts +27 -0
  127. package/templates/fullstack/apps/api/src/config/prisma.ts +9 -0
  128. package/templates/fullstack/apps/api/src/middleware/authenticate.ts +35 -0
  129. package/templates/fullstack/apps/api/src/middleware/csrf.ts +60 -0
  130. package/templates/fullstack/apps/api/src/middleware/origin.ts +12 -0
  131. package/templates/fullstack/apps/api/src/middleware/request-id.ts +9 -0
  132. package/templates/fullstack/apps/api/src/modules/admin/admin.controller.ts +17 -0
  133. package/templates/fullstack/apps/api/src/modules/admin/admin.routes.ts +14 -0
  134. package/templates/fullstack/apps/api/src/modules/admin/admin.service.ts +54 -0
  135. package/templates/fullstack/apps/api/src/modules/projects/project.controller.ts +22 -0
  136. package/templates/fullstack/apps/api/src/modules/projects/project.policy.ts +14 -0
  137. package/templates/fullstack/apps/api/src/modules/projects/project.repository.ts +20 -0
  138. package/templates/fullstack/apps/api/src/modules/projects/project.routes.ts +21 -0
  139. package/templates/fullstack/apps/api/src/modules/projects/project.service.ts +41 -0
  140. package/templates/fullstack/apps/api/src/modules/users/user.controller.ts +26 -0
  141. package/templates/fullstack/apps/api/src/modules/users/user.presenter.ts +13 -0
  142. package/templates/fullstack/apps/api/src/modules/users/user.routes.ts +21 -0
  143. package/templates/fullstack/apps/api/src/modules/users/user.service.ts +71 -0
  144. package/templates/fullstack/apps/api/src/openapi.ts +32 -0
  145. package/templates/fullstack/apps/api/src/server.ts +29 -0
  146. package/templates/fullstack/apps/api/src/types.ts +15 -0
  147. package/templates/fullstack/apps/api/src/utils/crypto.ts +4 -0
  148. package/templates/fullstack/apps/api/src/utils/http.ts +33 -0
  149. package/templates/fullstack/apps/api/src/utils/sealed-value.ts +37 -0
  150. package/templates/fullstack/apps/api/tests/project.policy.test.ts +26 -0
  151. package/templates/fullstack/apps/api/tests/registration.test.ts +69 -0
  152. package/templates/fullstack/apps/api/tests/security.test.ts +98 -0
  153. package/templates/fullstack/apps/api/tests/validation.test.ts +37 -0
  154. package/templates/fullstack/apps/api/tsconfig.json +16 -0
  155. package/templates/fullstack/apps/api/vitest.config.ts +9 -0
  156. package/templates/fullstack/apps/web/index.html +14 -0
  157. package/templates/fullstack/apps/web/package.json +31 -0
  158. package/templates/fullstack/apps/web/public/authenik8-logo.svg +53 -0
  159. package/templates/fullstack/apps/web/src/App.tsx +45 -0
  160. package/templates/fullstack/apps/web/src/auth/AuthProvider.tsx +53 -0
  161. package/templates/fullstack/apps/web/src/auth/RouteGuards.tsx +16 -0
  162. package/templates/fullstack/apps/web/src/auth/providers.ts +3 -0
  163. package/templates/fullstack/apps/web/src/components/AppShell.tsx +80 -0
  164. package/templates/fullstack/apps/web/src/components/AuthShell.tsx +26 -0
  165. package/templates/fullstack/apps/web/src/components/Page.tsx +30 -0
  166. package/templates/fullstack/apps/web/src/features/projects/ProjectPages.tsx +79 -0
  167. package/templates/fullstack/apps/web/src/main.tsx +24 -0
  168. package/templates/fullstack/apps/web/src/pages/DashboardPage.tsx +48 -0
  169. package/templates/fullstack/apps/web/src/pages/StatusPages.tsx +8 -0
  170. package/templates/fullstack/apps/web/src/pages/admin/AuditPage.tsx +19 -0
  171. package/templates/fullstack/apps/web/src/pages/admin/UsersPage.tsx +24 -0
  172. package/templates/fullstack/apps/web/src/pages/auth/LoginPage.tsx +51 -0
  173. package/templates/fullstack/apps/web/src/pages/auth/OAuthCallbackPage.tsx +26 -0
  174. package/templates/fullstack/apps/web/src/pages/auth/RecoveryPages.tsx +53 -0
  175. package/templates/fullstack/apps/web/src/pages/auth/RegisterPage.tsx +86 -0
  176. package/templates/fullstack/apps/web/src/pages/auth/VerifyEmailPage.tsx +24 -0
  177. package/templates/fullstack/apps/web/src/pages/settings/ProfilePage.tsx +34 -0
  178. package/templates/fullstack/apps/web/src/pages/settings/SecurityPage.tsx +57 -0
  179. package/templates/fullstack/apps/web/src/styles.css +289 -0
  180. package/templates/fullstack/apps/web/src/token-storage.test.ts +12 -0
  181. package/templates/fullstack/apps/web/tsconfig.app.json +19 -0
  182. package/templates/fullstack/apps/web/tsconfig.json +7 -0
  183. package/templates/fullstack/apps/web/tsconfig.node.json +10 -0
  184. package/templates/fullstack/apps/web/vite.config.ts +18 -0
  185. package/templates/fullstack/docker-compose.yml +35 -0
  186. package/templates/fullstack/docs/PRODUCTION.md +30 -0
  187. package/templates/fullstack/gitignore.template +8 -0
  188. package/templates/fullstack/package.json +39 -0
  189. package/templates/fullstack/packages/api-client/package.json +20 -0
  190. package/templates/fullstack/packages/api-client/src/index.ts +203 -0
  191. package/templates/fullstack/packages/api-client/tsconfig.json +14 -0
  192. package/templates/fullstack/packages/contracts/package.json +20 -0
  193. package/templates/fullstack/packages/contracts/src/index.ts +146 -0
  194. package/templates/fullstack/packages/contracts/tsconfig.json +13 -0
  195. package/templates/fullstack/packages/ui/package.json +22 -0
  196. package/templates/fullstack/packages/ui/src/index.tsx +33 -0
  197. package/templates/fullstack/packages/ui/tsconfig.json +14 -0
  198. package/templates/prisma/postgresql/.env.example +6 -2
  199. package/templates/prisma/postgresql/client.ts +17 -0
  200. package/templates/prisma/postgresql/prisma.config.ts +12 -0
  201. package/templates/prisma/postgresql/schema.prisma +0 -1
  202. package/templates/prisma/sqlite/.env.example +6 -2
  203. package/templates/prisma/sqlite/client.ts +16 -0
  204. package/templates/prisma/sqlite/prisma.config.ts +12 -0
  205. package/templates/prisma/sqlite/schema.prisma +0 -1
  206. package/dist/src/tests/templated-routes.test.d.ts +0 -2
  207. package/dist/src/tests/templated-routes.test.d.ts.map +0 -1
  208. package/dist/src/tests/templated-routes.test.js +0 -325
  209. package/dist/src/tests/templated-routes.test.js.map +0 -1
  210. package/dist/templates/THREAT_MODEL.md +0 -138
  211. package/dist/templates/express-auth/src/controllers/protected.controller.d.ts +0 -8
  212. package/dist/templates/express-auth/src/controllers/protected.controller.d.ts.map +0 -1
  213. package/dist/templates/express-auth/src/controllers/protected.controller.js +0 -50
  214. package/dist/templates/express-auth/src/controllers/protected.controller.js.map +0 -1
  215. package/dist/templates/express-auth/src/routes/protected.routes.d.ts +0 -2
  216. package/dist/templates/express-auth/src/routes/protected.routes.d.ts.map +0 -1
  217. package/dist/templates/express-auth/src/routes/protected.routes.js +0 -16
  218. package/dist/templates/express-auth/src/routes/protected.routes.js.map +0 -1
  219. package/dist/templates/express-auth/src/utils/security.d.ts +0 -8
  220. package/dist/templates/express-auth/src/utils/security.d.ts.map +0 -1
  221. package/dist/templates/express-auth/src/utils/security.js +0 -55
  222. package/dist/templates/express-auth/src/utils/security.js.map +0 -1
  223. package/dist/templates/express-base/controllers/base.controller.d.ts +0 -12
  224. package/dist/templates/express-base/controllers/base.controller.d.ts.map +0 -1
  225. package/dist/templates/express-base/controllers/base.controller.js +0 -77
  226. package/dist/templates/express-base/controllers/base.controller.js.map +0 -1
  227. package/dist/templates/express-base/routes/base.routes.d.ts +0 -2
  228. package/dist/templates/express-base/routes/base.routes.d.ts.map +0 -1
  229. package/dist/templates/express-base/routes/base.routes.js +0 -20
  230. package/dist/templates/express-base/routes/base.routes.js.map +0 -1
  231. package/dist/templates/express-base/utils/security.d.ts +0 -5
  232. package/dist/templates/express-base/utils/security.d.ts.map +0 -1
  233. package/dist/templates/express-base/utils/security.js +0 -40
  234. package/dist/templates/express-base/utils/security.js.map +0 -1
  235. package/dist/templates/package.json +0 -27
@@ -1,100 +1,68 @@
1
- import { execSync } from "child_process";
2
- import { run, getCommand, exitForInterrupt } from "../lib/process.js";
3
- import { spinner } from "../lib/ui.js";
4
- function commandSucceeds(command) {
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
- catch { }
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 getRedisInstallCommand() {
33
- if (process.platform === "darwin" && commandSucceeds("brew --version")) {
34
- return "brew install redis";
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 null;
28
+ return requested ?? detectPackageManager(env);
54
29
  }
55
- export function ensureRedisServerInstalled() {
56
- if (commandSucceeds("redis-server --version")) {
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, targetDir) {
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 ["install", "--prefer-offline", "--no-audit", "--no-fund"];
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
- spinner.start("Installing Redis server if needed...");
79
- try {
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, targetDir), {
56
+ await run(getCommand(pm), getInstallArgs(pm), {
91
57
  cwd: targetDir,
92
- stdio: "ignore",
58
+ stdio: hideProgress ? "pipe" : "inherit",
93
59
  });
94
- spinner.stop();
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":"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"}
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(state: CliState, isProduction: boolean): Promise<Partial<CliState>>;
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;AAGhD,wBAAsB,UAAU,CAAC,KAAK,EAAC,QAAQ,EAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CA2FjG"}
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
- export async function runPrompts(state, isProduction) {
4
- const bunAvailable = hasBun();
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: "framework",
9
- message: "Choose framework:",
13
+ name: "authMode",
14
+ message: "Select a preset:",
10
15
  choices: [
11
- "Express",
12
- { name: "Fastify (coming soon)", value: "Fastify", disabled: "Coming soon" },
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: "Express",
21
+ default: "fullstack",
15
22
  },
16
23
  {
17
- type: "list",
18
- name: "authMode",
19
- message: "Choose authentication setup:",
24
+ type: "checkbox",
25
+ name: "authMethods",
26
+ message: "Select authentication methods:",
20
27
  choices: [
21
- { name: "JWT only", value: "base" },
22
- { name: "Email + Password Auth", value: "auth" },
23
- { name: "Full Auth (Password + OAuth)", value: "auth-oauth" },
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
- default: "base",
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: "Choose OAuth providers:",
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) => Array.isArray(choices) && choices.length > 0
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: "Use Prisma?",
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: "Choose database:",
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.usePrisma || answers.authMode === "auth" || answers.authMode === "auth-oauth",
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 git?",
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
- if (result.runtime === "bun" && !bunAvailable) {
88
- result.runtime = "node";
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 result;
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":"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"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/steps/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function configureSigningKeys(targetDir: string, projectName: string): Promise<void>;
2
+ //# sourceMappingURL=jwk.d.ts.map
@@ -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;AAsBhD,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,CAsEzE"}
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"}
@@ -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?.length ? providers : ["google", "github"];
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 oauthRouteLines(state) {
12
- return selectedOAuthProviders(state)
13
- .map((provider) => ` GET /auth/${provider}`)
14
- .join("\n");
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
- export function printSummary(state, isProduction) {
17
- console.log(chalk.green.bold("\nšŸŽ‰ Authenik8 app created successfully!\n"));
18
- console.log(chalk.white(`
19
- Next steps:
20
-
21
- cd ${state.projectName}
22
- ${state.usePrisma ? "npm run prisma:migrate\n" : ""}redis-server --daemonize yes
23
- npm run dev
24
-
25
- Before running, review .env and replace generated development values for deployed environments.
26
- ${state.authMode === "auth-oauth" ? `For OAuth, set real ${oauthProviderLabel(state)} client IDs, secrets, and redirect URLs in .env.\n` : ""}
27
-
28
- Auth Features:
29
- ${state.authMode === "base"
30
- ? "āœ“ JWT only"
31
- : state.authMode === "auth"
32
- ? "āœ“ Email + Password"
33
- : `āœ“ Password + OAuth (${oauthProviderLabel(state)})`}
34
-
35
- šŸ›  Stack:
36
- āœ” Express
37
- āœ” ${state.usePrisma ? (state.database === "postgresql" ? "PostgreSQL" : "SQLite") : "No database"}
38
- āœ” ${state.usePrisma ? "Prisma ORM" : "No ORM"}
39
-
40
- šŸ“” API Routes:
41
- ${state.authMode === "base"
42
- ? `
43
- GET /public
44
- GET /guest
45
- GET /protected
46
- POST /refresh
47
- `
48
- : state.authMode === "auth"
49
- ? `
50
- POST /auth/register
51
- POST /auth/login
52
- POST /auth/refresh
53
- GET /protected
54
- `
55
- : `
56
- POST /auth/register
57
- POST /auth/login
58
- POST /auth/refresh
59
- ${oauthRouteLines(state)}
60
- GET /protected
61
- `}
62
- āœ… Done! Enjoying authenik8?
63
- ⭐ Star us → github.com/COD434/create-authenik8-app
64
- šŸ’¬ Drop feedback → github.com/COD434/create-authenik8-app/discussions
65
-
66
- šŸ”„ You're ready to build.
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,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAe;IACzC,OAAO,sBAAsB,CAAC,KAAK,CAAC;SACjC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;SAC9D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAe;IACtC,OAAO,sBAAsB,CAAC,KAAK,CAAC;SACjC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,QAAQ,EAAE,CAAC;SAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAe,EAAE,YAAqB;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;IAE5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;;;KAGrB,KAAK,CAAC,WAAW;EACpB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE;;;;EAIjD,KAAK,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,uBAAuB,kBAAkB,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC,EAAE;;;EAI3I,KAAK,CAAC,QAAQ,KAAK,MAAM;QACvB,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM;YAC3B,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,uBAAuB,kBAAkB,CAAC,KAAK,CAAC,GACtD;;;;IAII,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa;IAC7F,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ;;;EAI3C,KAAK,CAAC,QAAQ,KAAK,MAAM;QACvB,CAAC,CAAC;;;;;CAKL;QACG,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM;YAC3B,CAAC,CAAC;;;;;CAKL;YACG,CAAC,CAAC;;;;EAIJ,eAAe,CAAC,KAAK,CAAC;;CAGxB;;;;;;CAMC,CAAC,CAAC,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;CASf,CAAC,CAAC;IACD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/utils/output.ts"],"names":[],"mappings":"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"}