@scenetest/vite-plugin 0.0.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.
- package/LICENSE +21 -0
- package/dist/__tests__/strip.test.d.ts +2 -0
- package/dist/__tests__/strip.test.d.ts.map +1 -0
- package/dist/__tests__/strip.test.js +434 -0
- package/dist/__tests__/strip.test.js.map +1 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +71 -0
- package/dist/config.js.map +1 -0
- package/dist/dev-panel.generated.d.ts +9 -0
- package/dist/dev-panel.generated.d.ts.map +1 -0
- package/dist/dev-panel.generated.js +9 -0
- package/dist/dev-panel.generated.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +137 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware.d.ts +14 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +121 -0
- package/dist/middleware.js.map +1 -0
- package/dist/strip.d.ts +26 -0
- package/dist/strip.d.ts.map +1 -0
- package/dist/strip.js +195 -0
- package/dist/strip.js.map +1 -0
- package/dist/transform.d.ts +52 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +477 -0
- package/dist/transform.js.map +1 -0
- package/dist/virtual-module.d.ts +36 -0
- package/dist/virtual-module.d.ts.map +1 -0
- package/dist/virtual-module.js +72 -0
- package/dist/virtual-module.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import { parse } from '@babel/parser';
|
|
2
|
+
import _traverse from '@babel/traverse';
|
|
3
|
+
import * as t from '@babel/types';
|
|
4
|
+
import MagicString from 'magic-string';
|
|
5
|
+
// Handle ESM/CJS interop for @babel/traverse
|
|
6
|
+
const traverse = (typeof _traverse === 'function' ? _traverse : _traverse.default);
|
|
7
|
+
/**
|
|
8
|
+
* Helper to extract serverFn body code from a function node
|
|
9
|
+
*/
|
|
10
|
+
function extractServerFnBody(code, serverFnNode, filename, line) {
|
|
11
|
+
if (t.isArrowFunctionExpression(serverFnNode) || t.isFunctionExpression(serverFnNode)) {
|
|
12
|
+
const body = serverFnNode.body;
|
|
13
|
+
if (t.isBlockStatement(body)) {
|
|
14
|
+
const bodyCode = code.slice(body.start, body.end);
|
|
15
|
+
return bodyCode.slice(1, -1).trim(); // Remove { and }
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
return `return ${code.slice(body.start, body.end)}`;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.warn(`[vite-plugin-scenetest] serverFn is not a function at ${filename}:${line}`);
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Helper to extract properties from a config object.
|
|
28
|
+
*/
|
|
29
|
+
function extractConfigProps(configObj) {
|
|
30
|
+
let titleNode = null;
|
|
31
|
+
let keyNode = null;
|
|
32
|
+
let withDataNode = null;
|
|
33
|
+
let serverFnNode = null;
|
|
34
|
+
let serverFnProp = null;
|
|
35
|
+
for (const prop of configObj.properties) {
|
|
36
|
+
if (!t.isObjectProperty(prop) || !t.isIdentifier(prop.key)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const keyName = prop.key.name;
|
|
40
|
+
if (keyName === 'title') {
|
|
41
|
+
titleNode = prop.value;
|
|
42
|
+
}
|
|
43
|
+
else if (keyName === 'key') {
|
|
44
|
+
keyNode = prop.value;
|
|
45
|
+
}
|
|
46
|
+
else if (keyName === 'withData') {
|
|
47
|
+
withDataNode = prop.value;
|
|
48
|
+
}
|
|
49
|
+
else if (keyName === 'serverFn') {
|
|
50
|
+
serverFnNode = prop.value;
|
|
51
|
+
serverFnProp = prop;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { titleNode, keyNode, withDataNode, serverFnNode, serverFnProp };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Transform assert() and useAssert() calls in source code.
|
|
58
|
+
*
|
|
59
|
+
* For assert() calls:
|
|
60
|
+
* 1. Extract the serverFn to be run on the server
|
|
61
|
+
* 2. Replace the call with __scenetest_rpc({ id, title, key?, withData })
|
|
62
|
+
*
|
|
63
|
+
* For useAssert() calls:
|
|
64
|
+
* 1. Extract the serverFn from the config object
|
|
65
|
+
* 2. Replace serverFn property with __assertionId
|
|
66
|
+
* 3. Replace useAssert with __useAssert
|
|
67
|
+
*
|
|
68
|
+
* @param code Source code to transform
|
|
69
|
+
* @param options Transform options
|
|
70
|
+
* @returns Transformed code, source map, and extracted assertions
|
|
71
|
+
*/
|
|
72
|
+
export function transformAssertions(code, options = {}) {
|
|
73
|
+
const { sourceMap = true, filename = 'unknown.js' } = options;
|
|
74
|
+
// Quick check - if no assert call, skip
|
|
75
|
+
if (!code.includes('assert')) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
// All scenetest packages
|
|
79
|
+
const SCENETEST_PACKAGES = [
|
|
80
|
+
'@scenetest/core',
|
|
81
|
+
'@scenetest/react',
|
|
82
|
+
'@scenetest/vue',
|
|
83
|
+
'@scenetest/solid',
|
|
84
|
+
'@scenetest/svelte',
|
|
85
|
+
];
|
|
86
|
+
// Track imported names and their source packages
|
|
87
|
+
let assertLocalName = null;
|
|
88
|
+
let useAssertLocalName = null;
|
|
89
|
+
let useAssertSourcePackage = null;
|
|
90
|
+
let createAssertLocalName = null;
|
|
91
|
+
let runAssertLocalName = null;
|
|
92
|
+
// Parse with Babel
|
|
93
|
+
const parserOptions = {
|
|
94
|
+
sourceType: 'module',
|
|
95
|
+
plugins: [
|
|
96
|
+
'jsx',
|
|
97
|
+
'typescript',
|
|
98
|
+
'decorators',
|
|
99
|
+
'classProperties',
|
|
100
|
+
'classPrivateProperties',
|
|
101
|
+
'classPrivateMethods',
|
|
102
|
+
'dynamicImport',
|
|
103
|
+
'nullishCoalescingOperator',
|
|
104
|
+
'optionalChaining',
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
let ast;
|
|
108
|
+
try {
|
|
109
|
+
ast = parse(code, parserOptions);
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
console.warn(`[vite-plugin-scenetest] Failed to parse ${filename}:`, e);
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
const s = new MagicString(code);
|
|
116
|
+
const extractedAssertions = [];
|
|
117
|
+
let needsRpcImport = false;
|
|
118
|
+
let needsUseAssertImport = false;
|
|
119
|
+
let needsCreateAssertImport = false;
|
|
120
|
+
let needsRunAssertImport = false;
|
|
121
|
+
// First pass: find imports from scenetest packages
|
|
122
|
+
traverse(ast, {
|
|
123
|
+
ImportDeclaration(path) {
|
|
124
|
+
const source = path.node.source.value;
|
|
125
|
+
if (!SCENETEST_PACKAGES.includes(source)) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
for (const specifier of path.node.specifiers) {
|
|
129
|
+
if (t.isImportSpecifier(specifier)) {
|
|
130
|
+
const imported = t.isIdentifier(specifier.imported)
|
|
131
|
+
? specifier.imported.name
|
|
132
|
+
: specifier.imported.value;
|
|
133
|
+
if (imported === 'assert') {
|
|
134
|
+
assertLocalName = specifier.local.name;
|
|
135
|
+
}
|
|
136
|
+
else if (imported === 'useAssert') {
|
|
137
|
+
useAssertLocalName = specifier.local.name;
|
|
138
|
+
useAssertSourcePackage = source;
|
|
139
|
+
}
|
|
140
|
+
else if (imported === 'createAssert') {
|
|
141
|
+
createAssertLocalName = specifier.local.name;
|
|
142
|
+
}
|
|
143
|
+
else if (imported === 'runAssert') {
|
|
144
|
+
runAssertLocalName = specifier.local.name;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
if (!assertLocalName && !useAssertLocalName && !createAssertLocalName && !runAssertLocalName) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
// Second pass: transform assert() calls
|
|
154
|
+
if (assertLocalName) {
|
|
155
|
+
traverse(ast, {
|
|
156
|
+
CallExpression(path) {
|
|
157
|
+
const callee = path.node.callee;
|
|
158
|
+
// Check if this is an assert() call
|
|
159
|
+
if (!t.isIdentifier(callee) || callee.name !== assertLocalName) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// Get the config object argument
|
|
163
|
+
const args = path.node.arguments;
|
|
164
|
+
if (args.length !== 1 || !t.isObjectExpression(args[0])) {
|
|
165
|
+
console.warn(`[vite-plugin-scenetest] assert() requires a single config object at ${filename}:${path.node.loc?.start.line}`);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const configObj = args[0];
|
|
169
|
+
const { titleNode, keyNode, withDataNode, serverFnNode } = extractConfigProps(configObj);
|
|
170
|
+
if (!titleNode || !serverFnNode) {
|
|
171
|
+
console.warn(`[vite-plugin-scenetest] assert() missing required properties at ${filename}:${path.node.loc?.start.line}`);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// Get the source location
|
|
175
|
+
const loc = path.node.loc;
|
|
176
|
+
const line = loc?.start.line ?? 0;
|
|
177
|
+
const column = loc?.start.column ?? 0;
|
|
178
|
+
// Extract key value if present
|
|
179
|
+
let keyValue;
|
|
180
|
+
if (keyNode && t.isStringLiteral(keyNode)) {
|
|
181
|
+
keyValue = keyNode.value;
|
|
182
|
+
}
|
|
183
|
+
// Generate assertion ID
|
|
184
|
+
const id = keyValue
|
|
185
|
+
? `${filename}:${line}:${column}:${keyValue}`
|
|
186
|
+
: `${filename}:${line}:${column}`;
|
|
187
|
+
// Extract title value
|
|
188
|
+
let titleValue = 'assertion';
|
|
189
|
+
if (t.isStringLiteral(titleNode)) {
|
|
190
|
+
titleValue = titleNode.value;
|
|
191
|
+
}
|
|
192
|
+
// Extract serverFn body code
|
|
193
|
+
const serverFnBodyCode = extractServerFnBody(code, serverFnNode, filename, line);
|
|
194
|
+
if (!serverFnBodyCode) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Store extracted assertion
|
|
198
|
+
extractedAssertions.push({
|
|
199
|
+
id,
|
|
200
|
+
title: titleValue,
|
|
201
|
+
key: keyValue,
|
|
202
|
+
serverFnBodyCode,
|
|
203
|
+
location: { file: filename, line, column },
|
|
204
|
+
});
|
|
205
|
+
// Build the replacement RPC call
|
|
206
|
+
let rpcCall = `__scenetest_rpc({ id: ${JSON.stringify(id)}, title: ${JSON.stringify(titleValue)}`;
|
|
207
|
+
if (keyValue) {
|
|
208
|
+
rpcCall += `, key: ${JSON.stringify(keyValue)}`;
|
|
209
|
+
}
|
|
210
|
+
if (withDataNode) {
|
|
211
|
+
const withDataCode = code.slice(withDataNode.start, withDataNode.end);
|
|
212
|
+
rpcCall += `, withData: ${withDataCode}`;
|
|
213
|
+
}
|
|
214
|
+
rpcCall += ` })`;
|
|
215
|
+
// Replace the assert() call with the RPC call
|
|
216
|
+
s.overwrite(path.node.start, path.node.end, rpcCall);
|
|
217
|
+
needsRpcImport = true;
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
// Third pass: transform useAssert() calls
|
|
222
|
+
// useAssert(config | undefined, deps) where config has { title, withData?, serverFn }
|
|
223
|
+
if (useAssertLocalName) {
|
|
224
|
+
traverse(ast, {
|
|
225
|
+
CallExpression(path) {
|
|
226
|
+
const callee = path.node.callee;
|
|
227
|
+
// Check if this is a useAssert() call
|
|
228
|
+
if (!t.isIdentifier(callee) || callee.name !== useAssertLocalName) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const args = path.node.arguments;
|
|
232
|
+
if (args.length < 2) {
|
|
233
|
+
console.warn(`[vite-plugin-scenetest] useAssert() requires (config, deps) at ${filename}:${path.node.loc?.start.line}`);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const configArg = args[0];
|
|
237
|
+
const depsArg = args[1];
|
|
238
|
+
const depsCode = code.slice(depsArg.start, depsArg.end);
|
|
239
|
+
// Get location for ID generation
|
|
240
|
+
const loc = path.node.loc;
|
|
241
|
+
const line = loc?.start.line ?? 0;
|
|
242
|
+
const column = loc?.start.column ?? 0;
|
|
243
|
+
// Helper to process a config object and register the assertion
|
|
244
|
+
const processConfigObject = (configObj) => {
|
|
245
|
+
const { titleNode, keyNode, withDataNode, serverFnNode, serverFnProp } = extractConfigProps(configObj);
|
|
246
|
+
if (!titleNode || !serverFnNode || !serverFnProp) {
|
|
247
|
+
console.warn(`[vite-plugin-scenetest] useAssert() config missing required properties at ${filename}:${line}`);
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
// Extract key value if present
|
|
251
|
+
let keyValue;
|
|
252
|
+
if (keyNode && t.isStringLiteral(keyNode)) {
|
|
253
|
+
keyValue = keyNode.value;
|
|
254
|
+
}
|
|
255
|
+
// Generate assertion ID
|
|
256
|
+
const id = keyValue
|
|
257
|
+
? `${filename}:${line}:${column}:${keyValue}`
|
|
258
|
+
: `${filename}:${line}:${column}`;
|
|
259
|
+
// Extract title value
|
|
260
|
+
let titleValue = 'assertion';
|
|
261
|
+
if (t.isStringLiteral(titleNode)) {
|
|
262
|
+
titleValue = titleNode.value;
|
|
263
|
+
}
|
|
264
|
+
// Extract serverFn body code
|
|
265
|
+
const serverFnBodyCode = extractServerFnBody(code, serverFnNode, filename, line);
|
|
266
|
+
if (!serverFnBodyCode) {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
// Store extracted assertion
|
|
270
|
+
extractedAssertions.push({
|
|
271
|
+
id,
|
|
272
|
+
title: titleValue,
|
|
273
|
+
key: keyValue,
|
|
274
|
+
serverFnBodyCode,
|
|
275
|
+
location: { file: filename, line, column },
|
|
276
|
+
});
|
|
277
|
+
// Replace serverFn property with __assertionId in the source
|
|
278
|
+
s.overwrite(serverFnProp.start, serverFnProp.end, `__assertionId: ${JSON.stringify(id)}`);
|
|
279
|
+
return { id, titleValue, keyValue };
|
|
280
|
+
};
|
|
281
|
+
// Handle different forms of the config argument:
|
|
282
|
+
// 1. Direct object: useAssert({ title, withData?, serverFn }, deps)
|
|
283
|
+
// 2. Conditional: useAssert(condition ? undefined : { ... }, deps)
|
|
284
|
+
// 3. Conditional: useAssert(condition ? { ... } : undefined, deps)
|
|
285
|
+
if (t.isObjectExpression(configArg)) {
|
|
286
|
+
// Direct object
|
|
287
|
+
const result = processConfigObject(configArg);
|
|
288
|
+
if (!result)
|
|
289
|
+
return;
|
|
290
|
+
// Replace useAssert with __useAssert
|
|
291
|
+
s.overwrite(callee.start, callee.end, '__useAssert');
|
|
292
|
+
needsUseAssertImport = true;
|
|
293
|
+
}
|
|
294
|
+
else if (t.isConditionalExpression(configArg)) {
|
|
295
|
+
// Conditional expression - find the object in consequent or alternate
|
|
296
|
+
const { consequent, alternate } = configArg;
|
|
297
|
+
let configObj = null;
|
|
298
|
+
if (t.isObjectExpression(consequent)) {
|
|
299
|
+
configObj = consequent;
|
|
300
|
+
}
|
|
301
|
+
else if (t.isObjectExpression(alternate)) {
|
|
302
|
+
configObj = alternate;
|
|
303
|
+
}
|
|
304
|
+
if (!configObj) {
|
|
305
|
+
// Both branches are non-objects (e.g., both could be identifiers)
|
|
306
|
+
// We can't statically analyze this, skip
|
|
307
|
+
console.warn(`[vite-plugin-scenetest] useAssert() conditional must have an object literal in one branch at ${filename}:${line}`);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const result = processConfigObject(configObj);
|
|
311
|
+
if (!result)
|
|
312
|
+
return;
|
|
313
|
+
// Replace useAssert with __useAssert
|
|
314
|
+
s.overwrite(callee.start, callee.end, '__useAssert');
|
|
315
|
+
needsUseAssertImport = true;
|
|
316
|
+
}
|
|
317
|
+
else if (t.isIdentifier(configArg) && configArg.name === 'undefined') {
|
|
318
|
+
// Just undefined - nothing to transform, but still rename the call
|
|
319
|
+
s.overwrite(callee.start, callee.end, '__useAssert');
|
|
320
|
+
needsUseAssertImport = true;
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
// Could be a variable reference or other expression
|
|
324
|
+
// We can't statically extract the serverFn, skip with warning
|
|
325
|
+
console.warn(`[vite-plugin-scenetest] useAssert() config must be an object literal or conditional at ${filename}:${line}`);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
// Fourth pass: transform createAssert() calls (Solid)
|
|
332
|
+
if (createAssertLocalName) {
|
|
333
|
+
traverse(ast, {
|
|
334
|
+
CallExpression(path) {
|
|
335
|
+
const callee = path.node.callee;
|
|
336
|
+
if (!t.isIdentifier(callee) || callee.name !== createAssertLocalName) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const args = path.node.arguments;
|
|
340
|
+
if (args.length < 2) {
|
|
341
|
+
console.warn(`[vite-plugin-scenetest] createAssert() requires (config, deps) at ${filename}:${path.node.loc?.start.line}`);
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
const configArg = args[0];
|
|
345
|
+
const loc = path.node.loc;
|
|
346
|
+
const line = loc?.start.line ?? 0;
|
|
347
|
+
const column = loc?.start.column ?? 0;
|
|
348
|
+
if (t.isObjectExpression(configArg)) {
|
|
349
|
+
const { titleNode, keyNode, withDataNode, serverFnNode, serverFnProp } = extractConfigProps(configArg);
|
|
350
|
+
if (!titleNode || !withDataNode || !serverFnNode || !serverFnProp) {
|
|
351
|
+
console.warn(`[vite-plugin-scenetest] createAssert() config missing required properties at ${filename}:${line}`);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
let keyValue;
|
|
355
|
+
if (keyNode && t.isStringLiteral(keyNode)) {
|
|
356
|
+
keyValue = keyNode.value;
|
|
357
|
+
}
|
|
358
|
+
const id = keyValue
|
|
359
|
+
? `${filename}:${line}:${column}:${keyValue}`
|
|
360
|
+
: `${filename}:${line}:${column}`;
|
|
361
|
+
let titleValue = 'assertion';
|
|
362
|
+
if (t.isStringLiteral(titleNode)) {
|
|
363
|
+
titleValue = titleNode.value;
|
|
364
|
+
}
|
|
365
|
+
const serverFnBodyCode = extractServerFnBody(code, serverFnNode, filename, line);
|
|
366
|
+
if (!serverFnBodyCode)
|
|
367
|
+
return;
|
|
368
|
+
extractedAssertions.push({
|
|
369
|
+
id,
|
|
370
|
+
title: titleValue,
|
|
371
|
+
key: keyValue,
|
|
372
|
+
serverFnBodyCode,
|
|
373
|
+
location: { file: filename, line, column },
|
|
374
|
+
});
|
|
375
|
+
s.overwrite(serverFnProp.start, serverFnProp.end, `__assertionId: ${JSON.stringify(id)}`);
|
|
376
|
+
s.overwrite(callee.start, callee.end, '__createAssert');
|
|
377
|
+
needsCreateAssertImport = true;
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
// Fifth pass: transform runAssert() calls (Svelte)
|
|
383
|
+
if (runAssertLocalName) {
|
|
384
|
+
traverse(ast, {
|
|
385
|
+
CallExpression(path) {
|
|
386
|
+
const callee = path.node.callee;
|
|
387
|
+
if (!t.isIdentifier(callee) || callee.name !== runAssertLocalName) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const args = path.node.arguments;
|
|
391
|
+
if (args.length < 1) {
|
|
392
|
+
console.warn(`[vite-plugin-scenetest] runAssert() requires (config) at ${filename}:${path.node.loc?.start.line}`);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const configArg = args[0];
|
|
396
|
+
const loc = path.node.loc;
|
|
397
|
+
const line = loc?.start.line ?? 0;
|
|
398
|
+
const column = loc?.start.column ?? 0;
|
|
399
|
+
if (t.isObjectExpression(configArg)) {
|
|
400
|
+
const { titleNode, keyNode, withDataNode, serverFnNode, serverFnProp } = extractConfigProps(configArg);
|
|
401
|
+
if (!titleNode || !withDataNode || !serverFnNode || !serverFnProp) {
|
|
402
|
+
console.warn(`[vite-plugin-scenetest] runAssert() config missing required properties at ${filename}:${line}`);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
let keyValue;
|
|
406
|
+
if (keyNode && t.isStringLiteral(keyNode)) {
|
|
407
|
+
keyValue = keyNode.value;
|
|
408
|
+
}
|
|
409
|
+
const id = keyValue
|
|
410
|
+
? `${filename}:${line}:${column}:${keyValue}`
|
|
411
|
+
: `${filename}:${line}:${column}`;
|
|
412
|
+
let titleValue = 'assertion';
|
|
413
|
+
if (t.isStringLiteral(titleNode)) {
|
|
414
|
+
titleValue = titleNode.value;
|
|
415
|
+
}
|
|
416
|
+
const serverFnBodyCode = extractServerFnBody(code, serverFnNode, filename, line);
|
|
417
|
+
if (!serverFnBodyCode)
|
|
418
|
+
return;
|
|
419
|
+
extractedAssertions.push({
|
|
420
|
+
id,
|
|
421
|
+
title: titleValue,
|
|
422
|
+
key: keyValue,
|
|
423
|
+
serverFnBodyCode,
|
|
424
|
+
location: { file: filename, line, column },
|
|
425
|
+
});
|
|
426
|
+
s.overwrite(serverFnProp.start, serverFnProp.end, `__assertionId: ${JSON.stringify(id)}`);
|
|
427
|
+
s.overwrite(callee.start, callee.end, '__runAssert');
|
|
428
|
+
needsRunAssertImport = true;
|
|
429
|
+
}
|
|
430
|
+
},
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
if (!needsRpcImport && !needsUseAssertImport && !needsCreateAssertImport && !needsRunAssertImport) {
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
// Add imports at the top of the file
|
|
437
|
+
// Find the position after existing imports
|
|
438
|
+
let importInsertPos = 0;
|
|
439
|
+
for (const node of ast.program.body) {
|
|
440
|
+
if (t.isImportDeclaration(node)) {
|
|
441
|
+
importInsertPos = node.end + 1;
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
break;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
if (needsRpcImport) {
|
|
448
|
+
const rpcImport = `\nimport { __scenetest_rpc } from '@scenetest/core/runtime'\n`;
|
|
449
|
+
s.appendLeft(importInsertPos, rpcImport);
|
|
450
|
+
}
|
|
451
|
+
if (needsUseAssertImport) {
|
|
452
|
+
// Import from the same package where useAssert was imported from
|
|
453
|
+
const sourcePackage = useAssertSourcePackage || '@scenetest/react';
|
|
454
|
+
const hookImport = `\nimport { __useAssert } from '${sourcePackage}'\n`;
|
|
455
|
+
s.appendLeft(importInsertPos, hookImport);
|
|
456
|
+
}
|
|
457
|
+
if (needsCreateAssertImport) {
|
|
458
|
+
const solidImport = `\nimport { __createAssert } from '@scenetest/solid'\n`;
|
|
459
|
+
s.appendLeft(importInsertPos, solidImport);
|
|
460
|
+
}
|
|
461
|
+
if (needsRunAssertImport) {
|
|
462
|
+
const svelteImport = `\nimport { __runAssert } from '@scenetest/svelte'\n`;
|
|
463
|
+
s.appendLeft(importInsertPos, svelteImport);
|
|
464
|
+
}
|
|
465
|
+
return {
|
|
466
|
+
code: s.toString(),
|
|
467
|
+
map: sourceMap
|
|
468
|
+
? s.generateMap({
|
|
469
|
+
source: filename,
|
|
470
|
+
file: filename,
|
|
471
|
+
includeContent: true,
|
|
472
|
+
})
|
|
473
|
+
: null,
|
|
474
|
+
extractedAssertions,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ExtractedAssertion } from './transform.js';
|
|
2
|
+
/**
|
|
3
|
+
* Virtual module ID for scenetest assertions
|
|
4
|
+
*/
|
|
5
|
+
export declare const VIRTUAL_MODULE_ID = "virtual:scenetest-assertions";
|
|
6
|
+
export declare const RESOLVED_VIRTUAL_MODULE_ID: string;
|
|
7
|
+
/**
|
|
8
|
+
* Register extracted assertions from a file transform
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerAssertions(assertions: ExtractedAssertion[]): void;
|
|
11
|
+
/**
|
|
12
|
+
* Get an assertion by ID
|
|
13
|
+
*/
|
|
14
|
+
export declare function getAssertion(id: string): ExtractedAssertion | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Get all registered assertions
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAllAssertions(): ExtractedAssertion[];
|
|
19
|
+
/**
|
|
20
|
+
* Clear all registered assertions (called on buildStart)
|
|
21
|
+
*/
|
|
22
|
+
export declare function clearRegistry(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Remove assertions from a specific file (for HMR)
|
|
25
|
+
*/
|
|
26
|
+
export declare function removeAssertionsForFile(filename: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* Generate the virtual module code.
|
|
29
|
+
* This module exports a map of assertion IDs to their serverFn functions.
|
|
30
|
+
*
|
|
31
|
+
* Each serverFn receives (server, data, { pass, fail }) where pass/fail
|
|
32
|
+
* are destructured in the function parameters, making them available in scope
|
|
33
|
+
* for the inlined body code.
|
|
34
|
+
*/
|
|
35
|
+
export declare function generateVirtualModuleCode(): string;
|
|
36
|
+
//# sourceMappingURL=virtual-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-module.d.ts","sourceRoot":"","sources":["../src/virtual-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAExD;;GAEG;AACH,eAAO,MAAM,iBAAiB,iCAAiC,CAAA;AAC/D,eAAO,MAAM,0BAA0B,QAA2B,CAAA;AAOlE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAIzE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,kBAAkB,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAM9D;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAqBlD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual module ID for scenetest assertions
|
|
3
|
+
*/
|
|
4
|
+
export const VIRTUAL_MODULE_ID = 'virtual:scenetest-assertions';
|
|
5
|
+
export const RESOLVED_VIRTUAL_MODULE_ID = '\0' + VIRTUAL_MODULE_ID;
|
|
6
|
+
/**
|
|
7
|
+
* Registry of extracted assertions from all transformed files
|
|
8
|
+
*/
|
|
9
|
+
const assertionRegistry = new Map();
|
|
10
|
+
/**
|
|
11
|
+
* Register extracted assertions from a file transform
|
|
12
|
+
*/
|
|
13
|
+
export function registerAssertions(assertions) {
|
|
14
|
+
for (const assertion of assertions) {
|
|
15
|
+
assertionRegistry.set(assertion.id, assertion);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get an assertion by ID
|
|
20
|
+
*/
|
|
21
|
+
export function getAssertion(id) {
|
|
22
|
+
return assertionRegistry.get(id);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get all registered assertions
|
|
26
|
+
*/
|
|
27
|
+
export function getAllAssertions() {
|
|
28
|
+
return Array.from(assertionRegistry.values());
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Clear all registered assertions (called on buildStart)
|
|
32
|
+
*/
|
|
33
|
+
export function clearRegistry() {
|
|
34
|
+
assertionRegistry.clear();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Remove assertions from a specific file (for HMR)
|
|
38
|
+
*/
|
|
39
|
+
export function removeAssertionsForFile(filename) {
|
|
40
|
+
for (const [id, assertion] of assertionRegistry) {
|
|
41
|
+
if (assertion.location.file === filename) {
|
|
42
|
+
assertionRegistry.delete(id);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate the virtual module code.
|
|
48
|
+
* This module exports a map of assertion IDs to their serverFn functions.
|
|
49
|
+
*
|
|
50
|
+
* Each serverFn receives (server, data, { pass, fail }) where pass/fail
|
|
51
|
+
* are destructured in the function parameters, making them available in scope
|
|
52
|
+
* for the inlined body code.
|
|
53
|
+
*/
|
|
54
|
+
export function generateVirtualModuleCode() {
|
|
55
|
+
const assertions = getAllAssertions();
|
|
56
|
+
if (assertions.length === 0) {
|
|
57
|
+
return `export const assertions = {}`;
|
|
58
|
+
}
|
|
59
|
+
// Generate an object with all serverFn functions
|
|
60
|
+
// The original serverFn body is inlined into a wrapper function that
|
|
61
|
+
// provides pass/fail in scope via parameter destructuring
|
|
62
|
+
const entries = assertions.map((assertion) => {
|
|
63
|
+
return ` ${JSON.stringify(assertion.id)}: (server, data, { pass, fail }) => {
|
|
64
|
+
${assertion.serverFnBodyCode}
|
|
65
|
+
}`;
|
|
66
|
+
});
|
|
67
|
+
const code = `export const assertions = {
|
|
68
|
+
${entries.join(',\n')}
|
|
69
|
+
}`;
|
|
70
|
+
return code;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=virtual-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-module.js","sourceRoot":"","sources":["../src/virtual-module.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,8BAA8B,CAAA;AAC/D,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,iBAAiB,CAAA;AAElE;;GAEG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA8B,CAAA;AAE/D;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAgC;IACjE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;IAChD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAA;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,iBAAiB,CAAC,KAAK,EAAE,CAAA;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,iBAAiB,EAAE,CAAC;QAChD,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB;IACvC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAA;IAErC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,8BAA8B,CAAA;IACvC,CAAC;IAED,iDAAiD;IACjD,qEAAqE;IACrE,0DAA0D;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QAC3C,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;MACtC,SAAS,CAAC,gBAAgB;IAC5B,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG;EACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;EACnB,CAAA;IAEA,OAAO,IAAI,CAAA;AACb,CAAC"}
|