@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.
@@ -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"}