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.
- package/CHANGELOG.md +37 -0
- package/README.md +45 -2
- package/dist/adapters/ava-adapter.cjs +421 -0
- package/dist/adapters/ava-adapter.cjs.map +1 -0
- package/dist/adapters/ava-adapter.d.cts +39 -0
- package/dist/adapters/ava-adapter.d.cts.map +1 -0
- package/dist/adapters/ava-adapter.d.ts +39 -0
- package/dist/adapters/ava-adapter.d.ts.map +1 -0
- package/dist/adapters/ava-adapter.js +384 -0
- package/dist/adapters/ava-adapter.js.map +1 -0
- package/dist/adapters/ava-hooks.cjs +66 -0
- package/dist/adapters/ava-hooks.cjs.map +1 -0
- package/dist/adapters/ava-hooks.d.cts +24 -0
- package/dist/adapters/ava-hooks.d.cts.map +1 -0
- package/dist/adapters/ava-hooks.d.ts +24 -0
- package/dist/adapters/ava-hooks.d.ts.map +1 -0
- package/dist/adapters/ava-hooks.js +61 -0
- package/dist/adapters/ava-hooks.js.map +1 -0
- package/dist/adapters/ava-register.cjs +16 -0
- package/dist/adapters/ava-register.cjs.map +1 -0
- package/dist/adapters/ava-register.d.cts +11 -0
- package/dist/adapters/ava-register.d.cts.map +1 -0
- package/dist/adapters/ava-register.d.ts +11 -0
- package/dist/adapters/ava-register.d.ts.map +1 -0
- package/dist/adapters/ava-register.js +14 -0
- package/dist/adapters/ava-register.js.map +1 -0
- package/dist/adapters/mocha-adapter.cjs +254 -0
- package/dist/adapters/mocha-adapter.cjs.map +1 -0
- package/dist/adapters/mocha-adapter.d.cts +26 -0
- package/dist/adapters/mocha-adapter.d.cts.map +1 -0
- package/dist/adapters/mocha-adapter.d.ts +26 -0
- package/dist/adapters/mocha-adapter.d.ts.map +1 -0
- package/dist/adapters/mocha-adapter.js +217 -0
- package/dist/adapters/mocha-adapter.js.map +1 -0
- package/dist/adapters/node-test-adapter.cjs +335 -0
- package/dist/adapters/node-test-adapter.cjs.map +1 -0
- package/dist/adapters/node-test-adapter.d.cts +41 -0
- package/dist/adapters/node-test-adapter.d.cts.map +1 -0
- package/dist/adapters/node-test-adapter.d.ts +41 -0
- package/dist/adapters/node-test-adapter.d.ts.map +1 -0
- package/dist/adapters/node-test-adapter.js +298 -0
- package/dist/adapters/node-test-adapter.js.map +1 -0
- package/dist/adapters/node-test-hooks.cjs +72 -0
- package/dist/adapters/node-test-hooks.cjs.map +1 -0
- package/dist/adapters/node-test-hooks.d.cts +24 -0
- package/dist/adapters/node-test-hooks.d.cts.map +1 -0
- package/dist/adapters/node-test-hooks.d.ts +24 -0
- package/dist/adapters/node-test-hooks.d.ts.map +1 -0
- package/dist/adapters/node-test-hooks.js +67 -0
- package/dist/adapters/node-test-hooks.js.map +1 -0
- package/dist/adapters/node-test-register.cjs +7 -0
- package/dist/adapters/node-test-register.cjs.map +1 -0
- package/dist/adapters/node-test-register.d.cts +2 -0
- package/dist/adapters/node-test-register.d.cts.map +1 -0
- package/dist/adapters/node-test-register.d.ts +2 -0
- package/dist/adapters/node-test-register.d.ts.map +1 -0
- package/dist/adapters/node-test-register.js +5 -0
- package/dist/adapters/node-test-register.js.map +1 -0
- package/dist/adapters/types.cjs +152 -0
- package/dist/adapters/types.cjs.map +1 -0
- package/dist/adapters/types.d.cts +112 -0
- package/dist/adapters/types.d.cts.map +1 -0
- package/dist/adapters/types.d.ts +112 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +148 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli/commands/init.cjs +21 -17
- package/dist/cli/commands/init.cjs.map +1 -1
- package/dist/cli/commands/init.d.cts.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +21 -17
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/run.cjs +6 -2
- package/dist/cli/commands/run.cjs.map +1 -1
- package/dist/cli/commands/run.js +6 -2
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/test.cjs +392 -0
- package/dist/cli/commands/test.cjs.map +1 -0
- package/dist/cli/commands/test.d.cts +38 -0
- package/dist/cli/commands/test.d.cts.map +1 -0
- package/dist/cli/commands/test.d.ts +38 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +388 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/index.cjs +72 -1
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +73 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/constants.cjs +13 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +12 -0
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.ts +12 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +12 -0
- package/dist/constants.js.map +1 -1
- package/dist/core/engine.cjs +4 -0
- package/dist/core/engine.cjs.map +1 -1
- package/dist/core/engine.d.cts.map +1 -1
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +4 -0
- package/dist/core/engine.js.map +1 -1
- package/dist/core/engines/tinybench-engine.cjs +163 -131
- package/dist/core/engines/tinybench-engine.cjs.map +1 -1
- package/dist/core/engines/tinybench-engine.d.cts +6 -0
- package/dist/core/engines/tinybench-engine.d.cts.map +1 -1
- package/dist/core/engines/tinybench-engine.d.ts +6 -0
- package/dist/core/engines/tinybench-engine.d.ts.map +1 -1
- package/dist/core/engines/tinybench-engine.js +163 -131
- package/dist/core/engines/tinybench-engine.js.map +1 -1
- package/dist/errors/base.cjs +2 -1
- package/dist/errors/base.cjs.map +1 -1
- package/dist/errors/base.d.cts.map +1 -1
- package/dist/errors/base.d.ts.map +1 -1
- package/dist/errors/base.js +2 -1
- package/dist/errors/base.js.map +1 -1
- package/dist/reporters/human.cjs +83 -27
- package/dist/reporters/human.cjs.map +1 -1
- package/dist/reporters/human.d.cts +1 -0
- package/dist/reporters/human.d.cts.map +1 -1
- package/dist/reporters/human.d.ts +1 -0
- package/dist/reporters/human.d.ts.map +1 -1
- package/dist/reporters/human.js +83 -27
- package/dist/reporters/human.js.map +1 -1
- package/dist/reporters/simple.cjs +68 -21
- package/dist/reporters/simple.cjs.map +1 -1
- package/dist/reporters/simple.d.cts +1 -0
- package/dist/reporters/simple.d.cts.map +1 -1
- package/dist/reporters/simple.d.ts +1 -0
- package/dist/reporters/simple.d.ts.map +1 -1
- package/dist/reporters/simple.js +68 -21
- package/dist/reporters/simple.js.map +1 -1
- package/dist/services/config-manager.cjs +1 -1
- package/dist/services/config-manager.cjs.map +1 -1
- package/dist/services/config-manager.js +2 -2
- package/dist/services/config-manager.js.map +1 -1
- package/package.json +60 -31
- package/src/adapters/ava-adapter.ts +553 -0
- package/src/adapters/ava-hooks.ts +65 -0
- package/src/adapters/ava-register.ts +15 -0
- package/src/adapters/mocha-adapter.ts +284 -0
- package/src/adapters/node-test-adapter.ts +391 -0
- package/src/adapters/node-test-hooks.ts +71 -0
- package/src/adapters/node-test-register.ts +5 -0
- package/src/adapters/types.ts +281 -0
- package/src/cli/commands/init.ts +25 -17
- package/src/cli/commands/run.ts +9 -2
- package/src/cli/commands/test.ts +546 -0
- package/src/cli/index.ts +81 -1
- package/src/constants.ts +15 -0
- package/src/core/engine.ts +5 -0
- package/src/core/engines/tinybench-engine.ts +213 -141
- package/src/errors/base.ts +3 -2
- package/src/reporters/human.ts +107 -36
- package/src/reporters/simple.ts +81 -22
- package/src/services/config-manager.ts +2 -2
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ModestBench Node.js Test Runner Adapter
|
|
4
|
+
*
|
|
5
|
+
* Captures test definitions from node:test files using ES module loader hooks.
|
|
6
|
+
*
|
|
7
|
+
* Unlike Mocha (which uses globals), node:test requires ES module import
|
|
8
|
+
* interception. We use Node.js module.register() API to install a custom loader
|
|
9
|
+
* that returns our capturing mock instead of the real node:test.
|
|
10
|
+
*
|
|
11
|
+
* Architecture:
|
|
12
|
+
*
|
|
13
|
+
* 1. Register a custom loader that intercepts node:test imports
|
|
14
|
+
* 2. Import the test file - this triggers test/describe calls
|
|
15
|
+
* 3. Retrieve captured state from global storage
|
|
16
|
+
* 4. Unregister the loader
|
|
17
|
+
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
52
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
53
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
54
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return path;
|
|
58
|
+
};
|
|
59
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
60
|
+
exports.NodeTestAdapter = void 0;
|
|
61
|
+
const node_url_1 = require("node:url");
|
|
62
|
+
/**
|
|
63
|
+
* Global capture state key
|
|
64
|
+
*/
|
|
65
|
+
const CAPTURE_STATE_KEY = '__MODESTBENCH_NODE_TEST_CAPTURE__';
|
|
66
|
+
/**
|
|
67
|
+
* Node.js test runner adapter
|
|
68
|
+
*
|
|
69
|
+
* Captures test definitions by installing mock implementations before importing
|
|
70
|
+
* the test file.
|
|
71
|
+
*
|
|
72
|
+
* IMPORTANT: For this to work with actual node:test imports, you must run
|
|
73
|
+
* Node.js with our loader: node --import modestbench/node-test your-test.js
|
|
74
|
+
*
|
|
75
|
+
* Without the loader, this adapter only works with test files that use
|
|
76
|
+
* globalThis.**MODESTBENCH_NODE_TEST_MOCK** directly (not useful for real test
|
|
77
|
+
* files).
|
|
78
|
+
*/
|
|
79
|
+
class NodeTestAdapter {
|
|
80
|
+
framework = 'node-test';
|
|
81
|
+
/**
|
|
82
|
+
* Capture test definitions from a node:test file
|
|
83
|
+
*
|
|
84
|
+
* @param filePath - Absolute path to the test file
|
|
85
|
+
* @returns Captured test structure
|
|
86
|
+
*/
|
|
87
|
+
async capture(filePath) {
|
|
88
|
+
// Initialize capture state
|
|
89
|
+
const state = initCaptureState();
|
|
90
|
+
// Install mocks
|
|
91
|
+
installNodeTestMocks(state);
|
|
92
|
+
try {
|
|
93
|
+
// Import the test file
|
|
94
|
+
// The loader hook will intercept 'node:test' and use our mocks
|
|
95
|
+
const fileUrl = (0, node_url_1.pathToFileURL)(filePath).href;
|
|
96
|
+
const bustCache = `?t=${Date.now()}`;
|
|
97
|
+
await Promise.resolve(`${__rewriteRelativeImportExtension(fileUrl + bustCache)}`).then(s => __importStar(require(s)));
|
|
98
|
+
// Return captured structure
|
|
99
|
+
return toCapturedTestFile(state, filePath);
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
// Clean up
|
|
103
|
+
uninstallNodeTestMocks();
|
|
104
|
+
clearCaptureState();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.NodeTestAdapter = NodeTestAdapter;
|
|
109
|
+
/**
|
|
110
|
+
* Clear capture state from globalThis
|
|
111
|
+
*/
|
|
112
|
+
const clearCaptureState = () => {
|
|
113
|
+
// @ts-expect-error - intentionally using globalThis
|
|
114
|
+
delete globalThis[CAPTURE_STATE_KEY];
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Create empty hooks structure
|
|
118
|
+
*/
|
|
119
|
+
const createEmptyHooks = () => {
|
|
120
|
+
return {
|
|
121
|
+
after: [],
|
|
122
|
+
afterEach: [],
|
|
123
|
+
before: [],
|
|
124
|
+
beforeEach: [],
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Create a new suite structure
|
|
129
|
+
*/
|
|
130
|
+
const createSuite = (name) => {
|
|
131
|
+
return {
|
|
132
|
+
children: [],
|
|
133
|
+
hooks: createEmptyHooks(),
|
|
134
|
+
name,
|
|
135
|
+
tests: [],
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Initialize capture state on globalThis
|
|
140
|
+
*/
|
|
141
|
+
const initCaptureState = () => {
|
|
142
|
+
const state = {
|
|
143
|
+
currentSuite: null,
|
|
144
|
+
rootSuites: [],
|
|
145
|
+
rootTests: [],
|
|
146
|
+
};
|
|
147
|
+
// @ts-expect-error - intentionally using globalThis for cross-module state
|
|
148
|
+
globalThis[CAPTURE_STATE_KEY] = state;
|
|
149
|
+
return state;
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* Install node:test mocks on globalThis for module interception
|
|
153
|
+
*
|
|
154
|
+
* Since we can't truly intercept ES imports without a loader, we use a
|
|
155
|
+
* workaround: install mocks that test files can import via a special path.
|
|
156
|
+
*
|
|
157
|
+
* For true node:test interception, users must run with: node --import
|
|
158
|
+
* modestbench/register test-file.js
|
|
159
|
+
*/
|
|
160
|
+
const installNodeTestMocks = (state) => {
|
|
161
|
+
// Create mock test function
|
|
162
|
+
const mockTest = Object.assign((nameOrOptions, fnOrOptions, maybeFn) => {
|
|
163
|
+
let name;
|
|
164
|
+
let fn;
|
|
165
|
+
let skip = false;
|
|
166
|
+
let only = false;
|
|
167
|
+
// Parse arguments - node:test has flexible signatures
|
|
168
|
+
if (typeof nameOrOptions === 'string') {
|
|
169
|
+
name = nameOrOptions;
|
|
170
|
+
if (typeof fnOrOptions === 'function') {
|
|
171
|
+
fn = fnOrOptions;
|
|
172
|
+
}
|
|
173
|
+
else if (fnOrOptions && typeof fnOrOptions === 'object') {
|
|
174
|
+
skip = fnOrOptions.skip ?? false;
|
|
175
|
+
only = fnOrOptions.only ?? false;
|
|
176
|
+
fn = maybeFn ?? (() => { });
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
fn = () => { };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
name = nameOrOptions.name ?? 'unnamed test';
|
|
184
|
+
skip = nameOrOptions.skip ?? false;
|
|
185
|
+
only = nameOrOptions.only ?? false;
|
|
186
|
+
fn = fnOrOptions ?? (() => { });
|
|
187
|
+
}
|
|
188
|
+
const test = { fn, name, only, skip };
|
|
189
|
+
if (state.currentSuite) {
|
|
190
|
+
state.currentSuite.tests.push(test);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
state.rootTests.push(test);
|
|
194
|
+
}
|
|
195
|
+
return Promise.resolve();
|
|
196
|
+
}, {
|
|
197
|
+
only: function only(name, fn) {
|
|
198
|
+
return mockTest(name, { only: true }, fn);
|
|
199
|
+
},
|
|
200
|
+
skip: function skip(name, fn) {
|
|
201
|
+
return mockTest(name, { skip: true }, fn);
|
|
202
|
+
},
|
|
203
|
+
todo: function todo(name, fn) {
|
|
204
|
+
return mockTest(name, { skip: true }, fn);
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
// Create mock describe function
|
|
208
|
+
const mockDescribe = Object.assign((nameOrOptions, fnOrOptions, maybeFn) => {
|
|
209
|
+
let name;
|
|
210
|
+
let fn;
|
|
211
|
+
if (typeof nameOrOptions === 'string') {
|
|
212
|
+
name = nameOrOptions;
|
|
213
|
+
if (typeof fnOrOptions === 'function') {
|
|
214
|
+
fn = fnOrOptions;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
fn = maybeFn;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
name = nameOrOptions.name ?? 'unnamed suite';
|
|
222
|
+
fn = fnOrOptions;
|
|
223
|
+
}
|
|
224
|
+
const suite = createSuite(name);
|
|
225
|
+
const parent = state.currentSuite;
|
|
226
|
+
if (parent) {
|
|
227
|
+
parent.children.push(suite);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
state.rootSuites.push(suite);
|
|
231
|
+
}
|
|
232
|
+
// Enter suite context
|
|
233
|
+
state.currentSuite = suite;
|
|
234
|
+
// Execute describe body
|
|
235
|
+
if (fn) {
|
|
236
|
+
fn();
|
|
237
|
+
}
|
|
238
|
+
// Exit back to parent
|
|
239
|
+
state.currentSuite = parent;
|
|
240
|
+
return Promise.resolve();
|
|
241
|
+
}, {
|
|
242
|
+
only: function only(name, fn) {
|
|
243
|
+
return mockDescribe(name, fn);
|
|
244
|
+
},
|
|
245
|
+
skip: function skip(_name, _fn) {
|
|
246
|
+
return Promise.resolve();
|
|
247
|
+
},
|
|
248
|
+
todo: function todo(_name, _fn) {
|
|
249
|
+
return Promise.resolve();
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
// Hook functions
|
|
253
|
+
const mockBefore = (fn) => {
|
|
254
|
+
if (state.currentSuite) {
|
|
255
|
+
state.currentSuite.hooks.before.push(fn);
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
const mockAfter = (fn) => {
|
|
259
|
+
if (state.currentSuite) {
|
|
260
|
+
state.currentSuite.hooks.after.push(fn);
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
const mockBeforeEach = (fn) => {
|
|
264
|
+
if (state.currentSuite) {
|
|
265
|
+
state.currentSuite.hooks.beforeEach.push(fn);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
const mockAfterEach = (fn) => {
|
|
269
|
+
if (state.currentSuite) {
|
|
270
|
+
state.currentSuite.hooks.afterEach.push(fn);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
// Install on globalThis for the loader to access
|
|
274
|
+
// @ts-expect-error - intentionally using globalThis
|
|
275
|
+
globalThis.__MODESTBENCH_NODE_TEST_MOCK__ = {
|
|
276
|
+
after: mockAfter,
|
|
277
|
+
afterEach: mockAfterEach,
|
|
278
|
+
before: mockBefore,
|
|
279
|
+
beforeEach: mockBeforeEach,
|
|
280
|
+
default: mockTest,
|
|
281
|
+
describe: mockDescribe,
|
|
282
|
+
it: mockTest,
|
|
283
|
+
mock: {
|
|
284
|
+
fn: () => () => { },
|
|
285
|
+
getter: () => { },
|
|
286
|
+
method: () => { },
|
|
287
|
+
reset: () => { },
|
|
288
|
+
restoreAll: () => { },
|
|
289
|
+
setter: () => { },
|
|
290
|
+
timers: {
|
|
291
|
+
enable: () => { },
|
|
292
|
+
reset: () => { },
|
|
293
|
+
runAll: () => { },
|
|
294
|
+
tick: () => { },
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
suite: mockDescribe,
|
|
298
|
+
test: mockTest,
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
/**
|
|
302
|
+
* Convert mutable capture state to immutable CapturedTestFile
|
|
303
|
+
*/
|
|
304
|
+
const toCapturedTestFile = (state, filePath) => {
|
|
305
|
+
return {
|
|
306
|
+
filePath,
|
|
307
|
+
framework: 'node-test',
|
|
308
|
+
rootSuites: state.rootSuites.map(toImmutableSuite),
|
|
309
|
+
rootTests: state.rootTests.map(toImmutableTest),
|
|
310
|
+
};
|
|
311
|
+
};
|
|
312
|
+
const toImmutableSuite = (suite) => {
|
|
313
|
+
return {
|
|
314
|
+
children: suite.children.map(toImmutableSuite),
|
|
315
|
+
hooks: suite.hooks,
|
|
316
|
+
name: suite.name,
|
|
317
|
+
tests: suite.tests.map(toImmutableTest),
|
|
318
|
+
};
|
|
319
|
+
};
|
|
320
|
+
const toImmutableTest = (test) => {
|
|
321
|
+
return {
|
|
322
|
+
fn: test.fn,
|
|
323
|
+
name: test.name,
|
|
324
|
+
only: test.only,
|
|
325
|
+
skip: test.skip,
|
|
326
|
+
};
|
|
327
|
+
};
|
|
328
|
+
/**
|
|
329
|
+
* Uninstall node:test mocks
|
|
330
|
+
*/
|
|
331
|
+
const uninstallNodeTestMocks = () => {
|
|
332
|
+
// @ts-expect-error - cleaning up globalThis
|
|
333
|
+
delete globalThis.__MODESTBENCH_NODE_TEST_MOCK__;
|
|
334
|
+
};
|
|
335
|
+
//# sourceMappingURL=node-test-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-adapter.js","sourceRoot":"","sources":["../../src/adapters/node-test-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModestBench Node.js Test Runner Adapter
|
|
3
|
+
*
|
|
4
|
+
* Captures test definitions from node:test files using ES module loader hooks.
|
|
5
|
+
*
|
|
6
|
+
* Unlike Mocha (which uses globals), node:test requires ES module import
|
|
7
|
+
* interception. We use Node.js module.register() API to install a custom loader
|
|
8
|
+
* that returns our capturing mock instead of the real node:test.
|
|
9
|
+
*
|
|
10
|
+
* Architecture:
|
|
11
|
+
*
|
|
12
|
+
* 1. Register a custom loader that intercepts node:test imports
|
|
13
|
+
* 2. Import the test file - this triggers test/describe calls
|
|
14
|
+
* 3. Retrieve captured state from global storage
|
|
15
|
+
* 4. Unregister the loader
|
|
16
|
+
*/
|
|
17
|
+
import type { CapturedTestFile, TestFrameworkAdapter } from "./types.cjs";
|
|
18
|
+
/**
|
|
19
|
+
* Node.js test runner adapter
|
|
20
|
+
*
|
|
21
|
+
* Captures test definitions by installing mock implementations before importing
|
|
22
|
+
* the test file.
|
|
23
|
+
*
|
|
24
|
+
* IMPORTANT: For this to work with actual node:test imports, you must run
|
|
25
|
+
* Node.js with our loader: node --import modestbench/node-test your-test.js
|
|
26
|
+
*
|
|
27
|
+
* Without the loader, this adapter only works with test files that use
|
|
28
|
+
* globalThis.**MODESTBENCH_NODE_TEST_MOCK** directly (not useful for real test
|
|
29
|
+
* files).
|
|
30
|
+
*/
|
|
31
|
+
export declare class NodeTestAdapter implements TestFrameworkAdapter {
|
|
32
|
+
readonly framework: "node-test";
|
|
33
|
+
/**
|
|
34
|
+
* Capture test definitions from a node:test file
|
|
35
|
+
*
|
|
36
|
+
* @param filePath - Absolute path to the test file
|
|
37
|
+
* @returns Captured test structure
|
|
38
|
+
*/
|
|
39
|
+
capture(filePath: string): Promise<CapturedTestFile>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=node-test-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/node-test-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAGV,gBAAgB,EAEhB,oBAAoB,EACrB,oBAAmB;AA8CpB;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAgB,YAAW,oBAAoB;IAC1D,QAAQ,CAAC,SAAS,EAAG,WAAW,CAAU;IAE1C;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAsB3D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModestBench Node.js Test Runner Adapter
|
|
3
|
+
*
|
|
4
|
+
* Captures test definitions from node:test files using ES module loader hooks.
|
|
5
|
+
*
|
|
6
|
+
* Unlike Mocha (which uses globals), node:test requires ES module import
|
|
7
|
+
* interception. We use Node.js module.register() API to install a custom loader
|
|
8
|
+
* that returns our capturing mock instead of the real node:test.
|
|
9
|
+
*
|
|
10
|
+
* Architecture:
|
|
11
|
+
*
|
|
12
|
+
* 1. Register a custom loader that intercepts node:test imports
|
|
13
|
+
* 2. Import the test file - this triggers test/describe calls
|
|
14
|
+
* 3. Retrieve captured state from global storage
|
|
15
|
+
* 4. Unregister the loader
|
|
16
|
+
*/
|
|
17
|
+
import type { CapturedTestFile, TestFrameworkAdapter } from "./types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Node.js test runner adapter
|
|
20
|
+
*
|
|
21
|
+
* Captures test definitions by installing mock implementations before importing
|
|
22
|
+
* the test file.
|
|
23
|
+
*
|
|
24
|
+
* IMPORTANT: For this to work with actual node:test imports, you must run
|
|
25
|
+
* Node.js with our loader: node --import modestbench/node-test your-test.js
|
|
26
|
+
*
|
|
27
|
+
* Without the loader, this adapter only works with test files that use
|
|
28
|
+
* globalThis.**MODESTBENCH_NODE_TEST_MOCK** directly (not useful for real test
|
|
29
|
+
* files).
|
|
30
|
+
*/
|
|
31
|
+
export declare class NodeTestAdapter implements TestFrameworkAdapter {
|
|
32
|
+
readonly framework: "node-test";
|
|
33
|
+
/**
|
|
34
|
+
* Capture test definitions from a node:test file
|
|
35
|
+
*
|
|
36
|
+
* @param filePath - Absolute path to the test file
|
|
37
|
+
* @returns Captured test structure
|
|
38
|
+
*/
|
|
39
|
+
capture(filePath: string): Promise<CapturedTestFile>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=node-test-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/node-test-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAGV,gBAAgB,EAEhB,oBAAoB,EACrB,mBAAmB;AA8CpB;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAgB,YAAW,oBAAoB;IAC1D,QAAQ,CAAC,SAAS,EAAG,WAAW,CAAU;IAE1C;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAsB3D"}
|