sweetlink 0.1.0 → 0.2.1
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 +20 -0
- package/LICENSE +1 -1
- package/README.md +22 -11
- package/dist/daemon/src/codename.d.ts.map +1 -1
- package/dist/daemon/src/codename.js +11 -11
- package/dist/daemon/src/codename.js.map +1 -1
- package/dist/daemon/src/index.d.ts +1 -1
- package/dist/daemon/src/index.js +131 -122
- package/dist/daemon/src/index.js.map +1 -1
- package/dist/shared/src/env.d.ts.map +1 -1
- package/dist/shared/src/env.js +12 -12
- package/dist/shared/src/env.js.map +1 -1
- package/dist/shared/src/index.d.ts +30 -30
- package/dist/shared/src/index.d.ts.map +1 -1
- package/dist/shared/src/index.js +17 -17
- package/dist/shared/src/index.js.map +1 -1
- package/dist/shared/src/node.d.ts +1 -1
- package/dist/shared/src/node.d.ts.map +1 -1
- package/dist/shared/src/node.js +18 -18
- package/dist/shared/src/node.js.map +1 -1
- package/dist/src/codex.d.ts +1 -1
- package/dist/src/codex.js +19 -19
- package/dist/src/codex.js.map +1 -1
- package/dist/src/commands/click.d.ts +1 -1
- package/dist/src/commands/click.d.ts.map +1 -1
- package/dist/src/commands/click.js +32 -24
- package/dist/src/commands/click.js.map +1 -1
- package/dist/src/commands/run-js.d.ts +1 -1
- package/dist/src/commands/run-js.d.ts.map +1 -1
- package/dist/src/commands/run-js.js +10 -10
- package/dist/src/commands/run-js.js.map +1 -1
- package/dist/src/commands/trust-ca.d.ts +1 -1
- package/dist/src/commands/trust-ca.js +15 -15
- package/dist/src/core/config-file.d.ts +6 -0
- package/dist/src/core/config-file.d.ts.map +1 -1
- package/dist/src/core/config-file.js +73 -38
- package/dist/src/core/config-file.js.map +1 -1
- package/dist/src/core/config.d.ts +3 -2
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +31 -18
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/dev-bootstrap.d.ts +10 -0
- package/dist/src/core/dev-bootstrap.d.ts.map +1 -0
- package/dist/src/core/dev-bootstrap.js +112 -0
- package/dist/src/core/dev-bootstrap.js.map +1 -0
- package/dist/src/core/env.d.ts +1 -1
- package/dist/src/core/env.d.ts.map +1 -1
- package/dist/src/core/env.js +3 -3
- package/dist/src/core/env.js.map +1 -1
- package/dist/src/devtools-registry.d.ts.map +1 -1
- package/dist/src/devtools-registry.js +48 -46
- package/dist/src/devtools-registry.js.map +1 -1
- package/dist/src/env.d.ts +1 -1
- package/dist/src/env.js +1 -1
- package/dist/src/http.d.ts.map +1 -1
- package/dist/src/http.js +7 -6
- package/dist/src/http.js.map +1 -1
- package/dist/src/index.d.ts +7 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +450 -363
- package/dist/src/index.js.map +1 -1
- package/dist/src/runtime/browser/client.d.ts +3 -3
- package/dist/src/runtime/browser/client.d.ts.map +1 -1
- package/dist/src/runtime/browser/client.js +79 -72
- package/dist/src/runtime/browser/client.js.map +1 -1
- package/dist/src/runtime/browser/commands/index.d.ts +2 -2
- package/dist/src/runtime/browser/commands/index.js +17 -17
- package/dist/src/runtime/browser/commands/index.js.map +1 -1
- package/dist/src/runtime/browser/dom-to-image-loader.d.ts.map +1 -1
- package/dist/src/runtime/browser/dom-to-image-loader.js +7 -7
- package/dist/src/runtime/browser/dom-to-image-loader.js.map +1 -1
- package/dist/src/runtime/browser/index.d.ts +3 -3
- package/dist/src/runtime/browser/index.js +2 -2
- package/dist/src/runtime/browser/module-loader.js +2 -2
- package/dist/src/runtime/browser/screenshot/hooks.d.ts +25 -53
- package/dist/src/runtime/browser/screenshot/hooks.d.ts.map +1 -1
- package/dist/src/runtime/browser/screenshot/hooks.js +32 -29
- package/dist/src/runtime/browser/screenshot/hooks.js.map +1 -1
- package/dist/src/runtime/browser/screenshot/index.d.ts +3 -3
- package/dist/src/runtime/browser/screenshot/index.d.ts.map +1 -1
- package/dist/src/runtime/browser/screenshot/index.js +17 -15
- package/dist/src/runtime/browser/screenshot/index.js.map +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.d.ts +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js +13 -13
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js.map +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts.map +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js +24 -24
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js.map +1 -1
- package/dist/src/runtime/browser/screenshot/targets.d.ts +2 -2
- package/dist/src/runtime/browser/screenshot/targets.js +9 -9
- package/dist/src/runtime/browser/screenshot/utils.d.ts +1 -1
- package/dist/src/runtime/browser/screenshot/utils.d.ts.map +1 -1
- package/dist/src/runtime/browser/screenshot/utils.js +73 -71
- package/dist/src/runtime/browser/screenshot/utils.js.map +1 -1
- package/dist/src/runtime/browser/selector-discovery.d.ts +1 -1
- package/dist/src/runtime/browser/selector-discovery.d.ts.map +1 -1
- package/dist/src/runtime/browser/selector-discovery.js +24 -22
- package/dist/src/runtime/browser/selector-discovery.js.map +1 -1
- package/dist/src/runtime/browser/storage/session-storage.d.ts +1 -1
- package/dist/src/runtime/browser/storage/session-storage.d.ts.map +1 -1
- package/dist/src/runtime/browser/storage/session-storage.js +12 -10
- package/dist/src/runtime/browser/storage/session-storage.js.map +1 -1
- package/dist/src/runtime/browser/types.d.ts +7 -7
- package/dist/src/runtime/browser/types.js +1 -1
- package/dist/src/runtime/browser/utils/console.d.ts +1 -1
- package/dist/src/runtime/browser/utils/console.js +16 -16
- package/dist/src/runtime/browser/utils/console.js.map +1 -1
- package/dist/src/runtime/browser/utils/environment.js +2 -2
- package/dist/src/runtime/browser/utils/errors.d.ts.map +1 -1
- package/dist/src/runtime/browser/utils/errors.js +11 -11
- package/dist/src/runtime/browser/utils/number.d.ts.map +1 -1
- package/dist/src/runtime/browser/utils/number.js.map +1 -1
- package/dist/src/runtime/browser/utils/object.d.ts.map +1 -1
- package/dist/src/runtime/browser/utils/object.js +2 -2
- package/dist/src/runtime/browser/utils/object.js.map +1 -1
- package/dist/src/runtime/browser/utils/sanitize.js +2 -2
- package/dist/src/runtime/browser/utils/time.d.ts.map +1 -1
- package/dist/src/runtime/browser/utils/time.js +1 -1
- package/dist/src/runtime/chrome/cookies.d.ts +4 -4
- package/dist/src/runtime/chrome/cookies.d.ts.map +1 -1
- package/dist/src/runtime/chrome/cookies.js +31 -31
- package/dist/src/runtime/chrome/cookies.js.map +1 -1
- package/dist/src/runtime/chrome/deep-link.d.ts +13 -0
- package/dist/src/runtime/chrome/deep-link.d.ts.map +1 -0
- package/dist/src/runtime/chrome/deep-link.js +292 -0
- package/dist/src/runtime/chrome/deep-link.js.map +1 -0
- package/dist/src/runtime/chrome/diagnostics.d.ts.map +1 -1
- package/dist/src/runtime/chrome/diagnostics.js +13 -11
- package/dist/src/runtime/chrome/diagnostics.js.map +1 -1
- package/dist/src/runtime/chrome/focus.d.ts.map +1 -1
- package/dist/src/runtime/chrome/focus.js +5 -5
- package/dist/src/runtime/chrome/focus.js.map +1 -1
- package/dist/src/runtime/chrome/launch.d.ts.map +1 -1
- package/dist/src/runtime/chrome/launch.js +30 -30
- package/dist/src/runtime/chrome/launch.js.map +1 -1
- package/dist/src/runtime/chrome/puppeteer.d.ts +2 -2
- package/dist/src/runtime/chrome/puppeteer.d.ts.map +1 -1
- package/dist/src/runtime/chrome/puppeteer.js +16 -11
- package/dist/src/runtime/chrome/puppeteer.js.map +1 -1
- package/dist/src/runtime/chrome/reuse.d.ts.map +1 -1
- package/dist/src/runtime/chrome/reuse.js +38 -35
- package/dist/src/runtime/chrome/reuse.js.map +1 -1
- package/dist/src/runtime/chrome/session.d.ts +1 -1
- package/dist/src/runtime/chrome/session.d.ts.map +1 -1
- package/dist/src/runtime/chrome/session.js +12 -10
- package/dist/src/runtime/chrome/session.js.map +1 -1
- package/dist/src/runtime/chrome.d.ts +8 -8
- package/dist/src/runtime/chrome.js +8 -8
- package/dist/src/runtime/cookies.d.ts +1 -16
- package/dist/src/runtime/cookies.d.ts.map +1 -1
- package/dist/src/runtime/cookies.js +177 -281
- package/dist/src/runtime/cookies.js.map +1 -1
- package/dist/src/runtime/devstack.d.ts +1 -1
- package/dist/src/runtime/devstack.d.ts.map +1 -1
- package/dist/src/runtime/devstack.js +31 -28
- package/dist/src/runtime/devstack.js.map +1 -1
- package/dist/src/runtime/devtools/background.js +22 -22
- package/dist/src/runtime/devtools/cdp.d.ts +3 -2
- package/dist/src/runtime/devtools/cdp.d.ts.map +1 -1
- package/dist/src/runtime/devtools/cdp.js +61 -56
- package/dist/src/runtime/devtools/cdp.js.map +1 -1
- package/dist/src/runtime/devtools/config.d.ts +44 -1
- package/dist/src/runtime/devtools/config.d.ts.map +1 -1
- package/dist/src/runtime/devtools/config.js +15 -15
- package/dist/src/runtime/devtools/config.js.map +1 -1
- package/dist/src/runtime/devtools/constants.d.ts.map +1 -1
- package/dist/src/runtime/devtools/constants.js +18 -10
- package/dist/src/runtime/devtools/constants.js.map +1 -1
- package/dist/src/runtime/devtools/diagnostics.d.ts +6 -3
- package/dist/src/runtime/devtools/diagnostics.d.ts.map +1 -1
- package/dist/src/runtime/devtools/diagnostics.js +40 -38
- package/dist/src/runtime/devtools/diagnostics.js.map +1 -1
- package/dist/src/runtime/devtools/oauth.d.ts +1 -1
- package/dist/src/runtime/devtools/oauth.d.ts.map +1 -1
- package/dist/src/runtime/devtools/oauth.js +35 -28
- package/dist/src/runtime/devtools/oauth.js.map +1 -1
- package/dist/src/runtime/devtools/types.d.ts +3 -48
- package/dist/src/runtime/devtools/types.d.ts.map +1 -1
- package/dist/src/runtime/devtools.d.ts +7 -7
- package/dist/src/runtime/devtools.js +7 -7
- package/dist/src/runtime/next-devtools.d.ts.map +1 -1
- package/dist/src/runtime/next-devtools.js +12 -12
- package/dist/src/runtime/next-devtools.js.map +1 -1
- package/dist/src/runtime/screenshot.d.ts +9 -9
- package/dist/src/runtime/screenshot.d.ts.map +1 -1
- package/dist/src/runtime/screenshot.js +65 -46
- package/dist/src/runtime/screenshot.js.map +1 -1
- package/dist/src/runtime/scripts.d.ts +1 -1
- package/dist/src/runtime/scripts.d.ts.map +1 -1
- package/dist/src/runtime/scripts.js +28 -28
- package/dist/src/runtime/scripts.js.map +1 -1
- package/dist/src/runtime/session.d.ts +6 -6
- package/dist/src/runtime/session.d.ts.map +1 -1
- package/dist/src/runtime/session.js +35 -35
- package/dist/src/runtime/session.js.map +1 -1
- package/dist/src/runtime/smoke.d.ts +3 -3
- package/dist/src/runtime/smoke.d.ts.map +1 -1
- package/dist/src/runtime/smoke.js +85 -79
- package/dist/src/runtime/smoke.js.map +1 -1
- package/dist/src/runtime/url.d.ts +2 -2
- package/dist/src/runtime/url.d.ts.map +1 -1
- package/dist/src/runtime/url.js +20 -20
- package/dist/src/runtime/url.js.map +1 -1
- package/dist/src/screenshot-hooks.d.ts +1 -1
- package/dist/src/screenshot-hooks.d.ts.map +1 -1
- package/dist/src/screenshot-hooks.js +12 -12
- package/dist/src/screenshot-hooks.js.map +1 -1
- package/dist/src/shared/env.d.ts.map +1 -1
- package/dist/src/shared/env.js +11 -11
- package/dist/src/shared/env.js.map +1 -1
- package/dist/src/shared/index.d.ts +30 -30
- package/dist/src/shared/index.d.ts.map +1 -1
- package/dist/src/shared/index.js +17 -17
- package/dist/src/shared/index.js.map +1 -1
- package/dist/src/shared/node.d.ts +1 -1
- package/dist/src/shared/node.d.ts.map +1 -1
- package/dist/src/shared/node.js +18 -18
- package/dist/src/shared/node.js.map +1 -1
- package/dist/src/token.d.ts +1 -1
- package/dist/src/token.d.ts.map +1 -1
- package/dist/src/token.js +21 -18
- package/dist/src/token.js.map +1 -1
- package/dist/src/types.d.ts +7 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/util/app-label.js +4 -4
- package/dist/src/util/errors.d.ts.map +1 -1
- package/dist/src/util/errors.js +12 -10
- package/dist/src/util/errors.js.map +1 -1
- package/dist/src/util/path.js +2 -2
- package/dist/src/util/regex.js +4 -4
- package/package.json +48 -40
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { getBrowserWindow } from
|
|
2
|
-
import { commandSelectorSummary, HTML2CANVAS_TARGET_ATTR } from
|
|
3
|
-
import { normalizeOklchColors, patchHtml2canvasColorParser, recordScreenshotError } from
|
|
1
|
+
import { getBrowserWindow } from "../../utils/environment.js";
|
|
2
|
+
import { commandSelectorSummary, HTML2CANVAS_TARGET_ATTR } from "../targets.js";
|
|
3
|
+
import { normalizeOklchColors, patchHtml2canvasColorParser, recordScreenshotError, } from "../utils.js";
|
|
4
4
|
let html2canvasModulePromise = null;
|
|
5
5
|
async function loadHtml2Canvas() {
|
|
6
6
|
if (!html2canvasModulePromise) {
|
|
7
|
-
html2canvasModulePromise = import(
|
|
7
|
+
html2canvasModulePromise = import("html2canvas");
|
|
8
8
|
}
|
|
9
9
|
const html2canvasModule = await html2canvasModulePromise;
|
|
10
10
|
patchHtml2canvasColorParser(html2canvasModule);
|
|
@@ -19,15 +19,15 @@ export async function captureWithHtml2Canvas(targetInfo, quality) {
|
|
|
19
19
|
targetInfo.base.setAttribute(HTML2CANVAS_TARGET_ATTR, markerValue);
|
|
20
20
|
}
|
|
21
21
|
const html2canvas = await loadHtml2Canvas();
|
|
22
|
-
if (typeof html2canvas !==
|
|
22
|
+
if (typeof html2canvas !== "function") {
|
|
23
23
|
restoreColors();
|
|
24
|
-
throw new TypeError(
|
|
24
|
+
throw new TypeError("html2canvas is unavailable");
|
|
25
25
|
}
|
|
26
26
|
const timeoutMs = 6000;
|
|
27
27
|
let canvasResult;
|
|
28
28
|
let timer;
|
|
29
29
|
try {
|
|
30
|
-
console.info(
|
|
30
|
+
console.info("[SweetLink] html2canvas capture starting", {
|
|
31
31
|
selector: commandSelectorSummary(targetInfo.target),
|
|
32
32
|
clip: targetInfo.clip ?? null,
|
|
33
33
|
});
|
|
@@ -54,7 +54,7 @@ export async function captureWithHtml2Canvas(targetInfo, quality) {
|
|
|
54
54
|
onclone: (clonedDocument) => {
|
|
55
55
|
const cloneWindow = clonedDocument.defaultView;
|
|
56
56
|
const cloneTarget = clonedDocument.querySelector(`[${HTML2CANVAS_TARGET_ATTR}="${markerValue}"]`);
|
|
57
|
-
if (!(
|
|
57
|
+
if (!(cloneWindow && cloneTarget && cloneTarget instanceof cloneWindow.HTMLElement)) {
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
const rect = targetInfo.base.getBoundingClientRect();
|
|
@@ -67,14 +67,14 @@ export async function captureWithHtml2Canvas(targetInfo, quality) {
|
|
|
67
67
|
cloneTarget.style.height = `${heightPx}px`;
|
|
68
68
|
cloneTarget.style.minHeight = cloneTarget.style.height;
|
|
69
69
|
cloneTarget.style.maxHeight = cloneTarget.style.height;
|
|
70
|
-
cloneTarget.style.boxSizing =
|
|
71
|
-
const wrapper = clonedDocument.createElement(
|
|
72
|
-
wrapper.style.display =
|
|
73
|
-
wrapper.style.padding =
|
|
74
|
-
wrapper.style.margin =
|
|
75
|
-
wrapper.style.border =
|
|
70
|
+
cloneTarget.style.boxSizing = "border-box";
|
|
71
|
+
const wrapper = clonedDocument.createElement("div");
|
|
72
|
+
wrapper.style.display = "inline-block";
|
|
73
|
+
wrapper.style.padding = "0";
|
|
74
|
+
wrapper.style.margin = "0";
|
|
75
|
+
wrapper.style.border = "none";
|
|
76
76
|
const computedBackground = getComputedStyle(targetInfo.base).backgroundColor;
|
|
77
|
-
wrapper.style.background = computedBackground ||
|
|
77
|
+
wrapper.style.background = computedBackground || "transparent";
|
|
78
78
|
wrapper.style.width = cloneTarget.style.width;
|
|
79
79
|
wrapper.style.height = cloneTarget.style.height;
|
|
80
80
|
cloneTarget.replaceWith(wrapper);
|
|
@@ -91,10 +91,10 @@ export async function captureWithHtml2Canvas(targetInfo, quality) {
|
|
|
91
91
|
if (timer) {
|
|
92
92
|
clearTimeout(timer);
|
|
93
93
|
}
|
|
94
|
-
console.info(
|
|
94
|
+
console.info("[SweetLink] html2canvas capture finished");
|
|
95
95
|
}
|
|
96
96
|
if (!(canvasResult instanceof HTMLCanvasElement)) {
|
|
97
|
-
throw new TypeError(
|
|
97
|
+
throw new TypeError("html2canvas did not return a canvas element");
|
|
98
98
|
}
|
|
99
99
|
const canvas = canvasResult;
|
|
100
100
|
const blob = await new Promise((resolve, reject) => {
|
|
@@ -103,28 +103,28 @@ export async function captureWithHtml2Canvas(targetInfo, quality) {
|
|
|
103
103
|
resolve(value);
|
|
104
104
|
}
|
|
105
105
|
else {
|
|
106
|
-
reject(new Error(
|
|
106
|
+
reject(new Error("Failed to encode screenshot to JPEG"));
|
|
107
107
|
}
|
|
108
|
-
},
|
|
108
|
+
}, "image/jpeg", quality);
|
|
109
109
|
}).catch((error) => {
|
|
110
|
-
recordScreenshotError(
|
|
110
|
+
recordScreenshotError("html2canvas", error);
|
|
111
111
|
throw error;
|
|
112
112
|
});
|
|
113
113
|
const base64 = await blobToBase64(blob).catch((error) => {
|
|
114
|
-
recordScreenshotError(
|
|
114
|
+
recordScreenshotError("html2canvas", error);
|
|
115
115
|
throw error;
|
|
116
116
|
});
|
|
117
117
|
return {
|
|
118
|
-
mimeType:
|
|
118
|
+
mimeType: "image/jpeg",
|
|
119
119
|
base64,
|
|
120
120
|
width: canvas.width,
|
|
121
121
|
height: canvas.height,
|
|
122
|
-
renderer:
|
|
122
|
+
renderer: "html2canvas",
|
|
123
123
|
};
|
|
124
124
|
}
|
|
125
125
|
async function blobToBase64(blob) {
|
|
126
126
|
const buffer = await blob.arrayBuffer();
|
|
127
|
-
let binary =
|
|
127
|
+
let binary = "";
|
|
128
128
|
const bytes = new Uint8Array(buffer);
|
|
129
129
|
const chunkSize = 32_768;
|
|
130
130
|
for (let index = 0; index < bytes.length; index += chunkSize) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html2canvas.js","sourceRoot":"","sources":["../../../../../../src/runtime/browser/screenshot/renderers/html2canvas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,
|
|
1
|
+
{"version":3,"file":"html2canvas.js","sourceRoot":"","sources":["../../../../../../src/runtime/browser/screenshot/renderers/html2canvas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { SweetLinkScreenshotCommand } from
|
|
2
|
-
import type { ScreenshotTargetInfo } from
|
|
1
|
+
import type { SweetLinkScreenshotCommand } from "@sweetlink/shared";
|
|
2
|
+
import type { ScreenshotTargetInfo } from "../types.js";
|
|
3
3
|
export declare const HTML2CANVAS_TARGET_ATTR = "data-sweetlink-html2canvas-target";
|
|
4
4
|
export declare function resolveScreenshotTarget(command: SweetLinkScreenshotCommand): ScreenshotTargetInfo;
|
|
5
5
|
export declare function commandSelectorSummary(element: HTMLElement): string;
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
export const HTML2CANVAS_TARGET_ATTR =
|
|
1
|
+
export const HTML2CANVAS_TARGET_ATTR = "data-sweetlink-html2canvas-target";
|
|
2
2
|
export function resolveScreenshotTarget(command) {
|
|
3
|
-
if (command.mode ===
|
|
3
|
+
if (command.mode === "element") {
|
|
4
4
|
const selector = command.selector?.trim();
|
|
5
5
|
if (!selector) {
|
|
6
|
-
throw new Error(
|
|
6
|
+
throw new Error("Screenshot selector is required for element mode");
|
|
7
7
|
}
|
|
8
8
|
const directMatch = document.querySelector(selector);
|
|
9
|
-
const dataHookMatch = !directMatch && selector.startsWith(
|
|
9
|
+
const dataHookMatch = !directMatch && selector.startsWith("#")
|
|
10
10
|
? document.querySelector(`[data-sweetlink-target="${selector.slice(1)}"]`)
|
|
11
11
|
: null;
|
|
12
12
|
const element = directMatch ?? dataHookMatch;
|
|
13
13
|
if (!element) {
|
|
14
14
|
throw new Error(`Element not found for selector "${selector}"\n` +
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
"Tips:\n" +
|
|
16
|
+
" • Ensure the target section is mounted and visible (expand menus or switch tabs if needed).\n" +
|
|
17
17
|
' • Add a stable hook such as data-sweetlink-target="analytics-card" or an id, then reference it directly.\n' +
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
" • If the layout shifts on smaller widths, widen the window (>= 1280px) so the card renders in the DOM.\n" +
|
|
19
|
+
" • As a last resort, re-run with --method puppeteer after opening a controlled Chrome window.");
|
|
20
20
|
}
|
|
21
21
|
if (!(element instanceof HTMLElement)) {
|
|
22
22
|
throw new TypeError(`Element for selector "${selector}" is not an HTMLElement; SweetLink's html2canvas renderer only supports HTMLElement targets.`);
|
|
@@ -46,7 +46,7 @@ export function commandSelectorSummary(element) {
|
|
|
46
46
|
parts.push(`[data-sweetlink-target="${dataTarget}"]`);
|
|
47
47
|
}
|
|
48
48
|
if (parts.length > 0) {
|
|
49
|
-
return parts.join(
|
|
49
|
+
return parts.join(" ");
|
|
50
50
|
}
|
|
51
51
|
return element.tagName.toLowerCase();
|
|
52
52
|
}
|
|
@@ -3,7 +3,7 @@ type DomToImageModule = {
|
|
|
3
3
|
};
|
|
4
4
|
export declare const recordScreenshotError: (kind: string, error: unknown) => void;
|
|
5
5
|
export declare function loadDomToImage(): Promise<DomToImageModule>;
|
|
6
|
-
export declare function patchHtml2canvasColorParser(html2canvasModule: typeof import(
|
|
6
|
+
export declare function patchHtml2canvasColorParser(html2canvasModule: typeof import("html2canvas")): void;
|
|
7
7
|
export declare function normalizeOklchColors(root: HTMLElement, contextDocument?: Document): () => void;
|
|
8
8
|
export {};
|
|
9
9
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/browser/screenshot/utils.ts"],"names":[],"mappings":"AAKA,KAAK,gBAAgB,GAAG;IAAE,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAkB9F,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/browser/screenshot/utils.ts"],"names":[],"mappings":"AAKA,KAAK,gBAAgB,GAAG;IAAE,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAkB9F,eAAO,MAAM,qBAAqB,SAAU,MAAM,SAAS,OAAO,KAAG,IASpE,CAAC;AA8BF,wBAAgB,cAAc,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAmC1D;AAED,wBAAgB,2BAA2B,CAAC,iBAAiB,EAAE,cAAc,aAAa,CAAC,GAAG,IAAI,CA+BjG;AAgCD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,WAAW,EACjB,eAAe,GAAE,QAAmB,GACnC,MAAM,IAAI,CA0IZ"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { regex } from
|
|
2
|
-
import { compact } from
|
|
3
|
-
import { loadDomToImageFromScript } from
|
|
4
|
-
import { toError } from
|
|
1
|
+
import { regex } from "arkregex";
|
|
2
|
+
import { compact } from "es-toolkit";
|
|
3
|
+
import { loadDomToImageFromScript } from "../dom-to-image-loader.js";
|
|
4
|
+
import { toError } from "../utils/errors.js";
|
|
5
5
|
let domToImagePromise = null;
|
|
6
|
-
let html2canvasColorPatchState =
|
|
6
|
+
let html2canvasColorPatchState = "unpatched";
|
|
7
7
|
const patchedCssWindows = new WeakSet();
|
|
8
8
|
const browserWindow = globalThis.window ?? null;
|
|
9
|
-
const SAFE_CSS_PROPERTY_PATTERN = regex.as(
|
|
10
|
-
const OKLCH_PATTERN = regex.as(
|
|
9
|
+
const SAFE_CSS_PROPERTY_PATTERN = regex.as("^[a-z-]+$", "i");
|
|
10
|
+
const OKLCH_PATTERN = regex.as("okl(?:ab|ch)", "i");
|
|
11
11
|
const WHITESPACE_SPLIT_PATTERN = regex.as(String.raw `\s+`);
|
|
12
12
|
const TRAILING_ZERO_PATTERN = regex.as(String.raw `\.0+$`);
|
|
13
13
|
const noop = () => {
|
|
@@ -22,9 +22,9 @@ export const recordScreenshotError = (kind, error) => {
|
|
|
22
22
|
clientWindow.__sweetlinkScreenshotErrors[kind] = toError(error).message;
|
|
23
23
|
};
|
|
24
24
|
const isSafeCssProperty = (property) => {
|
|
25
|
-
const normalizedProperty = typeof property ===
|
|
25
|
+
const normalizedProperty = typeof property === "string" ? property : String(property);
|
|
26
26
|
return (SAFE_CSS_PROPERTY_PATTERN.test(normalizedProperty) ||
|
|
27
|
-
String.prototype.startsWith.call(normalizedProperty,
|
|
27
|
+
String.prototype.startsWith.call(normalizedProperty, "--"));
|
|
28
28
|
};
|
|
29
29
|
export function loadDomToImage() {
|
|
30
30
|
if (domToImagePromise) {
|
|
@@ -33,34 +33,34 @@ export function loadDomToImage() {
|
|
|
33
33
|
const resolveModule = async () => {
|
|
34
34
|
try {
|
|
35
35
|
const loadedModule = await loadDomToImageFromScript();
|
|
36
|
-
if (typeof loadedModule.toJpeg ===
|
|
36
|
+
if (typeof loadedModule.toJpeg === "function") {
|
|
37
37
|
return loadedModule;
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
catch (error) {
|
|
41
|
-
recordScreenshotError(
|
|
42
|
-
console.warn(
|
|
41
|
+
recordScreenshotError("domToImage", error);
|
|
42
|
+
console.warn("[SweetLink] Failed to load dom-to-image-more via script:", error);
|
|
43
43
|
}
|
|
44
44
|
const globalAny = browserWindow
|
|
45
45
|
? browserWindow
|
|
46
46
|
: null;
|
|
47
47
|
const fallback = globalAny?.domToImage ?? globalAny?.domtoimage ?? globalAny?.domtoImage;
|
|
48
|
-
if (fallback && typeof fallback.toJpeg ===
|
|
48
|
+
if (fallback && typeof fallback.toJpeg === "function") {
|
|
49
49
|
return fallback;
|
|
50
50
|
}
|
|
51
|
-
throw new Error(
|
|
51
|
+
throw new Error("dom-to-image-more is unavailable; ensure it is installed or exposed globally as domtoimage");
|
|
52
52
|
};
|
|
53
53
|
domToImagePromise = resolveModule();
|
|
54
54
|
return domToImagePromise;
|
|
55
55
|
}
|
|
56
56
|
export function patchHtml2canvasColorParser(html2canvasModule) {
|
|
57
|
-
if (html2canvasColorPatchState ===
|
|
57
|
+
if (html2canvasColorPatchState === "patched") {
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
const moduleAny = html2canvasModule;
|
|
61
61
|
const colorApi = moduleAny.Color ?? moduleAny.default?.Color;
|
|
62
|
-
if (!colorApi || typeof colorApi.parse !==
|
|
63
|
-
html2canvasColorPatchState =
|
|
62
|
+
if (!colorApi || typeof colorApi.parse !== "function") {
|
|
63
|
+
html2canvasColorPatchState = "patched";
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
// html2canvas bails as soon as its colour parser sees OKLAB/OKLCH tokens. Wrap the parser and
|
|
@@ -78,19 +78,20 @@ export function patchHtml2canvasColorParser(html2canvasModule) {
|
|
|
78
78
|
throw error;
|
|
79
79
|
}
|
|
80
80
|
};
|
|
81
|
-
html2canvasColorPatchState =
|
|
81
|
+
html2canvasColorPatchState = "patched";
|
|
82
82
|
}
|
|
83
83
|
function ensureCssGetPropertyValuePatched(contextWindow) {
|
|
84
84
|
if (patchedCssWindows.has(contextWindow)) {
|
|
85
85
|
return;
|
|
86
86
|
}
|
|
87
|
-
const cssDeclaration = contextWindow
|
|
87
|
+
const cssDeclaration = contextWindow
|
|
88
|
+
.CSSStyleDeclaration;
|
|
88
89
|
if (!cssDeclaration) {
|
|
89
90
|
patchedCssWindows.add(contextWindow);
|
|
90
91
|
return;
|
|
91
92
|
}
|
|
92
93
|
const proto = cssDeclaration.prototype;
|
|
93
|
-
if (typeof proto.getPropertyValue !==
|
|
94
|
+
if (typeof proto.getPropertyValue !== "function") {
|
|
94
95
|
patchedCssWindows.add(contextWindow);
|
|
95
96
|
return;
|
|
96
97
|
}
|
|
@@ -118,32 +119,32 @@ export function normalizeOklchColors(root, contextDocument = document) {
|
|
|
118
119
|
return noop;
|
|
119
120
|
}
|
|
120
121
|
const properties = [
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
122
|
+
"color",
|
|
123
|
+
"background-color",
|
|
124
|
+
"background",
|
|
125
|
+
"background-image",
|
|
126
|
+
"border-top-color",
|
|
127
|
+
"border-right-color",
|
|
128
|
+
"border-bottom-color",
|
|
129
|
+
"border-left-color",
|
|
130
|
+
"outline-color",
|
|
131
|
+
"text-decoration-color",
|
|
132
|
+
"box-shadow",
|
|
133
|
+
"text-shadow",
|
|
134
|
+
"column-rule-color",
|
|
135
|
+
"caret-color",
|
|
136
|
+
"fill",
|
|
137
|
+
"stroke",
|
|
137
138
|
];
|
|
138
139
|
const documentElement = contextDocument.documentElement;
|
|
139
140
|
const elements = root === documentElement
|
|
140
|
-
? [documentElement, ...contextDocument.querySelectorAll(
|
|
141
|
-
: [root, ...root.querySelectorAll(
|
|
142
|
-
const sandbox = contextDocument.createElement(
|
|
143
|
-
sandbox.style.position =
|
|
144
|
-
sandbox.style.visibility =
|
|
145
|
-
sandbox.style.pointerEvents =
|
|
146
|
-
sandbox.style.zIndex =
|
|
141
|
+
? [documentElement, ...contextDocument.querySelectorAll("*")]
|
|
142
|
+
: [root, ...root.querySelectorAll("*")];
|
|
143
|
+
const sandbox = contextDocument.createElement("span");
|
|
144
|
+
sandbox.style.position = "absolute";
|
|
145
|
+
sandbox.style.visibility = "hidden";
|
|
146
|
+
sandbox.style.pointerEvents = "none";
|
|
147
|
+
sandbox.style.zIndex = "-1";
|
|
147
148
|
body.append(sandbox);
|
|
148
149
|
const revertStyles = [];
|
|
149
150
|
for (const element of elements) {
|
|
@@ -151,7 +152,7 @@ export function normalizeOklchColors(root, contextDocument = document) {
|
|
|
151
152
|
const customProperties = [];
|
|
152
153
|
for (let index = 0; index < computed.length; index += 1) {
|
|
153
154
|
const name = computed.item(index);
|
|
154
|
-
if (name.startsWith(
|
|
155
|
+
if (name.startsWith("--")) {
|
|
155
156
|
customProperties.push(name);
|
|
156
157
|
}
|
|
157
158
|
}
|
|
@@ -161,7 +162,7 @@ export function normalizeOklchColors(root, contextDocument = document) {
|
|
|
161
162
|
continue;
|
|
162
163
|
}
|
|
163
164
|
const lowerValue = currentValue.toLowerCase();
|
|
164
|
-
if (!(lowerValue.includes(
|
|
165
|
+
if (!(lowerValue.includes("oklch") || lowerValue.includes("oklab"))) {
|
|
165
166
|
continue;
|
|
166
167
|
}
|
|
167
168
|
const converted = replaceOkColorFunctions(currentValue);
|
|
@@ -176,12 +177,13 @@ export function normalizeOklchColors(root, contextDocument = document) {
|
|
|
176
177
|
continue;
|
|
177
178
|
}
|
|
178
179
|
const resolvedLower = resolved.toLowerCase();
|
|
179
|
-
if (resolvedLower.includes(
|
|
180
|
+
if (resolvedLower.includes("oklch") || resolvedLower.includes("oklab")) {
|
|
180
181
|
continue;
|
|
181
182
|
}
|
|
182
183
|
const inlineValue = element.style.getPropertyValue(property);
|
|
183
184
|
const inlinePriority = element.style.getPropertyPriority(property);
|
|
184
|
-
if (inlineValue === resolved &&
|
|
185
|
+
if (inlineValue === resolved &&
|
|
186
|
+
inlinePriority === element.style.getPropertyPriority(property)) {
|
|
185
187
|
continue;
|
|
186
188
|
}
|
|
187
189
|
revertStyles.push(() => {
|
|
@@ -226,14 +228,14 @@ export function normalizeOklchColors(root, contextDocument = document) {
|
|
|
226
228
|
};
|
|
227
229
|
}
|
|
228
230
|
function replaceOkColorFunctions(input) {
|
|
229
|
-
let result =
|
|
231
|
+
let result = "";
|
|
230
232
|
let cursor = 0;
|
|
231
233
|
let changed = false;
|
|
232
234
|
const lower = input.toLowerCase();
|
|
233
235
|
while (cursor < input.length) {
|
|
234
236
|
const nextIndex = (() => {
|
|
235
|
-
const oklchIndex = lower.indexOf(
|
|
236
|
-
const oklabIndex = lower.indexOf(
|
|
237
|
+
const oklchIndex = lower.indexOf("oklch(", cursor);
|
|
238
|
+
const oklabIndex = lower.indexOf("oklab(", cursor);
|
|
237
239
|
if (oklchIndex === -1) {
|
|
238
240
|
return oklabIndex;
|
|
239
241
|
}
|
|
@@ -246,17 +248,17 @@ function replaceOkColorFunctions(input) {
|
|
|
246
248
|
result += input.slice(cursor);
|
|
247
249
|
break;
|
|
248
250
|
}
|
|
249
|
-
const token = lower.startsWith(
|
|
251
|
+
const token = lower.startsWith("oklch(", nextIndex) ? "oklch" : "oklab";
|
|
250
252
|
const openIndex = nextIndex + token.length;
|
|
251
253
|
result += input.slice(cursor, nextIndex);
|
|
252
254
|
let end = openIndex + 1;
|
|
253
255
|
let depth = 1;
|
|
254
256
|
while (end < input.length && depth > 0) {
|
|
255
257
|
const char = input.charAt(end);
|
|
256
|
-
if (char ===
|
|
258
|
+
if (char === "(") {
|
|
257
259
|
depth += 1;
|
|
258
260
|
}
|
|
259
|
-
else if (char ===
|
|
261
|
+
else if (char === ")") {
|
|
260
262
|
depth -= 1;
|
|
261
263
|
}
|
|
262
264
|
end += 1;
|
|
@@ -265,7 +267,7 @@ function replaceOkColorFunctions(input) {
|
|
|
265
267
|
return null;
|
|
266
268
|
}
|
|
267
269
|
const inside = input.slice(openIndex + 1, end - 1);
|
|
268
|
-
const replacement = token ===
|
|
270
|
+
const replacement = token === "oklch" ? convertOklchToRgb(inside) : convertOklabToRgb(inside);
|
|
269
271
|
if (replacement) {
|
|
270
272
|
result += replacement;
|
|
271
273
|
changed = true;
|
|
@@ -276,9 +278,9 @@ function replaceOkColorFunctions(input) {
|
|
|
276
278
|
cursor = end;
|
|
277
279
|
}
|
|
278
280
|
let output = result;
|
|
279
|
-
const colorMixPattern = regex.as(String.raw `color-mix\(\s*in\s+okl(?:ab|ch)`,
|
|
281
|
+
const colorMixPattern = regex.as(String.raw `color-mix\(\s*in\s+okl(?:ab|ch)`, "gi");
|
|
280
282
|
if (colorMixPattern.test(output)) {
|
|
281
|
-
output = output.replaceAll(colorMixPattern, (segment) => segment.replace(OKLCH_PATTERN,
|
|
283
|
+
output = output.replaceAll(colorMixPattern, (segment) => segment.replace(OKLCH_PATTERN, "srgb"));
|
|
282
284
|
changed = true;
|
|
283
285
|
}
|
|
284
286
|
if (!changed || output === input) {
|
|
@@ -287,8 +289,8 @@ function replaceOkColorFunctions(input) {
|
|
|
287
289
|
return output;
|
|
288
290
|
}
|
|
289
291
|
function convertOklchToRgb(payload) {
|
|
290
|
-
const [colorPartRaw, alphaPartRaw] = payload.split(
|
|
291
|
-
const colorPart = colorPartRaw?.trim() ??
|
|
292
|
+
const [colorPartRaw, alphaPartRaw] = payload.split("/");
|
|
293
|
+
const colorPart = colorPartRaw?.trim() ?? "";
|
|
292
294
|
if (!colorPart) {
|
|
293
295
|
return null;
|
|
294
296
|
}
|
|
@@ -296,7 +298,7 @@ function convertOklchToRgb(payload) {
|
|
|
296
298
|
if (components.length < 3) {
|
|
297
299
|
return null;
|
|
298
300
|
}
|
|
299
|
-
const [lightnessToken =
|
|
301
|
+
const [lightnessToken = "", chromaToken = "", hueToken = ""] = components;
|
|
300
302
|
const lightness = parseOklchComponent(lightnessToken, { isPercentage: true });
|
|
301
303
|
const chroma = parseOklchComponent(chromaToken, { clampZero: true });
|
|
302
304
|
const hue = parseHueComponent(hueToken);
|
|
@@ -311,11 +313,11 @@ function convertOklchToRgb(payload) {
|
|
|
311
313
|
if (alpha >= 0.999) {
|
|
312
314
|
return `rgb(${String(r)}, ${String(g)}, ${String(b)})`;
|
|
313
315
|
}
|
|
314
|
-
return `rgba(${String(r)}, ${String(g)}, ${String(b)}, ${alpha.toFixed(3).replace(TRAILING_ZERO_PATTERN,
|
|
316
|
+
return `rgba(${String(r)}, ${String(g)}, ${String(b)}, ${alpha.toFixed(3).replace(TRAILING_ZERO_PATTERN, "")})`;
|
|
315
317
|
}
|
|
316
318
|
function convertOklabToRgb(payload) {
|
|
317
|
-
const [colorPartRaw, alphaPartRaw] = payload.split(
|
|
318
|
-
const colorPart = colorPartRaw?.trim() ??
|
|
319
|
+
const [colorPartRaw, alphaPartRaw] = payload.split("/");
|
|
320
|
+
const colorPart = colorPartRaw?.trim() ?? "";
|
|
319
321
|
if (!colorPart) {
|
|
320
322
|
return null;
|
|
321
323
|
}
|
|
@@ -323,7 +325,7 @@ function convertOklabToRgb(payload) {
|
|
|
323
325
|
if (components.length < 3) {
|
|
324
326
|
return null;
|
|
325
327
|
}
|
|
326
|
-
const [lightnessToken =
|
|
328
|
+
const [lightnessToken = "", aToken = "", bToken = ""] = components;
|
|
327
329
|
const lightness = parseOklchComponent(lightnessToken, { isPercentage: true });
|
|
328
330
|
const aComponent = parseOklabComponent(aToken);
|
|
329
331
|
const bComponent = parseOklabComponent(bToken);
|
|
@@ -338,12 +340,12 @@ function convertOklabToRgb(payload) {
|
|
|
338
340
|
if (alpha >= 0.999) {
|
|
339
341
|
return `rgb(${String(r)}, ${String(g)}, ${String(b)})`;
|
|
340
342
|
}
|
|
341
|
-
return `rgba(${String(r)}, ${String(g)}, ${String(b)}, ${alpha.toFixed(3).replace(TRAILING_ZERO_PATTERN,
|
|
343
|
+
return `rgba(${String(r)}, ${String(g)}, ${String(b)}, ${alpha.toFixed(3).replace(TRAILING_ZERO_PATTERN, "")})`;
|
|
342
344
|
}
|
|
343
345
|
function parseOklchComponent(value, options) {
|
|
344
346
|
const trimmed = value.toLowerCase();
|
|
345
347
|
let numeric;
|
|
346
|
-
if (trimmed.endsWith(
|
|
348
|
+
if (trimmed.endsWith("%")) {
|
|
347
349
|
const parsed = Number.parseFloat(trimmed.slice(0, -1));
|
|
348
350
|
if (Number.isNaN(parsed)) {
|
|
349
351
|
return null;
|
|
@@ -370,7 +372,7 @@ function parseOklabComponent(value) {
|
|
|
370
372
|
if (!trimmed) {
|
|
371
373
|
return null;
|
|
372
374
|
}
|
|
373
|
-
if (trimmed.endsWith(
|
|
375
|
+
if (trimmed.endsWith("%")) {
|
|
374
376
|
const parsed = Number.parseFloat(trimmed.slice(0, -1));
|
|
375
377
|
if (Number.isNaN(parsed)) {
|
|
376
378
|
return null;
|
|
@@ -389,19 +391,19 @@ function parseFloatOrNull(input) {
|
|
|
389
391
|
}
|
|
390
392
|
function parseHueComponent(value) {
|
|
391
393
|
const trimmed = value.trim().toLowerCase();
|
|
392
|
-
if (trimmed.endsWith(
|
|
394
|
+
if (trimmed.endsWith("deg")) {
|
|
393
395
|
const parsed = parseFloatOrNull(trimmed.slice(0, -3));
|
|
394
396
|
return parsed === null ? null : parsed;
|
|
395
397
|
}
|
|
396
|
-
if (trimmed.endsWith(
|
|
398
|
+
if (trimmed.endsWith("grad")) {
|
|
397
399
|
const parsed = parseFloatOrNull(trimmed.slice(0, -4));
|
|
398
400
|
return parsed === null ? null : parsed * (9 / 10);
|
|
399
401
|
}
|
|
400
|
-
if (trimmed.endsWith(
|
|
402
|
+
if (trimmed.endsWith("rad")) {
|
|
401
403
|
const parsed = parseFloatOrNull(trimmed.slice(0, -3));
|
|
402
404
|
return parsed === null ? null : (parsed * 180) / Math.PI;
|
|
403
405
|
}
|
|
404
|
-
if (trimmed.endsWith(
|
|
406
|
+
if (trimmed.endsWith("turn")) {
|
|
405
407
|
const parsed = parseFloatOrNull(trimmed.slice(0, -4));
|
|
406
408
|
return parsed === null ? null : parsed * 360;
|
|
407
409
|
}
|
|
@@ -410,7 +412,7 @@ function parseHueComponent(value) {
|
|
|
410
412
|
}
|
|
411
413
|
function parseAlphaComponent(value) {
|
|
412
414
|
const trimmed = value.trim();
|
|
413
|
-
if (trimmed.endsWith(
|
|
415
|
+
if (trimmed.endsWith("%")) {
|
|
414
416
|
const parsed = Number.parseFloat(trimmed.slice(0, -1));
|
|
415
417
|
if (Number.isNaN(parsed)) {
|
|
416
418
|
return null;
|