import { expect, test } from "bun:test"; import { defineBlock, object, string } from "@wrnexus/blocks"; import { createBuilderKit } from "../src/kit.ts"; const block = defineBlock({ manifest: { type: "custom.note", version: 1, name: { key: "note", fallback: "Note" }, icon: "note", category: "content", props: object({ text: string({ min: 1 }) }), styles: object({}), slots: {}, }, create: ({ id }: { id(): string }) => ({ id: id(), type: "custom.note", version: 1, props: { text: "Hello" }, styles: {}, slots: {}, }), }); test("trusted custom blocks and presets expose independent instances and explicit metadata", () => { let next = 0; const context = { id: () => String(++next) }; const kit = createBuilderKit({ blocks: [block], presets: [ { id: "note", name: { key: "preset.note", fallback: "Note" }, icon: "note", create: block.create, }, ], }); expect(kit.blocks()[0].manifest.name.fallback).toBe("Note"); expect(kit.presets()[0].id).toBe("note"); const first = kit.createBlock("custom.note", context), second = kit.createPreset("note", context); first.props.text = "Changed"; expect(second.props.text).toBe("Hello"); expect(first.id).not.toBe(second.id); expect(Object.isFrozen(kit)).toBe(true); expect(() => kit.validateProps("custom.note", { text: "" })).toThrow(); expect(() => kit.createBlock("missing.block", context)).toThrow(); }); test("duplicate registration and invalid factories fail before insertion", () => { expect(() => createBuilderKit({ blocks: [block, block] })).toThrow(); const preset = { id: "note", name: { key: "note", fallback: "Note" }, icon: "note", create: block.create, }; expect(() => createBuilderKit({ blocks: [block], presets: [preset, preset] })).toThrow(); const invalid = createBuilderKit({ blocks: [ { ...block, create: () => ({ ...block.create({ id: () => "id" }), props: { text: "" } }) }, ], }); expect(() => invalid.createBlock("custom.note", { id: () => "id" })).toThrow(); const wrong = createBuilderKit({ blocks: [ { ...block, create: () => ({ ...block.create({ id: () => "id" }), type: "custom.other" }) }, ], }); expect(() => wrong.createBlock("custom.note", { id: () => "id" })).toThrow(); });