@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/README.md +142 -369
- package/bin/sc.js +0 -0
- package/dist/agents.d.ts +2 -0
- package/dist/agents.js +100 -0
- package/dist/agents.js.map +1 -0
- package/dist/cli.js +317 -15
- package/dist/cli.js.map +1 -1
- package/dist/diagnostics.d.ts +16 -0
- package/dist/diagnostics.js +275 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/package-commands.d.ts +24 -0
- package/dist/package-commands.js +299 -0
- package/dist/package-commands.js.map +1 -0
- package/dist/package-manager.d.ts +3 -0
- package/dist/package-manager.js +20 -0
- package/dist/package-manager.js.map +1 -0
- package/dist/package-registry.d.ts +37 -0
- package/dist/package-registry.js +477 -0
- package/dist/package-registry.js.map +1 -0
- package/dist/plugins.d.ts +3 -0
- package/dist/plugins.js +29 -1
- package/dist/plugins.js.map +1 -1
- package/dist/runtime-dependencies.d.ts +8 -0
- package/dist/runtime-dependencies.js +2 -0
- package/dist/runtime-dependencies.js.map +1 -0
- package/dist/scaffold.d.ts +19 -1
- package/dist/scaffold.js +244 -1
- package/dist/scaffold.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import ts from "typescript";
|
|
4
|
+
import { loadConfig } from "@sculptor/config";
|
|
5
|
+
export const PACKAGE_REGISTRY_FILE = "sculptor.packages.json";
|
|
6
|
+
const isPlainObject = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
7
|
+
const toPascalCase = (value) => value
|
|
8
|
+
.split(/[^a-zA-Z0-9]+/)
|
|
9
|
+
.filter(Boolean)
|
|
10
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
11
|
+
.join("");
|
|
12
|
+
const toCamelCase = (value) => {
|
|
13
|
+
const pascal = toPascalCase(value);
|
|
14
|
+
return pascal.charAt(0).toLowerCase() + pascal.slice(1);
|
|
15
|
+
};
|
|
16
|
+
const normalizeRelativePath = (value) => value.replace(/\\/g, "/").replace(/^\/+/, "").replace(/\/+$/, "");
|
|
17
|
+
const readJson = (filePath) => {
|
|
18
|
+
if (!fs.existsSync(filePath)) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const raw = fs.readFileSync(filePath, "utf8");
|
|
22
|
+
if (!raw.trim()) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
return JSON.parse(raw);
|
|
26
|
+
};
|
|
27
|
+
const writeJson = (filePath, value) => {
|
|
28
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
29
|
+
fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
30
|
+
};
|
|
31
|
+
const getSrcRoot = (rootDir) => String(loadConfig(rootDir).framework.project?.srcRoot ?? "src");
|
|
32
|
+
const isLocalModule = (specifier) => specifier.startsWith(".") || specifier.startsWith("/");
|
|
33
|
+
const toTsPath = (specifier) => {
|
|
34
|
+
if (!specifier.endsWith(".js") && !specifier.endsWith(".ts")) {
|
|
35
|
+
return specifier;
|
|
36
|
+
}
|
|
37
|
+
return specifier.replace(/\.js$/, ".ts");
|
|
38
|
+
};
|
|
39
|
+
const inferFileType = (filePath) => {
|
|
40
|
+
if (filePath.endsWith(".controller.ts")) {
|
|
41
|
+
return "controller";
|
|
42
|
+
}
|
|
43
|
+
if (filePath.endsWith(".service.ts")) {
|
|
44
|
+
return "service";
|
|
45
|
+
}
|
|
46
|
+
if (filePath.endsWith(".repository.ts")) {
|
|
47
|
+
return "repository";
|
|
48
|
+
}
|
|
49
|
+
if (filePath.endsWith(".middleware.ts")) {
|
|
50
|
+
return "middleware";
|
|
51
|
+
}
|
|
52
|
+
if (filePath.endsWith(".module.ts")) {
|
|
53
|
+
return "module";
|
|
54
|
+
}
|
|
55
|
+
if (filePath.endsWith(".route.ts") || filePath.endsWith(".route.handler.ts")) {
|
|
56
|
+
return "route";
|
|
57
|
+
}
|
|
58
|
+
if (filePath.endsWith(".dto.ts")) {
|
|
59
|
+
return "dto";
|
|
60
|
+
}
|
|
61
|
+
return "type";
|
|
62
|
+
};
|
|
63
|
+
const inferSymbolFromFile = (filePath) => {
|
|
64
|
+
const base = path.posix.basename(filePath).replace(/\.ts$/, "");
|
|
65
|
+
if (base.endsWith(".route.handler")) {
|
|
66
|
+
return `${toCamelCase(base.replace(/\.route\.handler$/, ""))}Handler`;
|
|
67
|
+
}
|
|
68
|
+
if (base.endsWith(".route")) {
|
|
69
|
+
return toCamelCase(base.replace(/\.route$/, ""));
|
|
70
|
+
}
|
|
71
|
+
if (base.endsWith(".middleware")) {
|
|
72
|
+
return `${toCamelCase(base.replace(/\.middleware$/, ""))}Middleware`;
|
|
73
|
+
}
|
|
74
|
+
if (base.endsWith(".service")) {
|
|
75
|
+
return `${toPascalCase(base.replace(/\.service$/, ""))}Service`;
|
|
76
|
+
}
|
|
77
|
+
if (base.endsWith(".repository")) {
|
|
78
|
+
return `${toPascalCase(base.replace(/\.repository$/, ""))}Repository`;
|
|
79
|
+
}
|
|
80
|
+
if (base.endsWith(".controller")) {
|
|
81
|
+
return `${toPascalCase(base.replace(/\.controller$/, ""))}Controller`;
|
|
82
|
+
}
|
|
83
|
+
if (base.endsWith(".module")) {
|
|
84
|
+
return `${toPascalCase(base.replace(/\.module$/, ""))}Module`;
|
|
85
|
+
}
|
|
86
|
+
if (base.endsWith(".dto")) {
|
|
87
|
+
return `${toPascalCase(base.replace(/\.dto$/, ""))}Dto`;
|
|
88
|
+
}
|
|
89
|
+
if (base.endsWith(".types")) {
|
|
90
|
+
return `${toPascalCase(base.replace(/\.types$/, ""))}Types`;
|
|
91
|
+
}
|
|
92
|
+
return `${toPascalCase(base)}Type`;
|
|
93
|
+
};
|
|
94
|
+
const collectTsFiles = (dir, rootDir = dir) => {
|
|
95
|
+
if (!fs.existsSync(dir)) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
const files = [];
|
|
99
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
100
|
+
const fullPath = path.join(dir, entry.name);
|
|
101
|
+
if (entry.isDirectory()) {
|
|
102
|
+
files.push(...collectTsFiles(fullPath, rootDir));
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (!entry.isFile() || !entry.name.endsWith(".ts")) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
files.push(normalizeRelativePath(path.relative(rootDir, fullPath)));
|
|
109
|
+
}
|
|
110
|
+
return files;
|
|
111
|
+
};
|
|
112
|
+
const fileBelongsToPackage = (packagePath, filePath) => {
|
|
113
|
+
const normalizedPackagePath = normalizeRelativePath(packagePath);
|
|
114
|
+
const normalizedFilePath = normalizeRelativePath(filePath);
|
|
115
|
+
return normalizedFilePath.startsWith(`${normalizedPackagePath}/`) && normalizedFilePath !== `${normalizedPackagePath}/index.ts`;
|
|
116
|
+
};
|
|
117
|
+
const getDecorators = (node) => ts.canHaveDecorators(node) ? ts.getDecorators(node) ?? [] : [];
|
|
118
|
+
const getPackageDecorator = (node) => {
|
|
119
|
+
for (const decorator of getDecorators(node)) {
|
|
120
|
+
const expression = decorator.expression;
|
|
121
|
+
if (!ts.isCallExpression(expression)) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const callee = expression.expression;
|
|
125
|
+
if (ts.isIdentifier(callee) && callee.text === "Package") {
|
|
126
|
+
return expression;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
};
|
|
131
|
+
const parsePackageMetadata = (rootDir, filePath) => {
|
|
132
|
+
const sourceText = fs.readFileSync(filePath, "utf8");
|
|
133
|
+
const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
134
|
+
const classes = sourceFile.statements.filter(ts.isClassDeclaration);
|
|
135
|
+
const decoratedClass = classes.find((node) => getPackageDecorator(node));
|
|
136
|
+
if (!decoratedClass) {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
const decorator = getPackageDecorator(decoratedClass);
|
|
140
|
+
const argument = decorator?.arguments[0];
|
|
141
|
+
if (!argument || !ts.isObjectLiteralExpression(argument)) {
|
|
142
|
+
throw new Error(`Malformed @Package() metadata in ${filePath}.`);
|
|
143
|
+
}
|
|
144
|
+
const values = new Map();
|
|
145
|
+
for (const property of argument.properties) {
|
|
146
|
+
if (!ts.isPropertyAssignment(property)) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const name = ts.isIdentifier(property.name) ? property.name.text : property.name.getText(sourceFile);
|
|
150
|
+
values.set(name, property.initializer);
|
|
151
|
+
}
|
|
152
|
+
const getString = (key, fallback = "") => {
|
|
153
|
+
const value = values.get(key);
|
|
154
|
+
if (!value || !ts.isStringLiteralLike(value)) {
|
|
155
|
+
return fallback;
|
|
156
|
+
}
|
|
157
|
+
return value.text;
|
|
158
|
+
};
|
|
159
|
+
const name = getString("name", decoratedClass.name?.text ?? "");
|
|
160
|
+
const packagePath = getString("path", "");
|
|
161
|
+
if (!name || !packagePath) {
|
|
162
|
+
throw new Error(`Malformed @Package() metadata in ${filePath}.`);
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
name,
|
|
166
|
+
path: packagePath,
|
|
167
|
+
index: normalizeRelativePath(path.relative(rootDir, filePath))
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
export const getPackageRegistryPath = (rootDir) => path.join(rootDir, PACKAGE_REGISTRY_FILE);
|
|
171
|
+
export const loadPackageRegistry = (rootDir) => {
|
|
172
|
+
const filePath = getPackageRegistryPath(rootDir);
|
|
173
|
+
const data = readJson(filePath);
|
|
174
|
+
if (!data) {
|
|
175
|
+
return { packages: {}, files: [] };
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
packages: data.packages ?? {},
|
|
179
|
+
files: data.files ?? []
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
export const savePackageRegistry = (rootDir, registry) => {
|
|
183
|
+
writeJson(getPackageRegistryPath(rootDir), registry);
|
|
184
|
+
};
|
|
185
|
+
export const scanPackageRegistry = (rootDir) => {
|
|
186
|
+
const srcRoot = getSrcRoot(rootDir);
|
|
187
|
+
const sourceRoot = path.join(rootDir, srcRoot);
|
|
188
|
+
const packages = [];
|
|
189
|
+
const visit = (dir) => {
|
|
190
|
+
if (!fs.existsSync(dir)) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
194
|
+
const fullPath = path.join(dir, entry.name);
|
|
195
|
+
if (entry.isDirectory()) {
|
|
196
|
+
visit(fullPath);
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (!entry.isFile() || entry.name !== "index.ts") {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const packageMeta = parsePackageMetadata(rootDir, fullPath);
|
|
203
|
+
if (!packageMeta) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
packages.push({
|
|
207
|
+
...packageMeta,
|
|
208
|
+
files: []
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
visit(sourceRoot);
|
|
213
|
+
const allTsFiles = collectTsFiles(sourceRoot, rootDir);
|
|
214
|
+
const ownedFiles = new Set();
|
|
215
|
+
for (const file of allTsFiles) {
|
|
216
|
+
if (file === PACKAGE_REGISTRY_FILE || file.endsWith(".d.ts") || file.endsWith("index.ts")) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
const owner = [...packages]
|
|
220
|
+
.filter((pkg) => fileBelongsToPackage(pkg.path, file))
|
|
221
|
+
.sort((left, right) => right.path.length - left.path.length)[0];
|
|
222
|
+
const nextFile = {
|
|
223
|
+
type: inferFileType(file),
|
|
224
|
+
path: file
|
|
225
|
+
};
|
|
226
|
+
if (owner) {
|
|
227
|
+
owner.files.push(nextFile);
|
|
228
|
+
ownedFiles.add(file);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const unpackaged = [];
|
|
232
|
+
for (const file of allTsFiles) {
|
|
233
|
+
if (file === PACKAGE_REGISTRY_FILE || file.endsWith(".d.ts") || file.endsWith("index.ts")) {
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (ownedFiles.has(file)) {
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
unpackaged.push({
|
|
240
|
+
type: inferFileType(file),
|
|
241
|
+
path: file
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
packages: packages
|
|
246
|
+
.map((pkg) => ({ ...pkg, files: pkg.files.sort((left, right) => left.path.localeCompare(right.path)) }))
|
|
247
|
+
.sort((left, right) => left.name.localeCompare(right.name)),
|
|
248
|
+
files: unpackaged.sort((left, right) => left.path.localeCompare(right.path))
|
|
249
|
+
};
|
|
250
|
+
};
|
|
251
|
+
export const scanPackageIndexes = (rootDir) => scanPackageRegistry(rootDir).packages;
|
|
252
|
+
export const syncPackageRegistry = (rootDir) => {
|
|
253
|
+
const scanned = scanPackageRegistry(rootDir);
|
|
254
|
+
const registry = {
|
|
255
|
+
packages: Object.fromEntries(scanned.packages.map((pkg) => [pkg.name, pkg])),
|
|
256
|
+
files: scanned.files
|
|
257
|
+
};
|
|
258
|
+
savePackageRegistry(rootDir, registry);
|
|
259
|
+
return registry;
|
|
260
|
+
};
|
|
261
|
+
const derivePackageIndexView = (record) => {
|
|
262
|
+
const ownedFiles = record.files.filter((file) => file.path !== record.index);
|
|
263
|
+
const controllerFiles = ownedFiles.filter((file) => file.path.endsWith(".controller.ts"));
|
|
264
|
+
const serviceFiles = ownedFiles.filter((file) => file.path.endsWith(".service.ts"));
|
|
265
|
+
const repositoryFiles = ownedFiles.filter((file) => file.path.endsWith(".repository.ts"));
|
|
266
|
+
const middlewareFiles = ownedFiles.filter((file) => file.path.endsWith(".middleware.ts"));
|
|
267
|
+
const routeFiles = ownedFiles.filter((file) => file.path.endsWith(".route.ts"));
|
|
268
|
+
const routeHandlerFiles = ownedFiles.filter((file) => file.path.endsWith(".route.handler.ts"));
|
|
269
|
+
const dtoFiles = ownedFiles.filter((file) => file.path.endsWith(".dto.ts"));
|
|
270
|
+
const typeFiles = ownedFiles.filter((file) => file.path.endsWith(".types.ts") || file.path.endsWith(".type.ts"));
|
|
271
|
+
const importableFiles = [
|
|
272
|
+
...controllerFiles,
|
|
273
|
+
...serviceFiles,
|
|
274
|
+
...repositoryFiles,
|
|
275
|
+
...middlewareFiles,
|
|
276
|
+
...routeFiles,
|
|
277
|
+
...dtoFiles
|
|
278
|
+
];
|
|
279
|
+
const exportFiles = [
|
|
280
|
+
...controllerFiles,
|
|
281
|
+
...serviceFiles,
|
|
282
|
+
...repositoryFiles,
|
|
283
|
+
...middlewareFiles,
|
|
284
|
+
...routeFiles,
|
|
285
|
+
...routeHandlerFiles,
|
|
286
|
+
...dtoFiles
|
|
287
|
+
];
|
|
288
|
+
const packageExportFiles = [
|
|
289
|
+
...serviceFiles,
|
|
290
|
+
...repositoryFiles,
|
|
291
|
+
...middlewareFiles,
|
|
292
|
+
...dtoFiles
|
|
293
|
+
];
|
|
294
|
+
const renderArray = (values) => values.length === 0 ? "[]" : `[\n${values.map((value) => ` ${value}`).join(",\n")}\n ]`;
|
|
295
|
+
const imports = importableFiles
|
|
296
|
+
.map((file) => {
|
|
297
|
+
const symbol = inferSymbolFromFile(file.path);
|
|
298
|
+
const relative = normalizeRelativePath(path.posix.relative(record.path, file.path)).replace(/\.ts$/, ".js");
|
|
299
|
+
return `import { ${symbol} } from "./${relative}";`;
|
|
300
|
+
})
|
|
301
|
+
.join("\n");
|
|
302
|
+
const exports = [...exportFiles, ...typeFiles]
|
|
303
|
+
.map((file) => {
|
|
304
|
+
const relative = normalizeRelativePath(path.posix.relative(record.path, file.path)).replace(/\.ts$/, ".js");
|
|
305
|
+
if (file.path.endsWith(".types.ts") || file.path.endsWith(".type.ts")) {
|
|
306
|
+
return `export type { ${inferSymbolFromFile(file.path)} } from "./${relative}";`;
|
|
307
|
+
}
|
|
308
|
+
return `export * from "./${relative}";`;
|
|
309
|
+
})
|
|
310
|
+
.join("\n");
|
|
311
|
+
const packageBlock = `@Package({
|
|
312
|
+
name: "${record.name}",
|
|
313
|
+
path: "${record.path}",
|
|
314
|
+
imports: [],
|
|
315
|
+
exports: ${renderArray(packageExportFiles.map((file) => inferSymbolFromFile(file.path)))},
|
|
316
|
+
controllers: ${renderArray(controllerFiles.map((file) => inferSymbolFromFile(file.path)))},
|
|
317
|
+
services: ${renderArray(serviceFiles.map((file) => inferSymbolFromFile(file.path)))},
|
|
318
|
+
repositories: ${renderArray(repositoryFiles.map((file) => inferSymbolFromFile(file.path)))},
|
|
319
|
+
middlewares: ${renderArray(middlewareFiles.map((file) => inferSymbolFromFile(file.path)))},
|
|
320
|
+
routes: ${renderArray(routeFiles.map((file) => inferSymbolFromFile(file.path)))}
|
|
321
|
+
})
|
|
322
|
+
export class ${toPascalCase(record.name)}Package {}`;
|
|
323
|
+
return { imports, exports, packageBlock };
|
|
324
|
+
};
|
|
325
|
+
export const renderPackageIndex = (record) => {
|
|
326
|
+
const sections = derivePackageIndexView(record);
|
|
327
|
+
return `/**\n * @generated true\n */\nimport { Package } from "@sculptor/core";\n\n// [sculptor:imports:start]\n${sections.imports}\n// [sculptor:imports:end]\n\n// [sculptor:exports:start]\n${sections.exports}\n// [sculptor:exports:end]\n\n// [sculptor:package:start]\n${sections.packageBlock}\n// [sculptor:package:end]\n`;
|
|
328
|
+
};
|
|
329
|
+
export const inferPackageNameFromPath = (packagePath) => normalizeRelativePath(path.posix.basename(packagePath));
|
|
330
|
+
export const inferPackagePath = (rootDir, packageName, explicitPath) => {
|
|
331
|
+
const srcRoot = getSrcRoot(rootDir);
|
|
332
|
+
const packageFolder = normalizeRelativePath(packageName);
|
|
333
|
+
if (explicitPath) {
|
|
334
|
+
return normalizeRelativePath(path.posix.join(normalizeRelativePath(explicitPath), packageFolder));
|
|
335
|
+
}
|
|
336
|
+
return normalizeRelativePath(path.posix.join(srcRoot, packageFolder));
|
|
337
|
+
};
|
|
338
|
+
export const inferPackageIndexPath = (packagePath) => normalizeRelativePath(path.posix.join(packagePath, "index.ts"));
|
|
339
|
+
export const buildPackageRecord = (rootDir, packageName, explicitPath) => {
|
|
340
|
+
const packagePath = inferPackagePath(rootDir, packageName, explicitPath);
|
|
341
|
+
const index = inferPackageIndexPath(packagePath);
|
|
342
|
+
const normalizedPackageName = normalizeRelativePath(packageName);
|
|
343
|
+
const files = [
|
|
344
|
+
{ type: "controller", path: normalizeRelativePath(path.posix.join(packagePath, `${normalizedPackageName}.controller.ts`)) },
|
|
345
|
+
{ type: "service", path: normalizeRelativePath(path.posix.join(packagePath, `${normalizedPackageName}.service.ts`)) },
|
|
346
|
+
{ type: "repository", path: normalizeRelativePath(path.posix.join(packagePath, `${normalizedPackageName}.repository.ts`)) },
|
|
347
|
+
{ type: "dto", path: normalizeRelativePath(path.posix.join(packagePath, `${normalizedPackageName}.dto.ts`)) },
|
|
348
|
+
{ type: "type", path: normalizeRelativePath(path.posix.join(packagePath, `${normalizedPackageName}.types.ts`)) }
|
|
349
|
+
];
|
|
350
|
+
return {
|
|
351
|
+
name: normalizedPackageName,
|
|
352
|
+
path: packagePath,
|
|
353
|
+
index,
|
|
354
|
+
files,
|
|
355
|
+
};
|
|
356
|
+
};
|
|
357
|
+
export const readPackageSource = (filePath) => {
|
|
358
|
+
const sourceText = fs.readFileSync(filePath, "utf8");
|
|
359
|
+
return sourceText;
|
|
360
|
+
};
|
|
361
|
+
const isFileOwnedByPackage = (record, filePath) => {
|
|
362
|
+
const normalized = normalizeRelativePath(filePath);
|
|
363
|
+
return normalized.startsWith(`${record.path}/`) || normalized === record.index;
|
|
364
|
+
};
|
|
365
|
+
export const upsertFileIntoRegistry = (registry, filePath) => {
|
|
366
|
+
const normalizedPath = normalizeRelativePath(filePath);
|
|
367
|
+
const fileType = inferFileType(normalizedPath);
|
|
368
|
+
for (const record of Object.values(registry.packages)) {
|
|
369
|
+
if (normalizedPath === record.index) {
|
|
370
|
+
return registry;
|
|
371
|
+
}
|
|
372
|
+
if (!isFileOwnedByPackage(record, normalizedPath)) {
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
const existingIndex = record.files.findIndex((entry) => entry.path === normalizedPath);
|
|
376
|
+
const nextFile = {
|
|
377
|
+
type: fileType,
|
|
378
|
+
path: normalizedPath
|
|
379
|
+
};
|
|
380
|
+
if (existingIndex >= 0) {
|
|
381
|
+
record.files[existingIndex] = nextFile;
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
record.files.push(nextFile);
|
|
385
|
+
}
|
|
386
|
+
return registry;
|
|
387
|
+
}
|
|
388
|
+
const existing = registry.files.findIndex((entry) => entry.path === normalizedPath);
|
|
389
|
+
const nextFile = {
|
|
390
|
+
type: fileType,
|
|
391
|
+
path: normalizedPath
|
|
392
|
+
};
|
|
393
|
+
if (existing >= 0) {
|
|
394
|
+
registry.files[existing] = nextFile;
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
registry.files.push(nextFile);
|
|
398
|
+
}
|
|
399
|
+
return registry;
|
|
400
|
+
};
|
|
401
|
+
export const removeFileFromRegistry = (registry, filePath) => {
|
|
402
|
+
const normalizedPath = normalizeRelativePath(filePath);
|
|
403
|
+
for (const record of Object.values(registry.packages)) {
|
|
404
|
+
if (normalizedPath === record.index) {
|
|
405
|
+
return registry;
|
|
406
|
+
}
|
|
407
|
+
if (!isFileOwnedByPackage(record, normalizedPath)) {
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
record.files = record.files.filter((entry) => entry.path !== normalizedPath);
|
|
411
|
+
return registry;
|
|
412
|
+
}
|
|
413
|
+
registry.files = registry.files.filter((entry) => entry.path !== normalizedPath);
|
|
414
|
+
return registry;
|
|
415
|
+
};
|
|
416
|
+
export const getOwningPackage = (registry, filePath) => {
|
|
417
|
+
const normalizedPath = normalizeRelativePath(filePath);
|
|
418
|
+
return Object.values(registry.packages).find((record) => isFileOwnedByPackage(record, normalizedPath));
|
|
419
|
+
};
|
|
420
|
+
export const renderPackageIndexForRecord = (record) => renderPackageIndex(record);
|
|
421
|
+
const generatedMarkers = {
|
|
422
|
+
imports: {
|
|
423
|
+
start: "// [sculptor:imports:start]",
|
|
424
|
+
end: "// [sculptor:imports:end]"
|
|
425
|
+
},
|
|
426
|
+
exports: {
|
|
427
|
+
start: "// [sculptor:exports:start]",
|
|
428
|
+
end: "// [sculptor:exports:end]"
|
|
429
|
+
},
|
|
430
|
+
package: {
|
|
431
|
+
start: "// [sculptor:package:start]",
|
|
432
|
+
end: "// [sculptor:package:end]"
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
const replaceMarkerBlock = (source, section, content) => {
|
|
436
|
+
const { start, end } = generatedMarkers[section];
|
|
437
|
+
const startIndex = source.indexOf(start);
|
|
438
|
+
const endIndex = source.indexOf(end);
|
|
439
|
+
if (startIndex < 0 || endIndex < 0 || endIndex < startIndex) {
|
|
440
|
+
throw new Error(`Malformed package index markers for ${section}.`);
|
|
441
|
+
}
|
|
442
|
+
if (source.indexOf(start, startIndex + start.length) !== -1 || source.indexOf(end, endIndex + end.length) !== -1) {
|
|
443
|
+
throw new Error(`Malformed package index markers for ${section}.`);
|
|
444
|
+
}
|
|
445
|
+
return `${source.slice(0, startIndex + start.length)}\n${content}\n${source.slice(endIndex)}`;
|
|
446
|
+
};
|
|
447
|
+
const renderPackageIndexSections = (record) => {
|
|
448
|
+
const sections = derivePackageIndexView(record);
|
|
449
|
+
return {
|
|
450
|
+
imports: sections.imports,
|
|
451
|
+
exports: sections.exports,
|
|
452
|
+
package: sections.packageBlock
|
|
453
|
+
};
|
|
454
|
+
};
|
|
455
|
+
export const updatePackageIndexForRecord = (filePath, record) => {
|
|
456
|
+
const next = renderPackageIndex(record);
|
|
457
|
+
if (!fs.existsSync(filePath)) {
|
|
458
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
459
|
+
fs.writeFileSync(filePath, next, "utf8");
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
const current = fs.readFileSync(filePath, "utf8");
|
|
463
|
+
for (const section of Object.keys(generatedMarkers)) {
|
|
464
|
+
if (!current.includes(generatedMarkers[section].start) || !current.includes(generatedMarkers[section].end)) {
|
|
465
|
+
throw new Error(`Package index markers are missing or malformed in ${filePath}. Refusing to rewrite the file unsafely.`);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
let updated = current;
|
|
469
|
+
const sections = renderPackageIndexSections(record);
|
|
470
|
+
updated = replaceMarkerBlock(updated, "imports", sections.imports);
|
|
471
|
+
updated = replaceMarkerBlock(updated, "exports", sections.exports);
|
|
472
|
+
updated = replaceMarkerBlock(updated, "package", sections.package);
|
|
473
|
+
if (updated !== current) {
|
|
474
|
+
fs.writeFileSync(filePath, updated, "utf8");
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
//# sourceMappingURL=package-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-registry.js","sourceRoot":"","sources":["../src/package-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/plugins.d.ts
CHANGED
|
@@ -14,6 +14,9 @@ export interface PluginModule {
|
|
|
14
14
|
templates?: string[];
|
|
15
15
|
generators?: string[];
|
|
16
16
|
}
|
|
17
|
+
export declare class PluginLoadError extends Error {
|
|
18
|
+
name: string;
|
|
19
|
+
}
|
|
17
20
|
export declare class PluginRegistry {
|
|
18
21
|
private readonly plugins;
|
|
19
22
|
register(manifest: PluginManifest): void;
|
package/dist/plugins.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
export class PluginLoadError extends Error {
|
|
2
|
+
constructor() {
|
|
3
|
+
super(...arguments);
|
|
4
|
+
this.name = "PluginLoadError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
1
7
|
export class PluginRegistry {
|
|
2
8
|
constructor() {
|
|
3
9
|
this.plugins = new Map();
|
|
@@ -12,7 +18,29 @@ export class PluginRegistry {
|
|
|
12
18
|
return [...this.plugins.values()];
|
|
13
19
|
}
|
|
14
20
|
}
|
|
15
|
-
|
|
21
|
+
const isMissingModuleError = (error, pluginName) => {
|
|
22
|
+
if (typeof error !== "object" || error === null) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const code = "code" in error ? String(error.code ?? "") : "";
|
|
26
|
+
const message = "message" in error ? String(error.message ?? "") : "";
|
|
27
|
+
return (code === "ERR_MODULE_NOT_FOUND" ||
|
|
28
|
+
code === "MODULE_NOT_FOUND" ||
|
|
29
|
+
message.includes(pluginName) ||
|
|
30
|
+
message.includes("Cannot find module") ||
|
|
31
|
+
message.includes("Cannot find package"));
|
|
32
|
+
};
|
|
33
|
+
export const loadPluginModule = async (pluginName) => {
|
|
34
|
+
try {
|
|
35
|
+
return (await import(pluginName));
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (isMissingModuleError(error, pluginName)) {
|
|
39
|
+
throw new PluginLoadError(`Unable to load plugin "${pluginName}". Is it installed?`);
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
16
44
|
export const resolvePluginManifest = (module, fallbackName) => {
|
|
17
45
|
const direct = module.manifest;
|
|
18
46
|
if (direct) {
|
package/dist/plugins.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,cAAc;IAA3B;QACmB,YAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAa/D,CAAC;IAXC,QAAQ,CAAC,QAAwB;QAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,UAAkB,EAAyB,EAAE,
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAA1C;;QACW,SAAI,GAAG,iBAAiB,CAAC;IACpC,CAAC;CAAA;AAED,MAAM,OAAO,cAAc;IAA3B;QACmB,YAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAa/D,CAAC;IAXC,QAAQ,CAAC,QAAwB;QAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;CACF;AAED,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAE,UAAkB,EAAW,EAAE;IAC3E,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,UAAU,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACtC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CACxC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,UAAkB,EAAyB,EAAE;IAClF,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAiB,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,eAAe,CAAC,0BAA0B,UAAU,qBAAqB,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAoB,EAAE,YAAoB,EAAkB,EAAE;IAClG,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC,OAAyB,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AAChC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
export interface RuntimeDependencyRecoveryContext {
|
|
3
|
+
cwd: string;
|
|
4
|
+
prompt: (question: string, defaultValue?: string) => Promise<string>;
|
|
5
|
+
spawn: typeof spawnSync;
|
|
6
|
+
log: (...args: unknown[]) => void;
|
|
7
|
+
error: (...args: unknown[]) => void;
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-dependencies.js","sourceRoot":"","sources":["../src/runtime-dependencies.ts"],"names":[],"mappings":""}
|
package/dist/scaffold.d.ts
CHANGED
|
@@ -1 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
import type { DevServer, GenerateKind, ScaffoldMode, ScaffoldProjectMetadata, TypeVariant } from "../../template-registry/dist/index.js";
|
|
2
|
+
import type { RuntimeDependencyRecoveryContext } from "./runtime-dependencies.js";
|
|
3
|
+
export type { DevServer, GenerateKind, ScaffoldMode, ScaffoldProjectMetadata, TypeVariant };
|
|
4
|
+
export declare const controllerHelp = "# Controller Generator\n\n## Usage\n\n```bash\nsc generate controller user\nsc g c user\nsc generate controller user in src/app/controllers\nsc g c user --functional\n```\n\n## Output\n\n- `controllers/*.controller.ts`\n- controller-first by default\n- pass `--functional` to opt into paired functional route and handler files\n";
|
|
5
|
+
export declare const moduleHelp = "# Module Generator\n\n## Usage\n\n```bash\nsc generate module user\nsc g mo user\n```\n";
|
|
6
|
+
export declare const middlewareHelp = "# Middleware Generator\n\n## Usage\n\n```bash\nsc generate middleware auth\nsc g mw auth\n```\n";
|
|
7
|
+
export declare const repositoryHelp = "# Repository Generator\n\n## Usage\n\n```bash\nsc generate repository user\nsc g repo user\n```\n\n## Output\n\n- `*.repository.ts`\n- generates a `@Repository()` class\n";
|
|
8
|
+
export declare const dtoHelp = "# DTO Generator\n\n## Usage\n\n```bash\nsc generate dto user\nsc g dto user\n```\n\n## Output\n\n- `*.dto.ts`\n- generates an explicit DTO class\n";
|
|
9
|
+
export declare const typeHelp = "# Type Generator\n\n## Usage\n\n```bash\nsc generate type user\nsc g t user\nsc g t user -i\nsc g t user -c\nsc g t user -e\n```\n\n## Flags\n\n- `-i`, `-interface` => `*.interface.ts`\n- `-c`, `-class` => `*.class.ts`\n- `-e`, `-enum` => `*.enum.ts`\n- default => `*.type.ts`\n";
|
|
10
|
+
export declare const routeHelp = "# Route Generator\n\n## Usage\n\n```bash\nsc generate route user\nsc g r user\n```\n\n## Output\n\n- `*.route.ts`\n- `*.route.handler.ts`\n- uses `FunctionalRouter(prefix)`\n- generates a paired handler with try/catch and error middleware boilerplate\n";
|
|
11
|
+
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 middleware auth\nsc generate repository user\nsc generate dto user\nsc generate type user\nsc generate route user\nsc generate pkg user\nsc generate package user\n```\n\n## Aliases\n\n- `sc g`\n- `controller` -> `c`\n- `service` -> `s`\n- `module` -> `m` / `mo`\n- `middleware` -> `mw`\n- `repository` -> `repo`\n- `dto` -> `dto`\n- `type` -> `t`\n- `route` -> `r`\n- `pkg` -> `pkg`\n- `package` -> `package`\n\n## Path\n\n- append `in <path>` to write into a custom directory\n- default output for types is `src/app/types`\n- default output for repositories is `src/app/repositories`\n- default output for DTOs is `src/app/dtos`\n- package generation uses the configured `project.srcRoot` unless `in` is provided\n- controller generators are controller-first by default; pass `--functional` only when you want the paired functional route files\n- route generators always emit the paired functional route and handler files\n";
|
|
12
|
+
export declare const readModeFromFlags: (flags: string[], fallback: ScaffoldMode) => ScaffoldMode;
|
|
13
|
+
export declare const parseGenerateMode: (mode: string | undefined, fallback: ScaffoldMode) => ScaffoldMode;
|
|
14
|
+
type TemplateRegistryModule = typeof import("../../template-registry/dist/index.js");
|
|
15
|
+
export declare const loadScaffoldTemplateRegistry: (context?: RuntimeDependencyRecoveryContext, importer?: () => Promise<TemplateRegistryModule>) => Promise<TemplateRegistryModule | null>;
|
|
16
|
+
export declare const scaffoldProject: (metadata: ScaffoldProjectMetadata, targetDir: string, context?: RuntimeDependencyRecoveryContext) => Promise<boolean>;
|
|
17
|
+
export declare const generateResourceFiles: (kind: GenerateKind, name: string, mode: ScaffoldMode, devServer?: DevServer, outputDir?: string, typeVariant?: TypeVariant, functionalRoutes?: boolean, testingGenerate?: boolean, context?: RuntimeDependencyRecoveryContext) => Promise<Record<string, string> | null>;
|
|
18
|
+
export declare const writeGeneratedFiles: (targetDir: string, files: Record<string, string>, context?: RuntimeDependencyRecoveryContext) => Promise<boolean>;
|
|
19
|
+
export declare const syncTestHarness: (targetDir: string, context?: RuntimeDependencyRecoveryContext) => Promise<boolean>;
|