@rose42/feedback-capture 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 +107 -0
- package/dist/clipboard.d.ts +7 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +33 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/context.d.ts +10 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/context.js.map +1 -0
- package/dist/crop.d.ts +61 -0
- package/dist/crop.d.ts.map +1 -0
- package/dist/crop.js +112 -0
- package/dist/crop.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/comment.d.ts +11 -0
- package/dist/plugins/comment.d.ts.map +1 -0
- package/dist/plugins/comment.js +14 -0
- package/dist/plugins/comment.js.map +1 -0
- package/dist/plugins/consoleLogs.d.ts +14 -0
- package/dist/plugins/consoleLogs.d.ts.map +1 -0
- package/dist/plugins/consoleLogs.js +98 -0
- package/dist/plugins/consoleLogs.js.map +1 -0
- package/dist/plugins/core.d.ts +24 -0
- package/dist/plugins/core.d.ts.map +1 -0
- package/dist/plugins/core.js +62 -0
- package/dist/plugins/core.js.map +1 -0
- package/dist/plugins/elementTarget.d.ts +156 -0
- package/dist/plugins/elementTarget.d.ts.map +1 -0
- package/dist/plugins/elementTarget.js +537 -0
- package/dist/plugins/elementTarget.js.map +1 -0
- package/dist/plugins/frameBurst.d.ts +60 -0
- package/dist/plugins/frameBurst.d.ts.map +1 -0
- package/dist/plugins/frameBurst.js +260 -0
- package/dist/plugins/frameBurst.js.map +1 -0
- package/dist/plugins/index.d.ts +17 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +9 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/pageContext.d.ts +13 -0
- package/dist/plugins/pageContext.d.ts.map +1 -0
- package/dist/plugins/pageContext.js +23 -0
- package/dist/plugins/pageContext.js.map +1 -0
- package/dist/plugins/screenshot.d.ts +34 -0
- package/dist/plugins/screenshot.d.ts.map +1 -0
- package/dist/plugins/screenshot.js +183 -0
- package/dist/plugins/screenshot.js.map +1 -0
- package/dist/plugins/version.d.ts +16 -0
- package/dist/plugins/version.d.ts.map +1 -0
- package/dist/plugins/version.js +21 -0
- package/dist/plugins/version.js.map +1 -0
- package/dist/session.d.ts +19 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +18 -0
- package/dist/session.js.map +1 -0
- package/dist/source/adapters/compose.d.ts +7 -0
- package/dist/source/adapters/compose.d.ts.map +1 -0
- package/dist/source/adapters/compose.js +21 -0
- package/dist/source/adapters/compose.js.map +1 -0
- package/dist/source/adapters/createSourceResolver.d.ts +28 -0
- package/dist/source/adapters/createSourceResolver.d.ts.map +1 -0
- package/dist/source/adapters/createSourceResolver.js +59 -0
- package/dist/source/adapters/createSourceResolver.js.map +1 -0
- package/dist/source/adapters/detect.d.ts +22 -0
- package/dist/source/adapters/detect.d.ts.map +1 -0
- package/dist/source/adapters/detect.js +133 -0
- package/dist/source/adapters/detect.js.map +1 -0
- package/dist/source/adapters/index.d.ts +18 -0
- package/dist/source/adapters/index.d.ts.map +1 -0
- package/dist/source/adapters/index.js +10 -0
- package/dist/source/adapters/index.js.map +1 -0
- package/dist/source/adapters/locator.d.ts +14 -0
- package/dist/source/adapters/locator.d.ts.map +1 -0
- package/dist/source/adapters/locator.js +69 -0
- package/dist/source/adapters/locator.js.map +1 -0
- package/dist/source/adapters/next.d.ts +46 -0
- package/dist/source/adapters/next.d.ts.map +1 -0
- package/dist/source/adapters/next.js +124 -0
- package/dist/source/adapters/next.js.map +1 -0
- package/dist/source/adapters/nextFlight.d.ts +19 -0
- package/dist/source/adapters/nextFlight.d.ts.map +1 -0
- package/dist/source/adapters/nextFlight.js +80 -0
- package/dist/source/adapters/nextFlight.js.map +1 -0
- package/dist/source/adapters/qwik.d.ts +16 -0
- package/dist/source/adapters/qwik.d.ts.map +1 -0
- package/dist/source/adapters/qwik.js +49 -0
- package/dist/source/adapters/qwik.js.map +1 -0
- package/dist/source/adapters/react.d.ts +46 -0
- package/dist/source/adapters/react.d.ts.map +1 -0
- package/dist/source/adapters/react.js +201 -0
- package/dist/source/adapters/react.js.map +1 -0
- package/dist/source/adapters/svelte.d.ts +23 -0
- package/dist/source/adapters/svelte.d.ts.map +1 -0
- package/dist/source/adapters/svelte.js +64 -0
- package/dist/source/adapters/svelte.js.map +1 -0
- package/dist/source/adapters/vue.d.ts +27 -0
- package/dist/source/adapters/vue.d.ts.map +1 -0
- package/dist/source/adapters/vue.js +76 -0
- package/dist/source/adapters/vue.js.map +1 -0
- package/dist/source/locateJsx.d.ts +25 -0
- package/dist/source/locateJsx.d.ts.map +1 -0
- package/dist/source/locateJsx.js +67 -0
- package/dist/source/locateJsx.js.map +1 -0
- package/dist/source/rankSourceHierarchy.d.ts +25 -0
- package/dist/source/rankSourceHierarchy.d.ts.map +1 -0
- package/dist/source/rankSourceHierarchy.js +60 -0
- package/dist/source/rankSourceHierarchy.js.map +1 -0
- package/dist/source/reactSourceResolver.d.ts +3 -0
- package/dist/source/reactSourceResolver.d.ts.map +1 -0
- package/dist/source/reactSourceResolver.js +3 -0
- package/dist/source/reactSourceResolver.js.map +1 -0
- package/dist/source/sourceMap.d.ts +41 -0
- package/dist/source/sourceMap.d.ts.map +1 -0
- package/dist/source/sourceMap.js +235 -0
- package/dist/source/sourceMap.js.map +1 -0
- package/dist/transport.d.ts +13 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +37 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/** Shared defaults for multi-image feedback + smart frame burst. */
|
|
2
|
+
export const DEFAULT_MAX_IMAGES = 5;
|
|
3
|
+
export const DEFAULT_BURST_MAX_DURATION_MS = 5000;
|
|
4
|
+
export const DEFAULT_BURST_SAMPLE_FPS = 6;
|
|
5
|
+
export const DEFAULT_BURST_MAX_CANDIDATES = 12;
|
|
6
|
+
/** Mean absolute RGB diff / 255; frames below this vs last kept are dropped. */
|
|
7
|
+
export const DEFAULT_BURST_DIFF_THRESHOLD = 0.035;
|
|
8
|
+
export const DEFAULT_BURST_MIN_SPACING_MS = 180;
|
|
9
|
+
export const DEFAULT_BURST_THUMB_WIDTH = 160;
|
|
10
|
+
/** Clamp gallery / burst keep count to 1–10 (default 5). */
|
|
11
|
+
export function clampMaxImages(value) {
|
|
12
|
+
if (value === undefined || !Number.isFinite(value))
|
|
13
|
+
return DEFAULT_MAX_IMAGES;
|
|
14
|
+
return Math.min(10, Math.max(1, Math.floor(value)));
|
|
15
|
+
}
|
|
16
|
+
function meanAbsDiff(a, b) {
|
|
17
|
+
const n = Math.min(a.length, b.length);
|
|
18
|
+
if (n === 0)
|
|
19
|
+
return 1;
|
|
20
|
+
let sum = 0;
|
|
21
|
+
for (let i = 0; i < n; i++) {
|
|
22
|
+
sum += Math.abs(a[i] - b[i]);
|
|
23
|
+
}
|
|
24
|
+
return sum / n / 255;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Pick visually distinct frames from a burst sample.
|
|
28
|
+
* Always prefers first and last; fills remaining slots by change score with min spacing.
|
|
29
|
+
*/
|
|
30
|
+
export function selectChangedFrames(frames, options) {
|
|
31
|
+
const maxKeep = Math.max(1, Math.floor(options.maxKeep));
|
|
32
|
+
const diffThreshold = options.diffThreshold ?? DEFAULT_BURST_DIFF_THRESHOLD;
|
|
33
|
+
const minSpacingMs = options.minSpacingMs ?? DEFAULT_BURST_MIN_SPACING_MS;
|
|
34
|
+
if (frames.length === 0)
|
|
35
|
+
return [];
|
|
36
|
+
if (frames.length === 1) {
|
|
37
|
+
const only = frames[0];
|
|
38
|
+
return [{ dataUrl: only.dataUrl, score: 1, t: only.t }];
|
|
39
|
+
}
|
|
40
|
+
const candidates = [];
|
|
41
|
+
let lastKeptThumb = null;
|
|
42
|
+
let lastKeptT = -Infinity;
|
|
43
|
+
for (let i = 0; i < frames.length; i++) {
|
|
44
|
+
const frame = frames[i];
|
|
45
|
+
const isFirst = i === 0;
|
|
46
|
+
const isLast = i === frames.length - 1;
|
|
47
|
+
const score = lastKeptThumb ? meanAbsDiff(frame.thumb, lastKeptThumb) : 1;
|
|
48
|
+
const spaced = frame.t - lastKeptT >= minSpacingMs;
|
|
49
|
+
if (isFirst || isLast || (score >= diffThreshold && spaced)) {
|
|
50
|
+
candidates.push({ dataUrl: frame.dataUrl, score: isFirst ? 1 : score, t: frame.t });
|
|
51
|
+
lastKeptThumb = frame.thumb;
|
|
52
|
+
lastKeptT = frame.t;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (candidates.length <= maxKeep)
|
|
56
|
+
return candidates;
|
|
57
|
+
// Always keep first + last; fill middle by score then re-sort by time.
|
|
58
|
+
const first = candidates[0];
|
|
59
|
+
const last = candidates[candidates.length - 1];
|
|
60
|
+
if (maxKeep === 1)
|
|
61
|
+
return [first];
|
|
62
|
+
if (maxKeep === 2)
|
|
63
|
+
return [first, last];
|
|
64
|
+
const middle = candidates
|
|
65
|
+
.slice(1, -1)
|
|
66
|
+
.sort((a, b) => b.score - a.score)
|
|
67
|
+
.slice(0, maxKeep - 2);
|
|
68
|
+
return [first, ...middle, last].sort((a, b) => a.t - b.t);
|
|
69
|
+
}
|
|
70
|
+
async function withElementsHidden(elements, run) {
|
|
71
|
+
const previous = elements.map((el) => el.style.visibility);
|
|
72
|
+
for (const el of elements) {
|
|
73
|
+
el.style.visibility = "hidden";
|
|
74
|
+
}
|
|
75
|
+
return run().finally(() => {
|
|
76
|
+
elements.forEach((el, i) => {
|
|
77
|
+
el.style.visibility = previous[i] ?? "";
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function waitForVideoFrame(video) {
|
|
82
|
+
const anyVideo = video;
|
|
83
|
+
if (typeof anyVideo.requestVideoFrameCallback === "function") {
|
|
84
|
+
return new Promise((resolve) => {
|
|
85
|
+
anyVideo.requestVideoFrameCallback(() => resolve());
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return new Promise((resolve) => {
|
|
89
|
+
if (video.readyState >= 2) {
|
|
90
|
+
resolve();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
video.addEventListener("loadeddata", () => resolve(), { once: true });
|
|
94
|
+
setTimeout(resolve, 300);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function looksLikeFailedCapture(canvas) {
|
|
98
|
+
const ctx = canvas.getContext("2d");
|
|
99
|
+
if (!ctx || canvas.width < 2 || canvas.height < 2)
|
|
100
|
+
return true;
|
|
101
|
+
const { data } = ctx.getImageData(0, 0, Math.min(canvas.width, 64), Math.min(canvas.height, 64));
|
|
102
|
+
const r0 = data[0];
|
|
103
|
+
const g0 = data[1];
|
|
104
|
+
const b0 = data[2];
|
|
105
|
+
let uniform = true;
|
|
106
|
+
for (let i = 0; i < data.length; i += 16) {
|
|
107
|
+
const r = data[i];
|
|
108
|
+
const g = data[i + 1];
|
|
109
|
+
const b = data[i + 2];
|
|
110
|
+
if (r !== r0 || g !== g0 || b !== b0) {
|
|
111
|
+
uniform = false;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (!uniform)
|
|
116
|
+
return false;
|
|
117
|
+
const nearBlack = r0 < 8 && g0 < 8 && b0 < 8;
|
|
118
|
+
const magenta = r0 > 200 && b0 > 200 && g0 < 80;
|
|
119
|
+
const hotPink = r0 > 220 && g0 < 120 && b0 > 140 && b0 < 220;
|
|
120
|
+
return nearBlack || magenta || hotPink;
|
|
121
|
+
}
|
|
122
|
+
function toGrayscaleThumb(source, thumbWidth) {
|
|
123
|
+
if (source.width < 2 || source.height < 2)
|
|
124
|
+
return undefined;
|
|
125
|
+
const scale = thumbWidth / source.width;
|
|
126
|
+
const w = Math.max(1, Math.round(thumbWidth));
|
|
127
|
+
const h = Math.max(1, Math.round(source.height * scale));
|
|
128
|
+
const thumbCanvas = document.createElement("canvas");
|
|
129
|
+
thumbCanvas.width = w;
|
|
130
|
+
thumbCanvas.height = h;
|
|
131
|
+
const ctx = thumbCanvas.getContext("2d");
|
|
132
|
+
if (!ctx)
|
|
133
|
+
return undefined;
|
|
134
|
+
ctx.drawImage(source, 0, 0, w, h);
|
|
135
|
+
const { data } = ctx.getImageData(0, 0, w, h);
|
|
136
|
+
const gray = new Uint8ClampedArray(w * h);
|
|
137
|
+
for (let i = 0, j = 0; i < data.length; i += 4, j++) {
|
|
138
|
+
gray[j] = Math.round(0.299 * data[i] + 0.587 * data[i + 1] + 0.114 * data[i + 2]);
|
|
139
|
+
}
|
|
140
|
+
return { thumb: gray, thumbWidth: w, thumbHeight: h };
|
|
141
|
+
}
|
|
142
|
+
async function grabFrameCanvas(track) {
|
|
143
|
+
const ImageCaptureCtor = globalThis.ImageCapture;
|
|
144
|
+
const canvas = document.createElement("canvas");
|
|
145
|
+
const ctx = canvas.getContext("2d");
|
|
146
|
+
if (!ctx)
|
|
147
|
+
return undefined;
|
|
148
|
+
if (ImageCaptureCtor) {
|
|
149
|
+
try {
|
|
150
|
+
const bitmap = await new ImageCaptureCtor(track).grabFrame();
|
|
151
|
+
canvas.width = bitmap.width;
|
|
152
|
+
canvas.height = bitmap.height;
|
|
153
|
+
ctx.drawImage(bitmap, 0, 0);
|
|
154
|
+
bitmap.close();
|
|
155
|
+
if (looksLikeFailedCapture(canvas))
|
|
156
|
+
return undefined;
|
|
157
|
+
return canvas;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Fall through to <video> path.
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const video = document.createElement("video");
|
|
164
|
+
video.muted = true;
|
|
165
|
+
video.playsInline = true;
|
|
166
|
+
video.srcObject = new MediaStream([track]);
|
|
167
|
+
await video.play();
|
|
168
|
+
await waitForVideoFrame(video);
|
|
169
|
+
await waitForVideoFrame(video);
|
|
170
|
+
const width = video.videoWidth;
|
|
171
|
+
const height = video.videoHeight;
|
|
172
|
+
if (!width || !height)
|
|
173
|
+
return undefined;
|
|
174
|
+
canvas.width = width;
|
|
175
|
+
canvas.height = height;
|
|
176
|
+
ctx.drawImage(video, 0, 0, width, height);
|
|
177
|
+
if (looksLikeFailedCapture(canvas))
|
|
178
|
+
return undefined;
|
|
179
|
+
return canvas;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Record a short tab capture burst, then keep frames that changed.
|
|
183
|
+
* User can stop early via `onRecording({ stop })`; otherwise stops at maxDurationMs.
|
|
184
|
+
*/
|
|
185
|
+
export async function captureFrameBurst(options = {}) {
|
|
186
|
+
const anyMedia = navigator.mediaDevices;
|
|
187
|
+
if (!anyMedia?.getDisplayMedia)
|
|
188
|
+
return undefined;
|
|
189
|
+
const hideElements = options.hideElements ?? [];
|
|
190
|
+
const maxDurationMs = options.maxDurationMs ?? DEFAULT_BURST_MAX_DURATION_MS;
|
|
191
|
+
const sampleFps = options.sampleFps ?? DEFAULT_BURST_SAMPLE_FPS;
|
|
192
|
+
const maxCandidates = options.maxCandidates ?? DEFAULT_BURST_MAX_CANDIDATES;
|
|
193
|
+
const intervalMs = Math.max(50, Math.round(1000 / Math.max(1, sampleFps)));
|
|
194
|
+
return withElementsHidden(hideElements, async () => {
|
|
195
|
+
let stream;
|
|
196
|
+
try {
|
|
197
|
+
stream = await anyMedia.getDisplayMedia({
|
|
198
|
+
video: {
|
|
199
|
+
displaySurface: "browser",
|
|
200
|
+
frameRate: Math.max(15, sampleFps),
|
|
201
|
+
},
|
|
202
|
+
audio: false,
|
|
203
|
+
preferCurrentTab: true,
|
|
204
|
+
selfBrowserSurface: "include",
|
|
205
|
+
surfaceSwitching: "exclude",
|
|
206
|
+
monitorTypeSurfaces: "exclude",
|
|
207
|
+
});
|
|
208
|
+
const track = stream.getVideoTracks()[0];
|
|
209
|
+
if (!track)
|
|
210
|
+
return undefined;
|
|
211
|
+
const sampled = [];
|
|
212
|
+
let stopped = false;
|
|
213
|
+
let startedAt = 0;
|
|
214
|
+
const stop = () => {
|
|
215
|
+
stopped = true;
|
|
216
|
+
};
|
|
217
|
+
options.onRecording?.({
|
|
218
|
+
stop,
|
|
219
|
+
elapsedMs: () => (startedAt ? Date.now() - startedAt : 0),
|
|
220
|
+
});
|
|
221
|
+
while (!stopped) {
|
|
222
|
+
const canvas = await grabFrameCanvas(track);
|
|
223
|
+
if (canvas) {
|
|
224
|
+
const thumb = toGrayscaleThumb(canvas, DEFAULT_BURST_THUMB_WIDTH);
|
|
225
|
+
if (thumb) {
|
|
226
|
+
if (!startedAt)
|
|
227
|
+
startedAt = Date.now();
|
|
228
|
+
const t = Date.now() - startedAt;
|
|
229
|
+
sampled.push({
|
|
230
|
+
dataUrl: canvas.toDataURL("image/png"),
|
|
231
|
+
...thumb,
|
|
232
|
+
t,
|
|
233
|
+
});
|
|
234
|
+
if (t >= maxDurationMs)
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (stopped)
|
|
239
|
+
break;
|
|
240
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
241
|
+
if (track.readyState !== "live")
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
if (sampled.length === 0)
|
|
245
|
+
return undefined;
|
|
246
|
+
return selectChangedFrames(sampled, {
|
|
247
|
+
maxKeep: maxCandidates,
|
|
248
|
+
...(options.diffThreshold !== undefined ? { diffThreshold: options.diffThreshold } : {}),
|
|
249
|
+
...(options.minSpacingMs !== undefined ? { minSpacingMs: options.minSpacingMs } : {}),
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
stream?.getTracks().forEach((t) => t.stop());
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=frameBurst.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameBurst.js","sourceRoot":"","sources":["../../src/plugins/frameBurst.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type { FeedbackCapturePlugin } from "./core.js";
|
|
2
|
+
export { collectPluginExtras, installCapturePlugins } from "./core.js";
|
|
3
|
+
export type { CommentPluginOptions } from "./comment.js";
|
|
4
|
+
export { createCommentPlugin } from "./comment.js";
|
|
5
|
+
export type { PageContext } from "./pageContext.js";
|
|
6
|
+
export { collectPageContext, createPageContextPlugin } from "./pageContext.js";
|
|
7
|
+
export type { AppVersionInfo, VersionPluginOptions } from "./version.js";
|
|
8
|
+
export { createVersionPlugin } from "./version.js";
|
|
9
|
+
export type { CaptureScreenshotOptions, ScreenshotPluginOptions } from "./screenshot.js";
|
|
10
|
+
export { attachImagePasteHandler, captureScreenshot, createScreenshotPlugin, } from "./screenshot.js";
|
|
11
|
+
export type { BurstFrame, CaptureFrameBurstOptions, SampledFrame, SelectChangedFramesOptions, } from "./frameBurst.js";
|
|
12
|
+
export { DEFAULT_BURST_DIFF_THRESHOLD, DEFAULT_BURST_MAX_CANDIDATES, DEFAULT_BURST_MAX_DURATION_MS, DEFAULT_BURST_MIN_SPACING_MS, DEFAULT_BURST_SAMPLE_FPS, DEFAULT_BURST_THUMB_WIDTH, DEFAULT_MAX_IMAGES, captureFrameBurst, clampMaxImages, selectChangedFrames, } from "./frameBurst.js";
|
|
13
|
+
export type { ConsoleLogEntry, ConsoleLogLevel, ConsoleLogsPluginOptions } from "./consoleLogs.js";
|
|
14
|
+
export { createConsoleLogsPlugin } from "./consoleLogs.js";
|
|
15
|
+
export type { ComponentSourceLocation, ElementBoundingBox, ElementSourceEnrichment, ElementStylesMode, ElementTarget, ElementTargetPlugin, ElementTargetPluginOptions, PickElementOptions, ResolveElementSource, } from "./elementTarget.js";
|
|
16
|
+
export { COMPUTED_EXTRA_STYLE_PROPS, LAYOUT_STYLE_PROPS, buildCssSelector, collectComputedStyles, collectElementTarget, collectElementTargetAsync, createElementTargetPlugin, pickElement, resolveInteractiveTarget, } from "./elementTarget.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,UAAU,EACV,wBAAwB,EACxB,YAAY,EACZ,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,YAAY,EACV,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,0BAA0B,EAC1B,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,WAAW,EACX,wBAAwB,GACzB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { collectPluginExtras, installCapturePlugins } from "./core.js";
|
|
2
|
+
export { createCommentPlugin } from "./comment.js";
|
|
3
|
+
export { collectPageContext, createPageContextPlugin } from "./pageContext.js";
|
|
4
|
+
export { createVersionPlugin } from "./version.js";
|
|
5
|
+
export { attachImagePasteHandler, captureScreenshot, createScreenshotPlugin, } from "./screenshot.js";
|
|
6
|
+
export { DEFAULT_BURST_DIFF_THRESHOLD, DEFAULT_BURST_MAX_CANDIDATES, DEFAULT_BURST_MAX_DURATION_MS, DEFAULT_BURST_MIN_SPACING_MS, DEFAULT_BURST_SAMPLE_FPS, DEFAULT_BURST_THUMB_WIDTH, DEFAULT_MAX_IMAGES, captureFrameBurst, clampMaxImages, selectChangedFrames, } from "./frameBurst.js";
|
|
7
|
+
export { createConsoleLogsPlugin } from "./consoleLogs.js";
|
|
8
|
+
export { COMPUTED_EXTRA_STYLE_PROPS, LAYOUT_STYLE_PROPS, buildCssSelector, collectComputedStyles, collectElementTarget, collectElementTargetAsync, createElementTargetPlugin, pickElement, resolveInteractiveTarget, } from "./elementTarget.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAG/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAa3D,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,WAAW,EACX,wBAAwB,GACzB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FeedbackCapturePlugin } from "./core.js";
|
|
2
|
+
import type { FeedbackViewport } from "../types.js";
|
|
3
|
+
export type PageContext = {
|
|
4
|
+
url: string;
|
|
5
|
+
userAgent: string;
|
|
6
|
+
viewport: FeedbackViewport;
|
|
7
|
+
capturedAt: string;
|
|
8
|
+
};
|
|
9
|
+
/** Collect URL, UA, viewport, and timestamp from the current browser page. */
|
|
10
|
+
export declare function collectPageContext(): PageContext;
|
|
11
|
+
/** Built-in plugin that snapshots page context into `envelope.pageContext`. */
|
|
12
|
+
export declare function createPageContextPlugin(): FeedbackCapturePlugin<"pageContext", PageContext>;
|
|
13
|
+
//# sourceMappingURL=pageContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageContext.d.ts","sourceRoot":"","sources":["../../src/plugins/pageContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,8EAA8E;AAC9E,wBAAgB,kBAAkB,IAAI,WAAW,CAWhD;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,IAAI,qBAAqB,CAAC,aAAa,EAAE,WAAW,CAAC,CAO3F"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Collect URL, UA, viewport, and timestamp from the current browser page. */
|
|
2
|
+
export function collectPageContext() {
|
|
3
|
+
return {
|
|
4
|
+
url: location.href,
|
|
5
|
+
userAgent: navigator.userAgent,
|
|
6
|
+
viewport: {
|
|
7
|
+
width: window.innerWidth,
|
|
8
|
+
height: window.innerHeight,
|
|
9
|
+
devicePixelRatio: window.devicePixelRatio || 1,
|
|
10
|
+
},
|
|
11
|
+
capturedAt: new Date().toISOString(),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** Built-in plugin that snapshots page context into `envelope.pageContext`. */
|
|
15
|
+
export function createPageContextPlugin() {
|
|
16
|
+
return {
|
|
17
|
+
id: "pageContext",
|
|
18
|
+
collect() {
|
|
19
|
+
return collectPageContext();
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=pageContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageContext.js","sourceRoot":"","sources":["../../src/plugins/pageContext.ts"],"names":[],"mappings":"AAUA,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,GAAG,EAAE,QAAQ,CAAC,IAAI;QAClB,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,QAAQ,EAAE;YACR,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,CAAC;SAC/C;QACD,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,OAAO;YACL,OAAO,kBAAkB,EAAE,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { FeedbackCapturePlugin } from "./core.js";
|
|
2
|
+
export type CaptureScreenshotOptions = {
|
|
3
|
+
/** Elements temporarily hidden (visibility) while capturing. */
|
|
4
|
+
hideElements?: HTMLElement[];
|
|
5
|
+
};
|
|
6
|
+
export type ScreenshotPluginOptions = CaptureScreenshotOptions & {
|
|
7
|
+
/**
|
|
8
|
+
* Prefer these data URLs at collect time (gallery / prior interactive capture).
|
|
9
|
+
* When it returns an array, getDisplayMedia is skipped (empty → omit key).
|
|
10
|
+
*/
|
|
11
|
+
getDataUrls?: () => string[] | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated Prefer {@link ScreenshotPluginOptions.getDataUrls}.
|
|
14
|
+
* Single URL; wrapped as a one-element array when `getDataUrls` is absent.
|
|
15
|
+
*/
|
|
16
|
+
getDataUrl?: () => string | undefined;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Capture the current tab via getDisplayMedia (faithful for canvas/WebGL/maps).
|
|
20
|
+
* Returns a PNG data URL, or undefined if unsupported / cancelled / failed.
|
|
21
|
+
*/
|
|
22
|
+
export declare function captureScreenshot(options?: CaptureScreenshotOptions): Promise<string | undefined>;
|
|
23
|
+
/**
|
|
24
|
+
* Attach a paste handler that reads the first clipboard image as a data URL.
|
|
25
|
+
* Returns a cleanup function.
|
|
26
|
+
*/
|
|
27
|
+
export declare function attachImagePasteHandler(el: HTMLElement, onDataUrl: (dataUrl: string) => void): () => void;
|
|
28
|
+
/**
|
|
29
|
+
* Built-in plugin that contributes screenshot(s) into `envelope.screenshot`
|
|
30
|
+
* as a `string[]` of PNG data URLs.
|
|
31
|
+
* Uses `getDataUrls` / `getDataUrl` when provided; otherwise prompts via getDisplayMedia.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createScreenshotPlugin(options?: ScreenshotPluginOptions): FeedbackCapturePlugin<"screenshot", string[]>;
|
|
34
|
+
//# sourceMappingURL=screenshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/plugins/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,wBAAwB,GAAG;IACrC,gEAAgE;IAChE,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,wBAAwB,GAAG;IAC/D;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,SAAS,CAAC;IACzC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACvC,CAAC;AAuGF;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqC7B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,WAAW,EACf,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACnC,MAAM,IAAI,CAoBZ;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,CAiB/C"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
async function withElementsHidden(elements, run) {
|
|
2
|
+
const previous = elements.map((el) => el.style.visibility);
|
|
3
|
+
for (const el of elements) {
|
|
4
|
+
el.style.visibility = "hidden";
|
|
5
|
+
}
|
|
6
|
+
return run().finally(() => {
|
|
7
|
+
elements.forEach((el, i) => {
|
|
8
|
+
el.style.visibility = previous[i] ?? "";
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function waitForVideoFrame(video) {
|
|
13
|
+
const anyVideo = video;
|
|
14
|
+
if (typeof anyVideo.requestVideoFrameCallback === "function") {
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
anyVideo.requestVideoFrameCallback(() => resolve());
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
if (video.readyState >= 2) {
|
|
21
|
+
resolve();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
video.addEventListener("loadeddata", () => resolve(), { once: true });
|
|
25
|
+
setTimeout(resolve, 300);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/** Reject empty / missing-texture frames (often solid black or magenta/pink). */
|
|
29
|
+
function looksLikeFailedCapture(canvas) {
|
|
30
|
+
const ctx = canvas.getContext("2d");
|
|
31
|
+
if (!ctx || canvas.width < 2 || canvas.height < 2)
|
|
32
|
+
return true;
|
|
33
|
+
const { data } = ctx.getImageData(0, 0, Math.min(canvas.width, 64), Math.min(canvas.height, 64));
|
|
34
|
+
const r0 = data[0];
|
|
35
|
+
const g0 = data[1];
|
|
36
|
+
const b0 = data[2];
|
|
37
|
+
let uniform = true;
|
|
38
|
+
for (let i = 0; i < data.length; i += 16) {
|
|
39
|
+
const r = data[i];
|
|
40
|
+
const g = data[i + 1];
|
|
41
|
+
const b = data[i + 2];
|
|
42
|
+
if (r !== r0 || g !== g0 || b !== b0) {
|
|
43
|
+
uniform = false;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (!uniform)
|
|
48
|
+
return false;
|
|
49
|
+
const nearBlack = r0 < 8 && g0 < 8 && b0 < 8;
|
|
50
|
+
const magenta = r0 > 200 && b0 > 200 && g0 < 80;
|
|
51
|
+
const hotPink = r0 > 220 && g0 < 120 && b0 > 140 && b0 < 220;
|
|
52
|
+
return nearBlack || magenta || hotPink;
|
|
53
|
+
}
|
|
54
|
+
async function grabFrameToDataUrl(track) {
|
|
55
|
+
const ImageCaptureCtor = globalThis.ImageCapture;
|
|
56
|
+
const canvas = document.createElement("canvas");
|
|
57
|
+
const ctx = canvas.getContext("2d");
|
|
58
|
+
if (!ctx)
|
|
59
|
+
return undefined;
|
|
60
|
+
if (ImageCaptureCtor) {
|
|
61
|
+
try {
|
|
62
|
+
const bitmap = await new ImageCaptureCtor(track).grabFrame();
|
|
63
|
+
canvas.width = bitmap.width;
|
|
64
|
+
canvas.height = bitmap.height;
|
|
65
|
+
ctx.drawImage(bitmap, 0, 0);
|
|
66
|
+
bitmap.close();
|
|
67
|
+
if (looksLikeFailedCapture(canvas))
|
|
68
|
+
return undefined;
|
|
69
|
+
return canvas.toDataURL("image/png");
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Fall through to <video> path.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const video = document.createElement("video");
|
|
76
|
+
video.muted = true;
|
|
77
|
+
video.playsInline = true;
|
|
78
|
+
video.srcObject = new MediaStream([track]);
|
|
79
|
+
await video.play();
|
|
80
|
+
await waitForVideoFrame(video);
|
|
81
|
+
await waitForVideoFrame(video);
|
|
82
|
+
const width = video.videoWidth;
|
|
83
|
+
const height = video.videoHeight;
|
|
84
|
+
if (!width || !height)
|
|
85
|
+
return undefined;
|
|
86
|
+
canvas.width = width;
|
|
87
|
+
canvas.height = height;
|
|
88
|
+
ctx.drawImage(video, 0, 0, width, height);
|
|
89
|
+
if (looksLikeFailedCapture(canvas))
|
|
90
|
+
return undefined;
|
|
91
|
+
return canvas.toDataURL("image/png");
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Capture the current tab via getDisplayMedia (faithful for canvas/WebGL/maps).
|
|
95
|
+
* Returns a PNG data URL, or undefined if unsupported / cancelled / failed.
|
|
96
|
+
*/
|
|
97
|
+
export async function captureScreenshot(options = {}) {
|
|
98
|
+
const anyMedia = navigator.mediaDevices;
|
|
99
|
+
if (!anyMedia?.getDisplayMedia)
|
|
100
|
+
return undefined;
|
|
101
|
+
const hideElements = options.hideElements ?? [];
|
|
102
|
+
return withElementsHidden(hideElements, async () => {
|
|
103
|
+
let stream;
|
|
104
|
+
try {
|
|
105
|
+
// Permission cannot stick (browser/spec): every getDisplayMedia() re-prompts.
|
|
106
|
+
// preferCurrentTab / selfBrowserSurface are top-level hints only — they cannot
|
|
107
|
+
// skip the picker or lock to this tab without a user gesture each time.
|
|
108
|
+
stream = await anyMedia.getDisplayMedia({
|
|
109
|
+
video: {
|
|
110
|
+
displaySurface: "browser",
|
|
111
|
+
frameRate: 15,
|
|
112
|
+
},
|
|
113
|
+
audio: false,
|
|
114
|
+
preferCurrentTab: true,
|
|
115
|
+
selfBrowserSurface: "include",
|
|
116
|
+
surfaceSwitching: "exclude",
|
|
117
|
+
monitorTypeSurfaces: "exclude",
|
|
118
|
+
});
|
|
119
|
+
const track = stream.getVideoTracks()[0];
|
|
120
|
+
if (!track)
|
|
121
|
+
return undefined;
|
|
122
|
+
return await grabFrameToDataUrl(track);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
stream?.getTracks().forEach((t) => t.stop());
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Attach a paste handler that reads the first clipboard image as a data URL.
|
|
134
|
+
* Returns a cleanup function.
|
|
135
|
+
*/
|
|
136
|
+
export function attachImagePasteHandler(el, onDataUrl) {
|
|
137
|
+
const onPaste = (event) => {
|
|
138
|
+
const items = event.clipboardData?.items;
|
|
139
|
+
if (!items)
|
|
140
|
+
return;
|
|
141
|
+
for (let i = 0; i < items.length; i++) {
|
|
142
|
+
const item = items[i];
|
|
143
|
+
if (!item || !item.type.startsWith("image/"))
|
|
144
|
+
continue;
|
|
145
|
+
const file = item.getAsFile();
|
|
146
|
+
if (!file)
|
|
147
|
+
continue;
|
|
148
|
+
event.preventDefault();
|
|
149
|
+
const reader = new FileReader();
|
|
150
|
+
reader.onload = () => {
|
|
151
|
+
onDataUrl(String(reader.result));
|
|
152
|
+
};
|
|
153
|
+
reader.readAsDataURL(file);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
el.addEventListener("paste", onPaste);
|
|
158
|
+
return () => el.removeEventListener("paste", onPaste);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Built-in plugin that contributes screenshot(s) into `envelope.screenshot`
|
|
162
|
+
* as a `string[]` of PNG data URLs.
|
|
163
|
+
* Uses `getDataUrls` / `getDataUrl` when provided; otherwise prompts via getDisplayMedia.
|
|
164
|
+
*/
|
|
165
|
+
export function createScreenshotPlugin(options = {}) {
|
|
166
|
+
const { getDataUrls, getDataUrl, ...captureOptions } = options;
|
|
167
|
+
return {
|
|
168
|
+
id: "screenshot",
|
|
169
|
+
async collect() {
|
|
170
|
+
const many = getDataUrls?.();
|
|
171
|
+
if (many !== undefined) {
|
|
172
|
+
return many.length > 0 ? many : undefined;
|
|
173
|
+
}
|
|
174
|
+
const single = getDataUrl?.();
|
|
175
|
+
if (single !== undefined) {
|
|
176
|
+
return [single];
|
|
177
|
+
}
|
|
178
|
+
const captured = await captureScreenshot(captureOptions);
|
|
179
|
+
return captured ? [captured] : undefined;
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/plugins/screenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FeedbackCapturePlugin } from "./core.js";
|
|
2
|
+
export type AppVersionInfo = {
|
|
3
|
+
version: string;
|
|
4
|
+
/** Dev HMR generation; omit or null in production. */
|
|
5
|
+
hmr?: number | null;
|
|
6
|
+
};
|
|
7
|
+
export type VersionPluginOptions = {
|
|
8
|
+
/** Read version (+ optional HMR) at collect time. */
|
|
9
|
+
getInfo: () => AppVersionInfo;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Built-in plugin that contributes app version into `envelope.version`.
|
|
13
|
+
* Empty/whitespace-only `version` returns `undefined` (key omitted).
|
|
14
|
+
*/
|
|
15
|
+
export declare function createVersionPlugin(options: VersionPluginOptions): FeedbackCapturePlugin<"version", AppVersionInfo>;
|
|
16
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/plugins/version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,qDAAqD;IACrD,OAAO,EAAE,MAAM,cAAc,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,qBAAqB,CAAC,SAAS,EAAE,cAAc,CAAC,CAclD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in plugin that contributes app version into `envelope.version`.
|
|
3
|
+
* Empty/whitespace-only `version` returns `undefined` (key omitted).
|
|
4
|
+
*/
|
|
5
|
+
export function createVersionPlugin(options) {
|
|
6
|
+
return {
|
|
7
|
+
id: "version",
|
|
8
|
+
collect() {
|
|
9
|
+
const info = options.getInfo();
|
|
10
|
+
const version = info.version.trim();
|
|
11
|
+
if (!version)
|
|
12
|
+
return undefined;
|
|
13
|
+
const hmr = info.hmr;
|
|
14
|
+
if (hmr === undefined) {
|
|
15
|
+
return { version };
|
|
16
|
+
}
|
|
17
|
+
return { version, hmr };
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/plugins/version.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA6B;IAE7B,OAAO;QACL,EAAE,EAAE,SAAS;QACb,OAAO;YACL,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
|