@dpkit/ckan
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
51 lines • 6.17 kB
JavaScript
import { getFilename } from "@dpkit/core";
import { normalizeCkanSchema } from "../../schema/index.js";
/**
* Normalizes a CKAN resource to Frictionless Data Resource format
* @param props Object containing the CKAN resource to normalize
* @returns Normalized Resource object
*/
export function normalizeCkanResource(ckanResource) {
const resource = {
name: slugifyName(ckanResource.name),
path: ckanResource.url,
"ckan:key": getFilename(ckanResource.url),
"ckan:url": ckanResource.url,
};
if (ckanResource.description) {
resource.description = ckanResource.description;
}
if (ckanResource.format) {
// Format should be lowercase as per the reference
resource.format = ckanResource.format.toLowerCase();
}
if (ckanResource.mimetype) {
resource.mediatype = ckanResource.mimetype;
}
if (ckanResource.size) {
resource.bytes = ckanResource.size;
}
if (ckanResource.hash) {
resource.hash = ckanResource.hash;
}
if (ckanResource.schema) {
resource.type = "table";
resource.schema = normalizeCkanSchema(ckanResource.schema);
}
return resource;
}
// TODO: improve and move to core
function slugifyName(name) {
return (name
// Replace spaces, dots, etc. with underscores
.replace(/[\s\.\(\)\/\\,]+/g, "_")
// Convert to lowercase
.toLowerCase()
// Remove any characters that aren't alphanumeric, underscore, or hyphen
.replace(/[^a-z0-9_\-]/g, "")
// Ensure it starts with a letter or underscore (not a number)
.replace(/^(\d)/, "_$1")
// Trim to reasonable length
.slice(0, 100));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcmVzb3VyY2UvcHJvY2Vzcy9ub3JtYWxpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUczRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFlBQTBCO0lBQzlELE1BQU0sUUFBUSxHQUFhO1FBQ3pCLElBQUksRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUNwQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUc7UUFDdEIsVUFBVSxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO1FBQ3pDLFVBQVUsRUFBRSxZQUFZLENBQUMsR0FBRztLQUM3QixDQUFBO0lBRUQsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0IsUUFBUSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFBO0lBQ2pELENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4QixrREFBa0Q7UUFDbEQsUUFBUSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3JELENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQixRQUFRLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUE7SUFDNUMsQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQTtJQUNwQyxDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsUUFBUSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFBO0lBQ25DLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4QixRQUFRLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQTtRQUN2QixRQUFRLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQUVELGlDQUFpQztBQUNqQyxTQUFTLFdBQVcsQ0FBQyxJQUFZO0lBQy9CLE9BQU8sQ0FDTCxJQUFJO1FBQ0YsOENBQThDO1NBQzdDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUM7UUFDbEMsdUJBQXVCO1NBQ3RCLFdBQVcsRUFBRTtRQUNkLHdFQUF3RTtTQUN2RSxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztRQUM3Qiw4REFBOEQ7U0FDN0QsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7UUFDeEIsNEJBQTRCO1NBQzNCLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQ2pCLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQgeyBnZXRGaWxlbmFtZSB9IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQgeyBub3JtYWxpemVDa2FuU2NoZW1hIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS9pbmRleC5qc1wiXG5pbXBvcnQgdHlwZSB7IENrYW5SZXNvdXJjZSB9IGZyb20gXCIuLi9SZXNvdXJjZS5qc1wiXG5cbi8qKlxuICogTm9ybWFsaXplcyBhIENLQU4gcmVzb3VyY2UgdG8gRnJpY3Rpb25sZXNzIERhdGEgUmVzb3VyY2UgZm9ybWF0XG4gKiBAcGFyYW0gcHJvcHMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIENLQU4gcmVzb3VyY2UgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIFJlc291cmNlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ2thblJlc291cmNlKGNrYW5SZXNvdXJjZTogQ2thblJlc291cmNlKTogUmVzb3VyY2Uge1xuICBjb25zdCByZXNvdXJjZTogUmVzb3VyY2UgPSB7XG4gICAgbmFtZTogc2x1Z2lmeU5hbWUoY2thblJlc291cmNlLm5hbWUpLFxuICAgIHBhdGg6IGNrYW5SZXNvdXJjZS51cmwsXG4gICAgXCJja2FuOmtleVwiOiBnZXRGaWxlbmFtZShja2FuUmVzb3VyY2UudXJsKSxcbiAgICBcImNrYW46dXJsXCI6IGNrYW5SZXNvdXJjZS51cmwsXG4gIH1cblxuICBpZiAoY2thblJlc291cmNlLmRlc2NyaXB0aW9uKSB7XG4gICAgcmVzb3VyY2UuZGVzY3JpcHRpb24gPSBja2FuUmVzb3VyY2UuZGVzY3JpcHRpb25cbiAgfVxuXG4gIGlmIChja2FuUmVzb3VyY2UuZm9ybWF0KSB7XG4gICAgLy8gRm9ybWF0IHNob3VsZCBiZSBsb3dlcmNhc2UgYXMgcGVyIHRoZSByZWZlcmVuY2VcbiAgICByZXNvdXJjZS5mb3JtYXQgPSBja2FuUmVzb3VyY2UuZm9ybWF0LnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIGlmIChja2FuUmVzb3VyY2UubWltZXR5cGUpIHtcbiAgICByZXNvdXJjZS5tZWRpYXR5cGUgPSBja2FuUmVzb3VyY2UubWltZXR5cGVcbiAgfVxuXG4gIGlmIChja2FuUmVzb3VyY2Uuc2l6ZSkge1xuICAgIHJlc291cmNlLmJ5dGVzID0gY2thblJlc291cmNlLnNpemVcbiAgfVxuXG4gIGlmIChja2FuUmVzb3VyY2UuaGFzaCkge1xuICAgIHJlc291cmNlLmhhc2ggPSBja2FuUmVzb3VyY2UuaGFzaFxuICB9XG5cbiAgaWYgKGNrYW5SZXNvdXJjZS5zY2hlbWEpIHtcbiAgICByZXNvdXJjZS50eXBlID0gXCJ0YWJsZVwiXG4gICAgcmVzb3VyY2Uuc2NoZW1hID0gbm9ybWFsaXplQ2thblNjaGVtYShja2FuUmVzb3VyY2Uuc2NoZW1hKVxuICB9XG5cbiAgcmV0dXJuIHJlc291cmNlXG59XG5cbi8vIFRPRE86IGltcHJvdmUgYW5kIG1vdmUgdG8gY29yZVxuZnVuY3Rpb24gc2x1Z2lmeU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBuYW1lXG4gICAgICAvLyBSZXBsYWNlIHNwYWNlcywgZG90cywgZXRjLiB3aXRoIHVuZGVyc2NvcmVzXG4gICAgICAucmVwbGFjZSgvW1xcc1xcLlxcKFxcKVxcL1xcXFwsXSsvZywgXCJfXCIpXG4gICAgICAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC8vIFJlbW92ZSBhbnkgY2hhcmFjdGVycyB0aGF0IGFyZW4ndCBhbHBoYW51bWVyaWMsIHVuZGVyc2NvcmUsIG9yIGh5cGhlblxuICAgICAgLnJlcGxhY2UoL1teYS16MC05X1xcLV0vZywgXCJcIilcbiAgICAgIC8vIEVuc3VyZSBpdCBzdGFydHMgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlIChub3QgYSBudW1iZXIpXG4gICAgICAucmVwbGFjZSgvXihcXGQpLywgXCJfJDFcIilcbiAgICAgIC8vIFRyaW0gdG8gcmVhc29uYWJsZSBsZW5ndGhcbiAgICAgIC5zbGljZSgwLCAxMDApXG4gIClcbn1cbiJdfQ==