fable 3.1.2 → 3.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/debug/Harness.js CHANGED
@@ -1,6 +1,23 @@
1
- // const libFable = require('../source/Fable.js');
1
+ const libFable = require('../source/Fable.js');
2
+
3
+ const _Fable = new libFable({"Product": "Harness"});
4
+
5
+ let tmpValue;
6
+
7
+ tmpValue = _Fable.Dates.dateDayDifference("2023-10-01", "2023-09-01");
8
+ console.log(`Difference in days: ${tmpValue}`);
9
+
10
+
11
+ tmpValue = _Fable.Dates.dateWeekDifference("2023-10-01", "2023-09-01");
12
+ console.log(`Difference in weeks: ${tmpValue}`);
13
+
14
+
15
+ tmpValue = _Fable.Dates.dateMonthDifference("2016-10-01", "2023-09-01");
16
+ console.log(`Difference in months: ${tmpValue}`);
17
+
18
+ tmpValue = _Fable.Dates.dateYearDifference("1963-10-01", "2023-09-01");
19
+ console.log(`Difference in years: ${tmpValue}`);
2
20
 
3
- // const _Fable = new libFable({"Product": "Hn"});
4
21
  // const _ExpressionParser = _Fable.instantiateServiceProviderIfNotExists('ExpressionParser');
5
22
 
6
23
  // const _Expression = "TotalCost = SUM(ItemCosts)";
@@ -32,4 +49,4 @@
32
49
  // }
33
50
  // console.log(`Result: ${tmpResult}`);
34
51
 
35
- const libMathHarness = require('../example_applications/mathematical_playground/Math-Solver-Harness.js');
52
+ //const libMathHarness = require('../example_applications/mathematical_playground/Math-Solver-Harness.js');
package/dist/fable.js CHANGED
@@ -3012,7 +3012,7 @@ try{if(!global.localStorage)return false;}catch(_){return false;}var val=global.
3012
3012
  // presumably different callback function.
3013
3013
  // This makes sure that own properties are retained, so that
3014
3014
  // decorations and such are not lost along the way.
3015
- module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!=='function')throw new TypeError('need wrapper function');Object.keys(fn).forEach(function(k){wrapper[k]=fn[k];});return wrapper;function wrapper(){var args=new Array(arguments.length);for(var i=0;i<args.length;i++){args[i]=arguments[i];}var ret=fn.apply(this,args);var cb=args[args.length-1];if(typeof ret==='function'&&ret!==cb){Object.keys(cb).forEach(function(k){ret[k]=cb[k];});}return ret;}}},{}],130:[function(require,module,exports){module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(){var target={};for(var i=0;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;}},{}],131:[function(require,module,exports){module.exports={"name":"fable","version":"3.1.2","description":"A service dependency injection, configuration and logging library.","main":"source/Fable.js","scripts":{"start":"node source/Fable.js","coverage":"./node_modules/.bin/nyc --reporter=lcov --reporter=text-lcov ./node_modules/mocha/bin/_mocha -- -u tdd -R spec","test":"./node_modules/.bin/mocha -u tdd -R spec","build":"npx quack build","docker-dev-build":"docker build ./ -f Dockerfile_LUXURYCode -t fable-image:local","docker-dev-run":"docker run -it -d --name fable-dev -p 30001:8080 -p 38086:8086 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/fable\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" fable-image:local","docker-dev-shell":"docker exec -it fable-dev /bin/bash","tests":"./node_modules/mocha/bin/_mocha -u tdd --exit -R spec --grep"},"mocha":{"diff":true,"extension":["js"],"package":"./package.json","reporter":"spec","slow":"75","timeout":"5000","ui":"tdd","watch-files":["source/**/*.js","test/**/*.js"],"watch-ignore":["lib/vendor"]},"browser":{"./source/service/Fable-Service-EnvironmentData.js":"./source/service/Fable-Service-EnvironmentData-Web.js","./source/service/Fable-Service-FilePersistence.js":"./source/service/Fable-Service-FilePersistence-Web.js"},"repository":{"type":"git","url":"https://github.com/stevenvelozo/fable.git"},"keywords":["entity","behavior"],"author":"Steven Velozo <steven@velozo.com> (http://velozo.com/)","license":"MIT","bugs":{"url":"https://github.com/stevenvelozo/fable/issues"},"homepage":"https://github.com/stevenvelozo/fable","devDependencies":{"quackage":"^1.0.38"},"dependencies":{"async.eachlimit":"^0.5.2","async.waterfall":"^0.5.2","big.js":"^6.2.2","cachetrax":"^1.0.4","cookie":"^0.6.0","data-arithmatic":"^1.0.7","dayjs":"^1.11.13","fable-log":"^3.0.16","fable-serviceproviderbase":"^3.0.15","fable-settings":"^3.0.12","fable-uuid":"^3.0.11","manyfest":"^1.0.38","simple-get":"^4.0.1"}};},{}],132:[function(require,module,exports){/**
3015
+ module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!=='function')throw new TypeError('need wrapper function');Object.keys(fn).forEach(function(k){wrapper[k]=fn[k];});return wrapper;function wrapper(){var args=new Array(arguments.length);for(var i=0;i<args.length;i++){args[i]=arguments[i];}var ret=fn.apply(this,args);var cb=args[args.length-1];if(typeof ret==='function'&&ret!==cb){Object.keys(cb).forEach(function(k){ret[k]=cb[k];});}return ret;}}},{}],130:[function(require,module,exports){module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(){var target={};for(var i=0;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;}},{}],131:[function(require,module,exports){module.exports={"name":"fable","version":"3.1.3","description":"A service dependency injection, configuration and logging library.","main":"source/Fable.js","scripts":{"start":"node source/Fable.js","coverage":"./node_modules/.bin/nyc --reporter=lcov --reporter=text-lcov ./node_modules/mocha/bin/_mocha -- -u tdd -R spec","test":"./node_modules/.bin/mocha -u tdd -R spec","build":"npx quack build","docker-dev-build":"docker build ./ -f Dockerfile_LUXURYCode -t fable-image:local","docker-dev-run":"docker run -it -d --name fable-dev -p 30001:8080 -p 38086:8086 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/fable\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" fable-image:local","docker-dev-shell":"docker exec -it fable-dev /bin/bash","tests":"./node_modules/mocha/bin/_mocha -u tdd --exit -R spec --grep"},"mocha":{"diff":true,"extension":["js"],"package":"./package.json","reporter":"spec","slow":"75","timeout":"5000","ui":"tdd","watch-files":["source/**/*.js","test/**/*.js"],"watch-ignore":["lib/vendor"]},"browser":{"./source/service/Fable-Service-EnvironmentData.js":"./source/service/Fable-Service-EnvironmentData-Web.js","./source/service/Fable-Service-FilePersistence.js":"./source/service/Fable-Service-FilePersistence-Web.js"},"repository":{"type":"git","url":"https://github.com/stevenvelozo/fable.git"},"keywords":["entity","behavior"],"author":"Steven Velozo <steven@velozo.com> (http://velozo.com/)","license":"MIT","bugs":{"url":"https://github.com/stevenvelozo/fable/issues"},"homepage":"https://github.com/stevenvelozo/fable","devDependencies":{"quackage":"^1.0.41"},"dependencies":{"async.eachlimit":"^0.5.2","async.waterfall":"^0.5.2","big.js":"^6.2.2","cachetrax":"^1.0.4","cookie":"^0.6.0","data-arithmatic":"^1.0.7","dayjs":"^1.11.13","fable-log":"^3.0.16","fable-serviceproviderbase":"^3.0.15","fable-settings":"^3.0.12","fable-uuid":"^3.0.11","manyfest":"^1.0.38","simple-get":"^4.0.1"}};},{}],132:[function(require,module,exports){/**
3016
3016
  * Fable Application Services Support Library
3017
3017
  * @author <steven@velozo.com>
3018
3018
  */ // Pre-init services
@@ -3423,7 +3423,43 @@ this.plugin_advancedFormat=require('dayjs/plugin/advancedFormat');this.dayJS.ext
3423
3423
  // You would do the following:
3424
3424
  // const localeDE = require('dayjs/locale/de');
3425
3425
  // _Fable.Dates.dayJS.locale('de');
3426
- }}module.exports=DateManipulation;},{"dayjs":28,"dayjs/plugin/advancedFormat":29,"dayjs/plugin/isoWeek":30,"dayjs/plugin/relativeTime":31,"dayjs/plugin/timezone":32,"dayjs/plugin/utc":33,"dayjs/plugin/weekOfYear":34,"dayjs/plugin/weekday":35,"fable-serviceproviderbase":53}],139:[function(require,module,exports){const libFableServiceBase=require('fable-serviceproviderbase');class FableServiceEnvironmentData extends libFableServiceBase{constructor(pFable,pOptions,pServiceHash){super(pFable,pOptions,pServiceHash);this.serviceType='EnvironmentData';this.Environment=`node.js`;}}module.exports=FableServiceEnvironmentData;},{"fable-serviceproviderbase":53}],140:[function(require,module,exports){const{PE}=require('big.js');const libFableServiceBase=require('fable-serviceproviderbase');/* Trying a different pattern for this service ...
3426
+ }/**
3427
+ * Calculates the difference in days between two dates.
3428
+ *
3429
+ * @param {string|Date|number} pDateStart - The start date. Can be a string, Date object, or timestamp.
3430
+ * @param {string|Date|number} pDateEnd - The end date. Can be a string, Date object, or timestamp. Defaults to the current date if not provided.
3431
+ * @returns {number} The difference in days between the start and end dates. Returns NaN if the start date is invalid.
3432
+ */dateDayDifference(pDateStart,pDateEnd){// If there is not a valid start date, return NaN
3433
+ if(pDateStart===undefined||pDateStart===null||pDateStart===''){return NaN;}let tmpStartDate=this.dayJS(pDateStart);// Without a valid end date, dayJS defaults to the current date
3434
+ let tmpEndDate=this.dayJS(pDateEnd);// Returns the difference in days between two dates
3435
+ return tmpEndDate.diff(tmpStartDate,'day');}/**
3436
+ * Calculates the difference in weeks between two dates.
3437
+ *
3438
+ * @param {string|Date|number} pDateStart - The start date. Can be a string, Date object, or timestamp.
3439
+ * @param {string|Date|number} pDateEnd - The end date. Can be a string, Date object, or timestamp. Defaults to the current date if not provided.
3440
+ * @returns {number} The difference in weeks between the two dates. Returns NaN if the start date is invalid.
3441
+ */dateWeekDifference(pDateStart,pDateEnd){// If there is not a valid start date, return NaN
3442
+ if(pDateStart===undefined||pDateStart===null||pDateStart===''){return NaN;}let tmpStartDate=this.dayJS(pDateStart);// Without a valid end date, dayJS defaults to the current date
3443
+ let tmpEndDate=this.dayJS(pDateEnd);// Returns the difference in weeks between two dates
3444
+ return tmpEndDate.diff(tmpStartDate,'week');}/**
3445
+ * Calculates the difference in months between two dates.
3446
+ *
3447
+ * @param {string|Date|number} pDateStart - The start date. Can be a string, Date object, or timestamp.
3448
+ * @param {string|Date|number} pDateEnd - The end date. Can be a string, Date object, or timestamp. Defaults to the current date if not provided.
3449
+ * @returns {number} The difference in months between the two dates. Returns NaN if the start date is invalid.
3450
+ */dateMonthDifference(pDateStart,pDateEnd){// If there is not a valid start date, return NaN
3451
+ if(pDateStart===undefined||pDateStart===null||pDateStart===''){return NaN;}let tmpStartDate=this.dayJS(pDateStart);// Without a valid end date, dayJS defaults to the current date
3452
+ let tmpEndDate=this.dayJS(pDateEnd);// Returns the difference in months between two dates
3453
+ return tmpEndDate.diff(tmpStartDate,'month');}/**
3454
+ * Calculates the difference in years between two dates.
3455
+ *
3456
+ * @param {string|Date|number} pDateStart - The start date. Can be a string, Date object, or timestamp.
3457
+ * @param {string|Date|number} pDateEnd - The end date. Can be a string, Date object, or timestamp. Defaults to the current date if not provided.
3458
+ * @returns {number} The difference in years between the two dates. Returns NaN if the start date is invalid.
3459
+ */dateYearDifference(pDateStart,pDateEnd){// If there is not a valid start date, return NaN
3460
+ if(pDateStart===undefined||pDateStart===null||pDateStart===''){return NaN;}let tmpStartDate=this.dayJS(pDateStart);// Without a valid end date, dayJS defaults to the current date
3461
+ let tmpEndDate=this.dayJS(pDateEnd);// Returns the difference in years between two dates
3462
+ return tmpEndDate.diff(tmpStartDate,'year');}}module.exports=DateManipulation;},{"dayjs":28,"dayjs/plugin/advancedFormat":29,"dayjs/plugin/isoWeek":30,"dayjs/plugin/relativeTime":31,"dayjs/plugin/timezone":32,"dayjs/plugin/utc":33,"dayjs/plugin/weekOfYear":34,"dayjs/plugin/weekday":35,"fable-serviceproviderbase":53}],139:[function(require,module,exports){const libFableServiceBase=require('fable-serviceproviderbase');class FableServiceEnvironmentData extends libFableServiceBase{constructor(pFable,pOptions,pServiceHash){super(pFable,pOptions,pServiceHash);this.serviceType='EnvironmentData';this.Environment=`node.js`;}}module.exports=FableServiceEnvironmentData;},{"fable-serviceproviderbase":53}],140:[function(require,module,exports){const{PE}=require('big.js');const libFableServiceBase=require('fable-serviceproviderbase');/* Trying a different pattern for this service ...
3427
3463
  *
3428
3464
  * This service is a simple expression parser that can handle math expressions, with magic(tm) lookup of addresses with a manifest.
3429
3465
  *
@@ -3562,7 +3598,7 @@ tmpCurrentTokenType='Value';tmpCurrentToken+=tmpCharacter;// continue;
3562
3598
  // }
3563
3599
  // tmpResults.ExpressionParserLog.push(`ExpressionParser.tokenize found an unknown character code ${tmpCharCode} character ${tmpCharacter} in the expression: ${pExpression} at index ${i}`);
3564
3600
  // this.log.warn(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);
3565
- }if(tmpCurrentTokenType&&tmpCurrentToken.length>0){tmpResults.RawTokens.push(tmpCurrentToken);}return tmpResults.RawTokens;}}module.exports=ExpressionTokenizer;},{"./Fable-Service-ExpressionParser-Base.js":141}],143:[function(require,module,exports){module.exports={"sqrt":{"Name":"Square Root","Address":"fable.Math.sqrtPrecise"},"abs":{"Name":"Absolute Value","Address":"fable.Math.absPrecise"},"floor":{"Name":"Floor Value","Address":"fable.Math.floorPrecise"},"ceil":{"Name":"Ceiling Value","Address":"fable.Math.ceilPrecise"},"rad":{"Name":"Degrees to Radians","Address":"fable.Math.radPrecise"},"pi":{"Name":"Pi","Address":"fable.Math.piPrecise"},"sin":{"Name":"Sine","Address":"fable.Math.sin"},"cos":{"Name":"Cosine","Address":"fable.Math.cos"},"tan":{"Name":"Tangent","Address":"fable.Math.tan"},"count":{"Name":"Count Set Elements","Address":"fable.Math.countSetElements"},"sortset":{"Name":"Sort Set","Address":"fable.Math.sortSetPrecise"},"bucketset":{"Name":"Bucket Set","Address":"fable.Math.bucketSetPrecise"},"sorthistogram":{"Name":"Sort Histogram","Address":"fable.Math.sortHistogramPrecise"},"max":{"Name":"Maximum","Address":"fable.Math.maxPrecise"},"min":{"Name":"Minimum","Address":"fable.Math.minPrecise"},"sum":{"Name":"Sum","Address":"fable.Math.sumPrecise"},"avg":{"Name":"Average","Address":"fable.Math.averagePrecise"},"mean":{"Name":"Mean","Address":"fable.Math.meanPrecise"},"median":{"Name":"Median","Address":"fable.Math.medianPrecise"},"mode":{"Name":"Mode","Address":"fable.Math.modePrecise"},"round":{"Name":"Round","Address":"fable.Math.roundPrecise"},"cumulativesummation":{"Name":"Count Set Elements in a Histogram or Value Map","Address":"fable.Math.cumulativeSummation"},"countsetelements":{"Name":"Count Set Elements in a Histogram or Value Map","Address":"fable.Math.countSetElements"},"getvalue":{"Name":"Get Value from Application State or Services (AppData, etc.)","Address":"fable.Utility.getInternalValueByHash"},"aggregationhistogram":{"Name":"Generate a Histogram by Exact Value Aggregation","Address":"fable.Math.histogramAggregationByExactValueFromInternalState"},"distributionhistogram":{"Name":"Generate a Histogram Based on Value Distribution","Address":"fable.Math.histogramDistributionByExactValueFromInternalState"},"getvaluearray":{"Name":"Get Value Array from Application State or Services (AppData, etc.)","Address":"fable.Utility.createValueArrayByHashParametersFromInternal"},"getvalueobject":{"Name":"Get Value Object from Application State or Services (AppData, etc.)","Address":"fable.Utility.createValueObjectByHashParametersFromInternal"},"cleanvaluearray":{"Name":"Clean Value Array","Address":"fable.Math.cleanValueArray"},"cleanvalueobject":{"Name":"Clean Value Object","Address":"fable.Math.cleanValueObject"},"randominteger":{"Name":"Random Integer","Address":"fable.DataGeneration.randomInteger"},"randomintegerbetween":{"Name":"Random Integer Between Two Numbers","Address":"fable.DataGeneration.randomIntegerBetween"},"randomintegerupto":{"Name":"Random Integer","Address":"fable.DataGeneration.randomIntegerUpTo"},"randomfloat":{"Name":"Random Float","Address":"fable.DataGeneration.randomFloat"},"randomfloatbetween":{"Name":"Random Float","Address":"fable.DataGeneration.randomFloatBetween"},"randomfloatupto":{"Name":"Random Float","Address":"fable.DataGeneration.randomFloatUpTo"}};},{}],144:[function(require,module,exports){const libExpressionParserOperationBase=require('./Fable-Service-ExpressionParser-Base.js');class ExpressionParserLinter extends libExpressionParserOperationBase{constructor(pFable,pOptions,pServiceHash){super(pFable,pOptions,pServiceHash);this.serviceType='ExpressionParser-Linter';}lintTokenizedExpression(pTokenizedExpression,pResultObject){let tmpResults=typeof pResultObject==='object'?pResultObject:{ExpressionParserLog:[]};tmpResults.LinterResults=[];// Guard against bad data being passed in
3601
+ }if(tmpCurrentTokenType&&tmpCurrentToken.length>0){tmpResults.RawTokens.push(tmpCurrentToken);}return tmpResults.RawTokens;}}module.exports=ExpressionTokenizer;},{"./Fable-Service-ExpressionParser-Base.js":141}],143:[function(require,module,exports){module.exports={"sqrt":{"Name":"Square Root","Address":"fable.Math.sqrtPrecise"},"percent":{"Name":"Compute Percent (in IS over OF format)","Address":"fable.Math.percentagePrecise"},"compare":{"Name":"Compare","Address":"fable.Math.comparePrecise"},"abs":{"Name":"Absolute Value","Address":"fable.Math.absPrecise"},"floor":{"Name":"Floor Value","Address":"fable.Math.floorPrecise"},"ceil":{"Name":"Ceiling Value","Address":"fable.Math.ceilPrecise"},"rad":{"Name":"Degrees to Radians","Address":"fable.Math.radPrecise"},"pi":{"Name":"Pi","Address":"fable.Math.piPrecise"},"euler":{"Name":"Euler","Address":"fable.Math.eulerPrecise"},"sin":{"Name":"Sine","Address":"fable.Math.sin"},"cos":{"Name":"Cosine","Address":"fable.Math.cos"},"tan":{"Name":"Tangent","Address":"fable.Math.tan"},"count":{"Name":"Count Set Elements","Address":"fable.Math.countSetElements"},"countset":{"Name":"Count Set Elements","Address":"fable.Math.countSetElements"},"sortset":{"Name":"Sort Set","Address":"fable.Math.sortSetPrecise"},"bucketset":{"Name":"Bucket Set","Address":"fable.Math.bucketSetPrecise"},"sorthistogram":{"Name":"Sort Histogram","Address":"fable.Math.sortHistogramPrecise"},"max":{"Name":"Maximum","Address":"fable.Math.maxPrecise"},"min":{"Name":"Minimum","Address":"fable.Math.minPrecise"},"sum":{"Name":"Sum","Address":"fable.Math.sumPrecise"},"avg":{"Name":"Average","Address":"fable.Math.averagePrecise"},"mean":{"Name":"Mean","Address":"fable.Math.meanPrecise"},"median":{"Name":"Median","Address":"fable.Math.medianPrecise"},"mode":{"Name":"Mode","Address":"fable.Math.modePrecise"},"round":{"Name":"Round","Address":"fable.Math.roundPrecise"},"tofixed":{"Name":"To Fixed","Address":"fable.Math.toFixedPrecise"},"cumulativesummation":{"Name":"Count Set Elements in a Histogram or Value Map","Address":"fable.Math.cumulativeSummation"},"countsetelements":{"Name":"Count Set Elements in a Histogram or Value Map","Address":"fable.Math.countSetElements"},"getvalue":{"Name":"Get Value from Application State or Services (AppData, etc.)","Address":"fable.Utility.getInternalValueByHash"},"entryinset":{"Name":"Entry in Set","Address":"fable.Math.entryInSet"},"smallestInSet":{"Name":"Smallest in Set","Address":"fable.Math.smallestInSet"},"largestInSet":{"Name":"Largest in Set","Address":"fable.Math.largestInSet"},"aggregationhistogram":{"Name":"Generate a Histogram by Exact Value Aggregation","Address":"fable.Math.histogramAggregationByExactValueFromInternalState"},"distributionhistogram":{"Name":"Generate a Histogram Based on Value Distribution","Address":"fable.Math.histogramDistributionByExactValueFromInternalState"},"setconcatenate":{"Name":"Set Concatenate","Address":"fable.Math.setConcatenate"},"getvaluearray":{"Name":"Get Value Array from Application State or Services (AppData, etc.)","Address":"fable.Utility.createValueArrayByHashParametersFromInternal"},"getvalueobject":{"Name":"Get Value Object from Application State or Services (AppData, etc.)","Address":"fable.Utility.createValueObjectByHashParametersFromInternal"},"cleanvaluearray":{"Name":"Clean Value Array","Address":"fable.Math.cleanValueArray"},"cleanvalueobject":{"Name":"Clean Value Object","Address":"fable.Math.cleanValueObject"},"randominteger":{"Name":"Random Integer","Address":"fable.DataGeneration.randomInteger"},"randomintegerbetween":{"Name":"Random Integer Between Two Numbers","Address":"fable.DataGeneration.randomIntegerBetween"},"randomintegerupto":{"Name":"Random Integer","Address":"fable.DataGeneration.randomIntegerUpTo"},"randomfloat":{"Name":"Random Float","Address":"fable.DataGeneration.randomFloat"},"randomfloatbetween":{"Name":"Random Float","Address":"fable.DataGeneration.randomFloatBetween"},"randomfloatupto":{"Name":"Random Float","Address":"fable.DataGeneration.randomFloatUpTo"},"datedaydifference":{"Name":"Date Difference in Days","Address":"fable.Dates.dateDayDifference"},"dateweekdifference":{"Name":"Date Difference in Weeks","Address":"fable.Dates.dateWeekDifference"},"datemonthdifference":{"Name":"Date Difference in Months","Address":"fable.Dates.dateMonthDifference"},"dateyeardifference":{"Name":"Date Difference in Years","Address":"fable.Dates.dateYearDifference"},"createValueObjectByHashes":{"Name":"Create Value Object by Hashes","Address":"fable.Utility.createValueObjectByHashes"}};},{}],144:[function(require,module,exports){const libExpressionParserOperationBase=require('./Fable-Service-ExpressionParser-Base.js');class ExpressionParserLinter extends libExpressionParserOperationBase{constructor(pFable,pOptions,pServiceHash){super(pFable,pOptions,pServiceHash);this.serviceType='ExpressionParser-Linter';}lintTokenizedExpression(pTokenizedExpression,pResultObject){let tmpResults=typeof pResultObject==='object'?pResultObject:{ExpressionParserLog:[]};tmpResults.LinterResults=[];// Guard against bad data being passed in
3566
3602
  if(!Array.isArray(pTokenizedExpression)){tmpResults.ExpressionParserLog.push(`ERROR: ExpressionParser.lintTokenizedExpression was passed a non-array tokenized expression.`);tmpResults.LinterResults.push(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);this.log.error(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);return pTokenizedExpression;}if(pTokenizedExpression.length<1){tmpResults.ExpressionParserLog.push(`ERROR: ExpressionParser.lintTokenizedExpression was passed an empty tokenized expression.`);tmpResults.LinterResults.push(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);this.log.error(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);return pTokenizedExpression;}// 1. Check for balanced parenthesis
3567
3603
  let tmpParenthesisDepth=0;// If it is in a state address, we don't care about the parenthesis
3568
3604
  // State addresses are between squiggly brackets
@@ -3757,7 +3793,8 @@ return this.makeFolderRecursive(tmpParameters,fCallback);}else{console.log(pCrea
3757
3793
  * @description Simple functions that perform arbitrary precision math operations and return string resultant values. Wraps big.js
3758
3794
  * @class FableServiceMath
3759
3795
  * @extends libFableServiceBase
3760
- */class FableServiceMath extends libFableServiceBase{constructor(pFable,pOptions,pServiceHash){super(pFable,pOptions,pServiceHash);this.serviceType='Math';this.pi='3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679';// this.manifest = this.fable.newManyfest();
3796
+ */class FableServiceMath extends libFableServiceBase{constructor(pFable,pOptions,pServiceHash){super(pFable,pOptions,pServiceHash);this.serviceType='Math';this.pi='3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679';// From NASA: https://apod.nasa.gov/htmltest/gifcity/e.2mil
3797
+ this.euler='2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664';// this.manifest = this.fable.newManyfest();
3761
3798
  }/*
3762
3799
  Pass-through Rounding Method Constants
3763
3800
 
@@ -3906,6 +3943,11 @@ let tmpResult=tmpDegreesArbitraryValue.times(Math.PI).div(180);return tmpResult.
3906
3943
  * @param {number} [pPrecision] - The precision to use for calculating pi.
3907
3944
  * @returns {number} - The calculated value of pi.
3908
3945
  */piPrecise(pPrecision){if(typeof pPrecision==='undefined'){return this.pi;}else{return this.roundPrecise(this.pi,pPrecision);}}/**
3946
+ * Calculates the value of euler with the specified precision.
3947
+ *
3948
+ * @param {number} [pPrecision] - The precision to use for calculating E.
3949
+ * @returns {number} - The calculated value of E.
3950
+ */eulerPrecise(pPrecision){if(typeof pPrecision==='undefined'){return this.euler;}else{return this.roundPrecise(this.euler,pPrecision);}}/**
3909
3951
  * Calculates the sine of the given angle in radians.
3910
3952
  *
3911
3953
  * @param {number} pRadians - The angle in radians.
@@ -3962,13 +4004,32 @@ return 1;}return 0;}/**
3962
4004
  * Make a histogram of representative counts for exact values (.tostring() is the keys to count)
3963
4005
  * @param {Array} pValueSet
3964
4006
  * @param {string} pValueAddress
3965
- */histogramAggregationByExactValue(pValueObjectSet,pValueAddress,pValueAmountAddress,pManifest){if(!Array.isArray(pValueObjectSet)){return pValueObjectSet;}if(!pValueAddress||!pValueAmountAddress){return{};}let tmpHistogram={};for(let i=0;i<pValueObjectSet.length;i++){let tmpValue=this.fable.Utility.getValueByHash(pValueObjectSet[i],pValueAddress,pManifest).toString();let tmpAmount=this.parsePrecise(this.fable.Utility.getValueByHash(pValueObjectSet[i],pValueAmountAddress,pManifest),NaN);if(!(tmpValue in tmpHistogram)){tmpHistogram[tmpValue]=0;}if(!isNaN(tmpAmount)){tmpHistogram[tmpValue]=this.addPrecise(tmpHistogram[tmpValue],tmpAmount);}}return tmpHistogram;}histogramAggregationByExactValueFromInternalState(pValueObjectSetAddress,pValueAddress,pValueAmountAddress){if(!pValueObjectSetAddress){return{};}let tmpValueObjectSet=this.fable.Utility.getInternalValueByHash(pValueObjectSetAddress);return this.histogramAggregationByExactValue(tmpValueObjectSet,pValueAddress,pValueAmountAddress);}/**
4007
+ */histogramAggregationByExactValue(pValueObjectSet,pValueAddress,pValueAmountAddress,pManifest){if(!Array.isArray(pValueObjectSet)){return pValueObjectSet;}if(!pValueAddress||!pValueAmountAddress){return{};}let tmpHistogram={};for(let i=0;i<pValueObjectSet.length;i++){let tmpValue=this.fable.Utility.getValueByHash(pValueObjectSet[i],pValueAddress,pManifest).toString();let tmpAmount=this.parsePrecise(this.fable.Utility.getValueByHash(pValueObjectSet[i],pValueAmountAddress,pManifest),NaN);if(!(tmpValue in tmpHistogram)){tmpHistogram[tmpValue]=0;}if(!isNaN(tmpAmount)){tmpHistogram[tmpValue]=this.addPrecise(tmpHistogram[tmpValue],tmpAmount);}}return tmpHistogram;}/**
4008
+ * Aggregates a histogram by exact value from an internal state object.
4009
+ *
4010
+ * @param {string} pValueObjectSetAddress - The address of the internal value object set.
4011
+ * @param {string} pValueAddress - The address of the value to aggregate by.
4012
+ * @param {string} pValueAmountAddress - The address of the amount to aggregate.
4013
+ * @returns {Object} The aggregated histogram object. Returns an empty object if the value object set address is not provided.
4014
+ */histogramAggregationByExactValueFromInternalState(pValueObjectSetAddress,pValueAddress,pValueAmountAddress){if(!pValueObjectSetAddress){return{};}let tmpValueObjectSet=this.fable.Utility.getInternalValueByHash(pValueObjectSetAddress);return this.histogramAggregationByExactValue(tmpValueObjectSet,pValueAddress,pValueAmountAddress);}/**
3966
4015
  * Given a value object set (an array of objects), find a specific entry when
3967
4016
  * sorted by a specific value address. Supports -1 syntax for last entry.
3968
4017
  * @param {Array} pValueObjectSet
3969
4018
  * @param {string} pValueAddress
3970
4019
  * @param {Object} pManifest
3971
- */entryInSet(pValueObjectSet,pValueAddress,pEntryIndex){if(!Array.isArray(pValueObjectSet)){return pValueObjectSet;}if(!pValueAddress){return false;}if(isNaN(pEntryIndex)||pEntryIndex>=pValueObjectSet.length){return false;}let tmpValueArray=pValueObjectSet.toSorted((pLeft,pRight)=>{return this.comparePrecise(pLeft,pRight);});let tmpIndex=pEntryIndex===-1?tmpValueArray.length-1:pEntryIndex;return tmpValueArray[tmpIndex];}smallestInSet(pValueObjectSet,pValueAddress){return this.entryInSet(pValueObjectSet,pValueAddress,0);}largestInSet(pValueObjectSet,pValueAddress){return this.entryInSet(pValueObjectSet,pValueAddress,-1);}/**
4020
+ */entryInSet(pValueObjectSet,pValueAddress,pEntryIndex){if(!Array.isArray(pValueObjectSet)){return pValueObjectSet;}if(!pValueAddress){return false;}if(isNaN(pEntryIndex)||pEntryIndex>=pValueObjectSet.length){return false;}let tmpValueArray=pValueObjectSet.toSorted((pLeft,pRight)=>{return this.comparePrecise(pLeft,pRight);});let tmpIndex=pEntryIndex===-1?tmpValueArray.length-1:pEntryIndex;return tmpValueArray[tmpIndex];}/**
4021
+ * Finds the smallest value in a set of objects based on a specified value address.
4022
+ *
4023
+ * @param {Object[]} pValueObjectSet - An array of objects to search through.
4024
+ * @param {string} pValueAddress - The key or path used to access the value within each object.
4025
+ * @returns {*} The smallest value found in the set at the specified value address.
4026
+ */smallestInSet(pValueObjectSet,pValueAddress){return this.entryInSet(pValueObjectSet,pValueAddress,0);}/**
4027
+ * Finds the largest value in a set of objects based on a specified value address.
4028
+ *
4029
+ * @param {Object[]} pValueObjectSet - An array of objects to search through.
4030
+ * @param {string} pValueAddress - The address (key or path) within each object to compare values.
4031
+ * @returns {*} The largest value found at the specified address in the set of objects.
4032
+ */largestInSet(pValueObjectSet,pValueAddress){return this.entryInSet(pValueObjectSet,pValueAddress,-1);}/**
3972
4033
  * Expects an array of objects, and an address in each object to sum. Expects
3973
4034
  * an address to put the cumulative summation as well.
3974
4035
  * @param {Array} pValueObjectSet
@@ -4283,7 +4344,7 @@ return tmpValueArray;}/**
4283
4344
  * @param {object} pObject - The object to get the value from
4284
4345
  * @param {string} pValueAddress - The manyfest hash/address of the value to get
4285
4346
  * @param {object} [pManifest] - The manyfest object to use; constructs one inline if not provided
4286
- * @returns {Array} - The value object built from the hash list
4347
+ * @returns {object} - The value object built from the hash list
4287
4348
  */createValueObjectByHashes(pObject,pValueHashes,pManifest){let tmpManifest=pManifest;if(typeof tmpManifest=='undefined'){// Lazily create a manifest if it doesn't exist
4288
4349
  if(!this.manifest){this.manifest=this.fable.newManyfest();}tmpManifest=this.manifest;}if(!Array.isArray(pValueHashes)){return{};}let tmpValueObject={};for(let i=0;i<pValueHashes.length;i++){tmpValueObject[pValueHashes[i]]=tmpManifest.getValueByHash(pObject,pValueHashes[i]);}// Get the value from the internal manifest and return it
4289
4350
  return tmpValueObject;}/**
@@ -4312,4 +4373,21 @@ let tmpValue=this.manifest.getValueByHash(pObject,pValueAddress);if(tmpValue===n
4312
4373
  // This *is* meant to be a simple, small, and fast way to convert ISO strings to dates in engines
4313
4374
  // with ultra limited JS capabilities where those don't work.
4314
4375
  isoStringToDate(pISOString){if(!('Dates'in this.fable)){this.fable.instantiateServiceProvider('Dates');}let tmpDate=false;try{tmpDate=this.fable.Dates.dayJS.utc(pISOString);}catch(pError){// TODO: Should this throw? Doubtful.
4315
- this.fable.log.error(`Could not parse date string ${pISOString} with dayJS.`);return false;}if(tmpDate){return tmpDate.toDate();}else{return false;}}}module.exports=FableServiceUtility;},{"async.eachlimit":1,"async.waterfall":15,"big.js":17,"fable-serviceproviderbase":53}]},{},[132])(132);});
4376
+ this.fable.log.error(`Could not parse date string ${pISOString} with dayJS.`);return false;}if(tmpDate){return tmpDate.toDate();}else{return false;}}/**
4377
+ * Find the first value in an object that contains a specific value
4378
+ * @param {array} pObjectArray - The array of objects to search
4379
+ * @param {string} pValueToMatchAddress - The manyfest hash/address of the value to match
4380
+ * @param {string} pValueToMatch - The value to match
4381
+ * @param {string} pValueAddress - The manyfest hash/address of the value to return
4382
+ * @returns {any} - The value from the object
4383
+ */findFirstValueByStringIncludes(pObjectArray,pValueToMatchAddress,pValueToMatch,pValueAddress){// Lazily create a manifest if it doesn't exist
4384
+ if(!this.manifest){this.manifest=this.fable.newManyfest();}if(!Array.isArray(pObjectArray)){return undefined;}for(let i=0;i<pObjectArray.length;i++){let tmpValueToMatch=this.manifest.getValueByHash(pObjectArray[i],pValueToMatchAddress);if(tmpValueToMatch&&tmpValueToMatch.includes(pValueToMatch)){return this.manifest.getValueByHash(pObjectArray[i],pValueAddress);}}return undefined;}/**
4385
+ * Find the first value in an object that contains a specific value
4386
+ * @param {array} pObjectArray - The array of objects to search
4387
+ * @param {string} pValueToMatchAddress - The manyfest hash/address of the value to match
4388
+ * @param {string} pValueToMatch - The value to match
4389
+ * @param {string} pValueAddress - The manyfest hash/address of the value to return
4390
+ * @returns {any} - The value from the object
4391
+ */findFirstValueByExactMatch(pObjectArray,pValueToMatchAddress,pValueToMatch,pValueAddress){// Lazily create a manifest if it doesn't exist
4392
+ if(!this.manifest){this.manifest=this.fable.newManyfest();}if(!Array.isArray(pObjectArray)){return undefined;}for(let i=0;i<pObjectArray.length;i++){let tmpValueToMatch=this.manifest.getValueByHash(pObjectArray[i],pValueToMatchAddress);if(tmpValueToMatch&&tmpValueToMatch==pValueToMatch){return this.manifest.getValueByHash(pObjectArray[i],pValueAddress);}}return undefined;}}module.exports=FableServiceUtility;},{"async.eachlimit":1,"async.waterfall":15,"big.js":17,"fable-serviceproviderbase":53}]},{},[132])(132);});
4393
+ //# sourceMappingURL=fable.js.map