var cli = { | var cli = { | ||||
nodeShellExec | nodeShellExec | ||||
, get prompter() { | , get prompter() { | ||||
const clii = readline.createInterface({ input: process.stdin, output: process.stdout }); | |||||
clii.ask = function(q){ | |||||
return new Promise((resolve, reject)=>{ | |||||
clii.question(q, (answer)=>{ resolve(answer) }) | |||||
}) | |||||
var prompt_interface = { | |||||
ask : function(q){ | |||||
// Needs to be serialized. Parallel asks are not possible. | |||||
const clii = readline.createInterface({ input: process.stdin, output: process.stdout }); | |||||
return new Promise((resolve, reject)=>{ | |||||
clii.question(q, (answer)=>{ | |||||
clii.close(); | |||||
resolve(answer) | |||||
}) | |||||
}) | |||||
} | |||||
} | } | ||||
return clii | |||||
return prompt_interface | |||||
} | } | ||||
, prompt | , prompt | ||||
} | } |
var BUILD_VERSION = '[VI]Version: {version} - built on {date}[/VI]'; | |||||
var runtimestamp = (new Date()).getTime(); | |||||
function getVersion() { return BUILD_VERSION; } | |||||
WScript.echo(getVersion()) | |||||
var fso = new ActiveXObject('Scripting.FileSystemObject'); | |||||
var shell = new ActiveXObject('shell.application'); | |||||
function forEach(eachFn){ | |||||
for(var i=0; i<this.length; i++) eachFn(this[i]) | |||||
} | |||||
var console = { log : function(m) {WScript.Echo(m)}, error : function(m) {WScript.Echo(m)} } | |||||
var Promise = function(fn){ | |||||
// Detect error | |||||
var state = Promise.PENDING; | |||||
var chain = []; | |||||
chain.forEach = forEach; | |||||
function reject(e){ | |||||
if(state !== Promise.PENDING) { console.error ('Error : Promise Rejection can only be called once')} | |||||
var __i = 0; | |||||
var __e = e; | |||||
do { | |||||
for(var i = __i; i < chain.length; i++, __i = i) if(chain[i].isCatch) break; | |||||
try { | |||||
for(var i = __i; i < chain.length; i++, __i = i) if(chain[i].isCatch) { chain[i](__e); break; } | |||||
__e = null; | |||||
} | |||||
catch(e){ __e = e} | |||||
} while(__e) | |||||
do { | |||||
try { for(var i = __i; i < chain.length; i++, __i = i) if(!chain[i].isCatch) { p.result = chain[i](p.result); } } | |||||
catch(e){ | |||||
do { | |||||
try { | |||||
for(var i = __i; i < chain.length; i++, __i = i) if(chain[i].isCatch) { chain[i](__e); break; } | |||||
__e = null; | |||||
} | |||||
catch(e){ __e = e} | |||||
} while(__e) | |||||
} | |||||
} while ( __i < chain.length ) | |||||
state = Promise.REJECTED; | |||||
} | |||||
function resolve(result){ | |||||
if(state !== Promise.PENDING) { console.error ('Error : Promise Rejection can only be called once')} | |||||
// console.log('main promise resolve... ' + chain.length ) | |||||
p.result = result; | |||||
var __i = 0; | |||||
do { | |||||
try { for(var i = __i; i < chain.length; i++, __i = i) if(!chain[i].isCatch) { p.result = chain[i](p.result); } } | |||||
catch(e){ | |||||
var __e = e; | |||||
do { | |||||
try { | |||||
for(var i = __i; i < chain.length; i++, __i = i) if(chain[i].isCatch) { chain[i](__e); break; } | |||||
__e = null; | |||||
} | |||||
catch(e){ __e = e} | |||||
} while(__e) | |||||
} | |||||
} while ( __i < chain.length ) | |||||
state = Promise.FULFILLED; | |||||
}; | |||||
var p = { | |||||
then : function(thenfn){ | |||||
thenfn.isThen = true | |||||
chain.push(thenfn) | |||||
return p; | |||||
} | |||||
, pcatch : function(catchfn) { | |||||
catchfn.isCatch = true | |||||
chain.push(catchfn) | |||||
return p; | |||||
} | |||||
, start : function(){ | |||||
try { fn(resolve, reject) } | |||||
catch(e){ reject(e) } | |||||
} | |||||
} | |||||
return p | |||||
} | |||||
Promise.all = function(arr){ | |||||
arr.forEach = forEach; | |||||
var results = []; | |||||
return new Promise(function(resolve, reject){ | |||||
arr.forEach(function(p){ results.push(waitForResult(p))} ) | |||||
resolve(results) | |||||
}); | |||||
} | |||||
any = function(arr){ | |||||
arr.forEach = forEach; | |||||
var results = []; | |||||
return new Promise(function(resolve, reject){ | |||||
arr.forEach(function(p){ results.push(waitForResult(p))} ) | |||||
resolve(results) | |||||
}); | |||||
} | |||||
Promise.PENDING = 1 | |||||
Promise.FULFILLED = 2 | |||||
Promise.REJECTED = 3 | |||||
function waitForResult(p){ | |||||
while(p.state === Promise.PENDING) WScript.Sleep(500) | |||||
return true | |||||
} | |||||
var stampedFilePfx = function(date) { | |||||
return date.getFullYear() + | |||||
('0' + (date.getMonth() + 1)).slice(-2) + | |||||
('0' + date.getDate()).slice(-2) + | |||||
('0' + date.getHours()).slice(-2) + | |||||
('0' + date.getMinutes()).slice(-2) + | |||||
('0' + date.getSeconds()).slice(-2); | |||||
} | |||||
function nodeShellExec(cmd, cargs){ | |||||
var p = new Promise(function(resolve, reject){ | |||||
var runFile = selectedinstance.root + '\\' + stampedFilePfx(new Date()) + cmd + cargs + "out.txt"; | |||||
// console.log(runFile) | |||||
shell.ShellExecute('cmd', '/c ' + cmd + ' ' + cargs + " > " + runFile , "", "", 1); | |||||
// var WshFinished = 1 | |||||
// var WshFailed = 2 | |||||
// var strOutput = 'Did not work' | |||||
// switch(shell.Status){ | |||||
// case WshFinished : | |||||
// strOutput = oShell.StdOut.ReadAll; | |||||
// break; | |||||
// case WshFailed : | |||||
// strOutput = oShell.StdErr.ReadAll; | |||||
// break; | |||||
// } | |||||
// WScript.Echo(strOutput) | |||||
while(!fso.FileExists(runFile)) { | |||||
WScript.Sleep(500) | |||||
} | |||||
var objFileToRead = fso.OpenTextFile(runFile,1) | |||||
var strFileText = objFileToRead.ReadAll() | |||||
objFileToRead.Close() | |||||
fso.DeleteFile(runFile) | |||||
resolve(strFileText) | |||||
}) | |||||
return p; | |||||
} | |||||
// Detect or specify install directory. | |||||
var selectedinstance = { | |||||
root : fso.GetAbsolutePathName(".") | |||||
} | |||||
var downloadsdir = selectedinstance.root + '/Downloads'; | |||||
var fs = { | |||||
writeFileSync : function(filepath, text) { | |||||
WScript.echo(filepath) | |||||
var fh = fso.CreateTextFile(filepath, true); | |||||
fh.WriteLine(text); | |||||
fh.Close(); | |||||
}, | |||||
existsSync : function(path){ | |||||
// fso.FileExists(path) | |||||
return fso.FolderExists(path) | |||||
} | |||||
, mkdirSync : function(path) { | |||||
fso.CreateFolder(path) | |||||
} | |||||
} | |||||
var path = { | |||||
dirname : function(filepath) { | |||||
var normalized = filepath.replace(/\//g,'\\'); | |||||
var li = normalized.lastIndexOf("\\") | |||||
if( li > -1) { | |||||
return normalized.substring(0, li) | |||||
} | |||||
} | |||||
} | |||||
function ensureDirectoryExistence(filePath) { | |||||
var dirname = path.dirname(filePath); | |||||
if (fs.existsSync(dirname)) { | |||||
return filePath; | |||||
} | |||||
ensureDirectoryExistence(dirname); | |||||
fs.mkdirSync(dirname); | |||||
return filePath; | |||||
} | |||||
var getTaskCheckExists = function(command, options) { | |||||
options = options || {} | |||||
return function() { | |||||
var p = nodeShellExec.apply(null, ['where', [command]]) | |||||
if (options.ignorefailures) { | |||||
return p.then(function(v) { | |||||
// WScript.Echo('firstThen ' + v); | |||||
return v }).pcatch( function(e) { // Ignore. Not a major error. | |||||
return false; | |||||
}) | |||||
} | |||||
else return p.then(function() { | |||||
// WScript.Echo('firstThen ddd'); | |||||
return v }); | |||||
} | |||||
} | |||||
function verifyAndInstallPrerequisites() { | |||||
fs.writeFileSync(ensureDirectoryExistence(downloadsdir + '/readme.txt'), getVersion() + ' Your local downloads for this instance'); | |||||
var downloadbatch = | |||||
"::************************************************************************** \ | |||||
:Download_ <url> <File> \ | |||||
Powershell.exe ^ \ | |||||
$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'; ^ \ | |||||
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols; ^ \ | |||||
(New-Object System.Net.WebClient).DownloadFile('%1','%2') \ | |||||
exit /b \ | |||||
::**************************************************************************"; | |||||
fs.writeFileSync('download.bat', downloadbatch); | |||||
var downloadtasks = []; | |||||
var installtasks = []; | |||||
prerequisites.forEach(function(preq) { | |||||
var p = null; | |||||
downloadtasks.push( | |||||
p = preq.exists().then(function(exists) { | |||||
if (exists) console.log( preq.shellcmd + ' exists'); | |||||
else { | |||||
console.log(preq.shellcmd + ' is not installed'); | |||||
return preq.preinstallsteps().then(function(){ | |||||
installtasks.push(task.install); | |||||
}) | |||||
} | |||||
} | |||||
)); | |||||
p.start() | |||||
}); | |||||
return Promise.all(downloadtasks).then(function(){ return any(installtasks) }) | |||||
} | |||||
var prerequisites = [ | |||||
{ | |||||
shellcmd: 'git', | |||||
url: 'https://github.com/git-for-windows/git/releases/download/v2.31.0.windows.1/Git-2.31.0-64-bit.exe' | |||||
, installer: 'Git-2.31.0-64-bit.exe' | |||||
, installcmd: ['cmd', ['/c', 'start', | |||||
'/WAIT', downloadsdir + '/' + 'Git-2.31.0-64-bit.exe' | |||||
, '/VERYSILENT' | |||||
// , '/MERGETASKS=!runcode' // This is required only for vscode... | |||||
]] | |||||
, preinstallsteps: function() { | |||||
var prompt = cli.prompter; | |||||
var steps = [ | |||||
function(){ | |||||
if (!existsSync(downloadsdir + '/' + this.installer)) { | |||||
return nodeShellExec(selectedinstance.root + '/.elxr/run-${runtimestamp}/download.bat', [this.url, downloadsdir + '/' + this.installer]) | |||||
} | |||||
else return Promise.resolve(true) | |||||
} | |||||
] | |||||
var prompts = [ | |||||
function() {prompt.ask('git user name : ( <= ' + gitUser + ' )').then( function(user){ gitUser = user; })} | |||||
, function() { prompt.ask('git email : ( <= ' + gitEmail + ' )').then(function(email) { gitEmail = email; })} | |||||
] | |||||
return any([any(steps), any(prompts)]) | |||||
} | |||||
, installsteps: function () { | |||||
return any([this.installcmd].map(callsheltask)) | |||||
} | |||||
, postinstallsteps: function(){ | |||||
var prompt = cli.prompter; | |||||
var gitUser = 'guest'; | |||||
var gitEmail = 'guest@bbh.org.in'; | |||||
var prompts = []; | |||||
prompts.push( | |||||
function(){ | |||||
var choices = { 0 : 'guest', 1 : 'chessdemo' } | |||||
return cli.prompt(choices, 'git user name').then(function(gituser) { gitUser = gituser}) | |||||
} | |||||
) | |||||
prompts.push( | |||||
function(){ | |||||
var choices = { 0 : 'guest@bbh.org.in', 1 : 'chessdemo@bbh.org.in' } | |||||
return cli.prompt(choices, 'git user email').then(function(gitemail) { gitEmail = gitemail}) | |||||
} | |||||
) | |||||
return any(prompts).then(function(){ | |||||
var steps = [ | |||||
['git', ['config', '--global', '--add', 'user.name', gitUser]] | |||||
, ['git', ['config', '--global', '--add', 'user.email', gitEmail]] | |||||
] | |||||
return any(steps.map(callsheltask)).then(function(){ | |||||
}) | |||||
}); | |||||
} | |||||
, install: function () { | |||||
return any([ /*this.preinstallsteps,*/ this.installsteps.bind(this), this.postinstallsteps.bind(this)]) | |||||
} | |||||
, verifyAndInstall : function(){ | |||||
var self = this; | |||||
return self.exists().then( function(exits) { | |||||
if(exists) return self.getUser(null, self.postinstallsteps.bind(self)) | |||||
else return self.install(); | |||||
}) | |||||
} | |||||
, exists : function(next){ | |||||
var self = this; | |||||
return getTaskCheckExists(this.shellcmd, { ignorefailures: true })().then(function(exists) { | |||||
if(exists && exists.indexOf(self.shellcmd) > -1 ) { | |||||
// console.log(exists + ' git exists') | |||||
return true; | |||||
} | |||||
else return false | |||||
}) | |||||
} | |||||
, getUser : function(repo, onNoResult){ | |||||
onNoResult = onNoResult || function(){return false} | |||||
var globalOrLocal = '--global'; | |||||
if(!repo) globalOrLocal = '--global'; | |||||
else globalOrLocal = '--local' | |||||
return any([['git', ['config', globalOrLocal, '--get-all', 'user.name']]].map(callsheltask)).then(function(result){ | |||||
// not yet configured. | |||||
if(!result.success) return onNoResult() | |||||
else { | |||||
var users = result.messages[0].trim().split('\n'); | |||||
if(users.length === 0 || | |||||
users.length === 1 && users[0] === 'guest') { | |||||
return onNoResult() | |||||
} | |||||
else return users[0]; // PB : TODO == We should probably prompt with all the users available for selection ! | |||||
} | |||||
}) | |||||
.pcatch(function(e){ | |||||
console.log(e) | |||||
return onNoResult() | |||||
}) | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
shellcmd: 'node', | |||||
url: 'https://nodejs.org/dist/v14.16.0/node-v14.16.0-x64.msi' | |||||
, installer: 'node-v14.16.0-x64.msi' | |||||
, installcmd: ['MSIEXEC.exe', ['/i' | |||||
, downloadsdir + '/' + 'node-v14.16.0-x64.msi' | |||||
, 'ACCEPT=YES', '/passive']] | |||||
, install : function() { return any([this.installcmd].map(callsheltask)) } | |||||
, exists : function(next){ | |||||
var self = this; | |||||
return getTaskCheckExists(this.shellcmd, { ignorefailures: true })().then(function(exists) { | |||||
if(exists && exists.indexOf(self.shellcmd) > -1 ) { | |||||
// console.log(self.shellcmd + ' ' + exists + ' node exists') | |||||
return true | |||||
} | |||||
else { | |||||
// console.log(self.shellcmd + ' ' + exists + ' node doesnt exist') | |||||
return false | |||||
} | |||||
}) | |||||
} | |||||
, preinstallsteps : function(){ | |||||
return true; | |||||
} | |||||
} | |||||
] | |||||
prerequisites.forEach = forEach; | |||||
verifyAndInstallPrerequisites() |
const cliargs = utils.cliargs; | const cliargs = utils.cliargs; | ||||
const processedArgs = cliargs(process.argv.slice(2)); | const processedArgs = cliargs(process.argv.slice(2)); | ||||
console.dir(processedArgs) | console.dir(processedArgs) | ||||
// PB : TODO -- defaults for valuless arguments if passed. | |||||
// Object.keys(processedArgs).forEach(a=>{ | |||||
// if(Object.prototype.toString.call(processedArgs[a]) === '[object Undefined]' || !processedArgs[a]) || trim(processedArgs[a])) == '') { | |||||
// } | |||||
// }) | |||||
var globSync = require('glob').sync; | var globSync = require('glob').sync; | ||||
var ENV = Object.assign({}, process.env); // Shallow clone it. | var ENV = Object.assign({}, process.env); // Shallow clone it. | ||||
} | } | ||||
else { | else { | ||||
// PB : TODO -- Rename op['runas'] to 'elevate' | // PB : TODO -- Rename op['runas'] to 'elevate' | ||||
return op['runas']().then(() => { return true; }) | |||||
var __runasresult = null; | |||||
return op['runas']().then((r) => { return __runasresult = r; }) | |||||
.catch((e) => { | .catch((e) => { | ||||
console.error(e) | console.error(e) | ||||
}) | }) | ||||
.finally(() => { | .finally(() => { | ||||
fs.unlinkSync('run.done') | |||||
if(__runasresult && !__runasresult.skipped) fs.unlinkSync('run.done') | |||||
if (!processedArgs.runas) { return tasdef.regularpulltasks(); } | if (!processedArgs.runas) { return tasdef.regularpulltasks(); } | ||||
}) | }) | ||||
} | } | ||||
} | } | ||||
else { | else { | ||||
console.warn('No branch was specified detecting from working client.') | console.warn('No branch was specified detecting from working client.') | ||||
var pullCmd = gitops.getdiscoverbranchcmd(repo) | |||||
// First check if working client exits. | |||||
// if (existsSync(instanceroot + '/' + repo)) { | |||||
var pullCmd = gitops.getdiscoverbranchcmd(repo) | |||||
// } | |||||
// else performpull | |||||
} | } | ||||
// var pullCmd = ['pullall', [], { cwd : repo }] | // var pullCmd = ['pullall', [], { cwd : repo }] | ||||
if (useGitPull) pullCmd = ['git', ['pull'], { | if (useGitPull) pullCmd = ['git', ['pull'], { | ||||
}) | }) | ||||
} | } | ||||
, 'runas': () => { | , 'runas': () => { | ||||
if(processedArgs.skipelevated) return Promise.resolve({ skipped : true }); | |||||
console.log('Testing Elevation') | console.log('Testing Elevation') | ||||
if (__isElevated) { | if (__isElevated) { | ||||
// git remote equivalents... | // git remote equivalents... | ||||
// git branch --set-upstream-to=elixir-unc/master master | // git branch --set-upstream-to=elixir-unc/master master | ||||
// git push --set-upstream elixir-unc branch.. | // git push --set-upstream elixir-unc branch.. | ||||
, 'remote': (args) => { | |||||
// Subcommands! | |||||
if(!processedArgs.v) return false; | |||||
var serial_perform = (repo) => { | |||||
var options = { cwd: instanceroot + '/' + repo } | |||||
return [ | |||||
['git', ['remote', '-v'], options] | |||||
] | |||||
} | |||||
var x = (args) => { | |||||
var tasq = () => { | |||||
// console.log(args) | |||||
return nodeShellExec.apply(null, args).catch(e => { | |||||
// We continue on failure. | |||||
console.error(tasq.toString()) | |||||
}) | |||||
} | |||||
tasq.toString = function(){ | |||||
return JSON.stringify(args) | |||||
} | |||||
return tasq; | |||||
} | |||||
var perform = (dir) => { | |||||
return any(serial_perform(dir.name).map(x)) | |||||
} | |||||
dirs(perform) | |||||
} | |||||
, 'remote set-url': (args) => { | , 'remote set-url': (args) => { | ||||
// git remote set-url elixir-unc //10.10.5.60/gitrepo/chess/bbhverse | // git remote set-url elixir-unc //10.10.5.60/gitrepo/chess/bbhverse | ||||
var __args = { | var __args = { | ||||
} | } | ||||
var perform_git_seturl = (dir) => { | var perform_git_seturl = (dir) => { | ||||
op['is-git-repo'](dir).then((logEntry) => { | op['is-git-repo'](dir).then((logEntry) => { | ||||
any(serial_perform_git_seturl(dir.name).map(x)) | |||||
return any(serial_perform_git_seturl(dir.name).map(x)) | |||||
}).catch((e) => { | }).catch((e) => { | ||||
// console.log('Failed : ' + dir.name) | // console.log('Failed : ' + dir.name) | ||||
}) | }) | ||||
// Usage : | // Usage : | ||||
// elxr pull -- Defaults to run config | // elxr pull -- Defaults to run config | ||||
return elxr.getpulltask()() | |||||
return elxr.getpulltask(selectedinstance)() | |||||
} | } | ||||
, 'isInstalled': () => { | , 'isInstalled': () => { | ||||
return nodeShellExec('where', [processedArgs._[1]], { inherit: true }).then(() => { | return nodeShellExec('where', [processedArgs._[1]], { inherit: true }).then(() => { | ||||
} | } | ||||
, getpulltask(def){ | , getpulltask(def){ | ||||
// def can be an instance config | |||||
// Or an object with many repos and elevated repos | |||||
// Or a single repo ( Either Elevated or normal. ) | |||||
def = def || { | def = def || { | ||||
requiresElevation : true, | |||||
reqularRepos : gitRepos, | |||||
elevatedRepos : elevatedRunasRepos | |||||
repos : repomanifest.repos, | |||||
elevated : repomanifest.elevated | |||||
} | |||||
var elevatedpulltasks = null; | |||||
if(def.repo) { | |||||
// Single repo case. | |||||
if(def.repo.requiresElevation) { | |||||
elevatedpulltasks = function() { | |||||
return performPull(def.repo).then(() => { | |||||
return true; | |||||
}).catch((e) => { | |||||
console.error(e) | |||||
}) | |||||
} | |||||
return | |||||
} | |||||
else { | |||||
var regularpulltasks = function(){ | |||||
var pendingpulls = []; | |||||
pendingpulls.push(performPull(def.repo)) | |||||
return Promise.all(pendingpulls).finally(Traq.finally) | |||||
} | |||||
} | |||||
if(elevatedpulltasks) return getTaskWithElevation( { elevatedpulltasks, regularpulltasks} ) | |||||
else return getTaskWithoutElevation({ regularpulltasks}) | |||||
} | } | ||||
console.log(`-------------------Processing pull for : ${def.repo} ${def.branch}`) | |||||
// console.log(`-------------------Processing pull for : ${def.repo} ${def.branch}`) | |||||
console.dir(def) | console.dir(def) | ||||
var env = Object.assign({}, process.env); // Shallow clone it. | var env = Object.assign({}, process.env); // Shallow clone it. | ||||
var useGitPull = processedArgs.useGitPull || false; | var useGitPull = processedArgs.useGitPull || false; | ||||
if(def.elevatedRepos || def.reqularRepos) { | |||||
if(def.elevatedRepos) def.requiresElevation = true; | |||||
if(def.elevated || def.repos) { | |||||
if(def.elevated) def.requiresElevation = true; | |||||
else delete def.requiresElevation; | else delete def.requiresElevation; | ||||
} | } | ||||
else { | else { | ||||
if(def.requiresElevation) def.elevatedRepos = [def] | |||||
else def.reqularRepos = [def] | |||||
if(def.requiresElevation) def.elevated = [def] | |||||
else def.repos = [def] | |||||
} | } | ||||
var elevatedpulltasks = null; | |||||
var regularpulltasks = function(){ return Promise.resolve(true) } | var regularpulltasks = function(){ return Promise.resolve(true) } | ||||
if(def.elevatedRepos){ | |||||
if(def.elevated){ | |||||
elevatedpulltasks = function() { | elevatedpulltasks = function() { | ||||
return any(def.elevatedRepos.map((def) => performPull(def.repo))).then(() => { | |||||
return any(def.elevated.map((def) => performPull(def.repo))).then(() => { | |||||
return true; | return true; | ||||
}).catch((e) => { | }).catch((e) => { | ||||
console.error(e) | console.error(e) | ||||
}) | }) | ||||
} | } | ||||
} | } | ||||
if(def.reqularRepos) { | |||||
if(def.repos) { | |||||
var regularpulltasks = function(){ | var regularpulltasks = function(){ | ||||
var pendingpulls = []; | var pendingpulls = []; | ||||
def.reqularRepos.forEach((def) => { pendingpulls.push(performPull(def.repo)) }) | |||||
def.repos.forEach((def) => { pendingpulls.push(performPull(def.repo)) }) | |||||
return Promise.all(pendingpulls).finally(Traq.finally) | return Promise.all(pendingpulls).finally(Traq.finally) | ||||
} | } | ||||
} | } | ||||
// The main elxr cli process | // The main elxr cli process | ||||
function elxrworker() { | function elxrworker() { | ||||
var subcommandlabels = { | var subcommandlabels = { | ||||
remote : `remote ${processedArgs._[1]}` | |||||
remote : (`remote ${processedArgs._[1] || ''}`).trim() | |||||
} | } | ||||
var __runcmd = function (label) { | var __runcmd = function (label) { | ||||
Warning : Cannot locate your preferred configuration since it was not specified | Warning : Cannot locate your preferred configuration since it was not specified | ||||
You should fork the default chess configuration to customize and make it | You should fork the default chess configuration to customize and make it | ||||
your own instance with a named config as | your own instance with a named config as | ||||
{{yourowninstancename}}-config-{{yourcurrentenvironment}} | |||||
{{yourowninstancename}}-config-{{yourchosenenvironment}} | |||||
And then run this tool as follows | And then run this tool as follows | ||||
NODE_ENV={{yourenvironment}} elxr i {{yourowninstancename}} | |||||
NODE_ENV={{yourchosenenvironment}} elxr i {{yourowninstancename}} | |||||
OR | OR | ||||
Run this tool with the following command to use a quick start default. | Run this tool with the following command to use a quick start default. | ||||
node elxr --default | |||||
elxr --default | |||||
OR | OR | ||||
Choose the the option to create a new instance for you interactively. | |||||
Choose one of the options below to run interactively. | |||||
We will run your choice of default or create your own at the next prompt. | |||||
We will run your choice at the next prompt. | |||||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||||
`)) | `)) | ||||
var prompt = cli.prompter; | var prompt = cli.prompter; | ||||
q) Quit | q) Quit | ||||
Default <= d | Default <= d | ||||
: `).then((choice) => { | : `).then((choice) => { | ||||
prompt.close(); | |||||
if (choice && choice === 'd' || !choice) { | if (choice && choice === 'd' || !choice) { | ||||
processedArgs._[0] = 'i' | processedArgs._[0] = 'i' | ||||
selectedinstance.instanceName = processedArgs._[1] = processedArgs._[1] || 'chess' | selectedinstance.instanceName = processedArgs._[1] = processedArgs._[1] || 'chess' | ||||
} | } | ||||
return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposerver || selectedinstance.reposervers[0]} ) : `).then(function (reposerver) { | return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposerver || selectedinstance.reposervers[0]} ) : `).then(function (reposerver) { | ||||
p1.close() | |||||
selectedinstance.reposerver = reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in' | selectedinstance.reposerver = reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in' | ||||
}) | }) | ||||
}) | }) | ||||
else processedArgs._[0] = cmd | else processedArgs._[0] = cmd | ||||
return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposerver || selectedinstance.reposervers[0]} ) : `).then(function (reposerver) { | return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposerver || selectedinstance.reposervers[0]} ) : `).then(function (reposerver) { | ||||
selectedinstance.reposerver = reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in' | selectedinstance.reposerver = reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in' | ||||
p1.close() | |||||
}) | }) | ||||
}) | }) | ||||
}) | }) | ||||
}) | }) | ||||
} | } | ||||
var mergeObjByKey = function(arrOfObjs, keyName) { | |||||
var keyedDistinct = {} | |||||
var distinctArrOfObjs = [] | |||||
arrOfObjs.forEach( o => { | |||||
if(o) (keyedDistinct[o[keyName]] || (keyedDistinct[o[keyName]] = []) ).push(o) | |||||
}) | |||||
Object.keys(keyedDistinct).forEach(key => { | |||||
distinctArrOfObjs.push( utils.assign( ...keyedDistinct[key] ) ) // PB : TODO -- Shallow use utils.assign | |||||
}) | |||||
return distinctArrOfObjs; | |||||
} | |||||
var cacheWriteInstanceConfig = function(chessinstances){ | |||||
var instanceName = chessinstances['current_run'].instanceName; | |||||
var node_env = chessinstances['current_run'].node_env; | |||||
chessinstances[instanceName][node_env].repos = mergeObjByKey(chessinstances[instanceName][node_env].repos, 'repo') ; | |||||
chessinstances[instanceName][node_env].elevated = mergeObjByKey(chessinstances[instanceName][node_env].elevated, 'repo') ; | |||||
fs.writeFileSync(instanceroot + '/chessinstances.js', 'module.exports = ' + JSON.stringify(chessinstances, null, 2) + '', { 'flag': 'w' }) | |||||
} | |||||
var acquireConfig = function (selected, chessinstances) { | var acquireConfig = function (selected, chessinstances) { | ||||
var configrepo = selected.instanceName + '-config-' + selected.node_env; | var configrepo = selected.instanceName + '-config-' + selected.node_env; | ||||
chessinstances[selected.instanceName][selected.node_env] = chessinstances[selected.instanceName][selected.node_env] || {} | chessinstances[selected.instanceName][selected.node_env] = chessinstances[selected.instanceName][selected.node_env] || {} | ||||
chessinstances['current_run'] = { instanceName: selected.instanceName, node_env: selected.node_env } | chessinstances['current_run'] = { instanceName: selected.instanceName, node_env: selected.node_env } | ||||
// Config from server always override merges into selection ecept for the current selection. | // Config from server always override merges into selection ecept for the current selection. | ||||
// PB : TODO -- utils.assign Array merges are non-distinct... | |||||
selectedinstance = utils.assign(chessinstances[selected.instanceName][selected.node_env], selected, repomanifest) | selectedinstance = utils.assign(chessinstances[selected.instanceName][selected.node_env], selected, repomanifest) | ||||
fs.writeFileSync(instanceroot + '/chessinstances.js', 'module.exports = ' + JSON.stringify(chessinstances, null, 2) + '', { 'flag': 'w' }) | |||||
// chessinstances[selectedinstance.instanceName][selectedinstance.node_env] = selectedinstance; | |||||
cacheWriteInstanceConfig(chessinstances) | |||||
selectedinstance = chessinstances[selected.instanceName][selected.node_env] | |||||
// PB : TODO -- We should probably write the new server config also... | // PB : TODO -- We should probably write the new server config also... | ||||
selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... | selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... | ||||
ENV.NODE_ENV = selectedinstance.node_env; | ENV.NODE_ENV = selectedinstance.node_env; | ||||
Object.defineProperty(this, 'reposerver', { | Object.defineProperty(this, 'reposerver', { | ||||
value: reposerver, | value: reposerver, | ||||
writable: false, | writable: false, | ||||
configurable : true | |||||
configurable : true, | |||||
enumerable : true | |||||
}); | }); | ||||
return reposerver | return reposerver | ||||
}) | }) | ||||
Object.defineProperty(this, 'reposerver', { | Object.defineProperty(this, 'reposerver', { | ||||
value: reposerver, | value: reposerver, | ||||
writable: false, | writable: false, | ||||
configurable : true | |||||
configurable : true, | |||||
enumerable : true | |||||
}); | }); | ||||
return reposerver | return reposerver | ||||
} | } | ||||
() => prompt.ask(`git user name : ( <= ${gitUser} )`).then((user) => { gitUser = user; }) | () => prompt.ask(`git user name : ( <= ${gitUser} )`).then((user) => { gitUser = user; }) | ||||
, () => prompt.ask(`git email : ( <= ${gitEmail} )`).then((email) => { gitEmail = email; }) | , () => prompt.ask(`git email : ( <= ${gitEmail} )`).then((email) => { gitEmail = email; }) | ||||
] | ] | ||||
return any([any(steps), any(prompts)]).then(() => { prompt.close() }) | |||||
return any([any(steps), any(prompts)]) | |||||
} | } | ||||
, installsteps: function () { | , installsteps: function () { | ||||
return any([this.installcmd].map(callsheltask)) | return any([this.installcmd].map(callsheltask)) | ||||
Object.defineProperty(this, propName, { | Object.defineProperty(this, propName, { | ||||
value: propValue, | value: propValue, | ||||
writable: false, | writable: false, | ||||
configurable : true | |||||
configurable : true, | |||||
enumerable : true | |||||
}); | }); | ||||
return propValue | return propValue | ||||
}) | }) | ||||
// Object.defineProperty(this, propName, { | // Object.defineProperty(this, propName, { | ||||
// value: propValue, | // value: propValue, | ||||
// writable: false, | // writable: false, | ||||
// configurable : true | |||||
// configurable : true, | |||||
// enumerable : true | |||||
// }) | // }) | ||||
// return propValue; | // return propValue; | ||||
// } | // } | ||||
, configurable : true | , configurable : true | ||||
, enumerable : true | |||||
} | } | ||||
} | } | ||||
selectedinstance = Object.assign(detectedInstance, clioverrides); | selectedinstance = Object.assign(detectedInstance, clioverrides); | ||||
var todo = Promise.resolve(true); | var todo = Promise.resolve(true); | ||||
var promptkeys = { 'instanceName' : processedArgs._[1] } | |||||
var reconfirm = { | |||||
'instanceName' : selectedinstance['instanceName'] === 'chess' | |||||
} | |||||
var prompts = []; | |||||
var eachPrompt = function(k, i, a){ | |||||
// No local instances config found. We use a default initialized instance available in selectedinstance | |||||
// Confirm those that were not supplied as user choices in runtime args and proceed to reattempt. | |||||
if(promptkeys[k] && selectedinstance[k] !== promptkeys[k] || promptkeys[k] === undefined && selectedinstance[k] === undefined | |||||
|| reconfirm[k]) { | |||||
prompts.push(async ()=>{ | |||||
// PB : NOTE -- Important in async cases when this needs to be in the same state as when it was invoked. | |||||
// We take a snapshot... Shallow.. !! If required deep should be used based on use case. | |||||
// If latest altered state is required we can reerence this directly. | |||||
// var asyncthis = Object.assign(this); | |||||
Object.defineProperty(selectedinstance, k, getPromptableAsyncPropDescriptor(k, choices[k], promptkeys[k] || selectedinstance[k] )); | |||||
return await selectedinstance[k] | |||||
}) | |||||
} | |||||
delete promptkeys[k] | |||||
} | |||||
try { | try { | ||||
chessinstances = acquirelocalinstances(selectedinstance); | chessinstances = acquirelocalinstances(selectedinstance); | ||||
initinstances(chessinstances, selectedinstance) | initinstances(chessinstances, selectedinstance) | ||||
} | |||||
catch (e) { | |||||
console.error(e) | |||||
// Basic keys that must be prompted and confirmed if not supplied as cmd line args. | |||||
// PB: TODO --- This should be cmd specific interpretation of location parameters !!! | |||||
var promptkeys = { | |||||
'instanceName' : processedArgs._[1] | |||||
} | |||||
var reconfirm = { | |||||
'instanceName' : true | |||||
var instanceNameChoices = new Set(Object.keys( chessinstances) ) | |||||
instanceNameChoices.delete('current_run') | |||||
instanceNameChoices.add(selectedinstance['instanceName']) | |||||
if(promptkeys['instanceName']) instanceNameChoices.add(promptkeys['instanceName']) | |||||
var choices = { | |||||
'instanceName' : Array.from(instanceNameChoices) | |||||
, 'reposerver' : selectedinstance['reposervers'] | |||||
} | } | ||||
Object.keys(__interactve_promts).forEach(eachPrompt, __interactve_promts) | |||||
Object.keys(promptkeys).forEach(eachPrompt, promptkeys) | |||||
todo = any(prompts).then(()=>{ return selectedinstance }) | |||||
} | |||||
catch (e) { | |||||
console.error(e) // Missing chessinstances is not an error... | |||||
// No local instances config found. We use a default initialized instance available in selectedinstance | |||||
// Confirm those that were not supplied as user choices in runtime args and proceed to reattempt. | |||||
initinstances(chessinstances, selectedinstance) | initinstances(chessinstances, selectedinstance) | ||||
var instanceNameChoices = new Set(Object.keys( chessinstances) ) | var instanceNameChoices = new Set(Object.keys( chessinstances) ) | ||||
instanceNameChoices.delete('current_run') | instanceNameChoices.delete('current_run') | ||||
instanceNameChoices.add(selectedinstance['instanceName']) | instanceNameChoices.add(selectedinstance['instanceName']) | ||||
instanceNameChoices.add(promptkeys['instanceName']) | |||||
if(promptkeys['instanceName']) instanceNameChoices.add(promptkeys['instanceName']) | |||||
var choices = { | var choices = { | ||||
'instanceName' : Array.from(instanceNameChoices) | 'instanceName' : Array.from(instanceNameChoices) | ||||
, 'reposerver' : selectedinstance['reposervers'] | , 'reposerver' : selectedinstance['reposervers'] | ||||
} | } | ||||
var prompts = []; | |||||
var eachPrompt = function(k, i, a){ | |||||
if(selectedinstance[k] !== promptkeys[k] || promptkeys[k] === undefined || reconfirm[k]) { | |||||
prompts.push(async ()=>{ | |||||
// PB : NOTE -- Important in async cases when this needs to be in the same state as when it was invoked. | |||||
// We take a snapshot... Shallow.. !! If required deep should be used based on use case. | |||||
// If latest altered state is required we can reerence this directly. | |||||
// var asyncthis = Object.assign(this); | |||||
Object.defineProperty(selectedinstance, k, getPromptableAsyncPropDescriptor(k, choices[k], promptkeys[k] || selectedinstance[k] )); | |||||
return await selectedinstance[k] | |||||
}) | |||||
} | |||||
delete promptkeys[k] | |||||
} | |||||
Object.keys(__interactve_promts).forEach(eachPrompt, __interactve_promts) | Object.keys(__interactve_promts).forEach(eachPrompt, __interactve_promts) | ||||
Object.keys(promptkeys).forEach(eachPrompt, promptkeys) | Object.keys(promptkeys).forEach(eachPrompt, promptkeys) | ||||
if(!processedArgs._[0] || !selectedinstance.node_env || !selectedinstance.instanceName){ | if(!processedArgs._[0] || !selectedinstance.node_env || !selectedinstance.instanceName){ | ||||
// Weve been told what to do. | // Weve been told what to do. | ||||
todo = acquireChoices(selectedinstance) | |||||
todo = todo.then(() => { return acquireChoices(selectedinstance) }) | |||||
} | } | ||||
todo = todo.then(() => { | todo = todo.then(() => { | ||||
// Currently it retains 2*n when proc needs to be relaunched in elevated mode !!! | // Currently it retains 2*n when proc needs to be relaunched in elevated mode !!! | ||||
ensureDirectoryExistence(`${selectedinstance.root}/.elxr/run-${runtimestamp}/download.bat`) | ensureDirectoryExistence(`${selectedinstance.root}/.elxr/run-${runtimestamp}/download.bat`) | ||||
if (!skipprerequisites && !__isElevated) mainTasks.push(verifyAndInstallPrerequisites); | |||||
if (!skipprerequisites && !__isElevated || processedArgs.forceprereqs && !__isElevated ) mainTasks.push(verifyAndInstallPrerequisites); | |||||
mainTasks.push(maintask) | mainTasks.push(maintask) | ||||
return any(mainTasks); | return any(mainTasks); | ||||
}) | }) |
{ | |||||
"name": "elxr", | |||||
"version": "1.0.0", | |||||
"lockfileVersion": 1, | |||||
"requires": true, | |||||
"dependencies": { | |||||
"@rollup/plugin-commonjs": { | |||||
"version": "17.1.0", | |||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz", | |||||
"integrity": "sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==", | |||||
"dev": true, | |||||
"requires": { | |||||
"@rollup/pluginutils": "^3.1.0", | |||||
"commondir": "^1.0.1", | |||||
"estree-walker": "^2.0.1", | |||||
"glob": "^7.1.6", | |||||
"is-reference": "^1.2.1", | |||||
"magic-string": "^0.25.7", | |||||
"resolve": "^1.17.0" | |||||
} | |||||
}, | |||||
"@rollup/plugin-node-resolve": { | |||||
"version": "11.2.1", | |||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", | |||||
"integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", | |||||
"dev": true, | |||||
"requires": { | |||||
"@rollup/pluginutils": "^3.1.0", | |||||
"@types/resolve": "1.17.1", | |||||
"builtin-modules": "^3.1.0", | |||||
"deepmerge": "^4.2.2", | |||||
"is-module": "^1.0.0", | |||||
"resolve": "^1.19.0" | |||||
} | |||||
}, | |||||
"@rollup/pluginutils": { | |||||
"version": "3.1.0", | |||||
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", | |||||
"integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", | |||||
"dev": true, | |||||
"requires": { | |||||
"@types/estree": "0.0.39", | |||||
"estree-walker": "^1.0.1", | |||||
"picomatch": "^2.2.2" | |||||
}, | |||||
"dependencies": { | |||||
"estree-walker": { | |||||
"version": "1.0.1", | |||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", | |||||
"integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", | |||||
"dev": true | |||||
} | |||||
} | |||||
}, | |||||
"@types/estree": { | |||||
"version": "0.0.39", | |||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", | |||||
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", | |||||
"dev": true | |||||
}, | |||||
"@types/node": { | |||||
"version": "15.0.2", | |||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", | |||||
"integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==", | |||||
"dev": true | |||||
}, | |||||
"@types/resolve": { | |||||
"version": "1.17.1", | |||||
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", | |||||
"integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", | |||||
"dev": true, | |||||
"requires": { | |||||
"@types/node": "*" | |||||
} | |||||
}, | |||||
"ansi-styles": { | |||||
"version": "4.3.0", | |||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", | |||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", | |||||
"requires": { | |||||
"color-convert": "^2.0.1" | |||||
} | |||||
}, | |||||
"balanced-match": { | |||||
"version": "1.0.2", | |||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", | |||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" | |||||
}, | |||||
"bbhverse": { | |||||
"version": "file:../bbhverse" | |||||
}, | |||||
"brace-expansion": { | |||||
"version": "1.1.11", | |||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | |||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | |||||
"requires": { | |||||
"balanced-match": "^1.0.0", | |||||
"concat-map": "0.0.1" | |||||
} | |||||
}, | |||||
"builtin-modules": { | |||||
"version": "3.2.0", | |||||
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", | |||||
"integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", | |||||
"dev": true | |||||
}, | |||||
"chalk": { | |||||
"version": "4.1.1", | |||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", | |||||
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", | |||||
"requires": { | |||||
"ansi-styles": "^4.1.0", | |||||
"supports-color": "^7.1.0" | |||||
} | |||||
}, | |||||
"color-convert": { | |||||
"version": "2.0.1", | |||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | |||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", | |||||
"requires": { | |||||
"color-name": "~1.1.4" | |||||
} | |||||
}, | |||||
"color-name": { | |||||
"version": "1.1.4", | |||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", | |||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" | |||||
}, | |||||
"commondir": { | |||||
"version": "1.0.1", | |||||
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", | |||||
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", | |||||
"dev": true | |||||
}, | |||||
"concat-map": { | |||||
"version": "0.0.1", | |||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | |||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" | |||||
}, | |||||
"dateformat": { | |||||
"version": "4.5.1", | |||||
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", | |||||
"integrity": "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==", | |||||
"dev": true | |||||
}, | |||||
"deepmerge": { | |||||
"version": "4.2.2", | |||||
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", | |||||
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", | |||||
"dev": true | |||||
}, | |||||
"estree-walker": { | |||||
"version": "2.0.2", | |||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", | |||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", | |||||
"dev": true | |||||
}, | |||||
"fs.realpath": { | |||||
"version": "1.0.0", | |||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", | |||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" | |||||
}, | |||||
"function-bind": { | |||||
"version": "1.1.1", | |||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | |||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", | |||||
"dev": true | |||||
}, | |||||
"glob": { | |||||
"version": "7.1.7", | |||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", | |||||
"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", | |||||
"requires": { | |||||
"fs.realpath": "^1.0.0", | |||||
"inflight": "^1.0.4", | |||||
"inherits": "2", | |||||
"minimatch": "^3.0.4", | |||||
"once": "^1.3.0", | |||||
"path-is-absolute": "^1.0.0" | |||||
} | |||||
}, | |||||
"has": { | |||||
"version": "1.0.3", | |||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | |||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | |||||
"dev": true, | |||||
"requires": { | |||||
"function-bind": "^1.1.1" | |||||
} | |||||
}, | |||||
"has-flag": { | |||||
"version": "4.0.0", | |||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", | |||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" | |||||
}, | |||||
"inflight": { | |||||
"version": "1.0.6", | |||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | |||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", | |||||
"requires": { | |||||
"once": "^1.3.0", | |||||
"wrappy": "1" | |||||
} | |||||
}, | |||||
"inherits": { | |||||
"version": "2.0.4", | |||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | |||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | |||||
}, | |||||
"is-core-module": { | |||||
"version": "2.3.0", | |||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", | |||||
"integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", | |||||
"dev": true, | |||||
"requires": { | |||||
"has": "^1.0.3" | |||||
} | |||||
}, | |||||
"is-module": { | |||||
"version": "1.0.0", | |||||
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", | |||||
"integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", | |||||
"dev": true | |||||
}, | |||||
"is-reference": { | |||||
"version": "1.2.1", | |||||
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", | |||||
"integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", | |||||
"dev": true, | |||||
"requires": { | |||||
"@types/estree": "*" | |||||
} | |||||
}, | |||||
"lodash": { | |||||
"version": "4.17.21", | |||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", | |||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", | |||||
"dev": true | |||||
}, | |||||
"magic-string": { | |||||
"version": "0.25.7", | |||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", | |||||
"integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", | |||||
"dev": true, | |||||
"requires": { | |||||
"sourcemap-codec": "^1.4.4" | |||||
} | |||||
}, | |||||
"minimatch": { | |||||
"version": "3.0.4", | |||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", | |||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | |||||
"requires": { | |||||
"brace-expansion": "^1.1.7" | |||||
} | |||||
}, | |||||
"once": { | |||||
"version": "1.4.0", | |||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | |||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | |||||
"requires": { | |||||
"wrappy": "1" | |||||
} | |||||
}, | |||||
"path-is-absolute": { | |||||
"version": "1.0.1", | |||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", | |||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" | |||||
}, | |||||
"path-parse": { | |||||
"version": "1.0.6", | |||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", | |||||
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", | |||||
"dev": true | |||||
}, | |||||
"picomatch": { | |||||
"version": "2.2.3", | |||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", | |||||
"integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", | |||||
"dev": true | |||||
}, | |||||
"resolve": { | |||||
"version": "1.20.0", | |||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", | |||||
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", | |||||
"dev": true, | |||||
"requires": { | |||||
"is-core-module": "^2.2.0", | |||||
"path-parse": "^1.0.6" | |||||
} | |||||
}, | |||||
"rollup-plugin-version-injector": { | |||||
"version": "1.3.3", | |||||
"resolved": "https://registry.npmjs.org/rollup-plugin-version-injector/-/rollup-plugin-version-injector-1.3.3.tgz", | |||||
"integrity": "sha512-+Rrf0xIFHkwFGuMfphVlAOtd9FlhHFh3vrDwamJ6+YR3IxebRHGVT879qwWzZ1CpWMCLlngb2MmHW5wC5EJqvg==", | |||||
"dev": true, | |||||
"requires": { | |||||
"chalk": "^4.1.0", | |||||
"dateformat": "^4.2.1", | |||||
"lodash": "^4.17.20" | |||||
} | |||||
}, | |||||
"sourcemap-codec": { | |||||
"version": "1.4.8", | |||||
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", | |||||
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", | |||||
"dev": true | |||||
}, | |||||
"supports-color": { | |||||
"version": "7.2.0", | |||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", | |||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", | |||||
"requires": { | |||||
"has-flag": "^4.0.0" | |||||
} | |||||
}, | |||||
"tree-kill": { | |||||
"version": "1.2.2", | |||||
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", | |||||
"integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" | |||||
}, | |||||
"wrappy": { | |||||
"version": "1.0.2", | |||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | |||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" | |||||
} | |||||
} | |||||
} |
"crossfilter2": "^1.5.4", | "crossfilter2": "^1.5.4", | ||||
"chalk": "^4.1.0", | "chalk": "^4.1.0", | ||||
"glob": "^7.1.2", | "glob": "^7.1.2", | ||||
"uuid": "^8.3.2", | |||||
"tree-kill": "^1.2.2" | "tree-kill": "^1.2.2" | ||||
}, | }, | ||||
"bin": { | "bin": { |