|
|
@@ -42,6 +42,8 @@ const https = require('https') |
|
|
|
const http = require('http'); |
|
|
|
const { Console } = require('console'); |
|
|
|
const { env } = require('process'); |
|
|
|
const PATTERNAPI = require('serververse').PATTERNAPI |
|
|
|
// const RESTAPI = require('serververse').RESTAPI |
|
|
|
const RESTAPI = (function(){ |
|
|
|
|
|
|
|
// Singleton |
|
|
@@ -322,116 +324,147 @@ shell_verse.acquireElevationState().then((isElevated) => { |
|
|
|
} |
|
|
|
|
|
|
|
var hasElxrSync = function(path){ return hasElxr(path, { sync :true}); } |
|
|
|
|
|
|
|
var uselauncdirasdefaultroot = false; |
|
|
|
if( ENV.NODE_ENV === 'production') uselauncdirasdefaultroot = true; |
|
|
|
// PB : TODO -- enable for for production. |
|
|
|
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 |
|
|
|
var root = process.cwd() // Root need not be the launchdir... |
|
|
|
var root = undefined // process.cwd() // Root need not be the launchdir... |
|
|
|
// we typicall assume the cwd to be the root. However this should default to |
|
|
|
// elxr parent if the root is not recongnizable as an instance root.... |
|
|
|
// wd is our own environment variable probably corresponding to the root but need not be the same. |
|
|
|
// console.log(processedArgs.root) |
|
|
|
|
|
|
|
// console.log('PWD :' + ENV.PWD) |
|
|
|
// console.log('cwd : ' + process.cwd()) |
|
|
|
// console.log('launchscriptdir : ' + path.normalize(__dirname)) |
|
|
|
|
|
|
|
if(!processedArgs.root){ |
|
|
|
if(!process.env.wd){ |
|
|
|
console.log('discovery') |
|
|
|
// Script may exists in the same location where we were launched(PWD) but that doesn't mean we r running from elxr. |
|
|
|
// script could have been copied tosome random location and run from there. |
|
|
|
// check elxr is preinstalled in same location. If so we need to chdir to parent. Else promt for confirmation of root. |
|
|
|
var launchdir = /*process.env.PWD ||*/ process.cwd() // mingw + node --inspect-brk behaves differently has a PWD that windows commands cannot recognize /d instead of D:\ and process.chdir fails.. |
|
|
|
var parentdir = path.dirname( launchdir ) |
|
|
|
var parentFolderHasElxr = hasElxrSync(parentdir) |
|
|
|
var launchFolderHasElxr = hasElxrSync(launchdir) |
|
|
|
if( parentFolderHasElxr && (path.normalize(parentdir + '/elxr') === thisscriptdir)) { |
|
|
|
// We were run from the proper root with elxr cli in the subfolder. |
|
|
|
// PB : TODO -- Cleanup this should no longer be needed... selectedinstance is properly initialized... |
|
|
|
|
|
|
|
// instanceroot = root = selectedinstance.root; |
|
|
|
// instanceoptions.splice( 0, 0, detected = { root }) |
|
|
|
// instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
|
root = ENV.wd = parentdir; // Default to the parent. |
|
|
|
console.log('----------------------------------------------------------------') |
|
|
|
console.log('BEFORE DISCOVERY') |
|
|
|
console.log('version : ' + getVersion()); |
|
|
|
console.log('process.env.wd : ' + process.env.wd) |
|
|
|
console.log('processedArgs.root : ' + processedArgs.root) |
|
|
|
console.log('----------------------------------------------------------------') |
|
|
|
console.log('wd :' + ENV.wd) |
|
|
|
console.log('PWD :' + ENV.PWD) |
|
|
|
console.log('cwd : ' + process.cwd()) |
|
|
|
console.log(`thisscriptdir = ${thisscriptdir}`) |
|
|
|
console.log(`root = ${root}`) |
|
|
|
console.log(`instanceroot = ${instanceroot}`) |
|
|
|
console.log('----------------------------------------------------------------') |
|
|
|
|
|
|
|
if(!processedArgs.root){ // There is no runtime invoke time named args override. |
|
|
|
console.log('discovery') |
|
|
|
// Script may exists in the same location where we were launched(PWD) but that doesn't mean we r running from elxr. |
|
|
|
// script could have been copied tosome random location and run from there. |
|
|
|
// check elxr is preinstalled in same location. If so we need to chdir to parent. Else promt for confirmation of root. |
|
|
|
var launchdir = /*process.env.PWD ||*/ process.cwd() // mingw + node --inspect-brk behaves differently has a PWD that windows commands cannot recognize /d instead of D:\ and process.chdir fails.. |
|
|
|
var parentdir = path.dirname( launchdir ) |
|
|
|
var parentFolderHasElxr = hasElxrSync(parentdir) |
|
|
|
var launchFolderHasElxr = hasElxrSync(launchdir) |
|
|
|
if( path.normalize(launchdir + '/elxr') === thisscriptdir ) { |
|
|
|
// launchFolderHasElxr is false -- and yet thiscriptdir is still proper. |
|
|
|
if(!launchFolderHasElxr) { |
|
|
|
console.warn('Warning : detected thisscriptdir as subfolder but did not recognize launchdir as a proper root. elxr may not autoupdate...') |
|
|
|
// hasElxr checks for git repo status and elxr id stamping etc. |
|
|
|
// exlr tool may have been acquired unconventionally and we may not be able to manage it. |
|
|
|
// We will run anyway though |
|
|
|
} |
|
|
|
else { |
|
|
|
if( path.normalize(parentdir + '/elxr') === thisscriptdir ) { |
|
|
|
// launchFolderHasElxr is false -- and yet thiscriptdir is still proper. |
|
|
|
// PB : TODO -- Maybe a warning / abort if for some reason thisscriptdir should not be used... |
|
|
|
console.error('Warning : detected thisscriptdir as elxr subfolder but not recognized as elixir. git updates might fail.') |
|
|
|
// instanceoptions.splice( 0, 0, detected = { root }) |
|
|
|
// instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
|
root = ENV.wd = launchdir; |
|
|
|
} |
|
|
|
else if( path.normalize(parentdir + '/elxr') === thisscriptdir ) { |
|
|
|
if(!parentFolderHasElxr) { |
|
|
|
console.warn('Warning : detected thisscriptdir as subfolder but did not recognize parentdir as a proper root. elxr may not autoupdate...') |
|
|
|
} |
|
|
|
// PB : TODO -- Cleanup this should no longer be needed... selectedinstance is properly initialized... |
|
|
|
root = ENV.wd = parentdir; // Default to the parent. |
|
|
|
} |
|
|
|
else { |
|
|
|
if (launchdir === thisscriptdir) { |
|
|
|
// Same directory doesn't mean we are being run from elxr sub directory. It could be a dislocated standalone elxr script. |
|
|
|
// PB : TODO -- In case elxr is not full elxr we need to locate it and relaunch to switch to the full version... |
|
|
|
|
|
|
|
// if(!parentFolderHasElxr) console.error('Invalid run location in subfolder that looks like elxr. We should probably abort.') |
|
|
|
if (BUILD_VERSION.indexOf('Version: {version} - built on {date}') > -1) { |
|
|
|
// Confirmed we were run from an Unbuilt ( meaning non standalone ) elxr therefore we are in the elxr sub directory. |
|
|
|
root = ENV.wd = parentdir; // Default to the parent. |
|
|
|
|
|
|
|
// instanceroot = root = path.normalize(selectedinstance.root + '/..'); |
|
|
|
// instanceoptions.splice( 0, 0, detected = { root }); |
|
|
|
// instanceoptions.splice( 0, 0, detectfromroot(root)); |
|
|
|
} |
|
|
|
else if (launchdir === thisscriptdir) { |
|
|
|
// Same directory doesn't mean we are being run from elxr sub directory. It could be a dislocated standalone elxr script. |
|
|
|
// PB : TODO -- In case elxr is not full elxr we need to locate it and relaunch to switch to the full version... |
|
|
|
|
|
|
|
// if(!parentFolderHasElxr) console.error('Invalid run location in subfolder that looks like elxr. We should probably abort.') |
|
|
|
|
|
|
|
if (BUILD_VERSION.indexOf('Version: {version} - built on {date}') > -1) { |
|
|
|
// Confirmed we were run from an Unbuilt ( meaning non standalone ) elxr therefore we are in the elxr sub directory. |
|
|
|
root = ENV.wd = parentdir; // Default to the parent. |
|
|
|
else if(!parentFolderHasElxr) { |
|
|
|
|
|
|
|
// Either case we use the launchdir. |
|
|
|
// if(launchFolderHasElxr) { |
|
|
|
// // Probably a standalone run. Lets just go with it |
|
|
|
// root = ENV.wd = launchdir; |
|
|
|
// } |
|
|
|
|
|
|
|
// instanceroot = root = path.normalize(selectedinstance.root + '/..'); |
|
|
|
// instanceoptions.splice( 0, 0, detected = { root }); |
|
|
|
// instanceoptions.splice( 0, 0, detectfromroot(root)); |
|
|
|
// In standalone build script we may or not be in the same location. |
|
|
|
// We could have been run from the elxr subfolder. However we cant say for sure. |
|
|
|
// Most likely that the built version isn't the full elxr. We assume elxr doesnt exist and create an new elxr under.. |
|
|
|
console.error('Warning : detected thisscriptdir as elxr subfolder but not recognized as elixir. git updates might fail.') |
|
|
|
root = ENV.wd = launchdir; |
|
|
|
} |
|
|
|
else { |
|
|
|
// In standalone build script we may or not be in the same location. |
|
|
|
if(!parentFolderHasElxr) { |
|
|
|
// We could have been run from the elxr subfolder. However we cant say for sure. |
|
|
|
// Most likely that the built version isn't the full elxr. We assume elxr doesnt exist and create an new elxr under.. |
|
|
|
console.error('Warning : detected thisscriptdir as elxr subfolder but not recognized as elixir. git updates might fail.') |
|
|
|
root = ENV.wd = launchdir; |
|
|
|
} |
|
|
|
else { |
|
|
|
// Built version was run from the full elxr subfolder |
|
|
|
root = ENV.wd = parentdir; // Default to the parent. |
|
|
|
// instanceoptions.splice( 0, 0, detected = { root }) |
|
|
|
// instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
|
|
|
|
|
// Assume current selectedinstance.root 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(selectedinstance.root + '/' + 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(selectedinstance.root + '/' + 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 = selectedinstance.root; |
|
|
|
// 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)) |
|
|
|
// } |
|
|
|
// } |
|
|
|
} |
|
|
|
// Built version was run from the full elxr subfolder |
|
|
|
root = ENV.wd = parentdir; // Default to the parent. |
|
|
|
// instanceoptions.splice( 0, 0, detected = { root }) |
|
|
|
// instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
|
|
|
|
|
// Assume current selectedinstance.root 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(selectedinstance.root + '/' + 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(selectedinstance.root + '/' + 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 = selectedinstance.root; |
|
|
|
// 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)) |
|
|
|
// } |
|
|
|
// } |
|
|
|
} |
|
|
|
} |
|
|
|
else if(launchFolderHasElxr) { |
|
|
|
root = ENV.wd = launchdir; |
|
|
|
// instanceoptions.splice( 0, 0, detected = { root }) |
|
|
|
// instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
|
} |
|
|
|
else { |
|
|
|
// Ambiguous but assume script is standalone in the instanceroot. |
|
|
|
root = ENV.wd = launchdir; |
|
|
|
|
|
|
|
} |
|
|
|
else if(launchFolderHasElxr) { |
|
|
|
root = ENV.wd = launchdir; |
|
|
|
// instanceoptions.splice( 0, 0, detected = { root }) |
|
|
|
// instanceoptions.splice( 0, 0, detectfromroot(root)) |
|
|
|
} |
|
|
|
else { |
|
|
|
// Ambiguous but assume script is standalone in the instanceroot |
|
|
|
// Lets defualt to the script parent assuming there is an instanceroot there. Hoever this should probably be a prompt where possible. |
|
|
|
// when we r in that mode. |
|
|
|
if(uselauncdirasdefaultroot) { |
|
|
|
// must be a new install in the selectedinstance.root with script invoked from some random location. |
|
|
|
if(!process.env.wd){ |
|
|
|
// Working directory as a .env variable was not passed in. |
|
|
|
root = ENV.wd = launchdir; |
|
|
|
} |
|
|
|
else root = ENV.wd = process.env.wd |
|
|
|
} |
|
|
|
else { |
|
|
|
var scriptparent = path.dirname( thisscriptdir ) |
|
|
|
root = ENV.wd = scriptparent; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else root = ENV.wd = process.env.wd |
|
|
|
} |
|
|
|
else { |
|
|
|
if(process.env.wd && process.env.wd !== processedArgs.root) throw 'wd and root must match.' |
|
|
@@ -442,6 +475,7 @@ shell_verse.acquireElevationState().then((isElevated) => { |
|
|
|
ENV.NODE_ENV = processedArgs.node_env || (ENV.NODE_ENV && ENV.NODE_ENV.trim()) || 'development' |
|
|
|
|
|
|
|
console.log('----------------------------------------------------------------') |
|
|
|
console.log('AFTER DISCOVERY') |
|
|
|
console.log('version : ' + getVersion()); |
|
|
|
console.log('process.env.wd : ' + process.env.wd) |
|
|
|
console.log('processedArgs.root : ' + processedArgs.root) |
|
|
@@ -451,6 +485,8 @@ shell_verse.acquireElevationState().then((isElevated) => { |
|
|
|
console.log('PWD :' + ENV.PWD) |
|
|
|
console.log('cwd : ' + process.cwd()) |
|
|
|
console.log(`thisscriptdir = ${thisscriptdir}`) |
|
|
|
console.log(`root = ${root}`) |
|
|
|
console.log(`instanceroot = ${instanceroot}`) |
|
|
|
console.log('----------------------------------------------------------------') |
|
|
|
|
|
|
|
var cli = require('./cliverse') |
|
|
@@ -497,8 +533,62 @@ shell_verse.acquireElevationState().then((isElevated) => { |
|
|
|
, exludeMergeRepos : { } |
|
|
|
}; // PB : TODO -- Use initialized instance instead of __default everywhere. |
|
|
|
|
|
|
|
var regexreplaceall = function(content, ps){ |
|
|
|
var repmatches |
|
|
|
var replaced = content; |
|
|
|
while (repmatches = ps.strOrregexp.exec(content)) { |
|
|
|
|
|
|
|
if(content.length > 0) { |
|
|
|
var replacement = repmatches[0] |
|
|
|
for(var m = 1; m < repmatches.length; m++) { |
|
|
|
replacement = replacement.replace(repmatches[m], ps.substitutes[m-1]) |
|
|
|
} |
|
|
|
replaced = replaced.replace( repmatches[0], replacement ) |
|
|
|
} |
|
|
|
} |
|
|
|
return replaced |
|
|
|
} |
|
|
|
|
|
|
|
var cmds = { |
|
|
|
remote : { |
|
|
|
sqlpreprocess : { |
|
|
|
noprerequisites : true |
|
|
|
, cmdFn : function(args){ |
|
|
|
|
|
|
|
|
|
|
|
var sqlquery = fs.readFileSync(args._[1], { encoding: 'utf8'}) |
|
|
|
sqlquery = PATTERNAPI.includesql(sqlquery, path.dirname(args._[1])) |
|
|
|
fs.writeFileSync(args._[1] + '.d.sql', sqlquery, { encoding: 'utf8'}) |
|
|
|
|
|
|
|
return sqlquery |
|
|
|
|
|
|
|
// // PB : TODO -- move to dsql preprocesor |
|
|
|
// // var sqlquery = 'SET @dsql = @dsql + ' + "'" + ('' + fs.readFileSync(args._[1])).replace(/\'/g,"''") + "'" |
|
|
|
// var sqlquery = fs.readFileSync(args._[1], { encoding: 'utf8'}) |
|
|
|
// var regExp = /\-\-\s{{INCLUDE(.*?) ([\s\S]*?)}}\s\-\-/gm; |
|
|
|
|
|
|
|
// var options = {} |
|
|
|
// sqlquery = replacepatterns(sqlquery, regExp, (matches, sqlquery)=>{ |
|
|
|
// if (matches[1] === 'ASDSQL') options.dsql = true |
|
|
|
// var replacement = { |
|
|
|
// distinctpatterntoreplace : new RegExp("\\-\\-\\s{{INCLUDE\\s" + matches[2] + "}}\\s\\-\\-","gm") |
|
|
|
// , detectedvaluepattern : matches[2] |
|
|
|
// // escaped dsql... //'SET @dsql = @dsql + ' + "'" + ('' + fs.readFileSync(args._[1])).replace(/\'/g,"''") + "'" |
|
|
|
// } |
|
|
|
|
|
|
|
// if(options.dsql) replacement.substituedvalue = ('SET @dsql = @dsql + ' + "'" + ('' + fs.readFileSync(path.dirname(args._[1]) + '/' + matches[2])).replace(/\'/g,"''") + "'") |
|
|
|
// else replacement.substituedvalue = fs.readFileSync(path.dirname(args._[1]) + '/' + matches[2]) |
|
|
|
|
|
|
|
// sqlquery = sqlquery.replace(replacement.distinctpatterntoreplace, replacement.substituedvalue); |
|
|
|
// regExp.lastIndex = 0; |
|
|
|
// }) |
|
|
|
|
|
|
|
// // console.log(replaced) |
|
|
|
// fs.writeFileSync(args._[1] + '.d.sql', sqlquery, { encoding: 'utf8'}) |
|
|
|
} |
|
|
|
, toArgs : function( o ){ return o } |
|
|
|
, interpret() { return { cmd : processedArgs._.slice(0, 1) } } |
|
|
|
} |
|
|
|
, remote : { |
|
|
|
interpret() { return utils.assign_core( { keycase: true, arraymergetype : utils.assign_core.DISTINCT_UNION } |
|
|
|
, { cmd : processedArgs._.slice(0, 2).join(' '), runchoice : 'c' }) } |
|
|
|
, noprerequisites : true |
|
|
@@ -509,6 +599,9 @@ shell_verse.acquireElevationState().then((isElevated) => { |
|
|
|
, { cmd : 'start', runchoice : 'c' |
|
|
|
, node_env : ENV.NODE_ENV, root : ENV.wd, instanceType : ENV.NODE_ENV |
|
|
|
})} |
|
|
|
, toArgs : function( o ){ |
|
|
|
return o |
|
|
|
} |
|
|
|
} |
|
|
|
, 'remote refresh' : { |
|
|
|
// return a interpreted set of arguments for this cmd run context. |
|
|
@@ -3440,23 +3533,6 @@ shell_verse.acquireElevationState().then((isElevated) => { |
|
|
|
// } |
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
var regexreplaceall = function(content, ps){ |
|
|
|
var repmatches |
|
|
|
var replaced = content; |
|
|
|
while (repmatches = ps.strOrregexp.exec(content)) { |
|
|
|
|
|
|
|
if(content.length > 0) { |
|
|
|
var replacement = repmatches[0] |
|
|
|
for(var m = 1; m < repmatches.length; m++) { |
|
|
|
replacement = replacement.replace(repmatches[m], ps.substitutes[m-1]) |
|
|
|
} |
|
|
|
replaced = replaced.replace( repmatches[0], replacement ) |
|
|
|
} |
|
|
|
} |
|
|
|
return replaced |
|
|
|
} |
|
|
|
|
|
|
|
// filesystem walk |
|
|
|
const fswalk = async (pathToWalk, options, actions) => { |
|
|
|
// options = options || { depthfirst : true } |