UNPKG

doi-utils

Version:

Set of utility functions to help with handling DOI(Digital Object Identifier)

85 lines (84 loc) 2.59 kB
import { DEFAULT_RESOLVERS, STRICT_RESOLVERS } from './resolvers.js'; import { validatePart } from './validatePart.js'; export { DEFAULT_RESOLVERS, STRICT_RESOLVERS } from './resolvers.js'; export const OPEN_FUNDER_REGISTRY_PREFIX = '10.13039'; /** * Validate that the input string is valid. * * Uses DOI pattern described here: https://www.crossref.org/blog/dois-and-matching-regular-expressions/ * * @param possibleDOI * @returns true if DOI is valid */ export function validate(possibleDOI, opts) { if (!possibleDOI) return false; return !!normalize(possibleDOI, opts); } /** * Normalize an input string to the component of the DOI * * @param possibleDOI * @returns a string if it is valid */ export function normalize(possibleDOI, opts) { let doi = undefined; if (!possibleDOI) return undefined; if (validatePart(possibleDOI)) return possibleDOI; if (possibleDOI.startsWith('doi:')) { doi = possibleDOI.slice(4); if (validatePart(doi)) return doi; } try { const url = new URL(possibleDOI.startsWith('http') ? possibleDOI : `http://${possibleDOI}`); const strictResolver = STRICT_RESOLVERS.find((r) => r.test(url)); const nonStrictResolver = DEFAULT_RESOLVERS.find((r) => r.test(url)); if ((opts === null || opts === void 0 ? void 0 : opts.strict) && !strictResolver) return undefined; const resolver = strictResolver !== null && strictResolver !== void 0 ? strictResolver : nonStrictResolver; if (!resolver) return undefined; doi = resolver.parse(url); if (!(opts === null || opts === void 0 ? void 0 : opts.strict) && strictResolver) return doi; } catch (error) { // pass } if (validatePart(doi)) return doi; return undefined; } /** * Builds a canonical URL pointing to https://doi.org * * @param possibleDOI * @returns the doi as a string */ export function buildUrl(possibleDOI, opts) { const doi = normalize(possibleDOI, opts); if (!doi) return undefined; return `https://doi.org/${doi}`; } /** * Returns `true` if the DOI is in the Open Funder Registry * * See https://www.crossref.org/documentation/funder-registry/ */ export function isOpenFunderRegistry(possibleDOI) { const doi = normalize(possibleDOI); if (!doi) return false; return doi.startsWith(`${OPEN_FUNDER_REGISTRY_PREFIX}/`); } export const doi = { validatePart, validate, normalize, buildUrl, isOpenFunderRegistry, };