const https = require('https') const spawn = require('child_process').spawn const exec = require('child_process').exec function download(url) { return new Promise((resolve,reject) => { https.get(url,(res) => { let data = "" res.on("data", (chunk) => data += chunk) res.on("end", () => resolve(data)) }).on("error", (error) => reject(error)) }) } function section(title) { let border = '-'.repeat(8 + title.length) let middle = '--- ' + title + ' ---' console.log() console.log() console.log() console.log(border) console.log(middle) console.log(border) console.log() } async function with_cwd(dir,fn) { let cwd = process.cwd() process.chdir(dir) let out = await fn() process.chdir(cwd) return out } function run(cmd,args) { let out = '' return new Promise((resolve, reject) => { console.log(`Calling '${cmd} ${args.join(' ')}'`) let proc = spawn(cmd,args,{stdio:'inherit', shell:true}) proc.on('exit', (code) => { if (code) process.exit(code) resolve(out) }) }) } function run_read(cmd,args) { let out = '' return new Promise((resolve, reject) => { let proc = spawn(cmd,args,{shell:true}) proc.stderr.pipe(process.stderr) proc.stdout.on('data', (data) => { out += data }) proc.on('exit', (code) => { if (code) process.exit(code); resolve(out) }) }) } async function check_version (name,required,cfg) { if (!cfg) { cfg = {} } let version = await run_read(name,['--version']) version = version.trim() if (cfg.preprocess) { version = cfg.preprocess(version) } if (cfg.silent !== true) { console.log(`Checking if '${name}' version is '${required}'.`) } if (version != required) { throw `[ERROR] The '${name}' version '${version}' does not match the required one '${required}'.` } } async function get_npm_info (name) { let info = await run_read('npm',['info',name,'--json']) return JSON.parse(info) } async function get_npm_lts_version_of (name) { let info = await get_npm_info(name) version = info['dist-tags'].lts return version } async function get_node_dist_index() { let index = await download('https://nodejs.org/dist/index.json') return JSON.parse(index) } async function get_node_lts_version() { let index = await get_node_dist_index() let newest = null for (let entry of index) { if (entry.lts !== false) { newest = entry break } } if (!newest) { throw "Cannot fetch the info about node LTS version." } let node = newest.version let npm = newest.npm return [node,npm] } module.exports = {section,run,run_read,check_version,get_npm_info,get_npm_lts_version_of,with_cwd, get_node_dist_index,get_node_lts_version}