@browserflow-ai/generator 0.0.6

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 (41) hide show
  1. package/dist/config-emit.d.ts +41 -0
  2. package/dist/config-emit.d.ts.map +1 -0
  3. package/dist/config-emit.js +191 -0
  4. package/dist/config-emit.js.map +1 -0
  5. package/dist/index.d.ts +16 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +15 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/locator-emit.d.ts +76 -0
  10. package/dist/locator-emit.d.ts.map +1 -0
  11. package/dist/locator-emit.js +239 -0
  12. package/dist/locator-emit.js.map +1 -0
  13. package/dist/locator-emit.test.d.ts +6 -0
  14. package/dist/locator-emit.test.d.ts.map +1 -0
  15. package/dist/locator-emit.test.js +425 -0
  16. package/dist/locator-emit.test.js.map +1 -0
  17. package/dist/playwright-ts.d.ts +97 -0
  18. package/dist/playwright-ts.d.ts.map +1 -0
  19. package/dist/playwright-ts.js +373 -0
  20. package/dist/playwright-ts.js.map +1 -0
  21. package/dist/playwright-ts.test.d.ts +6 -0
  22. package/dist/playwright-ts.test.d.ts.map +1 -0
  23. package/dist/playwright-ts.test.js +548 -0
  24. package/dist/playwright-ts.test.js.map +1 -0
  25. package/dist/visual-checks.d.ts +76 -0
  26. package/dist/visual-checks.d.ts.map +1 -0
  27. package/dist/visual-checks.js +195 -0
  28. package/dist/visual-checks.js.map +1 -0
  29. package/dist/visual-checks.test.d.ts +6 -0
  30. package/dist/visual-checks.test.d.ts.map +1 -0
  31. package/dist/visual-checks.test.js +188 -0
  32. package/dist/visual-checks.test.js.map +1 -0
  33. package/package.json +34 -0
  34. package/src/config-emit.ts +253 -0
  35. package/src/index.ts +57 -0
  36. package/src/locator-emit.test.ts +533 -0
  37. package/src/locator-emit.ts +310 -0
  38. package/src/playwright-ts.test.ts +704 -0
  39. package/src/playwright-ts.ts +519 -0
  40. package/src/visual-checks.test.ts +232 -0
  41. package/src/visual-checks.ts +294 -0
@@ -0,0 +1,425 @@
1
+ /**
2
+ * locator-emit.test.ts
3
+ * Tests for the locator-to-code conversion module.
4
+ */
5
+ import { describe, it, expect } from 'bun:test';
6
+ import { generateLocatorCode, resolveLocatorCode, escapeString, selectorToLocator, roleLocator, textLocator, testIdLocator, } from './locator-emit.js';
7
+ describe('escapeString', () => {
8
+ it('escapes single quotes', () => {
9
+ expect(escapeString("it's")).toBe("it\\'s");
10
+ });
11
+ it('escapes backslashes', () => {
12
+ expect(escapeString('path\\to\\file')).toBe('path\\\\to\\\\file');
13
+ });
14
+ it('escapes newlines', () => {
15
+ expect(escapeString('line1\nline2')).toBe('line1\\nline2');
16
+ });
17
+ it('escapes carriage returns', () => {
18
+ expect(escapeString('line1\rline2')).toBe('line1\\rline2');
19
+ });
20
+ it('escapes tabs', () => {
21
+ expect(escapeString('col1\tcol2')).toBe('col1\\tcol2');
22
+ });
23
+ it('handles complex strings with multiple special characters', () => {
24
+ expect(escapeString("it's a\ntest\\path")).toBe("it\\'s a\\ntest\\\\path");
25
+ });
26
+ it('returns empty string unchanged', () => {
27
+ expect(escapeString('')).toBe('');
28
+ });
29
+ it('returns normal string unchanged', () => {
30
+ expect(escapeString('normal text')).toBe('normal text');
31
+ });
32
+ });
33
+ describe('generateLocatorCode', () => {
34
+ describe('CSS selector locators', () => {
35
+ it('generates code from CSS selector', () => {
36
+ const locator = { selector: 'button.primary' };
37
+ expect(generateLocatorCode(locator)).toBe("page.locator('button.primary')");
38
+ });
39
+ it('escapes special characters in CSS selectors', () => {
40
+ const locator = { selector: "[data-test='value']" };
41
+ expect(generateLocatorCode(locator)).toBe("page.locator('[data-test=\\'value\\']')");
42
+ });
43
+ it('uses custom page variable', () => {
44
+ const locator = { selector: 'button' };
45
+ expect(generateLocatorCode(locator, { pageVar: 'frame' })).toBe("frame.locator('button')");
46
+ });
47
+ });
48
+ describe('getByRole locators', () => {
49
+ it('generates getByRole with just role', () => {
50
+ const locator = {
51
+ method: 'getByRole',
52
+ args: { role: 'button' },
53
+ };
54
+ expect(generateLocatorCode(locator)).toBe("page.getByRole('button')");
55
+ });
56
+ it('generates getByRole with name', () => {
57
+ const locator = {
58
+ method: 'getByRole',
59
+ args: { role: 'button', name: 'Submit' },
60
+ };
61
+ expect(generateLocatorCode(locator)).toBe("page.getByRole('button', { name: 'Submit' })");
62
+ });
63
+ it('generates getByRole with exact match', () => {
64
+ const locator = {
65
+ method: 'getByRole',
66
+ args: { role: 'heading', name: 'Welcome', exact: true },
67
+ };
68
+ expect(generateLocatorCode(locator)).toBe("page.getByRole('heading', { name: 'Welcome', exact: true })");
69
+ });
70
+ it('escapes special characters in name', () => {
71
+ const locator = {
72
+ method: 'getByRole',
73
+ args: { role: 'button', name: "Don't click" },
74
+ };
75
+ expect(generateLocatorCode(locator)).toBe("page.getByRole('button', { name: 'Don\\'t click' })");
76
+ });
77
+ it('throws error if role is missing', () => {
78
+ const locator = {
79
+ method: 'getByRole',
80
+ args: { name: 'Submit' },
81
+ };
82
+ expect(() => generateLocatorCode(locator)).toThrow('getByRole requires a role argument');
83
+ });
84
+ });
85
+ describe('getByText locators', () => {
86
+ it('generates getByText with text', () => {
87
+ const locator = {
88
+ method: 'getByText',
89
+ args: { text: 'Hello World' },
90
+ };
91
+ expect(generateLocatorCode(locator)).toBe("page.getByText('Hello World')");
92
+ });
93
+ it('generates getByText with exact option', () => {
94
+ const locator = {
95
+ method: 'getByText',
96
+ args: { text: 'Hello', exact: true },
97
+ };
98
+ expect(generateLocatorCode(locator)).toBe("page.getByText('Hello', { exact: true })");
99
+ });
100
+ it('throws error if text is missing', () => {
101
+ const locator = {
102
+ method: 'getByText',
103
+ args: {},
104
+ };
105
+ expect(() => generateLocatorCode(locator)).toThrow('getByText requires a text argument');
106
+ });
107
+ });
108
+ describe('getByLabel locators', () => {
109
+ it('generates getByLabel with text', () => {
110
+ const locator = {
111
+ method: 'getByLabel',
112
+ args: { text: 'Email' },
113
+ };
114
+ expect(generateLocatorCode(locator)).toBe("page.getByLabel('Email')");
115
+ });
116
+ it('generates getByLabel with exact option', () => {
117
+ const locator = {
118
+ method: 'getByLabel',
119
+ args: { text: 'Username', exact: false },
120
+ };
121
+ expect(generateLocatorCode(locator)).toBe("page.getByLabel('Username', { exact: false })");
122
+ });
123
+ it('throws error if text is missing', () => {
124
+ const locator = {
125
+ method: 'getByLabel',
126
+ args: {},
127
+ };
128
+ expect(() => generateLocatorCode(locator)).toThrow('getByLabel requires a text argument');
129
+ });
130
+ });
131
+ describe('getByPlaceholder locators', () => {
132
+ it('generates getByPlaceholder with text', () => {
133
+ const locator = {
134
+ method: 'getByPlaceholder',
135
+ args: { text: 'Enter email...' },
136
+ };
137
+ expect(generateLocatorCode(locator)).toBe("page.getByPlaceholder('Enter email...')");
138
+ });
139
+ it('generates getByPlaceholder with exact option', () => {
140
+ const locator = {
141
+ method: 'getByPlaceholder',
142
+ args: { text: 'Search', exact: true },
143
+ };
144
+ expect(generateLocatorCode(locator)).toBe("page.getByPlaceholder('Search', { exact: true })");
145
+ });
146
+ it('throws error if text is missing', () => {
147
+ const locator = {
148
+ method: 'getByPlaceholder',
149
+ args: {},
150
+ };
151
+ expect(() => generateLocatorCode(locator)).toThrow('getByPlaceholder requires a text argument');
152
+ });
153
+ });
154
+ describe('getByTestId locators', () => {
155
+ it('generates getByTestId with testId', () => {
156
+ const locator = {
157
+ method: 'getByTestId',
158
+ args: { testId: 'submit-button' },
159
+ };
160
+ expect(generateLocatorCode(locator)).toBe("page.getByTestId('submit-button')");
161
+ });
162
+ it('escapes special characters in testId', () => {
163
+ const locator = {
164
+ method: 'getByTestId',
165
+ args: { testId: "user's-form" },
166
+ };
167
+ expect(generateLocatorCode(locator)).toBe("page.getByTestId('user\\'s-form')");
168
+ });
169
+ it('throws error if testId is missing', () => {
170
+ const locator = {
171
+ method: 'getByTestId',
172
+ args: {},
173
+ };
174
+ expect(() => generateLocatorCode(locator)).toThrow('getByTestId requires a testId argument');
175
+ });
176
+ });
177
+ describe('getByAltText locators', () => {
178
+ it('generates getByAltText with text', () => {
179
+ const locator = {
180
+ method: 'getByAltText',
181
+ args: { text: 'Company Logo' },
182
+ };
183
+ expect(generateLocatorCode(locator)).toBe("page.getByAltText('Company Logo')");
184
+ });
185
+ it('generates getByAltText with exact option', () => {
186
+ const locator = {
187
+ method: 'getByAltText',
188
+ args: { text: 'Logo', exact: true },
189
+ };
190
+ expect(generateLocatorCode(locator)).toBe("page.getByAltText('Logo', { exact: true })");
191
+ });
192
+ it('throws error if text is missing', () => {
193
+ const locator = {
194
+ method: 'getByAltText',
195
+ args: {},
196
+ };
197
+ expect(() => generateLocatorCode(locator)).toThrow('getByAltText requires a text argument');
198
+ });
199
+ });
200
+ describe('getByTitle locators', () => {
201
+ it('generates getByTitle with text', () => {
202
+ const locator = {
203
+ method: 'getByTitle',
204
+ args: { text: 'Settings' },
205
+ };
206
+ expect(generateLocatorCode(locator)).toBe("page.getByTitle('Settings')");
207
+ });
208
+ it('generates getByTitle with exact option', () => {
209
+ const locator = {
210
+ method: 'getByTitle',
211
+ args: { text: 'Close', exact: false },
212
+ };
213
+ expect(generateLocatorCode(locator)).toBe("page.getByTitle('Close', { exact: false })");
214
+ });
215
+ it('throws error if text is missing', () => {
216
+ const locator = {
217
+ method: 'getByTitle',
218
+ args: {},
219
+ };
220
+ expect(() => generateLocatorCode(locator)).toThrow('getByTitle requires a text argument');
221
+ });
222
+ });
223
+ describe('locator method', () => {
224
+ it('generates locator with selector', () => {
225
+ const locator = {
226
+ method: 'locator',
227
+ args: { selector: 'div.container' },
228
+ };
229
+ expect(generateLocatorCode(locator)).toBe("page.locator('div.container')");
230
+ });
231
+ it('throws error if selector is missing', () => {
232
+ const locator = {
233
+ method: 'locator',
234
+ args: {},
235
+ };
236
+ expect(() => generateLocatorCode(locator)).toThrow('locator requires a selector argument');
237
+ });
238
+ });
239
+ describe('ref-based locators', () => {
240
+ it('generates locator from element ref', () => {
241
+ const locator = { ref: '@e23' };
242
+ expect(generateLocatorCode(locator)).toBe("page.locator('[data-ref=\"@e23\"]')");
243
+ });
244
+ it('escapes special characters in ref', () => {
245
+ const locator = { ref: "@e'23" };
246
+ expect(generateLocatorCode(locator)).toBe("page.locator('[data-ref=\"@e\\'23\"]')");
247
+ });
248
+ });
249
+ describe('chainFirst option', () => {
250
+ it('adds .first() when chainFirst is true', () => {
251
+ const locator = { selector: 'button' };
252
+ expect(generateLocatorCode(locator, { chainFirst: true })).toBe("page.locator('button').first()");
253
+ });
254
+ it('works with method-based locators', () => {
255
+ const locator = {
256
+ method: 'getByRole',
257
+ args: { role: 'button' },
258
+ };
259
+ expect(generateLocatorCode(locator, { chainFirst: true })).toBe("page.getByRole('button').first()");
260
+ });
261
+ it('does not add .first() when chainFirst is false', () => {
262
+ const locator = { selector: 'button' };
263
+ expect(generateLocatorCode(locator, { chainFirst: false })).toBe("page.locator('button')");
264
+ });
265
+ });
266
+ describe('nth handling', () => {
267
+ it('adds .first() when nth is 0', () => {
268
+ const locator = { selector: 'button' };
269
+ expect(generateLocatorCode(locator, { nth: 0 })).toBe("page.locator('button').first()");
270
+ });
271
+ it('adds .last() when nth is -1', () => {
272
+ const locator = { selector: 'button' };
273
+ expect(generateLocatorCode(locator, { nth: -1 })).toBe("page.locator('button').last()");
274
+ });
275
+ it('adds .nth(n) for positive indices', () => {
276
+ const locator = { selector: 'button' };
277
+ expect(generateLocatorCode(locator, { nth: 2 })).toBe("page.locator('button').nth(2)");
278
+ });
279
+ it('adds .nth(n) for negative indices other than -1', () => {
280
+ const locator = { selector: 'button' };
281
+ expect(generateLocatorCode(locator, { nth: -2 })).toBe("page.locator('button').nth(-2)");
282
+ });
283
+ it('works with method-based locators', () => {
284
+ const locator = {
285
+ method: 'getByRole',
286
+ args: { role: 'listitem' },
287
+ };
288
+ expect(generateLocatorCode(locator, { nth: 3 })).toBe("page.getByRole('listitem').nth(3)");
289
+ });
290
+ it('nth takes precedence over chainFirst', () => {
291
+ const locator = { selector: 'button' };
292
+ // When nth is specified, it should use nth handling, not chainFirst
293
+ expect(generateLocatorCode(locator, { nth: 2, chainFirst: true })).toBe("page.locator('button').nth(2)");
294
+ });
295
+ });
296
+ describe('scoping (within)', () => {
297
+ it('chains parent locator before main locator', () => {
298
+ const parent = {
299
+ method: 'getByTestId',
300
+ args: { testId: 'form' },
301
+ };
302
+ const locator = {
303
+ method: 'getByRole',
304
+ args: { role: 'button' },
305
+ };
306
+ expect(generateLocatorCode(locator, { within: parent })).toBe("page.getByTestId('form').getByRole('button')");
307
+ });
308
+ it('handles nested scoping with CSS selector parent', () => {
309
+ const parent = { selector: '.dialog' };
310
+ const locator = {
311
+ method: 'getByText',
312
+ args: { text: 'Close' },
313
+ };
314
+ expect(generateLocatorCode(locator, { within: parent })).toBe("page.locator('.dialog').getByText('Close')");
315
+ });
316
+ it('combines scoping with nth', () => {
317
+ const parent = {
318
+ method: 'getByTestId',
319
+ args: { testId: 'list' },
320
+ };
321
+ const locator = {
322
+ method: 'getByRole',
323
+ args: { role: 'listitem' },
324
+ };
325
+ expect(generateLocatorCode(locator, { within: parent, nth: 0 })).toBe("page.getByTestId('list').getByRole('listitem').first()");
326
+ });
327
+ it('respects custom pageVar with within', () => {
328
+ const parent = {
329
+ method: 'getByTestId',
330
+ args: { testId: 'modal' },
331
+ };
332
+ const locator = {
333
+ method: 'getByRole',
334
+ args: { role: 'button', name: 'Close' },
335
+ };
336
+ expect(generateLocatorCode(locator, { within: parent, pageVar: 'frame' })).toBe("frame.getByTestId('modal').getByRole('button', { name: 'Close' })");
337
+ });
338
+ });
339
+ describe('error handling', () => {
340
+ it('throws error for locator without method, selector, or ref', () => {
341
+ const locator = {};
342
+ expect(() => generateLocatorCode(locator)).toThrow('LocatorObject must have either method+args, selector, or ref');
343
+ });
344
+ it('throws error for unknown locator method', () => {
345
+ const locator = {
346
+ method: 'unknownMethod',
347
+ args: {},
348
+ };
349
+ expect(() => generateLocatorCode(locator)).toThrow('Unknown locator method: unknownMethod');
350
+ });
351
+ });
352
+ });
353
+ describe('resolveLocatorCode', () => {
354
+ it('uses method-based locator when available', () => {
355
+ const locator = {
356
+ method: 'getByRole',
357
+ args: { role: 'button' },
358
+ };
359
+ expect(resolveLocatorCode(locator, 'button.fallback')).toBe("page.getByRole('button')");
360
+ });
361
+ it('uses selector from locator when method not available', () => {
362
+ const locator = { selector: 'button.primary' };
363
+ expect(resolveLocatorCode(locator, 'button.fallback')).toBe("page.locator('button.primary')");
364
+ });
365
+ it('uses fallback selector when locator has no method or selector', () => {
366
+ expect(resolveLocatorCode(undefined, 'button.fallback')).toBe("page.locator('button.fallback')");
367
+ });
368
+ it('throws error when no locator or fallback available', () => {
369
+ expect(() => resolveLocatorCode(undefined, undefined)).toThrow('No locator or selector available');
370
+ });
371
+ it('passes options through', () => {
372
+ const locator = { selector: 'button' };
373
+ expect(resolveLocatorCode(locator, undefined, { pageVar: 'frame', chainFirst: true })).toBe("frame.locator('button').first()");
374
+ });
375
+ });
376
+ describe('helper functions', () => {
377
+ describe('selectorToLocator', () => {
378
+ it('creates locator from selector string', () => {
379
+ const locator = selectorToLocator('button.primary');
380
+ expect(locator).toEqual({ selector: 'button.primary' });
381
+ });
382
+ });
383
+ describe('roleLocator', () => {
384
+ it('creates locator for getByRole with just role', () => {
385
+ const locator = roleLocator('button');
386
+ expect(locator).toEqual({
387
+ method: 'getByRole',
388
+ args: { role: 'button' },
389
+ });
390
+ });
391
+ it('creates locator for getByRole with options', () => {
392
+ const locator = roleLocator('button', { name: 'Submit', exact: true });
393
+ expect(locator).toEqual({
394
+ method: 'getByRole',
395
+ args: { role: 'button', name: 'Submit', exact: true },
396
+ });
397
+ });
398
+ });
399
+ describe('textLocator', () => {
400
+ it('creates locator for getByText with just text', () => {
401
+ const locator = textLocator('Hello');
402
+ expect(locator).toEqual({
403
+ method: 'getByText',
404
+ args: { text: 'Hello' },
405
+ });
406
+ });
407
+ it('creates locator for getByText with options', () => {
408
+ const locator = textLocator('Hello', { exact: true });
409
+ expect(locator).toEqual({
410
+ method: 'getByText',
411
+ args: { text: 'Hello', exact: true },
412
+ });
413
+ });
414
+ });
415
+ describe('testIdLocator', () => {
416
+ it('creates locator for getByTestId', () => {
417
+ const locator = testIdLocator('submit-btn');
418
+ expect(locator).toEqual({
419
+ method: 'getByTestId',
420
+ args: { testId: 'submit-btn' },
421
+ });
422
+ });
423
+ });
424
+ });
425
+ //# sourceMappingURL=locator-emit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locator-emit.test.js","sourceRoot":"","sources":["../src/locator-emit.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAKhD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACtB,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;YAC9D,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC;YACnE,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACtD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzB,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE;aACxD,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACvC,6DAA6D,CAC9D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE;aAC9C,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACvC,qDAAqD,CACtD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzB,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;aAC9B,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;aACrC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE;aACT,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aACxB,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;aACzC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,EAAE;aACT,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;aACjC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;aACtC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACvC,kDAAkD,CACnD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE,EAAE;aACT,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAChD,2CAA2C,CAC5C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;aAClC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;aAChC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,EAAE;aACT,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;QAC/F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,cAAc;gBACtB,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;aAC/B,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,cAAc;gBACtB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;aACpC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,cAAc;gBACtB,IAAI,EAAE,EAAE;aACT,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aAC3B,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;aACtC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,EAAE;aACT,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;aACpC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,EAAE;aACT,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,OAAO,GAAkB,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;YAC/C,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;YAChD,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACtD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7D,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzB,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7D,kCAAkC,CACnC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACtD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACtD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACtD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACtD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACtD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aAC3B,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACnD,mCAAmC,CACpC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACtD,oEAAoE;YACpE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACrE,+BAA+B,CAChC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;aACzB,CAAC;YACF,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzB,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAC3D,8CAA8C,CAC/C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,MAAM,GAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YACtD,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aACxB,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAC3D,4CAA4C,CAC7C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;aACzB,CAAC;YACF,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aAC3B,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACnE,wDAAwD,CACzD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;aAC1B,CAAC;YACF,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;aACxC,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7E,mEAAmE,CACpE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,OAAO,GAAkB,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAChD,8DAA8D,CAC/D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,eAAsB;gBAC9B,IAAI,EAAE,EAAE;aACT,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAkB;YAC7B,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SACzB,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;QAC9D,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAC3D,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAC5D,kCAAkC,CACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACzF,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;aACtD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aACxB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;aACrC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * playwright-ts.ts
3
+ * Main TypeScript test generator for Playwright.
4
+ */
5
+ import type { ExplorationLockfile, GeneratedTest, ReviewData } from '@browserflow-ai/core';
6
+ /**
7
+ * Options for test generation.
8
+ */
9
+ export interface TestGeneratorOptions {
10
+ /** Include baseline screenshot comparisons */
11
+ includeVisualChecks?: boolean;
12
+ /** Directory for baseline screenshots */
13
+ baselinesDir?: string;
14
+ /** Include step comments */
15
+ includeComments?: boolean;
16
+ /** Custom test template */
17
+ template?: string;
18
+ /** Test timeout in ms */
19
+ timeout?: number;
20
+ }
21
+ /**
22
+ * PlaywrightGenerator - Converts exploration lockfiles to Playwright tests.
23
+ */
24
+ export declare class PlaywrightGenerator {
25
+ private readonly options;
26
+ private readonly template;
27
+ constructor(options?: TestGeneratorOptions);
28
+ /**
29
+ * Generates a Playwright test file from an exploration lockfile.
30
+ */
31
+ generate(lockfile: ExplorationLockfile, review?: ReviewData): GeneratedTest;
32
+ /**
33
+ * Generates a test description from the spec name.
34
+ */
35
+ private generateTestDescription;
36
+ /**
37
+ * Generates code for all steps.
38
+ */
39
+ private generateSteps;
40
+ /**
41
+ * Generates code for a single step wrapped in test.step().
42
+ */
43
+ private generateStepCode;
44
+ /**
45
+ * Describes an action for comments.
46
+ */
47
+ private describeAction;
48
+ /**
49
+ * Generates code for a specific action.
50
+ */
51
+ private generateActionCode;
52
+ /**
53
+ * Generates click action code.
54
+ */
55
+ private generateClickCode;
56
+ /**
57
+ * Generates navigate action code.
58
+ */
59
+ private generateNavigateCode;
60
+ /**
61
+ * Generates fill action code.
62
+ */
63
+ private generateFillCode;
64
+ /**
65
+ * Generates type action code.
66
+ */
67
+ private generateTypeCode;
68
+ /**
69
+ * Generates wait action code.
70
+ */
71
+ private generateWaitCode;
72
+ /**
73
+ * Generates screenshot action code.
74
+ */
75
+ private generateScreenshotCode;
76
+ /**
77
+ * Generates verify_state action code.
78
+ */
79
+ private generateVerifyCode;
80
+ /**
81
+ * Generates select action code.
82
+ */
83
+ private generateSelectCode;
84
+ /**
85
+ * Generates check/uncheck action code.
86
+ */
87
+ private generateCheckCode;
88
+ /**
89
+ * Generates code for outcome checks.
90
+ */
91
+ private generateOutcomeChecks;
92
+ }
93
+ /**
94
+ * Convenience function to generate a test from a lockfile.
95
+ */
96
+ export declare function generateTest(lockfile: ExplorationLockfile, options?: TestGeneratorOptions, review?: ReviewData): GeneratedTest;
97
+ //# sourceMappingURL=playwright-ts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-ts.d.ts","sourceRoot":"","sources":["../src/playwright-ts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,aAAa,EACb,UAAU,EAEX,MAAM,sBAAsB,CAAC;AAS9B;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAoCD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;gBAE1C,OAAO,GAAE,oBAAyB;IAY9C;;OAEG;IACH,QAAQ,CACN,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,CAAC,EAAE,UAAU,GAClB,aAAa;IAyBhB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAQ/B;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA4D1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyCxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkD1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAU9B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,CAAC,EAAE,oBAAoB,EAC9B,MAAM,CAAC,EAAE,UAAU,GAClB,aAAa,CAGf"}