@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.
- package/dist/config-emit.d.ts +41 -0
- package/dist/config-emit.d.ts.map +1 -0
- package/dist/config-emit.js +191 -0
- package/dist/config-emit.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/locator-emit.d.ts +76 -0
- package/dist/locator-emit.d.ts.map +1 -0
- package/dist/locator-emit.js +239 -0
- package/dist/locator-emit.js.map +1 -0
- package/dist/locator-emit.test.d.ts +6 -0
- package/dist/locator-emit.test.d.ts.map +1 -0
- package/dist/locator-emit.test.js +425 -0
- package/dist/locator-emit.test.js.map +1 -0
- package/dist/playwright-ts.d.ts +97 -0
- package/dist/playwright-ts.d.ts.map +1 -0
- package/dist/playwright-ts.js +373 -0
- package/dist/playwright-ts.js.map +1 -0
- package/dist/playwright-ts.test.d.ts +6 -0
- package/dist/playwright-ts.test.d.ts.map +1 -0
- package/dist/playwright-ts.test.js +548 -0
- package/dist/playwright-ts.test.js.map +1 -0
- package/dist/visual-checks.d.ts +76 -0
- package/dist/visual-checks.d.ts.map +1 -0
- package/dist/visual-checks.js +195 -0
- package/dist/visual-checks.js.map +1 -0
- package/dist/visual-checks.test.d.ts +6 -0
- package/dist/visual-checks.test.d.ts.map +1 -0
- package/dist/visual-checks.test.js +188 -0
- package/dist/visual-checks.test.js.map +1 -0
- package/package.json +34 -0
- package/src/config-emit.ts +253 -0
- package/src/index.ts +57 -0
- package/src/locator-emit.test.ts +533 -0
- package/src/locator-emit.ts +310 -0
- package/src/playwright-ts.test.ts +704 -0
- package/src/playwright-ts.ts +519 -0
- package/src/visual-checks.test.ts +232 -0
- package/src/visual-checks.ts +294 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-checks.d.ts","sourceRoot":"","sources":["../src/visual-checks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;IACpB,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAClC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,iBAAiB,EAC1B,WAAW,GAAE,sBAA2B,GACvC,MAAM,CAyBR;AAED;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,iBAAiB,EAC1B,WAAW,GAAE,sBAA2B,GACvC,MAAM,CAyBR;AAoED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,iBAAiB,EAC1B,WAAW,GAAE,sBAA2B,GACvC,MAAM,CAqCR;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,SAAS,GAAG,MAAM,CAIlE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,SAAS,GACf,MAAM,CAyBR"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* visual-checks.ts
|
|
3
|
+
* Generates Playwright screenshot assertion code.
|
|
4
|
+
*/
|
|
5
|
+
import { escapeString } from './locator-emit.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generates code for a Playwright toHaveScreenshot assertion.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* generateScreenshotAssertion({ name: 'homepage' })
|
|
11
|
+
* // Returns: "await expect(page).toHaveScreenshot('homepage.png');"
|
|
12
|
+
*/
|
|
13
|
+
export function generateScreenshotAssertion(options, emitOptions = {}) {
|
|
14
|
+
const { pageVar = 'page', includeComments = false } = emitOptions;
|
|
15
|
+
const lines = [];
|
|
16
|
+
if (includeComments && options.name) {
|
|
17
|
+
lines.push(`// Visual check: ${options.name}`);
|
|
18
|
+
}
|
|
19
|
+
const screenshotName = options.name.endsWith('.png')
|
|
20
|
+
? options.name
|
|
21
|
+
: `${options.name}.png`;
|
|
22
|
+
const assertionOptions = buildAssertionOptions(options, pageVar);
|
|
23
|
+
if (assertionOptions) {
|
|
24
|
+
lines.push(`await expect(${pageVar}).toHaveScreenshot('${escapeString(screenshotName)}', ${assertionOptions});`);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
lines.push(`await expect(${pageVar}).toHaveScreenshot('${escapeString(screenshotName)}');`);
|
|
28
|
+
}
|
|
29
|
+
return lines.join('\n');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generates code for an element-specific screenshot assertion.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* generateElementScreenshotAssertion("page.locator('.card')", { name: 'card' })
|
|
36
|
+
* // Returns: "await expect(page.locator('.card')).toHaveScreenshot('card.png');"
|
|
37
|
+
*/
|
|
38
|
+
export function generateElementScreenshotAssertion(locatorCode, options, emitOptions = {}) {
|
|
39
|
+
const { pageVar = 'page', includeComments = false } = emitOptions;
|
|
40
|
+
const lines = [];
|
|
41
|
+
if (includeComments && options.name) {
|
|
42
|
+
lines.push(`// Visual check (element): ${options.name}`);
|
|
43
|
+
}
|
|
44
|
+
const screenshotName = options.name.endsWith('.png')
|
|
45
|
+
? options.name
|
|
46
|
+
: `${options.name}.png`;
|
|
47
|
+
const assertionOptions = buildAssertionOptions(options, pageVar);
|
|
48
|
+
if (assertionOptions) {
|
|
49
|
+
lines.push(`await expect(${locatorCode}).toHaveScreenshot('${escapeString(screenshotName)}', ${assertionOptions});`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
lines.push(`await expect(${locatorCode}).toHaveScreenshot('${escapeString(screenshotName)}');`);
|
|
53
|
+
}
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Builds the options object string for toHaveScreenshot.
|
|
58
|
+
*/
|
|
59
|
+
function buildAssertionOptions(options, pageVar = 'page') {
|
|
60
|
+
const parts = [];
|
|
61
|
+
if (options.maxDiffPixelRatio !== undefined) {
|
|
62
|
+
parts.push(`maxDiffPixelRatio: ${options.maxDiffPixelRatio}`);
|
|
63
|
+
}
|
|
64
|
+
if (options.threshold !== undefined) {
|
|
65
|
+
parts.push(`threshold: ${options.threshold}`);
|
|
66
|
+
}
|
|
67
|
+
if (options.animations) {
|
|
68
|
+
parts.push(`animations: '${options.animations}'`);
|
|
69
|
+
}
|
|
70
|
+
if (options.fullPage !== undefined) {
|
|
71
|
+
parts.push(`fullPage: ${options.fullPage}`);
|
|
72
|
+
}
|
|
73
|
+
if (options.timeout !== undefined) {
|
|
74
|
+
parts.push(`timeout: ${options.timeout}`);
|
|
75
|
+
}
|
|
76
|
+
if (options.mask && options.mask.length > 0) {
|
|
77
|
+
const maskCode = generateMaskArray(options.mask, pageVar);
|
|
78
|
+
parts.push(`mask: ${maskCode}`);
|
|
79
|
+
}
|
|
80
|
+
if (parts.length === 0) {
|
|
81
|
+
return '';
|
|
82
|
+
}
|
|
83
|
+
return `{ ${parts.join(', ')} }`;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Generates code for a mask array.
|
|
87
|
+
*/
|
|
88
|
+
function generateMaskArray(masks, pageVar = 'page') {
|
|
89
|
+
let regionMaskIndex = 0;
|
|
90
|
+
const maskItems = masks
|
|
91
|
+
.map((mask) => {
|
|
92
|
+
if (mask.selector) {
|
|
93
|
+
return `${pageVar}.locator('${escapeString(mask.selector)}')`;
|
|
94
|
+
}
|
|
95
|
+
if (mask.region) {
|
|
96
|
+
// Create reference to overlay element that will be injected
|
|
97
|
+
const selector = `[data-bf-mask="${regionMaskIndex}"]`;
|
|
98
|
+
const locatorCode = `${pageVar}.locator('${escapeString(selector)}')`;
|
|
99
|
+
regionMaskIndex++;
|
|
100
|
+
return locatorCode;
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
})
|
|
104
|
+
.filter((item) => item !== null);
|
|
105
|
+
if (maskItems.length === 0) {
|
|
106
|
+
return '[]';
|
|
107
|
+
}
|
|
108
|
+
return `[${maskItems.join(', ')}]`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generates a screenshot capture statement (not an assertion).
|
|
112
|
+
*/
|
|
113
|
+
export function generateScreenshotCapture(options, emitOptions = {}) {
|
|
114
|
+
const { pageVar = 'page', baselinesPath, includeComments = false } = emitOptions;
|
|
115
|
+
const lines = [];
|
|
116
|
+
if (includeComments && options.name) {
|
|
117
|
+
lines.push(`// Capture screenshot: ${options.name}`);
|
|
118
|
+
}
|
|
119
|
+
const screenshotName = options.name.endsWith('.png')
|
|
120
|
+
? options.name
|
|
121
|
+
: `${options.name}.png`;
|
|
122
|
+
const path = baselinesPath
|
|
123
|
+
? `${baselinesPath}/${screenshotName}`
|
|
124
|
+
: screenshotName;
|
|
125
|
+
const captureOptions = [];
|
|
126
|
+
captureOptions.push(`path: '${escapeString(path)}'`);
|
|
127
|
+
if (options.fullPage !== undefined) {
|
|
128
|
+
captureOptions.push(`fullPage: ${options.fullPage}`);
|
|
129
|
+
}
|
|
130
|
+
if (options.animations) {
|
|
131
|
+
captureOptions.push(`animations: '${options.animations}'`);
|
|
132
|
+
}
|
|
133
|
+
if (options.mask && options.mask.length > 0) {
|
|
134
|
+
const maskCode = generateMaskArray(options.mask, pageVar);
|
|
135
|
+
captureOptions.push(`mask: ${maskCode}`);
|
|
136
|
+
}
|
|
137
|
+
lines.push(`await ${pageVar}.screenshot({ ${captureOptions.join(', ')} });`);
|
|
138
|
+
return lines.join('\n');
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Generates code for comparing two screenshot paths.
|
|
142
|
+
* This is useful for custom comparison logic outside of Playwright's built-in assertions.
|
|
143
|
+
*/
|
|
144
|
+
export function generateScreenshotCompare(actualPath, expectedPath, options = {}) {
|
|
145
|
+
const { threshold = 0.05 } = options;
|
|
146
|
+
return `
|
|
147
|
+
// Compare screenshots
|
|
148
|
+
const actualBuffer = await fs.readFile('${escapeString(actualPath)}');
|
|
149
|
+
const expectedBuffer = await fs.readFile('${escapeString(expectedPath)}');
|
|
150
|
+
const { diffPixelRatio } = await compareImages(actualBuffer, expectedBuffer);
|
|
151
|
+
expect(diffPixelRatio).toBeLessThanOrEqual(${threshold});
|
|
152
|
+
`.trim();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Generates a helper import statement for visual comparisons.
|
|
156
|
+
*/
|
|
157
|
+
export function generateVisualImports() {
|
|
158
|
+
return `import { expect } from '@playwright/test';`;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Generates wait-for-animations code before taking a screenshot.
|
|
162
|
+
*/
|
|
163
|
+
export function generateWaitForAnimations(pageVar = 'page') {
|
|
164
|
+
return `// Wait for animations to complete
|
|
165
|
+
await ${pageVar}.waitForLoadState('networkidle');
|
|
166
|
+
await ${pageVar}.waitForTimeout(500);`;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Generates code to inject overlay elements for region-based masks.
|
|
170
|
+
* Returns empty string if no region masks are present.
|
|
171
|
+
*/
|
|
172
|
+
export function generateMaskSetupCode(masks, pageVar = 'page') {
|
|
173
|
+
// Filter to only region-based masks
|
|
174
|
+
const regionMasks = masks.filter((m) => m.region);
|
|
175
|
+
if (regionMasks.length === 0) {
|
|
176
|
+
return '';
|
|
177
|
+
}
|
|
178
|
+
// Generate individual injection statements for each region mask
|
|
179
|
+
// Each block is wrapped in its own scope to reuse variable name 'div'
|
|
180
|
+
const injectionStatements = regionMasks
|
|
181
|
+
.map((mask, index) => {
|
|
182
|
+
const r = mask.region;
|
|
183
|
+
return ` {
|
|
184
|
+
const div = document.createElement('div');
|
|
185
|
+
div.setAttribute('data-bf-mask', '${index}');
|
|
186
|
+
div.style.cssText = 'position:fixed;left:${r.x}%;top:${r.y}%;width:${r.width}%;height:${r.height}%;pointer-events:none;z-index:99999';
|
|
187
|
+
document.body.appendChild(div);
|
|
188
|
+
}`;
|
|
189
|
+
})
|
|
190
|
+
.join('\n');
|
|
191
|
+
return `await ${pageVar}.evaluate(() => {
|
|
192
|
+
${injectionStatements}
|
|
193
|
+
});`;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=visual-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-checks.js","sourceRoot":"","sources":["../src/visual-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-checks.test.d.ts","sourceRoot":"","sources":["../src/visual-checks.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* visual-checks.test.ts
|
|
3
|
+
* Tests for visual check code generation, including region mask support.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect } from 'bun:test';
|
|
6
|
+
import { generateScreenshotAssertion, generateScreenshotCapture, generateMaskSetupCode, } from './visual-checks.js';
|
|
7
|
+
describe('visual-checks', () => {
|
|
8
|
+
describe('generateScreenshotAssertion', () => {
|
|
9
|
+
it('generates basic screenshot assertion without masks', () => {
|
|
10
|
+
const result = generateScreenshotAssertion({ name: 'homepage' });
|
|
11
|
+
expect(result).toContain("await expect(page).toHaveScreenshot('homepage.png');");
|
|
12
|
+
});
|
|
13
|
+
it('generates screenshot assertion with selector-based mask', () => {
|
|
14
|
+
const masks = [
|
|
15
|
+
{ selector: '.timestamp', reason: 'Dynamic timestamp' },
|
|
16
|
+
];
|
|
17
|
+
const result = generateScreenshotAssertion({ name: 'homepage', mask: masks });
|
|
18
|
+
expect(result).toContain("mask: [page.locator('.timestamp')]");
|
|
19
|
+
});
|
|
20
|
+
it('generates screenshot assertion with region-based mask', () => {
|
|
21
|
+
const masks = [
|
|
22
|
+
{
|
|
23
|
+
region: { x: 10, y: 20, width: 100, height: 50 },
|
|
24
|
+
reason: 'Dynamic ad section',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
const result = generateScreenshotAssertion({ name: 'homepage', mask: masks });
|
|
28
|
+
// Should generate overlay element reference
|
|
29
|
+
expect(result).toContain("mask: [page.locator('[data-bf-mask=\"0\"]')]");
|
|
30
|
+
});
|
|
31
|
+
it('generates screenshot assertion with mixed masks', () => {
|
|
32
|
+
const masks = [
|
|
33
|
+
{ selector: '.timestamp' },
|
|
34
|
+
{ region: { x: 10, y: 20, width: 100, height: 50 } },
|
|
35
|
+
{ selector: '.user-avatar' },
|
|
36
|
+
{ region: { x: 80, y: 5, width: 15, height: 10 } },
|
|
37
|
+
];
|
|
38
|
+
const result = generateScreenshotAssertion({ name: 'dashboard', mask: masks });
|
|
39
|
+
// Should include both selector and region masks
|
|
40
|
+
expect(result).toContain("page.locator('.timestamp')");
|
|
41
|
+
expect(result).toContain("page.locator('[data-bf-mask=\"0\"]')");
|
|
42
|
+
expect(result).toContain("page.locator('.user-avatar')");
|
|
43
|
+
expect(result).toContain("page.locator('[data-bf-mask=\"1\"]')");
|
|
44
|
+
});
|
|
45
|
+
it('handles empty mask array', () => {
|
|
46
|
+
const result = generateScreenshotAssertion({ name: 'page', mask: [] });
|
|
47
|
+
// Should not include mask option when array is empty
|
|
48
|
+
expect(result).not.toContain('mask:');
|
|
49
|
+
});
|
|
50
|
+
it('uses correct page variable for masks', () => {
|
|
51
|
+
const masks = [
|
|
52
|
+
{ selector: '.dynamic-content' },
|
|
53
|
+
];
|
|
54
|
+
const result = generateScreenshotAssertion({ name: 'test', mask: masks }, { pageVar: 'customPage' });
|
|
55
|
+
expect(result).toContain("customPage.locator('.dynamic-content')");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('generateScreenshotCapture', () => {
|
|
59
|
+
it('generates capture with selector-based mask', () => {
|
|
60
|
+
const masks = [
|
|
61
|
+
{ selector: '.timestamp' },
|
|
62
|
+
];
|
|
63
|
+
const result = generateScreenshotCapture({ name: 'capture', mask: masks });
|
|
64
|
+
expect(result).toContain("mask: [page.locator('.timestamp')]");
|
|
65
|
+
});
|
|
66
|
+
it('generates capture with region-based mask', () => {
|
|
67
|
+
const masks = [
|
|
68
|
+
{ region: { x: 25, y: 30, width: 40, height: 20 } },
|
|
69
|
+
];
|
|
70
|
+
const result = generateScreenshotCapture({ name: 'capture', mask: masks });
|
|
71
|
+
expect(result).toContain("mask: [page.locator('[data-bf-mask=\"0\"]')]");
|
|
72
|
+
});
|
|
73
|
+
it('generates capture with mixed masks', () => {
|
|
74
|
+
const masks = [
|
|
75
|
+
{ selector: '.header' },
|
|
76
|
+
{ region: { x: 0, y: 90, width: 100, height: 10 } },
|
|
77
|
+
];
|
|
78
|
+
const result = generateScreenshotCapture({ name: 'capture', mask: masks });
|
|
79
|
+
expect(result).toContain("page.locator('.header')");
|
|
80
|
+
expect(result).toContain("page.locator('[data-bf-mask=\"0\"]')");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('generateMaskSetupCode', () => {
|
|
84
|
+
it('generates no setup code when no region masks present', () => {
|
|
85
|
+
const masks = [
|
|
86
|
+
{ selector: '.timestamp' },
|
|
87
|
+
{ selector: '.user-avatar' },
|
|
88
|
+
];
|
|
89
|
+
const result = generateMaskSetupCode(masks);
|
|
90
|
+
expect(result).toBe('');
|
|
91
|
+
});
|
|
92
|
+
it('generates overlay injection for single region mask', () => {
|
|
93
|
+
const masks = [
|
|
94
|
+
{ region: { x: 10, y: 20, width: 100, height: 50 } },
|
|
95
|
+
];
|
|
96
|
+
const result = generateMaskSetupCode(masks);
|
|
97
|
+
// Should inject overlay element with correct positioning
|
|
98
|
+
expect(result).toContain('await page.evaluate');
|
|
99
|
+
expect(result).toContain('document.createElement');
|
|
100
|
+
expect(result).toContain("div.setAttribute('data-bf-mask'");
|
|
101
|
+
expect(result).toContain('left:10%');
|
|
102
|
+
expect(result).toContain('top:20%');
|
|
103
|
+
expect(result).toContain('width:100%');
|
|
104
|
+
expect(result).toContain('height:50%');
|
|
105
|
+
expect(result).toContain('position:fixed');
|
|
106
|
+
expect(result).toContain('pointer-events:none');
|
|
107
|
+
expect(result).toContain('z-index:99999');
|
|
108
|
+
expect(result).toContain('document.body.appendChild');
|
|
109
|
+
});
|
|
110
|
+
it('generates overlay injection for multiple region masks', () => {
|
|
111
|
+
const masks = [
|
|
112
|
+
{ selector: '.header' },
|
|
113
|
+
{ region: { x: 10, y: 20, width: 30, height: 40 } },
|
|
114
|
+
{ region: { x: 80, y: 5, width: 15, height: 10 } },
|
|
115
|
+
{ selector: '.footer' },
|
|
116
|
+
];
|
|
117
|
+
const result = generateMaskSetupCode(masks);
|
|
118
|
+
// Should only process region masks (indices 0 and 1 for regions)
|
|
119
|
+
expect(result).toContain('await page.evaluate');
|
|
120
|
+
expect(result).toContain('left:10%');
|
|
121
|
+
expect(result).toContain('top:20%');
|
|
122
|
+
expect(result).toContain('left:80%');
|
|
123
|
+
expect(result).toContain('top:5%');
|
|
124
|
+
// Should create two overlay elements
|
|
125
|
+
expect((result.match(/data-bf-mask/g) || []).length).toBe(2);
|
|
126
|
+
});
|
|
127
|
+
it('uses correct data attribute indices for region masks', () => {
|
|
128
|
+
const masks = [
|
|
129
|
+
{ region: { x: 0, y: 0, width: 50, height: 50 } }, // index 0
|
|
130
|
+
{ selector: '.selector1' }, // not counted
|
|
131
|
+
{ region: { x: 50, y: 50, width: 50, height: 50 } }, // index 1
|
|
132
|
+
{ selector: '.selector2' }, // not counted
|
|
133
|
+
{ region: { x: 25, y: 25, width: 50, height: 50 } }, // index 2
|
|
134
|
+
];
|
|
135
|
+
const result = generateMaskSetupCode(masks);
|
|
136
|
+
// Should use indices 0, 1, 2 for the three region masks
|
|
137
|
+
expect(result).toContain("'data-bf-mask', '0'");
|
|
138
|
+
expect(result).toContain("'data-bf-mask', '1'");
|
|
139
|
+
expect(result).toContain("'data-bf-mask', '2'");
|
|
140
|
+
});
|
|
141
|
+
it('handles empty mask array', () => {
|
|
142
|
+
const result = generateMaskSetupCode([]);
|
|
143
|
+
expect(result).toBe('');
|
|
144
|
+
});
|
|
145
|
+
it('uses custom page variable when provided', () => {
|
|
146
|
+
const masks = [
|
|
147
|
+
{ region: { x: 10, y: 20, width: 30, height: 40 } },
|
|
148
|
+
];
|
|
149
|
+
const result = generateMaskSetupCode(masks, 'customPage');
|
|
150
|
+
expect(result).toContain('await customPage.evaluate');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe('mask array generation edge cases', () => {
|
|
154
|
+
it('preserves order of mixed masks', () => {
|
|
155
|
+
const masks = [
|
|
156
|
+
{ selector: '.first' },
|
|
157
|
+
{ region: { x: 10, y: 10, width: 10, height: 10 } },
|
|
158
|
+
{ selector: '.second' },
|
|
159
|
+
{ region: { x: 20, y: 20, width: 20, height: 20 } },
|
|
160
|
+
{ selector: '.third' },
|
|
161
|
+
];
|
|
162
|
+
const result = generateScreenshotAssertion({ name: 'test', mask: masks });
|
|
163
|
+
// Should maintain order in mask array
|
|
164
|
+
// Use greedy match to handle attribute selectors with brackets
|
|
165
|
+
const maskArrayMatch = result.match(/mask: \[(.*)\]/s);
|
|
166
|
+
expect(maskArrayMatch).toBeTruthy();
|
|
167
|
+
const maskArray = maskArrayMatch[1];
|
|
168
|
+
const firstIndex = maskArray.indexOf("'.first'");
|
|
169
|
+
const secondIndex = maskArray.indexOf('[data-bf-mask="0"]');
|
|
170
|
+
const thirdIndex = maskArray.indexOf("'.second'");
|
|
171
|
+
const fourthIndex = maskArray.indexOf('[data-bf-mask="1"]');
|
|
172
|
+
const fifthIndex = maskArray.indexOf("'.third'");
|
|
173
|
+
expect(firstIndex).toBeLessThan(secondIndex);
|
|
174
|
+
expect(secondIndex).toBeLessThan(thirdIndex);
|
|
175
|
+
expect(thirdIndex).toBeLessThan(fourthIndex);
|
|
176
|
+
expect(fourthIndex).toBeLessThan(fifthIndex);
|
|
177
|
+
});
|
|
178
|
+
it('escapes special characters in selector masks', () => {
|
|
179
|
+
const masks = [
|
|
180
|
+
{ selector: "div[data-test='value']" },
|
|
181
|
+
];
|
|
182
|
+
const result = generateScreenshotAssertion({ name: 'test', mask: masks });
|
|
183
|
+
// Should properly escape the selector string
|
|
184
|
+
expect(result).toContain("page.locator('div[data-test=\\'value\\']')");
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
//# sourceMappingURL=visual-checks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-checks.test.js","sourceRoot":"","sources":["../src/visual-checks.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,MAAM,GAAG,2BAA2B,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAEjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sDAAsD,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,KAAK,GAAiB;gBAC1B,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,mBAAmB,EAAE;aACxD,CAAC;YACF,MAAM,MAAM,GAAG,2BAA2B,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE9E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,KAAK,GAAiB;gBAC1B;oBACE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;oBAChD,MAAM,EAAE,oBAAoB;iBAC7B;aACF,CAAC;YACF,MAAM,MAAM,GAAG,2BAA2B,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE9E,4CAA4C;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,KAAK,GAAiB;gBAC1B,EAAE,QAAQ,EAAE,YAAY,EAAE;gBAC1B,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;gBACpD,EAAE,QAAQ,EAAE,cAAc,EAAE;gBAC5B,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;aACnD,CAAC;YACF,MAAM,MAAM,GAAG,2BAA2B,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE/E,gDAAgD;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,MAAM,GAAG,2BAA2B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAEvE,qDAAqD;YACrD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAiB;gBAC1B,EAAE,QAAQ,EAAE,kBAAkB,EAAE;aACjC,CAAC;YACF,MAAM,MAAM,GAAG,2BAA2B,CACxC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAC7B,EAAE,OAAO,EAAE,YAAY,EAAE,CAC1B,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,KAAK,GAAiB;gBAC1B,EAAE,QAAQ,EAAE,YAAY,EAAE;aAC3B,CAAC;YACF,MAAM,MAAM,GAAG,yBAAyB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,KAAK,GAAiB;gBAC1B,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;aACpD,CAAC;YACF,MAAM,MAAM,GAAG,yBAAyB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,KAAK,GAAiB;gBAC1B,EAAE,QAAQ,EAAE,SAAS,EAAE;gBACvB,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;aACpD,CAAC;YACF,MAAM,MAAM,GAAG,yBAAyB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,KAAK,GAAiB;gBAC1B,EAAE,QAAQ,EAAE,YAAY,EAAE;gBAC1B,EAAE,QAAQ,EAAE,cAAc,EAAE;aAC7B,CAAC;YACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,KAAK,GAAiB;gBAC1B,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;aACrD,CAAC;YACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAE5C,yDAAyD;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,KAAK,GAAiB;gBAC1B,EAAE,QAAQ,EAAE,SAAS,EAAE;gBACvB,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;gBACnD,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;gBAClD,EAAE,QAAQ,EAAE,SAAS,EAAE;aACxB,CAAC;YACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAE5C,iEAAiE;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,qCAAqC;YACrC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,KAAK,GAAiB;gBAC1B,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAG,UAAU;gBAC9D,EAAE,QAAQ,EAAE,YAAY,EAAE,EAA0B,cAAc;gBAClE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU;gBAC/D,EAAE,QAAQ,EAAE,YAAY,EAAE,EAA0B,cAAc;gBAClE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU;aAChE,CAAC;YACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAE5C,wDAAwD;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAEzC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAiB;gBAC1B,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;aACpD,CAAC;YACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAE1D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAChD,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAiB;gBAC1B,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBACtB,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;gBACnD,EAAE,QAAQ,EAAE,SAAS,EAAE;gBACvB,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;gBACnD,EAAE,QAAQ,EAAE,QAAQ,EAAE;aACvB,CAAC;YACF,MAAM,MAAM,GAAG,2BAA2B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE1E,sCAAsC;YACtC,+DAA+D;YAC/D,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,CAAC,UAAU,EAAE,CAAC;YAEpC,MAAM,SAAS,GAAG,cAAe,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAEjD,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,KAAK,GAAiB;gBAC1B,EAAE,QAAQ,EAAE,wBAAwB,EAAE;aACvC,CAAC;YACF,MAAM,MAAM,GAAG,2BAA2B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE1E,6CAA6C;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@browserflow-ai/generator",
|
|
3
|
+
"version": "0.0.6",
|
|
4
|
+
"description": "Playwright test generator for BrowserFlow - Human-in-the-Loop E2E Test Generation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/akatz-ai/browserflow.git",
|
|
10
|
+
"directory": "packages/generator"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"import": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"test": "bun test",
|
|
23
|
+
"typecheck": "tsc --noEmit"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"src"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@browserflow-ai/core": "0.0.6",
|
|
31
|
+
"@types/bun": "^1.3.6",
|
|
32
|
+
"handlebars": "^4.7.8"
|
|
33
|
+
}
|
|
34
|
+
}
|