reflet-sdk 0.5.2 → 0.6.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/CHANGELOG.md +11 -1
- package/README.md +13 -2
- package/dist/{client-BWEBWk1k.js → client-DAdWdIFY.js} +17 -13
- package/dist/client-DAdWdIFY.js.map +1 -0
- package/dist/{client-w4Rkl10y.d.ts → client-DF1fdsSC.d.ts} +3 -1
- package/dist/{client-w4Rkl10y.d.ts.map → client-DF1fdsSC.d.ts.map} +1 -1
- package/dist/{devtools-layer-N5ptXXK4.js → devtools-layer-D_0UL_Wd.js} +134 -104
- package/dist/devtools-layer-D_0UL_Wd.js.map +1 -0
- package/dist/devtools-next.js +1 -1
- package/dist/devtools-vite.d.ts.map +1 -1
- package/dist/devtools-vite.js +5 -1
- package/dist/devtools-vite.js.map +1 -1
- package/dist/feedback.js +16 -11
- package/dist/feedback.js.map +1 -1
- package/dist/{handler-CyR6Ht99.js → handler-C9tdKcl0.js} +20 -8
- package/dist/handler-C9tdKcl0.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{picker-HLPIR-l6.js → picker-C7TkZcBE.js} +2 -2
- package/dist/{picker-HLPIR-l6.js.map → picker-C7TkZcBE.js.map} +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +43 -49
- package/dist/react.js.map +1 -1
- package/dist/{z-index-CKxBgZTG.js → z-index-BL0SGZEP.js} +7 -7
- package/dist/z-index-BL0SGZEP.js.map +1 -0
- package/package.json +1 -1
- package/dist/client-BWEBWk1k.js.map +0 -1
- package/dist/devtools-layer-N5ptXXK4.js.map +0 -1
- package/dist/handler-CyR6Ht99.js.map +0 -1
- package/dist/z-index-CKxBgZTG.js.map +0 -1
package/dist/devtools-next.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools-vite.d.ts","names":[],"sources":["../src/devtools/server/vite.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"devtools-vite.d.ts","names":[],"sources":["../src/devtools/server/vite.ts"],"mappings":";;;;wBAyFgB,eAAe,UAAS,wBAA6B"}
|
package/dist/devtools-vite.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as DEVTOOLS_ROUTE_BASE } from "./protocol-ClqTFzwR.js";
|
|
2
|
-
import { n as errorResponse, t as createDevtoolsHandler } from "./handler-
|
|
2
|
+
import { n as isLoopbackAddress, r as errorResponse, t as createDevtoolsHandler } from "./handler-C9tdKcl0.js";
|
|
3
3
|
import { loadEnv } from "vite";
|
|
4
4
|
//#region src/devtools/server/vite.ts
|
|
5
5
|
const MAX_BODY_BYTES = 1048576;
|
|
@@ -34,6 +34,10 @@ async function sendWebResponse(response, serverResponse) {
|
|
|
34
34
|
serverResponse.end(Buffer.from(await response.arrayBuffer()));
|
|
35
35
|
}
|
|
36
36
|
async function serveDevtoolsRequest(handler, request, serverResponse) {
|
|
37
|
+
if (!isLoopbackAddress(request.socket.remoteAddress)) {
|
|
38
|
+
await sendWebResponse(errorResponse("Reflet devtools only answers this machine.", 403), serverResponse);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
37
41
|
const method = request.method ?? "GET";
|
|
38
42
|
const body = method !== "GET" && method !== "HEAD" ? await readBody(request) : void 0;
|
|
39
43
|
if (body === null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools-vite.js","names":[],"sources":["../src/devtools/server/vite.ts"],"sourcesContent":["import type { ServerResponse } from \"node:http\";\nimport { type Connect, loadEnv, type Plugin } from \"vite\";\nimport { DEVTOOLS_ROUTE_BASE } from \"../protocol\";\nimport { createDevtoolsHandler, type DevtoolsHandler } from \"./handler\";\nimport { errorResponse } from \"./json-response\";\nimport type { DevtoolsServerOptions } from \"./options\";\n\nexport type { DevtoolsServerOptions } from \"./options\";\n\nconst MAX_BODY_BYTES = 1_048_576;\nconst ENV_PREFIX = \"REFLET_\";\n\nasync function readBody(\n request: Connect.IncomingMessage\n): Promise<string | null> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n size += buffer.length;\n // Keep draining: leaving the loop early destroys the socket before the 413 is sent.\n if (size <= MAX_BODY_BYTES) {\n chunks.push(buffer);\n }\n }\n return size > MAX_BODY_BYTES ? null : Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toWebRequest(\n request: Connect.IncomingMessage,\n method: string,\n body: string | undefined\n): Request {\n const isTls =\n \"encrypted\" in request.socket && request.socket.encrypted === true;\n const protocol = isTls ? \"https\" : \"http\";\n const origin = `${protocol}://${request.headers.host ?? \"localhost\"}`;\n const url = new URL(request.originalUrl ?? request.url ?? \"/\", origin);\n const headers = new Headers();\n for (const [name, value] of Object.entries(request.headers)) {\n if (name.startsWith(\":\") || value === undefined) {\n continue;\n }\n for (const item of Array.isArray(value) ? value : [value]) {\n headers.append(name, item);\n }\n }\n return new Request(url, { body, headers, method });\n}\n\nasync function sendWebResponse(\n response: Response,\n serverResponse: ServerResponse\n): Promise<void> {\n serverResponse.statusCode = response.status;\n for (const [name, value] of response.headers) {\n serverResponse.setHeader(name, value);\n }\n serverResponse.end(Buffer.from(await response.arrayBuffer()));\n}\n\nasync function serveDevtoolsRequest(\n handler: DevtoolsHandler,\n request: Connect.IncomingMessage,\n serverResponse: ServerResponse\n): Promise<void> {\n const method = request.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const body = hasBody ? await readBody(request) : undefined;\n if (body === null) {\n await sendWebResponse(\n errorResponse(\"Reflet devtools requests are limited to 1 MB.\", 413),\n serverResponse\n );\n return;\n }\n const response = await handler(toWebRequest(request, method, body));\n await sendWebResponse(response, serverResponse);\n}\n\n/** Serves the Reflet devtools route from the Vite dev server; never part of a build. */\nexport function refletDevtools(options: DevtoolsServerOptions = {}): Plugin {\n let handler: DevtoolsHandler | null = null;\n\n return {\n apply: \"serve\",\n configResolved(config) {\n const env = loadEnv(config.mode, config.envDir, ENV_PREFIX);\n handler = createDevtoolsHandler(\n { ...options, root: options.root ?? config.root },\n { ...process.env, ...env }\n );\n },\n configureServer(server) {\n server.middlewares.use(DEVTOOLS_ROUTE_BASE, (request, response, next) => {\n if (!handler) {\n next();\n return;\n }\n serveDevtoolsRequest(handler, request, response).catch(next);\n });\n },\n name: \"reflet-devtools\",\n };\n}\n"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"devtools-vite.js","names":[],"sources":["../src/devtools/server/vite.ts"],"sourcesContent":["import type { ServerResponse } from \"node:http\";\nimport { type Connect, loadEnv, type Plugin } from \"vite\";\nimport { DEVTOOLS_ROUTE_BASE } from \"../protocol\";\nimport { createDevtoolsHandler, type DevtoolsHandler } from \"./handler\";\nimport { errorResponse } from \"./json-response\";\nimport type { DevtoolsServerOptions } from \"./options\";\nimport { isLoopbackAddress } from \"./request-guard\";\n\nexport type { DevtoolsServerOptions } from \"./options\";\n\nconst MAX_BODY_BYTES = 1_048_576;\nconst ENV_PREFIX = \"REFLET_\";\n\nasync function readBody(\n request: Connect.IncomingMessage\n): Promise<string | null> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n size += buffer.length;\n // Keep draining: leaving the loop early destroys the socket before the 413 is sent.\n if (size <= MAX_BODY_BYTES) {\n chunks.push(buffer);\n }\n }\n return size > MAX_BODY_BYTES ? null : Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toWebRequest(\n request: Connect.IncomingMessage,\n method: string,\n body: string | undefined\n): Request {\n const isTls =\n \"encrypted\" in request.socket && request.socket.encrypted === true;\n const protocol = isTls ? \"https\" : \"http\";\n const origin = `${protocol}://${request.headers.host ?? \"localhost\"}`;\n const url = new URL(request.originalUrl ?? request.url ?? \"/\", origin);\n const headers = new Headers();\n for (const [name, value] of Object.entries(request.headers)) {\n if (name.startsWith(\":\") || value === undefined) {\n continue;\n }\n for (const item of Array.isArray(value) ? value : [value]) {\n headers.append(name, item);\n }\n }\n return new Request(url, { body, headers, method });\n}\n\nasync function sendWebResponse(\n response: Response,\n serverResponse: ServerResponse\n): Promise<void> {\n serverResponse.statusCode = response.status;\n for (const [name, value] of response.headers) {\n serverResponse.setHeader(name, value);\n }\n serverResponse.end(Buffer.from(await response.arrayBuffer()));\n}\n\nasync function serveDevtoolsRequest(\n handler: DevtoolsHandler,\n request: Connect.IncomingMessage,\n serverResponse: ServerResponse\n): Promise<void> {\n if (!isLoopbackAddress(request.socket.remoteAddress)) {\n await sendWebResponse(\n errorResponse(\"Reflet devtools only answers this machine.\", 403),\n serverResponse\n );\n return;\n }\n const method = request.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const body = hasBody ? await readBody(request) : undefined;\n if (body === null) {\n await sendWebResponse(\n errorResponse(\"Reflet devtools requests are limited to 1 MB.\", 413),\n serverResponse\n );\n return;\n }\n const response = await handler(toWebRequest(request, method, body));\n await sendWebResponse(response, serverResponse);\n}\n\n/** Serves the Reflet devtools route from the Vite dev server; never part of a build. */\nexport function refletDevtools(options: DevtoolsServerOptions = {}): Plugin {\n let handler: DevtoolsHandler | null = null;\n\n return {\n apply: \"serve\",\n configResolved(config) {\n const env = loadEnv(config.mode, config.envDir, ENV_PREFIX);\n handler = createDevtoolsHandler(\n { ...options, root: options.root ?? config.root },\n { ...process.env, ...env }\n );\n },\n configureServer(server) {\n server.middlewares.use(DEVTOOLS_ROUTE_BASE, (request, response, next) => {\n if (!handler) {\n next();\n return;\n }\n serveDevtoolsRequest(handler, request, response).catch(next);\n });\n },\n name: \"reflet-devtools\",\n };\n}\n"],"mappings":";;;;AAUA,MAAM,iBAAiB;AACvB,MAAM,aAAa;AAEnB,eAAe,SACb,SACwB;CACxB,MAAM,SAAmB,CAAC;CAC1B,IAAI,OAAO;CACX,WAAW,MAAM,SAAS,SAAS;EACjC,MAAM,SAAS,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,OAAO,KAAK,CAAC;EACzE,QAAQ,OAAO;EAEf,IAAI,QAAQ,gBACV,OAAO,KAAK,MAAM;CAEtB;CACA,OAAO,OAAO,iBAAiB,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM;AAC7E;AAEA,SAAS,aACP,SACA,QACA,MACS;CAIT,MAAM,SAAS,GAFb,eAAe,QAAQ,UAAU,QAAQ,OAAO,cAAc,OACvC,UAAU,OACR,KAAK,QAAQ,QAAQ,QAAQ;CACxD,MAAM,MAAM,IAAI,IAAI,QAAQ,eAAe,QAAQ,OAAO,KAAK,MAAM;CACrE,MAAM,UAAU,IAAI,QAAQ;CAC5B,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,OAAO,GAAG;EAC3D,IAAI,KAAK,WAAW,GAAG,KAAK,UAAU,KAAA,GACpC;EAEF,KAAK,MAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,GACtD,QAAQ,OAAO,MAAM,IAAI;CAE7B;CACA,OAAO,IAAI,QAAQ,KAAK;EAAE;EAAM;EAAS;CAAO,CAAC;AACnD;AAEA,eAAe,gBACb,UACA,gBACe;CACf,eAAe,aAAa,SAAS;CACrC,KAAK,MAAM,CAAC,MAAM,UAAU,SAAS,SACnC,eAAe,UAAU,MAAM,KAAK;CAEtC,eAAe,IAAI,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC,CAAC;AAC9D;AAEA,eAAe,qBACb,SACA,SACA,gBACe;CACf,IAAI,CAAC,kBAAkB,QAAQ,OAAO,aAAa,GAAG;EACpD,MAAM,gBACJ,cAAc,8CAA8C,GAAG,GAC/D,cACF;EACA;CACF;CACA,MAAM,SAAS,QAAQ,UAAU;CAEjC,MAAM,OADU,WAAW,SAAS,WAAW,SACxB,MAAM,SAAS,OAAO,IAAI,KAAA;CACjD,IAAI,SAAS,MAAM;EACjB,MAAM,gBACJ,cAAc,iDAAiD,GAAG,GAClE,cACF;EACA;CACF;CAEA,MAAM,gBAAgB,MADC,QAAQ,aAAa,SAAS,QAAQ,IAAI,CAAC,GAClC,cAAc;AAChD;;AAGA,SAAgB,eAAe,UAAiC,CAAC,GAAW;CAC1E,IAAI,UAAkC;CAEtC,OAAO;EACL,OAAO;EACP,eAAe,QAAQ;GACrB,MAAM,MAAM,QAAQ,OAAO,MAAM,OAAO,QAAQ,UAAU;GAC1D,UAAU,sBACR;IAAE,GAAG;IAAS,MAAM,QAAQ,QAAQ,OAAO;GAAK,GAChD;IAAE,GAAG,QAAQ;IAAK,GAAG;GAAI,CAC3B;EACF;EACA,gBAAgB,QAAQ;GACtB,OAAO,YAAY,IAAI,sBAAsB,SAAS,UAAU,SAAS;IACvE,IAAI,CAAC,SAAS;KACZ,KAAK;KACL;IACF;IACA,qBAAqB,SAAS,SAAS,QAAQ,CAAC,CAAC,MAAM,IAAI;GAC7D,CAAC;EACH;EACA,MAAM;CACR;AACF"}
|
package/dist/feedback.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { n as Reflet } from "./client-
|
|
3
|
-
import { A as TargetIcon, B as buildElementSelection, C as GripIcon, D as SpotlightIcon, E as PencilIcon, F as normalizeRect, G as WIDGET_MARKER, I as DEFAULT_WIDGET_LABELS, J as releaseCapture, K as captureViewport, L as SDK_VERSION, M as TrashIcon, N as UndoIcon, O as SquareIcon, P as isDegenerate, R as collectPageContext, S as CloseIcon, T as MoreIcon, _ as BlurIcon, b as CheckIcon, d as SelectionOutline, f as drawAnnotations, g as ArrowIcon, h as stopClicksAtHost, j as TextIcon, l as submitWidgetFeedback, m as listenToKeydown, o as attachPreparedScreenshots, p as listenOnPageAndWidget, r as useFloatingPosition, s as createFeedbackTransport, t as ElementPicker, v as CameraIcon, w as HighlightIcon, x as ChevronDownIcon, y as ChatIcon, z as MAX_SELECTION_COMMENT_LENGTH } from "./picker-
|
|
4
|
-
import { n as RefletContext, t as REFLET_Z_INDEX } from "./z-index-
|
|
2
|
+
import { n as Reflet } from "./client-DAdWdIFY.js";
|
|
3
|
+
import { A as TargetIcon, B as buildElementSelection, C as GripIcon, D as SpotlightIcon, E as PencilIcon, F as normalizeRect, G as WIDGET_MARKER, I as DEFAULT_WIDGET_LABELS, J as releaseCapture, K as captureViewport, L as SDK_VERSION, M as TrashIcon, N as UndoIcon, O as SquareIcon, P as isDegenerate, R as collectPageContext, S as CloseIcon, T as MoreIcon, _ as BlurIcon, b as CheckIcon, d as SelectionOutline, f as drawAnnotations, g as ArrowIcon, h as stopClicksAtHost, j as TextIcon, l as submitWidgetFeedback, m as listenToKeydown, o as attachPreparedScreenshots, p as listenOnPageAndWidget, r as useFloatingPosition, s as createFeedbackTransport, t as ElementPicker, v as CameraIcon, w as HighlightIcon, x as ChevronDownIcon, y as ChatIcon, z as MAX_SELECTION_COMMENT_LENGTH } from "./picker-C7TkZcBE.js";
|
|
4
|
+
import { n as RefletContext, t as REFLET_Z_INDEX } from "./z-index-BL0SGZEP.js";
|
|
5
5
|
import { Suspense, lazy, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
6
6
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
import { Slider } from "@base-ui/react/slider";
|
|
@@ -1430,8 +1430,13 @@ const RESIZE_DEBOUNCE = 400;
|
|
|
1430
1430
|
* page context describing what the reporter currently sees.
|
|
1431
1431
|
*/
|
|
1432
1432
|
function useCaptureSync(enabled, refresh) {
|
|
1433
|
+
const refreshRef = useRef(refresh);
|
|
1434
|
+
useEffect(() => {
|
|
1435
|
+
refreshRef.current = refresh;
|
|
1436
|
+
});
|
|
1433
1437
|
useEffect(() => {
|
|
1434
1438
|
if (!enabled) return;
|
|
1439
|
+
const runRefresh = () => refreshRef.current();
|
|
1435
1440
|
const history = window.history;
|
|
1436
1441
|
const originalPush = history.pushState;
|
|
1437
1442
|
const originalReplace = history.replaceState;
|
|
@@ -1439,19 +1444,19 @@ function useCaptureSync(enabled, refresh) {
|
|
|
1439
1444
|
const hadOwnReplace = Object.hasOwn(history, "replaceState");
|
|
1440
1445
|
history.pushState = function pushState(data, unused, url) {
|
|
1441
1446
|
const result = originalPush.call(history, data, unused, url);
|
|
1442
|
-
|
|
1447
|
+
runRefresh();
|
|
1443
1448
|
return result;
|
|
1444
1449
|
};
|
|
1445
1450
|
history.replaceState = function replaceState(data, unused, url) {
|
|
1446
1451
|
const result = originalReplace.call(history, data, unused, url);
|
|
1447
|
-
|
|
1452
|
+
runRefresh();
|
|
1448
1453
|
return result;
|
|
1449
1454
|
};
|
|
1450
|
-
window.addEventListener("popstate",
|
|
1455
|
+
window.addEventListener("popstate", runRefresh);
|
|
1451
1456
|
let resizeTimer;
|
|
1452
1457
|
const onResize = () => {
|
|
1453
1458
|
window.clearTimeout(resizeTimer);
|
|
1454
|
-
resizeTimer = window.setTimeout(
|
|
1459
|
+
resizeTimer = window.setTimeout(runRefresh, RESIZE_DEBOUNCE);
|
|
1455
1460
|
};
|
|
1456
1461
|
window.addEventListener("resize", onResize);
|
|
1457
1462
|
return () => {
|
|
@@ -1459,11 +1464,11 @@ function useCaptureSync(enabled, refresh) {
|
|
|
1459
1464
|
else Reflect.deleteProperty(history, "pushState");
|
|
1460
1465
|
if (hadOwnReplace) history.replaceState = originalReplace;
|
|
1461
1466
|
else Reflect.deleteProperty(history, "replaceState");
|
|
1462
|
-
window.removeEventListener("popstate",
|
|
1467
|
+
window.removeEventListener("popstate", runRefresh);
|
|
1463
1468
|
window.clearTimeout(resizeTimer);
|
|
1464
1469
|
window.removeEventListener("resize", onResize);
|
|
1465
1470
|
};
|
|
1466
|
-
}, [enabled
|
|
1471
|
+
}, [enabled]);
|
|
1467
1472
|
}
|
|
1468
1473
|
//#endregion
|
|
1469
1474
|
//#region src/feedback/ui/use-widget-state.ts
|
|
@@ -1635,7 +1640,7 @@ function useWidgetState(props) {
|
|
|
1635
1640
|
setStep("compose");
|
|
1636
1641
|
return submission.submit({
|
|
1637
1642
|
context: {
|
|
1638
|
-
...activeScreenshot?.context ?? collectPageContext({ sdkVersion: "0.
|
|
1643
|
+
...activeScreenshot?.context ?? collectPageContext({ sdkVersion: "0.6.0" }),
|
|
1639
1644
|
consoleEvents: consoleRef.current?.events(),
|
|
1640
1645
|
metadata: props.metadata,
|
|
1641
1646
|
selections
|
|
@@ -2310,7 +2315,7 @@ function ShadowPortal({ children, offset, primaryColor, theme }) {
|
|
|
2310
2315
|
}
|
|
2311
2316
|
//#endregion
|
|
2312
2317
|
//#region src/feedback/widget.tsx
|
|
2313
|
-
const DevtoolsLayer = process.env.NODE_ENV === "development" ? lazy(() => import("./devtools-layer-
|
|
2318
|
+
const DevtoolsLayer = process.env.NODE_ENV === "development" ? lazy(() => import("./devtools-layer-D_0UL_Wd.js").then((module) => ({ default: module.DevtoolsLayer }))) : null;
|
|
2314
2319
|
function RefletFeedback(props) {
|
|
2315
2320
|
const { devtools = true, enabled = true, hotkey = null, offset = 20, position = "bottom-right", theme = "auto" } = props;
|
|
2316
2321
|
const labels = {
|