create-authenik8-app 2.0.7 → 2.0.9

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 (65) hide show
  1. package/README.md +19 -11
  2. package/dist/bin/index.d.ts +5 -0
  3. package/dist/bin/index.d.ts.map +1 -1
  4. package/dist/bin/index.js +308 -180
  5. package/dist/bin/index.js.map +1 -1
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +265 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/constants.d.ts +4 -0
  11. package/dist/lib/constants.d.ts.map +1 -0
  12. package/dist/lib/constants.js +25 -0
  13. package/dist/lib/constants.js.map +1 -0
  14. package/dist/lib/process.d.ts +7 -0
  15. package/dist/lib/process.d.ts.map +1 -0
  16. package/dist/lib/process.js +56 -0
  17. package/dist/lib/process.js.map +1 -0
  18. package/dist/lib/state.d.ts +8 -0
  19. package/dist/lib/state.d.ts.map +1 -0
  20. package/dist/lib/state.js +31 -0
  21. package/dist/lib/state.js.map +1 -0
  22. package/dist/lib/types.d.ts +17 -0
  23. package/dist/lib/types.d.ts.map +1 -0
  24. package/dist/lib/types.js +2 -0
  25. package/dist/lib/types.js.map +1 -0
  26. package/dist/lib/ui.d.ts +7 -0
  27. package/dist/lib/ui.d.ts.map +1 -0
  28. package/dist/lib/ui.js +124 -0
  29. package/dist/lib/ui.js.map +1 -0
  30. package/dist/steps/configurePrisma.d.ts +3 -0
  31. package/dist/steps/configurePrisma.d.ts.map +1 -0
  32. package/dist/steps/configurePrisma.js +41 -0
  33. package/dist/steps/configurePrisma.js.map +1 -0
  34. package/dist/steps/createProject.d.ts +4 -0
  35. package/dist/steps/createProject.d.ts.map +1 -0
  36. package/dist/steps/createProject.js +16 -0
  37. package/dist/steps/createProject.js.map +1 -0
  38. package/dist/steps/finalSetup.d.ts +7 -0
  39. package/dist/steps/finalSetup.d.ts.map +1 -0
  40. package/dist/steps/finalSetup.js +113 -0
  41. package/dist/steps/finalSetup.js.map +1 -0
  42. package/dist/steps/installAuth.d.ts +2 -0
  43. package/dist/steps/installAuth.d.ts.map +1 -0
  44. package/dist/steps/installAuth.js +34 -0
  45. package/dist/steps/installAuth.js.map +1 -0
  46. package/dist/steps/installDeps.d.ts +3 -0
  47. package/dist/steps/installDeps.d.ts.map +1 -0
  48. package/dist/steps/installDeps.js +31 -0
  49. package/dist/steps/installDeps.js.map +1 -0
  50. package/dist/steps/prompts.d.ts +3 -0
  51. package/dist/steps/prompts.d.ts.map +1 -0
  52. package/dist/steps/prompts.js +76 -0
  53. package/dist/steps/prompts.js.map +1 -0
  54. package/dist/utils/hash.d.ts +3 -0
  55. package/dist/utils/hash.d.ts.map +1 -0
  56. package/dist/utils/hash.js +41 -0
  57. package/dist/utils/hash.js.map +1 -0
  58. package/dist/utils/output.d.ts +3 -0
  59. package/dist/utils/output.d.ts.map +1 -0
  60. package/dist/utils/output.js +62 -0
  61. package/dist/utils/output.js.map +1 -0
  62. package/package.json +3 -2
  63. package/templates/express-auth/ecosystem.config.ts +0 -16
  64. package/templates/express-auth+/ecosystem.config.ts +0 -16
  65. package/templates/express-base/ecosystem.config.ts +0 -16
package/dist/lib/ui.js ADDED
@@ -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":"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"}
@@ -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,CAkDf"}
@@ -0,0 +1,41 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import { spinner } from "../lib/ui.js";
4
+ import { exitForInterrupt } from "../lib/process.js";
5
+ export async function configurePrisma(state, targetDir, templateRoot) {
6
+ const pkgPath = path.join(targetDir, "package.json");
7
+ const pkg = await fs.readJson(pkgPath);
8
+ pkg.dependencies = {
9
+ ...pkg.dependencies,
10
+ ioredis: "^5.8.1",
11
+ };
12
+ if (state.usePrisma) {
13
+ spinner.start("Adding Prisma setup...");
14
+ try {
15
+ const dbType = state.database === "postgresql" ? "postgresql" : "sqlite";
16
+ const prismaTemplatePath = path.join(templateRoot, `prisma/${dbType}`);
17
+ await fs.copy(path.join(prismaTemplatePath, "schema.prisma"), path.join(targetDir, "prisma/schema.prisma"));
18
+ await fs.copy(path.join(prismaTemplatePath, ".env"), path.join(targetDir, ".env"));
19
+ pkg.dependencies = {
20
+ ...pkg.dependencies,
21
+ "@prisma/client": "5.22.0",
22
+ };
23
+ pkg.devDependencies = {
24
+ ...pkg.devDependencies,
25
+ prisma: "5.22.0",
26
+ };
27
+ pkg.scripts = {
28
+ ...pkg.scripts,
29
+ "prisma:generate": "prisma generate",
30
+ "prisma:migrate": "prisma migrate dev",
31
+ };
32
+ spinner.succeed(`Prisma (${dbType}) configured`);
33
+ }
34
+ catch (err) {
35
+ spinner.fail("Failed to setup Prisma");
36
+ exitForInterrupt(err);
37
+ }
38
+ }
39
+ await fs.writeJson(pkgPath, pkg, { spaces: 2 });
40
+ }
41
+ //# sourceMappingURL=configurePrisma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configurePrisma.js","sourceRoot":"","sources":["../../src/steps/configurePrisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAe,EACf,SAAiB,EACjB,YAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEvC,GAAG,CAAC,YAAY,GAAG;QACjB,GAAG,GAAG,CAAC,YAAY;QACnB,OAAO,EAAE,QAAQ;KAClB,CAAC;IAEF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;YACzE,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC;YAEvE,MAAM,EAAE,CAAC,IAAI,CACX,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC,EAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAC7C,CAAC;YAEF,MAAM,EAAE,CAAC,IAAI,CACX,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,EACrC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAC7B,CAAC;YAEF,GAAG,CAAC,YAAY,GAAG;gBACjB,GAAG,GAAG,CAAC,YAAY;gBACnB,gBAAgB,EAAE,QAAQ;aAC3B,CAAC;YAEF,GAAG,CAAC,eAAe,GAAG;gBACpB,GAAG,GAAG,CAAC,eAAe;gBACtB,MAAM,EAAE,QAAQ;aACjB,CAAC;YAEF,GAAG,CAAC,OAAO,GAAG;gBACZ,GAAG,GAAG,CAAC,OAAO;gBACd,iBAAiB,EAAE,iBAAiB;gBACpC,gBAAgB,EAAE,oBAAoB;aACvC,CAAC;YAEF,OAAO,CAAC,OAAO,CAAC,WAAW,MAAM,cAAc,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACvC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CliState } from "../lib/types.js";
2
+ export declare function resolveTemplateName(authMode: string): string;
3
+ export declare function createProject(state: CliState, targetDir: string, templateRoot: string): Promise<void>;
4
+ //# sourceMappingURL=createProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.d.ts","sourceRoot":"","sources":["../../src/steps/createProject.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,16 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import chalk from "chalk";
4
+ export function resolveTemplateName(authMode) {
5
+ if (authMode === "auth")
6
+ return "express-auth";
7
+ if (authMode === "auth-oauth")
8
+ return "express-auth+";
9
+ return "express-base";
10
+ }
11
+ export async function createProject(state, targetDir, templateRoot) {
12
+ const templateName = resolveTemplateName(state.authMode ?? "base");
13
+ const templatePath = path.join(templateRoot, templateName);
14
+ await fs.copy(templatePath, targetDir);
15
+ }
16
+ //# sourceMappingURL=createProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.js","sourceRoot":"","sources":["../../src/steps/createProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,cAAc,CAAC;IAC/C,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,eAAe,CAAC;IACtD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAe,EACf,SAAiB,EACjB,YAAoB;IAEpB,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function hasBun(): boolean;
2
+ export declare function resolveRuntime(runtime: any): "node" | "bun";
3
+ export declare function createPm2Config(targetDir: string, projectName: string, runtime: "node" | "bun"): void;
4
+ export declare function configureProduction(targetDir: string, projectName: string, runtime: "node" | "bun"): Promise<void>;
5
+ export declare function initGit(targetDir: string): Promise<void>;
6
+ export declare function appendProductionReadme(targetDir: string, projectName: string): void;
7
+ //# sourceMappingURL=finalSetup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalSetup.d.ts","sourceRoot":"","sources":["../../src/steps/finalSetup.ts"],"names":[],"mappings":"AAOA,wBAAgB,MAAM,IAAI,OAAO,CAOhC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,GAAG,KAAK,CAO3D;AAGD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAC,OAAO,EAAE,MAAM,GAAE,KAAK,GAAG,IAAI,CAuCnG;AAGD,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAC,WAAW,EAAC,MAAM,EAAG,OAAO,EAAC,MAAM,GAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrH;AAGD,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU9D;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAuBnF"}
@@ -0,0 +1,113 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import { run, getCommand, exitForInterrupt } from "../lib/process.js";
4
+ import { spinner } from "../lib/ui.js";
5
+ import { execSync } from "child_process";
6
+ export function hasBun() {
7
+ try {
8
+ execSync("bun --version", { stdio: "ignore" });
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ export function resolveRuntime(runtime) {
16
+ if (runtime === "bun" && !hasBun()) {
17
+ console.log("⚠️ Bun not found, falling back to Node");
18
+ return "node";
19
+ }
20
+ if (runtime === "bun")
21
+ return "bun";
22
+ return "node";
23
+ }
24
+ export function createPm2Config(targetDir, projectName, runtime) {
25
+ const configPath = path.join(targetDir, "ecosystem.config.js");
26
+ const useBun = runtime === "bun";
27
+ const content = useBun
28
+ ? `module.exports = {
29
+ apps: [
30
+ {
31
+ name: "${projectName}",
32
+ script: "src/server.ts",
33
+ interpreter: "bun",
34
+ instances: "max",
35
+ exec_mode: "cluster",
36
+ watch: false,
37
+ env: {
38
+ NODE_ENV: "production"
39
+ }
40
+ }
41
+ ]
42
+ }` :
43
+ `module.exports = {
44
+ apps: [
45
+ {
46
+ name: "${projectName}",
47
+ script: "src/server.ts",
48
+ instances: "max",
49
+ interpreter:"node",
50
+ interpreter_args: "-r ts-node/register",
51
+ exec_mode: "cluster",
52
+ watch: false,
53
+ max_memory_restart: "300M",
54
+ env: {
55
+ NODE_ENV: "production"
56
+ }
57
+ }
58
+ ]
59
+ };`;
60
+ fs.writeFileSync(configPath, content, "utf-8");
61
+ }
62
+ export async function configureProduction(targetDir, projectName, runtime) {
63
+ spinner.start("Setting up production mode (PM2)...");
64
+ try {
65
+ await run(getCommand("npm"), ["install", "pm2"], {
66
+ cwd: targetDir,
67
+ stdio: "inherit",
68
+ });
69
+ if (runtime === "node") {
70
+ await run(getCommand("npm"), ["install", "ts-node"], { cwd: targetDir, stdio: "inherit" });
71
+ }
72
+ createPm2Config(targetDir, projectName, runtime);
73
+ spinner.stop();
74
+ }
75
+ catch (err) {
76
+ spinner.fail("Failed to install PM2");
77
+ exitForInterrupt(err);
78
+ }
79
+ }
80
+ export async function initGit(targetDir) {
81
+ try {
82
+ await run(getCommand("git"), ["init"], {
83
+ cwd: targetDir,
84
+ stdio: "ignore",
85
+ });
86
+ spinner.stop();
87
+ }
88
+ catch {
89
+ spinner.fail("Git init failed");
90
+ }
91
+ }
92
+ export function appendProductionReadme(targetDir, projectName) {
93
+ fs.appendFileSync(path.join(targetDir, "README.md"), `
94
+
95
+ 🚀 Production Mode
96
+
97
+ This project is configured for production using PM2.
98
+
99
+ Start app in cluster mode:
100
+
101
+ npm run pm2:start
102
+
103
+ View logs:
104
+
105
+ npm run pm2:logs
106
+
107
+ Stop app:
108
+
109
+ npm run pm2:stop
110
+
111
+ `);
112
+ }
113
+ //# sourceMappingURL=finalSetup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalSetup.js","sourceRoot":"","sources":["../../src/steps/finalSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAY;IACzC,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,WAAmB,EAAC,OAAsB;IAC3F,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,CAAC;IAEjC,MAAM,OAAO,GAAI,MAAM;QACvB,CAAC,CAAA;;;eAGY,WAAW;;;;;;;;;;;EAWxB,CAAA,CAAC;QACF;;;eAGc,WAAW;;;;;;;;;;;;;GAavB,CAAA;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB,EAAC,WAAkB,EAAG,OAAqB;IACpG,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;YAC/C,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,eAAe,CAAC,SAAS,EAAE,WAAW,EAAC,OAAO,CAAC,CAAC;QAEhD,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAAiB;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE;YACrC,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,WAAmB;IAC3E,EAAE,CAAC,cAAc,CACf,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EACjC;;;;;;;;;;;;;;;;;;IAkBA,CACD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function installAuth(targetDir: string): Promise<string>;
2
+ //# sourceMappingURL=installAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installAuth.d.ts","sourceRoot":"","sources":["../../src/steps/installAuth.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAiCjB"}
@@ -0,0 +1,34 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import { run, getCommand, exitForInterrupt } from "../lib/process.js";
4
+ import { getBestHashLib, generateHashModule } from "../utils/hash.js";
5
+ import { spinner } from "../lib/ui.js";
6
+ export async function installAuth(targetDir) {
7
+ let selectedHash = getBestHashLib();
8
+ spinner.start("Installing password auth...");
9
+ try {
10
+ await run(getCommand("npm"), ["install", selectedHash], {
11
+ cwd: targetDir,
12
+ stdio: "ignore",
13
+ });
14
+ }
15
+ catch {
16
+ if (selectedHash !== "bcryptjs") {
17
+ spinner.warn(`${selectedHash} failed, falling back to bcryptjs`);
18
+ await run(getCommand("npm"), ["install", "bcryptjs"], {
19
+ cwd: targetDir,
20
+ stdio: "ignore",
21
+ });
22
+ selectedHash = "bcryptjs";
23
+ }
24
+ else {
25
+ spinner.fail("Failed to install password auth");
26
+ process.exit(1);
27
+ }
28
+ }
29
+ spinner.stop();
30
+ const hashLib = selectedHash;
31
+ await fs.writeFile(path.join(targetDir, "src/utils/hash.ts"), generateHashModule(hashLib));
32
+ return selectedHash;
33
+ }
34
+ //# sourceMappingURL=installAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installAuth.js","sourceRoot":"","sources":["../../src/steps/installAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB;IAEjB,IAAI,YAAY,GAAG,cAAc,EAAE,CAAC;IAEpC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE;YACtD,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,mCAAmC,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;gBACpD,GAAG,EAAE,SAAS;gBACd,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,YAAY,GAAG,UAAU,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,MAAM,OAAO,GAAG,YAAqC,CAAC;IACtD,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EACzC,kBAAkB,CAAC,OAAO,CAAC,CAC5B,CAAC;IAEF,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function installDependencies(targetDir: string): Promise<void>;
2
+ export declare function generatePrismaClient(targetDir: string): Promise<void>;
3
+ //# sourceMappingURL=installDeps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installDeps.d.ts","sourceRoot":"","sources":["../../src/steps/installDeps.ts"],"names":[],"mappings":"AAGA,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1E;AAED,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3E"}
@@ -0,0 +1,31 @@
1
+ import { run, getCommand, exitForInterrupt } from "../lib/process.js";
2
+ import { spinner } from "../lib/ui.js";
3
+ export async function installDependencies(targetDir) {
4
+ spinner.start("Installing dependencies...(this may take a few minutes)");
5
+ try {
6
+ await run(getCommand("npm"), ["install"], {
7
+ cwd: targetDir,
8
+ stdio: "ignore",
9
+ });
10
+ spinner.stop();
11
+ }
12
+ catch (err) {
13
+ spinner.fail("Failed to install dependencies");
14
+ exitForInterrupt(err);
15
+ }
16
+ }
17
+ export async function generatePrismaClient(targetDir) {
18
+ spinner.start("Generating Prisma client...");
19
+ try {
20
+ await run(getCommand("npx"), ["prisma@5.22.0", "generate"], {
21
+ cwd: targetDir,
22
+ stdio: "ignore",
23
+ });
24
+ spinner.stop();
25
+ }
26
+ catch (err) {
27
+ spinner.fail("Failed to generate Prisma client");
28
+ exitForInterrupt(err);
29
+ }
30
+ }
31
+ //# sourceMappingURL=installDeps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installDeps.js","sourceRoot":"","sources":["../../src/steps/installDeps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IACzD,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE;YACxC,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC/C,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IAC1D,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE;YAC1D,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACjD,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliState } from "../lib/types.js";
2
+ export declare function runPrompts(state: CliState): Promise<Partial<CliState>>;
3
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +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,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAyE3E"}
@@ -0,0 +1,76 @@
1
+ import inquirer from "inquirer";
2
+ import { hasBun } from "./finalSetup.js";
3
+ export async function runPrompts(state) {
4
+ const bunAvailable = hasBun();
5
+ return inquirer.prompt([
6
+ {
7
+ type: "list",
8
+ name: "framework",
9
+ message: "Choose framework:",
10
+ choices: ["Express", "Fastify (coming soon)"],
11
+ default: "Express",
12
+ },
13
+ {
14
+ type: "confirm",
15
+ name: "usePrisma",
16
+ message: "Use Prisma?",
17
+ default: true,
18
+ },
19
+ {
20
+ type: "list",
21
+ name: "database",
22
+ message: "Choose database:",
23
+ choices: [
24
+ { name: "PostgreSQL", value: "postgresql" },
25
+ { name: "SQLite ", value: "sqlite" },
26
+ ],
27
+ when: (answers) => answers.usePrisma,
28
+ default: "sqlite",
29
+ },
30
+ {
31
+ type: "confirm",
32
+ name: "useGit",
33
+ message: "Initialize git?",
34
+ default: true,
35
+ },
36
+ {
37
+ type: "list",
38
+ name: "authMode",
39
+ message: "Choose authentication setup:",
40
+ choices: [
41
+ { name: "JWT only", value: "base" },
42
+ { name: "Email + Password Auth", value: "auth" },
43
+ { name: "Full Auth (Password + OAuth)", value: "auth-oauth" },
44
+ ],
45
+ default: "base",
46
+ },
47
+ {
48
+ type: "list",
49
+ name: "runtime",
50
+ message: "Choose runtime:",
51
+ choices: [
52
+ {
53
+ name: bunAvailable
54
+ ? "Bun (fast, no build step)"
55
+ : "Bun (not installed)",
56
+ value: "bun",
57
+ disabled: !bunAvailable && "Bun not found",
58
+ },
59
+ {
60
+ name: "Node (stable, widely supported)",
61
+ value: "node",
62
+ },
63
+ ],
64
+ when: () => true,
65
+ default: bunAvailable ? "bun" : "node"
66
+ },
67
+ ])
68
+ .then((result) => {
69
+ if (result.runtime === "bun" && !bunAvailable) {
70
+ result.runtime = "node";
71
+ }
72
+ return result;
73
+ console.log("Runtime:", result.runtime);
74
+ });
75
+ }
76
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/steps/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAA;AAEtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAc;IAC/C,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC;IAC5B,OAAO,QAAQ,CAAC,MAAM,CAAC;QACrB;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,CAAC,SAAS,EAAE,uBAAuB,CAAC;YAC7C,OAAO,EAAE,SAAS;SACnB;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;gBAC3C,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;aACrC;YACD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS;YACpC,OAAO,EAAE,QAAQ;SAClB;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;gBACnC,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,MAAM,EAAE;gBAChD,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,YAAY,EAAE;aAC9D;YACD,OAAO,EAAE,MAAM;SAChB;QACE;YACD,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,YAAY;wBAChB,CAAC,CAAC,2BAA2B;wBAC7B,CAAC,CAAC,qBAAqB;oBACzB,KAAK,EAAE,KAAK;oBACZ,QAAQ,EAAE,CAAC,YAAY,IAAI,eAAe;iBAC3C;gBACD;oBACE,IAAI,EAAE,iCAAiC;oBACvC,KAAK,EAAE,MAAM;iBACd;aACF;YACD,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;YAChB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;SACvC;KACF,CAAC;SACD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAA;AAEJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function getBestHashLib(): string;
2
+ export declare function generateHashModule(hashLib: "argon2" | "bcryptjs"): string;
3
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CA0BzE"}
@@ -0,0 +1,41 @@
1
+ import os from "os";
2
+ const platform = os.platform();
3
+ const isTermux = process.env.PREFIX?.includes("com.termux") || process.env.TERMUX === "true";
4
+ export function getBestHashLib() {
5
+ if (isTermux)
6
+ return "bcryptjs";
7
+ if (platform === "win32")
8
+ return "bcryptjs";
9
+ if (platform === "darwin")
10
+ return "argon2";
11
+ if (platform === "linux")
12
+ return "argon2";
13
+ return "bcryptjs";
14
+ }
15
+ export function generateHashModule(hashLib) {
16
+ if (hashLib === "argon2") {
17
+ return `
18
+ import argon2 from "argon2";
19
+
20
+ export const hashPassword = (password: string) => {
21
+ return argon2.hash(password);
22
+ };
23
+
24
+ export const comparePassword = (password: string, hash: string) => {
25
+ return argon2.verify(hash, password);
26
+ };
27
+ `;
28
+ }
29
+ return `
30
+ import bcrypt from "bcryptjs";
31
+
32
+ export const hashPassword = (password: string) => {
33
+ return bcrypt.hash(password, 10);
34
+ };
35
+
36
+ export const comparePassword = (password: string, hash: string) => {
37
+ return bcrypt.compare(password, hash);
38
+ };
39
+ `;
40
+ }
41
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAE/B,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;AAE9E,MAAM,UAAU,cAAc;IAC5B,IAAI,QAAQ;QAAE,OAAO,UAAU,CAAC;IAChC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,UAAU,CAAC;IAC5C,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IAC1C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA8B;IAC/D,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO;;;;;;;;;;CAUV,CAAC;IACA,CAAC;IAED,OAAO;;;;;;;;;;CAUR,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliState } from "../lib/types.js";
2
+ export declare function printSummary(state: CliState, isProduction: boolean): void;
3
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +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;AAEhD,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,CAiEzE"}