UNPKG

@dpkit/zenodo

Version:

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

71 lines 9.2 kB
import { blob } from "node:stream/consumers"; import { denormalizePackage, stringifyDescriptor } from "@dpkit/core"; import { getPackageBasepath, loadFileStream, saveResourceFiles, } from "@dpkit/file"; import { makeZenodoApiRequest } from "../zenodo/index.js"; import { denormalizeZenodoPackage } from "./process/denormalize.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 = denormalizeZenodoPackage(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 = { ...denormalizePackage(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2Uvc2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFNUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3JFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGlCQUFpQixHQUNsQixNQUFNLGFBQWEsQ0FBQTtBQUNwQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUV6RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUVuRTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsV0FBb0IsRUFDcEIsT0FHQztJQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxHQUFHLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUMzQyxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUVoRCxNQUFNLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQzlELE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxvQkFBb0IsQ0FBQztRQUNoRCxPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsTUFBTSxFQUFFLE1BQU07UUFDZCxNQUFNO1FBQ04sT0FBTztLQUNSLENBQUMsQ0FBa0IsQ0FBQTtJQUVwQixNQUFNLG1CQUFtQixHQUFpQixFQUFFLENBQUE7SUFDNUMsS0FBSyxNQUFNLFFBQVEsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1lBQUUsU0FBUTtRQUU1QixtQkFBbUIsQ0FBQyxJQUFJLENBQ3RCLE1BQU0saUJBQWlCLENBQUMsUUFBUSxFQUFFO1lBQ2hDLFFBQVE7WUFDUixVQUFVLEVBQUUsS0FBSztZQUNqQixjQUFjLEVBQUUsSUFBSTtZQUNwQixRQUFRLEVBQUUsS0FBSyxFQUFDLE9BQU8sRUFBQyxFQUFFO2dCQUN4QixNQUFNLE1BQU0sR0FBRztvQkFDYixJQUFJLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtvQkFDOUIsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sY0FBYyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDL0QsQ0FBQTtnQkFFRCxvRUFBb0U7Z0JBQ3BFLHVDQUF1QztnQkFDdkMsTUFBTSxvQkFBb0IsQ0FBQztvQkFDekIsUUFBUSxFQUFFLHdCQUF3QixhQUFhLENBQUMsRUFBRSxRQUFRO29CQUMxRCxNQUFNLEVBQUUsTUFBTTtvQkFDZCxNQUFNO29CQUNOLE1BQU07b0JBQ04sT0FBTztpQkFDUixDQUFDLENBQUE7Z0JBRUYsT0FBTyxPQUFPLENBQUMsZ0JBQWdCLENBQUE7WUFDakMsQ0FBQztTQUNGLENBQUMsQ0FDSCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDaEQsU0FBUyxFQUFFLG1CQUFtQjtLQUMvQixDQUFBO0lBRUQsS0FBSyxNQUFNLGdCQUFnQixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHO1lBQ2IsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ2xELENBQUE7UUFFRCxNQUFNLG9CQUFvQixDQUFDO1lBQ3pCLFFBQVEsRUFBRSx3QkFBd0IsYUFBYSxDQUFDLEVBQUUsUUFBUTtZQUMxRCxNQUFNLEVBQUUsTUFBTTtZQUNkLE1BQU07WUFDTixNQUFNO1lBQ04sT0FBTztTQUNSLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzdDLE9BQU87UUFDTCxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxZQUFZLGFBQWEsQ0FBQyxFQUFFLHlCQUF5QjtRQUN4RSxVQUFVLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxZQUFZLGFBQWEsQ0FBQyxFQUFFLEVBQUU7S0FDeEQsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBibG9iIH0gZnJvbSBcIm5vZGU6c3RyZWFtL2NvbnN1bWVyc1wiXG5pbXBvcnQgdHlwZSB7IERlc2NyaXB0b3IsIFBhY2thZ2UgfSBmcm9tIFwiQGRwa2l0L2NvcmVcIlxuaW1wb3J0IHsgZGVub3JtYWxpemVQYWNrYWdlLCBzdHJpbmdpZnlEZXNjcmlwdG9yIH0gZnJvbSBcIkBkcGtpdC9jb3JlXCJcbmltcG9ydCB7XG4gIGdldFBhY2thZ2VCYXNlcGF0aCxcbiAgbG9hZEZpbGVTdHJlYW0sXG4gIHNhdmVSZXNvdXJjZUZpbGVzLFxufSBmcm9tIFwiQGRwa2l0L2ZpbGVcIlxuaW1wb3J0IHsgbWFrZVplbm9kb0FwaVJlcXVlc3QgfSBmcm9tIFwiLi4vemVub2RvL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgWmVub2RvUGFja2FnZSB9IGZyb20gXCIuL1BhY2thZ2UudHNcIlxuaW1wb3J0IHsgZGVub3JtYWxpemVaZW5vZG9QYWNrYWdlIH0gZnJvbSBcIi4vcHJvY2Vzcy9kZW5vcm1hbGl6ZS50c1wiXG5cbi8qKlxuICogU2F2ZSBhIHBhY2thZ2UgdG8gWmVub2RvXG4gKiBAcGFyYW0gb3B0aW9ucyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFja2FnZSB0byBzYXZlIGFuZCBaZW5vZG8gQVBJIGRldGFpbHNcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHRoZSBkZXBvc2l0IFVSTCBhbmQgRE9JXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlUGFja2FnZVRvWmVub2RvKFxuICBkYXRhUGFja2FnZTogUGFja2FnZSxcbiAgb3B0aW9uczoge1xuICAgIHNhbmRib3g/OiBib29sZWFuXG4gICAgYXBpS2V5OiBzdHJpbmdcbiAgfSxcbikge1xuICBjb25zdCB7IGFwaUtleSwgc2FuZGJveCA9IGZhbHNlIH0gPSBvcHRpb25zXG4gIGNvbnN0IGJhc2VwYXRoID0gZ2V0UGFja2FnZUJhc2VwYXRoKGRhdGFQYWNrYWdlKVxuXG4gIGNvbnN0IG5ld1plbm9kb1BhY2thZ2UgPSBkZW5vcm1hbGl6ZVplbm9kb1BhY2thZ2UoZGF0YVBhY2thZ2UpXG4gIGNvbnN0IHplbm9kb1BhY2thZ2UgPSAoYXdhaXQgbWFrZVplbm9kb0FwaVJlcXVlc3Qoe1xuICAgIHBheWxvYWQ6IG5ld1plbm9kb1BhY2thZ2UsXG4gICAgZW5kcG9pbnQ6IFwiL2RlcG9zaXQvZGVwb3NpdGlvbnNcIixcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGFwaUtleSxcbiAgICBzYW5kYm94LFxuICB9KSkgYXMgWmVub2RvUGFja2FnZVxuXG4gIGNvbnN0IHJlc291cmNlRGVzY3JpcHRvcnM6IERlc2NyaXB0b3JbXSA9IFtdXG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgZGF0YVBhY2thZ2UucmVzb3VyY2VzKSB7XG4gICAgaWYgKCFyZXNvdXJjZS5wYXRoKSBjb250aW51ZVxuXG4gICAgcmVzb3VyY2VEZXNjcmlwdG9ycy5wdXNoKFxuICAgICAgYXdhaXQgc2F2ZVJlc291cmNlRmlsZXMocmVzb3VyY2UsIHtcbiAgICAgICAgYmFzZXBhdGgsXG4gICAgICAgIHdpdGhSZW1vdGU6IGZhbHNlLFxuICAgICAgICB3aXRob3V0Rm9sZGVyczogdHJ1ZSxcbiAgICAgICAgc2F2ZUZpbGU6IGFzeW5jIG9wdGlvbnMgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwbG9hZCA9IHtcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMuZGVub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICAgIGRhdGE6IGF3YWl0IGJsb2IoYXdhaXQgbG9hZEZpbGVTdHJlYW0ob3B0aW9ucy5ub3JtYWxpemVkUGF0aCkpLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEl0IHNlZW1zIHRoYXQgcmVjb3JkIGFuZCBkZXBvc2l0aW9uIGZpbGVzIGhhdmUgZGlmZmVyZW50IG1ldGFkYXRhXG4gICAgICAgICAgLy8gc3RydWN0dXJlLCBlLmcuIHNpemUgdnMgZmlsZXNpemUgZXRjXG4gICAgICAgICAgYXdhaXQgbWFrZVplbm9kb0FwaVJlcXVlc3Qoe1xuICAgICAgICAgICAgZW5kcG9pbnQ6IGAvZGVwb3NpdC9kZXBvc2l0aW9ucy8ke3plbm9kb1BhY2thZ2UuaWR9L2ZpbGVzYCxcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICB1cGxvYWQsXG4gICAgICAgICAgICBhcGlLZXksXG4gICAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5kZW5vcm1hbGl6ZWRQYXRoXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgIC4uLmRlbm9ybWFsaXplUGFja2FnZShkYXRhUGFja2FnZSwgeyBiYXNlcGF0aCB9KSxcbiAgICByZXNvdXJjZXM6IHJlc291cmNlRGVzY3JpcHRvcnMsXG4gIH1cblxuICBmb3IgKGNvbnN0IGRlbm9ybWFsaXplZFBhdGggb2YgW1wiZGF0YXBhY2thZ2UuanNvblwiXSkge1xuICAgIGNvbnN0IHVwbG9hZCA9IHtcbiAgICAgIG5hbWU6IGRlbm9ybWFsaXplZFBhdGgsXG4gICAgICBkYXRhOiBuZXcgQmxvYihbc3RyaW5naWZ5RGVzY3JpcHRvcihkZXNjcmlwdG9yKV0pLFxuICAgIH1cblxuICAgIGF3YWl0IG1ha2VaZW5vZG9BcGlSZXF1ZXN0KHtcbiAgICAgIGVuZHBvaW50OiBgL2RlcG9zaXQvZGVwb3NpdGlvbnMvJHt6ZW5vZG9QYWNrYWdlLmlkfS9maWxlc2AsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXBsb2FkLFxuICAgICAgYXBpS2V5LFxuICAgICAgc2FuZGJveCxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTCh6ZW5vZG9QYWNrYWdlLmxpbmtzLmh0bWwpXG4gIHJldHVybiB7XG4gICAgcGF0aDogYCR7dXJsLm9yaWdpbn0vcmVjb3Jkcy8ke3plbm9kb1BhY2thZ2UuaWR9L2ZpbGVzL2RhdGFwYWNrYWdlLmpzb25gLFxuICAgIGRhdGFzZXRVcmw6IGAke3VybC5vcmlnaW59L3VwbG9hZHMvJHt6ZW5vZG9QYWNrYWdlLmlkfWAsXG4gIH1cbn1cbiJdfQ==