@dpkit/zenodo
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
95 lines • 10.4 kB
JavaScript
/**
* 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==