@adamlui/geolocate
Version:
Fetch IP geolocation data from the CLI.
52 lines (44 loc) • 2.37 kB
JavaScript
const language = require('./language'),
settings = require('./settings')
module.exports = {
async cli() {
Object.assign(globalThis.cli ??= {}, require(`${env.paths.libData}/package-data.json`))
cli.msgs = await language.getMsgs('en')
cli.msgs = await language.getMsgs(cli.lang = settings.load('uiLang') || (
env.modes.debug ? language.generateRandomLang({ excludes: ['en'] }) : language.getSysLang() ))
cli.urls.cliDocs ||= `${cli.urls.docs}/#-command-line-usage`
settings.load() // all keys to cli.config
},
async configFile(filename = settings.configFilename) {
const fs = require('fs'),
path = require('path'),
paths = { target: path.resolve(process.cwd(), filename) }
if (fs.existsSync(paths.target)) // use existing config file
return log.warn(`${cli.msgs.warn_configFileExists}:`, paths.target)
if (fs.existsSync(paths.src = path.resolve(__dirname, `${env.paths.libData}/${filename}`)))
fs.copyFileSync(paths.src, paths.target) // use found template
else { // use jsDelivr copy
const jsdURL = `${require('./jsdelivr').getPkgVerURL()}/${filename}`
log.data(`${cli.msgs.info_fetchingRemoteConfigFrom} ${jsdURL}...`)
try {
const data = require('./data'),
resp = await data.fetch(jsdURL)
if (resp.ok) data.atomicWrite(paths.target, await resp.text())
else return log.warn(`${cli.msgs.warn_remoteConfigNotFound}: ${jsdURL} (${resp.status})`)
} catch (err) {
return log.warn(`${cli.msgs.warn_remoteConfigFailed}: ${jsdURL} ${err.message}`) }
}
log.success(`${cli.msgs.info_configFileCreated}: ${paths.target}\n`)
log.tip(`${cli.msgs.tip_editToSetDefaults}.`)
log.tip(`${cli.msgs.tip_cliArgsPrioritized}.`)
},
env() {
Object.assign(globalThis.env ??= {}, {
args: process.argv.slice(2),
modes: { dev: /[\\/]src(?:[\\/]|$)/i.test(__dirname) },
supports: { unicode: require('is-unicode-supported').default() }
})
env.modes.debug = env.args.some(arg => /^--?(?:V|debug(?:[-_]?mode)?)$/.test(arg))
env.paths = { libData: `../../${ env.modes.dev ? '..' : 'data' }` }
}
}