@promakeai/inspector 0.0.3 → 0.0.4

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 CHANGED
@@ -179,7 +179,8 @@ interface SelectedElementData {
179
179
  id: string;
180
180
  component: ComponentInfo | null;
181
181
  position: ElementPosition;
182
- isTextNode?: boolean; // Whether the element is a text-only node
182
+ isTextNode?: boolean; // Whether the element is a text node
183
+ textContent?: string; // Text content of the element (if text node)
183
184
  }
184
185
  ```
185
186
 
@@ -458,31 +459,17 @@ const { toggleInspector } = useInspector(iframeRef, {
458
459
 
459
460
  ## CI/CD
460
461
 
461
- This project includes GitHub Actions workflows:
462
+ This project includes GitHub Actions workflow:
462
463
 
463
464
  ### Build Workflow (`.github/workflows/build.yml`)
464
465
 
465
466
  Automatically runs on every push and pull request:
466
467
 
467
- - ✅ Builds the package on Node.js 18.x and 20.x
468
- - ✅ Validates TypeScript compilation
468
+ - ✅ Uses Bun for fast installation and build
469
+ - ✅ Runs `bun install` and `bun run build`
469
470
  - ✅ Checks for build artifacts
470
471
  - ✅ Uploads build artifacts for review
471
472
 
472
- ### Publish Workflow (`.github/workflows/publish.yml`)
473
-
474
- Automatically publishes to NPM when a release is created:
475
-
476
- - ✅ Builds the package
477
- - ✅ Publishes to NPM with `--access public`
478
- - ✅ Manual trigger support via workflow_dispatch
479
-
480
- **Setup for NPM publishing:**
481
-
482
- 1. Create an NPM access token at [npmjs.com](https://www.npmjs.com/settings/YOUR_USERNAME/tokens)
483
- 2. Add the token as `NPM_TOKEN` secret in your GitHub repository settings
484
- 3. Create a release on GitHub to trigger automatic publishing
485
-
486
473
  ## License
487
474
 
488
475
  MIT
@@ -1 +1 @@
1
- {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AAEH,OAAO,EAAoC,SAAS,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,kBAAkB,EAMnB,MAAM,SAAS,CAAC;AAoCjB,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,CAAC,iBAAiB,CAAC,EACvC,SAAS,CAAC,EAAE,kBAAkB,EAC9B,MAAM,CAAC,EAAE,eAAe,EACxB,KAAK,CAAC,EAAE,cAAc,GACrB,kBAAkB,CAyIpB;AAGD,mBAAmB,SAAS,CAAC"}
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AAEH,OAAO,EAAoC,SAAS,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,kBAAkB,EAMnB,MAAM,SAAS,CAAC;AAoCjB,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,CAAC,iBAAiB,CAAC,EACvC,SAAS,CAAC,EAAE,kBAAkB,EAC9B,MAAM,CAAC,EAAE,eAAe,EACxB,KAAK,CAAC,EAAE,cAAc,GACrB,kBAAkB,CAsJpB;AAGD,mBAAmB,SAAS,CAAC"}
package/dist/hook.js CHANGED
@@ -133,11 +133,24 @@ export function useInspector(iframeRef, callbacks, labels, theme) {
133
133
  */
134
134
  useEffect(() => {
135
135
  const handleMessage = (event) => {
136
+ // Parse message if it's a string (JSON stringified)
137
+ let messageData;
138
+ if (typeof event.data === "string") {
139
+ try {
140
+ messageData = JSON.parse(event.data);
141
+ }
142
+ catch {
143
+ return; // Invalid JSON, ignore
144
+ }
145
+ }
146
+ else {
147
+ messageData = event.data;
148
+ }
136
149
  // Security: Only handle expected message types
137
- if (!event.data || typeof event.data.type !== "string") {
150
+ if (!messageData || typeof messageData.type !== "string") {
138
151
  return;
139
152
  }
140
- const { type, data } = event.data;
153
+ const { type, data } = messageData;
141
154
  switch (type) {
142
155
  case "INSPECTOR_ELEMENT_SELECTED":
143
156
  callbacks?.onElementSelected?.(data);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,wBAAgB,eAAe,IAAI,MAAM,CA6pBxC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,wBAAgB,eAAe,IAAI,MAAM,CAyrBxC"}
package/dist/plugin.js CHANGED
@@ -208,13 +208,14 @@ export function inspectorPlugin() {
208
208
  const prompt = promptInput.value.trim();
209
209
  if (prompt) {
210
210
  if (window.parent !== window) {
211
- window.parent.postMessage({
211
+ const message = JSON.stringify({
212
212
  type: 'INSPECTOR_PROMPT_SUBMITTED',
213
213
  data: {
214
214
  prompt: prompt,
215
215
  element: elementData
216
216
  }
217
- }, '*');
217
+ });
218
+ window.parent.postMessage(message, '*');
218
219
  }
219
220
  console.log('Prompt submitted:', elementData);
220
221
 
@@ -299,14 +300,15 @@ export function inspectorPlugin() {
299
300
  e.stopPropagation();
300
301
  const newText = textInput.value;
301
302
  if (window.parent !== window) {
302
- window.parent.postMessage({
303
+ const message = JSON.stringify({
303
304
  type: 'INSPECTOR_TEXT_UPDATED',
304
305
  data: {
305
306
  text: newText,
306
307
  originalText: currentText,
307
308
  element: selectedElementData
308
309
  }
309
- }, '*');
310
+ });
311
+ window.parent.postMessage(message, '*');
310
312
  }
311
313
  console.log('Text updated:', newText);
312
314
 
@@ -499,6 +501,23 @@ export function inspectorPlugin() {
499
501
  highlightElement(hoveredElement);
500
502
  }
501
503
 
504
+ // Handle scroll - update highlight position
505
+ function handleScroll() {
506
+ if (!inspectMode) return;
507
+
508
+ if (isPaused && selectedElement) {
509
+ // Update overlay for selected element
510
+ highlightElement(selectedElement);
511
+ // Update control box position
512
+ if (controlBox) {
513
+ adjustControlBoxPosition();
514
+ }
515
+ } else if (hoveredElement) {
516
+ // Update overlay for hovered element
517
+ highlightElement(hoveredElement);
518
+ }
519
+ }
520
+
502
521
  // Handle click
503
522
  function handleClick(e) {
504
523
  if (!inspectMode) return;
@@ -528,6 +547,7 @@ export function inspectorPlugin() {
528
547
 
529
548
  // Check if element is a text node
530
549
  const isTextNode = element.textContent && element.children.length === 0;
550
+ const textContent = isTextNode ? element.textContent.trim() : '';
531
551
 
532
552
  const elementData = {
533
553
  tagName: element.tagName,
@@ -540,22 +560,26 @@ export function inspectorPlugin() {
540
560
  width: element.getBoundingClientRect().width,
541
561
  height: element.getBoundingClientRect().height
542
562
  },
543
- isTextNode: isTextNode
563
+ isTextNode: isTextNode,
564
+ textContent: textContent
544
565
  };
545
566
 
546
567
  // Send info to parent window
547
568
  if (window.parent !== window) {
548
- window.parent.postMessage({
569
+ // Use JSON.stringify to ensure all properties are serialized correctly
570
+ const message = JSON.stringify({
549
571
  type: 'INSPECTOR_ELEMENT_SELECTED',
550
572
  data: elementData
551
- }, '*');
573
+ });
574
+ window.parent.postMessage(message, '*');
552
575
  }
553
576
 
554
577
  // Log for debugging
555
578
  console.log('Element selected:', {
556
579
  element,
557
580
  componentInfo,
558
- isTextNode
581
+ isTextNode,
582
+ textContent
559
583
  });
560
584
 
561
585
  // Pause inspection and show control box
@@ -571,6 +595,7 @@ export function inspectorPlugin() {
571
595
  document.body.style.cursor = 'crosshair';
572
596
  document.addEventListener('mousemove', handleMouseMove, true);
573
597
  document.addEventListener('click', handleClick, true);
598
+ document.addEventListener('scroll', handleScroll, true);
574
599
  } else {
575
600
  // Clean up everything
576
601
  clearHighlight();
@@ -578,6 +603,7 @@ export function inspectorPlugin() {
578
603
  document.body.style.cursor = '';
579
604
  document.removeEventListener('mousemove', handleMouseMove, true);
580
605
  document.removeEventListener('click', handleClick, true);
606
+ document.removeEventListener('scroll', handleScroll, true);
581
607
  }
582
608
  }
583
609
 
@@ -609,7 +635,7 @@ export function inspectorPlugin() {
609
635
  lastUrl = newUrl;
610
636
 
611
637
  if (window.parent !== window) {
612
- window.parent.postMessage({
638
+ const message = JSON.stringify({
613
639
  type: 'URL_CHANGED',
614
640
  data: {
615
641
  url: newUrl,
@@ -617,7 +643,8 @@ export function inspectorPlugin() {
617
643
  search: location.search,
618
644
  hash: location.hash
619
645
  }
620
- }, '*');
646
+ });
647
+ window.parent.postMessage(message, '*');
621
648
  }
622
649
  }
623
650
  }
@@ -650,10 +677,11 @@ export function inspectorPlugin() {
650
677
 
651
678
  function sendError(errorData) {
652
679
  if (window.parent !== window) {
653
- window.parent.postMessage({
680
+ const message = JSON.stringify({
654
681
  type: 'INSPECTOR_ERROR',
655
682
  data: errorData
656
- }, '*');
683
+ });
684
+ window.parent.postMessage(message, '*');
657
685
  }
658
686
  // Use original console.error to avoid infinite loop
659
687
  originalConsoleError.call(console, '🔍 Inspector Error:', errorData);
package/dist/types.d.ts CHANGED
@@ -23,6 +23,7 @@ export interface SelectedElementData {
23
23
  component: ComponentInfo | null;
24
24
  position: ElementPosition;
25
25
  isTextNode?: boolean;
26
+ textContent?: string;
26
27
  }
27
28
  export interface UrlChangeData {
28
29
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promakeai/inspector",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Visual element inspector for React apps in iframe with AI prompt support",
5
5
  "author": "Promake",
6
6
  "license": "MIT",
@@ -34,7 +34,7 @@
34
34
  "scripts": {
35
35
  "build": "tsc && tsc -p tsconfig.plugin.json",
36
36
  "prepublishOnly": "npm run build",
37
- "publish": "npm run build && npm publish --access public"
37
+ "release": "npm run build && npm publish --access public"
38
38
  },
39
39
  "keywords": [
40
40
  "vite",