create-authenik8-app 2.1.5 → 2.1.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.
- package/README.md +12 -2
- package/dist/index.js +36 -9
- package/dist/index.js.map +1 -1
- package/dist/steps/createProject.d.ts.map +1 -1
- package/dist/steps/createProject.js +9 -5
- package/dist/steps/createProject.js.map +1 -1
- package/dist/tests/helpers/generator.d.ts +27 -0
- package/dist/tests/helpers/generator.d.ts.map +1 -0
- package/dist/tests/helpers/generator.js +282 -0
- package/dist/tests/helpers/generator.js.map +1 -0
- package/dist/tests/integration/generator.test.d.ts +2 -0
- package/dist/tests/integration/generator.test.d.ts.map +1 -0
- package/dist/tests/integration/generator.test.js +116 -0
- package/dist/tests/integration/generator.test.js.map +1 -0
- package/dist/tests/integration/snapshot.test.d.ts +2 -0
- package/dist/tests/integration/snapshot.test.d.ts.map +1 -0
- package/dist/tests/integration/snapshot.test.js +68 -0
- package/dist/tests/integration/snapshot.test.js.map +1 -0
- package/dist/tests/setup.d.ts +2 -0
- package/dist/tests/setup.d.ts.map +1 -0
- package/dist/tests/setup.js +10 -0
- package/dist/tests/setup.js.map +1 -0
- package/dist/tests/unit/cli.test.d.ts +2 -0
- package/dist/tests/unit/cli.test.d.ts.map +1 -0
- package/dist/tests/unit/cli.test.js +242 -0
- package/dist/tests/unit/cli.test.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +21 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
<h1 align="center">⚡ create-authenik8-app</h1>
|
|
3
3
|
|
|
4
|
+
**See a real generated example → [create-authenik8-app-example](https://github.com/COD434/create-authenik8-app-example)**
|
|
5
|
+
|
|
4
6
|
|
|
5
7
|
if this saved you time, a ⭐ helps a lot
|
|
6
8
|
|
|
@@ -14,12 +16,12 @@ if this saved you time, a ⭐ helps a lot
|
|
|
14
16
|

|
|
15
17
|

|
|
16
18
|

|
|
17
|
-
|
|
19
|
+
[](https://github.com/COD434/create-authenik8-app/actions/workflows/ci.yml)
|
|
18
20
|
|
|
19
21
|

|
|
20
22
|
|
|
21
23
|
|
|
22
|
-

|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
---
|
|
@@ -129,6 +131,14 @@ app.get("/admin", auth.requireAdmin, (req, res) => {
|
|
|
129
131
|
|
|
130
132
|
---
|
|
131
133
|
|
|
134
|
+
### Testing
|
|
135
|
+
|
|
136
|
+
- Full test suite with ``48%`` coverage (actively improving)
|
|
137
|
+
|
|
138
|
+
- CI runs tests + coverage on every push and PR
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
132
142
|
## How It Works (Key Concept)
|
|
133
143
|
|
|
134
144
|
Authenik8 is not just another auth library.
|
package/dist/index.js
CHANGED
|
@@ -29,6 +29,32 @@ const targetDir = path.resolve(process.cwd(), projectName);
|
|
|
29
29
|
const templateRoot = path.resolve(__dirname, "../templates");
|
|
30
30
|
const globalStateDir = path.join(process.cwd(), ".authenik8");
|
|
31
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
|
+
});
|
|
32
58
|
let projectCreated = false;
|
|
33
59
|
initState({ step: "start", projectName }, stateFile);
|
|
34
60
|
async function cleanupIncompleteProject() {
|
|
@@ -44,14 +70,14 @@ function assertRequired(value, name) {
|
|
|
44
70
|
}
|
|
45
71
|
}
|
|
46
72
|
async function main() {
|
|
47
|
-
process.on("SIGINT", async () => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
});
|
|
73
|
+
//process.on("SIGINT", async () => {
|
|
74
|
+
//console.log("\n");
|
|
75
|
+
//spinner.stop();
|
|
76
|
+
//killAllProcesses();
|
|
77
|
+
//console.log(chalk.yellow("⏸ Setup interrupted."));
|
|
78
|
+
// console.log(chalk.gray(`↻ Resume with: create-authenik8-app ${projectName} --resume`));
|
|
79
|
+
//process.exit(0);
|
|
80
|
+
//});
|
|
55
81
|
try {
|
|
56
82
|
await showBootLogo();
|
|
57
83
|
if (args.includes("--help")) {
|
|
@@ -212,7 +238,8 @@ Resumable steps:
|
|
|
212
238
|
}
|
|
213
239
|
else {
|
|
214
240
|
//configurePackageJson(targetDir, getState().usePrisma ?? false);
|
|
215
|
-
await installDependencies(targetDir);
|
|
241
|
+
//await installDependencies(targetDir);
|
|
242
|
+
console.log(chalk.gray("↷ Skipping dependency installation (already completed)"));
|
|
216
243
|
}
|
|
217
244
|
// Production setup
|
|
218
245
|
if (isProduction && !hasReachedStep(currentStep, "production-configured")) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACvG,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAC,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAC,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,sBAAsB,EAAC,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,
|
|
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,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAsBhF;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -15,11 +15,15 @@ export function configurePackageJson(targetDir, usePrisma) {
|
|
|
15
15
|
pkg.scripts.postinstall = "npx prisma@5.22.0 generate";
|
|
16
16
|
}
|
|
17
17
|
if (usePrisma) {
|
|
18
|
-
pkg.scripts
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
const currentDev = pkg.scripts.dev || "tsx watch src/index.ts";
|
|
19
|
+
if (!currentDev.includes("prisma@5.22.0 generate")) {
|
|
20
|
+
pkg.scripts.dev = `npx prisma@5.22.0 generate && ${currentDev}`;
|
|
21
|
+
}
|
|
22
|
+
//pkg.scripts ??= {};
|
|
23
|
+
// pkg.scripts.postinstall = "npx prisma@5.22.0 generate";
|
|
24
|
+
//pkg.scripts.dev = pkg.scripts.dev
|
|
25
|
+
// ? `npx prisma@5.22.0 generate && ${pkg.scripts.dev}`
|
|
26
|
+
//: "npx prisma@5.22.0 generate";
|
|
23
27
|
}
|
|
24
28
|
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
|
|
25
29
|
}
|
|
@@ -1 +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,UAAU,oBAAoB,CAAC,SAAiB,EAAE,SAAkB;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,4BAA4B,CAAC;IACzD,CAAC;IAEH,IAAI,SAAS,EAAE,CAAC;
|
|
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,UAAU,oBAAoB,CAAC,SAAiB,EAAE,SAAkB;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,4BAA4B,CAAC;IACzD,CAAC;IAEH,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,wBAAwB,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,iCAAiC,UAAU,EAAE,CAAC;QAClE,CAAC;QAEF,qBAAqB;QACrB,0DAA0D;QACzD,mCAAmC;QAClC,uDAAuD;QACtD,iCAAiC;IACrC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,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,27 @@
|
|
|
1
|
+
import type { CliState } from "../../lib/types.js";
|
|
2
|
+
type TemplateKind = "base" | "auth" | "auth-oauth";
|
|
3
|
+
export type GeneratedProject = {
|
|
4
|
+
rootDir: string;
|
|
5
|
+
targetDir: string;
|
|
6
|
+
state: CliState;
|
|
7
|
+
cleanup: () => Promise<void>;
|
|
8
|
+
hashLib?: string;
|
|
9
|
+
};
|
|
10
|
+
export type GenerateProjectOptions = {
|
|
11
|
+
template: TemplateKind;
|
|
12
|
+
database?: "sqlite" | "postgresql";
|
|
13
|
+
usePrisma?: boolean;
|
|
14
|
+
productionRuntime?: "node" | "bun";
|
|
15
|
+
hashLib?: "argon2" | "bcryptjs";
|
|
16
|
+
};
|
|
17
|
+
export declare function generateProjectFixture(options: GenerateProjectOptions): Promise<GeneratedProject>;
|
|
18
|
+
export declare function collectProjectTree(rootDir: string): Promise<string[]>;
|
|
19
|
+
export declare function readProjectFiles(rootDir: string, relativePaths: string[]): Promise<Record<string, string>>;
|
|
20
|
+
export declare function installGeneratedAppStubs(targetDir: string): Promise<void>;
|
|
21
|
+
export declare function runGeneratedServerSmoke(targetDir: string, entryPath: string): Promise<{
|
|
22
|
+
code: number | null;
|
|
23
|
+
stdout: string;
|
|
24
|
+
stderr: string;
|
|
25
|
+
}>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/tests/helpers/generator.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOnD,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;AAEnD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACnC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACjC,CAAC;AAsCF,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CA8C3B;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgC3E;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,mCAS9E;AAED,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkJ/E;AAED,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;UAc/C,MAAM,GAAG,IAAI;YAAU,MAAM;YAAU,MAAM;GA8C/E"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { mkdtemp } from "fs/promises";
|
|
3
|
+
import os from "os";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
import fs from "fs-extra";
|
|
7
|
+
import { vi } from "vitest";
|
|
8
|
+
import { createProject, configurePackageJson } from "../../steps/createProject.js";
|
|
9
|
+
import { configurePrisma } from "../../steps/configurePrisma.js";
|
|
10
|
+
import { installAuth } from "../../steps/installAuth.js";
|
|
11
|
+
import { configureProduction } from "../../steps/finalSetup.js";
|
|
12
|
+
import * as hashUtils from "../../utils/hash.js";
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = path.dirname(__filename);
|
|
15
|
+
const repoRoot = path.resolve(__dirname, "../..");
|
|
16
|
+
const templateRoot = path.join(repoRoot, "src", "templates");
|
|
17
|
+
const tsxLoaderPath = path.join(repoRoot, "node_modules", "tsx", "dist", "loader.mjs");
|
|
18
|
+
const templateToAuthMode = {
|
|
19
|
+
base: "base",
|
|
20
|
+
auth: "auth",
|
|
21
|
+
"auth-oauth": "auth-oauth",
|
|
22
|
+
};
|
|
23
|
+
function toPosixPath(value) {
|
|
24
|
+
return value.split(path.sep).join("/");
|
|
25
|
+
}
|
|
26
|
+
function normalizeText(value) {
|
|
27
|
+
return value.replace(/\r\n/g, "\n").trim();
|
|
28
|
+
}
|
|
29
|
+
async function writePackageStub(targetDir, name, source) {
|
|
30
|
+
const moduleDir = path.join(targetDir, "node_modules", name);
|
|
31
|
+
await fs.ensureDir(moduleDir);
|
|
32
|
+
await fs.writeJson(path.join(moduleDir, "package.json"), {
|
|
33
|
+
name,
|
|
34
|
+
type: "module",
|
|
35
|
+
main: "./index.js",
|
|
36
|
+
exports: "./index.js",
|
|
37
|
+
}, { spaces: 2 });
|
|
38
|
+
await fs.writeFile(path.join(moduleDir, "index.js"), source);
|
|
39
|
+
}
|
|
40
|
+
export async function generateProjectFixture(options) {
|
|
41
|
+
const rootDir = await mkdtemp(path.join(os.tmpdir(), "authenik8-vitest-"));
|
|
42
|
+
const targetDir = path.join(rootDir, "generated-app");
|
|
43
|
+
const state = {
|
|
44
|
+
step: "prompts",
|
|
45
|
+
projectName: "generated-app",
|
|
46
|
+
framework: "Express",
|
|
47
|
+
authMode: templateToAuthMode[options.template],
|
|
48
|
+
usePrisma: options.usePrisma ?? true,
|
|
49
|
+
database: options.database ?? "sqlite",
|
|
50
|
+
useGit: false,
|
|
51
|
+
runtime: options.productionRuntime,
|
|
52
|
+
};
|
|
53
|
+
await createProject(state, targetDir, templateRoot);
|
|
54
|
+
let hashLib;
|
|
55
|
+
if (state.authMode !== "base") {
|
|
56
|
+
const hashSpy = vi
|
|
57
|
+
.spyOn(hashUtils, "getBestHashLib")
|
|
58
|
+
.mockReturnValue(options.hashLib ?? "bcryptjs");
|
|
59
|
+
try {
|
|
60
|
+
hashLib = await installAuth(targetDir, "npm");
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
hashSpy.mockRestore();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
await configurePrisma(state, targetDir, templateRoot);
|
|
67
|
+
configurePackageJson(targetDir, state.usePrisma ?? false);
|
|
68
|
+
if (options.productionRuntime) {
|
|
69
|
+
await configureProduction(targetDir, state.projectName, options.productionRuntime);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
rootDir,
|
|
73
|
+
targetDir,
|
|
74
|
+
state,
|
|
75
|
+
hashLib,
|
|
76
|
+
cleanup: async () => {
|
|
77
|
+
await fs.remove(rootDir);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export async function collectProjectTree(rootDir) {
|
|
82
|
+
const entries = [];
|
|
83
|
+
const ignored = new Set(["node_modules", ".git", ".authenik8"]);
|
|
84
|
+
async function walk(currentDir, relativeDir = "") {
|
|
85
|
+
const names = (await fs.readdir(currentDir)).sort();
|
|
86
|
+
for (const name of names) {
|
|
87
|
+
if (ignored.has(name)) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const absolutePath = path.join(currentDir, name);
|
|
91
|
+
const relativePath = relativeDir ? path.join(relativeDir, name) : name;
|
|
92
|
+
const stats = await fs.stat(absolutePath);
|
|
93
|
+
if (stats.isDirectory()) {
|
|
94
|
+
entries.push(`${toPosixPath(relativePath)}/`);
|
|
95
|
+
await walk(absolutePath, relativePath);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (toPosixPath(relativePath) === "src/package-lock.json") {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
entries.push(toPosixPath(relativePath));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
await walk(rootDir);
|
|
105
|
+
return entries;
|
|
106
|
+
}
|
|
107
|
+
export async function readProjectFiles(rootDir, relativePaths) {
|
|
108
|
+
const result = {};
|
|
109
|
+
for (const relativePath of relativePaths) {
|
|
110
|
+
const absolutePath = path.join(rootDir, relativePath);
|
|
111
|
+
result[toPosixPath(relativePath)] = normalizeText(await fs.readFile(absolutePath, "utf8"));
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
export async function installGeneratedAppStubs(targetDir) {
|
|
116
|
+
await writePackageStub(targetDir, "authenik8-core", `export async function createAuthenik8(config) {
|
|
117
|
+
globalThis.__authenik8MockConfig = config;
|
|
118
|
+
return {
|
|
119
|
+
helmet(req, res, next) {
|
|
120
|
+
if (typeof next === "function") next();
|
|
121
|
+
},
|
|
122
|
+
rateLimit(req, res, next) {
|
|
123
|
+
if (typeof next === "function") next();
|
|
124
|
+
},
|
|
125
|
+
requireAdmin(req, res, next) {
|
|
126
|
+
if (typeof next === "function") next();
|
|
127
|
+
},
|
|
128
|
+
signToken() {
|
|
129
|
+
return "access-token";
|
|
130
|
+
},
|
|
131
|
+
async generateRefreshToken() {
|
|
132
|
+
return "refresh-token";
|
|
133
|
+
},
|
|
134
|
+
async refreshToken() {
|
|
135
|
+
return {
|
|
136
|
+
accessToken: "access-token",
|
|
137
|
+
refreshToken: "refresh-token",
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
oauth: {
|
|
141
|
+
google: {
|
|
142
|
+
redirect() {},
|
|
143
|
+
async handleCallback() {
|
|
144
|
+
return { accessToken: "google-token" };
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
github: {
|
|
148
|
+
redirect() {},
|
|
149
|
+
async handleCallback() {
|
|
150
|
+
return { accessToken: "github-token" };
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
`);
|
|
157
|
+
await writePackageStub(targetDir, "dotenv", `export default {
|
|
158
|
+
config() {
|
|
159
|
+
return {};
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
`);
|
|
163
|
+
await writePackageStub(targetDir, "express", `function createRouter() {
|
|
164
|
+
return {
|
|
165
|
+
get() {},
|
|
166
|
+
post() {},
|
|
167
|
+
use() {},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function express() {
|
|
172
|
+
return {
|
|
173
|
+
use() {},
|
|
174
|
+
listen(_port, callback) {
|
|
175
|
+
if (typeof callback === "function") callback();
|
|
176
|
+
return {
|
|
177
|
+
close() {},
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
express.json = function json() {
|
|
184
|
+
return function jsonMiddleware(_req, _res, next) {
|
|
185
|
+
if (typeof next === "function") next();
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
express.Router = createRouter;
|
|
190
|
+
|
|
191
|
+
export const Router = createRouter;
|
|
192
|
+
export default express;
|
|
193
|
+
`);
|
|
194
|
+
await writePackageStub(targetDir, "@prisma/client", `export class PrismaClient {
|
|
195
|
+
constructor() {
|
|
196
|
+
this.user = {
|
|
197
|
+
async create({ data }) {
|
|
198
|
+
return { id: "user-1", ...data };
|
|
199
|
+
},
|
|
200
|
+
async findUnique({ where }) {
|
|
201
|
+
if (!where?.email) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
id: "user-1",
|
|
206
|
+
email: where.email,
|
|
207
|
+
password: "hashed:password",
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
`);
|
|
214
|
+
await writePackageStub(targetDir, "bcryptjs", `export default {
|
|
215
|
+
async hash(value) {
|
|
216
|
+
return "hashed:" + value;
|
|
217
|
+
},
|
|
218
|
+
async compare(value, hash) {
|
|
219
|
+
return hash === "hashed:" + value;
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
`);
|
|
223
|
+
await writePackageStub(targetDir, "argon2", `export default {
|
|
224
|
+
async hash(value) {
|
|
225
|
+
return "hashed:" + value;
|
|
226
|
+
},
|
|
227
|
+
async verify(hash, value) {
|
|
228
|
+
return hash === "hashed:" + value;
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
`);
|
|
232
|
+
}
|
|
233
|
+
export async function runGeneratedServerSmoke(targetDir, entryPath) {
|
|
234
|
+
await installGeneratedAppStubs(targetDir);
|
|
235
|
+
const smokeScriptPath = path.join(targetDir, "smoke-runner.mjs");
|
|
236
|
+
const entryImportPath = `./${toPosixPath(entryPath)}`;
|
|
237
|
+
await fs.writeFile(smokeScriptPath, `globalThis.setInterval = () => ({ unref() {} });
|
|
238
|
+
process.memoryUsage = () => ({ heapUsed: 32 * 1024 * 1024 });
|
|
239
|
+
await import(${JSON.stringify(entryImportPath)});
|
|
240
|
+
`);
|
|
241
|
+
return await new Promise((resolve, reject) => {
|
|
242
|
+
const child = spawn(process.execPath, ["--import", tsxLoaderPath, smokeScriptPath], {
|
|
243
|
+
cwd: targetDir,
|
|
244
|
+
env: {
|
|
245
|
+
...process.env,
|
|
246
|
+
NODE_ENV: "test",
|
|
247
|
+
JWT_SECRET: "test-jwt-secret",
|
|
248
|
+
REFRESH_SECRET: "test-refresh-secret",
|
|
249
|
+
GOOGLE_CLIENT_ID: "google-client-id",
|
|
250
|
+
GOOGLE_CLIENT_SECRET: "google-client-secret",
|
|
251
|
+
GITHUB_CLIENT_ID: "github-client-id",
|
|
252
|
+
GITHUB_CLIENT_SECRET: "github-client-secret",
|
|
253
|
+
},
|
|
254
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
255
|
+
});
|
|
256
|
+
let stdout = "";
|
|
257
|
+
let stderr = "";
|
|
258
|
+
const timeout = setTimeout(() => {
|
|
259
|
+
child.kill("SIGTERM");
|
|
260
|
+
reject(new Error(`Generated server smoke test timed out for ${entryPath}`));
|
|
261
|
+
}, 10_000);
|
|
262
|
+
child.stdout.on("data", (chunk) => {
|
|
263
|
+
stdout += chunk.toString();
|
|
264
|
+
});
|
|
265
|
+
child.stderr.on("data", (chunk) => {
|
|
266
|
+
stderr += chunk.toString();
|
|
267
|
+
});
|
|
268
|
+
child.on("error", (error) => {
|
|
269
|
+
clearTimeout(timeout);
|
|
270
|
+
reject(error);
|
|
271
|
+
});
|
|
272
|
+
child.on("exit", (code) => {
|
|
273
|
+
clearTimeout(timeout);
|
|
274
|
+
resolve({
|
|
275
|
+
code,
|
|
276
|
+
stdout: normalizeText(stdout),
|
|
277
|
+
stderr: normalizeText(stderr),
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/tests/helpers/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.test.d.ts","sourceRoot":"","sources":["../../../src/tests/integration/generator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { generateProjectFixture, readProjectFiles, runGeneratedServerSmoke, } from "../helpers/generator.js";
|
|
4
|
+
describe("generator happy paths", () => {
|
|
5
|
+
it("generates the base template with Prisma SQLite wiring", async () => {
|
|
6
|
+
const project = await generateProjectFixture({
|
|
7
|
+
template: "base",
|
|
8
|
+
database: "sqlite",
|
|
9
|
+
});
|
|
10
|
+
try {
|
|
11
|
+
const pkg = await fs.readJson(`${project.targetDir}/package.json`);
|
|
12
|
+
const files = await readProjectFiles(project.targetDir, [
|
|
13
|
+
"app.ts",
|
|
14
|
+
"routes/base.routes.ts",
|
|
15
|
+
"src/server.ts",
|
|
16
|
+
"prisma/schema.prisma",
|
|
17
|
+
]);
|
|
18
|
+
expect(pkg.scripts.postinstall).toBe("npx prisma@5.22.0 generate");
|
|
19
|
+
expect(pkg.scripts.dev).toContain("npx prisma@5.22.0 generate");
|
|
20
|
+
expect(pkg.dependencies["@prisma/client"]).toBe("5.22.0");
|
|
21
|
+
expect(files["app.ts"]).toContain("app.use(auth.helmet)");
|
|
22
|
+
expect(files["routes/base.routes.ts"]).toContain('router.get("/protected"');
|
|
23
|
+
expect(files["prisma/schema.prisma"]).toContain('provider = "sqlite"');
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
await project.cleanup();
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
it("generates the email/password template with a mocked bcrypt hash module", async () => {
|
|
30
|
+
const project = await generateProjectFixture({
|
|
31
|
+
template: "auth",
|
|
32
|
+
database: "postgresql",
|
|
33
|
+
hashLib: "bcryptjs",
|
|
34
|
+
});
|
|
35
|
+
try {
|
|
36
|
+
const pkg = await fs.readJson(`${project.targetDir}/package.json`);
|
|
37
|
+
const files = await readProjectFiles(project.targetDir, [
|
|
38
|
+
"src/app.ts",
|
|
39
|
+
"src/routes/auth.routes.ts",
|
|
40
|
+
"src/routes/protected.routes.ts",
|
|
41
|
+
"src/utils/hash.ts",
|
|
42
|
+
"prisma/schema.prisma",
|
|
43
|
+
]);
|
|
44
|
+
expect(project.hashLib).toBe("bcryptjs");
|
|
45
|
+
expect(pkg.dependencies.bcryptjs).toBe("^2.4.3");
|
|
46
|
+
expect(pkg.dependencies.ioredis).toBe("^5.8.1");
|
|
47
|
+
expect(files["src/app.ts"]).toContain('app.use("/auth", createAuthRoutes(auth))');
|
|
48
|
+
expect(files["src/routes/auth.routes.ts"]).toContain('router.post("/register"');
|
|
49
|
+
expect(files["src/utils/hash.ts"]).toContain('import bcrypt from "bcryptjs"');
|
|
50
|
+
expect(files["prisma/schema.prisma"]).toContain('provider = "postgresql"');
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
await project.cleanup();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
it("generates the OAuth template with production runtime files", async () => {
|
|
57
|
+
const project = await generateProjectFixture({
|
|
58
|
+
template: "auth-oauth",
|
|
59
|
+
database: "sqlite",
|
|
60
|
+
hashLib: "bcryptjs",
|
|
61
|
+
productionRuntime: "node",
|
|
62
|
+
});
|
|
63
|
+
try {
|
|
64
|
+
const pkg = await fs.readJson(`${project.targetDir}/package.json`);
|
|
65
|
+
const files = await readProjectFiles(project.targetDir, [
|
|
66
|
+
"src/server.ts",
|
|
67
|
+
"src/auth/auth.ts",
|
|
68
|
+
"src/auth/oauth.routes.ts",
|
|
69
|
+
"src/auth/password.route.ts",
|
|
70
|
+
"ecosystem.config.js",
|
|
71
|
+
]);
|
|
72
|
+
expect(pkg.dependencies.pm2).toBe("^5.4.2");
|
|
73
|
+
expect(pkg.dependencies["ts-node"]).toBe("^10.9.2");
|
|
74
|
+
expect(pkg.scripts["pm2:start"]).toBe("npx pm2 start ecosystem.config.js");
|
|
75
|
+
expect(files["src/auth/auth.ts"]).toContain('redirectUri: "http://localhost:3000/auth/google/callback"');
|
|
76
|
+
expect(files["src/auth/oauth.routes.ts"]).toContain('router.get("/github/callback"');
|
|
77
|
+
expect(files["src/auth/password.route.ts"]).toContain("generateRefreshToken");
|
|
78
|
+
expect(files["ecosystem.config.js"]).toContain('interpreter_args: "-r ts-node/register"');
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await project.cleanup();
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
it.each([
|
|
85
|
+
{
|
|
86
|
+
template: "base",
|
|
87
|
+
entryPath: "src/server.ts",
|
|
88
|
+
expectedOutput: "Server running on http://localhost:3000",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
template: "auth",
|
|
92
|
+
entryPath: "src/server.ts",
|
|
93
|
+
expectedOutput: "Server running on http://localhost:3000",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
template: "auth-oauth",
|
|
97
|
+
entryPath: "src/server.ts",
|
|
98
|
+
expectedOutput: "Auth system running on http://localhost:3000",
|
|
99
|
+
},
|
|
100
|
+
])("boots the generated $template server with mocked runtime packages", async (scenario) => {
|
|
101
|
+
const project = await generateProjectFixture({
|
|
102
|
+
template: scenario.template,
|
|
103
|
+
hashLib: "bcryptjs",
|
|
104
|
+
});
|
|
105
|
+
try {
|
|
106
|
+
const result = await runGeneratedServerSmoke(project.targetDir, scenario.entryPath);
|
|
107
|
+
expect(result.code).toBe(0);
|
|
108
|
+
expect(result.stderr).toBe("");
|
|
109
|
+
expect(result.stdout).toContain(scenario.expectedOutput);
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
await project.cleanup();
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=generator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.test.js","sourceRoot":"","sources":["../../../src/tests/integration/generator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.test.d.ts","sourceRoot":"","sources":["../../../src/tests/integration/snapshot.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { collectProjectTree, generateProjectFixture, readProjectFiles, } from "../helpers/generator.js";
|
|
3
|
+
describe("generator snapshots", () => {
|
|
4
|
+
it.each([
|
|
5
|
+
{
|
|
6
|
+
name: "express-base",
|
|
7
|
+
options: {
|
|
8
|
+
template: "base",
|
|
9
|
+
database: "sqlite",
|
|
10
|
+
},
|
|
11
|
+
keyFiles: ["app.ts", "routes/base.routes.ts", "src/server.ts", "prisma/schema.prisma"],
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: "express-auth",
|
|
15
|
+
options: {
|
|
16
|
+
template: "auth",
|
|
17
|
+
database: "postgresql",
|
|
18
|
+
hashLib: "bcryptjs",
|
|
19
|
+
},
|
|
20
|
+
keyFiles: [
|
|
21
|
+
"src/app.ts",
|
|
22
|
+
"src/routes/auth.routes.ts",
|
|
23
|
+
"src/routes/protected.routes.ts",
|
|
24
|
+
"src/utils/hash.ts",
|
|
25
|
+
"prisma/schema.prisma",
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "express-auth-oauth",
|
|
30
|
+
options: {
|
|
31
|
+
template: "auth-oauth",
|
|
32
|
+
database: "sqlite",
|
|
33
|
+
hashLib: "bcryptjs",
|
|
34
|
+
},
|
|
35
|
+
keyFiles: [
|
|
36
|
+
"src/server.ts",
|
|
37
|
+
"src/auth/auth.ts",
|
|
38
|
+
"src/auth/password.route.ts",
|
|
39
|
+
"src/auth/oauth.routes.ts",
|
|
40
|
+
"src/auth/protected.routes.ts",
|
|
41
|
+
"src/utils/hash.ts",
|
|
42
|
+
"prisma/schema.prisma",
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
])("$name folder tree and key files match the snapshot", async ({ options, keyFiles }) => {
|
|
46
|
+
const project = await generateProjectFixture(options);
|
|
47
|
+
try {
|
|
48
|
+
const rawTree = await collectProjectTree(project.targetDir);
|
|
49
|
+
const files = await readProjectFiles(project.targetDir, keyFiles);
|
|
50
|
+
const stableTree = rawTree
|
|
51
|
+
.filter((path) => !path.includes("node_modules") &&
|
|
52
|
+
!path.endsWith(".env") &&
|
|
53
|
+
!path.endsWith(".env.example") &&
|
|
54
|
+
!path.includes("package-lock.json")).sort();
|
|
55
|
+
const filesContent = await readProjectFiles(project.targetDir, keyFiles);
|
|
56
|
+
const snapshotData = {
|
|
57
|
+
template: options.template,
|
|
58
|
+
tree: stableTree,
|
|
59
|
+
keyFiles: filesContent,
|
|
60
|
+
};
|
|
61
|
+
expect(snapshotData).toMatchSnapshot();
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
await project.cleanup();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=snapshot.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.test.js","sourceRoot":"","sources":["../../../src/tests/integration/snapshot.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,IAAI,CAAC;QACN;YACE,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE;gBACP,QAAQ,EAAE,MAAe;gBACzB,QAAQ,EAAE,QAAiB;aAC5B;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,uBAAuB,EAAE,eAAe,EAAE,sBAAsB,CAAC;SACvF;QACD;YACE,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE;gBACP,QAAQ,EAAE,MAAe;gBACzB,QAAQ,EAAE,YAAqB;gBAC/B,OAAO,EAAE,UAAmB;aAC7B;YACD,QAAQ,EAAE;gBACR,YAAY;gBACZ,2BAA2B;gBAC3B,gCAAgC;gBAChC,mBAAmB;gBACnB,sBAAsB;aACvB;SACF;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE;gBACP,QAAQ,EAAE,YAAqB;gBAC/B,QAAQ,EAAE,QAAiB;gBAC3B,OAAO,EAAE,UAAmB;aAC7B;YACD,QAAQ,EAAE;gBACR,eAAe;gBACf,kBAAkB;gBAClB,4BAA4B;gBAC5B,0BAA0B;gBAC1B,8BAA8B;gBAC9B,mBAAmB;gBACnB,sBAAsB;aACvB;SACF;KACF,CAAC,CAAC,oDAAoD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QACvF,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAEtD,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAG3D,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAGnE,MAAM,UAAU,GAAG,OAAO;iBACpB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACtB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;gBACzB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACtB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAC9B,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CACzC,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEzE,MAAM,YAAY,GAAG;gBACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,YAAY;aACvB,CAAC;YAEF,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/tests/setup.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/tests/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEnD,UAAU,CAAC,GAAG,EAAE;IACd,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,gBAAgB,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../../src/tests/unit/cli.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { mkdtemp } from "fs/promises";
|
|
3
|
+
import os from "os";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
import fs from "fs-extra";
|
|
7
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
8
|
+
const mockModules = vi.hoisted(() => {
|
|
9
|
+
const state = {
|
|
10
|
+
promptAnswers: {
|
|
11
|
+
framework: "Express",
|
|
12
|
+
authMode: "base",
|
|
13
|
+
usePrisma: true,
|
|
14
|
+
database: "sqlite",
|
|
15
|
+
useGit: false,
|
|
16
|
+
runtime: "node",
|
|
17
|
+
},
|
|
18
|
+
showBootLogo: vi.fn(async () => { }),
|
|
19
|
+
renderStep: vi.fn(),
|
|
20
|
+
runPrompts: vi.fn(async () => state.promptAnswers),
|
|
21
|
+
createProject: vi.fn(async () => { }),
|
|
22
|
+
configurePackageJson: vi.fn(),
|
|
23
|
+
installAuth: vi.fn(async () => "bcryptjs"),
|
|
24
|
+
configurePrisma: vi.fn(async () => { }),
|
|
25
|
+
installDependencies: vi.fn(async () => { }),
|
|
26
|
+
detectPackageManager: vi.fn(() => "npm"),
|
|
27
|
+
configureProduction: vi.fn(async () => { }),
|
|
28
|
+
initGit: vi.fn(async () => { }),
|
|
29
|
+
appendProductionReadme: vi.fn(),
|
|
30
|
+
resolveRuntime: vi.fn((runtime) => runtime ?? "node"),
|
|
31
|
+
printSummary: vi.fn(),
|
|
32
|
+
spinner: {
|
|
33
|
+
start: vi.fn(),
|
|
34
|
+
stop: vi.fn(),
|
|
35
|
+
succeed: vi.fn(),
|
|
36
|
+
fail: vi.fn(),
|
|
37
|
+
text: "",
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
return state;
|
|
41
|
+
});
|
|
42
|
+
vi.mock("./lib/ui.js", () => ({
|
|
43
|
+
showBootLogo: mockModules.showBootLogo,
|
|
44
|
+
renderStep: mockModules.renderStep,
|
|
45
|
+
spinner: mockModules.spinner,
|
|
46
|
+
}));
|
|
47
|
+
vi.mock("./steps/prompts.js", () => ({
|
|
48
|
+
runPrompts: mockModules.runPrompts,
|
|
49
|
+
}));
|
|
50
|
+
vi.mock("./steps/createProject.js", () => ({
|
|
51
|
+
createProject: mockModules.createProject,
|
|
52
|
+
configurePackageJson: mockModules.configurePackageJson,
|
|
53
|
+
}));
|
|
54
|
+
vi.mock("./src/steps/installAuth.js", () => ({
|
|
55
|
+
installAuth: mockModules.installAuth,
|
|
56
|
+
}));
|
|
57
|
+
vi.mock("./steps/configurePrisma.js", () => ({
|
|
58
|
+
configurePrisma: mockModules.configurePrisma,
|
|
59
|
+
}));
|
|
60
|
+
vi.mock("./steps/installDeps.js", () => ({
|
|
61
|
+
installDependencies: mockModules.installDependencies,
|
|
62
|
+
detectPackageManager: mockModules.detectPackageManager,
|
|
63
|
+
}));
|
|
64
|
+
vi.mock("./steps/finalSetup.js", () => ({
|
|
65
|
+
configureProduction: mockModules.configureProduction,
|
|
66
|
+
initGit: mockModules.initGit,
|
|
67
|
+
appendProductionReadme: mockModules.appendProductionReadme,
|
|
68
|
+
resolveRuntime: mockModules.resolveRuntime,
|
|
69
|
+
}));
|
|
70
|
+
vi.mock("./utils/output.js", () => ({
|
|
71
|
+
printSummary: mockModules.printSummary,
|
|
72
|
+
}));
|
|
73
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
74
|
+
const __dirname = path.dirname(__filename);
|
|
75
|
+
const repoRoot = path.resolve(__dirname, "../..");
|
|
76
|
+
const tsxLoaderPath = path.join(repoRoot, "node_modules", "tsx", "dist", "loader.mjs");
|
|
77
|
+
function normalizeText(value) {
|
|
78
|
+
return value.replace(/\r\n/g, "\n").trim();
|
|
79
|
+
}
|
|
80
|
+
async function runCliSubprocess(argv, cwd) {
|
|
81
|
+
return await new Promise((resolve, reject) => {
|
|
82
|
+
const child = spawn(process.execPath, ["--import", tsxLoaderPath, path.join(repoRoot, "src/index.ts"), ...argv], {
|
|
83
|
+
cwd,
|
|
84
|
+
env: {
|
|
85
|
+
...process.env,
|
|
86
|
+
FORCE_COLOR: "0",
|
|
87
|
+
CI: "true",
|
|
88
|
+
},
|
|
89
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
90
|
+
});
|
|
91
|
+
let stdout = "";
|
|
92
|
+
let stderr = "";
|
|
93
|
+
child.stdout.on("data", (chunk) => {
|
|
94
|
+
stdout += chunk.toString();
|
|
95
|
+
});
|
|
96
|
+
child.stderr.on("data", (chunk) => {
|
|
97
|
+
stderr += chunk.toString();
|
|
98
|
+
});
|
|
99
|
+
child.on("error", reject);
|
|
100
|
+
child.on("exit", (code) => {
|
|
101
|
+
resolve({
|
|
102
|
+
code,
|
|
103
|
+
stdout: normalizeText(stdout),
|
|
104
|
+
stderr: normalizeText(stderr),
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async function runCli(argv, options = {}) {
|
|
110
|
+
const cwd = await mkdtemp(path.join(os.tmpdir(), "authenik8-cli-"));
|
|
111
|
+
const previousArgv = [...process.argv];
|
|
112
|
+
const previousCwd = process.cwd();
|
|
113
|
+
const previousSigintListeners = process.listeners("SIGINT");
|
|
114
|
+
const logs = [];
|
|
115
|
+
const errors = [];
|
|
116
|
+
let exitCode;
|
|
117
|
+
mockModules.promptAnswers = {
|
|
118
|
+
framework: "Express",
|
|
119
|
+
authMode: "base",
|
|
120
|
+
usePrisma: true,
|
|
121
|
+
database: "sqlite",
|
|
122
|
+
useGit: false,
|
|
123
|
+
runtime: "node",
|
|
124
|
+
...options.promptAnswers,
|
|
125
|
+
};
|
|
126
|
+
const projectName = argv.find((arg) => !arg.startsWith("--"));
|
|
127
|
+
if (options.createExistingTargetDir && projectName) {
|
|
128
|
+
await fs.ensureDir(path.join(cwd, projectName));
|
|
129
|
+
}
|
|
130
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation((...args) => {
|
|
131
|
+
logs.push(args.join(" "));
|
|
132
|
+
});
|
|
133
|
+
const errorSpy = vi.spyOn(console, "error").mockImplementation((...args) => {
|
|
134
|
+
errors.push(args.join(" "));
|
|
135
|
+
});
|
|
136
|
+
const exitSpy = vi
|
|
137
|
+
.spyOn(process, "exit")
|
|
138
|
+
.mockImplementation(((code) => {
|
|
139
|
+
exitCode = code ?? 0;
|
|
140
|
+
throw new Error(`process.exit:${exitCode}`);
|
|
141
|
+
}));
|
|
142
|
+
process.chdir(cwd);
|
|
143
|
+
process.argv = ["node", "src/index.ts", ...argv];
|
|
144
|
+
try {
|
|
145
|
+
vi.resetModules();
|
|
146
|
+
await import("../../index.js");
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
if (!(error instanceof Error) || !error.message.startsWith("process.exit:")) {
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
exitSpy.mockRestore();
|
|
155
|
+
errorSpy.mockRestore();
|
|
156
|
+
logSpy.mockRestore();
|
|
157
|
+
process.argv = previousArgv;
|
|
158
|
+
process.chdir(previousCwd);
|
|
159
|
+
for (const listener of process.listeners("SIGINT")) {
|
|
160
|
+
if (!previousSigintListeners.includes(listener)) {
|
|
161
|
+
process.removeListener("SIGINT", listener);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
exitCode,
|
|
167
|
+
logs,
|
|
168
|
+
errors,
|
|
169
|
+
cwd,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
beforeEach(() => {
|
|
173
|
+
vi.clearAllMocks();
|
|
174
|
+
});
|
|
175
|
+
afterEach(async () => {
|
|
176
|
+
const tempDirs = await fs.readdir(os.tmpdir());
|
|
177
|
+
await Promise.all(tempDirs
|
|
178
|
+
.filter((name) => name.startsWith("authenik8-cli-"))
|
|
179
|
+
.map((name) => fs.remove(path.join(os.tmpdir(), name))));
|
|
180
|
+
});
|
|
181
|
+
describe("CLI", () => {
|
|
182
|
+
it("fails fast when no project name is provided", async () => {
|
|
183
|
+
const cwd = await mkdtemp(path.join(os.tmpdir(), "authenik8-cli-"));
|
|
184
|
+
const result = await runCliSubprocess(["--production-ready"], cwd);
|
|
185
|
+
expect(result.code).toBe(1);
|
|
186
|
+
expect(result.stdout).toContain("Please provide a project name");
|
|
187
|
+
expect(mockModules.runPrompts).not.toHaveBeenCalled();
|
|
188
|
+
});
|
|
189
|
+
it("prints help output for --help without starting generation", async () => {
|
|
190
|
+
const cwd = await mkdtemp(path.join(os.tmpdir(), "authenik8-cli-"));
|
|
191
|
+
const result = await runCliSubprocess(["demo-app", "--help"], cwd);
|
|
192
|
+
expect(result.code).toBe(0);
|
|
193
|
+
expect(result.stdout).toContain("Authenik8 CLI");
|
|
194
|
+
expect(result.stdout).toContain("Usage:");
|
|
195
|
+
expect(mockModules.runPrompts).not.toHaveBeenCalled();
|
|
196
|
+
expect(mockModules.createProject).not.toHaveBeenCalled();
|
|
197
|
+
});
|
|
198
|
+
it("reports an existing target directory before running prompts", async () => {
|
|
199
|
+
const cwd = await mkdtemp(path.join(os.tmpdir(), "authenik8-cli-"));
|
|
200
|
+
await fs.ensureDir(path.join(cwd, "demo-app"));
|
|
201
|
+
const result = await runCliSubprocess(["demo-app"], cwd);
|
|
202
|
+
expect(result.code).toBe(1);
|
|
203
|
+
expect(result.stdout).toContain('Directory "demo-app" already exists.');
|
|
204
|
+
expect(mockModules.runPrompts).not.toHaveBeenCalled();
|
|
205
|
+
});
|
|
206
|
+
it("runs the common base-template flow without crashing", async () => {
|
|
207
|
+
const result = await runCli(["demo-app"]);
|
|
208
|
+
expect(result.exitCode).toBeUndefined();
|
|
209
|
+
expect(mockModules.runPrompts).toHaveBeenCalledTimes(1);
|
|
210
|
+
expect(mockModules.createProject).toHaveBeenCalledTimes(1);
|
|
211
|
+
expect(mockModules.configurePrisma).toHaveBeenCalledTimes(1);
|
|
212
|
+
expect(mockModules.installDependencies).toHaveBeenCalledTimes(1);
|
|
213
|
+
expect(mockModules.printSummary).toHaveBeenCalledWith(expect.objectContaining({
|
|
214
|
+
projectName: "demo-app",
|
|
215
|
+
authMode: "base",
|
|
216
|
+
usePrisma: true,
|
|
217
|
+
}), false);
|
|
218
|
+
expect(result.errors).toHaveLength(0);
|
|
219
|
+
});
|
|
220
|
+
it("parses flags around the project name and runs the production auth flow", async () => {
|
|
221
|
+
const result = await runCli(["--production-ready", "demo-auth"], {
|
|
222
|
+
promptAnswers: {
|
|
223
|
+
authMode: "auth",
|
|
224
|
+
usePrisma: false,
|
|
225
|
+
database: "postgresql",
|
|
226
|
+
runtime: "node",
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
expect(result.exitCode).toBeUndefined();
|
|
230
|
+
expect(mockModules.installAuth).toHaveBeenCalledTimes(1);
|
|
231
|
+
expect(mockModules.configureProduction).toHaveBeenCalledTimes(1);
|
|
232
|
+
expect(mockModules.appendProductionReadme).toHaveBeenCalledTimes(1);
|
|
233
|
+
expect(mockModules.printSummary).toHaveBeenCalledWith(expect.objectContaining({
|
|
234
|
+
projectName: "demo-auth",
|
|
235
|
+
authMode: "auth",
|
|
236
|
+
usePrisma: true,
|
|
237
|
+
database: "postgresql",
|
|
238
|
+
}), true);
|
|
239
|
+
expect(result.logs.join("\n")).toContain("require Prisma");
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
//# sourceMappingURL=cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../../src/tests/unit/cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../src/vitest.config.ts"],"names":[],"mappings":";AAEA,wBAkBG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { defineConfig } from "vitest/config";
|
|
2
|
+
export default defineConfig({
|
|
3
|
+
test: {
|
|
4
|
+
environment: "node",
|
|
5
|
+
setupFiles: ["./tests/setup.ts"],
|
|
6
|
+
include: ["tests/**/*.test.ts"],
|
|
7
|
+
fileParallelism: false,
|
|
8
|
+
restoreMocks: true,
|
|
9
|
+
clearMocks: true,
|
|
10
|
+
mockReset: true,
|
|
11
|
+
testTimeout: 30_000,
|
|
12
|
+
coverage: {
|
|
13
|
+
provider: "v8",
|
|
14
|
+
reporter: ["text", "json-summary", "html"],
|
|
15
|
+
reportsDirectory: "./coverage",
|
|
16
|
+
include: ["src/**/*.ts"],
|
|
17
|
+
exclude: ["src/bin/**", "src/**/*.d.ts", "tests/**"],
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=vitest.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../src/vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM;QACnB,UAAU,EAAE,CAAC,kBAAkB,CAAC;QAChC,OAAO,EAAE,CAAC,oBAAoB,CAAC;QAC/B,eAAe,EAAE,KAAK;QACtB,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,MAAM;QACnB,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,EAAC,MAAM,CAAC;YACzC,gBAAgB,EAAE,YAAY;YAC9B,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,OAAO,EAAE,CAAC,YAAY,EAAC,eAAe,EAAE,UAAU,CAAC;SACpD;KACF;CACF,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-authenik8-app",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.7",
|
|
4
4
|
"description": "⚡ Fast Express + TypeScript auth starter with secure JWT, refresh rotation, Redis, RBAC, OAuth & Prisma.\nPowered by the Authenik8 Identity Engine.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"create-authenik8-app": "dist/index.js"
|
|
@@ -42,12 +42,17 @@
|
|
|
42
42
|
"templates"
|
|
43
43
|
],
|
|
44
44
|
"scripts": {
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"test:watch": "vitest",
|
|
47
|
+
"test:coverage": "vitest run --coverage",
|
|
45
48
|
"test:templates": "node --import tsx --test tests/template-servers.test.mjs"
|
|
46
49
|
},
|
|
47
50
|
"devDependencies": {
|
|
48
51
|
"@types/express": "^5.0.6",
|
|
49
52
|
"@types/fs-extra": "^11.0.4",
|
|
50
|
-
"@types/node": "^25.5.2"
|
|
53
|
+
"@types/node": "^25.5.2",
|
|
54
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
55
|
+
"vitest": "^3.2.4"
|
|
51
56
|
},
|
|
52
57
|
"repository": {
|
|
53
58
|
"type": "git",
|