@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 @@
1
+ {"version":3,"file":"strip.d.ts","sourceRoot":"","sources":["../src/strip.ts"],"names":[],"mappings":"AAGA,OAAO,WAAW,MAAM,cAAc,CAAA;AAKtC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAA;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAkBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,GAAG,IAAI,CA6K3F"}
package/dist/strip.js ADDED
@@ -0,0 +1,195 @@
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
+ // All scenetest packages that should be stripped
8
+ const SCENETEST_PACKAGES = [
9
+ '@scenetest/core',
10
+ '@scenetest/react',
11
+ '@scenetest/vue',
12
+ '@scenetest/solid',
13
+ '@scenetest/svelte',
14
+ ];
15
+ /**
16
+ * Check if a module source is a scenetest package
17
+ */
18
+ function isScenetestPackage(source) {
19
+ return SCENETEST_PACKAGES.includes(source);
20
+ }
21
+ /**
22
+ * Strip all scenetest imports and function calls from source code.
23
+ *
24
+ * This function:
25
+ * 1. Parses the code with Babel (handles JS, TS, JSX)
26
+ * 2. Finds and tracks all imports from scenetest packages
27
+ * 3. Removes those import statements
28
+ * 4. Removes all calls to the imported functions
29
+ *
30
+ * @param code Source code to transform
31
+ * @param options Transform options
32
+ * @returns Transformed code and optional source map
33
+ */
34
+ export function stripScenetest(code, options = {}) {
35
+ const { sourceMap = true, filename = 'unknown.js' } = options;
36
+ // Quick check - if no scenetest import, skip parsing
37
+ if (!code.includes('scenetest')) {
38
+ return null; // This catches all scenetest-* packages too
39
+ }
40
+ // Track imported names from scenetest
41
+ // Map from local name → imported name (handles aliases)
42
+ const scenetestImports = new Map();
43
+ // Parse with Babel
44
+ const parserOptions = {
45
+ sourceType: 'module',
46
+ plugins: [
47
+ 'jsx',
48
+ 'typescript',
49
+ // Support modern syntax
50
+ 'decorators',
51
+ 'classProperties',
52
+ 'classPrivateProperties',
53
+ 'classPrivateMethods',
54
+ 'dynamicImport',
55
+ 'nullishCoalescingOperator',
56
+ 'optionalChaining',
57
+ ],
58
+ };
59
+ let ast;
60
+ try {
61
+ ast = parse(code, parserOptions);
62
+ }
63
+ catch (e) {
64
+ // If parsing fails, return null (don't transform)
65
+ console.warn(`[vite-plugin-scenetest] Failed to parse ${filename}:`, e);
66
+ return null;
67
+ }
68
+ const s = new MagicString(code);
69
+ let hasChanges = false;
70
+ // Ranges to remove (we collect them first, then remove to avoid index shifting issues)
71
+ const rangesToRemove = [];
72
+ traverse(ast, {
73
+ // Collect scenetest package imports and mark for removal
74
+ ImportDeclaration(path) {
75
+ const source = path.node.source.value;
76
+ if (!isScenetestPackage(source)) {
77
+ return;
78
+ }
79
+ // Track all imported names
80
+ for (const specifier of path.node.specifiers) {
81
+ if (t.isImportSpecifier(specifier)) {
82
+ const imported = t.isIdentifier(specifier.imported)
83
+ ? specifier.imported.name
84
+ : specifier.imported.value;
85
+ const local = specifier.local.name;
86
+ scenetestImports.set(local, imported);
87
+ }
88
+ else if (t.isImportDefaultSpecifier(specifier)) {
89
+ // import scenetest from 'scenetest' - unlikely but handle it
90
+ scenetestImports.set(specifier.local.name, 'default');
91
+ }
92
+ else if (t.isImportNamespaceSpecifier(specifier)) {
93
+ // import * as scenetest from 'scenetest' - track namespace
94
+ scenetestImports.set(specifier.local.name, '*');
95
+ }
96
+ }
97
+ // Mark entire import for removal
98
+ const start = path.node.start;
99
+ const end = path.node.end;
100
+ rangesToRemove.push({ start, end, type: 'import' });
101
+ hasChanges = true;
102
+ },
103
+ // Remove function calls to imported scenetest functions
104
+ CallExpression(path) {
105
+ const callee = path.node.callee;
106
+ let isScenetestCall = false;
107
+ // Functions to strip (from all framework packages)
108
+ const strippableFunctions = [
109
+ 'should',
110
+ 'failed',
111
+ 'assert',
112
+ 'match',
113
+ 'useAssert', // React, Vue
114
+ 'createAssert', // Solid
115
+ 'runAssert', // Svelte
116
+ ];
117
+ // Direct call: should(...), failed(...), assert(...), useAssert(...)
118
+ if (t.isIdentifier(callee)) {
119
+ if (scenetestImports.has(callee.name)) {
120
+ const imported = scenetestImports.get(callee.name);
121
+ if (imported && strippableFunctions.includes(imported)) {
122
+ isScenetestCall = true;
123
+ }
124
+ }
125
+ }
126
+ // Member call: scenetest.should(...) (namespace import)
127
+ else if (t.isMemberExpression(callee) && t.isIdentifier(callee.object)) {
128
+ const objectName = callee.object.name;
129
+ if (scenetestImports.get(objectName) === '*') {
130
+ if (t.isIdentifier(callee.property)) {
131
+ const propName = callee.property.name;
132
+ if (strippableFunctions.includes(propName)) {
133
+ isScenetestCall = true;
134
+ }
135
+ }
136
+ }
137
+ }
138
+ if (!isScenetestCall) {
139
+ return;
140
+ }
141
+ // Check if this call is an ExpressionStatement (standalone call)
142
+ const parent = path.parentPath;
143
+ if (parent && t.isExpressionStatement(parent.node)) {
144
+ // Remove the entire statement
145
+ const start = parent.node.start;
146
+ const end = parent.node.end;
147
+ rangesToRemove.push({ start, end, type: 'statement' });
148
+ hasChanges = true;
149
+ }
150
+ else {
151
+ // Call is in an expression context - replace with void 0
152
+ // This is unusual for should/failed since they return void, but handle defensively
153
+ const start = path.node.start;
154
+ const end = path.node.end;
155
+ rangesToRemove.push({ start, end, type: 'expression' });
156
+ hasChanges = true;
157
+ }
158
+ },
159
+ });
160
+ if (!hasChanges) {
161
+ return null;
162
+ }
163
+ // Sort ranges by start position (descending) to process from end to start
164
+ // This prevents index shifting issues
165
+ rangesToRemove.sort((a, b) => b.start - a.start);
166
+ for (const range of rangesToRemove) {
167
+ if (range.type === 'expression') {
168
+ // Replace with void 0 to maintain expression validity
169
+ s.overwrite(range.start, range.end, 'void 0');
170
+ }
171
+ else {
172
+ // For imports and statements, remove entirely
173
+ // Also try to remove trailing newline for cleaner output
174
+ let end = range.end;
175
+ if (code[end] === '\n') {
176
+ end++;
177
+ }
178
+ else if (code[end] === '\r' && code[end + 1] === '\n') {
179
+ end += 2;
180
+ }
181
+ s.remove(range.start, end);
182
+ }
183
+ }
184
+ return {
185
+ code: s.toString(),
186
+ map: sourceMap
187
+ ? s.generateMap({
188
+ source: filename,
189
+ file: filename,
190
+ includeContent: true,
191
+ })
192
+ : null,
193
+ };
194
+ }
195
+ //# sourceMappingURL=strip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strip.js","sourceRoot":"","sources":["../src/strip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import MagicString from 'magic-string';
2
+ /**
3
+ * Extracted assertion from an assert() or useAssert() call
4
+ */
5
+ export interface ExtractedAssertion {
6
+ /** Unique identifier (filename:line:col:key?) */
7
+ id: string;
8
+ /** Human-readable title from the config */
9
+ title: string;
10
+ /** Optional key for disambiguation */
11
+ key?: string;
12
+ /** The serverFn body code (without function wrapper) */
13
+ serverFnBodyCode: string;
14
+ /** Source location */
15
+ location: {
16
+ file: string;
17
+ line: number;
18
+ column: number;
19
+ };
20
+ }
21
+ export interface TransformResult {
22
+ /** Transformed code */
23
+ code: string;
24
+ /** Source map */
25
+ map: ReturnType<MagicString['generateMap']> | null;
26
+ /** Extracted assertions */
27
+ extractedAssertions: ExtractedAssertion[];
28
+ }
29
+ export interface TransformOptions {
30
+ /** Generate source map (default: true) */
31
+ sourceMap?: boolean;
32
+ /** File path for source map and assertion IDs */
33
+ filename?: string;
34
+ }
35
+ /**
36
+ * Transform assert() and useAssert() calls in source code.
37
+ *
38
+ * For assert() calls:
39
+ * 1. Extract the serverFn to be run on the server
40
+ * 2. Replace the call with __scenetest_rpc({ id, title, key?, withData })
41
+ *
42
+ * For useAssert() calls:
43
+ * 1. Extract the serverFn from the config object
44
+ * 2. Replace serverFn property with __assertionId
45
+ * 3. Replace useAssert with __useAssert
46
+ *
47
+ * @param code Source code to transform
48
+ * @param options Transform options
49
+ * @returns Transformed code, source map, and extracted assertions
50
+ */
51
+ export declare function transformAssertions(code: string, options?: TransformOptions): TransformResult | null;
52
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAGA,OAAO,WAAW,MAAM,cAAc,CAAA;AAKtC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAA;IACV,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,CAAA;IACxB,sBAAsB;IACtB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,iBAAiB;IACjB,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAA;IAClD,2BAA2B;IAC3B,mBAAmB,EAAE,kBAAkB,EAAE,CAAA;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAyDD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,eAAe,GAAG,IAAI,CAudxG"}