UNPKG

@instantdb/core

Version:
143 lines 5.12 kB
import { i } from "./schema.js"; export const parseSchemaFromJSON = (s) => { // Parse entities const entities = {}; for (const [entityName, entityInfo] of Object.entries(s.entities)) { const entityDef = entityInfo; const attrs = {}; // Parse attributes for (const [attrName, attrInfo] of Object.entries(entityDef.attrs)) { const attrDef = attrInfo; let attr; // Create the appropriate attribute type switch (attrDef.valueType) { case 'string': attr = i.string(); break; case 'number': attr = i.number(); break; case 'boolean': attr = i.boolean(); break; case 'date': attr = i.date(); break; case 'json': attr = i.json(); break; default: attr = i.json(); } // Apply modifiers if (!attrDef.required) { attr = attr.optional(); } if (attrDef.config?.indexed) { attr = attr.indexed(); } if (attrDef.config?.unique) { attr = attr.unique(); } attrs[attrName] = attr; } entities[entityName] = i.entity(attrs); } // Parse links const links = s.links || {}; // Parse rooms const rooms = {}; if (s.rooms) { for (const [roomName, roomInfo] of Object.entries(s.rooms)) { const roomDef = roomInfo; // Parse presence const presenceAttrs = {}; for (const [attrName, attrInfo] of Object.entries(roomDef.presence.attrs)) { const attrDef = attrInfo; let attr; switch (attrDef.valueType) { case 'string': attr = i.string(); break; case 'number': attr = i.number(); break; case 'boolean': attr = i.boolean(); break; case 'date': attr = i.date(); break; case 'json': attr = i.json(); break; default: attr = i.json(); } if (!attrDef.required) { attr = attr.optional(); } if (attrDef.config?.indexed) { attr = attr.indexed(); } if (attrDef.config?.unique) { attr = attr.unique(); } presenceAttrs[attrName] = attr; } // Parse topics const topics = {}; if (roomDef.topics) { for (const [topicName, topicInfo] of Object.entries(roomDef.topics)) { const topicDef = topicInfo; const topicAttrs = {}; for (const [attrName, attrInfo] of Object.entries(topicDef.attrs)) { const attrDef = attrInfo; let attr; switch (attrDef.valueType) { case 'string': attr = i.string(); break; case 'number': attr = i.number(); break; case 'boolean': attr = i.boolean(); break; case 'date': attr = i.date(); break; case 'json': attr = i.json(); break; default: attr = i.json(); } if (!attrDef.required) { attr = attr.optional(); } if (attrDef.config?.indexed) { attr = attr.indexed(); } if (attrDef.config?.unique) { attr = attr.unique(); } topicAttrs[attrName] = attr; } topics[topicName] = i.entity(topicAttrs); } } rooms[roomName] = { presence: i.entity(presenceAttrs), topics, }; } } const resultingSchema = i.schema({ entities, links, rooms, }); return resultingSchema; }; //# sourceMappingURL=parseSchemaFromJSON.js.map