@dpkit/zenodo
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
71 lines • 9.2 kB
JavaScript
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==