{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { LRUCache } from 'lru-cache';\nimport { EventEmitter } from 'events';\nimport deepClone from 'lodash.clonedeep';\nimport { deepFreeze } from './freeze';\nimport {\n ResultBase,\n IParamsBase0,\n IParamsBase1,\n IParamsBase2,\n IParamsBase3,\n IParamsBase4,\n IParamsBase5,\n IParamsBase6,\n IParamsBasePlus,\n} from './util';\n\ninterface IMemoizedSync extends ResultBase {\n (arg1: T1): TResult;\n (arg1: T1, arg2: T2): TResult;\n (arg1: T1, arg2: T2, arg3: T3): TResult;\n (arg1: T1, arg2: T2, arg3: T3, arg4: T4): TResult;\n (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5): TResult;\n (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6): TResult;\n}\n\ninterface IMemoizableFunctionSync0 {\n (): TResult;\n}\ninterface IMemoizableFunctionSync1 {\n (arg1: T1): TResult;\n}\ninterface IMemoizableFunctionSync2 {\n (arg1: T1, arg2: T2): TResult;\n}\ninterface IMemoizableFunctionSync3 {\n (arg1: T1, arg2: T2, arg3: T3): TResult;\n}\ninterface IMemoizableFunctionSync4 {\n (arg1: T1, arg2: T2, arg3: T3, arg4: T4): TResult;\n}\ninterface IMemoizableFunctionSync5 {\n (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5): TResult;\n}\ninterface IMemoizableFunctionSync6 {\n (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6): TResult;\n}\ninterface IMemoizableFunctionSyncPlus {\n (...args: any[]): TResult;\n}\n\nexport type SyncParams0 = IParamsBase0 & {\n load: IMemoizableFunctionSync0;\n}\nexport type SyncParams1 = IParamsBase1 & {\n load: IMemoizableFunctionSync1;\n}\nexport type SyncParams2\n = IParamsBase2 & {\n load: IMemoizableFunctionSync2;\n }\nexport type SyncParams3\n = IParamsBase3 & {\n load: IMemoizableFunctionSync3;\n }\nexport type SyncParams4\n = IParamsBase4 & {\n load: IMemoizableFunctionSync4;\n }\nexport type SyncParams5\n = IParamsBase5 & {\n load: IMemoizableFunctionSync5;\n }\nexport type SyncParams6\n = IParamsBase6 & {\n load: IMemoizableFunctionSync6;\n }\nexport type SyncParamsPlus = IParamsBasePlus & {\n load: IMemoizableFunctionSyncPlus;\n}\nexport function syncMemoizer(\n options: SyncParams0\n): IMemoizedSync;\nexport function syncMemoizer(\n options: SyncParams1\n): IMemoizedSync;\nexport function syncMemoizer(\n options: SyncParams2\n): IMemoizedSync;\nexport function syncMemoizer(\n options: SyncParams3\n): IMemoizedSync;\nexport function syncMemoizer(\n options: SyncParams4\n): IMemoizedSync;\nexport function syncMemoizer(\n options: SyncParams5\n): IMemoizedSync;\nexport function syncMemoizer(\n options: SyncParams6\n): IMemoizedSync;\nexport function syncMemoizer(\n options: SyncParamsPlus\n): IMemoizedSync {\n const cache = new LRUCache(options);\n const load = options.load;\n const hash = options.hash;\n const bypass = options.bypass;\n const itemTTL = options.itemTTL;\n const freeze = options.freeze;\n const clone = options.clone;\n const emitter = new EventEmitter();\n\n const defaultResult = Object.assign({\n del,\n reset: () => cache.clear(),\n keys: () => [...cache.keys()],\n on: emitter.on.bind(emitter),\n once: emitter.once.bind(emitter),\n }, options);\n\n if (options.disable) {\n return Object.assign(load, defaultResult);\n }\n\n function del() {\n const key = hash(...arguments);\n cache.delete(key);\n }\n\n function emit(event: string, ...parameters: any[]) {\n emitter.emit(event, ...parameters);\n }\n\n function isPromise(result: any): boolean {\n // detect native, bluebird, A+ promises\n return result && result.then && typeof result.then === 'function';\n }\n\n function processResult(result: any) {\n let res = result;\n\n if (clone) {\n if (isPromise(res)) {\n res = res.then(deepClone);\n } else {\n res = deepClone(res);\n }\n }\n\n if (freeze) {\n if (isPromise(res)) {\n res = res.then(deepFreeze);\n } else {\n deepFreeze(res);\n }\n }\n\n return res;\n }\n\n const result: IMemoizableFunctionSync6 = function (\n ...args: any[]\n ) {\n if (bypass && bypass(...args)) {\n emit('miss', ...args);\n return load(...args);\n }\n\n var key = hash(...args);\n\n var fromCache = cache.get(key);\n\n if (fromCache) {\n emit('hit', ...args);\n\n return processResult(fromCache);\n }\n\n emit('miss', ...args);\n const result = load(...args);\n\n if (itemTTL) {\n // @ts-ignore\n cache.set(key, result, { ttl: itemTTL(...args.concat([result])) });\n } else {\n cache.set(key, result);\n }\n\n return processResult(result);\n };\n\n return Object.assign(result, defaultResult) as any;\n}\n"]}