create-authenik8-app 2.0.6 → 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -13
- package/dist/bin/index.d.ts +5 -0
- package/dist/bin/index.d.ts.map +1 -1
- package/dist/bin/index.js +500 -302
- package/dist/bin/index.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +262 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/constants.d.ts +4 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +25 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/process.d.ts +7 -0
- package/dist/lib/process.d.ts.map +1 -0
- package/dist/lib/process.js +56 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/lib/state.d.ts +8 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +31 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/types.d.ts +16 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/ui.d.ts +7 -0
- package/dist/lib/ui.d.ts.map +1 -0
- package/dist/lib/ui.js +124 -0
- package/dist/lib/ui.js.map +1 -0
- package/dist/steps/configurePrisma.d.ts +3 -0
- package/dist/steps/configurePrisma.d.ts.map +1 -0
- package/dist/steps/configurePrisma.js +41 -0
- package/dist/steps/configurePrisma.js.map +1 -0
- package/dist/steps/createProject.d.ts +4 -0
- package/dist/steps/createProject.d.ts.map +1 -0
- package/dist/steps/createProject.js +16 -0
- package/dist/steps/createProject.js.map +1 -0
- package/dist/steps/finalSetup.d.ts +4 -0
- package/dist/steps/finalSetup.d.ts.map +1 -0
- package/dist/steps/finalSetup.js +52 -0
- package/dist/steps/finalSetup.js.map +1 -0
- package/dist/steps/installAuth.d.ts +2 -0
- package/dist/steps/installAuth.d.ts.map +1 -0
- package/dist/steps/installAuth.js +34 -0
- package/dist/steps/installAuth.js.map +1 -0
- package/dist/steps/installDeps.d.ts +3 -0
- package/dist/steps/installDeps.d.ts.map +1 -0
- package/dist/steps/installDeps.js +31 -0
- package/dist/steps/installDeps.js.map +1 -0
- package/dist/steps/prompts.d.ts +3 -0
- package/dist/steps/prompts.d.ts.map +1 -0
- package/dist/steps/prompts.js +47 -0
- package/dist/steps/prompts.js.map +1 -0
- package/dist/utils/hash.d.ts +3 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +41 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/output.d.ts +3 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +62 -0
- package/dist/utils/output.js.map +1 -0
- package/package.json +7 -4
- package/templates/express-auth+/src/auth/protected.routes.ts +2 -2
- package/templates/express-auth/ecosystem.config.ts +0 -16
- package/templates/express-auth+/ecosystem.config.ts +0 -16
- 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":"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 @@
|
|
|
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,4 @@
|
|
|
1
|
+
export declare function configureProduction(targetDir: string): Promise<void>;
|
|
2
|
+
export declare function initGit(targetDir: string): Promise<void>;
|
|
3
|
+
export declare function appendProductionReadme(targetDir: string, projectName: string): void;
|
|
4
|
+
//# sourceMappingURL=finalSetup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalSetup.d.ts","sourceRoot":"","sources":["../../src/steps/finalSetup.ts"],"names":[],"mappings":"AAKA,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1E;AAED,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,52 @@
|
|
|
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
|
+
export async function configureProduction(targetDir) {
|
|
6
|
+
spinner.start("Setting up production mode (PM2)...");
|
|
7
|
+
try {
|
|
8
|
+
await run(getCommand("npm"), ["install", "pm2"], {
|
|
9
|
+
cwd: targetDir,
|
|
10
|
+
stdio: "ignore",
|
|
11
|
+
});
|
|
12
|
+
spinner.stop();
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
spinner.fail("Failed to install PM2");
|
|
16
|
+
exitForInterrupt(err);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function initGit(targetDir) {
|
|
20
|
+
try {
|
|
21
|
+
await run(getCommand("git"), ["init"], {
|
|
22
|
+
cwd: targetDir,
|
|
23
|
+
stdio: "ignore",
|
|
24
|
+
});
|
|
25
|
+
spinner.stop();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
spinner.fail("Git init failed");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function appendProductionReadme(targetDir, projectName) {
|
|
32
|
+
fs.appendFileSync(path.join(targetDir, "README.md"), `
|
|
33
|
+
|
|
34
|
+
🚀 Production Mode
|
|
35
|
+
|
|
36
|
+
This project is configured for production using PM2.
|
|
37
|
+
|
|
38
|
+
Start app in cluster mode:
|
|
39
|
+
|
|
40
|
+
npm run pm2:start
|
|
41
|
+
|
|
42
|
+
View logs:
|
|
43
|
+
|
|
44
|
+
npm run pm2:logs
|
|
45
|
+
|
|
46
|
+
Stop app:
|
|
47
|
+
|
|
48
|
+
npm run pm2:stop
|
|
49
|
+
|
|
50
|
+
`);
|
|
51
|
+
}
|
|
52
|
+
//# 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,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IACzD,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,QAAQ;SAChB,CAAC,CAAC;QACH,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;AAED,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/steps/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CA4C5E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
export async function runPrompts(state) {
|
|
3
|
+
return inquirer.prompt([
|
|
4
|
+
{
|
|
5
|
+
type: "list",
|
|
6
|
+
name: "framework",
|
|
7
|
+
message: "Choose framework:",
|
|
8
|
+
choices: ["Express", "Fastify (coming soon)"],
|
|
9
|
+
default: "Express",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
type: "confirm",
|
|
13
|
+
name: "usePrisma",
|
|
14
|
+
message: "Use Prisma?",
|
|
15
|
+
default: true,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
type: "list",
|
|
19
|
+
name: "database",
|
|
20
|
+
message: "Choose database:",
|
|
21
|
+
choices: [
|
|
22
|
+
{ name: "PostgreSQL", value: "postgresql" },
|
|
23
|
+
{ name: "SQLite ", value: "sqlite" },
|
|
24
|
+
],
|
|
25
|
+
when: (answers) => answers.usePrisma,
|
|
26
|
+
default: "sqlite",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: "confirm",
|
|
30
|
+
name: "useGit",
|
|
31
|
+
message: "Initialize git?",
|
|
32
|
+
default: true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
type: "list",
|
|
36
|
+
name: "authMode",
|
|
37
|
+
message: "Choose authentication setup:",
|
|
38
|
+
choices: [
|
|
39
|
+
{ name: "JWT only", value: "base" },
|
|
40
|
+
{ name: "Email + Password Auth", value: "auth" },
|
|
41
|
+
{ name: "Full Auth (Password + OAuth)", value: "auth-oauth" },
|
|
42
|
+
],
|
|
43
|
+
default: "base",
|
|
44
|
+
},
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
//# 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;AAGhC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAe;IAC9C,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;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export function printSummary(state, isProduction) {
|
|
3
|
+
console.log(chalk.green.bold("\n🎉 Authenik8 app created successfully!\n"));
|
|
4
|
+
console.log(chalk.white(`
|
|
5
|
+
Next steps:
|
|
6
|
+
|
|
7
|
+
cd ${state.projectName}
|
|
8
|
+
redis-server --daemonize yes
|
|
9
|
+
npm run dev
|
|
10
|
+
|
|
11
|
+
Auth Features:
|
|
12
|
+
${state.authMode === "base"
|
|
13
|
+
? "✓ JWT only"
|
|
14
|
+
: state.authMode === "auth"
|
|
15
|
+
? "✓ Email + Password"
|
|
16
|
+
: "✓ Password + OAuth (Google/GitHub)"}
|
|
17
|
+
|
|
18
|
+
🛠 Stack:
|
|
19
|
+
✔ Express
|
|
20
|
+
✔ ${state.usePrisma ? (state.database === "postgresql" ? "PostgreSQL" : "SQLite") : "No database"}
|
|
21
|
+
✔ ${state.usePrisma ? "Prisma ORM" : "No ORM"}
|
|
22
|
+
|
|
23
|
+
📡 API Routes:
|
|
24
|
+
${state.authMode === "base"
|
|
25
|
+
? `
|
|
26
|
+
GET /public
|
|
27
|
+
GET /guest
|
|
28
|
+
GET /protected
|
|
29
|
+
POST /refresh
|
|
30
|
+
`
|
|
31
|
+
: state.authMode === "auth"
|
|
32
|
+
? `
|
|
33
|
+
POST /auth/register
|
|
34
|
+
POST /auth/login
|
|
35
|
+
POST /auth/refresh
|
|
36
|
+
GET /protected
|
|
37
|
+
`
|
|
38
|
+
: `
|
|
39
|
+
POST /auth/register
|
|
40
|
+
POST /auth/login
|
|
41
|
+
POST /auth/refresh
|
|
42
|
+
GET /auth/google
|
|
43
|
+
GET /auth/github
|
|
44
|
+
GET /protected
|
|
45
|
+
`}
|
|
46
|
+
|
|
47
|
+
🔥 You're ready to build.
|
|
48
|
+
`));
|
|
49
|
+
if (isProduction) {
|
|
50
|
+
console.log(`
|
|
51
|
+
🚀 Production Ready Enabled:
|
|
52
|
+
|
|
53
|
+
✔ PM2 installed
|
|
54
|
+
✔ Cluster mode enabled
|
|
55
|
+
✔ Memory auto-restart (300MB)
|
|
56
|
+
|
|
57
|
+
Run:
|
|
58
|
+
npm run pm2:start
|
|
59
|
+
`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,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;;;;;EAMpB,KAAK,CAAC,QAAQ,KAAK,MAAM;QACvB,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM;YAC3B,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,oCACN;;;;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;;;;;;;CAQN;;;CAGC,CAAC,CAAC,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;CASf,CAAC,CAAC;IACD,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-authenik8-app",
|
|
3
|
-
"version": "2.0.
|
|
4
|
-
"description": "Create production-ready backend APIs in
|
|
3
|
+
"version": "2.0.8",
|
|
4
|
+
"description": "Create production-ready backend APIs with a built-in identity engine. Authenik8 scaffolds Express + Prisma apps with JWT auth, refresh token rotation, account linking, Redis-backed security, and scalable architecture out of the box.",
|
|
5
5
|
"bin": {
|
|
6
|
-
"create-authenik8-app": "dist/
|
|
6
|
+
"create-authenik8-app": "dist/index.js"
|
|
7
7
|
},
|
|
8
8
|
"keywords": [
|
|
9
9
|
"cli",
|
|
@@ -40,9 +40,12 @@
|
|
|
40
40
|
"dist",
|
|
41
41
|
"templates"
|
|
42
42
|
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"test:templates": "node --import tsx --test tests/template-servers.test.mjs"
|
|
45
|
+
},
|
|
43
46
|
"devDependencies": {
|
|
44
47
|
"@types/express": "^5.0.6",
|
|
45
48
|
"@types/fs-extra": "^11.0.4",
|
|
46
|
-
"@types/node": "^25.
|
|
49
|
+
"@types/node": "^25.5.2"
|
|
47
50
|
}
|
|
48
51
|
}
|
|
@@ -5,11 +5,11 @@ import { getAuth } from "./auth";
|
|
|
5
5
|
const router = express.Router();
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
router.get("/protected", (req, res) => {
|
|
8
|
+
router.get("/protected", (req, res, next) => {
|
|
9
9
|
|
|
10
10
|
const auth = getAuth()
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
auth.requireAdmin(req, res, next);
|
|
13
13
|
}, (req, res) => {
|
|
14
14
|
res.json({ message: "Protected route" });
|
|
15
15
|
});
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
apps: [
|
|
3
|
-
{
|
|
4
|
-
name: "authenik8-app",
|
|
5
|
-
script: "src/server.ts",
|
|
6
|
-
instances: "max",
|
|
7
|
-
interpreter:"node",
|
|
8
|
-
exec_mode: "cluster",
|
|
9
|
-
watch: false,
|
|
10
|
-
max_memory_restart: "300M",
|
|
11
|
-
env: {
|
|
12
|
-
NODE_ENV: "production",
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
apps: [
|
|
3
|
-
{
|
|
4
|
-
name: "authenik8-app",
|
|
5
|
-
script: "src/server.ts",
|
|
6
|
-
instances: "max",
|
|
7
|
-
interpreter:"node",
|
|
8
|
-
exec_mode: "cluster",
|
|
9
|
-
watch: false,
|
|
10
|
-
max_memory_restart: "300M",
|
|
11
|
-
env: {
|
|
12
|
-
NODE_ENV: "production",
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
};
|