UNPKG

@dossierhq/core

Version:

The core Dossier library used by clients and server alike, used to interact with schema and entities directly, as well as remotely through a client.

70 lines 2.34 kB
/// <reference types="./schemaToPublished.d.ts" /> import { FieldType, } from './SchemaSpecification.js'; export function schemaToPublished(schema) { const spec = { schemaKind: 'published', version: schema.spec.version, entityTypes: [], componentTypes: [], patterns: [], indexes: [], }; function toPublishedFields(fields) { return fields .filter((it) => !it.adminOnly) .map((field) => { const { adminOnly, ...publishedField } = field; return publishedField; }); } const usedPatternNames = new Set(); for (const entitySpec of schema.spec.entityTypes) { if (!entitySpec.publishable) { continue; } spec.entityTypes.push({ name: entitySpec.name, authKeyPattern: entitySpec.authKeyPattern, fields: toPublishedFields(entitySpec.fields), }); if (entitySpec.authKeyPattern) { usedPatternNames.add(entitySpec.authKeyPattern); } } for (const componentSpec of schema.spec.componentTypes) { if (componentSpec.adminOnly) { continue; } spec.componentTypes.push({ name: componentSpec.name, fields: toPublishedFields(componentSpec.fields), }); } const usedIndexNames = new Set(); for (const typeSpec of [...spec.entityTypes, ...spec.componentTypes]) { for (const fieldSpec of typeSpec.fields) { if (fieldSpec.type !== FieldType.String) continue; if (fieldSpec.matchPattern) { usedPatternNames.add(fieldSpec.matchPattern); } if (fieldSpec.index) { usedIndexNames.add(fieldSpec.index); } } } for (const patternName of [...usedPatternNames].sort()) { const pattern = schema.spec.patterns.find((it) => it.name === patternName); if (pattern) { spec.patterns.push(pattern); } } for (const indexName of [...usedIndexNames].sort()) { const index = schema.spec.indexes.find((it) => it.name === indexName); if (index) { spec.indexes.push(index); } } return spec; } //# sourceMappingURL=schemaToPublished.js.map