modestbench 0.3.2 → 0.5.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 (158) hide show
  1. package/CHANGELOG.md +37 -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/errors/base.cjs +2 -1
  114. package/dist/errors/base.cjs.map +1 -1
  115. package/dist/errors/base.d.cts.map +1 -1
  116. package/dist/errors/base.d.ts.map +1 -1
  117. package/dist/errors/base.js +2 -1
  118. package/dist/errors/base.js.map +1 -1
  119. package/dist/reporters/human.cjs +83 -27
  120. package/dist/reporters/human.cjs.map +1 -1
  121. package/dist/reporters/human.d.cts +1 -0
  122. package/dist/reporters/human.d.cts.map +1 -1
  123. package/dist/reporters/human.d.ts +1 -0
  124. package/dist/reporters/human.d.ts.map +1 -1
  125. package/dist/reporters/human.js +83 -27
  126. package/dist/reporters/human.js.map +1 -1
  127. package/dist/reporters/simple.cjs +68 -21
  128. package/dist/reporters/simple.cjs.map +1 -1
  129. package/dist/reporters/simple.d.cts +1 -0
  130. package/dist/reporters/simple.d.cts.map +1 -1
  131. package/dist/reporters/simple.d.ts +1 -0
  132. package/dist/reporters/simple.d.ts.map +1 -1
  133. package/dist/reporters/simple.js +68 -21
  134. package/dist/reporters/simple.js.map +1 -1
  135. package/dist/services/config-manager.cjs +1 -1
  136. package/dist/services/config-manager.cjs.map +1 -1
  137. package/dist/services/config-manager.js +2 -2
  138. package/dist/services/config-manager.js.map +1 -1
  139. package/package.json +60 -31
  140. package/src/adapters/ava-adapter.ts +553 -0
  141. package/src/adapters/ava-hooks.ts +65 -0
  142. package/src/adapters/ava-register.ts +15 -0
  143. package/src/adapters/mocha-adapter.ts +284 -0
  144. package/src/adapters/node-test-adapter.ts +391 -0
  145. package/src/adapters/node-test-hooks.ts +71 -0
  146. package/src/adapters/node-test-register.ts +5 -0
  147. package/src/adapters/types.ts +281 -0
  148. package/src/cli/commands/init.ts +25 -17
  149. package/src/cli/commands/run.ts +9 -2
  150. package/src/cli/commands/test.ts +546 -0
  151. package/src/cli/index.ts +81 -1
  152. package/src/constants.ts +15 -0
  153. package/src/core/engine.ts +5 -0
  154. package/src/core/engines/tinybench-engine.ts +213 -141
  155. package/src/errors/base.ts +3 -2
  156. package/src/reporters/human.ts +107 -36
  157. package/src/reporters/simple.ts +81 -22
  158. package/src/services/config-manager.ts +2 -2
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ /**
3
+ * ModestBench Mocha Adapter
4
+ *
5
+ * Captures test definitions from Mocha test files by replacing global
6
+ * `describe`, `it`, and hook functions before the test file loads.
7
+ *
8
+ * Mocha exposes these as globals, making interception straightforward - no ES
9
+ * module loader hooks required.
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
45
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
46
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
47
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
48
+ });
49
+ }
50
+ return path;
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.MochaAdapter = void 0;
54
+ const node_url_1 = require("node:url");
55
+ /**
56
+ * Mocha test framework adapter
57
+ *
58
+ * Captures tests by installing global mocks before importing the test file.
59
+ */
60
+ class MochaAdapter {
61
+ framework = 'mocha';
62
+ /**
63
+ * Capture test definitions from a Mocha test file
64
+ *
65
+ * @param filePath - Absolute path to the test file
66
+ * @returns Captured test structure
67
+ */
68
+ async capture(filePath) {
69
+ // Install our mock globals
70
+ const state = installMochaGlobals();
71
+ try {
72
+ // Import the test file - this triggers describe/it calls
73
+ // which populate our state
74
+ const fileUrl = (0, node_url_1.pathToFileURL)(filePath).href;
75
+ // Use a cache-busting query param to ensure fresh import
76
+ const bustCache = `?t=${Date.now()}`;
77
+ await Promise.resolve(`${__rewriteRelativeImportExtension(fileUrl + bustCache)}`).then(s => __importStar(require(s)));
78
+ // Return captured structure
79
+ return {
80
+ filePath,
81
+ framework: 'mocha',
82
+ rootSuites: state.rootSuites,
83
+ rootTests: state.rootTests,
84
+ };
85
+ }
86
+ finally {
87
+ // Clean up globals
88
+ uninstallMochaGlobals();
89
+ }
90
+ }
91
+ }
92
+ exports.MochaAdapter = MochaAdapter;
93
+ /**
94
+ * Create empty hooks structure
95
+ */
96
+ const createEmptyHooks = () => {
97
+ return {
98
+ after: [],
99
+ afterEach: [],
100
+ before: [],
101
+ beforeEach: [],
102
+ };
103
+ };
104
+ /**
105
+ * Create a new suite structure
106
+ */
107
+ const createSuite = (name) => {
108
+ return {
109
+ children: [],
110
+ hooks: createEmptyHooks(),
111
+ name,
112
+ tests: [],
113
+ };
114
+ };
115
+ /**
116
+ * Install Mocha global mocks and return the capture state
117
+ *
118
+ * This replaces globalThis.describe, globalThis.it, etc. with our capturing
119
+ * implementations.
120
+ */
121
+ const installMochaGlobals = () => {
122
+ const state = {
123
+ currentSuite: null,
124
+ rootSuites: [],
125
+ rootTests: [],
126
+ };
127
+ // describe() - creates a suite
128
+ const describe = (name, fn) => {
129
+ const suite = createSuite(name);
130
+ const parent = state.currentSuite;
131
+ if (parent) {
132
+ // Nested describe: inherit beforeEach/afterEach from parent
133
+ // and add to parent's children
134
+ parent.children.push(suite);
135
+ }
136
+ else {
137
+ // Root-level describe
138
+ state.rootSuites.push(suite);
139
+ }
140
+ // Enter this suite context
141
+ state.currentSuite = suite;
142
+ // Execute the describe body to capture tests and nested describes
143
+ fn();
144
+ // Exit back to parent context
145
+ state.currentSuite = parent;
146
+ };
147
+ // describe.only() - marks suite as exclusive
148
+ describe.only = (name, fn) => {
149
+ // For benchmarking, we treat .only the same as regular
150
+ // (filtering happens at a higher level)
151
+ describe(name, fn);
152
+ };
153
+ // describe.skip() - marks suite as skipped
154
+ describe.skip = (_name, _fn) => {
155
+ // Skip entirely - don't even register
156
+ };
157
+ // it() - creates a test
158
+ const it = (name, fn) => {
159
+ const test = { fn, name };
160
+ if (state.currentSuite) {
161
+ state.currentSuite.tests.push(test);
162
+ }
163
+ else {
164
+ // Root-level test (unusual for Mocha but supported)
165
+ state.rootTests.push(test);
166
+ }
167
+ };
168
+ // it.only() - marks test as exclusive
169
+ it.only = (name, fn) => {
170
+ const test = { fn, name, only: true };
171
+ if (state.currentSuite) {
172
+ state.currentSuite.tests.push(test);
173
+ }
174
+ else {
175
+ state.rootTests.push(test);
176
+ }
177
+ };
178
+ // it.skip() - marks test as skipped
179
+ it.skip = (name, fn) => {
180
+ const test = { fn, name, skip: true };
181
+ if (state.currentSuite) {
182
+ state.currentSuite.tests.push(test);
183
+ }
184
+ else {
185
+ state.rootTests.push(test);
186
+ }
187
+ };
188
+ // before() - runs once before all tests in suite
189
+ const before = (fn) => {
190
+ if (state.currentSuite) {
191
+ state.currentSuite.hooks.before.push(fn);
192
+ }
193
+ // Root-level before is ignored (no suite to attach to)
194
+ };
195
+ // after() - runs once after all tests in suite
196
+ const after = (fn) => {
197
+ if (state.currentSuite) {
198
+ state.currentSuite.hooks.after.push(fn);
199
+ }
200
+ };
201
+ // beforeEach() - runs before each test
202
+ const beforeEach = (fn) => {
203
+ if (state.currentSuite) {
204
+ state.currentSuite.hooks.beforeEach.push(fn);
205
+ }
206
+ };
207
+ // afterEach() - runs after each test
208
+ const afterEach = (fn) => {
209
+ if (state.currentSuite) {
210
+ state.currentSuite.hooks.afterEach.push(fn);
211
+ }
212
+ };
213
+ // Install globals
214
+ // @ts-expect-error - intentionally modifying globalThis
215
+ globalThis.describe = describe;
216
+ // @ts-expect-error - intentionally modifying globalThis
217
+ globalThis.it = it;
218
+ // @ts-expect-error - intentionally modifying globalThis
219
+ globalThis.before = before;
220
+ // @ts-expect-error - intentionally modifying globalThis
221
+ globalThis.after = after;
222
+ // @ts-expect-error - intentionally modifying globalThis
223
+ globalThis.beforeEach = beforeEach;
224
+ // @ts-expect-error - intentionally modifying globalThis
225
+ globalThis.afterEach = afterEach;
226
+ // Mocha aliases
227
+ // @ts-expect-error - intentionally modifying globalThis
228
+ globalThis.context = describe;
229
+ // @ts-expect-error - intentionally modifying globalThis
230
+ globalThis.specify = it;
231
+ return state;
232
+ };
233
+ /**
234
+ * Remove Mocha globals installed by installMochaGlobals
235
+ */
236
+ const uninstallMochaGlobals = () => {
237
+ // @ts-expect-error - cleaning up globalThis
238
+ delete globalThis.describe;
239
+ // @ts-expect-error - cleaning up globalThis
240
+ delete globalThis.it;
241
+ // @ts-expect-error - cleaning up globalThis
242
+ delete globalThis.before;
243
+ // @ts-expect-error - cleaning up globalThis
244
+ delete globalThis.after;
245
+ // @ts-expect-error - cleaning up globalThis
246
+ delete globalThis.beforeEach;
247
+ // @ts-expect-error - cleaning up globalThis
248
+ delete globalThis.afterEach;
249
+ // @ts-expect-error - cleaning up globalThis
250
+ delete globalThis.context;
251
+ // @ts-expect-error - cleaning up globalThis
252
+ delete globalThis.specify;
253
+ };
254
+ //# sourceMappingURL=mocha-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocha-adapter.js","sourceRoot":"","sources":["../../src/adapters/mocha-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ModestBench Mocha Adapter
3
+ *
4
+ * Captures test definitions from Mocha test files by replacing global
5
+ * `describe`, `it`, and hook functions before the test file loads.
6
+ *
7
+ * Mocha exposes these as globals, making interception straightforward - no ES
8
+ * module loader hooks required.
9
+ */
10
+ import type { CapturedTestFile, TestFrameworkAdapter } from "./types.cjs";
11
+ /**
12
+ * Mocha test framework adapter
13
+ *
14
+ * Captures tests by installing global mocks before importing the test file.
15
+ */
16
+ export declare class MochaAdapter implements TestFrameworkAdapter {
17
+ readonly framework: "mocha";
18
+ /**
19
+ * Capture test definitions from a Mocha test file
20
+ *
21
+ * @param filePath - Absolute path to the test file
22
+ * @returns Captured test structure
23
+ */
24
+ capture(filePath: string): Promise<CapturedTestFile>;
25
+ }
26
+ //# sourceMappingURL=mocha-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocha-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mocha-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAGV,gBAAgB,EAEhB,oBAAoB,EACrB,oBAAmB;AAqCpB;;;;GAIG;AACH,qBAAa,YAAa,YAAW,oBAAoB;IACvD,QAAQ,CAAC,SAAS,EAAG,OAAO,CAAU;IAEtC;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAyB3D"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ModestBench Mocha Adapter
3
+ *
4
+ * Captures test definitions from Mocha test files by replacing global
5
+ * `describe`, `it`, and hook functions before the test file loads.
6
+ *
7
+ * Mocha exposes these as globals, making interception straightforward - no ES
8
+ * module loader hooks required.
9
+ */
10
+ import type { CapturedTestFile, TestFrameworkAdapter } from "./types.js";
11
+ /**
12
+ * Mocha test framework adapter
13
+ *
14
+ * Captures tests by installing global mocks before importing the test file.
15
+ */
16
+ export declare class MochaAdapter implements TestFrameworkAdapter {
17
+ readonly framework: "mocha";
18
+ /**
19
+ * Capture test definitions from a Mocha test file
20
+ *
21
+ * @param filePath - Absolute path to the test file
22
+ * @returns Captured test structure
23
+ */
24
+ capture(filePath: string): Promise<CapturedTestFile>;
25
+ }
26
+ //# sourceMappingURL=mocha-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocha-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mocha-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAGV,gBAAgB,EAEhB,oBAAoB,EACrB,mBAAmB;AAqCpB;;;;GAIG;AACH,qBAAa,YAAa,YAAW,oBAAoB;IACvD,QAAQ,CAAC,SAAS,EAAG,OAAO,CAAU;IAEtC;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAyB3D"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * ModestBench Mocha Adapter
3
+ *
4
+ * Captures test definitions from Mocha test files by replacing global
5
+ * `describe`, `it`, and hook functions before the test file loads.
6
+ *
7
+ * Mocha exposes these as globals, making interception straightforward - no ES
8
+ * module loader hooks required.
9
+ */
10
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
11
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
12
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
13
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
14
+ });
15
+ }
16
+ return path;
17
+ };
18
+ import { pathToFileURL } from 'node:url';
19
+ /**
20
+ * Mocha test framework adapter
21
+ *
22
+ * Captures tests by installing global mocks before importing the test file.
23
+ */
24
+ export class MochaAdapter {
25
+ framework = 'mocha';
26
+ /**
27
+ * Capture test definitions from a Mocha test file
28
+ *
29
+ * @param filePath - Absolute path to the test file
30
+ * @returns Captured test structure
31
+ */
32
+ async capture(filePath) {
33
+ // Install our mock globals
34
+ const state = installMochaGlobals();
35
+ try {
36
+ // Import the test file - this triggers describe/it calls
37
+ // which populate our state
38
+ const fileUrl = pathToFileURL(filePath).href;
39
+ // Use a cache-busting query param to ensure fresh import
40
+ const bustCache = `?t=${Date.now()}`;
41
+ await import(__rewriteRelativeImportExtension(fileUrl + bustCache));
42
+ // Return captured structure
43
+ return {
44
+ filePath,
45
+ framework: 'mocha',
46
+ rootSuites: state.rootSuites,
47
+ rootTests: state.rootTests,
48
+ };
49
+ }
50
+ finally {
51
+ // Clean up globals
52
+ uninstallMochaGlobals();
53
+ }
54
+ }
55
+ }
56
+ /**
57
+ * Create empty hooks structure
58
+ */
59
+ const createEmptyHooks = () => {
60
+ return {
61
+ after: [],
62
+ afterEach: [],
63
+ before: [],
64
+ beforeEach: [],
65
+ };
66
+ };
67
+ /**
68
+ * Create a new suite structure
69
+ */
70
+ const createSuite = (name) => {
71
+ return {
72
+ children: [],
73
+ hooks: createEmptyHooks(),
74
+ name,
75
+ tests: [],
76
+ };
77
+ };
78
+ /**
79
+ * Install Mocha global mocks and return the capture state
80
+ *
81
+ * This replaces globalThis.describe, globalThis.it, etc. with our capturing
82
+ * implementations.
83
+ */
84
+ const installMochaGlobals = () => {
85
+ const state = {
86
+ currentSuite: null,
87
+ rootSuites: [],
88
+ rootTests: [],
89
+ };
90
+ // describe() - creates a suite
91
+ const describe = (name, fn) => {
92
+ const suite = createSuite(name);
93
+ const parent = state.currentSuite;
94
+ if (parent) {
95
+ // Nested describe: inherit beforeEach/afterEach from parent
96
+ // and add to parent's children
97
+ parent.children.push(suite);
98
+ }
99
+ else {
100
+ // Root-level describe
101
+ state.rootSuites.push(suite);
102
+ }
103
+ // Enter this suite context
104
+ state.currentSuite = suite;
105
+ // Execute the describe body to capture tests and nested describes
106
+ fn();
107
+ // Exit back to parent context
108
+ state.currentSuite = parent;
109
+ };
110
+ // describe.only() - marks suite as exclusive
111
+ describe.only = (name, fn) => {
112
+ // For benchmarking, we treat .only the same as regular
113
+ // (filtering happens at a higher level)
114
+ describe(name, fn);
115
+ };
116
+ // describe.skip() - marks suite as skipped
117
+ describe.skip = (_name, _fn) => {
118
+ // Skip entirely - don't even register
119
+ };
120
+ // it() - creates a test
121
+ const it = (name, fn) => {
122
+ const test = { fn, name };
123
+ if (state.currentSuite) {
124
+ state.currentSuite.tests.push(test);
125
+ }
126
+ else {
127
+ // Root-level test (unusual for Mocha but supported)
128
+ state.rootTests.push(test);
129
+ }
130
+ };
131
+ // it.only() - marks test as exclusive
132
+ it.only = (name, fn) => {
133
+ const test = { fn, name, only: true };
134
+ if (state.currentSuite) {
135
+ state.currentSuite.tests.push(test);
136
+ }
137
+ else {
138
+ state.rootTests.push(test);
139
+ }
140
+ };
141
+ // it.skip() - marks test as skipped
142
+ it.skip = (name, fn) => {
143
+ const test = { fn, name, skip: true };
144
+ if (state.currentSuite) {
145
+ state.currentSuite.tests.push(test);
146
+ }
147
+ else {
148
+ state.rootTests.push(test);
149
+ }
150
+ };
151
+ // before() - runs once before all tests in suite
152
+ const before = (fn) => {
153
+ if (state.currentSuite) {
154
+ state.currentSuite.hooks.before.push(fn);
155
+ }
156
+ // Root-level before is ignored (no suite to attach to)
157
+ };
158
+ // after() - runs once after all tests in suite
159
+ const after = (fn) => {
160
+ if (state.currentSuite) {
161
+ state.currentSuite.hooks.after.push(fn);
162
+ }
163
+ };
164
+ // beforeEach() - runs before each test
165
+ const beforeEach = (fn) => {
166
+ if (state.currentSuite) {
167
+ state.currentSuite.hooks.beforeEach.push(fn);
168
+ }
169
+ };
170
+ // afterEach() - runs after each test
171
+ const afterEach = (fn) => {
172
+ if (state.currentSuite) {
173
+ state.currentSuite.hooks.afterEach.push(fn);
174
+ }
175
+ };
176
+ // Install globals
177
+ // @ts-expect-error - intentionally modifying globalThis
178
+ globalThis.describe = describe;
179
+ // @ts-expect-error - intentionally modifying globalThis
180
+ globalThis.it = it;
181
+ // @ts-expect-error - intentionally modifying globalThis
182
+ globalThis.before = before;
183
+ // @ts-expect-error - intentionally modifying globalThis
184
+ globalThis.after = after;
185
+ // @ts-expect-error - intentionally modifying globalThis
186
+ globalThis.beforeEach = beforeEach;
187
+ // @ts-expect-error - intentionally modifying globalThis
188
+ globalThis.afterEach = afterEach;
189
+ // Mocha aliases
190
+ // @ts-expect-error - intentionally modifying globalThis
191
+ globalThis.context = describe;
192
+ // @ts-expect-error - intentionally modifying globalThis
193
+ globalThis.specify = it;
194
+ return state;
195
+ };
196
+ /**
197
+ * Remove Mocha globals installed by installMochaGlobals
198
+ */
199
+ const uninstallMochaGlobals = () => {
200
+ // @ts-expect-error - cleaning up globalThis
201
+ delete globalThis.describe;
202
+ // @ts-expect-error - cleaning up globalThis
203
+ delete globalThis.it;
204
+ // @ts-expect-error - cleaning up globalThis
205
+ delete globalThis.before;
206
+ // @ts-expect-error - cleaning up globalThis
207
+ delete globalThis.after;
208
+ // @ts-expect-error - cleaning up globalThis
209
+ delete globalThis.beforeEach;
210
+ // @ts-expect-error - cleaning up globalThis
211
+ delete globalThis.afterEach;
212
+ // @ts-expect-error - cleaning up globalThis
213
+ delete globalThis.context;
214
+ // @ts-expect-error - cleaning up globalThis
215
+ delete globalThis.specify;
216
+ };
217
+ //# sourceMappingURL=mocha-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocha-adapter.js","sourceRoot":"","sources":["../../src/adapters/mocha-adapter.ts"],"names":[],"mappings":"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"}