dopespec 0.0.1

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 (179) hide show
  1. package/README.md +195 -0
  2. package/bin/dopespec.mjs +26 -0
  3. package/dist/__tests__/codegen.test.d.ts +2 -0
  4. package/dist/__tests__/codegen.test.d.ts.map +1 -0
  5. package/dist/__tests__/codegen.test.js +713 -0
  6. package/dist/__tests__/codegen.test.js.map +1 -0
  7. package/dist/__tests__/e2e-proof.test.d.ts +2 -0
  8. package/dist/__tests__/e2e-proof.test.d.ts.map +1 -0
  9. package/dist/__tests__/e2e-proof.test.js +153 -0
  10. package/dist/__tests__/e2e-proof.test.js.map +1 -0
  11. package/dist/__tests__/schema.test.d.ts +2 -0
  12. package/dist/__tests__/schema.test.d.ts.map +1 -0
  13. package/dist/__tests__/schema.test.js +822 -0
  14. package/dist/__tests__/schema.test.js.map +1 -0
  15. package/dist/__tests__/type-errors.d.ts +2 -0
  16. package/dist/__tests__/type-errors.d.ts.map +1 -0
  17. package/dist/__tests__/type-errors.js +128 -0
  18. package/dist/__tests__/type-errors.js.map +1 -0
  19. package/dist/cli/generate.d.ts +2 -0
  20. package/dist/cli/generate.d.ts.map +1 -0
  21. package/dist/cli/generate.js +250 -0
  22. package/dist/cli/generate.js.map +1 -0
  23. package/dist/codegen/commands.d.ts +4 -0
  24. package/dist/codegen/commands.d.ts.map +1 -0
  25. package/dist/codegen/commands.js +25 -0
  26. package/dist/codegen/commands.js.map +1 -0
  27. package/dist/codegen/decisions-evaluate.d.ts +3 -0
  28. package/dist/codegen/decisions-evaluate.d.ts.map +1 -0
  29. package/dist/codegen/decisions-evaluate.js +50 -0
  30. package/dist/codegen/decisions-evaluate.js.map +1 -0
  31. package/dist/codegen/decisions-table.d.ts +3 -0
  32. package/dist/codegen/decisions-table.d.ts.map +1 -0
  33. package/dist/codegen/decisions-table.js +27 -0
  34. package/dist/codegen/decisions-table.js.map +1 -0
  35. package/dist/codegen/decisions-tests.d.ts +3 -0
  36. package/dist/codegen/decisions-tests.d.ts.map +1 -0
  37. package/dist/codegen/decisions-tests.js +43 -0
  38. package/dist/codegen/decisions-tests.js.map +1 -0
  39. package/dist/codegen/e2e-stubs.d.ts +4 -0
  40. package/dist/codegen/e2e-stubs.d.ts.map +1 -0
  41. package/dist/codegen/e2e-stubs.js +21 -0
  42. package/dist/codegen/e2e-stubs.js.map +1 -0
  43. package/dist/codegen/events.d.ts +8 -0
  44. package/dist/codegen/events.d.ts.map +1 -0
  45. package/dist/codegen/events.js +36 -0
  46. package/dist/codegen/events.js.map +1 -0
  47. package/dist/codegen/index.d.ts +18 -0
  48. package/dist/codegen/index.d.ts.map +1 -0
  49. package/dist/codegen/index.js +18 -0
  50. package/dist/codegen/index.js.map +1 -0
  51. package/dist/codegen/invariants.d.ts +4 -0
  52. package/dist/codegen/invariants.d.ts.map +1 -0
  53. package/dist/codegen/invariants.js +53 -0
  54. package/dist/codegen/invariants.js.map +1 -0
  55. package/dist/codegen/mermaid.d.ts +4 -0
  56. package/dist/codegen/mermaid.d.ts.map +1 -0
  57. package/dist/codegen/mermaid.js +21 -0
  58. package/dist/codegen/mermaid.js.map +1 -0
  59. package/dist/codegen/orchestrators.d.ts +7 -0
  60. package/dist/codegen/orchestrators.d.ts.map +1 -0
  61. package/dist/codegen/orchestrators.js +32 -0
  62. package/dist/codegen/orchestrators.js.map +1 -0
  63. package/dist/codegen/policy-index.d.ts +7 -0
  64. package/dist/codegen/policy-index.d.ts.map +1 -0
  65. package/dist/codegen/policy-index.js +40 -0
  66. package/dist/codegen/policy-index.js.map +1 -0
  67. package/dist/codegen/policy-mermaid.d.ts +7 -0
  68. package/dist/codegen/policy-mermaid.d.ts.map +1 -0
  69. package/dist/codegen/policy-mermaid.js +30 -0
  70. package/dist/codegen/policy-mermaid.js.map +1 -0
  71. package/dist/codegen/policy-tests.d.ts +8 -0
  72. package/dist/codegen/policy-tests.d.ts.map +1 -0
  73. package/dist/codegen/policy-tests.js +167 -0
  74. package/dist/codegen/policy-tests.js.map +1 -0
  75. package/dist/codegen/policy-validator.d.ts +8 -0
  76. package/dist/codegen/policy-validator.d.ts.map +1 -0
  77. package/dist/codegen/policy-validator.js +69 -0
  78. package/dist/codegen/policy-validator.js.map +1 -0
  79. package/dist/codegen/tests.d.ts +4 -0
  80. package/dist/codegen/tests.d.ts.map +1 -0
  81. package/dist/codegen/tests.js +125 -0
  82. package/dist/codegen/tests.js.map +1 -0
  83. package/dist/codegen/transitions.d.ts +4 -0
  84. package/dist/codegen/transitions.d.ts.map +1 -0
  85. package/dist/codegen/transitions.js +41 -0
  86. package/dist/codegen/transitions.js.map +1 -0
  87. package/dist/codegen/types.d.ts +4 -0
  88. package/dist/codegen/types.d.ts.map +1 -0
  89. package/dist/codegen/types.js +48 -0
  90. package/dist/codegen/types.js.map +1 -0
  91. package/dist/codegen/utils.d.ts +85 -0
  92. package/dist/codegen/utils.d.ts.map +1 -0
  93. package/dist/codegen/utils.js +357 -0
  94. package/dist/codegen/utils.js.map +1 -0
  95. package/dist/codegen/zod.d.ts +4 -0
  96. package/dist/codegen/zod.d.ts.map +1 -0
  97. package/dist/codegen/zod.js +32 -0
  98. package/dist/codegen/zod.js.map +1 -0
  99. package/dist/examples/generated/customer.types.d.ts +7 -0
  100. package/dist/examples/generated/customer.types.d.ts.map +1 -0
  101. package/dist/examples/generated/customer.types.js +2 -0
  102. package/dist/examples/generated/customer.types.js.map +1 -0
  103. package/dist/examples/generated/order.types.d.ts +9 -0
  104. package/dist/examples/generated/order.types.d.ts.map +1 -0
  105. package/dist/examples/generated/order.types.js +2 -0
  106. package/dist/examples/generated/order.types.js.map +1 -0
  107. package/dist/examples/generated/pet.types.d.ts +11 -0
  108. package/dist/examples/generated/pet.types.d.ts.map +1 -0
  109. package/dist/examples/generated/pet.types.js +2 -0
  110. package/dist/examples/generated/pet.types.js.map +1 -0
  111. package/dist/examples/pet-store.d.ts +137 -0
  112. package/dist/examples/pet-store.d.ts.map +1 -0
  113. package/dist/examples/pet-store.js +139 -0
  114. package/dist/examples/pet-store.js.map +1 -0
  115. package/dist/examples/src/customer.e2e.d.ts +2 -0
  116. package/dist/examples/src/customer.e2e.d.ts.map +1 -0
  117. package/dist/examples/src/customer.e2e.js +17 -0
  118. package/dist/examples/src/customer.e2e.js.map +1 -0
  119. package/dist/examples/src/customer.orchestrators.d.ts +5 -0
  120. package/dist/examples/src/customer.orchestrators.d.ts.map +1 -0
  121. package/dist/examples/src/customer.orchestrators.js +5 -0
  122. package/dist/examples/src/customer.orchestrators.js.map +1 -0
  123. package/dist/examples/src/order.e2e.d.ts +2 -0
  124. package/dist/examples/src/order.e2e.d.ts.map +1 -0
  125. package/dist/examples/src/order.e2e.js +22 -0
  126. package/dist/examples/src/order.e2e.js.map +1 -0
  127. package/dist/examples/src/order.orchestrators.d.ts +9 -0
  128. package/dist/examples/src/order.orchestrators.d.ts.map +1 -0
  129. package/dist/examples/src/order.orchestrators.js +10 -0
  130. package/dist/examples/src/order.orchestrators.js.map +1 -0
  131. package/dist/examples/src/pet.e2e.d.ts +2 -0
  132. package/dist/examples/src/pet.e2e.d.ts.map +1 -0
  133. package/dist/examples/src/pet.e2e.js +17 -0
  134. package/dist/examples/src/pet.e2e.js.map +1 -0
  135. package/dist/examples/src/pet.orchestrators.d.ts +8 -0
  136. package/dist/examples/src/pet.orchestrators.d.ts.map +1 -0
  137. package/dist/examples/src/pet.orchestrators.js +9 -0
  138. package/dist/examples/src/pet.orchestrators.js.map +1 -0
  139. package/dist/schema/actions.d.ts +37 -0
  140. package/dist/schema/actions.d.ts.map +1 -0
  141. package/dist/schema/actions.js +35 -0
  142. package/dist/schema/actions.js.map +1 -0
  143. package/dist/schema/constraints.d.ts +20 -0
  144. package/dist/schema/constraints.d.ts.map +1 -0
  145. package/dist/schema/constraints.js +15 -0
  146. package/dist/schema/constraints.js.map +1 -0
  147. package/dist/schema/decisions.d.ts +29 -0
  148. package/dist/schema/decisions.d.ts.map +1 -0
  149. package/dist/schema/decisions.js +56 -0
  150. package/dist/schema/decisions.js.map +1 -0
  151. package/dist/schema/index.d.ts +17 -0
  152. package/dist/schema/index.d.ts.map +1 -0
  153. package/dist/schema/index.js +8 -0
  154. package/dist/schema/index.js.map +1 -0
  155. package/dist/schema/model.d.ts +65 -0
  156. package/dist/schema/model.d.ts.map +1 -0
  157. package/dist/schema/model.js +30 -0
  158. package/dist/schema/model.js.map +1 -0
  159. package/dist/schema/policy.d.ts +25 -0
  160. package/dist/schema/policy.d.ts.map +1 -0
  161. package/dist/schema/policy.js +53 -0
  162. package/dist/schema/policy.js.map +1 -0
  163. package/dist/schema/props.d.ts +57 -0
  164. package/dist/schema/props.d.ts.map +1 -0
  165. package/dist/schema/props.js +53 -0
  166. package/dist/schema/props.js.map +1 -0
  167. package/dist/schema/relations.d.ts +9 -0
  168. package/dist/schema/relations.d.ts.map +1 -0
  169. package/dist/schema/relations.js +9 -0
  170. package/dist/schema/relations.js.map +1 -0
  171. package/dist/schema/transitions.d.ts +34 -0
  172. package/dist/schema/transitions.d.ts.map +1 -0
  173. package/dist/schema/transitions.js +25 -0
  174. package/dist/schema/transitions.js.map +1 -0
  175. package/dist/schema/types.d.ts +18 -0
  176. package/dist/schema/types.d.ts.map +1 -0
  177. package/dist/schema/types.js +11 -0
  178. package/dist/schema/types.js.map +1 -0
  179. package/package.json +55 -0
@@ -0,0 +1,27 @@
1
+ export const generateDecisionTable = (def) => {
2
+ const inputKeys = Object.keys(def.inputs);
3
+ const outputKeys = Object.keys(def.outputs);
4
+ const lines = [];
5
+ lines.push(`# ${def.name}`);
6
+ lines.push("");
7
+ // Header row
8
+ const headers = [...inputKeys, ...outputKeys.map((k) => `\u2192 ${k}`)];
9
+ lines.push(`| ${headers.join(" | ")} |`);
10
+ lines.push(`| ${headers.map(() => "---").join(" | ")} |`);
11
+ // Data rows
12
+ for (const rule of def.rules) {
13
+ const when = rule.when;
14
+ const then = rule.then;
15
+ const cells = [];
16
+ for (const key of inputKeys) {
17
+ cells.push(key in when ? String(when[key]) : "*");
18
+ }
19
+ for (const key of outputKeys) {
20
+ cells.push(String(then[key]));
21
+ }
22
+ lines.push(`| ${cells.join(" | ")} |`);
23
+ }
24
+ lines.push("");
25
+ return lines.join("\n");
26
+ };
27
+ //# sourceMappingURL=decisions-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisions-table.js","sourceRoot":"","sources":["../../src/codegen/decisions-table.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAgB,EAAU,EAAE;IAChE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,aAAa;IACb,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAExE,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE1D,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAA+B,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAA+B,CAAC;QAElD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DecisionDef } from "../schema/decisions.js";
2
+ export declare const generateDecisionTests: (def: DecisionDef) => string;
3
+ //# sourceMappingURL=decisions-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisions-tests.d.ts","sourceRoot":"","sources":["../../src/codegen/decisions-tests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAS1D,eAAO,MAAM,qBAAqB,GAAI,KAAK,WAAW,KAAG,MAqDxD,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { capitalize, defaultValueForProp, toKebabCase, valueToSource, } from "./utils.js";
2
+ export const generateDecisionTests = (def) => {
3
+ const name = capitalize(def.name);
4
+ const lower = toKebabCase(def.name);
5
+ const lines = [];
6
+ lines.push(`import { describe, it, expect } from 'vitest';`);
7
+ lines.push(`import { evaluate${name} } from './${lower}.evaluate.js';`);
8
+ lines.push("");
9
+ lines.push(`describe('${name}', () => {`);
10
+ for (const rule of def.rules) {
11
+ const when = rule.when;
12
+ const then = rule.then;
13
+ const whenDesc = Object.entries(when)
14
+ .map(([k, v]) => `${k} = ${JSON.stringify(v)}`)
15
+ .join(", ");
16
+ const thenDesc = Object.entries(then)
17
+ .map(([k, v]) => `${k} = ${JSON.stringify(v)}`)
18
+ .join(", ");
19
+ const whenLabel = whenDesc || "default (no conditions)";
20
+ lines.push(` it('when ${whenLabel}, then ${thenDesc}', () => {`);
21
+ // Build input — use when values for specified keys, defaults for rest
22
+ const inputParts = [];
23
+ for (const [key, prop] of Object.entries(def.inputs)) {
24
+ if (key in when) {
25
+ inputParts.push(`${key}: ${valueToSource(when[key])}`);
26
+ }
27
+ else {
28
+ inputParts.push(`${key}: ${defaultValueForProp(prop)}`);
29
+ }
30
+ }
31
+ lines.push(` const result = evaluate${name}({ ${inputParts.join(", ")} });`);
32
+ const expectedParts = Object.entries(then)
33
+ .map(([key, val]) => `${key}: ${valueToSource(val)}`)
34
+ .join(", ");
35
+ lines.push(` expect(result).toEqual({ ${expectedParts} });`);
36
+ lines.push(` });`);
37
+ lines.push("");
38
+ }
39
+ lines.push(`});`);
40
+ lines.push("");
41
+ return lines.join("\n");
42
+ };
43
+ //# sourceMappingURL=decisions-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisions-tests.js","sourceRoot":"","sources":["../../src/codegen/decisions-tests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ModelDef } from "../schema/model.js";
2
+ /** Generate E2E test stubs with TODOs from a model's transitions. */
3
+ export declare const generateE2EStubs: (model: ModelDef) => string;
4
+ //# sourceMappingURL=e2e-stubs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-stubs.d.ts","sourceRoot":"","sources":["../../src/codegen/e2e-stubs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,GAAI,OAAO,QAAQ,KAAG,MAyBlD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { capitalize, getTransitions } from "./utils.js";
2
+ /** Generate E2E test stubs with TODOs from a model's transitions. */
3
+ export const generateE2EStubs = (model) => {
4
+ const transitions = getTransitions(model);
5
+ if (transitions.length === 0)
6
+ return "";
7
+ const typeName = capitalize(model.name);
8
+ const lines = [];
9
+ lines.push(`import { test } from 'vitest';`);
10
+ lines.push("");
11
+ for (const [name, transition] of transitions) {
12
+ lines.push(`test('${typeName}: ${name} flow (${transition.from} → ${transition.to})', async () => {`);
13
+ lines.push(` // TODO: setup — create ${typeName} in '${transition.from}' state`);
14
+ lines.push(` // TODO: act — trigger ${name}`);
15
+ lines.push(` // TODO: assert — verify state is '${transition.to}'`);
16
+ lines.push(`});`);
17
+ lines.push("");
18
+ }
19
+ return lines.join("\n");
20
+ };
21
+ //# sourceMappingURL=e2e-stubs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-stubs.js","sourceRoot":"","sources":["../../src/codegen/e2e-stubs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExD,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAe,EAAU,EAAE;IAC1D,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CACR,SAAS,QAAQ,KAAK,IAAI,UAAU,UAAU,CAAC,IAAI,MAAM,UAAU,CAAC,EAAE,mBAAmB,CAC1F,CAAC;QACF,KAAK,CAAC,IAAI,CACR,6BAA6B,QAAQ,QAAQ,UAAU,CAAC,IAAI,SAAS,CACtE,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,wCAAwC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ModelDef } from "../schema/model.js";
2
+ /**
3
+ * Generate domain event types from a model's transitions.
4
+ * Generated code references ${Model}Props — expects types from ./${modelName}.types
5
+ * to be available (either concatenated or imported).
6
+ */
7
+ export declare const generateEvents: (model: ModelDef) => string;
8
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/codegen/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,QAAQ,KAAG,MAmChD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { capitalize, getTransitions } from "./utils.js";
2
+ /**
3
+ * Generate domain event types from a model's transitions.
4
+ * Generated code references ${Model}Props — expects types from ./${modelName}.types
5
+ * to be available (either concatenated or imported).
6
+ */
7
+ export const generateEvents = (model) => {
8
+ const transitions = getTransitions(model);
9
+ if (transitions.length === 0)
10
+ return "";
11
+ const typeName = capitalize(model.name);
12
+ const modelName = model.name.toLowerCase();
13
+ const propsType = `${typeName}Props`;
14
+ const lines = [];
15
+ const eventTypeNames = [];
16
+ // Convention: generated events file expects types from ./${modelName}.types
17
+ lines.push(`import type { ${propsType} } from './${modelName}.types.js';`);
18
+ lines.push("");
19
+ for (const [name, transition] of transitions) {
20
+ const eventName = `${typeName}${capitalize(name)}Event`;
21
+ eventTypeNames.push(eventName);
22
+ lines.push(`export type ${eventName} = {`);
23
+ lines.push(` type: '${typeName}${capitalize(name)}';`);
24
+ lines.push(` payload: ${propsType};`);
25
+ lines.push(` from: '${transition.from}';`);
26
+ lines.push(` to: '${transition.to}';`);
27
+ lines.push(` timestamp: Date;`);
28
+ lines.push(`};`);
29
+ lines.push("");
30
+ }
31
+ // Union type
32
+ lines.push(`export type ${typeName}Event = ${eventTypeNames.join(" | ")};`);
33
+ lines.push("");
34
+ return lines.join("\n");
35
+ };
36
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/codegen/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAe,EAAU,EAAE;IACxD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,GAAG,QAAQ,OAAO,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,4EAA4E;IAC5E,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,cAAc,SAAS,aAAa,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAExD,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE/B,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,MAAM,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,cAAc,SAAS,GAAG,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,aAAa;IACb,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,WAAW,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ export { generateCommands } from "./commands.js";
2
+ export { generateDecisionEvaluate } from "./decisions-evaluate.js";
3
+ export { generateDecisionTable } from "./decisions-table.js";
4
+ export { generateDecisionTests } from "./decisions-tests.js";
5
+ export { generateE2EStubs } from "./e2e-stubs.js";
6
+ export { generateEvents } from "./events.js";
7
+ export { generateInvariants } from "./invariants.js";
8
+ export { generateMermaid } from "./mermaid.js";
9
+ export { generateOrchestrators } from "./orchestrators.js";
10
+ export { generatePolicyIndex } from "./policy-index.js";
11
+ export { generatePolicyMermaid } from "./policy-mermaid.js";
12
+ export { generatePolicyTests } from "./policy-tests.js";
13
+ export { generatePolicyValidator } from "./policy-validator.js";
14
+ export { generateTests } from "./tests.js";
15
+ export { generateTransitions } from "./transitions.js";
16
+ export { generateTypes } from "./types.js";
17
+ export { generateZod } from "./zod.js";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,18 @@
1
+ export { generateCommands } from "./commands.js";
2
+ export { generateDecisionEvaluate } from "./decisions-evaluate.js";
3
+ export { generateDecisionTable } from "./decisions-table.js";
4
+ export { generateDecisionTests } from "./decisions-tests.js";
5
+ export { generateE2EStubs } from "./e2e-stubs.js";
6
+ export { generateEvents } from "./events.js";
7
+ export { generateInvariants } from "./invariants.js";
8
+ export { generateMermaid } from "./mermaid.js";
9
+ export { generateOrchestrators } from "./orchestrators.js";
10
+ export { generatePolicyIndex } from "./policy-index.js";
11
+ export { generatePolicyMermaid } from "./policy-mermaid.js";
12
+ export { generatePolicyTests } from "./policy-tests.js";
13
+ export { generatePolicyValidator } from "./policy-validator.js";
14
+ export { generateTests } from "./tests.js";
15
+ export { generateTransitions } from "./transitions.js";
16
+ export { generateTypes } from "./types.js";
17
+ export { generateZod } from "./zod.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ModelDef } from "../schema/model.js";
2
+ /** Generate invariant validation functions from a model's constraints. */
3
+ export declare const generateInvariants: (model: ModelDef) => string;
4
+ //# sourceMappingURL=invariants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../src/codegen/invariants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AASnD,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,GAAI,OAAO,QAAQ,KAAG,MA+DpD,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { capitalize, getConstraints, guardToSource, resolveGuardBody, } from "./utils.js";
2
+ /** Generate invariant validation functions from a model's constraints. */
3
+ export const generateInvariants = (model) => {
4
+ const constraints = getConstraints(model);
5
+ if (constraints.length === 0)
6
+ return "";
7
+ const typeName = capitalize(model.name);
8
+ const modelName = model.name.toLowerCase();
9
+ const propsType = `${typeName}Props`;
10
+ const lines = [];
11
+ const constraintNames = [];
12
+ // Convention: generated invariants module imports types from ./${modelName}.types
13
+ lines.push(`import type { ${propsType} } from './${modelName}.types.js';`);
14
+ lines.push("");
15
+ // Constraint semantics:
16
+ // rule().when(ctx => ctx.status === 'cancelled').prevent('addItem')
17
+ // guard returns TRUE → constraint is VIOLATED (action is prevented)
18
+ // guard returns FALSE → constraint is SATISFIED (action is allowed)
19
+ //
20
+ // Invariant semantics (inverted):
21
+ // validate*() returns TRUE → model is VALID (guard condition is NOT met)
22
+ // validate*() returns FALSE → model is INVALID (guard condition IS met)
23
+ //
24
+ // Therefore: invariant = !(guard)
25
+ for (const [name, constraint] of constraints) {
26
+ constraintNames.push(name);
27
+ const fnName = `validate${capitalize(name)}`;
28
+ lines.push(`export function ${fnName}(ctx: ${propsType}): boolean {`);
29
+ if (constraint.guard) {
30
+ const rawBody = guardToSource(constraint.guard);
31
+ const guardBody = resolveGuardBody(constraint.guard, rawBody, model);
32
+ lines.push(` // guard=true means violation, so invariant negates it`);
33
+ lines.push(` return !(${guardBody});`);
34
+ }
35
+ else {
36
+ lines.push(` return true;`);
37
+ }
38
+ lines.push(`}`);
39
+ lines.push("");
40
+ }
41
+ // Combined validator
42
+ lines.push(`export function validate${typeName}(ctx: ${propsType}): { valid: boolean; violations: string[] } {`);
43
+ lines.push(` const violations: string[] = [];`);
44
+ for (const name of constraintNames) {
45
+ const fnName = `validate${capitalize(name)}`;
46
+ lines.push(` if (!${fnName}(ctx)) violations.push('${name}');`);
47
+ }
48
+ lines.push(` return { valid: violations.length === 0, violations };`);
49
+ lines.push(`}`);
50
+ lines.push("");
51
+ return lines.join("\n");
52
+ };
53
+ //# sourceMappingURL=invariants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../src/codegen/invariants.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAe,EAAU,EAAE;IAC5D,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,GAAG,QAAQ,OAAO,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,kFAAkF;IAClF,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,cAAc,SAAS,aAAa,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,wBAAwB;IACxB,sEAAsE;IACtE,uEAAuE;IACvE,sEAAsE;IACtE,EAAE;IACF,kCAAkC;IAClC,4EAA4E;IAC5E,0EAA0E;IAC1E,EAAE;IACF,kCAAkC;IAElC,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7C,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,WAAW,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAE7C,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,SAAS,SAAS,cAAc,CAAC,CAAC;QAEtE,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAErE,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,cAAc,SAAS,IAAI,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,qBAAqB;IACrB,KAAK,CAAC,IAAI,CACR,2BAA2B,QAAQ,SAAS,SAAS,+CAA+C,CACrG,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,WAAW,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAE7C,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,2BAA2B,IAAI,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ModelDef } from "../schema/model.js";
2
+ /** Generate Mermaid stateDiagram from a model's transitions. */
3
+ export declare const generateMermaid: (model: ModelDef) => string;
4
+ //# sourceMappingURL=mermaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/codegen/mermaid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD,gEAAgE;AAChE,eAAO,MAAM,eAAe,GAAI,OAAO,QAAQ,KAAG,MAwBjD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { getLifecycleProp, getTransitions } from "./utils.js";
2
+ /** Generate Mermaid stateDiagram from a model's transitions. */
3
+ export const generateMermaid = (model) => {
4
+ const transitions = getTransitions(model);
5
+ if (transitions.length === 0)
6
+ return "";
7
+ const lifecycle = getLifecycleProp(model);
8
+ const lines = [];
9
+ lines.push(`stateDiagram-v2`);
10
+ // Initial state arrow
11
+ if (lifecycle && lifecycle.values.length > 0) {
12
+ lines.push(` [*] --> ${lifecycle.values[0]}`);
13
+ }
14
+ for (const [name, transition] of transitions) {
15
+ const label = transition.guard ? `${name} [guarded]` : name;
16
+ lines.push(` ${transition.from} --> ${transition.to}: ${label}`);
17
+ }
18
+ lines.push("");
19
+ return lines.join("\n");
20
+ };
21
+ //# sourceMappingURL=mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/codegen/mermaid.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE9D,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAe,EAAU,EAAE;IACzD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE9B,sBAAsB;IACtB,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAE5D,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,QAAQ,UAAU,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ModelDef } from "../schema/model.js";
2
+ /**
3
+ * Generate service orchestrator skeletons from a model's actions.
4
+ * @param policyActions — optional map of action → policy names for TODO comments
5
+ */
6
+ export declare const generateOrchestrators: (model: ModelDef, policyActions?: Map<string, string[]>) => string;
7
+ //# sourceMappingURL=orchestrators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrators.d.ts","sourceRoot":"","sources":["../../src/codegen/orchestrators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,QAAQ,EACf,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KACpC,MAqCF,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { capitalize, fieldsToTSType, getActions } from "./utils.js";
2
+ /**
3
+ * Generate service orchestrator skeletons from a model's actions.
4
+ * @param policyActions — optional map of action → policy names for TODO comments
5
+ */
6
+ export const generateOrchestrators = (model, policyActions) => {
7
+ const actions = getActions(model);
8
+ if (actions.length === 0)
9
+ return "";
10
+ const typeName = capitalize(model.name);
11
+ const modelName = model.name.toLowerCase();
12
+ const propsType = `${typeName}Props`;
13
+ const lines = [];
14
+ // User code in src/ imports types from ../generated/
15
+ lines.push(`import type { ${propsType} } from '../generated/${modelName}.types.js';`);
16
+ lines.push("");
17
+ for (const [name, actionDef] of actions) {
18
+ const fnName = `handle${typeName}${capitalize(name)}`;
19
+ const payloadType = fieldsToTSType(actionDef.fields);
20
+ lines.push(`export function ${fnName}(ctx: ${propsType}, _payload: ${payloadType}): ${propsType} {`);
21
+ const policyNames = policyActions?.get(name);
22
+ if (policyNames && policyNames.length > 0) {
23
+ lines.push(` // TODO: validate policies (${policyNames.join(", ")})`);
24
+ }
25
+ lines.push(` // TODO: implement ${name}`);
26
+ lines.push(` return ctx;`);
27
+ lines.push(`}`);
28
+ lines.push("");
29
+ }
30
+ return lines.join("\n");
31
+ };
32
+ //# sourceMappingURL=orchestrators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrators.js","sourceRoot":"","sources":["../../src/codegen/orchestrators.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpE;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAe,EACf,aAAqC,EAC7B,EAAE;IACV,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAElC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,GAAG,QAAQ,OAAO,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,qDAAqD;IACrD,KAAK,CAAC,IAAI,CACR,iBAAiB,SAAS,yBAAyB,SAAS,aAAa,CAC1E,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,SAAS,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAErD,KAAK,CAAC,IAAI,CACR,mBAAmB,MAAM,SAAS,SAAS,eAAe,WAAW,MAAM,SAAS,IAAI,CACzF,CAAC;QAEF,MAAM,WAAW,GAAG,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,iCAAiC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PolicyDef } from "../schema/policy.js";
2
+ /**
3
+ * Generate a policy index listing all policies per model+action.
4
+ * Output: generated/policy-index.ts
5
+ */
6
+ export declare const generatePolicyIndex: (policies: PolicyDef[]) => string;
7
+ //# sourceMappingURL=policy-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-index.d.ts","sourceRoot":"","sources":["../../src/codegen/policy-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,SAAS,EAAE,KAAG,MAmD3D,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { capitalize } from "./utils.js";
2
+ /**
3
+ * Generate a policy index listing all policies per model+action.
4
+ * Output: generated/policy-index.ts
5
+ */
6
+ export const generatePolicyIndex = (policies) => {
7
+ if (policies.length === 0)
8
+ return "";
9
+ // Group: model → action → policy names
10
+ const index = new Map();
11
+ for (const policy of policies) {
12
+ const modelName = capitalize(policy.on.model.name);
13
+ const action = policy.on.action;
14
+ let actions = index.get(modelName);
15
+ if (!actions) {
16
+ actions = new Map();
17
+ index.set(modelName, actions);
18
+ }
19
+ let policyNames = actions.get(action);
20
+ if (!policyNames) {
21
+ policyNames = [];
22
+ actions.set(action, policyNames);
23
+ }
24
+ policyNames.push(policy.name);
25
+ }
26
+ const lines = [];
27
+ lines.push(`export const policyIndex = {`);
28
+ for (const [modelName, actions] of [...index].sort(([a], [b]) => a.localeCompare(b))) {
29
+ lines.push(` ${modelName}: {`);
30
+ for (const [action, policyNames] of [...actions].sort(([a], [b]) => a.localeCompare(b))) {
31
+ const names = policyNames.map((n) => `'${n}'`).join(", ");
32
+ lines.push(` ${action}: [${names}],`);
33
+ }
34
+ lines.push(` },`);
35
+ }
36
+ lines.push(`} as const;`);
37
+ lines.push("");
38
+ return lines.join("\n");
39
+ };
40
+ //# sourceMappingURL=policy-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-index.js","sourceRoot":"","sources":["../../src/codegen/policy-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAqB,EAAU,EAAE;IACnE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,uCAAuC;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEvD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;QAEhC,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEtC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,WAAW,GAAG,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnC,CAAC;QAED,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAE3C,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9D,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CACnB,EAAE,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,CAAC,CAAC;QAEhC,KAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACjE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CACnB,EAAE,CAAC;YACF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE1D,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,MAAM,KAAK,IAAI,CAAC,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PolicyDef } from "../schema/policy.js";
2
+ /**
3
+ * Generate Mermaid interaction diagram for all policies targeting a single model.
4
+ * Output: generated/${targetModel}.policy-mermaid.md
5
+ */
6
+ export declare const generatePolicyMermaid: (targetModelName: string, policies: PolicyDef[]) => string;
7
+ //# sourceMappingURL=policy-mermaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-mermaid.d.ts","sourceRoot":"","sources":["../../src/codegen/policy-mermaid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,iBAAiB,MAAM,EACvB,UAAU,SAAS,EAAE,KACpB,MAkCF,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { capitalize } from "./utils.js";
2
+ /**
3
+ * Generate Mermaid interaction diagram for all policies targeting a single model.
4
+ * Output: generated/${targetModel}.policy-mermaid.md
5
+ */
6
+ export const generatePolicyMermaid = (targetModelName, policies) => {
7
+ if (policies.length === 0)
8
+ return "";
9
+ const targetName = capitalize(targetModelName);
10
+ const lines = [];
11
+ lines.push(`graph LR`);
12
+ // Collect unique required model connections
13
+ const connections = new Set();
14
+ for (const policy of policies) {
15
+ for (const rel of Object.values(policy.requires)) {
16
+ const reqName = capitalize(rel.target.name);
17
+ connections.add(` ${reqName} -->|${rel.kind}| ${targetName}`);
18
+ }
19
+ // Policy → model.action connection
20
+ const effects = [...new Set(policy.rules.map((r) => r.effect))].join("/");
21
+ lines.push(` ${policy.name} -->|${effects}| ${targetName}.${policy.on.action}`);
22
+ }
23
+ // Add relation connections (deduplicated)
24
+ for (const conn of [...connections].sort()) {
25
+ lines.push(conn);
26
+ }
27
+ lines.push("");
28
+ return lines.join("\n");
29
+ };
30
+ //# sourceMappingURL=policy-mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-mermaid.js","sourceRoot":"","sources":["../../src/codegen/policy-mermaid.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,eAAuB,EACvB,QAAqB,EACb,EAAE;IACV,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,UAAU,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEvB,4CAA4C;IAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,WAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,mCAAmC;QACnC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE1E,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,CAAC,IAAI,QAAQ,OAAO,KAAK,UAAU,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CACrE,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ModelDef } from "../schema/model.js";
2
+ import type { PolicyDef } from "../schema/policy.js";
3
+ /**
4
+ * Generate integration tests for all policies targeting a single model.
5
+ * Output: generated/${targetModel}.policy.test.ts
6
+ */
7
+ export declare const generatePolicyTests: (targetModelName: string, policies: PolicyDef[], modelLookup: Map<string, ModelDef>) => string;
8
+ //# sourceMappingURL=policy-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-tests.d.ts","sourceRoot":"","sources":["../../src/codegen/policy-tests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,qBAAqB,CAAC;AAYjE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,iBAAiB,MAAM,EACvB,UAAU,SAAS,EAAE,EACrB,aAAa,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,KACjC,MAaF,CAAC"}