@actdim/utico 0.9.2 → 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 (55) hide show
  1. package/dist/arrayExtensions.es.js.map +1 -1
  2. package/dist/cache/memoryCache.es.js +5 -8
  3. package/dist/cache/memoryCache.es.js.map +1 -1
  4. package/dist/cache/persistentCache.d.ts +15 -19
  5. package/dist/cache/persistentCache.d.ts.map +1 -1
  6. package/dist/cache/persistentCache.es.js +80 -93
  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 +11 -11
  10. package/dist/dateTimeDataFormat.es.js.map +1 -1
  11. package/dist/gfx/canvasUtils.d.ts +8 -2
  12. package/dist/gfx/canvasUtils.d.ts.map +1 -1
  13. package/dist/gfx/canvasUtils.es.js +85 -74
  14. package/dist/gfx/canvasUtils.es.js.map +1 -1
  15. package/dist/gfx/color.es.js +1 -2
  16. package/dist/gfx/color.es.js.map +1 -1
  17. package/dist/i18n/enUsCulture.es.js.map +1 -1
  18. package/dist/math.es.js.map +1 -1
  19. package/dist/metadata.es.js.map +1 -1
  20. package/dist/mutex.es.js +3 -8
  21. package/dist/mutex.es.js.map +1 -1
  22. package/dist/store/dataStore.d.ts +33 -0
  23. package/dist/store/dataStore.d.ts.map +1 -0
  24. package/dist/store/dataStore.es.js +49 -0
  25. package/dist/store/dataStore.es.js.map +1 -0
  26. package/dist/store/persistentStore.d.ts +20 -0
  27. package/dist/store/persistentStore.d.ts.map +1 -0
  28. package/dist/store/persistentStore.es.js +96 -0
  29. package/dist/store/persistentStore.es.js.map +1 -0
  30. package/dist/store/storeContracts.d.ts +6 -0
  31. package/dist/store/storeContracts.d.ts.map +1 -0
  32. package/dist/store/storeContracts.es.js +2 -0
  33. package/dist/store/storeContracts.es.js.map +1 -0
  34. package/dist/stringCore.es.js.map +1 -1
  35. package/dist/structEvent.es.js +12 -16
  36. package/dist/structEvent.es.js.map +1 -1
  37. package/dist/typeUtils.es.js.map +1 -1
  38. package/dist/utils.d.ts +1 -0
  39. package/dist/utils.d.ts.map +1 -1
  40. package/dist/utils.es.js +44 -36
  41. package/dist/utils.es.js.map +1 -1
  42. package/dist/watchable.es.js.map +1 -1
  43. package/package.json +16 -14
  44. package/dist/cache/cacheDb.d.ts +0 -30
  45. package/dist/cache/cacheDb.d.ts.map +0 -1
  46. package/dist/cache/cacheDb.es.js +0 -50
  47. package/dist/cache/cacheDb.es.js.map +0 -1
  48. package/dist/storage/persistentStorage.d.ts +0 -11
  49. package/dist/storage/persistentStorage.d.ts.map +0 -1
  50. package/dist/storage/persistentStorage.es.js +0 -28
  51. package/dist/storage/persistentStorage.es.js.map +0 -1
  52. package/dist/storage/storageContracts.d.ts +0 -6
  53. package/dist/storage/storageContracts.d.ts.map +0 -1
  54. package/dist/storage/storageContracts.es.js +0 -2
  55. package/dist/storage/storageContracts.es.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"arrayExtensions.es.js","sources":["../src/arrayExtensions.ts"],"sourcesContent":["\r\ninterface Array<T> {\r\n find(callback: (element: T, index: number, array: Array<T>) => boolean): T; // aka firstOrDefault\r\n unfold<TItem>(callback: (element: T) => Array<TItem>): Array<TItem>; // aka selectMany\r\n max<TItem>(selector: (element: T) => TItem, defaultValue?: any): TItem;\r\n min<TItem>(selector: (element: T) => TItem, defaultValue?: any): TItem;\r\n orderBy<TItem>(selector: (element: T) => TItem): Array<T>;\r\n groupBy(selector: (element: T) => string): { [key: string]: Array<T> };\r\n // groupBy(key: string): { [key: string]: Array<T> };\t\r\n orderByDesc<TItem>(selector: (element: T) => TItem): Array<T>;\r\n distinct(): Array<T>; // unique\r\n distinct<TItem>(selector: (element: T) => TItem): Array<T>; // distinctBy/uniqueBy\r\n // TODO: pushMany aka addRange\r\n /** NOTE: there is no native array copy method (all existing methods rely on spread) */\r\n copy(src: any[], srcIndex?: number, dstIndex?: number, length?: number): this; // copyFrom\r\n copyTo(dst: any[], srcIndex?: number, dstIndex?: number, length?: number): this;\r\n}\r\n\r\n// Comparers\r\nclass Sorters {\r\n static asc(a: any, b: any) {\r\n // comparison\r\n return (a === b) ? 0\r\n : (a > b) ? 1\r\n : -1;\r\n // if (a < b) {\r\n // return -1;\r\n // }\r\n // if (a > b) {\r\n // return 1;\r\n // }\r\n // // a must be equal to b\r\n // return 0;\r\n // localeCompare?\r\n // numeric: a - b\r\n }\r\n\r\n static desc(a: any, b: any) {\r\n return -Sorters.asc(a, b);\r\n // return Sorters.asc(b, a);\r\n }\r\n}\r\n\r\nArray.prototype.unfold = function (callback: (element: any) => any[]): any[] {\r\n return this.reduce((res, element) => {\r\n Array.prototype.push.apply(res, callback(element));\r\n return res;\r\n }, []);\r\n};\r\n\r\nArray.prototype.max = function (selector: (element: any) => any, defaultValue?: any): any {\r\n if (this.length == 0) {\r\n return defaultValue;\r\n }\r\n return this.map(selector).sort(Sorters.desc)[0];\r\n\r\n // return this.reduce((x, el) => {\r\n // let order = el.Order();\r\n // return x == undefined ? order : (order > x ? order : o);\r\n // }, undefined);\r\n};\r\n\r\nArray.prototype.min = function (selector: (element: any) => any, defaultValue?: any): any {\r\n if (this.length == 0) {\r\n return defaultValue;\r\n }\r\n return this.map(selector).sort(Sorters.asc)[0];\r\n};\r\n\r\nArray.prototype.orderBy = function (selector: (element: any) => any): any[] {\r\n return this.slice(0).sort((a, b) => Sorters.asc(selector(a), selector(b)));\r\n};\r\n\r\nArray.prototype.orderByDesc = function (selector: (element: any) => any): any[] {\r\n return this.slice(0).sort((a, b) => Sorters.desc(selector(a), selector(b)));\r\n};\r\n\r\n// Array.prototype.groupBy = function (key: string): { [key: string]: any[] } {\r\n// \treturn this.reduce((result, item) => {\r\n// \t\tconst value = item[key].toString();\r\n// \t\t(result[item[key]] = result[item[key]] || []).push(item);\r\n// \t\treturn result;\r\n// \t}, {});\r\n// };\r\n\r\nArray.prototype.groupBy = function (selector: (element: any) => string): { [key: string]: any[] } {\r\n return this.reduce((result, item) => {\r\n const value = selector(item); //.toString()\r\n (result[value] = result[value] || []).push(item);\r\n return result;\r\n }, {});\r\n};\r\n\r\nclass Filters {\r\n static notNull(element: any): boolean {\r\n return element != null;\r\n }\r\n\r\n static notUndefined(element: any): boolean { // notMissing\r\n return element != undefined;\r\n }\r\n\r\n static notEmpty(element: any): boolean {\r\n return element !== '';\r\n }\r\n\r\n // unique\r\n static distinct(element, index, self) {\r\n return self.indexOf(element) === index;\r\n }\r\n}\r\n\r\n// distinctBy/uniqueBy\r\nArray.prototype.distinct = function (selector?: (element: any) => any): any[] {\r\n if (!selector) {\r\n return this.filter(Filters.distinct);\r\n // return this.sort().filter(function (element, index, self) {\r\n // return !index || element != self[index - 1];\r\n // });\r\n }\r\n\r\n // let keys = {}; // elements/items\r\n // return this.filter(function (element) {\r\n // const key = selector(element);\r\n // return keys.hasOwnProperty(key) ? false : (keys[key] = true);\r\n // });\r\n\r\n let keys = []; // elements/items\r\n return this.filter(function (element) {\r\n const key = selector(element);\r\n return keys.indexOf(key) >= 0 ? false : keys.push(key);\r\n });\r\n};\r\n\r\n// copyFrom\r\nArray.prototype.copy = function (src: any[], srcIndex = 0, dstIndex = 0, length?: number) {\r\n return copyArray(src, this, srcIndex, dstIndex, length);\r\n}\r\n\r\nArray.prototype.copyTo = function (dst: any[], srcIndex = 0, dstIndex = 0, length?: number) {\r\n return copyArray(this, dst, srcIndex, dstIndex, length);\r\n}\r\n\r\nfunction copyArray(src: any[], dst: any[], srcIndex = 0, dstIndex = 0, length?: number) {\r\n if (srcIndex == undefined || srcIndex < 0) {\r\n srcIndex = 0;\r\n }\r\n if (dstIndex == undefined || dstIndex < 0) {\r\n dstIndex = 0;\r\n }\r\n if (length == undefined) {\r\n length = Math.min(src.length, src.length - srcIndex);\r\n }\r\n let j = dstIndex;\r\n for (let i = srcIndex; i < length; i++) {\r\n dst[j] = src[i];\r\n j++;\r\n }\r\n return dst;\r\n}"],"names":["Sorters","a","b","callback","res","element","selector","defaultValue","result","item","value","Filters","index","self","keys","key","src","srcIndex","dstIndex","length","copyArray","dst","j","i"],"mappings":"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"}
1
+ {"version":3,"file":"arrayExtensions.es.js","sources":["../src/arrayExtensions.ts"],"sourcesContent":["\r\ninterface Array<T> {\r\n find(callback: (element: T, index: number, array: Array<T>) => boolean): T; // aka firstOrDefault\r\n unfold<TItem>(callback: (element: T) => Array<TItem>): Array<TItem>; // aka selectMany\r\n max<TItem>(selector: (element: T) => TItem, defaultValue?: any): TItem;\r\n min<TItem>(selector: (element: T) => TItem, defaultValue?: any): TItem;\r\n orderBy<TItem>(selector: (element: T) => TItem): Array<T>;\r\n groupBy(selector: (element: T) => string): { [key: string]: Array<T> };\r\n // groupBy(key: string): { [key: string]: Array<T> };\t\r\n orderByDesc<TItem>(selector: (element: T) => TItem): Array<T>;\r\n distinct(): Array<T>; // unique\r\n distinct<TItem>(selector: (element: T) => TItem): Array<T>; // distinctBy/uniqueBy\r\n // TODO: pushMany aka addRange\r\n /** NOTE: there is no native array copy method (all existing methods rely on spread) */\r\n copy(src: any[], srcIndex?: number, dstIndex?: number, length?: number): this; // copyFrom\r\n copyTo(dst: any[], srcIndex?: number, dstIndex?: number, length?: number): this;\r\n}\r\n\r\n// Comparers\r\nclass Sorters {\r\n static asc(a: any, b: any) {\r\n // comparison\r\n return (a === b) ? 0\r\n : (a > b) ? 1\r\n : -1;\r\n // if (a < b) {\r\n // return -1;\r\n // }\r\n // if (a > b) {\r\n // return 1;\r\n // }\r\n // // a must be equal to b\r\n // return 0;\r\n // localeCompare?\r\n // numeric: a - b\r\n }\r\n\r\n static desc(a: any, b: any) {\r\n return -Sorters.asc(a, b);\r\n // return Sorters.asc(b, a);\r\n }\r\n}\r\n\r\nArray.prototype.unfold = function (callback: (element: any) => any[]): any[] {\r\n return this.reduce((res, element) => {\r\n Array.prototype.push.apply(res, callback(element));\r\n return res;\r\n }, []);\r\n};\r\n\r\nArray.prototype.max = function (selector: (element: any) => any, defaultValue?: any): any {\r\n if (this.length == 0) {\r\n return defaultValue;\r\n }\r\n return this.map(selector).sort(Sorters.desc)[0];\r\n\r\n // return this.reduce((x, el) => {\r\n // let order = el.Order();\r\n // return x == undefined ? order : (order > x ? order : o);\r\n // }, undefined);\r\n};\r\n\r\nArray.prototype.min = function (selector: (element: any) => any, defaultValue?: any): any {\r\n if (this.length == 0) {\r\n return defaultValue;\r\n }\r\n return this.map(selector).sort(Sorters.asc)[0];\r\n};\r\n\r\nArray.prototype.orderBy = function (selector: (element: any) => any): any[] {\r\n return this.slice(0).sort((a, b) => Sorters.asc(selector(a), selector(b)));\r\n};\r\n\r\nArray.prototype.orderByDesc = function (selector: (element: any) => any): any[] {\r\n return this.slice(0).sort((a, b) => Sorters.desc(selector(a), selector(b)));\r\n};\r\n\r\n// Array.prototype.groupBy = function (key: string): { [key: string]: any[] } {\r\n// \treturn this.reduce((result, item) => {\r\n// \t\tconst value = item[key].toString();\r\n// \t\t(result[item[key]] = result[item[key]] || []).push(item);\r\n// \t\treturn result;\r\n// \t}, {});\r\n// };\r\n\r\nArray.prototype.groupBy = function (selector: (element: any) => string): { [key: string]: any[] } {\r\n return this.reduce((result, item) => {\r\n const value = selector(item); //.toString()\r\n (result[value] = result[value] || []).push(item);\r\n return result;\r\n }, {});\r\n};\r\n\r\nclass Filters {\r\n static notNull(element: any): boolean {\r\n return element != null;\r\n }\r\n\r\n static notUndefined(element: any): boolean { // notMissing\r\n return element != undefined;\r\n }\r\n\r\n static notEmpty(element: any): boolean {\r\n return element !== '';\r\n }\r\n\r\n // unique\r\n static distinct(element, index, self) {\r\n return self.indexOf(element) === index;\r\n }\r\n}\r\n\r\n// distinctBy/uniqueBy\r\nArray.prototype.distinct = function (selector?: (element: any) => any): any[] {\r\n if (!selector) {\r\n return this.filter(Filters.distinct);\r\n // return this.sort().filter(function (element, index, self) {\r\n // return !index || element != self[index - 1];\r\n // });\r\n }\r\n\r\n // let keys = {}; // elements/items\r\n // return this.filter(function (element) {\r\n // const key = selector(element);\r\n // return keys.hasOwnProperty(key) ? false : (keys[key] = true);\r\n // });\r\n\r\n let keys = []; // elements/items\r\n return this.filter(function (element) {\r\n const key = selector(element);\r\n return keys.indexOf(key) >= 0 ? false : keys.push(key);\r\n });\r\n};\r\n\r\n// copyFrom\r\nArray.prototype.copy = function (src: any[], srcIndex = 0, dstIndex = 0, length?: number) {\r\n return copyArray(src, this, srcIndex, dstIndex, length);\r\n}\r\n\r\nArray.prototype.copyTo = function (dst: any[], srcIndex = 0, dstIndex = 0, length?: number) {\r\n return copyArray(this, dst, srcIndex, dstIndex, length);\r\n}\r\n\r\nfunction copyArray(src: any[], dst: any[], srcIndex = 0, dstIndex = 0, length?: number) {\r\n if (srcIndex == undefined || srcIndex < 0) {\r\n srcIndex = 0;\r\n }\r\n if (dstIndex == undefined || dstIndex < 0) {\r\n dstIndex = 0;\r\n }\r\n if (length == undefined) {\r\n length = Math.min(src.length, src.length - srcIndex);\r\n }\r\n let j = dstIndex;\r\n for (let i = srcIndex; i < length; i++) {\r\n dst[j] = src[i];\r\n j++;\r\n }\r\n return dst;\r\n}"],"names":["Sorters","a","b","callback","res","element","selector","defaultValue","result","item","value","Filters","index","self","keys","key","src","srcIndex","dstIndex","length","copyArray","dst","j","i"],"mappings":"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"}
@@ -1,9 +1,6 @@
1
- var n = Object.defineProperty;
2
- var r = (s, t, e) => t in s ? n(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;
3
- var i = (s, t, e) => r(s, typeof t != "symbol" ? t + "" : t, e);
4
- class h {
1
+ class s {
2
+ map;
5
3
  constructor() {
6
- i(this, "map");
7
4
  this.map = /* @__PURE__ */ new Map();
8
5
  }
9
6
  get keys() {
@@ -46,9 +43,9 @@ class h {
46
43
  return this.map.entries();
47
44
  }
48
45
  }
49
- const m = new h();
46
+ const n = new s();
50
47
  export {
51
- h as MemoryCache,
52
- m as globalMemoryCache
48
+ s as MemoryCache,
49
+ n as globalMemoryCache
53
50
  };
54
51
  //# sourceMappingURL=memoryCache.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memoryCache.es.js","sources":["../../src/cache/memoryCache.ts"],"sourcesContent":["export interface IMemoryCache<TKey = any, TValue = any> {\r\n get keys(): Iterable<TKey>;\r\n\tgetKeys: () => Iterable<TKey>;\r\n\r\n get: (key: TKey) => TValue;\r\n\r\n contains: (key: TKey) => boolean;\r\n\r\n remove: (key: TKey) => void;\r\n\r\n set: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => void;\r\n\r\n\tget values(): Iterable<TValue>;\r\n getValues: () => Iterable<TValue>;\r\n\r\n getOrSet: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => TValue;\r\n\r\n clear: () => void;\r\n\r\n\tget entries(): Iterable<[TKey, TValue]>;\r\n getEntries: () => Iterable<[TKey, TValue]>;\r\n}\r\n\r\n// TODO: remove class, create factory method\r\nexport class MemoryCache<TKey = any, TValue = any> implements IMemoryCache {\r\n private map: Map<TKey, TValue>;\r\n\r\n constructor() {\r\n this.map = new Map<TKey, TValue>();\r\n }\r\n\r\n get keys() {\r\n return this.map.keys();\r\n }\r\n\r\n getKeys() {\r\n return this.keys;\r\n }\r\n\r\n get(key: TKey) {\r\n return this.map.get(key);\r\n }\r\n\r\n contains(key: TKey) {\r\n return this.map.has(key);\r\n }\r\n\r\n remove(key: TKey) {\r\n this.map.delete(key);\r\n }\r\n\r\n set(key: TKey, valueOrValueFactory: TValue | (() => TValue)) {\r\n if (valueOrValueFactory instanceof Function) {\r\n this.map.set(key, valueOrValueFactory());\r\n } else {\r\n this.map.set(key, valueOrValueFactory);\r\n }\r\n }\r\n\r\n get values() {\r\n return this.getValues();\r\n }\r\n\r\n getValues() {\r\n return this.values;\r\n }\r\n\r\n getOrSet(key: TKey, valueOrValueFactory: TValue | (() => TValue)) {\r\n if (!this.contains(key)) {\r\n // this.set(key, valueOrValueFactory);\r\n\t\t\tif (valueOrValueFactory instanceof Function) {\r\n // typeof valueOrValueFactory === \"function\"\r\n this.map.set(key, valueOrValueFactory());\r\n } else {\r\n this.map.set(key, valueOrValueFactory);\r\n }\r\n }\r\n return this.get(key);\r\n }\r\n\r\n clear() {\r\n this.map.clear();\r\n }\r\n\r\n get size() {\r\n return this.map.size;\r\n }\r\n\r\n getEntries() {\r\n return this.entries;\r\n }\r\n\r\n get entries() {\r\n return this.map.entries();\r\n }\r\n}\r\n\r\nexport const globalMemoryCache = new MemoryCache();"],"names":["MemoryCache","__publicField","key","valueOrValueFactory","globalMemoryCache"],"mappings":";;;AAwBO,MAAMA,EAA8D;AAAA,EAGvE,cAAc;AAFN,IAAAC,EAAA;AAGC,SAAA,0BAAU;EACnB;AAAA,EAEA,IAAI,OAAO;AACA,WAAA,KAAK,IAAI;EACpB;AAAA,EAEA,UAAU;AACN,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAIC,GAAW;AACJ,WAAA,KAAK,IAAI,IAAIA,CAAG;AAAA,EAC3B;AAAA,EAEA,SAASA,GAAW;AACT,WAAA,KAAK,IAAI,IAAIA,CAAG;AAAA,EAC3B;AAAA,EAEA,OAAOA,GAAW;AACT,SAAA,IAAI,OAAOA,CAAG;AAAA,EACvB;AAAA,EAEA,IAAIA,GAAWC,GAA8C;AACzD,IAAIA,aAA+B,WAC/B,KAAK,IAAI,IAAID,GAAKC,EAAqB,CAAA,IAElC,KAAA,IAAI,IAAID,GAAKC,CAAmB;AAAA,EAE7C;AAAA,EAEA,IAAI,SAAS;AACT,WAAO,KAAK;EAChB;AAAA,EAEA,YAAY;AACR,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAASD,GAAWC,GAA8C;AAC9D,WAAK,KAAK,SAASD,CAAG,MAEvBC,aAA+B,WAEtB,KAAK,IAAI,IAAID,GAAKC,EAAqB,CAAA,IAElC,KAAA,IAAI,IAAID,GAAKC,CAAmB,IAGtC,KAAK,IAAID,CAAG;AAAA,EACvB;AAAA,EAEA,QAAQ;AACJ,SAAK,IAAI;EACb;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAEA,aAAa;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU;AACH,WAAA,KAAK,IAAI;EACpB;AACJ;AAEa,MAAAE,IAAoB,IAAIJ,EAAY;"}
1
+ {"version":3,"file":"memoryCache.es.js","sources":["../../src/cache/memoryCache.ts"],"sourcesContent":["export interface IMemoryCache<TKey = any, TValue = any> {\r\n get keys(): Iterable<TKey>;\r\n\tgetKeys: () => Iterable<TKey>;\r\n\r\n get: (key: TKey) => TValue;\r\n\r\n contains: (key: TKey) => boolean;\r\n\r\n remove: (key: TKey) => void;\r\n\r\n set: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => void;\r\n\r\n\tget values(): Iterable<TValue>;\r\n getValues: () => Iterable<TValue>;\r\n\r\n getOrSet: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => TValue;\r\n\r\n clear: () => void;\r\n\r\n\tget entries(): Iterable<[TKey, TValue]>;\r\n getEntries: () => Iterable<[TKey, TValue]>;\r\n}\r\n\r\n// TODO: remove class, create factory method\r\nexport class MemoryCache<TKey = any, TValue = any> implements IMemoryCache {\r\n private map: Map<TKey, TValue>;\r\n\r\n constructor() {\r\n this.map = new Map<TKey, TValue>();\r\n }\r\n\r\n get keys() {\r\n return this.map.keys();\r\n }\r\n\r\n getKeys() {\r\n return this.keys;\r\n }\r\n\r\n get(key: TKey) {\r\n return this.map.get(key);\r\n }\r\n\r\n contains(key: TKey) {\r\n return this.map.has(key);\r\n }\r\n\r\n remove(key: TKey) {\r\n this.map.delete(key);\r\n }\r\n\r\n set(key: TKey, valueOrValueFactory: TValue | (() => TValue)) {\r\n if (valueOrValueFactory instanceof Function) {\r\n this.map.set(key, valueOrValueFactory());\r\n } else {\r\n this.map.set(key, valueOrValueFactory);\r\n }\r\n }\r\n\r\n get values() {\r\n return this.getValues();\r\n }\r\n\r\n getValues() {\r\n return this.values;\r\n }\r\n\r\n getOrSet(key: TKey, valueOrValueFactory: TValue | (() => TValue)) {\r\n if (!this.contains(key)) {\r\n // this.set(key, valueOrValueFactory);\r\n\t\t\tif (valueOrValueFactory instanceof Function) {\r\n // typeof valueOrValueFactory === \"function\"\r\n this.map.set(key, valueOrValueFactory());\r\n } else {\r\n this.map.set(key, valueOrValueFactory);\r\n }\r\n }\r\n return this.get(key);\r\n }\r\n\r\n clear() {\r\n this.map.clear();\r\n }\r\n\r\n get size() {\r\n return this.map.size;\r\n }\r\n\r\n getEntries() {\r\n return this.entries;\r\n }\r\n\r\n get entries() {\r\n return this.map.entries();\r\n }\r\n}\r\n\r\nexport const globalMemoryCache = new MemoryCache();"],"names":["MemoryCache","key","valueOrValueFactory","globalMemoryCache"],"mappings":"AAwBO,MAAMA,EAA8D;AAAA,EAC/D;AAAA,EAER,cAAc;AACV,SAAK,0BAAU,IAAA;AAAA,EACnB;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,IAAI,KAAA;AAAA,EACpB;AAAA,EAEA,UAAU;AACN,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAIC,GAAW;AACX,WAAO,KAAK,IAAI,IAAIA,CAAG;AAAA,EAC3B;AAAA,EAEA,SAASA,GAAW;AAChB,WAAO,KAAK,IAAI,IAAIA,CAAG;AAAA,EAC3B;AAAA,EAEA,OAAOA,GAAW;AACd,SAAK,IAAI,OAAOA,CAAG;AAAA,EACvB;AAAA,EAEA,IAAIA,GAAWC,GAA8C;AACzD,IAAIA,aAA+B,WAC/B,KAAK,IAAI,IAAID,GAAKC,EAAA,CAAqB,IAEvC,KAAK,IAAI,IAAID,GAAKC,CAAmB;AAAA,EAE7C;AAAA,EAEA,IAAI,SAAS;AACT,WAAO,KAAK,UAAA;AAAA,EAChB;AAAA,EAEA,YAAY;AACR,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAASD,GAAWC,GAA8C;AAC9D,WAAK,KAAK,SAASD,CAAG,MAEvBC,aAA+B,WAEtB,KAAK,IAAI,IAAID,GAAKC,EAAA,CAAqB,IAEvC,KAAK,IAAI,IAAID,GAAKC,CAAmB,IAGtC,KAAK,IAAID,CAAG;AAAA,EACvB;AAAA,EAEA,QAAQ;AACJ,SAAK,IAAI,MAAA;AAAA,EACb;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAEA,aAAa;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU;AACV,WAAO,KAAK,IAAI,QAAA;AAAA,EACpB;AACJ;AAEO,MAAME,IAAoB,IAAIH,EAAA;"}
@@ -1,4 +1,4 @@
1
- import { CacheDb, ICacheEntry, ICacheDataItem } from './cacheDb';
1
+ import { IDataEntry, IDataItem } from '../store/dataStore';
2
2
  import { StructEventTarget } from '../structEvent';
3
3
  type Duration = number | {
4
4
  seconds?: number;
@@ -14,7 +14,7 @@ export type CacheOptions = {
14
14
  slidingExpiration?: Date | number;
15
15
  };
16
16
  export type CacheEvictionEvent = {
17
- entry: ICacheEntry;
17
+ entry: IDataEntry;
18
18
  keepAliveOptions?: CacheOptions;
19
19
  };
20
20
  type PersistentCacheEventStruct = {
@@ -25,26 +25,22 @@ export declare class PersistentCache extends StructEventTarget<PersistentCacheEv
25
25
  private _isDisposed;
26
26
  private _jobTimerId;
27
27
  private readonly _options;
28
- constructor(db: CacheDb, options: PersistentCacheOptions);
28
+ constructor(name: string, options: PersistentCacheOptions);
29
29
  scheduleServiceJob(): void;
30
- deleteExpired(date?: Date): Promise<string[]>;
30
+ deleteExpiredAsync(date?: Date): Promise<string[]>;
31
31
  dispose(): void;
32
- private exec;
33
- getKeys(): Promise<string[]>;
34
- get(key: string): Promise<Readonly<ICacheEntry & ICacheDataItem>>;
35
- bulkGet(ids: string[]): Promise<{
36
- [key: string]: Readonly<ICacheEntry & ICacheDataItem>;
32
+ private execAsync;
33
+ getKeysAsync(): Promise<string[]>;
34
+ getAsync(key: string): Promise<Readonly<IDataEntry & IDataItem>>;
35
+ bulkGetAsync(ids: string[]): Promise<{
36
+ [key: string]: Readonly<IDataEntry & IDataItem>;
37
37
  }>;
38
- getValue(key: string, defaultValue?: any): Promise<any>;
39
- bulkGetValues(ids: string[]): Promise<{
40
- [kes: string]: any;
41
- }>;
42
- contains(key: string): Promise<boolean>;
43
- delete(id: string): Promise<void>;
44
- bulkDelete(ids: string[]): Promise<void>;
45
- set(id: string, value: any, options: CacheOptions): Promise<void>;
46
- getOrSet(key: string, factory: () => any, options: CacheOptions): Promise<void>;
47
- clear(): Promise<void>;
38
+ containsAsync(key: string): Promise<boolean>;
39
+ deleteAsync(id: string): Promise<void>;
40
+ bulkDeleteAsync(ids: string[]): Promise<void>;
41
+ setAsync(id: string, value: any, options: CacheOptions): Promise<void>;
42
+ getOrSetAsync(key: string, factory: () => any, options: CacheOptions): Promise<void>;
43
+ clearAsync(): Promise<void>;
48
44
  }
49
45
  export {};
50
46
  //# sourceMappingURL=persistentCache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistentCache.d.ts","sourceRoot":"","sources":["../../src/cache/persistentCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAe,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG/D,KAAK,QAAQ,GAAG,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,sBAAsB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;CAC1B,CAAC;AAMF,MAAM,MAAM,YAAY,GAAG;IACvB,kBAAkB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACnC,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,iBAAiB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;CACrC,CAAC;AAGF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,KAAK,EAAE,WAAW,CAAC;IAEnB,gBAAgB,CAAC,EAAE,YAAY,CAAC;CACnC,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAC9B,KAAK,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAKF,qBAAa,eAAgB,SAAQ,iBAAiB,CAAC,0BAA0B,CAAC;IAU9E,OAAO,CAAC,GAAG,CAAU;IAErB,OAAO,CAAC,WAAW,CAAU;IAE7B,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;gBAGtC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB;IAmBxD,kBAAkB;IAgBZ,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI;IA8B/B,OAAO;YAuBO,IAAI;IAeZ,OAAO;IAIP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,GAAG,cAAc,CAAC,CAAC;IAcjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,WAAW,GAAG,cAAc,CAAC,CAAA;KAAE,CAAC;IAsC1F,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,MAAY;IAU9C,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE;;;IAS3B,QAAQ,CAAC,GAAG,EAAE,MAAM;IAQpB,MAAM,CAAC,EAAE,EAAE,MAAM;IAOjB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE;IAMxB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY;IA6BjD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,EAAE,YAAY;IAU/D,KAAK;CAQd"}
1
+ {"version":3,"file":"persistentCache.d.ts","sourceRoot":"","sources":["../../src/cache/persistentCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAe,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG/D,KAAK,QAAQ,GAAG,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,sBAAsB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;CAC1B,CAAC;AAMF,MAAM,MAAM,YAAY,GAAG;IACvB,kBAAkB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACnC,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,iBAAiB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;CACrC,CAAC;AAGF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,KAAK,EAAE,UAAU,CAAC;IAElB,gBAAgB,CAAC,EAAE,YAAY,CAAC;CACnC,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAC9B,KAAK,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAKF,qBAAa,eAAgB,SAAQ,iBAAiB,CAAC,0BAA0B,CAAC;IAU9E,OAAO,CAAC,GAAG,CAAY;IAEvB,OAAO,CAAC,WAAW,CAAU;IAE7B,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;gBAGtC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB;IAazD,kBAAkB;IAiBZ,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI;IA8BpC,OAAO;YAuBO,SAAS;IAejB,YAAY;IAIZ,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAchE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,CAAA;KAAE,CAAC;IA2CzF,aAAa,CAAC,GAAG,EAAE,MAAM;IAQzB,WAAW,CAAC,EAAE,EAAE,MAAM;IAOtB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE;IAO7B,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY;IA6BtD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,EAAE,YAAY;IAUpE,UAAU;CAQnB"}
@@ -1,66 +1,65 @@
1
- var h = Object.defineProperty;
2
- var y = (n, r, t) => r in n ? h(n, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[r] = t;
3
- var o = (n, r, t) => y(n, typeof r != "symbol" ? r + "" : r, t);
4
- import { keyOf as b } from "../typeUtils.es.js";
5
- import { StructEventTarget as w, StructEvent as _ } from "../structEvent.es.js";
6
- import { v4 as p } from "uuid";
7
- const f = {
1
+ import { keyOf as c } from "../typeUtils.es.js";
2
+ import { DataStore as o } from "../store/dataStore.es.js";
3
+ import { StructEventTarget as y, StructEvent as d } from "../structEvent.es.js";
4
+ import { v4 as h } from "uuid";
5
+ const u = {
8
6
  cleanupTimeout: 1e3
9
7
  };
10
- class v extends w {
8
+ class f extends y {
9
+ // https://demo.agektmr.com/storage/
10
+ // https://www.html5rocks.com/en/tutorials/offline/quota-research/
11
+ // https://www.raymondcamden.com/2015/04/17/indexeddb-and-limits
12
+ // https://github.com/jonnysmith1981/getIndexedDbSize/blob/master/getIndexedDbSize.js
13
+ // https://developer.chrome.com/apps/offline_storage#query
14
+ // https://golb.hplar.ch/2018/01/IndexedDB-programming-with-Dexie-js.html
15
+ // http://www.forerunnerdb.com/licensing.html
16
+ // https://github.com/ignasbernotas/dexie-relationships
17
+ _db;
18
+ _isDisposed;
19
+ _jobTimerId;
20
+ _options;
11
21
  // cleanupTimeout - serviceJobTimeout
12
22
  constructor(t, e) {
13
- super();
14
- // https://demo.agektmr.com/storage/
15
- // https://www.html5rocks.com/en/tutorials/offline/quota-research/
16
- // https://www.raymondcamden.com/2015/04/17/indexeddb-and-limits
17
- // https://github.com/jonnysmith1981/getIndexedDbSize/blob/master/getIndexedDbSize.js
18
- // https://developer.chrome.com/apps/offline_storage#query
19
- // https://golb.hplar.ch/2018/01/IndexedDB-programming-with-Dexie-js.html
20
- // http://www.forerunnerdb.com/licensing.html
21
- // https://github.com/ignasbernotas/dexie-relationships
22
- o(this, "_db");
23
- o(this, "_isDisposed");
24
- o(this, "_jobTimerId");
25
- o(this, "_options");
26
- if (!t)
27
- throw new Error("Database cannot be null");
28
- this._isDisposed = !1, this._jobTimerId = null, this._db = t, this._options = { ...e, ...f }, this.scheduleServiceJob();
23
+ if (super(), !t)
24
+ throw new Error("Name cannot be empty");
25
+ this._isDisposed = !1, this._jobTimerId = null, this._db = new o(t), this._options = { ...e, ...u }, this.scheduleServiceJob();
29
26
  }
30
27
  scheduleServiceJob() {
31
- const t = async () => {
32
- try {
33
- await this.deleteExpired();
34
- } catch (e) {
35
- console.error("Cache cleanup failed:", e);
36
- } finally {
37
- setTimeout(t, this._options.cleanupTimeout);
38
- }
39
- };
40
- setTimeout(t, this._options.cleanupTimeout);
28
+ if (this._options.cleanupTimeout) {
29
+ const t = async () => {
30
+ try {
31
+ await this.deleteExpiredAsync();
32
+ } catch (e) {
33
+ console.error("Cache cleanup failed:", e);
34
+ } finally {
35
+ setTimeout(t, this._options.cleanupTimeout);
36
+ }
37
+ };
38
+ setTimeout(t, this._options.cleanupTimeout);
39
+ }
41
40
  }
42
- // evictExpired/clearExpired
43
- async deleteExpired(t) {
41
+ // evictExpiredAsync/clearExpiredAsync
42
+ async deleteExpiredAsync(t) {
44
43
  const e = [];
45
- return t || (t = /* @__PURE__ */ new Date()), await this.exec(async () => {
46
- const i = await this._db.registry.where(b("expiresAt")).below(t.getTime()).toArray();
47
- for (const s of i) {
48
- const c = new _("evict", {
44
+ return t || (t = /* @__PURE__ */ new Date()), await this.execAsync(async () => {
45
+ const s = await this._db.registry.where(c("expiresAt")).below(t.getTime()).toArray();
46
+ for (const a of s) {
47
+ const n = new d("evict", {
49
48
  detail: {
50
- entry: s
49
+ entry: a
51
50
  // keepAliveOptions: {}
52
51
  },
53
52
  target: this,
54
53
  cancelable: !0
55
54
  });
56
- this.dispatchEvent(c), await this._db.registry.delete(s.id), e.push(s.id);
55
+ this.dispatchEvent(n), await this._db.registry.delete(a.id), e.push(a.id);
57
56
  }
58
57
  }), e;
59
58
  }
60
59
  dispose() {
61
60
  this._isDisposed || (this._isDisposed = !0, this._jobTimerId && (window.clearTimeout(this._jobTimerId), this._jobTimerId = null), this._db && (this._db.isOpen() && this._db.close(), this._db = null));
62
61
  }
63
- async exec(t) {
62
+ async execAsync(t) {
64
63
  this._db.isOpen() || await this._db.open();
65
64
  try {
66
65
  return await t();
@@ -68,89 +67,77 @@ class v extends w {
68
67
  throw this._db.isOpen(), e;
69
68
  }
70
69
  }
71
- async getKeys() {
70
+ async getKeysAsync() {
72
71
  return await this._db.registry.filter((t) => !0).primaryKeys();
73
72
  }
74
- async get(t) {
75
- return await this.exec(async () => {
73
+ async getAsync(t) {
74
+ return await this.execAsync(async () => {
76
75
  const e = await this._db.registry.get(t);
77
76
  if (e) {
78
- const i = await this._db.data.get(t);
79
- return { ...e, ...i };
77
+ const s = await this._db.data.get(t);
78
+ return { ...e, ...s };
80
79
  }
81
80
  return null;
82
81
  });
83
82
  }
84
83
  // getMany
85
- async bulkGet(t) {
84
+ async bulkGetAsync(t) {
86
85
  const e = {};
87
- return await this.exec(async () => {
88
- const s = (await this._db.registry.bulkGet(t)).reduce((a, d, l) => (a[d.id] = d, a), {}), c = await this._db.data.bulkGet(t);
89
- for (const a of c)
90
- e[a.id] = { ...s[a.id], ...a }, delete s[a.id];
91
- for (const a of Object.keys(s))
92
- e[a] = { ...s[a], value: void 0 };
86
+ return await this.execAsync(async () => {
87
+ const a = (await this._db.registry.bulkGet(t)).reduce((i, r, b) => (i[r.id] = r, i), {}), n = await this._db.data.bulkGet(t);
88
+ for (const i of n)
89
+ e[i.id] = { ...a[i.id], ...i }, delete a[i.id];
90
+ for (const i of Object.keys(a))
91
+ e[i] = { ...a[i], value: void 0 };
93
92
  return e;
94
93
  });
95
94
  }
96
- async getValue(t, e = void 0) {
97
- const i = await this.get(t);
98
- return i ? i.value : e;
99
- }
100
- // getManyValues
101
- async bulkGetValues(t) {
102
- const e = {}, i = this.bulkGet(t);
103
- for (const s of Object.keys(i))
104
- e[s] = i[s].value;
105
- return e;
106
- }
107
- async contains(t) {
108
- return await this.exec(async () => await this._db.registry.get(t) != null);
95
+ async containsAsync(t) {
96
+ return await this.execAsync(async () => await this._db.registry.get(t) != null);
109
97
  }
110
- async delete(t) {
111
- await this.exec(async () => {
98
+ async deleteAsync(t) {
99
+ await this.execAsync(async () => {
112
100
  await this._db.registry.delete(t);
113
101
  });
114
102
  }
115
- // deleteMany
116
- async bulkDelete(t) {
117
- await this.exec(async () => {
103
+ // deleteManyAsync
104
+ async bulkDeleteAsync(t) {
105
+ await this.execAsync(async () => {
118
106
  await this._db.registry.bulkDelete(t);
119
107
  });
120
108
  }
121
- async set(t, e, i) {
122
- return await this.exec(async () => {
123
- var l, u;
124
- const s = await this._db.registry.get(t), c = (/* @__PURE__ */ new Date()).getTime();
125
- t || (t = p());
126
- const a = typeof i.absoluteExpiration == "number" ? i.absoluteExpiration : (l = i.absoluteExpiration) == null ? void 0 : l.getTime(), d = typeof i.slidingExpiration == "number" ? i.slidingExpiration : (u = i.slidingExpiration) == null ? void 0 : u.getTime();
109
+ // upsertAsync
110
+ async setAsync(t, e, s) {
111
+ return await this.execAsync(async () => {
112
+ const a = await this._db.registry.get(t), n = (/* @__PURE__ */ new Date()).getTime();
113
+ t || (t = h());
114
+ const i = typeof s.absoluteExpiration == "number" ? s.absoluteExpiration : s.absoluteExpiration?.getTime(), r = typeof s.slidingExpiration == "number" ? s.slidingExpiration : s.slidingExpiration?.getTime();
127
115
  await this._db.registry.put({
128
116
  id: t,
129
- createdAt: s ? s.createdAt : c,
130
- accessedAt: s ? s.accessedAt : null,
131
- // now
132
- // updatedAt: now,
133
- expiresAt: a,
134
- slidingExpiration: d
117
+ createdAt: a ? a.createdAt : n,
118
+ accessedAt: n,
119
+ updatedAt: n,
120
+ expiresAt: i,
121
+ slidingExpiration: r
135
122
  }), await this._db.data.put({
136
123
  id: t,
137
124
  value: e
138
125
  });
139
126
  });
140
127
  }
141
- // getOrUpdate
142
- async getOrSet(t, e, i) {
143
- await this.exec(async () => (await this.contains(t) || await this.set(t, e(), i), await this.get(t)));
128
+ // getOrAddAsync
129
+ async getOrSetAsync(t, e, s) {
130
+ await this.execAsync(async () => (await this.containsAsync(t) || await this.setAsync(t, e(), s), await this.getAsync(t)));
144
131
  }
145
- // clearAll/evictAll
146
- async clear() {
147
- await this.exec(async () => {
132
+ // clearAllAsync/evictAllAsync
133
+ async clearAsync() {
134
+ await this.execAsync(async () => {
148
135
  await this._db.registry.clear(), await this._db.data.clear();
149
136
  });
150
137
  }
151
- // TODO: support update bulkUpdate, bulkSet
138
+ // TODO: support bulkSetAsync
152
139
  }
153
140
  export {
154
- v as PersistentCache
141
+ f as PersistentCache
155
142
  };
156
143
  //# sourceMappingURL=persistentCache.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistentCache.es.js","sources":["../../src/cache/persistentCache.ts"],"sourcesContent":["import { keyOf } from \"@/typeUtils\";\r\nimport { CacheDb, ICacheEntry, ICacheDataItem } from \"./cacheDb\";\r\nimport { StructEvent, StructEventTarget } from \"@/structEvent\";\r\nimport { v4 as uuid } from \"uuid\";\r\n\r\ntype Duration = number | { seconds?: number; minutes?: number; hours?: number };\r\n\r\nexport type PersistentCacheOptions = {\r\n cleanupTimeout: number;\r\n};\r\n\r\nconst defaultPersistentCacheOptions = {\r\n cleanupTimeout: 1000\r\n} satisfies PersistentCacheOptions;\r\n\r\nexport type CacheOptions = {\r\n absoluteExpiration?: Date | number;\r\n ttl?: Duration;\r\n slidingExpiration?: Date | number; // \"autoRenewOnUse\" pattern\r\n};\r\n\r\n// CacheEntryEvictionEvent\r\nexport type CacheEvictionEvent = {\r\n entry: ICacheEntry;\r\n // or optionsOverride?\r\n keepAliveOptions?: CacheOptions; // TODO: delayed eviction (pending eviction) after gracePeriod\r\n};\r\n\r\ntype PersistentCacheEventStruct = {\r\n evict: CacheEvictionEvent;\r\n};\r\n\r\n// TODO: remove class, create factory method\r\n// implements Struct<StructEventTarget<PersistentCacheEventStruct>>\r\n// PersistentCacheManager\r\nexport class PersistentCache extends StructEventTarget<PersistentCacheEventStruct> {\r\n // https://demo.agektmr.com/storage/\r\n // https://www.html5rocks.com/en/tutorials/offline/quota-research/\r\n // https://www.raymondcamden.com/2015/04/17/indexeddb-and-limits\r\n // https://github.com/jonnysmith1981/getIndexedDbSize/blob/master/getIndexedDbSize.js\r\n // https://developer.chrome.com/apps/offline_storage#query\r\n // https://golb.hplar.ch/2018/01/IndexedDB-programming-with-Dexie-js.html\r\n // http://www.forerunnerdb.com/licensing.html\r\n // https://github.com/ignasbernotas/dexie-relationships\r\n\r\n private _db: CacheDb;\r\n\r\n private _isDisposed: boolean;\r\n\r\n private _jobTimerId: number;\r\n\r\n private readonly _options: PersistentCacheOptions;\r\n\r\n // cleanupTimeout - serviceJobTimeout\r\n constructor(db: CacheDb, options: PersistentCacheOptions) {\r\n super();\r\n if (!db) {\r\n throw new Error(\"Database cannot be null\");\r\n }\r\n this._isDisposed = false;\r\n this._jobTimerId = null;\r\n\r\n this._db = db;\r\n // if (this._db.isOpen()) {\r\n // \tthis._db.close();\r\n // }\r\n\r\n // https://docs.nestjs.com/techniques/task-scheduling\r\n this._options = { ...options, ...defaultPersistentCacheOptions };\r\n\r\n this.scheduleServiceJob();\r\n }\r\n\r\n scheduleServiceJob() {\r\n const doWork = async () => {\r\n try {\r\n // purge expired entries\r\n await this.deleteExpired();\r\n } catch (err) {\r\n console.error(\"Cache cleanup failed:\", err);\r\n } finally {\r\n setTimeout(doWork, this._options.cleanupTimeout);\r\n }\r\n };\r\n\r\n setTimeout(doWork, this._options.cleanupTimeout);\r\n }\r\n\r\n // evictExpired/clearExpired\r\n async deleteExpired(date?: Date) {\r\n const result: string[] = []; // output ids\r\n if (!date) {\r\n date = new Date();\r\n }\r\n\r\n await this.exec(async () => {\r\n const entries = await this._db.registry.where(keyOf<ICacheEntry>(\"expiresAt\")).below(date.getTime()).toArray();\r\n for (const entry of entries) {\r\n const evt = new StructEvent<PersistentCacheEventStruct, this>(\"evict\", {\r\n detail: {\r\n entry: entry\r\n // keepAliveOptions: {}\r\n },\r\n target: this,\r\n cancelable: true\r\n });\r\n this.dispatchEvent(evt);\r\n // evt.defaultPrevented?\r\n // TODO: support evt.detail.keepAliveOptions\r\n await this._db.registry.delete(entry.id);\r\n // await this._db.data.delete(entry.id);\r\n result.push(entry.id);\r\n // TODO: use bulkDelete\r\n // TODO: use transaction\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n dispose() {\r\n if (!this._isDisposed) {\r\n this._isDisposed = true;\r\n\r\n if (this._jobTimerId) {\r\n window.clearTimeout(this._jobTimerId);\r\n this._jobTimerId = null;\r\n }\r\n\r\n if (this._db) {\r\n // this.exec(async () => {\r\n // \t// ...\r\n // }).then(() => {\r\n // \tthis._db = null;\r\n // });\r\n if (this._db.isOpen()) {\r\n this._db.close();\r\n }\r\n this._db = null;\r\n }\r\n }\r\n }\r\n\r\n private async exec<T>(action: () => Promise<T>) {\r\n if (!this._db.isOpen()) {\r\n await this._db.open();\r\n }\r\n try {\r\n const result = await action();\r\n return result;\r\n } catch (err) {\r\n if (this._db.isOpen()) {\r\n // this._db.close(); // generally speaking: we don't (never) need to close a connection\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n async getKeys() {\r\n return await this._db.registry.filter((_) => true).primaryKeys();\r\n }\r\n\r\n async get(key: string): Promise<Readonly<ICacheEntry & ICacheDataItem>> {\r\n return await this.exec(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n if (entry) {\r\n const data = await this._db.data.get(key);\r\n // const data = await this._db.data.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n return { ...entry, ...data };\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n // getMany\r\n async bulkGet(ids: string[]): Promise<{ [key: string]: Readonly<ICacheEntry & ICacheDataItem> }> {\r\n const result: { [key: string]: Readonly<ICacheEntry & ICacheDataItem> } = {};\r\n return await this.exec(async () => {\r\n // const entries = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).anyOf(ids).toArray();\r\n const entries = await this._db.registry.bulkGet(ids);\r\n const entryMap: { [key: string]: ICacheEntry } = entries.reduce((map, entry, i) => {\r\n map[entry.id] = entry;\r\n return map;\r\n }, {});\r\n\r\n // const dataItems = this._db.data.where(keyOf<ICacheEntry>(\"id\")).anyOf(ids);\r\n // await dataItems.each((dataItem) => {\r\n // result[dataItem.id] = { ...entryMap[dataItem.id], ...dataItem };\r\n // delete entryMap[dataItem.id];\r\n // });\r\n\r\n const dataItems = await this._db.data.bulkGet(ids);\r\n for (const dataItem of dataItems) {\r\n result[dataItem.id] = { ...entryMap[dataItem.id], ...dataItem };\r\n delete entryMap[dataItem.id];\r\n }\r\n\r\n for (const key of Object.keys(entryMap)) {\r\n // abandoned/orphaned entries:\r\n result[key] = { ...entryMap[key], value: undefined };\r\n\r\n // Object.defineProperty(result[key], keyOf<ICacheDataItem>(\"value\"), {\r\n // writable: false,\r\n // get: function () {\r\n // throw new Error(\"Not found\");\r\n // }\r\n // });\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n async getValue(key: string, defaultValue = undefined) {\r\n const item = await this.get(key);\r\n if (!item) {\r\n return defaultValue;\r\n } else {\r\n return item.value;\r\n }\r\n }\r\n\r\n // getManyValues\r\n async bulkGetValues(ids: string[]) {\r\n const result: { [kes: string]: any } = {};\r\n const items = this.bulkGet(ids);\r\n for (const key of Object.keys(items)) {\r\n result[key] = items[key].value;\r\n }\r\n return result;\r\n }\r\n\r\n async contains(key: string) {\r\n return await this.exec(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n return entry != undefined;\r\n });\r\n }\r\n\r\n async delete(id: string) {\r\n await this.exec(async () => {\r\n await this._db.registry.delete(id);\r\n });\r\n }\r\n\r\n // deleteMany\r\n async bulkDelete(ids: string[]) {\r\n await this.exec(async () => {\r\n await this._db.registry.bulkDelete(ids);\r\n });\r\n }\r\n\r\n async set(id: string, value: any, options: CacheOptions) {\r\n return await this.exec(async () => {\r\n const entry = await this._db.registry.get(id);\r\n // const entry = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n const now = new Date().getTime();\r\n if (!id) {\r\n id = uuid();\r\n }\r\n const expiresAt =\r\n typeof options.absoluteExpiration === \"number\" ? options.absoluteExpiration : options.absoluteExpiration?.getTime();\r\n const slidingExpiration =\r\n typeof options.slidingExpiration === \"number\" ? options.slidingExpiration : options.slidingExpiration?.getTime();\r\n\r\n await this._db.registry.put({\r\n id: id,\r\n createdAt: entry ? entry.createdAt : now,\r\n accessedAt: entry ? entry.accessedAt : null, // now\r\n // updatedAt: now,\r\n expiresAt: expiresAt,\r\n slidingExpiration: slidingExpiration\r\n });\r\n await this._db.data.put({\r\n id: id,\r\n value: value\r\n });\r\n });\r\n }\r\n\r\n // getOrUpdate\r\n async getOrSet(key: string, factory: () => any, options: CacheOptions) {\r\n await this.exec(async () => {\r\n if (!(await this.contains(key))) {\r\n await this.set(key, factory(), options);\r\n }\r\n return await this.get(key);\r\n });\r\n }\r\n\r\n // clearAll/evictAll\r\n async clear() {\r\n await this.exec(async () => {\r\n await this._db.registry.clear();\r\n await this._db.data.clear();\r\n });\r\n }\r\n\r\n // TODO: support update bulkUpdate, bulkSet\r\n}\r\n\r\n// https://medium.com/square-corner-blog/useful-tools-headless-chrome-puppeteer-for-browser-automation-testing-1ac7707bad40\r\n// https://developers.google.com/web/updates/2017/06/headless-karma-mocha-chai?hl=ru\r\n// https://github.com/puppeteer/puppeteer\r\n// https://medium.com/web-standards/puppeteer-crawl-to-markdown-7752dff36b68\r\n"],"names":["defaultPersistentCacheOptions","PersistentCache","StructEventTarget","db","options","__publicField","doWork","err","date","result","entries","keyOf","entry","evt","StructEvent","action","_","key","data","ids","entryMap","map","i","dataItems","dataItem","defaultValue","item","items","id","value","now","uuid","expiresAt","_a","slidingExpiration","_b","factory"],"mappings":"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"}
1
+ {"version":3,"file":"persistentCache.es.js","sources":["../../src/cache/persistentCache.ts"],"sourcesContent":["import { keyOf } from \"@/typeUtils\";\r\nimport { DataStore, IDataEntry, IDataItem } from \"../store/dataStore\";\r\nimport { StructEvent, StructEventTarget } from \"@/structEvent\";\r\nimport { v4 as uuid } from \"uuid\";\r\n\r\ntype Duration = number | { seconds?: number; minutes?: number; hours?: number };\r\n\r\nexport type PersistentCacheOptions = {\r\n cleanupTimeout: number;\r\n};\r\n\r\nconst defaultPersistentCacheOptions = {\r\n cleanupTimeout: 1000\r\n} satisfies PersistentCacheOptions;\r\n\r\nexport type CacheOptions = {\r\n absoluteExpiration?: Date | number;\r\n ttl?: Duration;\r\n slidingExpiration?: Date | number; // \"autoRenewOnUse\" pattern\r\n};\r\n\r\n// CacheEntryEvictionEvent\r\nexport type CacheEvictionEvent = {\r\n entry: IDataEntry;\r\n // or optionsOverride?\r\n keepAliveOptions?: CacheOptions; // TODO: delayed eviction (pending eviction) after gracePeriod\r\n};\r\n\r\ntype PersistentCacheEventStruct = {\r\n evict: CacheEvictionEvent;\r\n};\r\n\r\n// TODO: remove class, create factory method\r\n// implements Struct<StructEventTarget<PersistentCacheEventStruct>>\r\n// PersistentCacheManager\r\nexport class PersistentCache extends StructEventTarget<PersistentCacheEventStruct> {\r\n // https://demo.agektmr.com/storage/\r\n // https://www.html5rocks.com/en/tutorials/offline/quota-research/\r\n // https://www.raymondcamden.com/2015/04/17/indexeddb-and-limits\r\n // https://github.com/jonnysmith1981/getIndexedDbSize/blob/master/getIndexedDbSize.js\r\n // https://developer.chrome.com/apps/offline_storage#query\r\n // https://golb.hplar.ch/2018/01/IndexedDB-programming-with-Dexie-js.html\r\n // http://www.forerunnerdb.com/licensing.html\r\n // https://github.com/ignasbernotas/dexie-relationships\r\n\r\n private _db: DataStore;\r\n\r\n private _isDisposed: boolean;\r\n\r\n private _jobTimerId: number;\r\n\r\n private readonly _options: PersistentCacheOptions;\r\n\r\n // cleanupTimeout - serviceJobTimeout\r\n constructor(name: string, options: PersistentCacheOptions) {\r\n super();\r\n if (!name) {\r\n throw new Error(\"Name cannot be empty\");\r\n }\r\n this._isDisposed = false;\r\n this._jobTimerId = null;\r\n this._db = new DataStore(name);\r\n // https://docs.nestjs.com/techniques/task-scheduling\r\n this._options = { ...options, ...defaultPersistentCacheOptions };\r\n this.scheduleServiceJob();\r\n }\r\n\r\n scheduleServiceJob() {\r\n if (this._options.cleanupTimeout) {\r\n const doWork = async () => {\r\n try {\r\n // purge expired entries\r\n await this.deleteExpiredAsync();\r\n } catch (err) {\r\n console.error(\"Cache cleanup failed:\", err);\r\n } finally {\r\n setTimeout(doWork, this._options.cleanupTimeout);\r\n }\r\n };\r\n setTimeout(doWork, this._options.cleanupTimeout);\r\n }\r\n }\r\n\r\n // evictExpiredAsync/clearExpiredAsync\r\n async deleteExpiredAsync(date?: Date) {\r\n const result: string[] = []; // output ids\r\n if (!date) {\r\n date = new Date();\r\n }\r\n\r\n await this.execAsync(async () => {\r\n const entries = await this._db.registry.where(keyOf<IDataEntry>(\"expiresAt\")).below(date.getTime()).toArray();\r\n for (const entry of entries) {\r\n const evt = new StructEvent<PersistentCacheEventStruct, this>(\"evict\", {\r\n detail: {\r\n entry: entry\r\n // keepAliveOptions: {}\r\n },\r\n target: this,\r\n cancelable: true\r\n });\r\n this.dispatchEvent(evt);\r\n // evt.defaultPrevented?\r\n // TODO: support evt.detail.keepAliveOptions\r\n await this._db.registry.delete(entry.id);\r\n // await this._db.data.delete(entry.id);\r\n result.push(entry.id);\r\n // TODO: use bulkDelete\r\n // TODO: use transaction\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n dispose() {\r\n if (!this._isDisposed) {\r\n this._isDisposed = true;\r\n\r\n if (this._jobTimerId) {\r\n window.clearTimeout(this._jobTimerId);\r\n this._jobTimerId = null;\r\n }\r\n\r\n if (this._db) {\r\n // this.exec(async () => {\r\n // \t// ...\r\n // }).then(() => {\r\n // \tthis._db = null;\r\n // });\r\n if (this._db.isOpen()) {\r\n this._db.close();\r\n }\r\n this._db = null;\r\n }\r\n }\r\n }\r\n\r\n private async execAsync<T>(action: () => Promise<T>) {\r\n if (!this._db.isOpen()) {\r\n await this._db.open();\r\n }\r\n try {\r\n const result = await action();\r\n return result;\r\n } catch (err) {\r\n if (this._db.isOpen()) {\r\n // this._db.close(); // generally speaking: we don't (never) need to close a connection\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n async getKeysAsync() {\r\n return await this._db.registry.filter((_) => true).primaryKeys();\r\n }\r\n\r\n async getAsync(key: string): Promise<Readonly<IDataEntry & IDataItem>> {\r\n return await this.execAsync(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n if (entry) {\r\n const data = await this._db.data.get(key);\r\n // const data = await this._db.data.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n return { ...entry, ...data };\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n // getMany\r\n async bulkGetAsync(ids: string[]): Promise<{ [key: string]: Readonly<IDataEntry & IDataItem> }> {\r\n const result: { [key: string]: Readonly<IDataEntry & IDataItem> } = {};\r\n return await this.execAsync(async () => {\r\n // const entries = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).anyOf(ids).toArray();\r\n const entries = await this._db.registry.bulkGet(ids);\r\n const entryMap: { [key: string]: IDataEntry } = entries.reduce((map, entry, i) => {\r\n map[entry.id] = entry;\r\n return map;\r\n }, {});\r\n\r\n // const dataItems = this._db.data.where(keyOf<ICacheEntry>(\"id\")).anyOf(ids);\r\n // await dataItems.each((dataItem) => {\r\n // result[dataItem.id] = { ...entryMap[dataItem.id], ...dataItem };\r\n // delete entryMap[dataItem.id];\r\n // });\r\n\r\n const dataItems = await this._db.data.bulkGet(ids);\r\n for (const dataItem of dataItems) {\r\n result[dataItem.id] = { ...entryMap[dataItem.id], ...dataItem };\r\n delete entryMap[dataItem.id];\r\n }\r\n\r\n // TODO: update cache entry \r\n // accessedAt,\r\n // updatedAt,\r\n // expiresAt // for sliding expiration\r\n\r\n for (const key of Object.keys(entryMap)) {\r\n // abandoned/orphaned entries:\r\n result[key] = { ...entryMap[key], value: undefined };\r\n\r\n // Object.defineProperty(result[key], keyOf<ICacheDataItem>(\"value\"), {\r\n // writable: false,\r\n // get: function () {\r\n // throw new Error(\"Not found\");\r\n // }\r\n // });\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n async containsAsync(key: string) {\r\n return await this.execAsync(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n return entry != undefined;\r\n });\r\n }\r\n\r\n async deleteAsync(id: string) {\r\n await this.execAsync(async () => {\r\n await this._db.registry.delete(id);\r\n });\r\n }\r\n\r\n // deleteManyAsync\r\n async bulkDeleteAsync(ids: string[]) {\r\n await this.execAsync(async () => {\r\n await this._db.registry.bulkDelete(ids);\r\n });\r\n }\r\n\r\n // upsertAsync\r\n async setAsync(id: string, value: any, options: CacheOptions) {\r\n return await this.execAsync(async () => {\r\n const entry = await this._db.registry.get(id);\r\n // const entry = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n const now = new Date().getTime();\r\n if (!id) {\r\n id = uuid();\r\n }\r\n const expiresAt =\r\n typeof options.absoluteExpiration === \"number\" ? options.absoluteExpiration : options.absoluteExpiration?.getTime();\r\n const slidingExpiration =\r\n typeof options.slidingExpiration === \"number\" ? options.slidingExpiration : options.slidingExpiration?.getTime();\r\n\r\n await this._db.registry.put({\r\n id: id,\r\n createdAt: entry ? entry.createdAt : now,\r\n accessedAt: now,\r\n updatedAt: now,\r\n expiresAt: expiresAt,\r\n slidingExpiration: slidingExpiration\r\n });\r\n await this._db.data.put({\r\n id: id,\r\n value: value\r\n });\r\n });\r\n }\r\n\r\n // getOrAddAsync\r\n async getOrSetAsync(key: string, factory: () => any, options: CacheOptions) {\r\n await this.execAsync(async () => {\r\n if (!(await this.containsAsync(key))) {\r\n await this.setAsync(key, factory(), options);\r\n }\r\n return await this.getAsync(key);\r\n });\r\n }\r\n\r\n // clearAllAsync/evictAllAsync\r\n async clearAsync() {\r\n await this.execAsync(async () => {\r\n await this._db.registry.clear();\r\n await this._db.data.clear();\r\n });\r\n }\r\n\r\n // TODO: support bulkSetAsync\r\n}\r\n\r\n// https://medium.com/square-corner-blog/useful-tools-headless-chrome-puppeteer-for-browser-automation-testing-1ac7707bad40\r\n// https://developers.google.com/web/updates/2017/06/headless-karma-mocha-chai?hl=ru\r\n// https://github.com/puppeteer/puppeteer\r\n// https://medium.com/web-standards/puppeteer-crawl-to-markdown-7752dff36b68\r\n"],"names":["defaultPersistentCacheOptions","PersistentCache","StructEventTarget","name","options","DataStore","doWork","err","date","result","entries","keyOf","entry","evt","StructEvent","action","_","key","data","ids","entryMap","map","i","dataItems","dataItem","id","value","now","uuid","expiresAt","slidingExpiration","factory"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dataFormats.es.js","sources":["../src/dataFormats.ts"],"sourcesContent":["import dateTimeDataFormat from './dateTimeDataFormat';\r\nexport default {\r\n dateTime: dateTimeDataFormat\r\n};"],"names":["dataFormats","dateTimeDataFormat"],"mappings":";AACA,MAAeA,IAAA;AAAA,EACX,UAAUC;AACd;"}
1
+ {"version":3,"file":"dataFormats.es.js","sources":["../src/dataFormats.ts"],"sourcesContent":["import dateTimeDataFormat from './dateTimeDataFormat';\r\nexport default {\r\n dateTime: dateTimeDataFormat\r\n};"],"names":["dataFormats","dateTimeDataFormat"],"mappings":";AACA,MAAAA,IAAe;AAAA,EACX,UAAUC;AACd;"}
@@ -1,6 +1,6 @@
1
1
  import r from "moment";
2
- import m from "./i18n/cultures.es.js";
3
- const d = m.invariant.dateTime.formats;
2
+ import l from "./i18n/cultures.es.js";
3
+ const f = l.invariant.dateTime.formats;
4
4
  var u = /* @__PURE__ */ ((t) => (t[t.UnixTimeMilliseconds = 0] = "UnixTimeMilliseconds", t[t.UnixTimeSeconds = 1] = "UnixTimeSeconds", t[t.OADate = 2] = "OADate", t))(u || {});
5
5
  const c = "YYYY-MM-DDTHH:mm:ss.SSS", i = "YYYY-MM-DDTHH:mm:ss.SSS", s = r.utc, D = (t) => new Date(t.format(c));
6
6
  function p(t) {
@@ -8,8 +8,8 @@ function p(t) {
8
8
  return new Date(1899, 11, 30 + e, 0, 0, 0, n);
9
9
  }
10
10
  function g(t) {
11
- const e = new Date(t), n = new Date(1899, 11, 30), a = Math.round((e.setHours(0, 0, 0, 0) - n.getTime()) / 864e5), f = (Math.abs((t.getTime() - e.getTime()) % 864e5) / 864e5).toFixed(10);
12
- return a + f.substr(1);
11
+ const e = new Date(t), n = new Date(1899, 11, 30), a = Math.round((e.setHours(0, 0, 0, 0) - n.getTime()) / 864e5), m = (Math.abs((t.getTime() - e.getTime()) % 864e5) / 864e5).toFixed(10);
12
+ return a + m.substr(1);
13
13
  }
14
14
  function M(t, e = 0) {
15
15
  if (t == null)
@@ -23,14 +23,14 @@ function M(t, e = 0) {
23
23
  return p(t);
24
24
  }
25
25
  }
26
- function l(t, e) {
26
+ function d(t, e) {
27
27
  if (t == null)
28
28
  return null;
29
29
  let n;
30
30
  if (typeof t == "string")
31
- n = o(t, e == null ? void 0 : e.string);
31
+ n = o(t, e?.string);
32
32
  else if (typeof t == "number")
33
- n = r(M(t, e == null ? void 0 : e.number));
33
+ n = r(M(t, e?.number));
34
34
  else if (t instanceof Date)
35
35
  n = r(t);
36
36
  else {
@@ -56,8 +56,8 @@ function o(t, e) {
56
56
  function S(t, e) {
57
57
  if (t == null)
58
58
  return "";
59
- const n = l(t);
60
- return e == null && (!n.hours() && !n.minutes() && !n.seconds() ? e = d.dateShort : n.milliseconds() ? e = d.dateTime24 : e = d.dateTime24Short), n.format(e);
59
+ const n = d(t);
60
+ return e == null && (!n.hours() && !n.minutes() && !n.seconds() ? e = f.dateShort : n.milliseconds() ? e = f.dateTime24 : e = f.dateTime24Short), n.format(e);
61
61
  }
62
62
  const w = {
63
63
  serializationFormat: i,
@@ -75,7 +75,7 @@ const w = {
75
75
  throw new Error("Unsupported source");
76
76
  return D(t);
77
77
  },
78
- serialize: (t, e) => t == null ? null : l(t, e).format(i),
78
+ serialize: (t, e) => t == null ? null : d(t, e).format(i),
79
79
  deserialize: (t) => o(t),
80
80
  tryDeserialize: (t) => {
81
81
  try {
@@ -92,6 +92,6 @@ export {
92
92
  M as getDateFromNumber,
93
93
  p as getDateFromOADate,
94
94
  g as getOADateFromDate,
95
- l as toMoment
95
+ d as toMoment
96
96
  };
97
97
  //# sourceMappingURL=dateTimeDataFormat.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dateTimeDataFormat.es.js","sources":["../src/dateTimeDataFormat.ts"],"sourcesContent":["import { Moment } from \"moment\";\r\nimport moment from \"moment\";\r\nimport cultures from \"./i18n/cultures\";\r\n\r\n// TODO: use Luxon\r\nconst dtFormats = cultures.invariant.dateTime.formats;\r\n\r\nexport interface IDateTimeDataFormat {\r\n serializationFormat: string;\r\n normalize: (source: string | number | Date) => Date;\r\n serialize: (source: string | number | Date | Moment) => string;\r\n deserialize: (value: string) => Moment;\r\n tryDeserialize: (value: string) => Moment;\r\n isValid: (source: string | number | Date) => boolean;\r\n}\r\n\r\nexport enum DateNumberFormat {\r\n UnixTimeMilliseconds,\r\n UnixTimeSeconds,\r\n OADate // OLE Automation Date\r\n}\r\n\r\nconst USE_LOCAL_TIME = false; // invariant dates\r\n\r\n// dotnet: \"yyyy-MM-ddTHH:mm:ss.FFF\"\r\nconst invariantFormat = \"YYYY-MM-DDTHH:mm:ss.SSS\";\r\nconst s11nFormat = \"YYYY-MM-DDTHH:mm:ss.SSS\"; // TODO: support USE_LOCAL_TIME\r\n\r\nconst m = USE_LOCAL_TIME ? moment : moment.utc;\r\nconst toDate = USE_LOCAL_TIME ? (m: Moment) => m.toDate() : (m: Moment) => new Date(m.format(invariantFormat));\r\n\r\n// https://stackoverflow.com/questions/15549823/oadate-to-milliseconds-timestamp-in-javascript\r\n/* Convert a Microsoft OADate to ECMAScript Date\r\n ** Treat all values as local.\r\n ** @param {string|number} oaDate - OADate value\r\n ** @returns {Date}\r\n */\r\nexport function getDateFromOADate(oaDate: number) {\r\n // Treat integer part is whole days\r\n const days = Math.floor(oaDate); // parseInt(oaDate + \"\")\r\n // Treat decimal part as part of 24hr day, always +ve\r\n const ms = Math.abs((oaDate - days) * 8.64e7); // +oaDate\r\n // Add days and add ms\r\n return new Date(1899, 11, 30 + days, 0, 0, 0, ms);\r\n}\r\n\r\n/* Convert an ECMAScript Date to a Microsoft OADate\r\n ** Treat all dates as local.\r\n ** @param {Date} date - Date to convert\r\n ** @returns {Date}\r\n */\r\nexport function getOADateFromDate(date: Date) {\r\n const temp = new Date(date);\r\n // Set temp to start of day and get whole days between dates\r\n const stDate = new Date(1899, 11, 30);\r\n const days = Math.round((temp.setHours(0, 0, 0, 0) - stDate.getTime()) / 8.64e7);\r\n // Get decimal part of day, OADate always assumes 24 hours in day\r\n const partDay = (Math.abs((date.getTime() - temp.getTime()) % 8.64e7) / 8.64e7).toFixed(10);\r\n return days + partDay.substr(1);\r\n}\r\n\r\nexport function getDateFromNumber(value: number, dateNumberFormat = DateNumberFormat.UnixTimeMilliseconds) {\r\n if (value == undefined) {\r\n return null;\r\n }\r\n switch (dateNumberFormat) {\r\n case DateNumberFormat.UnixTimeMilliseconds:\r\n return new Date(value);\r\n case DateNumberFormat.UnixTimeSeconds:\r\n return new Date(value * 1000);\r\n case DateNumberFormat.OADate:\r\n return getDateFromOADate(value);\r\n }\r\n}\r\n\r\nexport type DateValueFormats = {\r\n string?: string;\r\n number?: DateNumberFormat;\r\n};\r\n\r\nexport function toMoment(source: any, formats?: DateValueFormats) {\r\n if (source == undefined) {\r\n return null;\r\n }\r\n let md: Moment;\r\n if (typeof source === \"string\") {\r\n md = parse(source, formats?.string);\r\n } else if (typeof source === \"number\") {\r\n md = moment(getDateFromNumber(source, formats?.number));\r\n } else if (source instanceof Date) {\r\n // moment.isDate?\r\n md = moment(source);\r\n } else {\r\n if (!moment.isMoment(source)) {\r\n // Invalid\r\n throw new Error(\"Unsupported Moment Source\");\r\n }\r\n md = source;\r\n }\r\n return md;\r\n}\r\n\r\nfunction parse(value: string, format?: string) {\r\n if (value == undefined) {\r\n return null;\r\n }\r\n if (format == undefined) {\r\n format = s11nFormat;\r\n }\r\n let md: Moment;\r\n if (format) {\r\n md = m(value, format, true);\r\n } else {\r\n md = m(value);\r\n // md = m(value, format, true); // ?\r\n }\r\n\r\n // assertInvariant?\r\n // !md.isSame(m(value))\r\n if (md.format(s11nFormat) !== m(value).format(s11nFormat)) {\r\n const errMsg = `Invalid date transport value: ${value}`;\r\n console.warn(errMsg);\r\n // throw new Error(errMsg);\r\n }\r\n if (!md.isValid()) {\r\n throw new Error(`Assertion. Invalid datetime format: ${value}. Expected format: ${format || s11nFormat}.`);\r\n }\r\n return md;\r\n}\r\n\r\n// dtFormats.dateTimeShort\r\nexport function formatDate(date: Date | moment.Moment, format?: string) {\r\n if (date == undefined) {\r\n return \"\";\r\n }\r\n const md = toMoment(date);\r\n if (format == undefined) {\r\n if (!md.hours() && !md.minutes() && !md.seconds()) {\r\n format = dtFormats.dateShort;\r\n } else if (md.milliseconds()) {\r\n // dtFormats.dateTime?\r\n format = dtFormats.dateTime24;\r\n } else {\r\n // dtFormats.dateTimeShort?\r\n format = dtFormats.dateTime24Short;\r\n }\r\n }\r\n return md.format(format);\r\n}\r\n\r\nconst dateTimeFormat = {\r\n serializationFormat: s11nFormat,\r\n isValid: (source: any) => {\r\n if (source == null) {\r\n return true; // no value, it is OK\r\n }\r\n if (typeof source === \"string\") {\r\n return !!parse(source, s11nFormat);\r\n }\r\n // if (typeof source === 'number') {\r\n // return true;\r\n // }\r\n if (source instanceof Date) {\r\n return true;\r\n }\r\n return false;\r\n },\r\n normalize: (source: string | number | Date | Moment) => {\r\n if (source == undefined) {\r\n return null;\r\n }\r\n if (typeof source === \"string\") {\r\n const md = parse(source);\r\n // const md = parse(source, s11nFormat);\r\n source = md;\r\n } else if (typeof source === \"number\") {\r\n // source = getMomentFromUnixTime(source); // ?\r\n source = m(source);\r\n } else if (source instanceof Date) {\r\n // return source;\r\n // not moment.utc(source)!\r\n source = moment(source);\r\n } else {\r\n if (!moment.isMoment(source)) {\r\n // Invalid\r\n throw new Error(\"Unsupported source\");\r\n }\r\n }\r\n return toDate(source);\r\n },\r\n serialize: (source: string | number | Date | Moment, formats?: DateValueFormats) => {\r\n if (source == undefined) {\r\n return null;\r\n }\r\n const md = toMoment(source, formats);\r\n return md.format(s11nFormat);\r\n },\r\n deserialize: (value: string) => {\r\n return parse(value);\r\n },\r\n tryDeserialize: (value: string) => {\r\n try {\r\n return dateTimeFormat.deserialize(value);\r\n } catch (err) {\r\n console.error(err);\r\n return null;\r\n }\r\n }\r\n} as IDateTimeDataFormat;\r\n\r\nexport default dateTimeFormat;\r\n"],"names":["dtFormats","cultures","DateNumberFormat","DateNumberFormat2","invariantFormat","s11nFormat","m","moment","toDate","getDateFromOADate","oaDate","days","ms","getOADateFromDate","date","temp","stDate","partDay","getDateFromNumber","value","dateNumberFormat","toMoment","source","formats","md","parse","format","errMsg","formatDate","dateTimeFormat","err"],"mappings":"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"}
1
+ {"version":3,"file":"dateTimeDataFormat.es.js","sources":["../src/dateTimeDataFormat.ts"],"sourcesContent":["import { Moment } from \"moment\";\r\nimport moment from \"moment\";\r\nimport cultures from \"./i18n/cultures\";\r\n\r\n// TODO: use Luxon\r\nconst dtFormats = cultures.invariant.dateTime.formats;\r\n\r\nexport interface IDateTimeDataFormat {\r\n serializationFormat: string;\r\n normalize: (source: string | number | Date) => Date;\r\n serialize: (source: string | number | Date | Moment) => string;\r\n deserialize: (value: string) => Moment;\r\n tryDeserialize: (value: string) => Moment;\r\n isValid: (source: string | number | Date) => boolean;\r\n}\r\n\r\nexport enum DateNumberFormat {\r\n UnixTimeMilliseconds,\r\n UnixTimeSeconds,\r\n OADate // OLE Automation Date\r\n}\r\n\r\nconst USE_LOCAL_TIME = false; // invariant dates\r\n\r\n// dotnet: \"yyyy-MM-ddTHH:mm:ss.FFF\"\r\nconst invariantFormat = \"YYYY-MM-DDTHH:mm:ss.SSS\";\r\nconst s11nFormat = \"YYYY-MM-DDTHH:mm:ss.SSS\"; // TODO: support USE_LOCAL_TIME\r\n\r\nconst m = USE_LOCAL_TIME ? moment : moment.utc;\r\nconst toDate = USE_LOCAL_TIME ? (m: Moment) => m.toDate() : (m: Moment) => new Date(m.format(invariantFormat));\r\n\r\n// https://stackoverflow.com/questions/15549823/oadate-to-milliseconds-timestamp-in-javascript\r\n/* Convert a Microsoft OADate to ECMAScript Date\r\n ** Treat all values as local.\r\n ** @param {string|number} oaDate - OADate value\r\n ** @returns {Date}\r\n */\r\nexport function getDateFromOADate(oaDate: number) {\r\n // Treat integer part is whole days\r\n const days = Math.floor(oaDate); // parseInt(oaDate + \"\")\r\n // Treat decimal part as part of 24hr day, always +ve\r\n const ms = Math.abs((oaDate - days) * 8.64e7); // +oaDate\r\n // Add days and add ms\r\n return new Date(1899, 11, 30 + days, 0, 0, 0, ms);\r\n}\r\n\r\n/* Convert an ECMAScript Date to a Microsoft OADate\r\n ** Treat all dates as local.\r\n ** @param {Date} date - Date to convert\r\n ** @returns {Date}\r\n */\r\nexport function getOADateFromDate(date: Date) {\r\n const temp = new Date(date);\r\n // Set temp to start of day and get whole days between dates\r\n const stDate = new Date(1899, 11, 30);\r\n const days = Math.round((temp.setHours(0, 0, 0, 0) - stDate.getTime()) / 8.64e7);\r\n // Get decimal part of day, OADate always assumes 24 hours in day\r\n const partDay = (Math.abs((date.getTime() - temp.getTime()) % 8.64e7) / 8.64e7).toFixed(10);\r\n return days + partDay.substr(1);\r\n}\r\n\r\nexport function getDateFromNumber(value: number, dateNumberFormat = DateNumberFormat.UnixTimeMilliseconds) {\r\n if (value == undefined) {\r\n return null;\r\n }\r\n switch (dateNumberFormat) {\r\n case DateNumberFormat.UnixTimeMilliseconds:\r\n return new Date(value);\r\n case DateNumberFormat.UnixTimeSeconds:\r\n return new Date(value * 1000);\r\n case DateNumberFormat.OADate:\r\n return getDateFromOADate(value);\r\n }\r\n}\r\n\r\nexport type DateValueFormats = {\r\n string?: string;\r\n number?: DateNumberFormat;\r\n};\r\n\r\nexport function toMoment(source: any, formats?: DateValueFormats) {\r\n if (source == undefined) {\r\n return null;\r\n }\r\n let md: Moment;\r\n if (typeof source === \"string\") {\r\n md = parse(source, formats?.string);\r\n } else if (typeof source === \"number\") {\r\n md = moment(getDateFromNumber(source, formats?.number));\r\n } else if (source instanceof Date) {\r\n // moment.isDate?\r\n md = moment(source);\r\n } else {\r\n if (!moment.isMoment(source)) {\r\n // Invalid\r\n throw new Error(\"Unsupported Moment Source\");\r\n }\r\n md = source;\r\n }\r\n return md;\r\n}\r\n\r\nfunction parse(value: string, format?: string) {\r\n if (value == undefined) {\r\n return null;\r\n }\r\n if (format == undefined) {\r\n format = s11nFormat;\r\n }\r\n let md: Moment;\r\n if (format) {\r\n md = m(value, format, true);\r\n } else {\r\n md = m(value);\r\n // md = m(value, format, true); // ?\r\n }\r\n\r\n // assertInvariant?\r\n // !md.isSame(m(value))\r\n if (md.format(s11nFormat) !== m(value).format(s11nFormat)) {\r\n const errMsg = `Invalid date transport value: ${value}`;\r\n console.warn(errMsg);\r\n // throw new Error(errMsg);\r\n }\r\n if (!md.isValid()) {\r\n throw new Error(`Assertion. Invalid datetime format: ${value}. Expected format: ${format || s11nFormat}.`);\r\n }\r\n return md;\r\n}\r\n\r\n// dtFormats.dateTimeShort\r\nexport function formatDate(date: Date | moment.Moment, format?: string) {\r\n if (date == undefined) {\r\n return \"\";\r\n }\r\n const md = toMoment(date);\r\n if (format == undefined) {\r\n if (!md.hours() && !md.minutes() && !md.seconds()) {\r\n format = dtFormats.dateShort;\r\n } else if (md.milliseconds()) {\r\n // dtFormats.dateTime?\r\n format = dtFormats.dateTime24;\r\n } else {\r\n // dtFormats.dateTimeShort?\r\n format = dtFormats.dateTime24Short;\r\n }\r\n }\r\n return md.format(format);\r\n}\r\n\r\nconst dateTimeFormat = {\r\n serializationFormat: s11nFormat,\r\n isValid: (source: any) => {\r\n if (source == null) {\r\n return true; // no value, it is OK\r\n }\r\n if (typeof source === \"string\") {\r\n return !!parse(source, s11nFormat);\r\n }\r\n // if (typeof source === 'number') {\r\n // return true;\r\n // }\r\n if (source instanceof Date) {\r\n return true;\r\n }\r\n return false;\r\n },\r\n normalize: (source: string | number | Date | Moment) => {\r\n if (source == undefined) {\r\n return null;\r\n }\r\n if (typeof source === \"string\") {\r\n const md = parse(source);\r\n // const md = parse(source, s11nFormat);\r\n source = md;\r\n } else if (typeof source === \"number\") {\r\n // source = getMomentFromUnixTime(source); // ?\r\n source = m(source);\r\n } else if (source instanceof Date) {\r\n // return source;\r\n // not moment.utc(source)!\r\n source = moment(source);\r\n } else {\r\n if (!moment.isMoment(source)) {\r\n // Invalid\r\n throw new Error(\"Unsupported source\");\r\n }\r\n }\r\n return toDate(source);\r\n },\r\n serialize: (source: string | number | Date | Moment, formats?: DateValueFormats) => {\r\n if (source == undefined) {\r\n return null;\r\n }\r\n const md = toMoment(source, formats);\r\n return md.format(s11nFormat);\r\n },\r\n deserialize: (value: string) => {\r\n return parse(value);\r\n },\r\n tryDeserialize: (value: string) => {\r\n try {\r\n return dateTimeFormat.deserialize(value);\r\n } catch (err) {\r\n console.error(err);\r\n return null;\r\n }\r\n }\r\n} as IDateTimeDataFormat;\r\n\r\nexport default dateTimeFormat;\r\n"],"names":["dtFormats","cultures","DateNumberFormat","invariantFormat","s11nFormat","m","moment","toDate","getDateFromOADate","oaDate","days","ms","getOADateFromDate","date","temp","stDate","partDay","getDateFromNumber","value","dateNumberFormat","toMoment","source","formats","md","parse","format","errMsg","formatDate","dateTimeFormat","err"],"mappings":"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"}