@dpkit/zenodo
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
45 lines • 6.08 kB
JavaScript
import { mergePackages } from "@dpkit/core";
import { makeZenodoApiRequest } from "../zenodo/index.js";
import { convertPackageFromZenodo } from "./convert/fromZenodo.js";
/**
* Load a package from a Zenodo deposit
* @param props Object containing the URL to the Zenodo deposit
* @returns Package object
*/
export async function loadPackageFromZenodo(datasetUrl, options) {
const { apiKey } = options ?? {};
const sandbox = new URL(datasetUrl).host === "sandbox.zenodo.org";
const recordId = extractRecordId(datasetUrl);
if (!recordId) {
throw new Error(`Failed to extract record ID from URL: ${datasetUrl}`);
}
const zenodoPackage = await makeZenodoApiRequest({
endpoint: `/records/${recordId}`,
apiKey,
sandbox,
});
const systemPackage = convertPackageFromZenodo(zenodoPackage);
const userPackagePath = systemPackage.resources
.filter(resource => resource["zenodo:key"] === "datapackage.json")
.map(resource => resource["zenodo:url"])
.at(0);
const datapackage = await mergePackages({ systemPackage, userPackagePath });
datapackage.resources = datapackage.resources.map(resource => {
// TODO: remove these keys completely
return { ...resource, "zenodo:key": undefined, "zenodo:url": undefined };
});
return datapackage;
}
/**
* Extract deposit ID from URL
*
* Examples:
* - https://zenodo.org/records/1234567
* - https://sandbox.zenodo.org/records/1234567
*/
function extractRecordId(datasetUrl) {
const url = new URL(datasetUrl);
const pathParts = url.pathname.split("/").filter(Boolean);
return pathParts.at(-1);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2UvbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXpELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRWxFOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxVQUFrQixFQUNsQixPQUVDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7SUFDaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxLQUFLLG9CQUFvQixDQUFBO0lBRWpFLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM1QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxVQUFVLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLG9CQUFvQixDQUFnQjtRQUM5RCxRQUFRLEVBQUUsWUFBWSxRQUFRLEVBQUU7UUFDaEMsTUFBTTtRQUNOLE9BQU87S0FDUixDQUFDLENBQUE7SUFFRixNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUM3RCxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsU0FBUztTQUM1QyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssa0JBQWtCLENBQUM7U0FDakUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3ZDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVSLE1BQU0sV0FBVyxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUE7SUFDM0UsV0FBVyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMzRCxxQ0FBcUM7UUFDckMsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFBO0lBQzFFLENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTyxXQUFXLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQy9CLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6RCxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWVyZ2VQYWNrYWdlcyB9IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQgeyBtYWtlWmVub2RvQXBpUmVxdWVzdCB9IGZyb20gXCIuLi96ZW5vZG8vaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBaZW5vZG9QYWNrYWdlIH0gZnJvbSBcIi4vUGFja2FnZS50c1wiXG5pbXBvcnQgeyBjb252ZXJ0UGFja2FnZUZyb21aZW5vZG8gfSBmcm9tIFwiLi9jb252ZXJ0L2Zyb21aZW5vZG8udHNcIlxuXG4vKipcbiAqIExvYWQgYSBwYWNrYWdlIGZyb20gYSBaZW5vZG8gZGVwb3NpdFxuICogQHBhcmFtIHByb3BzIE9iamVjdCBjb250YWluaW5nIHRoZSBVUkwgdG8gdGhlIFplbm9kbyBkZXBvc2l0XG4gKiBAcmV0dXJucyBQYWNrYWdlIG9iamVjdFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFBhY2thZ2VGcm9tWmVub2RvKFxuICBkYXRhc2V0VXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgYXBpS2V5Pzogc3RyaW5nXG4gIH0sXG4pIHtcbiAgY29uc3QgeyBhcGlLZXkgfSA9IG9wdGlvbnMgPz8ge31cbiAgY29uc3Qgc2FuZGJveCA9IG5ldyBVUkwoZGF0YXNldFVybCkuaG9zdCA9PT0gXCJzYW5kYm94Lnplbm9kby5vcmdcIlxuXG4gIGNvbnN0IHJlY29yZElkID0gZXh0cmFjdFJlY29yZElkKGRhdGFzZXRVcmwpXG4gIGlmICghcmVjb3JkSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IHJlY29yZCBJRCBmcm9tIFVSTDogJHtkYXRhc2V0VXJsfWApXG4gIH1cblxuICBjb25zdCB6ZW5vZG9QYWNrYWdlID0gYXdhaXQgbWFrZVplbm9kb0FwaVJlcXVlc3Q8WmVub2RvUGFja2FnZT4oe1xuICAgIGVuZHBvaW50OiBgL3JlY29yZHMvJHtyZWNvcmRJZH1gLFxuICAgIGFwaUtleSxcbiAgICBzYW5kYm94LFxuICB9KVxuXG4gIGNvbnN0IHN5c3RlbVBhY2thZ2UgPSBjb252ZXJ0UGFja2FnZUZyb21aZW5vZG8oemVub2RvUGFja2FnZSlcbiAgY29uc3QgdXNlclBhY2thZ2VQYXRoID0gc3lzdGVtUGFja2FnZS5yZXNvdXJjZXNcbiAgICAuZmlsdGVyKHJlc291cmNlID0+IHJlc291cmNlW1wiemVub2RvOmtleVwiXSA9PT0gXCJkYXRhcGFja2FnZS5qc29uXCIpXG4gICAgLm1hcChyZXNvdXJjZSA9PiByZXNvdXJjZVtcInplbm9kbzp1cmxcIl0pXG4gICAgLmF0KDApXG5cbiAgY29uc3QgZGF0YXBhY2thZ2UgPSBhd2FpdCBtZXJnZVBhY2thZ2VzKHsgc3lzdGVtUGFja2FnZSwgdXNlclBhY2thZ2VQYXRoIH0pXG4gIGRhdGFwYWNrYWdlLnJlc291cmNlcyA9IGRhdGFwYWNrYWdlLnJlc291cmNlcy5tYXAocmVzb3VyY2UgPT4ge1xuICAgIC8vIFRPRE86IHJlbW92ZSB0aGVzZSBrZXlzIGNvbXBsZXRlbHlcbiAgICByZXR1cm4geyAuLi5yZXNvdXJjZSwgXCJ6ZW5vZG86a2V5XCI6IHVuZGVmaW5lZCwgXCJ6ZW5vZG86dXJsXCI6IHVuZGVmaW5lZCB9XG4gIH0pXG5cbiAgcmV0dXJuIGRhdGFwYWNrYWdlXG59XG5cbi8qKlxuICogRXh0cmFjdCBkZXBvc2l0IElEIGZyb20gVVJMXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtIGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzEyMzQ1NjdcbiAqIC0gaHR0cHM6Ly9zYW5kYm94Lnplbm9kby5vcmcvcmVjb3Jkcy8xMjM0NTY3XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RSZWNvcmRJZChkYXRhc2V0VXJsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKGRhdGFzZXRVcmwpXG4gIGNvbnN0IHBhdGhQYXJ0cyA9IHVybC5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pXG4gIHJldHVybiBwYXRoUGFydHMuYXQoLTEpXG59XG4iXX0=