@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, readFileStream, saveResourceFiles, } from "@dpkit/file";
import { makeCkanApiRequest } from "../general/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 (props) => {
const filename = getFilename(props.normalizedPath);
const ckanResource = denormalizeCkanResource(resource);
const payload = {
...ckanResource,
package_id: datasetName,
name: props.denormalizedPath,
format: getFormat(filename)?.toUpperCase(),
};
const upload = {
name: props.denormalizedPath,
data: await blob(await readFileStream(props.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2Uvc2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFNUMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsU0FBUyxFQUNULG1CQUFtQixHQUNwQixNQUFNLGFBQWEsQ0FBQTtBQUNwQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxpQkFBaUIsR0FDbEIsTUFBTSxhQUFhLENBQUE7QUFDcEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFeEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFakUsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsV0FBb0IsRUFDcEIsT0FLQztJQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFFMUQsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDaEQsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFdkQsTUFBTSxPQUFPLEdBQUc7UUFDZCxHQUFHLFdBQVc7UUFDZCxJQUFJLEVBQUUsV0FBVztRQUNqQixTQUFTLEVBQUUsUUFBUTtRQUNuQixTQUFTLEVBQUUsRUFBRTtLQUNkLENBQUE7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixDQUFDO1FBQ3RDLE1BQU0sRUFBRSxnQkFBZ0I7UUFDeEIsT0FBTztRQUNQLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxNQUFNO0tBQ2YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUIsR0FBRyxDQUFDLFFBQVEsR0FBRyxZQUFZLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUV4QyxNQUFNLG1CQUFtQixHQUFpQixFQUFFLENBQUE7SUFDNUMsS0FBSyxNQUFNLFFBQVEsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0MsbUJBQW1CLENBQUMsSUFBSSxDQUN0QixNQUFNLGlCQUFpQixDQUFDLFFBQVEsRUFBRTtZQUNoQyxRQUFRO1lBQ1IsVUFBVSxFQUFFLElBQUk7WUFDaEIsY0FBYyxFQUFFLElBQUk7WUFDcEIsUUFBUSxFQUFFLEtBQUssRUFBQyxLQUFLLEVBQUMsRUFBRTtnQkFDdEIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtnQkFDbEQsTUFBTSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBRXRELE1BQU0sT0FBTyxHQUFHO29CQUNkLEdBQUcsWUFBWTtvQkFDZixVQUFVLEVBQUUsV0FBVztvQkFDdkIsSUFBSSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQzVCLE1BQU0sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFO2lCQUMzQyxDQUFBO2dCQUVELE1BQU0sTUFBTSxHQUFHO29CQUNiLElBQUksRUFBRSxLQUFLLENBQUMsZ0JBQWdCO29CQUM1QixJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUM3RCxDQUFBO2dCQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQWU7b0JBQ3BELE1BQU0sRUFBRSxpQkFBaUI7b0JBQ3pCLE9BQU87b0JBQ1AsTUFBTTtvQkFDTixPQUFPO29CQUNQLE1BQU07aUJBQ1AsQ0FBQyxDQUFBO2dCQUVGLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQTtZQUNuQixDQUFDO1NBQ0YsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUc7UUFDakIsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUNoRCxTQUFTLEVBQUUsbUJBQW1CO0tBQy9CLENBQUE7SUFFRCxLQUFLLE1BQU0sZ0JBQWdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUc7WUFDZCxVQUFVLEVBQUUsV0FBVztZQUN2QixJQUFJLEVBQUUsZ0JBQWdCO1NBQ3ZCLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRztZQUNiLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdEQsQ0FBQTtRQUVELE1BQU0sa0JBQWtCLENBQUM7WUFDdkIsTUFBTSxFQUFFLGlCQUFpQjtZQUN6QixPQUFPO1lBQ1AsTUFBTTtZQUNOLE9BQU87WUFDUCxNQUFNO1NBQ1AsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUc7UUFDaEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUU7S0FDM0IsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBibG9iIH0gZnJvbSBcIm5vZGU6c3RyZWFtL2NvbnN1bWVyc1wiXG5pbXBvcnQgdHlwZSB7IERlc2NyaXB0b3IsIFBhY2thZ2UgfSBmcm9tIFwiQGRwa2l0L2NvcmVcIlxuaW1wb3J0IHtcbiAgZGVub3JtYWxpemVQYWNrYWdlLFxuICBnZXRGaWxlbmFtZSxcbiAgZ2V0Rm9ybWF0LFxuICBzdHJpbmdpZnlEZXNjcmlwdG9yLFxufSBmcm9tIFwiQGRwa2l0L2NvcmVcIlxuaW1wb3J0IHtcbiAgZ2V0UGFja2FnZUJhc2VwYXRoLFxuICByZWFkRmlsZVN0cmVhbSxcbiAgc2F2ZVJlc291cmNlRmlsZXMsXG59IGZyb20gXCJAZHBraXQvZmlsZVwiXG5pbXBvcnQgeyBtYWtlQ2thbkFwaVJlcXVlc3QgfSBmcm9tIFwiLi4vZ2VuZXJhbC9pbmRleC5qc1wiXG5pbXBvcnQgdHlwZSB7IENrYW5SZXNvdXJjZSB9IGZyb20gXCIuLi9yZXNvdXJjZS9pbmRleC5qc1wiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZUNrYW5SZXNvdXJjZSB9IGZyb20gXCIuLi9yZXNvdXJjZS9pbmRleC5qc1wiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZUNrYW5QYWNrYWdlIH0gZnJvbSBcIi4vcHJvY2Vzcy9kZW5vcm1hbGl6ZS5qc1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlUGFja2FnZVRvQ2thbihcbiAgZGF0YVBhY2thZ2U6IFBhY2thZ2UsXG4gIG9wdGlvbnM6IHtcbiAgICBhcGlLZXk6IHN0cmluZ1xuICAgIGNrYW5Vcmw6IHN0cmluZ1xuICAgIG93bmVyT3JnOiBzdHJpbmdcbiAgICBkYXRhc2V0TmFtZTogc3RyaW5nXG4gIH0sXG4pIHtcbiAgY29uc3QgeyBhcGlLZXksIGNrYW5VcmwsIG93bmVyT3JnLCBkYXRhc2V0TmFtZSB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IGJhc2VwYXRoID0gZ2V0UGFja2FnZUJhc2VwYXRoKGRhdGFQYWNrYWdlKVxuICBjb25zdCBja2FuUGFja2FnZSA9IGRlbm9ybWFsaXplQ2thblBhY2thZ2UoZGF0YVBhY2thZ2UpXG5cbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAuLi5ja2FuUGFja2FnZSxcbiAgICBuYW1lOiBkYXRhc2V0TmFtZSxcbiAgICBvd25lcl9vcmc6IG93bmVyT3JnLFxuICAgIHJlc291cmNlczogW10sXG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBtYWtlQ2thbkFwaVJlcXVlc3Qoe1xuICAgIGFjdGlvbjogXCJwYWNrYWdlX2NyZWF0ZVwiLFxuICAgIHBheWxvYWQsXG4gICAgY2thblVybDogY2thblVybCxcbiAgICBhcGlLZXk6IGFwaUtleSxcbiAgfSlcblxuICBjb25zdCB1cmwgPSBuZXcgVVJMKGNrYW5VcmwpXG4gIHVybC5wYXRobmFtZSA9IGAvZGF0YXNldC8ke3Jlc3VsdC5uYW1lfWBcblxuICBjb25zdCByZXNvdXJjZURlc2NyaXB0b3JzOiBEZXNjcmlwdG9yW10gPSBbXVxuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGRhdGFQYWNrYWdlLnJlc291cmNlcykge1xuICAgIHJlc291cmNlRGVzY3JpcHRvcnMucHVzaChcbiAgICAgIGF3YWl0IHNhdmVSZXNvdXJjZUZpbGVzKHJlc291cmNlLCB7XG4gICAgICAgIGJhc2VwYXRoLFxuICAgICAgICB3aXRoUmVtb3RlOiB0cnVlLFxuICAgICAgICB3aXRob3V0Rm9sZGVyczogdHJ1ZSxcbiAgICAgICAgc2F2ZUZpbGU6IGFzeW5jIHByb3BzID0+IHtcbiAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGdldEZpbGVuYW1lKHByb3BzLm5vcm1hbGl6ZWRQYXRoKVxuICAgICAgICAgIGNvbnN0IGNrYW5SZXNvdXJjZSA9IGRlbm9ybWFsaXplQ2thblJlc291cmNlKHJlc291cmNlKVxuXG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIC4uLmNrYW5SZXNvdXJjZSxcbiAgICAgICAgICAgIHBhY2thZ2VfaWQ6IGRhdGFzZXROYW1lLFxuICAgICAgICAgICAgbmFtZTogcHJvcHMuZGVub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICAgIGZvcm1hdDogZ2V0Rm9ybWF0KGZpbGVuYW1lKT8udG9VcHBlckNhc2UoKSxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB1cGxvYWQgPSB7XG4gICAgICAgICAgICBuYW1lOiBwcm9wcy5kZW5vcm1hbGl6ZWRQYXRoLFxuICAgICAgICAgICAgZGF0YTogYXdhaXQgYmxvYihhd2FpdCByZWFkRmlsZVN0cmVhbShwcm9wcy5ub3JtYWxpemVkUGF0aCkpLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1ha2VDa2FuQXBpUmVxdWVzdDxDa2FuUmVzb3VyY2U+KHtcbiAgICAgICAgICAgIGFjdGlvbjogXCJyZXNvdXJjZV9jcmVhdGVcIixcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICB1cGxvYWQsXG4gICAgICAgICAgICBja2FuVXJsLFxuICAgICAgICAgICAgYXBpS2V5LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnVybFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAuLi5kZW5vcm1hbGl6ZVBhY2thZ2UoZGF0YVBhY2thZ2UsIHsgYmFzZXBhdGggfSksXG4gICAgcmVzb3VyY2VzOiByZXNvdXJjZURlc2NyaXB0b3JzLFxuICB9XG5cbiAgZm9yIChjb25zdCBkZW5vcm1hbGl6ZWRQYXRoIG9mIFtcImRhdGFwYWNrYWdlLmpzb25cIl0pIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgcGFja2FnZV9pZDogZGF0YXNldE5hbWUsXG4gICAgICBuYW1lOiBkZW5vcm1hbGl6ZWRQYXRoLFxuICAgIH1cblxuICAgIGNvbnN0IHVwbG9hZCA9IHtcbiAgICAgIG5hbWU6IGRlbm9ybWFsaXplZFBhdGgsXG4gICAgICBkYXRhOiBuZXcgQmxvYihbc3RyaW5naWZ5RGVzY3JpcHRvcih7IGRlc2NyaXB0b3IgfSldKSxcbiAgICB9XG5cbiAgICBhd2FpdCBtYWtlQ2thbkFwaVJlcXVlc3Qoe1xuICAgICAgYWN0aW9uOiBcInJlc291cmNlX2NyZWF0ZVwiLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHVwbG9hZCxcbiAgICAgIGNrYW5VcmwsXG4gICAgICBhcGlLZXksXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aDogcmVzdWx0LnVybCxcbiAgICBkYXRhc2V0VXJsOiB1cmwudG9TdHJpbmcoKSxcbiAgfVxufVxuIl19