@dpkit/zenodo
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
72 lines • 9.31 kB
JavaScript
import { blob } from "node:stream/consumers";
import { convertPackageToDescriptor, stringifyDescriptor } from "@dpkit/core";
import { loadFileStream, saveResourceFiles } from "@dpkit/file";
import { getPackageBasepath } from "@dpkit/file";
import { makeZenodoApiRequest } from "../zenodo/index.js";
import { convertPackageToZenodo } from "./convert/toZenodo.js";
/**
* Save a package to Zenodo
* @param options Object containing the package to save and Zenodo API details
* @returns Object with the deposit URL and DOI
*/
export async function savePackageToZenodo(dataPackage, options) {
const { apiKey, sandbox = false } = options;
const basepath = getPackageBasepath(dataPackage);
const newZenodoPackage = convertPackageToZenodo(dataPackage);
const zenodoPackage = (await makeZenodoApiRequest({
payload: newZenodoPackage,
endpoint: "/deposit/depositions",
method: "POST",
apiKey,
sandbox,
}));
const resourceDescriptors = [];
for (const resource of dataPackage.resources) {
if (!resource.path)
continue;
resourceDescriptors.push(await saveResourceFiles(resource, {
basepath,
withRemote: false,
withoutFolders: true,
saveFile: async (options) => {
const upload = {
name: options.denormalizedPath,
data: await blob(await loadFileStream(options.normalizedPath)),
};
// It seems that record and deposition files have different metadata
// structure, e.g. size vs filesize etc
await makeZenodoApiRequest({
endpoint: `/deposit/depositions/${zenodoPackage.id}/files`,
method: "POST",
upload,
apiKey,
sandbox,
});
return options.denormalizedPath;
},
}));
}
const descriptor = {
...convertPackageToDescriptor(dataPackage, { basepath }),
resources: resourceDescriptors,
};
for (const denormalizedPath of ["datapackage.json"]) {
const upload = {
name: denormalizedPath,
data: new Blob([stringifyDescriptor(descriptor)]),
};
await makeZenodoApiRequest({
endpoint: `/deposit/depositions/${zenodoPackage.id}/files`,
method: "POST",
upload,
apiKey,
sandbox,
});
}
const url = new URL(zenodoPackage.links.html);
return {
path: `${url.origin}/records/${zenodoPackage.id}/files/datapackage.json`,
datasetUrl: `${url.origin}/uploads/${zenodoPackage.id}`,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2Uvc2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFNUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzdFLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXpELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRTlEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxXQUFvQixFQUNwQixPQUdDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBQzNDLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRWhELE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDNUQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLG9CQUFvQixDQUFDO1FBQ2hELE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE1BQU07UUFDTixPQUFPO0tBQ1IsQ0FBQyxDQUFrQixDQUFBO0lBRXBCLE1BQU0sbUJBQW1CLEdBQWlCLEVBQUUsQ0FBQTtJQUM1QyxLQUFLLE1BQU0sUUFBUSxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUk7WUFBRSxTQUFRO1FBRTVCLG1CQUFtQixDQUFDLElBQUksQ0FDdEIsTUFBTSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUU7WUFDaEMsUUFBUTtZQUNSLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFFBQVEsRUFBRSxLQUFLLEVBQUMsT0FBTyxFQUFDLEVBQUU7Z0JBQ3hCLE1BQU0sTUFBTSxHQUFHO29CQUNiLElBQUksRUFBRSxPQUFPLENBQUMsZ0JBQWdCO29CQUM5QixJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUMvRCxDQUFBO2dCQUVELG9FQUFvRTtnQkFDcEUsdUNBQXVDO2dCQUN2QyxNQUFNLG9CQUFvQixDQUFDO29CQUN6QixRQUFRLEVBQUUsd0JBQXdCLGFBQWEsQ0FBQyxFQUFFLFFBQVE7b0JBQzFELE1BQU0sRUFBRSxNQUFNO29CQUNkLE1BQU07b0JBQ04sTUFBTTtvQkFDTixPQUFPO2lCQUNSLENBQUMsQ0FBQTtnQkFFRixPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQTtZQUNqQyxDQUFDO1NBQ0YsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUc7UUFDakIsR0FBRywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUN4RCxTQUFTLEVBQUUsbUJBQW1CO0tBQy9CLENBQUE7SUFFRCxLQUFLLE1BQU0sZ0JBQWdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxNQUFNLEdBQUc7WUFDYixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbEQsQ0FBQTtRQUVELE1BQU0sb0JBQW9CLENBQUM7WUFDekIsUUFBUSxFQUFFLHdCQUF3QixhQUFhLENBQUMsRUFBRSxRQUFRO1lBQzFELE1BQU0sRUFBRSxNQUFNO1lBQ2QsTUFBTTtZQUNOLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDN0MsT0FBTztRQUNMLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLFlBQVksYUFBYSxDQUFDLEVBQUUseUJBQXlCO1FBQ3hFLFVBQVUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLFlBQVksYUFBYSxDQUFDLEVBQUUsRUFBRTtLQUN4RCxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJsb2IgfSBmcm9tIFwibm9kZTpzdHJlYW0vY29uc3VtZXJzXCJcbmltcG9ydCB0eXBlIHsgRGVzY3JpcHRvciwgUGFja2FnZSB9IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQgeyBjb252ZXJ0UGFja2FnZVRvRGVzY3JpcHRvciwgc3RyaW5naWZ5RGVzY3JpcHRvciB9IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQgeyBsb2FkRmlsZVN0cmVhbSwgc2F2ZVJlc291cmNlRmlsZXMgfSBmcm9tIFwiQGRwa2l0L2ZpbGVcIlxuaW1wb3J0IHsgZ2V0UGFja2FnZUJhc2VwYXRoIH0gZnJvbSBcIkBkcGtpdC9maWxlXCJcbmltcG9ydCB7IG1ha2VaZW5vZG9BcGlSZXF1ZXN0IH0gZnJvbSBcIi4uL3plbm9kby9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IFplbm9kb1BhY2thZ2UgfSBmcm9tIFwiLi9QYWNrYWdlLnRzXCJcbmltcG9ydCB7IGNvbnZlcnRQYWNrYWdlVG9aZW5vZG8gfSBmcm9tIFwiLi9jb252ZXJ0L3RvWmVub2RvLnRzXCJcblxuLyoqXG4gKiBTYXZlIGEgcGFja2FnZSB0byBaZW5vZG9cbiAqIEBwYXJhbSBvcHRpb25zIE9iamVjdCBjb250YWluaW5nIHRoZSBwYWNrYWdlIHRvIHNhdmUgYW5kIFplbm9kbyBBUEkgZGV0YWlsc1xuICogQHJldHVybnMgT2JqZWN0IHdpdGggdGhlIGRlcG9zaXQgVVJMIGFuZCBET0lcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVQYWNrYWdlVG9aZW5vZG8oXG4gIGRhdGFQYWNrYWdlOiBQYWNrYWdlLFxuICBvcHRpb25zOiB7XG4gICAgc2FuZGJveD86IGJvb2xlYW5cbiAgICBhcGlLZXk6IHN0cmluZ1xuICB9LFxuKSB7XG4gIGNvbnN0IHsgYXBpS2V5LCBzYW5kYm94ID0gZmFsc2UgfSA9IG9wdGlvbnNcbiAgY29uc3QgYmFzZXBhdGggPSBnZXRQYWNrYWdlQmFzZXBhdGgoZGF0YVBhY2thZ2UpXG5cbiAgY29uc3QgbmV3WmVub2RvUGFja2FnZSA9IGNvbnZlcnRQYWNrYWdlVG9aZW5vZG8oZGF0YVBhY2thZ2UpXG4gIGNvbnN0IHplbm9kb1BhY2thZ2UgPSAoYXdhaXQgbWFrZVplbm9kb0FwaVJlcXVlc3Qoe1xuICAgIHBheWxvYWQ6IG5ld1plbm9kb1BhY2thZ2UsXG4gICAgZW5kcG9pbnQ6IFwiL2RlcG9zaXQvZGVwb3NpdGlvbnNcIixcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGFwaUtleSxcbiAgICBzYW5kYm94LFxuICB9KSkgYXMgWmVub2RvUGFja2FnZVxuXG4gIGNvbnN0IHJlc291cmNlRGVzY3JpcHRvcnM6IERlc2NyaXB0b3JbXSA9IFtdXG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgZGF0YVBhY2thZ2UucmVzb3VyY2VzKSB7XG4gICAgaWYgKCFyZXNvdXJjZS5wYXRoKSBjb250aW51ZVxuXG4gICAgcmVzb3VyY2VEZXNjcmlwdG9ycy5wdXNoKFxuICAgICAgYXdhaXQgc2F2ZVJlc291cmNlRmlsZXMocmVzb3VyY2UsIHtcbiAgICAgICAgYmFzZXBhdGgsXG4gICAgICAgIHdpdGhSZW1vdGU6IGZhbHNlLFxuICAgICAgICB3aXRob3V0Rm9sZGVyczogdHJ1ZSxcbiAgICAgICAgc2F2ZUZpbGU6IGFzeW5jIG9wdGlvbnMgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwbG9hZCA9IHtcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMuZGVub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICAgIGRhdGE6IGF3YWl0IGJsb2IoYXdhaXQgbG9hZEZpbGVTdHJlYW0ob3B0aW9ucy5ub3JtYWxpemVkUGF0aCkpLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEl0IHNlZW1zIHRoYXQgcmVjb3JkIGFuZCBkZXBvc2l0aW9uIGZpbGVzIGhhdmUgZGlmZmVyZW50IG1ldGFkYXRhXG4gICAgICAgICAgLy8gc3RydWN0dXJlLCBlLmcuIHNpemUgdnMgZmlsZXNpemUgZXRjXG4gICAgICAgICAgYXdhaXQgbWFrZVplbm9kb0FwaVJlcXVlc3Qoe1xuICAgICAgICAgICAgZW5kcG9pbnQ6IGAvZGVwb3NpdC9kZXBvc2l0aW9ucy8ke3plbm9kb1BhY2thZ2UuaWR9L2ZpbGVzYCxcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICB1cGxvYWQsXG4gICAgICAgICAgICBhcGlLZXksXG4gICAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5kZW5vcm1hbGl6ZWRQYXRoXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgIC4uLmNvbnZlcnRQYWNrYWdlVG9EZXNjcmlwdG9yKGRhdGFQYWNrYWdlLCB7IGJhc2VwYXRoIH0pLFxuICAgIHJlc291cmNlczogcmVzb3VyY2VEZXNjcmlwdG9ycyxcbiAgfVxuXG4gIGZvciAoY29uc3QgZGVub3JtYWxpemVkUGF0aCBvZiBbXCJkYXRhcGFja2FnZS5qc29uXCJdKSB7XG4gICAgY29uc3QgdXBsb2FkID0ge1xuICAgICAgbmFtZTogZGVub3JtYWxpemVkUGF0aCxcbiAgICAgIGRhdGE6IG5ldyBCbG9iKFtzdHJpbmdpZnlEZXNjcmlwdG9yKGRlc2NyaXB0b3IpXSksXG4gICAgfVxuXG4gICAgYXdhaXQgbWFrZVplbm9kb0FwaVJlcXVlc3Qoe1xuICAgICAgZW5kcG9pbnQ6IGAvZGVwb3NpdC9kZXBvc2l0aW9ucy8ke3plbm9kb1BhY2thZ2UuaWR9L2ZpbGVzYCxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cGxvYWQsXG4gICAgICBhcGlLZXksXG4gICAgICBzYW5kYm94LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCB1cmwgPSBuZXcgVVJMKHplbm9kb1BhY2thZ2UubGlua3MuaHRtbClcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBgJHt1cmwub3JpZ2lufS9yZWNvcmRzLyR7emVub2RvUGFja2FnZS5pZH0vZmlsZXMvZGF0YXBhY2thZ2UuanNvbmAsXG4gICAgZGF0YXNldFVybDogYCR7dXJsLm9yaWdpbn0vdXBsb2Fkcy8ke3plbm9kb1BhY2thZ2UuaWR9YCxcbiAgfVxufVxuIl19