import { readFileSync } from "node:fs"; const source = readFileSync(new URL("../src/components/FileDropZone.tsx", import.meta.url), "utf8"); const normalized = source.replace(/\s+/g, " "); function assertIncludes(fragment, message) { if (!normalized.includes(fragment.replace(/\s+/g, " "))) throw new Error(message); } assertIncludes( "function prepareFileDrag(event: ReactDragEvent) { event.preventDefault(); event.stopPropagation();", "drag enter/over must prevent the browser default and stop propagation" ); assertIncludes("onDragEnter={prepareFileDrag}", "drag enter must use the guarded file-drag handler"); assertIncludes("onDragOver={prepareFileDrag}", "drag over must use the guarded file-drag handler"); assertIncludes( "onDragLeave={(event) => { event.preventDefault(); event.stopPropagation();", "drag leave must prevent the browser default and stop propagation" ); assertIncludes( "onDrop={(event) => { event.preventDefault(); event.stopPropagation(); setDragActive(false);", "drop must prevent the browser default and stop propagation before resolving files" ); assertIncludes( "if (interactionDisabled) { onRejectedDrop?.(\"disabled\"); return; }", "disabled drops must route the disabled rejection reason" ); assertIncludes( "void resolveDroppedFiles(event.dataTransfer).then((files) => {", "drop must route the event DataTransfer through the shared resolver" ); assertIncludes( "if (files.length === 0) { onRejectedDrop?.(\"empty\"); return; } void handleFiles(files);", "resolved files and empty drops must be routed through their explicit callbacks" ); assertIncludes( ".catch(() => onRejectedDrop?.(\"unreadable\"))", "resolver failures must route the unreadable rejection reason" ); console.log("FileDropZone event and result routing structure is intact.");