@tayo-dev/rtl 1.0.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 +250 -0
- package/dist/analyzer/mocks/detector.d.ts +59 -0
- package/dist/analyzer/mocks/detector.d.ts.map +1 -0
- package/dist/analyzer/mocks/detector.js +264 -0
- package/dist/analyzer/mocks/detector.js.map +1 -0
- package/dist/analyzer/mocks/target-analyzer.d.ts +92 -0
- package/dist/analyzer/mocks/target-analyzer.d.ts.map +1 -0
- package/dist/analyzer/mocks/target-analyzer.js +305 -0
- package/dist/analyzer/mocks/target-analyzer.js.map +1 -0
- package/dist/analyzer/visual/element-analyzer.d.ts +44 -0
- package/dist/analyzer/visual/element-analyzer.d.ts.map +1 -0
- package/dist/analyzer/visual/element-analyzer.js +176 -0
- package/dist/analyzer/visual/element-analyzer.js.map +1 -0
- package/dist/analyzer/visual/inspector.d.ts +49 -0
- package/dist/analyzer/visual/inspector.d.ts.map +1 -0
- package/dist/analyzer/visual/inspector.js +109 -0
- package/dist/analyzer/visual/inspector.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +13 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +417 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/core/generator.d.ts +32 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +173 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/js-parser.d.ts +48 -0
- package/dist/core/js-parser.d.ts.map +1 -0
- package/dist/core/js-parser.js +244 -0
- package/dist/core/js-parser.js.map +1 -0
- package/dist/core/mock-intelligence.d.ts +14 -0
- package/dist/core/mock-intelligence.d.ts.map +1 -0
- package/dist/core/mock-intelligence.js +140 -0
- package/dist/core/mock-intelligence.js.map +1 -0
- package/dist/core/orchestrator.d.ts +49 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +315 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/parser.d.ts +9 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +120 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/recording-intelligence.d.ts +15 -0
- package/dist/core/recording-intelligence.d.ts.map +1 -0
- package/dist/core/recording-intelligence.js +178 -0
- package/dist/core/recording-intelligence.js.map +1 -0
- package/dist/core/resolver.d.ts +58 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +291 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/scanner.d.ts +51 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +310 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/scorer.d.ts +8 -0
- package/dist/core/scorer.d.ts.map +1 -0
- package/dist/core/scorer.js +76 -0
- package/dist/core/scorer.js.map +1 -0
- package/dist/core/validator.d.ts +134 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +44 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/core/verifier.d.ts +10 -0
- package/dist/core/verifier.d.ts.map +1 -0
- package/dist/core/verifier.js +30 -0
- package/dist/core/verifier.js.map +1 -0
- package/dist/core/writer.d.ts +15 -0
- package/dist/core/writer.d.ts.map +1 -0
- package/dist/core/writer.js +43 -0
- package/dist/core/writer.js.map +1 -0
- package/dist/generator/mocks/builder.d.ts +47 -0
- package/dist/generator/mocks/builder.d.ts.map +1 -0
- package/dist/generator/mocks/builder.js +335 -0
- package/dist/generator/mocks/builder.js.map +1 -0
- package/dist/generator/transforms/dialog-transform.d.ts +35 -0
- package/dist/generator/transforms/dialog-transform.d.ts.map +1 -0
- package/dist/generator/transforms/dialog-transform.js +293 -0
- package/dist/generator/transforms/dialog-transform.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/learner/analyzer.d.ts +13 -0
- package/dist/learner/analyzer.d.ts.map +1 -0
- package/dist/learner/analyzer.js +484 -0
- package/dist/learner/analyzer.js.map +1 -0
- package/dist/learner/index.d.ts +66 -0
- package/dist/learner/index.d.ts.map +1 -0
- package/dist/learner/index.js +247 -0
- package/dist/learner/index.js.map +1 -0
- package/dist/learner/storage.d.ts +68 -0
- package/dist/learner/storage.d.ts.map +1 -0
- package/dist/learner/storage.js +201 -0
- package/dist/learner/storage.js.map +1 -0
- package/dist/learner/types.d.ts +41 -0
- package/dist/learner/types.d.ts.map +1 -0
- package/dist/learner/types.js +31 -0
- package/dist/learner/types.js.map +1 -0
- package/dist/parser/recorder-parser.d.ts +40 -0
- package/dist/parser/recorder-parser.d.ts.map +1 -0
- package/dist/parser/recorder-parser.js +139 -0
- package/dist/parser/recorder-parser.js.map +1 -0
- package/dist/parser/steps/deduplicator.d.ts +19 -0
- package/dist/parser/steps/deduplicator.d.ts.map +1 -0
- package/dist/parser/steps/deduplicator.js +75 -0
- package/dist/parser/steps/deduplicator.js.map +1 -0
- package/dist/parser/steps/dialog-detector.d.ts +38 -0
- package/dist/parser/steps/dialog-detector.d.ts.map +1 -0
- package/dist/parser/steps/dialog-detector.js +290 -0
- package/dist/parser/steps/dialog-detector.js.map +1 -0
- package/dist/parser/steps/noise-filter.d.ts +21 -0
- package/dist/parser/steps/noise-filter.d.ts.map +1 -0
- package/dist/parser/steps/noise-filter.js +138 -0
- package/dist/parser/steps/noise-filter.js.map +1 -0
- package/dist/scorer/index.d.ts +43 -0
- package/dist/scorer/index.d.ts.map +1 -0
- package/dist/scorer/index.js +82 -0
- package/dist/scorer/index.js.map +1 -0
- package/dist/scorer/post-verify.d.ts +17 -0
- package/dist/scorer/post-verify.d.ts.map +1 -0
- package/dist/scorer/post-verify.js +163 -0
- package/dist/scorer/post-verify.js.map +1 -0
- package/dist/scorer/pre-audit.d.ts +32 -0
- package/dist/scorer/pre-audit.d.ts.map +1 -0
- package/dist/scorer/pre-audit.js +99 -0
- package/dist/scorer/pre-audit.js.map +1 -0
- package/dist/scorer/quality-gates.d.ts +17 -0
- package/dist/scorer/quality-gates.d.ts.map +1 -0
- package/dist/scorer/quality-gates.js +304 -0
- package/dist/scorer/quality-gates.js.map +1 -0
- package/dist/scorer/types.d.ts +27 -0
- package/dist/scorer/types.d.ts.map +1 -0
- package/dist/scorer/types.js +5 -0
- package/dist/scorer/types.js.map +1 -0
- package/dist/templates/test-template.d.ts +21 -0
- package/dist/templates/test-template.d.ts.map +1 -0
- package/dist/templates/test-template.js +92 -0
- package/dist/templates/test-template.js.map +1 -0
- package/dist/types/conventions.d.ts +49 -0
- package/dist/types/conventions.d.ts.map +1 -0
- package/dist/types/conventions.js +13 -0
- package/dist/types/conventions.js.map +1 -0
- package/dist/types/recording.d.ts +143 -0
- package/dist/types/recording.d.ts.map +1 -0
- package/dist/types/recording.js +5 -0
- package/dist/types/recording.js.map +1 -0
- package/dist/types/score.d.ts +18 -0
- package/dist/types/score.d.ts.map +1 -0
- package/dist/types/score.js +2 -0
- package/dist/types/score.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dialog transform - converts dialog flows into optimized test code
|
|
3
|
+
*
|
|
4
|
+
* This module transforms detected DialogFlow objects into cleaner,
|
|
5
|
+
* more maintainable test code with helper functions.
|
|
6
|
+
*
|
|
7
|
+
* Output:
|
|
8
|
+
* - openDialog() helper function
|
|
9
|
+
* - Test steps that call helper + fill fields
|
|
10
|
+
* - Optional close verification
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Generate selector query code from a recording step
|
|
14
|
+
*/
|
|
15
|
+
function generateSelectorQuery(step) {
|
|
16
|
+
const selector = step.selector || step.target || '';
|
|
17
|
+
if (!selector) {
|
|
18
|
+
return 'screen.getByRole("button")';
|
|
19
|
+
}
|
|
20
|
+
// Handle different selector types
|
|
21
|
+
if (selector.startsWith('#')) {
|
|
22
|
+
// ID selector
|
|
23
|
+
const id = selector.slice(1);
|
|
24
|
+
return `screen.getByRole("button", { name: /${id}/i })`;
|
|
25
|
+
}
|
|
26
|
+
if (selector.startsWith('.')) {
|
|
27
|
+
// Class selector - use getByTestId or find by text
|
|
28
|
+
const className = selector.slice(1).replace(/\./g, ' ');
|
|
29
|
+
return `screen.getByText(/${className}/i)`;
|
|
30
|
+
}
|
|
31
|
+
if (selector.includes('[data-testid=')) {
|
|
32
|
+
// data-testid selector
|
|
33
|
+
const match = selector.match(/\[data-testid=["']([^"']+)["']\]/);
|
|
34
|
+
if (match) {
|
|
35
|
+
return `screen.getByTestId("${match[1]}")`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (selector.includes('[')) {
|
|
39
|
+
// Attribute selector
|
|
40
|
+
const match = selector.match(/\[([^=]+)=["']([^"']+)["']\]/);
|
|
41
|
+
if (match) {
|
|
42
|
+
const attr = match[1];
|
|
43
|
+
const value = match[2];
|
|
44
|
+
return `screen.getByRole("button", { name: /${value}/i })`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Default: try to find by text content
|
|
48
|
+
const readableName = selector.split(/[#.\s]/).pop() || 'button';
|
|
49
|
+
return `screen.getByRole("button", { name: /${readableName}/i })`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate the openDialog helper function
|
|
53
|
+
*/
|
|
54
|
+
function generateOpenDialogHelper(flow) {
|
|
55
|
+
const triggerSelector = flow.triggerStep.selector || flow.triggerStep.target || '';
|
|
56
|
+
const triggerName = triggerSelector.split(/[#.\s]/).pop() || 'open';
|
|
57
|
+
// Build selector query
|
|
58
|
+
let triggerQuery = '';
|
|
59
|
+
if (triggerSelector.startsWith('#')) {
|
|
60
|
+
const id = triggerSelector.slice(1);
|
|
61
|
+
triggerQuery = `screen.getByRole('button', { name: /${id}/i })`;
|
|
62
|
+
}
|
|
63
|
+
else if (triggerSelector.includes('[data-testid=')) {
|
|
64
|
+
const match = triggerSelector.match(/\[data-testid=["']([^"']+)["']\]/);
|
|
65
|
+
if (match) {
|
|
66
|
+
triggerQuery = `screen.getByTestId("${match[1]}")`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
triggerQuery = `screen.getByRole('button', { name: /${triggerName}/i })`;
|
|
71
|
+
}
|
|
72
|
+
// Determine dialog wait condition based on type
|
|
73
|
+
let waitCondition = '';
|
|
74
|
+
switch (flow.type) {
|
|
75
|
+
case 'modal':
|
|
76
|
+
waitCondition = `await waitFor(() => expect(screen.getByRole('dialog')).toBeInTheDocument())`;
|
|
77
|
+
break;
|
|
78
|
+
case 'drawer':
|
|
79
|
+
waitCondition = `await waitFor(() => expect(screen.getByTestId('drawer')).toBeInTheDocument())`;
|
|
80
|
+
break;
|
|
81
|
+
case 'popover':
|
|
82
|
+
waitCondition = `await waitFor(() => expect(screen.getByRole('tooltip')).toBeInTheDocument())`;
|
|
83
|
+
break;
|
|
84
|
+
case 'confirm':
|
|
85
|
+
waitCondition = `await waitFor(() => expect(screen.getByRole('alertdialog')).toBeInTheDocument())`;
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
waitCondition = `await waitFor(() => expect(screen.getByRole('dialog')).toBeInTheDocument())`;
|
|
89
|
+
}
|
|
90
|
+
return `const openDialog = async () => {
|
|
91
|
+
await userEvent.click(${triggerQuery});
|
|
92
|
+
${waitCondition}
|
|
93
|
+
};`;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Generate field fill code from fill/select steps
|
|
97
|
+
*/
|
|
98
|
+
function generateFillCode(step) {
|
|
99
|
+
const selector = step.selector || step.target || '';
|
|
100
|
+
const value = step.value || '';
|
|
101
|
+
// Build query for the field
|
|
102
|
+
let fieldQuery = '';
|
|
103
|
+
if (selector.includes('[data-testid=')) {
|
|
104
|
+
const match = selector.match(/\[data-testid=["']([^"']+)["']\]/);
|
|
105
|
+
if (match) {
|
|
106
|
+
fieldQuery = `screen.getByTestId("${match[1]}")`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (selector.includes('[aria-label=')) {
|
|
110
|
+
const match = selector.match(/\[aria-label=["']([^"']+)["']\]/);
|
|
111
|
+
if (match) {
|
|
112
|
+
fieldQuery = `screen.getByLabelText(/${match[1]}/i)`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (selector.includes('[name=')) {
|
|
116
|
+
const match = selector.match(/\[name=["']([^"']+)["']\]/);
|
|
117
|
+
if (match) {
|
|
118
|
+
fieldQuery = `screen.getByRole('textbox', { name: /${match[1]}/i })`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Try to find by label
|
|
123
|
+
const labelMatch = selector.match(/label:(.+)/);
|
|
124
|
+
if (labelMatch) {
|
|
125
|
+
fieldQuery = `screen.getByLabelText(/${labelMatch[1]}/i)`;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
fieldQuery = `screen.getByRole('textbox')`;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (step.type === 'fill') {
|
|
132
|
+
return `await userEvent.type(${fieldQuery}, '${value}');`;
|
|
133
|
+
}
|
|
134
|
+
if (step.type === 'select') {
|
|
135
|
+
return `await userEvent.selectOptions(${fieldQuery}, '${value}');`;
|
|
136
|
+
}
|
|
137
|
+
return '';
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Generate submit button click code
|
|
141
|
+
*/
|
|
142
|
+
function generateSubmitCode(step) {
|
|
143
|
+
const selector = step.selector || step.target || '';
|
|
144
|
+
let submitQuery = '';
|
|
145
|
+
if (selector.includes('[data-testid=')) {
|
|
146
|
+
const match = selector.match(/\[data-testid=["']([^"']+)["']\]/);
|
|
147
|
+
if (match) {
|
|
148
|
+
submitQuery = `screen.getByTestId("${match[1]}")`;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Try to find submit button
|
|
153
|
+
const submitPatterns = ['submit', 'save', 'confirm', 'apply'];
|
|
154
|
+
const pattern = submitPatterns.find(p => selector.toLowerCase().includes(p)) || 'submit';
|
|
155
|
+
submitQuery = `screen.getByRole('button', { name: /${pattern}/i })`;
|
|
156
|
+
}
|
|
157
|
+
return `await userEvent.click(${submitQuery});`;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Generate close dialog code
|
|
161
|
+
*/
|
|
162
|
+
function generateCloseCode(step) {
|
|
163
|
+
// Try to find close button
|
|
164
|
+
const closePatterns = ['close', 'cancel', 'dismiss', 'esc'];
|
|
165
|
+
return `await userEvent.keyboard('{Escape}');`;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Generate assertion code
|
|
169
|
+
*/
|
|
170
|
+
function generateAssertionCode(step) {
|
|
171
|
+
const selector = step.selector || step.target || '';
|
|
172
|
+
// Build query for assertion target
|
|
173
|
+
let assertQuery = '';
|
|
174
|
+
if (selector.includes('[data-testid=')) {
|
|
175
|
+
const match = selector.match(/\[data-testid=["']([^"']+)["']\]/);
|
|
176
|
+
if (match) {
|
|
177
|
+
assertQuery = `screen.getByTestId("${match[1]}")`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else if (selector.includes('[role=')) {
|
|
181
|
+
const match = selector.match(/\[role=["']([^"']+)["']\]/);
|
|
182
|
+
if (match) {
|
|
183
|
+
assertQuery = `screen.getByRole('${match[1]}')`;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// Default to finding visible element
|
|
188
|
+
assertQuery = `screen.getByText(/.+/)`;
|
|
189
|
+
}
|
|
190
|
+
if (step.type === 'assert') {
|
|
191
|
+
return `await waitFor(() => expect(${assertQuery}).toBeInTheDocument());`;
|
|
192
|
+
}
|
|
193
|
+
if (step.type === 'waitForSelector') {
|
|
194
|
+
return `await waitFor(() => expect(${assertQuery}).toBeInTheDocument());`;
|
|
195
|
+
}
|
|
196
|
+
return '';
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Transform a single dialog flow into test code
|
|
200
|
+
*/
|
|
201
|
+
function transformSingleFlow(flow) {
|
|
202
|
+
const helpers = [];
|
|
203
|
+
const testSteps = [];
|
|
204
|
+
const cleanup = [];
|
|
205
|
+
// Generate openDialog helper
|
|
206
|
+
helpers.push({
|
|
207
|
+
type: 'helper',
|
|
208
|
+
code: generateOpenDialogHelper(flow),
|
|
209
|
+
description: `Helper to open ${flow.type} dialog`,
|
|
210
|
+
});
|
|
211
|
+
// Generate test steps
|
|
212
|
+
// 1. Call openDialog helper
|
|
213
|
+
testSteps.push({
|
|
214
|
+
type: 'action',
|
|
215
|
+
code: 'await openDialog();',
|
|
216
|
+
description: 'Open the dialog',
|
|
217
|
+
});
|
|
218
|
+
// 2. Fill form fields in order
|
|
219
|
+
for (const fillStep of flow.contentSteps) {
|
|
220
|
+
const fillCode = generateFillCode(fillStep);
|
|
221
|
+
if (fillCode) {
|
|
222
|
+
testSteps.push({
|
|
223
|
+
type: 'action',
|
|
224
|
+
code: fillCode,
|
|
225
|
+
description: `Fill ${fillStep.type} field`,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// 3. Submit (if there's a click after filling)
|
|
230
|
+
const lastContentStep = flow.contentSteps[flow.contentSteps.length - 1];
|
|
231
|
+
if (lastContentStep && lastContentStep.type === 'fill') {
|
|
232
|
+
// Generate a submit button click
|
|
233
|
+
testSteps.push({
|
|
234
|
+
type: 'action',
|
|
235
|
+
code: "await userEvent.click(screen.getByRole('button', { name: /submit/i }));",
|
|
236
|
+
description: 'Submit the dialog',
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// 4. Close dialog (if not already closed by submit)
|
|
240
|
+
if (flow.closeStep) {
|
|
241
|
+
cleanup.push({
|
|
242
|
+
type: 'action',
|
|
243
|
+
code: generateCloseCode(flow.closeStep),
|
|
244
|
+
description: 'Close the dialog',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
// 5. Assertion (if present)
|
|
248
|
+
if (flow.assertionStep) {
|
|
249
|
+
testSteps.push({
|
|
250
|
+
type: 'assertion',
|
|
251
|
+
code: generateAssertionCode(flow.assertionStep),
|
|
252
|
+
description: 'Verify dialog state',
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
return { helpers, testSteps, cleanup };
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Transform dialog flows into optimized test code
|
|
259
|
+
*
|
|
260
|
+
* @param flows - Array of detected dialog flows
|
|
261
|
+
* @returns Transformed steps ready for code generation
|
|
262
|
+
*/
|
|
263
|
+
export function transformDialogFlows(flows) {
|
|
264
|
+
if (!flows || flows.length === 0) {
|
|
265
|
+
return [];
|
|
266
|
+
}
|
|
267
|
+
return flows.map(transformSingleFlow);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Generate complete test code from a dialog template
|
|
271
|
+
*/
|
|
272
|
+
export function generateDialogTestCode(template) {
|
|
273
|
+
const lines = [];
|
|
274
|
+
// Add helpers
|
|
275
|
+
for (const helper of template.helpers) {
|
|
276
|
+
lines.push(helper.code);
|
|
277
|
+
lines.push('');
|
|
278
|
+
}
|
|
279
|
+
// Add test steps
|
|
280
|
+
for (const step of template.testSteps) {
|
|
281
|
+
lines.push(step.code);
|
|
282
|
+
}
|
|
283
|
+
// Add cleanup
|
|
284
|
+
if (template.cleanup && template.cleanup.length > 0) {
|
|
285
|
+
lines.push('');
|
|
286
|
+
for (const step of template.cleanup) {
|
|
287
|
+
lines.push(step.code);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return lines.join('\n');
|
|
291
|
+
}
|
|
292
|
+
export default transformDialogFlows;
|
|
293
|
+
//# sourceMappingURL=dialog-transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog-transform.js","sourceRoot":"","sources":["../../../src/generator/transforms/dialog-transform.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Taro CLI entry point
|
|
4
|
+
* Generates React Testing Library tests from Chrome Recorder exports.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import pc from 'picocolors';
|
|
8
|
+
import { createGenerateCommand } from './cli/commands/generate.js';
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name('taro')
|
|
12
|
+
.description(pc.bold('Taro') +
|
|
13
|
+
' — Generate React Testing Library tests from Chrome Recorder exports')
|
|
14
|
+
.version('1.0.0', '-v, --version', 'Output the current version')
|
|
15
|
+
.helpOption('-h, --help', 'Display help for command');
|
|
16
|
+
program.addCommand(createGenerateCommand());
|
|
17
|
+
program.parse(process.argv);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CACV,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;IACb,sEAAsE,CACzE;KACA,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;KAC/D,UAAU,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAA;AAEvD,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAA;AAE3C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convention analyzer - extracts patterns from test files using AST analysis
|
|
3
|
+
*/
|
|
4
|
+
import { TestConvention } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Analyze a single test file and extract conventions
|
|
7
|
+
*/
|
|
8
|
+
export declare function analyzeTestFile(filePath: string): Partial<TestConvention>;
|
|
9
|
+
/**
|
|
10
|
+
* Extract conventions from all test files in a directory
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractConventions(testDir: string): TestConvention;
|
|
13
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/learner/analyzer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EACL,cAAc,EAQf,MAAM,YAAY,CAAC;AAsBpB;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA8BzE;AAmXD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAgBlE"}
|