UNPKG

@dpkit/ckan

Version:

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

51 lines 6.17 kB
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==