pipework 0.8.10 → 0.8.12

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 (88) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/cli/commands/test.d.ts +1 -0
  3. package/dist/cli/commands/test.d.ts.map +1 -1
  4. package/dist/cli/commands/test.js +24 -1
  5. package/dist/cli/commands/test.js.map +1 -1
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +4 -0
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/core/config/ts-resolve-hooks.d.ts.map +1 -1
  10. package/dist/core/config/ts-resolve-hooks.js +22 -3
  11. package/dist/core/config/ts-resolve-hooks.js.map +1 -1
  12. package/dist/data/migrate/snapshot.js +5 -2
  13. package/dist/data/migrate/snapshot.js.map +1 -1
  14. package/dist/data/valve/artifact.d.ts +18 -0
  15. package/dist/data/valve/artifact.d.ts.map +1 -0
  16. package/dist/data/valve/artifact.js +15 -0
  17. package/dist/data/valve/artifact.js.map +1 -0
  18. package/dist/data/valve/contract-diff.d.ts +15 -0
  19. package/dist/data/valve/contract-diff.d.ts.map +1 -0
  20. package/dist/data/valve/contract-diff.js +12 -0
  21. package/dist/data/valve/contract-diff.js.map +1 -0
  22. package/dist/data/valve/cross.d.ts +15 -0
  23. package/dist/data/valve/cross.d.ts.map +1 -0
  24. package/dist/data/valve/cross.js +48 -0
  25. package/dist/data/valve/cross.js.map +1 -0
  26. package/dist/data/valve/decision.d.ts +29 -0
  27. package/dist/data/valve/decision.d.ts.map +1 -0
  28. package/dist/data/valve/decision.js +19 -0
  29. package/dist/data/valve/decision.js.map +1 -0
  30. package/dist/data/valve/faucet.d.ts +18 -0
  31. package/dist/data/valve/faucet.d.ts.map +1 -0
  32. package/dist/data/valve/faucet.js +34 -0
  33. package/dist/data/valve/faucet.js.map +1 -0
  34. package/dist/data/valve/gate.d.ts +28 -0
  35. package/dist/data/valve/gate.d.ts.map +1 -0
  36. package/dist/data/valve/gate.js +74 -0
  37. package/dist/data/valve/gate.js.map +1 -0
  38. package/dist/data/valve/graph.d.ts +28 -0
  39. package/dist/data/valve/graph.d.ts.map +1 -0
  40. package/dist/data/valve/graph.js +43 -0
  41. package/dist/data/valve/graph.js.map +1 -0
  42. package/dist/data/valve/index.d.ts +18 -0
  43. package/dist/data/valve/index.d.ts.map +1 -0
  44. package/dist/data/valve/index.js +10 -0
  45. package/dist/data/valve/index.js.map +1 -0
  46. package/dist/data/valve/namespace.d.ts +45 -0
  47. package/dist/data/valve/namespace.d.ts.map +1 -0
  48. package/dist/data/valve/namespace.js +45 -0
  49. package/dist/data/valve/namespace.js.map +1 -0
  50. package/dist/data/valve/registry.d.ts +14 -0
  51. package/dist/data/valve/registry.d.ts.map +1 -0
  52. package/dist/data/valve/registry.js +41 -0
  53. package/dist/data/valve/registry.js.map +1 -0
  54. package/dist/data/valve/supply.d.ts +33 -0
  55. package/dist/data/valve/supply.d.ts.map +1 -0
  56. package/dist/data/valve/supply.js +96 -0
  57. package/dist/data/valve/supply.js.map +1 -0
  58. package/dist/data/valve/types.d.ts +138 -0
  59. package/dist/data/valve/types.d.ts.map +1 -0
  60. package/dist/data/valve/types.js +2 -0
  61. package/dist/data/valve/types.js.map +1 -0
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +1 -0
  65. package/dist/index.js.map +1 -1
  66. package/dist/test/reap.d.ts +33 -0
  67. package/dist/test/reap.d.ts.map +1 -0
  68. package/dist/test/reap.js +117 -0
  69. package/dist/test/reap.js.map +1 -0
  70. package/dist/test/setup.d.ts.map +1 -1
  71. package/dist/test/setup.js +49 -8
  72. package/dist/test/setup.js.map +1 -1
  73. package/dist/test/vitest-plugin.d.ts +8 -0
  74. package/dist/test/vitest-plugin.d.ts.map +1 -1
  75. package/dist/test/vitest-plugin.js +13 -3
  76. package/dist/test/vitest-plugin.js.map +1 -1
  77. package/dist/test/vitest-workspace.d.ts +1 -1
  78. package/dist/test/vitest-workspace.d.ts.map +1 -1
  79. package/dist/test/vitest-workspace.js +14 -7
  80. package/dist/test/vitest-workspace.js.map +1 -1
  81. package/dist/workspace/generate.d.ts.map +1 -1
  82. package/dist/workspace/generate.js +5 -16
  83. package/dist/workspace/generate.js.map +1 -1
  84. package/dist/workspace/source-paths.d.ts +12 -0
  85. package/dist/workspace/source-paths.d.ts.map +1 -0
  86. package/dist/workspace/source-paths.js +29 -0
  87. package/dist/workspace/source-paths.js.map +1 -0
  88. package/package.json +1 -1
@@ -0,0 +1,74 @@
1
+ import { registerValve } from './registry.js';
2
+ function finalizeGate(state, hook) {
3
+ if (state.source === undefined || state.triggers === undefined) {
4
+ throw new Error(`[pipework] Valve "${state.name}" is missing .on(...).\n\n` +
5
+ ' A gate must declare its source entity and trigger set before .decision(...).\n' +
6
+ ' Example: gate("event-verification", "events")\n' +
7
+ ' .on("event-versions", [{ trigger: "admission" }])\n');
8
+ }
9
+ if (state.triggers.length === 0) {
10
+ throw new Error(`[pipework] Valve "${state.name}" has an empty trigger set.\n\n` +
11
+ ' .on(...) must declare at least one trigger — a gate that never fires is dead.\n');
12
+ }
13
+ const definition = {
14
+ name: state.name,
15
+ kind: 'transition-gate',
16
+ topology: { producer: state.silo, consumer: state.silo },
17
+ source: state.source,
18
+ triggers: state.triggers,
19
+ context: { ...state.context },
20
+ signals: [...state.signals],
21
+ fanOut: state.fanOut,
22
+ decision: hook,
23
+ retraction: state.retraction,
24
+ };
25
+ registerValve(definition);
26
+ return definition;
27
+ }
28
+ /**
29
+ * Declare a transition-gate valve. A gate modulates a state change within one
30
+ * silo, so `silo` is both producer and consumer. Chain the anatomy and finish
31
+ * with `.decision(hook)`.
32
+ */
33
+ export function gate(name, silo) {
34
+ const state = {
35
+ name,
36
+ silo,
37
+ source: undefined,
38
+ triggers: undefined,
39
+ context: {},
40
+ signals: [],
41
+ fanOut: undefined,
42
+ retraction: undefined,
43
+ };
44
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- builder type param narrows per stage; the public GateBuilder type is precise
45
+ const builder = {
46
+ on(source, triggers) {
47
+ state.source = source;
48
+ state.triggers = triggers;
49
+ return builder;
50
+ },
51
+ context(inbound) {
52
+ state.context = inbound;
53
+ return builder;
54
+ },
55
+ signals(names) {
56
+ state.signals = names;
57
+ return builder;
58
+ },
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- fan-out event generic erased into state; see GateState
60
+ fanOut(items) {
61
+ state.fanOut = items;
62
+ return builder;
63
+ },
64
+ retracts(config) {
65
+ state.retraction = config;
66
+ return builder;
67
+ },
68
+ decision(hook) {
69
+ return finalizeGate(state, hook);
70
+ },
71
+ };
72
+ return builder;
73
+ }
74
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/data/valve/gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAoC7C,SAAS,YAAY,CAAC,KAAgB,EAAE,IAA2B;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CACb,qBAAqB,KAAK,CAAC,IAAI,4BAA4B;YAC3D,kFAAkF;YAClF,mDAAmD;YACnD,kEAAkE,CACnE,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,qBAAqB,KAAK,CAAC,IAAI,iCAAiC;YAChE,mFAAmF,CACpF,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAA4B;QAC1C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE;QACxD,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;QAC7B,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QAC3B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAA;IACD,aAAa,CAAC,UAAU,CAAC,CAAA;IACzB,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,IAAY;IAC7C,MAAM,KAAK,GAAc;QACvB,IAAI;QACJ,IAAI;QACJ,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;KACtB,CAAA;IAED,8IAA8I;IAC9I,MAAM,OAAO,GAAQ;QACnB,EAAE,CAAC,MAAc,EAAE,QAAgC;YACjD,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;YACrB,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACzB,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,OAAO,CAAC,OAA+B;YACrC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;YACvB,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,OAAO,CAAC,KAAwB;YAC9B,KAAK,CAAC,OAAO,GAAG,KAAK,CAAA;YACrB,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,wHAAwH;QACxH,MAAM,CAAC,KAAyC;YAC9C,KAAK,CAAC,MAAM,GAAG,KAAK,CAAA;YACpB,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,QAAQ,CAAC,MAAsB;YAC7B,KAAK,CAAC,UAAU,GAAG,MAAM,CAAA;YACzB,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,QAAQ,CAAC,IAA2B;YAClC,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAClC,CAAC;KACF,CAAA;IACD,OAAO,OAA+B,CAAA;AACxC,CAAC"}
@@ -0,0 +1,28 @@
1
+ export type ValveNodeKind = 'supply' | 'gate' | 'faucet';
2
+ export interface ValveGraphNode {
3
+ readonly id: string;
4
+ readonly kind: ValveNodeKind;
5
+ }
6
+ /**
7
+ * `crossing` — a producer delivers to a faucet. `context` — a gate's enrichment
8
+ * depends on an inbound valve. `retraction` — a superseded crossing invalidates
9
+ * the downstream it fed.
10
+ */
11
+ export type ValveEdgeKind = 'crossing' | 'context' | 'retraction';
12
+ export interface ValveGraphEdge {
13
+ readonly kind: ValveEdgeKind;
14
+ readonly from: string;
15
+ readonly to: string;
16
+ }
17
+ /** The directional data-dependency graph, distinct from the package graph. */
18
+ export interface ValveGraph {
19
+ readonly nodes: readonly ValveGraphNode[];
20
+ readonly edges: readonly ValveGraphEdge[];
21
+ }
22
+ /** Assemble the valve graph from every registered valve and faucet. */
23
+ export declare function buildValveGraph(): ValveGraph;
24
+ /** Faucet node ids fed by the named valve — the direct downstream of a crossing. */
25
+ export declare function downstreamFaucets(graph: ValveGraph, valveName: string): readonly string[];
26
+ /** Gate valve names whose enrichment context depends on the named valve. */
27
+ export declare function contextDependents(graph: ValveGraph, valveName: string): readonly string[];
28
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/data/valve/graph.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;AAExD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAC7B;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAA;AAEjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAA;CAC1C;AAMD,uEAAuE;AACvE,wBAAgB,eAAe,IAAI,UAAU,CA4B5C;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAIzF;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAIzF"}
@@ -0,0 +1,43 @@
1
+ import { valves, faucetsOf } from './registry.js';
2
+ function faucetNodeId(valve, target) {
3
+ return `${valve}::${target}`;
4
+ }
5
+ /** Assemble the valve graph from every registered valve and faucet. */
6
+ export function buildValveGraph() {
7
+ const nodes = new Map();
8
+ const edges = [];
9
+ for (const [name, definition] of valves()) {
10
+ nodes.set(name, { id: name, kind: definition.kind === 'transition-gate' ? 'gate' : 'supply' });
11
+ const consumers = faucetsOf(name);
12
+ for (const consumer of consumers) {
13
+ const faucetId = faucetNodeId(name, consumer.target);
14
+ nodes.set(faucetId, { id: faucetId, kind: 'faucet' });
15
+ edges.push({ kind: 'crossing', from: name, to: faucetId });
16
+ }
17
+ if (definition.kind === 'transition-gate') {
18
+ const gateDef = definition;
19
+ for (const inbound of Object.values(gateDef.context)) {
20
+ edges.push({ kind: 'context', from: name, to: inbound });
21
+ }
22
+ if (gateDef.retraction !== undefined) {
23
+ for (const consumer of consumers) {
24
+ edges.push({ kind: 'retraction', from: name, to: faucetNodeId(name, consumer.target) });
25
+ }
26
+ }
27
+ }
28
+ }
29
+ return { nodes: [...nodes.values()], edges };
30
+ }
31
+ /** Faucet node ids fed by the named valve — the direct downstream of a crossing. */
32
+ export function downstreamFaucets(graph, valveName) {
33
+ return graph.edges
34
+ .filter((edge) => edge.kind === 'crossing' && edge.from === valveName)
35
+ .map((edge) => edge.to);
36
+ }
37
+ /** Gate valve names whose enrichment context depends on the named valve. */
38
+ export function contextDependents(graph, valveName) {
39
+ return graph.edges
40
+ .filter((edge) => edge.kind === 'context' && edge.to === valveName)
41
+ .map((edge) => edge.from);
42
+ }
43
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/data/valve/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AA6BjD,SAAS,YAAY,CAAC,KAAa,EAAE,MAAc;IACjD,OAAO,GAAG,KAAK,KAAK,MAAM,EAAE,CAAA;AAC9B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAA;IAC/C,MAAM,KAAK,GAAqB,EAAE,CAAA;IAElC,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC;QAC1C,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QAE9F,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QACjC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;YACpD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;YACrD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC5D,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,UAAqC,CAAA;YACrD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;YAC1D,CAAC;YACD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACrC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBACzF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAA;AAC9C,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,KAAiB,EAAE,SAAiB;IACpE,OAAO,KAAK,CAAC,KAAK;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;SACrE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC3B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,iBAAiB,CAAC,KAAiB,EAAE,SAAiB;IACpE,OAAO,KAAK,CAAC,KAAK;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC;SAClE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,18 @@
1
+ export { cross, held, failed } from './decision.js';
2
+ export type { Crossed, Held, Failed, DecisionOutcome } from './decision.js';
3
+ export { registerValve, valves, getValve, registerFaucet, faucetsOf, clearValveRegistry, } from './registry.js';
4
+ export { supply } from './supply.js';
5
+ export type { SupplyBuilder } from './supply.js';
6
+ export { gate } from './gate.js';
7
+ export type { GateBuilder } from './gate.js';
8
+ export { faucet } from './faucet.js';
9
+ export type { FaucetBuilder } from './faucet.js';
10
+ export { crossSupply, crossGate } from './cross.js';
11
+ export { buildValveGraph, downstreamFaucets, contextDependents } from './graph.js';
12
+ export type { ValveGraph, ValveGraphNode, ValveGraphEdge, ValveNodeKind, ValveEdgeKind } from './graph.js';
13
+ export { diffContract } from './contract-diff.js';
14
+ export type { ContractDiff } from './contract-diff.js';
15
+ export { emitArtifact } from './artifact.js';
16
+ export type { ContractArtifact } from './artifact.js';
17
+ export type { ValveKind, ValveTopology, ValveDefinition, HandoffTrigger, CrossingMode, ContractShape, ContractPayload, SupplyDefinition, GateTrigger, GateRetraction, GateDecision, GateDefinition, FaucetHandler, FaucetDefinition, CrossingResult, } from './types.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/valve/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACnD,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC3E,OAAO,EACL,aAAa,EACb,MAAM,EACN,QAAQ,EACR,cAAc,EACd,SAAS,EACT,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAClF,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,YAAY,EACV,SAAS,EACT,aAAa,EACb,eAAe,EACf,cAAc,EACd,YAAY,EACZ,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAA"}
@@ -0,0 +1,10 @@
1
+ export { cross, held, failed } from './decision.js';
2
+ export { registerValve, valves, getValve, registerFaucet, faucetsOf, clearValveRegistry, } from './registry.js';
3
+ export { supply } from './supply.js';
4
+ export { gate } from './gate.js';
5
+ export { faucet } from './faucet.js';
6
+ export { crossSupply, crossGate } from './cross.js';
7
+ export { buildValveGraph, downstreamFaucets, contextDependents } from './graph.js';
8
+ export { diffContract } from './contract-diff.js';
9
+ export { emitArtifact } from './artifact.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/valve/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,EACL,aAAa,EACb,MAAM,EACN,QAAQ,EACR,cAAc,EACd,SAAS,EACT,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAElF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,45 @@
1
+ import { supply } from './supply.js';
2
+ import { gate } from './gate.js';
3
+ import { faucet } from './faucet.js';
4
+ import { cross, held, failed } from './decision.js';
5
+ import { crossSupply, crossGate } from './cross.js';
6
+ import { buildValveGraph, downstreamFaucets, contextDependents } from './graph.js';
7
+ import { diffContract } from './contract-diff.js';
8
+ import { emitArtifact } from './artifact.js';
9
+ import { valves, getValve, faucetsOf } from './registry.js';
10
+ /** Valve namespace — typed, directional, gated boundaries between code silos. */
11
+ export declare const valve: {
12
+ /** Declare a handoff valve — the producer side of a payload crossing. */
13
+ supply: typeof supply;
14
+ /** Declare a transition-gate valve — the producer side of a gated state change. */
15
+ gate: typeof gate;
16
+ /** Declare a faucet — the consumer side of a `supply -> faucet` edge. */
17
+ faucet: typeof faucet;
18
+ /** Decision outcome: cross the valve, delivering the payload. */
19
+ cross: typeof cross;
20
+ /** Decision outcome: hold the crossing in a provisional, reviewable state. */
21
+ held: typeof held;
22
+ /** Decision outcome: evaluation failed — retryable, never a thrown exception. */
23
+ failed: typeof failed;
24
+ /** Execute a handoff crossing in the caller's transaction. */
25
+ crossSupply: typeof crossSupply;
26
+ /** Execute a transition-gate crossing. */
27
+ crossGate: typeof crossGate;
28
+ /** Assemble the directional valve graph from every registered valve and faucet. */
29
+ graph: typeof buildValveGraph;
30
+ /** The faucet nodes a valve feeds. */
31
+ downstreamFaucets: typeof downstreamFaucets;
32
+ /** The gates whose enrichment context depends on a valve. */
33
+ contextDependents: typeof contextDependents;
34
+ /** Diff a valve contract between two versions. */
35
+ diffContract: typeof diffContract;
36
+ /** Project a handoff supply to its lightweight contract artifact. */
37
+ emitArtifact: typeof emitArtifact;
38
+ /** All registered producer valves, keyed by name. */
39
+ valves: typeof valves;
40
+ /** Look up a registered valve by name. */
41
+ getValve: typeof getValve;
42
+ /** The faucets consuming a named valve. */
43
+ faucetsOf: typeof faucetsOf;
44
+ };
45
+ //# sourceMappingURL=namespace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/data/valve/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE3D,iFAAiF;AACjF,eAAO,MAAM,KAAK;IAChB,yEAAyE;;IAEzE,mFAAmF;;IAEnF,yEAAyE;;IAEzE,iEAAiE;;IAEjE,8EAA8E;;IAE9E,iFAAiF;;IAEjF,8DAA8D;;IAE9D,0CAA0C;;IAE1C,mFAAmF;;IAEnF,sCAAsC;;IAEtC,6DAA6D;;IAE7D,kDAAkD;;IAElD,qEAAqE;;IAErE,qDAAqD;;IAErD,0CAA0C;;IAE1C,2CAA2C;;CAE5C,CAAA"}
@@ -0,0 +1,45 @@
1
+ import { supply } from './supply.js';
2
+ import { gate } from './gate.js';
3
+ import { faucet } from './faucet.js';
4
+ import { cross, held, failed } from './decision.js';
5
+ import { crossSupply, crossGate } from './cross.js';
6
+ import { buildValveGraph, downstreamFaucets, contextDependents } from './graph.js';
7
+ import { diffContract } from './contract-diff.js';
8
+ import { emitArtifact } from './artifact.js';
9
+ import { valves, getValve, faucetsOf } from './registry.js';
10
+ /** Valve namespace — typed, directional, gated boundaries between code silos. */
11
+ export const valve = {
12
+ /** Declare a handoff valve — the producer side of a payload crossing. */
13
+ supply,
14
+ /** Declare a transition-gate valve — the producer side of a gated state change. */
15
+ gate,
16
+ /** Declare a faucet — the consumer side of a `supply -> faucet` edge. */
17
+ faucet,
18
+ /** Decision outcome: cross the valve, delivering the payload. */
19
+ cross,
20
+ /** Decision outcome: hold the crossing in a provisional, reviewable state. */
21
+ held,
22
+ /** Decision outcome: evaluation failed — retryable, never a thrown exception. */
23
+ failed,
24
+ /** Execute a handoff crossing in the caller's transaction. */
25
+ crossSupply,
26
+ /** Execute a transition-gate crossing. */
27
+ crossGate,
28
+ /** Assemble the directional valve graph from every registered valve and faucet. */
29
+ graph: buildValveGraph,
30
+ /** The faucet nodes a valve feeds. */
31
+ downstreamFaucets,
32
+ /** The gates whose enrichment context depends on a valve. */
33
+ contextDependents,
34
+ /** Diff a valve contract between two versions. */
35
+ diffContract,
36
+ /** Project a handoff supply to its lightweight contract artifact. */
37
+ emitArtifact,
38
+ /** All registered producer valves, keyed by name. */
39
+ valves,
40
+ /** Look up a registered valve by name. */
41
+ getValve,
42
+ /** The faucets consuming a named valve. */
43
+ faucetsOf,
44
+ };
45
+ //# sourceMappingURL=namespace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/data/valve/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE3D,iFAAiF;AACjF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,yEAAyE;IACzE,MAAM;IACN,mFAAmF;IACnF,IAAI;IACJ,yEAAyE;IACzE,MAAM;IACN,iEAAiE;IACjE,KAAK;IACL,8EAA8E;IAC9E,IAAI;IACJ,iFAAiF;IACjF,MAAM;IACN,8DAA8D;IAC9D,WAAW;IACX,0CAA0C;IAC1C,SAAS;IACT,mFAAmF;IACnF,KAAK,EAAE,eAAe;IACtB,sCAAsC;IACtC,iBAAiB;IACjB,6DAA6D;IAC7D,iBAAiB;IACjB,kDAAkD;IAClD,YAAY;IACZ,qEAAqE;IACrE,YAAY;IACZ,qDAAqD;IACrD,MAAM;IACN,0CAA0C;IAC1C,QAAQ;IACR,2CAA2C;IAC3C,SAAS;CACV,CAAA"}
@@ -0,0 +1,14 @@
1
+ import type { FaucetDefinition, ValveDefinition } from './types.js';
2
+ /** Register a producer valve under its name. Names must be unique across the process. */
3
+ export declare function registerValve(definition: ValveDefinition): void;
4
+ /** All registered producer valves, keyed by name. */
5
+ export declare function valves(): ReadonlyMap<string, ValveDefinition>;
6
+ /** Look up one producer valve by name, or `undefined` if it is not registered. */
7
+ export declare function getValve(name: string): ValveDefinition | undefined;
8
+ /** Register a faucet against the valve name it consumes. A valve may have many faucets. */
9
+ export declare function registerFaucet(faucet: FaucetDefinition<unknown>): void;
10
+ /** Every faucet that consumes the named valve, in declaration order. */
11
+ export declare function faucetsOf(valveName: string): readonly FaucetDefinition<unknown>[];
12
+ /** Empty both registries. Test support — production code never calls this. */
13
+ export declare function clearValveRegistry(): void;
14
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/data/valve/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AASnE,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAW/D;AAED,qDAAqD;AACrD,wBAAgB,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAE7D;AAED,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAElE;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,IAAI,CAItE;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAEjF;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC"}
@@ -0,0 +1,41 @@
1
+ // Two global registries, populated at import time when valve declarations run.
2
+ // `registry` holds producers (supply / gate); `faucetRegistry` holds the
3
+ // consumer side, keyed by the valve name each faucet binds to. The valve graph
4
+ // reconciles the two into `supply -> faucet` edges.
5
+ const registry = new Map();
6
+ const faucetRegistry = new Map();
7
+ /** Register a producer valve under its name. Names must be unique across the process. */
8
+ export function registerValve(definition) {
9
+ const existing = registry.get(definition.name);
10
+ if (existing !== undefined) {
11
+ throw new Error(`[pipework] Duplicate valve: "${definition.name}" is already registered.\n\n` +
12
+ ' Each valve must have a unique name.\n' +
13
+ ` Existing: ${existing.kind} (${existing.topology.producer} -> ${existing.topology.consumer})\n` +
14
+ ` Duplicate: ${definition.kind} (${definition.topology.producer} -> ${definition.topology.consumer})\n`);
15
+ }
16
+ registry.set(definition.name, definition);
17
+ }
18
+ /** All registered producer valves, keyed by name. */
19
+ export function valves() {
20
+ return registry;
21
+ }
22
+ /** Look up one producer valve by name, or `undefined` if it is not registered. */
23
+ export function getValve(name) {
24
+ return registry.get(name);
25
+ }
26
+ /** Register a faucet against the valve name it consumes. A valve may have many faucets. */
27
+ export function registerFaucet(faucet) {
28
+ const existing = faucetRegistry.get(faucet.valve) ?? [];
29
+ existing.push(faucet);
30
+ faucetRegistry.set(faucet.valve, existing);
31
+ }
32
+ /** Every faucet that consumes the named valve, in declaration order. */
33
+ export function faucetsOf(valveName) {
34
+ return faucetRegistry.get(valveName) ?? [];
35
+ }
36
+ /** Empty both registries. Test support — production code never calls this. */
37
+ export function clearValveRegistry() {
38
+ registry.clear();
39
+ faucetRegistry.clear();
40
+ }
41
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/data/valve/registry.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,yEAAyE;AACzE,+EAA+E;AAC/E,oDAAoD;AACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAA;AACnD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuC,CAAA;AAErE,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAAC,UAA2B;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,gCAAgC,UAAU,CAAC,IAAI,8BAA8B;YAC7E,yCAAyC;YACzC,gBAAgB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,QAAQ,CAAC,QAAQ,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,KAAK;YAClG,gBAAgB,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,QAAQ,CAAC,QAAQ,OAAO,UAAU,CAAC,QAAQ,CAAC,QAAQ,KAAK,CACzG,CAAA;IACH,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;AAC3C,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,MAAM;IACpB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAAC,MAAiC;IAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IACvD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACrB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAC5C,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,OAAO,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;AAC5C,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAA;IAChB,cAAc,CAAC,KAAK,EAAE,CAAA;AACxB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { ContractPayload, ContractShape, HandoffTrigger, SupplyDefinition } from './types.js';
2
+ /**
3
+ * The producer-side builder for a handoff valve. Type parameters narrow as the
4
+ * chain progresses: `.from()` fixes the source row type, `.contract()` fixes
5
+ * the payload type, and `.guard()` / `.project()` / `.idempotentBy()` are then
6
+ * checked against them. `.to()` is terminal — it registers the valve.
7
+ */
8
+ export interface SupplyBuilder<TSource, TPayload> {
9
+ /** The source entity and the state transition (or push) that fires the crossing. */
10
+ from<TFromSource = TSource>(source: string, trigger: HandoffTrigger): SupplyBuilder<TFromSource, TPayload>;
11
+ /** The payload schema — `.project()` must produce exactly this shape. */
12
+ contract<TShape extends ContractShape>(shape: TShape): SupplyBuilder<TSource, ContractPayload<TShape>>;
13
+ /** A guard predicate; the payload may not cross unless it holds. */
14
+ guard(predicate: (row: TSource) => boolean): SupplyBuilder<TSource, TPayload>;
15
+ /** Projects the source row to the contract payload — a snapshot taken at crossing time. */
16
+ project(projection: (row: TSource) => TPayload): SupplyBuilder<TSource, TPayload>;
17
+ /** Names a post-condition that holds across the crossing (checked via the valve graph). */
18
+ invariant(name: string): SupplyBuilder<TSource, TPayload>;
19
+ /** The source field carrying the trace/correlation id propagated across the crossing. */
20
+ lineage(field: string): SupplyBuilder<TSource, TPayload>;
21
+ /** Derives the idempotency key for a crossing from the source row. */
22
+ idempotentBy(key: (row: TSource) => string): SupplyBuilder<TSource, TPayload>;
23
+ /** Run the crossing as a durable retried job rather than in the caller's transaction. */
24
+ durable(retry?: 'backoff' | 'fixed'): SupplyBuilder<TSource, TPayload>;
25
+ /** The consumer silo. Terminal — registers the valve and returns its definition. */
26
+ to(consumer: string): SupplyDefinition<TSource, TPayload>;
27
+ }
28
+ /**
29
+ * Declare a handoff valve. `name` identifies the valve; `producer` is the silo
30
+ * the data crosses *from*. Chain the anatomy and finish with `.to(consumer)`.
31
+ */
32
+ export declare function supply(name: string, producer: string): SupplyBuilder<unknown, unknown>;
33
+ //# sourceMappingURL=supply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supply.d.ts","sourceRoot":"","sources":["../../../src/data/valve/supply.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,cAAc,EACd,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB;;;;;GAKG;AACH,MAAM,WAAW,aAAa,CAAC,OAAO,EAAE,QAAQ;IAC9C,oFAAoF;IACpF,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IAC1G,yEAAyE;IACzE,QAAQ,CAAC,MAAM,SAAS,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;IACtG,oEAAoE;IACpE,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC7E,2FAA2F;IAC3F,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACjF,2FAA2F;IAC3F,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACzD,yFAAyF;IACzF,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACxD,sEAAsE;IACtE,YAAY,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC7E,yFAAyF;IACzF,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACtE,oFAAoF;IACpF,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;CAC1D;AA0DD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CA0DtF"}
@@ -0,0 +1,96 @@
1
+ import { registerValve } from './registry.js';
2
+ function finalize(state, consumer) {
3
+ if (state.source === undefined || state.trigger === undefined) {
4
+ throw new Error(`[pipework] Valve "${state.name}" is missing .from(...).\n\n` +
5
+ ' A supply must declare its source entity and trigger before .to(...).\n' +
6
+ ' Example: supply("frozen-outcome", "compensation")\n' +
7
+ ' .from("outcomes", { on: "status", from: "open", to: "frozen" })\n');
8
+ }
9
+ if (state.contract === undefined) {
10
+ throw new Error(`[pipework] Valve "${state.name}" is missing .contract(...).\n\n` +
11
+ ' A supply must declare its payload contract before .to(...).\n');
12
+ }
13
+ if (state.project === undefined) {
14
+ throw new Error(`[pipework] Valve "${state.name}" is missing .project(...).\n\n` +
15
+ ' A supply must declare how the source row projects to the contract payload before .to(...).\n');
16
+ }
17
+ const definition = {
18
+ name: state.name,
19
+ kind: 'handoff',
20
+ topology: { producer: state.producer, consumer },
21
+ source: state.source,
22
+ trigger: state.trigger,
23
+ contract: state.contract,
24
+ guard: state.guard,
25
+ project: state.project,
26
+ invariants: [...state.invariants],
27
+ lineageField: state.lineageField,
28
+ idempotentBy: state.idempotentBy,
29
+ crossing: state.crossing,
30
+ };
31
+ registerValve(definition);
32
+ return definition;
33
+ }
34
+ /**
35
+ * Declare a handoff valve. `name` identifies the valve; `producer` is the silo
36
+ * the data crosses *from*. Chain the anatomy and finish with `.to(consumer)`.
37
+ */
38
+ export function supply(name, producer) {
39
+ const state = {
40
+ name,
41
+ producer,
42
+ source: undefined,
43
+ trigger: undefined,
44
+ contract: undefined,
45
+ guard: undefined,
46
+ project: undefined,
47
+ invariants: [],
48
+ lineageField: undefined,
49
+ idempotentBy: undefined,
50
+ crossing: { durable: false },
51
+ };
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- builder type params narrow per stage; the public SupplyBuilder type is precise
53
+ const builder = {
54
+ from(source, trigger) {
55
+ state.source = source;
56
+ state.trigger = trigger;
57
+ return builder;
58
+ },
59
+ contract(shape) {
60
+ state.contract = shape;
61
+ return builder;
62
+ },
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- predicate generic erased into state; see SupplyState
64
+ guard(predicate) {
65
+ state.guard = predicate;
66
+ return builder;
67
+ },
68
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- projection generic erased into state; see SupplyState
69
+ project(projection) {
70
+ state.project = projection;
71
+ return builder;
72
+ },
73
+ invariant(invariantName) {
74
+ state.invariants.push(invariantName);
75
+ return builder;
76
+ },
77
+ lineage(field) {
78
+ state.lineageField = field;
79
+ return builder;
80
+ },
81
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- key generic erased into state; see SupplyState
82
+ idempotentBy(key) {
83
+ state.idempotentBy = key;
84
+ return builder;
85
+ },
86
+ durable(retry) {
87
+ state.crossing = { durable: true, retry: retry ?? 'backoff' };
88
+ return builder;
89
+ },
90
+ to(consumer) {
91
+ return finalize(state, consumer);
92
+ },
93
+ };
94
+ return builder;
95
+ }
96
+ //# sourceMappingURL=supply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supply.js","sourceRoot":"","sources":["../../../src/data/valve/supply.ts"],"names":[],"mappings":"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"}