@treelocator/runtime 0.4.1 → 0.4.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 (69) hide show
  1. package/dist/_generated_styles.js +115 -55
  2. package/dist/adapters/getElementInfo.js +3 -17
  3. package/dist/adapters/getParentsPath.js +3 -33
  4. package/dist/adapters/getTree.js +3 -33
  5. package/dist/adapters/jsx/getJSXComponentBoundingBox.js +0 -1
  6. package/dist/adapters/jsx/jsxAdapter.js +0 -3
  7. package/dist/adapters/jsx/runtimeStore.js +0 -12
  8. package/dist/adapters/react/reactAdapter.js +0 -8
  9. package/dist/adapters/resolveAdapter.d.ts +8 -0
  10. package/dist/adapters/resolveAdapter.js +28 -0
  11. package/dist/adapters/vue/vueAdapter.js +0 -14
  12. package/dist/browserApi.d.ts +1 -1
  13. package/dist/browserApi.js +8 -10
  14. package/dist/components/MaybeOutline.d.ts +1 -0
  15. package/dist/components/MaybeOutline.js +38 -29
  16. package/dist/components/Outline.d.ts +1 -0
  17. package/dist/components/Outline.js +20 -16
  18. package/dist/components/Runtime.js +30 -18
  19. package/dist/dejitter/recorder.js +0 -1
  20. package/dist/functions/formatAncestryChain.d.ts +7 -0
  21. package/dist/functions/formatAncestryChain.js +25 -0
  22. package/dist/functions/formatAncestryChain.test.js +133 -1
  23. package/dist/functions/getUsableName.js +0 -21
  24. package/dist/functions/isCombinationModifiersPressed.js +6 -2
  25. package/dist/output.css +10 -40
  26. package/dist/types/types.d.ts +1 -32
  27. package/package.json +1 -1
  28. package/src/_generated_styles.ts +115 -55
  29. package/src/adapters/getElementInfo.tsx +3 -23
  30. package/src/adapters/getParentsPath.tsx +3 -42
  31. package/src/adapters/getTree.tsx +3 -42
  32. package/src/adapters/jsx/getJSXComponentBoundingBox.ts +0 -1
  33. package/src/adapters/jsx/jsxAdapter.ts +0 -2
  34. package/src/adapters/jsx/runtimeStore.ts +0 -11
  35. package/src/adapters/react/reactAdapter.ts +0 -7
  36. package/src/adapters/resolveAdapter.ts +38 -0
  37. package/src/adapters/vue/vueAdapter.ts +0 -14
  38. package/src/browserApi.ts +9 -12
  39. package/src/components/MaybeOutline.tsx +4 -2
  40. package/src/components/Outline.tsx +2 -1
  41. package/src/components/Runtime.tsx +27 -18
  42. package/src/dejitter/recorder.ts +43 -44
  43. package/src/functions/formatAncestryChain.test.ts +74 -0
  44. package/src/functions/formatAncestryChain.ts +28 -0
  45. package/src/functions/getUsableName.ts +0 -21
  46. package/src/functions/isCombinationModifiersPressed.ts +5 -2
  47. package/src/types/types.ts +1 -32
  48. package/src/adapters/react/fiberToSimple.tsx +0 -72
  49. package/src/adapters/react/gatherFiberRoots.tsx +0 -36
  50. package/src/adapters/react/makeFiberId.tsx +0 -19
  51. package/src/adapters/react/searchDevtoolsRenderersForClosestTarget.ts +0 -15
  52. package/src/components/Button.tsx +0 -14
  53. package/src/components/ComponentOutline.tsx +0 -98
  54. package/src/components/SimpleNodeOutline.tsx +0 -27
  55. package/src/components/Tooltip.tsx +0 -28
  56. package/src/functions/cropPath.test.ts +0 -18
  57. package/src/functions/cropPath.ts +0 -12
  58. package/src/functions/evalTemplate.test.ts +0 -12
  59. package/src/functions/evalTemplate.ts +0 -8
  60. package/src/functions/findNames.ts +0 -20
  61. package/src/functions/getBoundingRect.tsx +0 -11
  62. package/src/functions/getComposedBoundingBox.tsx +0 -25
  63. package/src/functions/getIdsOnPathToRoot.tsx +0 -21
  64. package/src/functions/getMultipleElementsBoundingBox.tsx +0 -25
  65. package/src/functions/getPathToParent.tsx +0 -17
  66. package/src/functions/getUsableFileName.test.tsx +0 -24
  67. package/src/functions/getUsableFileName.tsx +0 -19
  68. package/src/functions/transformPath.test.ts +0 -28
  69. package/src/functions/transformPath.ts +0 -7
@@ -554,7 +554,7 @@ video {
554
554
  display: none;
555
555
  }
556
556
 
557
- [type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {
557
+ input:where([type='text']),input:where(:not([type])),input:where([type='email']),input:where([type='url']),input:where([type='password']),input:where([type='number']),input:where([type='date']),input:where([type='datetime-local']),input:where([type='month']),input:where([type='search']),input:where([type='tel']),input:where([type='time']),input:where([type='week']),select:where([multiple]),textarea,select {
558
558
  -webkit-appearance: none;
559
559
  -moz-appearance: none;
560
560
  appearance: none;
@@ -571,7 +571,7 @@ video {
571
571
  --tw-shadow: 0 0 #0000;
572
572
  }
573
573
 
574
- [type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {
574
+ input:where([type='text']):focus, input:where(:not([type])):focus, input:where([type='email']):focus, input:where([type='url']):focus, input:where([type='password']):focus, input:where([type='number']):focus, input:where([type='date']):focus, input:where([type='datetime-local']):focus, input:where([type='month']):focus, input:where([type='search']):focus, input:where([type='tel']):focus, input:where([type='time']):focus, input:where([type='week']):focus, select:where([multiple]):focus, textarea:focus, select:focus {
575
575
  outline: 2px solid transparent;
576
576
  outline-offset: 2px;
577
577
  --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
@@ -600,6 +600,11 @@ input::placeholder,textarea::placeholder {
600
600
 
601
601
  ::-webkit-date-and-time-value {
602
602
  min-height: 1.5em;
603
+ text-align: inherit;
604
+ }
605
+
606
+ ::-webkit-datetime-edit {
607
+ display: inline-flex;
603
608
  }
604
609
 
605
610
  ::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {
@@ -617,7 +622,7 @@ select {
617
622
  print-color-adjust: exact;
618
623
  }
619
624
 
620
- [multiple],[size]:where(select:not([size="1"])) {
625
+ select:where([multiple]),select:where([size]:not([size="1"])) {
621
626
  background-image: initial;
622
627
  background-position: initial;
623
628
  background-repeat: unset;
@@ -627,7 +632,7 @@ select {
627
632
  print-color-adjust: unset;
628
633
  }
629
634
 
630
- [type='checkbox'],[type='radio'] {
635
+ input:where([type='checkbox']),input:where([type='radio']) {
631
636
  -webkit-appearance: none;
632
637
  -moz-appearance: none;
633
638
  appearance: none;
@@ -650,15 +655,15 @@ select {
650
655
  --tw-shadow: 0 0 #0000;
651
656
  }
652
657
 
653
- [type='checkbox'] {
658
+ input:where([type='checkbox']) {
654
659
  border-radius: 0px;
655
660
  }
656
661
 
657
- [type='radio'] {
662
+ input:where([type='radio']) {
658
663
  border-radius: 100%;
659
664
  }
660
665
 
661
- [type='checkbox']:focus,[type='radio']:focus {
666
+ input:where([type='checkbox']):focus,input:where([type='radio']):focus {
662
667
  outline: 2px solid transparent;
663
668
  outline-offset: 2px;
664
669
  --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
@@ -670,7 +675,7 @@ select {
670
675
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
671
676
  }
672
677
 
673
- [type='checkbox']:checked,[type='radio']:checked {
678
+ input:where([type='checkbox']):checked,input:where([type='radio']):checked {
674
679
  border-color: transparent;
675
680
  background-color: currentColor;
676
681
  background-size: 100% 100%;
@@ -678,20 +683,36 @@ select {
678
683
  background-repeat: no-repeat;
679
684
  }
680
685
 
681
- [type='checkbox']:checked {
686
+ input:where([type='checkbox']):checked {
682
687
  background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
683
688
  }
684
689
 
685
- [type='radio']:checked {
690
+ @media (forced-colors: active) {
691
+ input:where([type='checkbox']):checked {
692
+ -webkit-appearance: auto;
693
+ -moz-appearance: auto;
694
+ appearance: auto;
695
+ }
696
+ }
697
+
698
+ input:where([type='radio']):checked {
686
699
  background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
687
700
  }
688
701
 
689
- [type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {
702
+ @media (forced-colors: active) {
703
+ input:where([type='radio']):checked {
704
+ -webkit-appearance: auto;
705
+ -moz-appearance: auto;
706
+ appearance: auto;
707
+ }
708
+ }
709
+
710
+ input:where([type='checkbox']):checked:hover,input:where([type='checkbox']):checked:focus,input:where([type='radio']):checked:hover,input:where([type='radio']):checked:focus {
690
711
  border-color: transparent;
691
712
  background-color: currentColor;
692
713
  }
693
714
 
694
- [type='checkbox']:indeterminate {
715
+ input:where([type='checkbox']):indeterminate {
695
716
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");
696
717
  border-color: transparent;
697
718
  background-color: currentColor;
@@ -700,12 +721,20 @@ select {
700
721
  background-repeat: no-repeat;
701
722
  }
702
723
 
703
- [type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
724
+ @media (forced-colors: active) {
725
+ input:where([type='checkbox']):indeterminate {
726
+ -webkit-appearance: auto;
727
+ -moz-appearance: auto;
728
+ appearance: auto;
729
+ }
730
+ }
731
+
732
+ input:where([type='checkbox']):indeterminate:hover,input:where([type='checkbox']):indeterminate:focus {
704
733
  border-color: transparent;
705
734
  background-color: currentColor;
706
735
  }
707
736
 
708
- [type='file'] {
737
+ input:where([type='file']) {
709
738
  background: unset;
710
739
  border-color: inherit;
711
740
  border-width: 0;
@@ -715,11 +744,45 @@ select {
715
744
  line-height: inherit;
716
745
  }
717
746
 
718
- [type='file']:focus {
747
+ input:where([type='file']):focus {
719
748
  outline: 1px solid ButtonText;
720
749
  outline: 1px auto -webkit-focus-ring-color;
721
750
  }
722
751
 
752
+ .container {
753
+ width: 100%;
754
+ }
755
+
756
+ @media (min-width: 640px) {
757
+ .container {
758
+ max-width: 640px;
759
+ }
760
+ }
761
+
762
+ @media (min-width: 768px) {
763
+ .container {
764
+ max-width: 768px;
765
+ }
766
+ }
767
+
768
+ @media (min-width: 1024px) {
769
+ .container {
770
+ max-width: 1024px;
771
+ }
772
+ }
773
+
774
+ @media (min-width: 1280px) {
775
+ .container {
776
+ max-width: 1280px;
777
+ }
778
+ }
779
+
780
+ @media (min-width: 1536px) {
781
+ .container {
782
+ max-width: 1536px;
783
+ }
784
+ }
785
+
723
786
  .sr-only {
724
787
  position: absolute;
725
788
  width: 1px;
@@ -764,6 +827,10 @@ select {
764
827
  position: relative;
765
828
  }
766
829
 
830
+ .sticky {
831
+ position: sticky;
832
+ }
833
+
767
834
  .-bottom-7 {
768
835
  bottom: -1.75rem;
769
836
  }
@@ -812,10 +879,6 @@ select {
812
879
  left: 0.25rem;
813
880
  }
814
881
 
815
- .left-1\\/2 {
816
- left: 50%;
817
- }
818
-
819
882
  .left-3 {
820
883
  left: 0.75rem;
821
884
  }
@@ -828,10 +891,6 @@ select {
828
891
  top: 0.25rem;
829
892
  }
830
893
 
831
- .top-1\\/2 {
832
- top: 50%;
833
- }
834
-
835
894
  .z-10 {
836
895
  z-index: 10;
837
896
  }
@@ -1011,11 +1070,6 @@ select {
1011
1070
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1012
1071
  }
1013
1072
 
1014
- .-translate-x-1\\/2 {
1015
- --tw-translate-x: -50%;
1016
- transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1017
- }
1018
-
1019
1073
  .-translate-x-full {
1020
1074
  --tw-translate-x: -100%;
1021
1075
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@@ -1026,11 +1080,6 @@ select {
1026
1080
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1027
1081
  }
1028
1082
 
1029
- .-translate-y-1\\/2 {
1030
- --tw-translate-y: -50%;
1031
- transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1032
- }
1033
-
1034
1083
  .translate-x-full {
1035
1084
  --tw-translate-x: 100%;
1036
1085
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@@ -1108,6 +1157,12 @@ select {
1108
1157
  overflow: scroll;
1109
1158
  }
1110
1159
 
1160
+ .truncate {
1161
+ overflow: hidden;
1162
+ text-overflow: ellipsis;
1163
+ white-space: nowrap;
1164
+ }
1165
+
1111
1166
  .text-ellipsis {
1112
1167
  text-overflow: ellipsis;
1113
1168
  }
@@ -1164,6 +1219,15 @@ select {
1164
1219
  border-style: solid;
1165
1220
  }
1166
1221
 
1222
+ .border-dashed {
1223
+ border-style: dashed;
1224
+ }
1225
+
1226
+ .border-amber-500 {
1227
+ --tw-border-opacity: 1;
1228
+ border-color: rgb(245 158 11 / var(--tw-border-opacity, 1));
1229
+ }
1230
+
1167
1231
  .border-blue-500 {
1168
1232
  --tw-border-opacity: 1;
1169
1233
  border-color: rgb(59 130 246 / var(--tw-border-opacity, 1));
@@ -1179,6 +1243,11 @@ select {
1179
1243
  border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));
1180
1244
  }
1181
1245
 
1246
+ .border-gray-500 {
1247
+ --tw-border-opacity: 1;
1248
+ border-color: rgb(107 114 128 / var(--tw-border-opacity, 1));
1249
+ }
1250
+
1182
1251
  .border-gray-600 {
1183
1252
  --tw-border-opacity: 1;
1184
1253
  border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));
@@ -1346,6 +1415,10 @@ select {
1346
1415
  padding: 1rem;
1347
1416
  }
1348
1417
 
1418
+ .p-5 {
1419
+ padding: 1.25rem;
1420
+ }
1421
+
1349
1422
  .p-6 {
1350
1423
  padding: 1.5rem;
1351
1424
  }
@@ -1384,11 +1457,6 @@ select {
1384
1457
  padding-bottom: 0px;
1385
1458
  }
1386
1459
 
1387
- .py-0\\.5 {
1388
- padding-top: 0.125rem;
1389
- padding-bottom: 0.125rem;
1390
- }
1391
-
1392
1460
  .py-1 {
1393
1461
  padding-top: 0.25rem;
1394
1462
  padding-bottom: 0.25rem;
@@ -1681,10 +1749,19 @@ select {
1681
1749
  --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity, 1));
1682
1750
  }
1683
1751
 
1752
+ .blur {
1753
+ --tw-blur: blur(8px);
1754
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1755
+ }
1756
+
1684
1757
  .filter {
1685
1758
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1686
1759
  }
1687
1760
 
1761
+ .backdrop-filter {
1762
+ backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
1763
+ }
1764
+
1688
1765
  .transition {
1689
1766
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
1690
1767
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
@@ -1713,22 +1790,5 @@ select {
1713
1790
 
1714
1791
  .ease-out {
1715
1792
  transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
1716
- }
1717
-
1718
- .hover\\:bg-white\\/30:hover {
1719
- background-color: rgb(255 255 255 / 0.3);
1720
- }
1721
-
1722
- .hover\\:text-gray-100:hover {
1723
- --tw-text-opacity: 1;
1724
- color: rgb(243 244 246 / var(--tw-text-opacity, 1));
1725
- }
1726
-
1727
- .group\\/tooltip:hover .group-hover\\/tooltip\\:visible {
1728
- visibility: visible;
1729
- }
1730
-
1731
- .group\\/tooltip:hover .group-hover\\/tooltip\\:opacity-100 {
1732
- opacity: 1;
1733
1793
  }`;
1734
1794
  export default styles;
@@ -1,19 +1,5 @@
1
- import reactAdapter from "./react/reactAdapter";
2
- import jsxAdapter from "./jsx/jsxAdapter";
3
- import svelteAdapter from "./svelte/svelteAdapter";
4
- import vueAdapter from "./vue/vueAdapter";
1
+ import { resolveAdapter } from "./resolveAdapter";
5
2
  export function getElementInfo(target, adapterId) {
6
- if (adapterId === "react") {
7
- return reactAdapter.getElementInfo(target);
8
- }
9
- if (adapterId === "svelte") {
10
- return svelteAdapter.getElementInfo(target);
11
- }
12
- if (adapterId === "jsx") {
13
- return jsxAdapter.getElementInfo(target);
14
- }
15
- if (adapterId === "vue") {
16
- return vueAdapter.getElementInfo(target);
17
- }
18
- return jsxAdapter.getElementInfo(target) || reactAdapter.getElementInfo(target) || svelteAdapter.getElementInfo(target) || vueAdapter.getElementInfo(target);
3
+ const adapter = resolveAdapter(adapterId);
4
+ return adapter?.getElementInfo(target) ?? null;
19
5
  }
@@ -1,35 +1,5 @@
1
- import reactAdapter from "./react/reactAdapter";
2
- import { detectJSX, detectReact, detectSvelte, detectVue } from "@locator/shared";
3
- import svelteAdapter from "./svelte/svelteAdapter";
4
- import jsxAdapter from "./jsx/jsxAdapter";
5
- import vueAdapter from "./vue/vueAdapter";
1
+ import { resolveAdapter } from "./resolveAdapter";
6
2
  export function getParentsPaths(target, adapterId) {
7
- if (adapterId === "react" && reactAdapter.getParentsPaths) {
8
- return reactAdapter.getParentsPaths(target);
9
- }
10
- if (adapterId === "svelte" && svelteAdapter.getParentsPaths) {
11
- return svelteAdapter.getParentsPaths(target);
12
- }
13
- if (adapterId === "vue" && vueAdapter.getParentsPaths) {
14
- return vueAdapter.getParentsPaths(target);
15
- }
16
- if (adapterId === "jsx" && jsxAdapter.getParentsPaths) {
17
- return jsxAdapter.getParentsPaths(target);
18
- }
19
- if (detectSvelte() && svelteAdapter.getParentsPaths) {
20
- return svelteAdapter.getParentsPaths(target);
21
- }
22
- if (detectVue() && vueAdapter.getParentsPaths) {
23
- return vueAdapter.getParentsPaths(target);
24
- }
25
- if (detectReact() && reactAdapter.getParentsPaths) {
26
- return reactAdapter.getParentsPaths(target);
27
- }
28
-
29
- // // Must be last, because its global data leaks from Locator extension.
30
- // // Because the extension is in SolidJS and it uses JSX plugin in dev mode.
31
- if (detectJSX() && jsxAdapter.getParentsPaths) {
32
- return jsxAdapter.getParentsPaths(target);
33
- }
34
- return [];
3
+ const adapter = resolveAdapter(adapterId);
4
+ return adapter?.getParentsPaths(target) ?? [];
35
5
  }
@@ -1,35 +1,5 @@
1
- import reactAdapter from "./react/reactAdapter";
2
- import jsxAdapter from "./jsx/jsxAdapter";
3
- import svelteAdapter from "./svelte/svelteAdapter";
4
- import { detectJSX, detectReact, detectSvelte, detectVue } from "@locator/shared";
5
- import vueAdapter from "./vue/vueAdapter";
1
+ import { resolveAdapter } from "./resolveAdapter";
6
2
  export function getTree(target, adapterId) {
7
- if (adapterId === "react" && reactAdapter.getTree) {
8
- return reactAdapter.getTree(target);
9
- }
10
- if (adapterId === "svelte" && svelteAdapter.getTree) {
11
- return svelteAdapter.getTree(target);
12
- }
13
- if (adapterId === "vue" && vueAdapter.getTree) {
14
- return vueAdapter.getTree(target);
15
- }
16
- if (adapterId === "jsx" && jsxAdapter.getTree) {
17
- return jsxAdapter.getTree(target);
18
- }
19
- if (detectSvelte() && svelteAdapter.getTree) {
20
- return svelteAdapter.getTree(target);
21
- }
22
- if (detectVue() && vueAdapter.getTree) {
23
- return vueAdapter.getTree(target);
24
- }
25
- if (detectReact() && reactAdapter.getTree) {
26
- return reactAdapter.getTree(target);
27
- }
28
-
29
- // Must be last, because its global data leaks from Locator extension.
30
- // Because the extension is in SolidJS and it uses JSX plugin in dev mode.
31
- if (detectJSX() && jsxAdapter.getTree) {
32
- return jsxAdapter.getTree(target);
33
- }
34
- return null;
3
+ const adapter = resolveAdapter(adapterId);
4
+ return adapter?.getTree?.(target) ?? null;
35
5
  }
@@ -38,7 +38,6 @@ export function getJSXComponentBoundingBox(found, locatorData, componentFolder,
38
38
  composedBox = mergeRects(composedBox, parent.getBoundingClientRect());
39
39
  goParent(parent);
40
40
  }
41
- expData.wrappingComponentId;
42
41
  }
43
42
  } else {
44
43
  // If there is no locatorjs-id or locatorjs, we should go to the parent, because it can be some library element
@@ -85,9 +85,6 @@ export function getElementInfo(target) {
85
85
  }] : []
86
86
  };
87
87
  }
88
-
89
- // return deduplicateLabels(labels);
90
-
91
88
  return null;
92
89
  }
93
90
  export class JSXTreeNodeElement extends HtmlElementTreeNode {
@@ -67,18 +67,6 @@ export function getDataForDataId(dataId) {
67
67
  column: expData.loc.start.column || 0,
68
68
  line: expData.loc.start.line || 0
69
69
  };
70
-
71
- // let label;
72
- // if (expData.type === "jsx") {
73
- // label =
74
- // (expData.wrappingComponent ? `${expData.wrappingComponent}: ` : "") +
75
- // expData.name;
76
- // } else {
77
- // label = `${expData.htmlTag ? `styled.${expData.htmlTag}` : "styled"}${
78
- // expData.name ? `: ${expData.name}` : ""
79
- // }`;
80
- // }
81
-
82
70
  return {
83
71
  link,
84
72
  label: expData.name,
@@ -23,14 +23,6 @@ export function getElementInfo(found) {
23
23
  parentElements
24
24
  } = result;
25
25
  const allPotentialComponentFibers = getAllWrappingParents(component);
26
-
27
- // This handles a common case when the component root is basically the comopnent itself, so I want to go to usage of the component
28
- // TODO: whaat? why? currently I see that it adds the original styled components which is not necessary.
29
-
30
- // if (fiber.return && fiber.return === fiber._debugOwner) {
31
- // allPotentialComponentFibers.unshift(fiber.return);
32
- // }
33
-
34
26
  allPotentialComponentFibers.forEach(fiber => {
35
27
  const fiberWithSource = findDebugSource(fiber);
36
28
  if (fiberWithSource) {
@@ -0,0 +1,8 @@
1
+ import type { AdapterObject } from "./adapterApi";
2
+ import type { AdapterId } from "../consts";
3
+ /**
4
+ * Resolve the framework adapter to use.
5
+ * If an explicit adapterId is given, return that adapter.
6
+ * Otherwise, auto-detect the framework in priority order.
7
+ */
8
+ export declare function resolveAdapter(adapterId?: AdapterId): AdapterObject | null;
@@ -0,0 +1,28 @@
1
+ import reactAdapter from "./react/reactAdapter";
2
+ import jsxAdapter from "./jsx/jsxAdapter";
3
+ import svelteAdapter from "./svelte/svelteAdapter";
4
+ import vueAdapter from "./vue/vueAdapter";
5
+ import { detectJSX, detectReact, detectSvelte, detectVue } from "@locator/shared";
6
+ const adapterMap = {
7
+ react: reactAdapter,
8
+ svelte: svelteAdapter,
9
+ vue: vueAdapter,
10
+ jsx: jsxAdapter
11
+ };
12
+
13
+ /**
14
+ * Resolve the framework adapter to use.
15
+ * If an explicit adapterId is given, return that adapter.
16
+ * Otherwise, auto-detect the framework in priority order.
17
+ */
18
+ export function resolveAdapter(adapterId) {
19
+ if (adapterId) {
20
+ return adapterMap[adapterId] ?? null;
21
+ }
22
+ if (detectSvelte()) return svelteAdapter;
23
+ if (detectVue()) return vueAdapter;
24
+ if (detectReact()) return reactAdapter;
25
+ // Must be last: global data leaks from the LocatorJS extension (SolidJS + JSX plugin in dev)
26
+ if (detectJSX()) return jsxAdapter;
27
+ return null;
28
+ }
@@ -62,20 +62,6 @@ export class VueTreeNodeElement extends HtmlElementTreeNode {
62
62
  getComponent() {
63
63
  return null;
64
64
  }
65
- // getComponent(): TreeNodeComponent | null {
66
- // const element = this.element as VueElement;
67
- // const parentComponent = element.__vueParentComponent;
68
- // if (parentComponent && parentComponent.type) {
69
- // const { __name } = parentComponent.type;
70
- // if (__name) {
71
- // return {
72
- // label: __name,
73
- // definitionLink: this.getSource() || undefined,
74
- // };
75
- // }
76
- // }
77
- // return null;
78
- // }
79
65
  }
80
66
  function getTree(element) {
81
67
  const originalRoot = new VueTreeNodeElement(element);
@@ -144,5 +144,5 @@ export interface LocatorJSAPI {
144
144
  interactions: InteractionEvent[];
145
145
  } | null>;
146
146
  }
147
- export declare function createBrowserAPI(adapterIdParam?: AdapterId): LocatorJSAPI;
147
+ export declare function createBrowserAPI(adapterId?: AdapterId): LocatorJSAPI;
148
148
  export declare function installBrowserAPI(adapterIdParam?: AdapterId): void;
@@ -1,7 +1,6 @@
1
1
  import { createTreeNode } from "./adapters/createTreeNode";
2
2
  import { collectAncestry, formatAncestryChain } from "./functions/formatAncestryChain";
3
3
  import { enrichAncestryWithSourceMaps } from "./functions/enrichAncestrySourceMaps";
4
- let adapterId;
5
4
  function resolveElement(elementOrSelector) {
6
5
  if (typeof elementOrSelector === "string") {
7
6
  const element = document.querySelector(elementOrSelector);
@@ -9,15 +8,15 @@ function resolveElement(elementOrSelector) {
9
8
  }
10
9
  return elementOrSelector;
11
10
  }
12
- function getAncestryForElement(element) {
11
+ function getAncestryForElement(element, adapterId) {
13
12
  const treeNode = createTreeNode(element, adapterId);
14
13
  if (!treeNode) {
15
14
  return null;
16
15
  }
17
16
  return collectAncestry(treeNode);
18
17
  }
19
- async function getEnrichedAncestryForElement(element) {
20
- const ancestry = getAncestryForElement(element);
18
+ async function getEnrichedAncestryForElement(element, adapterId) {
19
+ const ancestry = getAncestryForElement(element, adapterId);
21
20
  if (!ancestry) return null;
22
21
  return enrichAncestryWithSourceMaps(ancestry, element);
23
22
  }
@@ -121,7 +120,7 @@ CYPRESS EXAMPLES:
121
120
  ----------------
122
121
 
123
122
  cy.window().then((win) => {
124
- const path = win.__locatorjs__.getPath('button.submit');
123
+ const path = win.__treelocator__.getPath('button.submit');
125
124
  cy.log(path);
126
125
  });
127
126
 
@@ -134,29 +133,28 @@ NOTES:
134
133
 
135
134
  Documentation: https://github.com/wende/treelocatorjs
136
135
  `;
137
- export function createBrowserAPI(adapterIdParam) {
138
- adapterId = adapterIdParam;
136
+ export function createBrowserAPI(adapterId) {
139
137
  return {
140
138
  getPath(elementOrSelector) {
141
139
  const element = resolveElement(elementOrSelector);
142
140
  if (!element) {
143
141
  return Promise.resolve(null);
144
142
  }
145
- return getEnrichedAncestryForElement(element).then(ancestry => ancestry ? formatAncestryChain(ancestry) : null);
143
+ return getEnrichedAncestryForElement(element, adapterId).then(ancestry => ancestry ? formatAncestryChain(ancestry) : null);
146
144
  },
147
145
  getAncestry(elementOrSelector) {
148
146
  const element = resolveElement(elementOrSelector);
149
147
  if (!element) {
150
148
  return Promise.resolve(null);
151
149
  }
152
- return getEnrichedAncestryForElement(element);
150
+ return getEnrichedAncestryForElement(element, adapterId);
153
151
  },
154
152
  getPathData(elementOrSelector) {
155
153
  const element = resolveElement(elementOrSelector);
156
154
  if (!element) {
157
155
  return Promise.resolve(null);
158
156
  }
159
- return getEnrichedAncestryForElement(element).then(ancestry => ancestry ? {
157
+ return getEnrichedAncestryForElement(element, adapterId).then(ancestry => ancestry ? {
160
158
  path: formatAncestryChain(ancestry),
161
159
  ancestry
162
160
  } : null);
@@ -4,4 +4,5 @@ export declare function MaybeOutline(props: {
4
4
  currentElement: HTMLElement;
5
5
  adapterId?: AdapterId;
6
6
  targets: Targets;
7
+ dashed?: boolean;
7
8
  }): import("solid-js").JSX.Element;