@citation-js/plugin-npm
Version:
Citation.js plugin for npm packages
105 lines (88 loc) • 2.12 kB
JavaScript
;
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
}
}
});