tla
Version:
Scan npm for available three-letter acronyms
60 lines (50 loc) • 1.4 kB
JavaScript
module.exports = {
getNames,
checkName
}
const difference = require('lodash.difference')
const fs = require('fs')
const get = require('simple-get')
const packageNames = require('all-the-package-names').filter(name => name === name.toLowerCase())
const parallelLimit = require('run-parallel-limit')
const path = require('path')
const LIMIT = 10
const REGISTRY_URL = 'https://registry.npmjs.com/'
const DICTIONARY = fs.readFileSync(path.join(__dirname, 'dictionary.txt'))
.toString()
.toLowerCase()
.split('\n')
const POSSIBLE_NAMES = difference(DICTIONARY, packageNames)
function getNames (opts, next) {
if (opts.online) {
verifyAvailable(POSSIBLE_NAMES, next)
} else {
POSSIBLE_NAMES.forEach(name => next(null, name))
}
}
function checkName (name, opts, next) {
const desiredNames = [name]
if (opts.online) {
verifyAvailable(desiredNames, next)
} else {
desiredNames.forEach(name => next(null, name))
}
}
function verifyAvailable (names, next) {
const tasks = names.map(function (name) {
return function (cb) {
get.head(REGISTRY_URL + name, function (err, res) {
if (err) return cb(err)
if (res.statusCode === 404) next(null, name)
res.resume() // consume the stream
cb(null)
})
}
})
parallelLimit(tasks, LIMIT, function (err) {
if (err) {
next(err)
process.exit(1)
}
})
}