feat(builder): add dynamic blocks email and dnd packages
Quality / quality (ubuntu-latest) (push) Failing after 11m26s
Quality / quality (windows-latest) (push) Canceled after 0s

This commit is contained in:
Clintchiz committed 2026-09-03 14:00:41 +05:30
1 parent 06433e4ac4
commit 0bd2a6860d
37 files changed
+3060 -1

No files matched your search

+102
View File
@@ -0,0 +1,102 @@
import { expect, test } from "bun:test";
import {
createRegistry,
defineBlock,
defineDocumentKind,
json,
object,
record,
string,
type BlockDocument,
} from "@wrnexus/blocks";
import { createBlockEditorState } from "../src/index.ts";
const styles = record(json) as never;
const definitions = [
defineBlock({
manifest: {
type: "layout.root",
version: 1,
name: { key: "root", fallback: "Root" },
icon: "root",
category: "layout",
props: object({}) as never,
styles,
slots: { content: { accepts: { capabilities: ["content"] } } },
},
create: ({ id }) => ({
id: id(),
type: "layout.root",
version: 1,
props: {},
styles: {},
slots: { content: [] },
}),
}),
defineBlock({
manifest: {
type: "content.text",
version: 1,
name: { key: "text", fallback: "Text" },
icon: "text",
category: "content",
capabilities: ["content"],
props: object({ text: string() }) as never,
styles,
slots: {},
},
create: ({ id }) => ({
id: id(),
type: "content.text",
version: 1,
props: { text: "" },
styles: {},
slots: {},
}),
}),
];
const kind = defineDocumentKind({
kind: "test",
version: 1,
metadata: object({ title: string() }) as never,
rootTypes: ["layout.root"],
blocks: definitions,
variables: {},
breakpoints: {},
capabilities: [],
targets: [],
limits: {
maxBytes: 10000,
maxNodes: 20,
maxDepth: 5,
maxChildrenPerSlot: 10,
maxStringLength: 100,
maxOutputBytes: 1000,
},
urlSchemes: ["https"],
});
const registry = createRegistry(definitions).freeze();
const document: BlockDocument = {
schemaVersion: 1,
kind: "test",
meta: { title: "x" },
theme: { tokens: {} },
root: definitions[0]!.create({ id: () => "root" }),
};
test("editor state executes undo and redo", () => {
const state = createBlockEditorState({ document, revision: 1, kind, registry });
const node = definitions[1]!.create({ id: () => "text" });
expect(
state.execute({
type: "insert",
location: { parentId: "root", slot: "content", index: 0 },
nodes: [node],
}).ok,
).toBe(true);
expect(state.get().dirty).toBe(true);
expect(state.undo()).toBe(true);
expect(state.get().document.root.slots.content).toEqual([]);
expect(state.redo()).toBe(true);
expect(state.get().document.root.slots.content[0]?.id).toBe("text");
});