| function acquireChoices(selectedinstance) { | function acquireChoices(selectedinstance) { | ||||
| var hasconfig = false; | var hasconfig = false; | ||||
| console.warn(chalk.yellow(` | |||||
| console.warn(chalk.cyan(` | |||||
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||||
| 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 | ||||
| } | } | ||||
| 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.reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in' | |||||
| }) | }) | ||||
| }) | }) | ||||
| }) | }) | ||||
| } | } | ||||
| var __interactve_promts = function( target ){ | |||||
| var getBoundEachPrompt = function(target, mustPrompt, promptables, choices) { | |||||
| return function(prompts, 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. | |||||
| // PB : TODO -- selectedinstance === __default check to prompt everything... | |||||
| if( (mustPrompt[k] !== undefined && mustPrompt[k] !== null) && target[k] !== mustPrompt[k] | |||||
| || (mustPrompt[k] === undefined || mustPrompt[k] === null) && (target[k] === undefined || target[k] === null) | |||||
| || 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); | |||||
| promptables[k].choices = choices[k] | |||||
| Object.defineProperty(target, k, getPromptableAsyncPropDescriptor(k, promptables[k])); | |||||
| return await target[k] | |||||
| }) | |||||
| } | |||||
| delete mustPrompt[k] | |||||
| return prompts | |||||
| } | |||||
| } | |||||
| return { | |||||
| var __interactve_promts = function( target, choices ){ | |||||
| Object.defineProperty(target, 'node_env', { get : function(){ return this.instanceType } }); | |||||
| var interactionpoints = { | |||||
| runchoice : { | runchoice : { | ||||
| label : | label : | ||||
| `Choose an option : | `Choose an option : | ||||
| , instanceType : { label : `Enter Instance Type ( <= ${target.instanceType || 'development'} ) : `, choices : [], defaultchoice : 'development'} | , instanceType : { label : `Enter Instance Type ( <= ${target.instanceType || 'development'} ) : `, choices : [], defaultchoice : 'development'} | ||||
| , reposerver : { label : `Enter Instance Name ( <= ${target.reposerver || 'https://git.bbh.org.in'} ) : `, choices : [], defaultchoice : 'https://git.bbh.org.in'} | , reposerver : { label : `Enter Instance Name ( <= ${target.reposerver || 'https://git.bbh.org.in'} ) : `, choices : [], defaultchoice : 'https://git.bbh.org.in'} | ||||
| } | } | ||||
| var eachPrompt = getBoundEachPrompt( target, promptkeys, interactionpoints, choices) | |||||
| return Object.keys(interactionpoints).reduce(eachPrompt, []) | |||||
| } | } | ||||
| return { | return { | ||||
| get (){ | get (){ | ||||
| return cli.prompt( promptable.choices, promptable.label, promptable.defaultchoice ).then(propValue => { | return cli.prompt( promptable.choices, promptable.label, promptable.defaultchoice ).then(propValue => { | ||||
| var asyncprop = Promise.resolve(propValue) | |||||
| if(promptable.interpret){ | if(promptable.interpret){ | ||||
| return propName = promptable.interpret(propValue).then( | |||||
| ()=>{ | |||||
| Object.defineProperty(this, propName, { | |||||
| value: propValue, | |||||
| writable: true, | |||||
| configurable : true, | |||||
| enumerable : true | |||||
| }); | |||||
| return propValue | |||||
| } | |||||
| ) | |||||
| asyncprop = promptable.interpret(propValue) | |||||
| } | } | ||||
| else return propValue | |||||
| return asyncprop.then( | |||||
| ()=>{ | |||||
| Object.defineProperty(this, propName, { | |||||
| value: propValue, | |||||
| writable: true, | |||||
| configurable : true, | |||||
| enumerable : true | |||||
| }); | |||||
| return propValue | |||||
| } | |||||
| ) | |||||
| }) | }) | ||||
| } | } | ||||
| // , set (propValue){ | // , set (propValue){ | ||||
| acquireElevationState().then(() => { | acquireElevationState().then(() => { | ||||
| var skipprerequisites = false; | var skipprerequisites = false; | ||||
| function initinstances(selected) { | |||||
| // PB : TODO -- processedArgs should already be part of selected. | |||||
| var instanceName = processedArgs._[1] | |||||
| function initinstances(selected_overrides) { | |||||
| var root = selected_overrides.root // We should always have this coz we are running at some place which is fixed by detectinstances. | |||||
| var instanceName = selected_overrides.instanceName | |||||
| || clioverrides.instanceName | |||||
| // || processedArgs._[1] | |||||
| || chessinstances.current_run.instanceName | || chessinstances.current_run.instanceName | ||||
| || selected.instanceName | |||||
| || clioverrides.instanceName; | |||||
| var node_env = processedArgs.node_env | |||||
| || chessinstances.current_run.node_env | |||||
| || selected.node_env | |||||
| || clioverrides.node_env; | |||||
| var node_env = selected_overrides.node_env | |||||
| || clioverrides.node_env | |||||
| // || processedArgs.node_env | |||||
| || chessinstances.current_run.node_env | |||||
| var reposerver = selected_overrides.reposerver | |||||
| || clioverrides.reposerver | |||||
| // || processedArgs.node_env | |||||
| || chessinstances.current_run.reposerver | |||||
| if(!instanceName) { | if(!instanceName) { | ||||
| promptkeys['instanceName'] = instanceName = chessinstances.current_run.instanceName = promptkeys['instanceName'] || __default.instanceName; | promptkeys['instanceName'] = instanceName = chessinstances.current_run.instanceName = promptkeys['instanceName'] || __default.instanceName; | ||||
| promptkeys['node_env'] = node_env = chessinstances.current_run.node_env = promptkeys['node_env'] || __default.node_env; | promptkeys['node_env'] = node_env = chessinstances.current_run.node_env = promptkeys['node_env'] || __default.node_env; | ||||
| promptkeys['reposerver'] = promptkeys['reposerver'] || __default.reposervers[0]; | |||||
| promptkeys['reposerver'] = reposerver = chessinstances.current_run.reposerver = promptkeys['reposerver'] || __default.reposervers[0]; | |||||
| } | } | ||||
| if(!node_env) { | if(!node_env) { | ||||
| promptkeys['node_env'] = node_env = chessinstances.current_run.node_env = promptkeys['node_env'] || __default.node_env; | promptkeys['node_env'] = node_env = chessinstances.current_run.node_env = promptkeys['node_env'] || __default.node_env; | ||||
| promptkeys['reposerver'] = promptkeys['reposerver'] || __default.reposervers[0]; | |||||
| promptkeys['reposerver'] = reposerver = chessinstances.current_run.reposerver = promptkeys['reposerver'] || __default.reposervers[0]; | |||||
| } | |||||
| if(!reposerver) { | |||||
| promptkeys['reposerver'] = reposerver = chessinstances.current_run.reposerver = promptkeys['reposerver'] || __default.reposervers[0]; | |||||
| } | } | ||||
| chessinstances[instanceName] = chessinstances[instanceName] || createChessInsance( { | chessinstances[instanceName] = chessinstances[instanceName] || createChessInsance( { | ||||
| instanceName, node_env, root : selected.root, reposerver : promptkeys['reposerver'] } ); | |||||
| chessinstances['current_run'] = { instanceName: instanceName, node_env: node_env } | |||||
| instanceName, node_env, root : selected_overrides.root, reposerver : promptkeys['reposerver'] } ); | |||||
| chessinstances['current_run'] = { instanceName: instanceName, node_env, reposerver, root } | |||||
| if(path.normalize(selected.root) !== path.normalize(chessinstances[instanceName][node_env].root)) { | |||||
| throw "Mismatched chessinstances config found " + chessinstances[instanceName][node_env].root + ' does not match ' + selected.root | |||||
| if(path.normalize(selected_overrides.root) !== path.normalize(chessinstances[instanceName][node_env].root)) { | |||||
| throw "instanceName and instanceType specified doesn't match whats already present do you want to continue " + chessinstances[instanceName][node_env].root + ' does not match ' + selected_overrides.root | |||||
| } | } | ||||
| // Override sequence. | // Override sequence. | ||||
| // __default, chessinstances[current_run], instanceName-config-development, cliargs, interactve_promts | // __default, chessinstances[current_run], instanceName-config-development, cliargs, interactve_promts | ||||
| selectedinstance = utils.assign( | selectedinstance = utils.assign( | ||||
| selected | |||||
| , chessinstances[instanceName][node_env] | |||||
| chessinstances[instanceName][node_env] | |||||
| , clioverrides | , clioverrides | ||||
| , selected_overrides | |||||
| // , __interactve_promts -- Cant just override. Also need selectedinstance to be ready... | // , __interactve_promts -- Cant just override. Also need selectedinstance to be ready... | ||||
| ); | ); | ||||
| // Config from server always override merges into selection except for the current selection. | // Config from server always override merges into selection except for the current selection. | ||||
| // PB : TODO -- utils.assign Array merges are non-distinct... | // PB : TODO -- utils.assign Array merges are non-distinct... | ||||
| chessinstances[instanceName][node_env] = selectedinstance = utils.assign(selected, selectedinstance) | |||||
| chessinstances[instanceName][node_env] = selectedinstance; | |||||
| // chessinstances[selectedinstance.instanceName][selectedinstance.node_env] = selectedinstance; | // chessinstances[selectedinstance.instanceName][selectedinstance.node_env] = selectedinstance; | ||||
| cacheWriteInstanceConfig(chessinstances) | cacheWriteInstanceConfig(chessinstances) | ||||
| // PB : TODO -- We should probably write the new server config also... | // PB : TODO -- We should probably write the new server config also... | ||||
| return elxrworker() | return elxrworker() | ||||
| } | } | ||||
| return detectinstances().then((detectedinstanceoptions)=>{ | |||||
| var getchoices = function(){ | |||||
| detectedinstanceoptions.splice(0,0, __default) | |||||
| var instances = [] | |||||
| var reposervers = []; | |||||
| var instnaceNames = [] | |||||
| var instanceTypes = ['development', 'production']; | |||||
| Object.keys( chessinstances).forEach(instanceName => { | |||||
| if(instanceName === 'current_run') return; | |||||
| Object.keys( chessinstances[instanceName] ).forEach(node_env=>{ | |||||
| var instance = chessinstances[instanceName][node_env]; | |||||
| reposervers = reposervers.concat(instance.reposervers) | |||||
| if(instance.reposerver) reposervers.push(instance.reposerver) | |||||
| instances.push(instance) | |||||
| instanceTypes.push(instance.node_env) | |||||
| instnaceNames.push(instance.instanceName) | |||||
| }) | |||||
| var getchoices = function(detectedinstanceoptions, promptkeys){ | |||||
| var instances = [] | |||||
| var reposervers = []; | |||||
| var instnaceNames = [] | |||||
| var instanceTypes = ['development', 'production']; | |||||
| Object.keys( chessinstances).forEach(instanceName => { | |||||
| if(instanceName === 'current_run') return; | |||||
| Object.keys( chessinstances[instanceName] ).forEach(node_env=>{ | |||||
| var instance = chessinstances[instanceName][node_env]; | |||||
| reposervers = reposervers.concat(instance.reposervers) | |||||
| if(instance.reposerver) reposervers.push(instance.reposerver) | |||||
| instances.push(instance) | |||||
| instanceTypes.push(instance.node_env) | |||||
| instnaceNames.push(instance.instanceName) | |||||
| }) | }) | ||||
| instances = instances.concat(detectedinstanceoptions) | |||||
| if(promptkeys['instanceName']) instnaceNames.push(selectedinstance['instanceName']) | |||||
| if(promptkeys['instanceName']) instnaceNames.push(promptkeys['instanceName']) | |||||
| if(selectedinstance['reposervers']) reposervers = reposervers.concat(selectedinstance['reposervers']) | |||||
| var choices = { | |||||
| 'instanceName' : Array.from( new Set(instnaceNames) ) | |||||
| , 'reposerver' : Array.from( new Set(reposervers) ) | |||||
| , 'instanceType' : Array.from( new Set(instanceTypes) ) | |||||
| } | |||||
| }) | |||||
| instances = instances.concat(detectedinstanceoptions) | |||||
| return choices; | |||||
| if(promptkeys['instanceName']) instnaceNames.push(selectedinstance['instanceName']) | |||||
| if(promptkeys['instanceName']) instnaceNames.push(promptkeys['instanceName']) | |||||
| if(selectedinstance['reposervers']) reposervers = reposervers.concat(selectedinstance['reposervers']) | |||||
| var choices = { | |||||
| 'instanceName' : Array.from( new Set(instnaceNames) ) | |||||
| , 'reposerver' : Array.from( new Set(reposervers) ) | |||||
| , 'instanceType' : Array.from( new Set(instanceTypes) ) | |||||
| } | } | ||||
| return choices; | |||||
| } | |||||
| return detectinstances().then((detectedinstanceoptions)=>{ | |||||
| detectedinstanceoptions.splice(0,0, __default) | |||||
| // PB : TODO -- Most recent should be at the tip ! at index 0 so utils.reverseassign is required !!! | // PB : TODO -- Most recent should be at the tip ! at index 0 so utils.reverseassign is required !!! | ||||
| selectedinstance = utils.assign( ...detectedinstanceoptions.slice(-2) ) | selectedinstance = utils.assign( ...detectedinstanceoptions.slice(-2) ) | ||||
| promptkeys = utils.assign(promptkeys, clioverrides) | promptkeys = utils.assign(promptkeys, clioverrides) | ||||
| var reconfirm = { 'instanceName' : selectedinstance['instanceName'] === 'chess' } | var reconfirm = { 'instanceName' : selectedinstance['instanceName'] === 'chess' } | ||||
| } | } | ||||
| else { var reconfirm = {}; } | else { var reconfirm = {}; } | ||||
| 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. | |||||
| // PB : TODO -- selectedinstance === __default check to prompt everything... | |||||
| if( (promptkeys[k] !== undefined && promptkeys[k] !== null) && selectedinstance[k] !== promptkeys[k] | |||||
| || (promptkeys[k] === undefined || promptkeys[k] === null) && (selectedinstance[k] === undefined || selectedinstance[k] === null) | |||||
| || 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); | |||||
| promptables[k].choices = choices[k] | |||||
| Object.defineProperty(selectedinstance, k, getPromptableAsyncPropDescriptor(k, promptables[k])); | |||||
| return await selectedinstance[k] | |||||
| }) | |||||
| } | |||||
| delete promptkeys[k] | |||||
| } | |||||
| try { | try { | ||||
| chessinstances = acquirelocalinstances(selectedinstance); | chessinstances = acquirelocalinstances(selectedinstance); | ||||
| findlocalinstances(chessinstances, detectedinstanceoptions) | findlocalinstances(chessinstances, detectedinstanceoptions) | ||||
| var choices = getchoices() | |||||
| var promptables = __interactve_promts(selectedinstance) | |||||
| Object.keys(promptables).forEach(eachPrompt, selectedinstance) | |||||
| var todo = Promise.resolve(true); | |||||
| todo = any(prompts).then(()=>{ | |||||
| var choices = getchoices(detectedinstanceoptions, promptkeys) | |||||
| var todo = any( __interactve_promts(selectedinstance, choices) ).then(()=>{ | |||||
| return initinstances(selectedinstance) | return initinstances(selectedinstance) | ||||
| }) | }) | ||||
| } | } | ||||
| catch (e) { | catch (e) { | ||||
| // PB : TODO -- verbose mode warning.. console.warn(e) // Missing chessinstances is not an error... | // PB : TODO -- verbose mode warning.. console.warn(e) // Missing chessinstances is not an error... | ||||
| var choices = getchoices() | |||||
| var choices = getchoices(detectedinstanceoptions, promptkeys) | |||||
| var todo = any( __interactve_promts(selectedinstance, choices) ).then(()=>{ | |||||
| return initinstances(selectedinstance) | |||||
| }) | |||||
| var promptables = __interactve_promts(selectedinstance) | |||||
| Object.keys(promptables).forEach(eachPrompt, selectedinstance) | |||||
| todo = any(prompts).then(()=>{ return initinstances(selectedinstance) }) | |||||
| if(!processedArgs._[0] || !selectedinstance.node_env || !selectedinstance.instanceName){ | if(!processedArgs._[0] || !selectedinstance.node_env || !selectedinstance.instanceName){ | ||||
| // Weve not been told what to do. | // Weve not been told what to do. | ||||
| todo = todo.then(() => { return acquireChoices(selectedinstance) }) | todo = todo.then(() => { return acquireChoices(selectedinstance) }) |