@instantdb/core
Version:
Instant's core local abstraction
143 lines • 5.12 kB
JavaScript
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