@alchemy.run/test 0.0.0 → 2.0.0-beta.85

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 (119) hide show
  1. package/LICENSE +201 -0
  2. package/bin/alchemy-test.ts +2 -0
  3. package/lib/Alchemy.d.ts +78 -0
  4. package/lib/Alchemy.d.ts.map +1 -0
  5. package/lib/Alchemy.js +194 -0
  6. package/lib/Alchemy.js.map +1 -0
  7. package/lib/Api.d.ts +134 -0
  8. package/lib/Api.d.ts.map +1 -0
  9. package/lib/Api.js +245 -0
  10. package/lib/Api.js.map +1 -0
  11. package/lib/Bun.d.ts +67 -0
  12. package/lib/Bun.d.ts.map +1 -0
  13. package/lib/Bun.js +143 -0
  14. package/lib/Bun.js.map +1 -0
  15. package/lib/Capture.d.ts +10 -0
  16. package/lib/Capture.d.ts.map +1 -0
  17. package/lib/Capture.js +68 -0
  18. package/lib/Capture.js.map +1 -0
  19. package/lib/Core.d.ts +287 -0
  20. package/lib/Core.d.ts.map +1 -0
  21. package/lib/Core.js +429 -0
  22. package/lib/Core.js.map +1 -0
  23. package/lib/DevCli.d.ts +47 -0
  24. package/lib/DevCli.d.ts.map +1 -0
  25. package/lib/DevCli.js +181 -0
  26. package/lib/DevCli.js.map +1 -0
  27. package/lib/Expect.d.ts +84 -0
  28. package/lib/Expect.d.ts.map +1 -0
  29. package/lib/Expect.js +518 -0
  30. package/lib/Expect.js.map +1 -0
  31. package/lib/FileLog.d.ts +27 -0
  32. package/lib/FileLog.d.ts.map +1 -0
  33. package/lib/FileLog.js +136 -0
  34. package/lib/FileLog.js.map +1 -0
  35. package/lib/Http.d.ts +109 -0
  36. package/lib/Http.d.ts.map +1 -0
  37. package/lib/Http.js +123 -0
  38. package/lib/Http.js.map +1 -0
  39. package/lib/Model.d.ts +98 -0
  40. package/lib/Model.d.ts.map +1 -0
  41. package/lib/Model.js +59 -0
  42. package/lib/Model.js.map +1 -0
  43. package/lib/PlainReporter.d.ts +19 -0
  44. package/lib/PlainReporter.d.ts.map +1 -0
  45. package/lib/PlainReporter.js +348 -0
  46. package/lib/PlainReporter.js.map +1 -0
  47. package/lib/Plan.d.ts +19 -0
  48. package/lib/Plan.d.ts.map +1 -0
  49. package/lib/Plan.js +32 -0
  50. package/lib/Plan.js.map +1 -0
  51. package/lib/Registry.d.ts +34 -0
  52. package/lib/Registry.d.ts.map +1 -0
  53. package/lib/Registry.js +80 -0
  54. package/lib/Registry.js.map +1 -0
  55. package/lib/Reporter.d.ts +160 -0
  56. package/lib/Reporter.d.ts.map +1 -0
  57. package/lib/Reporter.js +9 -0
  58. package/lib/Reporter.js.map +1 -0
  59. package/lib/Runner.d.ts +51 -0
  60. package/lib/Runner.d.ts.map +1 -0
  61. package/lib/Runner.js +1052 -0
  62. package/lib/Runner.js.map +1 -0
  63. package/lib/StrayOutput.d.ts +8 -0
  64. package/lib/StrayOutput.d.ts.map +1 -0
  65. package/lib/StrayOutput.js +259 -0
  66. package/lib/StrayOutput.js.map +1 -0
  67. package/lib/Tags.d.ts +17 -0
  68. package/lib/Tags.d.ts.map +1 -0
  69. package/lib/Tags.js +84 -0
  70. package/lib/Tags.js.map +1 -0
  71. package/lib/TestState.d.ts +12 -0
  72. package/lib/TestState.d.ts.map +1 -0
  73. package/lib/TestState.js +15 -0
  74. package/lib/TestState.js.map +1 -0
  75. package/lib/Tui.d.ts +4 -0
  76. package/lib/Tui.d.ts.map +1 -0
  77. package/lib/Tui.js +1137 -0
  78. package/lib/Tui.js.map +1 -0
  79. package/lib/Vitest.d.ts +58 -0
  80. package/lib/Vitest.d.ts.map +1 -0
  81. package/lib/Vitest.js +132 -0
  82. package/lib/Vitest.js.map +1 -0
  83. package/lib/WorktreeStage.d.ts +17 -0
  84. package/lib/WorktreeStage.d.ts.map +1 -0
  85. package/lib/WorktreeStage.js +48 -0
  86. package/lib/WorktreeStage.js.map +1 -0
  87. package/lib/cli.d.ts +2 -0
  88. package/lib/cli.d.ts.map +1 -0
  89. package/lib/cli.js +222 -0
  90. package/lib/cli.js.map +1 -0
  91. package/lib/index.d.ts +14 -0
  92. package/lib/index.d.ts.map +1 -0
  93. package/lib/index.js +12 -0
  94. package/lib/index.js.map +1 -0
  95. package/package.json +73 -3
  96. package/src/Alchemy.ts +335 -0
  97. package/src/Api.ts +521 -0
  98. package/src/Bun.ts +256 -0
  99. package/src/Capture.ts +72 -0
  100. package/src/Core.ts +872 -0
  101. package/src/DevCli.ts +229 -0
  102. package/src/Expect.ts +763 -0
  103. package/src/FileLog.ts +158 -0
  104. package/src/Http.ts +201 -0
  105. package/src/Model.ts +160 -0
  106. package/src/PlainReporter.ts +426 -0
  107. package/src/Plan.ts +45 -0
  108. package/src/Registry.ts +101 -0
  109. package/src/Reporter.ts +171 -0
  110. package/src/Runner.ts +1341 -0
  111. package/src/StrayOutput.ts +283 -0
  112. package/src/Tags.ts +100 -0
  113. package/src/TestState.ts +35 -0
  114. package/src/Tui.ts +1272 -0
  115. package/src/Vitest.ts +239 -0
  116. package/src/WorktreeStage.ts +45 -0
  117. package/src/cli.ts +330 -0
  118. package/src/index.ts +57 -0
  119. package/README.md +0 -9
package/lib/Expect.js ADDED
@@ -0,0 +1,518 @@
1
+ /**
2
+ * A from-scratch, dependency-free `expect` covering the matcher surface used
3
+ * by the alchemy test suite. Vitest-compatible semantics for:
4
+ *
5
+ * - equality: toBe, toEqual, toStrictEqual
6
+ * - presence: toBeDefined, toBeUndefined, toBeNull, toBeTruthy, toBeFalsy, toBeNaN
7
+ * - containers: toContain, toContainEqual, toHaveLength, toHaveProperty
8
+ * - strings: toMatch
9
+ * - objects: toMatchObject, toBeInstanceOf, toBeTypeOf
10
+ * - numbers: toBeGreaterThan(OrEqual), toBeLessThan(OrEqual), toBeCloseTo
11
+ * - misc: toSatisfy, toBeOneOf, toThrow / toThrowError
12
+ * - modifiers: .not, .resolves, .rejects
13
+ * - asymmetric: expect.any, expect.anything, expect.arrayContaining,
14
+ * expect.objectContaining, expect.stringContaining, expect.stringMatching
15
+ * - expect.fail
16
+ *
17
+ * Assertion failures throw {@link AssertionError} (a plain Error subclass) so
18
+ * they propagate through Effect as defects and render with a clean message.
19
+ */
20
+ // ---------------------------------------------------------------------------
21
+ // AssertionError
22
+ // ---------------------------------------------------------------------------
23
+ export class AssertionError extends Error {
24
+ actual;
25
+ expected;
26
+ name = "AssertionError";
27
+ constructor(message, actual, expected) {
28
+ super(message);
29
+ this.actual = actual;
30
+ this.expected = expected;
31
+ }
32
+ }
33
+ // ---------------------------------------------------------------------------
34
+ // stringify — small, cycle-safe inspector for failure messages
35
+ // ---------------------------------------------------------------------------
36
+ const MAX_DEPTH = 4;
37
+ const MAX_ITEMS = 25;
38
+ const MAX_STRING = 2000;
39
+ export const stringify = (value) => {
40
+ try {
41
+ const out = inspect(value, 0, new Set());
42
+ return out.length > MAX_STRING ? `${out.slice(0, MAX_STRING)}…` : out;
43
+ }
44
+ catch {
45
+ // Coercion-hostile values (e.g. alchemy Output proxies throw on string
46
+ // coercion) must never break assertion-message rendering.
47
+ return "[unprintable]";
48
+ }
49
+ };
50
+ const inspect = (value, depth, seen) => {
51
+ try {
52
+ return inspectUnsafe(value, depth, seen);
53
+ }
54
+ catch {
55
+ return "[unprintable]";
56
+ }
57
+ };
58
+ const inspectUnsafe = (value, depth, seen) => {
59
+ if (value === null)
60
+ return "null";
61
+ if (value === undefined)
62
+ return "undefined";
63
+ switch (typeof value) {
64
+ case "string":
65
+ return JSON.stringify(value);
66
+ case "number":
67
+ case "boolean":
68
+ return String(value);
69
+ case "bigint":
70
+ return `${value}n`;
71
+ case "symbol":
72
+ return value.toString();
73
+ case "function":
74
+ return `[Function ${value.name || "anonymous"}]`;
75
+ }
76
+ if (isAsymmetric(value))
77
+ return value.toString();
78
+ if (value instanceof Date)
79
+ return `Date(${value.toISOString()})`;
80
+ if (value instanceof RegExp)
81
+ return value.toString();
82
+ if (value instanceof Error)
83
+ return `${value.name}(${JSON.stringify(value.message)})`;
84
+ if (seen.has(value))
85
+ return "[Circular]";
86
+ if (depth > MAX_DEPTH)
87
+ return Array.isArray(value) ? "[…]" : "{…}";
88
+ seen.add(value);
89
+ try {
90
+ if (Array.isArray(value)) {
91
+ const items = value.slice(0, MAX_ITEMS).map((v) => inspect(v, depth + 1, seen));
92
+ if (value.length > MAX_ITEMS)
93
+ items.push(`… ${value.length - MAX_ITEMS} more`);
94
+ return `[ ${items.join(", ")} ]`;
95
+ }
96
+ if (value instanceof Map) {
97
+ const items = [...value.entries()]
98
+ .slice(0, MAX_ITEMS)
99
+ .map(([k, v]) => `${inspect(k, depth + 1, seen)} => ${inspect(v, depth + 1, seen)}`);
100
+ return `Map { ${items.join(", ")} }`;
101
+ }
102
+ if (value instanceof Set) {
103
+ const items = [...value.values()].slice(0, MAX_ITEMS).map((v) => inspect(v, depth + 1, seen));
104
+ return `Set { ${items.join(", ")} }`;
105
+ }
106
+ const proto = Object.getPrototypeOf(value);
107
+ const ctor = proto !== null && proto !== Object.prototype && proto.constructor?.name !== "Object"
108
+ ? `${proto.constructor?.name ?? ""} `
109
+ : "";
110
+ const entries = Object.entries(value).slice(0, MAX_ITEMS);
111
+ const body = entries.map(([k, v]) => `${k}: ${inspect(v, depth + 1, seen)}`).join(", ");
112
+ return `${ctor}{ ${body} }`;
113
+ }
114
+ finally {
115
+ seen.delete(value);
116
+ }
117
+ };
118
+ /**
119
+ * Identity-based registry. A `Symbol in value` check would be unreliable:
120
+ * alchemy's `Output`/`PropExpr` proxies answer `true` for arbitrary `has`
121
+ * probes, which would misclassify them as matchers.
122
+ */
123
+ const asymmetricRegistry = new WeakSet();
124
+ const isAsymmetric = (value) => typeof value === "object" && value !== null && asymmetricRegistry.has(value);
125
+ const asymmetric = (label, matches) => {
126
+ const matcher = {
127
+ matches,
128
+ toString: () => label,
129
+ };
130
+ asymmetricRegistry.add(matcher);
131
+ return matcher;
132
+ };
133
+ const anyMatcher = (ctor) => asymmetric(`Any<${ctor?.name ?? "?"}>`, (actual) => {
134
+ if (ctor === String)
135
+ return typeof actual === "string" || actual instanceof String;
136
+ if (ctor === Number)
137
+ return typeof actual === "number" || actual instanceof Number;
138
+ if (ctor === Boolean)
139
+ return typeof actual === "boolean" || actual instanceof Boolean;
140
+ if (ctor === BigInt)
141
+ return typeof actual === "bigint";
142
+ if (ctor === Symbol)
143
+ return typeof actual === "symbol";
144
+ if (ctor === Function)
145
+ return typeof actual === "function";
146
+ if (ctor === Object)
147
+ return typeof actual === "object" && actual !== null;
148
+ if (ctor === Array)
149
+ return Array.isArray(actual);
150
+ return actual instanceof ctor;
151
+ });
152
+ // ---------------------------------------------------------------------------
153
+ // Deep equality (jest `toEqual` semantics: undefined-valued keys are ignored,
154
+ // asymmetric matchers are honored on the expected side)
155
+ // ---------------------------------------------------------------------------
156
+ export const equals = (actual, expected, strict = false) => eq(actual, expected, strict, new Map());
157
+ const definedKeys = (obj) => Reflect.ownKeys(obj).filter((k) => obj[k] !== undefined);
158
+ const eq = (a, b, strict, seen) => {
159
+ if (isAsymmetric(b))
160
+ return b.matches(a);
161
+ if (isAsymmetric(a))
162
+ return a.matches(b);
163
+ if (Object.is(a, b))
164
+ return true;
165
+ if (typeof a !== typeof b)
166
+ return false;
167
+ if (typeof a !== "object" || a === null || b === null)
168
+ return false;
169
+ const objA = a;
170
+ const objB = b;
171
+ if (seen.get(a) === b)
172
+ return true;
173
+ seen.set(a, b);
174
+ try {
175
+ if (a instanceof Date || b instanceof Date) {
176
+ return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();
177
+ }
178
+ if (a instanceof Error || b instanceof Error) {
179
+ // Vitest semantics: errors match on class, message and own enumerable
180
+ // fields (e.g. Data.TaggedError payloads) — never on `stack`.
181
+ if (!(a instanceof Error) || !(b instanceof Error))
182
+ return false;
183
+ if (a.name !== b.name || a.message !== b.message)
184
+ return false;
185
+ const fieldsOf = (error) => {
186
+ const fields = {};
187
+ for (const [key, value] of Object.entries(error)) {
188
+ if (key === "stack" || key === "message" || key === "name")
189
+ continue;
190
+ if (value !== undefined)
191
+ fields[key] = value;
192
+ }
193
+ return fields;
194
+ };
195
+ return eq(fieldsOf(a), fieldsOf(b), false, seen);
196
+ }
197
+ if (a instanceof RegExp || b instanceof RegExp) {
198
+ return (a instanceof RegExp && b instanceof RegExp && a.source === b.source && a.flags === b.flags);
199
+ }
200
+ if (a instanceof URL || b instanceof URL) {
201
+ return a instanceof URL && b instanceof URL && a.href === b.href;
202
+ }
203
+ if (Array.isArray(a) || Array.isArray(b)) {
204
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {
205
+ return false;
206
+ }
207
+ for (let i = 0; i < a.length; i++) {
208
+ if (!eq(a[i], b[i], strict, seen))
209
+ return false;
210
+ }
211
+ return true;
212
+ }
213
+ if (a instanceof Map || b instanceof Map) {
214
+ if (!(a instanceof Map) || !(b instanceof Map) || a.size !== b.size) {
215
+ return false;
216
+ }
217
+ for (const [k, v] of a) {
218
+ if (!b.has(k) || !eq(v, b.get(k), strict, seen))
219
+ return false;
220
+ }
221
+ return true;
222
+ }
223
+ if (a instanceof Set || b instanceof Set) {
224
+ if (!(a instanceof Set) || !(b instanceof Set) || a.size !== b.size) {
225
+ return false;
226
+ }
227
+ outer: for (const v of a) {
228
+ if (b.has(v))
229
+ continue;
230
+ for (const w of b) {
231
+ if (eq(v, w, strict, seen))
232
+ continue outer;
233
+ }
234
+ return false;
235
+ }
236
+ return true;
237
+ }
238
+ if (ArrayBuffer.isView(a) || ArrayBuffer.isView(b)) {
239
+ if (!ArrayBuffer.isView(a) || !ArrayBuffer.isView(b))
240
+ return false;
241
+ const ta = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
242
+ const tb = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
243
+ if (ta.length !== tb.length)
244
+ return false;
245
+ for (let i = 0; i < ta.length; i++)
246
+ if (ta[i] !== tb[i])
247
+ return false;
248
+ return true;
249
+ }
250
+ if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) {
251
+ return false;
252
+ }
253
+ const keysA = strict ? Reflect.ownKeys(objA) : definedKeys(objA);
254
+ const keysB = strict ? Reflect.ownKeys(objB) : definedKeys(objB);
255
+ if (keysA.length !== keysB.length)
256
+ return false;
257
+ for (const k of keysA) {
258
+ if (!(k in objB) && objB[k] === undefined && !strict)
259
+ return false;
260
+ if (!eq(objA[k], objB[k], strict, seen))
261
+ return false;
262
+ }
263
+ return true;
264
+ }
265
+ finally {
266
+ seen.delete(a);
267
+ }
268
+ };
269
+ /**
270
+ * Object-like values for structural matching. Includes functions because
271
+ * alchemy's `Output` proxies wrap a function target (so they're callable)
272
+ * while still exposing data properties.
273
+ */
274
+ const isObjectLike = (value) => value !== null && (typeof value === "object" || typeof value === "function");
275
+ /** Subset match for toMatchObject: every key in `expected` must match. */
276
+ const matchesObject = (actual, expected, seen) => {
277
+ if (isAsymmetric(expected))
278
+ return expected.matches(actual);
279
+ if (typeof expected !== "object" || expected === null) {
280
+ return eq(actual, expected, false, seen);
281
+ }
282
+ if (!isObjectLike(actual))
283
+ return false;
284
+ if (Array.isArray(expected)) {
285
+ if (!Array.isArray(actual) || actual.length !== expected.length)
286
+ return false;
287
+ return expected.every((e, i) => matchesObject(actual[i], e, seen));
288
+ }
289
+ if (expected instanceof Date ||
290
+ expected instanceof RegExp ||
291
+ expected instanceof Map ||
292
+ expected instanceof Set) {
293
+ return eq(actual, expected, false, seen);
294
+ }
295
+ if (seen.get(actual) === expected)
296
+ return true;
297
+ seen.set(actual, expected);
298
+ try {
299
+ for (const k of Reflect.ownKeys(expected)) {
300
+ const e = expected[k];
301
+ if (e === undefined && !(k in actual))
302
+ continue;
303
+ if (!matchesObject(actual[k], e, seen))
304
+ return false;
305
+ }
306
+ return true;
307
+ }
308
+ finally {
309
+ seen.delete(actual);
310
+ }
311
+ };
312
+ const fail = (message, actual, expected) => {
313
+ throw new AssertionError(message, actual, expected);
314
+ };
315
+ const check = (pass, negated, message, actual, expected) => {
316
+ if (pass === negated) {
317
+ fail(negated ? `NOT: ${message()}` : message(), actual, expected);
318
+ }
319
+ };
320
+ const resolveThrown = (actual) => {
321
+ if (typeof actual !== "function") {
322
+ // expect(error).toThrow — vitest allows passing an already-caught error
323
+ return { threw: true, error: actual };
324
+ }
325
+ try {
326
+ actual();
327
+ return { threw: false, error: undefined };
328
+ }
329
+ catch (error) {
330
+ return { threw: true, error };
331
+ }
332
+ };
333
+ const throwMatches = (error, expected) => {
334
+ if (expected === undefined)
335
+ return true;
336
+ const message = error instanceof Error ? error.message : String(error);
337
+ if (typeof expected === "string")
338
+ return message.includes(expected);
339
+ if (expected instanceof RegExp)
340
+ return expected.test(message);
341
+ if (expected instanceof Error)
342
+ return message === expected.message;
343
+ return error instanceof expected;
344
+ };
345
+ const getPath = (target, path) => {
346
+ const parts = Array.isArray(path)
347
+ ? path
348
+ : path.split(".").flatMap((segment) => segment
349
+ .split(/[[\]]/)
350
+ .filter((s) => s !== "")
351
+ .map((s) => (/^\d+$/.test(s) ? Number(s) : s)));
352
+ let current = target;
353
+ for (const part of parts) {
354
+ if (current === null || current === undefined || !(part in Object(current))) {
355
+ return { found: false, value: undefined };
356
+ }
357
+ current = current[part];
358
+ }
359
+ return { found: true, value: current };
360
+ };
361
+ const makeMatchers = (actual, negated) => {
362
+ const str = (v) => stringify(v);
363
+ const self = {
364
+ toBe: (expected) => check(Object.is(actual, expected), negated, () => `expected ${str(actual)} to be ${str(expected)}`, actual, expected),
365
+ toEqual: (expected) => check(equals(actual, expected), negated, () => `expected ${str(actual)} to equal ${str(expected)}`, actual, expected),
366
+ toStrictEqual: (expected) => check(equals(actual, expected, true), negated, () => `expected ${str(actual)} to strictly equal ${str(expected)}`, actual, expected),
367
+ toBeDefined: () => check(actual !== undefined, negated, () => `expected value to be defined`),
368
+ toBeUndefined: () => check(actual === undefined, negated, () => `expected ${str(actual)} to be undefined`),
369
+ toBeNull: () => check(actual === null, negated, () => `expected ${str(actual)} to be null`),
370
+ toBeTruthy: () => check(!!actual, negated, () => `expected ${str(actual)} to be truthy`),
371
+ toBeFalsy: () => check(!actual, negated, () => `expected ${str(actual)} to be falsy`),
372
+ toBeNaN: () => check(typeof actual === "number" && Number.isNaN(actual), negated, () => `expected ${str(actual)} to be NaN`),
373
+ toContain: (item) => {
374
+ let pass = false;
375
+ if (typeof actual === "string") {
376
+ pass = typeof item === "string" && actual.includes(item);
377
+ }
378
+ else if (Array.isArray(actual)) {
379
+ pass = actual.includes(item);
380
+ }
381
+ else if (actual instanceof Set) {
382
+ pass = actual.has(item);
383
+ }
384
+ else if (actual !== null &&
385
+ typeof actual === "object" &&
386
+ Symbol.iterator in actual) {
387
+ pass = [...actual].includes(item);
388
+ }
389
+ check(pass, negated, () => `expected ${str(actual)} to contain ${str(item)}`, actual, item);
390
+ },
391
+ toContainEqual: (item) => {
392
+ const values = Array.isArray(actual)
393
+ ? actual
394
+ : actual instanceof Set
395
+ ? [...actual]
396
+ : actual !== null && typeof actual === "object" && Symbol.iterator in actual
397
+ ? [...actual]
398
+ : undefined;
399
+ check(values !== undefined && values.some((v) => equals(v, item)), negated, () => `expected ${str(actual)} to contain an element equal to ${str(item)}`, actual, item);
400
+ },
401
+ toHaveLength: (length) => {
402
+ const actualLength = typeof actual === "string" || Array.isArray(actual)
403
+ ? actual.length
404
+ : (actual?.length ?? actual?.size);
405
+ check(actualLength === length, negated, () => `expected length ${str(actualLength)} to be ${length} (value: ${str(actual)})`, actualLength, length);
406
+ },
407
+ toHaveProperty: (path, ...rest) => {
408
+ const { found, value } = getPath(actual, path);
409
+ const pass = found && (rest.length === 0 || equals(value, rest[0]));
410
+ check(pass, negated, () => rest.length === 0
411
+ ? `expected ${str(actual)} to have property ${JSON.stringify(String(path))}`
412
+ : `expected property ${JSON.stringify(String(path))} of ${str(actual)} to equal ${str(rest[0])}, got ${str(value)}`, value, rest[0]);
413
+ },
414
+ toMatch: (pattern) => {
415
+ const text = typeof actual === "string" ? actual : undefined;
416
+ const pass = text !== undefined &&
417
+ (typeof pattern === "string" ? text.includes(pattern) : pattern.test(text));
418
+ check(pass, negated, () => `expected ${str(actual)} to match ${str(pattern)}`, actual, pattern);
419
+ },
420
+ toMatchObject: (expected) => check(matchesObject(actual, expected, new Map()), negated, () => `expected ${str(actual)} to match object ${str(expected)}`, actual, expected),
421
+ toThrow: (expected) => {
422
+ const { threw, error } = resolveThrown(actual);
423
+ check(threw && throwMatches(error, expected), negated, () => threw
424
+ ? `expected thrown error ${str(error)} to match ${str(expected)}`
425
+ : `expected function to throw`, error, expected);
426
+ },
427
+ toThrowError: (expected) => self.toThrow(expected),
428
+ toBeGreaterThan: (expected) => check(actual > expected, negated, () => `expected ${str(actual)} to be greater than ${str(expected)}`, actual, expected),
429
+ toBeGreaterThanOrEqual: (expected) => check(actual >= expected, negated, () => `expected ${str(actual)} to be >= ${str(expected)}`, actual, expected),
430
+ toBeLessThan: (expected) => check(actual < expected, negated, () => `expected ${str(actual)} to be less than ${str(expected)}`, actual, expected),
431
+ toBeLessThanOrEqual: (expected) => check(actual <= expected, negated, () => `expected ${str(actual)} to be <= ${str(expected)}`, actual, expected),
432
+ toBeCloseTo: (expected, precision = 2) => check(typeof actual === "number" && Math.abs(actual - expected) < 10 ** -precision / 2, negated, () => `expected ${str(actual)} to be close to ${expected} (precision ${precision})`, actual, expected),
433
+ toBeInstanceOf: (ctor) => check(actual instanceof ctor, negated, () => `expected ${str(actual)} to be an instance of ${ctor.name}`, actual, ctor),
434
+ toBeTypeOf: (type) => check(typeof actual === type, negated, () => `expected ${str(actual)} (${typeof actual}) to be of type ${type}`, typeof actual, type),
435
+ toSatisfy: (predicate) => check(predicate(actual), negated, () => `expected ${str(actual)} to satisfy ${predicate.name || "predicate"}`, actual),
436
+ toBeOneOf: (values) => check(values.some((v) => equals(actual, v)), negated, () => `expected ${str(actual)} to be one of ${str(values)}`, actual, values),
437
+ get not() {
438
+ return makeMatchers(actual, !negated);
439
+ },
440
+ get resolves() {
441
+ return makePromiseMatchers(actual, negated, "resolves");
442
+ },
443
+ get rejects() {
444
+ return makePromiseMatchers(actual, negated, "rejects");
445
+ },
446
+ };
447
+ return self;
448
+ };
449
+ const makePromiseMatchers = (actual, negated, kind) => {
450
+ const settle = async () => {
451
+ const promise = typeof actual === "function" ? actual() : actual;
452
+ if (kind === "resolves")
453
+ return await promise;
454
+ try {
455
+ const value = await promise;
456
+ fail(`expected promise to reject, but it resolved with ${stringify(value)}`);
457
+ }
458
+ catch (error) {
459
+ if (error instanceof AssertionError)
460
+ throw error;
461
+ return error;
462
+ }
463
+ };
464
+ return new Proxy({}, {
465
+ get(_target, prop) {
466
+ if (prop === "not")
467
+ return makePromiseMatchers(actual, !negated, kind);
468
+ if (prop === "then")
469
+ return undefined;
470
+ return (...args) => settle().then((value) => {
471
+ const matchers = makeMatchers(value, negated);
472
+ return matchers[prop](...args);
473
+ });
474
+ },
475
+ });
476
+ };
477
+ export const expect = Object.assign((actual, _message) => makeMatchers(actual, false), {
478
+ any: anyMatcher,
479
+ anything: () => asymmetric("Anything", (actual) => actual !== null && actual !== undefined),
480
+ arrayContaining: (items) => asymmetric(`ArrayContaining ${stringify(items)}`, (actual) => Array.isArray(actual) && items.every((item) => actual.some((v) => equals(v, item)))),
481
+ objectContaining: (subset) => asymmetric(`ObjectContaining ${stringify(subset)}`, (actual) => matchesObject(actual, subset, new Map())),
482
+ stringContaining: (substring) => asymmetric(`StringContaining ${JSON.stringify(substring)}`, (actual) => typeof actual === "string" && actual.includes(substring)),
483
+ stringMatching: (pattern) => asymmetric(`StringMatching ${String(pattern)}`, (actual) => {
484
+ if (typeof actual !== "string")
485
+ return false;
486
+ return typeof pattern === "string" ? actual.includes(pattern) : pattern.test(actual);
487
+ }),
488
+ toSatisfy: (predicate, description) => asymmetric(`Satisfies ${description ?? predicate.name ?? "predicate"}`, (actual) => predicate(actual)),
489
+ fail: (message) => {
490
+ throw new AssertionError(message ?? "expect.fail()");
491
+ },
492
+ });
493
+ const assertFn = (condition, message) => {
494
+ if (!condition) {
495
+ throw new AssertionError(message ?? "assertion failed");
496
+ }
497
+ };
498
+ export const assert = Object.assign(assertFn, {
499
+ strictEqual: (actual, expected, message) => {
500
+ if (!Object.is(actual, expected)) {
501
+ throw new AssertionError(message ?? `expected ${stringify(actual)} to be ${stringify(expected)}`, actual, expected);
502
+ }
503
+ },
504
+ deepStrictEqual: (actual, expected, message) => {
505
+ if (!equals(actual, expected, true)) {
506
+ throw new AssertionError(message ?? `expected ${stringify(actual)} to deep equal ${stringify(expected)}`, actual, expected);
507
+ }
508
+ },
509
+ isDefined: (value) => {
510
+ if (value === null || value === undefined) {
511
+ throw new AssertionError(`expected value to be defined`);
512
+ }
513
+ },
514
+ fail: (message) => {
515
+ throw new AssertionError(message ?? "assert.fail()");
516
+ },
517
+ });
518
+ //# sourceMappingURL=Expect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Expect.js","sourceRoot":"","sources":["../src/Expect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Persistent run log: every test's pass/failure followed by its captured
3
+ * output, appended to `.alchemy/log/test.log` as the run progresses —
4
+ * color-free so agents and tooling can read it directly.
5
+ */
6
+ import * as Effect from "effect/Effect";
7
+ import * as FileSystem from "effect/FileSystem";
8
+ import * as Path from "effect/Path";
9
+ import type { LogEntry } from "./Model.ts";
10
+ import type { TestEvent } from "./Reporter.ts";
11
+ /** Render an event as a log chunk; `undefined` = nothing to write. */
12
+ export declare const formatEvent: (event: TestEvent) => string | undefined;
13
+ export interface FileLog {
14
+ readonly append: (event: TestEvent) => Effect.Effect<void>;
15
+ /** Synchronous persistence applies backpressure to synchronous logger callbacks. */
16
+ readonly appendHookLine: (file: string, entry: LogEntry) => void;
17
+ readonly appendTestLine: (id: string, entry: LogEntry) => void;
18
+ readonly close: Effect.Effect<void>;
19
+ }
20
+ /** Create (truncate) the log file and return an event appender. */
21
+ export declare const makeFileLog: (logFile: string) => Effect.Effect<{
22
+ append: (event: TestEvent) => Effect.Effect<void>;
23
+ appendHookLine: (file: string, entry: LogEntry) => void;
24
+ appendTestLine: (id: string, entry: LogEntry) => void;
25
+ close: Effect.Effect<void, never, never>;
26
+ }, never, FileSystem.FileSystem | Path.Path | import("effect/Scope").Scope>;
27
+ //# sourceMappingURL=FileLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileLog.d.ts","sourceRoot":"","sources":["../src/FileLog.ts"],"names":[],"mappings":"AACA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAe/C,sEAAsE;AACtE,eAAO,MAAM,WAAW,UAAW,SAAS,KAAG,MAAM,GAAG,SAqDvD,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3D,oFAAoF;IACpF,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACjE,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACrC;AA2BD,mEAAmE;AACnE,eAAO,MAAM,WAAW;oBAjCG,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;;;2EAyE1D,CAAC"}