DataFn
@datafn/core

Schema Utilities

Schema validation, capability resolution, and schema indexing helpers.

defineSchema

Type-safe schema builder with literal-preserving inference for fields, indices, and capability declarations.

function defineSchema<const T extends {
  readonly capabilities?: readonly CapabilityEntry[];
  readonly resources: readonly DatafnResourceBase[];
  readonly relations?: readonly DatafnRelationSchema[];
  readonly namespaced?: boolean;
}>(schema: T): T & DatafnSchema;

validateSchema

Validates unknown input as DataFn schema and returns DatafnEnvelope<DatafnSchema>.

function validateSchema(schema: unknown): DatafnEnvelope<DatafnSchema>;

Normalization on success:

  • capability declarations parsed and deduped,
  • resource fields expanded with capability-injected fields,
  • indices: string[] normalized to { base, search, vector },
  • relations defaults to [],
  • namespaced defaults to true.

resolveCapabilities

Resolve final capabilities for a resource from global + resource declarations.

function resolveCapabilities(
  globalCaps?: SchemaCapabilities,
  resourceCaps?: ResourceCapabilities,
): CapabilityEntry[];

getCapabilityFields

Return field definitions injected by resolved capabilities.

function getCapabilityFields(resolvedCaps: CapabilityEntry[]): DatafnFieldSchema[];

resolveRelationCapabilities

Validate and canonicalize relation capability entries for many-many relations.

function resolveRelationCapabilities(
  capabilities: unknown,
): DatafnEnvelope<RelationSimpleCapability[]>;

isNamespaced

function isNamespaced(schema: DatafnSchema): boolean;

Checks whether namespace isolation is enabled (defaults true).

ns

function ns(...segments: string[]): string;

Composable namespace string helper. Joins non-empty segments by : and throws for empty output.

buildSchemaIndex

Builds indexed lookup structures for resources, fields, and relations.

function buildSchemaIndex(schema: DatafnSchema): SchemaIndex;

SchemaIndex

interface SchemaIndex {
  resourcesByName: Map<string, DatafnResourceSchema>;
  fieldsByResource: Map<string, Map<string, DatafnFieldSchema>>;
  relationsByResource: Map<string, DatafnRelationSchema[]>;
  relationsFromResource: Map<string, DatafnRelationSchema[]>;
}

Lookup helpers

function getResource(index: SchemaIndex, name: string): DatafnResourceSchema | undefined;
function getField(index: SchemaIndex, resource: string, field: string): DatafnFieldSchema | undefined;
function getRelationsFrom(index: SchemaIndex, resource: string): DatafnRelationSchema[];
function getRelation(index: SchemaIndex, fromResource: string, relationName: string): DatafnRelationSchema | undefined;
function getRelationTarget(relation: DatafnRelationSchema): string;
function findRelationBidirectional(
  schema: DatafnSchema,
  resource: string,
  relationName: string,
): DatafnRelationSchema | undefined;