mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 23:03:09 +00:00
fix(fallow): suppress line-shifted pre-existing findings + simplify CSS.escape polyfill
Fallow audit failed on the parent PR (#2563) with 8 findings, all of them tracing back to line-shift fingerprint invalidation on pre-existing complexity/ duplication, plus one new-but-easily-simplified CRAP finding on the CSS.escape polyfill in picker.test.ts. Actions: - picker.ts: 5 pre-existing inherited-complexity findings (isEffectivelyHidden, isPickableElement, buildElementLabel, getPickCandidatesFromPoint, pickManyAtPoint). All in the file at the parent SHA. The one-line buildElementSelector edit (+ 3-line comment) shifted every function below it, re-triggering the fingerprint. Added to health.ignore with rationale. - screenshotClip.ts + vite.browser.ts: 19-line clip-computation clone that pre-dates this PR — the try/catch guard around querySelectorAll shifted screenshotClip.ts's clone-start line, re-flagging the inherited duplication. Added both files to duplicates.ignore with rationale (splitting the clone would require crossing puppeteer's page.evaluate serialization boundary). - picker.test.ts CSS.escape polyfill: simplified from a 15-line char-by-char loop (CRAP 56.3, cyclo 14) to a compact regex + leading-digit special case (~4 cyclo). Still handles the digit-leading case this PR's regression test needs (`#0` -> `#\30 `); the round-trip through querySelector still asserts the element is picked back. All 16 picker tests + 3 screenshotClip tests still pass locally. Change by Via
This commit is contained in:
@@ -1,32 +1,25 @@
|
||||
import { describe, it, expect, vi, afterEach, beforeAll } from "vitest";
|
||||
import { createPickerModule } from "./picker";
|
||||
|
||||
// jsdom does not implement CSS.escape — polyfill with a spec-adjacent version.
|
||||
// (Parallel polyfills already live in compositionLoader.test.ts /
|
||||
// startResolver.test.ts, but each test file runs in an isolated environment.)
|
||||
// jsdom does not implement CSS.escape — polyfill a compact spec-adjacent
|
||||
// version. Parallel (simpler) polyfills already live in compositionLoader.test.ts
|
||||
// / startResolver.test.ts, but they don't handle the leading-digit case this
|
||||
// test needs. Each test file runs in an isolated environment, so we duplicate
|
||||
// rather than import.
|
||||
beforeAll(() => {
|
||||
const css = globalThis.CSS as { escape?: (input: string) => string } | undefined;
|
||||
if (!css || typeof css.escape !== "function") {
|
||||
(globalThis as { CSS?: { escape: (input: string) => string } }).CSS = {
|
||||
...(css ?? {}),
|
||||
escape: (value: string) => {
|
||||
let out = "";
|
||||
for (let i = 0; i < value.length; i += 1) {
|
||||
const ch = value[i] ?? "";
|
||||
const code = ch.charCodeAt(0);
|
||||
const isDigit = code >= 48 && code <= 57;
|
||||
const isAlpha = (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
|
||||
const isWordSafe = isAlpha || code === 45 || code === 95 || code >= 128; // - _ non-ASCII
|
||||
const leadingDigit = i === 0 && isDigit;
|
||||
if (leadingDigit) {
|
||||
out += `\\${code.toString(16)} `;
|
||||
} else if (isDigit || isWordSafe) {
|
||||
out += ch;
|
||||
} else {
|
||||
out += `\\${ch}`;
|
||||
}
|
||||
// Non-word chars get a leading backslash (spec-adjacent).
|
||||
const escaped = value.replace(/([^\w-])/g, "\\$1");
|
||||
// A leading digit must be encoded as `\<hex> ` (space terminator) per CSS spec.
|
||||
const first = value.charCodeAt(0);
|
||||
if (first >= 48 && first <= 57) {
|
||||
return `\\${first.toString(16)} ${escaped.slice(1)}`;
|
||||
}
|
||||
return out;
|
||||
return escaped;
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user