@actdim/utico 0.9.2 → 0.9.3

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 (38) hide show
  1. package/dist/array.es.js.map +1 -1
  2. package/dist/arrayExtensions.es.js.map +1 -1
  3. package/dist/cache/cacheDb.es.js +28 -31
  4. package/dist/cache/cacheDb.es.js.map +1 -1
  5. package/dist/cache/memoryCache.es.js +5 -8
  6. package/dist/cache/memoryCache.es.js.map +1 -1
  7. package/dist/cache/persistentCache.d.ts +1 -1
  8. package/dist/cache/persistentCache.es.js +30 -35
  9. package/dist/cache/persistentCache.es.js.map +1 -1
  10. package/dist/dataFormats.es.js.map +1 -1
  11. package/dist/dateTimeDataFormat.es.js +11 -11
  12. package/dist/dateTimeDataFormat.es.js.map +1 -1
  13. package/dist/gfx/canvasUtils.d.ts +8 -2
  14. package/dist/gfx/canvasUtils.d.ts.map +1 -1
  15. package/dist/gfx/canvasUtils.es.js +85 -74
  16. package/dist/gfx/canvasUtils.es.js.map +1 -1
  17. package/dist/gfx/color.es.js +1 -2
  18. package/dist/gfx/color.es.js.map +1 -1
  19. package/dist/i18n/cultures.es.js.map +1 -1
  20. package/dist/i18n/enUsCulture.es.js.map +1 -1
  21. package/dist/math.es.js.map +1 -1
  22. package/dist/metadata.es.js.map +1 -1
  23. package/dist/mutex.es.js +3 -8
  24. package/dist/mutex.es.js.map +1 -1
  25. package/dist/patterns.es.js.map +1 -1
  26. package/dist/storage/persistentStorage.es.js +4 -7
  27. package/dist/storage/persistentStorage.es.js.map +1 -1
  28. package/dist/stringCore.es.js.map +1 -1
  29. package/dist/structEvent.es.js +12 -16
  30. package/dist/structEvent.es.js.map +1 -1
  31. package/dist/typeCore.es.js.map +1 -1
  32. package/dist/typeUtils.es.js.map +1 -1
  33. package/dist/utils.d.ts +1 -0
  34. package/dist/utils.d.ts.map +1 -1
  35. package/dist/utils.es.js +44 -36
  36. package/dist/utils.es.js.map +1 -1
  37. package/dist/watchable.es.js.map +1 -1
  38. package/package.json +16 -13
@@ -1 +1 @@
1
- {"version":3,"file":"array.es.js","sources":["../src/array.ts"],"sourcesContent":["export function copyArray(src: any[], dst: any[], srcIndex = 0, dstIndex = 0, length?: number) { \r\n return dst.copy(src, srcIndex, dstIndex, length);\r\n}"],"names":["copyArray","src","dst","srcIndex","dstIndex","length"],"mappings":"AAAO,SAASA,EAAUC,GAAYC,GAAYC,IAAW,GAAGC,IAAW,GAAGC,GAAiB;AAC3F,SAAOH,EAAI,KAAKD,GAAKE,GAAUC,GAAUC,CAAM;AACnD;"}
1
+ {"version":3,"file":"array.es.js","sources":["D:/Src/my/actdim/public/utico/src/array.ts"],"sourcesContent":["export function copyArray(src: any[], dst: any[], srcIndex = 0, dstIndex = 0, length?: number) { \r\n return dst.copy(src, srcIndex, dstIndex, length);\r\n}"],"names":["copyArray","src","dst","srcIndex","dstIndex","length"],"mappings":"AAAO,SAASA,EAAUC,GAAYC,GAAYC,IAAW,GAAGC,IAAW,GAAGC,GAAiB;AAC3F,SAAOH,EAAI,KAAKD,GAAKE,GAAUC,GAAUC,CAAM;AACnD;"}
@@ -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":["D:/Src/my/actdim/public/utico/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,22 +1,19 @@
1
- var d = Object.defineProperty;
2
- var l = (s, t, a) => t in s ? d(s, t, { enumerable: !0, configurable: !0, writable: !0, value: a }) : s[t] = a;
3
- var e = (s, t, a) => l(s, typeof t != "symbol" ? t + "" : t, a);
4
- import b from "dexie";
5
- const c = "registry", i = "data", h = ["id", "createdAt", "accessedAt", "expiresAt"], y = ["id", "value"];
6
- class u {
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;
7
9
  constructor(t) {
8
- e(this, "id");
9
- e(this, "createdAt");
10
- // updatedAt: number;
11
- e(this, "accessedAt");
12
- e(this, "expiresAt");
13
10
  Object.assign(this, t);
14
11
  }
15
12
  }
16
- class A {
13
+ class y {
14
+ id;
15
+ value;
17
16
  constructor(t) {
18
- e(this, "id");
19
- e(this, "value");
20
17
  Object.assign(this, t);
21
18
  }
22
19
  // constructor(key: string, value: string) {
@@ -24,27 +21,27 @@ class A {
24
21
  // this.value = value;
25
22
  // }
26
23
  }
27
- class j extends b {
28
- constructor(a) {
29
- if (!a)
24
+ class g extends o {
25
+ // private _dbName: string;
26
+ // catalog/entries
27
+ registry;
28
+ data;
29
+ constructor(t) {
30
+ if (!t)
30
31
  throw new Error("Invalid database name");
31
- super(a);
32
- // private _dbName: string;
33
- // catalog/entries
34
- e(this, "registry");
35
- e(this, "data");
36
- const r = this;
37
- r.version(1).stores({
38
- [c]: h.join(", "),
39
- [i]: y.join(", ")
40
- }), this.registry = r.table(c), this.data = r.table(i), r.registry.hook("deleting", async (o, g, n) => {
41
- await n.table(i).delete(o);
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);
42
39
  });
43
40
  }
44
41
  }
45
42
  export {
46
- A as CacheDataItem,
47
- j as CacheDb,
48
- u as CacheEntry
43
+ y as CacheDataItem,
44
+ g as CacheDb,
45
+ h as CacheEntry
49
46
  };
50
47
  //# sourceMappingURL=cacheDb.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cacheDb.es.js","sources":["../../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;\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","__publicField","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,EAO3C,YAAYC,GAA0B;AANtC,IAAAC,EAAA;AACA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGW,WAAA,OAAO,MAAMD,CAAG;AAAA,EAO3B;AACJ;AAGO,MAAME,EAAwC;AAAA,EAIjD,YAAYF,GAA6B;AAHzC,IAAAC,EAAA;AACA,IAAAA,EAAA;AAGW,WAAA,OAAO,MAAMD,CAAG;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAMJ;AAEO,MAAMG,UAAgBC,EAAM;AAAA,EAO/B,YAAYC,GAAgB;AAIxB,QAAI,CAACA;AACK,YAAA,IAAI,MAAM,uBAAuB;AAG3C,UAAMA,CAAM;AAXhB;AAAA;AAAA,IAAAJ,EAAA;AACA,IAAAA,EAAA;AAcI,UAAMK,IAAK;AAMR,IAAAA,EAAA,QAAQ,CAAC,EAAE,OAAO;AAAA,MACjB,CAACX,CAAiB,GAAGE,EAAmB,KAAK,IAAI;AAAA,MACjD,CAACD,CAAa,GAAGE,EAAsB,KAAK,IAAI;AAAA,IAAA,CACnD,GAUI,KAAA,WAAWQ,EAAG,MAAMX,CAAiB,GACrC,KAAA,OAAOW,EAAG,MAAMV,CAAa,GAElCU,EAAG,SAAS,KAAK,YAAY,OAAOC,GAAKC,GAAKC,MAAgB;AAC1D,YAAMA,EAAY,MAAMb,CAAa,EAAE,OAAOW,CAAG;AAAA,IAAA,CACpD;AAAA,EAWL;AACJ;"}
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,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":["D:/Src/my/actdim/public/utico/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,5 +1,5 @@
1
1
  import { CacheDb, ICacheEntry, ICacheDataItem } from './cacheDb';
2
- import { StructEventTarget } from '../structEvent';
2
+ import { StructEventTarget } from './D:/Src/my/actdim/public/utico/src/structEvent';
3
3
  type Duration = number | {
4
4
  seconds?: number;
5
5
  minutes?: number;
@@ -1,31 +1,27 @@
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 { StructEventTarget as o, StructEvent as d } from "../structEvent.es.js";
3
+ import { v4 as l } from "uuid";
4
+ const u = {
8
5
  cleanupTimeout: 1e3
9
6
  };
10
- class v extends w {
7
+ class p extends o {
8
+ // https://demo.agektmr.com/storage/
9
+ // https://www.html5rocks.com/en/tutorials/offline/quota-research/
10
+ // https://www.raymondcamden.com/2015/04/17/indexeddb-and-limits
11
+ // https://github.com/jonnysmith1981/getIndexedDbSize/blob/master/getIndexedDbSize.js
12
+ // https://developer.chrome.com/apps/offline_storage#query
13
+ // https://golb.hplar.ch/2018/01/IndexedDB-programming-with-Dexie-js.html
14
+ // http://www.forerunnerdb.com/licensing.html
15
+ // https://github.com/ignasbernotas/dexie-relationships
16
+ _db;
17
+ _isDisposed;
18
+ _jobTimerId;
19
+ _options;
11
20
  // cleanupTimeout - serviceJobTimeout
12
21
  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)
22
+ if (super(), !t)
27
23
  throw new Error("Database cannot be null");
28
- this._isDisposed = !1, this._jobTimerId = null, this._db = t, this._options = { ...e, ...f }, this.scheduleServiceJob();
24
+ this._isDisposed = !1, this._jobTimerId = null, this._db = t, this._options = { ...e, ...u }, this.scheduleServiceJob();
29
25
  }
30
26
  scheduleServiceJob() {
31
27
  const t = async () => {
@@ -43,9 +39,9 @@ class v extends w {
43
39
  async deleteExpired(t) {
44
40
  const e = [];
45
41
  return t || (t = /* @__PURE__ */ new Date()), await this.exec(async () => {
46
- const i = await this._db.registry.where(b("expiresAt")).below(t.getTime()).toArray();
42
+ const i = await this._db.registry.where(c("expiresAt")).below(t.getTime()).toArray();
47
43
  for (const s of i) {
48
- const c = new _("evict", {
44
+ const r = new d("evict", {
49
45
  detail: {
50
46
  entry: s
51
47
  // keepAliveOptions: {}
@@ -53,7 +49,7 @@ class v extends w {
53
49
  target: this,
54
50
  cancelable: !0
55
51
  });
56
- this.dispatchEvent(c), await this._db.registry.delete(s.id), e.push(s.id);
52
+ this.dispatchEvent(r), await this._db.registry.delete(s.id), e.push(s.id);
57
53
  }
58
54
  }), e;
59
55
  }
@@ -85,8 +81,8 @@ class v extends w {
85
81
  async bulkGet(t) {
86
82
  const e = {};
87
83
  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)
84
+ const s = (await this._db.registry.bulkGet(t)).reduce((a, n, y) => (a[n.id] = n, a), {}), r = await this._db.data.bulkGet(t);
85
+ for (const a of r)
90
86
  e[a.id] = { ...s[a.id], ...a }, delete s[a.id];
91
87
  for (const a of Object.keys(s))
92
88
  e[a] = { ...s[a], value: void 0 };
@@ -120,18 +116,17 @@ class v extends w {
120
116
  }
121
117
  async set(t, e, i) {
122
118
  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();
119
+ const s = await this._db.registry.get(t), r = (/* @__PURE__ */ new Date()).getTime();
120
+ t || (t = l());
121
+ const a = typeof i.absoluteExpiration == "number" ? i.absoluteExpiration : i.absoluteExpiration?.getTime(), n = typeof i.slidingExpiration == "number" ? i.slidingExpiration : i.slidingExpiration?.getTime();
127
122
  await this._db.registry.put({
128
123
  id: t,
129
- createdAt: s ? s.createdAt : c,
124
+ createdAt: s ? s.createdAt : r,
130
125
  accessedAt: s ? s.accessedAt : null,
131
126
  // now
132
127
  // updatedAt: now,
133
128
  expiresAt: a,
134
- slidingExpiration: d
129
+ slidingExpiration: n
135
130
  }), await this._db.data.put({
136
131
  id: t,
137
132
  value: e
@@ -151,6 +146,6 @@ class v extends w {
151
146
  // TODO: support update bulkUpdate, bulkSet
152
147
  }
153
148
  export {
154
- v as PersistentCache
149
+ p as PersistentCache
155
150
  };
156
151
  //# 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":["D:/Src/my/actdim/public/utico/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","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","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":["D:/Src/my/actdim/public/utico/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":["D:/Src/my/actdim/public/utico/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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"}
@@ -11,10 +11,16 @@ export declare const querySvgData: (selector: string) => string;
11
11
  export declare function toObjectUrl(canvas: HTMLCanvasElement, mimeType?: string, quality?: number): Promise<string>;
12
12
  export declare function drawImageAsync(src: string, context: CanvasRenderingContext2D): Promise<void>;
13
13
  export declare const drawSvgAsync: (svgData: string, context: CanvasRenderingContext2D, useDataUrl?: boolean) => Promise<void>;
14
- export declare function canvas2Image(canvas: HTMLCanvasElement, size?: number[], mimeType?: string, quality?: number): HTMLImageElement;
15
- export declare function canvas2ImageAsync(canvas: HTMLCanvasElement, size?: number[], mimeType?: string, quality?: number): Promise<HTMLImageElement>;
14
+ export declare function canvasToImage(canvas: HTMLCanvasElement, size?: number[], mimeType?: string, quality?: number): HTMLImageElement;
15
+ export declare function canvasToImageAsync(canvas: HTMLCanvasElement, size?: number[], mimeType?: string, quality?: number): Promise<HTMLImageElement>;
16
16
  export declare function objectUrlToDataURL(objectUrl: string): Promise<string>;
17
17
  export declare const getSvgSize: (svg: string) => [number, number];
18
18
  export declare function getSvgElementSize(svgDoc: SVGSVGElement): [number, number];
19
19
  export declare const refineSvg: (data: string) => string;
20
+ export declare function drawRoundedRect(context: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number | {
21
+ tl: number;
22
+ tr: number;
23
+ br: number;
24
+ bl: number;
25
+ }): void;
20
26
  //# sourceMappingURL=canvasUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvasUtils.d.ts","sourceRoot":"","sources":["../../src/gfx/canvasUtils.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;;;EAsBhD;AAID,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtE,wBAAgB,OAAO,CACnB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,QAAK,EACT,YAAY,EAAE,gBAAgB,EAC9B,WAAW,SAAmB,EAC9B,UAAU,SAAU,QAkCvB;AASD,eAAO,MAAM,aAAa,aAEE,WAAW,EAAE,eAAe,MAAM,EAAE,OAAO,MAAM,oBAuBzE,CAAC;AAEL,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,UAGnD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,UAKjD;AAGD,eAAO,MAAM,YAAY,aAEH,MAAM,WAKxB,CAAC;AAEL,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,QAAQ,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,mBAe9F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,iBAgB5E;AAED,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,SAAS,wBAAwB,EAAE,oBAAkB,kBAGlG,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,oBAehH;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,6BAgB3H;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa3E;AAED,eAAO,MAAM,UAAU,QAEN,MAAM,qBAOnB,CAAC;AAEL,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgCzE;AAED,eAAO,MAAM,SAAS,SAEJ,MAAM,WAUpB,CAAC"}
1
+ {"version":3,"file":"canvasUtils.d.ts","sourceRoot":"","sources":["../../src/gfx/canvasUtils.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;;;EAsBhD;AAID,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtE,wBAAgB,OAAO,CACnB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,QAAK,EACT,YAAY,EAAE,gBAAgB,EAC9B,WAAW,SAAmB,EAC9B,UAAU,SAAU,QAkCvB;AASD,eAAO,MAAM,aAAa,aAEE,WAAW,EAAE,eAAe,MAAM,EAAE,OAAO,MAAM,oBAuBzE,CAAC;AAEL,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,UAGnD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,UAKjD;AAGD,eAAO,MAAM,YAAY,aAEH,MAAM,WAKxB,CAAC;AAEL,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,QAAQ,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,mBAe9F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,iBAgB5E;AAED,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,SAAS,wBAAwB,EAAE,oBAAkB,kBAGlG,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,oBAejH;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,6BAgB5H;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa3E;AAED,eAAO,MAAM,UAAU,QAEN,MAAM,qBAOnB,CAAC;AAEL,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgCzE;AAED,eAAO,MAAM,SAAS,SAEJ,MAAM,WAUpB,CAAC;AAEL,wBAAgB,eAAe,CAC3B,OAAO,EAAE,wBAAwB,EACjC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EACK,MAAM,GACN;IACI,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACd,QA0CV"}