UNPKG

@dpkit/ckan

Version:

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

70 lines 9.54 kB
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==