create-authenik8-app 2.4.5 → 2.4.7

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 (87) hide show
  1. package/dist/src/bin/index.d.ts +3 -0
  2. package/dist/src/bin/index.d.ts.map +1 -0
  3. package/dist/src/bin/index.js +275 -0
  4. package/dist/src/bin/index.js.map +1 -0
  5. package/dist/src/lib/constants.d.ts +4 -0
  6. package/dist/src/lib/constants.d.ts.map +1 -0
  7. package/dist/src/lib/constants.js +25 -0
  8. package/dist/src/lib/constants.js.map +1 -0
  9. package/dist/src/lib/process.d.ts +7 -0
  10. package/dist/src/lib/process.d.ts.map +1 -0
  11. package/dist/src/lib/process.js +60 -0
  12. package/dist/src/lib/process.js.map +1 -0
  13. package/dist/src/lib/state.d.ts +8 -0
  14. package/dist/src/lib/state.d.ts.map +1 -0
  15. package/dist/src/lib/state.js +31 -0
  16. package/dist/src/lib/state.js.map +1 -0
  17. package/dist/src/lib/types.d.ts +19 -0
  18. package/dist/src/lib/types.d.ts.map +1 -0
  19. package/dist/src/lib/types.js +2 -0
  20. package/dist/src/lib/types.js.map +1 -0
  21. package/dist/src/lib/ui.d.ts +7 -0
  22. package/dist/src/lib/ui.d.ts.map +1 -0
  23. package/dist/src/lib/ui.js +124 -0
  24. package/dist/src/lib/ui.js.map +1 -0
  25. package/dist/src/steps/configurePrisma.d.ts +3 -0
  26. package/dist/src/steps/configurePrisma.d.ts.map +1 -0
  27. package/dist/src/steps/configurePrisma.js +62 -0
  28. package/dist/src/steps/configurePrisma.js.map +1 -0
  29. package/dist/src/steps/createProject.d.ts +5 -0
  30. package/dist/src/steps/createProject.d.ts.map +1 -0
  31. package/dist/src/steps/createProject.js +202 -0
  32. package/dist/src/steps/createProject.js.map +1 -0
  33. package/dist/src/steps/finalSetup.d.ts +7 -0
  34. package/dist/src/steps/finalSetup.d.ts.map +1 -0
  35. package/dist/src/steps/finalSetup.js +110 -0
  36. package/dist/src/steps/finalSetup.js.map +1 -0
  37. package/dist/src/steps/installAuth.d.ts +3 -0
  38. package/dist/src/steps/installAuth.d.ts.map +1 -0
  39. package/dist/src/steps/installAuth.js +16 -0
  40. package/dist/src/steps/installAuth.js.map +1 -0
  41. package/dist/src/steps/installDeps.d.ts +5 -0
  42. package/dist/src/steps/installDeps.d.ts.map +1 -0
  43. package/dist/src/steps/installDeps.js +99 -0
  44. package/dist/src/steps/installDeps.js.map +1 -0
  45. package/dist/src/steps/prompts.d.ts +3 -0
  46. package/dist/src/steps/prompts.d.ts.map +1 -0
  47. package/dist/src/steps/prompts.js +93 -0
  48. package/dist/src/steps/prompts.js.map +1 -0
  49. package/dist/src/tests/templated-routes.test.d.ts +2 -0
  50. package/dist/src/tests/templated-routes.test.d.ts.map +1 -0
  51. package/dist/src/tests/templated-routes.test.js +325 -0
  52. package/dist/src/tests/templated-routes.test.js.map +1 -0
  53. package/dist/src/utils/hash.d.ts +4 -0
  54. package/dist/src/utils/hash.d.ts.map +1 -0
  55. package/dist/src/utils/hash.js +17 -0
  56. package/dist/src/utils/hash.js.map +1 -0
  57. package/dist/src/utils/output.d.ts +3 -0
  58. package/dist/src/utils/output.d.ts.map +1 -0
  59. package/dist/src/utils/output.js +81 -0
  60. package/dist/src/utils/output.js.map +1 -0
  61. package/dist/templates/THREAT_MODEL.md +138 -0
  62. package/dist/templates/express-auth/src/controllers/protected.controller.d.ts +8 -0
  63. package/dist/templates/express-auth/src/controllers/protected.controller.d.ts.map +1 -0
  64. package/dist/templates/express-auth/src/controllers/protected.controller.js +50 -0
  65. package/dist/templates/express-auth/src/controllers/protected.controller.js.map +1 -0
  66. package/dist/templates/express-auth/src/routes/protected.routes.d.ts +2 -0
  67. package/dist/templates/express-auth/src/routes/protected.routes.d.ts.map +1 -0
  68. package/dist/templates/express-auth/src/routes/protected.routes.js +16 -0
  69. package/dist/templates/express-auth/src/routes/protected.routes.js.map +1 -0
  70. package/dist/templates/express-auth/src/utils/security.d.ts +8 -0
  71. package/dist/templates/express-auth/src/utils/security.d.ts.map +1 -0
  72. package/dist/templates/express-auth/src/utils/security.js +55 -0
  73. package/dist/templates/express-auth/src/utils/security.js.map +1 -0
  74. package/dist/templates/express-base/controllers/base.controller.d.ts +12 -0
  75. package/dist/templates/express-base/controllers/base.controller.d.ts.map +1 -0
  76. package/dist/templates/express-base/controllers/base.controller.js +77 -0
  77. package/dist/templates/express-base/controllers/base.controller.js.map +1 -0
  78. package/dist/templates/express-base/routes/base.routes.d.ts +2 -0
  79. package/dist/templates/express-base/routes/base.routes.d.ts.map +1 -0
  80. package/dist/templates/express-base/routes/base.routes.js +20 -0
  81. package/dist/templates/express-base/routes/base.routes.js.map +1 -0
  82. package/dist/templates/express-base/utils/security.d.ts +5 -0
  83. package/dist/templates/express-base/utils/security.d.ts.map +1 -0
  84. package/dist/templates/express-base/utils/security.js +40 -0
  85. package/dist/templates/express-base/utils/security.js.map +1 -0
  86. package/dist/templates/package.json +27 -0
  87. package/package.json +7 -6
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bin/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,275 @@
1
+ #!/usr/bin/env node
2
+ import fs from "fs-extra";
3
+ import path from "path";
4
+ import chalk from "chalk";
5
+ import { ExitPromptError } from "@inquirer/core";
6
+ import { fileURLToPath } from "url";
7
+ import { initState, saveState, loadState, clearState, hasReachedStep, getState } from "../lib/state.js";
8
+ import { killAllProcesses } from "../lib/process.js";
9
+ import { showBootLogo, renderStep, spinner } from "../lib/ui.js";
10
+ import { runPrompts } from "../steps/prompts.js";
11
+ import { createProject, configurePackageJson } from "../steps/createProject.js";
12
+ import { installAuth } from "../steps/installAuth.js";
13
+ import { configurePrisma } from "../steps/configurePrisma.js";
14
+ import { installDependencies, detectPackageManager } from "../steps/installDeps.js";
15
+ import { configureProduction, initGit, appendProductionReadme, resolveRuntime } from "../steps/finalSetup.js";
16
+ import { printSummary } from "../utils/output.js";
17
+ const __filename = fileURLToPath(import.meta.url);
18
+ const __dirname = path.dirname(__filename);
19
+ const args = process.argv.slice(2);
20
+ const projectNameArg = args.find((arg) => !arg.startsWith("--"));
21
+ if (!projectNameArg) {
22
+ console.log(chalk.red("❌ Please provide a project name\n Usage:\n npx create-authenik8-app <project-name>\n Run with --help for more info"));
23
+ process.exit(1);
24
+ }
25
+ const projectName = projectNameArg;
26
+ const isProduction = args.includes("--production-ready");
27
+ const isResume = args.includes("--resume");
28
+ const targetDir = path.resolve(process.cwd(), projectName);
29
+ const templateRoot = path.resolve(__dirname, "../../templates");
30
+ const globalStateDir = path.join(process.cwd(), ".authenik8");
31
+ const stateFile = path.join(globalStateDir, `${projectName}.json`);
32
+ //handles shutdown during resume
33
+ let shuttingDown = false;
34
+ const handleShutdown = async () => {
35
+ if (shuttingDown)
36
+ return;
37
+ shuttingDown = true;
38
+ console.log("\n");
39
+ spinner.stop();
40
+ killAllProcesses();
41
+ console.log(chalk.yellow("⏸ Setup interrupted."));
42
+ try {
43
+ const current = getState();
44
+ if (current && current.step && current.step !== "done") {
45
+ saveState({ ...current });
46
+ }
47
+ }
48
+ catch (_) { }
49
+ console.log(chalk.gray(`↻ Resume anytime with:`));
50
+ console.log(chalk.cyan(` npx create-authenik8-app ${projectName} --resume`));
51
+ process.exit(0);
52
+ };
53
+ process.prependListener('SIGINT', handleShutdown);
54
+ process.prependListener('SIGTERM', handleShutdown);
55
+ process.on('exit', () => {
56
+ killAllProcesses();
57
+ });
58
+ let projectCreated = false;
59
+ initState({ step: "start", projectName }, stateFile);
60
+ async function cleanupIncompleteProject() {
61
+ if (projectCreated && fs.existsSync(targetDir)) {
62
+ await fs.remove(targetDir);
63
+ console.log("🧹 Cleaned up incomplete project.");
64
+ }
65
+ }
66
+ function assertRequired(value, name) {
67
+ if (value === undefined || value === null || value === "") {
68
+ console.log(`❌ Missing required input: ${name}`);
69
+ process.exit(1);
70
+ }
71
+ }
72
+ async function main() {
73
+ try {
74
+ await showBootLogo();
75
+ if (args.includes("--help")) {
76
+ console.log(`
77
+ Authenik8 CLI
78
+
79
+ Usage:
80
+ npx create-authenik8-app <project-name>
81
+
82
+ Options:
83
+ --resume Resume project setup
84
+ --help Show this help message
85
+ --production-ready production mode
86
+
87
+ Features:
88
+ Express backend (default)
89
+ Optional Prisma ORM
90
+ PostgreSQL (production)
91
+ SQLite (quick start)
92
+ Optional Git initialization
93
+ Optional OAuth
94
+
95
+ Examples:
96
+ create-authenik8-app my-app
97
+ `);
98
+ process.exit(0);
99
+ }
100
+ console.log(chalk.gray(`
101
+ Available options:
102
+ Authentication setup:
103
+ • base (JWT only)
104
+ • auth (JWT + Password/Email auth)
105
+ • auth-oauth(JWT+ Password/Email + oauth)
106
+
107
+
108
+ Frameworks:
109
+ • Express
110
+
111
+ Database (if Prisma enabled):
112
+ • PostgreSQL
113
+ • SQLite (quick start)
114
+
115
+ Features:
116
+ • Prisma ORM (optional)
117
+ • Git initialization (optional)
118
+ • OAuth + Auth
119
+ `));
120
+ const savedState = loadState(stateFile);
121
+ let currentStep = "start";
122
+ if (!isResume && fs.existsSync(targetDir)) {
123
+ if (savedState) {
124
+ console.log(chalk.red(`❌ "${projectName}" already contains an incomplete Authenik8 setup. Run again with --resume.`));
125
+ }
126
+ else {
127
+ console.log(chalk.red(`❌ Directory "${projectName}" already exists.`));
128
+ }
129
+ process.exit(1);
130
+ }
131
+ if (isResume || fs.existsSync(stateFile)) {
132
+ console.log(chalk.gray(`
133
+ Resumable steps:
134
+ ✔ project scaffold
135
+ ✔ auth install
136
+ ✔ prisma setup
137
+ ✔ deps install
138
+ ✔ prisma generate
139
+ ✔ git init
140
+ `));
141
+ }
142
+ if (isResume) {
143
+ if (!savedState) {
144
+ console.log(chalk.red(`❌ No saved setup state found for "${projectName}".`));
145
+ process.exit(1);
146
+ }
147
+ initState(savedState, stateFile);
148
+ currentStep = savedState.step;
149
+ console.log(chalk.yellow(`\n↻ Resuming setup for ${projectName} from "${currentStep}"...\n`));
150
+ }
151
+ else {
152
+ const promptAnswers = await runPrompts(getState(), isProduction);
153
+ saveState({ ...promptAnswers, step: "prompts" });
154
+ currentStep = "prompts";
155
+ }
156
+ const raw = getState();
157
+ if ((raw.authMode === "auth" || raw.authMode === "auth-oauth") && !raw.usePrisma) {
158
+ console.log(chalk.yellow("\n⚠ Auth and Auth+OAuth require Prisma — enabling automatically.\n"));
159
+ saveState({ usePrisma: true, database: raw.database ?? "sqlite" });
160
+ }
161
+ const state = getState();
162
+ const runtime = resolveRuntime(state.runtime);
163
+ assertRequired(state.framework, "framework");
164
+ assertRequired(state.authMode, "authMode");
165
+ if (state.usePrisma) {
166
+ if (!state.database)
167
+ saveState({ database: "sqlite" });
168
+ assertRequired(getState().database, "database");
169
+ }
170
+ console.log(chalk.cyan("\nSetting up your project\n"));
171
+ // Project scaffold
172
+ if (!hasReachedStep(currentStep, "project-created")) {
173
+ renderStep("project-created", isProduction);
174
+ try {
175
+ await createProject(getState(), targetDir, templateRoot);
176
+ projectCreated = true;
177
+ saveState({ step: "project-created" });
178
+ currentStep = "project-created";
179
+ renderStep(currentStep, isProduction);
180
+ }
181
+ catch (err) {
182
+ console.error(err);
183
+ process.exit(1);
184
+ }
185
+ }
186
+ else {
187
+ console.log(chalk.gray("↷ Skipping project creation (already completed)"));
188
+ }
189
+ // Auth install
190
+ let selectedHash = "bcryptjs";
191
+ if (!hasReachedStep(currentStep, "auth-installed")) {
192
+ if (getState().authMode !== "base") {
193
+ const pm = detectPackageManager();
194
+ selectedHash = await installAuth(targetDir, pm);
195
+ }
196
+ renderStep("auth-installed", isProduction);
197
+ saveState({ step: "auth-installed", ...(getState().authMode !== "base" && { hashLib: selectedHash }) });
198
+ currentStep = "auth-installed";
199
+ renderStep(currentStep, isProduction);
200
+ }
201
+ else {
202
+ selectedHash = savedState?.hashLib ?? selectedHash;
203
+ console.log(chalk.gray("↷ Skipping auth setup (already completed)"));
204
+ }
205
+ // Prisma config
206
+ if (!hasReachedStep(currentStep, "prisma-configured")) {
207
+ await configurePrisma(getState(), targetDir, templateRoot);
208
+ saveState({ step: "prisma-configured", ...(getState().authMode !== "base" && { hashLib: selectedHash }) });
209
+ currentStep = "prisma-configured";
210
+ renderStep(currentStep, isProduction);
211
+ }
212
+ else {
213
+ console.log(chalk.gray("↷ Skipping Prisma/package setup (already completed)"));
214
+ }
215
+ if (isProduction && !hasReachedStep(currentStep, "production-configured")) {
216
+ await configureProduction(targetDir, projectName, runtime);
217
+ saveState({ step: "production-configured", ...(getState().authMode !== "base" && { hashLib: selectedHash }) });
218
+ currentStep = "production-configured";
219
+ renderStep(currentStep, isProduction);
220
+ }
221
+ // Install deps
222
+ if (!hasReachedStep(currentStep, "deps-installed")) {
223
+ renderStep("deps-installed", isProduction);
224
+ configurePackageJson(targetDir, getState().usePrisma ?? false);
225
+ await installDependencies(targetDir);
226
+ saveState({ step: "deps-installed", ...(getState().authMode !== "base" && { hashLib: selectedHash }) });
227
+ currentStep = "deps-installed";
228
+ renderStep(currentStep, isProduction);
229
+ }
230
+ else {
231
+ console.log(chalk.gray("↷ Skipping dependency installation (already completed)"));
232
+ }
233
+ // Git init
234
+ if (!hasReachedStep(currentStep, "git-initialized")) {
235
+ if (getState().useGit) {
236
+ renderStep("git-initialized", isProduction);
237
+ await initGit(targetDir);
238
+ }
239
+ saveState({ step: "git-initialized", ...(getState().authMode !== "base" && { hashLib: selectedHash }) });
240
+ currentStep = "git-initialized";
241
+ renderStep("done", isProduction);
242
+ }
243
+ else {
244
+ console.log(chalk.gray("↷ Skipping git init (already completed)"));
245
+ }
246
+ // Done
247
+ if (isProduction) {
248
+ appendProductionReadme(targetDir, projectName);
249
+ }
250
+ printSummary(getState(), isProduction);
251
+ saveState({ step: "done", ...(getState().authMode !== "base" && { hashLib: selectedHash }) });
252
+ clearState();
253
+ }
254
+ catch (err) {
255
+ if (err instanceof ExitPromptError) {
256
+ throw err;
257
+ }
258
+ console.error("Fatal error", err);
259
+ process.exit(1);
260
+ }
261
+ }
262
+ main().catch(async (err) => {
263
+ if (err instanceof ExitPromptError) {
264
+ console.log("\n👋 Authenik8 setup cancelled. You can --resume later");
265
+ killAllProcesses();
266
+ await new Promise((r) => setTimeout(r, 300));
267
+ console.log(chalk.bgYellow.black(" SETUP CANCELLED "));
268
+ await cleanupIncompleteProject();
269
+ process.exit(0);
270
+ }
271
+ console.error(chalk.red("\n❌ Unexpected error:"), err);
272
+ await cleanupIncompleteProject();
273
+ process.exit(1);
274
+ });
275
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bin/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { StepName } from "./types.js";
2
+ export declare const stepOrder: StepName[];
3
+ export declare const stepLabels: Record<StepName, string>;
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,SAAS,EAAE,QAAQ,EAW/B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAW/C,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const stepOrder = [
2
+ "start",
3
+ "prompts",
4
+ "project-created",
5
+ "auth-installed",
6
+ "prisma-configured",
7
+ "production-configured",
8
+ "deps-installed",
9
+ "prisma-generated",
10
+ "git-initialized",
11
+ "done",
12
+ ];
13
+ export const stepLabels = {
14
+ start: "Starting",
15
+ prompts: "Collecting inputs",
16
+ "project-created": "Project scaffold",
17
+ "auth-installed": "Auth setup",
18
+ "prisma-configured": "Prisma setup",
19
+ "deps-installed": "Dependencies install",
20
+ "prisma-generated": "Prisma generate",
21
+ "production-configured": "Production setup",
22
+ "git-initialized": "Git init",
23
+ done: "Completed",
24
+ };
25
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC,OAAO;IACP,SAAS;IACT,iBAAiB;IACjB,gBAAgB;IAChB,mBAAmB;IACnB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB;IACjB,MAAM;CACP,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAA6B;IAClD,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,mBAAmB;IAC5B,iBAAiB,EAAE,kBAAkB;IACrC,gBAAgB,EAAE,YAAY;IAC9B,mBAAmB,EAAE,cAAc;IACnC,gBAAgB,EAAE,sBAAsB;IACxC,kBAAkB,EAAE,iBAAiB;IACrC,uBAAuB,EAAE,kBAAkB;IAC3C,iBAAiB,EAAE,UAAU;IAC7B,IAAI,EAAE,WAAW;CAClB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RunOptions } from "./types.js";
2
+ export declare function run(cmd: string, args: string[], options: RunOptions): Promise<void>;
3
+ export declare function killAllProcesses(): void;
4
+ export declare function getCommand(cmd: string): string;
5
+ export declare function isInterruptedError(err: unknown): boolean;
6
+ export declare function exitForInterrupt(err: unknown): Promise<void>;
7
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../src/lib/process.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBnF;AAED,wBAAgB,gBAAgB,SAO/B;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,UAQrC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,WAQ9C;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,OAAO,iBAIlD"}
@@ -0,0 +1,60 @@
1
+ import { spawn } from "child_process";
2
+ const activeProcesses = new Set();
3
+ export function run(cmd, args, options) {
4
+ return new Promise((resolve, reject) => {
5
+ const child = spawn(cmd, args, {
6
+ cwd: options.cwd,
7
+ stdio: options.stdio ?? "ignore",
8
+ });
9
+ activeProcesses.add(child);
10
+ child.on("exit", (code) => {
11
+ activeProcesses.delete(child);
12
+ if (code === 0) {
13
+ resolve();
14
+ }
15
+ else {
16
+ reject(new Error(`${cmd} exited with code ${code}`));
17
+ }
18
+ });
19
+ child.on("error", (err) => {
20
+ activeProcesses.delete(child);
21
+ reject(err);
22
+ });
23
+ });
24
+ }
25
+ export function killAllProcesses() {
26
+ for (const proc of activeProcesses) {
27
+ try {
28
+ proc.kill("SIGINT");
29
+ }
30
+ catch { }
31
+ }
32
+ activeProcesses.clear();
33
+ }
34
+ export function getCommand(cmd) {
35
+ const isWin = process.platform === "win32";
36
+ if (cmd === "npm")
37
+ return isWin ? "npm.cmd" : "npm";
38
+ if (cmd === "npx")
39
+ return isWin ? "npx.cmd" : "npx";
40
+ if (cmd === "pnpm")
41
+ return isWin ? "pnpm.cmd" : "pnpm";
42
+ if (cmd === "bun")
43
+ return isWin ? "bun.exe" : "bun";
44
+ if (cmd === "git")
45
+ return isWin ? "git.exe" : "git";
46
+ return cmd;
47
+ }
48
+ export function isInterruptedError(err) {
49
+ return (typeof err === "object" &&
50
+ err !== null &&
51
+ "signal" in err &&
52
+ (err.signal === "SIGINT" ||
53
+ err.signal === "SIGTERM"));
54
+ }
55
+ export async function exitForInterrupt(err) {
56
+ if (isInterruptedError(err)) {
57
+ throw err;
58
+ }
59
+ }
60
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/lib/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgB,MAAM,eAAe,CAAC;AAGpD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAgB,CAAC;AAEhD,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,OAAmB;IAClE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ;SACjC,CAAC,CAAC;QACH,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE3B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,eAAe,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IACvD,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,QAAQ,IAAI,GAAG;QACf,CAAE,GAA2B,CAAC,MAAM,KAAK,QAAQ;YAC9C,GAA2B,CAAC,MAAM,KAAK,SAAS,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAY;IACjD,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CliState, StepName } from "./types.js";
2
+ export declare function initState(initialState: CliState, file: string): void;
3
+ export declare function getState(): CliState;
4
+ export declare function saveState(update: Partial<CliState>): void;
5
+ export declare function loadState(file: string): CliState | null;
6
+ export declare function clearState(): void;
7
+ export declare function hasReachedStep(currentStep: StepName, targetStep: StepName): boolean;
8
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/lib/state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAMrD,wBAAgB,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAG7D;AAED,wBAAgB,QAAQ,IAAI,QAAQ,CAEnC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,QAIlD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAGvD;AAED,wBAAgB,UAAU,SAIzB;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,WAEzE"}
@@ -0,0 +1,31 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import { stepOrder } from "./constants.js";
4
+ let state;
5
+ let stateFile;
6
+ export function initState(initialState, file) {
7
+ state = initialState;
8
+ stateFile = file;
9
+ }
10
+ export function getState() {
11
+ return state;
12
+ }
13
+ export function saveState(update) {
14
+ state = { ...state, ...update };
15
+ fs.ensureDirSync(path.dirname(stateFile));
16
+ fs.writeJsonSync(stateFile, state, { spaces: 2 });
17
+ }
18
+ export function loadState(file) {
19
+ if (!fs.existsSync(file))
20
+ return null;
21
+ return fs.readJsonSync(file);
22
+ }
23
+ export function clearState() {
24
+ if (fs.existsSync(stateFile)) {
25
+ fs.removeSync(stateFile);
26
+ }
27
+ }
28
+ export function hasReachedStep(currentStep, targetStep) {
29
+ return stepOrder.indexOf(currentStep) >= stepOrder.indexOf(targetStep);
30
+ }
31
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/lib/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,IAAI,KAAe,CAAC;AACpB,IAAI,SAAiB,CAAC;AAEtB,MAAM,UAAU,SAAS,CAAC,YAAsB,EAAE,IAAY;IAC5D,KAAK,GAAG,YAAY,CAAC;IACrB,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAyB;IACjD,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1C,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAa,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAqB,EAAE,UAAoB;IACxE,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { StdioOptions } from "child_process";
2
+ export type StepName = "start" | "prompts" | "project-created" | "auth-installed" | "prisma-configured" | "production-configured" | "deps-installed" | "prisma-generated" | "git-initialized" | "done";
3
+ export type CliState = {
4
+ step: StepName;
5
+ runtime?: "node" | "bun";
6
+ projectName: string;
7
+ framework?: string;
8
+ usePrisma?: boolean;
9
+ database?: string;
10
+ useGit?: boolean;
11
+ authMode?: string;
12
+ hashLib?: string;
13
+ oauthProviders?: string[];
14
+ };
15
+ export type RunOptions = {
16
+ cwd: string;
17
+ stdio?: StdioOptions;
18
+ };
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,MAAM,QAAQ,GAChB,OAAO,GACP,SAAS,GACT,iBAAiB,GACjB,gBAAgB,GAChB,mBAAmB,GACnB,uBAAuB,GACvB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,MAAM,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAC,MAAM,GAAC,KAAK,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { StepName } from "./types.js";
2
+ export declare const spinner: import("ora").Ora;
3
+ export declare const sleep: (ms: number) => Promise<unknown>;
4
+ export declare function renderHeader(): void;
5
+ export declare function renderStep(current: StepName, isProduction: boolean): void;
6
+ export declare function showBootLogo(): Promise<void>;
7
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/lib/ui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,eAAO,MAAM,OAAO,mBAAgB,CAAC;AAErC,eAAO,MAAM,KAAK,GAAI,IAAI,MAAM,qBAA0C,CAAC;AAsE3E,wBAAgB,YAAY,SAI3B;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,QAwBlE;AAED,wBAAsB,YAAY,kBA4BjC"}
@@ -0,0 +1,124 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { stepLabels, stepOrder } from "./constants.js";
4
+ import { hasReachedStep } from "./state.js";
5
+ export const spinner = ora().start();
6
+ export const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
7
+ const cleanLogo = `
8
+
9
+ █████╗ █████╗
10
+ ██╔══██╗ ██╔══██╗
11
+ ███████║ ╚█████╔╝
12
+ ██╔══██║ ██╔══██╗
13
+ ██║ ██║ ╚█████╔╝
14
+ ╚═╝ ╚═╝ ╚════╝
15
+
16
+ A8
17
+
18
+ Authenik8 CLI
19
+ Build Faster
20
+ More , Secure
21
+ `;
22
+ const glitchFrames = [
23
+ `
24
+ █████╗ █████╗
25
+ ██╔══██╗ ██▒▒▒▒██
26
+ ███████║ ╚█████╔╝
27
+ ██╔══██║ ██▒▒▒▒██
28
+ ██║ ██║ ╚█████╔╝
29
+ ╚═╝ ╚═╝ ╚════╝
30
+
31
+ A8
32
+ Authenik8 CLI
33
+
34
+ More
35
+ `,
36
+ `
37
+ ██▓▓██╗ ██▓▓██╗
38
+ ██▒▒██╔╝ ██▒▒██╔╝
39
+ ██▒▒▒▒██ ╚█████╔╝
40
+ ██▓▓██╔╝ ██▒▒██╗
41
+ ██▒▒██║ ╚█████╔╝
42
+ ╚═════╝ ╚════╝
43
+
44
+ A8
45
+ Authenik8 CLI
46
+ Faster
47
+ `,
48
+ `
49
+ ██▒▒██╗ ██▒▒██╗
50
+ ██▓▓██╔╝ ██▓▓██╔╝
51
+ ██▒▒▒▒██ ╚█████╔╝
52
+ ██▓▓██╔╝ ██▓▓██╗
53
+ ██▒▒██║ ╚█████╔╝
54
+ ╚═════╝ ╚════╝
55
+
56
+ A8
57
+ Authenik8 CLI
58
+ Build
59
+ `,
60
+ `
61
+ ██▓▓██╗ ██▓▓██╗
62
+ ██▒▒██╔╝ ██▒▒██╔╝
63
+ ██▒▒▒▒██ ╚█████╔╝
64
+ ██▓▓██╔╝ ██▒▒██╗
65
+ ██▒▒██║ ╚█████╔╝
66
+ ╚═════╝ ╚════╝
67
+
68
+ A8
69
+ Authenik8 CLI
70
+
71
+ `,
72
+ ];
73
+ export function renderHeader() {
74
+ console.log(chalk.cyan.bold("Happy building \nAuthenik8 CLI"));
75
+ console.log(chalk.gray("────────────────────"));
76
+ console.log("");
77
+ }
78
+ export function renderStep(current, isProduction) {
79
+ console.clear();
80
+ renderHeader();
81
+ for (const step of stepOrder) {
82
+ const label = stepLabels[step];
83
+ if (step === "production-configured" && !isProduction) {
84
+ continue;
85
+ }
86
+ if (step === current) {
87
+ console.log(chalk.yellow(`⏳ ${label}...`));
88
+ break;
89
+ }
90
+ if (hasReachedStep(current, step)) {
91
+ console.log(chalk.green(`✔ ${label}`));
92
+ }
93
+ else {
94
+ console.log(chalk.gray(`○ ${label}`));
95
+ }
96
+ }
97
+ console.log("");
98
+ }
99
+ export async function showBootLogo() {
100
+ console.clear();
101
+ spinner.text = "Initializing Authenik8 engine...";
102
+ console.clear();
103
+ console.log(chalk.cyan(cleanLogo));
104
+ await sleep(200);
105
+ for (let i = 0; i < 5; i++) {
106
+ console.clear();
107
+ const frame = glitchFrames[Math.floor(Math.random() * glitchFrames.length)];
108
+ console.log(chalk.cyan(frame));
109
+ await sleep(120 + Math.random() * 120);
110
+ }
111
+ for (let i = 0; i < 2; i++) {
112
+ console.clear();
113
+ console.log(chalk.cyan(cleanLogo));
114
+ await sleep(180);
115
+ console.clear();
116
+ console.log(chalk.gray(cleanLogo));
117
+ await sleep(120);
118
+ }
119
+ console.clear();
120
+ console.log(chalk.cyan.bold(cleanLogo));
121
+ await sleep(800);
122
+ spinner.succeed("Engine ready");
123
+ }
124
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/lib/ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAE3E,MAAM,SAAS,GAAG;;;;;;;;;;;;;;CAcjB,CAAC;AAEF,MAAM,YAAY,GAAG;IACnB;;;;;;;;;;;;CAYD;IACC;;;;;;;;;;;CAWD;IACC;;;;;;;;;;;CAWD;IACC;;;;;;;;;;;CAWD;CACA,CAAC;AAEF,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAiB,EAAE,YAAqB;IACjE,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,YAAY,EAAE,CAAC;IAEf,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAE/B,IAAI,IAAI,KAAK,uBAAuB,IAAI,CAAC,YAAY,EAAE,CAAC;YACtD,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;YAC3C,MAAM;QACR,CAAC;QAED,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,IAAI,GAAG,kCAAkC,CAAC;IAElD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACnC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACnC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliState } from "../lib/types.js";
2
+ export declare function configurePrisma(state: CliState, targetDir: string, templateRoot: string): Promise<void>;
3
+ //# sourceMappingURL=configurePrisma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configurePrisma.d.ts","sourceRoot":"","sources":["../../../src/steps/configurePrisma.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA6Ef"}