@kyuujs/cli 0.1.0-alpha.0
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/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +13 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/build.d.ts +16 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +40 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +15 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +53 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/new.d.ts +12 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +83 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/start.d.ts +22 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +64 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/dispatcher.d.ts +20 -0
- package/dist/dispatcher.d.ts.map +1 -0
- package/dist/dispatcher.js +51 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/help.d.ts +5 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +24 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/project/git.d.ts +12 -0
- package/dist/project/git.d.ts.map +1 -0
- package/dist/project/git.js +23 -0
- package/dist/project/git.js.map +1 -0
- package/dist/project/options.d.ts +11 -0
- package/dist/project/options.d.ts.map +1 -0
- package/dist/project/options.js +2 -0
- package/dist/project/options.js.map +1 -0
- package/dist/project/package-manager.d.ts +13 -0
- package/dist/project/package-manager.d.ts.map +1 -0
- package/dist/project/package-manager.js +25 -0
- package/dist/project/package-manager.js.map +1 -0
- package/dist/project/scaffolder.d.ts +6 -0
- package/dist/project/scaffolder.d.ts.map +1 -0
- package/dist/project/scaffolder.js +113 -0
- package/dist/project/scaffolder.js.map +1 -0
- package/dist/project/validation.d.ts +10 -0
- package/dist/project/validation.d.ts.map +1 -0
- package/dist/project/validation.js +54 -0
- package/dist/project/validation.js.map +1 -0
- package/dist/project/wizard.d.ts +17 -0
- package/dist/project/wizard.d.ts.map +1 -0
- package/dist/project/wizard.js +72 -0
- package/dist/project/wizard.js.map +1 -0
- package/dist/runner/app-runner.d.ts +2 -0
- package/dist/runner/app-runner.d.ts.map +1 -0
- package/dist/runner/app-runner.js +54 -0
- package/dist/runner/app-runner.js.map +1 -0
- package/dist/runner/dev-runner.d.ts +15 -0
- package/dist/runner/dev-runner.d.ts.map +1 -0
- package/dist/runner/dev-runner.js +209 -0
- package/dist/runner/dev-runner.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/package.json +21 -0
- package/src/bin.ts +13 -0
- package/src/commands/build.ts +59 -0
- package/src/commands/dev.ts +73 -0
- package/src/commands/new.ts +107 -0
- package/src/commands/start.ts +91 -0
- package/src/dispatcher.ts +79 -0
- package/src/help.ts +23 -0
- package/src/index.ts +90 -0
- package/src/project/git.ts +31 -0
- package/src/project/options.ts +11 -0
- package/src/project/package-manager.ts +37 -0
- package/src/project/scaffolder.ts +140 -0
- package/src/project/validation.ts +67 -0
- package/src/project/wizard.ts +89 -0
- package/src/runner/app-runner.ts +61 -0
- package/src/runner/dev-runner.ts +256 -0
- package/src/version.ts +15 -0
- package/tsconfig.json +10 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Initializes a Git repository in the target directory if requested.
|
|
6
|
+
*/
|
|
7
|
+
export async function initializeGitRepo(directory, execFn = execFileAsync) {
|
|
8
|
+
try {
|
|
9
|
+
await execFn("git", ["init"], {
|
|
10
|
+
cwd: directory,
|
|
11
|
+
shell: process.platform === "win32",
|
|
12
|
+
});
|
|
13
|
+
return { success: true };
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
17
|
+
return {
|
|
18
|
+
success: false,
|
|
19
|
+
error: message,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/project/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAO1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,MAAM,GAAyB,aAAa;IAE5C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;YAC5B,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type ProjectLanguage = "typescript" | "javascript";
|
|
2
|
+
export type PackageManager = "pnpm" | "npm" | "yarn";
|
|
3
|
+
export interface ProjectCreationOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
directory: string;
|
|
6
|
+
language: ProjectLanguage;
|
|
7
|
+
packageManager: PackageManager;
|
|
8
|
+
initializeGit: boolean;
|
|
9
|
+
skipInstall?: boolean;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/project/options.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,YAAY,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/project/options.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import type { PackageManager } from "./options.js";
|
|
3
|
+
declare const execFileAsync: typeof execFile.__promisify__;
|
|
4
|
+
export interface InstallResult {
|
|
5
|
+
success: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Installs project dependencies using the selected package manager.
|
|
10
|
+
*/
|
|
11
|
+
export declare function installDependencies(directory: string, pm: PackageManager, execFn?: typeof execFileAsync): Promise<InstallResult>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/project/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,QAAA,MAAM,aAAa,+BAAsB,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,cAAc,EAClB,MAAM,GAAE,OAAO,aAA6B,GAC3C,OAAO,CAAC,aAAa,CAAC,CAkBxB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Installs project dependencies using the selected package manager.
|
|
6
|
+
*/
|
|
7
|
+
export async function installDependencies(directory, pm, execFn = execFileAsync) {
|
|
8
|
+
try {
|
|
9
|
+
const cmd = pm;
|
|
10
|
+
const args = ["install"];
|
|
11
|
+
await execFn(cmd, args, {
|
|
12
|
+
cwd: directory,
|
|
13
|
+
shell: process.platform === "win32",
|
|
14
|
+
});
|
|
15
|
+
return { success: true };
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
19
|
+
return {
|
|
20
|
+
success: false,
|
|
21
|
+
error: message,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/project/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAO1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,EAAkB,EAClB,MAAM,GAAyB,aAAa;IAE5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAEzB,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE;YACtB,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ProjectCreationOptions } from "./options.js";
|
|
2
|
+
/**
|
|
3
|
+
* Scaffolds project files and directory structure based on ProjectCreationOptions.
|
|
4
|
+
*/
|
|
5
|
+
export declare function scaffoldProject(options: ProjectCreationOptions): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=scaffolder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../../src/project/scaffolder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAG3D;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8HpF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { getVersion } from "../version.js";
|
|
4
|
+
/**
|
|
5
|
+
* Scaffolds project files and directory structure based on ProjectCreationOptions.
|
|
6
|
+
*/
|
|
7
|
+
export async function scaffoldProject(options) {
|
|
8
|
+
const version = getVersion();
|
|
9
|
+
const kyuuDepVersion = `^${version}`;
|
|
10
|
+
mkdirSync(options.directory, { recursive: true });
|
|
11
|
+
if (options.language === "typescript") {
|
|
12
|
+
// 1. kyuu.config.ts
|
|
13
|
+
writeFile(join(options.directory, "kyuu.config.ts"), `import { defineConfig } from "@kyuujs/core";
|
|
14
|
+
|
|
15
|
+
export default defineConfig({
|
|
16
|
+
server: {
|
|
17
|
+
port: 3000,
|
|
18
|
+
host: "127.0.0.1",
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
`);
|
|
22
|
+
// 2. package.json
|
|
23
|
+
const pkgContent = {
|
|
24
|
+
name: options.name,
|
|
25
|
+
version: "0.1.0",
|
|
26
|
+
private: true,
|
|
27
|
+
type: "module",
|
|
28
|
+
scripts: {
|
|
29
|
+
dev: "kyuu dev",
|
|
30
|
+
build: "kyuu build",
|
|
31
|
+
start: "kyuu start",
|
|
32
|
+
},
|
|
33
|
+
dependencies: {
|
|
34
|
+
"@kyuujs/core": kyuuDepVersion,
|
|
35
|
+
},
|
|
36
|
+
devDependencies: {
|
|
37
|
+
"@kyuujs/cli": kyuuDepVersion,
|
|
38
|
+
typescript: "^5.0.0",
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
writeFile(join(options.directory, "package.json"), JSON.stringify(pkgContent, null, 2) + "\n");
|
|
42
|
+
// 3. tsconfig.json
|
|
43
|
+
const tsconfigContent = {
|
|
44
|
+
compilerOptions: {
|
|
45
|
+
target: "ES2022",
|
|
46
|
+
module: "NodeNext",
|
|
47
|
+
moduleResolution: "NodeNext",
|
|
48
|
+
esModuleInterop: true,
|
|
49
|
+
strict: true,
|
|
50
|
+
skipLibCheck: true,
|
|
51
|
+
outDir: "dist",
|
|
52
|
+
},
|
|
53
|
+
include: ["src/**/*", "kyuu.config.ts"],
|
|
54
|
+
};
|
|
55
|
+
writeFile(join(options.directory, "tsconfig.json"), JSON.stringify(tsconfigContent, null, 2) + "\n");
|
|
56
|
+
// 4. src/app/route.ts
|
|
57
|
+
writeFile(join(options.directory, "src", "app", "route.ts"), `import type { Request, Response } from "@kyuujs/core";
|
|
58
|
+
|
|
59
|
+
export const GET = async (_req: Request, res: Response) => {
|
|
60
|
+
return res.json({ message: "Hello from Kyuu!" });
|
|
61
|
+
};
|
|
62
|
+
`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// JavaScript project scaffolding
|
|
66
|
+
// 1. kyuu.config.js
|
|
67
|
+
writeFile(join(options.directory, "kyuu.config.js"), `import { defineConfig } from "@kyuujs/core";
|
|
68
|
+
|
|
69
|
+
export default defineConfig({
|
|
70
|
+
server: {
|
|
71
|
+
port: 3000,
|
|
72
|
+
host: "127.0.0.1",
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
`);
|
|
76
|
+
// 2. package.json
|
|
77
|
+
const pkgContent = {
|
|
78
|
+
name: options.name,
|
|
79
|
+
version: "0.1.0",
|
|
80
|
+
private: true,
|
|
81
|
+
type: "module",
|
|
82
|
+
scripts: {
|
|
83
|
+
dev: "kyuu dev",
|
|
84
|
+
start: "kyuu start",
|
|
85
|
+
},
|
|
86
|
+
dependencies: {
|
|
87
|
+
"@kyuujs/core": kyuuDepVersion,
|
|
88
|
+
},
|
|
89
|
+
devDependencies: {
|
|
90
|
+
"@kyuujs/cli": kyuuDepVersion,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
writeFile(join(options.directory, "package.json"), JSON.stringify(pkgContent, null, 2) + "\n");
|
|
94
|
+
// 3. src/app/route.js
|
|
95
|
+
writeFile(join(options.directory, "src", "app", "route.js"), `export const GET = async (_req, res) => {
|
|
96
|
+
return res.json({ message: "Hello from Kyuu!" });
|
|
97
|
+
};
|
|
98
|
+
`);
|
|
99
|
+
}
|
|
100
|
+
// Common files
|
|
101
|
+
// .gitignore
|
|
102
|
+
writeFile(join(options.directory, ".gitignore"), `node_modules/
|
|
103
|
+
dist/
|
|
104
|
+
.kyuu/
|
|
105
|
+
.env
|
|
106
|
+
*.log
|
|
107
|
+
`);
|
|
108
|
+
}
|
|
109
|
+
function writeFile(path, content) {
|
|
110
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
111
|
+
writeFileSync(path, content, "utf8");
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=scaffolder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/project/scaffolder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ValidationResult {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
error?: string;
|
|
4
|
+
targetDirectory?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Validates project name and resolves the target directory.
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateProjectName(name: string, cwd?: string): ValidationResult;
|
|
10
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/project/validation.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,gBAAgB,CAsD/F"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, resolve } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Validates project name and resolves the target directory.
|
|
5
|
+
*/
|
|
6
|
+
export function validateProjectName(name, cwd = process.cwd()) {
|
|
7
|
+
if (!name || name.trim().length === 0) {
|
|
8
|
+
return { valid: false, error: "Project name cannot be empty." };
|
|
9
|
+
}
|
|
10
|
+
const trimmed = name.trim();
|
|
11
|
+
// Prevent path traversal and relative navigation in project name
|
|
12
|
+
if (trimmed.includes("/") ||
|
|
13
|
+
trimmed.includes("\\") ||
|
|
14
|
+
trimmed.includes("..") ||
|
|
15
|
+
isAbsolute(trimmed)) {
|
|
16
|
+
return {
|
|
17
|
+
valid: false,
|
|
18
|
+
error: `Invalid project name "${trimmed}". Path traversal and absolute paths are not allowed.`,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// Prevent invalid npm package / directory name characters
|
|
22
|
+
const validNameRegex = /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/i;
|
|
23
|
+
if (!validNameRegex.test(trimmed)) {
|
|
24
|
+
return {
|
|
25
|
+
valid: false,
|
|
26
|
+
error: `Invalid project name "${trimmed}". Must be a valid package/directory name.`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const targetDirectory = resolve(cwd, trimmed);
|
|
30
|
+
if (existsSync(targetDirectory)) {
|
|
31
|
+
try {
|
|
32
|
+
const files = readdirSync(targetDirectory);
|
|
33
|
+
if (files.length > 0) {
|
|
34
|
+
return {
|
|
35
|
+
valid: false,
|
|
36
|
+
error: `Target directory already exists and is non-empty: ${targetDirectory}`,
|
|
37
|
+
targetDirectory,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return {
|
|
43
|
+
valid: false,
|
|
44
|
+
error: `Target directory cannot be read: ${targetDirectory}`,
|
|
45
|
+
targetDirectory,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
valid: true,
|
|
51
|
+
targetDirectory,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/project/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQhD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE;IAC3E,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,iEAAiE;IACjE,IACE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,UAAU,CAAC,OAAO,CAAC,EACnB,CAAC;QACD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,yBAAyB,OAAO,uDAAuD;SAC/F,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,MAAM,cAAc,GAAG,6DAA6D,CAAC;IACrF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,yBAAyB,OAAO,4CAA4C;SACpF,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE9C,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,qDAAqD,eAAe,EAAE;oBAC7E,eAAe;iBAChB,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,oCAAoC,eAAe,EAAE;gBAC5D,eAAe;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ProjectCreationOptions } from "./options.js";
|
|
2
|
+
export interface WizardOptions {
|
|
3
|
+
name: string;
|
|
4
|
+
directory: string;
|
|
5
|
+
defaults?: Partial<ProjectCreationOptions>;
|
|
6
|
+
interactive?: boolean;
|
|
7
|
+
input?: NodeJS.ReadableStream;
|
|
8
|
+
output?: NodeJS.WritableStream;
|
|
9
|
+
}
|
|
10
|
+
export declare class CancelledError extends Error {
|
|
11
|
+
constructor();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Runs the interactive project creation wizard to resolve ProjectCreationOptions.
|
|
15
|
+
*/
|
|
16
|
+
export declare function runWizard(options: WizardOptions): Promise<ProjectCreationOptions>;
|
|
17
|
+
//# sourceMappingURL=wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/project/wizard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,sBAAsB,EAAmB,MAAM,cAAc,CAAC;AAE5F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAChC;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,cAGC;CACF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAiEvF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
3
|
+
export class CancelledError extends Error {
|
|
4
|
+
constructor() {
|
|
5
|
+
super("Project creation cancelled by user.");
|
|
6
|
+
this.name = "CancelledError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Runs the interactive project creation wizard to resolve ProjectCreationOptions.
|
|
11
|
+
*/
|
|
12
|
+
export async function runWizard(options) {
|
|
13
|
+
const isInteractive = options.interactive ?? Boolean(process.stdout.isTTY && !process.env.CI);
|
|
14
|
+
// If non-interactive, return options immediately using defaults
|
|
15
|
+
if (!isInteractive) {
|
|
16
|
+
return {
|
|
17
|
+
name: options.name,
|
|
18
|
+
directory: options.directory,
|
|
19
|
+
language: options.defaults?.language ?? "typescript",
|
|
20
|
+
packageManager: options.defaults?.packageManager ?? "pnpm",
|
|
21
|
+
initializeGit: options.defaults?.initializeGit ?? true,
|
|
22
|
+
skipInstall: options.defaults?.skipInstall ?? false,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const rl = createInterface({
|
|
26
|
+
input: options.input ?? input,
|
|
27
|
+
output: options.output ?? output,
|
|
28
|
+
});
|
|
29
|
+
let cancelled = false;
|
|
30
|
+
rl.on("SIGINT", () => {
|
|
31
|
+
cancelled = true;
|
|
32
|
+
rl.close();
|
|
33
|
+
});
|
|
34
|
+
try {
|
|
35
|
+
// Question 1: Language
|
|
36
|
+
const langAnswer = await rl.question("\nWhich language would you like to use?\n 1) TypeScript (default)\n 2) JavaScript\nSelect [1-2]: ");
|
|
37
|
+
if (cancelled)
|
|
38
|
+
throw new CancelledError();
|
|
39
|
+
const language = langAnswer.trim() === "2" ? "javascript" : "typescript";
|
|
40
|
+
// Question 2: Package Manager
|
|
41
|
+
const pmAnswer = await rl.question("\nWhich package manager would you like to use?\n 1) pnpm (default)\n 2) npm\n 3) yarn\nSelect [1-3]: ");
|
|
42
|
+
if (cancelled)
|
|
43
|
+
throw new CancelledError();
|
|
44
|
+
let packageManager = "pnpm";
|
|
45
|
+
if (pmAnswer.trim() === "2")
|
|
46
|
+
packageManager = "npm";
|
|
47
|
+
if (pmAnswer.trim() === "3")
|
|
48
|
+
packageManager = "yarn";
|
|
49
|
+
// Question 3: Git
|
|
50
|
+
const gitAnswer = await rl.question("\nInitialize a Git repository? [Y/n]: ");
|
|
51
|
+
if (cancelled)
|
|
52
|
+
throw new CancelledError();
|
|
53
|
+
const initializeGit = !gitAnswer.trim().toLowerCase().startsWith("n");
|
|
54
|
+
rl.close();
|
|
55
|
+
return {
|
|
56
|
+
name: options.name,
|
|
57
|
+
directory: options.directory,
|
|
58
|
+
language,
|
|
59
|
+
packageManager,
|
|
60
|
+
initializeGit,
|
|
61
|
+
skipInstall: options.defaults?.skipInstall ?? false,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
rl.close();
|
|
66
|
+
if (cancelled || (err instanceof Error && err.name === "AbortError")) {
|
|
67
|
+
throw new CancelledError();
|
|
68
|
+
}
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/project/wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-runner.d.ts","sourceRoot":"","sources":["../../src/runner/app-runner.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { loadApplicationContext } from "@kyuujs/core";
|
|
2
|
+
async function run() {
|
|
3
|
+
const projectRoot = process.env.KYUU_PROJECT_ROOT ?? process.env.KYUU_PROJECT_ROOT ?? process.cwd();
|
|
4
|
+
try {
|
|
5
|
+
const context = await loadApplicationContext({ projectRoot });
|
|
6
|
+
const server = context.app.listen();
|
|
7
|
+
if (!server.listening) {
|
|
8
|
+
await new Promise((res, rej) => {
|
|
9
|
+
server.once("listening", res);
|
|
10
|
+
server.once("error", rej);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
const address = server.address();
|
|
14
|
+
let port = context.config.server.port;
|
|
15
|
+
let host = context.config.server.host;
|
|
16
|
+
if (address && typeof address === "object") {
|
|
17
|
+
port = address.port;
|
|
18
|
+
host = address.address;
|
|
19
|
+
}
|
|
20
|
+
const url = `http://${host === "0.0.0.0" || host === "127.0.0.1" ? "localhost" : host}:${port}`;
|
|
21
|
+
if (process.send) {
|
|
22
|
+
process.send({ type: "started", port, host, url });
|
|
23
|
+
}
|
|
24
|
+
const cleanup = async () => {
|
|
25
|
+
try {
|
|
26
|
+
await context.app.close();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Ignore shutdown errors
|
|
30
|
+
}
|
|
31
|
+
process.exit(0);
|
|
32
|
+
};
|
|
33
|
+
process.on("SIGINT", cleanup);
|
|
34
|
+
process.on("SIGTERM", cleanup);
|
|
35
|
+
process.on("message", (msg) => {
|
|
36
|
+
if (msg === "shutdown") {
|
|
37
|
+
cleanup();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
43
|
+
if (process.send) {
|
|
44
|
+
process.send({
|
|
45
|
+
type: "error",
|
|
46
|
+
error: errorMsg,
|
|
47
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
run();
|
|
54
|
+
//# sourceMappingURL=app-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-runner.js","sourceRoot":"","sources":["../../src/runner/app-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,KAAK,UAAU,GAAG;IAChB,MAAM,WAAW,GACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAElF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAEpC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACnC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACtC,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACtC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YACpB,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QACzB,CAAC;QAED,MAAM,GAAG,GAAG,UAAU,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QAEhG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBACvB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACpD,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface DevServerOptions {
|
|
2
|
+
projectRoot: string;
|
|
3
|
+
watch?: boolean;
|
|
4
|
+
stdout?: (msg: string) => void;
|
|
5
|
+
stderr?: (msg: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export interface DevServerController {
|
|
8
|
+
url?: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
host?: string;
|
|
11
|
+
stop: () => Promise<void>;
|
|
12
|
+
restart: () => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare function startDevServer(options: DevServerOptions): Promise<DevServerController>;
|
|
15
|
+
//# sourceMappingURL=dev-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-runner.d.ts","sourceRoot":"","sources":["../../src/runner/dev-runner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAwBD,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqN5F"}
|