@actdim/utico 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/array.es.js.map +1 -1
  2. package/dist/arrayExtensions.es.js.map +1 -1
  3. package/dist/cache/memoryCache.es.js.map +1 -1
  4. package/dist/cache/persistentCache.d.ts +16 -20
  5. package/dist/cache/persistentCache.d.ts.map +1 -1
  6. package/dist/cache/persistentCache.es.js +65 -73
  7. package/dist/cache/persistentCache.es.js.map +1 -1
  8. package/dist/dataFormats.es.js.map +1 -1
  9. package/dist/dateTimeDataFormat.es.js.map +1 -1
  10. package/dist/gfx/canvasUtils.es.js.map +1 -1
  11. package/dist/gfx/color.es.js.map +1 -1
  12. package/dist/i18n/cultures.es.js.map +1 -1
  13. package/dist/i18n/enUsCulture.es.js.map +1 -1
  14. package/dist/math.es.js.map +1 -1
  15. package/dist/metadata.es.js.map +1 -1
  16. package/dist/mutex.es.js.map +1 -1
  17. package/dist/patterns.es.js.map +1 -1
  18. package/dist/store/dataStore.d.ts +33 -0
  19. package/dist/store/dataStore.d.ts.map +1 -0
  20. package/dist/store/dataStore.es.js +49 -0
  21. package/dist/store/dataStore.es.js.map +1 -0
  22. package/dist/store/persistentStore.d.ts +20 -0
  23. package/dist/store/persistentStore.d.ts.map +1 -0
  24. package/dist/store/persistentStore.es.js +96 -0
  25. package/dist/store/persistentStore.es.js.map +1 -0
  26. package/dist/store/storeContracts.d.ts +6 -0
  27. package/dist/store/storeContracts.d.ts.map +1 -0
  28. package/dist/store/storeContracts.es.js +2 -0
  29. package/dist/store/storeContracts.es.js.map +1 -0
  30. package/dist/stringCore.es.js.map +1 -1
  31. package/dist/structEvent.es.js.map +1 -1
  32. package/dist/typeCore.es.js.map +1 -1
  33. package/dist/typeUtils.es.js.map +1 -1
  34. package/dist/utils.es.js.map +1 -1
  35. package/dist/watchable.es.js.map +1 -1
  36. package/package.json +3 -4
  37. package/dist/cache/cacheDb.d.ts +0 -30
  38. package/dist/cache/cacheDb.d.ts.map +0 -1
  39. package/dist/cache/cacheDb.es.js +0 -47
  40. package/dist/cache/cacheDb.es.js.map +0 -1
  41. package/dist/storage/persistentStorage.d.ts +0 -11
  42. package/dist/storage/persistentStorage.d.ts.map +0 -1
  43. package/dist/storage/persistentStorage.es.js +0 -25
  44. package/dist/storage/persistentStorage.es.js.map +0 -1
  45. package/dist/storage/storageContracts.d.ts +0 -6
  46. package/dist/storage/storageContracts.d.ts.map +0 -1
  47. package/dist/storage/storageContracts.es.js +0 -2
  48. package/dist/storage/storageContracts.es.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"utils.es.js","sources":["D:/Src/my/actdim/public/utico/src/utils.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\r\n\r\n// @filename: util.ts\r\n\r\n// export function guid() {\r\n// function s4() {\r\n// return Math.floor((1 + Math.random()) * 0x10000)\r\n// .toString(16)\r\n// .substring(1);\r\n// }\r\n// return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\r\n// }\r\n\r\nexport const normalize = (v: number) => (!v || !isFinite(v) ? 0 : v);\r\n\r\n// numericalOr\r\nexport function numericOr(...values: number[]) {\r\n for (const value of values) {\r\n if (value != undefined) {\r\n return value;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n// funcArgCacheKeyResolver(Provider/Builder)\r\nexport const buildFuncArgCacheKey = (() => {\r\n const weakMap = new WeakMap<any, string>();\r\n return (...args: any[]) => {\r\n const keys: string[] = [];\r\n for (const arg of args) {\r\n let key: string = undefined;\r\n if (typeof arg === \"number\" || typeof arg === \"string\" || typeof arg === \"boolean\" || arg == undefined) {\r\n key = \"\" + arg;\r\n } else {\r\n key = weakMap.get(arg);\r\n if (!key) {\r\n key = uuid();\r\n weakMap.set(arg, key);\r\n }\r\n }\r\n keys.push(key);\r\n }\r\n return `\"${keys.join(\"/\")}\"`;\r\n };\r\n})();\r\n\r\nexport const delayAsync = (ms: number) => {\r\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\r\n};\r\n\r\n// scheduleErrorAsync\r\nexport const delayErrorAsync = (ms: number, err?: Error) => {\r\n if (!err) {\r\n err = new Error(\"Timeout exceeded\");\r\n }\r\n return new Promise<never>((_, reject) =>\r\n setTimeout(\r\n () => reject(err),\r\n // Don't do this (!):\r\n // () => {\r\n // throw err;\r\n // },\r\n ms\r\n )\r\n );\r\n};\r\n\r\nexport function withTimeoutAsync<T>(promise: Promise<T>, ms: number): Promise<T> {\r\n // return new Promise((resolve, reject) => {\r\n // const timer = setTimeout(() => reject(new Error('Timeout exceeded')), ms);\r\n // promise.then((value) => {\r\n // clearTimeout(timer);\r\n // resolve(value);\r\n // }, reject);\r\n // });\r\n return Promise.race([delayErrorAsync(ms), promise]);\r\n}\r\n\r\n/**\r\n * Search node in a tree\r\n * @param predicate filter\r\n * @param childSelector\r\n * @param treeNodes\r\n */\r\nexport function searchTree<T>(treeNodes: T[], predicate: (item: T) => boolean, childSelector: (item: T) => T[]) {\r\n if (!treeNodes) {\r\n return undefined;\r\n }\r\n for (const treeNode of treeNodes) {\r\n if (predicate(treeNode)) {\r\n return treeNode;\r\n }\r\n const node = searchTree(childSelector(treeNode), predicate, childSelector);\r\n if (node) {\r\n return node;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const suppressConsole = (action: () => void) => {\r\n const origConsole: any = {};\r\n const result: {\r\n method: keyof Console;\r\n args: any[];\r\n }[] = [];\r\n const keys: (keyof Console)[] = [\"log\" /*, \"debug\", \"warn\", \"info\"*/];\r\n for (const key of keys) {\r\n origConsole[key] = console[key];\r\n console[key] = function (...args: any[]) {\r\n result.push({\r\n method: key,\r\n args: args\r\n });\r\n } as any;\r\n }\r\n try {\r\n action();\r\n } finally {\r\n for (const key of keys) {\r\n console[key] = origConsole[key];\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n// another comparator example\r\n// const deepEqual = (a: any, b: any) => JSON.stringify(a) === JSON.stringify(b);\r\n// depEffect\r\nexport function memoEffect<TDep, TResult>(\r\n getValue: () => TDep, // getDep\r\n callback: (v: TDep) => TResult, // onChange/action\r\n comparator: (a: TDep, b: TDep) => boolean = (a, b) => a === b // equals\r\n) {\r\n let val: TDep | undefined;\r\n let initialized = false;\r\n let retVal: TResult;\r\n return () => {\r\n const next = getValue();\r\n if (!initialized || !comparator(next, val!)) {\r\n val = next;\r\n initialized = true;\r\n retVal = callback(next);\r\n }\r\n return retVal;\r\n };\r\n}\r\n\r\n/*\r\nexport function memoizeThrottle<T extends Func>(\r\n func: T,\r\n wait = 0,\r\n options?: Parameters<typeof _.throttle<T>>[2],\r\n resolver?: Parameters<typeof _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.throttle<T>>>>[1]\r\n) {\r\n const mem = _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.throttle<T>>>(() => {\r\n return _.throttle<T>(func, wait, options);\r\n }, resolver);\r\n\r\n return (...args: Parameters<T>) => {\r\n return mem(...args)(...args);\r\n };\r\n}\r\n\r\nexport function memoizeDebounce<T extends Func>(\r\n func: T,\r\n wait = 0,\r\n options?: Parameters<typeof _.debounce<T>>[2],\r\n resolver?: Parameters<typeof _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.debounce<T>>>>[1]\r\n) {\r\n const mem = _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.debounce<T>>>(() => {\r\n return _.debounce<T>(func, wait, options);\r\n }, resolver);\r\n\r\n return (...args: Parameters<T>) => {\r\n return mem(...args)(...args);\r\n };\r\n}\r\n*/\r\n"],"names":["normalize","v","numericOr","values","value","buildFuncArgCacheKey","weakMap","args","keys","arg","key","uuid","delayAsync","ms","resolve","delayErrorAsync","err","_","reject","withTimeoutAsync","promise","searchTree","treeNodes","predicate","childSelector","treeNode","node","suppressConsole","action","origConsole","result","memoEffect","getValue","callback","comparator","a","b","val","initialized","retVal","next"],"mappings":";AAaO,MAAMA,IAAY,CAACC,MAAe,CAACA,KAAK,CAAC,SAASA,CAAC,IAAI,IAAIA;AAG3D,SAASC,KAAaC,GAAkB;AAC3C,aAAWC,KAASD;AAChB,QAAIC,KAAS;AACT,aAAOA;AAInB;AAGO,MAAMC,IAAwB,uBAAM;AACvC,QAAMC,wBAAc,QAAA;AACpB,SAAO,IAAIC,MAAgB;AACvB,UAAMC,IAAiB,CAAA;AACvB,eAAWC,KAAOF,GAAM;AACpB,UAAIG;AACJ,MAAI,OAAOD,KAAQ,YAAY,OAAOA,KAAQ,YAAY,OAAOA,KAAQ,aAAaA,KAAO,OACzFC,IAAM,KAAKD,KAEXC,IAAMJ,EAAQ,IAAIG,CAAG,GAChBC,MACDA,IAAMC,EAAA,GACNL,EAAQ,IAAIG,GAAKC,CAAG,KAG5BF,EAAK,KAAKE,CAAG;AAAA,IACjB;AACA,WAAO,IAAIF,EAAK,KAAK,GAAG,CAAC;AAAA,EAC7B;AACJ,GAAA,GAEaI,IAAa,CAACC,MAChB,IAAI,QAAc,CAACC,MAAY,WAAWA,GAASD,CAAE,CAAC,GAIpDE,IAAkB,CAACF,GAAYG,OACnCA,MACDA,IAAM,IAAI,MAAM,kBAAkB,IAE/B,IAAI;AAAA,EAAe,CAACC,GAAGC,MAC1B;AAAA,IACI,MAAMA,EAAOF,CAAG;AAAA;AAAA;AAAA;AAAA;AAAA,IAKhBH;AAAA,EAAA;AACJ;AAID,SAASM,EAAoBC,GAAqBP,GAAwB;AAQ7E,SAAO,QAAQ,KAAK,CAACE,EAAgBF,CAAE,GAAGO,CAAO,CAAC;AACtD;AAQO,SAASC,EAAcC,GAAgBC,GAAiCC,GAAiC;AAC5G,MAAKF;AAGL,eAAWG,KAAYH,GAAW;AAC9B,UAAIC,EAAUE,CAAQ;AAClB,eAAOA;AAEX,YAAMC,IAAOL,EAAWG,EAAcC,CAAQ,GAAGF,GAAWC,CAAa;AACzE,UAAIE;AACA,eAAOA;AAAA,IAEf;AAEJ;AAEO,MAAMC,IAAkB,CAACC,MAAuB;AACnD,QAAMC,IAAmB,CAAA,GACnBC,IAGA,CAAA,GACAtB,IAA0B;AAAA,IAAC;AAAA;AAAA,EAAA;AACjC,aAAWE,KAAOF;AACd,IAAAqB,EAAYnB,CAAG,IAAI,QAAQA,CAAG,GAC9B,QAAQA,CAAG,IAAI,YAAaH,GAAa;AACrC,MAAAuB,EAAO,KAAK;AAAA,QACR,QAAQpB;AAAA,QACR,MAAAH;AAAA,MAAA,CACH;AAAA,IACL;AAEJ,MAAI;AACA,IAAAqB,EAAA;AAAA,EACJ,UAAA;AACI,eAAWlB,KAAOF;AACd,cAAQE,CAAG,IAAImB,EAAYnB,CAAG;AAAA,EAEtC;AACA,SAAOoB;AACX;AAKO,SAASC,EACZC,GACAC,GACAC,IAA4C,CAACC,GAAGC,MAAMD,MAAMC,GAC9D;AACE,MAAIC,GACAC,IAAc,IACdC;AACJ,SAAO,MAAM;AACT,UAAMC,IAAOR,EAAA;AACb,YAAI,CAACM,KAAe,CAACJ,EAAWM,GAAMH,CAAI,OACtCA,IAAMG,GACNF,IAAc,IACdC,IAASN,EAASO,CAAI,IAEnBD;AAAA,EACX;AACJ;"}
1
+ {"version":3,"file":"utils.es.js","sources":["../src/utils.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\r\n\r\n// @filename: util.ts\r\n\r\n// export function guid() {\r\n// function s4() {\r\n// return Math.floor((1 + Math.random()) * 0x10000)\r\n// .toString(16)\r\n// .substring(1);\r\n// }\r\n// return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\r\n// }\r\n\r\nexport const normalize = (v: number) => (!v || !isFinite(v) ? 0 : v);\r\n\r\n// numericalOr\r\nexport function numericOr(...values: number[]) {\r\n for (const value of values) {\r\n if (value != undefined) {\r\n return value;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n// funcArgCacheKeyResolver(Provider/Builder)\r\nexport const buildFuncArgCacheKey = (() => {\r\n const weakMap = new WeakMap<any, string>();\r\n return (...args: any[]) => {\r\n const keys: string[] = [];\r\n for (const arg of args) {\r\n let key: string = undefined;\r\n if (typeof arg === \"number\" || typeof arg === \"string\" || typeof arg === \"boolean\" || arg == undefined) {\r\n key = \"\" + arg;\r\n } else {\r\n key = weakMap.get(arg);\r\n if (!key) {\r\n key = uuid();\r\n weakMap.set(arg, key);\r\n }\r\n }\r\n keys.push(key);\r\n }\r\n return `\"${keys.join(\"/\")}\"`;\r\n };\r\n})();\r\n\r\nexport const delayAsync = (ms: number) => {\r\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\r\n};\r\n\r\n// scheduleErrorAsync\r\nexport const delayErrorAsync = (ms: number, err?: Error) => {\r\n if (!err) {\r\n err = new Error(\"Timeout exceeded\");\r\n }\r\n return new Promise<never>((_, reject) =>\r\n setTimeout(\r\n () => reject(err),\r\n // Don't do this (!):\r\n // () => {\r\n // throw err;\r\n // },\r\n ms\r\n )\r\n );\r\n};\r\n\r\nexport function withTimeoutAsync<T>(promise: Promise<T>, ms: number): Promise<T> {\r\n // return new Promise((resolve, reject) => {\r\n // const timer = setTimeout(() => reject(new Error('Timeout exceeded')), ms);\r\n // promise.then((value) => {\r\n // clearTimeout(timer);\r\n // resolve(value);\r\n // }, reject);\r\n // });\r\n return Promise.race([delayErrorAsync(ms), promise]);\r\n}\r\n\r\n/**\r\n * Search node in a tree\r\n * @param predicate filter\r\n * @param childSelector\r\n * @param treeNodes\r\n */\r\nexport function searchTree<T>(treeNodes: T[], predicate: (item: T) => boolean, childSelector: (item: T) => T[]) {\r\n if (!treeNodes) {\r\n return undefined;\r\n }\r\n for (const treeNode of treeNodes) {\r\n if (predicate(treeNode)) {\r\n return treeNode;\r\n }\r\n const node = searchTree(childSelector(treeNode), predicate, childSelector);\r\n if (node) {\r\n return node;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const suppressConsole = (action: () => void) => {\r\n const origConsole: any = {};\r\n const result: {\r\n method: keyof Console;\r\n args: any[];\r\n }[] = [];\r\n const keys: (keyof Console)[] = [\"log\" /*, \"debug\", \"warn\", \"info\"*/];\r\n for (const key of keys) {\r\n origConsole[key] = console[key];\r\n console[key] = function (...args: any[]) {\r\n result.push({\r\n method: key,\r\n args: args\r\n });\r\n } as any;\r\n }\r\n try {\r\n action();\r\n } finally {\r\n for (const key of keys) {\r\n console[key] = origConsole[key];\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n// another comparator example\r\n// const deepEqual = (a: any, b: any) => JSON.stringify(a) === JSON.stringify(b);\r\n// depEffect\r\nexport function memoEffect<TDep, TResult>(\r\n getValue: () => TDep, // getDep\r\n callback: (v: TDep) => TResult, // onChange/action\r\n comparator: (a: TDep, b: TDep) => boolean = (a, b) => a === b // equals\r\n) {\r\n let val: TDep | undefined;\r\n let initialized = false;\r\n let retVal: TResult;\r\n return () => {\r\n const next = getValue();\r\n if (!initialized || !comparator(next, val!)) {\r\n val = next;\r\n initialized = true;\r\n retVal = callback(next);\r\n }\r\n return retVal;\r\n };\r\n}\r\n\r\n/*\r\nexport function memoizeThrottle<T extends Func>(\r\n func: T,\r\n wait = 0,\r\n options?: Parameters<typeof _.throttle<T>>[2],\r\n resolver?: Parameters<typeof _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.throttle<T>>>>[1]\r\n) {\r\n const mem = _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.throttle<T>>>(() => {\r\n return _.throttle<T>(func, wait, options);\r\n }, resolver);\r\n\r\n return (...args: Parameters<T>) => {\r\n return mem(...args)(...args);\r\n };\r\n}\r\n\r\nexport function memoizeDebounce<T extends Func>(\r\n func: T,\r\n wait = 0,\r\n options?: Parameters<typeof _.debounce<T>>[2],\r\n resolver?: Parameters<typeof _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.debounce<T>>>>[1]\r\n) {\r\n const mem = _.memoize<(...args: Parameters<T>) => ReturnType<typeof _.debounce<T>>>(() => {\r\n return _.debounce<T>(func, wait, options);\r\n }, resolver);\r\n\r\n return (...args: Parameters<T>) => {\r\n return mem(...args)(...args);\r\n };\r\n}\r\n*/\r\n"],"names":["normalize","v","numericOr","values","value","buildFuncArgCacheKey","weakMap","args","keys","arg","key","uuid","delayAsync","ms","resolve","delayErrorAsync","err","_","reject","withTimeoutAsync","promise","searchTree","treeNodes","predicate","childSelector","treeNode","node","suppressConsole","action","origConsole","result","memoEffect","getValue","callback","comparator","a","b","val","initialized","retVal","next"],"mappings":";AAaO,MAAMA,IAAY,CAACC,MAAe,CAACA,KAAK,CAAC,SAASA,CAAC,IAAI,IAAIA;AAG3D,SAASC,KAAaC,GAAkB;AAC3C,aAAWC,KAASD;AAChB,QAAIC,KAAS;AACT,aAAOA;AAInB;AAGO,MAAMC,IAAwB,uBAAM;AACvC,QAAMC,wBAAc,QAAA;AACpB,SAAO,IAAIC,MAAgB;AACvB,UAAMC,IAAiB,CAAA;AACvB,eAAWC,KAAOF,GAAM;AACpB,UAAIG;AACJ,MAAI,OAAOD,KAAQ,YAAY,OAAOA,KAAQ,YAAY,OAAOA,KAAQ,aAAaA,KAAO,OACzFC,IAAM,KAAKD,KAEXC,IAAMJ,EAAQ,IAAIG,CAAG,GAChBC,MACDA,IAAMC,EAAA,GACNL,EAAQ,IAAIG,GAAKC,CAAG,KAG5BF,EAAK,KAAKE,CAAG;AAAA,IACjB;AACA,WAAO,IAAIF,EAAK,KAAK,GAAG,CAAC;AAAA,EAC7B;AACJ,GAAA,GAEaI,IAAa,CAACC,MAChB,IAAI,QAAc,CAACC,MAAY,WAAWA,GAASD,CAAE,CAAC,GAIpDE,IAAkB,CAACF,GAAYG,OACnCA,MACDA,IAAM,IAAI,MAAM,kBAAkB,IAE/B,IAAI;AAAA,EAAe,CAACC,GAAGC,MAC1B;AAAA,IACI,MAAMA,EAAOF,CAAG;AAAA;AAAA;AAAA;AAAA;AAAA,IAKhBH;AAAA,EAAA;AACJ;AAID,SAASM,EAAoBC,GAAqBP,GAAwB;AAQ7E,SAAO,QAAQ,KAAK,CAACE,EAAgBF,CAAE,GAAGO,CAAO,CAAC;AACtD;AAQO,SAASC,EAAcC,GAAgBC,GAAiCC,GAAiC;AAC5G,MAAKF;AAGL,eAAWG,KAAYH,GAAW;AAC9B,UAAIC,EAAUE,CAAQ;AAClB,eAAOA;AAEX,YAAMC,IAAOL,EAAWG,EAAcC,CAAQ,GAAGF,GAAWC,CAAa;AACzE,UAAIE;AACA,eAAOA;AAAA,IAEf;AAEJ;AAEO,MAAMC,IAAkB,CAACC,MAAuB;AACnD,QAAMC,IAAmB,CAAA,GACnBC,IAGA,CAAA,GACAtB,IAA0B;AAAA,IAAC;AAAA;AAAA,EAAA;AACjC,aAAWE,KAAOF;AACd,IAAAqB,EAAYnB,CAAG,IAAI,QAAQA,CAAG,GAC9B,QAAQA,CAAG,IAAI,YAAaH,GAAa;AACrC,MAAAuB,EAAO,KAAK;AAAA,QACR,QAAQpB;AAAA,QACR,MAAAH;AAAA,MAAA,CACH;AAAA,IACL;AAEJ,MAAI;AACA,IAAAqB,EAAA;AAAA,EACJ,UAAA;AACI,eAAWlB,KAAOF;AACd,cAAQE,CAAG,IAAImB,EAAYnB,CAAG;AAAA,EAEtC;AACA,SAAOoB;AACX;AAKO,SAASC,EACZC,GACAC,GACAC,IAA4C,CAACC,GAAGC,MAAMD,MAAMC,GAC9D;AACE,MAAIC,GACAC,IAAc,IACdC;AACJ,SAAO,MAAM;AACT,UAAMC,IAAOR,EAAA;AACb,YAAI,CAACM,KAAe,CAACJ,EAAWM,GAAMH,CAAI,OACtCA,IAAMG,GACNF,IAAc,IACdC,IAASN,EAASO,CAAI,IAEnBD;AAAA,EACX;AACJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"watchable.es.js","sources":["D:/Src/my/actdim/public/utico/src/watchable.ts"],"sourcesContent":["import { Mutable, Executor, Func } from \"./typeCore\";\r\n\r\n// PromiseState\r\nexport type PromiseStatus = \"pending\" | \"fulfilled\" | \"rejected\";\r\n\r\n// TrackablePromise\r\nexport type WatchablePromise<T = void> = PromiseLike<T> & {\r\n readonly status?: PromiseStatus;\r\n readonly settled?: boolean;\r\n readonly result?: T;\r\n};\r\n\r\n// WatchableFn\r\nexport type WatchableFunc<TArgs extends any[] = any[], T = any> = Func<TArgs, T> & {\r\n executing?: boolean; // running/inProgress/pending\r\n};\r\n\r\n// we need promise wrapper because Promise [[PromiseState]] and [[PromiseResult]] symbols are not accessible\r\n// exec and watch/track\r\nexport function watch<T = void>(fn: Executor<T>) {\r\n // type PromiseExecutorType = ConstructorParameters<typeof Promise<Awaited<T>>>[0];\r\n let resolve!: (value: Awaited<T>) => void;\r\n // let resolve: Parameters<PromiseExecutorType>[0];\r\n let reject!: (reason: any) => void;\r\n // let reject: Parameters<PromiseExecutorType>[1];\r\n\r\n const promise: Mutable<WatchablePromise<Awaited<T>>> = new Promise<Awaited<T>>((res, rej) => {\r\n resolve = res;\r\n reject = rej;\r\n });\r\n\r\n promise.status = \"pending\";\r\n // TODO: create type-safe defineProperty utility method\r\n Object.defineProperty(promise, \"settled\" satisfies keyof typeof promise, {\r\n get: () => promise.status !== \"pending\"\r\n });\r\n\r\n (async () => {\r\n try {\r\n const retValue = (await Promise.resolve(fn())) as Awaited<T>;\r\n resolve(retValue);\r\n promise.result = retValue;\r\n promise.status = \"fulfilled\";\r\n } catch (err) {\r\n reject(err);\r\n promise.result = undefined;\r\n promise.status = \"rejected\";\r\n }\r\n })();\r\n\r\n return promise as WatchablePromise<Awaited<T>>;\r\n}\r\n\r\n// TODO: add Promise.prototype.finally support\r\n\r\n// toTrackable\r\n/** wrap to watchable func */\r\nexport function toWatchable<TArgs extends any[] = any[], T = void>(fn: Func<TArgs, T>): WatchableFunc<TArgs, T> {\r\n // result\r\n let watchable: Func<TArgs, T> & {\r\n executing?: boolean; // running/inProgress/pending\r\n };\r\n const complete = (err?: any) => {\r\n watchable.executing = false;\r\n // watchable result.executing;\r\n if (err) {\r\n // err instanceof Error\r\n throw err; // need to rethrow!\r\n }\r\n };\r\n watchable = (...args) => {\r\n watchable.executing = true;\r\n let isAsyncFn = false;\r\n try {\r\n const fnResult = fn(...args);\r\n if (fnResult instanceof Promise) {\r\n isAsyncFn = true;\r\n fnResult.catch(complete);\r\n fnResult.then(complete);\r\n }\r\n return fnResult;\r\n } finally {\r\n if (!isAsyncFn) {\r\n complete();\r\n }\r\n }\r\n };\r\n return watchable;\r\n}\r\n"],"names":["watch","fn","resolve","reject","promise","res","rej","retValue","err","toWatchable","watchable","complete","args","isAsyncFn","fnResult"],"mappings":"AAmBO,SAASA,EAAgBC,GAAiB;AAE7C,MAAIC,GAEAC;AAGJ,QAAMC,IAAiD,IAAI,QAAoB,CAACC,GAAKC,MAAQ;AACzF,IAAAJ,IAAUG,GACVF,IAASG;AAAA,EACb,CAAC;AAED,SAAAF,EAAQ,SAAS,WAEjB,OAAO,eAAeA,GAAS,WAA0C;AAAA,IACrE,KAAK,MAAMA,EAAQ,WAAW;AAAA,EAAA,CACjC,IAEA,YAAY;AACT,QAAI;AACA,YAAMG,IAAY,MAAM,QAAQ,QAAQN,GAAI;AAC5C,MAAAC,EAAQK,CAAQ,GAChBH,EAAQ,SAASG,GACjBH,EAAQ,SAAS;AAAA,IACrB,SAASI,GAAK;AACV,MAAAL,EAAOK,CAAG,GACVJ,EAAQ,SAAS,QACjBA,EAAQ,SAAS;AAAA,IACrB;AAAA,EACJ,GAAA,GAEOA;AACX;AAMO,SAASK,EAAmDR,GAA6C;AAE5G,MAAIS;AAGJ,QAAMC,IAAW,CAACH,MAAc;AAG5B,QAFAE,EAAU,YAAY,IAElBF;AAEA,YAAMA;AAAA,EAEd;AACA,SAAAE,IAAY,IAAIE,MAAS;AACrB,IAAAF,EAAU,YAAY;AACtB,QAAIG,IAAY;AAChB,QAAI;AACA,YAAMC,IAAWb,EAAG,GAAGW,CAAI;AAC3B,aAAIE,aAAoB,YACpBD,IAAY,IACZC,EAAS,MAAMH,CAAQ,GACvBG,EAAS,KAAKH,CAAQ,IAEnBG;AAAA,IACX,UAAA;AACI,MAAKD,KACDF,EAAA;AAAA,IAER;AAAA,EACJ,GACOD;AACX;"}
1
+ {"version":3,"file":"watchable.es.js","sources":["../src/watchable.ts"],"sourcesContent":["import { Mutable, Executor, Func } from \"./typeCore\";\r\n\r\n// PromiseState\r\nexport type PromiseStatus = \"pending\" | \"fulfilled\" | \"rejected\";\r\n\r\n// TrackablePromise\r\nexport type WatchablePromise<T = void> = PromiseLike<T> & {\r\n readonly status?: PromiseStatus;\r\n readonly settled?: boolean;\r\n readonly result?: T;\r\n};\r\n\r\n// WatchableFn\r\nexport type WatchableFunc<TArgs extends any[] = any[], T = any> = Func<TArgs, T> & {\r\n executing?: boolean; // running/inProgress/pending\r\n};\r\n\r\n// we need promise wrapper because Promise [[PromiseState]] and [[PromiseResult]] symbols are not accessible\r\n// exec and watch/track\r\nexport function watch<T = void>(fn: Executor<T>) {\r\n // type PromiseExecutorType = ConstructorParameters<typeof Promise<Awaited<T>>>[0];\r\n let resolve!: (value: Awaited<T>) => void;\r\n // let resolve: Parameters<PromiseExecutorType>[0];\r\n let reject!: (reason: any) => void;\r\n // let reject: Parameters<PromiseExecutorType>[1];\r\n\r\n const promise: Mutable<WatchablePromise<Awaited<T>>> = new Promise<Awaited<T>>((res, rej) => {\r\n resolve = res;\r\n reject = rej;\r\n });\r\n\r\n promise.status = \"pending\";\r\n // TODO: create type-safe defineProperty utility method\r\n Object.defineProperty(promise, \"settled\" satisfies keyof typeof promise, {\r\n get: () => promise.status !== \"pending\"\r\n });\r\n\r\n (async () => {\r\n try {\r\n const retValue = (await Promise.resolve(fn())) as Awaited<T>;\r\n resolve(retValue);\r\n promise.result = retValue;\r\n promise.status = \"fulfilled\";\r\n } catch (err) {\r\n reject(err);\r\n promise.result = undefined;\r\n promise.status = \"rejected\";\r\n }\r\n })();\r\n\r\n return promise as WatchablePromise<Awaited<T>>;\r\n}\r\n\r\n// TODO: add Promise.prototype.finally support\r\n\r\n// toTrackable\r\n/** wrap to watchable func */\r\nexport function toWatchable<TArgs extends any[] = any[], T = void>(fn: Func<TArgs, T>): WatchableFunc<TArgs, T> {\r\n // result\r\n let watchable: Func<TArgs, T> & {\r\n executing?: boolean; // running/inProgress/pending\r\n };\r\n const complete = (err?: any) => {\r\n watchable.executing = false;\r\n // watchable result.executing;\r\n if (err) {\r\n // err instanceof Error\r\n throw err; // need to rethrow!\r\n }\r\n };\r\n watchable = (...args) => {\r\n watchable.executing = true;\r\n let isAsyncFn = false;\r\n try {\r\n const fnResult = fn(...args);\r\n if (fnResult instanceof Promise) {\r\n isAsyncFn = true;\r\n fnResult.catch(complete);\r\n fnResult.then(complete);\r\n }\r\n return fnResult;\r\n } finally {\r\n if (!isAsyncFn) {\r\n complete();\r\n }\r\n }\r\n };\r\n return watchable;\r\n}\r\n"],"names":["watch","fn","resolve","reject","promise","res","rej","retValue","err","toWatchable","watchable","complete","args","isAsyncFn","fnResult"],"mappings":"AAmBO,SAASA,EAAgBC,GAAiB;AAE7C,MAAIC,GAEAC;AAGJ,QAAMC,IAAiD,IAAI,QAAoB,CAACC,GAAKC,MAAQ;AACzF,IAAAJ,IAAUG,GACVF,IAASG;AAAA,EACb,CAAC;AAED,SAAAF,EAAQ,SAAS,WAEjB,OAAO,eAAeA,GAAS,WAA0C;AAAA,IACrE,KAAK,MAAMA,EAAQ,WAAW;AAAA,EAAA,CACjC,IAEA,YAAY;AACT,QAAI;AACA,YAAMG,IAAY,MAAM,QAAQ,QAAQN,GAAI;AAC5C,MAAAC,EAAQK,CAAQ,GAChBH,EAAQ,SAASG,GACjBH,EAAQ,SAAS;AAAA,IACrB,SAASI,GAAK;AACV,MAAAL,EAAOK,CAAG,GACVJ,EAAQ,SAAS,QACjBA,EAAQ,SAAS;AAAA,IACrB;AAAA,EACJ,GAAA,GAEOA;AACX;AAMO,SAASK,EAAmDR,GAA6C;AAE5G,MAAIS;AAGJ,QAAMC,IAAW,CAACH,MAAc;AAG5B,QAFAE,EAAU,YAAY,IAElBF;AAEA,YAAMA;AAAA,EAEd;AACA,SAAAE,IAAY,IAAIE,MAAS;AACrB,IAAAF,EAAU,YAAY;AACtB,QAAIG,IAAY;AAChB,QAAI;AACA,YAAMC,IAAWb,EAAG,GAAGW,CAAI;AAC3B,aAAIE,aAAoB,YACpBD,IAAY,IACZC,EAAS,MAAMH,CAAQ,GACvBG,EAAS,KAAKH,CAAQ,IAEnBG;AAAA,IACX,UAAA;AACI,MAAKD,KACDF,EAAA;AAAA,IAER;AAAA,EACJ,GACOD;AACX;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actdim/utico",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "description": "A modern foundation toolkit for complex TypeScript apps",
5
5
  "author": "Pavel Borodaev",
6
6
  "license": "Proprietary",
@@ -52,7 +52,6 @@
52
52
  "wtest": "npx vitest --watch",
53
53
  "dtest": "node --inspect-brk node_modules/vitest/vitest.mjs run --poolOptions.threads.singleThread",
54
54
  "lint": "eslint . -f visualstudio --ext .ts,.tsx --report-unused-disable-directives --max-warnings 0",
55
- "online": "vite --host",
56
55
  "build": "tsc -b && vite build",
57
56
  "npm:u": "npm update",
58
57
  "npm:ou": "npm outdated",
@@ -68,8 +67,7 @@
68
67
  "uuid": "^13.0.0"
69
68
  },
70
69
  "devDependencies": {
71
- "@swc/core": "^1.13.5",
72
- "@types/lodash": "^4.17.20",
70
+ "@swc/core": "^1.13.5",
73
71
  "@types/node": "^24.7.0",
74
72
  "@types/uuid": "^11.0.0",
75
73
  "@typescript-eslint/eslint-plugin": "^8.45.0",
@@ -83,6 +81,7 @@
83
81
  "eslint-plugin-react": "^7.37.5",
84
82
  "eslint-plugin-react-hooks": "^6.1.1",
85
83
  "eslint-plugin-react-refresh": "^0.4.23",
84
+ "fake-indexeddb": "^6.2.2",
86
85
  "globals": "^16.4.0",
87
86
  "npm-check-updates": "^19.0.0",
88
87
  "prettier": "^3.6.2",
@@ -1,30 +0,0 @@
1
- import { default as Dexie } from 'dexie';
2
- export interface ICacheEntry {
3
- id: string;
4
- createdAt: number;
5
- accessedAt: number;
6
- slidingExpiration?: number;
7
- expiresAt: number;
8
- }
9
- export interface ICacheDataItem {
10
- readonly id: string;
11
- readonly value: any;
12
- }
13
- export declare class CacheEntry implements ICacheEntry {
14
- id: string;
15
- createdAt: number;
16
- accessedAt: number;
17
- expiresAt: number;
18
- constructor(src: Partial<CacheEntry>);
19
- }
20
- export declare class CacheDataItem implements ICacheDataItem {
21
- id: string;
22
- value: any;
23
- constructor(src: Partial<CacheDataItem>);
24
- }
25
- export declare class CacheDb extends Dexie {
26
- registry: Dexie.Table<ICacheEntry, string>;
27
- data: Dexie.Table<ICacheDataItem, string>;
28
- constructor(dbName: string);
29
- }
30
- //# sourceMappingURL=cacheDb.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cacheDb.d.ts","sourceRoot":"","sources":["../../src/cache/cacheDb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,SAAS,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;CACvB;AAOD,qBAAa,UAAW,YAAW,WAAW;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;gBAEN,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC;CASvC;AAGD,qBAAa,aAAc,YAAW,cAAc;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,GAAG,CAAC;gBAEC,GAAG,EAAE,OAAO,CAAC,aAAa,CAAC;CAQ1C;AAED,qBAAa,OAAQ,SAAQ,KAAK;IAI9B,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBAE9B,MAAM,EAAE,MAAM;CAgD7B"}
@@ -1,47 +0,0 @@
1
- import o from "dexie";
2
- const r = "registry", s = "data", n = ["id", "createdAt", "accessedAt", "expiresAt"], d = ["id", "value"];
3
- class h {
4
- id;
5
- createdAt;
6
- // updatedAt: number;
7
- accessedAt;
8
- expiresAt;
9
- constructor(t) {
10
- Object.assign(this, t);
11
- }
12
- }
13
- class y {
14
- id;
15
- value;
16
- constructor(t) {
17
- Object.assign(this, t);
18
- }
19
- // constructor(key: string, value: string) {
20
- // this.key = key;
21
- // this.value = value;
22
- // }
23
- }
24
- class g extends o {
25
- // private _dbName: string;
26
- // catalog/entries
27
- registry;
28
- data;
29
- constructor(t) {
30
- if (!t)
31
- throw new Error("Invalid database name");
32
- super(t);
33
- const e = this;
34
- e.version(1).stores({
35
- [r]: n.join(", "),
36
- [s]: d.join(", ")
37
- }), this.registry = e.table(r), this.data = e.table(s), e.registry.hook("deleting", async (i, l, c) => {
38
- await c.table(s).delete(i);
39
- });
40
- }
41
- }
42
- export {
43
- y as CacheDataItem,
44
- g as CacheDb,
45
- h as CacheEntry
46
- };
47
- //# sourceMappingURL=cacheDb.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cacheDb.es.js","sources":["D:/Src/my/actdim/public/utico/src/cache/cacheDb.ts"],"sourcesContent":["import Dexie from \"dexie\"; // https://dexie.org/docs/Typescript\r\n\r\nconst registryTableName = \"registry\"; // \"catalog\"\r\nconst dataTableName = \"data\";\r\n\r\nexport interface ICacheEntry {\r\n id: string; // should be called \"id\" for Dexie!\r\n createdAt: number;\r\n // updatedAt: number; // lastModified\r\n accessedAt: number; // lastAccessed/lastAccessTime\r\n slidingExpiration?: number;\r\n // absoluteExpiration?: number;\r\n expiresAt: number; // expiryTime\r\n}\r\n\r\n// ICacheDataRecord\r\nexport interface ICacheDataItem {\r\n readonly id: string;\r\n readonly value: any;\r\n}\r\n\r\n// (registry/catalog)PropertyNames\r\nconst entryPropertyNames: (keyof ICacheEntry)[] = [\"id\", \"createdAt\", \"accessedAt\", \"expiresAt\"];\r\n\r\nconst dataItemPropertyNames: (keyof ICacheDataItem)[] = [\"id\", \"value\"];\r\n\r\nexport class CacheEntry implements ICacheEntry {\r\n id: string;\r\n createdAt: number;\r\n // updatedAt: number;\r\n accessedAt: number;\r\n expiresAt: number;\r\n\r\n constructor(src: Partial<CacheEntry>) {\r\n Object.assign(this, src);\r\n // Define navigation properties.\r\n // Making them non-enumerable will prevent them from being handled by indexedDB\r\n // when doing put() or add().\r\n // Object.defineProperties(this, {\r\n // ...: { value: [], enumerable: false, writable: true }\r\n // });\r\n }\r\n}\r\n\r\n// CacheDataRecord\r\nexport class CacheDataItem implements ICacheDataItem {\r\n id: string;\r\n value: any;\r\n\r\n constructor(src: Partial<CacheDataItem>) {\r\n Object.assign(this, src);\r\n }\r\n\r\n // constructor(key: string, value: string) {\r\n // this.key = key;\r\n // this.value = value;\r\n // }\r\n}\r\n\r\nexport class CacheDb extends Dexie {\r\n // private _dbName: string;\r\n\r\n // catalog/entries\r\n registry: Dexie.Table<ICacheEntry, string>;\r\n data: Dexie.Table<ICacheDataItem, string>;\r\n\r\n constructor(dbName: string) {\r\n // navigator.storage.estimate()\r\n // navigator.webkitTemporaryStorage.queryUsageAndQuota()\r\n\r\n if (!dbName) {\r\n throw new Error(\"Invalid database name\"); // cannot be empty\r\n }\r\n\r\n super(dbName); // {autoOpen: false}\r\n\r\n // this._dbName = dbName;\r\n\r\n const db = this;\r\n\r\n //\r\n // Define tables and indexes\r\n //\r\n\r\n db.version(1).stores({\r\n [registryTableName]: entryPropertyNames.join(\", \"),\r\n [dataTableName]: dataItemPropertyNames.join(\", \")\r\n });\r\n\r\n // db.version(2).stores({\r\n // \t// ...\r\n // }).upgrade(trans => {\r\n // \treturn trans.table(cacheEntryTableName).toCollection().modify((entry: ICacheEntry) => {\r\n // \t\t// ...\r\n // \t});\r\n // });\r\n\r\n this.registry = db.table(registryTableName);\r\n this.data = db.table(dataTableName);\r\n\r\n db.registry.hook(\"deleting\", async (key, obj, transaction) => {\r\n await transaction.table(dataTableName).delete(key);\r\n });\r\n\r\n // db.registry.mapToClass(CacheEntry);\r\n // db.data.mapToClass(CacheDataItem);\r\n\r\n // db.on('populate', () => db.registry.bulkAdd([\r\n // \t// ...\r\n // ]));\r\n\r\n // Dexie.delete(this._dbName);\r\n // this.delete();\r\n }\r\n}\r\n"],"names":["registryTableName","dataTableName","entryPropertyNames","dataItemPropertyNames","CacheEntry","src","CacheDataItem","CacheDb","Dexie","dbName","db","key","obj","transaction"],"mappings":";AAEA,MAAMA,IAAoB,YACpBC,IAAgB,QAmBhBC,IAA4C,CAAC,MAAM,aAAa,cAAc,WAAW,GAEzFC,IAAkD,CAAC,MAAM,OAAO;AAE/D,MAAMC,EAAkC;AAAA,EAC3C;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA,YAAYC,GAA0B;AAClC,WAAO,OAAO,MAAMA,CAAG;AAAA,EAO3B;AACJ;AAGO,MAAMC,EAAwC;AAAA,EACjD;AAAA,EACA;AAAA,EAEA,YAAYD,GAA6B;AACrC,WAAO,OAAO,MAAMA,CAAG;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAMJ;AAEO,MAAME,UAAgBC,EAAM;AAAA;AAAA;AAAA,EAI/B;AAAA,EACA;AAAA,EAEA,YAAYC,GAAgB;AAIxB,QAAI,CAACA;AACD,YAAM,IAAI,MAAM,uBAAuB;AAG3C,UAAMA,CAAM;AAIZ,UAAMC,IAAK;AAMX,IAAAA,EAAG,QAAQ,CAAC,EAAE,OAAO;AAAA,MACjB,CAACV,CAAiB,GAAGE,EAAmB,KAAK,IAAI;AAAA,MACjD,CAACD,CAAa,GAAGE,EAAsB,KAAK,IAAI;AAAA,IAAA,CACnD,GAUD,KAAK,WAAWO,EAAG,MAAMV,CAAiB,GAC1C,KAAK,OAAOU,EAAG,MAAMT,CAAa,GAElCS,EAAG,SAAS,KAAK,YAAY,OAAOC,GAAKC,GAAKC,MAAgB;AAC1D,YAAMA,EAAY,MAAMZ,CAAa,EAAE,OAAOU,CAAG;AAAA,IACrD,CAAC;AAAA,EAWL;AACJ;"}
@@ -1,11 +0,0 @@
1
- import { IPersistentStorage } from './storageContracts';
2
- export declare class PersistentStorage<T> implements IPersistentStorage {
3
- private slotName;
4
- private useEncryption;
5
- constructor(useEncryption?: boolean, slotName?: string);
6
- getKeyInSlot(key: string): string;
7
- get(key: string, useEncryption?: boolean): string;
8
- set(key: string, value: string, useEncryption?: boolean): void;
9
- remove(key: string): void;
10
- }
11
- //# sourceMappingURL=persistentStorage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persistentStorage.d.ts","sourceRoot":"","sources":["../../src/storage/persistentStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAuBxD,qBAAa,iBAAiB,CAAC,CAAC,CAAE,YAAW,kBAAkB;IAC3D,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,aAAa,CAAU;gBAEnB,aAAa,UAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM;IAKpD,YAAY,CAAC,GAAG,EAAE,MAAM;IAIxB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,UAAqB,GAAG,MAAM;IAc5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,UAAqB;IASlE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAI5B"}
@@ -1,25 +0,0 @@
1
- class r {
2
- slotName;
3
- useEncryption;
4
- constructor(t = !1, e) {
5
- this.useEncryption = t, this.slotName = e || "";
6
- }
7
- getKeyInSlot(t) {
8
- return this.slotName ? `${this.slotName}/${t}` : t;
9
- }
10
- get(t, e = this.useEncryption) {
11
- t = this.getKeyInSlot(t);
12
- let o = localStorage.getItem(t);
13
- return o && (e && (o = window.atob(o)), o);
14
- }
15
- set(t, e, o = this.useEncryption) {
16
- t = this.getKeyInSlot(t), o && (e = window.btoa(e)), localStorage.setItem(t, e);
17
- }
18
- remove(t) {
19
- t = this.getKeyInSlot(t), localStorage.removeItem(t);
20
- }
21
- }
22
- export {
23
- r as PersistentStorage
24
- };
25
- //# sourceMappingURL=persistentStorage.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persistentStorage.es.js","sources":["D:/Src/my/actdim/public/utico/src/storage/persistentStorage.ts"],"sourcesContent":["// TODO: implement real encryption:\r\n// https://stackoverflow.com/questions/18279141/javascript-string-encryption-and-decryption\r\n\r\nimport { IPersistentStorage } from \"./storageContracts\";\r\n\r\n/*\r\n(async () => {\r\n const alreadyPersisted = await window.navigator.storage?.persisted()\r\n\r\n if (alreadyPersisted) {\r\n return;\r\n }\r\n\r\n const persistentModeEnabled = await window.navigator.storage?.persist()\r\n\r\n if (!persistentModeEnabled) { \r\n // Storage may be cleared by the UA under storage pressure\r\n } else {\r\n // Storage will be persistent\r\n // Storage will not be cleared except by explicit user action\r\n }\r\n})();\r\n*/\r\n\r\n// TODO: remove class, create factory method\r\n// TODO: support Indexed DB\r\nexport class PersistentStorage<T> implements IPersistentStorage {\r\n private slotName: string;\r\n\r\n private useEncryption: boolean;\r\n\r\n constructor(useEncryption = false, slotName?: string) {\r\n this.useEncryption = useEncryption;\r\n this.slotName = slotName || \"\";\r\n }\r\n\r\n getKeyInSlot(key: string) {\r\n return this.slotName ? `${this.slotName}/${key}` : key;\r\n }\r\n\r\n get(key: string, useEncryption = this.useEncryption): string {\r\n key = this.getKeyInSlot(key);\r\n let value = localStorage.getItem(key);\r\n if (!value) {\r\n return value;\r\n }\r\n // localStorage.setItem(key, value);\r\n if (useEncryption) {\r\n // decrypt\r\n value = window.atob(value);\r\n }\r\n return value;\r\n }\r\n\r\n set(key: string, value: string, useEncryption = this.useEncryption) {\r\n key = this.getKeyInSlot(key);\r\n if (useEncryption) {\r\n // encrypt\r\n value = window.btoa(value);\r\n }\r\n localStorage.setItem(key, value);\r\n }\r\n\r\n remove(key: string): void {\r\n key = this.getKeyInSlot(key);\r\n localStorage.removeItem(key);\r\n }\r\n}\r\n"],"names":["PersistentStorage","useEncryption","slotName","key","value"],"mappings":"AA0BO,MAAMA,EAAmD;AAAA,EACpD;AAAA,EAEA;AAAA,EAER,YAAYC,IAAgB,IAAOC,GAAmB;AAClD,SAAK,gBAAgBD,GACrB,KAAK,WAAWC,KAAY;AAAA,EAChC;AAAA,EAEA,aAAaC,GAAa;AACtB,WAAO,KAAK,WAAW,GAAG,KAAK,QAAQ,IAAIA,CAAG,KAAKA;AAAA,EACvD;AAAA,EAEA,IAAIA,GAAaF,IAAgB,KAAK,eAAuB;AACzD,IAAAE,IAAM,KAAK,aAAaA,CAAG;AAC3B,QAAIC,IAAQ,aAAa,QAAQD,CAAG;AACpC,WAAKC,MAIDH,MAEAG,IAAQ,OAAO,KAAKA,CAAK,IAEtBA;AAAA,EACX;AAAA,EAEA,IAAID,GAAaC,GAAeH,IAAgB,KAAK,eAAe;AAChE,IAAAE,IAAM,KAAK,aAAaA,CAAG,GACvBF,MAEAG,IAAQ,OAAO,KAAKA,CAAK,IAE7B,aAAa,QAAQD,GAAKC,CAAK;AAAA,EACnC;AAAA,EAEA,OAAOD,GAAmB;AACtB,IAAAA,IAAM,KAAK,aAAaA,CAAG,GAC3B,aAAa,WAAWA,CAAG;AAAA,EAC/B;AACJ;"}
@@ -1,6 +0,0 @@
1
- export type IPersistentStorage = {
2
- get(key: string, useEncryption?: boolean): string;
3
- set(key: string, value: string, useEncryption?: boolean): void;
4
- remove(key: string): void;
5
- };
6
- //# sourceMappingURL=storageContracts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storageContracts.d.ts","sourceRoot":"","sources":["../../src/storage/storageContracts.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,kBAAkB,GAAG;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAA"}
@@ -1,2 +0,0 @@
1
-
2
- //# sourceMappingURL=storageContracts.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storageContracts.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}