@sculptor/cli 0.1.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/cli.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { type ScaffoldProjectMetadata } from "./scaffold.js";
3
+ type PromptFn = (question: string, defaultValue?: string) => Promise<string>;
4
+ export interface CliOptions {
5
+ cwd?: string;
6
+ prompt?: PromptFn;
7
+ spawn?: typeof spawnSync;
8
+ log?: (...args: unknown[]) => void;
9
+ error?: (...args: unknown[]) => void;
10
+ }
11
+ declare const resolveProjectMetadata: (args: string[], cwd: string, prompt?: PromptFn) => Promise<ScaffoldProjectMetadata>;
12
+ export declare const runCli: (argv?: string[], options?: CliOptions) => Promise<void>;
13
+ export { resolveProjectMetadata };
package/dist/cli.js ADDED
@@ -0,0 +1,295 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { createInterface } from "node:readline/promises";
5
+ import { stdin, stdout } from "node:process";
6
+ import { fileURLToPath } from "node:url";
7
+ import { loadConfig } from "@sculptor/config";
8
+ import { controllerHelp, generateHelp, generateResourceFiles, parseGenerateMode, readModeFromFlags, scaffoldProject, writeGeneratedFiles } from "./scaffold.js";
9
+ const isCommand = (value) => ["new", "start", "dev", "build", "lint", "test", "generate", "g", "help"].includes(value);
10
+ const isFlag = (value) => value.startsWith("-");
11
+ const getFlagValue = (args, names) => {
12
+ for (const name of names) {
13
+ const prefixed = `${name}=`;
14
+ const match = args.find((arg) => arg.startsWith(prefixed));
15
+ if (match) {
16
+ return match.slice(prefixed.length);
17
+ }
18
+ }
19
+ return undefined;
20
+ };
21
+ const getFlagPresence = (args, names) => names.some((name) => args.includes(name) || args.some((arg) => arg.startsWith(`${name}=`)));
22
+ const getPrompt = (prompt) => {
23
+ if (prompt) {
24
+ return prompt;
25
+ }
26
+ return async (question, defaultValue) => {
27
+ const rl = createInterface({ input: stdin, output: stdout });
28
+ try {
29
+ const suffix = defaultValue ? ` [${defaultValue}]` : "";
30
+ const answer = await rl.question(`${question}${suffix}: `);
31
+ const trimmed = answer.trim();
32
+ return trimmed || defaultValue || "";
33
+ }
34
+ finally {
35
+ rl.close();
36
+ }
37
+ };
38
+ };
39
+ const resolveAppRoot = (cwd) => {
40
+ const candidate = path.join(cwd, "app");
41
+ return fs.existsSync(path.join(candidate, "sculptor.json")) ? candidate : cwd;
42
+ };
43
+ const resolveDefaultMode = (cwd) => {
44
+ const config = loadConfig(resolveAppRoot(cwd));
45
+ const style = config.framework.routing?.style;
46
+ return style === "decorator" || style === "functional" || style === "hybrid"
47
+ ? style
48
+ : "hybrid";
49
+ };
50
+ const resolveDefaultDevServer = (cwd) => {
51
+ const config = loadConfig(resolveAppRoot(cwd));
52
+ const devServer = config.framework.project?.devServer;
53
+ return devServer === "nodemon" ? "nodemon" : "tsnode";
54
+ };
55
+ const resolveFrameworkLock = (mode, provided) => {
56
+ if (provided !== undefined) {
57
+ return provided;
58
+ }
59
+ return mode !== "hybrid";
60
+ };
61
+ const parseBooleanInput = (value, fallback) => {
62
+ const normalized = value.trim().toLowerCase();
63
+ if (!normalized) {
64
+ return fallback;
65
+ }
66
+ if (["false", "no", "0"].includes(normalized)) {
67
+ return false;
68
+ }
69
+ if (["true", "yes", "1"].includes(normalized)) {
70
+ return true;
71
+ }
72
+ return fallback;
73
+ };
74
+ const printMainHelp = (log) => {
75
+ log(`# SculptorTS CLI
76
+
77
+ ## Usage
78
+
79
+ \`\`\`bash
80
+ sc <command> [options]
81
+ \`\`\`
82
+
83
+ ## Commands
84
+
85
+ - \`sc new <app>\`
86
+ - \`sc start [--port=3000] [--watch]\`
87
+ - \`sc dev [--port=3000]\`
88
+ - \`sc build\`
89
+ - \`sc lint\`
90
+ - \`sc test\`
91
+ - \`sc generate\` or \`sc g\`
92
+ - \`sc help\`
93
+ - \`sc help generate\`
94
+ - \`sc help controller\`
95
+
96
+ ## Generators
97
+
98
+ - \`controller\` / \`c\`
99
+ - \`service\` / \`s\`
100
+ - \`module\` / \`m\`
101
+ - \`resource\` / \`r\`
102
+ `);
103
+ };
104
+ const printHelp = (topic, log) => {
105
+ if (!topic) {
106
+ printMainHelp(log);
107
+ return;
108
+ }
109
+ if (topic === "generate") {
110
+ log(generateHelp);
111
+ return;
112
+ }
113
+ if (topic === "controller") {
114
+ log(controllerHelp);
115
+ return;
116
+ }
117
+ printMainHelp(log);
118
+ };
119
+ const resolveProjectMetadata = async (args, cwd, prompt) => {
120
+ const ask = getPrompt(prompt);
121
+ const positional = args.filter((arg) => !isFlag(arg));
122
+ const defaultMode = resolveDefaultMode(cwd);
123
+ const explicitMode = args.includes("--decorator") ||
124
+ args.includes("--functional") ||
125
+ args.includes("--hybrid") ||
126
+ getFlagValue(args, ["--style"]) !== undefined;
127
+ const appName = getFlagValue(args, ["--name"]) ?? positional[0] ?? (await ask("App name"));
128
+ const version = getFlagValue(args, ["--version"]) ?? (await ask("Version", "0.1.0"));
129
+ const modeInput = getFlagValue(args, ["--style"]) ??
130
+ (explicitMode
131
+ ? readModeFromFlags(args, defaultMode)
132
+ : (await ask("Dev style", defaultMode)));
133
+ const mode = parseGenerateMode(modeInput, defaultMode) ?? defaultMode;
134
+ const explicitFrameworkLock = getFlagValue(args, ["--frameworkLock", "--framework-lock"]);
135
+ const frameworkLock = explicitFrameworkLock !== undefined
136
+ ? explicitFrameworkLock !== "false"
137
+ : parseBooleanInput(await ask("Framework lock", String(resolveFrameworkLock(mode))), resolveFrameworkLock(mode));
138
+ const devServerFlag = getFlagValue(args, ["--dev-server", "--devserver"]);
139
+ const devServer = devServerFlag === "nodemon" || devServerFlag === "tsnode"
140
+ ? devServerFlag
141
+ : (await ask("Dev server", resolveDefaultDevServer(cwd)));
142
+ return {
143
+ appName,
144
+ version,
145
+ mode,
146
+ frameworkLock,
147
+ devServer
148
+ };
149
+ };
150
+ const runSpawn = (command, args, cwd, spawn, log) => {
151
+ log(`> ${command} ${args.join(" ")}`);
152
+ const result = spawn(command, args, {
153
+ cwd,
154
+ stdio: "inherit",
155
+ shell: process.platform === "win32"
156
+ });
157
+ if (result.status && result.status !== 0) {
158
+ process.exit(result.status);
159
+ }
160
+ };
161
+ const handleNew = async (args, cwd, prompt, log) => {
162
+ const metadata = await resolveProjectMetadata(args, cwd, prompt);
163
+ const targetDir = path.join(cwd, metadata.appName);
164
+ scaffoldProject(metadata, targetDir);
165
+ log(`Created SculptorTS project at ${targetDir}`);
166
+ };
167
+ const handleDev = (args, cwd, spawn, log) => {
168
+ const appRoot = resolveAppRoot(cwd);
169
+ const devServer = resolveDefaultDevServer(cwd);
170
+ const port = getFlagValue(args, ["--port"]);
171
+ if (port) {
172
+ process.env.PORT = port;
173
+ }
174
+ if (devServer === "nodemon") {
175
+ runSpawn("npx", [
176
+ "nodemon",
177
+ "--watch",
178
+ path.join(appRoot, "src"),
179
+ "--ext",
180
+ "ts",
181
+ "--exec",
182
+ "ts-node --esm src/main.ts"
183
+ ], appRoot, spawn, log);
184
+ return;
185
+ }
186
+ runSpawn("npx", ["ts-node", "--esm", path.join(appRoot, "src/main.ts")], appRoot, spawn, log);
187
+ };
188
+ const handleStart = (args, cwd, spawn, log) => {
189
+ const appRoot = resolveAppRoot(cwd);
190
+ const port = getFlagValue(args, ["--port"]);
191
+ const watch = getFlagPresence(args, ["--watch"]);
192
+ const distEntry = path.join(appRoot, "dist", "main.js");
193
+ const srcEntry = path.join(appRoot, "src", "main.ts");
194
+ if (port) {
195
+ process.env.PORT = port;
196
+ }
197
+ if (!watch && fs.existsSync(distEntry)) {
198
+ runSpawn("node", [distEntry], cwd, spawn, log);
199
+ return;
200
+ }
201
+ if (watch) {
202
+ handleDev(args, cwd, spawn, log);
203
+ return;
204
+ }
205
+ runSpawn("npx", ["tsx", srcEntry], cwd, spawn, log);
206
+ };
207
+ const handleBuild = (cwd, spawn, log) => {
208
+ const appTsconfig = path.join(resolveAppRoot(cwd), "tsconfig.json");
209
+ runSpawn("npx", ["tsc", "-p", appTsconfig], cwd, spawn, log);
210
+ };
211
+ const handleLint = (cwd, spawn, log) => {
212
+ const targets = fs.existsSync(path.join(cwd, "packages")) ? ["app", "packages"] : ["app"];
213
+ runSpawn("npx", ["eslint", ...targets, "--ext", ".ts"], cwd, spawn, log);
214
+ };
215
+ const handleTest = (cwd, spawn, log) => {
216
+ runSpawn("npx", ["vitest", "run"], cwd, spawn, log);
217
+ };
218
+ const handleGenerate = (args, cwd, prompt, log, error) => {
219
+ const [kindInput, name, ...rest] = args;
220
+ if (!kindInput || !name) {
221
+ error("Usage: sc generate <controller|service|module|resource> <name>");
222
+ process.exit(1);
223
+ }
224
+ const kindMap = {
225
+ c: "controller",
226
+ controller: "controller",
227
+ s: "service",
228
+ service: "service",
229
+ m: "module",
230
+ module: "module",
231
+ r: "resource",
232
+ resource: "resource"
233
+ };
234
+ const kind = kindMap[kindInput];
235
+ if (!kind) {
236
+ error(`Unknown generator "${kindInput}".`);
237
+ process.exit(1);
238
+ }
239
+ const fallbackMode = resolveDefaultMode(cwd);
240
+ const devServer = resolveDefaultDevServer(cwd);
241
+ const mode = parseGenerateMode(readModeFromFlags(rest, fallbackMode), fallbackMode);
242
+ const files = generateResourceFiles(kind, name, mode, devServer);
243
+ const targetDir = resolveAppRoot(cwd);
244
+ writeGeneratedFiles(targetDir, files);
245
+ log(`Generated ${kind} "${name}" using ${mode} mode.`);
246
+ return Promise.resolve();
247
+ };
248
+ export const runCli = async (argv = process.argv, options = {}) => {
249
+ const cwd = options.cwd ?? process.cwd();
250
+ const prompt = getPrompt(options.prompt);
251
+ const log = options.log ?? console.log;
252
+ const error = options.error ?? console.error;
253
+ const spawn = options.spawn ?? spawnSync;
254
+ const [, , rawCommand, ...args] = argv;
255
+ if (!rawCommand || rawCommand === "-h" || rawCommand === "--help") {
256
+ printMainHelp(log);
257
+ return;
258
+ }
259
+ if (!isCommand(rawCommand)) {
260
+ printMainHelp(log);
261
+ return;
262
+ }
263
+ switch (rawCommand) {
264
+ case "help":
265
+ printHelp(args[0], log);
266
+ return;
267
+ case "new":
268
+ await handleNew(args, cwd, prompt, log);
269
+ return;
270
+ case "start":
271
+ handleStart(args, cwd, spawn, log);
272
+ return;
273
+ case "dev":
274
+ handleDev(args, cwd, spawn, log);
275
+ return;
276
+ case "build":
277
+ handleBuild(cwd, spawn, log);
278
+ return;
279
+ case "lint":
280
+ handleLint(cwd, spawn, log);
281
+ return;
282
+ case "test":
283
+ handleTest(cwd, spawn, log);
284
+ return;
285
+ case "generate":
286
+ case "g":
287
+ await handleGenerate(args, cwd, prompt, log, error);
288
+ return;
289
+ }
290
+ };
291
+ if (fileURLToPath(import.meta.url) === process.argv[1]) {
292
+ void runCli();
293
+ }
294
+ export { resolveProjectMetadata };
295
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/fs.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const ensureDir: (dirPath: string) => void;
2
+ export declare const writeTextFile: (filePath: string, content: string) => void;
package/dist/fs.js ADDED
@@ -0,0 +1,10 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export const ensureDir = (dirPath) => {
4
+ fs.mkdirSync(dirPath, { recursive: true });
5
+ };
6
+ export const writeTextFile = (filePath, content) => {
7
+ ensureDir(path.dirname(filePath));
8
+ fs.writeFileSync(filePath, content, "utf8");
9
+ };
10
+ //# sourceMappingURL=fs.js.map
package/dist/fs.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAQ,EAAE;IACjD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,OAAe,EAAQ,EAAE;IACvE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { resolveProjectMetadata, runCli } from "./cli.js";
2
+ export { controllerHelp, generateHelp } from "./scaffold.js";
3
+ export { generateResourceFiles, parseGenerateMode, readModeFromFlags, scaffoldProject, writeGeneratedFiles } from "./scaffold.js";
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { resolveProjectMetadata, runCli } from "./cli.js";
2
+ export { controllerHelp, generateHelp } from "./scaffold.js";
3
+ export { generateResourceFiles, parseGenerateMode, readModeFromFlags, scaffoldProject, writeGeneratedFiles } from "./scaffold.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,MAAM,EACP,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACpB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type ScaffoldMode = "decorator" | "functional" | "hybrid";
2
+ export type DevServer = "tsnode" | "nodemon";
3
+ export interface ScaffoldProjectMetadata {
4
+ appName: string;
5
+ version: string;
6
+ mode: ScaffoldMode;
7
+ frameworkLock: boolean;
8
+ devServer: DevServer;
9
+ }
10
+ export declare const scaffoldProject: (metadata: ScaffoldProjectMetadata, targetDir: string) => void;
11
+ export declare const generateResourceFiles: (kind: "controller" | "service" | "module" | "resource", name: string, mode: ScaffoldMode, devServer?: DevServer) => Record<string, string>;
12
+ export declare const writeGeneratedFiles: (targetDir: string, files: Record<string, string>) => void;
13
+ export declare const readModeFromFlags: (flags: string[], fallback: ScaffoldMode) => ScaffoldMode;
14
+ export declare const parseGenerateMode: (mode: string | undefined, fallback: ScaffoldMode) => ScaffoldMode;
15
+ export declare const controllerHelp = "# Controller Generator\n\n## Usage\n\n```bash\nsc generate controller user\nsc g c user\n```\n\n## Mode Overrides\n\n- `--decorator` generates `controllers/*.controller.ts`\n- `--functional` generates `routes/*.routes.ts` and `handlers/*.handler.ts`\n";
16
+ export declare const generateHelp = "# Generate\n\n## Usage\n\n```bash\nsc generate controller user\nsc generate service user\nsc generate module user\nsc generate resource user\n```\n\n## Aliases\n\n- `sc g`\n- `controller` -> `c`\n- `service` -> `s`\n- `module` -> `m`\n- `resource` -> `r`\n";
@@ -0,0 +1,414 @@
1
+ import path from "node:path";
2
+ import { ensureDir, writeTextFile } from "./fs.js";
3
+ const toPascalCase = (value) => value
4
+ .split(/[^a-zA-Z0-9]+/)
5
+ .filter(Boolean)
6
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
7
+ .join("");
8
+ const toCamelCase = (value) => {
9
+ const pascal = toPascalCase(value);
10
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
11
+ };
12
+ const toKebabCase = (value) => value
13
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
14
+ .replace(/[^a-zA-Z0-9]+/g, "-")
15
+ .replace(/^-+|-+$/g, "")
16
+ .toLowerCase();
17
+ const devScriptFor = (devServer) => devServer === "tsnode"
18
+ ? "ts-node --esm src/main.ts"
19
+ : 'nodemon --watch src --ext ts --exec "ts-node --esm src/main.ts"';
20
+ const devDependenciesFor = (devServer) => devServer === "tsnode"
21
+ ? ` "ts-node": "^10.9.2",\n`
22
+ : ` "nodemon": "^3.1.9",\n "ts-node": "^10.9.2",\n`;
23
+ const rootPackageJsonTemplate = (appName, version) => `{
24
+ "name": "${toKebabCase(appName)}-workspace",
25
+ "version": "${version}",
26
+ "private": true,
27
+ "type": "module",
28
+ "workspaces": [
29
+ "app"
30
+ ],
31
+ "scripts": {
32
+ "start": "npm -w app run start",
33
+ "dev": "npm -w app run dev",
34
+ "build": "npm -ws run build",
35
+ "lint": "eslint . --ext .ts",
36
+ "test": "vitest run"
37
+ }
38
+ }`;
39
+ const appPackageJsonTemplate = (appName, version, devServer) => `{
40
+ "name": "${toKebabCase(appName)}",
41
+ "version": "${version}",
42
+ "private": true,
43
+ "type": "module",
44
+ "scripts": {
45
+ "start": "tsx src/main.ts",
46
+ "dev": "${devScriptFor(devServer)}",
47
+ "build": "tsc -p tsconfig.json",
48
+ "lint": "eslint . --ext .ts",
49
+ "test": "vitest run"
50
+ },
51
+ "dependencies": {
52
+ "@sculptor/core": "^0.1.0",
53
+ "express": "^4.21.2",
54
+ "reflect-metadata": "^0.2.2"
55
+ },
56
+ "devDependencies": {
57
+ "@types/express": "^4.17.23",
58
+ "@types/node": "^22.15.3",
59
+ "@types/supertest": "^6.0.3",
60
+ "@typescript-eslint/eslint-plugin": "^8.30.1",
61
+ "@typescript-eslint/parser": "^8.30.1",
62
+ "eslint": "^9.20.0",
63
+ ${devDependenciesFor(devServer)}
64
+ "typescript": "^5.8.3",
65
+ "vitest": "^2.1.8",
66
+ "supertest": "^7.1.0"
67
+ }
68
+ }`;
69
+ const rootTsconfigTemplate = `{
70
+ "files": [],
71
+ "references": [
72
+ { "path": "./app" }
73
+ ]
74
+ }`;
75
+ const eslintConfigTemplate = `import parser from "@typescript-eslint/parser";
76
+ import tsPlugin from "@typescript-eslint/eslint-plugin";
77
+
78
+ export default [
79
+ {
80
+ files: ["**/*.ts"],
81
+ languageOptions: {
82
+ parser,
83
+ parserOptions: {
84
+ ecmaVersion: "latest",
85
+ sourceType: "module"
86
+ }
87
+ },
88
+ plugins: {
89
+ "@typescript-eslint": tsPlugin
90
+ },
91
+ rules: {
92
+ "no-unused-vars": "off",
93
+ "@typescript-eslint/no-unused-vars": [
94
+ "error",
95
+ { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }
96
+ ],
97
+ "@typescript-eslint/no-explicit-any": "off"
98
+ }
99
+ },
100
+ {
101
+ ignores: ["dist/**", "node_modules/**"]
102
+ }
103
+ ];
104
+ `;
105
+ const vitestConfigTemplate = `import { defineConfig } from "vitest/config";
106
+
107
+ export default defineConfig({
108
+ test: {
109
+ environment: "node",
110
+ globals: true
111
+ }
112
+ });
113
+ `;
114
+ const appTsconfigTemplate = `{
115
+ "compilerOptions": {
116
+ "target": "ES2020",
117
+ "module": "NodeNext",
118
+ "moduleResolution": "NodeNext",
119
+ "lib": ["ES2020"],
120
+ "strict": true,
121
+ "esModuleInterop": true,
122
+ "allowSyntheticDefaultImports": true,
123
+ "experimentalDecorators": true,
124
+ "emitDecoratorMetadata": true,
125
+ "useDefineForClassFields": false,
126
+ "skipLibCheck": true,
127
+ "types": ["node"]
128
+ },
129
+ "include": ["src/**/*.ts"],
130
+ "exclude": ["dist", "node_modules"]
131
+ }`;
132
+ const sculptorTemplate = (mode, devServer, frameworkLock) => `{
133
+ "project": {
134
+ "srcRoot": "src",
135
+ "entryFile": "main.ts",
136
+ "devServer": "${devServer}"
137
+ },
138
+ "routing": {
139
+ "style": "${mode}"
140
+ },
141
+ "frameworkLock": ${frameworkLock ? "true" : "false"}
142
+ }`;
143
+ const propsTemplate = `{
144
+ "app": {
145
+ "port": 3000,
146
+ "prefix": "/api"
147
+ }
148
+ }`;
149
+ const mainTemplate = `import { startApp } from "@sculptor/core";
150
+ import { fileURLToPath } from "node:url";
151
+ import { registry } from "./registry.js";
152
+
153
+ const appRoot = fileURLToPath(new URL("..", import.meta.url));
154
+
155
+ void startApp({ registry, rootDir: appRoot });
156
+ `;
157
+ const registryTemplate = (mode) => {
158
+ if (mode === "decorator") {
159
+ return `import { HealthController } from "./app/controllers/health.controller.js";
160
+
161
+ export const registry = {
162
+ controllers: [HealthController],
163
+ routes: [],
164
+ services: []
165
+ };
166
+ `;
167
+ }
168
+ if (mode === "functional") {
169
+ return `import { healthRoutes } from "./app/routes/health.routes.js";
170
+
171
+ export const registry = {
172
+ controllers: [],
173
+ routes: [healthRoutes],
174
+ services: []
175
+ };
176
+ `;
177
+ }
178
+ return `import { HealthController } from "./app/controllers/health.controller.js";
179
+ import { healthRoutes } from "./app/routes/health.routes.js";
180
+
181
+ export const registry = {
182
+ controllers: [HealthController],
183
+ routes: [healthRoutes],
184
+ services: []
185
+ };
186
+ `;
187
+ };
188
+ const healthControllerTemplate = `import { Controller, Get } from "@sculptor/core";
189
+
190
+ @Controller("/health")
191
+ export class HealthController {
192
+ @Get("/")
193
+ health() {
194
+ return { status: "ok" };
195
+ }
196
+
197
+ @Get("/ping")
198
+ ping() {
199
+ return { message: "pong" };
200
+ }
201
+ }
202
+ `;
203
+ const healthRoutesTemplate = `import { Router } from "express";
204
+
205
+ export const healthRoutes = Router();
206
+
207
+ healthRoutes.get("/health", (_req, res) => {
208
+ res.json({ status: "ok" });
209
+ });
210
+
211
+ healthRoutes.get("/ping", (_req, res) => {
212
+ res.json({ message: "pong" });
213
+ });
214
+ `;
215
+ const healthServiceTemplate = `export class HealthService {
216
+ status() {
217
+ return { status: "ok" };
218
+ }
219
+ }
220
+ `;
221
+ const healthModuleTemplate = `export class HealthModule {}
222
+ `;
223
+ const healthHandlerTemplate = `export const healthHandler = (_req: unknown, res: { json: (value: unknown) => void }) => {
224
+ res.json({ status: "ok" });
225
+ };
226
+ `;
227
+ const createDecoratorResource = (name) => {
228
+ const className = `${toPascalCase(name)}Controller`;
229
+ const serviceName = `${toPascalCase(name)}Service`;
230
+ const moduleName = `${toPascalCase(name)}Module`;
231
+ return {
232
+ [`src/app/controllers/${name}.controller.ts`]: `import { Controller, Get } from "@sculptor/core";
233
+
234
+ @Controller("/${name}")
235
+ export class ${className} {
236
+ @Get("/")
237
+ findAll() {
238
+ return { resource: "${name}" };
239
+ }
240
+ }
241
+ `,
242
+ [`src/app/services/${name}.service.ts`]: `export class ${serviceName} {}
243
+ `,
244
+ [`src/app/modules/${name}.module.ts`]: `export class ${moduleName} {}
245
+ `
246
+ };
247
+ };
248
+ const createFunctionalResource = (name) => {
249
+ const handlerName = `${toPascalCase(name)}Handler`;
250
+ const routesName = `${toCamelCase(name)}Routes`;
251
+ return {
252
+ [`src/app/routes/${name}.routes.ts`]: `import { Router } from "express";
253
+
254
+ export const ${routesName} = Router();
255
+
256
+ ${routesName}.get("/${name}", (_req, res) => {
257
+ res.json({ resource: "${name}" });
258
+ });
259
+ `,
260
+ [`src/app/handlers/${name}.handler.ts`]: `export const ${handlerName} = (_req: unknown, res: { json: (value: unknown) => void }) => {
261
+ res.json({ resource: "${name}" });
262
+ };
263
+ `,
264
+ [`src/app/services/${name}.service.ts`]: `export class ${toPascalCase(name)}Service {}
265
+ `,
266
+ [`src/app/modules/${name}.module.ts`]: `export class ${toPascalCase(name)}Module {}
267
+ `
268
+ };
269
+ };
270
+ const createServiceResource = (name) => ({
271
+ [`src/app/services/${name}.service.ts`]: `export class ${toPascalCase(name)}Service {}
272
+ `
273
+ });
274
+ const createModuleResource = (name) => ({
275
+ [`src/app/modules/${name}.module.ts`]: `export class ${toPascalCase(name)}Module {}
276
+ `
277
+ });
278
+ const appShellFiles = (metadata) => ({
279
+ "app/package.json": appPackageJsonTemplate(metadata.appName, metadata.version, metadata.devServer),
280
+ "app/tsconfig.json": appTsconfigTemplate,
281
+ "app/sculptor.json": sculptorTemplate(metadata.mode, metadata.devServer, metadata.frameworkLock),
282
+ "app/props.json": propsTemplate,
283
+ "app/src/main.ts": mainTemplate,
284
+ "app/src/registry.ts": registryTemplate(metadata.mode)
285
+ });
286
+ const resourceShellFiles = (name, mode, devServer) => ({
287
+ "app/package.json": appPackageJsonTemplate(name, "0.1.0", devServer),
288
+ "app/tsconfig.json": appTsconfigTemplate,
289
+ "app/sculptor.json": sculptorTemplate(mode, devServer, mode !== "hybrid"),
290
+ "app/props.json": propsTemplate,
291
+ "app/src/main.ts": mainTemplate,
292
+ "app/src/registry.ts": registryTemplate(mode)
293
+ });
294
+ export const scaffoldProject = (metadata, targetDir) => {
295
+ ensureDir(targetDir);
296
+ const rootFiles = {
297
+ "package.json": rootPackageJsonTemplate(metadata.appName, metadata.version),
298
+ "tsconfig.json": rootTsconfigTemplate,
299
+ "eslint.config.js": eslintConfigTemplate,
300
+ "vitest.config.ts": vitestConfigTemplate
301
+ };
302
+ const appFiles = {
303
+ ...appShellFiles(metadata),
304
+ "app/src/app/services/health.service.ts": healthServiceTemplate,
305
+ "app/src/app/modules/health.module.ts": healthModuleTemplate
306
+ };
307
+ if (metadata.mode === "decorator" || metadata.mode === "hybrid") {
308
+ appFiles["app/src/app/controllers/health.controller.ts"] =
309
+ healthControllerTemplate;
310
+ }
311
+ if (metadata.mode === "functional" || metadata.mode === "hybrid") {
312
+ appFiles["app/src/app/routes/health.routes.ts"] = healthRoutesTemplate;
313
+ appFiles["app/src/app/handlers/health.handler.ts"] = healthHandlerTemplate;
314
+ }
315
+ for (const [relativePath, content] of Object.entries(rootFiles)) {
316
+ writeTextFile(path.join(targetDir, relativePath), content);
317
+ }
318
+ for (const [relativePath, content] of Object.entries(appFiles)) {
319
+ writeTextFile(path.join(targetDir, relativePath), content);
320
+ }
321
+ for (const dir of [
322
+ "app/src/app/controllers",
323
+ "app/src/app/routes",
324
+ "app/src/app/services",
325
+ "app/src/app/modules",
326
+ "app/src/app/middlewares",
327
+ "app/src/app/handlers"
328
+ ]) {
329
+ ensureDir(path.join(targetDir, dir));
330
+ }
331
+ };
332
+ export const generateResourceFiles = (kind, name, mode, devServer = "tsnode") => {
333
+ switch (kind) {
334
+ case "controller":
335
+ return mode === "functional"
336
+ ? {
337
+ [`src/app/routes/${name}.routes.ts`]: createFunctionalResource(name)[`src/app/routes/${name}.routes.ts`],
338
+ [`src/app/handlers/${name}.handler.ts`]: createFunctionalResource(name)[`src/app/handlers/${name}.handler.ts`]
339
+ }
340
+ : createDecoratorResource(name);
341
+ case "service":
342
+ return createServiceResource(name);
343
+ case "module":
344
+ return createModuleResource(name);
345
+ case "resource":
346
+ return mode === "functional"
347
+ ? {
348
+ ...resourceShellFiles(name, mode, devServer),
349
+ ...createFunctionalResource(name)
350
+ }
351
+ : mode === "hybrid"
352
+ ? {
353
+ ...resourceShellFiles(name, mode, devServer),
354
+ ...createDecoratorResource(name),
355
+ ...createFunctionalResource(name)
356
+ }
357
+ : {
358
+ ...resourceShellFiles(name, mode, devServer),
359
+ ...createDecoratorResource(name)
360
+ };
361
+ }
362
+ };
363
+ export const writeGeneratedFiles = (targetDir, files) => {
364
+ for (const [relativePath, content] of Object.entries(files)) {
365
+ writeTextFile(path.join(targetDir, relativePath), content);
366
+ }
367
+ };
368
+ export const readModeFromFlags = (flags, fallback) => {
369
+ if (flags.includes("--functional")) {
370
+ return "functional";
371
+ }
372
+ if (flags.includes("--decorator")) {
373
+ return "decorator";
374
+ }
375
+ if (flags.includes("--hybrid")) {
376
+ return "hybrid";
377
+ }
378
+ return fallback;
379
+ };
380
+ export const parseGenerateMode = (mode, fallback) => mode === "functional" || mode === "decorator" || mode === "hybrid" ? mode : fallback;
381
+ export const controllerHelp = `# Controller Generator
382
+
383
+ ## Usage
384
+
385
+ \`\`\`bash
386
+ sc generate controller user
387
+ sc g c user
388
+ \`\`\`
389
+
390
+ ## Mode Overrides
391
+
392
+ - \`--decorator\` generates \`controllers/*.controller.ts\`
393
+ - \`--functional\` generates \`routes/*.routes.ts\` and \`handlers/*.handler.ts\`
394
+ `;
395
+ export const generateHelp = `# Generate
396
+
397
+ ## Usage
398
+
399
+ \`\`\`bash
400
+ sc generate controller user
401
+ sc generate service user
402
+ sc generate module user
403
+ sc generate resource user
404
+ \`\`\`
405
+
406
+ ## Aliases
407
+
408
+ - \`sc g\`
409
+ - \`controller\` -> \`c\`
410
+ - \`service\` -> \`s\`
411
+ - \`module\` -> \`m\`
412
+ - \`resource\` -> \`r\`
413
+ `;
414
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@sculptor/cli",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "sc": "./dist/cli.js"
7
+ },
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "default": "./dist/index.js"
15
+ },
16
+ "./cli": {
17
+ "types": "./dist/cli.d.ts",
18
+ "import": "./dist/cli.js",
19
+ "default": "./dist/cli.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "sideEffects": false,
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json",
29
+ "cli": "tsx src/cli.ts",
30
+ "prepack": "npm run build"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "license": "MIT",
36
+ "dependencies": {
37
+ "@sculptor/config": "^0.1.0",
38
+ "@sculptor/core": "^0.1.0",
39
+ "tsx": "^4.19.4"
40
+ }
41
+ }