|
|
|
|
|
|
|
|
var chalk = require('chalk') |
|
|
var chalk = require('chalk') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const __ALIAS__STAMP__ = '9e7bebe0-1f57-11ec-8f88-778ffeea9d1b' |
|
|
const BUILD_VERSION = '[VI]Version: {version} - built on {date}[/VI]'; |
|
|
const BUILD_VERSION = '[VI]Version: {version} - built on {date}[/VI]'; |
|
|
const runtimestamp = (new Date()).getTime(); |
|
|
const runtimestamp = (new Date()).getTime(); |
|
|
function getVersion() { return BUILD_VERSION; } |
|
|
function getVersion() { return BUILD_VERSION; } |
|
|
console.log(getVersion()); |
|
|
console.log(getVersion()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 'use strict'; |
|
|
// 'use strict'; |
|
|
|
|
|
|
|
|
// PB : TODO -- make sure folder context is proper coz we can now run elxr from anywhere. |
|
|
// PB : TODO -- make sure folder context is proper coz we can now run elxr from anywhere. |
|
|
|
|
|
|
|
|
}()); |
|
|
}()); |
|
|
|
|
|
|
|
|
const { existsSync } = require('fs'); |
|
|
const { existsSync } = require('fs'); |
|
|
|
|
|
const existsFolderSync = existsSync; |
|
|
const fs = require('fs') |
|
|
const fs = require('fs') |
|
|
|
|
|
|
|
|
const cliargs = utils.cliargs; |
|
|
const cliargs = utils.cliargs; |
|
|
|
|
|
|
|
|
}) |
|
|
}) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var launchpath = process.cwd().replace(/\\/, '/') |
|
|
|
|
|
var thisscriptdir = __dirname; // PB : TODO -- Thisscriptdir could be dislocated when run as a standalone file... We need to detect this where and how we were run. |
|
|
|
|
|
|
|
|
var launchpath = path.normalize(process.cwd()) |
|
|
|
|
|
var thisscriptdir = path.normalize(__dirname); // PB : TODO -- Thisscriptdir could be dislocated when run as a standalone file... We need to detect this where and how we were run. |
|
|
// The easisest would be to ask for a target directory and default to current dir.... |
|
|
// The easisest would be to ask for a target directory and default to current dir.... |
|
|
var instanceroot = path.normalize(thisscriptdir) === path.normalize(launchpath) ? thisscriptdir + '/..' : launchpath ; |
|
|
|
|
|
|
|
|
var instanceroot = path.normalize(thisscriptdir) === path.normalize(launchpath) ? path.normalize(thisscriptdir + '/..') : launchpath ; |
|
|
|
|
|
|
|
|
var __default = { |
|
|
var __default = { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
, node_env: 'development' |
|
|
, node_env: 'development' |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var detectInstance = function () { |
|
|
|
|
|
|
|
|
var hasElxr = function(path, options, cb) { |
|
|
|
|
|
// PB : TOOD -- Navigate up the folder chain to discover the relevant .elxr directory. |
|
|
|
|
|
options = options || {}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var tasks = [ |
|
|
|
|
|
'/elxr' // Is there a subfolder named elxr |
|
|
|
|
|
, '/elxr/.git' // which is self git repository |
|
|
|
|
|
, '/elxr/.elxr' // and has .elxr subfolder |
|
|
|
|
|
, '/elxr/.elxr/' + __ALIAS__STAMP__ // Which has our stamp. |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
if(options.sync) { return tasks.earlyreduce((acc, tpath)=>{ |
|
|
|
|
|
var value = existsFolderSync(path + tpath); |
|
|
|
|
|
return { value, done : acc && !value }; |
|
|
|
|
|
}).value } |
|
|
|
|
|
|
|
|
|
|
|
if(cb) return cb(null, tasks.earlyreduce((acc, tpath)=>{ |
|
|
|
|
|
var value = existsFolderSync(path + tpath); |
|
|
|
|
|
return { value, done : acc && !value }; |
|
|
|
|
|
}).value ); |
|
|
|
|
|
|
|
|
|
|
|
return Promise.resolve(tasks.earlyreduce((acc, tpath)=>{ |
|
|
|
|
|
var value = existsFolderSync(path + tpath); |
|
|
|
|
|
return { value, done : acc && !value }; |
|
|
|
|
|
}).value); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var hasElxrSync = function(path){ return hasElxr(path, { sync :true}); } |
|
|
|
|
|
|
|
|
|
|
|
var detectfromroot = function(root){ |
|
|
|
|
|
return { root, node_env : path.basename(path.dirname(root)), instanceName : path.basename( path.dirname(path.dirname(root)) ) } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var detectinstances = function () { |
|
|
console.log(`launchpath = ${launchpath}`) |
|
|
console.log(`launchpath = ${launchpath}`) |
|
|
console.log(`thisscriptdir = ${thisscriptdir}`) |
|
|
console.log(`thisscriptdir = ${thisscriptdir}`) |
|
|
console.log(`instanceroot = ${instanceroot}`) |
|
|
|
|
|
|
|
|
console.log(`instanceroot = ${instanceroot}`) // Not yet confirmed... |
|
|
|
|
|
|
|
|
|
|
|
// Note : Paths should already be normalized fefore this. |
|
|
|
|
|
|
|
|
var root = instanceroot; |
|
|
var root = instanceroot; |
|
|
|
|
|
var detected = { root }; |
|
|
|
|
|
var instanceoptions = [clioverrides] |
|
|
|
|
|
|
|
|
// We need a reference to the root director for elxr cli to be properly oriented. |
|
|
|
|
|
if ((launchpath + path.normalize('/elxr')) === thisscriptdir) { |
|
|
|
|
|
// We ran from the proper root with elxr subfolder. |
|
|
|
|
|
// PB : TODO --- Additional checks required to verify elxr is the right folder |
|
|
|
|
|
// should be a git repo. has elxr signature |
|
|
|
|
|
// and .elxr folder signature... in the launchpath. |
|
|
|
|
|
console.log(`Instance Path : ${root}`) |
|
|
|
|
|
instanceroot = root = launchpath |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
if (launchpath === thisscriptdir) { |
|
|
|
|
|
// Same directory doesn't mean we are being run from elxr directory or the root directory. |
|
|
|
|
|
// It could be a standalone elxr build which may or maynot be in the proper location. |
|
|
|
|
|
if (BUILD_VERSION.indexOf('Version: {version} - built on {date}') > -1) { |
|
|
|
|
|
// Unbuilt therefore we are in the elxr directory. |
|
|
|
|
|
instanceroot = root = path.normalize(launchpath + '/..'); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
// Built version. |
|
|
|
|
|
// check if we have a elxr subfolder. |
|
|
|
|
|
if (fs.existsSync(launchpath + '/..' + path.normalize('/elxr'))) { |
|
|
|
|
|
// Probably in the right place. |
|
|
|
|
|
|
|
|
return hasElxr(launchpath).then( (elxrCliExists) => { |
|
|
|
|
|
|
|
|
|
|
|
// We need a reference to the root director for elxr cli to be properly oriented. |
|
|
|
|
|
if (( elxrCliExists && path.normalize(launchpath + '/elxr')) === thisscriptdir) { |
|
|
|
|
|
// We were run from the proper root with elxr cli in the subfolder. |
|
|
|
|
|
console.log(`Instance Path : ${root}`) |
|
|
|
|
|
instanceroot = root = launchpath; |
|
|
|
|
|
instanceoptions.splice( 0, 0, dedetected = { root }) |
|
|
|
|
|
instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
if (launchpath === thisscriptdir) { |
|
|
|
|
|
// Same directory doesn't mean we are being run from elxr sub directory. |
|
|
|
|
|
// In standalone build script we may or not be in the same location. |
|
|
|
|
|
if (BUILD_VERSION.indexOf('Version: {version} - built on {date}') > -1) { |
|
|
|
|
|
// Unbuilt therefore we are in the elxr directory. |
|
|
instanceroot = root = path.normalize(launchpath + '/..'); |
|
|
instanceroot = root = path.normalize(launchpath + '/..'); |
|
|
|
|
|
instanceoptions.splice( 0, 0, dedetected = { root }) |
|
|
|
|
|
instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
// Assume launchpath is meaningless. |
|
|
|
|
|
// Figure it out from the input instance name and environment parameters if we are in the right location. |
|
|
|
|
|
instanceroot = root = path.normalize(launchpath + '/' + processedArgs._[1] + '/' + processedArgs.node_env) |
|
|
|
|
|
|
|
|
// Built version. |
|
|
|
|
|
// We could have been run from the elxr subfolder. Highly likely that the built version isn't the full elxr. |
|
|
|
|
|
if(hasElxrSync(launchpath + '/..')) { |
|
|
|
|
|
// Built version was run from the full elxr subfolder. Should work |
|
|
|
|
|
// PB : TODO -- but we should switch to the full version... |
|
|
|
|
|
instanceroot = root = path.normalize(launchpath + '/..'); |
|
|
|
|
|
instanceoptions.splice( 0, 0, detected = { root }) |
|
|
|
|
|
instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
// Assume current launchpath is a new instance and create. |
|
|
|
|
|
// Figure out the instnace name and environment from parent folders as an alternative option with confirmation if not provided in the arguments. |
|
|
|
|
|
|
|
|
|
|
|
if(clioverrides.instanceName) { |
|
|
|
|
|
if(clioverrides.node_env) { |
|
|
|
|
|
instanceroot = root = path.normalize(launchpath + '/' + clioverrides.instanceName + '/' + clioverrides.node_env) |
|
|
|
|
|
instanceoptions.splice( 0, 0, detected = { root, instanceName : clioverrides.instanceName, node_env : clioverrides.node_env }) |
|
|
|
|
|
// instanceoptions.splice( 0, 0, detectfromroot(root)) // This can be an option but is unnecessary unless a confirmation is provided. |
|
|
|
|
|
// also folder names may have no relation to the actual instanceName and instanceType coz we need to have many |
|
|
|
|
|
// eg : floder name can be elixir01 but instance name is elixr |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
instanceroot = root = path.normalize(launchpath + '/' + clioverrides.instanceName + '/' + 'development') |
|
|
|
|
|
instanceoptions.splice( 0, 0, detected = { root, instanceName : clioverrides.instanceName, node_env : 'development' }) |
|
|
|
|
|
instanceoptions.splice( 0, 0, detectfromroot(root)) // A recessive option only. |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
instanceroot = root = launchpath; |
|
|
|
|
|
if(clioverrides.node_env) { |
|
|
|
|
|
instanceoptions.splice( 0, 0, detected = { root, node_env : clioverrides.node_env }) |
|
|
|
|
|
instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
// Nothing was specified... We only have one option from root. |
|
|
|
|
|
instanceoptions.splice( 0, 0, detected = detectfromroot(launcpath)) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
instanceroot = root.replace(/\\/g, '/'); |
|
|
|
|
|
__default.root = root; |
|
|
|
|
|
clioverrides.root = clioverrides.root || root; |
|
|
|
|
|
|
|
|
|
|
|
// Resolves undefined when No known instances detected. |
|
|
|
|
|
return Promise.resolve( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
instanceroot = detected.root |
|
|
|
|
|
__default.root = root; |
|
|
|
|
|
clioverrides.root = clioverrides.root || root; |
|
|
|
|
|
|
|
|
// We can expect a .elxr at each level. |
|
|
// We can expect a .elxr at each level. |
|
|
['' /* instanceroot */, '../' /* instanceTypes or node_env */, '../..' /* instanceNames */].earlyreduce( ( acc, p, i, a )=>{ |
|
|
|
|
|
var root = `${instanceroot}/${p}.elxr`; |
|
|
|
|
|
if(existsSync( root )) { |
|
|
|
|
|
try { |
|
|
|
|
|
var chessinstances = acquirelocalinstances( { root } ) |
|
|
|
|
|
return Object.keys(chessinstances).earlyreduce( ( acc, instanceName) => { |
|
|
|
|
|
return Object.keys(chessinstances[instanceName]).earlyreduce( (acc, instanceType) => { |
|
|
|
|
|
if( path.normalize(chessinstances[instanceName][instanceType].root) === path.normalize(root) ) return { |
|
|
|
|
|
value : chessinstances[instanceName][instanceType] |
|
|
|
|
|
, done : true |
|
|
|
|
|
};s |
|
|
|
|
|
}) |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
catch(e){ |
|
|
|
|
|
return {} |
|
|
|
|
|
|
|
|
['' /* instanceroot */, '../' /* instanceTypes or node_env */, '../..' /* instanceNames */]. |
|
|
|
|
|
earlyreduce( ( value, p, i, a )=>{ |
|
|
|
|
|
var localinstancesPath = `${instanceroot}/${p}.elxr`; |
|
|
|
|
|
if(existsSync( localinstancesPath )) { |
|
|
|
|
|
try { |
|
|
|
|
|
var chessinstances = acquirelocalinstances( { localinstancesPath } ) |
|
|
|
|
|
return Object.keys(chessinstances).earlyreduce( ( value, instanceName) => { |
|
|
|
|
|
return Object.keys(chessinstances[instanceName]).earlyreduce( (value, instanceType) => { |
|
|
|
|
|
if( path.normalize(chessinstances[instanceName][instanceType].root) === path.normalize( instanceroot) ) { |
|
|
|
|
|
instanceoptions.splice( 0, 0, chessinstances[instanceName][instanceType]) |
|
|
|
|
|
return { |
|
|
|
|
|
value : chessinstances[instanceName][instanceType] |
|
|
|
|
|
, done : true |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
catch(e){ |
|
|
|
|
|
return { } |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
else return { } |
|
|
} |
|
|
} |
|
|
else return {} |
|
|
|
|
|
}).value |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// Resolves empty array when No known instances detected. |
|
|
|
|
|
return Promise.resolve(instanceoptions) |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var __interactve_promts = { |
|
|
var __interactve_promts = { |
|
|
|
|
|
|
|
|
return elxrworker() |
|
|
return elxrworker() |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return detectInstance().then((detectedInstance)=>{ |
|
|
|
|
|
|
|
|
return detectinstances().then((detectedinstanceoptions)=>{ |
|
|
|
|
|
|
|
|
selectedinstance = utils.assign(detectedInstance || {}, clioverrides) |
|
|
|
|
|
|
|
|
// PB : TODO -- Most recent should be at the tip ! at index 0 so utils.reverseassign is required !!! |
|
|
|
|
|
selectedinstance = utils.assign( ...detectedinstanceoptions.slice(-2) ) |
|
|
promptkeys = utils.assign(promptkeys, { 'instanceName' : clioverrides.instanceName, 'node_env' : clioverrides.node_env }) |
|
|
promptkeys = utils.assign(promptkeys, { 'instanceName' : clioverrides.instanceName, 'node_env' : clioverrides.node_env }) |
|
|
|
|
|
|
|
|
if(clioverrides.reconfirm) { |
|
|
if(clioverrides.reconfirm) { |
|
|
|
|
|
|
|
|
.then(()=>{ |
|
|
.then(()=>{ |
|
|
|
|
|
|
|
|
if(!__isElevated) { |
|
|
if(!__isElevated) { |
|
|
ensureDirectoryExistence(`${selectedinstance.root}/.elxr/readme.txt`) |
|
|
|
|
|
|
|
|
ensureDirectoryExistence(`${selectedinstance.root}/.elxr/${__ALIAS__STAMP__}`) |
|
|
// collect garbage |
|
|
// collect garbage |
|
|
return dirs( (dir)=>{ |
|
|
return dirs( (dir)=>{ |
|
|
var matches = /run-(.*)/gm.exec(dir.name) |
|
|
var matches = /run-(.*)/gm.exec(dir.name) |