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.
- package/README.md +195 -0
- package/bin/dopespec.mjs +26 -0
- package/dist/__tests__/codegen.test.d.ts +2 -0
- package/dist/__tests__/codegen.test.d.ts.map +1 -0
- package/dist/__tests__/codegen.test.js +713 -0
- package/dist/__tests__/codegen.test.js.map +1 -0
- package/dist/__tests__/e2e-proof.test.d.ts +2 -0
- package/dist/__tests__/e2e-proof.test.d.ts.map +1 -0
- package/dist/__tests__/e2e-proof.test.js +153 -0
- package/dist/__tests__/e2e-proof.test.js.map +1 -0
- package/dist/__tests__/schema.test.d.ts +2 -0
- package/dist/__tests__/schema.test.d.ts.map +1 -0
- package/dist/__tests__/schema.test.js +822 -0
- package/dist/__tests__/schema.test.js.map +1 -0
- package/dist/__tests__/type-errors.d.ts +2 -0
- package/dist/__tests__/type-errors.d.ts.map +1 -0
- package/dist/__tests__/type-errors.js +128 -0
- package/dist/__tests__/type-errors.js.map +1 -0
- package/dist/cli/generate.d.ts +2 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +250 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/codegen/commands.d.ts +4 -0
- package/dist/codegen/commands.d.ts.map +1 -0
- package/dist/codegen/commands.js +25 -0
- package/dist/codegen/commands.js.map +1 -0
- package/dist/codegen/decisions-evaluate.d.ts +3 -0
- package/dist/codegen/decisions-evaluate.d.ts.map +1 -0
- package/dist/codegen/decisions-evaluate.js +50 -0
- package/dist/codegen/decisions-evaluate.js.map +1 -0
- package/dist/codegen/decisions-table.d.ts +3 -0
- package/dist/codegen/decisions-table.d.ts.map +1 -0
- package/dist/codegen/decisions-table.js +27 -0
- package/dist/codegen/decisions-table.js.map +1 -0
- package/dist/codegen/decisions-tests.d.ts +3 -0
- package/dist/codegen/decisions-tests.d.ts.map +1 -0
- package/dist/codegen/decisions-tests.js +43 -0
- package/dist/codegen/decisions-tests.js.map +1 -0
- package/dist/codegen/e2e-stubs.d.ts +4 -0
- package/dist/codegen/e2e-stubs.d.ts.map +1 -0
- package/dist/codegen/e2e-stubs.js +21 -0
- package/dist/codegen/e2e-stubs.js.map +1 -0
- package/dist/codegen/events.d.ts +8 -0
- package/dist/codegen/events.d.ts.map +1 -0
- package/dist/codegen/events.js +36 -0
- package/dist/codegen/events.js.map +1 -0
- package/dist/codegen/index.d.ts +18 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +18 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/invariants.d.ts +4 -0
- package/dist/codegen/invariants.d.ts.map +1 -0
- package/dist/codegen/invariants.js +53 -0
- package/dist/codegen/invariants.js.map +1 -0
- package/dist/codegen/mermaid.d.ts +4 -0
- package/dist/codegen/mermaid.d.ts.map +1 -0
- package/dist/codegen/mermaid.js +21 -0
- package/dist/codegen/mermaid.js.map +1 -0
- package/dist/codegen/orchestrators.d.ts +7 -0
- package/dist/codegen/orchestrators.d.ts.map +1 -0
- package/dist/codegen/orchestrators.js +32 -0
- package/dist/codegen/orchestrators.js.map +1 -0
- package/dist/codegen/policy-index.d.ts +7 -0
- package/dist/codegen/policy-index.d.ts.map +1 -0
- package/dist/codegen/policy-index.js +40 -0
- package/dist/codegen/policy-index.js.map +1 -0
- package/dist/codegen/policy-mermaid.d.ts +7 -0
- package/dist/codegen/policy-mermaid.d.ts.map +1 -0
- package/dist/codegen/policy-mermaid.js +30 -0
- package/dist/codegen/policy-mermaid.js.map +1 -0
- package/dist/codegen/policy-tests.d.ts +8 -0
- package/dist/codegen/policy-tests.d.ts.map +1 -0
- package/dist/codegen/policy-tests.js +167 -0
- package/dist/codegen/policy-tests.js.map +1 -0
- package/dist/codegen/policy-validator.d.ts +8 -0
- package/dist/codegen/policy-validator.d.ts.map +1 -0
- package/dist/codegen/policy-validator.js +69 -0
- package/dist/codegen/policy-validator.js.map +1 -0
- package/dist/codegen/tests.d.ts +4 -0
- package/dist/codegen/tests.d.ts.map +1 -0
- package/dist/codegen/tests.js +125 -0
- package/dist/codegen/tests.js.map +1 -0
- package/dist/codegen/transitions.d.ts +4 -0
- package/dist/codegen/transitions.d.ts.map +1 -0
- package/dist/codegen/transitions.js +41 -0
- package/dist/codegen/transitions.js.map +1 -0
- package/dist/codegen/types.d.ts +4 -0
- package/dist/codegen/types.d.ts.map +1 -0
- package/dist/codegen/types.js +48 -0
- package/dist/codegen/types.js.map +1 -0
- package/dist/codegen/utils.d.ts +85 -0
- package/dist/codegen/utils.d.ts.map +1 -0
- package/dist/codegen/utils.js +357 -0
- package/dist/codegen/utils.js.map +1 -0
- package/dist/codegen/zod.d.ts +4 -0
- package/dist/codegen/zod.d.ts.map +1 -0
- package/dist/codegen/zod.js +32 -0
- package/dist/codegen/zod.js.map +1 -0
- package/dist/examples/generated/customer.types.d.ts +7 -0
- package/dist/examples/generated/customer.types.d.ts.map +1 -0
- package/dist/examples/generated/customer.types.js +2 -0
- package/dist/examples/generated/customer.types.js.map +1 -0
- package/dist/examples/generated/order.types.d.ts +9 -0
- package/dist/examples/generated/order.types.d.ts.map +1 -0
- package/dist/examples/generated/order.types.js +2 -0
- package/dist/examples/generated/order.types.js.map +1 -0
- package/dist/examples/generated/pet.types.d.ts +11 -0
- package/dist/examples/generated/pet.types.d.ts.map +1 -0
- package/dist/examples/generated/pet.types.js +2 -0
- package/dist/examples/generated/pet.types.js.map +1 -0
- package/dist/examples/pet-store.d.ts +137 -0
- package/dist/examples/pet-store.d.ts.map +1 -0
- package/dist/examples/pet-store.js +139 -0
- package/dist/examples/pet-store.js.map +1 -0
- package/dist/examples/src/customer.e2e.d.ts +2 -0
- package/dist/examples/src/customer.e2e.d.ts.map +1 -0
- package/dist/examples/src/customer.e2e.js +17 -0
- package/dist/examples/src/customer.e2e.js.map +1 -0
- package/dist/examples/src/customer.orchestrators.d.ts +5 -0
- package/dist/examples/src/customer.orchestrators.d.ts.map +1 -0
- package/dist/examples/src/customer.orchestrators.js +5 -0
- package/dist/examples/src/customer.orchestrators.js.map +1 -0
- package/dist/examples/src/order.e2e.d.ts +2 -0
- package/dist/examples/src/order.e2e.d.ts.map +1 -0
- package/dist/examples/src/order.e2e.js +22 -0
- package/dist/examples/src/order.e2e.js.map +1 -0
- package/dist/examples/src/order.orchestrators.d.ts +9 -0
- package/dist/examples/src/order.orchestrators.d.ts.map +1 -0
- package/dist/examples/src/order.orchestrators.js +10 -0
- package/dist/examples/src/order.orchestrators.js.map +1 -0
- package/dist/examples/src/pet.e2e.d.ts +2 -0
- package/dist/examples/src/pet.e2e.d.ts.map +1 -0
- package/dist/examples/src/pet.e2e.js +17 -0
- package/dist/examples/src/pet.e2e.js.map +1 -0
- package/dist/examples/src/pet.orchestrators.d.ts +8 -0
- package/dist/examples/src/pet.orchestrators.d.ts.map +1 -0
- package/dist/examples/src/pet.orchestrators.js +9 -0
- package/dist/examples/src/pet.orchestrators.js.map +1 -0
- package/dist/schema/actions.d.ts +37 -0
- package/dist/schema/actions.d.ts.map +1 -0
- package/dist/schema/actions.js +35 -0
- package/dist/schema/actions.js.map +1 -0
- package/dist/schema/constraints.d.ts +20 -0
- package/dist/schema/constraints.d.ts.map +1 -0
- package/dist/schema/constraints.js +15 -0
- package/dist/schema/constraints.js.map +1 -0
- package/dist/schema/decisions.d.ts +29 -0
- package/dist/schema/decisions.d.ts.map +1 -0
- package/dist/schema/decisions.js +56 -0
- package/dist/schema/decisions.js.map +1 -0
- package/dist/schema/index.d.ts +17 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +8 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/model.d.ts +65 -0
- package/dist/schema/model.d.ts.map +1 -0
- package/dist/schema/model.js +30 -0
- package/dist/schema/model.js.map +1 -0
- package/dist/schema/policy.d.ts +25 -0
- package/dist/schema/policy.d.ts.map +1 -0
- package/dist/schema/policy.js +53 -0
- package/dist/schema/policy.js.map +1 -0
- package/dist/schema/props.d.ts +57 -0
- package/dist/schema/props.d.ts.map +1 -0
- package/dist/schema/props.js +53 -0
- package/dist/schema/props.js.map +1 -0
- package/dist/schema/relations.d.ts +9 -0
- package/dist/schema/relations.d.ts.map +1 -0
- package/dist/schema/relations.js +9 -0
- package/dist/schema/relations.js.map +1 -0
- package/dist/schema/transitions.d.ts +34 -0
- package/dist/schema/transitions.d.ts.map +1 -0
- package/dist/schema/transitions.js +25 -0
- package/dist/schema/transitions.js.map +1 -0
- package/dist/schema/types.d.ts +18 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +11 -0
- package/dist/schema/types.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|