modestbench 0.3.1 → 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 +44 -0
- package/README.md +46 -3
- 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 -16
- 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 -16
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/run.cjs +9 -2
- package/dist/cli/commands/run.cjs.map +1 -1
- package/dist/cli/commands/run.d.cts.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +9 -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/config/schema.cjs +2 -1
- package/dist/config/schema.cjs.map +1 -1
- package/dist/config/schema.d.cts +3 -3
- package/dist/config/schema.d.cts.map +1 -1
- package/dist/config/schema.d.ts +3 -3
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +2 -1
- package/dist/config/schema.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/schema/modestbench-config.schema.json +1 -1
- package/dist/services/config-manager.cjs +2 -2
- package/dist/services/config-manager.cjs.map +1 -1
- package/dist/services/config-manager.js +3 -3
- package/dist/services/config-manager.js.map +1 -1
- package/dist/types/core.d.cts +2 -2
- package/dist/types/core.d.cts.map +1 -1
- package/dist/types/core.d.ts +2 -2
- package/dist/types/core.d.ts.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 -16
- package/src/cli/commands/run.ts +12 -2
- package/src/cli/commands/test.ts +546 -0
- package/src/cli/index.ts +81 -1
- package/src/config/schema.ts +2 -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 +3 -3
- package/src/types/core.ts +2 -2
|
@@ -0,0 +1,298 @@
|
|
|
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
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
18
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
19
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
20
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return path;
|
|
24
|
+
};
|
|
25
|
+
import { pathToFileURL } from 'node:url';
|
|
26
|
+
/**
|
|
27
|
+
* Global capture state key
|
|
28
|
+
*/
|
|
29
|
+
const CAPTURE_STATE_KEY = '__MODESTBENCH_NODE_TEST_CAPTURE__';
|
|
30
|
+
/**
|
|
31
|
+
* Node.js test runner adapter
|
|
32
|
+
*
|
|
33
|
+
* Captures test definitions by installing mock implementations before importing
|
|
34
|
+
* the test file.
|
|
35
|
+
*
|
|
36
|
+
* IMPORTANT: For this to work with actual node:test imports, you must run
|
|
37
|
+
* Node.js with our loader: node --import modestbench/node-test your-test.js
|
|
38
|
+
*
|
|
39
|
+
* Without the loader, this adapter only works with test files that use
|
|
40
|
+
* globalThis.**MODESTBENCH_NODE_TEST_MOCK** directly (not useful for real test
|
|
41
|
+
* files).
|
|
42
|
+
*/
|
|
43
|
+
export class NodeTestAdapter {
|
|
44
|
+
framework = 'node-test';
|
|
45
|
+
/**
|
|
46
|
+
* Capture test definitions from a node:test file
|
|
47
|
+
*
|
|
48
|
+
* @param filePath - Absolute path to the test file
|
|
49
|
+
* @returns Captured test structure
|
|
50
|
+
*/
|
|
51
|
+
async capture(filePath) {
|
|
52
|
+
// Initialize capture state
|
|
53
|
+
const state = initCaptureState();
|
|
54
|
+
// Install mocks
|
|
55
|
+
installNodeTestMocks(state);
|
|
56
|
+
try {
|
|
57
|
+
// Import the test file
|
|
58
|
+
// The loader hook will intercept 'node:test' and use our mocks
|
|
59
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
60
|
+
const bustCache = `?t=${Date.now()}`;
|
|
61
|
+
await import(__rewriteRelativeImportExtension(fileUrl + bustCache));
|
|
62
|
+
// Return captured structure
|
|
63
|
+
return toCapturedTestFile(state, filePath);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
// Clean up
|
|
67
|
+
uninstallNodeTestMocks();
|
|
68
|
+
clearCaptureState();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Clear capture state from globalThis
|
|
74
|
+
*/
|
|
75
|
+
const clearCaptureState = () => {
|
|
76
|
+
// @ts-expect-error - intentionally using globalThis
|
|
77
|
+
delete globalThis[CAPTURE_STATE_KEY];
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Create empty hooks structure
|
|
81
|
+
*/
|
|
82
|
+
const createEmptyHooks = () => {
|
|
83
|
+
return {
|
|
84
|
+
after: [],
|
|
85
|
+
afterEach: [],
|
|
86
|
+
before: [],
|
|
87
|
+
beforeEach: [],
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Create a new suite structure
|
|
92
|
+
*/
|
|
93
|
+
const createSuite = (name) => {
|
|
94
|
+
return {
|
|
95
|
+
children: [],
|
|
96
|
+
hooks: createEmptyHooks(),
|
|
97
|
+
name,
|
|
98
|
+
tests: [],
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Initialize capture state on globalThis
|
|
103
|
+
*/
|
|
104
|
+
const initCaptureState = () => {
|
|
105
|
+
const state = {
|
|
106
|
+
currentSuite: null,
|
|
107
|
+
rootSuites: [],
|
|
108
|
+
rootTests: [],
|
|
109
|
+
};
|
|
110
|
+
// @ts-expect-error - intentionally using globalThis for cross-module state
|
|
111
|
+
globalThis[CAPTURE_STATE_KEY] = state;
|
|
112
|
+
return state;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Install node:test mocks on globalThis for module interception
|
|
116
|
+
*
|
|
117
|
+
* Since we can't truly intercept ES imports without a loader, we use a
|
|
118
|
+
* workaround: install mocks that test files can import via a special path.
|
|
119
|
+
*
|
|
120
|
+
* For true node:test interception, users must run with: node --import
|
|
121
|
+
* modestbench/register test-file.js
|
|
122
|
+
*/
|
|
123
|
+
const installNodeTestMocks = (state) => {
|
|
124
|
+
// Create mock test function
|
|
125
|
+
const mockTest = Object.assign((nameOrOptions, fnOrOptions, maybeFn) => {
|
|
126
|
+
let name;
|
|
127
|
+
let fn;
|
|
128
|
+
let skip = false;
|
|
129
|
+
let only = false;
|
|
130
|
+
// Parse arguments - node:test has flexible signatures
|
|
131
|
+
if (typeof nameOrOptions === 'string') {
|
|
132
|
+
name = nameOrOptions;
|
|
133
|
+
if (typeof fnOrOptions === 'function') {
|
|
134
|
+
fn = fnOrOptions;
|
|
135
|
+
}
|
|
136
|
+
else if (fnOrOptions && typeof fnOrOptions === 'object') {
|
|
137
|
+
skip = fnOrOptions.skip ?? false;
|
|
138
|
+
only = fnOrOptions.only ?? false;
|
|
139
|
+
fn = maybeFn ?? (() => { });
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
fn = () => { };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
name = nameOrOptions.name ?? 'unnamed test';
|
|
147
|
+
skip = nameOrOptions.skip ?? false;
|
|
148
|
+
only = nameOrOptions.only ?? false;
|
|
149
|
+
fn = fnOrOptions ?? (() => { });
|
|
150
|
+
}
|
|
151
|
+
const test = { fn, name, only, skip };
|
|
152
|
+
if (state.currentSuite) {
|
|
153
|
+
state.currentSuite.tests.push(test);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
state.rootTests.push(test);
|
|
157
|
+
}
|
|
158
|
+
return Promise.resolve();
|
|
159
|
+
}, {
|
|
160
|
+
only: function only(name, fn) {
|
|
161
|
+
return mockTest(name, { only: true }, fn);
|
|
162
|
+
},
|
|
163
|
+
skip: function skip(name, fn) {
|
|
164
|
+
return mockTest(name, { skip: true }, fn);
|
|
165
|
+
},
|
|
166
|
+
todo: function todo(name, fn) {
|
|
167
|
+
return mockTest(name, { skip: true }, fn);
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
// Create mock describe function
|
|
171
|
+
const mockDescribe = Object.assign((nameOrOptions, fnOrOptions, maybeFn) => {
|
|
172
|
+
let name;
|
|
173
|
+
let fn;
|
|
174
|
+
if (typeof nameOrOptions === 'string') {
|
|
175
|
+
name = nameOrOptions;
|
|
176
|
+
if (typeof fnOrOptions === 'function') {
|
|
177
|
+
fn = fnOrOptions;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
fn = maybeFn;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
name = nameOrOptions.name ?? 'unnamed suite';
|
|
185
|
+
fn = fnOrOptions;
|
|
186
|
+
}
|
|
187
|
+
const suite = createSuite(name);
|
|
188
|
+
const parent = state.currentSuite;
|
|
189
|
+
if (parent) {
|
|
190
|
+
parent.children.push(suite);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
state.rootSuites.push(suite);
|
|
194
|
+
}
|
|
195
|
+
// Enter suite context
|
|
196
|
+
state.currentSuite = suite;
|
|
197
|
+
// Execute describe body
|
|
198
|
+
if (fn) {
|
|
199
|
+
fn();
|
|
200
|
+
}
|
|
201
|
+
// Exit back to parent
|
|
202
|
+
state.currentSuite = parent;
|
|
203
|
+
return Promise.resolve();
|
|
204
|
+
}, {
|
|
205
|
+
only: function only(name, fn) {
|
|
206
|
+
return mockDescribe(name, fn);
|
|
207
|
+
},
|
|
208
|
+
skip: function skip(_name, _fn) {
|
|
209
|
+
return Promise.resolve();
|
|
210
|
+
},
|
|
211
|
+
todo: function todo(_name, _fn) {
|
|
212
|
+
return Promise.resolve();
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
// Hook functions
|
|
216
|
+
const mockBefore = (fn) => {
|
|
217
|
+
if (state.currentSuite) {
|
|
218
|
+
state.currentSuite.hooks.before.push(fn);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const mockAfter = (fn) => {
|
|
222
|
+
if (state.currentSuite) {
|
|
223
|
+
state.currentSuite.hooks.after.push(fn);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const mockBeforeEach = (fn) => {
|
|
227
|
+
if (state.currentSuite) {
|
|
228
|
+
state.currentSuite.hooks.beforeEach.push(fn);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
const mockAfterEach = (fn) => {
|
|
232
|
+
if (state.currentSuite) {
|
|
233
|
+
state.currentSuite.hooks.afterEach.push(fn);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
// Install on globalThis for the loader to access
|
|
237
|
+
// @ts-expect-error - intentionally using globalThis
|
|
238
|
+
globalThis.__MODESTBENCH_NODE_TEST_MOCK__ = {
|
|
239
|
+
after: mockAfter,
|
|
240
|
+
afterEach: mockAfterEach,
|
|
241
|
+
before: mockBefore,
|
|
242
|
+
beforeEach: mockBeforeEach,
|
|
243
|
+
default: mockTest,
|
|
244
|
+
describe: mockDescribe,
|
|
245
|
+
it: mockTest,
|
|
246
|
+
mock: {
|
|
247
|
+
fn: () => () => { },
|
|
248
|
+
getter: () => { },
|
|
249
|
+
method: () => { },
|
|
250
|
+
reset: () => { },
|
|
251
|
+
restoreAll: () => { },
|
|
252
|
+
setter: () => { },
|
|
253
|
+
timers: {
|
|
254
|
+
enable: () => { },
|
|
255
|
+
reset: () => { },
|
|
256
|
+
runAll: () => { },
|
|
257
|
+
tick: () => { },
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
suite: mockDescribe,
|
|
261
|
+
test: mockTest,
|
|
262
|
+
};
|
|
263
|
+
};
|
|
264
|
+
/**
|
|
265
|
+
* Convert mutable capture state to immutable CapturedTestFile
|
|
266
|
+
*/
|
|
267
|
+
const toCapturedTestFile = (state, filePath) => {
|
|
268
|
+
return {
|
|
269
|
+
filePath,
|
|
270
|
+
framework: 'node-test',
|
|
271
|
+
rootSuites: state.rootSuites.map(toImmutableSuite),
|
|
272
|
+
rootTests: state.rootTests.map(toImmutableTest),
|
|
273
|
+
};
|
|
274
|
+
};
|
|
275
|
+
const toImmutableSuite = (suite) => {
|
|
276
|
+
return {
|
|
277
|
+
children: suite.children.map(toImmutableSuite),
|
|
278
|
+
hooks: suite.hooks,
|
|
279
|
+
name: suite.name,
|
|
280
|
+
tests: suite.tests.map(toImmutableTest),
|
|
281
|
+
};
|
|
282
|
+
};
|
|
283
|
+
const toImmutableTest = (test) => {
|
|
284
|
+
return {
|
|
285
|
+
fn: test.fn,
|
|
286
|
+
name: test.name,
|
|
287
|
+
only: test.only,
|
|
288
|
+
skip: test.skip,
|
|
289
|
+
};
|
|
290
|
+
};
|
|
291
|
+
/**
|
|
292
|
+
* Uninstall node:test mocks
|
|
293
|
+
*/
|
|
294
|
+
const uninstallNodeTestMocks = () => {
|
|
295
|
+
// @ts-expect-error - cleaning up globalThis
|
|
296
|
+
delete globalThis.__MODESTBENCH_NODE_TEST_MOCK__;
|
|
297
|
+
};
|
|
298
|
+
//# 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,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ModestBench Node.js Test Runner Loader
|
|
4
|
+
*
|
|
5
|
+
* ES module loader hook that intercepts `node:test` imports and returns our
|
|
6
|
+
* capturing mock from globalThis.
|
|
7
|
+
*
|
|
8
|
+
* Usage: node --import modestbench/node-test your-test.js
|
|
9
|
+
*
|
|
10
|
+
* This loader exports async `resolve` and `load` hooks that get registered via
|
|
11
|
+
* module.register() when imported.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.load = exports.resolve = void 0;
|
|
15
|
+
// Generate the mock module source code
|
|
16
|
+
// The generated module source uses top-level await to conditionally get the mock or real module
|
|
17
|
+
// Note: Uses 'node:test?passthrough' to bypass our hook when falling back
|
|
18
|
+
// Security: The globalThis mock is only installed by our own adapter code, so the generated
|
|
19
|
+
// source is safe. No user input is interpolated into this template.
|
|
20
|
+
const generateMockSource = () => `
|
|
21
|
+
const mock = globalThis.__MODESTBENCH_NODE_TEST_MOCK__;
|
|
22
|
+
|
|
23
|
+
// If no mock installed, fall through to real node:test
|
|
24
|
+
// The '?passthrough' query tells our hook to not intercept this import
|
|
25
|
+
const source = mock ?? await import('node:test?passthrough');
|
|
26
|
+
|
|
27
|
+
export const test = source.test;
|
|
28
|
+
export const describe = source.describe;
|
|
29
|
+
export const it = source.it;
|
|
30
|
+
export const before = source.before;
|
|
31
|
+
export const after = source.after;
|
|
32
|
+
export const beforeEach = source.beforeEach;
|
|
33
|
+
export const afterEach = source.afterEach;
|
|
34
|
+
export const suite = source.suite;
|
|
35
|
+
export default source.default ?? source.test;
|
|
36
|
+
`;
|
|
37
|
+
/**
|
|
38
|
+
* Resolve hook - intercepts node:test specifier
|
|
39
|
+
*
|
|
40
|
+
* Uses query param '?passthrough' to prevent infinite recursion when falling
|
|
41
|
+
* back to real node:test (when no mock is installed).
|
|
42
|
+
*/
|
|
43
|
+
const resolve = async (specifier, context, nextResolve) => {
|
|
44
|
+
// Only intercept bare 'node:test', not 'node:test?passthrough'
|
|
45
|
+
if (specifier === 'node:test') {
|
|
46
|
+
return {
|
|
47
|
+
shortCircuit: true,
|
|
48
|
+
url: 'modestbench://capture/node-test',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Strip passthrough query to resolve real node:test
|
|
52
|
+
if (specifier === 'node:test?passthrough') {
|
|
53
|
+
return nextResolve('node:test', context);
|
|
54
|
+
}
|
|
55
|
+
return nextResolve(specifier, context);
|
|
56
|
+
};
|
|
57
|
+
exports.resolve = resolve;
|
|
58
|
+
/**
|
|
59
|
+
* Load hook - returns mock module for our custom URL
|
|
60
|
+
*/
|
|
61
|
+
const load = async (url, context, nextLoad) => {
|
|
62
|
+
if (url === 'modestbench://capture/node-test') {
|
|
63
|
+
return {
|
|
64
|
+
format: 'module',
|
|
65
|
+
shortCircuit: true,
|
|
66
|
+
source: generateMockSource(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return nextLoad(url, context);
|
|
70
|
+
};
|
|
71
|
+
exports.load = load;
|
|
72
|
+
//# sourceMappingURL=node-test-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-hooks.js","sourceRoot":"","sources":["../../src/adapters/node-test-hooks.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAIH,uCAAuC;AACvC,gGAAgG;AAChG,0EAA0E;AAC1E,4FAA4F;AAC5F,oEAAoE;AACpE,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC;;;;;;;;;;;;;;;;CAgBxC,CAAC;AAEF;;;;;GAKG;AACI,MAAM,OAAO,GAAgB,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IAC5E,+DAA+D;IAC/D,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,GAAG,EAAE,iCAAiC;SACvC,CAAC;IACJ,CAAC;IACD,oDAAoD;IACpD,IAAI,SAAS,KAAK,uBAAuB,EAAE,CAAC;QAC1C,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,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,iCAAiC,EAAE,CAAC;QAC9C,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 Node.js Test Runner Loader
|
|
3
|
+
*
|
|
4
|
+
* ES module loader hook that intercepts `node:test` imports and returns our
|
|
5
|
+
* capturing mock from globalThis.
|
|
6
|
+
*
|
|
7
|
+
* Usage: node --import modestbench/node-test your-test.js
|
|
8
|
+
*
|
|
9
|
+
* This loader exports async `resolve` and `load` hooks that get registered via
|
|
10
|
+
* module.register() when imported.
|
|
11
|
+
*/
|
|
12
|
+
import type { LoadHook, ResolveHook } from 'node:module';
|
|
13
|
+
/**
|
|
14
|
+
* Resolve hook - intercepts node:test specifier
|
|
15
|
+
*
|
|
16
|
+
* Uses query param '?passthrough' to prevent infinite recursion when falling
|
|
17
|
+
* back to real node:test (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=node-test-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-hooks.d.ts","sourceRoot":"","sources":["../../src/adapters/node-test-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAyBzD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,EAAE,WAarB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,QASlB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModestBench Node.js Test Runner Loader
|
|
3
|
+
*
|
|
4
|
+
* ES module loader hook that intercepts `node:test` imports and returns our
|
|
5
|
+
* capturing mock from globalThis.
|
|
6
|
+
*
|
|
7
|
+
* Usage: node --import modestbench/node-test your-test.js
|
|
8
|
+
*
|
|
9
|
+
* This loader exports async `resolve` and `load` hooks that get registered via
|
|
10
|
+
* module.register() when imported.
|
|
11
|
+
*/
|
|
12
|
+
import type { LoadHook, ResolveHook } from 'node:module';
|
|
13
|
+
/**
|
|
14
|
+
* Resolve hook - intercepts node:test specifier
|
|
15
|
+
*
|
|
16
|
+
* Uses query param '?passthrough' to prevent infinite recursion when falling
|
|
17
|
+
* back to real node:test (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=node-test-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-hooks.d.ts","sourceRoot":"","sources":["../../src/adapters/node-test-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAyBzD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,EAAE,WAarB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,QASlB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModestBench Node.js Test Runner Loader
|
|
3
|
+
*
|
|
4
|
+
* ES module loader hook that intercepts `node:test` imports and returns our
|
|
5
|
+
* capturing mock from globalThis.
|
|
6
|
+
*
|
|
7
|
+
* Usage: node --import modestbench/node-test your-test.js
|
|
8
|
+
*
|
|
9
|
+
* This loader exports async `resolve` and `load` hooks that get registered via
|
|
10
|
+
* module.register() when imported.
|
|
11
|
+
*/
|
|
12
|
+
// Generate the mock module source code
|
|
13
|
+
// The generated module source uses top-level await to conditionally get the mock or real module
|
|
14
|
+
// Note: Uses 'node:test?passthrough' to bypass our hook when falling back
|
|
15
|
+
// Security: The globalThis mock is only installed by our own adapter code, so the generated
|
|
16
|
+
// source is safe. No user input is interpolated into this template.
|
|
17
|
+
const generateMockSource = () => `
|
|
18
|
+
const mock = globalThis.__MODESTBENCH_NODE_TEST_MOCK__;
|
|
19
|
+
|
|
20
|
+
// If no mock installed, fall through to real node:test
|
|
21
|
+
// The '?passthrough' query tells our hook to not intercept this import
|
|
22
|
+
const source = mock ?? await import('node:test?passthrough');
|
|
23
|
+
|
|
24
|
+
export const test = source.test;
|
|
25
|
+
export const describe = source.describe;
|
|
26
|
+
export const it = source.it;
|
|
27
|
+
export const before = source.before;
|
|
28
|
+
export const after = source.after;
|
|
29
|
+
export const beforeEach = source.beforeEach;
|
|
30
|
+
export const afterEach = source.afterEach;
|
|
31
|
+
export const suite = source.suite;
|
|
32
|
+
export default source.default ?? source.test;
|
|
33
|
+
`;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve hook - intercepts node:test specifier
|
|
36
|
+
*
|
|
37
|
+
* Uses query param '?passthrough' to prevent infinite recursion when falling
|
|
38
|
+
* back to real node:test (when no mock is installed).
|
|
39
|
+
*/
|
|
40
|
+
export const resolve = async (specifier, context, nextResolve) => {
|
|
41
|
+
// Only intercept bare 'node:test', not 'node:test?passthrough'
|
|
42
|
+
if (specifier === 'node:test') {
|
|
43
|
+
return {
|
|
44
|
+
shortCircuit: true,
|
|
45
|
+
url: 'modestbench://capture/node-test',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Strip passthrough query to resolve real node:test
|
|
49
|
+
if (specifier === 'node:test?passthrough') {
|
|
50
|
+
return nextResolve('node:test', context);
|
|
51
|
+
}
|
|
52
|
+
return nextResolve(specifier, context);
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Load hook - returns mock module for our custom URL
|
|
56
|
+
*/
|
|
57
|
+
export const load = async (url, context, nextLoad) => {
|
|
58
|
+
if (url === 'modestbench://capture/node-test') {
|
|
59
|
+
return {
|
|
60
|
+
format: 'module',
|
|
61
|
+
shortCircuit: true,
|
|
62
|
+
source: generateMockSource(),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return nextLoad(url, context);
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=node-test-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-hooks.js","sourceRoot":"","sources":["../../src/adapters/node-test-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,uCAAuC;AACvC,gGAAgG;AAChG,0EAA0E;AAC1E,4FAA4F;AAC5F,oEAAoE;AACpE,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC;;;;;;;;;;;;;;;;CAgBxC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAgB,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IAC5E,+DAA+D;IAC/D,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,GAAG,EAAE,iCAAiC;SACvC,CAAC;IACJ,CAAC;IACD,oDAAoD;IACpD,IAAI,SAAS,KAAK,uBAAuB,EAAE,CAAC;QAC1C,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,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,iCAAiC,EAAE,CAAC;QAC9C,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,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const node_module_1 = require("node:module");
|
|
4
|
+
(0, node_module_1.register)('./node-test-hooks.js', {
|
|
5
|
+
parentURL: require("url").pathToFileURL(__filename),
|
|
6
|
+
});
|
|
7
|
+
//# sourceMappingURL=node-test-register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-register.js","sourceRoot":"","sources":["../../src/adapters/node-test-register.ts"],"names":[],"mappings":";;AAAA,6CAAuC;AAEvC,IAAA,sBAAQ,EAAC,sBAAsB,EAAE;IAC/B,SAAS,0CAAiB;CAC3B,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-register.d.ts","sourceRoot":"","sources":["../../src/adapters/node-test-register.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-register.d.ts","sourceRoot":"","sources":["../../src/adapters/node-test-register.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-test-register.js","sourceRoot":"","sources":["../../src/adapters/node-test-register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,QAAQ,CAAC,sBAAsB,EAAE;IAC/B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;CAC3B,CAAC,CAAC"}
|