import { Migrations, StoreSchema } from '@tldraw/store' import { objectMapValues } from '@tldraw/utils' import { TLStoreProps, createIntegrityChecker, onValidationFailure } from './TLStore' import { AssetRecordType } from './records/TLAsset' import { CameraRecordType } from './records/TLCamera' import { DocumentRecordType } from './records/TLDocument' import { createInstanceRecordType } from './records/TLInstance' import { PageRecordType } from './records/TLPage' import { InstancePageStateRecordType } from './records/TLPageState' import { PointerRecordType } from './records/TLPointer' import { InstancePresenceRecordType } from './records/TLPresence' import { TLRecord } from './records/TLRecord' import { createShapeRecordType, getShapePropKeysByStyle } from './records/TLShape' import { storeMigrations } from './store-migrations' import { StyleProp } from './styles/StyleProp' /** @public */ export type SchemaShapeInfo = { migrations?: Migrations props?: Record any }> meta?: Record any }> } /** @public */ export type TLSchema = StoreSchema /** * Create a TLSchema with custom shapes. Custom shapes cannot override default shapes. * * @param opts - Options * * @public */ export function createTLSchema({ shapes }: { shapes: Record }): TLSchema { const stylesById = new Map>() for (const shape of objectMapValues(shapes)) { for (const style of getShapePropKeysByStyle(shape.props ?? {}).keys()) { if (stylesById.has(style.id) && stylesById.get(style.id) !== style) { throw new Error(`Multiple StyleProp instances with the same id: ${style.id}`) } stylesById.set(style.id, style) } } const ShapeRecordType = createShapeRecordType(shapes) const InstanceRecordType = createInstanceRecordType(stylesById) return StoreSchema.create( { asset: AssetRecordType, camera: CameraRecordType, document: DocumentRecordType, instance: InstanceRecordType, instance_page_state: InstancePageStateRecordType, page: PageRecordType, shape: ShapeRecordType, instance_presence: InstancePresenceRecordType, pointer: PointerRecordType, }, { snapshotMigrations: storeMigrations, onValidationFailure, createIntegrityChecker: createIntegrityChecker, } ) }