utiller 1.0.406 → 1.0.407

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.
@@ -1 +1 @@
1
- "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _lodash=_interopRequireDefault(require("lodash"));var _index2=require("../index.js");var _configerer=require("configerer");var _exceptioner=_interopRequireDefault(require("../exceptioner"));function _classPrivateFieldInitSpec(e,t,a){_checkPrivateRedeclaration(e,t),t.set(e,a)}function _checkPrivateRedeclaration(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function _classPrivateFieldGet(s,a){return s.get(_assertClassBrand(s,a))}function _assertClassBrand(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}const SPECIFICITY_DEBUG=false;var _run=new WeakMap;class InfinitePool{constructor(maxWorkers=_configerer.configerer.POOLLER_WORKER_DEFAULT,name=_index2.utiller.getRandomValue(0,100000000000)){(0,_defineProperty2.default)(this,"isRunInBackgroundMode",false);(0,_defineProperty2.default)(this,"state",_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);(0,_defineProperty2.default)(this,"enableOfTaskSleepByInterval",_configerer.configerer.POOLLER_ENABLE_TASK_SLEEP_BY_INTERVAL);(0,_defineProperty2.default)(this,"taskSleepInterval",_configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT);(0,_defineProperty2.default)(this,"enableOfTaskTimeout",_configerer.configerer.POOLLER_ENABLE_TIMEOUT);(0,_defineProperty2.default)(this,"timeOfTaskTimeout",_configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT);(0,_defineProperty2.default)(this,"handlerOfAssignTaskFail",undefined);(0,_defineProperty2.default)(this,"maximumOfWorker",void 0);(0,_defineProperty2.default)(this,"disableFirstRun",false);(0,_defineProperty2.default)(this,"queueOfWaitingParam",[]);(0,_defineProperty2.default)(this,"countsOfRunByTimes",-1);(0,_defineProperty2.default)(this,"queueOfAssignTask",{});(0,_defineProperty2.default)(this,"queueOfExecutingTask",[]);(0,_defineProperty2.default)(this,"isQueuePolling",false);(0,_defineProperty2.default)(this,"initialTaskCompleted",false);(0,_defineProperty2.default)(this,"mapOfHashNTask",{});(0,_defineProperty2.default)(this,"mapOfHashNCallbackWrapper",{});(0,_defineProperty2.default)(this,"nameOfCurrentPool",``);(0,_defineProperty2.default)(this,"setPoolId",(id=this.nameOfCurrentPool)=>{this.nameOfCurrentPool=id});(0,_defineProperty2.default)(this,"getPoolId",()=>{return this.nameOfCurrentPool});(0,_defineProperty2.default)(this,"stopInBackground",async()=>{this.terminate();let attempts=0;const maxAttempts=30;while(_lodash.default.size(this.queueOfExecutingTask)>0&&attempts<maxAttempts){await _index2.utiller.syncDelay(500);this.printLogMessage(`784512, 咬在 stopInBackground 出不來,${this.getLogMessageOfExecutingTaskQueueCount()}`);this.showState();attempts++}return true});(0,_defineProperty2.default)(this,"isRunning",()=>{return this.isQueuePolling});(0,_defineProperty2.default)(this,"getCountOfAssignTaskInQueue",()=>{let size=0;for(const prior of _configerer.configerer.POOLLER_PRIORITY){size+=this.queueOfAssignTask[prior].length}return size});(0,_defineProperty2.default)(this,"add",(task,priority="low")=>{if(typeof task==="function"){if(_configerer.configerer.POOLLER_PRIORITY.indexOf(priority)<0){throw new _exceptioner.default(4001,`priority can't be ${priority}`)}const hash=_index2.utiller.getRandomHash();const taskInfo={task,hash};this.appendHashTaskMap(taskInfo);this.queueOfAssignTask[priority].push(taskInfo);return hash}else{throw new _exceptioner.default(4002,`task can't be ${typeof task}`)}});(0,_defineProperty2.default)(this,"updateExecuteTaskState",hash=>{const self=this;const task=_lodash.default.find(this.queueOfExecutingTask,each=>_lodash.default.isEqual(each.hash,hash));if(task){this.printLogMessage(`847875153, 客端委託的任務: ${hash},更改狀態為 'ING'`);task.state="ING"}});(0,_defineProperty2.default)(this,"taskWrapper",(assignedTask,hashOfTask,param)=>()=>{const self=this;let timeoutHash="";let assignedTaskResult;let assignedTaskError;let isAssignedTaskCompleted=true;return new Promise((resolve,reject)=>{if(self.enableOfTaskTimeout){timeoutHash=setTimeout(()=>{try{this.printLogMessage(`982532, taskWrapper執行中,發生timout: ${self.timeOfTaskTimeout} ms`);throw new _exceptioner.default(4010,self.getPoollerLogFormat(`TASK HASH:${hashOfTask} IS TIMEOUT ${self.timeOfTaskTimeout} ms ${param?`,PARAMS IS ${JSON.stringify(param)}`:""}`))}catch(error){reject(error)}},self.timeOfTaskTimeout)}this.printLogMessage(`984135, 客端委託的task開始執行 ${hashOfTask}`);self.updateExecuteTaskState(hashOfTask);assignedTask(param).then(result=>{this.printLogMessage(`984545, 客端委託的任務(TASK HASH:${hashOfTask}),resolve回應: ${result}`);assignedTaskResult=result;isAssignedTaskCompleted=true}).catch(error=>{this.printLogMessage(`989652, 客端委託的任務,reject回應: ${error.message}`,true,error);assignedTaskError=error;isAssignedTaskCompleted=false}).finally(()=>{clearTimeout(timeoutHash);resolve();this.printLogMessage(`98942,(TASK HASH:${hashOfTask}) taskWrapper()裡面第一個promise(為了timeout設計)完成了`)})}).then(result=>{if(!isAssignedTaskCompleted){throw assignedTaskError}else{this.printLogMessage(`9894841,(TASK HASH:${hashOfTask}) taskWrapper()裡面第二個promise(整個任務)完成了`);return`${this.getLogMessageOfTaskHash(hashOfTask)} completed`}}).catch(error=>{isAssignedTaskCompleted=false;assignedTaskError=error;if(!self.isWait4ResultTask(hashOfTask)){if(self.handlerOfAssignTaskFail!==undefined){self.handlerOfAssignTaskFail(assignedTaskError)}else throw assignedTaskError}}).finally(()=>{const result={assignedTaskCompleted:isAssignedTaskCompleted,resolve:assignedTaskResult,reject:assignedTaskError};self.removeResolveOrRejectPromiseByHash(hashOfTask,result);this.printLogMessage(`98943213, ${this.getLogMessageOfTaskHash(hashOfTask)} taskWrapper()裡面第2個promise完成了`,false,result)})});(0,_defineProperty2.default)(this,"adds",(tasks,priority="low")=>{const hashes=[];if(_lodash.default.isArray(tasks)){for(const task of tasks){hashes.push(this.add(task,priority))}}else{throw new _exceptioner.default(4003,`should be async function array, not ${typeof tasks}`)}return hashes});(0,_defineProperty2.default)(this,"removeTaskMapByHash",hash=>{delete this.mapOfHashNTask[hash]});(0,_defineProperty2.default)(this,"beforeRun",()=>{this.isQueuePolling=true});(0,_defineProperty2.default)(this,"afterRun",()=>{this.clearCache()});(0,_defineProperty2.default)(this,"runInInfinite",async(task=[],interval)=>{this.beforeRun();if(_lodash.default.isFunction(task))this.add(task);else if(_lodash.default.isArray(task))this.adds(task);else throw new _exceptioner.default(4006,`type of task is ===> ${typeof task}`);this.enableTaskSleepInterval(_lodash.default.isNumber(interval),interval);this.setState(_configerer.configerer.POOLLER_STATE.RUN_INFINITE);while(!this.ruleOfStopInfiniteRun()){this.printLogMessage(`415123, runInInfinite() 正在無限Loop中, ${this.getLogMessageOfExecutingTaskQueueCount()}`);await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"ruleOfStopInfiniteRun",()=>{return!this.isRunning()&&this.isExecutingTaskQueueEmpty()});(0,_defineProperty2.default)(this,"isExecutingTaskQueueEmpty",()=>{return _lodash.default.size(this.queueOfExecutingTask)===0});(0,_defineProperty2.default)(this,"appendParamInToQueue",(...params)=>{this.triggerBgInstance();this.queueOfWaitingParam.push(...params)});(0,_defineProperty2.default)(this,"runByParams",async(functionOfAsyncTask,...params)=>{if(functionOfAsyncTask===undefined){functionOfAsyncTask=this.queueOfAssignTask["low"].shift().task}if(!_lodash.default.isFunction(functionOfAsyncTask))throw new _exceptioner.default(4006,`runByParams error, typeof task can't be ${typeof functionOfAsyncTask}`);if(!_lodash.default.isArray(params))throw new _exceptioner.default(4006,`runByParams error, typeof params can't be ${typeof params}`);this.beforeRun();this.add(functionOfAsyncTask);this.appendParamInToQueue(...params);this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS);while(!this.ruleOfStopInfiniteRun()&&_lodash.default.size(this.queueOfWaitingParam)>0){await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"runByEachTask",async(tasks=[])=>{const self=this;this.id=_index2.utiller.getRandomHash(15);this.beforeRun();this.adds(tasks);this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);while(!this.ruleOfStopInfiniteRun()){await _classPrivateFieldGet(_run,this).call(this,this.id);if(this.getCountOfAssignTaskInQueue()<=0){this.terminate();this.printLogMessage(`788121, runByEachTask() 因為 taskOfWaitingQueue 清空而停止`)}await _index2.utiller.syncDelay(10);this.printLogMessage(`788143, runByEachTask() 為了讓while不要停止運算`)}this.printLogMessage(`7881952, runByEachTask() 結束了while()`)});(0,_defineProperty2.default)(this,"runByTimes",async(functionOfAsyncTask,times=1)=>{this.countsOfRunByTimes=times;this.add(functionOfAsyncTask);this.beforeRun();this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES);while(!this.ruleOfStopInfiniteRun()&&this.countsOfRunByTimes>0){await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"runInBackGround",(asyncfunc,...params)=>{this.isRunInBackgroundMode=true;if(!(typeof asyncfunc==="function")){throw new _exceptioner.default(4002,`_asyncfunc can't be ${typeof asyncfunc}`)}return setTimeout(async()=>{try{await asyncfunc.apply(this,params)}catch(error){if(error instanceof _exceptioner.default){this.printLogMessage(`7812123, runInBackGround() 執行錯誤: ${error.message}`,true,error)}else{throw new _exceptioner.default(4009,{message:`${this.getPoollerLogFormat("")}`},error)}}finally{this.terminate();this.printLogMessage(`7812123, runInBackGround() 走到finally`)}},1)});(0,_defineProperty2.default)(this,"getPoollerLogFormat",msg=>{return`POOLLER NAME: ${this.getPoolId()}${_lodash.default.isEmpty(msg)?"":" , "}${msg}`});(0,_defineProperty2.default)(this,"setTaskFailHandler",(listener=error=>console.log(error.message))=>{this.handlerOfAssignTaskFail=listener});(0,_defineProperty2.default)(this,"rulesOfAppendToExecutingTask",()=>{switch(this.state){case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:return this.isRunning()&&!this.isExecutingQueueFull()&&this.getCountOfAssignTaskInQueue()>0;case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:return this.isRunning()&&!this.isExecutingQueueFull()&&_lodash.default.size(this.queueOfWaitingParam)>0;case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:return this.isRunning()&&!this.isExecutingQueueFull()&&this.getCountOfAssignTaskInQueue()>0;default:throw new _exceptioner.default(4005,`this.state ==> ${this.state}`)}});(0,_defineProperty2.default)(this,"appendTaskToExecuteQueue",(hash,promise)=>{if(_lodash.default.isEqual(this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES)){this.countsOfRunByTimes=this.countsOfRunByTimes-1}const task={state:"NOT",hash:hash,task:promise};this.printLogMessage(`4484451, 增加了一個assignedTask ${this.getLogMessageOfTaskHash(hash)} 到 QueueOfExecutingTask ,${this.getLogMessageOfExecutingTaskQueueCount}`,false,task);this.queueOfExecutingTask.push(task)});(0,_defineProperty2.default)(this,"getLogMessageOfExecutingTaskQueueCount",()=>{return`ExecutingTaskQueueCount: ${_lodash.default.size(this.queueOfExecutingTask)}`});(0,_defineProperty2.default)(this,"getLogMessageOfAssignTaskQueueCount",()=>{return`AssignTaskQueueCount: ${this.getCountOfAssignTaskInQueue()}`});(0,_defineProperty2.default)(this,"getLogMessageOfTaskHash",hash=>{return`TASK HASH: ${hash}`});(0,_defineProperty2.default)(this,"showState",()=>{_index2.utiller.appendInfo(this.getPoollerLogFormat(`workerCount: ${this.maximumOfWorker}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`taskQueue(還在排隊的Task): ${this.getCountOfAssignTaskInQueue()}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`QueueOfExecutingTask(正在執行的AsyncTask, 超過workerCount就是bug): ${_lodash.default.size(this.queueOfExecutingTask)}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`mapOfHashNTask(還沒執行到的AsyncTask reference的暫存區): ${_lodash.default.size(this.mapOfHashNTask)}`))});_classPrivateFieldInitSpec(this,_run,async()=>{const self=this;async function execute(){const tasks=_lodash.default.filter(self.queueOfExecutingTask,each=>_lodash.default.isEqual(each.state,"NOT")).map(each=>{const taskWrapper=each.task;return taskWrapper()});self.printLogMessage(`454652321, 開始任務(taskWrapper): run() 裡面的execute開始執行, task(state = NOT)的長度 ${_lodash.default.size(tasks)}`);const result=_lodash.default.size(tasks)>0?await Promise.race(tasks):"4542131684, task is empty";self.printLogMessage(`54121445161, 結束任務(taskWrapper): run() 裡面的execute結束執行`);return result}async function emptyTask(){self.printLogMessage(`因為max count of worker為0,所以指派一個簡單的任務`);await _index2.utiller.syncDelay(10)}await this.syncTaskDispatcher();if(this.maximumOfWorker===0){await emptyTask()}else if(!this.isExecutingTaskQueueEmpty()){this.printLogMessage(`4512211, 開始任務(taskWrapper): ${this.getLogMessageOfExecutingTaskQueueCount()}`);const task=await execute();this.printLogMessage(`4512213 完畢任務(taskWrapper:${task}), ${this.getLogMessageOfExecutingTaskQueueCount()}, ${this.getLogMessageOfAssignTaskQueueCount()}`)}else{this.printLogMessage(`4574152 不應該走到這裏,但是 minor issue`,true)}if(this.queueOfExecutingTask.length>this.maximumOfWorker)this.printLogMessage(`4512214 一定是改壞了!!!!!!!!!!, ${this.getLogMessageOfExecutingTaskQueueCount} `,true);self.printLogMessage(`5478421212, 離開 run()`)});(0,_defineProperty2.default)(this,"getTaskInfoForRepetitiveRun",originalTaskInfo=>{const newTaskInfo={task:originalTaskInfo.task,hash:_index2.utiller.getRandomHash()};this.appendHashTaskMap(newTaskInfo);return newTaskInfo});(0,_defineProperty2.default)(this,"getTaskInfoDependOnPriority",()=>{for(const prior of _configerer.configerer.POOLLER_PRIORITY){if(this.queueOfAssignTask[prior].length>0){switch(this.state){case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:return this.queueOfAssignTask[prior].shift();case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:const originalTaskInfo=this.queueOfAssignTask[prior][0];return this.getTaskInfoForRepetitiveRun(originalTaskInfo);default:throw new _exceptioner.default(4005,`this.state ==> ${this.state}`)}}}if(!_lodash.default.isEqual(this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK))throw new _exceptioner.default(4007)});(0,_defineProperty2.default)(this,"removeResolveOrRejectPromiseByHash",(hash,result)=>{const callbackWrapper=this.mapOfHashNCallbackWrapper[hash];if(callbackWrapper!==undefined){this.printLogMessage(`5644153248, removeResolveOrRejectPromiseByHash 拿掉了完成的任務(${this.getLogMessageOfTaskHash(hash)})`);callbackWrapper(result);delete this.mapOfHashNCallbackWrapper[hash]}this.removePromiseFromExecutingQueue(hash)});(0,_defineProperty2.default)(this,"removePromiseFromExecutingQueue",hash=>{this.printLogMessage(`56448412, QueueOfExecutingTask 拿掉了完成的任務 ${this.getLogMessageOfTaskHash(hash)}`);_lodash.default.remove(this.queueOfExecutingTask,each=>_lodash.default.isEqual(hash,each.hash))});(0,_defineProperty2.default)(this,"runInfiniteInBackground",(functionOfAsyncTask,interval)=>{this.invokeInstanceOfBackground(this.runInInfinite,functionOfAsyncTask,interval)});(0,_defineProperty2.default)(this,"runByParamInBackGround",(functionOfAsyncTask,...params)=>{return this.invokeInstanceOfBackground(this.runByParams,functionOfAsyncTask,...params)});(0,_defineProperty2.default)(this,"runByTimesInBackGround",(functionOfAsyncTask,times)=>{this.invokeInstanceOfBackground(this.runByTimes,functionOfAsyncTask,times);return this});(0,_defineProperty2.default)(this,"runByEachTaskInBackGround",(...params)=>{return this.invokeInstanceOfBackground(this.runByEachTask,...params)});(0,_defineProperty2.default)(this,"invokeInstanceOfBackground",(state,...params)=>{if(this.atomicBgInstance!==undefined)clearTimeout(this.atomicBgInstance);this.atomicBgInstance=this.runInBackGround(state,...params);return this});this.maximumOfWorker=maxWorkers;this.setPoolId(_lodash.default.toString(name));for(const prior of _configerer.configerer.POOLLER_PRIORITY){this.queueOfAssignTask[prior]=[]}}enableQueueTerminateBySleepCount(enable=true,interval=_configerer.configerer.POOLLER_QUEUE_TIME_OF_SLEEP_INTERVAL_DEFAULT,times=_configerer.configerer.POOLLER_QUEUE_MAX_SLEEP_COUNTS_DEFAULT){this.enableOfQueueTerminateSleepCount=enable;this.queueMaxSleepCounts=times;this.intervalOfQueueSleep=interval}clearCache(){this.queueOfExecutingTask.length=0;this.mapOfHashNTask={};this.queueOfAssignTask={}}terminate(){this.isQueuePolling=false}printLogMessage(message,error=false,...infos){if(SPECIFICITY_DEBUG)_index2.utiller.printLogMessage(this.getPoollerLogFormat(message),error,...infos)}setWorker(counts){this.maximumOfWorker=counts}cleanTaskInterval(){this.taskSleepInterval={min:0,max:0}}enableTaskSleepInterval(enable=true,interval=_configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT){this.enableOfTaskSleepByInterval=enable;if(_lodash.default.isNumber(interval)){interval={min:interval,max:interval}}this.taskSleepInterval=interval}enableTaskTimeout(enable=true,millionSec=_configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT){this.enableOfTaskTimeout=enable;this.timeOfTaskTimeout=millionSec}async addTaskAndWait4Result(asyncTask,priority="low",taskName="noName"){this.triggerBgInstance();return new Promise((resolve,reject)=>{const callbackWrapper=result=>{if(result.assignedTaskCompleted){resolve(result.resolve)}else{reject(result.reject)}};const hash=this.add(asyncTask,priority);this.registerHash4Result(hash,callbackWrapper)})}registerHash4Result(hash,callback){this.mapOfHashNCallbackWrapper[hash]=callback}appendHashTaskMap(taskInfo){this.mapOfHashNTask[taskInfo.hash]=taskInfo}getTaskInfoByHash(hash){return this.mapOfHashNTask[hash]}remove(hash){let taskInfo=this.getTaskInfoByHash(hash);if(taskInfo){for(const prior of _configerer.configerer.POOLLER_PRIORITY){const _index=_lodash.default.indexOf(this.queueOfAssignTask[prior],taskInfo);if(_index>0){this.queueOfAssignTask[prior].splice(_index,1);this.removeTaskMapByHash(hash);return true}}return false}else{throw new _exceptioner.default(4004,hash)}}setState(_state){this.state=_state}checkAndMarkInitialTaskStatus(){if(!this.initialTaskCompleted){this.initialTaskCompleted=true;return false}return this.initialTaskCompleted}setDisableFirstRun(disable=true){this.disableFirstRun=disable}triggerBgInstance(){if(!this.isRunInBackgroundMode||this.isQueuePolling){return}if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK){this.runByEachTaskInBackGround();return}else if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS){this.runByParamInBackGround();return}throw new _exceptioner.default(4011,`this.state is ==> ${_index2.utiller.getItsKeyByValue(_configerer.configerer.POOLLER_STATE,this.state)}`)}isExecutingQueueFull(){return _lodash.default.size(this.queueOfExecutingTask)>=this.maximumOfWorker}isTaskQueueEmpty(){return this.getCountOfAssignTaskInQueue()===0}async syncTaskDispatcher(){this.printLogMessage(`448984466, 走進來了 syncTaskDispatcher()`);const initialTaskShouldNotRun=this.disableFirstRun&&!this.checkAndMarkInitialTaskStatus();const isExecutingTaskAlmostFull=this.queueOfExecutingTask.length>=this.maximumOfWorker-1;const comparison=this.checkAndMarkInitialTaskStatus()&&isExecutingTaskAlmostFull&&this.enableOfTaskSleepByInterval;if(initialTaskShouldNotRun||comparison){const restInInterval=await _index2.utiller.syncDelayRandom(this.taskSleepInterval.min,this.taskSleepInterval.max);this.printLogMessage(`4484121, 走到睡覺區 enableOfTaskSleepByInterval:${this.enableOfTaskSleepByInterval} || ${restInInterval} ms`)}while(this.rulesOfAppendToExecutingTask()){const taskInfo=this.getTaskInfoDependOnPriority();if(taskInfo){const promise=this.taskWrapper(taskInfo.task,taskInfo.hash,this.queueOfWaitingParam.shift());if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK){this.removeTaskMapByHash(taskInfo.hash)}else{}this.appendTaskToExecuteQueue(taskInfo.hash,promise)}else{this.printLogMessage(`848451 也許有未知的isssue,保險起見break,是不是在這裡無限迴圈跑跑跑`,true);break}}this.printLogMessage(`4489844821, 離開了 syncTaskDispatcher()`)}isWait4ResultTask(hash){return this.mapOfHashNCallbackWrapper[hash]!==undefined}}var _default=exports.default=InfinitePool;
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _lodash=_interopRequireDefault(require("lodash"));var _index2=require("../index.js");var _configerer=require("configerer");var _exceptioner=_interopRequireDefault(require("../exceptioner"));function _classPrivateFieldInitSpec(e,t,a){_checkPrivateRedeclaration(e,t),t.set(e,a)}function _checkPrivateRedeclaration(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function _classPrivateFieldGet(s,a){return s.get(_assertClassBrand(s,a))}function _assertClassBrand(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}const SPECIFICITY_DEBUG=false;var _run=new WeakMap;class InfinitePool{constructor(maxWorkers=_configerer.configerer.POOLLER_WORKER_DEFAULT,name=_index2.utiller.getRandomValue(0,100000000000)){(0,_defineProperty2.default)(this,"isRunInBackgroundMode",false);(0,_defineProperty2.default)(this,"state",_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);(0,_defineProperty2.default)(this,"enableOfTaskSleepByInterval",_configerer.configerer.POOLLER_ENABLE_TASK_SLEEP_BY_INTERVAL);(0,_defineProperty2.default)(this,"taskSleepInterval",_configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT);(0,_defineProperty2.default)(this,"enableOfTaskTimeout",_configerer.configerer.POOLLER_ENABLE_TIMEOUT);(0,_defineProperty2.default)(this,"timeOfTaskTimeout",_configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT);(0,_defineProperty2.default)(this,"handlerOfAssignTaskFail",undefined);(0,_defineProperty2.default)(this,"maximumOfWorker",void 0);(0,_defineProperty2.default)(this,"disableFirstRun",false);(0,_defineProperty2.default)(this,"queueOfWaitingParam",[]);(0,_defineProperty2.default)(this,"countsOfRunByTimes",-1);(0,_defineProperty2.default)(this,"queueOfAssignTask",{});(0,_defineProperty2.default)(this,"queueOfExecutingTask",[]);(0,_defineProperty2.default)(this,"isQueuePolling",false);(0,_defineProperty2.default)(this,"initialTaskCompleted",false);(0,_defineProperty2.default)(this,"mapOfHashNTask",{});(0,_defineProperty2.default)(this,"mapOfHashNCallbackWrapper",{});(0,_defineProperty2.default)(this,"nameOfCurrentPool",``);(0,_defineProperty2.default)(this,"atomicBgInstance",undefined);(0,_defineProperty2.default)(this,"setPoolId",(id=this.nameOfCurrentPool)=>{this.nameOfCurrentPool=id});(0,_defineProperty2.default)(this,"getPoolId",()=>{return this.nameOfCurrentPool});(0,_defineProperty2.default)(this,"stopInBackground",async()=>{this.terminate();let attempts=0;const maxAttempts=30;while(_lodash.default.size(this.queueOfExecutingTask)>0&&attempts<maxAttempts){await _index2.utiller.syncDelay(500);this.printLogMessage(`784512, 卡在 stopInBackground 出不來,${this.getLogMessageOfExecutingTaskQueueCount()}`);this.showState();attempts++}if(_lodash.default.size(this.queueOfExecutingTask)>0){this.printLogMessage(`stopInBackground 超時,仍有 ${_lodash.default.size(this.queueOfExecutingTask)} 個任務在執行`,true);return false}return true});(0,_defineProperty2.default)(this,"isRunning",()=>{return this.isQueuePolling});(0,_defineProperty2.default)(this,"getCountOfAssignTaskInQueue",()=>{let size=0;for(const prior of _configerer.configerer.POOLLER_PRIORITY){size+=this.queueOfAssignTask[prior].length}return size});(0,_defineProperty2.default)(this,"add",(task,priority="low")=>{if(typeof task==="function"){if(_configerer.configerer.POOLLER_PRIORITY.indexOf(priority)<0){throw new _exceptioner.default(4001,`priority can't be ${priority}`)}const hash=_index2.utiller.getRandomHash();const taskInfo={task,hash};this.appendHashTaskMap(taskInfo);this.queueOfAssignTask[priority].push(taskInfo);return hash}else{throw new _exceptioner.default(4002,`task can't be ${typeof task}`)}});(0,_defineProperty2.default)(this,"updateExecuteTaskState",hash=>{const task=_lodash.default.find(this.queueOfExecutingTask,each=>_lodash.default.isEqual(each.hash,hash));if(task){this.printLogMessage(`847875153, 客端委託的任務: ${hash},更改狀態為 'ING'`);task.state="ING"}});(0,_defineProperty2.default)(this,"taskWrapper",(assignedTask,hashOfTask,param)=>()=>{const self=this;let timeoutHash="";let assignedTaskResult;let assignedTaskError;let isAssignedTaskCompleted=true;return new Promise((resolve,reject)=>{if(self.enableOfTaskTimeout){timeoutHash=setTimeout(()=>{try{this.printLogMessage(`982532, taskWrapper執行中,發生timeout: ${self.timeOfTaskTimeout} ms`);throw new _exceptioner.default(4010,self.getPoollerLogFormat(`TASK HASH:${hashOfTask} IS TIMEOUT ${self.timeOfTaskTimeout} ms ${param?`,PARAMS IS ${JSON.stringify(param)}`:""}`))}catch(error){reject(error)}},self.timeOfTaskTimeout)}this.printLogMessage(`984135, 客端委託的task開始執行 ${hashOfTask}`);self.updateExecuteTaskState(hashOfTask);assignedTask(param).then(result=>{this.printLogMessage(`984545, 客端委託的任務(TASK HASH:${hashOfTask}),resolve回應: ${result}`);assignedTaskResult=result;isAssignedTaskCompleted=true}).catch(error=>{this.printLogMessage(`989652, 客端委託的任務,reject回應: ${error.message}`,true,error);assignedTaskError=error;isAssignedTaskCompleted=false}).finally(()=>{clearTimeout(timeoutHash);resolve();this.printLogMessage(`98942,(TASK HASH:${hashOfTask}) taskWrapper()裡面第一個promise(為了timeout設計)完成了`)})}).then(()=>{if(!isAssignedTaskCompleted){throw assignedTaskError}else{this.printLogMessage(`9894841,(TASK HASH:${hashOfTask}) taskWrapper()裡面第二個promise(整個任務)完成了`);return`${this.getLogMessageOfTaskHash(hashOfTask)} completed`}}).catch(error=>{isAssignedTaskCompleted=false;assignedTaskError=error;if(!self.isWait4ResultTask(hashOfTask)){if(self.handlerOfAssignTaskFail!==undefined){try{self.handlerOfAssignTaskFail(assignedTaskError)}catch(handlerError){this.printLogMessage(`錯誤處理器執行失敗: ${handlerError.message}`,true,handlerError)}}else{this.printLogMessage(`任務執行失敗但未設置錯誤處理器: ${assignedTaskError.message}`,true,assignedTaskError)}}}).finally(()=>{const result={assignedTaskCompleted:isAssignedTaskCompleted,resolve:assignedTaskResult,reject:assignedTaskError};self.removeResolveOrRejectPromiseByHash(hashOfTask,result);this.printLogMessage(`98943213, ${this.getLogMessageOfTaskHash(hashOfTask)} taskWrapper()裡面第2個promise完成了`,false,result)})});(0,_defineProperty2.default)(this,"adds",(tasks,priority="low")=>{const hashes=[];if(_lodash.default.isArray(tasks)){for(const task of tasks){hashes.push(this.add(task,priority))}}else{throw new _exceptioner.default(4003,`should be async function array, not ${typeof tasks}`)}return hashes});(0,_defineProperty2.default)(this,"removeTaskMapByHash",hash=>{delete this.mapOfHashNTask[hash]});(0,_defineProperty2.default)(this,"beforeRun",()=>{this.isQueuePolling=true});(0,_defineProperty2.default)(this,"afterRun",()=>{this.clearCache()});(0,_defineProperty2.default)(this,"runInInfinite",async(task=[],interval)=>{this.beforeRun();if(_lodash.default.isFunction(task))this.add(task);else if(_lodash.default.isArray(task))this.adds(task);else throw new _exceptioner.default(4006,`type of task is ===> ${typeof task}`);this.enableTaskSleepInterval(_lodash.default.isNumber(interval),interval);this.setState(_configerer.configerer.POOLLER_STATE.RUN_INFINITE);while(!this.ruleOfStopInfiniteRun()){this.printLogMessage(`415123, runInInfinite() 正在無限Loop中, ${this.getLogMessageOfExecutingTaskQueueCount()}`);await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"ruleOfStopInfiniteRun",()=>{return!this.isRunning()&&this.isExecutingTaskQueueEmpty()});(0,_defineProperty2.default)(this,"isExecutingTaskQueueEmpty",()=>{return _lodash.default.size(this.queueOfExecutingTask)===0});(0,_defineProperty2.default)(this,"appendParamInToQueue",(...params)=>{this.triggerBgInstance();this.queueOfWaitingParam.push(...params)});(0,_defineProperty2.default)(this,"runByParams",async(functionOfAsyncTask,...params)=>{if(functionOfAsyncTask===undefined){functionOfAsyncTask=this.queueOfAssignTask["low"].shift().task}if(!_lodash.default.isFunction(functionOfAsyncTask))throw new _exceptioner.default(4006,`runByParams error, typeof task can't be ${typeof functionOfAsyncTask}`);if(!_lodash.default.isArray(params))throw new _exceptioner.default(4006,`runByParams error, typeof params can't be ${typeof params}`);this.beforeRun();this.add(functionOfAsyncTask);this.appendParamInToQueue(...params);this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS);while(!this.ruleOfStopInfiniteRun()&&_lodash.default.size(this.queueOfWaitingParam)>0){await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"runByEachTask",async(tasks=[])=>{this.id=_index2.utiller.getRandomHash(15);this.beforeRun();this.adds(tasks);this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);while(!this.ruleOfStopInfiniteRun()){await _classPrivateFieldGet(_run,this).call(this,this.id);if(this.getCountOfAssignTaskInQueue()<=0){this.terminate();this.printLogMessage(`788121, runByEachTask() 因為 taskOfWaitingQueue 清空而停止`)}await _index2.utiller.syncDelay(10);this.printLogMessage(`788143, runByEachTask() 為了讓while不要停止運算`)}this.printLogMessage(`7881952, runByEachTask() 結束了while()`)});(0,_defineProperty2.default)(this,"runByTimes",async(functionOfAsyncTask,times=1)=>{if(this.maximumOfWorker!==1){this.printLogMessage(`警告: runByTimes 模式建議使用 1 個 worker,當前為 ${this.maximumOfWorker}`,true)}this.countsOfRunByTimes=times;this.add(functionOfAsyncTask);this.beforeRun();this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES);while(!this.ruleOfStopInfiniteRun()&&this.countsOfRunByTimes>0){await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"runInBackGround",(asyncfunc,...params)=>{this.isRunInBackgroundMode=true;if(!(typeof asyncfunc==="function")){throw new _exceptioner.default(4002,`_asyncfunc can't be ${typeof asyncfunc}`)}return setTimeout(async()=>{try{await asyncfunc.apply(this,params)}catch(error){if(error instanceof _exceptioner.default){this.printLogMessage(`7812123, runInBackGround() 執行錯誤: ${error.message}`,true,error)}else{throw new _exceptioner.default(4009,{message:`${this.getPoollerLogFormat("")}`},error)}}finally{this.terminate();this.printLogMessage(`7812123, runInBackGround() 走到finally`)}},1)});(0,_defineProperty2.default)(this,"getPoollerLogFormat",msg=>{return`POOLLER NAME: ${this.getPoolId()}${_lodash.default.isEmpty(msg)?"":" , "}${msg}`});(0,_defineProperty2.default)(this,"setTaskFailHandler",(listener=error=>console.log(error.message))=>{this.handlerOfAssignTaskFail=listener});(0,_defineProperty2.default)(this,"rulesOfAppendToExecutingTask",()=>{switch(this.state){case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:return this.isRunning()&&!this.isExecutingQueueFull()&&this.getCountOfAssignTaskInQueue()>0;case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:return this.isRunning()&&!this.isExecutingQueueFull()&&_lodash.default.size(this.queueOfWaitingParam)>0;case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:return this.isRunning()&&!this.isExecutingQueueFull()&&this.getCountOfAssignTaskInQueue()>0;default:throw new _exceptioner.default(4005,`this.state ==> ${this.state}`)}});(0,_defineProperty2.default)(this,"appendTaskToExecuteQueue",(hash,promise)=>{if(_lodash.default.isEqual(this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES)){this.countsOfRunByTimes=this.countsOfRunByTimes-1}const task={state:"NOT",hash:hash,task:promise};this.printLogMessage(`4484451, 增加了一個assignedTask ${this.getLogMessageOfTaskHash(hash)} 到 QueueOfExecutingTask ,${this.getLogMessageOfExecutingTaskQueueCount}`,false,task);this.queueOfExecutingTask.push(task)});(0,_defineProperty2.default)(this,"getLogMessageOfExecutingTaskQueueCount",()=>{return`ExecutingTaskQueueCount: ${_lodash.default.size(this.queueOfExecutingTask)}`});(0,_defineProperty2.default)(this,"getLogMessageOfAssignTaskQueueCount",()=>{return`AssignTaskQueueCount: ${this.getCountOfAssignTaskInQueue()}`});(0,_defineProperty2.default)(this,"getLogMessageOfTaskHash",hash=>{return`TASK HASH: ${hash}`});(0,_defineProperty2.default)(this,"showState",()=>{_index2.utiller.appendInfo(this.getPoollerLogFormat(`workerCount: ${this.maximumOfWorker}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`taskQueue(還在排隊的Task): ${this.getCountOfAssignTaskInQueue()}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`QueueOfExecutingTask(正在執行的AsyncTask, 超過workerCount就是bug): ${_lodash.default.size(this.queueOfExecutingTask)}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`mapOfHashNTask(還沒執行到的AsyncTask reference的暫存區): ${_lodash.default.size(this.mapOfHashNTask)}`))});_classPrivateFieldInitSpec(this,_run,async()=>{const self=this;async function execute(){const tasks=_lodash.default.filter(self.queueOfExecutingTask,each=>_lodash.default.isEqual(each.state,"NOT")).map(each=>{const taskWrapper=each.task;return taskWrapper()});self.printLogMessage(`454652321, 開始任務(taskWrapper): run() 裡面的execute開始執行, task(state = NOT)的長度 ${_lodash.default.size(tasks)}`);const result=_lodash.default.size(tasks)>0?await Promise.race(tasks):"4542131684, task is empty";self.printLogMessage(`54121445161, 結束任務(taskWrapper): run() 裡面的execute結束執行`);return result}async function emptyTask(){self.printLogMessage(`因為max count of worker為0,所以指派一個簡單的任務`);await _index2.utiller.syncDelay(10)}await this.syncTaskDispatcher();if(this.maximumOfWorker===0){await emptyTask()}else if(!this.isExecutingTaskQueueEmpty()){this.printLogMessage(`4512211, 開始任務(taskWrapper): ${this.getLogMessageOfExecutingTaskQueueCount()}`);const task=await execute();this.printLogMessage(`4512213 完畢任務(taskWrapper:${task}), ${this.getLogMessageOfExecutingTaskQueueCount()}, ${this.getLogMessageOfAssignTaskQueueCount()}`)}else{this.printLogMessage(`4574152 不應該走到這裏,但是 minor issue`,true)}if(this.queueOfExecutingTask.length>this.maximumOfWorker)this.printLogMessage(`4512214 一定是改壞了!!!!!!!!!!, ${this.getLogMessageOfExecutingTaskQueueCount} `,true);self.printLogMessage(`5478421212, 離開 run()`)});(0,_defineProperty2.default)(this,"getTaskInfoForRepetitiveRun",originalTaskInfo=>{const newTaskInfo={task:originalTaskInfo.task,hash:_index2.utiller.getRandomHash()};this.appendHashTaskMap(newTaskInfo);return newTaskInfo});(0,_defineProperty2.default)(this,"getTaskInfoDependOnPriority",()=>{for(const prior of _configerer.configerer.POOLLER_PRIORITY){if(this.queueOfAssignTask[prior].length>0){switch(this.state){case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:return this.queueOfAssignTask[prior].shift();case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:const originalTaskInfo=this.queueOfAssignTask[prior][0];return this.getTaskInfoForRepetitiveRun(originalTaskInfo);default:throw new _exceptioner.default(4005,`this.state ==> ${this.state}`)}}}if(!_lodash.default.isEqual(this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK))throw new _exceptioner.default(4007)});(0,_defineProperty2.default)(this,"removeResolveOrRejectPromiseByHash",(hash,result)=>{const callbackWrapper=this.mapOfHashNCallbackWrapper[hash];if(callbackWrapper!==undefined){this.printLogMessage(`5644153248, removeResolveOrRejectPromiseByHash 拿掉了完成的任務(${this.getLogMessageOfTaskHash(hash)})`);try{callbackWrapper(result)}catch(callbackError){this.printLogMessage(`回調執行失敗: ${callbackError.message}`,true,callbackError)}finally{delete this.mapOfHashNCallbackWrapper[hash]}}this.removePromiseFromExecutingQueue(hash)});(0,_defineProperty2.default)(this,"removePromiseFromExecutingQueue",hash=>{this.printLogMessage(`56448412, QueueOfExecutingTask 拿掉了完成的任務 ${this.getLogMessageOfTaskHash(hash)}`);_lodash.default.remove(this.queueOfExecutingTask,each=>_lodash.default.isEqual(hash,each.hash))});(0,_defineProperty2.default)(this,"runInfiniteInBackground",(functionOfAsyncTask,interval)=>{return this.invokeInstanceOfBackground(this.runInInfinite,functionOfAsyncTask,interval)});(0,_defineProperty2.default)(this,"runByParamInBackGround",(functionOfAsyncTask,...params)=>{return this.invokeInstanceOfBackground(this.runByParams,functionOfAsyncTask,...params)});(0,_defineProperty2.default)(this,"runByTimesInBackGround",(functionOfAsyncTask,times)=>{return this.invokeInstanceOfBackground(this.runByTimes,functionOfAsyncTask,times)});(0,_defineProperty2.default)(this,"runByEachTaskInBackGround",(...params)=>{return this.invokeInstanceOfBackground(this.runByEachTask,...params)});(0,_defineProperty2.default)(this,"invokeInstanceOfBackground",(state,...params)=>{if(this.atomicBgInstance!==undefined)clearTimeout(this.atomicBgInstance);this.atomicBgInstance=this.runInBackGround(state,...params);return this});this.maximumOfWorker=maxWorkers;this.setPoolId(_lodash.default.toString(name));for(const prior of _configerer.configerer.POOLLER_PRIORITY){this.queueOfAssignTask[prior]=[]}}enableQueueTerminateBySleepCount(enable=true,interval=_configerer.configerer.POOLLER_QUEUE_TIME_OF_SLEEP_INTERVAL_DEFAULT,times=_configerer.configerer.POOLLER_QUEUE_MAX_SLEEP_COUNTS_DEFAULT){this.enableOfQueueTerminateSleepCount=enable;this.queueMaxSleepCounts=times;this.intervalOfQueueSleep=interval}clearCache(){this.queueOfExecutingTask.length=0;this.mapOfHashNTask={};this.queueOfAssignTask={}}terminate(){this.isQueuePolling=false}printLogMessage(message,error=false,...infos){if(SPECIFICITY_DEBUG)_index2.utiller.printLogMessage(this.getPoollerLogFormat(message),error,...infos)}setWorker(counts){this.maximumOfWorker=counts}cleanTaskInterval(){this.taskSleepInterval={min:0,max:0}}enableTaskSleepInterval(enable=true,interval=_configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT){this.enableOfTaskSleepByInterval=enable;if(_lodash.default.isNumber(interval)){interval={min:interval,max:interval}}this.taskSleepInterval=interval}enableTaskTimeout(enable=true,millionSec=_configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT){this.enableOfTaskTimeout=enable;this.timeOfTaskTimeout=millionSec}async addTaskAndWait4Result(asyncTask,priority="low",taskName="noName"){this.triggerBgInstance();return new Promise((resolve,reject)=>{const callbackWrapper=result=>{if(result.assignedTaskCompleted){resolve(result.resolve)}else{reject(result.reject)}};const hash=this.add(asyncTask,priority);this.registerHash4Result(hash,callbackWrapper)})}registerHash4Result(hash,callback){this.mapOfHashNCallbackWrapper[hash]=callback}appendHashTaskMap(taskInfo){this.mapOfHashNTask[taskInfo.hash]=taskInfo}getTaskInfoByHash(hash){return this.mapOfHashNTask[hash]}remove(hash){let taskInfo=this.getTaskInfoByHash(hash);if(taskInfo){for(const prior of _configerer.configerer.POOLLER_PRIORITY){const _index=_lodash.default.indexOf(this.queueOfAssignTask[prior],taskInfo);if(_index>=0){this.queueOfAssignTask[prior].splice(_index,1);this.removeTaskMapByHash(hash);return true}}return false}else{throw new _exceptioner.default(4004,hash)}}setState(_state){this.state=_state}checkAndMarkInitialTaskStatus(){if(!this.initialTaskCompleted){this.initialTaskCompleted=true;return false}return this.initialTaskCompleted}setDisableFirstRun(disable=true){this.disableFirstRun=disable}triggerBgInstance(){if(!this.isRunInBackgroundMode||this.isQueuePolling){return}if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK){this.runByEachTaskInBackGround();return}else if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS){this.runByParamInBackGround();return}throw new _exceptioner.default(4011,`this.state is ==> ${_index2.utiller.getItsKeyByValue(_configerer.configerer.POOLLER_STATE,this.state)}`)}isExecutingQueueFull(){return _lodash.default.size(this.queueOfExecutingTask)>=this.maximumOfWorker}isTaskQueueEmpty(){return this.getCountOfAssignTaskInQueue()===0}async syncTaskDispatcher(){this.printLogMessage(`448984466, 走進來了 syncTaskDispatcher()`);const initialTaskShouldNotRun=this.disableFirstRun&&!this.checkAndMarkInitialTaskStatus();const isExecutingTaskAlmostFull=this.queueOfExecutingTask.length>=this.maximumOfWorker-1;const comparison=this.checkAndMarkInitialTaskStatus()&&isExecutingTaskAlmostFull&&this.enableOfTaskSleepByInterval;if(initialTaskShouldNotRun||comparison){const restInInterval=await _index2.utiller.syncDelayRandom(this.taskSleepInterval.min,this.taskSleepInterval.max);this.printLogMessage(`4484121, 走到睡覺區 enableOfTaskSleepByInterval:${this.enableOfTaskSleepByInterval} || ${restInInterval} ms`)}while(this.rulesOfAppendToExecutingTask()){const taskInfo=this.getTaskInfoDependOnPriority();if(taskInfo){const promise=this.taskWrapper(taskInfo.task,taskInfo.hash,this.queueOfWaitingParam.shift());if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK){this.removeTaskMapByHash(taskInfo.hash)}this.appendTaskToExecuteQueue(taskInfo.hash,promise)}else{this.printLogMessage(`848451 也許有未知的issue,保險起見break`,true);break}}this.printLogMessage(`4489844821, 離開了 syncTaskDispatcher()`)}isWait4ResultTask(hash){return this.mapOfHashNCallbackWrapper[hash]!==undefined}}var _default=exports.default=InfinitePool;
@@ -1 +1 @@
1
- "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _lodash=_interopRequireDefault(require("lodash"));var _cryptoJs=_interopRequireDefault(require("crypto-js"));var _configerer=require("configerer");var _exceptioner=_interopRequireDefault(require("../exceptioner"));var _momentTimezone=_interopRequireDefault(require("moment-timezone"));var _uuid=require("uuid");var _words=require("../words");var _nodeHtmlParser=require("node-html-parser");String.format=function(){let param=[];for(let i=0,l=arguments.length;i<l;i++){param.push(arguments[i])}let statment=param[0];param.shift();return statment.replace(/\{(\d+)\}/g,function(m,n){return param[n]})};class Utiller{removeAttributeBy(object,predicate=value=>_lodash.default.isUndefined(value)){for(const key in object){if(predicate(object[key])){delete object[key]}}}getNumberOfNormalize(value,defaultValue=0){if(_lodash.default.isNumber(value))return value;try{const force=_lodash.default.toNumber(value);return _lodash.default.isNumber(force)&&!isNaN(force)?force:defaultValue}catch(error){Util.appendError(`448561684561 ${error.message}`)}return defaultValue}getStringOfNormalize(value,defaultValue="",trim=false){if(_lodash.default.isString(value))return trim?_lodash.default.trim(value):value;try{const force=_lodash.default.toString(value);return this.isOrEquals(force,"","undefined")?defaultValue:trim?_lodash.default.trim(force):force}catch(error){Util.appendError(`448616845453 ${error.message}`)}return defaultValue}isValidVersionOfString(versionName){if(this.isUndefinedNullEmpty(versionName)){return false}const numbers=versionName.split(".");for(const number of numbers){const toNum=_lodash.default.toNumber(number);if(!_lodash.default.isNumber(toNum)||isNaN(toNum))return false}return true}getSeparatorOfUnique(){return"\u0F0D\u0F0D"}getStringOfVersionIncrement(stringOfVersion,delta=1){const numbers=stringOfVersion.split(".").map(each=>_lodash.default.toNumber(each));const last=numbers.length-1;numbers[last]=numbers[last]+delta;return numbers.join(".")}setLocaleOfMoment(locale="en"){_momentTimezone.default.locale(locale)}getUuidOfV4(){return(0,_uuid.v4)()}constructor(){(0,_defineProperty2.default)(this,"mapOfIdNTimeoutId",{});(0,_defineProperty2.default)(this,"getEnvironment",()=>{return this.env});(0,_defineProperty2.default)(this,"isProductionEnvironment",()=>{return _lodash.default.isEqual(this.getEnvironment(),"prod")});(0,_defineProperty2.default)(this,"asyncUnitTaskFunction",(millionSec=2000,_funparam="\u9810\u8A2D\u7684param",errorSimulator)=>async(param=this.getRandomHash(10))=>{const randomValue=this.getRandomValue(millionSec,millionSec*1.2);try{const symbol=randomValue;this.appendInfo(`before executed ===> i'm symbol of ${symbol}, ready to be executed, inner param = ${_funparam}`);await this.syncDelay(randomValue);if(_lodash.default.isFunction(errorSimulator)&&errorSimulator(param))throw Error("force to made error happen");this.appendInfo(`after executed ===> i'm symbol of ${symbol}, the task cost ${randomValue} million-seconds ${param?`i hav params ===> ${param}`:""}`);return{randomValue,symbol,param}}catch(error){this.appendError(new Error(`asyncUnitTask() catch error ${error.message}`))}finally{this.appendInfo(`wow.... finally got you`)}});(0,_defineProperty2.default)(this,"test",word=>{return async()=>{await Util.syncDelay(3000);console.log("\u7D93\u904E\u4E86\u4E09\u79D2");await Util.syncDelay(4000);console.log("\u7D93\u904E\u4E86\u56DB\u79D2");await Util.syncDelay(5000);console.log("\u7D93\u904E\u4E86\u4E94\u79D2");await Util.syncDelay(6000);console.log("\u7D93\u904E\u4E86\u516D\u79D2");return`3423809432804 ${word}`}});(0,_defineProperty2.default)(this,"findLowestValue",(items,key="price")=>{const minPrice=_lodash.default.minBy(items,key)[key];return Math.floor(minPrice)});(0,_defineProperty2.default)(this,"findHighestValue",(items,key="price")=>{const maxPrice=_lodash.default.maxBy(items,key)[key];return Math.floor(maxPrice)});(0,_defineProperty2.default)(this,"getStringOfValueRange",(items,key="price",sign="$")=>{const minV=_lodash.default.minBy(items,key)[key];const maxV=_lodash.default.maxBy(items,key)[key];return maxV===minV?`$${minV}`:`${sign}${minV} - ${sign}${maxV}`});(0,_defineProperty2.default)(this,"getCallersName",()=>{let callerName;try{throw new Error}catch(e){let re=/(\w+)@|at (\w+) \(/g,st=e.stack,m;re.exec(st),m=re.exec(st);if(!_lodash.default.isNull(m))callerName=m[1]||m[2]}if(_lodash.default.startsWith("asyncGeneratorStep",callerName))callerName="";return callerName});(0,_defineProperty2.default)(this,"getRandomValue",(min,max)=>{min=Math.ceil(min);max=Math.floor(max);return Math.floor(Math.random()*(max-min+1))+min});(0,_defineProperty2.default)(this,"insertToArray",(array,index,...items)=>{if(!Array.isArray(array)){throw new Error("First argument must be an array.")}const insertAt=Math.max(0,Math.min(index+1,array.length));array.splice(insertAt,0,...items)});(0,_defineProperty2.default)(this,"getStringOfYearADConvertToMinguoYear",(gregorianYear,full=false)=>{const minguoYear=gregorianYear-1911;if(minguoYear>0){return`${full?"\u6C11\u570B":""}${minguoYear}${full?"\u5E74":""}`}else{return`${full?"\u6C11\u570B":""}前${Math.abs(minguoYear)}${full?"\u5E74":""}`}});(0,_defineProperty2.default)(this,"convertDateToTimestamp",date=>{return(0,_momentTimezone.default)(date).valueOf()});(0,_defineProperty2.default)(this,"measureExecutionTime",async(fn,...param)=>{const startTime=Date.now();await fn(...param);const endTime=Date.now();const durationInMilliseconds=endTime-startTime;const duration=_momentTimezone.default.duration(durationInMilliseconds,"milliseconds");const hours=Math.floor(duration.asHours());const minutes=duration.minutes();const seconds=duration.seconds();const milliseconds=duration.milliseconds();const totalSeconds=(durationInMilliseconds/1000).toFixed(3);this.appendInfo(`${hours}小時 ${minutes}分 ${seconds}.${milliseconds.toString().padStart(3,"0")}秒 (合計 ${totalSeconds} 秒)`)});(0,_defineProperty2.default)(this,"formatPriceWithCurrency",(number,locale)=>{if(typeof number!=="number"||typeof locale!=="string"){throw new TypeError("Invalid input: number must be a number and locale must be a string.")}return new Intl.NumberFormat(locale,{style:"currency",currency:new Intl.Locale(locale).maximize().currency||"USD",minimumFractionDigits:0}).format(number)});(0,_defineProperty2.default)(this,"formatPrice",(number,locale)=>{if(typeof number!=="number"){throw new TypeError("Invalid input: number must be a number.")}if(!locale){return number.toLocaleString("en-US")}return new Intl.NumberFormat(locale,{style:"currency",currency:new Intl.Locale(locale).maximize().currency||"USD",minimumFractionDigits:0}).format(number)});(0,_defineProperty2.default)(this,"generateUniversalKeywords",(sentence,maxLength=50,maxNgramLength=4)=>{if(!sentence||typeof sentence!=="string"){return[]}if(typeof _lodash.default==="undefined"){console.error("Lodash is not available. Please ensure it is imported.");return[]}let textToProcess=sentence.trim();let keywords=[];maxNgramLength=Math.max(2,maxNgramLength);if(textToProcess.length>maxLength){console.warn(`警告:輸入字串長度為 ${textToProcess.length},已根據 maxLength: ${maxLength} 截斷。`);textToProcess=textToProcess.substring(0,maxLength)}const englishWords=textToProcess.match(/[a-zA-Z]+/g)||[];englishWords.forEach(word=>{if(word.length>=2){keywords.push(word.toUpperCase());keywords.push(word.toLowerCase());const capitalized=word.charAt(0).toUpperCase()+word.slice(1).toLowerCase();keywords.push(capitalized)}});const specKeywordsRegex=/\b[0-9]+[a-zA-Z]{1,4}\b|\b[0-9]{1,3}(w|ml|g|oz|k)\b|[\u4e00-\u9fa5a-zA-Z0-9]{1,4}(色|號)[\u4e00-\u9fa5a-zA-Z0-9]{0,2}/gi;const specKeywords=(textToProcess.match(specKeywordsRegex)||[]).filter(k=>k.length>=2).map(k=>k.toLowerCase());keywords.push(...specKeywords);let cleanText=textToProcess.toLowerCase();cleanText=cleanText.replace(/[0-9]+([\u4e00-\u9fa5a-z]{1,4}|[\/\-\~\\])/g," ").replace(/\b[a-z]{1,4}\b/g," ").replace(/\b[0-9]{1,3}\b/g," ");cleanText=cleanText.replace(/[!@#$%^&*()_+={}\[\]:;"'<>,.?\/\\|`~]/g," ").replace(/系列|一組|單色|多款|套組|全套|專用|迷你|頂級|高品質|超閃|奢華|最新|款式|新款|超亮|的|與|和|閃|美甲/g," ").replace(/\s+/g,"").trim();const minLength=2;for(let len=minLength;len<=maxNgramLength;len++){for(let i=0;i<=cleanText.length-len;i++){const keyword=cleanText.substring(i,i+len);keywords.push(keyword)}}const finalKeywords=_lodash.default.chain(keywords).filter(k=>k.length>=2).filter(k=>k.length>2||!/^[\u4e00-\u9fa5a-z0-9]$/.test(k)).uniq().sortBy().value();return finalKeywords});(0,_defineProperty2.default)(this,"mutateIndexOfArrayItem",(array,object,index=0)=>{if(!Array.isArray(array)||!_lodash.default.isObject(object))return array;const currentIndex=_lodash.default.findIndex(array,item=>_lodash.default.isEqual(item,object));if(currentIndex===-1)return array;array.splice(currentIndex,1);const targetIndex=_lodash.default.clamp(index,0,array.length);array.splice(targetIndex,0,object);return array});(0,_defineProperty2.default)(this,"getArrayOfModifyObject2Index",(array,object,index=0)=>{if(!Array.isArray(array)||!_lodash.default.isObject(object))return array;const cloned=_lodash.default.cloneDeep(array);const currentIndex=_lodash.default.findIndex(cloned,item=>_lodash.default.isEqual(item,object));if(currentIndex===-1)return array;cloned.splice(currentIndex,1);const targetIndex=_lodash.default.clamp(index,0,cloned.length);cloned.splice(targetIndex,0,object);return cloned});(0,_defineProperty2.default)(this,"generateLabelValuePairsWithOrigin",(origin=[{label:"aa",value:1203},{label:"cc",value:1204},{label:"gg",value:2}],latest=["aa","bb"])=>{const usedValues=new Set(origin.map(o=>o.value));return _lodash.default.chain(latest).uniq().map(label=>{const originItem=_lodash.default.find(origin,{label});if(originItem){return{label,value:originItem.value}}let value;do{value=_lodash.default.random(2,999999999)}while(usedValues.has(value));usedValues.add(value);return{label,value}}).value()});(0,_defineProperty2.default)(this,"getItemsOfMarkMatching",(sourceArray=[],values=[],valueKey="value",flagKey="belong")=>{const valuesSet=new Set(values);return _lodash.default.map(sourceArray,item=>({...item,[flagKey]:valuesSet.has(item[valueKey])}))});(0,_defineProperty2.default)(this,"generateVariants",(arrays,labelSeparator="\uFF5C",valueSeparator="-")=>{const nonEmptyArrays=arrays.filter(arr=>arr.length>0);if(nonEmptyArrays.length===0)return[];if(nonEmptyArrays.length===1){return nonEmptyArrays[0].map(item=>({label:item.label,value:item.value}))}const combinations=_lodash.default.reduce(nonEmptyArrays,(acc,curr)=>_lodash.default.flatMap(acc,a=>curr.map(b=>[...a,b])),[[]]);return combinations.map(comb=>({label:comb.map(item=>item.label).join(labelSeparator),value:comb.map(item=>item.value).join(valueSeparator)}))});(0,_defineProperty2.default)(this,"renameKeysInArray",(arr,...keyMappings)=>{const mapping=Object.fromEntries(keyMappings);return arr.map(item=>_lodash.default.mapKeys(item,(value,key)=>mapping[key]||key))});(0,_defineProperty2.default)(this,"getArrayOfMergeBySpecificId",(array1,array2,idKey="id")=>{if(!Array.isArray(array2))return array1;const map2=_lodash.default.keyBy(array2,item=>_lodash.default.get(item,idKey));return array1.map(item=>{const id=_lodash.default.get(item,idKey);const match=map2[id];return match?_lodash.default.merge({},item,match):item})});(0,_defineProperty2.default)(this,"toPercentageDecimal",num=>{if(_lodash.default.isNil(num))return 1;if(_lodash.default.isString(num)){num=num.replace(/%/g,"").trim()}const parsed=_lodash.default.toNumber(num);if(!_lodash.default.isFinite(parsed))return 1;return _lodash.default.round(parsed/100,10)});(0,_defineProperty2.default)(this,"getNumberOfMultiplyCeil",(a,b,precision=0)=>{const factor=Math.pow(10,precision);return Math.ceil(a*b*factor)/factor});(0,_defineProperty2.default)(this,"generateGoogleCalendarLink",({title,startDate,startTime,endDate,endTime,location,details})=>{const startDateTime=(0,_momentTimezone.default)(`${startDate} ${startTime}`,"YYYY/MM/DD HH:mm").format("YYYYMMDDTHHmmss");const endDateTime=(0,_momentTimezone.default)(`${endDate} ${endTime}`,"YYYY/MM/DD HH:mm").format("YYYYMMDDTHHmmss");const params=new URLSearchParams;if(title)params.append("text",title);if(startDateTime&&endDateTime)params.append("dates",`${startDateTime}/${endDateTime}`);if(details)params.append("details",details);if(location)params.append("location",location);params.append("ctz","Asia/Taipei");params.append("trp","true");return`https://calendar.google.com/calendar/r/eventedit?${params.toString()}`});(0,_defineProperty2.default)(this,"generateTimeTreeLink",({title,startDate,startTime,endDate,endTime,location,memo})=>{const params=new URLSearchParams;if(title)params.append("title",title);if(startDate)params.append("start_date",startDate.replace(/\//g,"-"));if(startTime)params.append("start_time",startTime);if(endDate)params.append("end_date",endDate.replace(/\//g,"-"));if(endTime)params.append("end_time",endTime);if(location)params.append("location",location);if(memo)params.append("memo",memo);return`https://timetreeapp.com/plans/new?${params.toString()}`});(0,_defineProperty2.default)(this,"generateIcsContent",({title,startDate,startTime,endDate,endTime,location,details})=>{const startDateTime=_momentTimezone.default.tz(`${startDate} ${startTime}`,"YYYY/MM/DD HH:mm","Asia/Taipei").format("YYYYMMDDTHHmmss");const endDateTime=_momentTimezone.default.tz(`${endDate} ${endTime}`,"YYYY/MM/DD HH:mm","Asia/Taipei").format("YYYYMMDDTHHmmss");const stamp=(0,_momentTimezone.default)().utc().format("YYYYMMDDTHHmmss")+"Z";const uid=Date.now().toString(36)+Math.random().toString(36).substring(2,5)+"@gemini-app.com";const escapeIcs=text=>text.replace(/\\/g,"\\\\").replace(/,/g,"\\,").replace(/;/g,"\\;").replace(/\n/g,"\\n");const lines=["BEGIN:VCALENDAR","VERSION:2.0","PRODID:-//Gemini AI//NONSGML v1.0//EN","BEGIN:VEVENT",`UID:${uid}`,`DTSTAMP:${stamp}`];if(startDateTime)lines.push(`DTSTART;TZID=Asia/Taipei:${startDateTime}`);if(endDateTime)lines.push(`DTEND;TZID=Asia/Taipei:${endDateTime}`);if(title)lines.push(`SUMMARY:${escapeIcs(title)}`);if(location)lines.push(`LOCATION:${escapeIcs(location)}`);if(details)lines.push(`DESCRIPTION:${escapeIcs(details)}`);lines.push("END:VEVENT","END:VCALENDAR");return lines.join("\r\n")});(0,_defineProperty2.default)(this,"generateAllCalendarLinks",event=>{const googleLink=this.generateGoogleCalendarLink(event);const timeTreeEvent={...event,memo:event.details};const timeTreeLink=this.generateTimeTreeLink(timeTreeEvent);const icsContent=this.generateIcsContent(event);const icsLink=`data:text/calendar;charset=utf8,${encodeURIComponent(icsContent)}`;return{google:googleLink,timeTree:timeTreeLink,ics:icsLink}});(0,_defineProperty2.default)(this,"getArrayOfMappingRef",(current,reference)=>{return _lodash.default.map(current,currentObj=>{const referenceObj=_lodash.default.find(reference,{value:currentObj.value});return referenceObj?_lodash.default.merge({},currentObj,referenceObj):currentObj})});(0,_defineProperty2.default)(this,"areAllValuesTheSameOnKeys",(array,...keys)=>{if(!array||array.length<=1||keys.length===0){return true}for(const keyName of keys){const firstValue=array[0]?.[keyName];const isCurrentKeySame=_lodash.default.every(array,item=>{return item[keyName]===firstValue});if(!isCurrentKeySame){return false}}return true});this.init();this.env="dev"}performActionWithoutTimingIssue(task=()=>true,wait=10){this.syncDelay(wait).then(()=>task())}executeTimeoutTask(functionOfAsyncTask,ms=1000,id=this.getRandomHash(),...params){const self=this;const idOfCurrentTimeoutTask=this.mapOfIdNTimeoutId[id];if(idOfCurrentTimeoutTask)clearTimeout(idOfCurrentTimeoutTask);const idOfTimeoutTask=setTimeout(async(...param)=>{await functionOfAsyncTask();delete self.mapOfIdNTimeoutId[id]},ms,...params);self.mapOfIdNTimeoutId[id]=idOfTimeoutTask}printLogMessage(message,error=false,...infos){if(!this.isProductionEnvironment()){if(error){this.appendError(message,...infos)}else{this.appendInfo(message,...infos)}}}init(){}setEnvironment(env){this.env=env}appendInfo(...logs){if(this.isProductionEnvironment())return;console.log(...logs)}appendError(...logs){if(this.isProductionEnvironment())return;console.error(...logs)}async syncDelay(delayInms=2000){return new Promise(resolve=>{setTimeout(()=>{resolve(delayInms)},delayInms)})}startWithRegex(string="",rule="."){let pattern=new RegExp(`^${rule}`,"i");return pattern.test(string)}accumulate(target,conditions){let beginning=target;for(const condition of conditions){if(condition!==undefined&&_lodash.default.isFunction(condition)){beginning=condition(beginning)}}return beginning}isOrEquals(target,...several){for(const each of several){if(_lodash.default.isEqual(target,each))return true}return false}isAndEquals(...predicates){for(const predicate of predicates){if(!predicate()){return false}}return true}getStringOfHeadMatch(string,regex,flag="g"){const result=string.match(new RegExp(regex,flag));return this.isUndefinedNullEmpty(result)?undefined:result[0]}or(...booleans){for(const boo of booleans){if(_lodash.default.isBoolean(boo)&&boo)return true}return false}and(...booleans){for(const boo of booleans){if(!!!boo)return false}return true}nth(array,index=-1){return _lodash.default.nth(array,index%_lodash.default.size(array))}getExistOne(...candidates){for(const candidate of candidates){if(candidate)return candidate}}getStringOfDropHeadSign(string,sign){return _lodash.default.dropWhile(Array.from(string),each=>_lodash.default.isEqual(each,sign)).join("")}isAndWith(self,predicate,...several){for(const each of several){if(!predicate(self,each))return false}return true}async syncDelayRandom(min=3000,max=5000){const random=this.getRandomValue(min,max);await this.syncDelay(random);return random}has(collection,item,precisely=false){if(_lodash.default.isArray(collection)){if(precisely)return _lodash.default.findIndex(collection,each=>_lodash.default.isEqual(item,each))>-1;else return _lodash.default.indexOf(collection,item)>-1}if(_lodash.default.isObject(item)){return collection[item]}if(_lodash.default.isString(collection)){return collection.indexOf(item)>-1}return false}containsBy(array,item){return _lodash.default.findIndex(array,each=>_lodash.default.isEqual(each,item))>=0}getStringOfInsideParentheses(string,rule=`.`){return this.getStringOfRule(string,rule,"(",")")}getStringOfInsideBrackets(string,rule=`.`){return this.getStringOfRule(string,rule,"[","]")}getStringOfInsideBraces(string,rule=`.`){return this.getStringOfRule(string,rule,"{","}")}getStringOfRule(string,rule=`.`,left="{",right="}"){return this.getStringOfHeadMatch(string,`(?<=\\${left})${rule}+?(?=\\${right})`)}getRandomHash(length=20){const randomBytes=_cryptoJs.default.lib.WordArray.random(length);const base64String=_cryptoJs.default.enc.Base64.stringify(randomBytes);return base64String.substring(0,length)}getRandomHashV2(length){const characters="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let result="";for(let i=0;i<length;i++){const randomIndex=Math.floor(Math.random()*characters.length);result+=characters.charAt(randomIndex)}return result}getEncryptString(texts,key=_configerer.configerer.ENCRYPT_KEY,alwaysTheSame=false){const maxLengthOfKey=22;if(key.length>maxLengthOfKey)throw new _exceptioner.default(8010,_lodash.default.size(key));const ivOfCrypto=_cryptoJs.default.enc.Base64.parse("thisIsIVWeNeedToGenerateTheSameValue");const keyOfCrypto=alwaysTheSame?_cryptoJs.default.enc.Base64.parse(`${key}${_lodash.default.range(0,maxLengthOfKey-key.length).join("")}`):key;return _cryptoJs.default.AES.encrypt(texts,keyOfCrypto,{iv:ivOfCrypto}).toString()}getEncryptStringV2(texts,key=_configerer.configerer.ENCRYPT_KEY,alwaysTheSame=false){const maxLengthOfKey=22;if(key.length>maxLengthOfKey)throw new _exceptioner.default(8010,_lodash.default.size(key));const ivOfCrypto=_cryptoJs.default.enc.Base64.parse("thisIsIVWeNeedToGenerateTheSameValue");const keyOfCrypto=alwaysTheSame?_cryptoJs.default.enc.Base64.parse(`${key}${_lodash.default.range(0,maxLengthOfKey-key.length).join("")}`):key;return _cryptoJs.default.AES.encrypt(JSON.stringify({content:texts}),keyOfCrypto,{iv:ivOfCrypto}).toString()}getDecryptString(ciphertext,key=_configerer.configerer.ENCRYPT_KEY){const maxLengthOfKey=22;if(key.length>maxLengthOfKey)throw new _exceptioner.default(8010,_lodash.default.size(key));const ivOfCrypto=_cryptoJs.default.enc.Base64.parse("thisIsIVWeNeedToGenerateTheSameValue");try{const value=_cryptoJs.default.AES.decrypt(ciphertext,key,{iv:ivOfCrypto}).toString(_cryptoJs.default.enc.Utf8);if(!_lodash.default.isEmpty(value.trim()))return value}catch(e){}return _cryptoJs.default.AES.decrypt(ciphertext,_cryptoJs.default.enc.Base64.parse(`${key}${_lodash.default.range(0,maxLengthOfKey-key.length).join("")}`),{iv:ivOfCrypto}).toString(_cryptoJs.default.enc.Utf8)}getDecryptStringV2(ciphertext,key=_configerer.configerer.ENCRYPT_KEY){const maxLengthOfKey=22;if(key.length>maxLengthOfKey)throw new _exceptioner.default(8010,_lodash.default.size(key));const ivOfCrypto=_cryptoJs.default.enc.Base64.parse("thisIsIVWeNeedToGenerateTheSameValue");try{const stringOfObj=_cryptoJs.default.AES.decrypt(ciphertext,key,{iv:ivOfCrypto}).toString(_cryptoJs.default.enc.Utf8);if(!_lodash.default.isEmpty(stringOfObj.trim())){const obj=JSON.parse(stringOfObj);return obj.content}}catch(e){}const stringOfObj=_cryptoJs.default.AES.decrypt(ciphertext,_cryptoJs.default.enc.Base64.parse(`${key}${_lodash.default.range(0,maxLengthOfKey-key.length).join("")}`),{iv:ivOfCrypto}).toString(_cryptoJs.default.enc.Utf8);const obj=JSON.parse(stringOfObj);return obj.content}getFirebaseFormattedString(texts){return _lodash.default.replace(texts,/[\.\#\$\[\]]/g,"-").trim()}formalizeNamesToArray(singerString){let normalize=singerString;normalize=normalize.split(_configerer.configerer.SEPARATE_TONE_SINGER)[0].trim();normalize=_lodash.default.replace(normalize,/[,\/#!$%\^&\*;:{}=_`、~()()]/g,"_").trim();normalize=this.getFirebaseFormattedString(normalize);normalize=_lodash.default.replace(normalize,/\_\_+/g,"_").trim();while(_lodash.default.endsWith(normalize,"_")){normalize=normalize.slice(0,-1).trim()}const words=normalize.split("_");return _lodash.default.map(words,word=>_lodash.default.trim(word))}getShuffledArrayWithLimitCountHighPerformance(arr,n){let result=new Array(n),len=arr.length,taken=new Array(len);if(n>len)n=len;while(n--){let x=Math.floor(Math.random()*len);result[n]=arr[x in taken?taken[x]:x];taken[x]=--len in taken?taken[len]:len}return result}getFileNameFromPath(path,extension=false){const segments=path.split("/");const target=segments.pop();return extension?target:target.split(".").shift()}getFileNameExtensionFromPath(path){const name=path.split("/").pop();return name}getPathOfReplaceLastDir(path,name){const split=path.split("/");split.pop();split.push(name);return split.join("/")}getExtensionFromPath(path){const name=path.split("/").pop();const segments=name.split(".");return _lodash.default.size(segments)>1?segments.pop():""}getFolderPathOfSpecificPath(path){const split=path.split("/");split.pop();return split.join("/")}getFolderNameOfFilePath(path){if(this.isValidFilePath(path)){const splits=path.split("/");return _lodash.default.nth(splits,-2)}else{throw new _exceptioner.default(9999,`64255615 path is not valid '${path}'`)}}isUnderTargetPath(absolute,target){const segments=absolute.split("/");return this.has(segments,target)}getFileDirPath(path,slash=true){return _lodash.default.join(_lodash.default.initial(_lodash.default.split(path,"/")),"/")+(slash?"/":"")}isPathEqualsFileType(path,type){const extension=path.split(".").pop();return _lodash.default.isEqual(extension,type)}isValidFilePath(path){const extension=this.getExtensionFromPath(path);return _lodash.default.size(extension)>0}getArrayOfSize(array,n=1){return _lodash.default.take(array,n)}getShuffledArrayWithLimitCount(arr,n){return this.getShuffledArrayWithLimitCountHighPerformance(arr,n)}getRandomItemOfArray(array,...ignores){if(!_lodash.default.isArray(array))throw new _exceptioner.default(9999,`why are you so stupid, typeof array should be array, not ==> ${array} `);const filter=_lodash.default.without(array,...ignores);const target=_lodash.default.size(filter)>0?filter:array;const item=this.getShuffledArrayWithLimitCount(target,1);return item.length>0?item[0]:undefined}appendMapOfKeyArray(object,key,...value){if(this.isUndefinedNullEmpty(object[key])){object[key]=[...value]}else{object[key].push(...value)}}getMergedArrayBy(major=[],sub=[],key){if(!key||major.length===0||sub.length===0){return[...major]}const subMap=new Map(sub.map(item=>[item[key],item]));return major.map(majorItem=>{const subItem=subMap.get(majorItem[key]);return{...(subItem||{}),...majorItem}})}getShuffledItemFromArray(arr){let shuffled=_lodash.default.shuffle(arr);return shuffled[0]}getShuffledArray(arr){let shuffled=_lodash.default.shuffle(arr);return shuffled}isJson(item){item=typeof item!=="string"?JSON.stringify(item):item;try{item=JSON.parse(item)}catch(e){return false}if(typeof item==="object"&&item!==null){return true}return false}getObjectValue(obj){if(_lodash.default.isObject(obj)){return Object.values(obj)[0]}return""}getObject(key,value){const object={};object[key]=value;return object}getStringOfCreditCardFormatted(string=0){const inputValue=string.replace(/\D/g,"");const result=inputValue.replace(/(\d{4})(?=\d)/g,"$1-");return result.slice(0,19)}getObjectKey(obj){if(_lodash.default.isObject(obj)){return Object.keys(obj)[0]}return""}printf(){this.appendInfo("i can use in web || react.js")}isKeywordRule(constraint){if(_lodash.default.isUndefined(constraint)||_lodash.default.isEmpty(constraint))throw new Error("PARAMS CAN NOT BE EMPTY");if(!_lodash.default.isString(constraint))throw new Error("PARAMS SHOULD BE STRING");if(constraint.length>20)throw new Error("EXCEED 20 WORDS IS NOT ALLOWED")}getItsKeyByValue(object,value){return Object.keys(object).find(key=>object[key]===value)}startWiths(string,key=[]){for(const _key of key){if(_lodash.default.startsWith(string,_key)){return true}}return false}replaceAll(string,patten,to){return _lodash.default.replace(string,new RegExp(`${patten}`,`g`),to)}replaceAllWithSets(string="",...patterns){let after=string;for(const pattern of patterns){if(this.isOrEquals(undefined,pattern.from,pattern.to)){throw(0,_exceptioner.default)(9999,`from or to can't be empty`)}after=this.replaceAll(after,pattern.from,pattern.to)}return after}replaceArrayByContentIndex(array,current,latest){const index=_lodash.default.indexOf(array,current);array[index]=latest}deepFlat(collection,sign="_"){let result="";const stack=[[collection,""]];while(stack.length>0){const[current,prefix]=stack.pop();if(_lodash.default.isArray(current)){for(let i=current.length-1;i>=0;i--){stack.push([current[i],prefix])}}else if(_lodash.default.isObject(current)){const keys=Object.keys(current);for(let i=keys.length-1;i>=0;i--){const key=keys[i];stack.push([current[key],prefix+key+sign])}}else{const valueString=_lodash.default.trim(String(current));if(valueString.length>0){result+=(result.length>0?sign:"")+prefix+valueString}else if(prefix.length>0&&result.length>0){result+=sign}else if(prefix.length>0&&result.length===0){result+=prefix.endsWith(sign)?prefix.slice(0,-sign.length):prefix}}}if(result.endsWith(sign)){result=result.slice(0,-sign.length)}return result}joinEscapeChar(str){return(str+"").replace(/[\\"']/g,"\\$&").replace(/\u0000/g,"\\0")}getValueWithIntegerType(whatever){try{const value=parseInt(whatever);return isNaN(value)?0:value}catch(error){return 0}}getValueOfPriority(...compares){for(const compare of compares){if(!this.isUndefinedNullEmpty(compare))return compare}return undefined}async asyncPool(poolLimit,array,iteratorFn){const ret=[];const executing=[];for(const item of array){const p=Promise.resolve().then(()=>{return iteratorFn(item,array)});ret.push(p);if(poolLimit<=array.length){const e=p.then(()=>{return executing.splice(executing.indexOf(e),1)});executing.push(e);if(executing.length>=poolLimit){await Promise.race(executing)}}}return Promise.all(ret)}getAttrValueInSequence(info,...attrs){for(const attr of attrs){if(!_lodash.default.isEmpty(info[attr])){return info[attr]}}return info}toDBC(txtstring){var tmp="";for(var i=0;i<txtstring.length;i++){if(txtstring.charCodeAt(i)===32){tmp=tmp+String.fromCharCode(12288)}if(txtstring.charCodeAt(i)<127){tmp=tmp+String.fromCharCode(txtstring.charCodeAt(i)+65248)}}return tmp}toCDB(str){var tmp="";for(var i=0;i<str.length;i++){if(str.charCodeAt(i)===12288){tmp+=String.fromCharCode(str.charCodeAt(i)-12256);continue}if(str.charCodeAt(i)>65280&&str.charCodeAt(i)<65375){tmp+=String.fromCharCode(str.charCodeAt(i)-65248)}else{tmp+=String.fromCharCode(str.charCodeAt(i))}}return tmp}findIndexes(array,predicate){const indexes=[];let hasIndex=true;let indexOfLatest=0;while(hasIndex){indexOfLatest=_lodash.default.findIndex(array,predicate,indexOfLatest+1);if(indexOfLatest>-1){indexes.push(indexOfLatest)}else{hasIndex=false}}return indexes}getSliceArrayOfSpecificIndexes(array,...indexes){const items=[];const size=_lodash.default.size(array);for(const index of indexes){if(!_lodash.default.isNumber(index))throw new _exceptioner.default(9999,`59941278 index should be number => ${index}, ${array}`);if(index>size-1)throw new _exceptioner.default(9999,`5994123 index=>${index} is not valid, exceed than array size=${size}, ${array}`);items.push(_lodash.default.nth(array,index))}return items}indexesOf(arr,val){const indexes=[];let i=-1;while((i=arr.indexOf(val,i+1))!==-1){indexes.push(i)}return indexes}getIndexOfContext(context,stmt){return _lodash.default.findIndex(context,per=>{return _lodash.default.isEqual(per.trim(),stmt)})}toOneLineString(string){return _lodash.default.join(_lodash.default.split(string,"\n"),"")}toSpaceLessString(string){return _lodash.default.split(string,"").map(each=>_lodash.default.trim(each)).join("")}toNewLineLessString(string){return _lodash.default.split(string,"\n").map(each=>_lodash.default.trim(each)).join("")}exist(obj){return!_lodash.default.isNull(obj)&&!_lodash.default.isUndefined(obj)}isUndefinedNullEmpty(obj){const first=obj===undefined||obj===null;const second=_lodash.default.isString(obj)||_lodash.default.isArray(obj)||_lodash.default.isObject(obj)?_lodash.default.isEmpty(obj):false;return first||second}isAndConditionOfUndefinedNullEmpty(...objs){for(const obj of objs){if(!this.isUndefinedNullEmpty(obj))return false}return true}isOrConditionOfUndefinedNullEmpty(...objs){for(const obj of objs){if(this.isUndefinedNullEmpty(obj))return true}return false}getStringHandledByEachLine(string,predict=(segment,index,segments)=>true,separator="\n"){const segments=string.split(separator);for(const segment of segments){predict(segment,_lodash.default.indexOf(segments,segment),segments)}return segments.join(separator)}getSegmentsOfEachLine(string){return string.split("\n")}getNormalizedStringEndWith(string,predicate){string=this.toCDB(string);predicate=this.toCDB(predicate);const after=_lodash.default.join(_lodash.default.dropRightWhile(string,each=>!_lodash.default.isEqual(each,predicate)),"");return _lodash.default.isEmpty(after)?string:after}getNormalizedStringNotStartWith(string,...predicate){string=this.toCDB(string);const after=_lodash.default.join(_lodash.default.dropWhile(string,each=>this.has(predicate,each)),"");return _lodash.default.isEmpty(after)?string:after}getNormalizedStringNotEndWith(string,...predicate){string=this.toCDB(string);const after=_lodash.default.join(_lodash.default.dropRightWhile(string,each=>this.has(predicate,each)),"");return _lodash.default.isEmpty(after)?string:after}getTodayTimeFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY-MM-DD")}getCustomFormatOfDatePresent(ts,format="YY/MM"){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format(format)}getSimpleDateYYMMDDFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YY/MM/DD")}getSimpleTimeYYMMDDHHmmFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YY/MM/DD HH:mm")}getECPayCurrentTimeFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY/MM/DD HH:mm:ss")}getCurrentTimeFormatV2(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY/MM/DD HH:mm:ss")}getCurrentTimeFormatYMDHM(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY/MM/DD HH:mm")}getCurrentTimeFormatYMDHMS(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY/MM/DD HH:mm:ss")}getCurrentTimeFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY-MM-DD-HH-mm-ss")}getCurrentMillionSecTimeFormat(ts){return(0,_momentTimezone.default)(ts?ts:undefined).format("YYYY-MM-DD-HH-mm-ss-SSS")}isBetweenTimeStamp(target=this.getCurrentTimeStamp(),min,max){return(0,_momentTimezone.default)(target).isBetween(min,max)}isBeforeTimeStamp(target=this.getCurrentTimeStamp(),time){return(0,_momentTimezone.default)(target).isBefore(time)}isAfterTimeStamp(target=this.getCurrentTimeStamp(),time){return(0,_momentTimezone.default)(target).isAfter(time)}formatTimeByLocale(ts,location="zh-TW",timezone="Asia/Taipei",use24Hour=true){_momentTimezone.default.locale(location);const m=(0,_momentTimezone.default)(ts).tz(timezone);const formatStr=use24Hour?"YYYY/MM/DD HH:mm":"YYYY/MM/DD hh:mm A";return m.format(formatStr)}getTimeStampWithConditions(param={days:0,months:0,years:0,minutes:0,seconds:0,hours:0},target=this.getCurrentTimeStamp()){let base=(0,_momentTimezone.default)(target);for(const each in param){const number=param[each];const unit=each;if(number>0){base=base.add(number,unit)}if(number<0){base=base.subtract(Math.abs(number),unit)}}return base.valueOf()}getTimeStampByStringFormat(string){return this.getTimeStampFromSpecificFormat(string,"YYYY/MM/DD HH:mm:ss").valueOf()}getTimeStampFromSpecificFormat(string,format="YYYY/MM/DD HH:mm:ss"){return(0,_momentTimezone.default)(string,format).valueOf()}getTimeStampFromECPayStringFormat(string){return this.getTimeStampFromSpecificFormat(string,"YYYY/MM/DD HH:mm:ss").valueOf()}getTimeFormatOfDurationToMillionSecond(duration){return _momentTimezone.default.utc(duration).format("HH\u5C0F\u6642mm\u5206\u9418ss\u79D2SSS")}getTimeFormatOfDurationToSecond(duration){return _momentTimezone.default.utc(duration).format("HH\u5C0F\u6642mm\u5206\u9418ss\u79D2")}getTimeFormatOfDurationToDay(duration){return _momentTimezone.default.utc(duration).format("DD\u5929HH\u5C0F\u6642mm\u5206\u9418ss\u79D2")}getChineseTimeFormat(ts){_momentTimezone.default.locale("zh-TW");return(0,_momentTimezone.default)(ts).format("LLLL")}getMinuteFormatOfDuration(ds){return _momentTimezone.default.duration(ds).asMinutes()}getSecondFormatOfDuration(ds){return _momentTimezone.default.duration(ds).asSeconds()}getDayFormatOfDuration(ds){return _momentTimezone.default.duration(ds).asDays()}getDurationOfMillionSec(dateOrTimeStamp){const currentTimestamp=this.getCurrentTimeStamp();const targetTimeStamp=(0,_momentTimezone.default)(dateOrTimeStamp).valueOf();const queue=_lodash.default.sortBy([{ts:currentTimestamp},{ts:targetTimeStamp}],each=>each.ts).map(each=>each.ts);let after=(0,_momentTimezone.default)(queue.pop());let before=(0,_momentTimezone.default)(queue.shift());let duration=_momentTimezone.default.duration(after.diff(before));let ms=duration.asMilliseconds();return ms}getCurrentTimeStamp(){return(0,_momentTimezone.default)().valueOf()}isStringContainInLines(context,key){for(let each of _lodash.default.split(context,"\n")){if(this.has(each,key))return true}return false}camel(...words){return _lodash.default.camelCase(words.join("_"))}upperCamel(...words){return _lodash.default.upperFirst(this.camel(...words))}array2Obj(array){const obj={};for(const each of array){obj[`${this.getObjectKey(each)}`]=this.getObjectValue(each)}return obj}arrayToObjWith(array,predicate){const obj={};for(const item of array){const key=predicate(item);const content=obj[key];if(content&&_lodash.default.isArray(content)){content.push(item)}else{obj[key]=[item]}}return obj}isEmptyString(string){return _lodash.default.isEqual(_lodash.default.trim(string),"")}mergeObject(...obj){return _lodash.default.merge(...obj)}syncSetTimeout(func,ms,callback=()=>{}){(function sync(done){if(!done){setTimeout(function(){func();sync(true)},ms);return}callback()})()}mergeArrayBy(identifier="id",...array){return Object.values(array.flat().reduce((acc,item)=>{if(item[identifier])acc[item[identifier]]={...(acc[item[identifier]]||{}),...item};return acc},{}))}getRelativePath(pathName,rootName){return _lodash.default.dropWhile(pathName,(each,index)=>{return _lodash.default.isEqual(each,rootName[index])}).join("")}dropItemsByIndex(array,from,end){_lodash.default.remove(array,(value,index,array)=>end>=index&&index>=from)}isEven(n){return n%2===0}isOdd(n){return Math.abs(n%2)===1}enrichZhTw(){_momentTimezone.default.locale("zh-tw",{months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u5468\u65E5_\u5468\u4E00_\u5468\u4E8C_\u5468\u4E09_\u5468\u56DB_\u5468\u4E94_\u5468\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),longDateFormat:{LT:"Ah\u9EDEmm\u5206",LTS:"Ah\u9EDEm\u5206s\u79D2",L:"YYYY-MM-DD",LL:"YYYY\u5E74MMMD\u65E5",LLL:"YYYY\u5E74MMMD\u65E5Ah\u9EDEmm\u5206",LLLL:"YYYY\u5E74MMMD\u65E5ddddAh\u9EDEmm\u5206",l:"YYYY-MM-DD",ll:"YYYY\u5E74MMMD\u65E5",lll:"YYYY\u5E74MMMD\u65E5Ah\u9EDEmm\u5206",llll:"YYYY\u5E74MMMD\u65E5ddddAh\u9EDEmm\u5206"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(h,meridiem){let hour=h;if(hour===12){hour=0}if(meridiem==="\u51CC\u6668"||meridiem==="\u65E9\u4E0A"||meridiem==="\u4E0A\u5348"){return hour}else if(meridiem==="\u4E0B\u5348"||meridiem==="\u665A\u4E0A"){return hour+12}else{return hour>=11?hour:hour+12}},meridiem:function(hour,minute,isLower){const hm=hour*100+minute;if(hm<600){return"\u51CC\u6668"}else if(hm<900){return"\u65E9\u4E0A"}else if(hm<1130){return"\u4E0A\u5348"}else if(hm<1230){return"\u4E2D\u5348"}else if(hm<1800){return"\u4E0B\u5348"}else{return"\u665A\u4E0A"}},calendar:{sameDay:function(){return this.minutes()===0?"[\u4ECA\u5929]Ah[\u9EDE\u6574]":"[\u4ECA\u5929]LT"},nextDay:function(){return this.minutes()===0?"[\u660E\u5929]Ah[\u9EDE\u6574]":"[\u660E\u5929]LT"},lastDay:function(){return this.minutes()===0?"[\u6628\u5929]Ah[\u9EDE\u6574]":"[\u6628\u5929]LT"},nextWeek:function(){let startOfWeek,prefix;startOfWeek=(0,_momentTimezone.default)().startOf("week");prefix=this.diff(startOfWeek,"days")>=7?"[\u4E0B]":"[\u672C]";return this.minutes()===0?prefix+"dddA\u9EDE\u6574":prefix+"dddAh\u9EDEmm"},lastWeek:function(){let startOfWeek,prefix;startOfWeek=(0,_momentTimezone.default)().startOf("week");prefix=this.unix()<startOfWeek.unix()?"[\u4E0A]":"[\u672C]";return this.minutes()===0?prefix+"dddAh\u9EDE\u6574":prefix+"dddAh\u9EDEmm"},sameElse:"LL"},ordinalParse:/\d{1,2}(日|月|周)/,ordinal:function(number,period){switch(period){case"d":case"D":case"DDD":return number+"\u65E5";case"M":return number+"\u6708";case"w":case"W":return number+"\u5468";default:return number}},relativeTime:{future:"%s\u5185",past:"%s\u524D",s:"\u5E7E\u79D2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5C0F\u6642",hh:"%d \u5C0F\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500B\u6708",MM:"%d \u4E2A\u6708",y:"1 \u5E74",yy:"%d \u5E74"},week:{dow:1,doy:4}})}getVisibleOrHidden(judgement){return{visibility:judgement?"visible":"hidden"}}getNumberOfPercentageToFloat(percentage){let cleanedPercentage=percentage.replace("%","");let floatNumber=parseFloat(cleanedPercentage)/100;return floatNumber}getVisibleOrNone(judgement,flex=false){return{display:judgement?flex?"flex":"inherit":"none"}}stringToInteger(string){string=_lodash.default.toUpper(string);switch(string){case"A":return 0;case"B":return 1;case"C":return 2;case"D":return 3;case"E":return 4;case"F":return 5;case"G":return 6;case"H":return 7;case"I":return 8;case"J":return 9;case"K":return 10;case"L":return 11;case"M":return 12;case"N":return 13;default:return 101}}integerToString(integer){switch(integer){case 0:return"A";case 1:return"B";case 2:return"C";case 3:return"D";case 4:return"E";case 5:return"F";case 6:return"G";case 7:return"H";case 8:return"I";case 9:return"J";case 10:return"K";case 11:return"L";case 12:return"M";case 13:return"N";default:return"Z"}}toObjectMap(array,...rules){const newbies=[];for(const each of array){const object={};for(const rule of rules){const func=rule.func?rule.func:stmt=>stmt;object[rule.to]=this.isUndefinedNullEmpty(rule.from)||!_lodash.default.isObject(each)?func(each):func(each[rule.from])}newbies.push(object)}return newbies}exeAll(collection,...funcs){if(_lodash.default.isArray(collection)){for(const each of collection){for(const func of funcs){func(each)}}}else if(_lodash.default.isObject(collection)){for(const each in collection){for(const func of funcs){collection[each]=func(collection[each])}}}else{throw new _exceptioner.default(9999,`7841212 type can't be array or object`)}return collection}getObjectWhile(major,minor,predicate=target=>true){const collection={};for(const key in major){if(predicate(major,minor,key)){collection[key]=major[key]}}return collection}getIntersectionObject(objOfMajor,objOfMinor){return this.getObjectWhile(objOfMajor,objOfMinor,(major,minor,key)=>minor[key]!==undefined)}getDifferenceObject(objOfMajor,objOfMinor){return this.getObjectWhile(objOfMajor,objOfMinor,(major,minor,key)=>minor[key]===undefined)}isObjectContainAndEqual(targetObject,mainObject){let equal=true;for(const key in targetObject){if(mainObject[key]===undefined||mainObject[key]!==targetObject[key]){equal=false;break}}return equal}getStringOfPop(string,separator){if(!_lodash.default.isString(string)){throw new _exceptioner.default(9999,`445115,type should be string but ==> ${typeof string}`)}const segments=string.split(separator);segments.pop();return segments.join(separator)}getStringOfShift(string,separator){if(!_lodash.default.isString(string)){throw new _exceptioner.default(9999,`445116,type should be string but ==> ${typeof string}`)}const segments=string.split(separator);segments.shift();return segments.join(separator)}toObjectWithAttributeKey(array,attrKeyOfPK){const object={};for(const each of array){const pk=each[attrKeyOfPK];if(this.isUndefinedNullEmpty(pk)){throw new _exceptioner.default(9999,`48157232 pk can't be empty => '${pk}'`)}object[pk]=each}return object}getObjectOfArraySpecifyAttr(array,attr){return this.toObjectWithAttributeKey(array,attr)}getStateOfStringContainsSign(string,...signs){for(const sign of signs){if(this.has(string,sign)){return{exists:true,sign}}}return{exists:false}}constraintOfParam(collection,type,...others){let result=false;const validOfOthersCondition=_lodash.default.isEmpty(others)?true:this.and(...others.map(each=>each.logic));switch(type){case"array":if(_lodash.default.isArray(collection)&&validOfOthersCondition)result=true;break;case"object":if(_lodash.default.isObject(collection)&&validOfOthersCondition)result=true;break;case"string":if(_lodash.default.isString(collection)&&validOfOthersCondition)result=true;break;case"number":if(_lodash.default.isNumber(collection)&&validOfOthersCondition)result=true;break;case"other":if(validOfOthersCondition)return true}const stringOfRules=_lodash.default.isEmpty(others)?"":`, ${others.map(each=>each.message).join(" | ")}`;if(result===false){throw new _exceptioner.default(9999,`7474423 type should be ${type} but get '${typeof type}' ${stringOfRules} `)}}getSliceArrayWithMutate(array,n){const slice=_lodash.default.remove(array,(each,index)=>index<n);return slice}getArrayOfInteraction(one,two){return one.filter(element=>!two.includes(element))}getArrayOfMoveToSpecificIndex(array,from,to){if(!Array.isArray(array)){throw new Error("First argument must be an array.")}const length=array.length;if(from<0||from>=length||to<0||to>=length){console.warn("Invalid 'from' or 'to' index for getArrayOfMoveToSpecificIndexOptimized.");return[...array]}if(from===to){return[...array]}const copy=[...array];const[item]=copy.splice(from,1);copy.splice(to,0,item);return copy}getArrayOfMoveItemToSpecificIndex(array,item,indexOfDestination){const indexOfItem=_lodash.default.indexOf(array,item);return this.getArrayOfMoveToSpecificIndex(array,indexOfItem,indexOfDestination)}getArrayOfMoveSpecificItemToAside(array,item,toTail=true){const indexOfItem=_lodash.default.indexOf(array,item);return this.getArrayOfMoveSpecificIndexToAside(array,indexOfItem,toTail)}getArrayOfMoveSpecificIndexToAside(array,index,toTail=true){const indexOfLast=_lodash.default.size(array)-1;return this.getArrayOfMoveToSpecificIndex(array,index,toTail?indexOfLast:0)}getECPayCheckMacValue(data,hashKey="5294y06JbISpM5x9",hashIV="v77hoKGq4kWxNNIS"){const clone=_lodash.default.cloneDeep(data);delete clone.CheckMacValue;const keys=Object.keys(clone).sort((l,r)=>l>r?1:-1);let checkValue="";for(const key of keys){checkValue+=`${key}=${clone[key]}&`}checkValue=`HashKey=${hashKey}&${checkValue}HashIV=${hashIV}`;checkValue=encodeURIComponent(checkValue).toLowerCase();checkValue=checkValue.replace(/%20/g,"+").replace(/%2d/g,"-").replace(/%5f/g,"_").replace(/%2e/g,".").replace(/%21/g,"!").replace(/%2a/g,"*").replace(/%28/g,"(").replace(/%29/g,")").replace(/%20/g,"+");return _lodash.default.toUpper(_cryptoJs.default.SHA256(checkValue).toString(_cryptoJs.default.enc.Hex))}getStringOfHandledHtml(htmlString,predicate=document=>{console.log(document)}){const document=(0,_nodeHtmlParser.parse)(htmlString);predicate(document);return document.toString()}getSpecifyObjectBy(array,predicate){for(const item of array){if(predicate(item))return item}}validatePayloadObjectValid(content,rules=[],idOfError=this.getRandomHash(10)){if(this.isUndefinedNullEmpty(content)){throw new _exceptioner.default(9999,`${idOfError} content(pay-load) is undefined || empty`)}for(const rule of rules){if(_lodash.default.isString(rule)){if(this.isUndefinedNullEmpty(content[rule])){throw new _exceptioner.default(9999,`${idOfError} ATTRIBUTE:'${rule}' is not Exist`)}}else if(_lodash.default.isObject(rule)){const key=this.getObjectKey(rule);const predicate=this.getObjectValue(rule);if(!predicate(content[key])){throw new _exceptioner.default(9999,`${idOfError} ATTRIBUTE:'${key}' is not valid of custom rule`)}}}return true}getArrayOfSummarizeBy(array,keyOfId,keyOfSum){const obj={};for(const item of array){const key=item[keyOfId];if(obj[key]!==undefined){obj[key]=obj[key]+item[keyOfSum]}else{obj[key]=item[keyOfSum]}}const items=[];for(const key in obj){const _obj={};_obj[keyOfId]=key;_obj[keyOfSum]=obj[key];items.push(_obj)}return items}getHeadStringSplitBy(string,sign=this.getSeparatorOfUnique()){return _lodash.default.split(string,sign).shift()}getTailStringSplitBy(string,sign=this.getSeparatorOfUnique()){return _lodash.default.split(string,sign).pop()}getSlicesByIndexes(array=[],indexes=[]){const slices=[];_lodash.default.each(indexes,(each,index,arrayOfIndexes)=>{if(_lodash.default.isEqual(index,indexes.length-1))return false;const slice=_lodash.default.slice(array,each,indexes[index+1]);slices.push(slice)});return slices}findIndexes(array,predicate){const indexes=[];let hasIndex=true;let indexOfLatest=0;while(hasIndex){indexOfLatest=_lodash.default.findIndex(array,predicate,indexOfLatest+1);if(indexOfLatest>-1){indexes.push(indexOfLatest)}else{hasIndex=false}}return indexes}getRandomName(options=undefined){return(0,_words.generate)(options)}getRandomCount(options=undefined){return(0,_words.count)(options)}isOverSpecificAge(birthDate,target=18){const age=(0,_momentTimezone.default)().diff((0,_momentTimezone.default)(birthDate,"YYYY-MM-DD"),"years");return age>=target}isValidEmail(email){const emailRegex=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return emailRegex.test(email)}isValidTaiwaneseID(idNumber){const idRegex=/^[A-Z][1-2]\d{8}$/;if(!idRegex.test(idNumber)){return false}const weight=[1,9,8,7,6,5,4,3,2,1];const firstChar=idNumber.charCodeAt(0)-65;let sum=firstChar*10+parseInt(idNumber.slice(1));for(let i=0;i<weight.length;i++){sum+=parseInt(idNumber.charAt(i+1))*weight[i]}return sum%10===0}validatePersonalInfoInput(name,email,idNumber,phoneNumber,birthday,ageOfQualify=12){if(name.length<2){return{valid:false,message:"\u59D3\u540D\u81F3\u5C11\u8981\u5169\u500B\u5B57"}}const emailRegex=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;if(!emailRegex.test(email)){return{valid:false,message:"\u96FB\u5B50\u90F5\u4EF6\u683C\u5F0F\u4E0D\u6B63\u78BA"}}const idRegex=/^[A-Z][1-2]\d{8}$/;if(!idRegex.test(idNumber)){return{valid:false,message:"\u8EAB\u5206\u8B49\u865F\u78BC\u683C\u5F0F\u4E0D\u6B63\u78BA"}}const phoneRegex=/^09\d{8}$/;if(!phoneRegex.test(phoneNumber)){return{valid:false,message:"\u624B\u6A5F\u865F\u78BC\u683C\u5F0F\u4E0D\u6B63\u78BA"}}if(this.isUndefinedNullEmpty(birthday))return{valid:false,message:`出生日期格式不正確`};const now=(0,_momentTimezone.default)();const age=now.diff(birthday,"years");if(age<ageOfQualify){return{valid:false,message:`年齡不得小於 ${ageOfQualify} 歲`}}return{valid:true,message:"\u683C\u5F0F\u6AA2\u67E5\u901A\u904E"}}getStringOfFormatTimestampRange(startTimestamp,endTimestamp){const startDate=(0,_momentTimezone.default)(startTimestamp);const endDate=(0,_momentTimezone.default)(endTimestamp);const formatDate=date=>date.format("YY/MM/DD");const startYear=startDate.year();const endYear=endDate.year();if(startYear===endYear){return`${formatDate(startDate)} - ${endDate.format("MM/DD")}`}else{return`${formatDate(startDate)} - ${formatDate(endDate)}`}}getStringOfCalculateClassTime(startTimestamp,endTimestamp,weeklyMinutes){const startDate=(0,_momentTimezone.default)(startTimestamp);const endDate=(0,_momentTimezone.default)(endTimestamp);const totalDays=endDate.diff(startDate,"days")+1;const totalWeeks=Math.ceil(totalDays/7);const totalMinutes=totalWeeks*weeklyMinutes;const hours=Math.floor(totalMinutes/60);const minutes=totalMinutes%60;if(minutes===0){return`${hours}小時`}else{return`${hours}小時${minutes}分鐘`}}getNumberOfPeriodMinute(startTimestamp,endTimestamp){const startTime=(0,_momentTimezone.default)(startTimestamp).format("HH:mm");const endTime=(0,_momentTimezone.default)(endTimestamp).format("HH:mm");const startDate=(0,_momentTimezone.default)(startTime,"HH:mm");const endDate=(0,_momentTimezone.default)(endTime,"HH:mm");const durationInMinutes=_momentTimezone.default.duration(endDate.diff(startDate)).asMinutes();return durationInMinutes}getStringOfWeekTime(day,startTimestamp,endTimestamp){const daysOfWeek={1:"\u9031\u4E00",2:"\u9031\u4E8C",3:"\u9031\u4E09",4:"\u9031\u56DB",5:"\u9031\u4E94",6:"\u9031\u516D",7:"\u9031\u65E5"};if(day<1||day>7){throw new Error("day \u5FC5\u9808\u5728 1 \u5230 7 \u4E4B\u9593")}const startTime=(0,_momentTimezone.default)(startTimestamp).format("HH:mm");const endTime=(0,_momentTimezone.default)(endTimestamp).format("HH:mm");return`${daysOfWeek[day]} ${startTime}-${endTime}`}extractNumber(str){if(this.isUndefinedNullEmpty(str))return-1;const match=str.match(/\d+/);return match?Number(match[0]):-1}async fetchElementAttribute(dom,attr="innerText",defaultValue=""){return await dom.evaluate(el=>el[attr])}async fetchElementAttributes(dom,stringOfTrait,defaultValue="",...attributes){const element=await dom.$(stringOfTrait);if(!this.isUndefinedNullEmpty(element)){try{return await element.evaluate((el,attributes)=>{if(attributes.length===1)return el[attributes.shift()];return{...attributes.map(attr=>el[attr])}},attributes)}catch(error){this.appendError(`1581532 ${stringOfTrait} fetch ${JSON.stringify(attributes)} fail, element is not found`);return defaultValue}}return defaultValue}async writeElementAttributes(dom,stringOfTrait,...attributes){const element=await dom.$(stringOfTrait);if(!this.isUndefinedNullEmpty(element)){await element.evaluate((element,attributes)=>{attributes.map(attr=>{const entries=Object.entries(attr);const key=entries[0][0];const value=entries[0][1];element[key]=value})},attributes)}else this.appendError(`1231232 ${stringOfTrait} fetch ${JSON.stringify(attributes)} fail, element is not found`)}getSliceArrayOfUnique(array){if(!Array.isArray(array)||array.length===0){return[]}const firstElement=array[0];if(_lodash.default.isObject(firstElement)&&key){const uniqueMap=new Map(array.map(item=>[item[key],item]));return Array.from(uniqueMap.values())}else if(_lodash.default.isObject(firstElement)){console.warn("getSliceArrayOfUniqueOptimized: No key provided for object array, using potentially slow deep comparison.");return _lodash.default.uniqWith(array,_lodash.default.isEqual)}else{return Array.from(new Set(array))}}getUniqueValuesBy(array,key="valueOfType"){return _lodash.default.uniq(array.map(item=>item[key]))}generateCombinations(...attributes){const keys=attributes.map(attr=>attr.key);const labelMap=_lodash.default.keyBy(attributes,"key");const optionArrays=attributes.map(attr=>attr.options.map(option=>({key:attr.key,value:option.value,label:option.label})));const cartesianProduct=_lodash.default.reduce(optionArrays,(acc,curr)=>_lodash.default.flatMap(acc,a=>curr.map(b=>[...a,b])),[[]]);const results=cartesianProduct.map(combination=>{const trait={};const idParts=[];const contentParts=[];for(const{key,value,label}of combination){trait[key]=value;idParts.push(`${key}_${value}`);contentParts.push(`${label}`)}return{trait,id:idParts.join("_"),content:contentParts.join("\uFF5C")}});return _lodash.default.sortBy(results,item=>keys.map(key=>item.trait[key]))}extractStaticSegments(path,rules=[":"]){return path.trim().replace(/^\.?\/*|\/*$/g,"").split("/").filter(segment=>segment&&!rules.some(rule=>segment.startsWith(rule)))}mutateRemoveKeys(array,keysToRemove){_lodash.default.forEach(array,(obj,index)=>{const filtered=Object.fromEntries(Object.entries(obj).filter(([key])=>!keysToRemove.includes(key)));Object.keys(obj).forEach(k=>delete obj[k]);Object.assign(obj,filtered)})}removeKeysFromArrayObjects(array,keysToRemove){return _lodash.default.map(array,obj=>Object.fromEntries(Object.entries(obj).filter(([key])=>!keysToRemove.includes(key))))}formatTextWithEllipsis(originalText,maxLength){const ellipsis="......";const ellipsisLength=ellipsis.length;if(_lodash.default.size(originalText)<=maxLength)return originalText;if(maxLength<=ellipsisLength)return"";const remainingLength=maxLength-ellipsisLength;const frontLength=Math.floor(remainingLength/2);const backLength=remainingLength-frontLength;const front=_lodash.default.truncate(originalText,{length:frontLength,omission:""});const back=_lodash.default.takeRight(originalText,backLength).join("");return`${front}${ellipsis}${back}`}getObjectBy(obj,predict=attr=>attr.checked!==true){return _lodash.default.fromPairs(_lodash.default.toPairs(obj).filter(([_,value])=>predict(value)))}mutateBy(array,predict=item=>item){const sorted=_lodash.default.sortBy(array,predict);array.splice(0,array.length,...sorted)}findUniqueStrings(...arrays){const allStrings=_lodash.default.flatten(arrays);const grouped=_lodash.default.countBy(allStrings);return _lodash.default.chain(grouped).pickBy(count=>count===1).keys().compact().value()}getObjectOfSpecifyKey(value,key){const object={};object[key]=value;return object}findUniqueNonReferenceStrings(...arrays){if(arrays.length===0)return[];const[reference,...rest]=arrays;const allExceptRef=_lodash.default.flatten(rest);const counted=_lodash.default.countBy(allExceptRef);return _lodash.default.chain(counted).pickBy((count,str)=>count===1&&!reference.includes(str)).keys().compact().value()}getArrayOfFillMissingValues(array){const charset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";const generateRandomValue=()=>_lodash.default.times(8,()=>_lodash.default.sample(charset)).join("");const usedValues=new Set(array.map(item=>item.value).filter(Boolean));return array.map(item=>{if(_lodash.default.isEmpty(item.value)){let newValue;do{newValue=generateRandomValue()}while(usedValues.has(newValue));usedValues.add(newValue);return{...item,value:newValue}}return item})}isFirestoreAutoId(id){return _lodash.default.isString(id)&&id.length===20&&/^[A-Za-z0-9]{20}$/.test(id)}getAutoIdOfFirestore(){return this.getRandomHashV2(20)}getStringOfConvertTimeRange(input){const[datePart,timeRange]=input.split("\uFF5C");const dateStr=datePart.split("(")[0];const[start,end]=timeRange.split("-");const formatDate=time=>(0,_momentTimezone.default)(`${dateStr} ${time}`,"YYYY/MM/DD HH:mm").format("YYYYMMDDHHmm");return`${formatDate(start)}-${formatDate(end)}`}getTSOfSpecificDate(dateStr,{end=false}={}){return Number((0,_lodash.default)(dateStr).thru(str=>(0,_momentTimezone.default)(str.split("(")[0],"YYYY/MM/DD")).thru(m=>end?m.endOf("day"):m.startOf("day")).value().format("YYYYMMDDHHmmss"))}isHttpsURL(url){if(!_lodash.default.isString(url))return false;try{const decoded=decodeURIComponent(url.trim());const parsed=new URL(decoded);return parsed.protocol==="https:"}catch(e){return false}}generateUniqueCodeMap(array,length=3){if(length<2){throw new Error("\u4EE3\u78BC\u9577\u5EA6\u6700\u5C11\u5FC5\u9808\u70BA 2\u3002")}const usedCodes=new Set;const usedKeys=new Set;const generateRandomCode=()=>{const letters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";const chars=letters+"0123456789";let code;do{code=letters[Math.floor(Math.random()*letters.length)];for(let i=1;i<length;i++){code+=chars[Math.floor(Math.random()*chars.length)]}}while(usedCodes.has(code));usedCodes.add(code);return code};return _lodash.default.transform(array,(result,key)=>{if(usedKeys.has(key)){throw new Error(`23125453 Duplicate key detected: "${key}"`)}usedKeys.add(key);result[key]=generateRandomCode()},{})}getPriceOfPercentageBehavior(price,percentage,discount=false){const decimal=this.toPercentageDecimal(percentage);return this.getNumberOfMultiplyCeil(price,discount?1-decimal:1+decimal)}getFeeOfDiscount(origin,percentage){return Math.round(_lodash.default.multiply(origin,this.toPercentageDecimal(percentage)))}mergeArrayByKey(array){if(!Array.isArray(array))return array;const resultMap={};for(const obj of array){if(!_lodash.default.isPlainObject(obj))continue;for(const[key,value]of Object.entries(obj)){if(!resultMap[key]){resultMap[key]=_lodash.default.cloneDeep(value)}else{_lodash.default.merge(resultMap[key],value)}}}array.length=0;Object.entries(resultMap).forEach(([key,value])=>{array.push({[key]:value})});return array}getObjectOfStartEndDateTime(input){if(!input||typeof input!=="string"){return{startDate:"",startTime:"",endDate:"",endTime:""}}const cleaned=input.replace(/|/g," ").replace(/-/g,"-").replace(/\s+/g," ").trim();const crossDatePattern=/(\d{4}\/\d{1,2}\/\d{1,2})(?:\s*\([^)]*\))?\s*(\d{2}:\d{2})\s*-\s*(\d{4}\/\d{1,2}\/\d{1,2})(?:\s*\([^)]*\))?\s*(\d{2}:\d{2})/;const sameDatePattern=/(\d{4}\/\d{1,2}\/\d{1,2})(?:\s*\([^)]*\))?\s*(\d{2}:\d{2})\s*-\s*(\d{2}:\d{2})/;let startDate,startTime,endDate,endTime;if(crossDatePattern.test(cleaned)){[,startDate,startTime,endDate,endTime]=cleaned.match(crossDatePattern)}else if(sameDatePattern.test(cleaned)){[,startDate,startTime,endTime]=cleaned.match(sameDatePattern);endDate=startDate}else{return{startDate:"",startTime:"",endDate:"",endTime:""}}const start=new Date(`${startDate} ${startTime}`);const end=new Date(`${endDate} ${endTime}`);if(end<start){throw new Error(`End time cannot be earlier than start time: ${input}`)}return{startDate,startTime,endDate,endTime}}getFilteredHeraPeriods(arr,idOfCurrentBooze){return _lodash.default.chain(arr).filter(item=>item.idOfBooze!==idOfCurrentBooze).uniqBy(item=>`${item.idOfBooze}_${item.idOfVariant}`).value()}checkPeriodConflict(newTask,existingTasks,resourceCount=1){const[datePart,timePart]=newTask.content.split("\uFF5C");const date=(0,_momentTimezone.default)(datePart.split(" ")[0],"YYYY/MM/DD");const[startTimeStr,endTimeStr]=timePart.split("-");const start=(0,_momentTimezone.default)(`${date.format("YYYY/MM/DD")} ${startTimeStr}`,"YYYY/MM/DD HH:mm");const end=(0,_momentTimezone.default)(`${date.format("YYYY/MM/DD")} ${endTimeStr}`,"YYYY/MM/DD HH:mm");const conflictItems=_lodash.default.filter(existingTasks,task=>{const[pStartStr,pEndStr]=task.period.split("-");const pStart=(0,_momentTimezone.default)(pStartStr,"YYYYMMDDHHmm");const pEnd=(0,_momentTimezone.default)(pEndStr,"YYYYMMDDHHmm");return start.isBefore(pEnd)&&end.isAfter(pStart)});const conflict=conflictItems.length>=resourceCount;return{conflict,items:conflictItems}}}var _default=exports.default=Utiller;
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _lodash=_interopRequireDefault(require("lodash"));var _cryptoJs=_interopRequireDefault(require("crypto-js"));var _configerer=require("configerer");var _exceptioner=_interopRequireDefault(require("../exceptioner"));var _momentTimezone=_interopRequireDefault(require("moment-timezone"));var _uuid=require("uuid");var _nodeHtmlParser=require("node-html-parser");String.format=function(){let param=[];for(let i=0,l=arguments.length;i<l;i++){param.push(arguments[i])}let statement=param[0];param.shift();return statement.replace(/\{(\d+)\}/g,function(m,n){return param[n]})};class Utiller{removeAttributeBy(object,predicate=value=>_lodash.default.isUndefined(value)){for(const key in object){if(predicate(object[key])){delete object[key]}}}getNumberOfNormalize(value,defaultValue=0){if(_lodash.default.isNumber(value))return value;try{const force=_lodash.default.toNumber(value);return _lodash.default.isNumber(force)&&!isNaN(force)?force:defaultValue}catch(error){Util.appendError(`448561684561 ${error.message}`)}return defaultValue}getStringOfNormalize(value,defaultValue="",trim=false){if(_lodash.default.isString(value))return trim?_lodash.default.trim(value):value;try{const force=_lodash.default.toString(value);return this.isOrEquals(force,"","undefined")?defaultValue:trim?_lodash.default.trim(force):force}catch(error){Util.appendError(`448616845453 ${error.message}`)}return defaultValue}isValidVersionOfString(versionName){if(this.isUndefinedNullEmpty(versionName)){return false}const numbers=versionName.split(".");for(const number of numbers){const toNum=_lodash.default.toNumber(number);if(!_lodash.default.isNumber(toNum)||isNaN(toNum))return false}return true}getSeparatorOfUnique(){return"\u0F0D\u0F0D"}getStringOfVersionIncrement(stringOfVersion,delta=1){const numbers=stringOfVersion.split(".").map(each=>_lodash.default.toNumber(each));const last=numbers.length-1;numbers[last]=numbers[last]+delta;return numbers.join(".")}setLocaleOfMoment(locale="en"){_momentTimezone.default.locale(locale)}getUuidOfV4(){return(0,_uuid.v4)()}constructor(){(0,_defineProperty2.default)(this,"mapOfIdNTimeoutId",{});(0,_defineProperty2.default)(this,"getEnvironment",()=>{return this.env});(0,_defineProperty2.default)(this,"isProductionEnvironment",()=>{return _lodash.default.isEqual(this.getEnvironment(),"prod")});(0,_defineProperty2.default)(this,"asyncUnitTaskFunction",(millionSec=2000,_funparam="\u9810\u8A2D\u7684param",errorSimulator)=>async(param=this.getRandomHash(10))=>{const randomValue=this.getRandomValue(millionSec,millionSec*1.2);try{const symbol=randomValue;this.appendInfo(`before executed ===> i'm symbol of ${symbol}, ready to be executed, inner param = ${_funparam}`);await this.syncDelay(randomValue);if(_lodash.default.isFunction(errorSimulator)&&errorSimulator(param))throw Error("force to made error happen");this.appendInfo(`after executed ===> i'm symbol of ${symbol}, the task cost ${randomValue} million-seconds ${param?`i hav params ===> ${param}`:""}`);return{randomValue,symbol,param}}catch(error){this.appendError(new Error(`asyncUnitTask() catch error ${error.message}`))}finally{this.appendInfo(`wow.... finally got you`)}});(0,_defineProperty2.default)(this,"test",word=>{return async()=>{await Util.syncDelay(3000);console.log("\u7D93\u904E\u4E86\u4E09\u79D2");await Util.syncDelay(4000);console.log("\u7D93\u904E\u4E86\u56DB\u79D2");await Util.syncDelay(5000);console.log("\u7D93\u904E\u4E86\u4E94\u79D2");await Util.syncDelay(6000);console.log("\u7D93\u904E\u4E86\u516D\u79D2");return`3423809432804 ${word}`}});(0,_defineProperty2.default)(this,"findLowestValue",(items,key="price")=>{const minPrice=_lodash.default.minBy(items,key)[key];return Math.floor(minPrice)});(0,_defineProperty2.default)(this,"findHighestValue",(items,key="price")=>{const maxPrice=_lodash.default.maxBy(items,key)[key];return Math.floor(maxPrice)});(0,_defineProperty2.default)(this,"getStringOfValueRange",(items,key="price",sign="$")=>{const minV=_lodash.default.minBy(items,key)[key];const maxV=_lodash.default.maxBy(items,key)[key];return maxV===minV?`$${minV}`:`${sign}${minV} - ${sign}${maxV}`});(0,_defineProperty2.default)(this,"getCallersName",()=>{let callerName;try{throw new Error}catch(e){let re=/(\w+)@|at (\w+) \(/g,st=e.stack,m;re.exec(st),m=re.exec(st);if(!_lodash.default.isNull(m))callerName=m[1]||m[2]}if(_lodash.default.startsWith("asyncGeneratorStep",callerName))callerName="";return callerName});(0,_defineProperty2.default)(this,"getRandomValue",(min,max)=>{min=Math.ceil(min);max=Math.floor(max);return Math.floor(Math.random()*(max-min+1))+min});(0,_defineProperty2.default)(this,"insertToArray",(array,index,...items)=>{if(!Array.isArray(array)){throw new Error("First argument must be an array.")}const insertAt=Math.max(0,Math.min(index+1,array.length));array.splice(insertAt,0,...items)});(0,_defineProperty2.default)(this,"getStringOfYearADConvertToMinguoYear",(gregorianYear,full=false)=>{const minguoYear=gregorianYear-1911;if(minguoYear>0){return`${full?"\u6C11\u570B":""}${minguoYear}${full?"\u5E74":""}`}else{return`${full?"\u6C11\u570B":""}前${Math.abs(minguoYear)}${full?"\u5E74":""}`}});(0,_defineProperty2.default)(this,"convertDateToTimestamp",date=>{return(0,_momentTimezone.default)(date).valueOf()});(0,_defineProperty2.default)(this,"measureExecutionTime",async(fn,...param)=>{const startTime=Date.now();await fn(...param);const endTime=Date.now();const durationInMilliseconds=endTime-startTime;const duration=_momentTimezone.default.duration(durationInMilliseconds,"milliseconds");const hours=Math.floor(duration.asHours());const minutes=duration.minutes();const seconds=duration.seconds();const milliseconds=duration.milliseconds();const totalSeconds=(durationInMilliseconds/1000).toFixed(3);this.appendInfo(`${hours}小時 ${minutes}分 ${seconds}.${milliseconds.toString().padStart(3,"0")}秒 (合計 ${totalSeconds} 秒)`)});(0,_defineProperty2.default)(this,"formatPriceWithCurrency",(number,locale)=>{if(typeof number!=="number"||typeof locale!=="string"){throw new TypeError("Invalid input: number must be a number and locale must be a string.")}return new Intl.NumberFormat(locale,{style:"currency",currency:new Intl.Locale(locale).maximize().currency||"USD",minimumFractionDigits:0}).format(number)});(0,_defineProperty2.default)(this,"formatPrice",(number,locale)=>{if(typeof number!=="number"){throw new TypeError("Invalid input: number must be a number.")}if(!locale){return number.toLocaleString("en-US")}return new Intl.NumberFormat(locale,{style:"currency",currency:new Intl.Locale(locale).maximize().currency||"USD",minimumFractionDigits:0}).format(number)});(0,_defineProperty2.default)(this,"generateUniversalKeywords",(sentence,maxLength=50,maxNgramLength=4)=>{if(!sentence||typeof sentence!=="string"){return[]}if(typeof _lodash.default==="undefined"){console.error("Lodash is not available. Please ensure it is imported.");return[]}let textToProcess=sentence.trim();let keywords=[];maxNgramLength=Math.max(2,maxNgramLength);if(textToProcess.length>maxLength){console.warn(`警告:輸入字串長度為 ${textToProcess.length},已根據 maxLength: ${maxLength} 截斷。`);textToProcess=textToProcess.substring(0,maxLength)}const englishWords=textToProcess.match(/[a-zA-Z]+/g)||[];englishWords.forEach(word=>{if(word.length>=2){keywords.push(word.toUpperCase());keywords.push(word.toLowerCase());const capitalized=word.charAt(0).toUpperCase()+word.slice(1).toLowerCase();keywords.push(capitalized)}});const specKeywordsRegex=/\b[0-9]+[a-zA-Z]{1,4}\b|\b[0-9]{1,3}(w|ml|g|oz|k)\b|[\u4e00-\u9fa5a-zA-Z0-9]{1,4}(色|號)[\u4e00-\u9fa5a-zA-Z0-9]{0,2}/gi;const specKeywords=(textToProcess.match(specKeywordsRegex)||[]).filter(k=>k.length>=2).map(k=>k.toLowerCase());keywords.push(...specKeywords);let cleanText=textToProcess.toLowerCase();cleanText=cleanText.replace(/[0-9]+([\u4e00-\u9fa5a-z]{1,4}|[\/\-\~\\])/g," ").replace(/\b[a-z]{1,4}\b/g," ").replace(/\b[0-9]{1,3}\b/g," ");cleanText=cleanText.replace(/[!@#$%^&*()_+={}\[\]:;"'<>,.?\/\\|`~]/g," ").replace(/系列|一組|單色|多款|套組|全套|專用|迷你|頂級|高品質|超閃|奢華|最新|款式|新款|超亮|的|與|和|閃|美甲/g," ").replace(/\s+/g,"").trim();const minLength=2;for(let len=minLength;len<=maxNgramLength;len++){for(let i=0;i<=cleanText.length-len;i++){const keyword=cleanText.substring(i,i+len);keywords.push(keyword)}}const finalKeywords=_lodash.default.chain(keywords).filter(k=>k.length>=2).filter(k=>k.length>2||!/^[\u4e00-\u9fa5a-z0-9]$/.test(k)).uniq().sortBy().value();return finalKeywords});(0,_defineProperty2.default)(this,"mutateIndexOfArrayItem",(array,object,index=0)=>{if(!Array.isArray(array)||!_lodash.default.isObject(object))return array;const currentIndex=_lodash.default.findIndex(array,item=>_lodash.default.isEqual(item,object));if(currentIndex===-1)return array;array.splice(currentIndex,1);const targetIndex=_lodash.default.clamp(index,0,array.length);array.splice(targetIndex,0,object);return array});(0,_defineProperty2.default)(this,"getArrayOfModifyObject2Index",(array,object,index=0)=>{if(!Array.isArray(array)||!_lodash.default.isObject(object))return array;const cloned=_lodash.default.cloneDeep(array);const currentIndex=_lodash.default.findIndex(cloned,item=>_lodash.default.isEqual(item,object));if(currentIndex===-1)return array;cloned.splice(currentIndex,1);const targetIndex=_lodash.default.clamp(index,0,cloned.length);cloned.splice(targetIndex,0,object);return cloned});(0,_defineProperty2.default)(this,"generateLabelValuePairsWithOrigin",(origin=[{label:"aa",value:1203},{label:"cc",value:1204},{label:"gg",value:2}],latest=["aa","bb"])=>{const usedValues=new Set(origin.map(o=>o.value));return _lodash.default.chain(latest).uniq().map(label=>{const originItem=_lodash.default.find(origin,{label});if(originItem){return{label,value:originItem.value}}let value;do{value=_lodash.default.random(2,999999999)}while(usedValues.has(value));usedValues.add(value);return{label,value}}).value()});(0,_defineProperty2.default)(this,"getItemsOfMarkMatching",(sourceArray=[],values=[],valueKey="value",flagKey="belong")=>{const valuesSet=new Set(values);return _lodash.default.map(sourceArray,item=>({...item,[flagKey]:valuesSet.has(item[valueKey])}))});(0,_defineProperty2.default)(this,"generateVariants",(arrays,labelSeparator="\uFF5C",valueSeparator="-")=>{const nonEmptyArrays=arrays.filter(arr=>arr.length>0);if(nonEmptyArrays.length===0)return[];if(nonEmptyArrays.length===1){return nonEmptyArrays[0].map(item=>({label:item.label,value:item.value}))}const combinations=_lodash.default.reduce(nonEmptyArrays,(acc,curr)=>_lodash.default.flatMap(acc,a=>curr.map(b=>[...a,b])),[[]]);return combinations.map(comb=>({label:comb.map(item=>item.label).join(labelSeparator),value:comb.map(item=>item.value).join(valueSeparator)}))});(0,_defineProperty2.default)(this,"renameKeysInArray",(arr,...keyMappings)=>{const mapping=Object.fromEntries(keyMappings);return arr.map(item=>_lodash.default.mapKeys(item,(value,key)=>mapping[key]||key))});(0,_defineProperty2.default)(this,"getArrayOfMergeBySpecificId",(array1,array2,idKey="id")=>{if(!Array.isArray(array2))return array1;const map2=_lodash.default.keyBy(array2,item=>_lodash.default.get(item,idKey));return array1.map(item=>{const id=_lodash.default.get(item,idKey);const match=map2[id];return match?_lodash.default.merge({},item,match):item})});(0,_defineProperty2.default)(this,"toPercentageDecimal",num=>{if(_lodash.default.isNil(num))return 1;if(_lodash.default.isString(num)){num=num.replace(/%/g,"").trim()}const parsed=_lodash.default.toNumber(num);if(!_lodash.default.isFinite(parsed))return 1;return _lodash.default.round(parsed/100,10)});(0,_defineProperty2.default)(this,"getNumberOfMultiplyCeil",(a,b,precision=0)=>{const factor=Math.pow(10,precision);return Math.ceil(a*b*factor)/factor});(0,_defineProperty2.default)(this,"generateGoogleCalendarLink",({title,startDate,startTime,endDate,endTime,location,details})=>{const startDateTime=(0,_momentTimezone.default)(`${startDate} ${startTime}`,"YYYY/MM/DD HH:mm").format("YYYYMMDDTHHmmss");const endDateTime=(0,_momentTimezone.default)(`${endDate} ${endTime}`,"YYYY/MM/DD HH:mm").format("YYYYMMDDTHHmmss");const params=new URLSearchParams;if(title)params.append("text",title);if(startDateTime&&endDateTime)params.append("dates",`${startDateTime}/${endDateTime}`);if(details)params.append("details",details);if(location)params.append("location",location);params.append("ctz","Asia/Taipei");params.append("trp","true");return`https://calendar.google.com/calendar/r/eventedit?${params.toString()}`});(0,_defineProperty2.default)(this,"generateTimeTreeLink",({title,startDate,startTime,endDate,endTime,location,memo})=>{const params=new URLSearchParams;if(title)params.append("title",title);if(startDate)params.append("start_date",startDate.replace(/\//g,"-"));if(startTime)params.append("start_time",startTime);if(endDate)params.append("end_date",endDate.replace(/\//g,"-"));if(endTime)params.append("end_time",endTime);if(location)params.append("location",location);if(memo)params.append("memo",memo);return`https://timetreeapp.com/plans/new?${params.toString()}`});(0,_defineProperty2.default)(this,"generateIcsContent",({title,startDate,startTime,endDate,endTime,location,details})=>{const startDateTime=_momentTimezone.default.tz(`${startDate} ${startTime}`,"YYYY/MM/DD HH:mm","Asia/Taipei").format("YYYYMMDDTHHmmss");const endDateTime=_momentTimezone.default.tz(`${endDate} ${endTime}`,"YYYY/MM/DD HH:mm","Asia/Taipei").format("YYYYMMDDTHHmmss");const stamp=(0,_momentTimezone.default)().utc().format("YYYYMMDDTHHmmss")+"Z";const uid=Date.now().toString(36)+Math.random().toString(36).substring(2,5)+"@gemini-app.com";const escapeIcs=text=>text.replace(/\\/g,"\\\\").replace(/,/g,"\\,").replace(/;/g,"\\;").replace(/\n/g,"\\n");const lines=["BEGIN:VCALENDAR","VERSION:2.0","PRODID:-//Gemini AI//NONSGML v1.0//EN","BEGIN:VEVENT",`UID:${uid}`,`DTSTAMP:${stamp}`];if(startDateTime)lines.push(`DTSTART;TZID=Asia/Taipei:${startDateTime}`);if(endDateTime)lines.push(`DTEND;TZID=Asia/Taipei:${endDateTime}`);if(title)lines.push(`SUMMARY:${escapeIcs(title)}`);if(location)lines.push(`LOCATION:${escapeIcs(location)}`);if(details)lines.push(`DESCRIPTION:${escapeIcs(details)}`);lines.push("END:VEVENT","END:VCALENDAR");return lines.join("\r\n")});(0,_defineProperty2.default)(this,"generateAllCalendarLinks",event=>{const googleLink=this.generateGoogleCalendarLink(event);const timeTreeEvent={...event,memo:event.details};const timeTreeLink=this.generateTimeTreeLink(timeTreeEvent);const icsContent=this.generateIcsContent(event);const icsLink=`data:text/calendar;charset=utf8,${encodeURIComponent(icsContent)}`;return{google:googleLink,timeTree:timeTreeLink,ics:icsLink}});(0,_defineProperty2.default)(this,"getArrayOfMappingRef",(current,reference)=>{return _lodash.default.map(current,currentObj=>{const referenceObj=_lodash.default.find(reference,{value:currentObj.value});return referenceObj?_lodash.default.merge({},currentObj,referenceObj):currentObj})});(0,_defineProperty2.default)(this,"areAllValuesTheSameOnKeys",(array,...keys)=>{if(!array||array.length<=1||keys.length===0){return true}for(const keyName of keys){const firstValue=array[0]?.[keyName];const isCurrentKeySame=_lodash.default.every(array,item=>{return item[keyName]===firstValue});if(!isCurrentKeySame){return false}}return true});this.init();this.env="dev"}performActionWithoutTimingIssue(task=()=>true,wait=10){this.syncDelay(wait).then(()=>task())}executeTimeoutTask(functionOfAsyncTask,ms=1000,id=this.getRandomHash(),...params){const self=this;const idOfCurrentTimeoutTask=this.mapOfIdNTimeoutId[id];if(idOfCurrentTimeoutTask)clearTimeout(idOfCurrentTimeoutTask);const idOfTimeoutTask=setTimeout(async(...param)=>{await functionOfAsyncTask();delete self.mapOfIdNTimeoutId[id]},ms,...params);self.mapOfIdNTimeoutId[id]=idOfTimeoutTask}printLogMessage(message,error=false,...infos){if(!this.isProductionEnvironment()){if(error){this.appendError(message,...infos)}else{this.appendInfo(message,...infos)}}}init(){}setEnvironment(env){this.env=env}appendInfo(...logs){if(this.isProductionEnvironment())return;console.log(...logs)}appendError(...logs){if(this.isProductionEnvironment())return;console.error(...logs)}async syncDelay(delayInms=2000){return new Promise(resolve=>{setTimeout(()=>{resolve(delayInms)},delayInms)})}startWithRegex(string="",rule="."){let pattern=new RegExp(`^${rule}`,"i");return pattern.test(string)}accumulate(target,conditions){let beginning=target;for(const condition of conditions){if(condition!==undefined&&_lodash.default.isFunction(condition)){beginning=condition(beginning)}}return beginning}isOrEquals(target,...several){for(const each of several){if(_lodash.default.isEqual(target,each))return true}return false}isAndEquals(...predicates){for(const predicate of predicates){if(!predicate()){return false}}return true}getStringOfHeadMatch(string,regex,flag="g"){const result=string.match(new RegExp(regex,flag));return this.isUndefinedNullEmpty(result)?undefined:result[0]}or(...booleans){for(const boo of booleans){if(_lodash.default.isBoolean(boo)&&boo)return true}return false}and(...booleans){for(const boo of booleans){if(!!!boo)return false}return true}nth(array,index=-1){return _lodash.default.nth(array,index%_lodash.default.size(array))}getExistOne(...candidates){for(const candidate of candidates){if(candidate)return candidate}}getStringOfDropHeadSign(string,sign){return _lodash.default.dropWhile(Array.from(string),each=>_lodash.default.isEqual(each,sign)).join("")}isAndWith(self,predicate,...several){for(const each of several){if(!predicate(self,each))return false}return true}async syncDelayRandom(min=3000,max=5000){const random=this.getRandomValue(min,max);await this.syncDelay(random);return random}has(collection,item,precisely=false){if(_lodash.default.isArray(collection)){if(precisely)return _lodash.default.findIndex(collection,each=>_lodash.default.isEqual(item,each))>-1;else return _lodash.default.indexOf(collection,item)>-1}if(_lodash.default.isObject(item)){return collection[item]}if(_lodash.default.isString(collection)){return collection.indexOf(item)>-1}return false}containsBy(array,item){return _lodash.default.findIndex(array,each=>_lodash.default.isEqual(each,item))>=0}getStringOfInsideParentheses(string,rule=`.`){return this.getStringOfRule(string,rule,"(",")")}getStringOfInsideBrackets(string,rule=`.`){return this.getStringOfRule(string,rule,"[","]")}getStringOfInsideBraces(string,rule=`.`){return this.getStringOfRule(string,rule,"{","}")}getStringOfRule(string,rule=`.`,left="{",right="}"){return this.getStringOfHeadMatch(string,`(?<=\\${left})${rule}+?(?=\\${right})`)}getRandomHash(length=20){const randomBytes=_cryptoJs.default.lib.WordArray.random(length);const base64String=_cryptoJs.default.enc.Base64.stringify(randomBytes);return base64String.substring(0,length)}getRandomHashV2(length){const characters="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let result="";for(let i=0;i<length;i++){const randomIndex=Math.floor(Math.random()*characters.length);result+=characters.charAt(randomIndex)}return result}getEncryptString(texts,key=_configerer.configerer.ENCRYPT_KEY,alwaysTheSame=false){const maxLengthOfKey=22;if(key.length>maxLengthOfKey)throw new _exceptioner.default(8010,_lodash.default.size(key));const ivOfCrypto=_cryptoJs.default.enc.Base64.parse("thisIsIVWeNeedToGenerateTheSameValue");const keyOfCrypto=alwaysTheSame?_cryptoJs.default.enc.Base64.parse(`${key}${_lodash.default.range(0,maxLengthOfKey-key.length).join("")}`):key;return _cryptoJs.default.AES.encrypt(texts,keyOfCrypto,{iv:ivOfCrypto}).toString()}getEncryptStringV2(texts,key=_configerer.configerer.ENCRYPT_KEY,alwaysTheSame=false){const maxLengthOfKey=22;if(key.length>maxLengthOfKey)throw new _exceptioner.default(8010,_lodash.default.size(key));const ivOfCrypto=_cryptoJs.default.enc.Base64.parse("thisIsIVWeNeedToGenerateTheSameValue");const keyOfCrypto=alwaysTheSame?_cryptoJs.default.enc.Base64.parse(`${key}${_lodash.default.range(0,maxLengthOfKey-key.length).join("")}`):key;return _cryptoJs.default.AES.encrypt(JSON.stringify({content:texts}),keyOfCrypto,{iv:ivOfCrypto}).toString()}getDecryptString(ciphertext,key=_configerer.configerer.ENCRYPT_KEY){const maxLengthOfKey=22;if(key.length>maxLengthOfKey)throw new _exceptioner.default(8010,_lodash.default.size(key));const ivOfCrypto=_cryptoJs.default.enc.Base64.parse("thisIsIVWeNeedToGenerateTheSameValue");try{const value=_cryptoJs.default.AES.decrypt(ciphertext,key,{iv:ivOfCrypto}).toString(_cryptoJs.default.enc.Utf8);if(!_lodash.default.isEmpty(value.trim()))return value}catch(e){}return _cryptoJs.default.AES.decrypt(ciphertext,_cryptoJs.default.enc.Base64.parse(`${key}${_lodash.default.range(0,maxLengthOfKey-key.length).join("")}`),{iv:ivOfCrypto}).toString(_cryptoJs.default.enc.Utf8)}getDecryptStringV2(ciphertext,key=_configerer.configerer.ENCRYPT_KEY){const maxLengthOfKey=22;if(key.length>maxLengthOfKey)throw new _exceptioner.default(8010,_lodash.default.size(key));const ivOfCrypto=_cryptoJs.default.enc.Base64.parse("thisIsIVWeNeedToGenerateTheSameValue");try{const stringOfObj=_cryptoJs.default.AES.decrypt(ciphertext,key,{iv:ivOfCrypto}).toString(_cryptoJs.default.enc.Utf8);if(!_lodash.default.isEmpty(stringOfObj.trim())){const obj=JSON.parse(stringOfObj);return obj.content}}catch(e){}const stringOfObj=_cryptoJs.default.AES.decrypt(ciphertext,_cryptoJs.default.enc.Base64.parse(`${key}${_lodash.default.range(0,maxLengthOfKey-key.length).join("")}`),{iv:ivOfCrypto}).toString(_cryptoJs.default.enc.Utf8);const obj=JSON.parse(stringOfObj);return obj.content}getFirebaseFormattedString(texts){return _lodash.default.replace(texts,/[\.\#\$\[\]]/g,"-").trim()}formalizeNamesToArray(singerString){let normalize=singerString;normalize=normalize.split(_configerer.configerer.SEPARATE_TONE_SINGER)[0].trim();normalize=_lodash.default.replace(normalize,/[,\/#!$%\^&\*;:{}=_`、~()()]/g,"_").trim();normalize=this.getFirebaseFormattedString(normalize);normalize=_lodash.default.replace(normalize,/\_\_+/g,"_").trim();while(_lodash.default.endsWith(normalize,"_")){normalize=normalize.slice(0,-1).trim()}const words=normalize.split("_");return _lodash.default.map(words,word=>_lodash.default.trim(word))}getShuffledArrayWithLimitCountHighPerformance(arr,n){let result=new Array(n),len=arr.length,taken=new Array(len);if(n>len)n=len;while(n--){let x=Math.floor(Math.random()*len);result[n]=arr[x in taken?taken[x]:x];taken[x]=--len in taken?taken[len]:len}return result}getFileNameFromPath(path,extension=false){const segments=path.split("/");const target=segments.pop();return extension?target:target.split(".").shift()}getFileNameExtensionFromPath(path){const name=path.split("/").pop();return name}getPathOfReplaceLastDir(path,name){const split=path.split("/");split.pop();split.push(name);return split.join("/")}getExtensionFromPath(path){const name=path.split("/").pop();const segments=name.split(".");return _lodash.default.size(segments)>1?segments.pop():""}getFolderPathOfSpecificPath(path){const split=path.split("/");split.pop();return split.join("/")}getFolderNameOfFilePath(path){if(this.isValidFilePath(path)){const splits=path.split("/");return _lodash.default.nth(splits,-2)}else{throw new _exceptioner.default(9999,`64255615 path is not valid '${path}'`)}}isUnderTargetPath(absolute,target){const segments=absolute.split("/");return this.has(segments,target)}getFileDirPath(path,slash=true){return _lodash.default.join(_lodash.default.initial(_lodash.default.split(path,"/")),"/")+(slash?"/":"")}isPathEqualsFileType(path,type){const extension=path.split(".").pop();return _lodash.default.isEqual(extension,type)}isValidFilePath(path){const extension=this.getExtensionFromPath(path);return _lodash.default.size(extension)>0}getArrayOfSize(array,n=1){return _lodash.default.take(array,n)}getShuffledArrayWithLimitCount(arr,n){return this.getShuffledArrayWithLimitCountHighPerformance(arr,n)}getRandomItemOfArray(array,...ignores){if(!_lodash.default.isArray(array))throw new _exceptioner.default(9999,`why are you so stupid, typeof array should be array, not ==> ${array} `);const filter=_lodash.default.without(array,...ignores);const target=_lodash.default.size(filter)>0?filter:array;const item=this.getShuffledArrayWithLimitCount(target,1);return item.length>0?item[0]:undefined}appendMapOfKeyArray(object,key,...value){if(this.isUndefinedNullEmpty(object[key])){object[key]=[...value]}else{object[key].push(...value)}}getMergedArrayBy(major=[],sub=[],key){if(!key||major.length===0||sub.length===0){return[...major]}const subMap=new Map(sub.map(item=>[item[key],item]));return major.map(majorItem=>{const subItem=subMap.get(majorItem[key]);return{...(subItem||{}),...majorItem}})}getShuffledItemFromArray(arr){let shuffled=_lodash.default.shuffle(arr);return shuffled[0]}getShuffledArray(arr){let shuffled=_lodash.default.shuffle(arr);return shuffled}isJson(item){item=typeof item!=="string"?JSON.stringify(item):item;try{item=JSON.parse(item)}catch(e){return false}if(typeof item==="object"&&item!==null){return true}return false}getObjectValue(obj){if(_lodash.default.isObject(obj)){return Object.values(obj)[0]}return""}getObject(key,value){const object={};object[key]=value;return object}getStringOfCreditCardFormatted(string=0){const inputValue=string.replace(/\D/g,"");const result=inputValue.replace(/(\d{4})(?=\d)/g,"$1-");return result.slice(0,19)}getObjectKey(obj){if(_lodash.default.isObject(obj)){return Object.keys(obj)[0]}return""}printf(){this.appendInfo("i can use in web || react.js")}isKeywordRule(constraint){if(_lodash.default.isUndefined(constraint)||_lodash.default.isEmpty(constraint))throw new Error("PARAMS CAN NOT BE EMPTY");if(!_lodash.default.isString(constraint))throw new Error("PARAMS SHOULD BE STRING");if(constraint.length>20)throw new Error("EXCEED 20 WORDS IS NOT ALLOWED")}getItsKeyByValue(object,value){return Object.keys(object).find(key=>object[key]===value)}startWiths(string,key=[]){for(const _key of key){if(_lodash.default.startsWith(string,_key)){return true}}return false}replaceAll(string,patten,to){return _lodash.default.replace(string,new RegExp(`${patten}`,`g`),to)}replaceAllWithSets(string="",...patterns){let after=string;for(const pattern of patterns){if(this.isOrEquals(undefined,pattern.from,pattern.to)){throw(0,_exceptioner.default)(9999,`from or to can't be empty`)}after=this.replaceAll(after,pattern.from,pattern.to)}return after}replaceArrayByContentIndex(array,current,latest){const index=_lodash.default.indexOf(array,current);array[index]=latest}deepFlat(collection,sign="_"){let result="";const stack=[[collection,""]];while(stack.length>0){const[current,prefix]=stack.pop();if(_lodash.default.isArray(current)){for(let i=current.length-1;i>=0;i--){stack.push([current[i],prefix])}}else if(_lodash.default.isObject(current)){const keys=Object.keys(current);for(let i=keys.length-1;i>=0;i--){const key=keys[i];stack.push([current[key],prefix+key+sign])}}else{const valueString=_lodash.default.trim(String(current));if(valueString.length>0){result+=(result.length>0?sign:"")+prefix+valueString}else if(prefix.length>0&&result.length>0){result+=sign}else if(prefix.length>0&&result.length===0){result+=prefix.endsWith(sign)?prefix.slice(0,-sign.length):prefix}}}if(result.endsWith(sign)){result=result.slice(0,-sign.length)}return result}joinEscapeChar(str){return(str+"").replace(/[\\"']/g,"\\$&").replace(/\u0000/g,"\\0")}getValueWithIntegerType(whatever){try{const value=parseInt(whatever);return isNaN(value)?0:value}catch(error){return 0}}getValueOfPriority(...compares){for(const compare of compares){if(!this.isUndefinedNullEmpty(compare))return compare}return undefined}async asyncPool(poolLimit,array,iteratorFn){const ret=[];const executing=[];for(const item of array){const p=Promise.resolve().then(()=>{return iteratorFn(item,array)});ret.push(p);if(poolLimit<=array.length){const e=p.then(()=>{return executing.splice(executing.indexOf(e),1)});executing.push(e);if(executing.length>=poolLimit){await Promise.race(executing)}}}return Promise.all(ret)}getAttrValueInSequence(info,...attrs){for(const attr of attrs){if(!_lodash.default.isEmpty(info[attr])){return info[attr]}}return info}toDBC(txtstring){var tmp="";for(var i=0;i<txtstring.length;i++){if(txtstring.charCodeAt(i)===32){tmp=tmp+String.fromCharCode(12288)}if(txtstring.charCodeAt(i)<127){tmp=tmp+String.fromCharCode(txtstring.charCodeAt(i)+65248)}}return tmp}toCDB(str){var tmp="";for(var i=0;i<str.length;i++){if(str.charCodeAt(i)===12288){tmp+=String.fromCharCode(str.charCodeAt(i)-12256);continue}if(str.charCodeAt(i)>65280&&str.charCodeAt(i)<65375){tmp+=String.fromCharCode(str.charCodeAt(i)-65248)}else{tmp+=String.fromCharCode(str.charCodeAt(i))}}return tmp}findIndexes(array,predicate){const indexes=[];let hasIndex=true;let indexOfLatest=0;while(hasIndex){indexOfLatest=_lodash.default.findIndex(array,predicate,indexOfLatest+1);if(indexOfLatest>-1){indexes.push(indexOfLatest)}else{hasIndex=false}}return indexes}getSliceArrayOfSpecificIndexes(array,...indexes){const items=[];const size=_lodash.default.size(array);for(const index of indexes){if(!_lodash.default.isNumber(index))throw new _exceptioner.default(9999,`59941278 index should be number => ${index}, ${array}`);if(index>size-1)throw new _exceptioner.default(9999,`5994123 index=>${index} is not valid, exceed than array size=${size}, ${array}`);items.push(_lodash.default.nth(array,index))}return items}indexesOf(arr,val){const indexes=[];let i=-1;while((i=arr.indexOf(val,i+1))!==-1){indexes.push(i)}return indexes}getIndexOfContext(context,stmt){return _lodash.default.findIndex(context,per=>{return _lodash.default.isEqual(per.trim(),stmt)})}toOneLineString(string){return _lodash.default.join(_lodash.default.split(string,"\n"),"")}toSpaceLessString(string){return _lodash.default.split(string,"").map(each=>_lodash.default.trim(each)).join("")}toNewLineLessString(string){return _lodash.default.split(string,"\n").map(each=>_lodash.default.trim(each)).join("")}exist(obj){return!_lodash.default.isNull(obj)&&!_lodash.default.isUndefined(obj)}isUndefinedNullEmpty(obj){const first=obj===undefined||obj===null;const second=_lodash.default.isString(obj)||_lodash.default.isArray(obj)||_lodash.default.isObject(obj)?_lodash.default.isEmpty(obj):false;return first||second}isAndConditionOfUndefinedNullEmpty(...objs){for(const obj of objs){if(!this.isUndefinedNullEmpty(obj))return false}return true}isOrConditionOfUndefinedNullEmpty(...objs){for(const obj of objs){if(this.isUndefinedNullEmpty(obj))return true}return false}getStringHandledByEachLine(string,predict=(segment,index,segments)=>true,separator="\n"){const segments=string.split(separator);for(const segment of segments){predict(segment,_lodash.default.indexOf(segments,segment),segments)}return segments.join(separator)}getSegmentsOfEachLine(string){return string.split("\n")}getNormalizedStringEndWith(string,predicate){string=this.toCDB(string);predicate=this.toCDB(predicate);const after=_lodash.default.join(_lodash.default.dropRightWhile(string,each=>!_lodash.default.isEqual(each,predicate)),"");return _lodash.default.isEmpty(after)?string:after}getNormalizedStringNotStartWith(string,...predicate){string=this.toCDB(string);const after=_lodash.default.join(_lodash.default.dropWhile(string,each=>this.has(predicate,each)),"");return _lodash.default.isEmpty(after)?string:after}getNormalizedStringNotEndWith(string,...predicate){string=this.toCDB(string);const after=_lodash.default.join(_lodash.default.dropRightWhile(string,each=>this.has(predicate,each)),"");return _lodash.default.isEmpty(after)?string:after}getTodayTimeFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY-MM-DD")}getCustomFormatOfDatePresent(ts,format="YY/MM"){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format(format)}getSimpleDateYYMMDDFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YY/MM/DD")}getSimpleTimeYYMMDDHHmmFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YY/MM/DD HH:mm")}getECPayCurrentTimeFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY/MM/DD HH:mm:ss")}getCurrentTimeFormatV2(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY/MM/DD HH:mm:ss")}getCurrentTimeFormatYMDHM(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY/MM/DD HH:mm")}getCurrentTimeFormatYMDHMS(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY/MM/DD HH:mm:ss")}getCurrentTimeFormat(ts){return(0,_momentTimezone.default)(ts?ts:this.getCurrentTimeStamp()).format("YYYY-MM-DD-HH-mm-ss")}getCurrentMillionSecTimeFormat(ts){return(0,_momentTimezone.default)(ts?ts:undefined).format("YYYY-MM-DD-HH-mm-ss-SSS")}isBetweenTimeStamp(target=this.getCurrentTimeStamp(),min,max){return(0,_momentTimezone.default)(target).isBetween(min,max)}isBeforeTimeStamp(target=this.getCurrentTimeStamp(),time){return(0,_momentTimezone.default)(target).isBefore(time)}isAfterTimeStamp(target=this.getCurrentTimeStamp(),time){return(0,_momentTimezone.default)(target).isAfter(time)}formatTimeByLocale(ts,location="zh-TW",timezone="Asia/Taipei",use24Hour=true){_momentTimezone.default.locale(location);const m=(0,_momentTimezone.default)(ts).tz(timezone);const formatStr=use24Hour?"YYYY/MM/DD HH:mm":"YYYY/MM/DD hh:mm A";return m.format(formatStr)}getTimeStampWithConditions(param={days:0,months:0,years:0,minutes:0,seconds:0,hours:0},target=this.getCurrentTimeStamp()){let base=(0,_momentTimezone.default)(target);for(const each in param){const number=param[each];const unit=each;if(number>0){base=base.add(number,unit)}if(number<0){base=base.subtract(Math.abs(number),unit)}}return base.valueOf()}getTimeStampByStringFormat(string){return this.getTimeStampFromSpecificFormat(string,"YYYY/MM/DD HH:mm:ss").valueOf()}getTimeStampFromSpecificFormat(string,format="YYYY/MM/DD HH:mm:ss"){return(0,_momentTimezone.default)(string,format).valueOf()}getTimeStampFromECPayStringFormat(string){return this.getTimeStampFromSpecificFormat(string,"YYYY/MM/DD HH:mm:ss").valueOf()}getTimeFormatOfDurationToMillionSecond(duration){return _momentTimezone.default.utc(duration).format("HH\u5C0F\u6642mm\u5206\u9418ss\u79D2SSS")}getTimeFormatOfDurationToSecond(duration){return _momentTimezone.default.utc(duration).format("HH\u5C0F\u6642mm\u5206\u9418ss\u79D2")}getTimeFormatOfDurationToDay(duration){return _momentTimezone.default.utc(duration).format("DD\u5929HH\u5C0F\u6642mm\u5206\u9418ss\u79D2")}getChineseTimeFormat(ts){_momentTimezone.default.locale("zh-TW");return(0,_momentTimezone.default)(ts).format("LLLL")}getMinuteFormatOfDuration(ds){return _momentTimezone.default.duration(ds).asMinutes()}getSecondFormatOfDuration(ds){return _momentTimezone.default.duration(ds).asSeconds()}getDayFormatOfDuration(ds){return _momentTimezone.default.duration(ds).asDays()}getDurationOfMillionSec(dateOrTimeStamp){const currentTimestamp=this.getCurrentTimeStamp();const targetTimeStamp=(0,_momentTimezone.default)(dateOrTimeStamp).valueOf();const queue=_lodash.default.sortBy([{ts:currentTimestamp},{ts:targetTimeStamp}],each=>each.ts).map(each=>each.ts);let after=(0,_momentTimezone.default)(queue.pop());let before=(0,_momentTimezone.default)(queue.shift());let duration=_momentTimezone.default.duration(after.diff(before));let ms=duration.asMilliseconds();return ms}getCurrentTimeStamp(){return(0,_momentTimezone.default)().valueOf()}isStringContainInLines(context,key){for(let each of _lodash.default.split(context,"\n")){if(this.has(each,key))return true}return false}camel(...words){return _lodash.default.camelCase(words.join("_"))}upperCamel(...words){return _lodash.default.upperFirst(this.camel(...words))}array2Obj(array){const obj={};for(const each of array){obj[`${this.getObjectKey(each)}`]=this.getObjectValue(each)}return obj}arrayToObjWith(array,predicate){const obj={};for(const item of array){const key=predicate(item);const content=obj[key];if(content&&_lodash.default.isArray(content)){content.push(item)}else{obj[key]=[item]}}return obj}isEmptyString(string){return _lodash.default.isEqual(_lodash.default.trim(string),"")}mergeObject(...obj){return _lodash.default.merge(...obj)}syncSetTimeout(func,ms,callback=()=>{}){(function sync(done){if(!done){setTimeout(function(){func();sync(true)},ms);return}callback()})()}mergeArrayBy(identifier="id",...array){return Object.values(array.flat().reduce((acc,item)=>{if(item[identifier])acc[item[identifier]]={...(acc[item[identifier]]||{}),...item};return acc},{}))}getRelativePath(pathName,rootName){return _lodash.default.dropWhile(pathName,(each,index)=>{return _lodash.default.isEqual(each,rootName[index])}).join("")}dropItemsByIndex(array,from,end){_lodash.default.remove(array,(value,index,array)=>end>=index&&index>=from)}isEven(n){return n%2===0}isOdd(n){return Math.abs(n%2)===1}enrichZhTw(){_momentTimezone.default.locale("zh-tw",{months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u5468\u65E5_\u5468\u4E00_\u5468\u4E8C_\u5468\u4E09_\u5468\u56DB_\u5468\u4E94_\u5468\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),longDateFormat:{LT:"Ah\u9EDEmm\u5206",LTS:"Ah\u9EDEm\u5206s\u79D2",L:"YYYY-MM-DD",LL:"YYYY\u5E74MMMD\u65E5",LLL:"YYYY\u5E74MMMD\u65E5Ah\u9EDEmm\u5206",LLLL:"YYYY\u5E74MMMD\u65E5ddddAh\u9EDEmm\u5206",l:"YYYY-MM-DD",ll:"YYYY\u5E74MMMD\u65E5",lll:"YYYY\u5E74MMMD\u65E5Ah\u9EDEmm\u5206",llll:"YYYY\u5E74MMMD\u65E5ddddAh\u9EDEmm\u5206"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(h,meridiem){let hour=h;if(hour===12){hour=0}if(meridiem==="\u51CC\u6668"||meridiem==="\u65E9\u4E0A"||meridiem==="\u4E0A\u5348"){return hour}else if(meridiem==="\u4E0B\u5348"||meridiem==="\u665A\u4E0A"){return hour+12}else{return hour>=11?hour:hour+12}},meridiem:function(hour,minute,isLower){const hm=hour*100+minute;if(hm<600){return"\u51CC\u6668"}else if(hm<900){return"\u65E9\u4E0A"}else if(hm<1130){return"\u4E0A\u5348"}else if(hm<1230){return"\u4E2D\u5348"}else if(hm<1800){return"\u4E0B\u5348"}else{return"\u665A\u4E0A"}},calendar:{sameDay:function(){return this.minutes()===0?"[\u4ECA\u5929]Ah[\u9EDE\u6574]":"[\u4ECA\u5929]LT"},nextDay:function(){return this.minutes()===0?"[\u660E\u5929]Ah[\u9EDE\u6574]":"[\u660E\u5929]LT"},lastDay:function(){return this.minutes()===0?"[\u6628\u5929]Ah[\u9EDE\u6574]":"[\u6628\u5929]LT"},nextWeek:function(){let startOfWeek,prefix;startOfWeek=(0,_momentTimezone.default)().startOf("week");prefix=this.diff(startOfWeek,"days")>=7?"[\u4E0B]":"[\u672C]";return this.minutes()===0?prefix+"dddA\u9EDE\u6574":prefix+"dddAh\u9EDEmm"},lastWeek:function(){let startOfWeek,prefix;startOfWeek=(0,_momentTimezone.default)().startOf("week");prefix=this.unix()<startOfWeek.unix()?"[\u4E0A]":"[\u672C]";return this.minutes()===0?prefix+"dddAh\u9EDE\u6574":prefix+"dddAh\u9EDEmm"},sameElse:"LL"},ordinalParse:/\d{1,2}(日|月|周)/,ordinal:function(number,period){switch(period){case"d":case"D":case"DDD":return number+"\u65E5";case"M":return number+"\u6708";case"w":case"W":return number+"\u5468";default:return number}},relativeTime:{future:"%s\u5185",past:"%s\u524D",s:"\u5E7E\u79D2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5C0F\u6642",hh:"%d \u5C0F\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500B\u6708",MM:"%d \u4E2A\u6708",y:"1 \u5E74",yy:"%d \u5E74"},week:{dow:1,doy:4}})}getVisibleOrHidden(judgement){return{visibility:judgement?"visible":"hidden"}}getNumberOfPercentageToFloat(percentage){let cleanedPercentage=percentage.replace("%","");let floatNumber=parseFloat(cleanedPercentage)/100;return floatNumber}getVisibleOrNone(judgement,flex=false){return{display:judgement?flex?"flex":"inherit":"none"}}stringToInteger(string){string=_lodash.default.toUpper(string);switch(string){case"A":return 0;case"B":return 1;case"C":return 2;case"D":return 3;case"E":return 4;case"F":return 5;case"G":return 6;case"H":return 7;case"I":return 8;case"J":return 9;case"K":return 10;case"L":return 11;case"M":return 12;case"N":return 13;default:return 101}}integerToString(integer){switch(integer){case 0:return"A";case 1:return"B";case 2:return"C";case 3:return"D";case 4:return"E";case 5:return"F";case 6:return"G";case 7:return"H";case 8:return"I";case 9:return"J";case 10:return"K";case 11:return"L";case 12:return"M";case 13:return"N";default:return"Z"}}toObjectMap(array,...rules){const newbies=[];for(const each of array){const object={};for(const rule of rules){const func=rule.func?rule.func:stmt=>stmt;object[rule.to]=this.isUndefinedNullEmpty(rule.from)||!_lodash.default.isObject(each)?func(each):func(each[rule.from])}newbies.push(object)}return newbies}exeAll(collection,...funcs){if(_lodash.default.isArray(collection)){for(const each of collection){for(const func of funcs){func(each)}}}else if(_lodash.default.isObject(collection)){for(const each in collection){for(const func of funcs){collection[each]=func(collection[each])}}}else{throw new _exceptioner.default(9999,`7841212 type can't be array or object`)}return collection}getObjectWhile(major,minor,predicate=target=>true){const collection={};for(const key in major){if(predicate(major,minor,key)){collection[key]=major[key]}}return collection}getIntersectionObject(objOfMajor,objOfMinor){return this.getObjectWhile(objOfMajor,objOfMinor,(major,minor,key)=>minor[key]!==undefined)}getDifferenceObject(objOfMajor,objOfMinor){return this.getObjectWhile(objOfMajor,objOfMinor,(major,minor,key)=>minor[key]===undefined)}isObjectContainAndEqual(targetObject,mainObject){let equal=true;for(const key in targetObject){if(mainObject[key]===undefined||mainObject[key]!==targetObject[key]){equal=false;break}}return equal}getStringOfPop(string,separator){if(!_lodash.default.isString(string)){throw new _exceptioner.default(9999,`445115,type should be string but ==> ${typeof string}`)}const segments=string.split(separator);segments.pop();return segments.join(separator)}getStringOfShift(string,separator){if(!_lodash.default.isString(string)){throw new _exceptioner.default(9999,`445116,type should be string but ==> ${typeof string}`)}const segments=string.split(separator);segments.shift();return segments.join(separator)}toObjectWithAttributeKey(array,attrKeyOfPK){const object={};for(const each of array){const pk=each[attrKeyOfPK];if(this.isUndefinedNullEmpty(pk)){throw new _exceptioner.default(9999,`48157232 pk can't be empty => '${pk}'`)}object[pk]=each}return object}getObjectOfArraySpecifyAttr(array,attr){return this.toObjectWithAttributeKey(array,attr)}getStateOfStringContainsSign(string,...signs){for(const sign of signs){if(this.has(string,sign)){return{exists:true,sign}}}return{exists:false}}constraintOfParam(collection,type,...others){let result=false;const validOfOthersCondition=_lodash.default.isEmpty(others)?true:this.and(...others.map(each=>each.logic));switch(type){case"array":if(_lodash.default.isArray(collection)&&validOfOthersCondition)result=true;break;case"object":if(_lodash.default.isObject(collection)&&validOfOthersCondition)result=true;break;case"string":if(_lodash.default.isString(collection)&&validOfOthersCondition)result=true;break;case"number":if(_lodash.default.isNumber(collection)&&validOfOthersCondition)result=true;break;case"other":if(validOfOthersCondition)return true}const stringOfRules=_lodash.default.isEmpty(others)?"":`, ${others.map(each=>each.message).join(" | ")}`;if(result===false){throw new _exceptioner.default(9999,`7474423 type should be ${type} but get '${typeof type}' ${stringOfRules} `)}}getSliceArrayWithMutate(array,n){const slice=_lodash.default.remove(array,(each,index)=>index<n);return slice}getArrayOfInteraction(one,two){return one.filter(element=>!two.includes(element))}getArrayOfMoveToSpecificIndex(array,from,to){if(!Array.isArray(array)){throw new Error("First argument must be an array.")}const length=array.length;if(from<0||from>=length||to<0||to>=length){console.warn("Invalid 'from' or 'to' index for getArrayOfMoveToSpecificIndexOptimized.");return[...array]}if(from===to){return[...array]}const copy=[...array];const[item]=copy.splice(from,1);copy.splice(to,0,item);return copy}getArrayOfMoveItemToSpecificIndex(array,item,indexOfDestination){const indexOfItem=_lodash.default.indexOf(array,item);return this.getArrayOfMoveToSpecificIndex(array,indexOfItem,indexOfDestination)}getArrayOfMoveSpecificItemToAside(array,item,toTail=true){const indexOfItem=_lodash.default.indexOf(array,item);return this.getArrayOfMoveSpecificIndexToAside(array,indexOfItem,toTail)}getArrayOfMoveSpecificIndexToAside(array,index,toTail=true){const indexOfLast=_lodash.default.size(array)-1;return this.getArrayOfMoveToSpecificIndex(array,index,toTail?indexOfLast:0)}getECPayCheckMacValue(data,hashKey="5294y06JbISpM5x9",hashIV="v77hoKGq4kWxNNIS"){const clone=_lodash.default.cloneDeep(data);delete clone.CheckMacValue;const keys=Object.keys(clone).sort((l,r)=>l>r?1:-1);let checkValue="";for(const key of keys){checkValue+=`${key}=${clone[key]}&`}checkValue=`HashKey=${hashKey}&${checkValue}HashIV=${hashIV}`;checkValue=encodeURIComponent(checkValue).toLowerCase();checkValue=checkValue.replace(/%20/g,"+").replace(/%2d/g,"-").replace(/%5f/g,"_").replace(/%2e/g,".").replace(/%21/g,"!").replace(/%2a/g,"*").replace(/%28/g,"(").replace(/%29/g,")").replace(/%20/g,"+");return _lodash.default.toUpper(_cryptoJs.default.SHA256(checkValue).toString(_cryptoJs.default.enc.Hex))}getStringOfHandledHtml(htmlString,predicate=document=>{console.log(document)}){const document=(0,_nodeHtmlParser.parse)(htmlString);predicate(document);return document.toString()}getSpecifyObjectBy(array,predicate){for(const item of array){if(predicate(item))return item}}validatePayloadObjectValid(content,rules=[],idOfError=this.getRandomHash(10)){if(this.isUndefinedNullEmpty(content)){throw new _exceptioner.default(9999,`${idOfError} content(pay-load) is undefined || empty`)}for(const rule of rules){if(_lodash.default.isString(rule)){if(this.isUndefinedNullEmpty(content[rule])){throw new _exceptioner.default(9999,`${idOfError} ATTRIBUTE:'${rule}' is not Exist`)}}else if(_lodash.default.isObject(rule)){const key=this.getObjectKey(rule);const predicate=this.getObjectValue(rule);if(!predicate(content[key])){throw new _exceptioner.default(9999,`${idOfError} ATTRIBUTE:'${key}' is not valid of custom rule`)}}}return true}getArrayOfSummarizeBy(array,keyOfId,keyOfSum){const obj={};for(const item of array){const key=item[keyOfId];if(obj[key]!==undefined){obj[key]=obj[key]+item[keyOfSum]}else{obj[key]=item[keyOfSum]}}const items=[];for(const key in obj){const _obj={};_obj[keyOfId]=key;_obj[keyOfSum]=obj[key];items.push(_obj)}return items}getHeadStringSplitBy(string,sign=this.getSeparatorOfUnique()){return _lodash.default.split(string,sign).shift()}getTailStringSplitBy(string,sign=this.getSeparatorOfUnique()){return _lodash.default.split(string,sign).pop()}getSlicesByIndexes(array=[],indexes=[]){const slices=[];_lodash.default.each(indexes,(each,index,arrayOfIndexes)=>{if(_lodash.default.isEqual(index,indexes.length-1))return false;const slice=_lodash.default.slice(array,each,indexes[index+1]);slices.push(slice)});return slices}findIndexes(array,predicate){const indexes=[];let hasIndex=true;let indexOfLatest=0;while(hasIndex){indexOfLatest=_lodash.default.findIndex(array,predicate,indexOfLatest+1);if(indexOfLatest>-1){indexes.push(indexOfLatest)}else{hasIndex=false}}return indexes}isOverSpecificAge(birthDate,target=18){const age=(0,_momentTimezone.default)().diff((0,_momentTimezone.default)(birthDate,"YYYY-MM-DD"),"years");return age>=target}isValidEmail(email){const emailRegex=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return emailRegex.test(email)}isValidTaiwaneseID(idNumber){const idRegex=/^[A-Z][1-2]\d{8}$/;if(!idRegex.test(idNumber)){return false}const weight=[1,9,8,7,6,5,4,3,2,1];const firstChar=idNumber.charCodeAt(0)-65;let sum=firstChar*10+parseInt(idNumber.slice(1));for(let i=0;i<weight.length;i++){sum+=parseInt(idNumber.charAt(i+1))*weight[i]}return sum%10===0}validatePersonalInfoInput(name,email,idNumber,phoneNumber,birthday,ageOfQualify=12){if(name.length<2){return{valid:false,message:"\u59D3\u540D\u81F3\u5C11\u8981\u5169\u500B\u5B57"}}const emailRegex=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;if(!emailRegex.test(email)){return{valid:false,message:"\u96FB\u5B50\u90F5\u4EF6\u683C\u5F0F\u4E0D\u6B63\u78BA"}}const idRegex=/^[A-Z][1-2]\d{8}$/;if(!idRegex.test(idNumber)){return{valid:false,message:"\u8EAB\u5206\u8B49\u865F\u78BC\u683C\u5F0F\u4E0D\u6B63\u78BA"}}const phoneRegex=/^09\d{8}$/;if(!phoneRegex.test(phoneNumber)){return{valid:false,message:"\u624B\u6A5F\u865F\u78BC\u683C\u5F0F\u4E0D\u6B63\u78BA"}}if(this.isUndefinedNullEmpty(birthday))return{valid:false,message:`出生日期格式不正確`};const now=(0,_momentTimezone.default)();const age=now.diff(birthday,"years");if(age<ageOfQualify){return{valid:false,message:`年齡不得小於 ${ageOfQualify} 歲`}}return{valid:true,message:"\u683C\u5F0F\u6AA2\u67E5\u901A\u904E"}}getStringOfFormatTimestampRange(startTimestamp,endTimestamp){const startDate=(0,_momentTimezone.default)(startTimestamp);const endDate=(0,_momentTimezone.default)(endTimestamp);const formatDate=date=>date.format("YY/MM/DD");const startYear=startDate.year();const endYear=endDate.year();if(startYear===endYear){return`${formatDate(startDate)} - ${endDate.format("MM/DD")}`}else{return`${formatDate(startDate)} - ${formatDate(endDate)}`}}getStringOfCalculateClassTime(startTimestamp,endTimestamp,weeklyMinutes){const startDate=(0,_momentTimezone.default)(startTimestamp);const endDate=(0,_momentTimezone.default)(endTimestamp);const totalDays=endDate.diff(startDate,"days")+1;const totalWeeks=Math.ceil(totalDays/7);const totalMinutes=totalWeeks*weeklyMinutes;const hours=Math.floor(totalMinutes/60);const minutes=totalMinutes%60;if(minutes===0){return`${hours}小時`}else{return`${hours}小時${minutes}分鐘`}}getNumberOfPeriodMinute(startTimestamp,endTimestamp){const startTime=(0,_momentTimezone.default)(startTimestamp).format("HH:mm");const endTime=(0,_momentTimezone.default)(endTimestamp).format("HH:mm");const startDate=(0,_momentTimezone.default)(startTime,"HH:mm");const endDate=(0,_momentTimezone.default)(endTime,"HH:mm");const durationInMinutes=_momentTimezone.default.duration(endDate.diff(startDate)).asMinutes();return durationInMinutes}getStringOfWeekTime(day,startTimestamp,endTimestamp){const daysOfWeek={1:"\u9031\u4E00",2:"\u9031\u4E8C",3:"\u9031\u4E09",4:"\u9031\u56DB",5:"\u9031\u4E94",6:"\u9031\u516D",7:"\u9031\u65E5"};if(day<1||day>7){throw new Error("day \u5FC5\u9808\u5728 1 \u5230 7 \u4E4B\u9593")}const startTime=(0,_momentTimezone.default)(startTimestamp).format("HH:mm");const endTime=(0,_momentTimezone.default)(endTimestamp).format("HH:mm");return`${daysOfWeek[day]} ${startTime}-${endTime}`}extractNumber(str){if(this.isUndefinedNullEmpty(str))return-1;const match=str.match(/\d+/);return match?Number(match[0]):-1}async fetchElementAttribute(dom,attr="innerText",defaultValue=""){return await dom.evaluate(el=>el[attr])}async fetchElementAttributes(dom,stringOfTrait,defaultValue="",...attributes){const element=await dom.$(stringOfTrait);if(!this.isUndefinedNullEmpty(element)){try{return await element.evaluate((el,attributes)=>{if(attributes.length===1)return el[attributes.shift()];return{...attributes.map(attr=>el[attr])}},attributes)}catch(error){this.appendError(`1581532 ${stringOfTrait} fetch ${JSON.stringify(attributes)} fail, element is not found`);return defaultValue}}return defaultValue}async writeElementAttributes(dom,stringOfTrait,...attributes){const element=await dom.$(stringOfTrait);if(!this.isUndefinedNullEmpty(element)){await element.evaluate((element,attributes)=>{attributes.map(attr=>{const entries=Object.entries(attr);const key=entries[0][0];const value=entries[0][1];element[key]=value})},attributes)}else this.appendError(`1231232 ${stringOfTrait} fetch ${JSON.stringify(attributes)} fail, element is not found`)}getSliceArrayOfUnique(array){if(!Array.isArray(array)||array.length===0){return[]}const firstElement=array[0];if(_lodash.default.isObject(firstElement)&&key){const uniqueMap=new Map(array.map(item=>[item[key],item]));return Array.from(uniqueMap.values())}else if(_lodash.default.isObject(firstElement)){console.warn("getSliceArrayOfUniqueOptimized: No key provided for object array, using potentially slow deep comparison.");return _lodash.default.uniqWith(array,_lodash.default.isEqual)}else{return Array.from(new Set(array))}}getUniqueValuesBy(array,key="valueOfType"){return _lodash.default.uniq(array.map(item=>item[key]))}generateCombinations(...attributes){const keys=attributes.map(attr=>attr.key);const labelMap=_lodash.default.keyBy(attributes,"key");const optionArrays=attributes.map(attr=>attr.options.map(option=>({key:attr.key,value:option.value,label:option.label})));const cartesianProduct=_lodash.default.reduce(optionArrays,(acc,curr)=>_lodash.default.flatMap(acc,a=>curr.map(b=>[...a,b])),[[]]);const results=cartesianProduct.map(combination=>{const trait={};const idParts=[];const contentParts=[];for(const{key,value,label}of combination){trait[key]=value;idParts.push(`${key}_${value}`);contentParts.push(`${label}`)}return{trait,id:idParts.join("_"),content:contentParts.join("\uFF5C")}});return _lodash.default.sortBy(results,item=>keys.map(key=>item.trait[key]))}extractStaticSegments(path,rules=[":"]){return path.trim().replace(/^\.?\/*|\/*$/g,"").split("/").filter(segment=>segment&&!rules.some(rule=>segment.startsWith(rule)))}mutateRemoveKeys(array,keysToRemove){_lodash.default.forEach(array,(obj,index)=>{const filtered=Object.fromEntries(Object.entries(obj).filter(([key])=>!keysToRemove.includes(key)));Object.keys(obj).forEach(k=>delete obj[k]);Object.assign(obj,filtered)})}removeKeysFromArrayObjects(array,keysToRemove){return _lodash.default.map(array,obj=>Object.fromEntries(Object.entries(obj).filter(([key])=>!keysToRemove.includes(key))))}formatTextWithEllipsis(originalText,maxLength){const ellipsis="......";const ellipsisLength=ellipsis.length;if(_lodash.default.size(originalText)<=maxLength)return originalText;if(maxLength<=ellipsisLength)return"";const remainingLength=maxLength-ellipsisLength;const frontLength=Math.floor(remainingLength/2);const backLength=remainingLength-frontLength;const front=_lodash.default.truncate(originalText,{length:frontLength,omission:""});const back=_lodash.default.takeRight(originalText,backLength).join("");return`${front}${ellipsis}${back}`}getObjectBy(obj,predict=attr=>attr.checked!==true){return _lodash.default.fromPairs(_lodash.default.toPairs(obj).filter(([_,value])=>predict(value)))}mutateBy(array,predict=item=>item){const sorted=_lodash.default.sortBy(array,predict);array.splice(0,array.length,...sorted)}findUniqueStrings(...arrays){const allStrings=_lodash.default.flatten(arrays);const grouped=_lodash.default.countBy(allStrings);return _lodash.default.chain(grouped).pickBy(count=>count===1).keys().compact().value()}getObjectOfSpecifyKey(value,key){const object={};object[key]=value;return object}findUniqueNonReferenceStrings(...arrays){if(arrays.length===0)return[];const[reference,...rest]=arrays;const allExceptRef=_lodash.default.flatten(rest);const counted=_lodash.default.countBy(allExceptRef);return _lodash.default.chain(counted).pickBy((count,str)=>count===1&&!reference.includes(str)).keys().compact().value()}getArrayOfFillMissingValues(array){const charset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";const generateRandomValue=()=>_lodash.default.times(8,()=>_lodash.default.sample(charset)).join("");const usedValues=new Set(array.map(item=>item.value).filter(Boolean));return array.map(item=>{if(_lodash.default.isEmpty(item.value)){let newValue;do{newValue=generateRandomValue()}while(usedValues.has(newValue));usedValues.add(newValue);return{...item,value:newValue}}return item})}isFirestoreAutoId(id){return _lodash.default.isString(id)&&id.length===20&&/^[A-Za-z0-9]{20}$/.test(id)}getAutoIdOfFirestore(){return this.getRandomHashV2(20)}getStringOfConvertTimeRange(input){const[datePart,timeRange]=input.split("\uFF5C");const dateStr=datePart.split("(")[0];const[start,end]=timeRange.split("-");const formatDate=time=>(0,_momentTimezone.default)(`${dateStr} ${time}`,"YYYY/MM/DD HH:mm").format("YYYYMMDDHHmm");return`${formatDate(start)}-${formatDate(end)}`}getTSOfSpecificDate(dateStr,{end=false}={}){return Number((0,_lodash.default)(dateStr).thru(str=>(0,_momentTimezone.default)(str.split("(")[0],"YYYY/MM/DD")).thru(m=>end?m.endOf("day"):m.startOf("day")).value().format("YYYYMMDDHHmmss"))}isHttpsURL(url){if(!_lodash.default.isString(url))return false;try{const decoded=decodeURIComponent(url.trim());const parsed=new URL(decoded);return parsed.protocol==="https:"}catch(e){return false}}generateUniqueCodeMap(array,length=3){if(length<2){throw new Error("\u4EE3\u78BC\u9577\u5EA6\u6700\u5C11\u5FC5\u9808\u70BA 2\u3002")}const usedCodes=new Set;const usedKeys=new Set;const generateRandomCode=()=>{const letters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";const chars=letters+"0123456789";let code;do{code=letters[Math.floor(Math.random()*letters.length)];for(let i=1;i<length;i++){code+=chars[Math.floor(Math.random()*chars.length)]}}while(usedCodes.has(code));usedCodes.add(code);return code};return _lodash.default.transform(array,(result,key)=>{if(usedKeys.has(key)){throw new Error(`23125453 Duplicate key detected: "${key}"`)}usedKeys.add(key);result[key]=generateRandomCode()},{})}getPriceOfPercentageBehavior(price,percentage,discount=false){const decimal=this.toPercentageDecimal(percentage);return this.getNumberOfMultiplyCeil(price,discount?1-decimal:1+decimal)}getFeeOfDiscount(origin,percentage){return Math.round(_lodash.default.multiply(origin,this.toPercentageDecimal(percentage)))}mergeArrayByKey(array){if(!Array.isArray(array))return array;const resultMap={};for(const obj of array){if(!_lodash.default.isPlainObject(obj))continue;for(const[key,value]of Object.entries(obj)){if(!resultMap[key]){resultMap[key]=_lodash.default.cloneDeep(value)}else{_lodash.default.merge(resultMap[key],value)}}}array.length=0;Object.entries(resultMap).forEach(([key,value])=>{array.push({[key]:value})});return array}getObjectOfStartEndDateTime(input){if(!input||typeof input!=="string"){return{startDate:"",startTime:"",endDate:"",endTime:""}}const cleaned=input.replace(/|/g," ").replace(/-/g,"-").replace(/\s+/g," ").trim();const crossDatePattern=/(\d{4}\/\d{1,2}\/\d{1,2})(?:\s*\([^)]*\))?\s*(\d{2}:\d{2})\s*-\s*(\d{4}\/\d{1,2}\/\d{1,2})(?:\s*\([^)]*\))?\s*(\d{2}:\d{2})/;const sameDatePattern=/(\d{4}\/\d{1,2}\/\d{1,2})(?:\s*\([^)]*\))?\s*(\d{2}:\d{2})\s*-\s*(\d{2}:\d{2})/;let startDate,startTime,endDate,endTime;if(crossDatePattern.test(cleaned)){[,startDate,startTime,endDate,endTime]=cleaned.match(crossDatePattern)}else if(sameDatePattern.test(cleaned)){[,startDate,startTime,endTime]=cleaned.match(sameDatePattern);endDate=startDate}else{return{startDate:"",startTime:"",endDate:"",endTime:""}}const start=new Date(`${startDate} ${startTime}`);const end=new Date(`${endDate} ${endTime}`);if(end<start){throw new Error(`End time cannot be earlier than start time: ${input}`)}return{startDate,startTime,endDate,endTime}}getFilteredHeraPeriods(arr,idOfCurrentBooze){return _lodash.default.chain(arr).filter(item=>item.idOfBooze!==idOfCurrentBooze).uniqBy(item=>`${item.idOfBooze}_${item.idOfVariant}`).value()}checkPeriodConflict(newTask,existingTasks,resourceCount=1){const[datePart,timePart]=newTask.content.split("\uFF5C");const date=(0,_momentTimezone.default)(datePart.split(" ")[0],"YYYY/MM/DD");const[startTimeStr,endTimeStr]=timePart.split("-");const start=(0,_momentTimezone.default)(`${date.format("YYYY/MM/DD")} ${startTimeStr}`,"YYYY/MM/DD HH:mm");const end=(0,_momentTimezone.default)(`${date.format("YYYY/MM/DD")} ${endTimeStr}`,"YYYY/MM/DD HH:mm");const conflictItems=_lodash.default.filter(existingTasks,task=>{const[pStartStr,pEndStr]=task.period.split("-");const pStart=(0,_momentTimezone.default)(pStartStr,"YYYYMMDDHHmm");const pEnd=(0,_momentTimezone.default)(pEndStr,"YYYYMMDDHHmm");return start.isBefore(pEnd)&&end.isAfter(pStart)});const conflict=conflictItems.length>=resourceCount;return{conflict,items:conflictItems}}}var _default=exports.default=Utiller;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "utiller",
3
- "version": "1.0.406",
3
+ "version": "1.0.407",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -11,7 +11,7 @@
11
11
  "license": "ISC",
12
12
  "dependencies": {
13
13
  "configerer": "^1.0.23",
14
- "utiller": "^1.0.405",
14
+ "utiller": "^1.0.406",
15
15
  "linepayer": "^1.0.15",
16
16
  "databazer": "^1.0.17",
17
17
  "lodash": "^4.17.20",