@driftfence/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/LICENSE +81 -0
  2. package/README.md +36 -0
  3. package/dist/draft/scenario.d.ts +3 -0
  4. package/dist/draft/scenario.d.ts.map +1 -0
  5. package/dist/draft/scenario.js +207 -0
  6. package/dist/draft/scenario.js.map +1 -0
  7. package/dist/index.d.ts +22 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +38 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/io/config.d.ts +10 -0
  12. package/dist/io/config.d.ts.map +1 -0
  13. package/dist/io/config.js +165 -0
  14. package/dist/io/config.js.map +1 -0
  15. package/dist/io/contracts.d.ts +7 -0
  16. package/dist/io/contracts.d.ts.map +1 -0
  17. package/dist/io/contracts.js +562 -0
  18. package/dist/io/contracts.js.map +1 -0
  19. package/dist/io/files.d.ts +6 -0
  20. package/dist/io/files.d.ts.map +1 -0
  21. package/dist/io/files.js +49 -0
  22. package/dist/io/files.js.map +1 -0
  23. package/dist/io/suppressions.d.ts +16 -0
  24. package/dist/io/suppressions.d.ts.map +1 -0
  25. package/dist/io/suppressions.js +108 -0
  26. package/dist/io/suppressions.js.map +1 -0
  27. package/dist/io/traces.d.ts +3 -0
  28. package/dist/io/traces.d.ts.map +1 -0
  29. package/dist/io/traces.js +40 -0
  30. package/dist/io/traces.js.map +1 -0
  31. package/dist/match/expr.d.ts +3 -0
  32. package/dist/match/expr.d.ts.map +1 -0
  33. package/dist/match/expr.js +43 -0
  34. package/dist/match/expr.js.map +1 -0
  35. package/dist/match/value.d.ts +5 -0
  36. package/dist/match/value.d.ts.map +1 -0
  37. package/dist/match/value.js +127 -0
  38. package/dist/match/value.js.map +1 -0
  39. package/dist/normalize/trace.d.ts +12 -0
  40. package/dist/normalize/trace.d.ts.map +1 -0
  41. package/dist/normalize/trace.js +215 -0
  42. package/dist/normalize/trace.js.map +1 -0
  43. package/dist/query/index.d.ts +4 -0
  44. package/dist/query/index.d.ts.map +1 -0
  45. package/dist/query/index.js +96 -0
  46. package/dist/query/index.js.map +1 -0
  47. package/dist/report/check.d.ts +3 -0
  48. package/dist/report/check.d.ts.map +1 -0
  49. package/dist/report/check.js +347 -0
  50. package/dist/report/check.js.map +1 -0
  51. package/dist/report/render.d.ts +11 -0
  52. package/dist/report/render.d.ts.map +1 -0
  53. package/dist/report/render.js +99 -0
  54. package/dist/report/render.js.map +1 -0
  55. package/dist/schemas/index.d.ts +578 -0
  56. package/dist/schemas/index.d.ts.map +1 -0
  57. package/dist/schemas/index.js +492 -0
  58. package/dist/schemas/index.js.map +1 -0
  59. package/dist/tsconfig.tsbuildinfo +1 -0
  60. package/dist/types.d.ts +402 -0
  61. package/dist/types.d.ts.map +1 -0
  62. package/dist/types.js +3 -0
  63. package/dist/types.js.map +1 -0
  64. package/dist/utils/errors.d.ts +18 -0
  65. package/dist/utils/errors.d.ts.map +1 -0
  66. package/dist/utils/errors.js +34 -0
  67. package/dist/utils/errors.js.map +1 -0
  68. package/dist/utils/json.d.ts +10 -0
  69. package/dist/utils/json.d.ts.map +1 -0
  70. package/dist/utils/json.js +98 -0
  71. package/dist/utils/json.js.map +1 -0
  72. package/dist/utils/order.d.ts +8 -0
  73. package/dist/utils/order.d.ts.map +1 -0
  74. package/dist/utils/order.js +42 -0
  75. package/dist/utils/order.js.map +1 -0
  76. package/dist/utils/path.d.ts +8 -0
  77. package/dist/utils/path.d.ts.map +1 -0
  78. package/dist/utils/path.js +168 -0
  79. package/dist/utils/path.js.map +1 -0
  80. package/dist/verify/invariants.d.ts +3 -0
  81. package/dist/verify/invariants.d.ts.map +1 -0
  82. package/dist/verify/invariants.js +38 -0
  83. package/dist/verify/invariants.js.map +1 -0
  84. package/dist/verify/sequence.d.ts +3 -0
  85. package/dist/verify/sequence.d.ts.map +1 -0
  86. package/dist/verify/sequence.js +151 -0
  87. package/dist/verify/sequence.js.map +1 -0
  88. package/dist/verify/summary.d.ts +8 -0
  89. package/dist/verify/summary.d.ts.map +1 -0
  90. package/dist/verify/summary.js +132 -0
  91. package/dist/verify/summary.js.map +1 -0
  92. package/package.json +47 -0
@@ -0,0 +1,562 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.canonicalizeContractFile = canonicalizeContractFile;
7
+ exports.loadContracts = loadContracts;
8
+ exports.renderContractYaml = renderContractYaml;
9
+ exports.writeContractFile = writeContractFile;
10
+ exports.contractFilePath = contractFilePath;
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const yaml_1 = require("yaml");
13
+ const schemas_1 = require("../schemas");
14
+ const errors_1 = require("../utils/errors");
15
+ const json_1 = require("../utils/json");
16
+ const files_1 = require("./files");
17
+ const RESERVED_MATCHER_KEYS = new Set([
18
+ "$from",
19
+ "$any",
20
+ "$oneOf",
21
+ "$regex",
22
+ "$ignore"
23
+ ]);
24
+ const RESERVED_EXPR_KEYS = new Set([
25
+ "$from",
26
+ "$eq",
27
+ "$and",
28
+ "$or",
29
+ "$not",
30
+ "$implies",
31
+ "$occurred",
32
+ "$count"
33
+ ]);
34
+ function validateReservedObject(value, reservedKeys, currentPath, errors) {
35
+ if (Array.isArray(value)) {
36
+ value.forEach((item, index) => {
37
+ validateReservedObject(item, reservedKeys, `${currentPath}[${index}]`, errors);
38
+ });
39
+ return;
40
+ }
41
+ if (!(0, json_1.isPlainObject)(value)) {
42
+ return;
43
+ }
44
+ const keys = Object.keys(value);
45
+ const reserved = keys.filter((key) => reservedKeys.has(key));
46
+ if (reserved.length > 0 && (reserved.length > 1 || keys.length !== 1)) {
47
+ errors.push(`${currentPath}: reserved matcher/expr keys must appear alone.`);
48
+ }
49
+ for (const [key, child] of Object.entries(value)) {
50
+ validateReservedObject(child, reservedKeys, currentPath ? `${currentPath}.${key}` : key, errors);
51
+ }
52
+ }
53
+ function rootOf(pathValue) {
54
+ const dotIndex = pathValue.indexOf(".");
55
+ return dotIndex === -1 ? pathValue : pathValue.slice(0, dotIndex);
56
+ }
57
+ function validateMatcherFromRoots(value, allowedRoots, currentPath, errors) {
58
+ if (Array.isArray(value)) {
59
+ value.forEach((item, index) => {
60
+ validateMatcherFromRoots(item, allowedRoots, `${currentPath}[${index}]`, errors);
61
+ });
62
+ return;
63
+ }
64
+ if (!(0, json_1.isPlainObject)(value)) {
65
+ return;
66
+ }
67
+ if ("$from" in value && Object.keys(value).length === 1) {
68
+ const fromValue = value.$from;
69
+ if (typeof fromValue !== "string" ||
70
+ !allowedRoots.includes(rootOf(fromValue))) {
71
+ errors.push(`${currentPath}: unsupported $from root "${String(fromValue)}".`);
72
+ }
73
+ return;
74
+ }
75
+ for (const [key, child] of Object.entries(value)) {
76
+ validateMatcherFromRoots(child, allowedRoots, currentPath ? `${currentPath}.${key}` : key, errors);
77
+ }
78
+ }
79
+ function validateVarsReferences(value, currentPath, errors) {
80
+ if (Array.isArray(value)) {
81
+ value.forEach((item, index) => {
82
+ validateVarsReferences(item, `${currentPath}[${index}]`, errors);
83
+ });
84
+ return;
85
+ }
86
+ if (!(0, json_1.isPlainObject)(value)) {
87
+ return;
88
+ }
89
+ if ("$from" in value &&
90
+ Object.keys(value).length === 1 &&
91
+ rootOf(String(value.$from)) === "vars") {
92
+ errors.push(`${currentPath}: $from vars.* requires sequence level 1 or above.`);
93
+ return;
94
+ }
95
+ for (const [key, child] of Object.entries(value)) {
96
+ validateVarsReferences(child, currentPath ? `${currentPath}.${key}` : key, errors);
97
+ }
98
+ }
99
+ function validateExpression(expr, allowedOperators, currentPath, errors) {
100
+ if (!(0, json_1.isPlainObject)(expr)) {
101
+ return;
102
+ }
103
+ const keys = Object.keys(expr);
104
+ if (keys.length !== 1) {
105
+ return;
106
+ }
107
+ const [operator] = keys;
108
+ if (operator === undefined) {
109
+ return;
110
+ }
111
+ if (!allowedOperators.has(operator)) {
112
+ errors.push(`${currentPath}: operator ${operator} is not allowed here.`);
113
+ return;
114
+ }
115
+ const value = expr[operator];
116
+ if (Array.isArray(value)) {
117
+ value.forEach((item, index) => {
118
+ validateExpression(item, allowedOperators, `${currentPath}.${operator}[${index}]`, errors);
119
+ });
120
+ }
121
+ else if ((0, json_1.isPlainObject)(value)) {
122
+ validateExpression(value, allowedOperators, `${currentPath}.${operator}`, errors);
123
+ }
124
+ }
125
+ function validateSequenceLevel(sequence, invariants, errors) {
126
+ for (const step of sequence.steps) {
127
+ if (sequence.level < 1 && step.bind !== undefined) {
128
+ errors.push(`sequence step ${step.stepId}: bind requires sequence level 1 or above.`);
129
+ }
130
+ if (sequence.level < 2 && step.when !== undefined) {
131
+ errors.push(`sequence step ${step.stepId}: when requires sequence level 2 or above.`);
132
+ }
133
+ if (step.when !== undefined) {
134
+ validateExpression(step.when, new Set(["$from", "$eq", "$and", "$or", "$not"]), `step ${step.stepId}.when`, errors);
135
+ }
136
+ }
137
+ if (sequence.level < 3 && invariants !== undefined && invariants.length > 0) {
138
+ errors.push("invariants require sequence level 3.");
139
+ }
140
+ if (sequence.level >= 3 && invariants !== undefined) {
141
+ for (const invariant of invariants) {
142
+ validateExpression(invariant.expr, new Set([
143
+ "$from",
144
+ "$eq",
145
+ "$and",
146
+ "$or",
147
+ "$not",
148
+ "$implies",
149
+ "$occurred",
150
+ "$count"
151
+ ]), `invariant ${invariant.id}.expr`, errors);
152
+ }
153
+ }
154
+ }
155
+ function validateBindings(steps, errors) {
156
+ for (const step of steps) {
157
+ if (step.bind === undefined) {
158
+ continue;
159
+ }
160
+ const allowedRoots = step.kind === "effect" ? ["args", "result", "error"] : ["payload"];
161
+ for (const sourcePath of Object.values(step.bind)) {
162
+ if (!allowedRoots.includes(rootOf(sourcePath))) {
163
+ errors.push(`sequence step ${step.stepId}: binding source ${sourcePath} is not allowed.`);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ function validateScenario(contract, scenario, containerKind, errors) {
169
+ validateReservedObject(scenario.expect, RESERVED_MATCHER_KEYS, `${contract.contractId}.${scenario.id}.expect`, errors);
170
+ validateMatcherFromRoots(scenario.expect.output, ["input", "stateBefore", "vars", "output", "error", "stateAfter"], `${contract.contractId}.${scenario.id}.expect.output`, errors);
171
+ validateMatcherFromRoots(scenario.expect.error, ["input", "stateBefore", "vars", "output", "error", "stateAfter"], `${contract.contractId}.${scenario.id}.expect.error`, errors);
172
+ validateMatcherFromRoots(scenario.expect.stateAfter, ["input", "stateBefore", "vars", "output", "error", "stateAfter"], `${contract.contractId}.${scenario.id}.expect.stateAfter`, errors);
173
+ if (scenario.precision === "sequence") {
174
+ if (scenario.expect.sequence === undefined) {
175
+ errors.push(`${contract.contractId}.${scenario.id}: precision=sequence requires expect.sequence.`);
176
+ }
177
+ else {
178
+ validateSequenceLevel(scenario.expect.sequence, scenario.expect.invariants, errors);
179
+ validateBindings(scenario.expect.sequence.steps, errors);
180
+ if (scenario.expect.sequence.level < 1) {
181
+ validateVarsReferences(scenario.expect.output, `${contract.contractId}.${scenario.id}.expect.output`, errors);
182
+ validateVarsReferences(scenario.expect.error, `${contract.contractId}.${scenario.id}.expect.error`, errors);
183
+ validateVarsReferences(scenario.expect.stateAfter, `${contract.contractId}.${scenario.id}.expect.stateAfter`, errors);
184
+ }
185
+ const summaryEffects = new Set(scenario.expect.summary.effects ?? []);
186
+ const summaryEmits = new Set(scenario.expect.summary.emits ?? []);
187
+ for (const step of scenario.expect.sequence.steps) {
188
+ if (scenario.expect.sequence.level < 1) {
189
+ if (step.kind === "effect") {
190
+ validateVarsReferences(step.args, `${step.stepId}.args`, errors);
191
+ validateVarsReferences(step.result, `${step.stepId}.result`, errors);
192
+ }
193
+ else {
194
+ validateVarsReferences(step.payload, `${step.stepId}.payload`, errors);
195
+ }
196
+ }
197
+ if (step.kind === "effect" && !summaryEffects.has(step.name)) {
198
+ errors.push(`${contract.contractId}.${scenario.id}: step ${step.stepId} effect ${step.name} must appear in summary.effects.`);
199
+ }
200
+ if (step.kind === "emit" && !summaryEmits.has(step.event)) {
201
+ errors.push(`${contract.contractId}.${scenario.id}: step ${step.stepId} event ${step.event} must appear in summary.emits.`);
202
+ }
203
+ if (step.kind === "effect") {
204
+ validateMatcherFromRoots(step.args, ["input", "stateBefore", "vars"], `${step.stepId}.args`, errors);
205
+ validateMatcherFromRoots(step.result, ["input", "stateBefore", "vars"], `${step.stepId}.result`, errors);
206
+ }
207
+ else {
208
+ validateMatcherFromRoots(step.payload, ["input", "stateBefore", "vars"], `${step.stepId}.payload`, errors);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ if (scenario.expect.invariants !== undefined &&
214
+ scenario.precision !== "sequence") {
215
+ errors.push(`${contract.contractId}.${scenario.id}: invariants require precision=sequence.`);
216
+ }
217
+ if (containerKind === "approved" && scenario.lifecycle.state === "inferred") {
218
+ errors.push(`${contract.contractId}.${scenario.id}: approved contracts cannot contain inferred scenarios.`);
219
+ }
220
+ if (containerKind === "proposal" && scenario.lifecycle.state !== "inferred") {
221
+ errors.push(`${contract.contractId}.${scenario.id}: proposals must use lifecycle.state=inferred.`);
222
+ }
223
+ if (scenario.lifecycle.state === "deprecated" &&
224
+ scenario.lifecycle.deprecation?.reason === undefined) {
225
+ errors.push(`${contract.contractId}.${scenario.id}: deprecated scenarios require deprecation.reason.`);
226
+ }
227
+ if (scenario.expect.invariants !== undefined &&
228
+ scenario.expect.sequence?.level !== 3) {
229
+ errors.push(`${contract.contractId}.${scenario.id}: invariants require sequence.level=3.`);
230
+ }
231
+ const stepIds = scenario.expect.sequence?.steps.map((step) => step.stepId) ?? [];
232
+ if (new Set(stepIds).size !== stepIds.length) {
233
+ errors.push(`${contract.contractId}.${scenario.id}: sequence step IDs must be unique.`);
234
+ }
235
+ }
236
+ function canonicalizeExpr(expr) {
237
+ if (Array.isArray(expr)) {
238
+ return expr.map((item) => canonicalizeExpr(item));
239
+ }
240
+ if (!(0, json_1.isPlainObject)(expr)) {
241
+ return expr;
242
+ }
243
+ const keys = Object.keys(expr);
244
+ const [key] = keys;
245
+ if (key !== undefined && keys.length === 1 && RESERVED_EXPR_KEYS.has(key)) {
246
+ const value = expr[key];
247
+ if (Array.isArray(value)) {
248
+ return {
249
+ [key]: value.map((item) => canonicalizeExpr(item))
250
+ };
251
+ }
252
+ if ((0, json_1.isPlainObject)(value)) {
253
+ return { [key]: canonicalizeExpr(value) };
254
+ }
255
+ return { [key]: value };
256
+ }
257
+ return Object.fromEntries(Object.keys(expr)
258
+ .sort((left, right) => left.localeCompare(right))
259
+ .map((key) => [key, canonicalizeExpr(expr[key])]));
260
+ }
261
+ function sortBindMap(bind) {
262
+ if (bind === undefined) {
263
+ return undefined;
264
+ }
265
+ return Object.fromEntries(Object.keys(bind)
266
+ .sort((left, right) => left.localeCompare(right))
267
+ .map((key) => [key, bind[key]]));
268
+ }
269
+ function canonicalizeValueMatcher(matcher) {
270
+ if (matcher === undefined ||
271
+ matcher === null ||
272
+ typeof matcher !== "object") {
273
+ return matcher;
274
+ }
275
+ if (Array.isArray(matcher)) {
276
+ return matcher.map((item) => canonicalizeValueMatcher(item));
277
+ }
278
+ const keys = Object.keys(matcher);
279
+ const [key] = keys;
280
+ if (key !== undefined &&
281
+ keys.length === 1 &&
282
+ RESERVED_MATCHER_KEYS.has(key)) {
283
+ const value = matcher[key];
284
+ if (Array.isArray(value)) {
285
+ return { [key]: [...value] };
286
+ }
287
+ return { [key]: value };
288
+ }
289
+ return Object.fromEntries(keys
290
+ .sort((left, right) => left.localeCompare(right))
291
+ .map((key) => [
292
+ key,
293
+ canonicalizeValueMatcher(matcher[key])
294
+ ]));
295
+ }
296
+ function canonicalizeScenarioExpectations(expect) {
297
+ return {
298
+ summary: {
299
+ ...((0, json_1.sortUniqueStrings)(expect.summary.effects)
300
+ ? { effects: (0, json_1.sortUniqueStrings)(expect.summary.effects) }
301
+ : {}),
302
+ ...((0, json_1.sortUniqueStrings)(expect.summary.emits)
303
+ ? { emits: (0, json_1.sortUniqueStrings)(expect.summary.emits) }
304
+ : {}),
305
+ ...((0, json_1.sortUniqueStrings)(expect.summary.allowExtraEffects)
306
+ ? {
307
+ allowExtraEffects: (0, json_1.sortUniqueStrings)(expect.summary.allowExtraEffects)
308
+ }
309
+ : {}),
310
+ ...((0, json_1.sortUniqueStrings)(expect.summary.allowExtraEmits)
311
+ ? { allowExtraEmits: (0, json_1.sortUniqueStrings)(expect.summary.allowExtraEmits) }
312
+ : {})
313
+ },
314
+ ...(expect.sequence
315
+ ? {
316
+ sequence: {
317
+ level: expect.sequence.level,
318
+ steps: expect.sequence.steps.map((step) => step.kind === "effect"
319
+ ? {
320
+ stepId: step.stepId,
321
+ ...(step.optional !== undefined
322
+ ? { optional: step.optional }
323
+ : {}),
324
+ ...(step.when ? { when: canonicalizeExpr(step.when) } : {}),
325
+ kind: "effect",
326
+ name: step.name,
327
+ ...(step.args !== undefined
328
+ ? { args: canonicalizeValueMatcher(step.args) }
329
+ : {}),
330
+ ...(step.result !== undefined
331
+ ? { result: canonicalizeValueMatcher(step.result) }
332
+ : {}),
333
+ ...(sortBindMap(step.bind)
334
+ ? { bind: sortBindMap(step.bind) }
335
+ : {})
336
+ }
337
+ : {
338
+ stepId: step.stepId,
339
+ ...(step.optional !== undefined
340
+ ? { optional: step.optional }
341
+ : {}),
342
+ ...(step.when ? { when: canonicalizeExpr(step.when) } : {}),
343
+ kind: "emit",
344
+ event: step.event,
345
+ ...(step.payload !== undefined
346
+ ? { payload: canonicalizeValueMatcher(step.payload) }
347
+ : {}),
348
+ ...(sortBindMap(step.bind)
349
+ ? { bind: sortBindMap(step.bind) }
350
+ : {})
351
+ })
352
+ }
353
+ }
354
+ : {}),
355
+ ...(expect.output !== undefined
356
+ ? { output: canonicalizeValueMatcher(expect.output) }
357
+ : {}),
358
+ ...(expect.error !== undefined
359
+ ? {
360
+ error: canonicalizeValueMatcher(expect.error)
361
+ }
362
+ : {}),
363
+ ...(expect.stateAfter !== undefined
364
+ ? { stateAfter: canonicalizeValueMatcher(expect.stateAfter) }
365
+ : {}),
366
+ ...(expect.invariants
367
+ ? {
368
+ invariants: [...expect.invariants]
369
+ .sort((left, right) => left.id.localeCompare(right.id))
370
+ .map((invariant) => ({
371
+ id: invariant.id,
372
+ name: invariant.name,
373
+ severity: invariant.severity,
374
+ message: invariant.message,
375
+ expr: canonicalizeExpr(invariant.expr)
376
+ }))
377
+ }
378
+ : {})
379
+ };
380
+ }
381
+ function canonicalizeScenario(scenario) {
382
+ return {
383
+ id: scenario.id,
384
+ ...(scenario.displayName ? { displayName: scenario.displayName } : {}),
385
+ lifecycle: {
386
+ state: scenario.lifecycle.state,
387
+ ...(scenario.lifecycle.approval
388
+ ? {
389
+ approval: {
390
+ ...(scenario.lifecycle.approval.recordedBy
391
+ ? { recordedBy: scenario.lifecycle.approval.recordedBy }
392
+ : {}),
393
+ ...(scenario.lifecycle.approval.recordedAt
394
+ ? { recordedAt: scenario.lifecycle.approval.recordedAt }
395
+ : {}),
396
+ ...(scenario.lifecycle.approval.derivedFrom
397
+ ? {
398
+ derivedFrom: {
399
+ ...(scenario.lifecycle.approval.derivedFrom.traceHash
400
+ ? {
401
+ traceHash: scenario.lifecycle.approval.derivedFrom.traceHash
402
+ }
403
+ : {}),
404
+ ...(scenario.lifecycle.approval.derivedFrom.gitSha
405
+ ? {
406
+ gitSha: scenario.lifecycle.approval.derivedFrom.gitSha
407
+ }
408
+ : {}),
409
+ ...(scenario.lifecycle.approval.derivedFrom.toolVersion
410
+ ? {
411
+ toolVersion: scenario.lifecycle.approval.derivedFrom
412
+ .toolVersion
413
+ }
414
+ : {})
415
+ }
416
+ }
417
+ : {})
418
+ }
419
+ }
420
+ : {}),
421
+ ...(scenario.lifecycle.deprecation
422
+ ? {
423
+ deprecation: {
424
+ ...(scenario.lifecycle.deprecation.recordedBy
425
+ ? { recordedBy: scenario.lifecycle.deprecation.recordedBy }
426
+ : {}),
427
+ ...(scenario.lifecycle.deprecation.recordedAt
428
+ ? { recordedAt: scenario.lifecycle.deprecation.recordedAt }
429
+ : {}),
430
+ reason: scenario.lifecycle.deprecation.reason
431
+ }
432
+ }
433
+ : {})
434
+ },
435
+ precision: scenario.precision,
436
+ expect: canonicalizeScenarioExpectations(scenario.expect),
437
+ ...(scenario.options
438
+ ? {
439
+ options: {
440
+ ...(scenario.options.strictObjects !== undefined
441
+ ? { strictObjects: scenario.options.strictObjects }
442
+ : {}),
443
+ ...(scenario.options.strictArrays !== undefined
444
+ ? { strictArrays: scenario.options.strictArrays }
445
+ : {})
446
+ }
447
+ }
448
+ : {}),
449
+ ...(scenario.notes ? { notes: [...scenario.notes] } : {})
450
+ };
451
+ }
452
+ function canonicalizeContractFile(contract) {
453
+ return {
454
+ schemaVersion: "driftfence/v2",
455
+ contractId: contract.contractId,
456
+ ...(contract.displayName ? { displayName: contract.displayName } : {}),
457
+ owners: (0, json_1.sortUniqueStrings)(contract.owners) ?? [],
458
+ ...(contract.boundaries
459
+ ? {
460
+ boundaries: [...contract.boundaries].sort((left, right) => left.kind === right.kind
461
+ ? left.name.localeCompare(right.name)
462
+ : left.kind.localeCompare(right.kind))
463
+ }
464
+ : {}),
465
+ ...(contract.source
466
+ ? {
467
+ source: {
468
+ language: "typescript",
469
+ ...(contract.source.entrypoint
470
+ ? { entrypoint: contract.source.entrypoint }
471
+ : {}),
472
+ ...(contract.source.files
473
+ ? { files: (0, json_1.sortUniqueStrings)(contract.source.files) }
474
+ : {}),
475
+ ...(contract.source.testCommand
476
+ ? { testCommand: contract.source.testCommand }
477
+ : {})
478
+ }
479
+ }
480
+ : {}),
481
+ ...(contract.defaults
482
+ ? {
483
+ defaults: {
484
+ ...(contract.defaults.strictObjects !== undefined
485
+ ? { strictObjects: contract.defaults.strictObjects }
486
+ : {}),
487
+ ...(contract.defaults.strictArrays !== undefined
488
+ ? { strictArrays: contract.defaults.strictArrays }
489
+ : {})
490
+ }
491
+ }
492
+ : {}),
493
+ scenarios: [...contract.scenarios]
494
+ .sort((left, right) => left.id.localeCompare(right.id))
495
+ .map((scenario) => canonicalizeScenario(scenario))
496
+ };
497
+ }
498
+ function validateContractFile(contract, containerKind, filePath) {
499
+ const errors = [];
500
+ if (containerKind === "approved" && contract.owners.length === 0) {
501
+ errors.push(`${contract.contractId}: approved contracts require at least one owner.`);
502
+ }
503
+ const scenarioIds = contract.scenarios.map((scenario) => scenario.id);
504
+ if (new Set(scenarioIds).size !== scenarioIds.length) {
505
+ errors.push(`${contract.contractId}: scenario IDs must be unique within a contract.`);
506
+ }
507
+ for (const scenario of contract.scenarios) {
508
+ validateScenario(contract, scenario, containerKind, errors);
509
+ }
510
+ if (errors.length > 0) {
511
+ throw new errors_1.DriftFenceError(`Invalid contract at ${filePath}:\n- ${errors.join("\n- ")}`, errors_1.EXIT_CODES.CONTRACT_ERROR);
512
+ }
513
+ }
514
+ async function loadContractFile(filePath, containerKind) {
515
+ let raw;
516
+ try {
517
+ raw = (0, yaml_1.parse)(await (0, files_1.readUtf8File)(filePath));
518
+ }
519
+ catch (error) {
520
+ throw new errors_1.DriftFenceError(`Invalid YAML at ${filePath}: ${error instanceof Error ? error.message : String(error)}`, errors_1.EXIT_CODES.CONTRACT_ERROR);
521
+ }
522
+ const parsed = schemas_1.workflowContractFileSchema.safeParse(raw);
523
+ if (!parsed.success) {
524
+ throw new errors_1.DriftFenceError(`Invalid contract at ${filePath}: ${parsed.error.message}`, errors_1.EXIT_CODES.CONTRACT_ERROR);
525
+ }
526
+ const contract = parsed.data;
527
+ validateContractFile(contract, containerKind, filePath);
528
+ return {
529
+ ...canonicalizeContractFile(contract),
530
+ filePath
531
+ };
532
+ }
533
+ async function loadContracts(baseDir, containerKind) {
534
+ if (!(await (0, files_1.pathExists)(baseDir))) {
535
+ return [];
536
+ }
537
+ const filePaths = await (0, files_1.readDirectoryFiles)(baseDir, (filePath) => filePath.endsWith(".yaml") || filePath.endsWith(".yml"));
538
+ const contracts = await Promise.all(filePaths.map((filePath) => loadContractFile(filePath, containerKind)));
539
+ const contractIds = new Set();
540
+ for (const contract of contracts) {
541
+ if (contractIds.has(contract.contractId)) {
542
+ throw new errors_1.DriftFenceError(`Duplicate contractId detected: ${contract.contractId}`, errors_1.EXIT_CODES.CONTRACT_ERROR);
543
+ }
544
+ contractIds.add(contract.contractId);
545
+ }
546
+ return contracts.sort((left, right) => left.contractId.localeCompare(right.contractId));
547
+ }
548
+ function renderContractYaml(contract) {
549
+ return (0, yaml_1.stringify)(canonicalizeContractFile(contract), {
550
+ aliasDuplicateObjects: false,
551
+ lineWidth: 0
552
+ });
553
+ }
554
+ async function writeContractFile(baseDir, contract) {
555
+ const filePath = node_path_1.default.join(baseDir, `${(0, json_1.sanitizeFilename)(contract.contractId)}.yaml`);
556
+ await (0, files_1.writeFileAtomic)(filePath, renderContractYaml(contract));
557
+ return filePath;
558
+ }
559
+ function contractFilePath(baseDir, contractId) {
560
+ return node_path_1.default.join(baseDir, `${(0, json_1.sanitizeFilename)(contractId)}.yaml`);
561
+ }
562
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/io/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function ensureDirectory(dirPath: string): Promise<void>;
2
+ export declare function readUtf8File(filePath: string): Promise<string>;
3
+ export declare function writeFileAtomic(filePath: string, contents: string): Promise<void>;
4
+ export declare function pathExists(filePath: string): Promise<boolean>;
5
+ export declare function readDirectoryFiles(dirPath: string, predicate?: (candidatePath: string) => boolean): Promise<string[]>;
6
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/io/files.ts"],"names":[],"mappings":"AAGA,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,GAC7C,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBnB"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ensureDirectory = ensureDirectory;
7
+ exports.readUtf8File = readUtf8File;
8
+ exports.writeFileAtomic = writeFileAtomic;
9
+ exports.pathExists = pathExists;
10
+ exports.readDirectoryFiles = readDirectoryFiles;
11
+ const node_fs_1 = require("node:fs");
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ async function ensureDirectory(dirPath) {
14
+ await node_fs_1.promises.mkdir(dirPath, { recursive: true });
15
+ }
16
+ async function readUtf8File(filePath) {
17
+ return node_fs_1.promises.readFile(filePath, "utf8");
18
+ }
19
+ async function writeFileAtomic(filePath, contents) {
20
+ const directory = node_path_1.default.dirname(filePath);
21
+ await ensureDirectory(directory);
22
+ const temporaryPath = node_path_1.default.join(directory, `.${node_path_1.default.basename(filePath)}.tmp-${process.pid}-${Date.now()}`);
23
+ await node_fs_1.promises.writeFile(temporaryPath, contents, "utf8");
24
+ await node_fs_1.promises.rename(temporaryPath, filePath);
25
+ }
26
+ async function pathExists(filePath) {
27
+ try {
28
+ await node_fs_1.promises.access(filePath);
29
+ return true;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ async function readDirectoryFiles(dirPath, predicate) {
36
+ const entries = await node_fs_1.promises.readdir(dirPath, { withFileTypes: true });
37
+ const files = await Promise.all(entries.map(async (entry) => {
38
+ const fullPath = node_path_1.default.join(dirPath, entry.name);
39
+ if (entry.isDirectory()) {
40
+ return readDirectoryFiles(fullPath, predicate);
41
+ }
42
+ if (predicate && !predicate(fullPath)) {
43
+ return [];
44
+ }
45
+ return [fullPath];
46
+ }));
47
+ return files.flat().sort((left, right) => left.localeCompare(right));
48
+ }
49
+ //# sourceMappingURL=files.js.map