mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-09-12 11:59:58 +02:00

* feat: support inserting multiple images * Initial * handleAppOnDrop, onImageToolbarButtonClick, pasteFromClipboard * Initial get history working * insertMultipleImages -> insertImages * Bug fixes, improvements * Remove redundant branch * Refactor addElementsFromMixedContentPaste * History, drag & drop bug fixes * Update snapshots * Remove redundant try-catch * Refactor pasteFromClipboard * Plain paste check in mermaid paste * Move comment * processClipboardData -> insertClipboardContent * Redundant variable * Redundant variable * Refactor insertImages * createImagePlaceholder -> newImagePlaceholder * Get rid of unneeded NEVER schedule, filter out failed images * Trigger CI * Position placeholders before initializing * Don't mutate scene with positionElementsOnGrid, captureUpdate: CaptureUpdateAction.IMMEDIATELY * Comment * Move positionOnGrid out of file * Rename file * Get rid of generic * Initial tests * More asserts, test paste * Test image tool * De-duplicate * Stricter assert, move rest of logic outside of waitFor * Modify history tests * De-duplicate update snapshots * Trigger CI * Fix package build * Make setupImageTest more explicit * Re-introduce generic to use latest placeholder versions * newElementWith instead of mutateElement to delete failed placeholder * Insert failed images separately with CaptureUpdateAction.NEVER * Refactor * Don't re-order elements * WIP * Get rid of 'never' for failed * refactor type check * align max file size constant * make grid padding scale to zoom --------- Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
93 lines
2.2 KiB
TypeScript
93 lines
2.2 KiB
TypeScript
import * as MermaidToExcalidraw from "@excalidraw/mermaid-to-excalidraw";
|
|
import React from "react";
|
|
import { vi } from "vitest";
|
|
|
|
import type { parseMermaidToExcalidraw } from "@excalidraw/mermaid-to-excalidraw";
|
|
|
|
export const mockMermaidToExcalidraw = (opts: {
|
|
parseMermaidToExcalidraw: typeof parseMermaidToExcalidraw;
|
|
mockRef?: boolean;
|
|
}) => {
|
|
vi.mock("@excalidraw/mermaid-to-excalidraw", async (importActual) => {
|
|
const module = (await importActual()) as any;
|
|
|
|
return {
|
|
__esModule: true,
|
|
...module,
|
|
};
|
|
});
|
|
const parseMermaidToExcalidrawSpy = vi.spyOn(
|
|
MermaidToExcalidraw,
|
|
"parseMermaidToExcalidraw",
|
|
);
|
|
|
|
parseMermaidToExcalidrawSpy.mockImplementation(opts.parseMermaidToExcalidraw);
|
|
|
|
if (opts.mockRef) {
|
|
vi.spyOn(React, "useRef").mockReturnValue({
|
|
current: {
|
|
parseMermaidToExcalidraw: parseMermaidToExcalidrawSpy,
|
|
},
|
|
});
|
|
}
|
|
};
|
|
|
|
// Mock for HTMLImageElement (use with `vi.unstubAllGlobals()`)
|
|
// as jsdom.resources: "usable" throws an error on image load
|
|
export const mockHTMLImageElement = (
|
|
naturalWidth: number,
|
|
naturalHeight: number,
|
|
) => {
|
|
vi.stubGlobal(
|
|
"Image",
|
|
class extends Image {
|
|
constructor() {
|
|
super();
|
|
|
|
Object.defineProperty(this, "naturalWidth", {
|
|
value: naturalWidth,
|
|
});
|
|
Object.defineProperty(this, "naturalHeight", {
|
|
value: naturalHeight,
|
|
});
|
|
|
|
queueMicrotask(() => {
|
|
this.onload?.({} as Event);
|
|
});
|
|
}
|
|
},
|
|
);
|
|
};
|
|
|
|
// Mocks for multiple HTMLImageElements (dimensions are assigned in the order of image initialization)
|
|
export const mockMultipleHTMLImageElements = (
|
|
sizes: (readonly [number, number])[],
|
|
) => {
|
|
const _sizes = [...sizes];
|
|
|
|
vi.stubGlobal(
|
|
"Image",
|
|
class extends Image {
|
|
constructor() {
|
|
super();
|
|
|
|
const size = _sizes.shift();
|
|
if (!size) {
|
|
throw new Error("Insufficient sizes");
|
|
}
|
|
|
|
Object.defineProperty(this, "naturalWidth", {
|
|
value: size[0],
|
|
});
|
|
Object.defineProperty(this, "naturalHeight", {
|
|
value: size[1],
|
|
});
|
|
|
|
queueMicrotask(() => {
|
|
this.onload?.({} as Event);
|
|
});
|
|
}
|
|
},
|
|
);
|
|
};
|