@dpkit/ckan
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
70 lines (59 loc) • 1.6 kB
text/typescript
import type { Field, Schema } from "@dpkit/core"
import type { CkanField, CkanFieldInfo } from "../Field.js"
import type { CkanSchema } from "../Schema.js"
/**
* Denormalizes a Table Schema to a CKAN schema format
* @param props Object containing the Table Schema to denormalize
* @returns A denormalized CKAN Schema object
*/
export function denormalizeCkanSchema(schema: Schema): CkanSchema {
const fields = schema.fields.map(denormalizeCkanField)
return { fields }
}
function denormalizeCkanField(field: Field): CkanField {
const { name, title, description, type } = field
const ckanField: CkanField = {
id: name,
type: mapTypeToCkan(type),
}
if (title || description) {
const fieldInfo: CkanFieldInfo = {} as CkanFieldInfo
if (title) fieldInfo.label = title
if (description) fieldInfo.notes = description
// Add type override if necessary
fieldInfo.type_override = mapTypeToCkan(type)
ckanField.info = fieldInfo
}
return ckanField
}
/**
* Maps Table Schema types to CKAN field types
*/
function mapTypeToCkan(type?: string): string {
switch (type) {
case "string":
return "text"
case "integer":
return "int"
case "number":
return "numeric"
case "boolean":
return "bool"
case "date":
return "date"
case "time":
return "time"
case "datetime":
return "timestamp"
case "object":
return "json"
case "array":
return "array"
case "geopoint":
return "geopoint"
case "geojson":
return "geojson"
default:
return "text"
}
}