@specverse/engines 6.5.4 → 6.7.8
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/libs/instance-factories/applications/templates/generic/backend-package-json-generator.js +26 -10
- package/dist/libs/instance-factories/controllers/templates/fastify/server-generator.js +1 -1
- package/dist/libs/instance-factories/services/mongodb-native-services.yaml +84 -0
- package/dist/libs/instance-factories/services/templates/mongodb-native/client-generator.js +43 -0
- package/dist/libs/instance-factories/services/templates/mongodb-native/controller-generator.js +252 -0
- package/dist/libs/instance-factories/services/templates/mongodb-native/service-generator.js +64 -0
- package/dist/libs/instance-factories/services/templates/prisma/ai-behaviors-generator.js +167 -26
- package/dist/realize/library/library.d.ts.map +1 -1
- package/dist/realize/library/library.js +11 -0
- package/dist/realize/library/library.js.map +1 -1
- package/libs/instance-factories/applications/templates/generic/backend-package-json-generator.ts +48 -12
- package/libs/instance-factories/controllers/templates/fastify/server-generator.ts +1 -1
- package/libs/instance-factories/services/mongodb-native-services.yaml +84 -0
- package/libs/instance-factories/services/templates/mongodb-native/__tests__/controller-generator.test.ts +113 -0
- package/libs/instance-factories/services/templates/mongodb-native/client-generator.ts +51 -0
- package/libs/instance-factories/services/templates/mongodb-native/controller-generator.ts +319 -0
- package/libs/instance-factories/services/templates/mongodb-native/service-generator.ts +83 -0
- package/libs/instance-factories/services/templates/prisma/ai-behaviors-generator.ts +231 -36
- package/package.json +4 -5
|
@@ -16,7 +16,66 @@ async function validateTypeScript(code) {
|
|
|
16
16
|
return msg;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
async function validateTypeScriptTypes(code) {
|
|
20
|
+
let ts;
|
|
21
|
+
try {
|
|
22
|
+
ts = await import("typescript");
|
|
23
|
+
if (ts.default) ts = ts.default;
|
|
24
|
+
} catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const fileName = "aiBehavior.ts";
|
|
29
|
+
const sourceFile = ts.createSourceFile(fileName, code, ts.ScriptTarget.ES2022, true);
|
|
30
|
+
const compilerOptions = {
|
|
31
|
+
target: ts.ScriptTarget.ES2022,
|
|
32
|
+
module: ts.ModuleKind.ESNext,
|
|
33
|
+
moduleResolution: ts.ModuleResolutionKind.NodeNext,
|
|
34
|
+
strict: true,
|
|
35
|
+
noImplicitAny: false,
|
|
36
|
+
// body uses `any` extensively for inputs
|
|
37
|
+
noUnusedLocals: true,
|
|
38
|
+
noUnusedParameters: true,
|
|
39
|
+
noImplicitReturns: true,
|
|
40
|
+
noUncheckedIndexedAccess: true,
|
|
41
|
+
noFallthroughCasesInSwitch: true,
|
|
42
|
+
noEmit: true,
|
|
43
|
+
skipLibCheck: true,
|
|
44
|
+
types: [],
|
|
45
|
+
// Without `lib`, tsc can't resolve Promise / Array / RegExp etc., and
|
|
46
|
+
// every body fails the basic-types check before it even gets to the
|
|
47
|
+
// strict-null-check rules we actually want to validate.
|
|
48
|
+
lib: ["lib.es2022.d.ts"]
|
|
49
|
+
};
|
|
50
|
+
const defaultHost = ts.createCompilerHost(compilerOptions);
|
|
51
|
+
const host = {
|
|
52
|
+
...defaultHost,
|
|
53
|
+
getSourceFile: (n, target) => {
|
|
54
|
+
if (n === fileName) return sourceFile;
|
|
55
|
+
return defaultHost.getSourceFile(n, target);
|
|
56
|
+
},
|
|
57
|
+
writeFile: () => {
|
|
58
|
+
},
|
|
59
|
+
fileExists: (n) => n === fileName || defaultHost.fileExists(n),
|
|
60
|
+
readFile: (n) => n === fileName ? code : defaultHost.readFile(n)
|
|
61
|
+
};
|
|
62
|
+
const program = ts.createProgram([fileName], compilerOptions, host);
|
|
63
|
+
const diagnostics = [
|
|
64
|
+
...program.getSyntacticDiagnostics(sourceFile),
|
|
65
|
+
...program.getSemanticDiagnostics(sourceFile)
|
|
66
|
+
];
|
|
67
|
+
if (diagnostics.length === 0) return null;
|
|
68
|
+
const formatted = diagnostics.slice(0, 5).map((d) => {
|
|
69
|
+
const msg = ts.flattenDiagnosticMessageText(d.messageText, "\n");
|
|
70
|
+
const pos = d.file && d.start !== void 0 ? d.file.getLineAndCharacterOfPosition(d.start) : null;
|
|
71
|
+
return pos ? `line ${pos.line + 1}, col ${pos.character + 1}: ${msg}` : msg;
|
|
72
|
+
});
|
|
73
|
+
return formatted.join("; ");
|
|
74
|
+
} catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const PROMPT_VERSION = "9.2.0";
|
|
20
79
|
function cacheKey(step, modelName, operationName, functionName, inputs) {
|
|
21
80
|
const payload = JSON.stringify({ step, modelName, operationName, functionName, inputs: [...inputs].sort(), v: PROMPT_VERSION });
|
|
22
81
|
return createHash("sha256").update(payload).digest("hex").slice(0, 16);
|
|
@@ -124,8 +183,33 @@ async function generateAiBehaviorsFile(opts) {
|
|
|
124
183
|
let cacheHits = 0;
|
|
125
184
|
let cacheMisses = 0;
|
|
126
185
|
for (const { functionName, step, operationName, parameterNames, inputs, returns, modelName } of unmatchedFunctions) {
|
|
127
|
-
const
|
|
128
|
-
|
|
186
|
+
const stripLiteralsAndComments = (src) => {
|
|
187
|
+
return src.replace(/\/\*[\s\S]*?\*\//g, (m) => " ".repeat(m.length)).replace(/\/\/[^\n]*/g, (m) => " ".repeat(m.length)).replace(/(['"])(?:\\.|(?!\1).)*\1/g, (m) => m[0] + " ".repeat(m.length - 2) + m[0]).replace(/`(?:\\.|\$\{[^}]*\}|(?!`).)*`/g, (m) => "`" + " ".repeat(m.length - 2) + "`");
|
|
188
|
+
};
|
|
189
|
+
const bodyHandlesInputItself = (body2) => {
|
|
190
|
+
const codeOnly = stripLiteralsAndComments(body2);
|
|
191
|
+
if (/(?:const|let|var)\s*\{[^}]+\}\s*=\s*input\b/.test(codeOnly)) return true;
|
|
192
|
+
if (/(?:const|let|var)\s+[A-Za-z_$][\w$]*\s*=\s*input\.[A-Za-z_$][\w$]*/.test(codeOnly)) return true;
|
|
193
|
+
return false;
|
|
194
|
+
};
|
|
195
|
+
const isRealReference = (n, codeOnly) => {
|
|
196
|
+
const escaped = n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
197
|
+
const re = new RegExp(`(?<![A-Za-z0-9_$])${escaped}(?![A-Za-z0-9_$:])`, "g");
|
|
198
|
+
return re.test(codeOnly);
|
|
199
|
+
};
|
|
200
|
+
const buildSignatureAndDestructure = (body2) => {
|
|
201
|
+
if (inputs.length === 0) {
|
|
202
|
+
return { signature: "input: Record<string, never>", destructure: "" };
|
|
203
|
+
}
|
|
204
|
+
const codeOnly = stripLiteralsAndComments(body2);
|
|
205
|
+
const referenced = inputs.filter((n) => isRealReference(n, codeOnly));
|
|
206
|
+
const usesInputObject = /(?<![A-Za-z0-9_$])input(?![A-Za-z0-9_$])/.test(codeOnly);
|
|
207
|
+
const sigName = referenced.length > 0 || usesInputObject ? "input" : "_input";
|
|
208
|
+
const sig = `${sigName}: { ${inputs.map((n) => `${n}: any`).join("; ")} }`;
|
|
209
|
+
const bodyAccessesInputProps = /(?<![A-Za-z0-9_$])input\.[A-Za-z_$]/.test(codeOnly);
|
|
210
|
+
const destructure = referenced.length > 0 && !bodyHandlesInputItself(body2) && !bodyAccessesInputProps ? ` const { ${referenced.join(", ")} } = input;` : "";
|
|
211
|
+
return { signature: sig, destructure };
|
|
212
|
+
};
|
|
129
213
|
let returnType = "any";
|
|
130
214
|
if (typeof returns === "string") {
|
|
131
215
|
returnType = returns;
|
|
@@ -140,9 +224,10 @@ async function generateAiBehaviorsFile(opts) {
|
|
|
140
224
|
const testCode = `export async function ${functionName}(input: any): Promise<any> {
|
|
141
225
|
${body}
|
|
142
226
|
}`;
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
227
|
+
const syntaxError = await validateTypeScript(testCode);
|
|
228
|
+
const typeError = syntaxError ? null : await validateTypeScriptTypes(testCode);
|
|
229
|
+
if (syntaxError || typeError) {
|
|
230
|
+
console.warn(` [ai-validate] cached ${functionName} failed validation: ${syntaxError || typeError}`);
|
|
146
231
|
body = null;
|
|
147
232
|
source = "STUB";
|
|
148
233
|
} else {
|
|
@@ -168,16 +253,65 @@ ${body}
|
|
|
168
253
|
const testCode = `export async function ${functionName}(input: any): Promise<any> {
|
|
169
254
|
${body}
|
|
170
255
|
}`;
|
|
171
|
-
const
|
|
172
|
-
if (
|
|
173
|
-
console.warn(` [ai-validate] ${functionName} has syntax error: ${
|
|
174
|
-
body = `// AI-generated code failed validation: ${
|
|
256
|
+
const syntaxError = await validateTypeScript(testCode);
|
|
257
|
+
if (syntaxError) {
|
|
258
|
+
console.warn(` [ai-validate] ${functionName} has syntax error: ${syntaxError}`);
|
|
259
|
+
body = `// AI-generated code failed validation: ${syntaxError}
|
|
175
260
|
// Step: ${step}
|
|
176
261
|
throw new Error('AI behavior has invalid syntax \u2014 see comment above');`;
|
|
177
262
|
source = "AI-INVALID";
|
|
178
263
|
} else {
|
|
179
|
-
|
|
180
|
-
|
|
264
|
+
const typeError = await validateTypeScriptTypes(testCode);
|
|
265
|
+
if (typeError) {
|
|
266
|
+
console.warn(` [ai-validate] ${functionName} type errors: ${typeError}`);
|
|
267
|
+
try {
|
|
268
|
+
const retryHint = `Your previous output produced TypeScript type errors:
|
|
269
|
+
${typeError}
|
|
270
|
+
|
|
271
|
+
Fix these specifically \u2014 common causes:
|
|
272
|
+
- RegExp match indices are 'string | undefined'; use non-null assertion or extract to a typed variable
|
|
273
|
+
- Strict null checks: guard or assert before use
|
|
274
|
+
- Don't declare locals you never reference
|
|
275
|
+
|
|
276
|
+
IMPORTANT: The destructure line \`const { ... } = input;\` is added by the wrapper, NOT by you. Output ONLY the function body that goes AFTER that line \u2014 do not repeat the destructure or you will produce duplicate-declaration errors.`;
|
|
277
|
+
const retried = await aiService.generateBehavior({
|
|
278
|
+
step: `${step}
|
|
279
|
+
|
|
280
|
+
${retryHint}`,
|
|
281
|
+
modelName,
|
|
282
|
+
operationName,
|
|
283
|
+
functionName,
|
|
284
|
+
parameterNames: inputs,
|
|
285
|
+
availableModels,
|
|
286
|
+
spec,
|
|
287
|
+
returnType
|
|
288
|
+
});
|
|
289
|
+
if (retried) {
|
|
290
|
+
const retryCode = `export async function ${functionName}(input: any): Promise<any> {
|
|
291
|
+
${retried}
|
|
292
|
+
}`;
|
|
293
|
+
const retrySyntaxError = await validateTypeScript(retryCode);
|
|
294
|
+
const retryTypeError = retrySyntaxError ? null : await validateTypeScriptTypes(retryCode);
|
|
295
|
+
if (!retrySyntaxError && !retryTypeError) {
|
|
296
|
+
body = retried;
|
|
297
|
+
source = "AI-GENERATED";
|
|
298
|
+
cacheWrite(key, body);
|
|
299
|
+
} else {
|
|
300
|
+
source = "AI-INVALID";
|
|
301
|
+
cacheWrite(key, body);
|
|
302
|
+
}
|
|
303
|
+
} else {
|
|
304
|
+
source = "AI-INVALID";
|
|
305
|
+
cacheWrite(key, body);
|
|
306
|
+
}
|
|
307
|
+
} catch {
|
|
308
|
+
source = "AI-INVALID";
|
|
309
|
+
cacheWrite(key, body);
|
|
310
|
+
}
|
|
311
|
+
} else {
|
|
312
|
+
source = "AI-GENERATED";
|
|
313
|
+
cacheWrite(key, body);
|
|
314
|
+
}
|
|
181
315
|
}
|
|
182
316
|
}
|
|
183
317
|
} catch {
|
|
@@ -204,8 +338,14 @@ ${inputsDoc}${returnsDoc} * Source: ${source}
|
|
|
204
338
|
* All data comes in via \`input\`; all effects happen in the calling controller.
|
|
205
339
|
* ${source === "AI-GENERATED" ? "AI-generated implementation. Review and test before deploying." : source === "AI-CACHED" ? "Restored from AI cache (.specverse/ai-cache/). Delete cache entry to regenerate." : source === "AI-INVALID" ? "AI returned code with syntax errors \u2014 function throws at runtime. Fix or regenerate." : "STUB \u2014 Claude CLI unavailable. Install Claude Code or implement manually."}
|
|
206
340
|
*/
|
|
207
|
-
export async function ${functionName}(${
|
|
208
|
-
|
|
341
|
+
export async function ${functionName}(${(() => {
|
|
342
|
+
const { signature: sig } = buildSignatureAndDestructure(body);
|
|
343
|
+
return sig;
|
|
344
|
+
})()}): Promise<${returnType}> {
|
|
345
|
+
${(() => {
|
|
346
|
+
const { destructure } = buildSignatureAndDestructure(body);
|
|
347
|
+
return destructure ? destructure + "\n" : "";
|
|
348
|
+
})()}${body}
|
|
209
349
|
}`);
|
|
210
350
|
}
|
|
211
351
|
if (aiService?.endSession) aiService.endSession();
|
|
@@ -220,27 +360,28 @@ ${destructure ? destructure + "\n" : ""}${body}
|
|
|
220
360
|
* These functions could not be generated from convention patterns.
|
|
221
361
|
* They are called by ${ownerName} when executing operations.
|
|
222
362
|
*
|
|
363
|
+
* PURE-FUNCTION CONTRACT \u2014 these bodies must NOT touch the database, the
|
|
364
|
+
* event bus, or any external service. Persistence and side effects happen
|
|
365
|
+
* in the calling controller; this file does pure transformations only.
|
|
366
|
+
*
|
|
223
367
|
* Options for each function:
|
|
224
368
|
* - Implement manually (recommended for business-critical logic)
|
|
225
369
|
* - Use AI generation: specverse ai generate <function>
|
|
226
370
|
* - Refactor the spec step to use a convention pattern
|
|
227
371
|
*
|
|
228
|
-
* Convention patterns that ARE auto-generated (no
|
|
229
|
-
*
|
|
230
|
-
* "
|
|
231
|
-
* "
|
|
232
|
-
* "
|
|
233
|
-
* "
|
|
234
|
-
* "
|
|
235
|
-
*
|
|
372
|
+
* Convention patterns that ARE auto-generated by the realize engine (no
|
|
373
|
+
* AI needed) \u2014 these are emitted inline in the controller, not here:
|
|
374
|
+
* "Find {Model} by {field}" \u2192 ORM-specific find call
|
|
375
|
+
* "Create {Model}" \u2192 ORM-specific create call
|
|
376
|
+
* "Update {Model} {field} to {value}"
|
|
377
|
+
* "Delete {Model}"
|
|
378
|
+
* "Transition {Model} to {state}"
|
|
379
|
+
* "Count {Model}s per {Group}"
|
|
380
|
+
* See the ORM's step-conventions module for the full list.
|
|
236
381
|
*
|
|
237
382
|
* Generated: ${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}
|
|
238
383
|
*/
|
|
239
384
|
|
|
240
|
-
import { PrismaClient } from '@prisma/client';
|
|
241
|
-
|
|
242
|
-
const prisma = new PrismaClient();
|
|
243
|
-
|
|
244
385
|
${functions.join("\n\n")}
|
|
245
386
|
`;
|
|
246
387
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../../src/realize/library/library.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAkD,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAA4B,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IAEvC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iCAAiC;IACjC,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,OAAO,CAAuB;;IAMtC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB9F;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../../src/realize/library/library.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,17 @@ export class InstanceFactoryLibrary {
|
|
|
48
48
|
// Sort by priority (highest first)
|
|
49
49
|
const sortedSources = [...sources].sort((a, b) => (b.priority || 0) - (a.priority || 0));
|
|
50
50
|
const result = await loadFromMultipleSources(sortedSources.map(s => ({ path: s.path })), { validate: true, ignoreInvalid: true });
|
|
51
|
+
// Surface validation errors as warnings so a malformed factory doesn't
|
|
52
|
+
// disappear without a trace. ignoreInvalid: true means we keep loading
|
|
53
|
+
// the other factories — but the user still needs to see WHY one was
|
|
54
|
+
// dropped (otherwise the symptom is a confusing "Unknown factory X" at
|
|
55
|
+
// the manifest stage with no hint that the yaml was rejected upstream).
|
|
56
|
+
if (result.errors && result.errors.length > 0) {
|
|
57
|
+
for (const err of result.errors) {
|
|
58
|
+
const lines = (err.errors || []).map(e => ` - ${e}`).join('\n');
|
|
59
|
+
console.warn(`⚠️ Skipped instance factory ${err.filePath}\n${lines}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
51
62
|
// Add to library
|
|
52
63
|
for (const loadResult of result.types) {
|
|
53
64
|
const name = loadResult.type.name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../../src/realize/library/library.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../../src/realize/library/library.ts"],"names":[],"mappings":"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"}
|
package/libs/instance-factories/applications/templates/generic/backend-package-json-generator.ts
CHANGED
|
@@ -1,15 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Backend Package.json Generator
|
|
3
3
|
*
|
|
4
|
-
* Generates package.json for backend workspace in monorepo
|
|
4
|
+
* Generates package.json for backend workspace in monorepo. Adapts deps +
|
|
5
|
+
* scripts to the manifest's resolved ORM/storage so a manifest pinning
|
|
6
|
+
* MongoDBNativeDriver doesn't get stuck with Prisma scripts and
|
|
7
|
+
* `@prisma/client` in dependencies.
|
|
5
8
|
*/
|
|
6
9
|
|
|
7
10
|
import type { TemplateContext } from '@specverse/types';
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
12
|
+
/** Read the manifest's resolved orm name (e.g. "PrismaORM", "MongoDBNativeDriver"). */
|
|
13
|
+
function resolveOrmName(manifest: any): string {
|
|
14
|
+
if (!manifest) return 'PrismaORM';
|
|
15
|
+
const inner = manifest.manifests
|
|
16
|
+
? Object.values(manifest.manifests)[0] as any
|
|
17
|
+
: manifest;
|
|
18
|
+
if (!inner) return 'PrismaORM';
|
|
19
|
+
// Prefer explicit capabilityMappings for orm.client; fall back to defaultMappings.orm.
|
|
20
|
+
const caps = Array.isArray(inner.capabilityMappings) ? inner.capabilityMappings : [];
|
|
21
|
+
const ormCap = caps.find((m: any) => m?.capability === 'orm.client') ||
|
|
22
|
+
caps.find((m: any) => m?.capability === 'orm.schema');
|
|
23
|
+
if (ormCap) return ormCap.implementation || ormCap.instanceFactory || 'PrismaORM';
|
|
24
|
+
return inner.defaultMappings?.orm || 'PrismaORM';
|
|
25
|
+
}
|
|
11
26
|
|
|
27
|
+
export default function generateBackendPackageJson(context: TemplateContext): string {
|
|
28
|
+
const { spec, manifest } = context as any;
|
|
12
29
|
const appName = (spec.metadata?.component || 'app').toLowerCase().replace(/\s+/g, '-');
|
|
30
|
+
const orm = resolveOrmName(manifest);
|
|
31
|
+
const isMongoNative = orm === 'MongoDBNativeDriver';
|
|
32
|
+
|
|
33
|
+
// Database scripts are ORM-specific. Prisma has db:setup/generate/push;
|
|
34
|
+
// MongoDB native has nothing to generate (collections are dynamic), so
|
|
35
|
+
// we drop those scripts entirely rather than emit no-op placeholders.
|
|
36
|
+
const dbScripts: Record<string, string> = isMongoNative
|
|
37
|
+
? {}
|
|
38
|
+
: {
|
|
39
|
+
'db:setup': 'prisma generate && prisma db push',
|
|
40
|
+
'db:generate': 'prisma generate',
|
|
41
|
+
'db:push': 'prisma db push',
|
|
42
|
+
'db:migrate': 'prisma migrate dev',
|
|
43
|
+
'db:studio': 'prisma studio',
|
|
44
|
+
'db:seed': 'tsx prisma/seed.ts',
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const ormDeps: Record<string, string> = isMongoNative
|
|
48
|
+
? { 'mongodb': '^6.3.0' }
|
|
49
|
+
: { '@prisma/client': '^5.7.0' };
|
|
50
|
+
|
|
51
|
+
const ormDevDeps: Record<string, string> = isMongoNative
|
|
52
|
+
? {}
|
|
53
|
+
: { 'prisma': '^5.7.0' };
|
|
13
54
|
|
|
14
55
|
const pkg: Record<string, any> = {
|
|
15
56
|
name: `${appName}-backend`,
|
|
@@ -32,13 +73,8 @@ export default function generateBackendPackageJson(context: TemplateContext): st
|
|
|
32
73
|
// Production
|
|
33
74
|
'start': 'node dist/main.js',
|
|
34
75
|
|
|
35
|
-
// Database
|
|
36
|
-
|
|
37
|
-
'db:generate': 'prisma generate',
|
|
38
|
-
'db:push': 'prisma db push',
|
|
39
|
-
'db:migrate': 'prisma migrate dev',
|
|
40
|
-
'db:studio': 'prisma studio',
|
|
41
|
-
'db:seed': 'tsx prisma/seed.ts',
|
|
76
|
+
// Database (ORM-specific; empty for native driver)
|
|
77
|
+
...dbScripts,
|
|
42
78
|
|
|
43
79
|
// Testing
|
|
44
80
|
'test': 'vitest run --passWithNoTests',
|
|
@@ -54,7 +90,7 @@ export default function generateBackendPackageJson(context: TemplateContext): st
|
|
|
54
90
|
},
|
|
55
91
|
|
|
56
92
|
dependencies: {
|
|
57
|
-
|
|
93
|
+
...ormDeps,
|
|
58
94
|
'fastify': '^5.8.3',
|
|
59
95
|
'@fastify/cors': '^10.0.0',
|
|
60
96
|
'@fastify/helmet': '^12.0.0',
|
|
@@ -70,7 +106,7 @@ export default function generateBackendPackageJson(context: TemplateContext): st
|
|
|
70
106
|
'typescript': '^5.3.0',
|
|
71
107
|
'@types/node': '^20.10.0',
|
|
72
108
|
'tsx': '^4.7.0',
|
|
73
|
-
|
|
109
|
+
...ormDevDeps,
|
|
74
110
|
'vitest': '^3.0.0',
|
|
75
111
|
'@vitest/coverage-v8': '^3.0.0',
|
|
76
112
|
'eslint': '^9.0.0',
|
|
@@ -59,7 +59,7 @@ export default function generateFastifyServer(context: TemplateContext): string
|
|
|
59
59
|
// workspace before running the script.
|
|
60
60
|
import { config as loadEnv } from 'dotenv';
|
|
61
61
|
import { existsSync } from 'fs';
|
|
62
|
-
import {
|
|
62
|
+
import { dirname, join } from 'path';
|
|
63
63
|
import { fileURLToPath } from 'url';
|
|
64
64
|
{
|
|
65
65
|
let dir = dirname(fileURLToPath(import.meta.url));
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
name: MongoDBNativeDriver
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
category: service
|
|
4
|
+
description: "Business logic services using the native MongoDB driver for collection access (no ORM layer)"
|
|
5
|
+
|
|
6
|
+
metadata:
|
|
7
|
+
author: "SpecVerse Team"
|
|
8
|
+
license: "MIT"
|
|
9
|
+
tags: [services, business-logic, mongodb, native-driver, controllers]
|
|
10
|
+
|
|
11
|
+
compatibility:
|
|
12
|
+
specverse: ">=5.0.0"
|
|
13
|
+
node: ">=18.0.0"
|
|
14
|
+
|
|
15
|
+
# With the MongoDB native driver, collection access IS the data layer — there
|
|
16
|
+
# is no ORM layer to swap in independently. So this single factory provides
|
|
17
|
+
# both the "orm.client" capability AND the service-layer capabilities.
|
|
18
|
+
capabilities:
|
|
19
|
+
provides:
|
|
20
|
+
- "orm.schema" # Emits the MongoDB client connector (the client IS the schema layer)
|
|
21
|
+
- "orm.client"
|
|
22
|
+
- "orm.mongodb.native"
|
|
23
|
+
- "service.controller"
|
|
24
|
+
- "service.business"
|
|
25
|
+
- "service.crud"
|
|
26
|
+
requires:
|
|
27
|
+
- "storage.database.document"
|
|
28
|
+
|
|
29
|
+
technology:
|
|
30
|
+
runtime: "node"
|
|
31
|
+
language: "typescript"
|
|
32
|
+
orm: "mongodb-native"
|
|
33
|
+
version: "^6.0.0"
|
|
34
|
+
|
|
35
|
+
dependencies:
|
|
36
|
+
runtime:
|
|
37
|
+
- name: "mongodb"
|
|
38
|
+
version: "^6.3.0"
|
|
39
|
+
|
|
40
|
+
dev:
|
|
41
|
+
- name: "@types/node"
|
|
42
|
+
version: "^20.8.0"
|
|
43
|
+
- name: "typescript"
|
|
44
|
+
version: "^5.2.0"
|
|
45
|
+
|
|
46
|
+
codeTemplates:
|
|
47
|
+
# `schema` is the orm.schema-capability slot the realize engine drives for
|
|
48
|
+
# ORM-side artifacts. With Prisma this emits `schema.prisma`; with the
|
|
49
|
+
# MongoDB native driver there is no separate db-schema artifact, so this
|
|
50
|
+
# slot emits the singleton client connector instead — same intent
|
|
51
|
+
# ("how does the app reach the data layer"), different physical output.
|
|
52
|
+
schema:
|
|
53
|
+
engine: typescript
|
|
54
|
+
generator: "libs/instance-factories/services/templates/mongodb-native/client-generator.ts"
|
|
55
|
+
outputPattern: "{backendDir}/src/db/mongoClient.ts"
|
|
56
|
+
|
|
57
|
+
controllers:
|
|
58
|
+
engine: typescript
|
|
59
|
+
generator: "libs/instance-factories/services/templates/mongodb-native/controller-generator.ts"
|
|
60
|
+
outputPattern: "{backendDir}/src/controllers/{model}Controller.ts"
|
|
61
|
+
|
|
62
|
+
services:
|
|
63
|
+
engine: typescript
|
|
64
|
+
generator: "libs/instance-factories/services/templates/mongodb-native/service-generator.ts"
|
|
65
|
+
outputPattern: "{backendDir}/src/services/{service}.ts"
|
|
66
|
+
|
|
67
|
+
configuration:
|
|
68
|
+
outputStructure: "monorepo"
|
|
69
|
+
backendDir: "backend"
|
|
70
|
+
collectionNaming: "lowercase-pluralized" # User → users, OrderItem → orderitems
|
|
71
|
+
validation: true
|
|
72
|
+
eventPublishing: true
|
|
73
|
+
errorHandling: "throw"
|
|
74
|
+
|
|
75
|
+
requirements:
|
|
76
|
+
dependencies:
|
|
77
|
+
npm:
|
|
78
|
+
dependencies:
|
|
79
|
+
"mongodb": "^6.3.0"
|
|
80
|
+
environment:
|
|
81
|
+
- name: "MONGODB_URI"
|
|
82
|
+
description: "MongoDB connection string (e.g. mongodb://localhost:27017/myapp)"
|
|
83
|
+
required: true
|
|
84
|
+
configuration: {}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression tests for the MongoDB native driver controller generator (TODO #43).
|
|
3
|
+
*
|
|
4
|
+
* Pins the generator's output for the headline shapes:
|
|
5
|
+
* - CURVED ops emit native-driver collection access (insertOne, findOne,
|
|
6
|
+
* updateOne, deleteOne, find().toArray())
|
|
7
|
+
* - Lifecycle transitions decode flow shorthand and emit a transition map
|
|
8
|
+
* (the buildTransitionMap path was the bug that hid `pending -> done`
|
|
9
|
+
* from evolve before #43)
|
|
10
|
+
* - Controller surfaces compile cleanly under strict-ish tsc (smoke is
|
|
11
|
+
* the realize harness; this file pins shape, not full compilation)
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect } from 'vitest';
|
|
14
|
+
import generateMongoNativeController from '../controller-generator.js';
|
|
15
|
+
|
|
16
|
+
const baseModel = {
|
|
17
|
+
name: 'Todo',
|
|
18
|
+
attributes: {
|
|
19
|
+
id: { name: 'id', type: 'UUID', required: true, auto: 'uuid4' },
|
|
20
|
+
title: { name: 'title', type: 'String', required: true },
|
|
21
|
+
completed: { name: 'completed', type: 'Boolean', default: false },
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const baseController = {
|
|
26
|
+
name: 'TodoController',
|
|
27
|
+
description: 'Controller for Todo',
|
|
28
|
+
cured: { create: true, retrieve: true, update: true, evolve: true, delete: true },
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
describe('MongoDB native — controller-generator', () => {
|
|
32
|
+
it('emits all CURVED ops via collection access', () => {
|
|
33
|
+
const out = generateMongoNativeController({
|
|
34
|
+
controller: baseController,
|
|
35
|
+
model: baseModel,
|
|
36
|
+
} as any);
|
|
37
|
+
expect(out).toContain(`COLLECTION_NAME = 'todos'`);
|
|
38
|
+
expect(out).toContain('insertOne');
|
|
39
|
+
expect(out).toContain('findOne');
|
|
40
|
+
expect(out).toContain('updateOne');
|
|
41
|
+
expect(out).toContain('deleteOne');
|
|
42
|
+
expect(out).toContain('cursor.toArray');
|
|
43
|
+
expect(out).not.toContain('PrismaClient');
|
|
44
|
+
expect(out).not.toContain('prisma.');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('parses ObjectId-shaped ids and falls through for UUID/string ids', () => {
|
|
48
|
+
const out = generateMongoNativeController({
|
|
49
|
+
controller: baseController,
|
|
50
|
+
model: baseModel,
|
|
51
|
+
} as any);
|
|
52
|
+
expect(out).toContain(`/^[a-fA-F0-9]{24}$/.test(id)`);
|
|
53
|
+
expect(out).toContain('new ObjectId(id)');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('emits lifecycle transition map even when spec used `flow:` shorthand only', () => {
|
|
57
|
+
// Regression: pre-fix, lifecycle.states was undefined when the spec
|
|
58
|
+
// declared only `flow: "pending -> done"` (states are derived at parse-
|
|
59
|
+
// time, but the inferred YAML keeps the flow string). The evolve gate
|
|
60
|
+
// skipped the transition check because `states.length > 0` was false.
|
|
61
|
+
const out = generateMongoNativeController({
|
|
62
|
+
controller: baseController,
|
|
63
|
+
model: {
|
|
64
|
+
...baseModel,
|
|
65
|
+
lifecycles: { status: { name: 'status', flow: 'pending -> done' } },
|
|
66
|
+
},
|
|
67
|
+
} as any);
|
|
68
|
+
expect(out).toContain('public async evolve(');
|
|
69
|
+
expect(out).toContain('"pending":["done"]');
|
|
70
|
+
expect(out).toContain('Invalid transition');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('emits a working multi-state transition map for explicit states', () => {
|
|
74
|
+
const out = generateMongoNativeController({
|
|
75
|
+
controller: baseController,
|
|
76
|
+
model: {
|
|
77
|
+
...baseModel,
|
|
78
|
+
lifecycles: {
|
|
79
|
+
status: {
|
|
80
|
+
name: 'status',
|
|
81
|
+
states: ['draft', 'open', 'closed'],
|
|
82
|
+
transitions: { open: 'draft -> open', close: 'open -> closed' },
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
} as any);
|
|
87
|
+
expect(out).toContain('"draft":["open"]');
|
|
88
|
+
expect(out).toContain('"open":["closed"]');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('uses model.storage.collection override when present', () => {
|
|
92
|
+
const out = generateMongoNativeController({
|
|
93
|
+
controller: baseController,
|
|
94
|
+
model: { ...baseModel, storage: { collection: 'custom_todos' } },
|
|
95
|
+
} as any);
|
|
96
|
+
expect(out).toContain(`COLLECTION_NAME = 'custom_todos'`);
|
|
97
|
+
// CURVED ops reference the constant, not the literal — keeps the
|
|
98
|
+
// generator output noUnusedLocals-clean under strict tsc.
|
|
99
|
+
expect(out).toContain(`getCollection(COLLECTION_NAME)`);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('omits CURVED ops not declared on the controller', () => {
|
|
103
|
+
const out = generateMongoNativeController({
|
|
104
|
+
controller: { ...baseController, cured: { retrieve: true } },
|
|
105
|
+
model: baseModel,
|
|
106
|
+
} as any);
|
|
107
|
+
expect(out).toContain('public async retrieve(');
|
|
108
|
+
expect(out).not.toContain('public async create(');
|
|
109
|
+
expect(out).not.toContain('public async update(');
|
|
110
|
+
expect(out).not.toContain('public async delete(');
|
|
111
|
+
expect(out).not.toContain('public async evolve(');
|
|
112
|
+
});
|
|
113
|
+
});
|