Fix the rest except scene and ShapeCache

This commit is contained in:
Marcel Mraz 2025-03-18 11:25:46 +01:00
parent 79021f4b6b
commit 875450a0a1
30 changed files with 100 additions and 125 deletions

View file

@ -3,7 +3,6 @@ import { isPointWithinBounds, pointFrom } from "@excalidraw/math";
import {
doLineSegmentsIntersect,
elementsOverlappingBBox,
getCommonBounds,
} from "@excalidraw/utils";
import {
@ -37,7 +36,7 @@ import type {
import type { ReadonlySetLike } from "@excalidraw/excalidraw/utility-types";
import { getElementLineSegments } from "./bounds";
import { getElementLineSegments, getCommonBounds } from "./bounds";
import { mutateElement } from "./mutateElement";
import { getBoundTextElement, getContainerElement } from "./textElement";
import { isFrameElement, isFrameLikeElement } from "./typeChecks";

View file

@ -0,0 +1,87 @@
import { isInvisiblySmallElement } from "./sizeHelpers";
import { isLinearElementType } from "./typeChecks";
import type {
ExcalidrawElement,
NonDeletedExcalidrawElement,
NonDeleted,
} from "./types";
export * from "./bounds";
export * from "./dragElements";
export * from "./frame";
export * from "./mutateElement";
export * from "./newElement";
export * from "./resizeElements";
export * from "./resizeTest";
export * from "./shapes";
export * from "./showSelectedShapeActions";
export * from "./textElement";
export * from "./typeChecks";
export * from "./transformHandles";
export * from "./sizeHelpers";
/**
* @deprecated unsafe, use hashElementsVersion instead
*/
export const getSceneVersion = (elements: readonly ExcalidrawElement[]) =>
elements.reduce((acc, el) => acc + el.version, 0);
/**
* Hashes elements' versionNonce (using djb2 algo). Order of elements matters.
*/
export const hashElementsVersion = (
elements: readonly ExcalidrawElement[],
): number => {
let hash = 5381;
for (let i = 0; i < elements.length; i++) {
hash = (hash << 5) + hash + elements[i].versionNonce;
}
return hash >>> 0; // Ensure unsigned 32-bit integer
};
// string hash function (using djb2). Not cryptographically secure, use only
// for versioning and such.
export const hashString = (s: string): number => {
let hash: number = 5381;
for (let i = 0; i < s.length; i++) {
const char: number = s.charCodeAt(i);
hash = (hash << 5) + hash + char;
}
return hash >>> 0; // Ensure unsigned 32-bit integer
};
export const getVisibleElements = (elements: readonly ExcalidrawElement[]) =>
elements.filter(
(el) => !el.isDeleted && !isInvisiblySmallElement(el),
) as readonly NonDeletedExcalidrawElement[];
export const getNonDeletedElements = <T extends ExcalidrawElement>(
elements: readonly T[],
) =>
elements.filter((element) => !element.isDeleted) as readonly NonDeleted<T>[];
export const isNonDeletedElement = <T extends ExcalidrawElement>(
element: T,
): element is NonDeleted<T> => !element.isDeleted;
const _clearElements = (
elements: readonly ExcalidrawElement[],
): ExcalidrawElement[] =>
getNonDeletedElements(elements).map((element) =>
isLinearElementType(element.type)
? { ...element, lastCommittedPoint: null }
: element,
);
export const clearElementsForDatabase = (
elements: readonly ExcalidrawElement[],
) => _clearElements(elements);
export const clearElementsForExport = (
elements: readonly ExcalidrawElement[],
) => _clearElements(elements);
export const clearElementsForLocalStorage = (
elements: readonly ExcalidrawElement[],
) => _clearElements(elements);

View file

@ -44,11 +44,6 @@ import type {
import type { Mutable } from "@excalidraw/excalidraw/utility-types";
import {
getElementAbsoluteCoords,
getLockedLinearCursorAlignSize,
} from "../index";
import {
bindOrUnbindLinearElement,
getHoveredElementForBinding,
@ -64,6 +59,8 @@ import {
isFixedPointBinding,
} from "./typeChecks";
import { getElementAbsoluteCoords, getLockedLinearCursorAlignSize } from "./";
import type { Bounds } from "./bounds";
import type {
NonDeleted,

View file

@ -27,14 +27,14 @@ import type {
Mutable,
} from "@excalidraw/excalidraw/utility-types";
import { getElementAbsoluteCoords } from "../index";
import { getResizedElementAbsoluteCoords } from "./bounds";
import { bumpVersion, newElementWith } from "./mutateElement";
import { getBoundTextMaxWidth } from "./textElement";
import { normalizeText, measureText } from "./textMeasurements";
import { wrapText } from "./textWrapping";
import { getElementAbsoluteCoords } from ".";
import type {
ExcalidrawElement,
ExcalidrawImageElement,

View file

@ -27,13 +27,13 @@ import {
import type { NormalizedZoomValue, Zoom } from "@excalidraw/excalidraw/types";
import { getElementAbsoluteCoords } from "../index";
import { shouldTestInside } from "./collision";
import { LinearElementEditor } from "./linearElementEditor";
import { getBoundTextElement } from "./textElement";
import { ShapeCache } from "./scene/ShapeCache";
import { getElementAbsoluteCoords } from "./";
import type { Bounds } from "./bounds";
import type {
ElementsMap,

View file

@ -13,8 +13,6 @@ import type { AppState } from "@excalidraw/excalidraw/types";
import type { ExtractSetType } from "@excalidraw/excalidraw/utility-types";
import { isTextElement } from "../index";
import {
resetOriginalContainerCache,
updateOriginalContainerCache,
@ -25,6 +23,8 @@ import { measureText } from "./textMeasurements";
import { wrapText } from "./textWrapping";
import { isBoundToContainer, isArrowElement } from "./typeChecks";
import { isTextElement } from "./";
import type { MaybeTransformHandleType } from "./transformHandles";
import type {
ElementsMap,