@wyverselabs/pinpoint 0.1.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.
- package/LICENSE +21 -0
- package/README.md +116 -0
- package/dist/core/contextPayload.d.ts +4 -0
- package/dist/core/contextPayload.d.ts.map +1 -0
- package/dist/core/contextPayload.js +155 -0
- package/dist/core/contextPayload.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pickerOverlay.d.ts +3 -0
- package/dist/core/pickerOverlay.d.ts.map +1 -0
- package/dist/core/pickerOverlay.js +167 -0
- package/dist/core/pickerOverlay.js.map +1 -0
- package/dist/core/sourceMetadata.d.ts +9 -0
- package/dist/core/sourceMetadata.d.ts.map +1 -0
- package/dist/core/sourceMetadata.js +97 -0
- package/dist/core/sourceMetadata.js.map +1 -0
- package/dist/core/types.d.ts +50 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/browser-extension/contentScript.d.ts +2 -0
- package/dist/integrations/browser-extension/contentScript.d.ts.map +1 -0
- package/dist/integrations/browser-extension/contentScript.js +18 -0
- package/dist/integrations/browser-extension/contentScript.js.map +1 -0
- package/dist/integrations/electron/channels.d.ts +7 -0
- package/dist/integrations/electron/channels.d.ts.map +1 -0
- package/dist/integrations/electron/channels.js +3 -0
- package/dist/integrations/electron/channels.js.map +1 -0
- package/dist/integrations/electron/main.d.ts +5 -0
- package/dist/integrations/electron/main.d.ts.map +1 -0
- package/dist/integrations/electron/main.js +29 -0
- package/dist/integrations/electron/main.js.map +1 -0
- package/dist/integrations/electron/preload.d.ts +2 -0
- package/dist/integrations/electron/preload.d.ts.map +1 -0
- package/dist/integrations/electron/preload.js +21 -0
- package/dist/integrations/electron/preload.js.map +1 -0
- package/dist/integrations/electron/renderer.d.ts +11 -0
- package/dist/integrations/electron/renderer.d.ts.map +1 -0
- package/dist/integrations/electron/renderer.js +23 -0
- package/dist/integrations/electron/renderer.js.map +1 -0
- package/dist/vite/sourceMetadataPlugin.d.ts +10 -0
- package/dist/vite/sourceMetadataPlugin.d.ts.map +1 -0
- package/dist/vite/sourceMetadataPlugin.js +210 -0
- package/dist/vite/sourceMetadataPlugin.js.map +1 -0
- package/package.json +72 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Woo-yeong Kim
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Pinpoint
|
|
2
|
+
|
|
3
|
+
Pinpoint is a dev-only UI picker that copies AI-ready context for the exact rendered element you click.
|
|
4
|
+
|
|
5
|
+
It highlights DOM elements like an inspector, then copies a structured payload:
|
|
6
|
+
|
|
7
|
+
```xml
|
|
8
|
+
<pinpoint-selection>
|
|
9
|
+
{
|
|
10
|
+
"schemaVersion": 1,
|
|
11
|
+
"kind": "pinpoint.selection",
|
|
12
|
+
"source": {
|
|
13
|
+
"primary": "src/components/ExportButton.tsx:42:5"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
</pinpoint-selection>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
bun add -d @wyverselabs/pinpoint
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Pinpoint expects the host app to provide compatible peers:
|
|
26
|
+
|
|
27
|
+
- `effect`
|
|
28
|
+
- `electron` for the Electron integration
|
|
29
|
+
- `vite` for source metadata injection
|
|
30
|
+
|
|
31
|
+
## Vite
|
|
32
|
+
|
|
33
|
+
Add the source metadata plugin to the renderer build in development:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { pinpointSourceMetadataPlugin } from "@wyverselabs/pinpoint/vite";
|
|
37
|
+
|
|
38
|
+
export default defineConfig({
|
|
39
|
+
plugins: [
|
|
40
|
+
pinpointSourceMetadataPlugin({
|
|
41
|
+
root: __dirname,
|
|
42
|
+
}),
|
|
43
|
+
],
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The plugin injects `data-ui-context-source` and `data-ui-context-name` attributes into JSX output so selected DOM nodes can be traced back to source files.
|
|
48
|
+
|
|
49
|
+
## Electron
|
|
50
|
+
|
|
51
|
+
Register the main-process clipboard/IPC handler and send the toggle event from your shortcut:
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import {
|
|
55
|
+
DEFAULT_PINPOINT_ACCELERATOR,
|
|
56
|
+
registerElectronPinpointMain,
|
|
57
|
+
toggleElectronPinpointForFocusedWindow,
|
|
58
|
+
} from "@wyverselabs/pinpoint/electron/main";
|
|
59
|
+
|
|
60
|
+
yield* registerElectronPinpointMain();
|
|
61
|
+
yield* shortcutService.registerScoped(DEFAULT_PINPOINT_ACCELERATOR, () => {
|
|
62
|
+
fireAndForget(toggleElectronPinpointForFocusedWindow());
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Expose the preload bridge:
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { exposeElectronPinpointPreload } from "@wyverselabs/pinpoint/electron/preload";
|
|
70
|
+
|
|
71
|
+
if (process.env.NODE_ENV === "development") {
|
|
72
|
+
exposeElectronPinpointPreload();
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Install the renderer listener in each window:
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
import { installElectronPinpoint } from "@wyverselabs/pinpoint/electron/renderer";
|
|
80
|
+
|
|
81
|
+
if (import.meta.env.DEV) {
|
|
82
|
+
installElectronPinpoint({ windowLabel: "main" });
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Browser Extension
|
|
87
|
+
|
|
88
|
+
The browser adapter is intentionally small for now:
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
import { installBrowserPinpoint } from "@wyverselabs/pinpoint/browser-extension";
|
|
92
|
+
|
|
93
|
+
installBrowserPinpoint();
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Post `pinpoint:toggle` to the page to activate the picker.
|
|
97
|
+
|
|
98
|
+
## Package
|
|
99
|
+
|
|
100
|
+
Build the distributable package:
|
|
101
|
+
|
|
102
|
+
```sh
|
|
103
|
+
bun run build
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Create a local tarball:
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
bun run pack
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Preview published contents without writing a tarball:
|
|
113
|
+
|
|
114
|
+
```sh
|
|
115
|
+
bun run pack:dry
|
|
116
|
+
```
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ElementContext } from "./types.js";
|
|
2
|
+
export declare const createElementContext: (element: Element, windowLabel: string | null) => ElementContext;
|
|
3
|
+
export declare const createContextPayload: (context: ElementContext) => string;
|
|
4
|
+
//# sourceMappingURL=contextPayload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextPayload.d.ts","sourceRoot":"","sources":["../../src/core/contextPayload.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAsEjD,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,EAAE,aAAa,MAAM,GAAG,IAAI,KAAG,cAsBnF,CAAC;AAqBF,eAAO,MAAM,oBAAoB,GAAI,SAAS,cAAc,WAsD3D,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { findNearestSourceElement, formatSourceLocation, getElementSourceLocation, getElementSourceName, getReactOwnerStack, getReactSourceLocation, } from "./sourceMetadata.js";
|
|
2
|
+
const PAYLOAD_TAG = "pinpoint-selection";
|
|
3
|
+
const truncate = (value, maxLength) => {
|
|
4
|
+
const normalized = value.replace(/\s+/g, " ").trim();
|
|
5
|
+
if (normalized.length <= maxLength)
|
|
6
|
+
return normalized;
|
|
7
|
+
return `${normalized.slice(0, maxLength - 1)}...`;
|
|
8
|
+
};
|
|
9
|
+
const getElementText = (element) => {
|
|
10
|
+
const text = truncate(element.textContent ?? "", 120);
|
|
11
|
+
return text.length > 0 ? text : null;
|
|
12
|
+
};
|
|
13
|
+
const getElementClassName = (element) => {
|
|
14
|
+
const className = element.getAttribute("class");
|
|
15
|
+
return className && className.trim().length > 0 ? truncate(className, 180) : null;
|
|
16
|
+
};
|
|
17
|
+
const getAccessibleName = (element) => element.getAttribute("aria-label") ?? element.getAttribute("title") ?? element.getAttribute("alt");
|
|
18
|
+
const getDomPath = (element) => {
|
|
19
|
+
const parts = [];
|
|
20
|
+
let current = element;
|
|
21
|
+
while (current && current.nodeType === Node.ELEMENT_NODE && parts.length < 8) {
|
|
22
|
+
let part = current.tagName.toLowerCase();
|
|
23
|
+
const id = current.getAttribute("id");
|
|
24
|
+
const dataSlot = current.getAttribute("data-slot");
|
|
25
|
+
if (id) {
|
|
26
|
+
part += `#${id}`;
|
|
27
|
+
parts.unshift(part);
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
if (dataSlot) {
|
|
31
|
+
part += `[data-slot="${dataSlot}"]`;
|
|
32
|
+
}
|
|
33
|
+
const parent = current.parentElement;
|
|
34
|
+
if (parent) {
|
|
35
|
+
const tagName = current.tagName;
|
|
36
|
+
const siblings = Array.from(parent.children).filter((sibling) => sibling.tagName === tagName);
|
|
37
|
+
if (siblings.length > 1) {
|
|
38
|
+
part += `:nth-of-type(${siblings.indexOf(current) + 1})`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
parts.unshift(part);
|
|
42
|
+
current = parent;
|
|
43
|
+
}
|
|
44
|
+
return parts.join(" > ");
|
|
45
|
+
};
|
|
46
|
+
const getComputedStyleSummary = (element) => {
|
|
47
|
+
const style = element.ownerDocument.defaultView?.getComputedStyle(element);
|
|
48
|
+
return {
|
|
49
|
+
display: style?.display ?? "",
|
|
50
|
+
position: style?.position ?? "",
|
|
51
|
+
width: style?.width ?? "",
|
|
52
|
+
height: style?.height ?? "",
|
|
53
|
+
margin: style?.margin ?? "",
|
|
54
|
+
padding: style?.padding ?? "",
|
|
55
|
+
color: style?.color ?? "",
|
|
56
|
+
backgroundColor: style?.backgroundColor ?? "",
|
|
57
|
+
fontSize: style?.fontSize ?? "",
|
|
58
|
+
fontWeight: style?.fontWeight ?? "",
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export const createElementContext = (element, windowLabel) => {
|
|
62
|
+
const sourceElement = findNearestSourceElement(element);
|
|
63
|
+
const contextElement = sourceElement ?? element;
|
|
64
|
+
return {
|
|
65
|
+
element,
|
|
66
|
+
tagName: element.tagName.toLowerCase(),
|
|
67
|
+
text: getElementText(element),
|
|
68
|
+
accessibleName: getAccessibleName(element),
|
|
69
|
+
role: element.getAttribute("role"),
|
|
70
|
+
id: element.getAttribute("id"),
|
|
71
|
+
className: getElementClassName(element),
|
|
72
|
+
dataSlot: element.getAttribute("data-slot"),
|
|
73
|
+
source: getElementSourceLocation(contextElement),
|
|
74
|
+
sourceElementName: getElementSourceName(contextElement),
|
|
75
|
+
reactSource: getReactSourceLocation(element),
|
|
76
|
+
reactOwnerStack: getReactOwnerStack(element),
|
|
77
|
+
domPath: getDomPath(element),
|
|
78
|
+
bounds: element.getBoundingClientRect(),
|
|
79
|
+
url: element.ownerDocument.defaultView?.location.href ?? "",
|
|
80
|
+
windowLabel,
|
|
81
|
+
computedStyle: getComputedStyleSummary(element),
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
const serializeBounds = (bounds) => ({
|
|
85
|
+
x: Math.round(bounds.x),
|
|
86
|
+
y: Math.round(bounds.y),
|
|
87
|
+
width: Math.round(bounds.width),
|
|
88
|
+
height: Math.round(bounds.height),
|
|
89
|
+
top: Math.round(bounds.top),
|
|
90
|
+
right: Math.round(bounds.right),
|
|
91
|
+
bottom: Math.round(bounds.bottom),
|
|
92
|
+
left: Math.round(bounds.left),
|
|
93
|
+
});
|
|
94
|
+
const createAiTargetDescription = (context) => {
|
|
95
|
+
const label = context.accessibleName ?? context.text;
|
|
96
|
+
const name = label ? ` "${label}"` : "";
|
|
97
|
+
const slot = context.dataSlot ? ` with data-slot="${context.dataSlot}"` : "";
|
|
98
|
+
const source = formatSourceLocation(context.source) ?? formatSourceLocation(context.reactSource);
|
|
99
|
+
return `The visible ${context.tagName}${name}${slot}${source ? ` rendered from ${source}` : ""}.`;
|
|
100
|
+
};
|
|
101
|
+
export const createContextPayload = (context) => {
|
|
102
|
+
const source = formatSourceLocation(context.source);
|
|
103
|
+
const reactSource = formatSourceLocation(context.reactSource);
|
|
104
|
+
const payload = {
|
|
105
|
+
schemaVersion: 1,
|
|
106
|
+
kind: "pinpoint.selection",
|
|
107
|
+
capturedAt: new Date().toISOString(),
|
|
108
|
+
app: {
|
|
109
|
+
name: "Shotomatic",
|
|
110
|
+
environment: "development",
|
|
111
|
+
window: context.windowLabel,
|
|
112
|
+
url: context.url,
|
|
113
|
+
},
|
|
114
|
+
target: {
|
|
115
|
+
description: createAiTargetDescription(context),
|
|
116
|
+
tagName: context.tagName,
|
|
117
|
+
text: context.text,
|
|
118
|
+
accessibleName: context.accessibleName,
|
|
119
|
+
role: context.role,
|
|
120
|
+
id: context.id,
|
|
121
|
+
className: context.className,
|
|
122
|
+
dataSlot: context.dataSlot,
|
|
123
|
+
},
|
|
124
|
+
source: {
|
|
125
|
+
primary: source ?? reactSource,
|
|
126
|
+
jsxMetadata: context.source
|
|
127
|
+
? {
|
|
128
|
+
...context.source,
|
|
129
|
+
formatted: source,
|
|
130
|
+
elementName: context.sourceElementName,
|
|
131
|
+
}
|
|
132
|
+
: null,
|
|
133
|
+
reactDebug: context.reactSource
|
|
134
|
+
? {
|
|
135
|
+
...context.reactSource,
|
|
136
|
+
formatted: reactSource,
|
|
137
|
+
}
|
|
138
|
+
: null,
|
|
139
|
+
sourceElementName: context.sourceElementName,
|
|
140
|
+
},
|
|
141
|
+
react: {
|
|
142
|
+
ownerStack: context.reactOwnerStack,
|
|
143
|
+
},
|
|
144
|
+
dom: {
|
|
145
|
+
path: context.domPath,
|
|
146
|
+
},
|
|
147
|
+
layout: {
|
|
148
|
+
bounds: serializeBounds(context.bounds),
|
|
149
|
+
},
|
|
150
|
+
computedStyle: context.computedStyle,
|
|
151
|
+
promptHint: "Use target.description and source.primary to locate the UI element before editing.",
|
|
152
|
+
};
|
|
153
|
+
return `<${PAYLOAD_TAG}>\n${JSON.stringify(payload, null, 2)}\n</${PAYLOAD_TAG}>`;
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=contextPayload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextPayload.js","sourceRoot":"","sources":["../../src/core/contextPayload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createContextPayload, createElementContext } from "./contextPayload.js";
|
|
2
|
+
export { createPinpoint } from "./pickerOverlay.js";
|
|
3
|
+
export { findNearestSourceElement, formatSourceLocation, getElementSourceLocation, getElementSourceName, getReactOwnerStack, getReactSourceLocation, parseSourceLocation, } from "./sourceMetadata.js";
|
|
4
|
+
export { SOURCE_ATTR, SOURCE_NAME_ATTR, type ElementContext, type Pinpoint, type SourceLocation } from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createContextPayload, createElementContext } from "./contextPayload.js";
|
|
2
|
+
export { createPinpoint } from "./pickerOverlay.js";
|
|
3
|
+
export { findNearestSourceElement, formatSourceLocation, getElementSourceLocation, getElementSourceName, getReactOwnerStack, getReactSourceLocation, parseSourceLocation, } from "./sourceMetadata.js";
|
|
4
|
+
export { SOURCE_ATTR, SOURCE_NAME_ATTR } from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAA2D,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickerOverlay.d.ts","sourceRoot":"","sources":["../../src/core/pickerOverlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAqF5D,eAAO,MAAM,cAAc,GAAI,SAAS,eAAe,KAAG,QAwFzD,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { createContextPayload, createElementContext } from "./contextPayload.js";
|
|
2
|
+
const OVERLAY_ID = "pinpoint-overlay";
|
|
3
|
+
const LABEL_ID = "pinpoint-label";
|
|
4
|
+
const isSelectableElement = (element) => {
|
|
5
|
+
if (!element)
|
|
6
|
+
return false;
|
|
7
|
+
if (element.id === OVERLAY_ID || element.id === LABEL_ID)
|
|
8
|
+
return false;
|
|
9
|
+
if (element.closest(`#${OVERLAY_ID}, #${LABEL_ID}`))
|
|
10
|
+
return false;
|
|
11
|
+
return element.tagName.toLowerCase() !== "html";
|
|
12
|
+
};
|
|
13
|
+
const getElementAtPoint = (doc, clientX, clientY) => {
|
|
14
|
+
const element = doc.elementFromPoint(clientX, clientY);
|
|
15
|
+
return isSelectableElement(element) ? element : null;
|
|
16
|
+
};
|
|
17
|
+
const applyBox = (box, target) => {
|
|
18
|
+
if (!target) {
|
|
19
|
+
box.style.display = "none";
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const rect = target.getBoundingClientRect();
|
|
23
|
+
box.style.display = "block";
|
|
24
|
+
box.style.transform = `translate(${Math.round(rect.left)}px, ${Math.round(rect.top)}px)`;
|
|
25
|
+
box.style.width = `${Math.round(rect.width)}px`;
|
|
26
|
+
box.style.height = `${Math.round(rect.height)}px`;
|
|
27
|
+
};
|
|
28
|
+
const applyLabel = (label, target) => {
|
|
29
|
+
if (!target) {
|
|
30
|
+
label.style.display = "none";
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const rect = target.getBoundingClientRect();
|
|
34
|
+
const text = target.getAttribute("data-ui-context-source") ?? target.tagName.toLowerCase();
|
|
35
|
+
label.textContent = text;
|
|
36
|
+
label.style.display = "block";
|
|
37
|
+
label.style.transform = `translate(${Math.max(8, Math.round(rect.left))}px, ${Math.max(8, Math.round(rect.top) - 28)}px)`;
|
|
38
|
+
};
|
|
39
|
+
const createOverlayElement = (doc) => {
|
|
40
|
+
const box = doc.createElement("div");
|
|
41
|
+
box.id = OVERLAY_ID;
|
|
42
|
+
box.style.cssText = [
|
|
43
|
+
"position:fixed",
|
|
44
|
+
"display:none",
|
|
45
|
+
"z-index:2147483646",
|
|
46
|
+
"left:0",
|
|
47
|
+
"top:0",
|
|
48
|
+
"box-sizing:border-box",
|
|
49
|
+
"pointer-events:none",
|
|
50
|
+
"border:1.5px solid #ff4d4f",
|
|
51
|
+
"background:rgba(255,77,79,0.08)",
|
|
52
|
+
"box-shadow:0 0 0 9999px rgba(15,23,42,0.05)",
|
|
53
|
+
"border-radius:4px",
|
|
54
|
+
"transition:transform 80ms ease,width 80ms ease,height 80ms ease",
|
|
55
|
+
].join(";");
|
|
56
|
+
return box;
|
|
57
|
+
};
|
|
58
|
+
const createLabelElement = (doc) => {
|
|
59
|
+
const label = doc.createElement("div");
|
|
60
|
+
label.id = LABEL_ID;
|
|
61
|
+
label.style.cssText = [
|
|
62
|
+
"position:fixed",
|
|
63
|
+
"display:none",
|
|
64
|
+
"z-index:2147483647",
|
|
65
|
+
"left:0",
|
|
66
|
+
"top:0",
|
|
67
|
+
"max-width:min(520px,calc(100vw - 16px))",
|
|
68
|
+
"overflow:hidden",
|
|
69
|
+
"text-overflow:ellipsis",
|
|
70
|
+
"white-space:nowrap",
|
|
71
|
+
"pointer-events:none",
|
|
72
|
+
"border-radius:5px",
|
|
73
|
+
"background:rgba(15,23,42,0.95)",
|
|
74
|
+
"color:white",
|
|
75
|
+
"font:12px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace",
|
|
76
|
+
"padding:4px 7px",
|
|
77
|
+
"box-shadow:0 8px 24px rgba(15,23,42,0.24)",
|
|
78
|
+
].join(";");
|
|
79
|
+
return label;
|
|
80
|
+
};
|
|
81
|
+
export const createPinpoint = (options) => {
|
|
82
|
+
const doc = options.document ?? globalThis.document;
|
|
83
|
+
let active = false;
|
|
84
|
+
let currentElement = null;
|
|
85
|
+
let box = null;
|
|
86
|
+
let label = null;
|
|
87
|
+
const ensureOverlay = () => {
|
|
88
|
+
if (!box) {
|
|
89
|
+
box = createOverlayElement(doc);
|
|
90
|
+
doc.body.appendChild(box);
|
|
91
|
+
}
|
|
92
|
+
if (!label) {
|
|
93
|
+
label = createLabelElement(doc);
|
|
94
|
+
doc.body.appendChild(label);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const removeOverlay = () => {
|
|
98
|
+
box?.remove();
|
|
99
|
+
label?.remove();
|
|
100
|
+
box = null;
|
|
101
|
+
label = null;
|
|
102
|
+
};
|
|
103
|
+
const setCurrentElement = (element) => {
|
|
104
|
+
currentElement = element;
|
|
105
|
+
if (!box || !label)
|
|
106
|
+
return;
|
|
107
|
+
applyBox(box, element);
|
|
108
|
+
applyLabel(label, element);
|
|
109
|
+
};
|
|
110
|
+
const handlePointerMove = (event) => {
|
|
111
|
+
setCurrentElement(getElementAtPoint(doc, event.clientX, event.clientY));
|
|
112
|
+
};
|
|
113
|
+
const handleClick = (event) => {
|
|
114
|
+
if (!currentElement)
|
|
115
|
+
return;
|
|
116
|
+
event.preventDefault();
|
|
117
|
+
event.stopPropagation();
|
|
118
|
+
event.stopImmediatePropagation();
|
|
119
|
+
const context = createElementContext(currentElement, options.getWindowLabel?.() ?? null);
|
|
120
|
+
const payload = createContextPayload(context);
|
|
121
|
+
void options.copyText(payload).then(() => {
|
|
122
|
+
options.onCopied?.(payload, context);
|
|
123
|
+
stop();
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
const handleKeyDown = (event) => {
|
|
127
|
+
if (event.key !== "Escape")
|
|
128
|
+
return;
|
|
129
|
+
event.preventDefault();
|
|
130
|
+
stop();
|
|
131
|
+
};
|
|
132
|
+
const start = () => {
|
|
133
|
+
if (active)
|
|
134
|
+
return;
|
|
135
|
+
active = true;
|
|
136
|
+
ensureOverlay();
|
|
137
|
+
doc.addEventListener("pointermove", handlePointerMove, true);
|
|
138
|
+
doc.addEventListener("click", handleClick, true);
|
|
139
|
+
doc.addEventListener("keydown", handleKeyDown, true);
|
|
140
|
+
doc.body.style.cursor = "crosshair";
|
|
141
|
+
};
|
|
142
|
+
function stop() {
|
|
143
|
+
if (!active)
|
|
144
|
+
return;
|
|
145
|
+
active = false;
|
|
146
|
+
currentElement = null;
|
|
147
|
+
doc.removeEventListener("pointermove", handlePointerMove, true);
|
|
148
|
+
doc.removeEventListener("click", handleClick, true);
|
|
149
|
+
doc.removeEventListener("keydown", handleKeyDown, true);
|
|
150
|
+
doc.body.style.cursor = "";
|
|
151
|
+
removeOverlay();
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
start,
|
|
155
|
+
stop,
|
|
156
|
+
toggle: () => {
|
|
157
|
+
if (active) {
|
|
158
|
+
stop();
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
start();
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
isActive: () => active,
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=pickerOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickerOverlay.js","sourceRoot":"","sources":["../../src/core/pickerOverlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type SourceLocation } from "./types.js";
|
|
2
|
+
export declare const parseSourceLocation: (value: string | null) => SourceLocation | null;
|
|
3
|
+
export declare const formatSourceLocation: (location: SourceLocation | null) => string | null;
|
|
4
|
+
export declare const findNearestSourceElement: (element: Element) => HTMLElement | SVGElement | null;
|
|
5
|
+
export declare const getElementSourceLocation: (element: Element) => SourceLocation | null;
|
|
6
|
+
export declare const getElementSourceName: (element: Element) => string | null;
|
|
7
|
+
export declare const getReactSourceLocation: (element: Element) => SourceLocation | null;
|
|
8
|
+
export declare const getReactOwnerStack: (element: Element) => readonly string[];
|
|
9
|
+
//# sourceMappingURL=sourceMetadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMetadata.d.ts","sourceRoot":"","sources":["../../src/core/sourceMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AA2BhF,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,GAAG,IAAI,KAAG,cAAc,GAAG,IAc3E,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,UAAU,cAAc,GAAG,IAAI,kBAGnE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,SAAS,OAAO,KAChB,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC;AAEzE,eAAO,MAAM,wBAAwB,GAAI,SAAS,OAAO,KAAG,cAAc,GAAG,IAG5E,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,KAAG,MAAM,GAAG,IAGhE,CAAC;AAkCF,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,KAAG,cAAc,GAAG,IAU1E,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,OAAO,KAAG,SAAS,MAAM,EAepE,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { SOURCE_ATTR, SOURCE_NAME_ATTR } from "./types.js";
|
|
2
|
+
const REACT_FIBER_PREFIXES = ["__reactFiber$", "__reactInternalInstance$"];
|
|
3
|
+
const isRecord = (value) => Boolean(value) && typeof value === "object";
|
|
4
|
+
const parsePositiveInteger = (value) => {
|
|
5
|
+
const parsed = Number.parseInt(value, 10);
|
|
6
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
|
|
7
|
+
};
|
|
8
|
+
export const parseSourceLocation = (value) => {
|
|
9
|
+
if (!value)
|
|
10
|
+
return null;
|
|
11
|
+
const parts = value.split(":");
|
|
12
|
+
if (parts.length < 3)
|
|
13
|
+
return null;
|
|
14
|
+
const column = parsePositiveInteger(parts.at(-1) ?? "");
|
|
15
|
+
const line = parsePositiveInteger(parts.at(-2) ?? "");
|
|
16
|
+
if (!line || !column)
|
|
17
|
+
return null;
|
|
18
|
+
return {
|
|
19
|
+
file: parts.slice(0, -2).join(":"),
|
|
20
|
+
line,
|
|
21
|
+
column,
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export const formatSourceLocation = (location) => {
|
|
25
|
+
if (!location)
|
|
26
|
+
return null;
|
|
27
|
+
return `${location.file}:${location.line}:${location.column}`;
|
|
28
|
+
};
|
|
29
|
+
export const findNearestSourceElement = (element) => element.closest(`[${SOURCE_ATTR}]`);
|
|
30
|
+
export const getElementSourceLocation = (element) => {
|
|
31
|
+
const sourceElement = findNearestSourceElement(element);
|
|
32
|
+
return parseSourceLocation(sourceElement?.getAttribute(SOURCE_ATTR) ?? null);
|
|
33
|
+
};
|
|
34
|
+
export const getElementSourceName = (element) => {
|
|
35
|
+
const sourceElement = findNearestSourceElement(element);
|
|
36
|
+
return sourceElement?.getAttribute(SOURCE_NAME_ATTR) ?? null;
|
|
37
|
+
};
|
|
38
|
+
const getReactFiber = (element) => {
|
|
39
|
+
const record = element;
|
|
40
|
+
const key = Object.keys(record).find((candidate) => REACT_FIBER_PREFIXES.some((prefix) => candidate.startsWith(prefix)));
|
|
41
|
+
if (!key)
|
|
42
|
+
return null;
|
|
43
|
+
const value = record[key];
|
|
44
|
+
return isRecord(value) ? value : null;
|
|
45
|
+
};
|
|
46
|
+
const getComponentName = (value) => {
|
|
47
|
+
if (typeof value === "string")
|
|
48
|
+
return value;
|
|
49
|
+
if (!isRecord(value))
|
|
50
|
+
return null;
|
|
51
|
+
const displayName = value.displayName;
|
|
52
|
+
if (typeof displayName === "string" && displayName.length > 0)
|
|
53
|
+
return displayName;
|
|
54
|
+
const name = value.name;
|
|
55
|
+
return typeof name === "string" && name.length > 0 ? name : null;
|
|
56
|
+
};
|
|
57
|
+
const sourceFromReactDebugSource = (source) => {
|
|
58
|
+
if (!source)
|
|
59
|
+
return null;
|
|
60
|
+
if (typeof source.fileName !== "string")
|
|
61
|
+
return null;
|
|
62
|
+
if (typeof source.lineNumber !== "number" || !Number.isFinite(source.lineNumber))
|
|
63
|
+
return null;
|
|
64
|
+
const column = typeof source.columnNumber === "number" && Number.isFinite(source.columnNumber) ? source.columnNumber : 1;
|
|
65
|
+
return {
|
|
66
|
+
file: source.fileName,
|
|
67
|
+
line: source.lineNumber,
|
|
68
|
+
column,
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
export const getReactSourceLocation = (element) => {
|
|
72
|
+
let fiber = getReactFiber(element);
|
|
73
|
+
let depth = 0;
|
|
74
|
+
while (fiber && depth < 20) {
|
|
75
|
+
const source = sourceFromReactDebugSource(fiber._debugSource);
|
|
76
|
+
if (source)
|
|
77
|
+
return source;
|
|
78
|
+
fiber = fiber.return ?? fiber._debugOwner ?? null;
|
|
79
|
+
depth += 1;
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
};
|
|
83
|
+
export const getReactOwnerStack = (element) => {
|
|
84
|
+
const stack = [];
|
|
85
|
+
let fiber = getReactFiber(element);
|
|
86
|
+
let depth = 0;
|
|
87
|
+
while (fiber && depth < 20) {
|
|
88
|
+
const name = getComponentName(fiber.elementType) ?? getComponentName(fiber.type);
|
|
89
|
+
if (name && stack.at(-1) !== name) {
|
|
90
|
+
stack.push(name);
|
|
91
|
+
}
|
|
92
|
+
fiber = fiber._debugOwner ?? fiber.return ?? null;
|
|
93
|
+
depth += 1;
|
|
94
|
+
}
|
|
95
|
+
return stack;
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=sourceMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMetadata.js","sourceRoot":"","sources":["../../src/core/sourceMetadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export declare const SOURCE_ATTR = "data-ui-context-source";
|
|
2
|
+
export declare const SOURCE_NAME_ATTR = "data-ui-context-name";
|
|
3
|
+
export type SourceLocation = {
|
|
4
|
+
readonly file: string;
|
|
5
|
+
readonly line: number;
|
|
6
|
+
readonly column: number;
|
|
7
|
+
};
|
|
8
|
+
export type ElementContext = {
|
|
9
|
+
readonly element: Element;
|
|
10
|
+
readonly tagName: string;
|
|
11
|
+
readonly text: string | null;
|
|
12
|
+
readonly accessibleName: string | null;
|
|
13
|
+
readonly role: string | null;
|
|
14
|
+
readonly id: string | null;
|
|
15
|
+
readonly className: string | null;
|
|
16
|
+
readonly dataSlot: string | null;
|
|
17
|
+
readonly source: SourceLocation | null;
|
|
18
|
+
readonly sourceElementName: string | null;
|
|
19
|
+
readonly reactSource: SourceLocation | null;
|
|
20
|
+
readonly reactOwnerStack: readonly string[];
|
|
21
|
+
readonly domPath: string;
|
|
22
|
+
readonly bounds: DOMRect;
|
|
23
|
+
readonly url: string;
|
|
24
|
+
readonly windowLabel: string | null;
|
|
25
|
+
readonly computedStyle: {
|
|
26
|
+
readonly display: string;
|
|
27
|
+
readonly position: string;
|
|
28
|
+
readonly width: string;
|
|
29
|
+
readonly height: string;
|
|
30
|
+
readonly margin: string;
|
|
31
|
+
readonly padding: string;
|
|
32
|
+
readonly color: string;
|
|
33
|
+
readonly backgroundColor: string;
|
|
34
|
+
readonly fontSize: string;
|
|
35
|
+
readonly fontWeight: string;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export type PinpointOptions = {
|
|
39
|
+
readonly copyText: (text: string) => Promise<void>;
|
|
40
|
+
readonly getWindowLabel?: () => string | null;
|
|
41
|
+
readonly onCopied?: (payload: string, context: ElementContext) => void;
|
|
42
|
+
readonly document?: Document;
|
|
43
|
+
};
|
|
44
|
+
export type Pinpoint = {
|
|
45
|
+
readonly start: () => void;
|
|
46
|
+
readonly stop: () => void;
|
|
47
|
+
readonly toggle: () => void;
|
|
48
|
+
readonly isActive: () => boolean;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,2BAA2B,CAAC;AACpD,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC;CAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,wBAAwB,CAAC;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contentScript.d.ts","sourceRoot":"","sources":["../../../src/integrations/browser-extension/contentScript.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,yCAelC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createPinpoint } from "../../core/index.js";
|
|
2
|
+
export const installBrowserPinpoint = () => {
|
|
3
|
+
const picker = createPinpoint({
|
|
4
|
+
copyText: async (text) => {
|
|
5
|
+
await navigator.clipboard.writeText(text);
|
|
6
|
+
},
|
|
7
|
+
getWindowLabel: () => "browser",
|
|
8
|
+
});
|
|
9
|
+
window.addEventListener("message", (event) => {
|
|
10
|
+
if (event.source !== window)
|
|
11
|
+
return;
|
|
12
|
+
if (event.data !== "pinpoint:toggle")
|
|
13
|
+
return;
|
|
14
|
+
picker.toggle();
|
|
15
|
+
});
|
|
16
|
+
return picker;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=contentScript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contentScript.js","sourceRoot":"","sources":["../../../src/integrations/browser-extension/contentScript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,MAAM,MAAM,GAAG,cAAc,CAAC;QAC5B,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS;KAChC,CAAC,CAAC;IAEH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO;QAC7C,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const PINPOINT_TOGGLE_CHANNEL = "pinpoint:toggle";
|
|
2
|
+
export declare const PINPOINT_COPY_CHANNEL = "pinpoint:copy";
|
|
3
|
+
export type ElectronPinpointApi = {
|
|
4
|
+
readonly copyText: (text: string) => Promise<void>;
|
|
5
|
+
readonly onToggle: (listener: () => void) => () => void;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=channels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../../src/integrations/electron/channels.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,oBAAoB,CAAC;AACzD,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../../../src/integrations/electron/channels.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AACzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
export declare const DEFAULT_PINPOINT_ACCELERATOR = "CommandOrControl+Shift+C";
|
|
3
|
+
export declare const registerElectronPinpointMain: () => Effect.Effect<void, never, import("effect/Scope").Scope>;
|
|
4
|
+
export declare const toggleElectronPinpointForFocusedWindow: () => Effect.Effect<boolean, never, never>;
|
|
5
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/integrations/electron/main.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AAUvE,eAAO,MAAM,4BAA4B,gEAatC,CAAC;AAEJ,eAAO,MAAM,sCAAsC,4CAM/C,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import electron from "electron";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { PINPOINT_COPY_CHANNEL, PINPOINT_TOGGLE_CHANNEL } from "./channels.js";
|
|
4
|
+
export const DEFAULT_PINPOINT_ACCELERATOR = "CommandOrControl+Shift+C";
|
|
5
|
+
const { BrowserWindow, clipboard, ipcMain } = electron;
|
|
6
|
+
const getTargetWindow = () => {
|
|
7
|
+
const focused = BrowserWindow.getFocusedWindow();
|
|
8
|
+
if (focused && !focused.isDestroyed())
|
|
9
|
+
return focused;
|
|
10
|
+
return BrowserWindow.getAllWindows().find((window) => !window.isDestroyed() && window.isVisible()) ?? null;
|
|
11
|
+
};
|
|
12
|
+
export const registerElectronPinpointMain = () => Effect.acquireRelease(Effect.sync(() => {
|
|
13
|
+
ipcMain.handle(PINPOINT_COPY_CHANNEL, (_event, text) => {
|
|
14
|
+
if (typeof text !== "string")
|
|
15
|
+
return false;
|
|
16
|
+
clipboard.writeText(text);
|
|
17
|
+
return true;
|
|
18
|
+
});
|
|
19
|
+
}), () => Effect.sync(() => {
|
|
20
|
+
ipcMain.removeHandler(PINPOINT_COPY_CHANNEL);
|
|
21
|
+
}));
|
|
22
|
+
export const toggleElectronPinpointForFocusedWindow = () => Effect.sync(() => {
|
|
23
|
+
const targetWindow = getTargetWindow();
|
|
24
|
+
if (!targetWindow)
|
|
25
|
+
return false;
|
|
26
|
+
targetWindow.webContents.send(PINPOINT_TOGGLE_CHANNEL);
|
|
27
|
+
return true;
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/integrations/electron/main.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE/E,MAAM,CAAC,MAAM,4BAA4B,GAAG,0BAA0B,CAAC;AAEvE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,QAAqC,CAAC;AAEpF,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,EAAE,CAAC;IACjD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;QAAE,OAAO,OAAO,CAAC;IACtD,OAAO,aAAa,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,IAAI,CAAC;AAC7G,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,EAAE,CAC/C,MAAM,CAAC,cAAc,CACnB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,MAAM,EAAE,IAAa,EAAE,EAAE;QAC9D,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC3C,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,EACF,GAAG,EAAE,CACH,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;AAC/C,CAAC,CAAC,CACL,CAAC;AAEJ,MAAM,CAAC,MAAM,sCAAsC,GAAG,GAAG,EAAE,CACzD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAChC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../../../src/integrations/electron/preload.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,6BAA6B,YAiBzC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import electron from "electron";
|
|
2
|
+
import { PINPOINT_COPY_CHANNEL, PINPOINT_TOGGLE_CHANNEL } from "./channels.js";
|
|
3
|
+
const { contextBridge, ipcRenderer } = electron;
|
|
4
|
+
export const exposeElectronPinpointPreload = () => {
|
|
5
|
+
const api = {
|
|
6
|
+
copyText: async (text) => {
|
|
7
|
+
await ipcRenderer.invoke(PINPOINT_COPY_CHANNEL, text);
|
|
8
|
+
},
|
|
9
|
+
onToggle: (listener) => {
|
|
10
|
+
const handleToggle = () => {
|
|
11
|
+
listener();
|
|
12
|
+
};
|
|
13
|
+
ipcRenderer.on(PINPOINT_TOGGLE_CHANNEL, handleToggle);
|
|
14
|
+
return () => {
|
|
15
|
+
ipcRenderer.removeListener(PINPOINT_TOGGLE_CHANNEL, handleToggle);
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
contextBridge.exposeInMainWorld("pinpoint", api);
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=preload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preload.js","sourceRoot":"","sources":["../../../src/integrations/electron/preload.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE/E,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,QAAqC,CAAC;AAE7E,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,EAAE;IAChD,MAAM,GAAG,GAAwB;QAC/B,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,WAAW,CAAC,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;QACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;YACrB,MAAM,YAAY,GAAG,GAAG,EAAE;gBACxB,QAAQ,EAAE,CAAC;YACb,CAAC,CAAC;YACF,WAAW,CAAC,EAAE,CAAC,uBAAuB,EAAE,YAAY,CAAC,CAAC;YACtD,OAAO,GAAG,EAAE;gBACV,WAAW,CAAC,cAAc,CAAC,uBAAuB,EAAE,YAAY,CAAC,CAAC;YACpE,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,aAAa,CAAC,iBAAiB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ElectronPinpointApi } from "./channels.js";
|
|
2
|
+
declare global {
|
|
3
|
+
interface Window {
|
|
4
|
+
readonly pinpoint?: ElectronPinpointApi;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export type ElectronPinpointRendererOptions = {
|
|
8
|
+
readonly windowLabel?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const installElectronPinpoint: (options?: ElectronPinpointRendererOptions) => () => void;
|
|
11
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/integrations/electron/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;KACzC;CACF;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAOF,eAAO,MAAM,uBAAuB,GAAI,UAAS,+BAAoC,eAkBpF,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createPinpoint } from "../../core/index.js";
|
|
2
|
+
const getElectronWindowType = () => {
|
|
3
|
+
const candidate = window;
|
|
4
|
+
return candidate.electron?.context?.windowType ?? null;
|
|
5
|
+
};
|
|
6
|
+
export const installElectronPinpoint = (options = {}) => {
|
|
7
|
+
const api = window.pinpoint;
|
|
8
|
+
if (!api) {
|
|
9
|
+
return () => undefined;
|
|
10
|
+
}
|
|
11
|
+
const picker = createPinpoint({
|
|
12
|
+
copyText: api.copyText,
|
|
13
|
+
getWindowLabel: () => options.windowLabel ?? getElectronWindowType(),
|
|
14
|
+
});
|
|
15
|
+
const unsubscribe = api.onToggle(() => {
|
|
16
|
+
picker.toggle();
|
|
17
|
+
});
|
|
18
|
+
return () => {
|
|
19
|
+
unsubscribe();
|
|
20
|
+
picker.stop();
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/integrations/electron/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAarD,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACjC,MAAM,SAAS,GAAG,MAAuE,CAAC;IAC1F,OAAO,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,UAA2C,EAAE,EAAE,EAAE;IACvF,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,qBAAqB,EAAE;KACrE,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;QACpC,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,WAAW,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
type SourceMetadataPluginOptions = {
|
|
3
|
+
readonly root?: string;
|
|
4
|
+
readonly include?: RegExp;
|
|
5
|
+
readonly exclude?: RegExp;
|
|
6
|
+
readonly enabled?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const pinpointSourceMetadataPlugin: (options?: SourceMetadataPluginOptions) => Plugin;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=sourceMetadataPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMetadataPlugin.d.ts","sourceRoot":"","sources":["../../src/vite/sourceMetadataPlugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,KAAK,2BAA2B,GAAG;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AA+LF,eAAO,MAAM,4BAA4B,GAAI,UAAS,2BAAgC,KAAG,MAuBxF,CAAC"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { SOURCE_ATTR, SOURCE_NAME_ATTR } from "../core/types.js";
|
|
3
|
+
const DEFAULT_INCLUDE = /\.[jt]sx$/;
|
|
4
|
+
const DEFAULT_EXCLUDE = /(?:node_modules|routeTree\.gen\.ts)/;
|
|
5
|
+
const RESERVED_AFTER_TAG_NAME = new Set(["extends", "keyof", "infer"]);
|
|
6
|
+
const normalizeId = (id) => id.split("?")[0] ?? id;
|
|
7
|
+
const buildLineStarts = (code) => {
|
|
8
|
+
const starts = [0];
|
|
9
|
+
for (let index = 0; index < code.length; index += 1) {
|
|
10
|
+
if (code[index] === "\n")
|
|
11
|
+
starts.push(index + 1);
|
|
12
|
+
}
|
|
13
|
+
return starts;
|
|
14
|
+
};
|
|
15
|
+
const getLineColumn = (lineStarts, index) => {
|
|
16
|
+
let low = 0;
|
|
17
|
+
let high = lineStarts.length - 1;
|
|
18
|
+
while (low <= high) {
|
|
19
|
+
const middle = Math.floor((low + high) / 2);
|
|
20
|
+
const start = lineStarts[middle] ?? 0;
|
|
21
|
+
if (start <= index) {
|
|
22
|
+
low = middle + 1;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
high = middle - 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const lineIndex = Math.max(0, high);
|
|
29
|
+
return {
|
|
30
|
+
line: lineIndex + 1,
|
|
31
|
+
column: index - (lineStarts[lineIndex] ?? 0) + 1,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
const getRelativeSourceFile = (root, id) => path.relative(root, id).replaceAll(path.sep, "/");
|
|
35
|
+
const findOpeningTagEnd = (code, startIndex) => {
|
|
36
|
+
let quote = null;
|
|
37
|
+
let expressionDepth = 0;
|
|
38
|
+
for (let index = startIndex + 1; index < code.length; index += 1) {
|
|
39
|
+
const char = code[index];
|
|
40
|
+
const previous = code[index - 1];
|
|
41
|
+
if (quote) {
|
|
42
|
+
if (char === quote && previous !== "\\")
|
|
43
|
+
quote = null;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (char === "'" || char === '"' || char === "`") {
|
|
47
|
+
quote = char;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (char === "{") {
|
|
51
|
+
expressionDepth += 1;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (char === "}") {
|
|
55
|
+
expressionDepth = Math.max(0, expressionDepth - 1);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (char === ">" && expressionDepth === 0) {
|
|
59
|
+
return index;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
};
|
|
64
|
+
const getPreviousWord = (code, endIndex) => {
|
|
65
|
+
let startIndex = endIndex;
|
|
66
|
+
while (startIndex >= 0 && /[A-Za-z]/.test(code[startIndex] ?? "")) {
|
|
67
|
+
startIndex -= 1;
|
|
68
|
+
}
|
|
69
|
+
return code.slice(startIndex + 1, endIndex + 1);
|
|
70
|
+
};
|
|
71
|
+
const isInsideStringOrComment = (code, targetIndex) => {
|
|
72
|
+
let quote = null;
|
|
73
|
+
let inLineComment = false;
|
|
74
|
+
let inBlockComment = false;
|
|
75
|
+
for (let index = 0; index < targetIndex; index += 1) {
|
|
76
|
+
const char = code[index];
|
|
77
|
+
const next = code[index + 1];
|
|
78
|
+
const previous = code[index - 1];
|
|
79
|
+
if (inLineComment) {
|
|
80
|
+
if (char === "\n")
|
|
81
|
+
inLineComment = false;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (inBlockComment) {
|
|
85
|
+
if (char === "*" && next === "/") {
|
|
86
|
+
inBlockComment = false;
|
|
87
|
+
index += 1;
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (quote) {
|
|
92
|
+
if (char === quote && previous !== "\\")
|
|
93
|
+
quote = null;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (char === "/" && next === "/") {
|
|
97
|
+
inLineComment = true;
|
|
98
|
+
index += 1;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (char === "/" && next === "*") {
|
|
102
|
+
inBlockComment = true;
|
|
103
|
+
index += 1;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (char === "'" || char === '"' || char === "`") {
|
|
107
|
+
quote = char;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return Boolean(quote || inLineComment || inBlockComment);
|
|
111
|
+
};
|
|
112
|
+
const isLikelyJsxOpeningStart = (code, tagStart) => {
|
|
113
|
+
let previousIndex = tagStart - 1;
|
|
114
|
+
while (previousIndex >= 0 && /\s/.test(code[previousIndex] ?? "")) {
|
|
115
|
+
previousIndex -= 1;
|
|
116
|
+
}
|
|
117
|
+
if (previousIndex < 0)
|
|
118
|
+
return true;
|
|
119
|
+
const previous = code[previousIndex] ?? "";
|
|
120
|
+
if ("([{=,:?;!&|".includes(previous))
|
|
121
|
+
return true;
|
|
122
|
+
if (previous === ">" && code[previousIndex - 1] === "=")
|
|
123
|
+
return true;
|
|
124
|
+
if (/[A-Za-z0-9_$.)\]]/.test(previous)) {
|
|
125
|
+
const previousWord = getPreviousWord(code, previousIndex);
|
|
126
|
+
return previousWord === "return" || previousWord === "yield";
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
};
|
|
130
|
+
const shouldSkipTag = (code, tagStart, tagName, openingEnd) => {
|
|
131
|
+
const opening = code.slice(tagStart, openingEnd);
|
|
132
|
+
if (opening.includes(SOURCE_ATTR))
|
|
133
|
+
return true;
|
|
134
|
+
if (tagName === "React.Fragment")
|
|
135
|
+
return true;
|
|
136
|
+
const afterTagName = code.slice(tagStart + tagName.length + 1, openingEnd).trimStart();
|
|
137
|
+
const firstWord = afterTagName.match(/^[A-Za-z]+/)?.[0];
|
|
138
|
+
return Boolean(firstWord && RESERVED_AFTER_TAG_NAME.has(firstWord));
|
|
139
|
+
};
|
|
140
|
+
const applyEdits = (code, edits) => {
|
|
141
|
+
let transformed = code;
|
|
142
|
+
for (const edit of [...edits].sort((left, right) => right.index - left.index)) {
|
|
143
|
+
transformed = `${transformed.slice(0, edit.index)}${edit.text}${transformed.slice(edit.index)}`;
|
|
144
|
+
}
|
|
145
|
+
return transformed;
|
|
146
|
+
};
|
|
147
|
+
const transformJsxSourceMetadata = (code, id, root) => {
|
|
148
|
+
const sourceFile = getRelativeSourceFile(root, id);
|
|
149
|
+
const lineStarts = buildLineStarts(code);
|
|
150
|
+
const edits = [];
|
|
151
|
+
const openingTagPattern = /<([A-Za-z][\w.$:-]*)(?=[\s>/])/g;
|
|
152
|
+
let match;
|
|
153
|
+
while ((match = openingTagPattern.exec(code))) {
|
|
154
|
+
const tagStart = match.index;
|
|
155
|
+
const tagName = match[1];
|
|
156
|
+
if (!tagName)
|
|
157
|
+
continue;
|
|
158
|
+
if (code[tagStart + 1] === "/")
|
|
159
|
+
continue;
|
|
160
|
+
if (isInsideStringOrComment(code, tagStart))
|
|
161
|
+
continue;
|
|
162
|
+
if (!isLikelyJsxOpeningStart(code, tagStart))
|
|
163
|
+
continue;
|
|
164
|
+
const openingEnd = findOpeningTagEnd(code, tagStart);
|
|
165
|
+
if (openingEnd === null)
|
|
166
|
+
continue;
|
|
167
|
+
if (shouldSkipTag(code, tagStart, tagName, openingEnd))
|
|
168
|
+
continue;
|
|
169
|
+
const previousNonSpaceIndex = (() => {
|
|
170
|
+
for (let index = openingEnd - 1; index > tagStart; index -= 1) {
|
|
171
|
+
if (!/\s/.test(code[index] ?? ""))
|
|
172
|
+
return index;
|
|
173
|
+
}
|
|
174
|
+
return openingEnd - 1;
|
|
175
|
+
})();
|
|
176
|
+
const insertIndex = code[previousNonSpaceIndex] === "/" ? previousNonSpaceIndex : openingEnd;
|
|
177
|
+
const location = getLineColumn(lineStarts, tagStart);
|
|
178
|
+
edits.push({
|
|
179
|
+
index: insertIndex,
|
|
180
|
+
text: ` ${SOURCE_ATTR}="${sourceFile}:${location.line}:${location.column}" ${SOURCE_NAME_ATTR}="${tagName}"`,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return edits.length > 0 ? applyEdits(code, edits) : code;
|
|
184
|
+
};
|
|
185
|
+
export const pinpointSourceMetadataPlugin = (options = {}) => {
|
|
186
|
+
let root = options.root ? path.resolve(options.root) : process.cwd();
|
|
187
|
+
let enabled = options.enabled ?? true;
|
|
188
|
+
return {
|
|
189
|
+
name: "pinpoint-source-metadata",
|
|
190
|
+
enforce: "pre",
|
|
191
|
+
configResolved(config) {
|
|
192
|
+
root = options.root ? path.resolve(options.root) : config.root;
|
|
193
|
+
enabled = options.enabled ?? config.mode !== "production";
|
|
194
|
+
},
|
|
195
|
+
transform(code, id) {
|
|
196
|
+
if (!enabled)
|
|
197
|
+
return null;
|
|
198
|
+
const cleanId = normalizeId(id);
|
|
199
|
+
const include = options.include ?? DEFAULT_INCLUDE;
|
|
200
|
+
const exclude = options.exclude ?? DEFAULT_EXCLUDE;
|
|
201
|
+
if (!include.test(cleanId) || exclude.test(cleanId))
|
|
202
|
+
return null;
|
|
203
|
+
return {
|
|
204
|
+
code: transformJsxSourceMetadata(code, cleanId, root),
|
|
205
|
+
map: null,
|
|
206
|
+
};
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
//# sourceMappingURL=sourceMetadataPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMetadataPlugin.js","sourceRoot":"","sources":["../../src/vite/sourceMetadataPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAcjE,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,MAAM,eAAe,GAAG,qCAAqC,CAAC;AAC9D,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvE,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAE3D,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,EAAE;IACvC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,UAA6B,EAAE,KAAa,EAAE,EAAE;IACrE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YACnB,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO;QACL,IAAI,EAAE,SAAS,GAAG,CAAC;QACnB,MAAM,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;KACjD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE9G,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,UAAkB,EAAE,EAAE;IAC7D,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,IAAI,KAAK,GAAG,UAAU,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,IAAI,KAAK,KAAK,IAAI,QAAQ,KAAK,IAAI;gBAAE,KAAK,GAAG,IAAI,CAAC;YACtD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjD,KAAK,GAAG,IAAI,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,eAAe,IAAI,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,EAAE;IACzD,IAAI,UAAU,GAAG,QAAQ,CAAC;IAC1B,OAAO,UAAU,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAClE,UAAU,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAE,EAAE;IACpE,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEjC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,IAAI,KAAK,IAAI;gBAAE,aAAa,GAAG,KAAK,CAAC;YACzC,SAAS;QACX,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,cAAc,GAAG,KAAK,CAAC;gBACvB,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,IAAI,KAAK,KAAK,IAAI,QAAQ,KAAK,IAAI;gBAAE,KAAK,GAAG,IAAI,CAAC;YACtD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,aAAa,GAAG,IAAI,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,cAAc,GAAG,IAAI,CAAC;YACtB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjD,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,IAAI,aAAa,IAAI,cAAc,CAAC,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,EAAE;IACjE,IAAI,aAAa,GAAG,QAAQ,GAAG,CAAC,CAAC;IACjC,OAAO,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAClE,aAAa,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,aAAa,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,QAAQ,KAAK,GAAG,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACrE,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC1D,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,OAAO,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,OAAe,EAAE,UAAkB,EAAE,EAAE;IAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,OAAO,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC;IACvF,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,SAAS,IAAI,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAsB,EAAE,EAAE;IAC1D,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9E,WAAW,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IAClG,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,IAAY,EAAE,EAAE;IAC5E,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,iBAAiB,GAAG,iCAAiC,CAAC;IAC5D,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG;YAAE,SAAS;QACzC,IAAI,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC;YAAE,SAAS;QACtD,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC;YAAE,SAAS;QACvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,UAAU,KAAK,IAAI;YAAE,SAAS;QAClC,IAAI,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;YAAE,SAAS;QAEjE,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE;YAClC,KAAK,IAAI,KAAK,GAAG,UAAU,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC9D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAAE,OAAO,KAAK,CAAC;YAClD,CAAC;YACD,OAAO,UAAU,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7F,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,IAAI,WAAW,KAAK,UAAU,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,gBAAgB,KAAK,OAAO,GAAG;SAC7G,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,UAAuC,EAAE,EAAU,EAAE;IAChG,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrE,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IAEtC,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,KAAK;QACd,cAAc,CAAC,MAAM;YACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;YAC/D,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC;QAC5D,CAAC;QACD,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;YACnD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjE,OAAO;gBACL,IAAI,EAAE,0BAA0B,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;gBACrD,GAAG,EAAE,IAAI;aACV,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wyverselabs/pinpoint",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Pin rendered React and Electron UI to the source context an AI needs.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/w00ing/pinpoint",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+ssh://git@github.com/w00ing/pinpoint.git"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"sideEffects": false,
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md",
|
|
16
|
+
"package.json"
|
|
17
|
+
],
|
|
18
|
+
"main": "./dist/core/index.js",
|
|
19
|
+
"types": "./dist/core/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/core/index.d.ts",
|
|
23
|
+
"import": "./dist/core/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./core": {
|
|
26
|
+
"types": "./dist/core/index.d.ts",
|
|
27
|
+
"import": "./dist/core/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./electron/main": {
|
|
30
|
+
"types": "./dist/integrations/electron/main.d.ts",
|
|
31
|
+
"import": "./dist/integrations/electron/main.js"
|
|
32
|
+
},
|
|
33
|
+
"./electron/preload": {
|
|
34
|
+
"types": "./dist/integrations/electron/preload.d.ts",
|
|
35
|
+
"import": "./dist/integrations/electron/preload.js"
|
|
36
|
+
},
|
|
37
|
+
"./electron/renderer": {
|
|
38
|
+
"types": "./dist/integrations/electron/renderer.d.ts",
|
|
39
|
+
"import": "./dist/integrations/electron/renderer.js"
|
|
40
|
+
},
|
|
41
|
+
"./browser-extension": {
|
|
42
|
+
"types": "./dist/integrations/browser-extension/contentScript.d.ts",
|
|
43
|
+
"import": "./dist/integrations/browser-extension/contentScript.js"
|
|
44
|
+
},
|
|
45
|
+
"./vite": {
|
|
46
|
+
"types": "./dist/vite/sourceMetadataPlugin.d.ts",
|
|
47
|
+
"import": "./dist/vite/sourceMetadataPlugin.js"
|
|
48
|
+
},
|
|
49
|
+
"./package.json": "./package.json"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"clean": "rm -rf dist *.tgz",
|
|
53
|
+
"build": "bun run clean && tsc -p tsconfig.build.json",
|
|
54
|
+
"pack": "bun run build && npm pack",
|
|
55
|
+
"pack:dry": "bun run build && npm pack --dry-run"
|
|
56
|
+
},
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
},
|
|
60
|
+
"peerDependencies": {
|
|
61
|
+
"effect": ">=3.0.0",
|
|
62
|
+
"electron": ">=35.0.0",
|
|
63
|
+
"vite": ">=6.0.0"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/node": "^24.0.0",
|
|
67
|
+
"effect": ">=3.0.0",
|
|
68
|
+
"electron": ">=35.0.0",
|
|
69
|
+
"typescript": "^5.8.2",
|
|
70
|
+
"vite": ">=6.0.0"
|
|
71
|
+
}
|
|
72
|
+
}
|