playwriter 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/bippy.js +5 -5
  2. package/dist/cdp-relay.d.ts.map +1 -1
  3. package/dist/cdp-relay.js +17 -5
  4. package/dist/cdp-relay.js.map +1 -1
  5. package/dist/cli-help.test.js +22 -0
  6. package/dist/cli-help.test.js.map +1 -1
  7. package/dist/cli.js +61 -20
  8. package/dist/cli.js.map +1 -1
  9. package/dist/executor.d.ts.map +1 -1
  10. package/dist/executor.js +38 -1
  11. package/dist/executor.js.map +1 -1
  12. package/dist/extension/background.js +322 -52
  13. package/dist/extension/manifest.json +1 -1
  14. package/dist/mcp.d.ts.map +1 -1
  15. package/dist/mcp.js +6 -1
  16. package/dist/mcp.js.map +1 -1
  17. package/dist/performance-examples.d.ts +5 -0
  18. package/dist/performance-examples.d.ts.map +1 -0
  19. package/dist/performance-examples.js +112 -0
  20. package/dist/performance-examples.js.map +1 -0
  21. package/dist/performance-profiling.md +417 -0
  22. package/dist/prompt.md +19 -5
  23. package/dist/react-source.d.ts +44 -0
  24. package/dist/react-source.d.ts.map +1 -1
  25. package/dist/react-source.js +207 -20
  26. package/dist/react-source.js.map +1 -1
  27. package/dist/readability.js +1 -1
  28. package/dist/relay-session.test.js +34 -6
  29. package/dist/relay-session.test.js.map +1 -1
  30. package/dist/screen-recording.d.ts.map +1 -1
  31. package/dist/screen-recording.js +19 -4
  32. package/dist/screen-recording.js.map +1 -1
  33. package/dist/selector-generator.js +1 -1
  34. package/package.json +3 -3
  35. package/src/cdp-relay.ts +17 -5
  36. package/src/cli-help.test.ts +22 -0
  37. package/src/cli.ts +66 -19
  38. package/src/executor.ts +47 -4
  39. package/src/mcp.ts +6 -1
  40. package/src/performance-examples.ts +186 -0
  41. package/src/react-source.ts +310 -24
  42. package/src/relay-session.test.ts +36 -10
  43. package/src/screen-recording.ts +20 -4
  44. package/src/skill.md +30 -6
@@ -6,8 +6,52 @@ export interface ReactSourceLocation {
6
6
  columnNumber: number | null;
7
7
  componentName: string | null;
8
8
  }
9
+ export type ReactSerializedProp = string | number | boolean | null | ReactSerializedProp[] | {
10
+ [key: string]: ReactSerializedProp;
11
+ };
12
+ export interface ReactComponentHierarchyItem {
13
+ componentName: string | null;
14
+ source: Omit<ReactSourceLocation, 'componentName'> | null;
15
+ props: ReactSerializedProp;
16
+ }
17
+ export interface ReactComponentInfo {
18
+ componentName: string | null;
19
+ source: Omit<ReactSourceLocation, 'componentName'> | null;
20
+ hierarchy: ReactComponentHierarchyItem[];
21
+ props: ReactSerializedProp;
22
+ }
23
+ type ReactInspectableValue = string | number | boolean | bigint | symbol | null | undefined | object | ((...args: never[]) => ReactInspectableValue);
24
+ type BrowserElement = object;
25
+ interface BippySourceFrame {
26
+ fileName?: string | null;
27
+ lineNumber?: number | null;
28
+ columnNumber?: number | null;
29
+ functionName?: string | null;
30
+ }
31
+ interface BippyFiber {
32
+ return?: BippyFiber | null;
33
+ type?: ReactInspectableValue;
34
+ memoizedProps?: ReactInspectableValue;
35
+ }
36
+ interface BippyRuntime {
37
+ getFiberFromHostInstance(el: BrowserElement): BippyFiber | null;
38
+ getSource(fiber: BippyFiber): Promise<BippySourceFrame | null>;
39
+ getOwnerStack(fiber: BippyFiber): Promise<BippySourceFrame[]>;
40
+ getDisplayName(type: ReactInspectableValue): string | null;
41
+ isCompositeFiber(fiber: BippyFiber): boolean;
42
+ normalizeFileName(fileName: string): string;
43
+ isSourceFile(fileName: string): boolean;
44
+ }
45
+ declare global {
46
+ var __bippy: BippyRuntime | undefined;
47
+ }
9
48
  export declare function getReactSource({ locator, cdp: cdpSession, }: {
10
49
  locator: Locator | ElementHandle;
11
50
  cdp: ICDPSession;
12
51
  }): Promise<ReactSourceLocation | null>;
52
+ export declare function getReactComponentInfo({ locator, cdp: cdpSession, }: {
53
+ locator: Locator | ElementHandle;
54
+ cdp: ICDPSession;
55
+ }): Promise<ReactComponentInfo | null>;
56
+ export {};
13
57
  //# sourceMappingURL=react-source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-source.d.ts","sourceRoot":"","sources":["../src/react-source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAQ,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAcD,wBAAsB,cAAc,CAAC,EACnC,OAAO,EACP,GAAG,EAAE,UAAU,GAChB,EAAE;IACD,OAAO,EAAE,OAAO,GAAG,aAAa,CAAA;IAChC,GAAG,EAAE,WAAW,CAAA;CACjB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA6DtC"}
1
+ {"version":3,"file":"react-source.d.ts","sourceRoot":"","sources":["../src/react-source.ts"],"names":[],"mappings":"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"}
@@ -11,22 +11,44 @@ function getBippyCode() {
11
11
  bippyCode = fs.readFileSync(bippyPath, 'utf-8');
12
12
  return bippyCode;
13
13
  }
14
- export async function getReactSource({ locator, cdp: cdpSession, }) {
15
- const cdp = cdpSession;
16
- const page = 'page' in locator && typeof locator.page === 'function' ? locator.page() : locator._page;
17
- if (!page) {
18
- throw new Error('Could not get page from locator');
14
+ async function getPageFromTarget(target) {
15
+ if ('page' in target) {
16
+ return target.page();
17
+ }
18
+ const frame = await target.ownerFrame();
19
+ if (!frame) {
20
+ throw new Error('Could not get frame from element handle');
19
21
  }
20
- const hasBippy = await page.evaluate(() => !!globalThis.__bippy);
21
- if (!hasBippy) {
22
- const code = getBippyCode();
23
- await cdp.send('Runtime.evaluate', { expression: code });
22
+ return frame.page();
23
+ }
24
+ async function ensureBippy({ page, cdp }) {
25
+ const hasBippy = await page.evaluate(() => {
26
+ return !!globalThis.__bippy;
27
+ });
28
+ if (hasBippy) {
29
+ return;
24
30
  }
25
- const result = await locator.evaluate(async (el) => {
31
+ const code = getBippyCode();
32
+ await cdp.send('Runtime.evaluate', { expression: code });
33
+ }
34
+ export async function getReactSource({ locator, cdp: cdpSession, }) {
35
+ const cdp = cdpSession;
36
+ const page = await getPageFromTarget(locator);
37
+ await ensureBippy({ page, cdp });
38
+ const evaluateReactSource = async (el) => {
26
39
  const bippy = globalThis.__bippy;
27
40
  if (!bippy) {
28
41
  throw new Error('bippy not loaded');
29
42
  }
43
+ // bippy.normalizeFileName strips "/app-pages-browser/" but not the parenthesized
44
+ // form "/(app-pages-browser)/" that Next.js webpack actually uses. This strips
45
+ // all webpack layer prefixes like (app-pages-browser), (ssr), (rsc), etc.
46
+ const cleanName = (name) => {
47
+ let f = bippy.normalizeFileName(name);
48
+ f = f.replace(/^\/?\([-\w]+\)\//, '');
49
+ f = f.replace(/^\.\//, '');
50
+ return f;
51
+ };
30
52
  const fiber = bippy.getFiberFromHostInstance(el);
31
53
  if (!fiber) {
32
54
  return { _notFound: 'fiber' };
@@ -34,7 +56,7 @@ export async function getReactSource({ locator, cdp: cdpSession, }) {
34
56
  const source = await bippy.getSource(fiber);
35
57
  if (source) {
36
58
  return {
37
- fileName: source.fileName ? bippy.normalizeFileName(source.fileName) : null,
59
+ fileName: source.fileName ? cleanName(source.fileName) : null,
38
60
  lineNumber: source.lineNumber ?? null,
39
61
  columnNumber: source.columnNumber ?? null,
40
62
  componentName: source.functionName ?? bippy.getDisplayName(fiber.type) ?? null,
@@ -44,7 +66,7 @@ export async function getReactSource({ locator, cdp: cdpSession, }) {
44
66
  for (const frame of ownerStack) {
45
67
  if (frame.fileName && bippy.isSourceFile(frame.fileName)) {
46
68
  return {
47
- fileName: bippy.normalizeFileName(frame.fileName),
69
+ fileName: cleanName(frame.fileName),
48
70
  lineNumber: frame.lineNumber ?? null,
49
71
  columnNumber: frame.columnNumber ?? null,
50
72
  componentName: frame.functionName ?? null,
@@ -52,16 +74,181 @@ export async function getReactSource({ locator, cdp: cdpSession, }) {
52
74
  }
53
75
  }
54
76
  return { _notFound: 'source' };
55
- });
56
- if (result && '_notFound' in result) {
57
- if (result._notFound === 'fiber') {
58
- console.warn('[getReactSource] no fiber found - is this a React element?');
77
+ };
78
+ const resolveResult = (result) => {
79
+ if (result?._notFound) {
80
+ if (result._notFound === 'fiber') {
81
+ console.warn('[getReactSource] no fiber found - is this a React element?');
82
+ }
83
+ else {
84
+ console.warn('[getReactSource] no source location found - is this a React dev build?');
85
+ }
86
+ return null;
59
87
  }
60
- else {
61
- console.warn('[getReactSource] no source location found - is this a React dev build?');
88
+ return result;
89
+ };
90
+ if ('page' in locator) {
91
+ return resolveResult(await locator.evaluate(evaluateReactSource));
92
+ }
93
+ return resolveResult(await locator.evaluate(evaluateReactSource));
94
+ }
95
+ export async function getReactComponentInfo({ locator, cdp: cdpSession, }) {
96
+ const cdp = cdpSession;
97
+ const page = await getPageFromTarget(locator);
98
+ await ensureBippy({ page, cdp });
99
+ const evaluateReactComponentInfo = async (el) => {
100
+ const bippy = globalThis.__bippy;
101
+ if (!bippy) {
102
+ throw new Error('bippy not loaded');
103
+ }
104
+ // bippy.normalizeFileName strips "/app-pages-browser/" but not the parenthesized
105
+ // form "/(app-pages-browser)/" that Next.js webpack actually uses. This strips
106
+ // all webpack layer prefixes like (app-pages-browser), (ssr), (rsc), etc.
107
+ const cleanName = (name) => {
108
+ let f = bippy.normalizeFileName(name);
109
+ f = f.replace(/^\/?\([-\w]+\)\//, '');
110
+ f = f.replace(/^\.\//, '');
111
+ return f;
112
+ };
113
+ const serializeReactValue = (value, options) => {
114
+ if (value === null) {
115
+ return null;
116
+ }
117
+ if (typeof value === 'string') {
118
+ return value.length > 300 ? `${value.slice(0, 300)}…[truncated]` : value;
119
+ }
120
+ if (typeof value === 'number' || typeof value === 'boolean') {
121
+ return value;
122
+ }
123
+ if (typeof value === 'undefined') {
124
+ return '[undefined]';
125
+ }
126
+ if (typeof value === 'function') {
127
+ return '[function]';
128
+ }
129
+ if (typeof value === 'symbol') {
130
+ return '[symbol]';
131
+ }
132
+ if (typeof value === 'bigint') {
133
+ return `${value.toString()}n`;
134
+ }
135
+ if (typeof value !== 'object') {
136
+ return `[${typeof value}]`;
137
+ }
138
+ const objectTag = Object.prototype.toString.call(value);
139
+ if (objectTag.includes('Element]') || objectTag === '[object Window]' || objectTag === '[object Document]') {
140
+ return '[dom-node]';
141
+ }
142
+ if (options.seen.has(value)) {
143
+ return '[circular]';
144
+ }
145
+ if (options.depth >= 3) {
146
+ return '[max-depth]';
147
+ }
148
+ options.seen.add(value);
149
+ if (Array.isArray(value)) {
150
+ const items = value.slice(0, 20).map((item) => {
151
+ return serializeReactValue(item, { depth: options.depth + 1, seen: options.seen });
152
+ });
153
+ if (value.length > 20) {
154
+ items.push(`…[${value.length - 20} more]`);
155
+ }
156
+ options.seen.delete(value);
157
+ return items;
158
+ }
159
+ const entries = Object.entries(value).slice(0, 20);
160
+ const result = Object.fromEntries(entries.map(([key, childValue]) => {
161
+ return [key, serializeReactValue(childValue, { depth: options.depth + 1, seen: options.seen })];
162
+ }));
163
+ const totalKeys = Object.keys(value).length;
164
+ if (totalKeys > 20) {
165
+ result['…'] = `[${totalKeys - 20} more keys]`;
166
+ }
167
+ options.seen.delete(value);
168
+ return result;
169
+ };
170
+ const getSourceForFiber = async (fiber) => {
171
+ try {
172
+ const source = await bippy.getSource(fiber);
173
+ if (source?.fileName) {
174
+ return {
175
+ fileName: cleanName(source.fileName),
176
+ lineNumber: source.lineNumber ?? null,
177
+ columnNumber: source.columnNumber ?? null,
178
+ };
179
+ }
180
+ const ownerStack = await bippy.getOwnerStack(fiber);
181
+ const frame = ownerStack.find((ownerFrame) => {
182
+ return ownerFrame.fileName ? bippy.isSourceFile(ownerFrame.fileName) : false;
183
+ });
184
+ if (frame?.fileName) {
185
+ return {
186
+ fileName: cleanName(frame.fileName),
187
+ lineNumber: frame.lineNumber ?? null,
188
+ columnNumber: frame.columnNumber ?? null,
189
+ };
190
+ }
191
+ }
192
+ catch {
193
+ return null;
194
+ }
195
+ return null;
196
+ };
197
+ let fiber = null;
198
+ try {
199
+ fiber = bippy.getFiberFromHostInstance(el);
200
+ }
201
+ catch {
202
+ return null;
203
+ }
204
+ if (!fiber) {
205
+ return null;
206
+ }
207
+ const componentFibers = [];
208
+ let current = fiber;
209
+ while (current && componentFibers.length < 20) {
210
+ try {
211
+ if (bippy.isCompositeFiber(current)) {
212
+ componentFibers.push(current);
213
+ }
214
+ }
215
+ catch {
216
+ // Ignore malformed or unsupported fibers and keep walking upward.
217
+ }
218
+ current = current.return;
219
+ }
220
+ if (componentFibers.length === 0) {
221
+ return null;
222
+ }
223
+ const hierarchy = await Promise.all(componentFibers.map(async (componentFiber) => {
224
+ const componentName = (() => {
225
+ try {
226
+ return componentFiber.type ? bippy.getDisplayName(componentFiber.type) : null;
227
+ }
228
+ catch {
229
+ return null;
230
+ }
231
+ })();
232
+ return {
233
+ componentName,
234
+ source: await getSourceForFiber(componentFiber),
235
+ props: serializeReactValue(componentFiber.memoizedProps, { depth: 0, seen: new WeakSet() }),
236
+ };
237
+ }));
238
+ const nearest = hierarchy[0];
239
+ if (!nearest) {
240
+ return null;
62
241
  }
63
- return null;
242
+ return {
243
+ componentName: nearest.componentName,
244
+ source: nearest.source,
245
+ hierarchy,
246
+ props: nearest.props,
247
+ };
248
+ };
249
+ if ('page' in locator) {
250
+ return await locator.evaluate(evaluateReactComponentInfo);
64
251
  }
65
- return result;
252
+ return await locator.evaluate(evaluateReactComponentInfo);
66
253
  }
67
254
  //# sourceMappingURL=react-source.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-source.js","sourceRoot":"","sources":["../src/react-source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react-source.js","sourceRoot":"","sources":["../src/react-source.ts"],"names":[],"mappings":"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"}
@@ -1668,7 +1668,7 @@
1668
1668
  };
1669
1669
  });
1670
1670
 
1671
- // dist/_readability-entry-39342-1776333719875.js
1671
+ // dist/_readability-entry-26306-1779191184823.js
1672
1672
  var import_readability = __toESM(require_readability(), 1);
1673
1673
  globalThis.__readability = { Readability: import_readability.Readability, isProbablyReaderable: import_readability.isProbablyReaderable };
1674
1674
  })();
@@ -734,12 +734,24 @@ describe('CDP Session Tests', () => {
734
734
  <body>
735
735
  <div id="root"></div>
736
736
  <script>
737
- function MyComponent() {
738
- return React.createElement('button', { id: 'react-btn' }, 'Click me');
737
+ function SaveButton(props) {
738
+ return React.createElement('button', { id: 'react-btn' }, props.label);
739
+ }
740
+ function Panel() {
741
+ return React.createElement('section', null, React.createElement(SaveButton, {
742
+ label: 'Click me',
743
+ count: 3,
744
+ config: { variant: 'primary' },
745
+ onClick: () => {}
746
+ }));
747
+ }
748
+ function App() {
749
+ return React.createElement(Panel);
739
750
  }
740
751
  const root = ReactDOM.createRoot(document.getElementById('root'));
741
- root.render(React.createElement(MyComponent));
752
+ root.render(React.createElement(App));
742
753
  </script>
754
+ <button id="plain-btn">Plain</button>
743
755
  </body>
744
756
  </html>
745
757
  `);
@@ -759,30 +771,46 @@ describe('CDP Session Tests', () => {
759
771
  expect(hasBippyBefore).toBe(false);
760
772
  const wsUrl = getCdpUrl({ port: TEST_PORT });
761
773
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
762
- const { getReactSource } = await import('./react-source.js');
774
+ const { getReactSource, getReactComponentInfo } = await import('./react-source.js');
763
775
  const source = await getReactSource({ locator: btn, cdp: cdpSession });
776
+ const info = await getReactComponentInfo({ locator: btn, cdp: cdpSession });
777
+ const plainInfo = await getReactComponentInfo({ locator: cdpPage.locator('#plain-btn'), cdp: cdpSession });
764
778
  const hasBippyAfter = await cdpPage.evaluate(() => !!globalThis.__bippy);
765
779
  expect(hasBippyAfter).toBe(true);
766
780
  const hasFiber = await btn.evaluate((el) => {
767
781
  const bippy = globalThis.__bippy;
782
+ if (!bippy)
783
+ return false;
768
784
  const fiber = bippy.getFiberFromHostInstance(el);
769
785
  return !!fiber;
770
786
  });
771
787
  expect(hasFiber).toBe(true);
772
788
  const componentName = await btn.evaluate((el) => {
773
789
  const bippy = globalThis.__bippy;
790
+ if (!bippy)
791
+ return null;
774
792
  const fiber = bippy.getFiberFromHostInstance(el);
775
793
  let current = fiber;
776
794
  while (current) {
777
795
  if (bippy.isCompositeFiber(current)) {
778
796
  return bippy.getDisplayName(current.type);
779
797
  }
780
- current = current.return;
798
+ current = current.return ?? null;
781
799
  }
782
800
  return null;
783
801
  });
784
- expect(componentName).toBe('MyComponent');
802
+ expect(componentName).toBe('SaveButton');
803
+ expect(plainInfo).toBe(null);
804
+ expect(info?.componentName).toBe('SaveButton');
805
+ expect(info?.hierarchy.map((item) => item.componentName)).toEqual(['SaveButton', 'Panel', 'App']);
806
+ expect(info?.props).toEqual({
807
+ label: 'Click me',
808
+ count: 3,
809
+ config: { variant: 'primary' },
810
+ onClick: '[function]',
811
+ });
785
812
  console.log('Component name from fiber:', componentName);
813
+ console.log('React component info:', info);
786
814
  console.log('Source location (null for UMD React, works on local dev servers with JSX transform):', source);
787
815
  await browser.close();
788
816
  await page.close();