UNPKG

@dpkit/zenodo

Version:

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

95 lines 10.4 kB
/** * Denormalizes a Frictionless Data Package to Zenodo Deposit metadata format * @param props Object containing the Package to denormalize * @returns Zenodo metadata object for deposit creation/update */ export function denormalizeZenodoPackage(dataPackage) { // Build metadata object const metadata = { upload_type: "dataset", // Default to dataset type }; // Basic metadata if (dataPackage.title) { metadata.title = dataPackage.title; } if (dataPackage.description) { metadata.description = dataPackage.description; } else if (dataPackage.title) { // Fallback to title if no description is provided (required by Zenodo) metadata.description = dataPackage.title; } else { metadata.description = "Dataset created with @dpkit/zenodo"; } if (dataPackage.version) { metadata.version = dataPackage.version; } // Process license information if (dataPackage.licenses && dataPackage.licenses.length > 0) { const license = dataPackage.licenses[0]; if (license?.name) { metadata.license = license.name; } } // Process contributors as creators if (dataPackage.contributors && dataPackage.contributors.length > 0) { const creators = []; // First look for authors const authors = dataPackage.contributors.filter(c => c.role === "author"); if (authors.length > 0) { authors.forEach(author => { const creator = { name: author.title, }; if (author.path) { creator.affiliation = author.path; } creators.push(creator); }); } else { // If no authors, use any contributor const firstContributor = dataPackage.contributors[0]; if (firstContributor) { const creator = { name: firstContributor.title, }; if (firstContributor.path) { creator.affiliation = firstContributor.path; } creators.push(creator); } } if (creators.length > 0) { metadata.creators = creators; } else { // Zenodo requires at least one creator metadata.creators = [ { name: "Unknown Author", affiliation: "Unknown Affiliation", }, ]; } } else { // Zenodo requires at least one creator metadata.creators = [ { name: "Unknown Author", affiliation: "Unknown Affiliation", }, ]; } // Process keywords if (dataPackage.keywords && dataPackage.keywords.length > 0) { metadata.keywords = dataPackage.keywords; } // Return Zenodo deposit structure return { metadata: metadata, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVub3JtYWxpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlL3Byb2Nlc3MvZGVub3JtYWxpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUE7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsV0FBb0I7SUFFcEIsd0JBQXdCO0lBQ3hCLE1BQU0sUUFBUSxHQUF1QztRQUNuRCxXQUFXLEVBQUUsU0FBUyxFQUFFLDBCQUEwQjtLQUNuRCxDQUFBO0lBRUQsaUJBQWlCO0lBQ2pCLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQTtJQUNwQyxDQUFDO0lBRUQsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsUUFBUSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFBO0lBQ2hELENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3Qix1RUFBdUU7UUFDdkUsUUFBUSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFBO0lBQzFDLENBQUM7U0FBTSxDQUFDO1FBQ04sUUFBUSxDQUFDLFdBQVcsR0FBRyxvQ0FBb0MsQ0FBQTtJQUM3RCxDQUFDO0lBRUQsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsUUFBUSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFBO0lBQ3hDLENBQUM7SUFFRCw4QkFBOEI7SUFDOUIsSUFBSSxXQUFXLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsSUFBSSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDbEIsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFBO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLElBQUksV0FBVyxDQUFDLFlBQVksSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLFFBQVEsR0FBb0IsRUFBRSxDQUFBO1FBRXBDLHlCQUF5QjtRQUN6QixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUE7UUFDekUsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3ZCLE1BQU0sT0FBTyxHQUFrQjtvQkFDN0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLO2lCQUNuQixDQUFBO2dCQUVELElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNoQixPQUFPLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUE7Z0JBQ25DLENBQUM7Z0JBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUN4QixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04scUNBQXFDO1lBQ3JDLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNwRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sT0FBTyxHQUFrQjtvQkFDN0IsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEtBQUs7aUJBQzdCLENBQUE7Z0JBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDMUIsT0FBTyxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUE7Z0JBQzdDLENBQUM7Z0JBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUN4QixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLHVDQUF1QztZQUN2QyxRQUFRLENBQUMsUUFBUSxHQUFHO2dCQUNsQjtvQkFDRSxJQUFJLEVBQUUsZ0JBQWdCO29CQUN0QixXQUFXLEVBQUUscUJBQXFCO2lCQUNuQzthQUNGLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTix1Q0FBdUM7UUFDdkMsUUFBUSxDQUFDLFFBQVEsR0FBRztZQUNsQjtnQkFDRSxJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixXQUFXLEVBQUUscUJBQXFCO2FBQ25DO1NBQ0YsQ0FBQTtJQUNILENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsSUFBSSxXQUFXLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVELFFBQVEsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQTtJQUMxQyxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLE9BQU87UUFDTCxRQUFRLEVBQUUsUUFBcUM7S0FDaEQsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBhY2thZ2UgfSBmcm9tIFwiQGRwa2l0L2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBaZW5vZG9DcmVhdG9yIH0gZnJvbSBcIi4uL0NyZWF0b3IudHNcIlxuaW1wb3J0IHR5cGUgeyBaZW5vZG9QYWNrYWdlIH0gZnJvbSBcIi4uL1BhY2thZ2UudHNcIlxuXG4vKipcbiAqIERlbm9ybWFsaXplcyBhIEZyaWN0aW9ubGVzcyBEYXRhIFBhY2thZ2UgdG8gWmVub2RvIERlcG9zaXQgbWV0YWRhdGEgZm9ybWF0XG4gKiBAcGFyYW0gcHJvcHMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIFBhY2thZ2UgdG8gZGVub3JtYWxpemVcbiAqIEByZXR1cm5zIFplbm9kbyBtZXRhZGF0YSBvYmplY3QgZm9yIGRlcG9zaXQgY3JlYXRpb24vdXBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZW5vcm1hbGl6ZVplbm9kb1BhY2thZ2UoXG4gIGRhdGFQYWNrYWdlOiBQYWNrYWdlLFxuKTogUGFydGlhbDxaZW5vZG9QYWNrYWdlPiB7XG4gIC8vIEJ1aWxkIG1ldGFkYXRhIG9iamVjdFxuICBjb25zdCBtZXRhZGF0YTogUGFydGlhbDxaZW5vZG9QYWNrYWdlW1wibWV0YWRhdGFcIl0+ID0ge1xuICAgIHVwbG9hZF90eXBlOiBcImRhdGFzZXRcIiwgLy8gRGVmYXVsdCB0byBkYXRhc2V0IHR5cGVcbiAgfVxuXG4gIC8vIEJhc2ljIG1ldGFkYXRhXG4gIGlmIChkYXRhUGFja2FnZS50aXRsZSkge1xuICAgIG1ldGFkYXRhLnRpdGxlID0gZGF0YVBhY2thZ2UudGl0bGVcbiAgfVxuXG4gIGlmIChkYXRhUGFja2FnZS5kZXNjcmlwdGlvbikge1xuICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gZGF0YVBhY2thZ2UuZGVzY3JpcHRpb25cbiAgfSBlbHNlIGlmIChkYXRhUGFja2FnZS50aXRsZSkge1xuICAgIC8vIEZhbGxiYWNrIHRvIHRpdGxlIGlmIG5vIGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIChyZXF1aXJlZCBieSBaZW5vZG8pXG4gICAgbWV0YWRhdGEuZGVzY3JpcHRpb24gPSBkYXRhUGFja2FnZS50aXRsZVxuICB9IGVsc2Uge1xuICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gXCJEYXRhc2V0IGNyZWF0ZWQgd2l0aCBAZHBraXQvemVub2RvXCJcbiAgfVxuXG4gIGlmIChkYXRhUGFja2FnZS52ZXJzaW9uKSB7XG4gICAgbWV0YWRhdGEudmVyc2lvbiA9IGRhdGFQYWNrYWdlLnZlcnNpb25cbiAgfVxuXG4gIC8vIFByb2Nlc3MgbGljZW5zZSBpbmZvcm1hdGlvblxuICBpZiAoZGF0YVBhY2thZ2UubGljZW5zZXMgJiYgZGF0YVBhY2thZ2UubGljZW5zZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpY2Vuc2UgPSBkYXRhUGFja2FnZS5saWNlbnNlc1swXVxuICAgIGlmIChsaWNlbnNlPy5uYW1lKSB7XG4gICAgICBtZXRhZGF0YS5saWNlbnNlID0gbGljZW5zZS5uYW1lXG4gICAgfVxuICB9XG5cbiAgLy8gUHJvY2VzcyBjb250cmlidXRvcnMgYXMgY3JlYXRvcnNcbiAgaWYgKGRhdGFQYWNrYWdlLmNvbnRyaWJ1dG9ycyAmJiBkYXRhUGFja2FnZS5jb250cmlidXRvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNyZWF0b3JzOiBaZW5vZG9DcmVhdG9yW10gPSBbXVxuXG4gICAgLy8gRmlyc3QgbG9vayBmb3IgYXV0aG9yc1xuICAgIGNvbnN0IGF1dGhvcnMgPSBkYXRhUGFja2FnZS5jb250cmlidXRvcnMuZmlsdGVyKGMgPT4gYy5yb2xlID09PSBcImF1dGhvclwiKVxuICAgIGlmIChhdXRob3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF1dGhvcnMuZm9yRWFjaChhdXRob3IgPT4ge1xuICAgICAgICBjb25zdCBjcmVhdG9yOiBaZW5vZG9DcmVhdG9yID0ge1xuICAgICAgICAgIG5hbWU6IGF1dGhvci50aXRsZSxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdXRob3IucGF0aCkge1xuICAgICAgICAgIGNyZWF0b3IuYWZmaWxpYXRpb24gPSBhdXRob3IucGF0aFxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRvcnMucHVzaChjcmVhdG9yKVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgbm8gYXV0aG9ycywgdXNlIGFueSBjb250cmlidXRvclxuICAgICAgY29uc3QgZmlyc3RDb250cmlidXRvciA9IGRhdGFQYWNrYWdlLmNvbnRyaWJ1dG9yc1swXVxuICAgICAgaWYgKGZpcnN0Q29udHJpYnV0b3IpIHtcbiAgICAgICAgY29uc3QgY3JlYXRvcjogWmVub2RvQ3JlYXRvciA9IHtcbiAgICAgICAgICBuYW1lOiBmaXJzdENvbnRyaWJ1dG9yLnRpdGxlLFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpcnN0Q29udHJpYnV0b3IucGF0aCkge1xuICAgICAgICAgIGNyZWF0b3IuYWZmaWxpYXRpb24gPSBmaXJzdENvbnRyaWJ1dG9yLnBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0b3JzLnB1c2goY3JlYXRvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3JlYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgbWV0YWRhdGEuY3JlYXRvcnMgPSBjcmVhdG9yc1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBaZW5vZG8gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNyZWF0b3JcbiAgICAgIG1ldGFkYXRhLmNyZWF0b3JzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJVbmtub3duIEF1dGhvclwiLFxuICAgICAgICAgIGFmZmlsaWF0aW9uOiBcIlVua25vd24gQWZmaWxpYXRpb25cIixcbiAgICAgICAgfSxcbiAgICAgIF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gWmVub2RvIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBjcmVhdG9yXG4gICAgbWV0YWRhdGEuY3JlYXRvcnMgPSBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiVW5rbm93biBBdXRob3JcIixcbiAgICAgICAgYWZmaWxpYXRpb246IFwiVW5rbm93biBBZmZpbGlhdGlvblwiLFxuICAgICAgfSxcbiAgICBdXG4gIH1cblxuICAvLyBQcm9jZXNzIGtleXdvcmRzXG4gIGlmIChkYXRhUGFja2FnZS5rZXl3b3JkcyAmJiBkYXRhUGFja2FnZS5rZXl3b3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgbWV0YWRhdGEua2V5d29yZHMgPSBkYXRhUGFja2FnZS5rZXl3b3Jkc1xuICB9XG5cbiAgLy8gUmV0dXJuIFplbm9kbyBkZXBvc2l0IHN0cnVjdHVyZVxuICByZXR1cm4ge1xuICAgIG1ldGFkYXRhOiBtZXRhZGF0YSBhcyBaZW5vZG9QYWNrYWdlW1wibWV0YWRhdGFcIl0sXG4gIH1cbn1cbiJdfQ==