@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
@@ -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"}
@@ -1,150 +1,161 @@
1
- const u = window.URL || window.webkitURL;
2
- function x(t, e) {
3
- const n = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"), a = n.getContext("2d");
4
- return a && (a.imageSmoothingQuality = "high"), n.width = t, n.height = e, { canvas: n, context: a };
1
+ const g = window.URL || window.webkitURL;
2
+ function L(t, e) {
3
+ const n = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"), o = n.getContext("2d");
4
+ return o && (o.imageSmoothingQuality = "high"), n.width = t, n.height = e, { canvas: n, context: o };
5
5
  }
6
6
  const f = "actualBoundingBoxRight" in TextMetrics.prototype;
7
- function L(t, e = "", n, a = t.canvas.width, r = "Arial") {
8
- let o = 1;
7
+ function R(t, e = "", n, o = t.canvas.width, r = "Arial") {
8
+ let a = 1;
9
9
  const s = () => {
10
- t.font = o + "px " + r;
10
+ t.font = a + "px " + r;
11
11
  };
12
12
  s();
13
- let i = g(e);
14
- for (; i && i <= a; )
15
- o++, s(), i = g(e);
16
- for (; i && i > a; )
17
- o -= 0.1, s(), i = g(e);
18
- o += 0.1, s();
19
- const c = t.measureText(e).actualBoundingBoxLeft || 0, [m, w] = n(o);
20
- t.fillText(e, m + c, w);
21
- function g(d) {
22
- const l = t.measureText(d);
23
- return f ? l.actualBoundingBoxLeft + l.actualBoundingBoxRight : l.width;
13
+ let i = l(e);
14
+ for (; i && i <= o; )
15
+ a++, s(), i = l(e);
16
+ for (; i && i > o; )
17
+ a -= 0.1, s(), i = l(e);
18
+ a += 0.1, s();
19
+ const c = t.measureText(e).actualBoundingBoxLeft || 0, [d, h] = n(a);
20
+ t.fillText(e, d + c, h);
21
+ function l(w) {
22
+ const u = t.measureText(w);
23
+ return f ? u.actualBoundingBoxLeft + u.actualBoundingBoxRight : u.width;
24
24
  }
25
25
  }
26
- function v(t) {
26
+ function b(t) {
27
27
  return window.encodeURIComponent(t).replace(/%([0-9A-F]{2})/g, (e, n) => String.fromCharCode(parseInt(n, 16)));
28
28
  }
29
- const B = (() => {
29
+ const y = (() => {
30
30
  const t = new XMLSerializer();
31
- return async (e, n, a) => {
32
- const r = n[0], o = n[1];
31
+ return async (e, n, o) => {
32
+ const r = n[0], a = n[1];
33
33
  let s = e.map(
34
- (c) => `<foreignObject width="${r}" height="${o}">
34
+ (c) => `<foreignObject width="${r}" height="${a}">
35
35
  <body xmlns="http://www.w3.org/1999/xhtml">
36
36
  ${c.outerHTML}
37
37
  </body>
38
38
  </foreignObject>`
39
39
  ).join("");
40
- s = `<style>${a}</style>${s}`;
40
+ s = `<style>${o}</style>${s}`;
41
41
  var i = document.createElementNS("http://www.w3.org/2000/svg", "svg");
42
- return i.setAttributeNS(null, "viewBox", `0 0 ${r} ${o}`), i.setAttributeNS(null, "width", r + ""), i.setAttributeNS(null, "height", o + ""), i.innerHTML = s, t.serializeToString(i);
42
+ return i.setAttributeNS(null, "viewBox", `0 0 ${r} ${a}`), i.setAttributeNS(null, "width", r + ""), i.setAttributeNS(null, "height", a + ""), i.innerHTML = s, t.serializeToString(i);
43
43
  };
44
44
  })();
45
- function b(t) {
45
+ function v(t) {
46
46
  const e = new Blob([t], { type: "image/svg+xml;charset=utf-8" });
47
- return u.createObjectURL(e);
47
+ return g.createObjectURL(e);
48
48
  }
49
49
  function S(t) {
50
- return "data:image/svg+xml;base64," + window.btoa(v(t));
50
+ return "data:image/svg+xml;base64," + window.btoa(b(t));
51
51
  }
52
- const U = (() => {
52
+ const B = (() => {
53
53
  const t = new XMLSerializer();
54
54
  return (e) => {
55
55
  const n = document.querySelector(e);
56
56
  return t.serializeToString(n);
57
57
  };
58
58
  })();
59
- function y(t, e = "image/png", n) {
60
- return new Promise((a, r) => {
59
+ function p(t, e = "image/png", n) {
60
+ return new Promise((o, r) => {
61
61
  try {
62
62
  t.toBlob(
63
- (o) => {
64
- a(URL.createObjectURL(o));
63
+ (a) => {
64
+ o(URL.createObjectURL(a));
65
65
  },
66
66
  e,
67
67
  n
68
68
  );
69
- } catch (o) {
70
- r(o);
69
+ } catch (a) {
70
+ r(a);
71
71
  }
72
72
  });
73
73
  }
74
- function p(t, e) {
75
- return new Promise((n, a) => {
74
+ function T(t, e) {
75
+ return new Promise((n, o) => {
76
76
  try {
77
77
  const r = new Image();
78
78
  r.crossOrigin = "anonymous", r.onload = () => {
79
79
  e.drawImage(r, 0, 0, r.width, r.height, 0, 0, e.canvas.width, e.canvas.height), n();
80
80
  }, r.src = t;
81
81
  } catch (r) {
82
- a(r);
82
+ o(r);
83
83
  }
84
84
  });
85
85
  }
86
- const O = (t, e, n = !1) => {
87
- const a = n ? S(t) : b(t);
88
- return p(a, e).finally(() => u.revokeObjectURL(a));
86
+ const U = (t, e, n = !1) => {
87
+ const o = n ? S(t) : v(t);
88
+ return T(o, e).finally(() => g.revokeObjectURL(o));
89
89
  };
90
- function R(t, e, n = "image/png", a) {
90
+ function O(t, e, n = "image/png", o) {
91
91
  const r = new Image();
92
92
  r.crossOrigin = "anonymous", e && (e[0] && (r.width = e[0]), e[1] && (r.height = e[1]));
93
- const o = t.toDataURL(n, a);
94
- return r.src = o, r;
93
+ const a = t.toDataURL(n, o);
94
+ return r.src = a, r;
95
95
  }
96
- async function T(t, e, n = "image/png", a) {
96
+ async function A(t, e, n = "image/png", o) {
97
97
  const r = new Image();
98
98
  r.crossOrigin = "anonymous", e && (e[0] && (r.width = e[0]), e[1] && (r.height = e[1]));
99
- const o = await y(t, n, a);
100
- return r.onload = () => u.revokeObjectURL(o), r.src = o, r;
99
+ const a = await p(t, n, o);
100
+ return r.onload = () => g.revokeObjectURL(a), r.src = a, r;
101
101
  }
102
- async function A(t) {
102
+ async function I(t) {
103
103
  const n = await (await fetch(t)).blob();
104
- return new Promise((a, r) => {
104
+ return new Promise((o, r) => {
105
105
  try {
106
- const o = new FileReader();
107
- o.onloadend = () => a(o.result), o.readAsDataURL(n);
108
- } catch (o) {
109
- r(o);
106
+ const a = new FileReader();
107
+ a.onloadend = () => o(a.result), a.readAsDataURL(n);
108
+ } catch (a) {
109
+ r(a);
110
110
  }
111
111
  });
112
112
  }
113
- const I = (() => {
113
+ const j = (() => {
114
114
  const t = new DOMParser();
115
115
  return (e) => {
116
- const a = t.parseFromString(e, "text/xml").querySelector("svg");
117
- return h(a);
116
+ const o = t.parseFromString(e, "text/xml").querySelector("svg");
117
+ return m(o);
118
118
  };
119
119
  })();
120
- function h(t) {
120
+ function m(t) {
121
121
  let e = 0;
122
122
  t.width.baseVal.unitType === 5 && (e = t.width.baseVal.value), e || (e = t.width.baseVal.value), e || (e = t.viewBox.baseVal.width);
123
123
  let n = 0;
124
124
  return t.height.baseVal.unitType === 5 && (n = t.height.baseVal.value), n || (n = t.height.baseVal.value), n || (n = t.viewBox.baseVal.height), [e, n];
125
125
  }
126
- const j = (() => {
126
+ const M = (() => {
127
127
  const t = new DOMParser();
128
128
  return (e) => {
129
- const a = t.parseFromString(e, "text/xml").querySelector("svg"), r = h(a);
130
- return a.setAttribute("width", `${r[0]}px`), a.setAttribute("height", `${r[1]}px`), a.outerHTML;
129
+ const o = t.parseFromString(e, "text/xml").querySelector("svg"), r = m(o);
130
+ return o.setAttribute("width", `${r[0]}px`), o.setAttribute("height", `${r[1]}px`), o.outerHTML;
131
131
  };
132
132
  })();
133
+ function C(t, e, n, o, r, a) {
134
+ if (typeof a == "number")
135
+ a = { tl: a, tr: a, br: a, bl: a };
136
+ else {
137
+ const s = { tl: 0, tr: 0, br: 0, bl: 0 };
138
+ for (let i in s)
139
+ a[i] = a[i] || s[i];
140
+ }
141
+ t.beginPath(), t.moveTo(e + a.tl, n), t.lineTo(e + o - a.tr, n), t.quadraticCurveTo(e + o, n, e + o, n + a.tr), t.lineTo(e + o, n + r - a.br), t.quadraticCurveTo(e + o, n + r, e + o - a.br, n + r), t.lineTo(e + a.bl, n + r), t.quadraticCurveTo(e, n + r, e, n + r - a.bl), t.lineTo(e, n + a.tl), t.quadraticCurveTo(e, n, e + a.tl, n), t.closePath();
142
+ }
133
143
  export {
134
- R as canvas2Image,
135
- T as canvas2ImageAsync,
136
- x as createCanvas,
137
- p as drawImageAsync,
138
- O as drawSvgAsync,
139
- L as fitText,
140
- h as getSvgElementSize,
144
+ O as canvasToImage,
145
+ A as canvasToImageAsync,
146
+ L as createCanvas,
147
+ T as drawImageAsync,
148
+ C as drawRoundedRect,
149
+ U as drawSvgAsync,
150
+ R as fitText,
151
+ m as getSvgElementSize,
141
152
  S as getSvgImageDataUrl,
142
- b as getSvgImageObjectUrl,
143
- I as getSvgSize,
144
- B as html2SvgAsync,
145
- A as objectUrlToDataURL,
146
- U as querySvgData,
147
- j as refineSvg,
148
- y as toObjectUrl
153
+ v as getSvgImageObjectUrl,
154
+ j as getSvgSize,
155
+ y as html2SvgAsync,
156
+ I as objectUrlToDataURL,
157
+ B as querySvgData,
158
+ M as refineSvg,
159
+ p as toObjectUrl
149
160
  };
150
161
  //# sourceMappingURL=canvasUtils.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvasUtils.es.js","sources":["../../src/gfx/canvasUtils.ts"],"sourcesContent":["const DOMURL = window.URL || window.webkitURL;\r\n\r\nexport function createCanvas(w: number, h: number /*, dpi?: number*/) {\r\n const canvas = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"canvas\") as HTMLCanvasElement;\r\n // if (!dpi) {\r\n // dpi = window.devicePixelRatio;\r\n // }\r\n // context2d\r\n const context = canvas.getContext(\"2d\");\r\n if (context) {\r\n // context.imageSmoothingEnabled = true;\r\n // context.mozImageSmoothingEnabled = true;\r\n // context.oImageSmoothingEnabled = true;\r\n // context.webkitImageSmoothingEnabled = true;\r\n context[\"imageSmoothingQuality\"] = \"high\";\r\n }\r\n canvas.width = w;\r\n // canvas.width = w * dpi;\r\n canvas.height = h;\r\n // canvas.height = h * dpi;\r\n\r\n // canvas.style.width = w + \"px\";\r\n // context.scale(dpi, dpi);\r\n return { canvas, context };\r\n}\r\n\r\nconst supportExtendedMetrics = \"actualBoundingBoxRight\" in TextMetrics.prototype;\r\n\r\nexport type TextSizeProvider = (fontSize: number) => [number, number];\r\n\r\nexport function fitText(\r\n ctx: CanvasRenderingContext2D,\r\n text = \"\",\r\n sizeProvider: TextSizeProvider,\r\n targetWidth = ctx.canvas.width,\r\n fontFamily = \"Arial\"\r\n) {\r\n let fontSize = 1;\r\n const updateFont = () => {\r\n ctx.font = fontSize + \"px \" + fontFamily;\r\n };\r\n updateFont();\r\n let width = getBBOxWidth(text);\r\n // first pass width increment = 1\r\n while (width && width <= targetWidth) {\r\n fontSize++;\r\n updateFont();\r\n width = getBBOxWidth(text);\r\n }\r\n // second pass, the other way around, with increment = -0.1\r\n while (width && width > targetWidth) {\r\n fontSize -= 0.1;\r\n updateFont();\r\n width = getBBOxWidth(text);\r\n }\r\n // revert to last valid step\r\n fontSize += 0.1;\r\n updateFont();\r\n\r\n // we need to measure where our bounding box actually starts\r\n const offsetLeft = ctx.measureText(text).actualBoundingBoxLeft || 0;\r\n const [x, y] = sizeProvider(fontSize);\r\n ctx.fillText(text, x + offsetLeft, y);\r\n\r\n function getBBOxWidth(text) {\r\n const measure = ctx.measureText(text);\r\n\r\n return supportExtendedMetrics ? measure.actualBoundingBoxLeft + measure.actualBoundingBoxRight : measure.width;\r\n }\r\n}\r\n\r\nfunction encodeUnicode(str: any) {\r\n // +(\"0x\" + s)\r\n return window.encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_, s) => String.fromCharCode(parseInt(s, 16)));\r\n // old way\r\n // return window.unescape(window.encodeURIComponent(str))\r\n}\r\n\r\nexport const html2SvgAsync = (() => {\r\n const xmlSerializer = new XMLSerializer();\r\n return async (elements: HTMLElement[], viewBoxSize: number[], css: string) => {\r\n const w = viewBoxSize[0];\r\n const h = viewBoxSize[1];\r\n\r\n let html = elements\r\n .map(\r\n (el) => `<foreignObject width=\"${w}\" height=\"${h}\">\r\n <body xmlns=\"http://www.w3.org/1999/xhtml\">\r\n ${el.outerHTML}\r\n </body>\r\n </foreignObject>`\r\n )\r\n .join(\"\");\r\n html = `<style>${css}</style>${html}`;\r\n\r\n var svgElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svgElement.setAttributeNS(null, \"viewBox\", `0 0 ${w} ${h}`);\r\n svgElement.setAttributeNS(null, \"width\", w + \"\");\r\n svgElement.setAttributeNS(null, \"height\", h + \"\");\r\n svgElement.innerHTML = html;\r\n\r\n return xmlSerializer.serializeToString(svgElement); // svg string\r\n };\r\n})();\r\n\r\nexport function getSvgImageObjectUrl(svgData: string) {\r\n const svgBlob = new Blob([svgData], { type: \"image/svg+xml;charset=utf-8\" });\r\n return DOMURL.createObjectURL(svgBlob);\r\n}\r\n\r\nexport function getSvgImageDataUrl(svgData: string) {\r\n const svgBase64 = window.btoa(encodeUnicode(svgData));\r\n return \"data:image/svg+xml;base64,\" + svgBase64;\r\n // without base64 encoding (ok for simple SVGs):\r\n // return \"data:image/svg+xml;charset=utf-8,\" + window.encodeURIComponent(svgData); // \"data:image/svg+xml;utf8,\"; - incorrect!\r\n}\r\n\r\n// querySvgDataUrl\r\nexport const querySvgData = (() => {\r\n const xmlSerializer = new XMLSerializer();\r\n return (selector: string) => {\r\n const svg = document.querySelector(selector);\r\n const svgData = xmlSerializer.serializeToString(svg);\r\n return svgData;\r\n };\r\n})();\r\n\r\nexport function toObjectUrl(canvas: HTMLCanvasElement, mimeType = \"image/png\", quality?: number) {\r\n // 'image/jpeg', 'image/webp'\r\n return new Promise<string>((res, rej) => {\r\n try {\r\n canvas.toBlob(\r\n (blob) => {\r\n res(URL.createObjectURL(blob));\r\n },\r\n mimeType,\r\n quality\r\n );\r\n } catch (err) {\r\n rej(err);\r\n }\r\n });\r\n}\r\n\r\nexport function drawImageAsync(src: string, context: CanvasRenderingContext2D) {\r\n return new Promise<void>((res, rej) => {\r\n try {\r\n const image = new Image();\r\n // const image = document.createElement('img');\r\n image.crossOrigin = \"anonymous\";\r\n image.onload = () => {\r\n // image.naturalWidth, image.naturalHeight\r\n context.drawImage(image, 0, 0, image.width, image.height, 0, 0, context.canvas.width, context.canvas.height);\r\n res();\r\n };\r\n image.src = src;\r\n } catch (err) {\r\n rej(err);\r\n }\r\n });\r\n}\r\n\r\nexport const drawSvgAsync = (svgData: string, context: CanvasRenderingContext2D, useDataUrl = false) => {\r\n const imageSrc = useDataUrl ? getSvgImageDataUrl(svgData) : getSvgImageObjectUrl(svgData);\r\n return drawImageAsync(imageSrc, context).finally(() => DOMURL.revokeObjectURL(imageSrc));\r\n};\r\n\r\nexport function canvas2Image(canvas: HTMLCanvasElement, size?: number[], mimeType = \"image/png\", quality?: number) {\r\n // const image = document.createElement(\"img\")\r\n const image = new Image();\r\n image.crossOrigin = \"anonymous\";\r\n if (size) {\r\n if (size[0]) {\r\n image.width = size[0];\r\n }\r\n if (size[1]) {\r\n image.height = size[1];\r\n }\r\n }\r\n const imageSrc = canvas.toDataURL(mimeType, quality);\r\n image.src = imageSrc;\r\n return image;\r\n}\r\n\r\nexport async function canvas2ImageAsync(canvas: HTMLCanvasElement, size?: number[], mimeType = \"image/png\", quality?: number) {\r\n // document.createElement(\"img\")\r\n const image = new Image();\r\n image.crossOrigin = \"anonymous\";\r\n if (size) {\r\n if (size[0]) {\r\n image.width = size[0];\r\n }\r\n if (size[1]) {\r\n image.height = size[1];\r\n }\r\n }\r\n const imageSrc = await toObjectUrl(canvas, mimeType, quality);\r\n image.onload = () => DOMURL.revokeObjectURL(imageSrc);\r\n image.src = imageSrc;\r\n return image;\r\n}\r\n\r\nexport async function objectUrlToDataURL(objectUrl: string): Promise<string> {\r\n const response = await fetch(objectUrl);\r\n const blob = await response.blob();\r\n\r\n return new Promise((res, rej) => {\r\n try {\r\n const reader = new FileReader();\r\n reader.onloadend = () => res(reader.result as string);\r\n reader.readAsDataURL(blob);\r\n } catch (err) {\r\n rej(err);\r\n }\r\n });\r\n}\r\n\r\nexport const getSvgSize = (() => {\r\n const domParser = new DOMParser();\r\n return (svg: string) => {\r\n const svgDom = domParser.parseFromString(svg, \"text/xml\");\r\n // svgElement/svgNode\r\n // const svgDoc = svgDom.documentElement;\r\n const svgDoc = svgDom.querySelector(\"svg\");\r\n return getSvgElementSize(svgDoc);\r\n };\r\n})();\r\n\r\nexport function getSvgElementSize(svgDoc: SVGSVGElement): [number, number] {\r\n let w = 0;\r\n if (svgDoc.width.baseVal.unitType === 5) {\r\n // units - pixels\r\n w = svgDoc.width.baseVal.value;\r\n }\r\n if (!w) {\r\n w = svgDoc.width.baseVal.value;\r\n }\r\n if (!w) {\r\n w = svgDoc.viewBox.baseVal.width;\r\n }\r\n\r\n let h = 0;\r\n if (svgDoc.height.baseVal.unitType === 5) {\r\n // units - pixels\r\n h = svgDoc.height.baseVal.value;\r\n }\r\n if (!h) {\r\n h = svgDoc.height.baseVal.value;\r\n }\r\n if (!h) {\r\n h = svgDoc.viewBox.baseVal.height;\r\n }\r\n\r\n // const attributes = svgDoc.attributes;\r\n // see also:\r\n // attributes.getNamedItem(\"viewBox\").value\r\n // attributes.getNamedItem('width').value - with units\r\n // attributes.getNamedItem('height').value - with units\r\n\r\n return [w, h];\r\n}\r\n\r\nexport const refineSvg = (() => {\r\n const domParser = new DOMParser();\r\n return (data: string) => {\r\n const svgDom = domParser.parseFromString(data, \"text/xml\");\r\n // const svgDoc = svgDom.documentElement;\r\n const svgDoc = svgDom.querySelector(\"svg\");\r\n const size = getSvgElementSize(svgDoc);\r\n // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=700533#c39\r\n svgDoc.setAttribute(\"width\", `${size[0]}px`);\r\n svgDoc.setAttribute(\"height\", `${size[1]}px`);\r\n return svgDoc.outerHTML;\r\n };\r\n})();\r\n"],"names":["DOMURL","createCanvas","w","h","canvas","context","supportExtendedMetrics","fitText","ctx","text","sizeProvider","targetWidth","fontFamily","fontSize","updateFont","width","getBBOxWidth","offsetLeft","x","y","measure","encodeUnicode","str","_","s","html2SvgAsync","xmlSerializer","elements","viewBoxSize","css","html","el","svgElement","getSvgImageObjectUrl","svgData","svgBlob","getSvgImageDataUrl","querySvgData","selector","svg","toObjectUrl","mimeType","quality","res","rej","blob","err","drawImageAsync","src","image","drawSvgAsync","useDataUrl","imageSrc","canvas2Image","size","canvas2ImageAsync","objectUrlToDataURL","objectUrl","reader","getSvgSize","domParser","svgDoc","getSvgElementSize","refineSvg","data"],"mappings":"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"}
1
+ {"version":3,"file":"canvasUtils.es.js","sources":["../../src/gfx/canvasUtils.ts"],"sourcesContent":["const DOMURL = window.URL || window.webkitURL;\r\n\r\nexport function createCanvas(w: number, h: number /*, dpi?: number*/) {\r\n const canvas = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"canvas\") as HTMLCanvasElement;\r\n // if (!dpi) {\r\n // dpi = window.devicePixelRatio;\r\n // }\r\n // context2d\r\n const context = canvas.getContext(\"2d\");\r\n if (context) {\r\n // context.imageSmoothingEnabled = true;\r\n // context.mozImageSmoothingEnabled = true;\r\n // context.oImageSmoothingEnabled = true;\r\n // context.webkitImageSmoothingEnabled = true;\r\n context[\"imageSmoothingQuality\"] = \"high\";\r\n }\r\n canvas.width = w;\r\n // canvas.width = w * dpi;\r\n canvas.height = h;\r\n // canvas.height = h * dpi;\r\n\r\n // canvas.style.width = w + \"px\";\r\n // context.scale(dpi, dpi);\r\n return { canvas, context };\r\n}\r\n\r\nconst supportExtendedMetrics = \"actualBoundingBoxRight\" in TextMetrics.prototype;\r\n\r\nexport type TextSizeProvider = (fontSize: number) => [number, number];\r\n\r\nexport function fitText(\r\n ctx: CanvasRenderingContext2D,\r\n text = \"\",\r\n sizeProvider: TextSizeProvider,\r\n targetWidth = ctx.canvas.width,\r\n fontFamily = \"Arial\"\r\n) {\r\n let fontSize = 1;\r\n const updateFont = () => {\r\n ctx.font = fontSize + \"px \" + fontFamily;\r\n };\r\n updateFont();\r\n let width = getBBOxWidth(text);\r\n // first pass width increment = 1\r\n while (width && width <= targetWidth) {\r\n fontSize++;\r\n updateFont();\r\n width = getBBOxWidth(text);\r\n }\r\n // second pass, the other way around, with increment = -0.1\r\n while (width && width > targetWidth) {\r\n fontSize -= 0.1;\r\n updateFont();\r\n width = getBBOxWidth(text);\r\n }\r\n // revert to last valid step\r\n fontSize += 0.1;\r\n updateFont();\r\n\r\n // we need to measure where our bounding box actually starts\r\n const offsetLeft = ctx.measureText(text).actualBoundingBoxLeft || 0;\r\n const [x, y] = sizeProvider(fontSize);\r\n ctx.fillText(text, x + offsetLeft, y);\r\n\r\n function getBBOxWidth(text) {\r\n const measure = ctx.measureText(text);\r\n\r\n return supportExtendedMetrics ? measure.actualBoundingBoxLeft + measure.actualBoundingBoxRight : measure.width;\r\n }\r\n}\r\n\r\nfunction encodeUnicode(str: any) {\r\n // +(\"0x\" + s)\r\n return window.encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_, s) => String.fromCharCode(parseInt(s, 16)));\r\n // old way\r\n // return window.unescape(window.encodeURIComponent(str))\r\n}\r\n\r\nexport const html2SvgAsync = (() => {\r\n const xmlSerializer = new XMLSerializer();\r\n return async (elements: HTMLElement[], viewBoxSize: number[], css: string) => {\r\n const w = viewBoxSize[0];\r\n const h = viewBoxSize[1];\r\n\r\n let html = elements\r\n .map(\r\n (el) => `<foreignObject width=\"${w}\" height=\"${h}\">\r\n <body xmlns=\"http://www.w3.org/1999/xhtml\">\r\n ${el.outerHTML}\r\n </body>\r\n </foreignObject>`\r\n )\r\n .join(\"\");\r\n html = `<style>${css}</style>${html}`;\r\n\r\n var svgElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svgElement.setAttributeNS(null, \"viewBox\", `0 0 ${w} ${h}`);\r\n svgElement.setAttributeNS(null, \"width\", w + \"\");\r\n svgElement.setAttributeNS(null, \"height\", h + \"\");\r\n svgElement.innerHTML = html;\r\n\r\n return xmlSerializer.serializeToString(svgElement); // svg string\r\n };\r\n})();\r\n\r\nexport function getSvgImageObjectUrl(svgData: string) {\r\n const svgBlob = new Blob([svgData], { type: \"image/svg+xml;charset=utf-8\" });\r\n return DOMURL.createObjectURL(svgBlob);\r\n}\r\n\r\nexport function getSvgImageDataUrl(svgData: string) {\r\n const svgBase64 = window.btoa(encodeUnicode(svgData));\r\n return \"data:image/svg+xml;base64,\" + svgBase64;\r\n // without base64 encoding (ok for simple SVGs):\r\n // return \"data:image/svg+xml;charset=utf-8,\" + window.encodeURIComponent(svgData); // \"data:image/svg+xml;utf8,\"; - incorrect!\r\n}\r\n\r\n// querySvgDataUrl\r\nexport const querySvgData = (() => {\r\n const xmlSerializer = new XMLSerializer();\r\n return (selector: string) => {\r\n const svg = document.querySelector(selector);\r\n const svgData = xmlSerializer.serializeToString(svg);\r\n return svgData;\r\n };\r\n})();\r\n\r\nexport function toObjectUrl(canvas: HTMLCanvasElement, mimeType = \"image/png\", quality?: number) {\r\n // 'image/jpeg', 'image/webp'\r\n return new Promise<string>((res, rej) => {\r\n try {\r\n canvas.toBlob(\r\n (blob) => {\r\n res(URL.createObjectURL(blob));\r\n },\r\n mimeType,\r\n quality\r\n );\r\n } catch (err) {\r\n rej(err);\r\n }\r\n });\r\n}\r\n\r\nexport function drawImageAsync(src: string, context: CanvasRenderingContext2D) {\r\n return new Promise<void>((res, rej) => {\r\n try {\r\n const image = new Image();\r\n // const image = document.createElement('img');\r\n image.crossOrigin = \"anonymous\";\r\n image.onload = () => {\r\n // image.naturalWidth, image.naturalHeight\r\n context.drawImage(image, 0, 0, image.width, image.height, 0, 0, context.canvas.width, context.canvas.height);\r\n res();\r\n };\r\n image.src = src;\r\n } catch (err) {\r\n rej(err);\r\n }\r\n });\r\n}\r\n\r\nexport const drawSvgAsync = (svgData: string, context: CanvasRenderingContext2D, useDataUrl = false) => {\r\n const imageSrc = useDataUrl ? getSvgImageDataUrl(svgData) : getSvgImageObjectUrl(svgData);\r\n return drawImageAsync(imageSrc, context).finally(() => DOMURL.revokeObjectURL(imageSrc));\r\n};\r\n\r\nexport function canvasToImage(canvas: HTMLCanvasElement, size?: number[], mimeType = \"image/png\", quality?: number) {\r\n // const image = document.createElement(\"img\")\r\n const image = new Image();\r\n image.crossOrigin = \"anonymous\";\r\n if (size) {\r\n if (size[0]) {\r\n image.width = size[0];\r\n }\r\n if (size[1]) {\r\n image.height = size[1];\r\n }\r\n }\r\n const imageSrc = canvas.toDataURL(mimeType, quality);\r\n image.src = imageSrc;\r\n return image;\r\n}\r\n\r\nexport async function canvasToImageAsync(canvas: HTMLCanvasElement, size?: number[], mimeType = \"image/png\", quality?: number) {\r\n // document.createElement(\"img\")\r\n const image = new Image();\r\n image.crossOrigin = \"anonymous\";\r\n if (size) {\r\n if (size[0]) {\r\n image.width = size[0];\r\n }\r\n if (size[1]) {\r\n image.height = size[1];\r\n }\r\n }\r\n const imageSrc = await toObjectUrl(canvas, mimeType, quality);\r\n image.onload = () => DOMURL.revokeObjectURL(imageSrc);\r\n image.src = imageSrc;\r\n return image;\r\n}\r\n\r\nexport async function objectUrlToDataURL(objectUrl: string): Promise<string> {\r\n const response = await fetch(objectUrl);\r\n const blob = await response.blob();\r\n\r\n return new Promise((res, rej) => {\r\n try {\r\n const reader = new FileReader();\r\n reader.onloadend = () => res(reader.result as string);\r\n reader.readAsDataURL(blob);\r\n } catch (err) {\r\n rej(err);\r\n }\r\n });\r\n}\r\n\r\nexport const getSvgSize = (() => {\r\n const domParser = new DOMParser();\r\n return (svg: string) => {\r\n const svgDom = domParser.parseFromString(svg, \"text/xml\");\r\n // svgElement/svgNode\r\n // const svgDoc = svgDom.documentElement;\r\n const svgDoc = svgDom.querySelector(\"svg\");\r\n return getSvgElementSize(svgDoc);\r\n };\r\n})();\r\n\r\nexport function getSvgElementSize(svgDoc: SVGSVGElement): [number, number] {\r\n let w = 0;\r\n if (svgDoc.width.baseVal.unitType === 5) {\r\n // units - pixels\r\n w = svgDoc.width.baseVal.value;\r\n }\r\n if (!w) {\r\n w = svgDoc.width.baseVal.value;\r\n }\r\n if (!w) {\r\n w = svgDoc.viewBox.baseVal.width;\r\n }\r\n\r\n let h = 0;\r\n if (svgDoc.height.baseVal.unitType === 5) {\r\n // units - pixels\r\n h = svgDoc.height.baseVal.value;\r\n }\r\n if (!h) {\r\n h = svgDoc.height.baseVal.value;\r\n }\r\n if (!h) {\r\n h = svgDoc.viewBox.baseVal.height;\r\n }\r\n\r\n // const attributes = svgDoc.attributes;\r\n // see also:\r\n // attributes.getNamedItem(\"viewBox\").value\r\n // attributes.getNamedItem('width').value - with units\r\n // attributes.getNamedItem('height').value - with units\r\n\r\n return [w, h];\r\n}\r\n\r\nexport const refineSvg = (() => {\r\n const domParser = new DOMParser();\r\n return (data: string) => {\r\n const svgDom = domParser.parseFromString(data, \"text/xml\");\r\n // const svgDoc = svgDom.documentElement;\r\n const svgDoc = svgDom.querySelector(\"svg\");\r\n const size = getSvgElementSize(svgDoc);\r\n // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=700533#c39\r\n svgDoc.setAttribute(\"width\", `${size[0]}px`);\r\n svgDoc.setAttribute(\"height\", `${size[1]}px`);\r\n return svgDoc.outerHTML;\r\n };\r\n})();\r\n\r\nexport function drawRoundedRect(\r\n context: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n r:\r\n | number\r\n | {\r\n tl: number;\r\n tr: number;\r\n br: number;\r\n bl: number;\r\n }\r\n) {\r\n if (typeof r === \"number\") {\r\n r = { tl: r, tr: r, br: r, bl: r };\r\n } else {\r\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\r\n for (let side in defaultRadius) {\r\n r[side] = r[side] || defaultRadius[side];\r\n }\r\n }\r\n context.beginPath();\r\n context.moveTo(x + r.tl, y);\r\n context.lineTo(x + w - r.tr, y);\r\n context.quadraticCurveTo(x + w, y, x + w, y + r.tr);\r\n context.lineTo(x + w, y + h - r.br);\r\n context.quadraticCurveTo(x + w, y + h, x + w - r.br, y + h);\r\n context.lineTo(x + r.bl, y + h);\r\n context.quadraticCurveTo(x, y + h, x, y + h - r.bl);\r\n context.lineTo(x, y + r.tl);\r\n context.quadraticCurveTo(x, y, x + r.tl, y);\r\n context.closePath();\r\n\r\n // context.fill();\r\n // context.stroke();\r\n\r\n // simple but less accurate\r\n // if (w < 2 * r) {\r\n // r = w / 2;\r\n // }\r\n // if (h < 2 * r) {\r\n // r = h / 2;\r\n // }\r\n // context.beginPath();\r\n // context.moveTo(x + r, y);\r\n // context.arcTo(x + w, y, x + w, y + h, r);\r\n // context.arcTo(x + w, y + h, x, y + h, r);\r\n // context.arcTo(x, y + h, x, y, r);\r\n // context.arcTo(x, y, x + w, y, r);\r\n // context.closePath();\r\n\r\n // https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas\r\n // + other: https://newfivefour.com/javascript-canvas-rounded-rectangle.html\r\n}\r\n"],"names":["DOMURL","createCanvas","w","h","canvas","context","supportExtendedMetrics","fitText","ctx","text","sizeProvider","targetWidth","fontFamily","fontSize","updateFont","width","getBBOxWidth","offsetLeft","x","y","measure","encodeUnicode","str","_","s","html2SvgAsync","xmlSerializer","elements","viewBoxSize","css","html","el","svgElement","getSvgImageObjectUrl","svgData","svgBlob","getSvgImageDataUrl","querySvgData","selector","svg","toObjectUrl","mimeType","quality","res","rej","blob","err","drawImageAsync","src","image","drawSvgAsync","useDataUrl","imageSrc","canvasToImage","size","canvasToImageAsync","objectUrlToDataURL","objectUrl","reader","getSvgSize","domParser","svgDoc","getSvgElementSize","refineSvg","data","drawRoundedRect","r","defaultRadius","side"],"mappings":"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"}
@@ -73,8 +73,7 @@ function v(t, n, e, u = null) {
73
73
  return m(o);
74
74
  }
75
75
  function F(t) {
76
- var e;
77
- const n = (e = t.target) == null ? void 0 : e.value;
76
+ const n = t.target?.value;
78
77
  return l(n);
79
78
  }
80
79
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"color.es.js","sources":["../../src/gfx/color.ts"],"sourcesContent":["// see also https://css-tricks.com/converting-color-spaces-in-javascript/\r\n\r\n// getRandomColorChannelValue(Number)\r\nfunction getRandomColorChannelNumber(brightness: number) {\r\n const r = 255 - brightness;\r\n return 0 | ((Math.random() * r) + brightness);\r\n}\r\n\r\nexport function getRandomColorChannelString(brightness: number) {\r\n const n = getRandomColorChannelNumber(brightness);\r\n let result = n.toString(16);\r\n // result = ('00' + result).slice(- 2);\r\n if (result.length == 1) {\r\n result = '0' + result;\r\n }\r\n return result;\r\n}\r\n\r\nexport function getRandom32BitColorNumber(alpha: number = null, brightness: number = null) {\r\n // return Math.floor(Math.random() * 0xFFFFFFFF);\r\n\r\n // typeof brightness !== \"number\"\r\n if (brightness == undefined) {\r\n brightness = Math.floor(Math.random() * 0xFF); // 255\r\n }\r\n const r = getRandomColorChannelNumber(brightness);\r\n const g = getRandomColorChannelNumber(brightness);\r\n const b = getRandomColorChannelNumber(brightness);\r\n // typeof alpha !== \"number\"\r\n const a = alpha == undefined ? getRandomColorChannelNumber(brightness) : alpha;\r\n return getColorNumberFromRgba(r, g, b, a);\r\n}\r\n\r\n// getRandom24bitColorNumber\r\nexport function getRandomColorNumber(brightness: number = null) {\r\n // return Math.floor(Math.random() * 0xFFFFFF);\r\n // typeof brightness !== \"number\"\r\n if (brightness == undefined) {\r\n brightness = Math.floor(Math.random() * 0xFF); // 255\r\n }\r\n const r = getRandomColorChannelNumber(brightness);\r\n const g = getRandomColorChannelNumber(brightness);\r\n const b = getRandomColorChannelNumber(brightness);\r\n return getColorNumberFromRgba(r, g, b);\r\n}\r\n\r\nfunction refineColorHexString(colorHexString: string) {\r\n colorHexString = colorHexString.trim().toUpperCase();\r\n let isNegative = false;\r\n\r\n if (colorHexString.startsWith(\"-\")) {\r\n isNegative = true;\r\n colorHexString = colorHexString.slice(1).trimLeft();\r\n }\r\n\r\n if (colorHexString.startsWith(\"0X\")) {\r\n colorHexString = colorHexString.slice(2);\r\n }\r\n\r\n if (colorHexString.startsWith(\"#\")) {\r\n colorHexString = colorHexString.slice(1);\r\n }\r\n\r\n // colorHexString = \"0x\" + colorHexString;\r\n if (isNegative) {\r\n colorHexString = \"-\" + colorHexString;\r\n }\r\n\r\n return colorHexString;\r\n}\r\n\r\n// colorHexStringToNumber\r\nexport function getColorNumberFromHexString(colorHexString: string) {\r\n if (!colorHexString) {\r\n\r\n return 0;\r\n\r\n } else {\r\n // TODO: detect alpha channel\r\n // const { r, g, b, a } = getColorRgbaFromHexString(colorHexString)\r\n // return getColorNumberFromRgba(r, g, b, a);\r\n\r\n colorHexString = refineColorHexString(colorHexString);\r\n\r\n let result =\r\n // new Number(colorHexString).valueOf();\r\n // parseInt(colorHexString);\r\n parseInt(colorHexString, 16);\r\n\r\n // if (isNegative) {\r\n // result = result >>> 0; // convert to unsigned int32\r\n // }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport function getColorRgbaFromHexString(colorHexString: string) {\r\n\r\n if (!colorHexString) {\r\n return {\r\n r: 0,\r\n g: 0,\r\n b: 0,\r\n a: 255\r\n };\r\n } else {\r\n\r\n const colorValue = getColorNumberFromHexString(colorHexString); // >>> 0\r\n if (colorValue > 0xFFFFFF) {\r\n return {\r\n r: colorValue >> 24 & 0xFF, // red\r\n // r: (colorValue & 0xFF000000) >> 24,\r\n g: colorValue >> 16 & 0xFF, // green\r\n // g: (colorValue & 0xFF0000) >> 16,\r\n b: colorValue >> 8 & 0xFF, // blue\r\n // b: (colorValue & 0xFF00) >> 8,\r\n a: colorValue & 0xFF // alpha\r\n };\r\n } else {\r\n return {\r\n r: colorValue >> 16 & 0xFF,\r\n // r: (colorValue & 0xFF0000) >> 16,\r\n g: colorValue >> 8 & 0xFF,\r\n // g: (colorValue & 0xFF00) >> 8,\r\n b: colorValue & 0xFF,\r\n // b: colorValue & 0xFF,\r\n a: 255\r\n };\r\n }\r\n\r\n // TODO: compare performance:\r\n // colorHexString = refineColorHexString(colorHexString);\r\n // // no alpha means opaque (non-transparent)\r\n // return {\r\n // r: parseInt(colorHexString.slice(0, 2), 16), // \"0x\" + ...\r\n // g: parseInt(colorHexString.slice(2, 4), 16),\r\n // b: parseInt(colorHexString.slice(4, 6), 16),\r\n // a: colorHexString.length > 6 ? parseInt(colorHexString.slice(6, 8), 16): 255\r\n // };\r\n\r\n // let hexString = input.replace('#', '');\r\n // if (hexString.length === 3) {\r\n // hexString = `${hexString[0]}${hexString[0]}${hexString[1]}${hexString[1]}${hexString[2]}${hexString[2]}`;\r\n // } \r\n // const r = parseInt(hexString.substring(0, 2), 16);\r\n // const g = parseInt(hexString.substring(2, 4), 16);\r\n // const b = parseInt(hexString.substring(4, 6), 16);\r\n }\r\n}\r\n\r\n// colorNumberToHexString\r\nexport function getColorHexStringFromNumber(color: number) {\r\n color = Math.floor(color);\r\n if (color == null || Number.isNaN(color)) {\r\n // color = 0;\r\n return \"\";\r\n }\r\n return \"#\" + ('000000' + color.toString(16)).slice(-6);\r\n}\r\n\r\nexport function get32BitColorHexStringFromNumber(color: number) {\r\n color = Math.floor(color);\r\n return \"#\" + ('00000000' + color.toString(16)).slice(-8);\r\n}\r\n\r\n// colorRgbaToNumber/colorRgbaToInt(Number)\r\n// { r: number, g: number, b: number, a?: number }\r\n// use24BitDepthForOpaque\r\nexport function getColorNumberFromRgba(r: number, g: number, b: number, a: number = null, use24BitsForOpaque: boolean = true) {\r\n let result: number;\r\n // typeof a !== \"number\"\r\n if (a == undefined || (a === 255 && use24BitsForOpaque)) { // a === 255?\r\n // 24-bit color number\r\n result = (r << 16) + (g << 8) + b << 0; // '+' can be replaced with '^' or '|' \r\n } else {\r\n // 32-bit color number\r\n result = (r << 24) + (g << 16) + (b << 8) + a;\r\n }\r\n return result >>> 0; // convert to unsigned int32\r\n}\r\n\r\n// colorRgbaToHexString\r\n// { r: number, g: number, b: number, a?: number }\r\nexport function getColorHexStringFromRgba(r: number, g: number, b: number, a: number = null) {\r\n const value = getColorNumberFromRgba(r, g, b, a);\r\n return getColorHexStringFromNumber(value);\r\n}\r\n\r\n// getColorNumberFromControlEvent\r\nexport function getColorNumberFromEvent(e: Event) {\r\n const colorHexString = (e.target as HTMLInputElement)?.value;\r\n return getColorNumberFromHexString(colorHexString);\r\n}\r\n\r\n/*\r\nfunction parse(orig: string) {\r\n if (!orig) {\r\n return {};\r\n }\r\n\r\n const result = orig.match(/(?:((hsl|rgb)a? *\\(([\\d.%]+(?:deg|g?rad|turn)?)[ ,]*([\\d.%]+)[ ,]*([\\d.%]+)[ ,/]*([\\d.%]*)\\))|(#((?:[\\d\\w]{3}){1,2})([\\d\\w]{1,2})?))/i);\r\n if (!result) {\r\n return { color: orig, opacity: 1.0 };\r\n } else if (result[7]) {\r\n let opacity = 1.0;\r\n if (result[9]) {\r\n opacity = parseInt(result[9].length == 1 ? `${result[9]}${result[9]}` : result[9], 16) * inv255;\r\n }\r\n return { color: `#${result[8]}`, opacity };\r\n } else if (result[0]) {\r\n return { color: `${result[2]}(${result[3]},${result[4]},${result[5]})`, opacity: (Number(result[6]) || 1.0) };\r\n }\r\n}\r\n*/"],"names":["getRandomColorChannelNumber","brightness","r","getRandomColorChannelString","result","getRandom32BitColorNumber","alpha","g","b","getColorNumberFromRgba","getRandomColorNumber","refineColorHexString","colorHexString","isNegative","getColorNumberFromHexString","getColorRgbaFromHexString","colorValue","getColorHexStringFromNumber","color","get32BitColorHexStringFromNumber","a","use24BitsForOpaque","getColorHexStringFromRgba","value","getColorNumberFromEvent","e","_a"],"mappings":"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"}
1
+ {"version":3,"file":"color.es.js","sources":["../../src/gfx/color.ts"],"sourcesContent":["// see also https://css-tricks.com/converting-color-spaces-in-javascript/\r\n\r\n// getRandomColorChannelValue(Number)\r\nfunction getRandomColorChannelNumber(brightness: number) {\r\n const r = 255 - brightness;\r\n return 0 | ((Math.random() * r) + brightness);\r\n}\r\n\r\nexport function getRandomColorChannelString(brightness: number) {\r\n const n = getRandomColorChannelNumber(brightness);\r\n let result = n.toString(16);\r\n // result = ('00' + result).slice(- 2);\r\n if (result.length == 1) {\r\n result = '0' + result;\r\n }\r\n return result;\r\n}\r\n\r\nexport function getRandom32BitColorNumber(alpha: number = null, brightness: number = null) {\r\n // return Math.floor(Math.random() * 0xFFFFFFFF);\r\n\r\n // typeof brightness !== \"number\"\r\n if (brightness == undefined) {\r\n brightness = Math.floor(Math.random() * 0xFF); // 255\r\n }\r\n const r = getRandomColorChannelNumber(brightness);\r\n const g = getRandomColorChannelNumber(brightness);\r\n const b = getRandomColorChannelNumber(brightness);\r\n // typeof alpha !== \"number\"\r\n const a = alpha == undefined ? getRandomColorChannelNumber(brightness) : alpha;\r\n return getColorNumberFromRgba(r, g, b, a);\r\n}\r\n\r\n// getRandom24bitColorNumber\r\nexport function getRandomColorNumber(brightness: number = null) {\r\n // return Math.floor(Math.random() * 0xFFFFFF);\r\n // typeof brightness !== \"number\"\r\n if (brightness == undefined) {\r\n brightness = Math.floor(Math.random() * 0xFF); // 255\r\n }\r\n const r = getRandomColorChannelNumber(brightness);\r\n const g = getRandomColorChannelNumber(brightness);\r\n const b = getRandomColorChannelNumber(brightness);\r\n return getColorNumberFromRgba(r, g, b);\r\n}\r\n\r\nfunction refineColorHexString(colorHexString: string) {\r\n colorHexString = colorHexString.trim().toUpperCase();\r\n let isNegative = false;\r\n\r\n if (colorHexString.startsWith(\"-\")) {\r\n isNegative = true;\r\n colorHexString = colorHexString.slice(1).trimLeft();\r\n }\r\n\r\n if (colorHexString.startsWith(\"0X\")) {\r\n colorHexString = colorHexString.slice(2);\r\n }\r\n\r\n if (colorHexString.startsWith(\"#\")) {\r\n colorHexString = colorHexString.slice(1);\r\n }\r\n\r\n // colorHexString = \"0x\" + colorHexString;\r\n if (isNegative) {\r\n colorHexString = \"-\" + colorHexString;\r\n }\r\n\r\n return colorHexString;\r\n}\r\n\r\n// colorHexStringToNumber\r\nexport function getColorNumberFromHexString(colorHexString: string) {\r\n if (!colorHexString) {\r\n\r\n return 0;\r\n\r\n } else {\r\n // TODO: detect alpha channel\r\n // const { r, g, b, a } = getColorRgbaFromHexString(colorHexString)\r\n // return getColorNumberFromRgba(r, g, b, a);\r\n\r\n colorHexString = refineColorHexString(colorHexString);\r\n\r\n let result =\r\n // new Number(colorHexString).valueOf();\r\n // parseInt(colorHexString);\r\n parseInt(colorHexString, 16);\r\n\r\n // if (isNegative) {\r\n // result = result >>> 0; // convert to unsigned int32\r\n // }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport function getColorRgbaFromHexString(colorHexString: string) {\r\n\r\n if (!colorHexString) {\r\n return {\r\n r: 0,\r\n g: 0,\r\n b: 0,\r\n a: 255\r\n };\r\n } else {\r\n\r\n const colorValue = getColorNumberFromHexString(colorHexString); // >>> 0\r\n if (colorValue > 0xFFFFFF) {\r\n return {\r\n r: colorValue >> 24 & 0xFF, // red\r\n // r: (colorValue & 0xFF000000) >> 24,\r\n g: colorValue >> 16 & 0xFF, // green\r\n // g: (colorValue & 0xFF0000) >> 16,\r\n b: colorValue >> 8 & 0xFF, // blue\r\n // b: (colorValue & 0xFF00) >> 8,\r\n a: colorValue & 0xFF // alpha\r\n };\r\n } else {\r\n return {\r\n r: colorValue >> 16 & 0xFF,\r\n // r: (colorValue & 0xFF0000) >> 16,\r\n g: colorValue >> 8 & 0xFF,\r\n // g: (colorValue & 0xFF00) >> 8,\r\n b: colorValue & 0xFF,\r\n // b: colorValue & 0xFF,\r\n a: 255\r\n };\r\n }\r\n\r\n // TODO: compare performance:\r\n // colorHexString = refineColorHexString(colorHexString);\r\n // // no alpha means opaque (non-transparent)\r\n // return {\r\n // r: parseInt(colorHexString.slice(0, 2), 16), // \"0x\" + ...\r\n // g: parseInt(colorHexString.slice(2, 4), 16),\r\n // b: parseInt(colorHexString.slice(4, 6), 16),\r\n // a: colorHexString.length > 6 ? parseInt(colorHexString.slice(6, 8), 16): 255\r\n // };\r\n\r\n // let hexString = input.replace('#', '');\r\n // if (hexString.length === 3) {\r\n // hexString = `${hexString[0]}${hexString[0]}${hexString[1]}${hexString[1]}${hexString[2]}${hexString[2]}`;\r\n // } \r\n // const r = parseInt(hexString.substring(0, 2), 16);\r\n // const g = parseInt(hexString.substring(2, 4), 16);\r\n // const b = parseInt(hexString.substring(4, 6), 16);\r\n }\r\n}\r\n\r\n// colorNumberToHexString\r\nexport function getColorHexStringFromNumber(color: number) {\r\n color = Math.floor(color);\r\n if (color == null || Number.isNaN(color)) {\r\n // color = 0;\r\n return \"\";\r\n }\r\n return \"#\" + ('000000' + color.toString(16)).slice(-6);\r\n}\r\n\r\nexport function get32BitColorHexStringFromNumber(color: number) {\r\n color = Math.floor(color);\r\n return \"#\" + ('00000000' + color.toString(16)).slice(-8);\r\n}\r\n\r\n// colorRgbaToNumber/colorRgbaToInt(Number)\r\n// { r: number, g: number, b: number, a?: number }\r\n// use24BitDepthForOpaque\r\nexport function getColorNumberFromRgba(r: number, g: number, b: number, a: number = null, use24BitsForOpaque: boolean = true) {\r\n let result: number;\r\n // typeof a !== \"number\"\r\n if (a == undefined || (a === 255 && use24BitsForOpaque)) { // a === 255?\r\n // 24-bit color number\r\n result = (r << 16) + (g << 8) + b << 0; // '+' can be replaced with '^' or '|' \r\n } else {\r\n // 32-bit color number\r\n result = (r << 24) + (g << 16) + (b << 8) + a;\r\n }\r\n return result >>> 0; // convert to unsigned int32\r\n}\r\n\r\n// colorRgbaToHexString\r\n// { r: number, g: number, b: number, a?: number }\r\nexport function getColorHexStringFromRgba(r: number, g: number, b: number, a: number = null) {\r\n const value = getColorNumberFromRgba(r, g, b, a);\r\n return getColorHexStringFromNumber(value);\r\n}\r\n\r\n// getColorNumberFromControlEvent\r\nexport function getColorNumberFromEvent(e: Event) {\r\n const colorHexString = (e.target as HTMLInputElement)?.value;\r\n return getColorNumberFromHexString(colorHexString);\r\n}\r\n\r\n/*\r\nfunction parse(orig: string) {\r\n if (!orig) {\r\n return {};\r\n }\r\n\r\n const result = orig.match(/(?:((hsl|rgb)a? *\\(([\\d.%]+(?:deg|g?rad|turn)?)[ ,]*([\\d.%]+)[ ,]*([\\d.%]+)[ ,/]*([\\d.%]*)\\))|(#((?:[\\d\\w]{3}){1,2})([\\d\\w]{1,2})?))/i);\r\n if (!result) {\r\n return { color: orig, opacity: 1.0 };\r\n } else if (result[7]) {\r\n let opacity = 1.0;\r\n if (result[9]) {\r\n opacity = parseInt(result[9].length == 1 ? `${result[9]}${result[9]}` : result[9], 16) * inv255;\r\n }\r\n return { color: `#${result[8]}`, opacity };\r\n } else if (result[0]) {\r\n return { color: `${result[2]}(${result[3]},${result[4]},${result[5]})`, opacity: (Number(result[6]) || 1.0) };\r\n }\r\n}\r\n*/"],"names":["getRandomColorChannelNumber","brightness","r","getRandomColorChannelString","result","getRandom32BitColorNumber","alpha","g","b","getColorNumberFromRgba","getRandomColorNumber","refineColorHexString","colorHexString","isNegative","getColorNumberFromHexString","getColorRgbaFromHexString","colorValue","getColorHexStringFromNumber","color","get32BitColorHexStringFromNumber","a","use24BitsForOpaque","getColorHexStringFromRgba","value","getColorNumberFromEvent","e"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"enUsCulture.es.js","sources":["../../src/i18n/enUsCulture.ts"],"sourcesContent":["// rename culture to locale?\r\n\r\n/*\r\nTODO:\r\nSorting and String Comparison\r\nString sorting and comparison are language-specific. Even within languages based on the Latin script, there are different composition and sorting rules. Thus do not rely on code points to do proper sorting and string comparison.\r\n\r\nCalendar Differences\r\nThe Gregorian calendar is used in most English speaking countries, but world-ready products should also take into consideration other calendaring systems in use worldwide.\r\n\r\nDate Formatting\r\nDate formatting is not constant through out the world. Although each date basically displays the day, month, and year, their presentation order and separators vary greatly. In fact, there may be many differences between regions within the same country.\r\n\r\nTime Formatting\r\nLike date and calendar formats, time formats are not constant throughout the world.\r\n\r\nCurrency Formatting\r\nCurrency formatting needs to take into consideration the currency symbol and symbol placement, and the number formatting display.\r\n\r\nNumber Formatting\r\nThe number formatting deals with the character used as the decimal and thousands separators.\r\n\r\nAddress Formatting\r\nVarious countries/regions have different address formats.\r\n\r\nTelephone Number Formatting\r\nLike addresses, the format for telephone numbers around the world varies significantly. The input fields and the routines that process information dealing with telephone numbers should be able to handle the variety of formats.\r\n\r\nPaper Size\r\nIt's important to set the paper size correctly if your application supports the print function.\r\n\r\nUnits of Measurement \r\nThroughout the world things are measured using different units and scales. The most popular one used is the metric system (meters, liters, grams, etc). Where as the US still uses the imperial system (feet, inches, pounds, etc).\r\n*/\r\n\r\n// CultureInfo\r\nconst enUsCulture = {\r\n dateTime: {\r\n formats: {\r\n // The leading zero is more commonly used with the 24-hour notation\r\n // especially in computer applications because it can help to maintain column alignment in tables and correct sorting order\r\n\r\n // A -> a?\r\n // YYYY -> YY? (for short formats)\r\n dateTime: \"MM/DD/YYYY hh:mm:ss.SSS A\",\r\n dateTime24: \"MM/DD/YYYY HH:mm:ss.SSS\",\r\n dateTimeShort: \"M/D/YYYY h:mm:ss A\",\r\n dateTime24Short: \"M/D/YYYY HH:mm:ss\",\r\n\r\n dataTimeHM: \"MM/DD/YYYY hh:mm A\",\r\n dataTimeH24M: \"MM/DD/YYYY HH:mm\",\r\n dataTimeHMShort: \"MM/DD/YYYY h:mm A\",\r\n dataTimeH24MShort: \"MM/DD/YYYY H:mm\",\r\n\r\n date: \"MM/DD/YYYY\",\r\n dateShort: \"M/D/YYYY\",\r\n\r\n // timeHMSS\r\n time: \"hh:mm:ss.SSS A\",\r\n // timeH24MSS\r\n time24: \"HH:mm:ss.SSS\",\r\n // timeHMSSShort\r\n timeShort: \"h:mm:ss.SSS A\",\r\n // timeH24MSSShort\r\n time24Short: \"H:mm:ss.SSS\",\r\n\r\n timeHM: \"hh:mm A\",\r\n timeH24M: \"HH:mm\",\r\n timeHMShort: \"h:mm A\",\r\n timeH24MShort: \"H:mm\",\r\n\r\n timeHMS: \"hh:mm:ss A\",\r\n timeH24MS: \"HH:mm:ss\",\r\n timeHMSShort: \"h:mm:ss A\",\r\n timeH24MSShort: \"H:mm:ss\"\r\n }\r\n }\r\n};\r\n\r\nexport default enUsCulture;"],"names":["enUsCulture"],"mappings":"AAoCA,MAAMA,IAAc;AAAA,EAChB,UAAU;AAAA,IACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAML,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,iBAAiB;AAAA,MAEjB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MAEnB,MAAM;AAAA,MACN,WAAW;AAAA;AAAA,MAGX,MAAM;AAAA;AAAA,MAEN,QAAQ;AAAA;AAAA,MAER,WAAW;AAAA;AAAA,MAEX,aAAa;AAAA,MAEb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,eAAe;AAAA,MAEf,SAAS;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBAAgB;AAAA,IACpB;AAAA,EACJ;AACJ;"}
1
+ {"version":3,"file":"enUsCulture.es.js","sources":["../../src/i18n/enUsCulture.ts"],"sourcesContent":["// rename culture to locale?\r\n\r\n/*\r\nTODO:\r\nSorting and String Comparison\r\nString sorting and comparison are language-specific. Even within languages based on the Latin script, there are different composition and sorting rules. Thus do not rely on code points to do proper sorting and string comparison.\r\n\r\nCalendar Differences\r\nThe Gregorian calendar is used in most English speaking countries, but world-ready products should also take into consideration other calendaring systems in use worldwide.\r\n\r\nDate Formatting\r\nDate formatting is not constant through out the world. Although each date basically displays the day, month, and year, their presentation order and separators vary greatly. In fact, there may be many differences between regions within the same country.\r\n\r\nTime Formatting\r\nLike date and calendar formats, time formats are not constant throughout the world.\r\n\r\nCurrency Formatting\r\nCurrency formatting needs to take into consideration the currency symbol and symbol placement, and the number formatting display.\r\n\r\nNumber Formatting\r\nThe number formatting deals with the character used as the decimal and thousands separators.\r\n\r\nAddress Formatting\r\nVarious countries/regions have different address formats.\r\n\r\nTelephone Number Formatting\r\nLike addresses, the format for telephone numbers around the world varies significantly. The input fields and the routines that process information dealing with telephone numbers should be able to handle the variety of formats.\r\n\r\nPaper Size\r\nIt's important to set the paper size correctly if your application supports the print function.\r\n\r\nUnits of Measurement \r\nThroughout the world things are measured using different units and scales. The most popular one used is the metric system (meters, liters, grams, etc). Where as the US still uses the imperial system (feet, inches, pounds, etc).\r\n*/\r\n\r\n// CultureInfo\r\nconst enUsCulture = {\r\n dateTime: {\r\n formats: {\r\n // The leading zero is more commonly used with the 24-hour notation\r\n // especially in computer applications because it can help to maintain column alignment in tables and correct sorting order\r\n\r\n // A -> a?\r\n // YYYY -> YY? (for short formats)\r\n dateTime: \"MM/DD/YYYY hh:mm:ss.SSS A\",\r\n dateTime24: \"MM/DD/YYYY HH:mm:ss.SSS\",\r\n dateTimeShort: \"M/D/YYYY h:mm:ss A\",\r\n dateTime24Short: \"M/D/YYYY HH:mm:ss\",\r\n\r\n dataTimeHM: \"MM/DD/YYYY hh:mm A\",\r\n dataTimeH24M: \"MM/DD/YYYY HH:mm\",\r\n dataTimeHMShort: \"MM/DD/YYYY h:mm A\",\r\n dataTimeH24MShort: \"MM/DD/YYYY H:mm\",\r\n\r\n date: \"MM/DD/YYYY\",\r\n dateShort: \"M/D/YYYY\",\r\n\r\n // timeHMSS\r\n time: \"hh:mm:ss.SSS A\",\r\n // timeH24MSS\r\n time24: \"HH:mm:ss.SSS\",\r\n // timeHMSSShort\r\n timeShort: \"h:mm:ss.SSS A\",\r\n // timeH24MSSShort\r\n time24Short: \"H:mm:ss.SSS\",\r\n\r\n timeHM: \"hh:mm A\",\r\n timeH24M: \"HH:mm\",\r\n timeHMShort: \"h:mm A\",\r\n timeH24MShort: \"H:mm\",\r\n\r\n timeHMS: \"hh:mm:ss A\",\r\n timeH24MS: \"HH:mm:ss\",\r\n timeHMSShort: \"h:mm:ss A\",\r\n timeH24MSShort: \"H:mm:ss\"\r\n }\r\n }\r\n};\r\n\r\nexport default enUsCulture;"],"names":["enUsCulture"],"mappings":"AAoCA,MAAMA,IAAc;AAAA,EAChB,UAAU;AAAA,IACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAML,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,iBAAiB;AAAA,MAEjB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MAEnB,MAAM;AAAA,MACN,WAAW;AAAA;AAAA,MAGX,MAAM;AAAA;AAAA,MAEN,QAAQ;AAAA;AAAA,MAER,WAAW;AAAA;AAAA,MAEX,aAAa;AAAA,MAEb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,eAAe;AAAA,MAEf,SAAS;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBAAgB;AAAA,IAAA;AAAA,EACpB;AAER;"}
@@ -1 +1 @@
1
- {"version":3,"file":"math.es.js","sources":["../src/math.ts"],"sourcesContent":["export function round(number: number, digits = 0): number {\r\n if (digits < 0) {\r\n throw new Error(\"Invalid argument: digits\");\r\n }\r\n const isNegavite = number < 0;\r\n const epsilon = Number.EPSILON * (isNegavite ? -1 : 1);\r\n\r\n if (digits == 0) {\r\n return Math.round(number + epsilon);\r\n }\r\n\r\n const factor = Math.pow(10, digits);\r\n // const _digits = +padEnd(\"1\", digits + 1, \"0\");\r\n return Math.round((number + epsilon) * factor) / factor;\r\n}"],"names":["round","number","digits","isNegavite","epsilon","factor"],"mappings":"AAAgB,SAAAA,EAAMC,GAAgBC,IAAS,GAAW;AACtD,MAAIA,IAAS;AACH,UAAA,IAAI,MAAM,0BAA0B;AAE9C,QAAMC,IAAaF,IAAS,GACtBG,IAAU,OAAO,WAAWD,IAAa,KAAK;AAEpD,MAAID,KAAU;AACH,WAAA,KAAK,MAAMD,IAASG,CAAO;AAGtC,QAAMC,IAAS,KAAK,IAAI,IAAIH,CAAM;AAElC,SAAO,KAAK,OAAOD,IAASG,KAAWC,CAAM,IAAIA;AACrD;"}
1
+ {"version":3,"file":"math.es.js","sources":["../src/math.ts"],"sourcesContent":["export function round(number: number, digits = 0): number {\r\n if (digits < 0) {\r\n throw new Error(\"Invalid argument: digits\");\r\n }\r\n const isNegavite = number < 0;\r\n const epsilon = Number.EPSILON * (isNegavite ? -1 : 1);\r\n\r\n if (digits == 0) {\r\n return Math.round(number + epsilon);\r\n }\r\n\r\n const factor = Math.pow(10, digits);\r\n // const _digits = +padEnd(\"1\", digits + 1, \"0\");\r\n return Math.round((number + epsilon) * factor) / factor;\r\n}\r\n\r\n// toPrecision\r\n// function roundToDecimal(string, decimals) {\r\n// \treturn parseFloat(parseFloat(string).toFixed(decimals));\r\n// }"],"names":["round","number","digits","isNegavite","epsilon","factor"],"mappings":"AAAO,SAASA,EAAMC,GAAgBC,IAAS,GAAW;AACtD,MAAIA,IAAS;AACT,UAAM,IAAI,MAAM,0BAA0B;AAE9C,QAAMC,IAAaF,IAAS,GACtBG,IAAU,OAAO,WAAWD,IAAa,KAAK;AAEpD,MAAID,KAAU;AACV,WAAO,KAAK,MAAMD,IAASG,CAAO;AAGtC,QAAMC,IAAS,KAAK,IAAI,IAAIH,CAAM;AAElC,SAAO,KAAK,OAAOD,IAASG,KAAWC,CAAM,IAAIA;AACrD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.es.js","sources":["../src/metadata.ts"],"sourcesContent":["export type IPropertyMetadataItem = { [propertyKey: PropertyKey]: any };\r\n\r\nconst propertyMetadataBag = new WeakMap<any, IPropertyMetadataItem>();\r\n\r\n// updateMemberMetadata\r\nexport function updatePropertyMetadata<T extends object>(target: T, propertyName: keyof T, value: any, slotName: string) {\r\n // metadata container\r\n let metadataItem = propertyMetadataBag.get(target);\r\n if (!metadataItem) {\r\n metadataItem = {};\r\n propertyMetadataBag.set(target, metadataItem);\r\n }\r\n const propertyKey = propertyName as PropertyKey;\r\n if (!metadataItem[propertyKey]) {\r\n metadataItem[propertyKey] = {};\r\n }\r\n metadataItem[propertyKey][slotName] = value;\r\n\r\n}\r\n\r\n// getMemberMetadata\r\nexport function getPropertyMetadata<T extends object>(target: T, propertyName: keyof T, slotName?: string) {\r\n // target - obj\r\n if (target && propertyName) {\r\n // metadata container\r\n const metadataItem = getPropertyMetadataItem(propertyMetadataBag, target);\r\n if (metadataItem) {\r\n const propertyKey = propertyName as PropertyKey;\r\n const propertyMetadata = metadataItem[propertyKey];\r\n if (propertyMetadata) {\r\n if (slotName) {\r\n return propertyMetadata[slotName];\r\n } else {\r\n return propertyMetadata;\r\n }\r\n }\r\n }\r\n\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getPropertyMetadataItem<TMetadataItem>(metadata: WeakMap<any, TMetadataItem>, obj: any) {\r\n\r\n // using prototype chain\r\n\r\n let result: TMetadataItem = null;\r\n let prototype;\r\n while (true) {\r\n prototype = Object.getPrototypeOf(prototype || obj);\r\n // actually for the most cases we can stop traversal when prototype === Object.prototype, but it is possible to set metadata for any lavel in prototype chain\r\n if (!prototype) {\r\n break;\r\n }\r\n result = metadata.get(prototype);\r\n if (result) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}"],"names":["propertyMetadataBag","updatePropertyMetadata","target","propertyName","value","slotName","metadataItem","propertyKey","getPropertyMetadata","getPropertyMetadataItem","propertyMetadata","metadata","obj","result","prototype"],"mappings":"AAEA,MAAMA,wBAA0B;AAGzB,SAASC,EAAyCC,GAAWC,GAAuBC,GAAYC,GAAkB;AAEjH,MAAAC,IAAeN,EAAoB,IAAIE,CAAM;AACjD,EAAKI,MACDA,IAAe,CAAA,GACKN,EAAA,IAAIE,GAAQI,CAAY;AAEhD,QAAMC,IAAcJ;AAChB,EAACG,EAAaC,CAAW,MACZD,EAAAC,CAAW,IAAI,KAEnBD,EAAAC,CAAW,EAAEF,CAAQ,IAAID;AAE1C;AAGgB,SAAAI,EAAsCN,GAAWC,GAAuBE,GAAmB;AAEvG,MAAIH,KAAUC,GAAc;AAElB,UAAAG,IAAeG,EAAwBT,GAAqBE,CAAM;AACxE,QAAII,GAAc;AAER,YAAAI,IAAmBJ,EADLH,CAC6B;AACjD,UAAIO;AACA,eAAIL,IACOK,EAAiBL,CAAQ,IAEzBK;AAAA,IAGnB;AAAA,EAEJ;AAEJ;AAEgB,SAAAD,EAAuCE,GAAuCC,GAAU;AAIpG,MAAIC,IAAwB,MACxBC;AACJ,SACgBA,IAAA,OAAO,eAAeA,KAAaF,CAAG,GAE9C,GAACE,MAGID,IAAAF,EAAS,IAAIG,CAAS,GAC3BD;AAAJ;AAKG,SAAAA;AACX;"}
1
+ {"version":3,"file":"metadata.es.js","sources":["../src/metadata.ts"],"sourcesContent":["export type IPropertyMetadataItem = { [propertyKey: PropertyKey]: any };\r\n\r\nconst propertyMetadataBag = new WeakMap<any, IPropertyMetadataItem>();\r\n\r\n// updateMemberMetadata\r\nexport function updatePropertyMetadata<T extends object>(target: T, propertyName: keyof T, value: any, slotName: string) {\r\n // metadata container\r\n let metadataItem = propertyMetadataBag.get(target);\r\n if (!metadataItem) {\r\n metadataItem = {};\r\n propertyMetadataBag.set(target, metadataItem);\r\n }\r\n const propertyKey = propertyName as PropertyKey;\r\n if (!metadataItem[propertyKey]) {\r\n metadataItem[propertyKey] = {};\r\n }\r\n metadataItem[propertyKey][slotName] = value;\r\n\r\n}\r\n\r\n// getMemberMetadata\r\nexport function getPropertyMetadata<T extends object>(target: T, propertyName: keyof T, slotName?: string) {\r\n // target - obj\r\n if (target && propertyName) {\r\n // metadata container\r\n const metadataItem = getPropertyMetadataItem(propertyMetadataBag, target);\r\n if (metadataItem) {\r\n const propertyKey = propertyName as PropertyKey;\r\n const propertyMetadata = metadataItem[propertyKey];\r\n if (propertyMetadata) {\r\n if (slotName) {\r\n return propertyMetadata[slotName];\r\n } else {\r\n return propertyMetadata;\r\n }\r\n }\r\n }\r\n\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getPropertyMetadataItem<TMetadataItem>(metadata: WeakMap<any, TMetadataItem>, obj: any) {\r\n\r\n // using prototype chain\r\n\r\n let result: TMetadataItem = null;\r\n let prototype;\r\n while (true) {\r\n prototype = Object.getPrototypeOf(prototype || obj);\r\n // actually for the most cases we can stop traversal when prototype === Object.prototype, but it is possible to set metadata for any lavel in prototype chain\r\n if (!prototype) {\r\n break;\r\n }\r\n result = metadata.get(prototype);\r\n if (result) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}"],"names":["propertyMetadataBag","updatePropertyMetadata","target","propertyName","value","slotName","metadataItem","propertyKey","getPropertyMetadata","getPropertyMetadataItem","propertyMetadata","metadata","obj","result","prototype"],"mappings":"AAEA,MAAMA,wBAA0B,QAAA;AAGzB,SAASC,EAAyCC,GAAWC,GAAuBC,GAAYC,GAAkB;AAErH,MAAIC,IAAeN,EAAoB,IAAIE,CAAM;AACjD,EAAKI,MACDA,IAAe,CAAA,GACfN,EAAoB,IAAIE,GAAQI,CAAY;AAEhD,QAAMC,IAAcJ;AACpB,EAAKG,EAAaC,CAAW,MACzBD,EAAaC,CAAW,IAAI,CAAA,IAEhCD,EAAaC,CAAW,EAAEF,CAAQ,IAAID;AAE1C;AAGO,SAASI,EAAsCN,GAAWC,GAAuBE,GAAmB;AAEvG,MAAIH,KAAUC,GAAc;AAExB,UAAMG,IAAeG,EAAwBT,GAAqBE,CAAM;AACxE,QAAII,GAAc;AAEd,YAAMI,IAAmBJ,EADLH,CAC6B;AACjD,UAAIO;AACA,eAAIL,IACOK,EAAiBL,CAAQ,IAEzBK;AAAA,IAGnB;AAAA,EAEJ;AAEJ;AAEO,SAASD,EAAuCE,GAAuCC,GAAU;AAIpG,MAAIC,IAAwB,MACxBC;AACJ,SACIA,IAAY,OAAO,eAAeA,KAAaF,CAAG,GAE9C,GAACE,MAGLD,IAASF,EAAS,IAAIG,CAAS,GAC3BD;AAAJ;AAKJ,SAAOA;AACX;"}
package/dist/mutex.es.js CHANGED
@@ -1,10 +1,5 @@
1
- var i = Object.defineProperty;
2
- var n = (r, e, t) => e in r ? i(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
- var s = (r, e, t) => n(r, typeof e != "symbol" ? e + "" : e, t);
4
- class l {
5
- constructor() {
6
- s(this, "mutex", Promise.resolve());
7
- }
1
+ class s {
2
+ mutex = Promise.resolve();
8
3
  lock() {
9
4
  let e = (t) => {
10
5
  };
@@ -22,6 +17,6 @@ class l {
22
17
  }
23
18
  }
24
19
  export {
25
- l as Mutex
20
+ s as Mutex
26
21
  };
27
22
  //# sourceMappingURL=mutex.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mutex.es.js","sources":["../src/mutex.ts"],"sourcesContent":["import { Executor } from \"./typeCore\";\r\n\r\nclass Mutex {\r\n private mutex = Promise.resolve();\r\n\r\n lock(): PromiseLike<() => void> {\r\n let begin: (unlock: () => void) => void = unlock => { };\r\n\r\n this.mutex = this.mutex.then(() => {\r\n return new Promise(begin);\r\n });\r\n\r\n return new Promise(res => {\r\n begin = res;\r\n });\r\n }\r\n\r\n async dispatch<T>(fn: Executor<T>): Promise<T> {\r\n const unlock = await this.lock();\r\n try {\r\n return await Promise.resolve(fn());\r\n } finally {\r\n unlock();\r\n }\r\n }\r\n}\r\n\r\nexport {\r\n Mutex\r\n};"],"names":["Mutex","__publicField","begin","unlock","res","fn"],"mappings":";;;AAEA,MAAMA,EAAM;AAAA,EAAZ;AACY,IAAAC,EAAA,eAAQ,QAAQ;;EAExB,OAAgC;AAC5B,QAAIC,IAAsC,CAAUC,MAAA;AAAA,IAAA;AAEpD,gBAAK,QAAQ,KAAK,MAAM,KAAK,MAClB,IAAI,QAAQD,CAAK,CAC3B,GAEM,IAAI,QAAQ,CAAOE,MAAA;AACd,MAAAF,IAAAE;AAAA,IAAA,CACX;AAAA,EACL;AAAA,EAEA,MAAM,SAAYC,GAA6B;AACrC,UAAAF,IAAS,MAAM,KAAK;AACtB,QAAA;AACA,aAAO,MAAM,QAAQ,QAAQE,EAAI,CAAA;AAAA,IAAA,UACnC;AACS,MAAAF;IACX;AAAA,EACJ;AACJ;"}
1
+ {"version":3,"file":"mutex.es.js","sources":["../src/mutex.ts"],"sourcesContent":["import { Executor } from \"./typeCore\";\r\n\r\nclass Mutex {\r\n private mutex = Promise.resolve();\r\n\r\n lock(): PromiseLike<() => void> {\r\n let begin: (unlock: () => void) => void = unlock => { };\r\n\r\n this.mutex = this.mutex.then(() => {\r\n return new Promise(begin);\r\n });\r\n\r\n return new Promise(res => {\r\n begin = res;\r\n });\r\n }\r\n\r\n async dispatch<T>(fn: Executor<T>): Promise<T> {\r\n const unlock = await this.lock();\r\n try {\r\n return await Promise.resolve(fn());\r\n } finally {\r\n unlock();\r\n }\r\n }\r\n}\r\n\r\nexport {\r\n Mutex\r\n};"],"names":["Mutex","begin","unlock","res","fn"],"mappings":"AAEA,MAAMA,EAAM;AAAA,EACA,QAAQ,QAAQ,QAAA;AAAA,EAExB,OAAgC;AAC5B,QAAIC,IAAsC,CAAAC,MAAU;AAAA,IAAE;AAEtD,gBAAK,QAAQ,KAAK,MAAM,KAAK,MAClB,IAAI,QAAQD,CAAK,CAC3B,GAEM,IAAI,QAAQ,CAAAE,MAAO;AACtB,MAAAF,IAAQE;AAAA,IACZ,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,SAAYC,GAA6B;AAC3C,UAAMF,IAAS,MAAM,KAAK,KAAA;AAC1B,QAAI;AACA,aAAO,MAAM,QAAQ,QAAQE,GAAI;AAAA,IACrC,UAAA;AACI,MAAAF,EAAA;AAAA,IACJ;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,33 @@
1
+ import { default as Dexie } from 'dexie';
2
+ export interface IDataEntry {
3
+ id: string;
4
+ createdAt: number;
5
+ updatedAt: number;
6
+ accessedAt: number;
7
+ slidingExpiration?: number;
8
+ expiresAt: number;
9
+ }
10
+ export interface IDataItem {
11
+ readonly id: string;
12
+ readonly value: any;
13
+ }
14
+ export declare class DataEntry implements IDataEntry {
15
+ id: string;
16
+ createdAt: number;
17
+ updatedAt: number;
18
+ accessedAt: number;
19
+ expiresAt: number;
20
+ constructor(src: Partial<DataEntry>);
21
+ }
22
+ export declare class DataItem implements IDataItem {
23
+ id: string;
24
+ value: any;
25
+ constructor(src: Partial<DataItem>);
26
+ }
27
+ export declare class DataStore extends Dexie {
28
+ registry: Dexie.Table<IDataEntry, string>;
29
+ data: Dexie.Table<IDataItem, string>;
30
+ constructor(name: string);
31
+ static delete(name: string): Promise<void>;
32
+ }
33
+ //# sourceMappingURL=dataStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataStore.d.ts","sourceRoot":"","sources":["../../src/store/dataStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAK/C,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,SAAS,EAAE,MAAM,CAAC;CACrB;AAKD,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;CACvB;AAOD,qBAAa,SAAU,YAAW,UAAU;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;gBAEN,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC;CAStC;AAGD,qBAAa,QAAS,YAAW,SAAS;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,GAAG,CAAC;gBAEC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC;CAQrC;AAED,qBAAa,SAAU,SAAQ,KAAK;IAEhC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAEzB,IAAI,EAAE,MAAM;IA0CxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM;CAG7B"}
@@ -0,0 +1,49 @@
1
+ import r from "dexie";
2
+ const i = "registry", a = "data", c = ["id", "createdAt", "accessedAt", "updatedAt", "expiresAt"], n = ["id", "value"];
3
+ class y {
4
+ id;
5
+ createdAt;
6
+ updatedAt;
7
+ accessedAt;
8
+ expiresAt;
9
+ constructor(t) {
10
+ Object.assign(this, t);
11
+ }
12
+ }
13
+ class p {
14
+ id;
15
+ value;
16
+ constructor(t) {
17
+ Object.assign(this, t);
18
+ }
19
+ // constructor(key: string, value: string) {
20
+ // this.key = key;
21
+ // this.value = value;
22
+ // }
23
+ }
24
+ class u extends r {
25
+ // catalog/entries
26
+ registry;
27
+ data;
28
+ constructor(t) {
29
+ if (!t)
30
+ throw new Error("Invalid database name");
31
+ super(t);
32
+ const e = this;
33
+ e.version(1).stores({
34
+ [i]: c.join(", "),
35
+ [a]: n.join(", ")
36
+ }), this.registry = e.table(i), this.data = e.table(a), e.registry.hook("deleting", async (o, l, d) => {
37
+ await d.table(a).delete(o);
38
+ });
39
+ }
40
+ static delete(t) {
41
+ return r.delete(t);
42
+ }
43
+ }
44
+ export {
45
+ y as DataEntry,
46
+ p as DataItem,
47
+ u as DataStore
48
+ };
49
+ //# sourceMappingURL=dataStore.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataStore.es.js","sources":["../../src/store/dataStore.ts"],"sourcesContent":["import Dexie, { PromiseExtended } from \"dexie\"; // https://dexie.org/docs/Typescript\r\n\r\nconst registryTableName = \"registry\"; // \"catalog\"\r\nconst dataTableName = \"data\";\r\n\r\nexport interface IDataEntry {\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// isValid?\r\n// tags?\r\n\r\n// IDataRecord\r\nexport interface IDataItem {\r\n readonly id: string;\r\n readonly value: any;\r\n}\r\n\r\n// (registry/catalog)PropertyNames\r\nconst entryPropertyNames: (keyof IDataEntry)[] = [\"id\", \"createdAt\", \"accessedAt\", \"updatedAt\", \"expiresAt\"];\r\n\r\nconst dataItemPropertyNames: (keyof IDataItem)[] = [\"id\", \"value\"];\r\n\r\nexport class DataEntry implements IDataEntry {\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<DataEntry>) {\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// DataRecord\r\nexport class DataItem implements IDataItem {\r\n id: string;\r\n value: any;\r\n\r\n constructor(src: Partial<DataItem>) {\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 DataStore extends Dexie {\r\n // catalog/entries\r\n registry: Dexie.Table<IDataEntry, string>;\r\n data: Dexie.Table<IDataItem, string>;\r\n\r\n constructor(name: string) {\r\n // navigator.storage.estimate()\r\n // navigator.webkitTemporaryStorage.queryUsageAndQuota()\r\n\r\n if (!name) {\r\n throw new Error(\"Invalid database name\"); // cannot be empty\r\n }\r\n\r\n super(name); // {autoOpen: false}\r\n\r\n const db = this;\r\n\r\n // Define tables and indexes \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(dataTableName).toCollection().modify((entry: IDataEntry) => {\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(DataEntry);\r\n // db.data.mapToClass(DataItem);\r\n\r\n // db.on('populate', () => db.registry.bulkAdd([\r\n // \t// ...\r\n // ]));\r\n }\r\n\r\n static delete(name: string) {\r\n return Dexie.delete(name);\r\n }\r\n}\r\n"],"names":["registryTableName","dataTableName","entryPropertyNames","dataItemPropertyNames","DataEntry","src","DataItem","DataStore","Dexie","name","db","key","obj","transaction"],"mappings":";AAEA,MAAMA,IAAoB,YACpBC,IAAgB,QAqBhBC,IAA2C,CAAC,MAAM,aAAa,cAAc,aAAa,WAAW,GAErGC,IAA6C,CAAC,MAAM,OAAO;AAE1D,MAAMC,EAAgC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAYC,GAAyB;AACjC,WAAO,OAAO,MAAMA,CAAG;AAAA,EAO3B;AACJ;AAGO,MAAMC,EAA8B;AAAA,EACvC;AAAA,EACA;AAAA,EAEA,YAAYD,GAAwB;AAChC,WAAO,OAAO,MAAMA,CAAG;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAMJ;AAEO,MAAME,UAAkBC,EAAM;AAAA;AAAA,EAEjC;AAAA,EACA;AAAA,EAEA,YAAYC,GAAc;AAItB,QAAI,CAACA;AACD,YAAM,IAAI,MAAM,uBAAuB;AAG3C,UAAMA,CAAI;AAEV,UAAMC,IAAK;AAIX,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,EAQL;AAAA,EAEA,OAAO,OAAOF,GAAc;AACxB,WAAOD,EAAM,OAAOC,CAAI;AAAA,EAC5B;AACJ;"}