@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.
- package/README.md +27 -32
- package/assets/claude/commands/@tayo-dev/rtl/generate.md +2 -2
- package/assets/codex/@tayo-dev/rtl-generate/SKILL.md +1 -1
- package/assets/gemini/commands/@tayo-dev/rtl/generate.toml +2 -2
- package/assets/opencode/commands/@tayo-dev/rtl-generate.md +2 -2
- package/dist/cli/commands/generate.d.ts +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +88 -149
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/core/baseline-normalizer.d.ts +3 -0
- package/dist/core/baseline-normalizer.d.ts.map +1 -0
- package/dist/core/baseline-normalizer.js +65 -0
- package/dist/core/baseline-normalizer.js.map +1 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +15 -0
- package/dist/core/generator.js.map +1 -1
- package/dist/core/input-loader.d.ts +4 -0
- package/dist/core/input-loader.d.ts.map +1 -0
- package/dist/core/input-loader.js +78 -0
- package/dist/core/input-loader.js.map +1 -0
- package/dist/core/js-parser.d.ts +6 -2
- package/dist/core/js-parser.d.ts.map +1 -1
- package/dist/core/js-parser.js +329 -72
- package/dist/core/js-parser.js.map +1 -1
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +11 -1
- package/dist/core/parser.js.map +1 -1
- package/dist/core/recording-intelligence.d.ts.map +1 -1
- package/dist/core/recording-intelligence.js +31 -5
- package/dist/core/recording-intelligence.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/types/recording.d.ts +50 -2
- package/dist/types/recording.d.ts.map +1 -1
- package/dist/types/recording.js +3 -1
- package/dist/types/recording.js.map +1 -1
- 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;
|
|
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"}
|
package/dist/core/generator.js
CHANGED
|
@@ -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":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,WAAW,EACX,aAAa,EACb,YAAY,EACZ,oBAAoB,GACrB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,MAAM,YAAY,CAAA;AAa3B,4DAA4D;AAC5D,SAAS,eAAe,CAAC,QAA4B;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,eAAe,CAAA;IAErC,wBAAwB;IACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC3E,IAAI,WAAW;QAAE,OAAO,uBAAuB,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA;IAEjE,uBAAuB;IACvB,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;IAC7E,IAAI,cAAc;QAAE,OAAO,0BAA0B,cAAc,CAAC,CAAC,CAAC,IAAI,CAAA;IAE1E,0DAA0D;IAC1D,IAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1C,OAAO,kDAAkD,CAAA;IAC3D,CAAC;IAED,+BAA+B;IAC/B,IAAI,oEAAoE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxF,OAAO,4BAA4B,CAAA;IACrC,CAAC;IACD,IAAI,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,0BAA0B,CAAA;IACnC,CAAC;IACD,IAAI,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,OAAO,8BAA8B,CAAA;IACvC,CAAC;IACD,IAAI,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,2BAA2B,CAAA;IACpC,CAAC;IACD,IAAI,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,8BAA8B,CAAA;IACvC,CAAC;IACD,IAAI,wFAAwF,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5G,OAAO,6BAA6B,CAAA;IACtC,CAAC;IACD,IAAI,iCAAiC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,OAAO,6BAA6B,CAAA;IACtC,CAAC;IACD,IAAI,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,6BAA6B,CAAA;IACtC,CAAC;IACD,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,yBAAyB,CAAA;IAClC,CAAC;IAED,sEAAsE;IACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACpE,OAAO,8DAA8D,OAAO,UAAU,CAAA;AACxF,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,OAAO,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC5C,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc;IAC1C,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QACrB,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7C,gDAAgD,CAAC,IAAI,CAAC,MAAM,CAAC,CAC9D,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAoB;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAA;IAClC,IACE,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,IAAI,KAAK;QACd,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EACpB,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAA;IAClB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAoB;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,eAAe,CAAA;IACxB,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9F,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACxE,OAAO,IAAI,CAAC,YAAY,KAAK,WAAW;YACtC,CAAC,CAAC,qBAAqB,aAAa,IAAI;YACxC,CAAC,CAAC,UAAU,IAAI,CAAC,YAAY,KAAK,aAAa,IAAI,CAAA;IACvD,CAAC;IAED,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACxE,OAAO,qBAAqB,aAAa,IAAI,CAAA;AAC/C,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAoB;IAC5C,iEAAiE;IACjE,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5E,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC1C,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,SAA8B,EAC9B,UAA4B,EAAE;IAE9B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,IAAI,gBAAgB,CAAA;IAEpD,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/C,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAC1D,CAAA;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAA;IAEvE,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;IAClE,MAAM,IAAI,GAAG,GAAG,OAAO,OAAO,QAAQ,IAAI,CAAA;IAE1C,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,QAAQ,EAAE,OAAO,CAAC,UAAU;KAC7B,CAAA;AACH,CAAC;AASD,MAAM,UAAU,gBAAgB,CAAC,YAA2B;IAC1D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAErC,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsD,CAAA;IAC7E,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE;gBACpB,GAAG,QAAQ;gBACX,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACtE,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE;gBACpB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,KAAK,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;aAC5C,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,KAAK,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAA;QACpE,MAAM,QAAQ,GACZ,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,cAAc,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjE,CAAC,CAAC,EAAE,CAAA;QACR,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;YACd,IAAI,KAAK,IAAI,MAAM,KAAK,OAAO,GAAG,QAAQ,GAAG,CAChD,CAAA;IACH,CAAC;AACH,CAAC;AASD,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,QAAmB,EACnB,UAAqC,EAAE;IAEvC,MAAM,EAAE,WAAW,EAAE,YAAY,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACtE,MAAM,WAAW,GAAG,WAAW,EAAE,WAAW,IAAI,KAAK,CAAA;IAErD,6CAA6C;IAC7C,MAAM,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAClD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CACnF,CAAA;IAED,+DAA+D;IAC/D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC5C,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACtC,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3C,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAC1D,CAAA;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACzC,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC/B,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;YAC5E,CAAC;YACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAC5E,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QACjF,CAAC,CAAC,CAAA;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAA;IAC7D,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC1D,MAAM,IAAI,GAAG,GAAG,OAAO,OAAO,YAAY,IAAI,CAAA;IAE9C,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,UAAU;QACpB,YAAY;QACZ,YAAY,EAAE,QAAQ,CAAC,MAAM;KAC9B,CAAA;AACH,CAAC"}
|
|
@@ -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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"}
|
package/dist/core/js-parser.d.ts
CHANGED
|
@@ -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
|
|
3
|
+
* Parses the JavaScript recording format and produces truthful baseline metadata.
|
|
4
4
|
*/
|
|
5
|
-
import type
|
|
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;
|
|
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"}
|
package/dist/core/js-parser.js
CHANGED
|
@@ -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
|
|
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
|
|
105
|
+
* Extracts a string-like value from a Babel AST node
|
|
104
106
|
*/
|
|
105
|
-
function
|
|
107
|
+
function extractLiteralValue(node) {
|
|
106
108
|
if (!node)
|
|
107
109
|
return undefined;
|
|
108
|
-
if (node
|
|
110
|
+
if (t.isStringLiteral(node)) {
|
|
109
111
|
return node.value;
|
|
110
112
|
}
|
|
111
|
-
if (node
|
|
112
|
-
return node.
|
|
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
|
-
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
callee.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
callee.
|
|
217
|
-
callee.object
|
|
218
|
-
callee.property.
|
|
219
|
-
|
|
220
|
-
const
|
|
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
|
};
|