UNPKG

@dpkit/zenodo

Version:

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

45 lines 6.07 kB
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