@specverse/engines 6.34.0 → 6.35.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.
@@ -170,10 +170,13 @@ function inferLogicFromOperationName(context) {
170
170
  return ` // TODO: Implement ${op}
171
171
  return { success: true };`;
172
172
  }
173
+ function escapeForBacktick(text) {
174
+ return text.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
175
+ }
173
176
  function generatePostconditionVerification(postconditions) {
174
177
  if (postconditions.length === 0) return "";
175
178
  const checks = postconditions.map(
176
- (pc) => ` console.assert(true, 'POSTCONDITION: ${pc}');`
179
+ (pc) => ` console.assert(true, \`POSTCONDITION: ${escapeForBacktick(pc)}\`);`
177
180
  );
178
181
  return ` // === POSTCONDITIONS (dev-mode) ===
179
182
  if (process.env.NODE_ENV === 'development') {
@@ -40,39 +40,8 @@
40
40
  * content shape — Phase 3 work).
41
41
  */
42
42
  import type { runPrompt as runPromptFn } from '../ai/prompt-runner.js';
43
- /** Mirror of `SharedStepContext` (libs/_shared/step-matching.ts:33). */
44
- export interface SharedStepContext {
45
- modelName: string;
46
- serviceName: string;
47
- operationName: string;
48
- stepNum: number;
49
- parameterNames?: string[];
50
- declaredVars?: Set<string>;
51
- resultName?: string;
52
- }
53
- /** Mirror of `SharedConvention` (libs/_shared/step-matching.ts:43). */
54
- export interface SharedConvention<C extends SharedStepContext = SharedStepContext> {
55
- name: string;
56
- pattern: RegExp;
57
- generateCall: (match: RegExpMatchArray, ctx: C) => string;
58
- generateMethod?: (match: RegExpMatchArray, ctx: C) => string;
59
- }
60
- /** Mirror of `MatchResult` (libs/_shared/step-matching.ts:54). */
61
- export interface MatchResult {
62
- matched: boolean;
63
- call: string;
64
- helperMethod?: string;
65
- functionName?: string;
66
- inputs?: string[];
67
- resultVar?: string;
68
- }
69
- /**
70
- * Signature of the shared step matcher
71
- * (`engines/libs/instance-factories/services/templates/_shared/step-matching.ts`).
72
- * Re-declared here so the emitter doesn't have to static-import the
73
- * libs path (which is outside `rootDir: 'src'`).
74
- */
75
- export type MatcherFn = <C extends SharedStepContext>(step: string, ctx: C, conventions: ReadonlyArray<SharedConvention<C>>, aiArgsExpr: (inputs: string[], paramNames: string[]) => string) => MatchResult;
43
+ export type { SharedStepContext, SharedConvention, MatchResult, MatcherFn, } from '@specverse/types';
44
+ import type { SharedStepContext, SharedConvention, MatchResult, MatcherFn } from '@specverse/types';
76
45
  /**
77
46
  * The unit of work the emitter is asked to fill. A spec-derived view of
78
47
  * an action / operation. Mirrors the AST `ExecutablePropertiesSpec`
@@ -1 +1 @@
1
- {"version":3,"file":"per-action-emitter.d.ts","sourceRoot":"","sources":["../../src/realize/per-action-emitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"per-action-emitter.d.ts","sourceRoot":"","sources":["../../src/realize/per-action-emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAMvE,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,SAAS,EACV,MAAM,kBAAkB,CAAC;AAE1B;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,SAAS,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;IAC9C,uEAAuE;IACvE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACjE;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IAChE;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5E;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,2EAA2E;IAC3E,cAAc,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC1C;;;;OAIG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,WAAW,CAAC;CACxC;AAoED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,WAAW,EAAE,GAC5B,MAAM,CAgBR;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,GACxC,MAAM,CA6BR;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,CAwCjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"per-action-emitter.js","sourceRoot":"","sources":["../../src/realize/per-action-emitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"per-action-emitter.js","sourceRoot":"","sources":["../../src/realize/per-action-emitter.ts"],"names":[],"mappings":"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"}
@@ -30,35 +30,17 @@ export function toVar(name: string): string {
30
30
  return name.charAt(0).toLowerCase() + name.slice(1);
31
31
  }
32
32
 
33
- export interface SharedStepContext {
34
- modelName: string;
35
- serviceName: string;
36
- operationName: string;
37
- stepNum: number;
38
- parameterNames?: string[];
39
- declaredVars?: Set<string>;
40
- resultName?: string;
41
- }
42
-
43
- export interface SharedConvention<C extends SharedStepContext = SharedStepContext> {
44
- name: string;
45
- pattern: RegExp;
46
- /** Emit inline code for this step. Return empty string to signal
47
- * "regex matched but I can't safely emit" (caller falls through to AI). */
48
- generateCall: (match: RegExpMatchArray, ctx: C) => string;
49
- /** Optional helper-method body that some libraries (e.g. prisma's
50
- * `check {condition}` convention) emit alongside the call site. */
51
- generateMethod?: (match: RegExpMatchArray, ctx: C) => string;
52
- }
53
-
54
- export interface MatchResult {
55
- matched: boolean;
56
- call: string;
57
- helperMethod?: string;
58
- functionName?: string;
59
- inputs?: string[];
60
- resultVar?: string;
61
- }
33
+ // #54 (2026-05-10): SharedStepContext, SharedConvention, MatchResult
34
+ // and MatcherFn are now canonical in @specverse/types. Re-exported here
35
+ // so existing dynamic-import call sites that grab types from this path
36
+ // keep working. New code should import directly from @specverse/types.
37
+ export type {
38
+ SharedStepContext,
39
+ SharedConvention,
40
+ MatchResult,
41
+ MatcherFn,
42
+ } from '@specverse/types';
43
+ import type { SharedStepContext, SharedConvention, MatchResult } from '@specverse/types';
62
44
 
63
45
  // ── Audit-trail recorder hook ──────────────────────────────────────────
64
46
  // Forward-logging discipline (engines 6.22.0+): the matcher records every
@@ -0,0 +1,85 @@
1
+ /**
2
+ * behavior-generator.ts — postcondition emission tests (#53D).
3
+ *
4
+ * The generator emits one `console.assert(true, '<text>');` line per
5
+ * postcondition string in the dev-mode block. Pre-#53D the wrapper was
6
+ * single-quoted; postcondition text containing apostrophes — common in
7
+ * natural prose like "no other nodes' cache entries are affected" —
8
+ * terminated the JS string and esbuild rejected the file.
9
+ *
10
+ * #53D fix: emit with backticks + escape any backticks / `${` markers
11
+ * in the source. These tests pin the new shape so a future change
12
+ * can't silently regress to single-quoted strings.
13
+ */
14
+
15
+ import { describe, it, expect } from 'vitest';
16
+ import { generatePostconditionVerification } from '../behavior-generator.js';
17
+
18
+ describe('generatePostconditionVerification — 53D apostrophe handling', () => {
19
+ it('returns empty string for empty input', () => {
20
+ expect(generatePostconditionVerification([])).toBe('');
21
+ });
22
+
23
+ it('emits backtick-wrapped strings (not single-quoted)', () => {
24
+ const out = generatePostconditionVerification(['simple postcondition']);
25
+ expect(out).toContain('`POSTCONDITION: simple postcondition`');
26
+ expect(out).not.toContain("'POSTCONDITION:");
27
+ });
28
+
29
+ it('preserves apostrophes verbatim in postcondition text', () => {
30
+ const out = generatePostconditionVerification([
31
+ "no other nodes' cache entries are affected",
32
+ ]);
33
+ expect(out).toContain("nodes' cache entries");
34
+ // Must not have escaped the apostrophe — backticks accept it natively.
35
+ expect(out).not.toContain("nodes\\'");
36
+ });
37
+
38
+ it('escapes embedded backticks to prevent string termination', () => {
39
+ const out = generatePostconditionVerification([
40
+ 'value matches `expected` shape',
41
+ ]);
42
+ expect(out).toContain('value matches \\`expected\\` shape');
43
+ });
44
+
45
+ it('escapes ${...} interpolation markers to prevent template execution', () => {
46
+ const out = generatePostconditionVerification([
47
+ 'rejects ${malicious} payloads',
48
+ ]);
49
+ expect(out).toContain('rejects \\${malicious} payloads');
50
+ // The marker must NOT appear unescaped — that would let the spec
51
+ // author smuggle template-literal interpolation into realized code.
52
+ expect(out).not.toMatch(/[^\\]\$\{malicious\}/);
53
+ });
54
+
55
+ it('escapes backslashes before other escapes (stable round-trip)', () => {
56
+ const out = generatePostconditionVerification(['regex \\d+ matches']);
57
+ expect(out).toContain('regex \\\\d+ matches');
58
+ });
59
+
60
+ it('emits one console.assert line per postcondition', () => {
61
+ const out = generatePostconditionVerification(['p1', 'p2', 'p3']);
62
+ const matches = out.match(/console\.assert\(true,/g);
63
+ expect(matches?.length).toBe(3);
64
+ });
65
+
66
+ it('wraps the assertion block in NODE_ENV development guard', () => {
67
+ const out = generatePostconditionVerification(['p1']);
68
+ expect(out).toContain("process.env.NODE_ENV === 'development'");
69
+ expect(out).toContain('// === POSTCONDITIONS (dev-mode) ===');
70
+ });
71
+
72
+ it('produces output that parses as valid JavaScript', async () => {
73
+ // The whole point of #53D — the emitted code must actually parse.
74
+ // Use Function() as a lightweight syntax-check (rejects malformed
75
+ // template literals just as esbuild would).
76
+ const realistic = generatePostconditionVerification([
77
+ "no other nodes' cache entries are affected",
78
+ 'response includes a `Last-Modified` header',
79
+ 'rejects ${oversized} payloads with 413',
80
+ ]);
81
+ // Wrap in a function body to give it a syntactic context.
82
+ const wrap = `(function() {\n${realistic}\n})`;
83
+ expect(() => new Function(`return ${wrap}`)).not.toThrow();
84
+ });
85
+ });
@@ -323,8 +323,28 @@ function inferLogicFromOperationName(context: BehaviorContext): string {
323
323
  return { success: true };`;
324
324
  }
325
325
 
326
+ /**
327
+ * Escape a postcondition string for safe inclusion in a JS template
328
+ * literal (backtick) — the only chars that can break a backtick string
329
+ * are unescaped backticks and `${` interpolation markers.
330
+ *
331
+ * Postcondition text comes verbatim from the spec author and frequently
332
+ * contains apostrophes (e.g. "no other nodes' cache entries are
333
+ * affected"). Pre-53D the emitter wrapped these in single quotes, so
334
+ * the apostrophe terminated the JS string and esbuild rejected the
335
+ * file. Switching to backticks + this escape closes that class.
336
+ */
337
+ function escapeForBacktick(text: string): string {
338
+ return text.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$\{/g, '\\${');
339
+ }
340
+
326
341
  /**
327
342
  * Generate postcondition verification (dev-mode assertions).
343
+ *
344
+ * 53D fix: emit with backtick template literals (not single quotes) so
345
+ * postconditions containing apostrophes — which the spec format
346
+ * encourages for natural prose — survive realize without breaking
347
+ * esbuild's parse.
328
348
  */
329
349
  export function generatePostconditionVerification(
330
350
  postconditions: string[]
@@ -332,7 +352,7 @@ export function generatePostconditionVerification(
332
352
  if (postconditions.length === 0) return '';
333
353
 
334
354
  const checks = postconditions.map(pc =>
335
- ` console.assert(true, 'POSTCONDITION: ${pc}');`
355
+ ` console.assert(true, \`POSTCONDITION: ${escapeForBacktick(pc)}\`);`
336
356
  );
337
357
 
338
358
  return ` // === POSTCONDITIONS (dev-mode) ===
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@specverse/engines",
3
- "version": "6.34.0",
3
+ "version": "6.35.0",
4
4
  "description": "SpecVerse toolchain — parser, inference, realize, generators, AI, registry, bundles",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -65,7 +65,7 @@
65
65
  "@specverse/engines": "^6.29.3",
66
66
  "@specverse/entities": "^5.4.0",
67
67
  "@specverse/runtime": "^5.0.1",
68
- "@specverse/types": "^5.1.0",
68
+ "@specverse/types": "^5.2.0",
69
69
  "ai": "^6.0.168",
70
70
  "ajv": "^8.17.0",
71
71
  "ajv-formats": "^2.1.0",