UNPKG

@citation-js/plugin-npm

Version:

Citation.js plugin for npm packages

105 lines (88 loc) 2.12 kB
"use strict"; var _core = require("@citation-js/core"); var _date = require("@citation-js/date"); var _name = require("@citation-js/name"); const propMaps = { name: 'title', description: 'abstract', homepage: 'URL', author: 'author' }; async function parseValue(prop, value) { switch (prop) { case 'author': return [(0, _name.parse)(value.name)]; default: return value; } } async function json(input) { const output = { type: 'software', custom: { versions: [] } }; for (const prop in propMaps) { if (prop in input) { output[propMaps[prop]] = await parseValue(prop, input[prop]); } const { latest } = input['dist-tags']; output.version = latest; output.issued = (0, _date.parse)(input.time[latest]); } for (const version in input.versions) { output.custom.versions.push({ version, issued: (0, _date.parse)(input.time[version]) }); } return output; } async function api(input) { const output = await _core.util.fetchFileAsync(input); return JSON.parse(output); } function url(input) { const [, pkg] = input.match(/((@[^/]+\/)?[^/]+)$/); return `https://registry.npmjs.org/${pkg}`; } _core.plugins.add('@npm', { input: { '@npm/url': { parseType: { dataType: 'String', predicate: /^https?:\/\/(www\.)?(npmjs\.com|npmjs\.org|npm\.im)\/(package)?/, extends: '@else/url' }, parse: url }, '@npm/api': { parseType: { dataType: 'String', predicate: /^https?:\/\/registry\.npmjs\.org\//, extends: '@else/url' }, parseAsync: api }, '@npm/object': { parseType: { dataType: 'SimpleObject', propertyConstraint: { props: 'versions', value(versions) { for (const version in versions) { if ('_npmUser' in versions[version] || '_npmVersion' in versions[version]) { return true; } } return false; } } }, parseAsync: json } } });