@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.
Files changed (19) hide show
  1. package/dist/libs/instance-factories/applications/templates/generic/backend-package-json-generator.js +26 -10
  2. package/dist/libs/instance-factories/controllers/templates/fastify/server-generator.js +1 -1
  3. package/dist/libs/instance-factories/services/mongodb-native-services.yaml +84 -0
  4. package/dist/libs/instance-factories/services/templates/mongodb-native/client-generator.js +43 -0
  5. package/dist/libs/instance-factories/services/templates/mongodb-native/controller-generator.js +252 -0
  6. package/dist/libs/instance-factories/services/templates/mongodb-native/service-generator.js +64 -0
  7. package/dist/libs/instance-factories/services/templates/prisma/ai-behaviors-generator.js +167 -26
  8. package/dist/realize/library/library.d.ts.map +1 -1
  9. package/dist/realize/library/library.js +11 -0
  10. package/dist/realize/library/library.js.map +1 -1
  11. package/libs/instance-factories/applications/templates/generic/backend-package-json-generator.ts +48 -12
  12. package/libs/instance-factories/controllers/templates/fastify/server-generator.ts +1 -1
  13. package/libs/instance-factories/services/mongodb-native-services.yaml +84 -0
  14. package/libs/instance-factories/services/templates/mongodb-native/__tests__/controller-generator.test.ts +113 -0
  15. package/libs/instance-factories/services/templates/mongodb-native/client-generator.ts +51 -0
  16. package/libs/instance-factories/services/templates/mongodb-native/controller-generator.ts +319 -0
  17. package/libs/instance-factories/services/templates/mongodb-native/service-generator.ts +83 -0
  18. package/libs/instance-factories/services/templates/prisma/ai-behaviors-generator.ts +231 -36
  19. package/package.json +4 -5
@@ -16,7 +16,66 @@ async function validateTypeScript(code) {
16
16
  return msg;
17
17
  }
18
18
  }
19
- const PROMPT_VERSION = "9.1.0";
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 signature = inputs.length > 0 ? `input: { ${inputs.map((n) => `${n}: any`).join("; ")} }` : "input: Record<string, never>";
128
- const destructure = inputs.length > 0 ? ` const { ${inputs.join(", ")} } = input;` : "";
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 validationError = await validateTypeScript(testCode);
144
- if (validationError) {
145
- console.warn(` [ai-validate] cached ${functionName} failed validation: ${validationError}`);
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 validationError = await validateTypeScript(testCode);
172
- if (validationError) {
173
- console.warn(` [ai-validate] ${functionName} has syntax error: ${validationError}`);
174
- body = `// AI-generated code failed validation: ${validationError}
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
- source = "AI-GENERATED";
180
- cacheWrite(key, body);
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}(${signature}): Promise<${returnType}> {
208
- ${destructure ? destructure + "\n" : ""}${body}
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 AI needed):
229
- * "Find {Model} by {field}" \u2192 prisma.model.findUniqueOrThrow(...)
230
- * "Create {Model}" \u2192 prisma.model.create(...)
231
- * "Update {Model} {field} to {value}" \u2192 prisma.model.update(...)
232
- * "Delete {Model}" \u2192 prisma.model.delete(...)
233
- * "Transition {Model} to {state}" \u2192 prisma.model.update({ status: ... })
234
- * "Count {Model}s per {Group}" \u2192 prisma.model.groupBy(...)
235
- * See step-conventions.ts for the full list.
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":"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"}
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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"}
@@ -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
- export default function generateBackendPackageJson(context: TemplateContext): string {
10
- const { spec } = context;
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
- 'db:setup': 'prisma generate && prisma db push',
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
- '@prisma/client': '^5.7.0',
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
- 'prisma': '^5.7.0',
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 { resolve as resolvePath, dirname, join } from 'path';
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
+ });