@dpkit/zenodo
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
45 lines • 6.07 kB
JavaScript
import { mergePackages } from "@dpkit/core";
import { makeZenodoApiRequest } from "../zenodo/index.js";
import { normalizeZenodoPackage } from "./process/normalize.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 = normalizeZenodoPackage(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2UvbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXpELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBRS9EOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxVQUFrQixFQUNsQixPQUVDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7SUFDaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxLQUFLLG9CQUFvQixDQUFBO0lBRWpFLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM1QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxVQUFVLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLG9CQUFvQixDQUFnQjtRQUM5RCxRQUFRLEVBQUUsWUFBWSxRQUFRLEVBQUU7UUFDaEMsTUFBTTtRQUNOLE9BQU87S0FDUixDQUFDLENBQUE7SUFFRixNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUMzRCxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsU0FBUztTQUM1QyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssa0JBQWtCLENBQUM7U0FDakUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3ZDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVSLE1BQU0sV0FBVyxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUE7SUFDM0UsV0FBVyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMzRCxxQ0FBcUM7UUFDckMsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFBO0lBQzFFLENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTyxXQUFXLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQy9CLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6RCxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWVyZ2VQYWNrYWdlcyB9IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQgeyBtYWtlWmVub2RvQXBpUmVxdWVzdCB9IGZyb20gXCIuLi96ZW5vZG8vaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBaZW5vZG9QYWNrYWdlIH0gZnJvbSBcIi4vUGFja2FnZS50c1wiXG5pbXBvcnQgeyBub3JtYWxpemVaZW5vZG9QYWNrYWdlIH0gZnJvbSBcIi4vcHJvY2Vzcy9ub3JtYWxpemUudHNcIlxuXG4vKipcbiAqIExvYWQgYSBwYWNrYWdlIGZyb20gYSBaZW5vZG8gZGVwb3NpdFxuICogQHBhcmFtIHByb3BzIE9iamVjdCBjb250YWluaW5nIHRoZSBVUkwgdG8gdGhlIFplbm9kbyBkZXBvc2l0XG4gKiBAcmV0dXJucyBQYWNrYWdlIG9iamVjdFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFBhY2thZ2VGcm9tWmVub2RvKFxuICBkYXRhc2V0VXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgYXBpS2V5Pzogc3RyaW5nXG4gIH0sXG4pIHtcbiAgY29uc3QgeyBhcGlLZXkgfSA9IG9wdGlvbnMgPz8ge31cbiAgY29uc3Qgc2FuZGJveCA9IG5ldyBVUkwoZGF0YXNldFVybCkuaG9zdCA9PT0gXCJzYW5kYm94Lnplbm9kby5vcmdcIlxuXG4gIGNvbnN0IHJlY29yZElkID0gZXh0cmFjdFJlY29yZElkKGRhdGFzZXRVcmwpXG4gIGlmICghcmVjb3JkSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IHJlY29yZCBJRCBmcm9tIFVSTDogJHtkYXRhc2V0VXJsfWApXG4gIH1cblxuICBjb25zdCB6ZW5vZG9QYWNrYWdlID0gYXdhaXQgbWFrZVplbm9kb0FwaVJlcXVlc3Q8WmVub2RvUGFja2FnZT4oe1xuICAgIGVuZHBvaW50OiBgL3JlY29yZHMvJHtyZWNvcmRJZH1gLFxuICAgIGFwaUtleSxcbiAgICBzYW5kYm94LFxuICB9KVxuXG4gIGNvbnN0IHN5c3RlbVBhY2thZ2UgPSBub3JtYWxpemVaZW5vZG9QYWNrYWdlKHplbm9kb1BhY2thZ2UpXG4gIGNvbnN0IHVzZXJQYWNrYWdlUGF0aCA9IHN5c3RlbVBhY2thZ2UucmVzb3VyY2VzXG4gICAgLmZpbHRlcihyZXNvdXJjZSA9PiByZXNvdXJjZVtcInplbm9kbzprZXlcIl0gPT09IFwiZGF0YXBhY2thZ2UuanNvblwiKVxuICAgIC5tYXAocmVzb3VyY2UgPT4gcmVzb3VyY2VbXCJ6ZW5vZG86dXJsXCJdKVxuICAgIC5hdCgwKVxuXG4gIGNvbnN0IGRhdGFwYWNrYWdlID0gYXdhaXQgbWVyZ2VQYWNrYWdlcyh7IHN5c3RlbVBhY2thZ2UsIHVzZXJQYWNrYWdlUGF0aCB9KVxuICBkYXRhcGFja2FnZS5yZXNvdXJjZXMgPSBkYXRhcGFja2FnZS5yZXNvdXJjZXMubWFwKHJlc291cmNlID0+IHtcbiAgICAvLyBUT0RPOiByZW1vdmUgdGhlc2Uga2V5cyBjb21wbGV0ZWx5XG4gICAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIFwiemVub2RvOmtleVwiOiB1bmRlZmluZWQsIFwiemVub2RvOnVybFwiOiB1bmRlZmluZWQgfVxuICB9KVxuXG4gIHJldHVybiBkYXRhcGFja2FnZVxufVxuXG4vKipcbiAqIEV4dHJhY3QgZGVwb3NpdCBJRCBmcm9tIFVSTFxuICpcbiAqIEV4YW1wbGVzOlxuICogLSBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy8xMjM0NTY3XG4gKiAtIGh0dHBzOi8vc2FuZGJveC56ZW5vZG8ub3JnL3JlY29yZHMvMTIzNDU2N1xuICovXG5mdW5jdGlvbiBleHRyYWN0UmVjb3JkSWQoZGF0YXNldFVybDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChkYXRhc2V0VXJsKVxuICBjb25zdCBwYXRoUGFydHMgPSB1cmwucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKVxuICByZXR1cm4gcGF0aFBhcnRzLmF0KC0xKVxufVxuIl19