feat: release design system engine, studio and component contracts
This commit is contained in:
1 parent
ff1065fb27
commit
3943b946d6
693 files changed
+175546
-3894
No files matched your search
@@ -3,16 +3,43 @@ 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: {} }),
|
||||
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 }] });
|
||||
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);
|
||||
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);
|
||||
@@ -22,10 +49,23 @@ test("trusted custom blocks and presets expose independent instances and explici
|
||||
});
|
||||
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 };
|
||||
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: "" } }) }] });
|
||||
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" }) }] });
|
||||
const wrong = createBuilderKit({
|
||||
blocks: [
|
||||
{ ...block, create: () => ({ ...block.create({ id: () => "id" }), type: "custom.other" }) },
|
||||
],
|
||||
});
|
||||
expect(() => wrong.createBlock("custom.note", { id: () => "id" })).toThrow();
|
||||
});
|
||||
Reference in new issue
Block a user