vietnamese-text-search
Version:
Text search for vietnamese.
72 lines • 25.8 kB
JavaScript
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _textHandler=_interopRequireDefault(require("./text-handler")),_scoreHandler=_interopRequireDefault(require("./score-handler")),_config=_interopRequireDefault(require("./config")),_indexHandler=_interopRequireDefault(require("./index-handler")),_utils=require("./utils");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _classPrivateFieldLooseBase(receiver,privateKey){if(!Object.prototype.hasOwnProperty.call(receiver,privateKey))throw new TypeError("attempted to use private field on non-instance");return receiver}var id=0;function _classPrivateFieldLooseKey(name){return"__private_"+id++ +"_"+name}var _textBucket=_classPrivateFieldLooseKey("textBucket"),_textKeyName=_classPrivateFieldLooseKey("textKeyName"),_textValueName=_classPrivateFieldLooseKey("textValueName"),_autoGenBucket=_classPrivateFieldLooseKey("autoGenBucket"),_setup=_classPrivateFieldLooseKey("setup"),_initBucketIfNotExist=_classPrivateFieldLooseKey("initBucketIfNotExist"),_validateAddParams=_classPrivateFieldLooseKey("validateAddParams"),_validateAddManyParams=_classPrivateFieldLooseKey("validateAddManyParams"),_validateUpdateParams=_classPrivateFieldLooseKey("validateUpdateParams"),_validateUpdateManyParams=_classPrivateFieldLooseKey("validateUpdateManyParams"),_validateRemoveParams=_classPrivateFieldLooseKey("validateRemoveParams"),_validateRemoveManyParams=_classPrivateFieldLooseKey("validateRemoveManyParams"),_validateSearchOptions=_classPrivateFieldLooseKey("validateSearchOptions"),_validateInitOptions=_classPrivateFieldLooseKey("validateInitOptions");/** @class TextSearch */class TextSearch{constructor(){/** @private */ /** @public */Object.defineProperty(this,_validateInitOptions,{value:_validateInitOptions2}),Object.defineProperty(this,_validateSearchOptions,{value:_validateSearchOptions2}),Object.defineProperty(this,_validateRemoveManyParams,{value:_validateRemoveManyParams2}),Object.defineProperty(this,_validateRemoveParams,{value:_validateRemoveParams2}),Object.defineProperty(this,_validateUpdateManyParams,{value:_validateUpdateManyParams2}),Object.defineProperty(this,_validateUpdateParams,{value:_validateUpdateParams2}),Object.defineProperty(this,_validateAddManyParams,{value:_validateAddManyParams2}),Object.defineProperty(this,_validateAddParams,{value:_validateAddParams2}),Object.defineProperty(this,_initBucketIfNotExist,{value:_initBucketIfNotExist2}),Object.defineProperty(this,_setup,{value:_setup2}),Object.defineProperty(this,_textBucket,{writable:!0,value:void 0}),Object.defineProperty(this,_textKeyName,{writable:!0,value:void 0}),Object.defineProperty(this,_textValueName,{writable:!0,value:void 0}),Object.defineProperty(this,_autoGenBucket,{writable:!0,value:void 0}),_classPrivateFieldLooseBase(this,_textBucket)[_textBucket]={},_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName]=_config.default.DefaultKeyName,_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]=_config.default.DefaultValueName,_classPrivateFieldLooseBase(this,_autoGenBucket)[_autoGenBucket]=!0,this.thresholdScore=_config.default.DefaultThreshold,this.sortOrder=_config.default.DefaultSortOrder,this.limit=_config.default.DefaultLimit,this.offset=0,this.useAddedScore=!1}/**
* Initialize an TextSearch instance with options
* @param {TextObject} textObjs
* @param {InitOptions} options
* @param {Function} cb
* @returns {Promise<TextSearch>} TextSearch's instance
*/static async init(textObjs=[],options={},cb=null){try{if(!Array.isArray(textObjs))throw new Error("textObjs must be array");const initArgs={},instance=new TextSearch,valOptionsResult=_classPrivateFieldLooseBase(instance,_validateInitOptions)[_validateInitOptions](options);if(!valOptionsResult.valid)throw new Error(valOptionsResult.message);Object.entries(valOptionsResult.data).forEach(([key,val])=>{initArgs[key]=val}),_classPrivateFieldLooseBase(instance,_setup)[_setup](initArgs);const{bucket}=valOptionsResult.data;return _classPrivateFieldLooseBase(instance,_initBucketIfNotExist)[_initBucketIfNotExist](bucket),await instance.addManyTextObjs(textObjs,{...(bucket?{bucket}:{})}),cb?cb(null,instance):instance}catch(err){if(cb)return cb(err);throw err}}/**
* Search for `text`
* @param {string} text
* @param {SearchOptions} options
* @param {Function} cb
* @returns {Promise<SearchResult>} { data, sortOrder, thresholdScore, offset, limit, total, text, buckets }
*/async search(text,options={},cb=null){try{const textToSearch=(text+"").trim(),valResult=_classPrivateFieldLooseBase(this,_validateSearchOptions)[_validateSearchOptions](options);if(!valResult.valid)throw new Error(valResult.message);const{sortOrder,limit,offset,thresholdScore,buckets,useAddedScore}=valResult.data,{keywords}=_textHandler.default.extractKeywordsFromText(textToSearch,!0),rawResult=await _scoreHandler.default.getTextScoresWithManyKeywords(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],keywords,{buckets,useAddedScore}),sortFunc=-1===sortOrder?(s1,s2)=>-s1[1]+s2[1]:(s1,s2)=>s1[1]-s2[1],finalResult=rawResult.filter(s=>s[1]>thresholdScore).sort(sortFunc),total=finalResult.length,startResults=+offset,endResults=0==+limit?total:+offset+ +limit;return cb?cb(null,finalResult.slice(startResults,endResults),{sortOrder,thresholdScore,offset,limit,total,buckets,text:textToSearch}):{data:finalResult.slice(startResults,endResults),sortOrder,thresholdScore,offset,limit,total,buckets,text:textToSearch}}catch(err){if((0,_utils.log)("search error:"),(0,_utils.log)(err),cb)return cb(err);throw err}}/**
* Add a new text object to a bucket
* @param {TextObject} textObj
* @param {AddObjectOptions} options
* @param {Function} cb
* @returns {Promise<{ nAdded: number, bucket: string, keywords: Keyword[]}>} { nAdded: number, bucket: string, keywords: [] }
* @deprecated use addTextObj instead.
*/async addNewTextObj(textObj,options={},cb=null){try{const valResult=_classPrivateFieldLooseBase(this,_validateAddParams)[_validateAddParams](textObj,options);if(!valResult.valid)throw new Error(valResult.message);const baseOptions={textKeyName:_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],textValueName:_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]},{bucket,keywords}=_indexHandler.default.createIndexForTextObj(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],valResult.data.textObj,baseOptions);return cb?cb(null,{nAdded:1,bucket,keywords}):{nAdded:1,bucket,keywords}}catch(err){if((0,_utils.log)("addNewTextObj error:"),(0,_utils.log)(err),cb)return cb(err);throw err}}/**
* Add many text objects to bucket(s)
* @param {TextObject} textObj
* @param {AddObjectOptions} options
* @param {Function} cb
* @returns {Promise<{nAdded: number, details: object}>} { nAdded: number, details: {} }
* @deprecated use addManyTextObjs instead.
*/async addManyNewTextObjs(textObjs,options={},cb=null){try{const valResult=await _classPrivateFieldLooseBase(this,_validateAddManyParams)[_validateAddManyParams](textObjs,options);if(!valResult.valid)throw new Error(valResult.message);const baseOptions={textKeyName:_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],textValueName:_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]},{textBucket,...metadata}=await _indexHandler.default.createTextIndexByManyTextObjs(valResult.data.textObjs,_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],baseOptions),result={nAdded:metadata.totalObjects,details:metadata.details};return cb?cb(null,result):result}catch(err){if((0,_utils.log)("addManyNewTextObjs error:"),(0,_utils.log)(err),cb)return cb(err);throw err}}/**
* Add a new text object to a bucket
* @param {TextObject} textObj
* @param {AddObjectOptions} options
* @param {Function} cb
* @returns {Promise<{ nAdded: number, bucket: string, keywords: Keyword[]}>} { nAdded: number, bucket: string, keywords: [] }
*/async addTextObj(textObj,options={},cb=null){try{const valResult=_classPrivateFieldLooseBase(this,_validateAddParams)[_validateAddParams](textObj,options);if(!valResult.valid)throw new Error(valResult.message);const baseOptions={textKeyName:_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],textValueName:_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]},{bucket,keywords}=_indexHandler.default.createIndexForTextObj(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],valResult.data.textObj,baseOptions);return cb?cb(null,{nAdded:1,bucket,keywords}):{nAdded:1,bucket,keywords}}catch(err){if((0,_utils.log)("addTextObj error:"),(0,_utils.log)(err),cb)return cb(err);throw err}}/**
* Add many text objects to bucket(s)
* @param {TextObject} textObj
* @param {AddObjectOptions} options
* @param {Function} cb
* @returns {Promise<{nAdded: number, details: object}>} { nAdded: number, details: {} }
*/async addManyTextObjs(textObjs,options={},cb=null){try{const valResult=await _classPrivateFieldLooseBase(this,_validateAddManyParams)[_validateAddManyParams](textObjs,options);if(!valResult.valid)throw new Error(valResult.message);const baseOptions={textKeyName:_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],textValueName:_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]},{textBucket,...metadata}=await _indexHandler.default.createTextIndexByManyTextObjs(valResult.data.textObjs,_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],baseOptions),result={nAdded:metadata.totalObjects,details:metadata.details};return cb?cb(null,result):result}catch(err){if((0,_utils.log)("addManyTextObjs error:"),(0,_utils.log)(err),cb)return cb(err);throw err}}/**
* Update a text object
* @param {TextKey} textKey
* @param {TextObject} textObj
* @param {UpdateObjectOptions} options
* @param {Function} cb
* @returns {Promise<{ nUpserted: number, bucket: string, newKeywords: Keyword[], removedKeywords: Keyword[]}>} { nUpserted: number, bucket: string, newKeywords: [], removedKeywords: []}
*/async updateTextObj(textKey,textObj,options={},cb=null){try{const valResult=_classPrivateFieldLooseBase(this,_validateUpdateParams)[_validateUpdateParams](textKey,textObj,options);if(!valResult.valid)throw new Error(valResult.message);const{textKey:valTextKey,textObj:valTextObj}=valResult.data,baseOptions={textKeyName:_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],textValueName:_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]},oldTextObj=_classPrivateFieldLooseBase(this,_textBucket)[_textBucket][valTextObj.bucket].textDict[valTextKey],{bucket,newKeywords,removedKeywords}=await _indexHandler.default.updateIndexOfTextObj(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],oldTextObj,valTextObj,baseOptions),result={nUpserted:1,bucket,newKeywords,removedKeywords};return cb?cb(null,result):result}catch(err){if((0,_utils.log)("updateTextObj error:"),(0,_utils.log)(err),cb)return cb(err);throw err}}/**
* Update many text objects
* @param {TextObject[]} textObjs
* @param {UpdateObjectOptions} options
* @param {Function} cb
* @returns {Promise<{ nUpserted: number, details: object}>} { nUpserted: number, details: {} }
*/async updateManyTextObjs(textObjs,options={},cb=null){try{const valResult=await _classPrivateFieldLooseBase(this,_validateUpdateManyParams)[_validateUpdateManyParams](textObjs,options);if(!valResult.valid)throw new Error(valResult.message);const textKeyName=_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],{textObjs:valTextObjs}=valResult.data,baseOptions={textKeyName,textValueName:_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]},length=valTextObjs.length;let i=0,nUpserted=0;const details={};for(;i<length;){const textObj=valTextObjs[i],textKey=textObj[textKeyName],oldTextObj=_classPrivateFieldLooseBase(this,_textBucket)[_textBucket][textObj.bucket].textDict[textKey],{bucket,newKeywords,removedKeywords,nUpdated:_nUpdated,nAdded:_nAdded}=await _indexHandler.default.updateIndexOfTextObj(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],oldTextObj,textObj,baseOptions);details[bucket]?(details[bucket].nUpdated+=_nUpdated,details[bucket].nAdded+=_nAdded):details[bucket]={nUpdated:_nUpdated,nAdded:_nAdded},nUpserted+=1,i+=1}const result={nUpserted,details};return cb?cb(null,result):result}catch(err){if((0,_utils.log)("updateManyTextObjs error:"),(0,_utils.log)(err),cb)return cb(err);throw err}}/**
* Remove a text object
* @param {TextKey} textKey
* @param {RemoveObjectOptions} options
* @param {Function} cb
* @returns {Promise<{ nRemoved: number, bucket: string, removedKeywords: Keyword[]}>} { nRemoved: number, bucket, string, removedKeywords: [] }
*/async removeTextObj(textKey,options={},cb=null){try{const valResult=_classPrivateFieldLooseBase(this,_validateRemoveParams)[_validateRemoveParams](textKey,options);if(!valResult.valid)throw new Error(valResult.message);if(valResult.valid&&!valResult.data)return{nRemoved:0,removedKeywords:[]};const baseOptions={textKeyName:_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],textValueName:_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]},{bucket,removedKeywords}=_indexHandler.default.removeIndexOfTextObj(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],valResult.data.textObj,baseOptions),result={nRemoved:1,bucket,removedKeywords};return cb?cb(null,result):result}catch(err){if((0,_utils.log)("removeTextObj error:"),(0,_utils.log)(err),cb)return cb(err);throw err}}/**
* Remove many text objects
* leave textKeys = [] for removing all text indices
* @param {TextKeys[]} textKeys
* @param {RemoveObjectOptions} options
* @param {Function} cb
* @returns {Promise<{ nRemoved: number, details: object}>} { nRemoved: number, details: {} }
*/async removeManyTextObjs(textKeys,options={},cb=null){try{if(!Array.isArray(textKeys))throw new Error("textKeys must be array");const valResult=await _classPrivateFieldLooseBase(this,_validateRemoveManyParams)[_validateRemoveManyParams](textKeys,options);if(!valResult.valid)throw new Error(valResult.message);const baseOptions={textKeyName:_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],textValueName:_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]},{textObjs:valTextObjs}=valResult.data,length=valTextObjs.length;let i=0,nRemoved=0;const details={};for(;i<length;){const textObj=valTextObjs[i];if(textObj){const{bucket}=_indexHandler.default.removeIndexOfTextObj(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],textObj,baseOptions);details[bucket]?details[bucket].nRemoved+=1:details[bucket]={nRemoved:1},nRemoved+=1}i+=1}const result={nRemoved,details};return cb?cb(null,result):result}catch(err){if((0,_utils.log)("removeManyTextObjs error:"),(0,_utils.log)(err),cb)return cb(err);throw err}}/**
* Remove bucket(s)
* @param {string[] | string} buckets
* @returns {{ nRemoved: number, nRemains: number}} { nRemoved: number, nRemains: number }
*/removeBuckets(buckets){let bucketsToRemove=[];if("string"==typeof buckets)bucketsToRemove.push(buckets.trim().toLowerCase());else if(Array.isArray(buckets))bucketsToRemove=[...new Set(buckets.map(bucket=>(""+bucket).trim().toLowerCase()))];else throw new Error("invalid buckets");const length=bucketsToRemove.length,currentBuckets=Object.keys(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket]);let i=0,nRemoved=0,nRemains=currentBuckets.length;for(;i<length;){const bucket=bucketsToRemove[i];if(!currentBuckets.includes(bucket))throw new Error(`bucket [${bucket}] not found`);else if(bucket===_config.default.DefaultTextBucket)continue;delete _classPrivateFieldLooseBase(this,_textBucket)[_textBucket][bucket],nRemoved+=1,nRemains-=1,i+=1}return{nRemoved,nRemains}}/**
* Get stats of TextSearch's instance
* @returns {{ nObjects: number, nIndices: number, details: []}} { nObjects: number, nIndices: number, details: []}
*/getStats(){const textBucket=_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],result={nBuckets:0,nObjects:0,nIndices:0,details:[]},buckets=Object.keys(textBucket);result.nBuckets=buckets.length;for(let i=0;i<result.nBuckets;){const bucket=textBucket[buckets[i]],nObjects=Object.keys(bucket.textDict).length,nIndices=(0,_utils.countNestedObjectKeys)(bucket.textIndex);result.details.push({bucket:buckets[i],nIndices,nObjects}),result.nObjects+=nObjects,result.nIndices+=nIndices,i+=1}return result}}var _setup2=function _setup2(args={}){const{textBucket={[_config.default.DefaultTextBucket]:{textIndex:{},textDict:{}}},textKeyName=_config.default.DefaultKeyName,textValueName=_config.default.DefaultValueName,thresholdScore=_config.default.DefaultThreshold,sortOrder=_config.default.DefaultSortOrder,limit=_config.default.DefaultLimit,offset=0,autoGenBucket=!0,useAddedScore=!1}=args;/** @private */ /** @public */_classPrivateFieldLooseBase(this,_textBucket)[_textBucket]=textBucket,_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName]=textKeyName,_classPrivateFieldLooseBase(this,_textValueName)[_textValueName]=textValueName,_classPrivateFieldLooseBase(this,_autoGenBucket)[_autoGenBucket]=autoGenBucket,this.thresholdScore=thresholdScore,this.sortOrder=sortOrder,this.limit=limit,this.offset=offset,this.useAddedScore=useAddedScore},_initBucketIfNotExist2=function _initBucketIfNotExist2(bucket){_classPrivateFieldLooseBase(this,_textBucket)[_textBucket][bucket]||(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket][bucket]={textIndex:{},textDict:{}})},_validateAddParams2=function _validateAddParams2(textObj={},options={}){const textKeyName=_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],textValueName=_classPrivateFieldLooseBase(this,_textValueName)[_textValueName],textKey=textObj[textKeyName],textValue=textObj[textValueName],addedScore=textObj.addedScore||0,textBucket=_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],autoGenBucket=_classPrivateFieldLooseBase(this,_autoGenBucket)[_autoGenBucket];let bucket=options.bucket||textObj.bucket;if("string"!=typeof textKey||!textKey.trim()||"string"!=typeof textValue||!textValue.trim()||Number.isNaN(+addedScore))return{valid:!1,message:`invalid text object [${textKey}] or textKeyName & textValueName of the object not match with the initialization configs`};if(bucket){if("string"!=typeof bucket||!(bucket.trim()+""))return{valid:!1,message:`invalid bucket [${bucket}]`};bucket=bucket.trim().toLowerCase()}else bucket=_config.default.DefaultTextBucket;if(!textBucket[bucket]&&!autoGenBucket)return{valid:!1,message:`bucket [${bucket}] not found`};if(textBucket[bucket]&&textBucket[bucket].textDict[textKey.trim()])return{valid:!1,message:`textKey [${textKey}] existed`};const valTextObj={[textKeyName]:textKey.trim(),[textValueName]:textValue.trim(),bucket,addedScore:+addedScore};return{valid:!0,data:{textObj:valTextObj,options}}},_validateAddManyParams2=async function _validateAddManyParams2(textObjs,options={}){const self=this,valResults=await Promise.all(textObjs.map(textObj=>_classPrivateFieldLooseBase(self,_validateAddParams)[_validateAddParams](textObj,options))),hasInvalid=valResults.find(res=>!res.valid);if(hasInvalid)return{valid:!1,message:hasInvalid.message};const valTextObjs=valResults.map(res=>res.data.textObj);return{valid:!0,data:{textObjs:valTextObjs,options},rawResults:valResults}},_validateUpdateParams2=function _validateUpdateParams2(textKey,textObj={},options={}){var _NumberisNaN=Number.isNaN;const textKeyName=_classPrivateFieldLooseBase(this,_textKeyName)[_textKeyName],textValueName=_classPrivateFieldLooseBase(this,_textValueName)[_textValueName],textValue=textObj[textValueName],addedScore=textObj.addedScore,textBucket=_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],upsert=options.upsert;let bucket=options.bucket||textObj.bucket;if("string"!=typeof textKey||!textKey.trim())return{valid:!1,message:`invalid textKey [${textKey}]`};if("string"!=typeof textValue||!textValue.trim())return{valid:!1,message:`invalid text object [${textKey}]`};if(addedScore&&_NumberisNaN(+addedScore))return{valid:!1,message:`invalid addedScore at [${textKey}]`};if(bucket){if("string"!=typeof bucket||!(bucket.trim()+""))return{valid:!1,message:`invalid bucket [${bucket}]`};bucket=bucket.trim().toLowerCase()}else bucket=_config.default.DefaultTextBucket;if(!textBucket[bucket])return{valid:!1,message:`bucket [${bucket}] not found`};if(!textBucket[bucket].textDict[textKey.trim()]&&!upsert)return{valid:!1,message:`textKey [${textKey}] not found`};const valTextObj={[textKeyName]:textKey.trim(),[textValueName]:textValue.trim(),...(addedScore?{addedScore:+addedScore}:{}),bucket};return{valid:!0,data:{textKey:textKey.trim(),textObj:valTextObj,options}}},_validateUpdateManyParams2=async function _validateUpdateManyParams2(textObjs,options){const self=this,valResults=await Promise.all(textObjs.map(textObj=>_classPrivateFieldLooseBase(self,_validateUpdateParams)[_validateUpdateParams](textObj[_classPrivateFieldLooseBase(self,_textKeyName)[_textKeyName]],textObj,options))),hasInvalid=valResults.find(res=>!res.valid);if(hasInvalid)return{valid:!1,message:hasInvalid.message};const valTextObjs=valResults.map(res=>res.data.textObj);return{valid:!0,data:{textObjs:valTextObjs,options},rawResults:valResults}},_validateRemoveParams2=function _validateRemoveParams2(textKey,options={}){const textBucket=_classPrivateFieldLooseBase(this,_textBucket)[_textBucket],forceRemove=options.forceRemove;let bucket=options.bucket;if("string"!=typeof textKey||!textKey.trim())return{valid:!1,message:`invalid textKey [${textKey}]`};if(bucket){if("string"!=typeof bucket||!(bucket.trim()+""))return{valid:!1,message:`invalid bucket [${bucket}]`};bucket=bucket.trim().toLowerCase()}else bucket=_config.default.DefaultTextBucket;if(!textBucket[bucket])return{valid:!!forceRemove,message:`bucket [${bucket}] not found`};if(!textBucket[bucket].textDict[textKey.trim()])return{valid:!!forceRemove,message:`textKey [${textKey}] not found`};const textObj=textBucket[bucket].textDict[textKey.trim()];return textObj.bucket=textObj.bucket||bucket,{valid:!0,data:{textKey:textKey.trim(),textObj,options}}},_validateRemoveManyParams2=async function _validateRemoveManyParams2(textKeys,options){const self=this,valResults=await Promise.all(textKeys.map(textKey=>_classPrivateFieldLooseBase(self,_validateRemoveParams)[_validateRemoveParams](textKey,options))),hasInvalid=valResults.find(res=>!res.valid);if(hasInvalid)return{valid:!1,message:hasInvalid.message};const valTextObjs=valResults.map(res=>res.data?res.data.textObj:null);return{valid:!0,data:{textObjs:valTextObjs,options},rawResults:valResults}},_validateSearchOptions2=function _validateSearchOptions2(options={}){var _NumberisInteger=Number.isInteger,_NumberisNaN2=Number.isNaN;try{let{offset,limit,sortOrder,thresholdScore,useAddedScore,buckets}=options;const valOptions={useAddedScore:!!useAddedScore||this.useAddedScore};if(offset){if(!_NumberisInteger(+offset)||0>+offset)throw new Error("offset must be an integer and greater than or equals 0");valOptions.offset=+offset}else valOptions.offset=this.offset;if(limit){if(!_NumberisInteger(+limit)||0>+limit)throw new Error("limit must be an integer and greater than or equals 0");valOptions.limit=+limit}else valOptions.limit=this.limit;if(sortOrder){if(![-1,1,"-1","1"].includes(sortOrder))throw new Error("sortOrder must be -1: descending | 1: ascending");valOptions.sortOrder=+sortOrder}else valOptions.sortOrder=this.sortOrder;if(thresholdScore){if(_NumberisNaN2(+thresholdScore)||0>+thresholdScore)throw new Error("thresholdScore must be an integer and greater than or equals 0");valOptions.thresholdScore=+thresholdScore}else valOptions.thresholdScore=this.thresholdScore;if(Array.isArray(buckets)&&buckets.length){const textBucket=_classPrivateFieldLooseBase(this,_textBucket)[_textBucket];buckets=[...new Set(buckets)];const length=buckets.length;for(let i=0;i<length;){const bucket=buckets[i];if("string"!=typeof bucket||!bucket.trim())throw new Error(`invalid bucket [${bucket}]`);if(!textBucket[bucket.trim().toLowerCase()])throw new Error(`bucket [${bucket}] not found`);i+=1}valOptions.buckets=buckets.map(bucket=>bucket.trim().toLowerCase())}else valOptions.buckets=Object.keys(_classPrivateFieldLooseBase(this,_textBucket)[_textBucket]);return{valid:!0,message:"ok",data:valOptions}}catch(err){return{valid:!1,message:err.message||"something went wrong",data:null}}},_validateInitOptions2=function _validateInitOptions2(options={}){const textPattern=/[a-zA-Z0-9_]/g;let{textKeyName,textValueName,autoGenBucket,bucket,...searchOptions}=options;const searchValResult=_classPrivateFieldLooseBase(this,_validateSearchOptions)[_validateSearchOptions](searchOptions);if(!searchValResult.valid)throw new Error(searchValResult.message);const valOptions={...searchValResult.data,autoGenBucket:!!autoGenBucket};if(bucket){if("string"!=typeof bucket||!textPattern.test(bucket))throw new Error("bucket can only contains a-z, A-Z, 0-9, _");valOptions.bucket=bucket.trim()}else valOptions.bucket=_config.default.DefaultTextBucket;if(textKeyName){if("string"!=typeof textKeyName||!textPattern.test(textKeyName.trim()))throw new Error("textKeyName can only contains a-z, A-Z, 0-9, _");valOptions.textKeyName=textKeyName.trim()}else valOptions.textKeyName=_config.default.DefaultKeyName;if(textValueName){if("string"!=typeof textValueName||!textPattern.test(textValueName.trim()))throw new Error("textValueName can only contains a-z, A-Z, 0-9, _");valOptions.textValueName=textValueName.trim()}else valOptions.textValueName=_config.default.DefaultValueName;return{valid:!0,message:"ok",data:valOptions}},_default=TextSearch;exports.default=_default;