@sculptor/cli 0.2.2 → 0.3.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/scaffold.js CHANGED
@@ -1,2 +1,245 @@
1
- export { controllerHelp, generateHelp, generateResourceFiles, middlewareHelp, moduleHelp, parseGenerateMode, readModeFromFlags, routeHelp, scaffoldProject, syncTestHarness, typeHelp, writeGeneratedFiles } from "../../template-registry/dist/index.js";
1
+ import { detectPackageManager, globalInstallArgsFor } from "./package-manager.js";
2
+ export const controllerHelp = `# Controller Generator
3
+
4
+ ## Usage
5
+
6
+ \`\`\`bash
7
+ sc generate controller user
8
+ sc g c user
9
+ sc generate controller user in src/app/controllers
10
+ sc g c user --functional
11
+ \`\`\`
12
+
13
+ ## Output
14
+
15
+ - \`controllers/*.controller.ts\`
16
+ - controller-first by default
17
+ - pass \`--functional\` to opt into paired functional route and handler files
18
+ `;
19
+ export const moduleHelp = `# Module Generator
20
+
21
+ ## Usage
22
+
23
+ \`\`\`bash
24
+ sc generate module user
25
+ sc g mo user
26
+ \`\`\`
27
+ `;
28
+ export const middlewareHelp = `# Middleware Generator
29
+
30
+ ## Usage
31
+
32
+ \`\`\`bash
33
+ sc generate middleware auth
34
+ sc g mw auth
35
+ \`\`\`
36
+ `;
37
+ export const repositoryHelp = `# Repository Generator
38
+
39
+ ## Usage
40
+
41
+ \`\`\`bash
42
+ sc generate repository user
43
+ sc g repo user
44
+ \`\`\`
45
+
46
+ ## Output
47
+
48
+ - \`*.repository.ts\`
49
+ - generates a \`@Repository()\` class
50
+ `;
51
+ export const dtoHelp = `# DTO Generator
52
+
53
+ ## Usage
54
+
55
+ \`\`\`bash
56
+ sc generate dto user
57
+ sc g dto user
58
+ \`\`\`
59
+
60
+ ## Output
61
+
62
+ - \`*.dto.ts\`
63
+ - generates an explicit DTO class
64
+ `;
65
+ export const typeHelp = `# Type Generator
66
+
67
+ ## Usage
68
+
69
+ \`\`\`bash
70
+ sc generate type user
71
+ sc g t user
72
+ sc g t user -i
73
+ sc g t user -c
74
+ sc g t user -e
75
+ \`\`\`
76
+
77
+ ## Flags
78
+
79
+ - \`-i\`, \`-interface\` => \`*.interface.ts\`
80
+ - \`-c\`, \`-class\` => \`*.class.ts\`
81
+ - \`-e\`, \`-enum\` => \`*.enum.ts\`
82
+ - default => \`*.type.ts\`
83
+ `;
84
+ export const routeHelp = `# Route Generator
85
+
86
+ ## Usage
87
+
88
+ \`\`\`bash
89
+ sc generate route user
90
+ sc g r user
91
+ \`\`\`
92
+
93
+ ## Output
94
+
95
+ - \`*.route.ts\`
96
+ - \`*.route.handler.ts\`
97
+ - uses \`FunctionalRouter(prefix)\`
98
+ - generates a paired handler with try/catch and error middleware boilerplate
99
+ `;
100
+ export const generateHelp = `# Generate
101
+
102
+ ## Usage
103
+
104
+ \`\`\`bash
105
+ sc generate controller user
106
+ sc generate service user
107
+ sc generate module user
108
+ sc generate middleware auth
109
+ sc generate repository user
110
+ sc generate dto user
111
+ sc generate type user
112
+ sc generate route user
113
+ sc generate pkg user
114
+ sc generate package user
115
+ \`\`\`
116
+
117
+ ## Aliases
118
+
119
+ - \`sc g\`
120
+ - \`controller\` -> \`c\`
121
+ - \`service\` -> \`s\`
122
+ - \`module\` -> \`m\` / \`mo\`
123
+ - \`middleware\` -> \`mw\`
124
+ - \`repository\` -> \`repo\`
125
+ - \`dto\` -> \`dto\`
126
+ - \`type\` -> \`t\`
127
+ - \`route\` -> \`r\`
128
+ - \`pkg\` -> \`pkg\`
129
+ - \`package\` -> \`package\`
130
+
131
+ ## Path
132
+
133
+ - append \`in <path>\` to write into a custom directory
134
+ - default output for types is \`src/app/types\`
135
+ - default output for repositories is \`src/app/repositories\`
136
+ - default output for DTOs is \`src/app/dtos\`
137
+ - package generation uses the configured \`project.srcRoot\` unless \`in\` is provided
138
+ - controller generators are controller-first by default; pass \`--functional\` only when you want the paired functional route files
139
+ - route generators always emit the paired functional route and handler files
140
+ `;
141
+ export const readModeFromFlags = (flags, fallback) => {
142
+ if (flags.includes("--functional")) {
143
+ return "functional";
144
+ }
145
+ if (flags.includes("--decorator")) {
146
+ return "decorator";
147
+ }
148
+ if (flags.includes("--hybrid")) {
149
+ return "hybrid";
150
+ }
151
+ return fallback;
152
+ };
153
+ export const parseGenerateMode = (mode, fallback) => mode === "functional" || mode === "decorator" || mode === "hybrid" ? mode : fallback;
154
+ const TEMPLATE_REGISTRY_PACKAGE = "@sculptor/template-registry";
155
+ const WORKSPACE_TEMPLATE_REGISTRY_PATH = "../../template-registry/dist/index.js";
156
+ const missingDependencyMessage = `Sculptor template registry is not installed.`;
157
+ const isMissingTemplateRegistryError = (error) => {
158
+ if (typeof error !== "object" || error === null) {
159
+ return false;
160
+ }
161
+ const code = "code" in error ? String(error.code ?? "") : "";
162
+ const message = "message" in error ? String(error.message ?? "") : "";
163
+ return (code === "ERR_MODULE_NOT_FOUND" ||
164
+ code === "MODULE_NOT_FOUND" ||
165
+ message.includes(TEMPLATE_REGISTRY_PACKAGE) ||
166
+ message.includes("Cannot find module") ||
167
+ message.includes("Cannot find package"));
168
+ };
169
+ export const loadScaffoldTemplateRegistry = async (context, importer = async () => {
170
+ try {
171
+ return (await import(TEMPLATE_REGISTRY_PACKAGE));
172
+ }
173
+ catch {
174
+ return (await import(WORKSPACE_TEMPLATE_REGISTRY_PATH));
175
+ }
176
+ }) => {
177
+ try {
178
+ return await importer();
179
+ }
180
+ catch (error) {
181
+ if (!isMissingTemplateRegistryError(error)) {
182
+ throw error;
183
+ }
184
+ if (!context) {
185
+ throw new Error(`${missingDependencyMessage} Install it with npm install -g @sculptor/template-registry.`);
186
+ }
187
+ const answer = await context.prompt(`${missingDependencyMessage}\n\nWould you like to install it and rerun the command? (y/n)`, "n");
188
+ if (!answer.trim().toLowerCase().startsWith("y")) {
189
+ context.log("Skipped installing @sculptor/template-registry.");
190
+ process.exitCode = 1;
191
+ return null;
192
+ }
193
+ const packageManager = detectPackageManager();
194
+ context.log(`Installing ${TEMPLATE_REGISTRY_PACKAGE} with ${packageManager}...`);
195
+ const installResult = context.spawn(packageManager, globalInstallArgsFor(packageManager, [TEMPLATE_REGISTRY_PACKAGE]), {
196
+ cwd: context.cwd,
197
+ stdio: "inherit",
198
+ shell: process.platform === "win32",
199
+ env: {
200
+ ...process.env
201
+ }
202
+ });
203
+ if (installResult.status !== 0) {
204
+ throw new Error(`Failed to install ${TEMPLATE_REGISTRY_PACKAGE} with ${packageManager}.`);
205
+ }
206
+ try {
207
+ return await importer();
208
+ }
209
+ catch {
210
+ throw new Error(`${missingDependencyMessage} The package was installed, but it could not be loaded afterward.`);
211
+ }
212
+ }
213
+ };
214
+ export const scaffoldProject = async (metadata, targetDir, context) => {
215
+ const registry = await loadScaffoldTemplateRegistry(context);
216
+ if (!registry) {
217
+ return false;
218
+ }
219
+ registry.scaffoldProject(metadata, targetDir);
220
+ return true;
221
+ };
222
+ export const generateResourceFiles = async (kind, name, mode, devServer = "tsx", outputDir, typeVariant = "type", functionalRoutes = false, testingGenerate = false, context) => {
223
+ const registry = await loadScaffoldTemplateRegistry(context);
224
+ if (!registry) {
225
+ return null;
226
+ }
227
+ return registry.generateResourceFiles(kind, name, mode, devServer, outputDir, typeVariant, functionalRoutes, testingGenerate);
228
+ };
229
+ export const writeGeneratedFiles = async (targetDir, files, context) => {
230
+ const registry = await loadScaffoldTemplateRegistry(context);
231
+ if (!registry) {
232
+ return false;
233
+ }
234
+ registry.writeGeneratedFiles(targetDir, files);
235
+ return true;
236
+ };
237
+ export const syncTestHarness = async (targetDir, context) => {
238
+ const registry = await loadScaffoldTemplateRegistry(context);
239
+ if (!registry) {
240
+ return false;
241
+ }
242
+ registry.syncTestHarness(targetDir);
243
+ return true;
244
+ };
2
245
  //# sourceMappingURL=scaffold.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,eAAe,EAIf,QAAQ,EAER,mBAAmB,EACpB,MAAM,uCAAuC,CAAC"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAIlF,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;CAgB7B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;CAQzB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;CAQ7B,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;CAa7B,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;;;;;;;;;;;;;CAatB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;CAkBvB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;CAexB,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwC3B,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,KAAe,EACf,QAAsB,EACR,EAAE;IAChB,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAwB,EAAE,QAAsB,EAAgB,EAAE,CAClG,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AAIvF,MAAM,yBAAyB,GAAG,6BAA6B,CAAC;AAChE,MAAM,gCAAgC,GAAG,uCAAuC,CAAC;AACjF,MAAM,wBAAwB,GAAG,8CAA8C,CAAC;AAEhF,MAAM,8BAA8B,GAAG,CAAC,KAAc,EAAW,EAAE;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,MAAM,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAE,KAA+B,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjG,OAAO,CACL,IAAI,KAAK,sBAAsB;QAC/B,IAAI,KAAK,kBAAkB;QAC3B,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC3C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACtC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CACxC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,EAC/C,OAA0C,EAC1C,WAAkD,KAAK,IAAI,EAAE;IAC3D,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAA2B,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAA2B,CAAC;IACpF,CAAC;AACH,CAAC,EACuC,EAAE;IAC1C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,GAAG,wBAAwB,8DAA8D,CAC1F,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CACjC,GAAG,wBAAwB,+DAA+D,EAC1F,GAAG,CACJ,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,yBAAyB,SAAS,cAAc,KAAK,CAAC,CAAC;QAEjF,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CACjC,cAAc,EACd,oBAAoB,CAAC,cAAc,EAAE,CAAC,yBAAyB,CAAC,CAAC,EACjE;YACA,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACnC,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;aACf;SACA,CACF,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,qBAAqB,yBAAyB,SAAS,cAAc,GAAG,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,EAAE,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,GAAG,wBAAwB,mEAAmE,CAC/F,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,QAAiC,EACjC,SAAiB,EACjB,OAA0C,EACxB,EAAE;IACpB,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAE7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,IAAkB,EAClB,IAAY,EACZ,IAAkB,EAClB,YAAuB,KAAK,EAC5B,SAAkB,EAClB,cAA2B,MAAM,EACjC,gBAAgB,GAAG,KAAK,EACxB,eAAe,GAAG,KAAK,EACvB,OAA0C,EACF,EAAE;IAC1C,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAE7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,CAAC,qBAAqB,CACnC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,eAAe,CAChB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,SAAiB,EACjB,KAA6B,EAC7B,OAA0C,EACxB,EAAE;IACpB,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAE7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,SAAiB,EACjB,OAA0C,EACxB,EAAE;IACpB,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAE7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sculptor/cli",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "sc": "./bin/sc.js",
@@ -36,9 +36,10 @@
36
36
  },
37
37
  "license": "MIT",
38
38
  "dependencies": {
39
- "@sculptor/config": "^0.2.1",
40
- "@sculptor/core": "^0.2.3",
41
- "@sculptor/template-registry": "^0.1.5",
39
+ "@sculptor/config": "^0.3.0",
40
+ "@sculptor/core": "^0.3.0",
41
+ "@sculptor/template-registry": "^0.3.0",
42
+ "typescript": "^5.8.3",
42
43
  "tsx": "^4.19.4"
43
44
  }
44
45
  }