import type { UiComponentMetaRegistry } from '@ankhorage/contracts'; import { describe, expect, it } from 'bun:test'; import { ZORA_BINDABLE_COMPONENT_META } from './bindableComponentMeta'; import { ZORA_COMPONENT_META } from './componentMeta'; describe('ZORA bindable component metadata', () => { it('matches the shared UI metadata registry shape', () => { const registry: UiComponentMetaRegistry = ZORA_BINDABLE_COMPONENT_META; expect(registry.Text?.bindings?.props?.text?.value.type).toBe('string'); expect(registry.Heading?.bindings?.props?.text?.value.type).toBe('string'); expect(registry.Button?.bindings?.props?.children?.value.type).toBe('string'); expect(registry.TextInput?.bindings?.props?.value?.value.type).toBe('string'); expect(registry.Select?.bindings?.props?.value?.value.type).toBe('string'); expect(registry.Image?.bindings?.props?.source?.value.type).toBe('imageAsset'); expect(registry.DataTable?.bindings?.props?.rows?.value.type).toBe('array'); }); it('keeps Select direct-manifest ownership aligned across metadata registries', () => { const select = ZORA_BINDABLE_COMPONENT_META.Select; expect(select.directManifestNode).toBe(true); expect(select.directManifestNode).toBe(ZORA_COMPONENT_META.Select.directManifestNode); expect(select.bindings.events.valueChange.payload.eventType).toBe('select.valueChange'); }); it('shares canonical Image authoring metadata while preserving dynamic image bindings', () => { const image = ZORA_BINDABLE_COMPONENT_META.Image; expect(image.props.source).toMatchObject({ type: 'media', mediaKinds: ['image'], }); expect(image.props).toEqual(ZORA_COMPONENT_META.Image.props); expect(image.directManifestNode).toBe(ZORA_COMPONENT_META.Image.directManifestNode); expect(image.bindings.props.source.value.type).toBe('imageAsset'); }); it('describes serializable controlled ReaderSurface bindings', () => { const reader = ZORA_BINDABLE_COMPONENT_META.ReaderSurface; expect(Object.keys(reader.bindings.props)).toEqual([ 'location', 'page', 'pageCount', 'progress', 'status', ]); expect(reader.bindings.events.locationChange.payload.fields.map((field) => field.path)).toEqual( [ 'format', 'locator', 'page', 'pageCount', 'progression', 'chapterId', 'chapterTitle', 'trigger', ], ); expect(reader.bindings.events.openExternalLink.payload.fields).toEqual([ { path: 'url', type: 'string', label: 'URL' }, ]); expect(reader.bindings.props.location.value.type).toBe('string'); expect(reader.bindings.props.page.value.type).toBe('number'); expect(reader.bindings.events.locationChange.payload.eventType).toBe('reader.locationChange'); }); });