UNPKG

@dpkit/zenodo

Version:

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

72 lines 9.31 kB
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