feat(builder): add dynamic blocks email and dnd packages
This commit is contained in:
1 parent
06433e4ac4
commit
0bd2a6860d
37 files changed
+3060
-1
No files matched your search
@@ -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");
|
||||
});
|
||||
Reference in new issue
Block a user