UNPKG

@dpkit/ckan

Version:

Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames

71 lines (64 loc) 1.9 kB
import type { Field, Schema } from "@dpkit/core" import type { ArrayField, BooleanField, DateField, DatetimeField, IntegerField, NumberField, ObjectField, StringField, TimeField, } from "@dpkit/core" import type { CkanField } from "../Field.js" import type { CkanSchema } from "../Schema.js" /** * Normalizes a CKAN schema to a Table Schema format * @param props Object containing the CKAN schema to normalize * @returns A normalized Table Schema object */ export function normalizeCkanSchema(ckanSchema: CkanSchema): Schema { const fields = ckanSchema.fields.map(normalizeCkanField) return { fields } } function normalizeCkanField(ckanField: CkanField) { const { id, type, info } = ckanField const field: Partial<Field> = { name: id, } // Add metadata from info if available if (info) { if (info.label) field.title = info.label if (info.notes) field.description = info.notes } const fieldType = (info?.type_override || type).toLowerCase() switch (fieldType) { case "text": case "string": return { ...field, type: "string" } as StringField case "int": case "integer": return { ...field, type: "integer" } as IntegerField case "numeric": case "number": case "float": return { ...field, type: "number" } as NumberField case "bool": case "boolean": return { ...field, type: "boolean" } as BooleanField case "date": return { ...field, type: "date" } as DateField case "time": return { ...field, type: "time" } as TimeField case "timestamp": case "datetime": return { ...field, type: "datetime" } as DatetimeField case "json": case "object": return { ...field, type: "object" } as ObjectField case "array": return { ...field, type: "array" } as ArrayField default: return { ...field, type: "any" } as Field } }