@dpkit/ckan
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
70 lines • 9.54 kB
JavaScript
import { denormalizeCkanResource } from "../../resource/process/denormalize.js";
/**
* Denormalizes a Frictionless Data Package to CKAN Package format
* @param props Object containing the Package to denormalize
* @returns Denormalized CKAN Package object
*/
export function denormalizeCkanPackage(dataPackage) {
const ckanPackage = {
resources: [],
tags: [],
};
// Basic metadata
if (dataPackage.name)
ckanPackage.name = dataPackage.name;
if (dataPackage.title)
ckanPackage.title = dataPackage.title;
if (dataPackage.description)
ckanPackage.notes = dataPackage.description;
if (dataPackage.version)
ckanPackage.version = dataPackage.version;
// Process license information
if (dataPackage.licenses && dataPackage.licenses.length > 0) {
const license = dataPackage.licenses[0]; // Use first license
if (license?.name)
ckanPackage.license_id = license.name;
if (license?.title)
ckanPackage.license_title = license.title;
if (license?.path)
ckanPackage.license_url = license.path;
}
// Process contributors
if (dataPackage.contributors) {
// Find author (contributor with role 'author')
const author = dataPackage.contributors.find(c => c.role === "author");
if (author) {
ckanPackage.author = author.title;
if (author.email)
ckanPackage.author_email = author.email;
}
// Find maintainer (contributor with role 'maintainer')
const maintainer = dataPackage.contributors.find(c => c.role === "maintainer");
if (maintainer) {
ckanPackage.maintainer = maintainer.title;
if (maintainer.email)
ckanPackage.maintainer_email = maintainer.email;
}
}
// Process resources
if (dataPackage.resources && dataPackage.resources.length > 0) {
ckanPackage.resources = dataPackage.resources
.map(resource => denormalizeCkanResource(resource))
.filter((resource) => resource !== undefined);
}
// Process keywords as tags
if (dataPackage.keywords && dataPackage.keywords.length > 0) {
// TODO: Rebase on something like CkanPackage / NewCkanPackage
// with NewCkanTag/Resource etc to separate metadata read from API
// and metadata that is mapped from Data Package
// @ts-ignore
ckanPackage.tags = dataPackage.keywords.map(keyword => {
const tag = {
name: keyword,
display_name: keyword,
};
return tag;
});
}
return ckanPackage;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVub3JtYWxpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlL3Byb2Nlc3MvZGVub3JtYWxpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUE7QUFJL0U7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxXQUFvQjtJQUN6RCxNQUFNLFdBQVcsR0FBNEQ7UUFDM0UsU0FBUyxFQUFFLEVBQUU7UUFDYixJQUFJLEVBQUUsRUFBRTtLQUNULENBQUE7SUFFRCxpQkFBaUI7SUFDakIsSUFBSSxXQUFXLENBQUMsSUFBSTtRQUFFLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQTtJQUN6RCxJQUFJLFdBQVcsQ0FBQyxLQUFLO1FBQUUsV0FBVyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFBO0lBQzVELElBQUksV0FBVyxDQUFDLFdBQVc7UUFBRSxXQUFXLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUE7SUFDeEUsSUFBSSxXQUFXLENBQUMsT0FBTztRQUFFLFdBQVcsQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQTtJQUVsRSw4QkFBOEI7SUFDOUIsSUFBSSxXQUFXLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxvQkFBb0I7UUFFNUQsSUFBSSxPQUFPLEVBQUUsSUFBSTtZQUFFLFdBQVcsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtRQUN4RCxJQUFJLE9BQU8sRUFBRSxLQUFLO1lBQUUsV0FBVyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO1FBQzdELElBQUksT0FBTyxFQUFFLElBQUk7WUFBRSxXQUFXLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUE7SUFDM0QsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixJQUFJLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QiwrQ0FBK0M7UUFDL0MsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFBO1FBQ3RFLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxXQUFXLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUE7WUFDakMsSUFBSSxNQUFNLENBQUMsS0FBSztnQkFBRSxXQUFXLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUE7UUFDM0QsQ0FBQztRQUVELHVEQUF1RDtRQUN2RCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FDN0IsQ0FBQTtRQUNELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixXQUFXLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUE7WUFDekMsSUFBSSxVQUFVLENBQUMsS0FBSztnQkFBRSxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQTtRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixJQUFJLFdBQVcsQ0FBQyxTQUFTLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUQsV0FBVyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUzthQUMxQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNsRCxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQTRCLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixJQUFJLFdBQVcsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUQsOERBQThEO1FBQzlELGtFQUFrRTtRQUNsRSxnREFBZ0Q7UUFDaEQsYUFBYTtRQUNiLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDcEQsTUFBTSxHQUFHLEdBQXFCO2dCQUM1QixJQUFJLEVBQUUsT0FBTztnQkFDYixZQUFZLEVBQUUsT0FBTzthQUN0QixDQUFBO1lBQ0QsT0FBTyxHQUFHLENBQUE7UUFDWixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxPQUFPLFdBQVcsQ0FBQTtBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQYWNrYWdlIH0gZnJvbSBcIkBkcGtpdC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgU2V0UmVxdWlyZWQgfSBmcm9tIFwidHlwZS1mZXN0XCJcbmltcG9ydCB0eXBlIHsgQ2thblJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlL1Jlc291cmNlLmpzXCJcbmltcG9ydCB7IGRlbm9ybWFsaXplQ2thblJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlL3Byb2Nlc3MvZGVub3JtYWxpemUuanNcIlxuaW1wb3J0IHR5cGUgeyBDa2FuUGFja2FnZSB9IGZyb20gXCIuLi9QYWNrYWdlLmpzXCJcbmltcG9ydCB0eXBlIHsgQ2thblRhZyB9IGZyb20gXCIuLi9UYWcuanNcIlxuXG4vKipcbiAqIERlbm9ybWFsaXplcyBhIEZyaWN0aW9ubGVzcyBEYXRhIFBhY2thZ2UgdG8gQ0tBTiBQYWNrYWdlIGZvcm1hdFxuICogQHBhcmFtIHByb3BzIE9iamVjdCBjb250YWluaW5nIHRoZSBQYWNrYWdlIHRvIGRlbm9ybWFsaXplXG4gKiBAcmV0dXJucyBEZW5vcm1hbGl6ZWQgQ0tBTiBQYWNrYWdlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVub3JtYWxpemVDa2FuUGFja2FnZShkYXRhUGFja2FnZTogUGFja2FnZSkge1xuICBjb25zdCBja2FuUGFja2FnZTogU2V0UmVxdWlyZWQ8UGFydGlhbDxDa2FuUGFja2FnZT4sIFwicmVzb3VyY2VzXCIgfCBcInRhZ3NcIj4gPSB7XG4gICAgcmVzb3VyY2VzOiBbXSxcbiAgICB0YWdzOiBbXSxcbiAgfVxuXG4gIC8vIEJhc2ljIG1ldGFkYXRhXG4gIGlmIChkYXRhUGFja2FnZS5uYW1lKSBja2FuUGFja2FnZS5uYW1lID0gZGF0YVBhY2thZ2UubmFtZVxuICBpZiAoZGF0YVBhY2thZ2UudGl0bGUpIGNrYW5QYWNrYWdlLnRpdGxlID0gZGF0YVBhY2thZ2UudGl0bGVcbiAgaWYgKGRhdGFQYWNrYWdlLmRlc2NyaXB0aW9uKSBja2FuUGFja2FnZS5ub3RlcyA9IGRhdGFQYWNrYWdlLmRlc2NyaXB0aW9uXG4gIGlmIChkYXRhUGFja2FnZS52ZXJzaW9uKSBja2FuUGFja2FnZS52ZXJzaW9uID0gZGF0YVBhY2thZ2UudmVyc2lvblxuXG4gIC8vIFByb2Nlc3MgbGljZW5zZSBpbmZvcm1hdGlvblxuICBpZiAoZGF0YVBhY2thZ2UubGljZW5zZXMgJiYgZGF0YVBhY2thZ2UubGljZW5zZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpY2Vuc2UgPSBkYXRhUGFja2FnZS5saWNlbnNlc1swXSAvLyBVc2UgZmlyc3QgbGljZW5zZVxuXG4gICAgaWYgKGxpY2Vuc2U/Lm5hbWUpIGNrYW5QYWNrYWdlLmxpY2Vuc2VfaWQgPSBsaWNlbnNlLm5hbWVcbiAgICBpZiAobGljZW5zZT8udGl0bGUpIGNrYW5QYWNrYWdlLmxpY2Vuc2VfdGl0bGUgPSBsaWNlbnNlLnRpdGxlXG4gICAgaWYgKGxpY2Vuc2U/LnBhdGgpIGNrYW5QYWNrYWdlLmxpY2Vuc2VfdXJsID0gbGljZW5zZS5wYXRoXG4gIH1cblxuICAvLyBQcm9jZXNzIGNvbnRyaWJ1dG9yc1xuICBpZiAoZGF0YVBhY2thZ2UuY29udHJpYnV0b3JzKSB7XG4gICAgLy8gRmluZCBhdXRob3IgKGNvbnRyaWJ1dG9yIHdpdGggcm9sZSAnYXV0aG9yJylcbiAgICBjb25zdCBhdXRob3IgPSBkYXRhUGFja2FnZS5jb250cmlidXRvcnMuZmluZChjID0+IGMucm9sZSA9PT0gXCJhdXRob3JcIilcbiAgICBpZiAoYXV0aG9yKSB7XG4gICAgICBja2FuUGFja2FnZS5hdXRob3IgPSBhdXRob3IudGl0bGVcbiAgICAgIGlmIChhdXRob3IuZW1haWwpIGNrYW5QYWNrYWdlLmF1dGhvcl9lbWFpbCA9IGF1dGhvci5lbWFpbFxuICAgIH1cblxuICAgIC8vIEZpbmQgbWFpbnRhaW5lciAoY29udHJpYnV0b3Igd2l0aCByb2xlICdtYWludGFpbmVyJylcbiAgICBjb25zdCBtYWludGFpbmVyID0gZGF0YVBhY2thZ2UuY29udHJpYnV0b3JzLmZpbmQoXG4gICAgICBjID0+IGMucm9sZSA9PT0gXCJtYWludGFpbmVyXCIsXG4gICAgKVxuICAgIGlmIChtYWludGFpbmVyKSB7XG4gICAgICBja2FuUGFja2FnZS5tYWludGFpbmVyID0gbWFpbnRhaW5lci50aXRsZVxuICAgICAgaWYgKG1haW50YWluZXIuZW1haWwpIGNrYW5QYWNrYWdlLm1haW50YWluZXJfZW1haWwgPSBtYWludGFpbmVyLmVtYWlsXG4gICAgfVxuICB9XG5cbiAgLy8gUHJvY2VzcyByZXNvdXJjZXNcbiAgaWYgKGRhdGFQYWNrYWdlLnJlc291cmNlcyAmJiBkYXRhUGFja2FnZS5yZXNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgIGNrYW5QYWNrYWdlLnJlc291cmNlcyA9IGRhdGFQYWNrYWdlLnJlc291cmNlc1xuICAgICAgLm1hcChyZXNvdXJjZSA9PiBkZW5vcm1hbGl6ZUNrYW5SZXNvdXJjZShyZXNvdXJjZSkpXG4gICAgICAuZmlsdGVyKChyZXNvdXJjZSk6IHJlc291cmNlIGlzIENrYW5SZXNvdXJjZSA9PiByZXNvdXJjZSAhPT0gdW5kZWZpbmVkKVxuICB9XG5cbiAgLy8gUHJvY2VzcyBrZXl3b3JkcyBhcyB0YWdzXG4gIGlmIChkYXRhUGFja2FnZS5rZXl3b3JkcyAmJiBkYXRhUGFja2FnZS5rZXl3b3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gVE9ETzogUmViYXNlIG9uIHNvbWV0aGluZyBsaWtlIENrYW5QYWNrYWdlIC8gTmV3Q2thblBhY2thZ2VcbiAgICAvLyB3aXRoIE5ld0NrYW5UYWcvUmVzb3VyY2UgZXRjIHRvIHNlcGFyYXRlIG1ldGFkYXRhIHJlYWQgZnJvbSBBUElcbiAgICAvLyBhbmQgbWV0YWRhdGEgdGhhdCBpcyBtYXBwZWQgZnJvbSBEYXRhIFBhY2thZ2VcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY2thblBhY2thZ2UudGFncyA9IGRhdGFQYWNrYWdlLmtleXdvcmRzLm1hcChrZXl3b3JkID0+IHtcbiAgICAgIGNvbnN0IHRhZzogUGFydGlhbDxDa2FuVGFnPiA9IHtcbiAgICAgICAgbmFtZToga2V5d29yZCxcbiAgICAgICAgZGlzcGxheV9uYW1lOiBrZXl3b3JkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhZ1xuICAgIH0pXG4gIH1cblxuICByZXR1cm4gY2thblBhY2thZ2Vcbn1cbiJdfQ==