@tayo-dev/rtl 1.2.0 → 1.3.0-alpha.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.
Files changed (37) hide show
  1. package/README.md +27 -32
  2. package/assets/claude/commands/@tayo-dev/rtl/generate.md +2 -2
  3. package/assets/codex/@tayo-dev/rtl-generate/SKILL.md +1 -1
  4. package/assets/gemini/commands/@tayo-dev/rtl/generate.toml +2 -2
  5. package/assets/opencode/commands/@tayo-dev/rtl-generate.md +2 -2
  6. package/dist/cli/commands/generate.d.ts +1 -1
  7. package/dist/cli/commands/generate.d.ts.map +1 -1
  8. package/dist/cli/commands/generate.js +88 -149
  9. package/dist/cli/commands/generate.js.map +1 -1
  10. package/dist/core/baseline-normalizer.d.ts +3 -0
  11. package/dist/core/baseline-normalizer.d.ts.map +1 -0
  12. package/dist/core/baseline-normalizer.js +65 -0
  13. package/dist/core/baseline-normalizer.js.map +1 -0
  14. package/dist/core/generator.d.ts.map +1 -1
  15. package/dist/core/generator.js +15 -0
  16. package/dist/core/generator.js.map +1 -1
  17. package/dist/core/input-loader.d.ts +4 -0
  18. package/dist/core/input-loader.d.ts.map +1 -0
  19. package/dist/core/input-loader.js +78 -0
  20. package/dist/core/input-loader.js.map +1 -0
  21. package/dist/core/js-parser.d.ts +6 -2
  22. package/dist/core/js-parser.d.ts.map +1 -1
  23. package/dist/core/js-parser.js +329 -72
  24. package/dist/core/js-parser.js.map +1 -1
  25. package/dist/core/parser.d.ts.map +1 -1
  26. package/dist/core/parser.js +11 -1
  27. package/dist/core/parser.js.map +1 -1
  28. package/dist/core/recording-intelligence.d.ts.map +1 -1
  29. package/dist/core/recording-intelligence.js +31 -5
  30. package/dist/core/recording-intelligence.js.map +1 -1
  31. package/dist/index.js +2 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/types/recording.d.ts +50 -2
  34. package/dist/types/recording.d.ts.map +1 -1
  35. package/dist/types/recording.js +3 -1
  36. package/dist/types/recording.js.map +1 -1
  37. package/package.json +12 -2
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAkB,WAAW,EAAE,OAAO,EAAgB,MAAM,uBAAuB,CAAA;AACpH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAShE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAmGD,wBAAgB,YAAY,CAC1B,SAAS,EAAE,mBAAmB,EAC9B,OAAO,GAAE,gBAAqB,GAC7B,aAAa,CAkBf;AAID,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI,CAgClE;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;CAC7B;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,GAAE,yBAA8B,GACtC,eAAe,CA4CjB"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAkB,WAAW,EAAE,OAAO,EAAgB,MAAM,uBAAuB,CAAA;AACpH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAShE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAuHD,wBAAgB,YAAY,CAC1B,SAAS,EAAE,mBAAmB,EAC9B,OAAO,GAAE,gBAAqB,GAC7B,aAAa,CAkBf;AAID,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI,CAgClE;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;CAC7B;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,GAAE,yBAA8B,GACtC,eAAe,CA4CjB"}
@@ -63,11 +63,26 @@ function looksLikeCssSelector(target) {
63
63
  /^[a-z][a-z0-9-]*(?:[.#[:\s>])/i.test(target) ||
64
64
  /^(button|input|select|textarea|a|img|h[1-6])$/i.test(target));
65
65
  }
66
+ function getRecoveredQuery(step) {
67
+ const query = step.metadata?.query;
68
+ if (query &&
69
+ typeof query === 'object' &&
70
+ 'raw' in query &&
71
+ typeof query.raw === 'string' &&
72
+ query.raw.length > 0) {
73
+ return query.raw;
74
+ }
75
+ return undefined;
76
+ }
66
77
  function reconstructQuery(step) {
67
78
  const target = step.target;
68
79
  if (!target) {
69
80
  return 'document.body';
70
81
  }
82
+ const recoveredQuery = getRecoveredQuery(step);
83
+ if (recoveredQuery) {
84
+ return recoveredQuery;
85
+ }
71
86
  if (isQueryExpression(target)) {
72
87
  return target;
73
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type ParsedInput, type RecordingSource } from '../types/recording.js';
2
+ export declare function detectInputSource(filePath: string, rawContent: string): RecordingSource;
3
+ export declare function loadInput(filePath: string): Promise<ParsedInput>;
4
+ //# sourceMappingURL=input-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-loader.d.ts","sourceRoot":"","sources":["../../src/core/input-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAA;AAoB9B,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,CAoBvF;AA2BD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoBtE"}
@@ -0,0 +1,78 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { extname } from 'node:path';
3
+ import { parseJsRecording } from './js-parser.js';
4
+ import { parseRecording } from './parser.js';
5
+ import { createStepId, } from '../types/recording.js';
6
+ const JSON_EXTENSIONS = new Set(['.json']);
7
+ const JS_EXTENSIONS = new Set(['.js', '.jsx', '.mjs', '.cjs', '.ts', '.tsx']);
8
+ function looksLikeJson(rawContent) {
9
+ const trimmed = rawContent.trimStart();
10
+ return trimmed.startsWith('{') || trimmed.startsWith('[');
11
+ }
12
+ function looksLikeRecorderJs(rawContent) {
13
+ return [
14
+ '@jest-environment-options',
15
+ 'userEvent.',
16
+ 'screen.getBy',
17
+ 'document.querySelector',
18
+ 'page.goto(',
19
+ ].some((snippet) => rawContent.includes(snippet));
20
+ }
21
+ export function detectInputSource(filePath, rawContent) {
22
+ const extension = extname(filePath).toLowerCase();
23
+ if (JSON_EXTENSIONS.has(extension)) {
24
+ return 'json';
25
+ }
26
+ if (JS_EXTENSIONS.has(extension)) {
27
+ return 'js';
28
+ }
29
+ if (looksLikeJson(rawContent)) {
30
+ return 'json';
31
+ }
32
+ if (looksLikeRecorderJs(rawContent)) {
33
+ return 'js';
34
+ }
35
+ throw new Error(`Unsupported recording input: ${filePath}`);
36
+ }
37
+ function attachStepIds(source, steps) {
38
+ return steps.map((step, index) => ({
39
+ ...step,
40
+ id: step.id ?? createStepId(source, index),
41
+ source,
42
+ }));
43
+ }
44
+ function toJsRecording(jsResult) {
45
+ const steps = attachStepIds('js', jsResult.steps);
46
+ return {
47
+ title: jsResult.title,
48
+ steps,
49
+ rawStepCount: steps.length,
50
+ url: jsResult.environmentUrl,
51
+ baseline: {
52
+ environmentUrl: jsResult.environmentUrl,
53
+ queries: jsResult.queries,
54
+ selectors: jsResult.selectors,
55
+ assertions: jsResult.assertions,
56
+ itGroups: jsResult.itGroups,
57
+ },
58
+ };
59
+ }
60
+ export async function loadInput(filePath) {
61
+ const rawContent = await readFile(filePath, 'utf-8');
62
+ const source = detectInputSource(filePath, rawContent);
63
+ if (source === 'json') {
64
+ const recording = await parseRecording(filePath);
65
+ return {
66
+ source,
67
+ recording,
68
+ };
69
+ }
70
+ const jsResult = await parseJsRecording(rawContent);
71
+ const recording = toJsRecording(jsResult);
72
+ return {
73
+ source,
74
+ recording,
75
+ baseline: recording.baseline,
76
+ };
77
+ }
78
+ //# sourceMappingURL=input-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-loader.js","sourceRoot":"","sources":["../../src/core/input-loader.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Babel AST-based parser for Testing Library Recorder JS output.
3
- * Parses the JavaScript recording format and produces structured NormalizedRecording.
3
+ * Parses the JavaScript recording format and produces truthful baseline metadata.
4
4
  */
5
- import type { NormalizedStep, QueryQuality, ItGroup } from '../types/recording.js';
5
+ import { type AssertionDescriptor, type ItGroup, type NormalizedStep, type QueryDescriptor, type QueryQuality, type SelectorDescriptor } from '../types/recording.js';
6
6
  /**
7
7
  * Classifies a Testing Library query method by quality tier.
8
8
  * @param method - The RTL query method name (e.g., 'getByRole', 'getByText')
@@ -28,6 +28,7 @@ export declare function segmentIntoItGroups(steps: NormalizedStep[]): ItGroup[];
28
28
  export interface QuerySelectorCall {
29
29
  selector: string;
30
30
  line: number;
31
+ stepId?: string;
31
32
  }
32
33
  /**
33
34
  * Result of parsing a JS recording
@@ -36,6 +37,9 @@ export interface JsParseResult {
36
37
  title: string;
37
38
  environmentUrl: string | undefined;
38
39
  steps: NormalizedStep[];
40
+ queries: QueryDescriptor[];
41
+ selectors: SelectorDescriptor[];
42
+ assertions: AssertionDescriptor[];
39
43
  querySelectorCalls: QuerySelectorCall[];
40
44
  itGroups: ItGroup[];
41
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"js-parser.d.ts","sourceRoot":"","sources":["../../src/core/js-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAoB,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAmBpG;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAetE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,CAuDtE;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IACvC,QAAQ,EAAE,OAAO,EAAE,CAAA;CACpB;AAiCD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiI3E"}
1
+ {"version":3,"file":"js-parser.d.ts","sourceRoot":"","sources":["../../src/core/js-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,OAAO,EAEZ,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAA;AA+B9B;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAetE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,CAuDtE;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,SAAS,EAAE,kBAAkB,EAAE,CAAA;IAC/B,UAAU,EAAE,mBAAmB,EAAE,CAAA;IACjC,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IACvC,QAAQ,EAAE,OAAO,EAAE,CAAA;CACpB;AAwSD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgM3E"}
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * Babel AST-based parser for Testing Library Recorder JS output.
3
- * Parses the JavaScript recording format and produces structured NormalizedRecording.
3
+ * Parses the JavaScript recording format and produces truthful baseline metadata.
4
4
  */
5
5
  import * as babelParser from '@babel/parser';
6
6
  import _traverse from '@babel/traverse';
7
+ import * as t from '@babel/types';
8
+ import { createStepId, } from '../types/recording.js';
7
9
  // ESM interop for @babel/traverse
8
10
  const traverse = _traverse.default ?? _traverse;
9
11
  /**
@@ -100,19 +102,211 @@ export function segmentIntoItGroups(steps) {
100
102
  return groups;
101
103
  }
102
104
  /**
103
- * Extracts a string argument from a Babel AST node
105
+ * Extracts a string-like value from a Babel AST node
104
106
  */
105
- function extractStringArg(node) {
107
+ function extractLiteralValue(node) {
106
108
  if (!node)
107
109
  return undefined;
108
- if (node.type === 'StringLiteral') {
110
+ if (t.isStringLiteral(node)) {
109
111
  return node.value;
110
112
  }
111
- if (node.type === 'TemplateLiteral' && node.quasis.length > 0) {
112
- return node.quasis[0].value.cooked;
113
+ if (t.isNumericLiteral(node) || t.isBooleanLiteral(node)) {
114
+ return String(node.value);
115
+ }
116
+ if (t.isTemplateLiteral(node) && node.expressions.length === 0) {
117
+ return node.quasis[0]?.value.cooked ?? undefined;
113
118
  }
114
119
  return undefined;
115
120
  }
121
+ function sliceSource(code, node) {
122
+ if (!node || typeof node.start !== 'number' || typeof node.end !== 'number') {
123
+ return undefined;
124
+ }
125
+ return code.slice(node.start, node.end);
126
+ }
127
+ function extractPlainObject(node) {
128
+ if (!t.isObjectExpression(node)) {
129
+ return undefined;
130
+ }
131
+ const entries = node.properties.flatMap((property) => {
132
+ if (!t.isObjectProperty(property) || property.computed) {
133
+ return [];
134
+ }
135
+ const key = t.isIdentifier(property.key)
136
+ ? property.key.name
137
+ : t.isStringLiteral(property.key)
138
+ ? property.key.value
139
+ : undefined;
140
+ const value = extractLiteralValue(property.value);
141
+ if (!key || value === undefined) {
142
+ return [];
143
+ }
144
+ return [[key, value]];
145
+ });
146
+ return Object.fromEntries(entries);
147
+ }
148
+ function memberExpressionToSubject(node) {
149
+ if (!node) {
150
+ return undefined;
151
+ }
152
+ if (t.isIdentifier(node)) {
153
+ return node.name;
154
+ }
155
+ if (t.isThisExpression(node)) {
156
+ return 'this';
157
+ }
158
+ if (t.isMemberExpression(node) && !node.computed) {
159
+ const object = memberExpressionToSubject(node.object);
160
+ const property = t.isIdentifier(node.property) ? node.property.name : undefined;
161
+ if (object && property) {
162
+ return `${object}.${property}`;
163
+ }
164
+ }
165
+ return undefined;
166
+ }
167
+ function getLine(node) {
168
+ return node?.loc?.start?.line ?? 0;
169
+ }
170
+ function isUserEventCall(node) {
171
+ return (t.isMemberExpression(node.callee) &&
172
+ t.isIdentifier(node.callee.object, { name: 'userEvent' }) &&
173
+ t.isIdentifier(node.callee.property));
174
+ }
175
+ function isPageGotoCall(node) {
176
+ return (t.isMemberExpression(node.callee) &&
177
+ t.isIdentifier(node.callee.object, { name: 'page' }) &&
178
+ t.isIdentifier(node.callee.property, { name: 'goto' }));
179
+ }
180
+ function isScreenQueryCall(node) {
181
+ return (t.isMemberExpression(node.callee) &&
182
+ t.isIdentifier(node.callee.property) &&
183
+ node.callee.property.name.startsWith('getBy') &&
184
+ ((t.isIdentifier(node.callee.object, { name: 'screen' }) ||
185
+ (t.isCallExpression(node.callee.object) &&
186
+ t.isIdentifier(node.callee.object.callee, { name: 'within' }))) ||
187
+ t.isIdentifier(node.callee.object, { name: 'document' })));
188
+ }
189
+ function isSelectorCall(node) {
190
+ return (t.isMemberExpression(node.callee) &&
191
+ t.isIdentifier(node.callee.object, { name: 'document' }) &&
192
+ t.isIdentifier(node.callee.property) &&
193
+ ['querySelector', 'querySelectorAll'].includes(node.callee.property.name));
194
+ }
195
+ function isExpectationCall(node) {
196
+ return (t.isMemberExpression(node.callee) &&
197
+ t.isIdentifier(node.callee.property) &&
198
+ t.isCallExpression(node.callee.object) &&
199
+ t.isIdentifier(node.callee.object.callee, { name: 'expect' }));
200
+ }
201
+ function isRecorderTitleCall(node) {
202
+ return t.isIdentifier(node.callee) && ['test', 'it'].includes(node.callee.name);
203
+ }
204
+ function isStandaloneExpression(path) {
205
+ return (path.parentPath.isExpressionStatement() ||
206
+ (path.parentPath.isAwaitExpression() && path.parentPath.parentPath?.isExpressionStatement()));
207
+ }
208
+ function mapAssertionKind(subject) {
209
+ if (subject === 'location.href') {
210
+ return 'location';
211
+ }
212
+ if (subject === 'document.title') {
213
+ return 'document-title';
214
+ }
215
+ return 'custom';
216
+ }
217
+ function fallbackDocCommentTitle(code) {
218
+ const titleMatch = code.match(/\/\*\*\s*\n\s*\*\s*([^@\*]+)/);
219
+ const title = titleMatch?.[1]?.trim();
220
+ return title ? title.replace(/\s+at\s+\d{1,2}:\d{2}:\d{2}/, '').replace(/-/g, ' ') : undefined;
221
+ }
222
+ function extractQueryDescriptor(code, node, stepId) {
223
+ if (!isScreenQueryCall(node) || !t.isMemberExpression(node.callee) || !t.isIdentifier(node.callee.property)) {
224
+ return undefined;
225
+ }
226
+ const method = node.callee.property.name;
227
+ const queryRoot = t.isIdentifier(node.callee.object, { name: 'screen' })
228
+ ? 'screen'
229
+ : t.isCallExpression(node.callee.object) &&
230
+ t.isIdentifier(node.callee.object.callee, { name: 'within' })
231
+ ? 'within'
232
+ : 'document';
233
+ const primaryTarget = extractLiteralValue(node.arguments[0]);
234
+ const options = extractPlainObject(node.arguments[1]);
235
+ const name = typeof options?.name === 'string' ? options.name : undefined;
236
+ const role = method === 'getByRole' ? primaryTarget : undefined;
237
+ return {
238
+ stepId,
239
+ method,
240
+ queryRoot,
241
+ line: getLine(node),
242
+ target: name ?? primaryTarget,
243
+ quality: classifyQuery(method),
244
+ raw: sliceSource(code, node),
245
+ options,
246
+ role,
247
+ name,
248
+ };
249
+ }
250
+ function extractSelectorDescriptor(code, node, stepId) {
251
+ if (!isSelectorCall(node) || !t.isMemberExpression(node.callee) || !t.isIdentifier(node.callee.property)) {
252
+ return undefined;
253
+ }
254
+ const selector = extractLiteralValue(node.arguments[0]);
255
+ if (!selector) {
256
+ return undefined;
257
+ }
258
+ return {
259
+ stepId,
260
+ selector,
261
+ selectorKind: `document.${node.callee.property.name}`,
262
+ line: getLine(node),
263
+ raw: sliceSource(code, node),
264
+ };
265
+ }
266
+ function resolveTarget(code, node, stepId) {
267
+ if (!node || !t.isExpression(node)) {
268
+ return {};
269
+ }
270
+ if (t.isCallExpression(node)) {
271
+ const query = extractQueryDescriptor(code, node, stepId);
272
+ if (query) {
273
+ return {
274
+ query,
275
+ target: query.target ?? query.role ?? query.method,
276
+ metadata: {
277
+ query: {
278
+ method: query.method,
279
+ queryRoot: query.queryRoot,
280
+ target: query.target,
281
+ role: query.role,
282
+ name: query.name,
283
+ options: query.options,
284
+ raw: query.raw,
285
+ },
286
+ },
287
+ };
288
+ }
289
+ const selector = extractSelectorDescriptor(code, node, stepId);
290
+ if (selector) {
291
+ return {
292
+ selector,
293
+ target: selector.selector,
294
+ metadata: {
295
+ selector,
296
+ },
297
+ };
298
+ }
299
+ }
300
+ const literalValue = extractLiteralValue(node);
301
+ if (literalValue !== undefined) {
302
+ return { target: literalValue };
303
+ }
304
+ const subject = memberExpressionToSubject(node);
305
+ if (subject) {
306
+ return { target: subject };
307
+ }
308
+ return {};
309
+ }
116
310
  /**
117
311
  * Maps userEvent method calls to NormalizedAction
118
312
  */
@@ -139,104 +333,167 @@ export async function parseJsRecording(code) {
139
333
  if (trimmed.startsWith('{')) {
140
334
  throw new Error('Expected JS file from Testing Library Recorder extension. Got JSON — use the Chrome Recorder JSON parser instead.');
141
335
  }
142
- // Extract environment URL
143
336
  const environmentUrl = extractEnvironmentUrl(code);
144
- // Extract title from file
145
- let title = 'Recorded Flow';
146
- const titleMatch = code.match(/\/\*\*\s*\n\s*\*\s*([^@\*]+)/);
147
- if (titleMatch) {
148
- title = titleMatch[1].trim();
149
- // Sanitize: strip date suffix and replace hyphens
150
- title = title.replace(/\s+at\s+\d{1,2}:\d{2}:\d{2}/, '').replace(/-/g, ' ');
151
- }
152
337
  // Parse with Babel
153
338
  const ast = babelParser.parse(code, {
154
- sourceType: 'commonjs',
339
+ plugins: ['jsx', 'typescript'],
340
+ sourceType: 'unambiguous',
155
341
  });
342
+ let title;
156
343
  const steps = [];
344
+ const queries = [];
345
+ const selectors = [];
346
+ const assertions = [];
157
347
  const querySelectorCalls = [];
158
348
  // Traverse AST
159
349
  traverse(ast, {
160
350
  CallExpression(path) {
161
- const callee = path.node.callee;
162
- const line = path.node.loc?.start?.line ?? 0;
163
- // Handle screen.getBy* calls
164
- if (callee.type === 'MemberExpression' &&
165
- callee.object.type === 'Identifier' &&
166
- callee.object.name === 'screen' &&
167
- callee.property.type === 'Identifier') {
168
- const methodName = callee.property.name;
169
- if (methodName && methodName.startsWith('getBy')) {
170
- const target = extractStringArg(path.node.arguments[0]);
171
- // All screen queries become asserts in this implementation
172
- steps.push({
173
- action: 'assert',
174
- target: target ?? methodName,
175
- value: undefined,
176
- originalType: methodName,
177
- line,
178
- source: 'js',
179
- });
351
+ if (!title && isRecorderTitleCall(path.node)) {
352
+ const candidateTitle = extractLiteralValue(path.node.arguments[0]);
353
+ if (candidateTitle) {
354
+ title = candidateTitle;
180
355
  }
181
356
  }
182
- // Handle document.querySelector calls
183
- if (callee.type === 'MemberExpression' &&
184
- callee.object.type === 'Identifier' &&
185
- callee.object.name === 'document' &&
186
- callee.property.type === 'Identifier' &&
187
- callee.property.name === 'querySelector') {
188
- const selector = extractStringArg(path.node.arguments[0]);
189
- if (selector) {
190
- querySelectorCalls.push({ selector, line });
357
+ if (isUserEventCall(path.node) && t.isMemberExpression(path.node.callee) && t.isIdentifier(path.node.callee.property)) {
358
+ const stepId = createStepId('js', steps.length);
359
+ const methodName = path.node.callee.property.name;
360
+ const action = mapUserEventCall(methodName);
361
+ const resolvedTarget = resolveTarget(code, path.node.arguments[0], stepId);
362
+ const value = extractLiteralValue(path.node.arguments[1]);
363
+ if (resolvedTarget.query) {
364
+ queries.push(resolvedTarget.query);
191
365
  }
192
- }
193
- // Handle userEvent.* calls
194
- if (callee.type === 'MemberExpression' &&
195
- callee.object.type === 'Identifier' &&
196
- callee.object.name === 'userEvent') {
197
- const methodName = callee.property.name;
198
- if (methodName) {
199
- const action = mapUserEventCall(methodName);
200
- // Extract target from first argument (element reference)
201
- const target = extractStringArg(path.node.arguments[0]) ?? methodName;
202
- // Extract value from second argument for type/keyboard
203
- const value = extractStringArg(path.node.arguments[1]);
204
- steps.push({
205
- action,
206
- target,
207
- value,
208
- originalType: methodName,
209
- line,
210
- source: 'js',
366
+ if (resolvedTarget.selector) {
367
+ selectors.push(resolvedTarget.selector);
368
+ querySelectorCalls.push({
369
+ selector: resolvedTarget.selector.selector,
370
+ line: resolvedTarget.selector.line ?? getLine(path.node),
371
+ stepId,
211
372
  });
212
373
  }
374
+ steps.push({
375
+ id: stepId,
376
+ action,
377
+ target: resolvedTarget.target ?? methodName,
378
+ value,
379
+ originalType: methodName,
380
+ line: getLine(path.node),
381
+ source: 'js',
382
+ metadata: {
383
+ ...resolvedTarget.metadata,
384
+ },
385
+ });
386
+ return;
213
387
  }
214
- // Handle await page.goto(url)
215
- if (callee.type === 'MemberExpression' &&
216
- callee.object.type === 'Identifier' &&
217
- callee.object.name === 'page' &&
218
- callee.property.type === 'Identifier' &&
219
- callee.property.name === 'goto') {
220
- const target = extractStringArg(path.node.arguments[0]);
388
+ if (isExpectationCall(path.node) &&
389
+ t.isMemberExpression(path.node.callee) &&
390
+ t.isIdentifier(path.node.callee.property) &&
391
+ t.isCallExpression(path.node.callee.object)) {
392
+ const matcher = path.node.callee.property.name;
393
+ const expectCall = path.node.callee.object;
394
+ const subject = memberExpressionToSubject(expectCall.arguments[0]);
395
+ const expected = extractLiteralValue(path.node.arguments[0]);
396
+ const stepId = createStepId('js', steps.length);
397
+ const assertion = {
398
+ stepId,
399
+ kind: mapAssertionKind(subject),
400
+ line: getLine(path.node),
401
+ target: subject,
402
+ raw: sliceSource(code, path.node),
403
+ expected,
404
+ matcher,
405
+ subject,
406
+ };
407
+ assertions.push(assertion);
408
+ steps.push({
409
+ id: stepId,
410
+ action: 'assert',
411
+ target: subject ?? matcher,
412
+ value: expected,
413
+ originalType: matcher,
414
+ line: getLine(path.node),
415
+ source: 'js',
416
+ metadata: {
417
+ assertion,
418
+ },
419
+ });
420
+ return;
421
+ }
422
+ if (isPageGotoCall(path.node)) {
423
+ const target = extractLiteralValue(path.node.arguments[0]);
221
424
  if (target) {
425
+ const stepId = createStepId('js', steps.length);
222
426
  steps.push({
427
+ id: stepId,
223
428
  action: 'navigate',
224
429
  target,
225
430
  value: undefined,
226
431
  originalType: 'goto',
227
- line,
432
+ line: getLine(path.node),
433
+ source: 'js',
434
+ });
435
+ }
436
+ return;
437
+ }
438
+ if (isStandaloneExpression(path)) {
439
+ const stepId = createStepId('js', steps.length);
440
+ const query = extractQueryDescriptor(code, path.node, stepId);
441
+ if (query) {
442
+ queries.push(query);
443
+ const assertion = {
444
+ stepId,
445
+ kind: 'query-result',
446
+ line: getLine(path.node),
447
+ target: query.target,
448
+ queryMethod: query.method,
449
+ raw: query.raw,
450
+ };
451
+ assertions.push(assertion);
452
+ steps.push({
453
+ id: stepId,
454
+ action: 'assert',
455
+ target: query.target ?? query.method,
456
+ value: undefined,
457
+ originalType: query.method,
458
+ line: getLine(path.node),
228
459
  source: 'js',
460
+ metadata: {
461
+ query: {
462
+ method: query.method,
463
+ queryRoot: query.queryRoot,
464
+ target: query.target,
465
+ role: query.role,
466
+ name: query.name,
467
+ options: query.options,
468
+ raw: query.raw,
469
+ },
470
+ assertion,
471
+ },
472
+ });
473
+ return;
474
+ }
475
+ const selector = extractSelectorDescriptor(code, path.node, stepId);
476
+ if (selector) {
477
+ selectors.push(selector);
478
+ querySelectorCalls.push({
479
+ selector: selector.selector,
480
+ line: selector.line ?? getLine(path.node),
481
+ stepId,
229
482
  });
230
483
  }
231
484
  }
232
485
  },
233
486
  });
487
+ const resolvedTitle = title ?? fallbackDocCommentTitle(code) ?? 'Recorded Flow';
234
488
  // Segment into ItGroups
235
489
  const itGroups = segmentIntoItGroups(steps);
236
490
  return {
237
- title,
491
+ title: resolvedTitle,
238
492
  environmentUrl,
239
493
  steps,
494
+ queries,
495
+ selectors,
496
+ assertions,
240
497
  querySelectorCalls,
241
498
  itGroups,
242
499
  };