@dpkit/zenodo
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
93 lines (78 loc) • 2.25 kB
text/typescript
import type { Package } from "@dpkit/core"
import type { ZenodoCreator } from "../Creator.ts"
import type { ZenodoPackage } from "../Package.ts"
export function convertPackageToZenodo(
dataPackage: Package,
): Partial<ZenodoPackage> {
const metadata: Partial<ZenodoPackage["metadata"]> = {
upload_type: "dataset",
}
if (dataPackage.title) {
metadata.title = dataPackage.title
}
if (dataPackage.description) {
metadata.description = dataPackage.description
} else if (dataPackage.title) {
metadata.description = dataPackage.title
} else {
metadata.description = "Dataset created with @dpkit/zenodo"
}
if (dataPackage.version) {
metadata.version = dataPackage.version
}
if (dataPackage.licenses && dataPackage.licenses.length > 0) {
const license = dataPackage.licenses[0]
if (license?.name) {
metadata.license = license.name
}
}
if (dataPackage.contributors && dataPackage.contributors.length > 0) {
const creators: ZenodoCreator[] = []
const authors = dataPackage.contributors.filter(c => c.role === "author")
if (authors.length > 0) {
authors.forEach(author => {
const creator: ZenodoCreator = {
name: author.title,
}
if (author.path) {
creator.affiliation = author.path
}
creators.push(creator)
})
} else {
const firstContributor = dataPackage.contributors[0]
if (firstContributor) {
const creator: ZenodoCreator = {
name: firstContributor.title,
}
if (firstContributor.path) {
creator.affiliation = firstContributor.path
}
creators.push(creator)
}
}
if (creators.length > 0) {
metadata.creators = creators
} else {
metadata.creators = [
{
name: "Unknown Author",
affiliation: "Unknown Affiliation",
},
]
}
} else {
metadata.creators = [
{
name: "Unknown Author",
affiliation: "Unknown Affiliation",
},
]
}
if (dataPackage.keywords && dataPackage.keywords.length > 0) {
metadata.keywords = dataPackage.keywords
}
return {
metadata: metadata as ZenodoPackage["metadata"],
}
}