UNPKG

@dpkit/zenodo

Version:

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

45 lines 6.08 kB
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=