pinpoints 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +187 -0
- package/out/browser/browserSessionManager.d.ts +19 -0
- package/out/browser/browserSessionManager.d.ts.map +1 -0
- package/out/browser/browserSessionManager.js +169 -0
- package/out/browser/browserSessionManager.js.map +1 -0
- package/out/cli/index.d.ts +3 -0
- package/out/cli/index.d.ts.map +1 -0
- package/out/cli/index.js +564 -0
- package/out/cli/index.js.map +1 -0
- package/out/core/pickerToolbar.d.ts +9 -0
- package/out/core/pickerToolbar.d.ts.map +1 -0
- package/out/core/pickerToolbar.js +475 -0
- package/out/core/pickerToolbar.js.map +1 -0
- package/out/export/contextFormatter.d.ts +9 -0
- package/out/export/contextFormatter.d.ts.map +1 -0
- package/out/export/contextFormatter.js +151 -0
- package/out/export/contextFormatter.js.map +1 -0
- package/out/extension.d.ts +4 -0
- package/out/extension.d.ts.map +1 -0
- package/out/extension.js +95 -0
- package/out/extension.js.map +1 -0
- package/out/extraction/domExtractor.d.ts +10 -0
- package/out/extraction/domExtractor.d.ts.map +1 -0
- package/out/extraction/domExtractor.js +72 -0
- package/out/extraction/domExtractor.js.map +1 -0
- package/out/extraction/layoutExtractor.d.ts +11 -0
- package/out/extraction/layoutExtractor.d.ts.map +1 -0
- package/out/extraction/layoutExtractor.js +107 -0
- package/out/extraction/layoutExtractor.js.map +1 -0
- package/out/extraction/redactor.d.ts +9 -0
- package/out/extraction/redactor.d.ts.map +1 -0
- package/out/extraction/redactor.js +78 -0
- package/out/extraction/redactor.js.map +1 -0
- package/out/extraction/screenshotExtractor.d.ts +7 -0
- package/out/extraction/screenshotExtractor.d.ts.map +1 -0
- package/out/extraction/screenshotExtractor.js +104 -0
- package/out/extraction/screenshotExtractor.js.map +1 -0
- package/out/extraction/selectorExtractor.d.ts +16 -0
- package/out/extraction/selectorExtractor.d.ts.map +1 -0
- package/out/extraction/selectorExtractor.js +172 -0
- package/out/extraction/selectorExtractor.js.map +1 -0
- package/out/extraction/styleExtractor.d.ts +10 -0
- package/out/extraction/styleExtractor.d.ts.map +1 -0
- package/out/extraction/styleExtractor.js +96 -0
- package/out/extraction/styleExtractor.js.map +1 -0
- package/out/picker/pickerController.d.ts +33 -0
- package/out/picker/pickerController.d.ts.map +1 -0
- package/out/picker/pickerController.js +979 -0
- package/out/picker/pickerController.js.map +1 -0
- package/out/schemas/index.d.ts +418 -0
- package/out/schemas/index.d.ts.map +1 -0
- package/out/schemas/index.js +128 -0
- package/out/schemas/index.js.map +1 -0
- package/out/source/sourceLocator.d.ts +7 -0
- package/out/source/sourceLocator.d.ts.map +1 -0
- package/out/source/sourceLocator.js +37 -0
- package/out/source/sourceLocator.js.map +1 -0
- package/out/source/sourceMapResolver.d.ts +17 -0
- package/out/source/sourceMapResolver.d.ts.map +1 -0
- package/out/source/sourceMapResolver.js +204 -0
- package/out/source/sourceMapResolver.js.map +1 -0
- package/out/source/workspaceGrep.d.ts +30 -0
- package/out/source/workspaceGrep.d.ts.map +1 -0
- package/out/source/workspaceGrep.js +237 -0
- package/out/source/workspaceGrep.js.map +1 -0
- package/out/testPaste.d.ts +1 -0
- package/out/testPaste.d.ts.map +1 -0
- package/out/testPaste.js +3 -0
- package/out/testPaste.js.map +1 -0
- package/out/ui/statusBarManager.d.ts +14 -0
- package/out/ui/statusBarManager.d.ts.map +1 -0
- package/out/ui/statusBarManager.js +89 -0
- package/out/ui/statusBarManager.js.map +1 -0
- package/package.json +132 -0
- package/resources/fonts/icons.css +19 -0
- package/resources/fonts/icons.html +69 -0
- package/resources/fonts/icons.json +3 -0
- package/resources/fonts/icons.ts +13 -0
- package/resources/fonts/icons.woff +0 -0
- package/resources/icon.png +0 -0
- package/resources/icons/pinpoint-logo.svg +4 -0
- package/resources/logo.svg +97 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SelectorExtractor = void 0;
|
|
4
|
+
class SelectorExtractor {
|
|
5
|
+
async extract(elementHandle) {
|
|
6
|
+
const selectors = [];
|
|
7
|
+
// 1. Try data-testid, data-test, data-qa
|
|
8
|
+
const dataAttrSelector = await this.tryDataAttributes(elementHandle);
|
|
9
|
+
if (dataAttrSelector) {
|
|
10
|
+
selectors.push(dataAttrSelector);
|
|
11
|
+
}
|
|
12
|
+
// 2. Try stable ID
|
|
13
|
+
const idSelector = await this.tryStableId(elementHandle);
|
|
14
|
+
if (idSelector) {
|
|
15
|
+
selectors.push(idSelector);
|
|
16
|
+
}
|
|
17
|
+
// 3. Try role + aria-label combo
|
|
18
|
+
const roleAriaSelector = await this.tryRoleAriaLabel(elementHandle);
|
|
19
|
+
if (roleAriaSelector) {
|
|
20
|
+
selectors.push(roleAriaSelector);
|
|
21
|
+
}
|
|
22
|
+
// 4. Try stable class combo
|
|
23
|
+
const classSelector = await this.tryStableClassCombo(elementHandle);
|
|
24
|
+
if (classSelector) {
|
|
25
|
+
selectors.push(classSelector);
|
|
26
|
+
}
|
|
27
|
+
// 5. Fallback: position-based with parent context
|
|
28
|
+
const positionSelector = await this.tryPositionBased(elementHandle);
|
|
29
|
+
if (positionSelector) {
|
|
30
|
+
selectors.push(positionSelector);
|
|
31
|
+
}
|
|
32
|
+
// Return primary (highest confidence) and alternates
|
|
33
|
+
if (selectors.length === 0) {
|
|
34
|
+
// Last resort: css path
|
|
35
|
+
const cssPath = await this.getCssPath(elementHandle);
|
|
36
|
+
selectors.push({
|
|
37
|
+
selector: cssPath,
|
|
38
|
+
confidence: 0.3,
|
|
39
|
+
method: 'position',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const sorted = selectors.sort((a, b) => b.confidence - a.confidence);
|
|
43
|
+
return {
|
|
44
|
+
primary: sorted[0],
|
|
45
|
+
alternates: sorted.slice(1),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async tryDataAttributes(elementHandle) {
|
|
49
|
+
const dataAttrs = ['data-testid', 'data-test', 'data-qa'];
|
|
50
|
+
for (const attr of dataAttrs) {
|
|
51
|
+
const value = await elementHandle.evaluate((el, attrName) => el.getAttribute(attrName), attr);
|
|
52
|
+
if (value) {
|
|
53
|
+
const selector = `[${attr}="${value}"]`;
|
|
54
|
+
return {
|
|
55
|
+
selector,
|
|
56
|
+
confidence: 0.95,
|
|
57
|
+
method: 'data-attr',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
async tryStableId(elementHandle) {
|
|
64
|
+
const id = await elementHandle.evaluate((el) => el.id);
|
|
65
|
+
if (!id) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
// Check if ID looks like a UUID or random hash
|
|
69
|
+
if (this.isUnstableId(id)) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const selector = `#${id}`;
|
|
73
|
+
return {
|
|
74
|
+
selector,
|
|
75
|
+
confidence: 0.9,
|
|
76
|
+
method: 'id',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
isUnstableId(id) {
|
|
80
|
+
// Detect UUID patterns (8-4-4-4-12 hex)
|
|
81
|
+
if (/^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$/i.test(id)) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
// Detect long random hex strings
|
|
85
|
+
if (/^[0-9a-f]{20,}$/i.test(id)) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
// Detect base64-like strings
|
|
89
|
+
if (/^[A-Za-z0-9+/]{20,}={0,2}$/.test(id)) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
async tryRoleAriaLabel(elementHandle) {
|
|
95
|
+
const { role, ariaLabel } = await elementHandle.evaluate((el) => ({
|
|
96
|
+
role: el.getAttribute('role'),
|
|
97
|
+
ariaLabel: el.getAttribute('aria-label'),
|
|
98
|
+
}));
|
|
99
|
+
if (!role || !ariaLabel) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const selector = `[role="${role}"][aria-label="${ariaLabel}"]`;
|
|
103
|
+
return {
|
|
104
|
+
selector,
|
|
105
|
+
confidence: 0.85,
|
|
106
|
+
method: 'role-label',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async tryStableClassCombo(elementHandle) {
|
|
110
|
+
const classes = await elementHandle.evaluate((el) => {
|
|
111
|
+
const utilityPatterns = [
|
|
112
|
+
/^(m|p|w|h|flex|grid|text|bg|border|rounded|shadow|opacity|transform)/,
|
|
113
|
+
/^(mt|mr|mb|ml|px|py|pt|pb|pl|pr)\d+/,
|
|
114
|
+
/^(absolute|relative|fixed|static)/,
|
|
115
|
+
/^(block|inline|hidden)/,
|
|
116
|
+
];
|
|
117
|
+
return Array.from(el.classList)
|
|
118
|
+
.filter((cls) => !utilityPatterns.some((pattern) => pattern.test(cls)))
|
|
119
|
+
.slice(0, 3);
|
|
120
|
+
});
|
|
121
|
+
if (classes.length === 0) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const selector = classes.length === 1
|
|
125
|
+
? `.${classes[0]}`
|
|
126
|
+
: classes.map((cls) => `.${cls}`).join('');
|
|
127
|
+
return {
|
|
128
|
+
selector,
|
|
129
|
+
confidence: 0.7,
|
|
130
|
+
method: 'class-combo',
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
async tryPositionBased(elementHandle) {
|
|
134
|
+
try {
|
|
135
|
+
const cssPath = await this.getCssPath(elementHandle);
|
|
136
|
+
return {
|
|
137
|
+
selector: cssPath,
|
|
138
|
+
confidence: 0.5,
|
|
139
|
+
method: 'position',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async getCssPath(elementHandle) {
|
|
147
|
+
return await elementHandle.evaluate((el) => {
|
|
148
|
+
const paths = [];
|
|
149
|
+
let current = el;
|
|
150
|
+
while (current && current !== document.body) {
|
|
151
|
+
let selector = current.tagName.toLowerCase();
|
|
152
|
+
if (current.id) {
|
|
153
|
+
selector += `#${current.id}`;
|
|
154
|
+
paths.unshift(selector);
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
const siblings = Array.from(current.parentNode?.childNodes || [])
|
|
158
|
+
.filter((n) => n.nodeType === 1);
|
|
159
|
+
const sameTagSiblings = siblings.filter((s) => s.tagName.toLowerCase() === current.tagName.toLowerCase());
|
|
160
|
+
if (sameTagSiblings.length > 1) {
|
|
161
|
+
const index = sameTagSiblings.indexOf(current) + 1;
|
|
162
|
+
selector += `:nth-of-type(${index})`;
|
|
163
|
+
}
|
|
164
|
+
paths.unshift(selector);
|
|
165
|
+
current = current.parentElement;
|
|
166
|
+
}
|
|
167
|
+
return paths.join(' > ');
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.SelectorExtractor = SelectorExtractor;
|
|
172
|
+
//# sourceMappingURL=selectorExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectorExtractor.js","sourceRoot":"","sources":["../../src/extraction/selectorExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as puppeteer from 'puppeteer-core';
|
|
2
|
+
import { Styles } from '../schemas';
|
|
3
|
+
export declare class StyleExtractor {
|
|
4
|
+
private readonly LAYOUT_PROPERTIES;
|
|
5
|
+
extract(elementHandle: puppeteer.ElementHandle, mode?: 'pick' | 'full'): Promise<Styles>;
|
|
6
|
+
private getComputedStyles;
|
|
7
|
+
private calculateDiff;
|
|
8
|
+
private getClasses;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=styleExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleExtractor.d.ts","sourceRoot":"","sources":["../../src/extraction/styleExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,qBAAa,cAAc;IAEzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAiChC;IAEI,OAAO,CACX,aAAa,EAAE,SAAS,CAAC,aAAa,EACtC,IAAI,GAAE,MAAM,GAAG,MAAe,GAC7B,OAAO,CAAC,MAAM,CAAC;YAYJ,iBAAiB;IAe/B,OAAO,CAAC,aAAa;YAkCP,UAAU;CAGzB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StyleExtractor = void 0;
|
|
4
|
+
class StyleExtractor {
|
|
5
|
+
constructor() {
|
|
6
|
+
// Layout-critical CSS properties
|
|
7
|
+
this.LAYOUT_PROPERTIES = [
|
|
8
|
+
'display',
|
|
9
|
+
'position',
|
|
10
|
+
'top',
|
|
11
|
+
'right',
|
|
12
|
+
'bottom',
|
|
13
|
+
'left',
|
|
14
|
+
'width',
|
|
15
|
+
'height',
|
|
16
|
+
'margin',
|
|
17
|
+
'margin-top',
|
|
18
|
+
'margin-right',
|
|
19
|
+
'margin-bottom',
|
|
20
|
+
'margin-left',
|
|
21
|
+
'padding',
|
|
22
|
+
'padding-top',
|
|
23
|
+
'padding-right',
|
|
24
|
+
'padding-bottom',
|
|
25
|
+
'padding-left',
|
|
26
|
+
'flex-direction',
|
|
27
|
+
'flex-wrap',
|
|
28
|
+
'justify-content',
|
|
29
|
+
'align-items',
|
|
30
|
+
'align-content',
|
|
31
|
+
'gap',
|
|
32
|
+
'grid-template-columns',
|
|
33
|
+
'grid-template-rows',
|
|
34
|
+
'grid-column',
|
|
35
|
+
'grid-row',
|
|
36
|
+
'z-index',
|
|
37
|
+
'overflow',
|
|
38
|
+
'overflow-x',
|
|
39
|
+
'overflow-y',
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
async extract(elementHandle, mode = 'pick') {
|
|
43
|
+
const computed = await this.getComputedStyles(elementHandle);
|
|
44
|
+
const diff = this.calculateDiff(computed);
|
|
45
|
+
const classes = await this.getClasses(elementHandle);
|
|
46
|
+
return {
|
|
47
|
+
computed: mode === 'full' ? computed : undefined,
|
|
48
|
+
diff,
|
|
49
|
+
classes,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async getComputedStyles(elementHandle) {
|
|
53
|
+
return await elementHandle.evaluate((el) => {
|
|
54
|
+
const styles = window.getComputedStyle(el);
|
|
55
|
+
const result = {};
|
|
56
|
+
// Get all computed styles
|
|
57
|
+
for (let i = 0; i < styles.length; i++) {
|
|
58
|
+
const prop = styles[i];
|
|
59
|
+
result[prop] = styles.getPropertyValue(prop);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
calculateDiff(computed) {
|
|
65
|
+
const diff = {};
|
|
66
|
+
// Keep layout properties that have non-default values
|
|
67
|
+
const defaults = {
|
|
68
|
+
'display': 'inline',
|
|
69
|
+
'position': 'static',
|
|
70
|
+
'z-index': 'auto',
|
|
71
|
+
'overflow': 'visible',
|
|
72
|
+
'overflow-x': 'visible',
|
|
73
|
+
'overflow-y': 'visible',
|
|
74
|
+
};
|
|
75
|
+
for (const prop of this.LAYOUT_PROPERTIES) {
|
|
76
|
+
const value = computed[prop];
|
|
77
|
+
if (value && value !== defaults[prop] && value !== '0px' && value !== 'normal' && value !== 'none' && value !== 'auto' && value !== 'stretch') {
|
|
78
|
+
diff[prop] = value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Also include color and font properties if explicitly set
|
|
82
|
+
const colorFontProps = ['color', 'background-color', 'font-size', 'font-weight', 'text-align'];
|
|
83
|
+
for (const prop of colorFontProps) {
|
|
84
|
+
const value = computed[prop];
|
|
85
|
+
if (value && value !== 'normal' && value !== 'start') {
|
|
86
|
+
diff[prop] = value;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return diff;
|
|
90
|
+
}
|
|
91
|
+
async getClasses(elementHandle) {
|
|
92
|
+
return await elementHandle.evaluate((el) => Array.from(el.classList));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.StyleExtractor = StyleExtractor;
|
|
96
|
+
//# sourceMappingURL=styleExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleExtractor.js","sourceRoot":"","sources":["../../src/extraction/styleExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as vscode from 'vscode';
|
|
2
|
+
import { CaptureMode } from '../schemas';
|
|
3
|
+
export declare class PickerController {
|
|
4
|
+
private context;
|
|
5
|
+
private browserSession;
|
|
6
|
+
private currentMode;
|
|
7
|
+
private screenshotEnabled;
|
|
8
|
+
private contextRadius;
|
|
9
|
+
private injectionTarget;
|
|
10
|
+
private capturedElements;
|
|
11
|
+
private tempDir;
|
|
12
|
+
private isPickerActive;
|
|
13
|
+
private workspaceRoot;
|
|
14
|
+
constructor(context: vscode.ExtensionContext);
|
|
15
|
+
private loadSettings;
|
|
16
|
+
startPicker(): Promise<void>;
|
|
17
|
+
private injectPickerUI;
|
|
18
|
+
private promptForUrl;
|
|
19
|
+
private detectLocalServers;
|
|
20
|
+
private isPortOpen;
|
|
21
|
+
stopPicker(): Promise<void>;
|
|
22
|
+
toggleScreenshot(): void;
|
|
23
|
+
isScreenshotEnabled(): boolean;
|
|
24
|
+
setMode(mode: CaptureMode): void;
|
|
25
|
+
clearSelection(): void;
|
|
26
|
+
private enableInspectMode;
|
|
27
|
+
private captureClickedElement;
|
|
28
|
+
private ensureGitignore;
|
|
29
|
+
captureElement(elementHandle: any): Promise<void>;
|
|
30
|
+
private injectToFocusedLocation;
|
|
31
|
+
cleanup(): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=pickerController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickerController.d.ts","sourceRoot":"","sources":["../../src/picker/pickerController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAajC,OAAO,EAAc,WAAW,EAAY,MAAM,YAAY,CAAC;AAG/D,qBAAa,gBAAgB;IAWf,OAAO,CAAC,OAAO;IAV3B,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAAS;gBAEV,OAAO,EAAE,MAAM,CAAC,gBAAgB;IAKpD,OAAO,CAAC,YAAY;IAQd,WAAW;YAoFH,cAAc;YAoed,YAAY;YAkEZ,kBAAkB;IAwChC,OAAO,CAAC,UAAU;IAWZ,UAAU;IAShB,gBAAgB;IAIhB,mBAAmB,IAAI,OAAO;IAI9B,OAAO,CAAC,IAAI,EAAE,WAAW;IAIzB,cAAc;YAIA,iBAAiB;YA2BjB,qBAAqB;IAmCnC,OAAO,CAAC,eAAe;IAoBjB,cAAc,CAAC,aAAa,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YA8HzC,uBAAuB;IAwDrC,OAAO;CAeR"}
|