var utils = require("../bbhverse-pb-wip/utils") | |||||
var js = utils.js; | |||||
function asyncDynamicTaskStream(opts){ | |||||
const design = { | |||||
create(){ | |||||
var conceptspace = 0; // 32 bit to start with. | |||||
var next = 1; | |||||
var all = 0; | |||||
var segments = []; | |||||
var __concepts = {}; | |||||
var __entagledRefs = new WeakMap(); | |||||
function assert(concept, multi){ return __concepts[concept].spin ? !(concept.id & multi) : (concept.id & multi) } | |||||
function define_exclusions(exclusions, tangle){ | |||||
// Note : Do not store references to concept.entanglement as this is switched on update. | |||||
if(exclusions.length < 2) throw 'Why would we call define_exclusions on a single or no item ? At the least 2 items are needed for mutual exclusion.' | |||||
var results = []; | |||||
// if any 2 concepts were setup as independent concpts they can later be entangled as mutual exclusion here. | |||||
var entanglement = { unsync : 0 }; // Set of entagled bits including self. | |||||
var entaglements = []; | |||||
var maskForSet = 0; | |||||
__entagledRefs.set(entanglement, entaglements); | |||||
var __entangledFn = (exclusion)=>{ // entaglement object has been fixed for all => collapse all previous. | |||||
entanglement.unsync |= exclusion.entanglement.unsync | exclusion.id ; | |||||
var collapsibles = __entagledRefs.get(exclusion.entanglement); | |||||
if(collapsibles) { collapsibles.forEach(collapsible => { collapsible.entanglement = entanglement; }) } | |||||
__entagledRefs.delete(exclusion.entanglement); | |||||
exclusion.entanglement = entanglement; | |||||
entaglements.push(exclusion); | |||||
} | |||||
var entangledFn = (exclusion)=>{ // entaglement object has not yet been fixed => replace. | |||||
exclusion.entanglement.unsync |= entanglement.unsync | exclusion.id ; | |||||
var collapsibles = __entagledRefs.get(entanglement); | |||||
if(collapsibles){ collapsibles.forEach(collapsible => { collapsible.entanglement = exclusion.entanglement; }) } | |||||
__entagledRefs.delete(entanglement); | |||||
entanglement = exclusion.entanglement; | |||||
entaglements = __entagledRefs.get(entanglement); | |||||
entangledFn = __entangledFn; | |||||
} | |||||
var __tangle = Object.assign({}, tangle); | |||||
// __tangle.unsync = __tangle.unsync & ~__tangle.insync; | |||||
// __tangle.insync |= __concept.results[0].id; | |||||
for(var i = 0; i < exclusions.length; i++) { | |||||
var innerexclusions = __concepts[exclusions[i]] ? __concepts[exclusions[i]] : define(exclusions[i], __tangle); | |||||
__tangle.unsync |= innerexclusions.results[0].id //| innerexclusions.results[0].entanglement.insync; | |||||
innerexclusions.results.forEach(exclusion=>{ | |||||
(exclusion.entanglement) ? entangledFn(exclusion) // previously entangled. | |||||
: (()=>{ | |||||
entanglement.unsync |= exclusion.id; | |||||
exclusion.entanglement = entanglement; | |||||
entaglements.push(exclusion) | |||||
})() | |||||
results.push(exclusion) | |||||
maskForSet |= exclusion.id; | |||||
}); | |||||
} | |||||
return { results : results, maskForSet : maskForSet} ; | |||||
} | |||||
function define_string(concept, tangle) { | |||||
all |= next; | |||||
__concepts[concept] = { id : next, entanglement : Object.assign({}, tangle) }; // self is included in entanglement. | |||||
__entagledRefs.set(__concepts[concept].entanglement, [__concepts[concept]] ) | |||||
next = next << 1; | |||||
return { results : [__concepts[concept]], maskForSet : __concepts[concept].id }; | |||||
} | |||||
function define_array(concepts, tangle) { | |||||
if(concepts.length > 1) return define_exclusions(concepts, tangle); | |||||
else return define(concepts[0], tangle) | |||||
} | |||||
function define_object(concepts, tangle){ | |||||
var results = []; | |||||
var maskForSet = 0; | |||||
tangle = tangle || {}; | |||||
Object.keys(concepts).forEach(concept => { | |||||
var __concept = define(concept, tangle); | |||||
results.push.apply(results, __concept.results) | |||||
var __tangle = Object.assign({}, __concept.results[0].entanglement); | |||||
__tangle.insync |= __concept.results[0].id | tangle.insync; | |||||
__tangle.unsync |= tangle.unsync; | |||||
var isconcept = define( concepts[concept][0], __tangle ) | |||||
__tangle = Object.assign({}, __concept.results[0].entanglement); | |||||
__tangle.unsync |= tangle.unsync | __concept.results[0].id; | |||||
var notconcept = define( concepts[concept][1], __tangle ) | |||||
if(notconcept && notconcept.results) { | |||||
__concept.results[0].entanglement.unsync |= notconcept.maskForSet; | |||||
maskForSet |= __concept.maskForSet | notconcept.maskForSet ; | |||||
} | |||||
if(isconcept && isconcept.results) { | |||||
__concept.results[0].entanglement.insync |= isconcept.maskForSet; | |||||
maskForSet |= __concept.maskForSet | isconcept.maskForSet ; | |||||
} | |||||
}); | |||||
results[0].entanglement.insync = maskForSet; | |||||
return { results : results, maskForSet : maskForSet }; | |||||
} | |||||
const conceptvariants = Object.assign(utils.__TPL__typeHandlers, { | |||||
'[object String]' : define_string | |||||
, '[object Array]' : define_array | |||||
, '[object Object]' : define_object | |||||
, '[object Undefined]' : ()=>{} // Ignore | |||||
}) | |||||
function define(concept, tangle){ | |||||
return conceptvariants[Object.prototype.toString.call(concept)](concept, tangle); | |||||
} | |||||
function reveal(){ console.dir(__concepts) } | |||||
return { define, reveal } | |||||
} | |||||
} | |||||
const coexstates = { | |||||
create(){ | |||||
var conceptspace = 0; // 32 bit to start with. | |||||
var next = 1; | |||||
var all = 0; | |||||
var segments = []; | |||||
var __concepts = {}; | |||||
var __entagledRefs = new WeakMap(); | |||||
var __tango = { // JS : Need a hash with integer keys for performance | |||||
// Eg: | |||||
// number matches key as a mask | |||||
// all bits in assertions bits get turned on and negations are turned off. | |||||
// number doesn't match key as a mask | |||||
// independents ? or | |||||
// all bits in assertions bits get turned off and negations are turned on. | |||||
// 0b1011110 : [ | |||||
// 0b1010000 // assertions : bits that are in sync. | |||||
// , 0b0001110 // negations : bits that are off sync. | |||||
// ] | |||||
} | |||||
// Tango Entaglement internal model Specs - These are permissable constraints for 2^n bit variations. | |||||
// Key = any concept bit | |||||
var t = { 0b00100000 /* a concept bit */ : [ | |||||
/* concept bit is on - entangled coexistence with the state of concept bit.. */ | |||||
[ | |||||
// all these bits must be turned off i.e these bits cannot co exist when the primary bit is turned on. | |||||
/* cannot coexit */ 0b00100110 // index 0 => 0 bits in this mask can coexit except for one bit which is the main concept bit which is included in this mask. | |||||
// Group constraints are not relevant here so not an array. | |||||
, /* any one bit within a group can coexit */ [ 0b00101001 /*, ...othergroups Eg: 0b11000000*/ ] | |||||
// each item in the array represents a constrained group of bits. | |||||
// index 1 => 1 bit in this mask can coexit with the main concept bit which is included in this mask. | |||||
// /*any n bits can coexit */ // index n => n bits in this mask can coexit with the main concept bit which is included in this mask. | |||||
// index i=1 to n each have 2^i variations each. At this level we have abstract nondeterministic view until all the bits computation results fix and reduce the result domain. | |||||
// Until such time they remain potential possibilities and which specific bits are on is ambiguious. | |||||
// all these bits must be turned on. | |||||
, /*all these bits have to exist with this state (must coexit)*/ 0b00110000 | |||||
// can be collapsed to 1 single group. | |||||
] | |||||
// independent bits where there is no entanglement are not stored. There can be an infinite or a large number of independent bits. | |||||
, /* concept bit is off */ | |||||
[ | |||||
0 // all these bits must be turned off. | |||||
// one or more permissible | |||||
, [0] // Index 1 - any one is permissible from the none can coexit category since main bit is off. | |||||
// /*index (1 -> n) =>any n bits may be turned on in opposition */ | |||||
//all these bits must be turned on. | |||||
, /*all these bits have to exist with this state in opposition*/ 0b11000000 | |||||
] | |||||
] | |||||
} | |||||
(()=>{ | |||||
var cannotCoexist = 0; | |||||
for(var i = 1; i < t[0b00100000][0].length; i++) { cannotCoexist |= t[0b00100000][0][i] } | |||||
t[0b00100000][1][0] |= cannotCoexist; | |||||
})() | |||||
(()=>{ | |||||
var cannotCoexist = 0; | |||||
for(var i = 1; i < t[0b00100000][1].length; i++) { cannotCoexist |= t[0b00100000][1][i] } | |||||
t[0b00100000][0][0] |= cannotCoexist; | |||||
})() | |||||
t[0b00100000][1][1] |= t[0b00100000][0][0] | |||||
function define_exclusions(exclusions, tangle){ | |||||
// Note : Do not store references to concept.entanglement as this is switched on update. | |||||
if(exclusions.length < 2) throw 'Why would we call define_exclusions on a single or no item ? At the least 2 items are needed for mutual exclusion.' | |||||
var results = []; | |||||
// if any 2 concepts were setup as independent concpts they can later be entangled as mutual exclusion here. | |||||
var entanglement = { unsync : 0 }; // Set of entagled bits including self. | |||||
var entaglements = []; | |||||
var maskForSet = 0; | |||||
__entagledRefs.set(entanglement, entaglements); | |||||
var __entangledFn = (exclusion)=>{ // entaglement object has been fixed for all => collapse all previous. | |||||
entanglement.unsync |= exclusion.entanglement.unsync | exclusion.id ; | |||||
var collapsibles = __entagledRefs.get(exclusion.entanglement); | |||||
if(collapsibles) { collapsibles.forEach(collapsible => { collapsible.entanglement = entanglement; }) } | |||||
__entagledRefs.delete(exclusion.entanglement); | |||||
exclusion.entanglement = entanglement; | |||||
entaglements.push(exclusion); | |||||
} | |||||
var entangledFn = (exclusion)=>{ // entaglement object has not yet been fixed => replace. | |||||
exclusion.entanglement.unsync |= entanglement.unsync | exclusion.id ; | |||||
var collapsibles = __entagledRefs.get(entanglement); | |||||
if(collapsibles){ collapsibles.forEach(collapsible => { collapsible.entanglement = exclusion.entanglement; }) } | |||||
__entagledRefs.delete(entanglement); | |||||
entanglement = exclusion.entanglement; | |||||
entaglements = __entagledRefs.get(entanglement); | |||||
entangledFn = __entangledFn; | |||||
} | |||||
var __tangle = Object.assign({}, tangle); | |||||
// __tangle.unsync = __tangle.unsync & ~__tangle.insync; | |||||
// __tangle.insync |= __concept.results[0].id; | |||||
for(var i = 0; i < exclusions.length; i++) { | |||||
var innerexclusions = __concepts[exclusions[i]] ? __concepts[exclusions[i]] : define(exclusions[i], __tangle); | |||||
__tangle.unsync |= innerexclusions.results[0].id //| innerexclusions.results[0].entanglement.insync; | |||||
innerexclusions.results.forEach(exclusion=>{ | |||||
(exclusion.entanglement) ? entangledFn(exclusion) // previously entangled. | |||||
: (()=>{ | |||||
entanglement.unsync |= exclusion.id; | |||||
exclusion.entanglement = entanglement; | |||||
entaglements.push(exclusion) | |||||
})() | |||||
results.push(exclusion) | |||||
maskForSet |= exclusion.id; | |||||
}); | |||||
} | |||||
return { results : results, maskForSet : maskForSet} ; | |||||
} | |||||
function define_string(concept, containing) { | |||||
all |= next; | |||||
__concepts[concept] = { id : next, ex : 0, in : 0, entanglement : Object.assign({}, tangle) }; // self is included in entanglement. | |||||
next = next << 1; | |||||
return { results : [__concepts[concept]], maskForSet : __concepts[concept].id }; | |||||
} | |||||
function define_array(concepts, tangle) { | |||||
if(concepts.length > 1) return define_exclusions(concepts, tangle); | |||||
else return define(concepts[0], tangle) | |||||
} | |||||
function define_object(concepts, tangle){ | |||||
var results = []; | |||||
var maskForSet = 0; | |||||
tangle = tangle || {}; | |||||
Object.keys(concepts).forEach(concept => { | |||||
var __concept = define(concept, tangle); | |||||
results.push.apply(results, __concept.results) | |||||
var __tangle = Object.assign({}, __concept.results[0].entanglement); | |||||
__tangle.insync |= __concept.results[0].id | tangle.insync; | |||||
__tangle.unsync |= tangle.unsync; | |||||
var isconcept = define( concepts[concept][0], __tangle ) | |||||
__tangle = Object.assign({}, __concept.results[0].entanglement); | |||||
__tangle.unsync |= tangle.unsync | __concept.results[0].id; | |||||
var notconcept = define( concepts[concept][1], __tangle ) | |||||
if(notconcept && notconcept.results) { | |||||
__concept.results[0].entanglement.unsync |= notconcept.maskForSet; | |||||
maskForSet |= __concept.maskForSet | notconcept.maskForSet ; | |||||
} | |||||
if(isconcept && isconcept.results) { | |||||
__concept.results[0].entanglement.insync |= isconcept.maskForSet; | |||||
maskForSet |= __concept.maskForSet | isconcept.maskForSet ; | |||||
} | |||||
}); | |||||
results[0].entanglement.insync = maskForSet; | |||||
return { results : results, maskForSet : maskForSet }; | |||||
} | |||||
const conceptvariants = Object.assign(utils.__TPL__typeHandlers, { | |||||
'[object String]' : define_string | |||||
, '[object Array]' : define_array | |||||
, '[object Object]' : define_object | |||||
, '[object Undefined]' : ()=>{} // Ignore | |||||
}) | |||||
function define(concept, tangle){ | |||||
return conceptvariants[Object.prototype.toString.call(concept)](concept, tangle); | |||||
} | |||||
function reveal(){ console.dir(__concepts) } | |||||
return { define, reveal } | |||||
} | |||||
} | |||||
// 'created' is implied by existence. | |||||
var states = { | |||||
'running' : [ | |||||
/* assertions */ [ ] | |||||
, /* negations = not running */ [ { | |||||
'unstarted' : [[ /* unstarted */] | |||||
, /* not unstarted = started at some point */ [ | |||||
'paused' // can be resumed from interrupted (=incomplete or in progress) | |||||
// , sleeping -> ran a little and is now paused same as parent state. | |||||
// , waiting on other things | |||||
// ... sleeping, interrupted ... | |||||
, { 'stopped' : [[ // unlike paused cannot be resumed can be restarted i.e rerun from the beginning. | |||||
'succeded' // - completed -> process completed | |||||
, 'failed' // - Either processing failed or prematurely exited with exception -> with an error. Non exception cases may have run to completion and failed. | |||||
, 'aborted' // - terminated -> was not allowd to completed. Cannot say succeded or failed. | |||||
// incomplete result ( neither success nor failure ) was stopped and abandoned befeore it could run to completion. | |||||
], [] ]} | |||||
] | |||||
]} ] | |||||
] | |||||
// unassociated independent co-existence to 'running'. Sibling level in an object. | |||||
} | |||||
var stateFactory = design.create(); | |||||
var x = stateFactory.define(states); | |||||
stateFactory.reveal(); | |||||
// console.dir(JSON.stringify(x)); | |||||
} | |||||
module.exports = asyncDynamicTaskStream; | |||||
asyncDynamicTaskStream(); |
// ------------------------------- | |||||
// Command line option parsing | |||||
// ------------------------------- | |||||
function cliargs(args, opts) { | |||||
if (!opts) opts = {}; | |||||
var flags = { bools : {}, strings : {}, unknownFn: null }; | |||||
if (typeof opts['unknown'] === 'function') { | |||||
flags.unknownFn = opts['unknown']; | |||||
} | |||||
if (typeof opts['boolean'] === 'boolean' && opts['boolean']) { | |||||
flags.allBools = true; | |||||
} else { | |||||
[].concat(opts['boolean']).filter(Boolean).forEach(function (key) { | |||||
flags.bools[key] = true; | |||||
}); | |||||
} | |||||
var aliases = {}; | |||||
Object.keys(opts.alias || {}).forEach(function (key) { | |||||
aliases[key] = [].concat(opts.alias[key]); | |||||
aliases[key].forEach(function (x) { | |||||
aliases[x] = [key].concat(aliases[key].filter(function (y) { | |||||
return x !== y; | |||||
})); | |||||
}); | |||||
}); | |||||
[].concat(opts.string).filter(Boolean).forEach(function (key) { | |||||
flags.strings[key] = true; | |||||
if (aliases[key]) { | |||||
flags.strings[aliases[key]] = true; | |||||
} | |||||
}); | |||||
var defaults = opts['default'] || {}; | |||||
var argv = { _ : [] }; | |||||
Object.keys(flags.bools).forEach(function (key) { | |||||
setArg(key, defaults[key] === undefined ? false : defaults[key]); | |||||
}); | |||||
var notFlags = []; | |||||
if (args.indexOf('--') !== -1) { | |||||
notFlags = args.slice(args.indexOf('--')+1); | |||||
args = args.slice(0, args.indexOf('--')); | |||||
} | |||||
function argDefined(key, arg) { | |||||
return (flags.allBools && /^--[^=]+$/.test(arg)) || | |||||
flags.strings[key] || flags.bools[key] || aliases[key]; | |||||
} | |||||
function setArg (key, val, arg) { | |||||
if (arg && flags.unknownFn && !argDefined(key, arg)) { | |||||
if (flags.unknownFn(arg) === false) return; | |||||
} | |||||
var value = !flags.strings[key] && isNumber(val) | |||||
? Number(val) : val | |||||
; | |||||
setKey(argv, key.split('.'), value); | |||||
(aliases[key] || []).forEach(function (x) { | |||||
setKey(argv, x.split('.'), value); | |||||
}); | |||||
} | |||||
function setKey (obj, keys, value) { | |||||
var o = obj; | |||||
keys.slice(0,-1).forEach(function (key) { | |||||
if (o[key] === undefined) o[key] = {}; | |||||
o = o[key]; | |||||
}); | |||||
var key = keys[keys.length - 1]; | |||||
if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') { | |||||
o[key] = value; | |||||
} | |||||
else if (Array.isArray(o[key])) { | |||||
o[key].push(value); | |||||
} | |||||
else { | |||||
o[key] = [ o[key], value ]; | |||||
} | |||||
} | |||||
function aliasIsBoolean(key) { | |||||
return aliases[key].some(function (x) { | |||||
return flags.bools[x]; | |||||
}); | |||||
} | |||||
for (var i = 0; i < args.length; i++) { | |||||
var arg = args[i]; | |||||
if (/^--.+=/.test(arg)) { | |||||
// Using [\s\S] instead of . because js doesn't support the | |||||
// 'dotall' regex modifier. See: | |||||
// http://stackoverflow.com/a/1068308/13216 | |||||
var m = arg.match(/^--([^=]+)=([\s\S]*)$/); | |||||
var key = m[1]; | |||||
var value = m[2]; | |||||
if (flags.bools[key]) { | |||||
value = value !== 'false'; | |||||
} | |||||
setArg(key, value, arg); | |||||
} | |||||
else if (/^--no-.+/.test(arg)) { | |||||
var key = arg.match(/^--no-(.+)/)[1]; | |||||
setArg(key, false, arg); | |||||
} | |||||
else if (/^--.+/.test(arg)) { | |||||
var key = arg.match(/^--(.+)/)[1]; | |||||
var next = args[i + 1]; | |||||
if (next !== undefined && !/^-/.test(next) | |||||
&& !flags.bools[key] | |||||
&& !flags.allBools | |||||
&& (aliases[key] ? !aliasIsBoolean(key) : true)) { | |||||
setArg(key, next, arg); | |||||
i++; | |||||
} | |||||
else if (/^(true|false)$/.test(next)) { | |||||
setArg(key, next === 'true', arg); | |||||
i++; | |||||
} | |||||
else { | |||||
setArg(key, flags.strings[key] ? '' : true, arg); | |||||
} | |||||
} | |||||
else if (/^-[^-]+/.test(arg)) { | |||||
var letters = arg.slice(1,-1).split(''); | |||||
var broken = false; | |||||
for (var j = 0; j < letters.length; j++) { | |||||
var next = arg.slice(j+2); | |||||
if (next === '-') { | |||||
setArg(letters[j], next, arg) | |||||
continue; | |||||
} | |||||
if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) { | |||||
setArg(letters[j], next.split('=')[1], arg); | |||||
broken = true; | |||||
break; | |||||
} | |||||
if (/[A-Za-z]/.test(letters[j]) | |||||
&& /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { | |||||
setArg(letters[j], next, arg); | |||||
broken = true; | |||||
break; | |||||
} | |||||
if (letters[j+1] && letters[j+1].match(/\W/)) { | |||||
setArg(letters[j], arg.slice(j+2), arg); | |||||
broken = true; | |||||
break; | |||||
} | |||||
else { | |||||
setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg); | |||||
} | |||||
} | |||||
var key = arg.slice(-1)[0]; | |||||
if (!broken && key !== '-') { | |||||
if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1]) | |||||
&& !flags.bools[key] | |||||
&& (aliases[key] ? !aliasIsBoolean(key) : true)) { | |||||
setArg(key, args[i+1], arg); | |||||
i++; | |||||
} | |||||
else if (args[i+1] && /true|false/.test(args[i+1])) { | |||||
setArg(key, args[i+1] === 'true', arg); | |||||
i++; | |||||
} | |||||
else { | |||||
setArg(key, flags.strings[key] ? '' : true, arg); | |||||
} | |||||
} | |||||
} | |||||
else { | |||||
if (!flags.unknownFn || flags.unknownFn(arg) !== false) { | |||||
argv._.push( | |||||
flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) | |||||
); | |||||
} | |||||
if (opts.stopEarly) { | |||||
argv._.push.apply(argv._, args.slice(i + 1)); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
Object.keys(defaults).forEach(function (key) { | |||||
if (!hasKey(argv, key.split('.'))) { | |||||
setKey(argv, key.split('.'), defaults[key]); | |||||
(aliases[key] || []).forEach(function (x) { | |||||
setKey(argv, x.split('.'), defaults[key]); | |||||
}); | |||||
} | |||||
}); | |||||
if (opts['--']) { | |||||
argv['--'] = new Array(); | |||||
notFlags.forEach(function(key) { | |||||
argv['--'].push(key); | |||||
}); | |||||
} | |||||
else { | |||||
notFlags.forEach(function(key) { | |||||
argv._.push(key); | |||||
}); | |||||
} | |||||
return argv; | |||||
}; | |||||
function hasKey (obj, keys) { | |||||
var o = obj; | |||||
keys.slice(0,-1).forEach(function (key) { | |||||
o = (o[key] || {}); | |||||
}); | |||||
var key = keys[keys.length - 1]; | |||||
return key in o; | |||||
} | |||||
function isNumber (x) { | |||||
if (typeof x === 'number') return true; | |||||
if (/^0x[0-9a-f]+$/i.test(x)) return true; | |||||
return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); | |||||
} | |||||
module.exports = cliargs; |
// -------------- | // -------------- | ||||
// elxr | // elxr | ||||
// A cli tool for elixr. | // A cli tool for elixr. | ||||
const processedArgs = minimist(process.argv.slice(2)); | |||||
const { spawn } = require('child_process'); | |||||
const cliargs = require('../elxr/cliargs'); // Use minimist... | |||||
const processedArgs = cliargs(process.argv.slice(2)); | |||||
console.dir(processedArgs) | |||||
var cli = 'elxr'; | var cli = 'elxr'; | ||||
var ver = '#unversioned'; | var ver = '#unversioned'; | ||||
var help = '#unkown list of commands... please refer dveloper documentation for ' + cli; | var help = '#unkown list of commands... please refer dveloper documentation for ' + cli; | ||||
nodeShellExec('echo', ['elxr'], { inherit : true}) //, {stdio: "inherit"} | |||||
// grep -qxF 'alias elxr="node elxr/index.js"' ~/.bash_profile || echo 'alias elxr="node elxr/index.js"' >> ~/.bash_profile | |||||
// nodeShellExec('echo', ['elxr'], { inherit : true}) //, {stdio: "inherit"} | |||||
var __runcmd = function(label){ | var __runcmd = function(label){ | ||||
// var child = nodeShellExec('mkdir', ['-p', label], { inherit : true} ); | |||||
// console.log('Starting directory: ' + process.cwd()); | |||||
// try { | |||||
// child = child.on('close', () => { process.chdir(label) } ); | |||||
// console.log('New directory: ' + process.cwd()); | |||||
// } | |||||
// catch (err) { | |||||
// console.log('chdir: ' + err); | |||||
// } | |||||
// child.on('close', function(){ | |||||
// var options = { | |||||
// shell : true | |||||
// , inherit : true | |||||
// // , cwd : '' + process.cwd | |||||
// // , env : process.env | |||||
// }; | |||||
// nodeShellExec('git', ['init'], { inherit : true}); | |||||
nodeShellExec('pwd', { inherit : true}); | |||||
//$ "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --profile-directory="Profile 1" http://localhost:4200/tests/index.html?grep=loopback | |||||
nodeShellExec("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe", [ | |||||
"--profile-directory=Profile 1" | |||||
, 'http://localhost:4200/tests/index.html?grep=model convert ember to loopback' + '&filter=none' /*+ '&filter=model convert ember to loopback'*/]); | |||||
// nodeShellExec('npm', ['init', '-y'], options); | |||||
// nodeShellExec('npm', ['init', '-y'], options); | |||||
// }) | |||||
var op = { | |||||
'h' : ()=>{ console.log(cli + ' ' + ver + ' ' + help); return '-h' } | |||||
, 'devmysql' : ()=>{ | |||||
console.log('Starting Elixir Server.'); | |||||
var env = Object.assign({}, process.env); // Shallow clone it. | |||||
// console.dir(env) | |||||
env.NODE_ENV = 'devmysql'; | |||||
env.DEBUG = 'loopback:connector:mysql' | |||||
nodeShellExec('node', ['sage-rw/server.js'], { | |||||
shell: true, detached: true, | |||||
cwd : 'loopback', | |||||
env: env, | |||||
shell : true | |||||
}) | |||||
// nodeShellExec('c:/Program Files/nodejs/node.exe', { inherit : true, cwd : '../loopback'}); | |||||
// nodeShellExec('pwd', { | |||||
// inherit : true | |||||
// , cwd : '../loopback' | |||||
// , env : env | |||||
// }) | |||||
// nodeShellExec('node', ['sage-rw/server.js'], { | |||||
// inherit : true | |||||
// , cwd : '../loopback' | |||||
// , env : env | |||||
// }) //, {stdio: "inherit"} | |||||
} | |||||
, 'g' : ()=>{ | |||||
if(processedArgs.h) { | |||||
console.log('elxr g [modelname] => generate a model named [modelname]'); | |||||
console.log('elxr g => regenerate all known models'); | |||||
return | |||||
} | |||||
// var child = nodeShellExec('mkdir', ['-p', label], { inherit : true} ); | |||||
// console.log('Starting directory: ' + process.cwd()); | |||||
// try { | |||||
// child = child.on('close', () => { process.chdir(label) } ); | |||||
// console.log('New directory: ' + process.cwd()); | |||||
// } | |||||
// catch (err) { | |||||
// console.log('chdir: ' + err); | |||||
// } | |||||
// child.on('close', function(){ | |||||
// var options = { | |||||
// shell : true | |||||
// , inherit : true | |||||
// // , cwd : '' + process.cwd | |||||
// // , env : process.env | |||||
// }; | |||||
// nodeShellExec('git', ['init'], { inherit : true}); | |||||
nodeShellExec('pwd', { inherit : true}); | |||||
//$ "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --profile-directory="Profile 1" http://localhost:4200/tests/index.html?grep=loopback | |||||
nodeShellExec("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe", [ | |||||
"--profile-directory=Profile 1" | |||||
, 'http://localhost:4200/tests/index.html?grep=model convert ember to loopback' + '&filter=none' /*+ '&filter=model convert ember to loopback'*/]); | |||||
// nodeShellExec('npm', ['init', '-y'], options); | |||||
// nodeShellExec('npm', ['init', '-y'], options); | |||||
// }) | |||||
} | |||||
} | |||||
return op[label](); | |||||
} | } | ||||
__runcmd(processedArgs.label || processedArgs._[0] || (function(){ console.log(cli + ' ' + ver + ' ' + help); return '-h' } )()); | |||||
// mysqldump --add-drop-table --no-data -u root -p db_name | grep 'DROP TABLE' ) > drop_all_tables.sql | |||||
// mysql -u root -p db_name < drop_all_tables.sql | |||||
var mysql = '../xampp/mysql/bin/mysql' | |||||
var mysqldump = '../xampp/mysql/bin/mysqldump' | |||||
__runcmd(processedArgs.label || processedArgs._[0] || '-h'); | |||||
// nodeShellExec('git', ['status']); | // nodeShellExec('git', ['status']); | ||||
function nodeShellExec() { | function nodeShellExec() { | ||||
const { spawn } = require('child_process'); | |||||
const child = spawn(...arguments); | const child = spawn(...arguments); | ||||
// use child.stdout.setEncoding('utf8'); if you want text chunks | // use child.stdout.setEncoding('utf8'); if you want text chunks | ||||
child.stdout.setEncoding('utf8'); | child.stdout.setEncoding('utf8'); | ||||
console.log('here') | |||||
// console.log('here') | |||||
child.stdout.on('data', (chunk) => console.log(chunk)); | child.stdout.on('data', (chunk) => console.log(chunk)); | ||||
return child; | return child; | ||||
} | } | ||||
// ------------------------------- | |||||
// Command line option parsing | |||||
// ------------------------------- | |||||
function minimist(args, opts) { | |||||
if (!opts) opts = {}; | |||||
var flags = { bools : {}, strings : {}, unknownFn: null }; | |||||
if (typeof opts['unknown'] === 'function') { | |||||
flags.unknownFn = opts['unknown']; | |||||
} | |||||
if (typeof opts['boolean'] === 'boolean' && opts['boolean']) { | |||||
flags.allBools = true; | |||||
} else { | |||||
[].concat(opts['boolean']).filter(Boolean).forEach(function (key) { | |||||
flags.bools[key] = true; | |||||
}); | |||||
} | |||||
var aliases = {}; | |||||
Object.keys(opts.alias || {}).forEach(function (key) { | |||||
aliases[key] = [].concat(opts.alias[key]); | |||||
aliases[key].forEach(function (x) { | |||||
aliases[x] = [key].concat(aliases[key].filter(function (y) { | |||||
return x !== y; | |||||
})); | |||||
}); | |||||
}); | |||||
[].concat(opts.string).filter(Boolean).forEach(function (key) { | |||||
flags.strings[key] = true; | |||||
if (aliases[key]) { | |||||
flags.strings[aliases[key]] = true; | |||||
} | |||||
}); | |||||
var defaults = opts['default'] || {}; | |||||
var argv = { _ : [] }; | |||||
Object.keys(flags.bools).forEach(function (key) { | |||||
setArg(key, defaults[key] === undefined ? false : defaults[key]); | |||||
}); | |||||
var notFlags = []; | |||||
if (args.indexOf('--') !== -1) { | |||||
notFlags = args.slice(args.indexOf('--')+1); | |||||
args = args.slice(0, args.indexOf('--')); | |||||
} | |||||
function argDefined(key, arg) { | |||||
return (flags.allBools && /^--[^=]+$/.test(arg)) || | |||||
flags.strings[key] || flags.bools[key] || aliases[key]; | |||||
} | |||||
function setArg (key, val, arg) { | |||||
if (arg && flags.unknownFn && !argDefined(key, arg)) { | |||||
if (flags.unknownFn(arg) === false) return; | |||||
} | |||||
var value = !flags.strings[key] && isNumber(val) | |||||
? Number(val) : val | |||||
; | |||||
setKey(argv, key.split('.'), value); | |||||
(aliases[key] || []).forEach(function (x) { | |||||
setKey(argv, x.split('.'), value); | |||||
}); | |||||
} | |||||
function setKey (obj, keys, value) { | |||||
var o = obj; | |||||
keys.slice(0,-1).forEach(function (key) { | |||||
if (o[key] === undefined) o[key] = {}; | |||||
o = o[key]; | |||||
}); | |||||
var key = keys[keys.length - 1]; | |||||
if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') { | |||||
o[key] = value; | |||||
} | |||||
else if (Array.isArray(o[key])) { | |||||
o[key].push(value); | |||||
} | |||||
else { | |||||
o[key] = [ o[key], value ]; | |||||
} | |||||
} | |||||
function aliasIsBoolean(key) { | |||||
return aliases[key].some(function (x) { | |||||
return flags.bools[x]; | |||||
}); | |||||
} | |||||
for (var i = 0; i < args.length; i++) { | |||||
var arg = args[i]; | |||||
if (/^--.+=/.test(arg)) { | |||||
// Using [\s\S] instead of . because js doesn't support the | |||||
// 'dotall' regex modifier. See: | |||||
// http://stackoverflow.com/a/1068308/13216 | |||||
var m = arg.match(/^--([^=]+)=([\s\S]*)$/); | |||||
var key = m[1]; | |||||
var value = m[2]; | |||||
if (flags.bools[key]) { | |||||
value = value !== 'false'; | |||||
} | |||||
setArg(key, value, arg); | |||||
} | |||||
else if (/^--no-.+/.test(arg)) { | |||||
var key = arg.match(/^--no-(.+)/)[1]; | |||||
setArg(key, false, arg); | |||||
} | |||||
else if (/^--.+/.test(arg)) { | |||||
var key = arg.match(/^--(.+)/)[1]; | |||||
var next = args[i + 1]; | |||||
if (next !== undefined && !/^-/.test(next) | |||||
&& !flags.bools[key] | |||||
&& !flags.allBools | |||||
&& (aliases[key] ? !aliasIsBoolean(key) : true)) { | |||||
setArg(key, next, arg); | |||||
i++; | |||||
} | |||||
else if (/^(true|false)$/.test(next)) { | |||||
setArg(key, next === 'true', arg); | |||||
i++; | |||||
} | |||||
else { | |||||
setArg(key, flags.strings[key] ? '' : true, arg); | |||||
} | |||||
} | |||||
else if (/^-[^-]+/.test(arg)) { | |||||
var letters = arg.slice(1,-1).split(''); | |||||
var broken = false; | |||||
for (var j = 0; j < letters.length; j++) { | |||||
var next = arg.slice(j+2); | |||||
if (next === '-') { | |||||
setArg(letters[j], next, arg) | |||||
continue; | |||||
} | |||||
if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) { | |||||
setArg(letters[j], next.split('=')[1], arg); | |||||
broken = true; | |||||
break; | |||||
} | |||||
if (/[A-Za-z]/.test(letters[j]) | |||||
&& /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { | |||||
setArg(letters[j], next, arg); | |||||
broken = true; | |||||
break; | |||||
} | |||||
if (letters[j+1] && letters[j+1].match(/\W/)) { | |||||
setArg(letters[j], arg.slice(j+2), arg); | |||||
broken = true; | |||||
break; | |||||
} | |||||
else { | |||||
setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg); | |||||
} | |||||
} | |||||
var key = arg.slice(-1)[0]; | |||||
if (!broken && key !== '-') { | |||||
if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1]) | |||||
&& !flags.bools[key] | |||||
&& (aliases[key] ? !aliasIsBoolean(key) : true)) { | |||||
setArg(key, args[i+1], arg); | |||||
i++; | |||||
} | |||||
else if (args[i+1] && /true|false/.test(args[i+1])) { | |||||
setArg(key, args[i+1] === 'true', arg); | |||||
i++; | |||||
} | |||||
else { | |||||
setArg(key, flags.strings[key] ? '' : true, arg); | |||||
} | |||||
} | |||||
} | |||||
else { | |||||
if (!flags.unknownFn || flags.unknownFn(arg) !== false) { | |||||
argv._.push( | |||||
flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) | |||||
); | |||||
} | |||||
if (opts.stopEarly) { | |||||
argv._.push.apply(argv._, args.slice(i + 1)); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
Object.keys(defaults).forEach(function (key) { | |||||
if (!hasKey(argv, key.split('.'))) { | |||||
setKey(argv, key.split('.'), defaults[key]); | |||||
(aliases[key] || []).forEach(function (x) { | |||||
setKey(argv, x.split('.'), defaults[key]); | |||||
}); | |||||
} | |||||
}); | |||||
if (opts['--']) { | |||||
argv['--'] = new Array(); | |||||
notFlags.forEach(function(key) { | |||||
argv['--'].push(key); | |||||
}); | |||||
} | |||||
else { | |||||
notFlags.forEach(function(key) { | |||||
argv._.push(key); | |||||
}); | |||||
} | |||||
return argv; | |||||
}; | |||||
function hasKey (obj, keys) { | |||||
var o = obj; | |||||
keys.slice(0,-1).forEach(function (key) { | |||||
o = (o[key] || {}); | |||||
}); | |||||
var key = keys[keys.length - 1]; | |||||
return key in o; | |||||
} | |||||
function isNumber (x) { | |||||
if (typeof x === 'number') return true; | |||||
if (/^0x[0-9a-f]+$/i.test(x)) return true; | |||||
return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); | |||||
} |
// vValueHelper Tests | |||||
var proxiedDescriptor = (()=> { | |||||
var __values = []; | |||||
class proxiedDescriptorClass { | |||||
get [Symbol.toStringTag]() { return 'proxiedDescriptor';} | |||||
valueOf(){return 'pdc'} | |||||
} | |||||
var __composite = { a : '__composite'}; | |||||
console.dir(__composite) | |||||
function composite(){ | |||||
var o = js.isUndefined(__values[0]) ? __values[0] : js.assign(js.getTypeInfo(__values[0]).create(), ...__values) | |||||
return o; | |||||
} | |||||
let mutableTarget; | |||||
let mutableHandler; | |||||
function setHandler(handler) { | |||||
Object.keys(handler).forEach(key => { | |||||
const value = handler[key]; | |||||
if (typeof value !== 'function') { | |||||
// handler[key] = Reflect[key]; | |||||
throw new Error(`Trap "${key}: ${value}" is not a function`); | |||||
} | |||||
if (!Reflect[key]) { | |||||
throw new Error(`Trap "${key}: ${value}" is not a valid trap`); | |||||
} | |||||
}); | |||||
// mutableHandler = js.assign({}, Reflect, mutableHandler || {}, handler); | |||||
mutableHandler = js.assign(mutableHandler || {}, handler); | |||||
// mutableHandler = handler | |||||
} | |||||
function setTarget(target) { | |||||
// if (!(target instanceof Object)) { | |||||
// throw new Error(`Target "${target}" is not an object`); | |||||
// } | |||||
mutableTarget = target; | |||||
} | |||||
setTarget(() => {}); | |||||
// setHandler(Reflect); | |||||
console.log('-----MT---------') | |||||
console.dir(mutableTarget) | |||||
console.log('-----MT---------') | |||||
// Dynamically forward all the traps to the associated methods on the mutable handler | |||||
const handler = new Proxy({}, { | |||||
get(target, property) { | |||||
console.log('-----marker---------') | |||||
setTarget(composite()) | |||||
// console.dir(target) | |||||
// console.dir(Reflect.ownKeys) | |||||
console.log(property) | |||||
if(mutableHandler[property]) return (...args) => mutableHandler[property].apply(null, [mutableTarget, ...args.slice(1)]); | |||||
// else return (...args) => Reflect[property].apply(null, [mutableTarget, ...args.slice(1)]); | |||||
} | |||||
}); | |||||
var mutableProxyInstance = { | |||||
setHandler, | |||||
getTarget() { | |||||
return mutableTarget; | |||||
}, | |||||
getHandler() { | |||||
return mutableHandler; | |||||
}, | |||||
proxy: new Proxy(mutableTarget, handler) | |||||
}; | |||||
setHandler({ | |||||
getOwnPropertyDescriptor: function(target, prop) { | |||||
console.log('accessing prop : ') | |||||
console.dir(prop) | |||||
// console.dir(this) | |||||
o = composite() | |||||
console.dir(target) | |||||
var a = {value : undefined, configurable : true}; | |||||
if(!js.isUndefined(o)) a= Object.getOwnPropertyDescriptor(o, prop); | |||||
// if (a) a.value = this.get(o, prop); | |||||
return a; | |||||
// return function(){ | |||||
// console.log('in toString ....') | |||||
// var o = composite(); | |||||
// console.dir(o) | |||||
// return o | |||||
// } | |||||
} | |||||
, | |||||
// ownKeys : function(){ | |||||
// return Reflect.ownKeys(composite()) | |||||
// } | |||||
// , | |||||
get: function(target, name) { | |||||
console.log('accessing name : ') | |||||
console.dir(name) | |||||
console.log('target is now') | |||||
console.dir(target) | |||||
// console.log('' + (name == Symbol.toStringTag)) | |||||
// if(name == 'ownKeys') { | |||||
// return composite().ownKeys; | |||||
// } | |||||
if(js.isUndefined(target)) return Reflect[name]; | |||||
if( | |||||
name == util.inspect.custom | |||||
// || name == 'inspect' | |||||
// || name == Symbol.toStringTag | |||||
// || name == Symbol.iterator /*|| name == 'constructor' || name == 'toString' || name == 'valueOf'*/ | |||||
// || name == 'valueOf' | |||||
// && name != 'name' | |||||
) { | |||||
return function(){ | |||||
console.log('in toString ....') | |||||
var o = composite(); | |||||
console.dir(o) | |||||
return o | |||||
} | |||||
} | |||||
// else if( | |||||
// name == Symbol.toStringTag | |||||
// // || | |||||
// // name == 'toString' | |||||
// || name == 'valueOf' | |||||
// || name == Symbol.iterator /*|| name == 'constructor' || name == 'toString' || name == 'valueOf'*/ | |||||
// ) | |||||
// return JSON.stringify((function(){ | |||||
// console.log('in toString ....') | |||||
// var o = composite(); | |||||
// // console.dir(o) | |||||
// return o | |||||
// })() | |||||
// ) | |||||
// else | |||||
return (name == 'composite' ? composite() | |||||
// : name == 'toString' || name == 'valueOf' ? (function(){ | |||||
// console.log('in toString') | |||||
// // console.dir((js.isUndefined(__values[0]) ? __values[0] : js.assign(js.getTypeInfo(__values[0]).create(), ...__values))) | |||||
// return composite() | |||||
// }) | |||||
// : name == 'toValue' ? js.assign(js.getTypeInfo(__values[0]).create(), ...__values) | |||||
: name == 'current' ? Ref.isRef(__values[0]) ? __values[0].getValue() : __values[0] | |||||
: name == 'previous' ? Ref.isRef(__values[1]) ? __values[1].getValue() : __values[1] | |||||
: composite()[name] //Ref.isRef(__values[name]) ? __values[name].getValue() : __values[name] | |||||
) | |||||
} | |||||
, set: function(target, name, value) { | |||||
mutabletarget = __composite = composite(); | |||||
name == 'revise' ? (__values.splice(0, 0, value), value) | |||||
: name == 'precede' ? (__values.push(value), value) | |||||
: name == 'current' ? __values[0] = value | |||||
: __values[name] = value; | |||||
return __composite; | |||||
} | |||||
}) | |||||
var p = new Proxy(__composite, handler); | |||||
p.toString = function() { return 'ps tostring' } | |||||
return { | |||||
get : function(){ return p} | |||||
, set : function(value) { p.revise = value} | |||||
} | |||||
})() |
// var assert = require('assert'); | |||||
var assert = require('chai').assert | |||||
const util = require('util'); | |||||
var utils = require("../bbhverse-pb-wip/utils") | |||||
var js = utils.js; | |||||
const proxiedDescriptor = js.proxiedDescriptor; | |||||
const Ref = js.Ref; | |||||
const valueBackedAccessor = js.valueBackedAccessor; | |||||
describe('proxy', function() { | |||||
it('is not possible for', function() { | |||||
console.log(js.nonproxyable) | |||||
assert.ok(true) | |||||
}); | |||||
it('is possible for', function() { | |||||
console.log(js.proxyable) | |||||
assert.ok(true) | |||||
}); | |||||
}) | |||||
describe('mutableproxy', function() { | |||||
it('blank creation should be possible.', function() { | |||||
var mutableProxy = js.mutableProxy.create(); | |||||
console.dir(mutableProxy) | |||||
assert.ok(true) | |||||
}); | |||||
it('target should be switchable', function() { | |||||
var mutableProxy = js.mutableProxy.create({original : 'target at create time'}); | |||||
console.dir(mutableProxy) | |||||
js.mutableProxy.setTarget({'switched' : 'switched'}, mutableProxy) | |||||
assert.ok(true) | |||||
}); | |||||
it('handler should be switchable', function() { | |||||
var mutableProxy = js.mutableProxy.create({original : 'target at create time'}); | |||||
js.mutableProxy.setHandler({ | |||||
get : function(target, key){ | |||||
console.log('handler switch invoked : ') | |||||
// console.dir(meta.target) | |||||
// console.dir(arguments) | |||||
var args = Array.prototype.slice.call(arguments, 0); | |||||
args[0] = target; | |||||
return target[key] | |||||
return Reflect.apply(Reflect[key], target, args) | |||||
// var args = Array.prototype.slice.call(arguments, 0); | |||||
// args[0] = meta.target; | |||||
// return Reflect[key](...args) | |||||
} | |||||
}, mutableProxy) | |||||
console.dir(mutableProxy) | |||||
assert.ok(true) | |||||
}); | |||||
it('handler should be called', function() { | |||||
var mutableProxy = js.mutableProxy.create(); | |||||
// console.dir(mutableProxy); | |||||
// console.log(mutableProxy); | |||||
// js.mutableProxy.setTarget({ switched : 'switched'}, mutableProxy) | |||||
// console.dir(mutableProxy); | |||||
// console.log(mutableProxy); | |||||
var x = {} | |||||
js.mutableProxy.setHandler({ | |||||
get : function(target, key){ | |||||
console.log('handler switch invoked : ') | |||||
// console.dir(meta.target) | |||||
// console.dir(arguments) | |||||
var args = Array.prototype.slice.call(arguments, 0); | |||||
args[0] = target; | |||||
x = 'handler was called' | |||||
return target[key] | |||||
return Reflect.apply(Reflect[key], target, args) | |||||
// var args = Array.prototype.slice.call(arguments, 0); | |||||
// args[0] = meta.target; | |||||
// return Reflect[key](...args) | |||||
} | |||||
}, mutableProxy) | |||||
console.dir(mutableProxy); | |||||
console.log(mutableProxy); | |||||
js.mutableProxy.setTarget({ switched : 'handlerswitched'}, mutableProxy) | |||||
console.dir(mutableProxy); | |||||
console.log(mutableProxy); | |||||
assert.strictEqual('handler was called', x), 'but is not'; | |||||
}); | |||||
}) | |||||
describe('proxiedDescriptor', function() { | |||||
var o = {} | |||||
Object.defineProperty(o, 'vV', proxiedDescriptor.create()); | |||||
it('on create should be undefined', function() { | |||||
// console.log(o.vV) | |||||
// console.dir(o.vV) | |||||
assert.isUndefined(o.vV); | |||||
}); | |||||
it('after revision current should be {a : 4}', function() { | |||||
var x = { a: 5 } | |||||
o.vV = x; | |||||
console.dir(o.vV) | |||||
// console.log("" + (o.vV.current=== x)) | |||||
assert.deepEqual(o.vV, x); | |||||
// assert.strictEqual(o.vV.current, x), 'but is not'; | |||||
x = { a: 4 } | |||||
o.vV.revision = x | |||||
console.dir(o.vV) | |||||
assert.deepEqual(o.vV, x); | |||||
// assert.strictEqual(o.vV.previous, x), 'but is not'; | |||||
}); | |||||
it('valueBackedAccessor is unrevisioned unless revision is explicitly called.', function() { | |||||
var vValue = js.vValue; | |||||
var o1 = {} | |||||
Object.defineProperty(o1, 'vV', valueBackedAccessor.create()); | |||||
// initial uninitialized state... | |||||
console.log('console.log(cloned.vV)') | |||||
console.log(o1.vV) | |||||
console.log(Object.prototype.toString.call(o1.vV)) | |||||
console.log('---------------------------------------------') | |||||
console.log('console.dir(o1.vV)') | |||||
console.dir(o1.vV) | |||||
console.log(Object.prototype.toString.call(o1.vV)) | |||||
// throw 'done' | |||||
console.log('---------------------------------------------') | |||||
console.log('util.inspect(o1.vV)') | |||||
console.log(util.inspect(o1.vV)) | |||||
console.log(Object.prototype.toString.call(o1.vV)) | |||||
console.log('---------------------------------------------') | |||||
o1.vV = { d : 7 } | |||||
o1.vV = { e : 8 } | |||||
o1.vV = { f : "9 Nine" } | |||||
var ten = { g : "10" } | |||||
o1.vV = ten | |||||
// console.log(o1.vV === ten) | |||||
assert.deepEqual(o1.vV, ten); | |||||
assert.strictEqual(o1.vV.current, ten); | |||||
assert.strictEqual(o1.vV, ten), 'but is not vV[Proxy] cannot be equal to original object. Use vv[proxy].current === original value for comparison. '; | |||||
}); | |||||
it('proxiedDescriptor switch to composite revision', function() { | |||||
var ten = { g : "10" } | |||||
// proxiedDescriptor.ten = ten; | |||||
var o1 = js.Versioned.create(); | |||||
// Object.defineProperty(o1, 'vV', proxiedDescriptor.create(proxiedDescriptor.current)); | |||||
// o1.vV = null; | |||||
// initial uninitialized state... | |||||
console.log('console.log(cloned.vV)') | |||||
console.log(o1.vV) | |||||
console.log(Object.prototype.toString.call(o1.vV)) | |||||
console.log('---------------------------------------------') | |||||
console.log('console.dir(o1.vV)') | |||||
console.dir(o1.vV) | |||||
console.log(Object.prototype.toString.call(o1.vV)) | |||||
// throw 'done' | |||||
console.log('---------------------------------------------') | |||||
console.log('util.inspect(o1.vV)') | |||||
console.log(util.inspect(o1.vV)) | |||||
console.log(Object.prototype.toString.call(o1.vV)) | |||||
console.log('---------------------------------------------') | |||||
o1.vV = { d : 7 } | |||||
console.dir(o1.vV) | |||||
o1.vV = { e : 8 } | |||||
console.dir(o1.vV) | |||||
o1.vV = { f : "9 Nine" } | |||||
console.dir(o1.vV) | |||||
debugger | |||||
o1.vV = ten | |||||
var a = o1.vV; | |||||
o1.vV = ten | |||||
// console.log(util.inspect(o1.vV)) | |||||
// console.log((o1.vV === ten)) | |||||
console.dir(o1.vV) | |||||
console.dir(o1.vV.g) | |||||
assert.deepEqual(o1.vV, ten); | |||||
assert.strictEqual(o1.vV, a); // Self identity via proxy === proxy. Instead of target === target which is effectively the same.. | |||||
console.dir((ten == (+o1.vV))) // false Doesn't work. Throws exception when valueOf and toString return non primitives. | |||||
console.dir((ten === o1.vV)) // false Doesn't work. coz getter always returns a proxy and not the target. The target indeed is === ten. | |||||
// The options therefore as alternative or === which fails for proxies are as below. | |||||
// Explicitly call valueOf or use a helper which gets the real target of the proxy | |||||
console.dir((o1.vV.valueOf() === ten)) | |||||
assert.strictEqual(o1.vV.valueOf(), ten); | |||||
assert.strictEqual(js.Proxied.getTarget(o1.vV), ten); | |||||
// assert.strictEqual(o1.vV, ten); | |||||
var d = Object.getOwnPropertyDescriptor(o1, "vV"); | |||||
proxiedDescriptor.switchTo(d, proxiedDescriptor['composite revision']) | |||||
o1.vV = { eleven : '11'} | |||||
console.dir(o1.vV) | |||||
assert.deepEqual(o1.vV, { g : "10", eleven : '11' } ); | |||||
}); | |||||
it('series of changes should match', function() { | |||||
o.vV = { d : 7 } | |||||
o.vV.revision = { b: 6 } | |||||
o.vV.firstrevision = { c: 4 } | |||||
// console.log("" + (o.vV.current=== x)) | |||||
// console.dir(o.vV) | |||||
assert.deepEqual(o.vV.current, {b : 6} ); | |||||
o.vV.revision = { a : '4'} | |||||
assert.deepEqual(o.vV.previous, {b : 6}); | |||||
}); | |||||
}); | |||||
describe('Ref', function() { | |||||
var o = { a : "aaaaa", b : "bbbbb" } | |||||
var ref = js.Ref.create(o,'a') | |||||
// console.log('---------------------s assignment---') | |||||
var aaa = ref; | |||||
// console.log('---------------------e assignment---') | |||||
// console.dir(aaa) | |||||
it('ref should return transparent proxy', function() { | |||||
assert.strictEqual(ref, aaa, 'but does not'); | |||||
}); | |||||
it('ref() should return referenced value', function() { | |||||
assert.deepEqual(ref(), 'aaaaa', 'but does not'); | |||||
}); | |||||
}); | |||||
describe('exercise some calls', function() { | |||||
it('series of calls should not throw exceptions.', function() { | |||||
var cobj = { d : 'd', e : 5}; | |||||
var original = { a : 'a', b : 'b', cobj : cobj | |||||
, arrayContainingObjects : [ { o: 'o', arr : [1,2]}, cobj ] | |||||
, objectContainingArrays : { arr0 : ['o', 1, 'asd'], arr1 : [1,2]} | |||||
}; | |||||
// PB : TODO -- Test accessor descriptor and valueBackedAccessorDescriptor cases. | |||||
original.fobj = original.cobj; | |||||
original.orig = original; | |||||
Object.defineProperty(original, 'vba', js.valueBackedAccessor.create()); | |||||
original.vba = 'value set using setter' | |||||
console.log('original.vba : ') | |||||
console.dir(original.vba) | |||||
console.dir(original) | |||||
var d = Object.getOwnPropertyDescriptor(original, 'vba') | |||||
// console.log('valueBackedAccessor.isValueBackedAccessor(d)' + js.valueBackedAccessor.isValueBackedAccessor(d)); | |||||
// console.log('valueBackedAccessor.isValueBackedAccessor(d)' + js.valueBackedAccessor.isValueBackedAccessor({})); | |||||
var cloned = js.clone(false, original); | |||||
console.log('cloned.vba : ') | |||||
console.dir(cloned.vba) | |||||
console.dir(cloned) | |||||
console.log("isClone = " + (original !== cloned)) | |||||
console.log("isClone = " + (original.cobj !== cloned.cobj)) | |||||
console.log("isClone = " + (original.fobj !== cloned.fobj)) | |||||
console.log("isClone = " + (original.cobj === original.fobj)) | |||||
console.log("isClone = " + (cloned.cobj === cloned.fobj)) // Ref cloning. | |||||
console.log("descriptorRetrivalYieldsSameDescriptor = " + (Object.getOwnPropertyDescriptor(original, 'a') === Object.getOwnPropertyDescriptor(original, "a"))) | |||||
var linkedUsingAssign = {} | |||||
js.assign(linkedUsingAssign, cloned, cloned) | |||||
console.log('linkedUsingAssign.vba : ') | |||||
console.dir(linkedUsingAssign.vba) | |||||
console.dir(linkedUsingAssign) | |||||
// var a = { | |||||
// valueOf : function(){ return 'I am a'} | |||||
// , toString : function(){ return 'I am a'} | |||||
// } | |||||
// console.dir('' + a) | |||||
// vValueHelper Tests | |||||
// var proxiedDescriptor = js.proxiedDescriptor; | |||||
var vValue = js.vValue; | |||||
Object.defineProperty(cloned, 'vV', vValue.create()); | |||||
console.log('vValueHelper') | |||||
// initial uninitialized state... | |||||
console.log('console.log(cloned.vV)') | |||||
console.log(cloned.vV) | |||||
console.log(Object.prototype.toString.call(cloned.vV)) | |||||
console.log('---------------------------------------------') | |||||
console.log('console.dir(cloned.vV)') | |||||
console.dir(cloned.vV) | |||||
console.log(Object.prototype.toString.call(cloned.vV)) | |||||
// throw 'done' | |||||
console.log('---------------------------------------------') | |||||
console.log('util.inspect(cloned.vV)') | |||||
console.log(util.inspect(cloned.vV)) | |||||
console.log(Object.prototype.toString.call(cloned.vV)) | |||||
console.log('---------------------------------------------') | |||||
cloned.vV = { d : 7 } | |||||
// cloned.vV = { e : 8 } | |||||
// cloned.vV = { f : "9 Nine" } | |||||
// cloned.vV = { g : "10" } | |||||
cloned.vV.revision = { a: 5 } | |||||
cloned.vV.revision = { a: 6 } | |||||
cloned.vV.firstrevision = { c: 4 } | |||||
cloned.vV.previous = { c0: 'c0' } | |||||
cloned.vV.previous = { a: '4' } | |||||
console.log('console.log(cloned.vV)') | |||||
console.log(cloned.vV) | |||||
console.log('---------------------------------------------') | |||||
console.dir('console.dir(cloned.vV)') | |||||
console.dir(cloned.vV) | |||||
console.log('---------------------------------------------') | |||||
console.log('util.inspect(cloned.vV)') | |||||
console.log(util.inspect(cloned.vV)) | |||||
console.log('---------------------------------------------') | |||||
console.log('console.dir(cloned.vV.composite)') | |||||
console.dir(cloned.vV.composite) | |||||
console.dir(cloned.vV.previous) | |||||
console.dir(cloned.vV.current) | |||||
}); | |||||
}); | |||||
var assert = require('chai').assert | |||||
const util = require('util'); | |||||
var utils = require("../bbhverse-pb-wip/utils") | |||||
var js = utils.js; | |||||
const proxiedDescriptor = js.proxiedDescriptor; | |||||
const Ref = js.Ref; | |||||
const valueBackedAccessor = js.valueBackedAccessor; | |||||
var vValue = js.vValue; | |||||
// var o = {} | |||||
// Object.defineProperty(o, 'vV', proxiedDescriptor.create()); | |||||
// var x = { a: 5 } | |||||
// o.vV = x; | |||||
// console.dir(o.vV) | |||||
// // console.log("" + (o.vV.current=== x)) | |||||
// assert.strictEqual(o.vV.current, x); | |||||
// o.vV.revision = { a : '4'} | |||||
// assert.strictEqual(o.vV.previous, x); | |||||
console.dir(Reflect.ownKeys(Reflect)); | |||||
// Find proxyable types | |||||
(()=>{ | |||||
utils.js.typeInstances.forEach((instance)=>{ | |||||
try { | |||||
new Proxy(instance,{}) | |||||
js.proxyable.push(js.nativeType(instance)) | |||||
} | |||||
catch(e){ | |||||
js.nonproxyable.push(js.nativeType(instance)) | |||||
// console.log('Proxy not possible for : ' + js.nativeType(instance)) | |||||
// console.log(e); | |||||
} | |||||
}) | |||||
return; | |||||
})() | |||||
console.dir('console.dir(js.proxyable)'); | |||||
console.dir(js.proxyable) | |||||
console.dir('console.dir(js.nonproxyable)'); | |||||
console.dir(js.nonproxyable); | |||||
// Getter Setter test. | |||||
var vstore = ''; | |||||
var r = {} | |||||
Object.defineProperty(r, 'p',{ get : function(){ return 'u got me : ' + vstore }, set : function(v){ vstore = v}, enumerable:true }) | |||||
console.dir(r) | |||||
console.dir('***************-------- ') | |||||
r.p = 'Pvalue' | |||||
var ref = js.Ref.create(r, 'p') | |||||
console.dir(ref) | |||||
ref.y ='sadasdf' | |||||
console.dir(ref) | |||||
ref.assign('u set me') | |||||
ref.x = 'asd' | |||||
console.dir(ref) | |||||
console.dir(r) | |||||
r = {} | |||||
ref = js.Ref.create(r, 'p') | |||||
console.dir('***************-------- ') | |||||
console.dir(ref) | |||||
console.dir(typeof(ref)) | |||||
r.p = 'initialP' | |||||
console.dir(ref) | |||||
console.dir(typeof(ref)) | |||||
// PB : TODO -- Test | |||||
// r.p preexisting value or with data descriptor | |||||
// r.p with accessor that has side effects. | |||||
// r.p is an object. | |||||
r = { p : 'p'} | |||||
ref = js.Ref.create(r, 'p') | |||||
console.dir('***************-------- ') | |||||
console.dir(ref) | |||||
console.dir(typeof(ref)) | |||||
console.dir(typeof(new String('abc'))) | |||||
// console.dir('ref() -------- ') | |||||
// console.dir(ref()) | |||||
// console.dir('ref() -------- ') | |||||
ref.assign("P") | |||||
console.dir(ref) | |||||
// console.dir(Object.prototype.toString.call('astring')) | |||||
console.dir(r) | |||||
ref.assign("PP") | |||||
console.dir(ref) | |||||
console.dir(Object.prototype.toString.call(ref)) | |||||
console.dir(new String('asdfasdf')) | |||||
console.dir(Object.prototype.toString.call(new String('asdfasdf'))) | |||||
// console.dir(Object.prototype.toString.call(new Proxy(new String('rawproxy'), {}))) | |||||
console.dir(r) | |||||
r.p = "original replaced" | |||||
console.dir(ref) | |||||
console.dir(r) | |||||
// PB : TODO -- enable when ref extensions are implemented. | |||||
console.dir('ref.x') | |||||
console.dir(ref.x) | |||||
ref.x = 'X'; | |||||
console.dir(ref.x) | |||||
console.dir(ref) | |||||
console.dir(r) | |||||
console.dir(ref.substring(2,5)) | |||||
r.p = 'x after pchanged' | |||||
// ref.assign(Object.assign(new String('sdsd'), { p : r.p}) ) | |||||
console.dir(ref.x) | |||||
console.dir(ref) | |||||
console.dir(r) | |||||
ref.assign(new String('ref.assign')); | |||||
console.dir(ref.x) | |||||
console.dir(ref) | |||||
console.dir(r) | |||||
var ns = new String('sdsd') | |||||
console.dir(ns) | |||||
ns.x = 'X' | |||||
console.dir(ns) | |||||
// ref.p = "PLOP" | |||||
// console.dir(r) | |||||
// console.dir(ref.p) | |||||
// var o = js.Versioned.create(proxiedDescriptor['versioned current']) | |||||
var o = js.Versioned.create() | |||||
// o = 5; // This will destroy the reference to the prooxy received from Versioned.create. | |||||
// we cannot override assignment operator... | |||||
// therefore provision made for assign etc. methods for these types at the object level. | |||||
// to achieve a switch to the underlying content for the reference. | |||||
// property level assignment is possible through accessors or proxied descriptors. | |||||
o.assign(new String('ddd')); | |||||
console.dir('console.dir(o).......................') | |||||
// Object.keys(o) | |||||
console.dir(o) | |||||
console.dir('ssss' + o) | |||||
o.x = 'xtttt' | |||||
console.dir(o) | |||||
console.dir('sssfff : ' + o) | |||||
console.dir('console.dir(o).......................') | |||||
o.assign(new Number(5)); | |||||
console.dir('console.dir(o).......................') | |||||
console.dir(o) | |||||
console.dir('ssss' + o) | |||||
console.dir(3 + o) | |||||
console.dir('console.dir(o).......................') | |||||
// throw 'done' | |||||
o.assign(new Boolean(true)); | |||||
console.dir('console.dir(o).......................') | |||||
console.dir('ssss' + true) | |||||
console.dir(o) | |||||
console.dir('ssss' + o) | |||||
console.dir(3 + o) | |||||
console.dir(3 + true) | |||||
console.dir('console.dir(o).......................') | |||||
// throw 'here' | |||||
o = js.Versioned.create(o) // Doesn't work. | |||||
var x = { a: 5 } | |||||
o.vV = x; | |||||
console.dir(o.vV) | |||||
console.dir('console.dir(o).......................') | |||||
console.dir(o) | |||||
console.dir('console.dir(o).......................') | |||||
console.dir(o.vV) | |||||
// console.log("" + (o.vV.current=== x)) | |||||
console.log(assert.deepEqual(o.vV, x)); | |||||
// console.log(assert.strictEqual(o.vV, x, 'o being a Versioned o.vV and { a : 5 } found not strict equal')); | |||||
console.log(assert.strictEqual(o.vV.current, x, 'but is not')); | |||||
x = { a: 4 } | |||||
o.vV.revision = x | |||||
console.dir(o.vV) | |||||
assert.deepEqual(o.vV, x); | |||||
// assert.strictEqual(o.vV, x); // Strictequal will not match coz we get a proxy... | |||||
// If we expect this to match use x = js.Versioned.create(x) which will be the proxy that will allways match. | |||||
// PB : TODO -- We don't necessarily need to convert every property in x to a versioned property... | |||||
assert.strictEqual(o.vV.current, x), 'but is not'; | |||||
o = js.Versioned.create() | |||||
x = { a: 5 } | |||||
o.vV = x; | |||||
console.dir(o.vV) | |||||
// console.log("" + (o.vV.current=== x)) | |||||
assert.deepEqual(o.vV, x, 'o.vV and { a : 5} found equal'); | |||||
// assert.strictEqual(o.vV.current, x), 'but is not'; | |||||
x = { a: 4 } | |||||
o.vV = x | |||||
console.dir(o.vV) | |||||
assert.deepEqual(o.vV, x); | |||||
var ten = { g : "10" } | |||||
// proxiedDescriptor.ten = ten; | |||||
var o1 = js.Versioned.create(); | |||||
// Object.defineProperty(o1, 'vV', proxiedDescriptor.create(o1, 'vV', null, proxiedDescriptor.current)); | |||||
// o1.vV = null; | |||||
// initial uninitialized state... | |||||
console.log('console.log(cloned.vV)') | |||||
console.log(o1.vV) | |||||
console.log(Object.prototype.toString.call(o1.vV)) | |||||
console.log('---------------------------------------------') | |||||
console.log('console.dir(o1.vV)') | |||||
console.dir(o1.vV) | |||||
console.log(Object.prototype.toString.call(o1.vV)) | |||||
// throw 'done' | |||||
console.log('---------------------------------------------') | |||||
console.log('util.inspect(o1.vV)') | |||||
console.log(util.inspect(o1.vV)) | |||||
console.log(Object.prototype.toString.call(o1.vV)) | |||||
console.log('---------------------------------------------') | |||||
o1.vV = { d : 7 } | |||||
console.dir(o1.vV) | |||||
o1.vV = { e : 8 } | |||||
console.dir(o1.vV) | |||||
o1.vV = { f : "9 Nine" } | |||||
console.dir(o1.vV) | |||||
debugger | |||||
o1.vV = ten | |||||
var a = o1.vV; | |||||
o1.vV = ten | |||||
// console.log(util.inspect(o1.vV)) | |||||
// console.log((o1.vV === ten)) | |||||
console.dir(o1.vV) | |||||
console.dir(o1.vV.g) | |||||
assert.deepEqual(o1.vV, ten); | |||||
assert.strictEqual(o1.vV, a); // Self identity via proxy === proxy. Instead of target === target which is effectively the same.. | |||||
console.dir('(ten == (+o1.vV))') | |||||
// console.dir((ten == (+o1.vV))) // false Doesn't work. Throws exception when valueOf and toString return non primitives. | |||||
console.dir((ten == o1.vV)) | |||||
console.dir((ten === o1.vV)) // false Doesn't work. coz getter always returns a proxy and not the target. The target indeed is === ten. | |||||
// The options therefore as alternative or === which fails for proxies are as below. | |||||
// Explicitly call valueOf or use a helper which gets the real target of the proxy | |||||
console.dir('(o1.vV.valueOf() === ten)') | |||||
console.dir((o1.vV.valueOf() === ten)) | |||||
assert.strictEqual(o1.vV.valueOf(), ten); | |||||
assert.strictEqual(js.Proxied.getTarget(o1.vV), ten); | |||||
// assert.strictEqual(o1.vV, ten); | |||||
// Test descriptor | |||||
var c = proxiedDescriptor.create(o1, 'dD', null, proxiedDescriptor.current); | |||||
Object.defineProperty(o1, 'dD', c); | |||||
var dD = Object.getOwnPropertyDescriptor(o1, "dD"); | |||||
console.dir('console.dir(c === dD)') | |||||
console.dir(c === dD) | |||||
console.log((dD.get === c.get) + ' ' + 'dD.get === c.get') | |||||
var d = Object.getOwnPropertyDescriptor(o1, "vV"); | |||||
console.dir(d); | |||||
console.dir('switching proxiedDescriptor type to composite revision') | |||||
proxiedDescriptor.switchTo(d, proxiedDescriptor['composite revision']) | |||||
o1.vV = { eleven : '11'} | |||||
console.dir('o1.vV') | |||||
console.dir(o1.vV) | |||||
assert.deepEqual(o1.vV, { g : "10", eleven : '11' } ); | |||||
// Direct access test... | |||||
var vV = o1.vV; | |||||
vV.revision = { "12" : 12 } | |||||
console.dir(vV); | |||||
console.dir(vV.composite); | |||||
assert.deepEqual(vV, o1.vV ); | |||||
var v = ['a', 'b', 'c']; | |||||
var b = v.valueOf() | |||||
console.log(v===b) | |||||
console.dir(b) | |||||
// Deref Tests. | |||||
var proxT = { a : 'A', b : { bv : 'bv'}, c : ['e', 4, { x : 'x'}]} | |||||
var prox = js.mutableProxy.create(proxT) | |||||
prox = js.mutableProxy.create(prox) | |||||
prox = js.mutableProxy.create(prox) | |||||
console.dir(prox) | |||||
console.dir(proxT === prox) | |||||
prox = js.mutableProxy.create(prox) | |||||
prox = js.mutableProxy.create(prox) | |||||
prox = js.mutableProxy.create(prox) | |||||
console.dir(js.dereference(prox)) | |||||
console.dir(proxT === js.dereference(prox)) | |||||
elxr = utils.elxr | |||||
// var bitsToset = 0 | |||||
// for(var i=0; i<32; i++) {bitsToset = js.setBit(i, bitsToset)} | |||||
// console.dir('' + elxr.toBitString(bitsToset) + ' (' + elxr.toBitString(bitsToset).length + ')') | |||||
// var unusedmasks = [] | |||||
// console.dir(unusedmasks.pop()) | |||||
// elxr.generateBitMaskedSequence([4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]) | |||||
// elxr.insertBits(16, [1,2]) | |||||
console.dir(elxr.bitIndices) | |||||
console.dir(elxr.toBitString(elxr.bitIndices[31])) | |||||
console.dir(elxr.toBitString(elxr.insertBitsForMask(16, 6))) | |||||
var nwM = elxr.nextWithMask(6) | |||||
console.dir(elxr.toBitString(nwM.next().value)) | |||||
console.dir(elxr.toBitString(nwM.next().value)) | |||||
console.dir(elxr.toBitString(nwM.next().value)) | |||||
console.dir(elxr.toBitString(nwM.next().value)) |