@dpkit/ckan
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
81 lines • 10.1 kB
JavaScript
import { blob } from "node:stream/consumers";
import { denormalizePackage, getFilename, getFormat, stringifyDescriptor, } from "@dpkit/core";
import { getPackageBasepath, loadFileStream, saveResourceFiles, } from "@dpkit/file";
import { makeCkanApiRequest } from "../ckan/index.js";
import { denormalizeCkanResource } from "../resource/index.js";
import { denormalizeCkanPackage } from "./process/denormalize.js";
export async function savePackageToCkan(dataPackage, options) {
const { apiKey, ckanUrl, ownerOrg, datasetName } = options;
const basepath = getPackageBasepath(dataPackage);
const ckanPackage = denormalizeCkanPackage(dataPackage);
const payload = {
...ckanPackage,
name: datasetName,
owner_org: ownerOrg,
resources: [],
};
const result = await makeCkanApiRequest({
action: "package_create",
payload,
ckanUrl: ckanUrl,
apiKey: apiKey,
});
const url = new URL(ckanUrl);
url.pathname = `/dataset/${result.name}`;
const resourceDescriptors = [];
for (const resource of dataPackage.resources) {
resourceDescriptors.push(await saveResourceFiles(resource, {
basepath,
withRemote: true,
withoutFolders: true,
saveFile: async (options) => {
const filename = getFilename(options.normalizedPath);
const ckanResource = denormalizeCkanResource(resource);
const payload = {
...ckanResource,
package_id: datasetName,
name: options.denormalizedPath,
format: getFormat(filename)?.toUpperCase(),
};
const upload = {
name: options.denormalizedPath,
data: await blob(await loadFileStream(options.normalizedPath)),
};
const result = await makeCkanApiRequest({
action: "resource_create",
payload,
upload,
ckanUrl,
apiKey,
});
return result.url;
},
}));
}
const descriptor = {
...denormalizePackage(dataPackage, { basepath }),
resources: resourceDescriptors,
};
for (const denormalizedPath of ["datapackage.json"]) {
const payload = {
package_id: datasetName,
name: denormalizedPath,
};
const upload = {
name: denormalizedPath,
data: new Blob([stringifyDescriptor(descriptor)]),
};
await makeCkanApiRequest({
action: "resource_create",
payload,
upload,
ckanUrl,
apiKey,
});
}
return {
path: result.url,
datasetUrl: url.toString(),
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2Uvc2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFNUMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsU0FBUyxFQUNULG1CQUFtQixHQUNwQixNQUFNLGFBQWEsQ0FBQTtBQUNwQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxpQkFBaUIsR0FDbEIsTUFBTSxhQUFhLENBQUE7QUFDcEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFckQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFakUsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsV0FBb0IsRUFDcEIsT0FLQztJQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFFMUQsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDaEQsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFdkQsTUFBTSxPQUFPLEdBQUc7UUFDZCxHQUFHLFdBQVc7UUFDZCxJQUFJLEVBQUUsV0FBVztRQUNqQixTQUFTLEVBQUUsUUFBUTtRQUNuQixTQUFTLEVBQUUsRUFBRTtLQUNkLENBQUE7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixDQUFDO1FBQ3RDLE1BQU0sRUFBRSxnQkFBZ0I7UUFDeEIsT0FBTztRQUNQLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxNQUFNO0tBQ2YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUIsR0FBRyxDQUFDLFFBQVEsR0FBRyxZQUFZLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUV4QyxNQUFNLG1CQUFtQixHQUFpQixFQUFFLENBQUE7SUFDNUMsS0FBSyxNQUFNLFFBQVEsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0MsbUJBQW1CLENBQUMsSUFBSSxDQUN0QixNQUFNLGlCQUFpQixDQUFDLFFBQVEsRUFBRTtZQUNoQyxRQUFRO1lBQ1IsVUFBVSxFQUFFLElBQUk7WUFDaEIsY0FBYyxFQUFFLElBQUk7WUFDcEIsUUFBUSxFQUFFLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtnQkFDeEIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQTtnQkFDcEQsTUFBTSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBRXRELE1BQU0sT0FBTyxHQUFHO29CQUNkLEdBQUcsWUFBWTtvQkFDZixVQUFVLEVBQUUsV0FBVztvQkFDdkIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7b0JBQzlCLE1BQU0sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFO2lCQUMzQyxDQUFBO2dCQUVELE1BQU0sTUFBTSxHQUFHO29CQUNiLElBQUksRUFBRSxPQUFPLENBQUMsZ0JBQWdCO29CQUM5QixJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUMvRCxDQUFBO2dCQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQWU7b0JBQ3BELE1BQU0sRUFBRSxpQkFBaUI7b0JBQ3pCLE9BQU87b0JBQ1AsTUFBTTtvQkFDTixPQUFPO29CQUNQLE1BQU07aUJBQ1AsQ0FBQyxDQUFBO2dCQUVGLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQTtZQUNuQixDQUFDO1NBQ0YsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUc7UUFDakIsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUNoRCxTQUFTLEVBQUUsbUJBQW1CO0tBQy9CLENBQUE7SUFFRCxLQUFLLE1BQU0sZ0JBQWdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUc7WUFDZCxVQUFVLEVBQUUsV0FBVztZQUN2QixJQUFJLEVBQUUsZ0JBQWdCO1NBQ3ZCLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRztZQUNiLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUNsRCxDQUFBO1FBRUQsTUFBTSxrQkFBa0IsQ0FBQztZQUN2QixNQUFNLEVBQUUsaUJBQWlCO1lBQ3pCLE9BQU87WUFDUCxNQUFNO1lBQ04sT0FBTztZQUNQLE1BQU07U0FDUCxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRztRQUNoQixVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRTtLQUMzQixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJsb2IgfSBmcm9tIFwibm9kZTpzdHJlYW0vY29uc3VtZXJzXCJcbmltcG9ydCB0eXBlIHsgRGVzY3JpcHRvciwgUGFja2FnZSB9IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQge1xuICBkZW5vcm1hbGl6ZVBhY2thZ2UsXG4gIGdldEZpbGVuYW1lLFxuICBnZXRGb3JtYXQsXG4gIHN0cmluZ2lmeURlc2NyaXB0b3IsXG59IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQge1xuICBnZXRQYWNrYWdlQmFzZXBhdGgsXG4gIGxvYWRGaWxlU3RyZWFtLFxuICBzYXZlUmVzb3VyY2VGaWxlcyxcbn0gZnJvbSBcIkBkcGtpdC9maWxlXCJcbmltcG9ydCB7IG1ha2VDa2FuQXBpUmVxdWVzdCB9IGZyb20gXCIuLi9ja2FuL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgQ2thblJlc291cmNlIH0gZnJvbSBcIi4uL3Jlc291cmNlL2luZGV4LnRzXCJcbmltcG9ydCB7IGRlbm9ybWFsaXplQ2thblJlc291cmNlIH0gZnJvbSBcIi4uL3Jlc291cmNlL2luZGV4LnRzXCJcbmltcG9ydCB7IGRlbm9ybWFsaXplQ2thblBhY2thZ2UgfSBmcm9tIFwiLi9wcm9jZXNzL2Rlbm9ybWFsaXplLnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVQYWNrYWdlVG9Da2FuKFxuICBkYXRhUGFja2FnZTogUGFja2FnZSxcbiAgb3B0aW9uczoge1xuICAgIGFwaUtleTogc3RyaW5nXG4gICAgY2thblVybDogc3RyaW5nXG4gICAgb3duZXJPcmc6IHN0cmluZ1xuICAgIGRhdGFzZXROYW1lOiBzdHJpbmdcbiAgfSxcbikge1xuICBjb25zdCB7IGFwaUtleSwgY2thblVybCwgb3duZXJPcmcsIGRhdGFzZXROYW1lIH0gPSBvcHRpb25zXG5cbiAgY29uc3QgYmFzZXBhdGggPSBnZXRQYWNrYWdlQmFzZXBhdGgoZGF0YVBhY2thZ2UpXG4gIGNvbnN0IGNrYW5QYWNrYWdlID0gZGVub3JtYWxpemVDa2FuUGFja2FnZShkYXRhUGFja2FnZSlcblxuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIC4uLmNrYW5QYWNrYWdlLFxuICAgIG5hbWU6IGRhdGFzZXROYW1lLFxuICAgIG93bmVyX29yZzogb3duZXJPcmcsXG4gICAgcmVzb3VyY2VzOiBbXSxcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1ha2VDa2FuQXBpUmVxdWVzdCh7XG4gICAgYWN0aW9uOiBcInBhY2thZ2VfY3JlYXRlXCIsXG4gICAgcGF5bG9hZCxcbiAgICBja2FuVXJsOiBja2FuVXJsLFxuICAgIGFwaUtleTogYXBpS2V5LFxuICB9KVxuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoY2thblVybClcbiAgdXJsLnBhdGhuYW1lID0gYC9kYXRhc2V0LyR7cmVzdWx0Lm5hbWV9YFxuXG4gIGNvbnN0IHJlc291cmNlRGVzY3JpcHRvcnM6IERlc2NyaXB0b3JbXSA9IFtdXG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgZGF0YVBhY2thZ2UucmVzb3VyY2VzKSB7XG4gICAgcmVzb3VyY2VEZXNjcmlwdG9ycy5wdXNoKFxuICAgICAgYXdhaXQgc2F2ZVJlc291cmNlRmlsZXMocmVzb3VyY2UsIHtcbiAgICAgICAgYmFzZXBhdGgsXG4gICAgICAgIHdpdGhSZW1vdGU6IHRydWUsXG4gICAgICAgIHdpdGhvdXRGb2xkZXJzOiB0cnVlLFxuICAgICAgICBzYXZlRmlsZTogYXN5bmMgb3B0aW9ucyA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBnZXRGaWxlbmFtZShvcHRpb25zLm5vcm1hbGl6ZWRQYXRoKVxuICAgICAgICAgIGNvbnN0IGNrYW5SZXNvdXJjZSA9IGRlbm9ybWFsaXplQ2thblJlc291cmNlKHJlc291cmNlKVxuXG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIC4uLmNrYW5SZXNvdXJjZSxcbiAgICAgICAgICAgIHBhY2thZ2VfaWQ6IGRhdGFzZXROYW1lLFxuICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5kZW5vcm1hbGl6ZWRQYXRoLFxuICAgICAgICAgICAgZm9ybWF0OiBnZXRGb3JtYXQoZmlsZW5hbWUpPy50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHVwbG9hZCA9IHtcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMuZGVub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICAgIGRhdGE6IGF3YWl0IGJsb2IoYXdhaXQgbG9hZEZpbGVTdHJlYW0ob3B0aW9ucy5ub3JtYWxpemVkUGF0aCkpLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1ha2VDa2FuQXBpUmVxdWVzdDxDa2FuUmVzb3VyY2U+KHtcbiAgICAgICAgICAgIGFjdGlvbjogXCJyZXNvdXJjZV9jcmVhdGVcIixcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICB1cGxvYWQsXG4gICAgICAgICAgICBja2FuVXJsLFxuICAgICAgICAgICAgYXBpS2V5LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnVybFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAuLi5kZW5vcm1hbGl6ZVBhY2thZ2UoZGF0YVBhY2thZ2UsIHsgYmFzZXBhdGggfSksXG4gICAgcmVzb3VyY2VzOiByZXNvdXJjZURlc2NyaXB0b3JzLFxuICB9XG5cbiAgZm9yIChjb25zdCBkZW5vcm1hbGl6ZWRQYXRoIG9mIFtcImRhdGFwYWNrYWdlLmpzb25cIl0pIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgcGFja2FnZV9pZDogZGF0YXNldE5hbWUsXG4gICAgICBuYW1lOiBkZW5vcm1hbGl6ZWRQYXRoLFxuICAgIH1cblxuICAgIGNvbnN0IHVwbG9hZCA9IHtcbiAgICAgIG5hbWU6IGRlbm9ybWFsaXplZFBhdGgsXG4gICAgICBkYXRhOiBuZXcgQmxvYihbc3RyaW5naWZ5RGVzY3JpcHRvcihkZXNjcmlwdG9yKV0pLFxuICAgIH1cblxuICAgIGF3YWl0IG1ha2VDa2FuQXBpUmVxdWVzdCh7XG4gICAgICBhY3Rpb246IFwicmVzb3VyY2VfY3JlYXRlXCIsXG4gICAgICBwYXlsb2FkLFxuICAgICAgdXBsb2FkLFxuICAgICAgY2thblVybCxcbiAgICAgIGFwaUtleSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiByZXN1bHQudXJsLFxuICAgIGRhdGFzZXRVcmw6IHVybC50b1N0cmluZygpLFxuICB9XG59XG4iXX0=