@dpkit/ckan
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
98 lines (77 loc) • 2.41 kB
text/typescript
import type { Contributor, Package } from "@dpkit/core"
import type { License } from "@dpkit/core"
import { normalizeCkanResource } from "../../resource/process/normalize.js"
import type { CkanPackage } from "../Package.js"
/**
* Normalizes a CKAN package to Frictionless Data package format
* @param props Object containing the CKAN package to normalize
* @returns Normalized Package object
*/
export function normalizeCkanPackage(ckanPackage: CkanPackage): Package {
const datapackage: Package = {
name: ckanPackage.name,
resources: [],
}
if (ckanPackage.title) {
datapackage.title = ckanPackage.title
}
if (ckanPackage.notes) {
datapackage.description = ckanPackage.notes
}
if (ckanPackage.version) {
datapackage.version = ckanPackage.version
}
// Process resources
if (ckanPackage.resources && ckanPackage.resources.length > 0) {
datapackage.resources = ckanPackage.resources.map(resource =>
normalizeCkanResource(resource),
)
}
// Process license information
if (ckanPackage.license_id) {
const license: License = {
name: ckanPackage.license_id,
}
if (ckanPackage.license_title) {
license.title = ckanPackage.license_title
}
if (ckanPackage.license_url) {
license.path = ckanPackage.license_url
}
datapackage.licenses = [license]
}
// Process contributors
const contributors: Contributor[] = []
// Add author if present
if (ckanPackage.author) {
const authorContributor: Contributor = {
title: ckanPackage.author,
role: "author",
}
if (ckanPackage.author_email) {
authorContributor.email = ckanPackage.author_email
}
contributors.push(authorContributor)
}
// Add maintainer if present
if (ckanPackage.maintainer) {
const maintainerContributor: Contributor = {
title: ckanPackage.maintainer,
role: "maintainer",
}
if (ckanPackage.maintainer_email) {
maintainerContributor.email = ckanPackage.maintainer_email
}
contributors.push(maintainerContributor)
}
if (contributors.length > 0) {
datapackage.contributors = contributors
}
if (ckanPackage.tags && ckanPackage.tags.length > 0) {
datapackage.keywords = ckanPackage.tags.map(tag => tag.name)
}
if (ckanPackage.metadata_created) {
datapackage.created = ckanPackage.metadata_created
}
return datapackage
}