modestbench 0.3.2 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +45 -2
  3. package/dist/adapters/ava-adapter.cjs +421 -0
  4. package/dist/adapters/ava-adapter.cjs.map +1 -0
  5. package/dist/adapters/ava-adapter.d.cts +39 -0
  6. package/dist/adapters/ava-adapter.d.cts.map +1 -0
  7. package/dist/adapters/ava-adapter.d.ts +39 -0
  8. package/dist/adapters/ava-adapter.d.ts.map +1 -0
  9. package/dist/adapters/ava-adapter.js +384 -0
  10. package/dist/adapters/ava-adapter.js.map +1 -0
  11. package/dist/adapters/ava-hooks.cjs +66 -0
  12. package/dist/adapters/ava-hooks.cjs.map +1 -0
  13. package/dist/adapters/ava-hooks.d.cts +24 -0
  14. package/dist/adapters/ava-hooks.d.cts.map +1 -0
  15. package/dist/adapters/ava-hooks.d.ts +24 -0
  16. package/dist/adapters/ava-hooks.d.ts.map +1 -0
  17. package/dist/adapters/ava-hooks.js +61 -0
  18. package/dist/adapters/ava-hooks.js.map +1 -0
  19. package/dist/adapters/ava-register.cjs +16 -0
  20. package/dist/adapters/ava-register.cjs.map +1 -0
  21. package/dist/adapters/ava-register.d.cts +11 -0
  22. package/dist/adapters/ava-register.d.cts.map +1 -0
  23. package/dist/adapters/ava-register.d.ts +11 -0
  24. package/dist/adapters/ava-register.d.ts.map +1 -0
  25. package/dist/adapters/ava-register.js +14 -0
  26. package/dist/adapters/ava-register.js.map +1 -0
  27. package/dist/adapters/mocha-adapter.cjs +254 -0
  28. package/dist/adapters/mocha-adapter.cjs.map +1 -0
  29. package/dist/adapters/mocha-adapter.d.cts +26 -0
  30. package/dist/adapters/mocha-adapter.d.cts.map +1 -0
  31. package/dist/adapters/mocha-adapter.d.ts +26 -0
  32. package/dist/adapters/mocha-adapter.d.ts.map +1 -0
  33. package/dist/adapters/mocha-adapter.js +217 -0
  34. package/dist/adapters/mocha-adapter.js.map +1 -0
  35. package/dist/adapters/node-test-adapter.cjs +335 -0
  36. package/dist/adapters/node-test-adapter.cjs.map +1 -0
  37. package/dist/adapters/node-test-adapter.d.cts +41 -0
  38. package/dist/adapters/node-test-adapter.d.cts.map +1 -0
  39. package/dist/adapters/node-test-adapter.d.ts +41 -0
  40. package/dist/adapters/node-test-adapter.d.ts.map +1 -0
  41. package/dist/adapters/node-test-adapter.js +298 -0
  42. package/dist/adapters/node-test-adapter.js.map +1 -0
  43. package/dist/adapters/node-test-hooks.cjs +72 -0
  44. package/dist/adapters/node-test-hooks.cjs.map +1 -0
  45. package/dist/adapters/node-test-hooks.d.cts +24 -0
  46. package/dist/adapters/node-test-hooks.d.cts.map +1 -0
  47. package/dist/adapters/node-test-hooks.d.ts +24 -0
  48. package/dist/adapters/node-test-hooks.d.ts.map +1 -0
  49. package/dist/adapters/node-test-hooks.js +67 -0
  50. package/dist/adapters/node-test-hooks.js.map +1 -0
  51. package/dist/adapters/node-test-register.cjs +7 -0
  52. package/dist/adapters/node-test-register.cjs.map +1 -0
  53. package/dist/adapters/node-test-register.d.cts +2 -0
  54. package/dist/adapters/node-test-register.d.cts.map +1 -0
  55. package/dist/adapters/node-test-register.d.ts +2 -0
  56. package/dist/adapters/node-test-register.d.ts.map +1 -0
  57. package/dist/adapters/node-test-register.js +5 -0
  58. package/dist/adapters/node-test-register.js.map +1 -0
  59. package/dist/adapters/types.cjs +152 -0
  60. package/dist/adapters/types.cjs.map +1 -0
  61. package/dist/adapters/types.d.cts +112 -0
  62. package/dist/adapters/types.d.cts.map +1 -0
  63. package/dist/adapters/types.d.ts +112 -0
  64. package/dist/adapters/types.d.ts.map +1 -0
  65. package/dist/adapters/types.js +148 -0
  66. package/dist/adapters/types.js.map +1 -0
  67. package/dist/cli/commands/init.cjs +21 -17
  68. package/dist/cli/commands/init.cjs.map +1 -1
  69. package/dist/cli/commands/init.d.cts.map +1 -1
  70. package/dist/cli/commands/init.d.ts.map +1 -1
  71. package/dist/cli/commands/init.js +21 -17
  72. package/dist/cli/commands/init.js.map +1 -1
  73. package/dist/cli/commands/run.cjs +6 -2
  74. package/dist/cli/commands/run.cjs.map +1 -1
  75. package/dist/cli/commands/run.js +6 -2
  76. package/dist/cli/commands/run.js.map +1 -1
  77. package/dist/cli/commands/test.cjs +392 -0
  78. package/dist/cli/commands/test.cjs.map +1 -0
  79. package/dist/cli/commands/test.d.cts +38 -0
  80. package/dist/cli/commands/test.d.cts.map +1 -0
  81. package/dist/cli/commands/test.d.ts +38 -0
  82. package/dist/cli/commands/test.d.ts.map +1 -0
  83. package/dist/cli/commands/test.js +388 -0
  84. package/dist/cli/commands/test.js.map +1 -0
  85. package/dist/cli/index.cjs +72 -1
  86. package/dist/cli/index.cjs.map +1 -1
  87. package/dist/cli/index.d.cts.map +1 -1
  88. package/dist/cli/index.d.ts.map +1 -1
  89. package/dist/cli/index.js +73 -2
  90. package/dist/cli/index.js.map +1 -1
  91. package/dist/constants.cjs +13 -1
  92. package/dist/constants.cjs.map +1 -1
  93. package/dist/constants.d.cts +12 -0
  94. package/dist/constants.d.cts.map +1 -1
  95. package/dist/constants.d.ts +12 -0
  96. package/dist/constants.d.ts.map +1 -1
  97. package/dist/constants.js +12 -0
  98. package/dist/constants.js.map +1 -1
  99. package/dist/core/engine.cjs +4 -0
  100. package/dist/core/engine.cjs.map +1 -1
  101. package/dist/core/engine.d.cts.map +1 -1
  102. package/dist/core/engine.d.ts.map +1 -1
  103. package/dist/core/engine.js +4 -0
  104. package/dist/core/engine.js.map +1 -1
  105. package/dist/core/engines/tinybench-engine.cjs +163 -131
  106. package/dist/core/engines/tinybench-engine.cjs.map +1 -1
  107. package/dist/core/engines/tinybench-engine.d.cts +6 -0
  108. package/dist/core/engines/tinybench-engine.d.cts.map +1 -1
  109. package/dist/core/engines/tinybench-engine.d.ts +6 -0
  110. package/dist/core/engines/tinybench-engine.d.ts.map +1 -1
  111. package/dist/core/engines/tinybench-engine.js +163 -131
  112. package/dist/core/engines/tinybench-engine.js.map +1 -1
  113. package/dist/core/stats-utils.cjs +4 -2
  114. package/dist/core/stats-utils.cjs.map +1 -1
  115. package/dist/core/stats-utils.d.cts +1 -1
  116. package/dist/core/stats-utils.d.cts.map +1 -1
  117. package/dist/core/stats-utils.d.ts +1 -1
  118. package/dist/core/stats-utils.d.ts.map +1 -1
  119. package/dist/core/stats-utils.js +4 -2
  120. package/dist/core/stats-utils.js.map +1 -1
  121. package/dist/errors/base.cjs +2 -1
  122. package/dist/errors/base.cjs.map +1 -1
  123. package/dist/errors/base.d.cts.map +1 -1
  124. package/dist/errors/base.d.ts.map +1 -1
  125. package/dist/errors/base.js +2 -1
  126. package/dist/errors/base.js.map +1 -1
  127. package/dist/formatters/history/compare.cjs.map +1 -1
  128. package/dist/formatters/history/compare.d.cts.map +1 -1
  129. package/dist/formatters/history/compare.d.ts.map +1 -1
  130. package/dist/formatters/history/compare.js.map +1 -1
  131. package/dist/formatters/history/list.cjs.map +1 -1
  132. package/dist/formatters/history/list.d.cts.map +1 -1
  133. package/dist/formatters/history/list.d.ts.map +1 -1
  134. package/dist/formatters/history/list.js.map +1 -1
  135. package/dist/reporters/human.cjs +83 -27
  136. package/dist/reporters/human.cjs.map +1 -1
  137. package/dist/reporters/human.d.cts +1 -0
  138. package/dist/reporters/human.d.cts.map +1 -1
  139. package/dist/reporters/human.d.ts +1 -0
  140. package/dist/reporters/human.d.ts.map +1 -1
  141. package/dist/reporters/human.js +83 -27
  142. package/dist/reporters/human.js.map +1 -1
  143. package/dist/reporters/simple.cjs +68 -21
  144. package/dist/reporters/simple.cjs.map +1 -1
  145. package/dist/reporters/simple.d.cts +1 -0
  146. package/dist/reporters/simple.d.cts.map +1 -1
  147. package/dist/reporters/simple.d.ts +1 -0
  148. package/dist/reporters/simple.d.ts.map +1 -1
  149. package/dist/reporters/simple.js +68 -21
  150. package/dist/reporters/simple.js.map +1 -1
  151. package/dist/services/config-manager.cjs +1 -1
  152. package/dist/services/config-manager.cjs.map +1 -1
  153. package/dist/services/config-manager.d.cts.map +1 -1
  154. package/dist/services/config-manager.d.ts.map +1 -1
  155. package/dist/services/config-manager.js +2 -2
  156. package/dist/services/config-manager.js.map +1 -1
  157. package/dist/services/file-loader.cjs.map +1 -1
  158. package/dist/services/file-loader.d.cts.map +1 -1
  159. package/dist/services/file-loader.d.ts.map +1 -1
  160. package/dist/services/file-loader.js.map +1 -1
  161. package/package.json +63 -35
  162. package/src/adapters/ava-adapter.ts +553 -0
  163. package/src/adapters/ava-hooks.ts +65 -0
  164. package/src/adapters/ava-register.ts +15 -0
  165. package/src/adapters/mocha-adapter.ts +284 -0
  166. package/src/adapters/node-test-adapter.ts +391 -0
  167. package/src/adapters/node-test-hooks.ts +71 -0
  168. package/src/adapters/node-test-register.ts +5 -0
  169. package/src/adapters/types.ts +281 -0
  170. package/src/cli/commands/init.ts +25 -17
  171. package/src/cli/commands/run.ts +9 -2
  172. package/src/cli/commands/test.ts +546 -0
  173. package/src/cli/index.ts +81 -1
  174. package/src/constants.ts +15 -0
  175. package/src/core/engine.ts +5 -0
  176. package/src/core/engines/tinybench-engine.ts +213 -141
  177. package/src/core/stats-utils.ts +5 -3
  178. package/src/errors/base.ts +3 -2
  179. package/src/formatters/history/compare.ts +1 -3
  180. package/src/formatters/history/list.ts +1 -3
  181. package/src/reporters/human.ts +107 -36
  182. package/src/reporters/simple.ts +81 -22
  183. package/src/services/config-manager.ts +4 -5
  184. package/src/services/file-loader.ts +2 -3
@@ -0,0 +1,384 @@
1
+ /**
2
+ * ModestBench AVA Adapter
3
+ *
4
+ * Captures test definitions from AVA test files using ES module loader hooks.
5
+ *
6
+ * AVA differs from Mocha and node:test:
7
+ *
8
+ * - No describe blocks - tests are flat
9
+ * - Tests receive an execution context `t` with assertions
10
+ * - Supports test.before/after/beforeEach/afterEach at file level
11
+ * - Each test file is isolated (we don't need to handle that)
12
+ *
13
+ * Architecture:
14
+ *
15
+ * 1. Install mock on globalThis
16
+ * 2. Loader intercepts 'ava' imports and returns the mock
17
+ * 3. Import test file to capture test definitions
18
+ */
19
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
20
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
21
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
22
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
23
+ });
24
+ }
25
+ return path;
26
+ };
27
+ import { pathToFileURL } from 'node:url';
28
+ /**
29
+ * Global capture state key
30
+ */
31
+ const CAPTURE_STATE_KEY = '__MODESTBENCH_AVA_CAPTURE__';
32
+ /**
33
+ * Check if a value is an AVA macro object (has exec property)
34
+ */
35
+ const isMacroObject = (value) => {
36
+ return (typeof value === 'object' &&
37
+ value !== null &&
38
+ 'exec' in value &&
39
+ typeof value.exec === 'function');
40
+ };
41
+ /**
42
+ * Check if a value is a function (macro or test function)
43
+ */
44
+ const isFunction = (value) => {
45
+ return typeof value === 'function';
46
+ };
47
+ /**
48
+ * AVA test framework adapter
49
+ *
50
+ * Captures test definitions by installing mock implementations before importing
51
+ * the test file.
52
+ *
53
+ * IMPORTANT: For this to work with actual AVA imports, you must run Node.js
54
+ * with our loader: node --import modestbench/ava your-test.js
55
+ */
56
+ export class AvaAdapter {
57
+ framework = 'ava';
58
+ /**
59
+ * Capture test definitions from an AVA test file
60
+ *
61
+ * @param filePath - Absolute path to the test file
62
+ * @returns Captured test structure
63
+ */
64
+ async capture(filePath) {
65
+ // Initialize capture state
66
+ const state = initCaptureState();
67
+ // Install mocks
68
+ installAvaMocks(state);
69
+ try {
70
+ // Import the test file
71
+ // The loader hook will intercept 'ava' and use our mocks
72
+ const fileUrl = pathToFileURL(filePath).href;
73
+ const bustCache = `?t=${Date.now()}`;
74
+ await import(__rewriteRelativeImportExtension(fileUrl + bustCache));
75
+ // Return captured structure
76
+ return toCapturedTestFile(state, filePath);
77
+ }
78
+ finally {
79
+ // Clean up
80
+ uninstallAvaMocks();
81
+ clearCaptureState();
82
+ }
83
+ }
84
+ }
85
+ /**
86
+ * Clear capture state from globalThis
87
+ */
88
+ const clearCaptureState = () => {
89
+ // @ts-expect-error - intentionally using globalThis
90
+ delete globalThis[CAPTURE_STATE_KEY];
91
+ };
92
+ /**
93
+ * Create a mock AVA execution context
94
+ *
95
+ * This allows test functions to call t.is(), t.pass(), etc. without errors
96
+ * during benchmarking. We're measuring performance, not correctness.
97
+ */
98
+ const createMockContext = () => {
99
+ const noop = () => { };
100
+ const noopAsync = () => Promise.resolve();
101
+ return {
102
+ assert: noop,
103
+ context: {},
104
+ deepEqual: noop,
105
+ fail: noop,
106
+ false: noop,
107
+ falsy: noop,
108
+ is: noop,
109
+ like: noop,
110
+ log: noop,
111
+ not: noop,
112
+ notDeepEqual: noop,
113
+ notRegex: noop,
114
+ notThrows: noop,
115
+ notThrowsAsync: noopAsync,
116
+ pass: noop,
117
+ plan: noop,
118
+ regex: noop,
119
+ snapshot: noop,
120
+ teardown: noop,
121
+ throws: () => undefined,
122
+ throwsAsync: noopAsync,
123
+ timeout: noop,
124
+ true: noop,
125
+ truthy: noop,
126
+ try: async () => ({ commit: noop, discard: noop, passed: true }),
127
+ };
128
+ };
129
+ /**
130
+ * Initialize capture state on globalThis
131
+ */
132
+ const initCaptureState = () => {
133
+ const state = {
134
+ hooks: {
135
+ after: [],
136
+ afterAlways: [],
137
+ afterEach: [],
138
+ afterEachAlways: [],
139
+ before: [],
140
+ beforeEach: [],
141
+ },
142
+ tests: [],
143
+ };
144
+ // @ts-expect-error - intentionally using globalThis for cross-module state
145
+ globalThis[CAPTURE_STATE_KEY] = state;
146
+ return state;
147
+ };
148
+ /**
149
+ * Install AVA mocks on globalThis for module interception
150
+ */
151
+ const installAvaMocks = (state) => {
152
+ /**
153
+ * Parse test arguments and return name + wrapped function Used by
154
+ * registerTest and test variants (only, serial, skip)
155
+ */
156
+ const parseTestArgs = (titleOrMacroOrFn, rest) => {
157
+ let name;
158
+ let fn;
159
+ let args = [];
160
+ if (typeof titleOrMacroOrFn === 'string') {
161
+ name = titleOrMacroOrFn;
162
+ const [macroOrFn, ...restArgs] = rest;
163
+ if (isMacroObject(macroOrFn)) {
164
+ fn = macroOrFn.exec;
165
+ args = restArgs;
166
+ if (macroOrFn.title) {
167
+ name = macroOrFn.title(titleOrMacroOrFn, ...restArgs);
168
+ }
169
+ }
170
+ else if (isFunction(macroOrFn)) {
171
+ fn = macroOrFn;
172
+ args = restArgs;
173
+ }
174
+ else {
175
+ fn = () => { };
176
+ }
177
+ }
178
+ else if (isMacroObject(titleOrMacroOrFn)) {
179
+ fn = titleOrMacroOrFn.exec;
180
+ args = rest;
181
+ name = titleOrMacroOrFn.title
182
+ ? titleOrMacroOrFn.title(undefined, ...rest)
183
+ : fn.name || 'unnamed test';
184
+ }
185
+ else if (isFunction(titleOrMacroOrFn)) {
186
+ fn = titleOrMacroOrFn;
187
+ args = rest;
188
+ name = fn.name || 'unnamed test';
189
+ }
190
+ else {
191
+ name = 'unnamed test';
192
+ fn = () => { };
193
+ }
194
+ const wrappedFn = async () => {
195
+ const ctx = createMockContext();
196
+ await fn(ctx, ...args);
197
+ };
198
+ return { name, wrappedFn };
199
+ };
200
+ /**
201
+ * Process a test registration, handling all AVA calling conventions:
202
+ *
203
+ * - Test('title', fn)
204
+ * - Test('title', macro, ...args)
205
+ * - Test(macro, ...args)
206
+ * - Test(fn)
207
+ */
208
+ const registerTest = (titleOrMacroOrFn, ...rest) => {
209
+ const { name, wrappedFn } = parseTestArgs(titleOrMacroOrFn, rest);
210
+ state.tests.push({
211
+ fn: wrappedFn,
212
+ name,
213
+ });
214
+ };
215
+ // Create mock test function
216
+ const mockTest = Object.assign(registerTest, {
217
+ // test.after() - runs once after all tests
218
+ after: Object.assign((fn) => {
219
+ const wrappedFn = async () => {
220
+ const ctx = createMockContext();
221
+ await fn(ctx);
222
+ };
223
+ state.hooks.after.push(wrappedFn);
224
+ }, {
225
+ // test.after.always() - runs even if tests fail
226
+ always: function always(fn) {
227
+ const wrappedFn = async () => {
228
+ const ctx = createMockContext();
229
+ await fn(ctx);
230
+ };
231
+ state.hooks.afterAlways.push(wrappedFn);
232
+ },
233
+ }),
234
+ // test.afterEach() - runs after each test
235
+ afterEach: Object.assign((fn) => {
236
+ const wrappedFn = async () => {
237
+ const ctx = createMockContext();
238
+ await fn(ctx);
239
+ };
240
+ state.hooks.afterEach.push(wrappedFn);
241
+ }, {
242
+ // test.afterEach.always() - runs even if test fails
243
+ always: function always(fn) {
244
+ const wrappedFn = async () => {
245
+ const ctx = createMockContext();
246
+ await fn(ctx);
247
+ };
248
+ state.hooks.afterEachAlways.push(wrappedFn);
249
+ },
250
+ }),
251
+ // test.before() - runs once before all tests
252
+ before: function before(fn) {
253
+ const wrappedFn = async () => {
254
+ const ctx = createMockContext();
255
+ await fn(ctx);
256
+ };
257
+ state.hooks.before.push(wrappedFn);
258
+ },
259
+ // test.beforeEach() - runs before each test
260
+ beforeEach: function beforeEach(fn) {
261
+ const wrappedFn = async () => {
262
+ const ctx = createMockContext();
263
+ await fn(ctx);
264
+ };
265
+ state.hooks.beforeEach.push(wrappedFn);
266
+ },
267
+ // test.failing() - expected to fail (treat as regular for benchmarks)
268
+ failing: function failing(titleOrMacro, implementation) {
269
+ mockTest(titleOrMacro, implementation);
270
+ },
271
+ // test.macro() - create reusable test macro
272
+ // Accepts either a function or an object with exec/title
273
+ macro: function macro(fnOrObject) {
274
+ if (typeof fnOrObject === 'function') {
275
+ // Simple function macro - return as-is
276
+ return fnOrObject;
277
+ }
278
+ // Object macro with exec/title - return as AvaMacro
279
+ return {
280
+ exec: fnOrObject.exec,
281
+ title: fnOrObject.title,
282
+ };
283
+ },
284
+ // test.only() - marks test as exclusive
285
+ only: function only(titleOrMacroOrFn, ...rest) {
286
+ // Reuse registerTest logic but add only flag
287
+ const { name, wrappedFn } = parseTestArgs(titleOrMacroOrFn, rest);
288
+ state.tests.push({
289
+ fn: wrappedFn,
290
+ name,
291
+ only: true,
292
+ });
293
+ },
294
+ // test.serial() - run serially (we capture but ignore serial flag for benchmarks)
295
+ serial: function serial(titleOrMacroOrFn, ...rest) {
296
+ const { name, wrappedFn } = parseTestArgs(titleOrMacroOrFn, rest);
297
+ state.tests.push({
298
+ fn: wrappedFn,
299
+ name,
300
+ serial: true,
301
+ });
302
+ },
303
+ // test.skip() - marks test as skipped
304
+ skip: function skip(titleOrMacroOrFn, ...rest) {
305
+ const { name, wrappedFn } = parseTestArgs(titleOrMacroOrFn, rest);
306
+ state.tests.push({
307
+ fn: wrappedFn,
308
+ name,
309
+ skip: true,
310
+ });
311
+ },
312
+ // test.todo() - placeholder test
313
+ todo: function todo(title) {
314
+ state.tests.push({
315
+ fn: () => { },
316
+ name: title,
317
+ skip: true,
318
+ });
319
+ },
320
+ });
321
+ // Install on globalThis for the loader to access
322
+ // @ts-expect-error - intentionally using globalThis
323
+ globalThis.__MODESTBENCH_AVA_MOCK__ = {
324
+ default: mockTest,
325
+ test: mockTest,
326
+ };
327
+ };
328
+ /**
329
+ * Convert capture state to CapturedTestFile
330
+ *
331
+ * Since AVA doesn't have suites, we create a synthetic "default" suite to hold
332
+ * the file-level hooks and tests.
333
+ */
334
+ const toCapturedTestFile = (state, filePath) => {
335
+ // Combine after and afterAlways, afterEach and afterEachAlways
336
+ const combinedHooks = {
337
+ after: [...state.hooks.after, ...state.hooks.afterAlways],
338
+ afterEach: [...state.hooks.afterEach, ...state.hooks.afterEachAlways],
339
+ before: state.hooks.before,
340
+ beforeEach: state.hooks.beforeEach,
341
+ };
342
+ // Convert tests
343
+ const tests = state.tests.map((t) => ({
344
+ fn: t.fn,
345
+ name: t.name,
346
+ only: t.only,
347
+ skip: t.skip,
348
+ }));
349
+ // If there are hooks, wrap them in a synthetic suite
350
+ const hasHooks = combinedHooks.before.length > 0 ||
351
+ combinedHooks.after.length > 0 ||
352
+ combinedHooks.beforeEach.length > 0 ||
353
+ combinedHooks.afterEach.length > 0;
354
+ if (hasHooks) {
355
+ // Create a synthetic suite to hold hooks
356
+ const suite = {
357
+ children: [],
358
+ hooks: combinedHooks,
359
+ name: 'default',
360
+ tests,
361
+ };
362
+ return {
363
+ filePath,
364
+ framework: 'ava',
365
+ rootSuites: [suite],
366
+ rootTests: [],
367
+ };
368
+ }
369
+ // No hooks - just return flat tests
370
+ return {
371
+ filePath,
372
+ framework: 'ava',
373
+ rootSuites: [],
374
+ rootTests: tests,
375
+ };
376
+ };
377
+ /**
378
+ * Uninstall AVA mocks
379
+ */
380
+ const uninstallAvaMocks = () => {
381
+ // @ts-expect-error - cleaning up globalThis
382
+ delete globalThis.__MODESTBENCH_AVA_MOCK__;
383
+ };
384
+ //# sourceMappingURL=ava-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-adapter.js","sourceRoot":"","sources":["../../src/adapters/ava-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * ModestBench AVA Loader Hooks
4
+ *
5
+ * ES module loader hooks that intercept `ava` imports and return our capturing
6
+ * mock from globalThis.
7
+ *
8
+ * Usage: node --import modestbench/ava test-file.js
9
+ *
10
+ * This loader exports async `resolve` and `load` hooks that get registered via
11
+ * module.register() when imported through ava-register.ts.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.load = exports.resolve = void 0;
15
+ /**
16
+ * Generate the mock module source code
17
+ *
18
+ * Uses top-level await to conditionally get mock or real module. Note: Uses
19
+ * 'ava?passthrough' to bypass our hook when falling back.
20
+ */
21
+ const generateMockSource = () => `
22
+ const mock = globalThis.__MODESTBENCH_AVA_MOCK__;
23
+
24
+ // If no mock installed, fall through to real ava
25
+ // The '?passthrough' query tells our hook to not intercept this import
26
+ const source = mock ?? await import('ava?passthrough');
27
+
28
+ export const test = source.test ?? source.default;
29
+ export default source.default ?? source.test;
30
+ `;
31
+ /**
32
+ * Resolve hook - intercepts ava specifier
33
+ *
34
+ * Uses query param '?passthrough' to prevent infinite recursion when falling
35
+ * back to real ava (when no mock is installed).
36
+ */
37
+ const resolve = async (specifier, context, nextResolve) => {
38
+ // Only intercept bare 'ava', not 'ava?passthrough'
39
+ if (specifier === 'ava') {
40
+ return {
41
+ shortCircuit: true,
42
+ url: 'modestbench://capture/ava',
43
+ };
44
+ }
45
+ // Strip passthrough query to resolve real ava
46
+ if (specifier === 'ava?passthrough') {
47
+ return nextResolve('ava', context);
48
+ }
49
+ return nextResolve(specifier, context);
50
+ };
51
+ exports.resolve = resolve;
52
+ /**
53
+ * Load hook - returns mock module for our custom URL
54
+ */
55
+ const load = async (url, context, nextLoad) => {
56
+ if (url === 'modestbench://capture/ava') {
57
+ return {
58
+ format: 'module',
59
+ shortCircuit: true,
60
+ source: generateMockSource(),
61
+ };
62
+ }
63
+ return nextLoad(url, context);
64
+ };
65
+ exports.load = load;
66
+ //# sourceMappingURL=ava-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-hooks.js","sourceRoot":"","sources":["../../src/adapters/ava-hooks.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAIH;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC;;;;;;;;;CASxC,CAAC;AAEF;;;;;GAKG;AACI,MAAM,OAAO,GAAgB,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IAC5E,mDAAmD;IACnD,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,GAAG,EAAE,2BAA2B;SACjC,CAAC;IACJ,CAAC;IACD,8CAA8C;IAC9C,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC,CAAC;AAbW,QAAA,OAAO,WAalB;AAEF;;GAEG;AACI,MAAM,IAAI,GAAa,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAC7D,IAAI,GAAG,KAAK,2BAA2B,EAAE,CAAC;QACxC,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,kBAAkB,EAAE;SAC7B,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC,CAAC;AATW,QAAA,IAAI,QASf"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ModestBench AVA Loader Hooks
3
+ *
4
+ * ES module loader hooks that intercept `ava` imports and return our capturing
5
+ * mock from globalThis.
6
+ *
7
+ * Usage: node --import modestbench/ava test-file.js
8
+ *
9
+ * This loader exports async `resolve` and `load` hooks that get registered via
10
+ * module.register() when imported through ava-register.ts.
11
+ */
12
+ import type { LoadHook, ResolveHook } from 'node:module';
13
+ /**
14
+ * Resolve hook - intercepts ava specifier
15
+ *
16
+ * Uses query param '?passthrough' to prevent infinite recursion when falling
17
+ * back to real ava (when no mock is installed).
18
+ */
19
+ export declare const resolve: ResolveHook;
20
+ /**
21
+ * Load hook - returns mock module for our custom URL
22
+ */
23
+ export declare const load: LoadHook;
24
+ //# sourceMappingURL=ava-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-hooks.d.ts","sourceRoot":"","sources":["../../src/adapters/ava-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAmBzD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,EAAE,WAarB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,QASlB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ModestBench AVA Loader Hooks
3
+ *
4
+ * ES module loader hooks that intercept `ava` imports and return our capturing
5
+ * mock from globalThis.
6
+ *
7
+ * Usage: node --import modestbench/ava test-file.js
8
+ *
9
+ * This loader exports async `resolve` and `load` hooks that get registered via
10
+ * module.register() when imported through ava-register.ts.
11
+ */
12
+ import type { LoadHook, ResolveHook } from 'node:module';
13
+ /**
14
+ * Resolve hook - intercepts ava specifier
15
+ *
16
+ * Uses query param '?passthrough' to prevent infinite recursion when falling
17
+ * back to real ava (when no mock is installed).
18
+ */
19
+ export declare const resolve: ResolveHook;
20
+ /**
21
+ * Load hook - returns mock module for our custom URL
22
+ */
23
+ export declare const load: LoadHook;
24
+ //# sourceMappingURL=ava-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-hooks.d.ts","sourceRoot":"","sources":["../../src/adapters/ava-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAmBzD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,EAAE,WAarB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,QASlB,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * ModestBench AVA Loader Hooks
3
+ *
4
+ * ES module loader hooks that intercept `ava` imports and return our capturing
5
+ * mock from globalThis.
6
+ *
7
+ * Usage: node --import modestbench/ava test-file.js
8
+ *
9
+ * This loader exports async `resolve` and `load` hooks that get registered via
10
+ * module.register() when imported through ava-register.ts.
11
+ */
12
+ /**
13
+ * Generate the mock module source code
14
+ *
15
+ * Uses top-level await to conditionally get mock or real module. Note: Uses
16
+ * 'ava?passthrough' to bypass our hook when falling back.
17
+ */
18
+ const generateMockSource = () => `
19
+ const mock = globalThis.__MODESTBENCH_AVA_MOCK__;
20
+
21
+ // If no mock installed, fall through to real ava
22
+ // The '?passthrough' query tells our hook to not intercept this import
23
+ const source = mock ?? await import('ava?passthrough');
24
+
25
+ export const test = source.test ?? source.default;
26
+ export default source.default ?? source.test;
27
+ `;
28
+ /**
29
+ * Resolve hook - intercepts ava specifier
30
+ *
31
+ * Uses query param '?passthrough' to prevent infinite recursion when falling
32
+ * back to real ava (when no mock is installed).
33
+ */
34
+ export const resolve = async (specifier, context, nextResolve) => {
35
+ // Only intercept bare 'ava', not 'ava?passthrough'
36
+ if (specifier === 'ava') {
37
+ return {
38
+ shortCircuit: true,
39
+ url: 'modestbench://capture/ava',
40
+ };
41
+ }
42
+ // Strip passthrough query to resolve real ava
43
+ if (specifier === 'ava?passthrough') {
44
+ return nextResolve('ava', context);
45
+ }
46
+ return nextResolve(specifier, context);
47
+ };
48
+ /**
49
+ * Load hook - returns mock module for our custom URL
50
+ */
51
+ export const load = async (url, context, nextLoad) => {
52
+ if (url === 'modestbench://capture/ava') {
53
+ return {
54
+ format: 'module',
55
+ shortCircuit: true,
56
+ source: generateMockSource(),
57
+ };
58
+ }
59
+ return nextLoad(url, context);
60
+ };
61
+ //# sourceMappingURL=ava-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-hooks.js","sourceRoot":"","sources":["../../src/adapters/ava-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC;;;;;;;;;CASxC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAgB,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IAC5E,mDAAmD;IACnD,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,GAAG,EAAE,2BAA2B;SACjC,CAAC;IACJ,CAAC;IACD,8CAA8C;IAC9C,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAa,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAC7D,IAAI,GAAG,KAAK,2BAA2B,EAAE,CAAC;QACxC,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,kBAAkB,EAAE;SAC7B,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * ModestBench AVA Loader Registration
4
+ *
5
+ * Registers the AVA ESM loader hooks via module.register().
6
+ *
7
+ * Usage: node --import modestbench/ava your-test.js
8
+ *
9
+ * This file registers the hooks module which intercepts 'ava' imports.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const node_module_1 = require("node:module");
13
+ (0, node_module_1.register)('./ava-hooks.js', {
14
+ parentURL: require("url").pathToFileURL(__filename),
15
+ });
16
+ //# sourceMappingURL=ava-register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-register.js","sourceRoot":"","sources":["../../src/adapters/ava-register.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAEH,6CAAuC;AAEvC,IAAA,sBAAQ,EAAC,gBAAgB,EAAE;IACzB,SAAS,0CAAiB;CAC3B,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ModestBench AVA Loader Registration
3
+ *
4
+ * Registers the AVA ESM loader hooks via module.register().
5
+ *
6
+ * Usage: node --import modestbench/ava your-test.js
7
+ *
8
+ * This file registers the hooks module which intercepts 'ava' imports.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=ava-register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-register.d.ts","sourceRoot":"","sources":["../../src/adapters/ava-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ModestBench AVA Loader Registration
3
+ *
4
+ * Registers the AVA ESM loader hooks via module.register().
5
+ *
6
+ * Usage: node --import modestbench/ava your-test.js
7
+ *
8
+ * This file registers the hooks module which intercepts 'ava' imports.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=ava-register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-register.d.ts","sourceRoot":"","sources":["../../src/adapters/ava-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ModestBench AVA Loader Registration
3
+ *
4
+ * Registers the AVA ESM loader hooks via module.register().
5
+ *
6
+ * Usage: node --import modestbench/ava your-test.js
7
+ *
8
+ * This file registers the hooks module which intercepts 'ava' imports.
9
+ */
10
+ import { register } from 'node:module';
11
+ register('./ava-hooks.js', {
12
+ parentURL: import.meta.url,
13
+ });
14
+ //# sourceMappingURL=ava-register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-register.js","sourceRoot":"","sources":["../../src/adapters/ava-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,QAAQ,CAAC,gBAAgB,EAAE;IACzB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;CAC3B,CAAC,CAAC"}