@@ -76,13 +76,19 @@ const readline = require("readline"); | |||
var cli = { | |||
nodeShellExec | |||
, 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 | |||
} |
@@ -0,0 +1,390 @@ | |||
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() |
@@ -33,6 +33,13 @@ const fs = require('fs') | |||
const cliargs = utils.cliargs; | |||
const processedArgs = cliargs(process.argv.slice(2)); | |||
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 ENV = Object.assign({}, process.env); // Shallow clone it. | |||
@@ -93,12 +100,15 @@ var getTaskWithElevation = function(tasdef){ | |||
} | |||
else { | |||
// 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) => { | |||
console.error(e) | |||
}) | |||
.finally(() => { | |||
fs.unlinkSync('run.done') | |||
if(__runasresult && !__runasresult.skipped) fs.unlinkSync('run.done') | |||
if (!processedArgs.runas) { return tasdef.regularpulltasks(); } | |||
}) | |||
} | |||
@@ -139,7 +149,11 @@ var getPullCmd = (repo, branch) => { | |||
} | |||
else { | |||
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 }] | |||
if (useGitPull) pullCmd = ['git', ['pull'], { | |||
@@ -388,6 +402,9 @@ var op = { | |||
}) | |||
} | |||
, 'runas': () => { | |||
if(processedArgs.skipelevated) return Promise.resolve({ skipped : true }); | |||
console.log('Testing Elevation') | |||
if (__isElevated) { | |||
@@ -525,6 +542,40 @@ var op = { | |||
// git remote equivalents... | |||
// git branch --set-upstream-to=elixir-unc/master master | |||
// 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) => { | |||
// git remote set-url elixir-unc //10.10.5.60/gitrepo/chess/bbhverse | |||
var __args = { | |||
@@ -572,7 +623,7 @@ var op = { | |||
} | |||
var perform_git_seturl = (dir) => { | |||
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) => { | |||
// console.log('Failed : ' + dir.name) | |||
}) | |||
@@ -959,7 +1010,7 @@ var op = { | |||
// Usage : | |||
// elxr pull -- Defaults to run config | |||
return elxr.getpulltask()() | |||
return elxr.getpulltask(selectedinstance)() | |||
} | |||
, 'isInstalled': () => { | |||
return nodeShellExec('where', [processedArgs._[1]], { inherit: true }).then(() => { | |||
@@ -1642,12 +1693,41 @@ var elxr = { | |||
} | |||
, 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 || { | |||
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) | |||
var env = Object.assign({}, process.env); // Shallow clone it. | |||
@@ -1655,30 +1735,30 @@ var elxr = { | |||
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 { | |||
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) } | |||
if(def.elevatedRepos){ | |||
if(def.elevated){ | |||
elevatedpulltasks = function() { | |||
return any(def.elevatedRepos.map((def) => performPull(def.repo))).then(() => { | |||
return any(def.elevated.map((def) => performPull(def.repo))).then(() => { | |||
return true; | |||
}).catch((e) => { | |||
console.error(e) | |||
}) | |||
} | |||
} | |||
if(def.reqularRepos) { | |||
if(def.repos) { | |||
var regularpulltasks = function(){ | |||
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) | |||
} | |||
} | |||
@@ -1708,7 +1788,7 @@ function preworkerconfig(){ | |||
// The main elxr cli process | |||
function elxrworker() { | |||
var subcommandlabels = { | |||
remote : `remote ${processedArgs._[1]}` | |||
remote : (`remote ${processedArgs._[1] || ''}`).trim() | |||
} | |||
var __runcmd = function (label) { | |||
@@ -1741,16 +1821,16 @@ function acquireChoices(selectedinstance) { | |||
Warning : Cannot locate your preferred configuration since it was not specified | |||
You should fork the default chess configuration to customize and make it | |||
your own instance with a named config as | |||
{{yourowninstancename}}-config-{{yourcurrentenvironment}} | |||
{{yourowninstancename}}-config-{{yourchosenenvironment}} | |||
And then run this tool as follows | |||
NODE_ENV={{yourenvironment}} elxr i {{yourowninstancename}} | |||
NODE_ENV={{yourchosenenvironment}} elxr i {{yourowninstancename}} | |||
OR | |||
Run this tool with the following command to use a quick start default. | |||
node elxr --default | |||
elxr --default | |||
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; | |||
@@ -1767,7 +1847,6 @@ We will run your choice of default or create your own at the next prompt. | |||
q) Quit | |||
Default <= d | |||
: `).then((choice) => { | |||
prompt.close(); | |||
if (choice && choice === 'd' || !choice) { | |||
processedArgs._[0] = 'i' | |||
selectedinstance.instanceName = processedArgs._[1] = processedArgs._[1] || 'chess' | |||
@@ -1796,7 +1875,6 @@ We will run your choice of default or create your own at the next prompt. | |||
} | |||
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' | |||
}) | |||
}) | |||
@@ -1817,7 +1895,6 @@ We will run your choice of default or create your own at the next prompt. | |||
else processedArgs._[0] = cmd | |||
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' | |||
p1.close() | |||
}) | |||
}) | |||
}) | |||
@@ -1831,6 +1908,29 @@ We will run your choice of default or create your own at the next prompt. | |||
}) | |||
} | |||
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 configrepo = selected.instanceName + '-config-' + selected.node_env; | |||
@@ -1843,8 +1943,11 @@ var acquireConfig = function (selected, chessinstances) { | |||
chessinstances[selected.instanceName][selected.node_env] = chessinstances[selected.instanceName][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. | |||
// PB : TODO -- utils.assign Array merges are non-distinct... | |||
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... | |||
selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... | |||
ENV.NODE_ENV = selectedinstance.node_env; | |||
@@ -1929,7 +2032,8 @@ var __interactve_promts = { | |||
Object.defineProperty(this, 'reposerver', { | |||
value: reposerver, | |||
writable: false, | |||
configurable : true | |||
configurable : true, | |||
enumerable : true | |||
}); | |||
return reposerver | |||
}) | |||
@@ -1938,7 +2042,8 @@ var __interactve_promts = { | |||
Object.defineProperty(this, 'reposerver', { | |||
value: reposerver, | |||
writable: false, | |||
configurable : true | |||
configurable : true, | |||
enumerable : true | |||
}); | |||
return reposerver | |||
} | |||
@@ -1969,7 +2074,7 @@ var prerequisites = [ | |||
() => prompt.ask(`git user name : ( <= ${gitUser} )`).then((user) => { gitUser = user; }) | |||
, () => 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 () { | |||
return any([this.installcmd].map(callsheltask)) | |||
@@ -2186,7 +2291,8 @@ var getPromptableAsyncPropDescriptor = function(propName, choices, defaultchoise | |||
Object.defineProperty(this, propName, { | |||
value: propValue, | |||
writable: false, | |||
configurable : true | |||
configurable : true, | |||
enumerable : true | |||
}); | |||
return propValue | |||
}) | |||
@@ -2195,11 +2301,13 @@ var getPromptableAsyncPropDescriptor = function(propName, choices, defaultchoise | |||
// Object.defineProperty(this, propName, { | |||
// value: propValue, | |||
// writable: false, | |||
// configurable : true | |||
// configurable : true, | |||
// enumerable : true | |||
// }) | |||
// return propValue; | |||
// } | |||
, configurable : true | |||
, enumerable : true | |||
} | |||
} | |||
@@ -2285,56 +2393,66 @@ acquireElevationState().then(() => { | |||
selectedinstance = Object.assign(detectedInstance, clioverrides); | |||
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 { | |||
chessinstances = acquirelocalinstances(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) | |||
var instanceNameChoices = new Set(Object.keys( chessinstances) ) | |||
instanceNameChoices.delete('current_run') | |||
instanceNameChoices.add(selectedinstance['instanceName']) | |||
instanceNameChoices.add(promptkeys['instanceName']) | |||
if(promptkeys['instanceName']) instanceNameChoices.add(promptkeys['instanceName']) | |||
var choices = { | |||
'instanceName' : Array.from(instanceNameChoices) | |||
, '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(promptkeys).forEach(eachPrompt, promptkeys) | |||
@@ -2342,7 +2460,7 @@ acquireElevationState().then(() => { | |||
if(!processedArgs._[0] || !selectedinstance.node_env || !selectedinstance.instanceName){ | |||
// Weve been told what to do. | |||
todo = acquireChoices(selectedinstance) | |||
todo = todo.then(() => { return acquireChoices(selectedinstance) }) | |||
} | |||
todo = todo.then(() => { | |||
@@ -2400,7 +2518,7 @@ acquireElevationState().then(() => { | |||
// Currently it retains 2*n when proc needs to be relaunched in elevated mode !!! | |||
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) | |||
return any(mainTasks); | |||
}) |
@@ -1,328 +0,0 @@ | |||
{ | |||
"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=" | |||
} | |||
} | |||
} |
@@ -19,6 +19,7 @@ | |||
"crossfilter2": "^1.5.4", | |||
"chalk": "^4.1.0", | |||
"glob": "^7.1.2", | |||
"uuid": "^8.3.2", | |||
"tree-kill": "^1.2.2" | |||
}, | |||
"bin": { |