99 lines
2.8 KiB
JavaScript
99 lines
2.8 KiB
JavaScript
const npmSearch = require("libnpmsearch");
|
|
const npmFetch = require("npm-registry-fetch");
|
|
const Table = require("cli-table");
|
|
|
|
const { log } = require("./logger");
|
|
const {
|
|
env,
|
|
getLatestVersion,
|
|
getNpmFetchOptions,
|
|
parseEnv
|
|
} = require("./core");
|
|
const { isConnectionError, is404Error } = require("./error-handler");
|
|
|
|
const searchEndpoint = async function(keyword, registry) {
|
|
if (!registry) registry = env.registry;
|
|
try {
|
|
const results = await npmSearch(keyword, getNpmFetchOptions());
|
|
log.verbose("npmsearch", results);
|
|
return results.map(x => {
|
|
return [
|
|
x.name,
|
|
x["dist-tags"] ? x["dist-tags"].latest : "",
|
|
x.time && x.time.modified ? x.time.modified.split("T")[0] : "",
|
|
""
|
|
];
|
|
});
|
|
} catch (err) {
|
|
if (!is404Error(err)) log.error("", err.message);
|
|
log.warn("", "fast search endpoint is not available, using old search.");
|
|
}
|
|
};
|
|
|
|
const searchOld = async function(keyword) {
|
|
// all endpoint
|
|
try {
|
|
const results = await npmFetch.json("/-/all", getNpmFetchOptions());
|
|
log.verbose("endpoint.all", results);
|
|
let objects = [];
|
|
if (results) {
|
|
if (Array.isArray(results)) {
|
|
// results is an array of objects
|
|
objects = results;
|
|
} else {
|
|
// results is an object
|
|
if ("_updated" in results) delete results["_updated"];
|
|
objects = Object.values(results);
|
|
}
|
|
}
|
|
// prepare rows
|
|
const rows = objects.map(pkg => {
|
|
let name = pkg.name;
|
|
let version = getLatestVersion(pkg);
|
|
let date =
|
|
pkg.time && pkg.time.modified ? pkg.time.modified.split("T")[0] : "";
|
|
let item = [name, version, date, ""];
|
|
return item;
|
|
});
|
|
// filter keyword
|
|
const klc = keyword.toLowerCase();
|
|
return rows.filter(
|
|
row => row.filter(x => x.toLowerCase().includes(klc)).length > 0
|
|
);
|
|
} catch (err) {
|
|
if (!is404Error(err)) log.error("", err.message);
|
|
log.warn("", "/-/all endpoint is not available");
|
|
}
|
|
};
|
|
|
|
const getTable = function() {
|
|
var table = new Table({
|
|
head: ["Name", "Version", "Date"],
|
|
colWidths: [42, 20, 12]
|
|
});
|
|
return table;
|
|
};
|
|
|
|
module.exports = async function(keyword, options) {
|
|
// parse env
|
|
const envOk = await parseEnv(options, { checkPath: false });
|
|
if (!envOk) return 1;
|
|
let table = getTable();
|
|
// search endpoint
|
|
let results = await searchEndpoint(keyword);
|
|
// search old search
|
|
if (results === undefined) {
|
|
results = (await searchOld(keyword)) || [];
|
|
}
|
|
// search upstream
|
|
// if (env.upstream) {
|
|
// const upstreamResults =
|
|
// (await searchEndpoint(keyword, env.upstreamRegistry)) || [];
|
|
// results.push(...upstreamResults);
|
|
// }
|
|
if (results && results.length) {
|
|
results.forEach(x => table.push(x.slice(0, -1)));
|
|
console.log(table.toString());
|
|
} else log.notice("", `No matches found for "${keyword}"`);
|
|
return 0;
|
|
};
|