@giveback007/util-lib 2.1.2 → 2.2.0
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.
- package/dist/@state.types.d.ts +16 -0
- package/dist/@state.types.js +3 -0
- package/dist/@state.types.js.map +1 -0
- package/dist/@types.d.ts +10 -11
- package/dist/general.d.ts +0 -2
- package/dist/general.js +1 -4
- package/dist/general.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/number.d.ts +1 -8
- package/dist/number.js +3 -11
- package/dist/number.js.map +1 -1
- package/dist/state-manager.d.ts +74 -0
- package/dist/state-manager.js +227 -0
- package/dist/state-manager.js.map +1 -0
- package/dist/time.d.ts +9 -1
- package/dist/time.js +15 -4
- package/dist/time.js.map +1 -1
- package/package.json +1 -1
- package/src/@state.types.ts +19 -0
- package/src/@types.ts +28 -18
- package/src/general.ts +0 -4
- package/src/index.ts +4 -2
- package/src/number.ts +2 -11
- package/src/state-manager.ts +301 -0
- package/src/time.ts +15 -3
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type Immutable<T> = {
|
|
2
|
+
readonly [K in keyof T]: Immutable<T[K]>;
|
|
3
|
+
};
|
|
4
|
+
export type Action<T extends string, D = undefined> = Readonly<D extends undefined ? {
|
|
5
|
+
type: T;
|
|
6
|
+
} : {
|
|
7
|
+
type: T;
|
|
8
|
+
data: D;
|
|
9
|
+
}>;
|
|
10
|
+
export type stateSubFct<S> = (s: S, prev: S | null) => any;
|
|
11
|
+
export type actSubFct<A extends Action<any, any>, S = any> = (a: A, s: S) => any;
|
|
12
|
+
export type lsOptions<P> = {
|
|
13
|
+
id: string;
|
|
14
|
+
useKeys?: P[];
|
|
15
|
+
ignoreKeys?: P[];
|
|
16
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"@state.types.js","sourceRoot":"","sources":["../src/@state.types.ts"],"names":[],"mappings":""}
|
package/dist/@types.d.ts
CHANGED
|
@@ -53,17 +53,16 @@ export type TimeObj = {
|
|
|
53
53
|
ms: num;
|
|
54
54
|
wDay: DayOfWeek;
|
|
55
55
|
};
|
|
56
|
-
export type
|
|
57
|
-
y: num
|
|
58
|
-
m?: num
|
|
59
|
-
d?: num
|
|
60
|
-
h?: num
|
|
61
|
-
min?: num
|
|
62
|
-
sec?: num
|
|
63
|
-
ms?: num
|
|
64
|
-
|
|
65
|
-
export type
|
|
66
|
-
export type AnyDate = string | number | Date | TimeObj | PartialTimeObj | TimeArr;
|
|
56
|
+
export type TimeArr = [
|
|
57
|
+
y: num,
|
|
58
|
+
m?: num,
|
|
59
|
+
d?: num,
|
|
60
|
+
h?: num,
|
|
61
|
+
min?: num,
|
|
62
|
+
sec?: num,
|
|
63
|
+
ms?: num
|
|
64
|
+
];
|
|
65
|
+
export type AnyDate = string | number | Date | TimeObj | TimeArr;
|
|
67
66
|
export type Dict<T> = {
|
|
68
67
|
[id: string]: T;
|
|
69
68
|
};
|
package/dist/general.d.ts
CHANGED
|
@@ -17,8 +17,6 @@ maxTimes?: number) => {
|
|
|
17
17
|
/** Stop the interval */
|
|
18
18
|
stop: () => void;
|
|
19
19
|
};
|
|
20
|
-
/** A promise that waits `ms` amount of milliseconds to execute */
|
|
21
|
-
export declare const wait: (ms: number) => Promise<void>;
|
|
22
20
|
export declare function unsubAll(objOrArr: AnyObj | any[], unsubName?: string): void;
|
|
23
21
|
/**
|
|
24
22
|
* Alternative to console.log in that it will clone the obj.
|
package/dist/general.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.debounceById = exports.debounce = exports.randomColorHex = exports.uuid = exports.cloneLog = exports.
|
|
3
|
+
exports.debounceById = exports.debounce = exports.randomColorHex = exports.uuid = exports.cloneLog = exports.interval = void 0;
|
|
4
4
|
exports.unsubAll = unsubAll;
|
|
5
5
|
exports.type = type;
|
|
6
6
|
exports.assertType = assertType;
|
|
@@ -41,9 +41,6 @@ maxTimes = Infinity) => {
|
|
|
41
41
|
};
|
|
42
42
|
};
|
|
43
43
|
exports.interval = interval;
|
|
44
|
-
/** A promise that waits `ms` amount of milliseconds to execute */
|
|
45
|
-
const wait = (ms) => new Promise((res) => setTimeout(() => res(), ms));
|
|
46
|
-
exports.wait = wait;
|
|
47
44
|
const usubAllFunct = (x, unsubName = 'unsubscribe') => (0, _1.isType)(x, 'object')
|
|
48
45
|
&&
|
|
49
46
|
(0, _1.hasKey)(x, unsubName) ? x[unsubName]() : null;
|
package/dist/general.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"general.js","sourceRoot":"","sources":["../src/general.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"general.js","sourceRoot":"","sources":["../src/general.ts"],"names":[],"mappings":";;;AA8CA,4BAOC;AAWD,oBAUC;AAGD,gCAQC;AAuCD,0CASC;AAYD,gCAcC;AAED,0CAiBC;AAED,oBAMC;AAzLD,wBAAkD;AAElD;;;;;;;;;;;GAWG;AACI,MAAM,QAAQ,GAAG,CACpB,IAA0C,EAC1C,KAAa,CAAC;AAEd,kCAAkC;AAClC,WAAmB,QAAQ,EAC7B,EAAE;IACA,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,KAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;QACzB,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACd,CAAC,EAAE,CAAC;QAEJ,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ;YAAE,IAAI,EAAE,CAAC;IAC1C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACH,wBAAwB;QACxB,IAAI;KACP,CAAC;AACN,CAAC,CAAA;AAxBY,QAAA,QAAQ,YAwBpB;AAED,MAAM,YAAY,GAAG,CAAC,CAAM,EAAE,SAAS,GAAG,aAAa,EAAE,EAAE,CACvD,IAAA,SAAM,EAAC,CAAC,EAAE,QAAQ,CAAC;;QAEnB,IAAA,SAAM,EAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAEjD,SAAgB,QAAQ,CAAC,QAAwB,EAAE,SAAS,GAAG,aAAa;IACxE,IAAI,IAAA,SAAM,EAAC,QAAQ,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;SACjD,IAAI,IAAA,SAAM,EAAC,QAAQ,EAAE,QAAQ,CAAC;QAC/B,IAAA,SAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;;QAE5D,MAAM,KAAK,CAAC,yDAAyD,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;GAKG;AACI,MAAM,QAAQ,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAA,QAAK,EAAC,CAAC,CAAC,CAAC,CAAC;AAA7C,QAAA,QAAQ,YAAqC;AAE1D,6CAA6C;AAC7C,SAAgB,IAAI,CAAC,GAAQ;IAEzB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;aAClC,IAAI,GAAG,KAAK,IAAI;YAAG,OAAO,MAAM,CAAC;;YACd,OAAO,QAAQ,CAAC;IAC5C,CAAC;SAAM,CAAC;QACJ,IAAI,GAAG,KAAK,GAAG;YAAS,OAAO,KAAK,CAAC;;YACb,OAAO,OAAO,GAAG,CAAC;IAC9C,CAAC;AACL,CAAC;AAED,mFAAmF;AACnF,SAAgB,UAAU,CACtB,GAAQ,EACR,KAAc;IAEd,IAAI,CAAC,IAAA,SAAM,EAAC,KAAK,EAAE,OAAO,CAAC;QAAE,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,IAAA,SAAM,EAAC,GAAG,EAAE,CAAC,CAAC;YAAE,OAAO;IAElD,MAAM,KAAK,CAAC,8BAA8B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AACnE,CAAC;AAEM,MAAM,IAAI,GAAG,GAAG,EAAE;IAErB,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,IAAI,EAAE,GAAG,CACL,WAAW;;YAEX,WAAW,CAAC,GAAG;;YAEf,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAC7B,IAAI,CAAC,CAAC;IAEP,MAAM,GAAG,GAAG,sCAAsC,CAAC;IACnD,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACR,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAC,EAAE,GAAG,CAAC,CAAC;YACnB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAC,EAAE,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACJ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAC,EAAE,GAAG,CAAC,CAAC;YACpB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACP,CAAC,CAAA;AAxBY,QAAA,IAAI,QAwBhB;AAEM,MAAM,cAAc,GAAG,GAAG,EAAE,CAC/B,GAAG,GAAG,CAAC,CAAC,CAAC,IAAE,EAAE,CAAC,GAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AADtC,QAAA,cAAc,kBACwB;AAE5C,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAO,EAAE,EAAE;IAC5C,IAAI,SAAwC,CAAC;IAC7C,OAAO,UAAqB,GAAG,IAAW;QACtC,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC;AACN,CAAC,CAAC;AANW,QAAA,QAAQ,YAMnB;AAEF,SAAgB,eAAe;IAC3B,IAAI,SAAS,GAAyC,IAAI,CAAC;IAE3D,OAAO,CAAC,GAAwB,EAAE,EAAW,EAAE,EAAE;QAC7C,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,GAAG,KAAK,QAAQ;YAChB,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAQ,CAAC;IACpD,CAAC,CAAA;AACL,CAAC;AAEY,QAAA,YAAY,GAAG,CAAC,GAAG,EAAE;IAC9B,MAAM,YAAY,GAAc,EAAE,CAAC;IACnC,OAAO,CAAC,EAAU,EAAE,EAAO,EAAE,EAAa,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,GAAG;YAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QAE3B,YAAY,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAAQ,CAAC;IACjD,CAAC,CAAA;AACL,CAAC,CAAC,EAAE,CAAC;AAEL,SAAgB,UAAU;IACtB,IAAI,OAAY,CAAC;IACjB,IAAI,KAAU,CAAC;IAEf,MAAM,OAAO,GAAe,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACjD,OAAO,GAAG,GAAG,CAAC;QACd,KAAK,GAAG,GAAG,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,KAAK,EAAE,KAA+B;QACtC,OAAO,EAAE,OAA6B;QACtC,OAAO;KACV,CAAC;AACN,CAAC;AAEM,KAAK,UAAU,eAAe,CACjC,GAAQ,EACR,EAA6C,EAC7C,kBAAkB,GAAG,CAAC;IAEtB,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACb,MAAM,MAAM,GAAU,EAAE,CAAC;IAEzB,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;QAC/D,IAAI,IAAmB,CAAC;QACxB,OAAO,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,GAAG,CAAC;YACd,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACnC,CAAC;IACL,CAAC,CAAC,CAAC,CAAC;IAEJ,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,IAAI,CAAC,GAAW;IAC5B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAC/B,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;IAE1E,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
export * from './@types';
|
|
2
|
+
export * from './@state.types';
|
|
2
3
|
export * from './array';
|
|
3
4
|
export * from './clone';
|
|
4
5
|
export * from './equality';
|
|
5
6
|
export * from './general';
|
|
7
|
+
export * from './http';
|
|
6
8
|
export * from './iterate';
|
|
7
9
|
export * from './number';
|
|
8
10
|
export * from './object';
|
|
11
|
+
export * from './state-manager';
|
|
9
12
|
export * from './string';
|
|
10
13
|
export * from './test';
|
|
11
14
|
export * from './time';
|
|
12
|
-
export * from './http';
|
package/dist/index.js
CHANGED
|
@@ -15,15 +15,17 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./@types"), exports);
|
|
18
|
+
__exportStar(require("./@state.types"), exports);
|
|
18
19
|
__exportStar(require("./array"), exports);
|
|
19
20
|
__exportStar(require("./clone"), exports);
|
|
20
21
|
__exportStar(require("./equality"), exports);
|
|
21
22
|
__exportStar(require("./general"), exports);
|
|
23
|
+
__exportStar(require("./http"), exports);
|
|
22
24
|
__exportStar(require("./iterate"), exports);
|
|
23
25
|
__exportStar(require("./number"), exports);
|
|
24
26
|
__exportStar(require("./object"), exports);
|
|
27
|
+
__exportStar(require("./state-manager"), exports);
|
|
25
28
|
__exportStar(require("./string"), exports);
|
|
26
29
|
__exportStar(require("./test"), exports);
|
|
27
30
|
__exportStar(require("./time"), exports);
|
|
28
|
-
__exportStar(require("./http"), exports);
|
|
29
31
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,0CAAwB;AACxB,0CAAwB;AACxB,6CAA2B;AAC3B,4CAA0B;AAC1B,4CAA0B;AAC1B,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB;AACzB,yCAAuB;AACvB,yCAAuB
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,iDAA8B;AAC9B,0CAAwB;AACxB,0CAAwB;AACxB,6CAA2B;AAC3B,4CAA0B;AAC1B,yCAAuB;AACvB,4CAA0B;AAC1B,2CAAyB;AACzB,2CAAyB;AACzB,kDAAgC;AAChC,2CAAyB;AACzB,yCAAuB;AACvB,yCAAuB"}
|
package/dist/number.d.ts
CHANGED
|
@@ -18,14 +18,7 @@ export declare const average: (nArr: number[]) => number;
|
|
|
18
18
|
* decPlaces(1.1276, 2) //=> 1.13
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
|
-
export declare const
|
|
22
|
-
/**
|
|
23
|
-
* @example
|
|
24
|
-
* ```js
|
|
25
|
-
* numberWithCommas(1000000) //=> '1,000,000'
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
28
|
-
export declare const numberWithCommas: (n: number | string) => string;
|
|
21
|
+
export declare const numFixed: (n: number, fractionDigits: number) => number;
|
|
29
22
|
/**
|
|
30
23
|
* Takes a number || number[] and min & max, will generate a
|
|
31
24
|
* new random number.
|
package/dist/number.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.numFixed = exports.average = exports.rand = exports.randInt = void 0;
|
|
4
4
|
exports.newNum = newNum;
|
|
5
5
|
const _1 = require(".");
|
|
6
6
|
/**
|
|
@@ -26,16 +26,8 @@ exports.average = average;
|
|
|
26
26
|
* decPlaces(1.1276, 2) //=> 1.13
|
|
27
27
|
* ```
|
|
28
28
|
*/
|
|
29
|
-
const
|
|
30
|
-
exports.
|
|
31
|
-
/**
|
|
32
|
-
* @example
|
|
33
|
-
* ```js
|
|
34
|
-
* numberWithCommas(1000000) //=> '1,000,000'
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
const numberWithCommas = (n) => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
|
38
|
-
exports.numberWithCommas = numberWithCommas;
|
|
29
|
+
const numFixed = (n, fractionDigits) => parseFloat(n.toFixed(fractionDigits));
|
|
30
|
+
exports.numFixed = numFixed;
|
|
39
31
|
/**
|
|
40
32
|
* Takes a number || number[] and min & max, will generate a
|
|
41
33
|
* new random number.
|
package/dist/number.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sourceRoot":"","sources":["../src/number.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../src/number.ts"],"names":[],"mappings":";;;AAmCA,wBAmBC;AAtDD,wBAAgD;AAEhD;;;;;;GAMG;AACI,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CAChD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AAD3C,QAAA,OAAO,WACoC;AAEjD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CAC7C,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AADzB,QAAA,IAAI,QACqB;AAEtC,sDAAsD;AAC/C,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,EAAE,CACtC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;AAD7C,QAAA,OAAO,WACsC;AAE1D;;;;;;;;GAQG;AACI,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,cAAsB,EAAE,EAAE,CAC1D,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;AAD7B,QAAA,QAAQ,YACqB;AAE1C;;;GAGG;AACH,SAAgB,MAAM,CAClB,OAA0B,EAAE,GAAW,EAAE,GAAW;IAEpD,IAAI,GAAG,CAAC;IACR,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,IAAI,GAAkB,IAAA,SAAM,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAClD,IAAA,gBAAa,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;IAEjD,GAAG,CAAC;QACA,GAAG,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxB,IAAI,EAAE,CAAC;QAEP,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE;IAEpB,OAAO,GAAG,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Action, actSubFct, lsOptions, stateSubFct } from './@state.types';
|
|
2
|
+
import { KeysOfValueType } from '.';
|
|
3
|
+
export declare class StateManager<State extends {}, Act extends Action<any, any> = Action<any, any>, Key extends Extract<keyof State, string> = Extract<keyof State, string>> {
|
|
4
|
+
private prevState;
|
|
5
|
+
private emittedState;
|
|
6
|
+
private state;
|
|
7
|
+
private readonly useLS;
|
|
8
|
+
private stateSubDict;
|
|
9
|
+
private actionSubDict;
|
|
10
|
+
private stateWasUpdated;
|
|
11
|
+
private keysChanged;
|
|
12
|
+
private throttledState;
|
|
13
|
+
private throttlersRunning;
|
|
14
|
+
/**
|
|
15
|
+
* The local storage takes an id, this id
|
|
16
|
+
* should be unique in order to ensure that the
|
|
17
|
+
* storage is unique to the given state object
|
|
18
|
+
*/
|
|
19
|
+
constructor(initialState: State, useLocalStorage?: lsOptions<Key>);
|
|
20
|
+
getState: () => State;
|
|
21
|
+
setState: (updateState: Partial<State>) => Promise<State>;
|
|
22
|
+
action: <A extends Act = Act>(action: A | A["type"]) => A | A["type"];
|
|
23
|
+
/**
|
|
24
|
+
* Aggregates state updates by this method over the course of
|
|
25
|
+
* `msCycle` time and sets the state only once per `msCycle` time.
|
|
26
|
+
*
|
|
27
|
+
* Different `msCycle` timings run on separate loops, therefore can
|
|
28
|
+
* run multiple `msCycle` at the same time.
|
|
29
|
+
*
|
|
30
|
+
* To keep state consistent and to prevent bugs, any key run-ins set
|
|
31
|
+
* in previous `msCycle`(s) will be overwritten by latest
|
|
32
|
+
* `throttledSetState()` call.
|
|
33
|
+
*
|
|
34
|
+
* Will wait the full designated time in `msCycle` on first run.
|
|
35
|
+
*/
|
|
36
|
+
throttledSetState: (msCycle: number, updateState: Partial<State>) => Promise<void>;
|
|
37
|
+
private throttledStateSetter;
|
|
38
|
+
/**
|
|
39
|
+
* Will execute the given function on state change. Subscribe to
|
|
40
|
+
* specific key(s) changes in state by setting keys to the desired
|
|
41
|
+
* key(s) to sub to. Set `keys: true` to sub to all state changes.
|
|
42
|
+
*/
|
|
43
|
+
stateSub: <K extends Key = Key>(keys: true | K[] | K, fct: stateSubFct<State>, fireOnInitSub?: boolean) => {
|
|
44
|
+
unsubscribe: () => boolean;
|
|
45
|
+
};
|
|
46
|
+
/** set `true` if to subscribe to all actions */
|
|
47
|
+
actionSub: <T extends Act["type"] = Act["type"], A extends Extract<Act, {
|
|
48
|
+
type: T;
|
|
49
|
+
}> = Extract<Act, {
|
|
50
|
+
type: T;
|
|
51
|
+
}>>(actions: true | T | T[], fct: actSubFct<A, State>) => {
|
|
52
|
+
unsubscribe: () => boolean;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Allows you to toggle any key with a boolean value true/false.
|
|
56
|
+
*/
|
|
57
|
+
toggle: (key: KeysOfValueType<State, boolean>) => Promise<State>;
|
|
58
|
+
/**
|
|
59
|
+
* Erases local storage managed by this instance of StateManager,
|
|
60
|
+
* & removes all properties/methods on the object. (This way any
|
|
61
|
+
* attempts of accessing the object should return an error);
|
|
62
|
+
*
|
|
63
|
+
* (For debugging purposes):
|
|
64
|
+
* Object will have this appearance afterwards:
|
|
65
|
+
* ```js
|
|
66
|
+
* { type: 'StateManager', destroyed: true }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
destroy: () => void;
|
|
70
|
+
cloneKey: <K extends Key>(key: K) => State[K];
|
|
71
|
+
private stateChanged;
|
|
72
|
+
private stateFromLS;
|
|
73
|
+
private updateLocalStorage;
|
|
74
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StateManager = void 0;
|
|
4
|
+
const _1 = require(".");
|
|
5
|
+
class StateManager {
|
|
6
|
+
prevState = null;
|
|
7
|
+
emittedState = null;
|
|
8
|
+
state;
|
|
9
|
+
useLS = false;
|
|
10
|
+
stateSubDict = {};
|
|
11
|
+
actionSubDict = {};
|
|
12
|
+
stateWasUpdated = true;
|
|
13
|
+
keysChanged = {};
|
|
14
|
+
throttledState = {};
|
|
15
|
+
throttlersRunning = {};
|
|
16
|
+
/**
|
|
17
|
+
* The local storage takes an id, this id
|
|
18
|
+
* should be unique in order to ensure that the
|
|
19
|
+
* storage is unique to the given state object
|
|
20
|
+
*/
|
|
21
|
+
constructor(initialState, useLocalStorage) {
|
|
22
|
+
let state = {};
|
|
23
|
+
if (useLocalStorage) {
|
|
24
|
+
const { useKeys, ignoreKeys, id } = useLocalStorage;
|
|
25
|
+
if (useKeys && ignoreKeys)
|
|
26
|
+
throw Error('"useKeys" & "ignoreKeys" are mutually '
|
|
27
|
+
+ 'exclusive, only use one or the other.');
|
|
28
|
+
this.useLS = useLocalStorage;
|
|
29
|
+
const lsId = this.useLS.id = id + '-utilStateManager';
|
|
30
|
+
state = {
|
|
31
|
+
...initialState,
|
|
32
|
+
...this.stateFromLS(),
|
|
33
|
+
};
|
|
34
|
+
addEventListener('storage', (e) => {
|
|
35
|
+
if (e.key !== lsId)
|
|
36
|
+
return;
|
|
37
|
+
let fromLS = this.stateFromLS();
|
|
38
|
+
if (useKeys)
|
|
39
|
+
fromLS = (0, _1.objExtract)(fromLS, useKeys);
|
|
40
|
+
else if (ignoreKeys)
|
|
41
|
+
ignoreKeys.forEach((key) => delete fromLS[key]);
|
|
42
|
+
if ((0, _1.equal)(this.state, { ...this.state, ...fromLS }))
|
|
43
|
+
return;
|
|
44
|
+
this.setState(fromLS);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
state = initialState;
|
|
49
|
+
}
|
|
50
|
+
this.state = state;
|
|
51
|
+
this.setState(state);
|
|
52
|
+
}
|
|
53
|
+
getState = () => this.state;
|
|
54
|
+
setState = async (updateState) => {
|
|
55
|
+
// Do this, otherwise you are mutating the value.
|
|
56
|
+
// (Would make bugs in this case)
|
|
57
|
+
this.state = { ...this.state, ...updateState };
|
|
58
|
+
this.stateWasUpdated = true;
|
|
59
|
+
await this.stateChanged();
|
|
60
|
+
return this.getState();
|
|
61
|
+
};
|
|
62
|
+
action = (action) => {
|
|
63
|
+
if ((0, _1.isType)(action, 'string'))
|
|
64
|
+
action = { type: action };
|
|
65
|
+
const state = this.getState();
|
|
66
|
+
for (const k in this.actionSubDict)
|
|
67
|
+
this.actionSubDict[k]?.(action, state);
|
|
68
|
+
return action;
|
|
69
|
+
};
|
|
70
|
+
// -- State Set Throttler -- //
|
|
71
|
+
/**
|
|
72
|
+
* Aggregates state updates by this method over the course of
|
|
73
|
+
* `msCycle` time and sets the state only once per `msCycle` time.
|
|
74
|
+
*
|
|
75
|
+
* Different `msCycle` timings run on separate loops, therefore can
|
|
76
|
+
* run multiple `msCycle` at the same time.
|
|
77
|
+
*
|
|
78
|
+
* To keep state consistent and to prevent bugs, any key run-ins set
|
|
79
|
+
* in previous `msCycle`(s) will be overwritten by latest
|
|
80
|
+
* `throttledSetState()` call.
|
|
81
|
+
*
|
|
82
|
+
* Will wait the full designated time in `msCycle` on first run.
|
|
83
|
+
*/
|
|
84
|
+
throttledSetState = async (msCycle, updateState) => {
|
|
85
|
+
if (!this.throttledState[msCycle])
|
|
86
|
+
this.throttledState[msCycle] = {};
|
|
87
|
+
const tsKeys = (0, _1.objKeys)(this.throttledState);
|
|
88
|
+
for (const k in updateState) {
|
|
89
|
+
this.throttledState[msCycle][k] = updateState[k];
|
|
90
|
+
tsKeys.forEach((tsKey) => // To keep state consistent
|
|
91
|
+
this.throttledState[tsKey][k] = updateState[k]);
|
|
92
|
+
}
|
|
93
|
+
this.throttledStateSetter(msCycle);
|
|
94
|
+
};
|
|
95
|
+
throttledStateSetter = async (msCycle) => {
|
|
96
|
+
if (this.throttlersRunning[msCycle])
|
|
97
|
+
return;
|
|
98
|
+
this.throttlersRunning[msCycle] = true;
|
|
99
|
+
await (0, _1.wait)(msCycle);
|
|
100
|
+
while (this.throttledState[msCycle]) {
|
|
101
|
+
this.setState(this.throttledState[msCycle]);
|
|
102
|
+
delete this.throttledState[msCycle];
|
|
103
|
+
await (0, _1.wait)(msCycle);
|
|
104
|
+
}
|
|
105
|
+
this.throttlersRunning[msCycle] = false;
|
|
106
|
+
};
|
|
107
|
+
// -- State Set Throttler -- //
|
|
108
|
+
/**
|
|
109
|
+
* Will execute the given function on state change. Subscribe to
|
|
110
|
+
* specific key(s) changes in state by setting keys to the desired
|
|
111
|
+
* key(s) to sub to. Set `keys: true` to sub to all state changes.
|
|
112
|
+
*/
|
|
113
|
+
stateSub = (keys, fct, fireOnInitSub = false) => {
|
|
114
|
+
if ((0, _1.isType)(keys, 'array') && keys.length === 1)
|
|
115
|
+
keys = keys[0];
|
|
116
|
+
let f = fct;
|
|
117
|
+
if ((0, _1.isType)(keys, 'string'))
|
|
118
|
+
f = (s, prev) => {
|
|
119
|
+
if (this.keysChanged[keys])
|
|
120
|
+
return fct(s, prev);
|
|
121
|
+
};
|
|
122
|
+
else if ((0, _1.isType)(keys, 'array'))
|
|
123
|
+
f = (s, prev) => {
|
|
124
|
+
for (const k of keys)
|
|
125
|
+
if (this.keysChanged[k])
|
|
126
|
+
return fct(s, prev);
|
|
127
|
+
};
|
|
128
|
+
if (fireOnInitSub)
|
|
129
|
+
(0, _1.wait)(0).then(() => fct(this.state, this.prevState));
|
|
130
|
+
const id = Math.random();
|
|
131
|
+
this.stateSubDict[id] = f;
|
|
132
|
+
return { unsubscribe: () => delete this.stateSubDict[id] };
|
|
133
|
+
};
|
|
134
|
+
/** set `true` if to subscribe to all actions */
|
|
135
|
+
actionSub = (actions, fct) => {
|
|
136
|
+
if ((0, _1.isType)(actions, 'array') && actions.length === 1)
|
|
137
|
+
actions = actions[0];
|
|
138
|
+
let f = fct;
|
|
139
|
+
if ((0, _1.isType)(actions, 'string'))
|
|
140
|
+
f = (a, s) => {
|
|
141
|
+
if (a.type === actions)
|
|
142
|
+
return fct(a, s);
|
|
143
|
+
};
|
|
144
|
+
else if ((0, _1.isType)(actions, 'array'))
|
|
145
|
+
f = (a, s) => {
|
|
146
|
+
for (const act of actions)
|
|
147
|
+
if (a.type === act)
|
|
148
|
+
return fct(a, s);
|
|
149
|
+
};
|
|
150
|
+
const id = Math.random();
|
|
151
|
+
this.actionSubDict[id] = f;
|
|
152
|
+
return { unsubscribe: () => delete this.actionSubDict[id] };
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Allows you to toggle any key with a boolean value true/false.
|
|
156
|
+
*/
|
|
157
|
+
toggle = (key) => this.setState({ [key]: (!this.getState()[key]) });
|
|
158
|
+
/**
|
|
159
|
+
* Erases local storage managed by this instance of StateManager,
|
|
160
|
+
* & removes all properties/methods on the object. (This way any
|
|
161
|
+
* attempts of accessing the object should return an error);
|
|
162
|
+
*
|
|
163
|
+
* (For debugging purposes):
|
|
164
|
+
* Object will have this appearance afterwards:
|
|
165
|
+
* ```js
|
|
166
|
+
* { type: 'StateManager', destroyed: true }
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
destroy = () => {
|
|
170
|
+
if (this.useLS)
|
|
171
|
+
localStorage.removeItem(this.useLS.id);
|
|
172
|
+
(0, _1.objKeys)(this).forEach(k => delete this[k]);
|
|
173
|
+
this.type = 'StateManager';
|
|
174
|
+
this.destroyed = true;
|
|
175
|
+
};
|
|
176
|
+
cloneKey = (key) => (0, _1.clone)(this.state[key]);
|
|
177
|
+
stateChanged = async () => {
|
|
178
|
+
// Ensures to run only after all sync code updates the state.
|
|
179
|
+
await (0, _1.wait)(0);
|
|
180
|
+
if (!this.stateWasUpdated)
|
|
181
|
+
return false;
|
|
182
|
+
let stateDidNotChange = true;
|
|
183
|
+
(0, _1.objKeys)(this.state).forEach((k) => {
|
|
184
|
+
const em = this.emittedState || {};
|
|
185
|
+
if ( // only check equality if not already changed.
|
|
186
|
+
!this.keysChanged[k] && (0, _1.equal)(this.state[k], em[k]))
|
|
187
|
+
return;
|
|
188
|
+
stateDidNotChange = false;
|
|
189
|
+
this.keysChanged[k] = true;
|
|
190
|
+
});
|
|
191
|
+
if (stateDidNotChange)
|
|
192
|
+
return this.stateWasUpdated = false;
|
|
193
|
+
this.updateLocalStorage();
|
|
194
|
+
// these 3 need to be set before iterating over subs
|
|
195
|
+
// else prevState wont be accurately emitted
|
|
196
|
+
this.prevState = this.emittedState;
|
|
197
|
+
this.emittedState = this.state;
|
|
198
|
+
this.state = { ...this.state }; // use obj spread (or get bugs)!
|
|
199
|
+
for (const k in this.stateSubDict)
|
|
200
|
+
this.stateSubDict[k]?.(this.state, this.prevState);
|
|
201
|
+
this.keysChanged = {};
|
|
202
|
+
this.stateWasUpdated = false;
|
|
203
|
+
return true;
|
|
204
|
+
};
|
|
205
|
+
stateFromLS = () => {
|
|
206
|
+
if (!this.useLS)
|
|
207
|
+
return;
|
|
208
|
+
const { id } = this.useLS;
|
|
209
|
+
const strState = localStorage.getItem(id);
|
|
210
|
+
if (!strState)
|
|
211
|
+
return {};
|
|
212
|
+
return JSON.parse(strState);
|
|
213
|
+
};
|
|
214
|
+
updateLocalStorage = () => {
|
|
215
|
+
if (!this.useLS)
|
|
216
|
+
return;
|
|
217
|
+
const { id, ignoreKeys, useKeys } = this.useLS;
|
|
218
|
+
let state = { ...this.state };
|
|
219
|
+
if (ignoreKeys)
|
|
220
|
+
ignoreKeys.forEach((key) => delete state[key]);
|
|
221
|
+
else if (useKeys)
|
|
222
|
+
state = (0, _1.objExtract)(state, useKeys);
|
|
223
|
+
localStorage.setItem(id, JSON.stringify(state));
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
exports.StateManager = StateManager;
|
|
227
|
+
//# sourceMappingURL=state-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../src/state-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/time.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { Temporal } from '@js-temporal/polyfill';
|
|
2
2
|
import { AnyDate, MsTime, num, str, TimeArr, TimeObj } from '.';
|
|
3
|
+
/** A promise that waits `ms` amount of milliseconds to execute */
|
|
4
|
+
export declare const wait: (ms: number) => Promise<void>;
|
|
5
|
+
/** Resolves after a given msEpoch passes. `msEpoch - Date.now()` */
|
|
6
|
+
export declare const waitUntil: (msEpoch: number) => Promise<void>;
|
|
3
7
|
export declare const msTime: MsTime;
|
|
4
8
|
export declare const weekTuple: readonly ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
5
9
|
/**
|
|
@@ -35,6 +39,7 @@ export declare const time: {
|
|
|
35
39
|
/** fnc(n) -> add min to now */
|
|
36
40
|
readonly min: (n: num) => number;
|
|
37
41
|
};
|
|
42
|
+
/** Convert ms into: */
|
|
38
43
|
readonly msTo: {
|
|
39
44
|
/** fnc(n) -> from ms to num of seconds */
|
|
40
45
|
readonly sec: (ms: num) => number;
|
|
@@ -51,7 +56,10 @@ export declare const time: {
|
|
|
51
56
|
};
|
|
52
57
|
export declare const humanizedTime: (date: AnyDate) => string | null;
|
|
53
58
|
/** A Date substitute, to make working with time easier and more versatile */
|
|
54
|
-
export declare function getTime(t
|
|
59
|
+
export declare function getTime(t?: TimeArr | num | str,
|
|
60
|
+
/** For a list of available timeZone values run:
|
|
61
|
+
* `Intl.supportedValuesOf('timeZone');` */
|
|
62
|
+
timeZone?: str): {
|
|
55
63
|
zonedTemporal: Temporal.ZonedDateTime;
|
|
56
64
|
date: Date;
|
|
57
65
|
tzOffsetMin: number;
|
package/dist/time.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.timeObj = exports.humanizedTime = exports.time = exports.weekTuple = exports.msTime = void 0;
|
|
3
|
+
exports.timeObj = exports.humanizedTime = exports.time = exports.weekTuple = exports.msTime = exports.waitUntil = exports.wait = void 0;
|
|
4
4
|
exports.dateTimeToString = dateTimeToString;
|
|
5
5
|
exports.getTime = getTime;
|
|
6
6
|
exports.parseDate = parseDate;
|
|
7
7
|
const polyfill_1 = require("@js-temporal/polyfill");
|
|
8
8
|
const _1 = require(".");
|
|
9
|
+
/** A promise that waits `ms` amount of milliseconds to execute */
|
|
10
|
+
const wait = (ms) => new Promise((res) => setTimeout(() => res(), ms));
|
|
11
|
+
exports.wait = wait;
|
|
12
|
+
/** Resolves after a given msEpoch passes. `msEpoch - Date.now()` */
|
|
13
|
+
const waitUntil = (msEpoch) => new Promise(res => setTimeout(res, msEpoch - Date.now()));
|
|
14
|
+
exports.waitUntil = waitUntil;
|
|
9
15
|
exports.msTime = {
|
|
10
16
|
s: 1000,
|
|
11
17
|
m: 60000,
|
|
@@ -53,6 +59,7 @@ exports.time = {
|
|
|
53
59
|
/** fnc(n) -> add min to now */
|
|
54
60
|
min: (n) => Date.now() + n * exports.msTime.m,
|
|
55
61
|
},
|
|
62
|
+
/** Convert ms into: */
|
|
56
63
|
msTo: {
|
|
57
64
|
/** fnc(n) -> from ms to num of seconds */
|
|
58
65
|
sec: (ms) => ms / exports.msTime.s,
|
|
@@ -95,9 +102,13 @@ const humanizedTime = (date) => {
|
|
|
95
102
|
}
|
|
96
103
|
};
|
|
97
104
|
exports.humanizedTime = humanizedTime;
|
|
98
|
-
// Intl.supportedValuesOf('timeZone');
|
|
99
105
|
/** A Date substitute, to make working with time easier and more versatile */
|
|
100
|
-
function getTime(t,
|
|
106
|
+
function getTime(t,
|
|
107
|
+
/** For a list of available timeZone values run:
|
|
108
|
+
* `Intl.supportedValuesOf('timeZone');` */
|
|
109
|
+
timeZone) {
|
|
110
|
+
if (t === undefined)
|
|
111
|
+
t = Date.now();
|
|
101
112
|
timeZone = timeZone || Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
102
113
|
let zonedTemporal;
|
|
103
114
|
let date;
|
|
@@ -151,7 +162,7 @@ const timeObj = (dt) => dt instanceof Date ? ({
|
|
|
151
162
|
min: dt.minute,
|
|
152
163
|
sec: dt.second,
|
|
153
164
|
ms: dt.millisecond,
|
|
154
|
-
wDay: exports.weekTuple[dt.dayOfWeek]
|
|
165
|
+
wDay: exports.weekTuple[dt.dayOfWeek - 1]
|
|
155
166
|
});
|
|
156
167
|
exports.timeObj = timeObj;
|
|
157
168
|
function parseDate(d) {
|
package/dist/time.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type Immutable<T> = {
|
|
2
|
+
readonly [K in keyof T]: Immutable<T[K]>;
|
|
3
|
+
};
|
|
4
|
+
|
|
5
|
+
export type Action<T extends string, D = undefined> =
|
|
6
|
+
Readonly<D extends undefined ? {type: T} : { type: T; data: D; }>;
|
|
7
|
+
|
|
8
|
+
export type stateSubFct<S> = (s: S, prev: S | null) => any;
|
|
9
|
+
|
|
10
|
+
export type actSubFct<
|
|
11
|
+
A extends Action<any, any>,
|
|
12
|
+
S = any
|
|
13
|
+
> = (a: A, s: S) => any;
|
|
14
|
+
|
|
15
|
+
export type lsOptions<P> = {
|
|
16
|
+
id: string;
|
|
17
|
+
useKeys?: P[];
|
|
18
|
+
ignoreKeys?: P[];
|
|
19
|
+
};
|
package/src/@types.ts
CHANGED
|
@@ -5,8 +5,9 @@ export type StrKeys<T> = Extract<keyof T, string>;
|
|
|
5
5
|
|
|
6
6
|
export type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
|
|
7
7
|
|
|
8
|
-
export type Optional<
|
|
9
|
-
|
|
8
|
+
export type Optional<
|
|
9
|
+
T, K extends keyof T = keyof T
|
|
10
|
+
> = { [P in K]?: T[P] };
|
|
10
11
|
|
|
11
12
|
export type ResolvedValue<T> =
|
|
12
13
|
T extends Promise <infer U> ? U : any;
|
|
@@ -62,9 +63,13 @@ export type MsTime = {
|
|
|
62
63
|
* type Y => "k1" | "k3"
|
|
63
64
|
* ```
|
|
64
65
|
*/
|
|
65
|
-
export type KeysOfValueType<O, T> = {
|
|
66
|
+
export type KeysOfValueType<O, T> = {
|
|
67
|
+
[I in keyof O]: O[I] extends T ? I : never
|
|
68
|
+
}[keyof O];
|
|
66
69
|
|
|
67
|
-
export type AwaitReturn<
|
|
70
|
+
export type AwaitReturn<
|
|
71
|
+
T extends AnyFnc<any | Promise<any>>
|
|
72
|
+
> = Awaited<ReturnType<T>>;
|
|
68
73
|
|
|
69
74
|
export type num = number;
|
|
70
75
|
export type str = string;
|
|
@@ -72,7 +77,14 @@ export type bol = boolean;
|
|
|
72
77
|
|
|
73
78
|
export type AnyFnc<T = any> = (...args: any[]) => T;
|
|
74
79
|
|
|
75
|
-
export type DayOfWeek =
|
|
80
|
+
export type DayOfWeek =
|
|
81
|
+
| 'Sun'
|
|
82
|
+
| 'Mon'
|
|
83
|
+
| 'Tue'
|
|
84
|
+
| 'Wed'
|
|
85
|
+
| 'Thu'
|
|
86
|
+
| 'Fri'
|
|
87
|
+
| 'Sat';
|
|
76
88
|
|
|
77
89
|
export type TimeObj = {
|
|
78
90
|
y: num;
|
|
@@ -85,18 +97,16 @@ export type TimeObj = {
|
|
|
85
97
|
wDay: DayOfWeek;
|
|
86
98
|
};
|
|
87
99
|
|
|
88
|
-
export type
|
|
89
|
-
y:
|
|
90
|
-
m?:
|
|
91
|
-
d?:
|
|
92
|
-
h?:
|
|
93
|
-
min?:
|
|
94
|
-
sec?:
|
|
95
|
-
ms?:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
export type
|
|
99
|
-
|
|
100
|
-
export type AnyDate = string | number | Date | TimeObj | PartialTimeObj | TimeArr;
|
|
100
|
+
export type TimeArr = [
|
|
101
|
+
y: num,
|
|
102
|
+
m?: num,
|
|
103
|
+
d?: num,
|
|
104
|
+
h?: num,
|
|
105
|
+
min?: num,
|
|
106
|
+
sec?: num,
|
|
107
|
+
ms?: num
|
|
108
|
+
];
|
|
109
|
+
|
|
110
|
+
export type AnyDate = string | number | Date | TimeObj | TimeArr;
|
|
101
111
|
|
|
102
112
|
export type Dict<T> = { [id: string]: T };
|
package/src/general.ts
CHANGED
|
@@ -39,10 +39,6 @@ export const interval = (
|
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
/** A promise that waits `ms` amount of milliseconds to execute */
|
|
43
|
-
export const wait = (ms: number): Promise<void> =>
|
|
44
|
-
new Promise((res) => setTimeout(() => res(), ms));
|
|
45
|
-
|
|
46
42
|
const usubAllFunct = (x: any, unsubName = 'unsubscribe') =>
|
|
47
43
|
isType(x, 'object')
|
|
48
44
|
&&
|
package/src/index.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
export * from './@types';
|
|
2
|
+
export * from './@state.types'
|
|
2
3
|
export * from './array';
|
|
3
4
|
export * from './clone';
|
|
4
5
|
export * from './equality';
|
|
5
6
|
export * from './general';
|
|
7
|
+
export * from './http';
|
|
6
8
|
export * from './iterate';
|
|
7
9
|
export * from './number';
|
|
8
10
|
export * from './object';
|
|
11
|
+
export * from './state-manager';
|
|
9
12
|
export * from './string';
|
|
10
13
|
export * from './test';
|
|
11
|
-
export * from './time';
|
|
12
|
-
export * from './http';
|
|
14
|
+
export * from './time';
|
package/src/number.ts
CHANGED
|
@@ -26,17 +26,8 @@ export const average = (nArr: number[]) =>
|
|
|
26
26
|
* decPlaces(1.1276, 2) //=> 1.13
|
|
27
27
|
* ```
|
|
28
28
|
*/
|
|
29
|
-
export const
|
|
30
|
-
parseFloat(n.toFixed(
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* @example
|
|
34
|
-
* ```js
|
|
35
|
-
* numberWithCommas(1000000) //=> '1,000,000'
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
export const numberWithCommas = (n: number | string) =>
|
|
39
|
-
n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
|
29
|
+
export const numFixed = (n: number, fractionDigits: number) =>
|
|
30
|
+
parseFloat(n.toFixed(fractionDigits));
|
|
40
31
|
|
|
41
32
|
/**
|
|
42
33
|
* Takes a number || number[] and min & max, will generate a
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Action, actSubFct, lsOptions, stateSubFct
|
|
3
|
+
} from './@state.types';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Dict, KeysOfValueType
|
|
7
|
+
} from '.'
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
wait, equal, objExtract,
|
|
11
|
+
isType, objKeys, clone
|
|
12
|
+
} from '.';
|
|
13
|
+
|
|
14
|
+
export class StateManager<
|
|
15
|
+
State extends {},
|
|
16
|
+
Act extends Action<any, any> = Action<any, any>,
|
|
17
|
+
Key extends Extract<keyof State, string> = Extract<keyof State, string>
|
|
18
|
+
> {
|
|
19
|
+
|
|
20
|
+
private prevState: State | null = null;
|
|
21
|
+
private emittedState: State | null = null;
|
|
22
|
+
private state: State;
|
|
23
|
+
|
|
24
|
+
private readonly useLS: lsOptions<Key> | false = false;
|
|
25
|
+
|
|
26
|
+
private stateSubDict: Dict<stateSubFct<State>> = {};
|
|
27
|
+
private actionSubDict: Dict<actSubFct<Act>> = {};
|
|
28
|
+
|
|
29
|
+
private stateWasUpdated = true;
|
|
30
|
+
private keysChanged: { [K in Key]?: true } = {};
|
|
31
|
+
|
|
32
|
+
private throttledState: Dict<Partial<State>> = {};
|
|
33
|
+
private throttlersRunning: Dict<boolean> = {};
|
|
34
|
+
/**
|
|
35
|
+
* The local storage takes an id, this id
|
|
36
|
+
* should be unique in order to ensure that the
|
|
37
|
+
* storage is unique to the given state object
|
|
38
|
+
*/
|
|
39
|
+
constructor(
|
|
40
|
+
initialState: State,
|
|
41
|
+
useLocalStorage?: lsOptions<Key>
|
|
42
|
+
) {
|
|
43
|
+
let state = {} as State;
|
|
44
|
+
|
|
45
|
+
if (useLocalStorage) {
|
|
46
|
+
const { useKeys, ignoreKeys, id } = useLocalStorage;
|
|
47
|
+
|
|
48
|
+
if (useKeys && ignoreKeys) throw Error(
|
|
49
|
+
'"useKeys" & "ignoreKeys" are mutually '
|
|
50
|
+
+ 'exclusive, only use one or the other.'
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
this.useLS = useLocalStorage;
|
|
54
|
+
const lsId = this.useLS.id = id + '-utilStateManager';
|
|
55
|
+
|
|
56
|
+
state = {
|
|
57
|
+
...initialState,
|
|
58
|
+
...this.stateFromLS(),
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
addEventListener('storage', (e: StorageEvent) => {
|
|
62
|
+
if (e.key !== lsId) return;
|
|
63
|
+
|
|
64
|
+
let fromLS = this.stateFromLS();
|
|
65
|
+
|
|
66
|
+
if (useKeys)
|
|
67
|
+
fromLS = objExtract(fromLS, useKeys);
|
|
68
|
+
else if (ignoreKeys)
|
|
69
|
+
ignoreKeys.forEach((key) => delete fromLS[key]);
|
|
70
|
+
|
|
71
|
+
if (equal(this.state, { ...this.state, ...fromLS })) return;
|
|
72
|
+
|
|
73
|
+
this.setState(fromLS);
|
|
74
|
+
});
|
|
75
|
+
} else {
|
|
76
|
+
state = initialState;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this.state = state;
|
|
80
|
+
this.setState(state);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
getState = () => this.state;
|
|
84
|
+
|
|
85
|
+
setState = async (updateState: Partial<State>) => {
|
|
86
|
+
// Do this, otherwise you are mutating the value.
|
|
87
|
+
// (Would make bugs in this case)
|
|
88
|
+
this.state = { ...this.state, ...updateState };
|
|
89
|
+
|
|
90
|
+
this.stateWasUpdated = true;
|
|
91
|
+
await this.stateChanged();
|
|
92
|
+
return this.getState();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
action = <A extends Act = Act>(action: A | A['type']) => {
|
|
96
|
+
if (isType(action, 'string')) action = { type: action } as A;
|
|
97
|
+
const state = this.getState();
|
|
98
|
+
|
|
99
|
+
for (const k in this.actionSubDict)
|
|
100
|
+
this.actionSubDict[k]?.(action, state);
|
|
101
|
+
|
|
102
|
+
return action;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// -- State Set Throttler -- //
|
|
106
|
+
/**
|
|
107
|
+
* Aggregates state updates by this method over the course of
|
|
108
|
+
* `msCycle` time and sets the state only once per `msCycle` time.
|
|
109
|
+
*
|
|
110
|
+
* Different `msCycle` timings run on separate loops, therefore can
|
|
111
|
+
* run multiple `msCycle` at the same time.
|
|
112
|
+
*
|
|
113
|
+
* To keep state consistent and to prevent bugs, any key run-ins set
|
|
114
|
+
* in previous `msCycle`(s) will be overwritten by latest
|
|
115
|
+
* `throttledSetState()` call.
|
|
116
|
+
*
|
|
117
|
+
* Will wait the full designated time in `msCycle` on first run.
|
|
118
|
+
*/
|
|
119
|
+
throttledSetState = async (
|
|
120
|
+
msCycle: number,
|
|
121
|
+
updateState: Partial<State>
|
|
122
|
+
) => {
|
|
123
|
+
if (!this.throttledState[msCycle])
|
|
124
|
+
this.throttledState[msCycle] = {};
|
|
125
|
+
|
|
126
|
+
const tsKeys = objKeys(this.throttledState);
|
|
127
|
+
for (const k in updateState) {
|
|
128
|
+
this.throttledState[msCycle][k] = updateState[k];
|
|
129
|
+
|
|
130
|
+
tsKeys.forEach((tsKey) => // To keep state consistent
|
|
131
|
+
this.throttledState[tsKey]![k] = updateState[k]);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
this.throttledStateSetter(msCycle);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
private throttledStateSetter = async (msCycle: number) => {
|
|
138
|
+
if (this.throttlersRunning[msCycle]) return;
|
|
139
|
+
this.throttlersRunning[msCycle] = true;
|
|
140
|
+
|
|
141
|
+
await wait(msCycle);
|
|
142
|
+
while (this.throttledState[msCycle]) {
|
|
143
|
+
this.setState(this.throttledState[msCycle]);
|
|
144
|
+
delete this.throttledState[msCycle];
|
|
145
|
+
await wait(msCycle);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
this.throttlersRunning[msCycle] = false;
|
|
149
|
+
}
|
|
150
|
+
// -- State Set Throttler -- //
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Will execute the given function on state change. Subscribe to
|
|
154
|
+
* specific key(s) changes in state by setting keys to the desired
|
|
155
|
+
* key(s) to sub to. Set `keys: true` to sub to all state changes.
|
|
156
|
+
*/
|
|
157
|
+
stateSub = <K extends Key = Key>(
|
|
158
|
+
keys: true | K[] | K,
|
|
159
|
+
fct: stateSubFct<State>,
|
|
160
|
+
fireOnInitSub = false
|
|
161
|
+
) => {
|
|
162
|
+
if (isType(keys, 'array') && keys.length === 1)
|
|
163
|
+
keys = keys[0]!;
|
|
164
|
+
|
|
165
|
+
let f = fct;
|
|
166
|
+
|
|
167
|
+
if (isType(keys, 'string')) f = (s, prev) => {
|
|
168
|
+
if (this.keysChanged[keys as K]) return fct(s, prev);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
else if (isType(keys, 'array')) f = (s, prev) => {
|
|
172
|
+
for (const k of keys as K[])
|
|
173
|
+
if (this.keysChanged[k]) return fct(s, prev);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (fireOnInitSub)
|
|
177
|
+
wait(0).then(() => fct(this.state, this.prevState));
|
|
178
|
+
|
|
179
|
+
const id = Math.random();
|
|
180
|
+
this.stateSubDict[id] = f as any;
|
|
181
|
+
return { unsubscribe: () => delete this.stateSubDict[id] };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** set `true` if to subscribe to all actions */
|
|
185
|
+
actionSub = <
|
|
186
|
+
T extends Act['type'] = Act['type'],
|
|
187
|
+
A extends Extract<Act, { type: T }> = Extract<Act, { type: T }>
|
|
188
|
+
>(
|
|
189
|
+
actions: true | T | T[],
|
|
190
|
+
fct: actSubFct<A, State>
|
|
191
|
+
) => {
|
|
192
|
+
if (isType(actions, 'array') && actions.length === 1)
|
|
193
|
+
actions = actions[0]!;
|
|
194
|
+
|
|
195
|
+
let f = fct;
|
|
196
|
+
|
|
197
|
+
if (isType(actions, 'string')) f = (a, s) => {
|
|
198
|
+
if (a.type === actions) return fct(a, s);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
else if (isType(actions, 'array')) f = (a, s) => {
|
|
202
|
+
for (const act of actions as T['type'][])
|
|
203
|
+
if (a.type === act) return fct(a, s);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const id = Math.random();
|
|
207
|
+
this.actionSubDict[id] = f as any;
|
|
208
|
+
return { unsubscribe: () => delete this.actionSubDict[id] };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Allows you to toggle any key with a boolean value true/false.
|
|
213
|
+
*/
|
|
214
|
+
toggle = (key: KeysOfValueType<State, boolean>) =>
|
|
215
|
+
this.setState({ [key]: (!this.getState()[key]) } as any);
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Erases local storage managed by this instance of StateManager,
|
|
219
|
+
* & removes all properties/methods on the object. (This way any
|
|
220
|
+
* attempts of accessing the object should return an error);
|
|
221
|
+
*
|
|
222
|
+
* (For debugging purposes):
|
|
223
|
+
* Object will have this appearance afterwards:
|
|
224
|
+
* ```js
|
|
225
|
+
* { type: 'StateManager', destroyed: true }
|
|
226
|
+
* ```
|
|
227
|
+
*/
|
|
228
|
+
destroy = () => {
|
|
229
|
+
if (this.useLS)
|
|
230
|
+
localStorage.removeItem(this.useLS.id);
|
|
231
|
+
|
|
232
|
+
objKeys(this).forEach(k => delete this[k]);
|
|
233
|
+
(this as any).type = 'StateManager';
|
|
234
|
+
(this as any).destroyed = true;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
cloneKey =
|
|
238
|
+
<K extends Key>(key: K): State[K] => clone(this.state[key]);
|
|
239
|
+
|
|
240
|
+
private stateChanged = async () => {
|
|
241
|
+
// Ensures to run only after all sync code updates the state.
|
|
242
|
+
await wait(0);
|
|
243
|
+
if (!this.stateWasUpdated) return false;
|
|
244
|
+
|
|
245
|
+
let stateDidNotChange = true;
|
|
246
|
+
|
|
247
|
+
objKeys(this.state).forEach((k) => {
|
|
248
|
+
const em = this.emittedState || {} as Partial<State>;
|
|
249
|
+
|
|
250
|
+
if (// only check equality if not already changed.
|
|
251
|
+
!this.keysChanged[k as Key] && equal(this.state[k], em[k])
|
|
252
|
+
) return;
|
|
253
|
+
|
|
254
|
+
stateDidNotChange = false;
|
|
255
|
+
this.keysChanged[k as Key] = true;
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
if (stateDidNotChange)
|
|
259
|
+
return this.stateWasUpdated = false;
|
|
260
|
+
|
|
261
|
+
this.updateLocalStorage();
|
|
262
|
+
|
|
263
|
+
// these 3 need to be set before iterating over subs
|
|
264
|
+
// else prevState wont be accurately emitted
|
|
265
|
+
this.prevState = this.emittedState;
|
|
266
|
+
this.emittedState = this.state;
|
|
267
|
+
this.state = { ...this.state }; // use obj spread (or get bugs)!
|
|
268
|
+
|
|
269
|
+
for (const k in this.stateSubDict)
|
|
270
|
+
this.stateSubDict[k]?.(this.state, this.prevState as State);
|
|
271
|
+
|
|
272
|
+
this.keysChanged = {};
|
|
273
|
+
this.stateWasUpdated = false;
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
private stateFromLS = () => {
|
|
278
|
+
if (!this.useLS) return;
|
|
279
|
+
|
|
280
|
+
const { id } = this.useLS;
|
|
281
|
+
const strState = localStorage.getItem(id);
|
|
282
|
+
if (!strState) return {};
|
|
283
|
+
|
|
284
|
+
return JSON.parse(strState);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
private updateLocalStorage = () => {
|
|
288
|
+
if (!this.useLS) return;
|
|
289
|
+
|
|
290
|
+
const { id, ignoreKeys, useKeys } = this.useLS;
|
|
291
|
+
|
|
292
|
+
let state = { ...this.state };
|
|
293
|
+
|
|
294
|
+
if (ignoreKeys)
|
|
295
|
+
ignoreKeys.forEach((key) => delete state[key]);
|
|
296
|
+
else if (useKeys)
|
|
297
|
+
state = objExtract(state, useKeys);
|
|
298
|
+
|
|
299
|
+
localStorage.setItem(id, JSON.stringify(state));
|
|
300
|
+
}
|
|
301
|
+
}
|
package/src/time.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { Temporal } from '@js-temporal/polyfill';
|
|
2
2
|
import { AnyDate, isType, MsTime, num, str, TimeArr, TimeObj } from '.';
|
|
3
3
|
|
|
4
|
+
/** A promise that waits `ms` amount of milliseconds to execute */
|
|
5
|
+
export const wait = (ms: number): Promise<void> =>
|
|
6
|
+
new Promise((res) => setTimeout(() => res(), ms));
|
|
7
|
+
|
|
8
|
+
/** Resolves after a given msEpoch passes. `msEpoch - Date.now()` */
|
|
9
|
+
export const waitUntil = (msEpoch: number): Promise<void> =>
|
|
10
|
+
new Promise(res => setTimeout(res, msEpoch - Date.now()))
|
|
11
|
+
|
|
4
12
|
export const msTime: MsTime = {
|
|
5
13
|
s: 1000,
|
|
6
14
|
m: 60000,
|
|
@@ -56,6 +64,7 @@ export const time = {
|
|
|
56
64
|
min: (n: num) => Date.now() + n * msTime.m,
|
|
57
65
|
},
|
|
58
66
|
|
|
67
|
+
/** Convert ms into: */
|
|
59
68
|
msTo: {
|
|
60
69
|
/** fnc(n) -> from ms to num of seconds */
|
|
61
70
|
sec: (ms: num) => ms / msTime.s,
|
|
@@ -97,13 +106,16 @@ export const humanizedTime = (date: AnyDate) => {
|
|
|
97
106
|
}
|
|
98
107
|
}
|
|
99
108
|
|
|
100
|
-
// Intl.supportedValuesOf('timeZone');
|
|
101
109
|
/** A Date substitute, to make working with time easier and more versatile */
|
|
102
110
|
export function getTime(
|
|
103
|
-
t
|
|
111
|
+
t?: TimeArr | num | str,
|
|
112
|
+
/** For a list of available timeZone values run:
|
|
113
|
+
* `Intl.supportedValuesOf('timeZone');` */
|
|
104
114
|
timeZone?: str
|
|
105
115
|
) {
|
|
116
|
+
if (t === undefined) t = Date.now();
|
|
106
117
|
timeZone = timeZone || Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
118
|
+
|
|
107
119
|
let zonedTemporal: Temporal.ZonedDateTime;
|
|
108
120
|
let date: Date;
|
|
109
121
|
let isoStr: str;
|
|
@@ -158,7 +170,7 @@ export const timeObj = (dt: Date | Temporal.ZonedDateTime): TimeObj => dt instan
|
|
|
158
170
|
min: dt.minute,
|
|
159
171
|
sec: dt.second,
|
|
160
172
|
ms: dt.millisecond,
|
|
161
|
-
wDay: weekTuple[dt.dayOfWeek]!
|
|
173
|
+
wDay: weekTuple[dt.dayOfWeek - 1]!
|
|
162
174
|
});
|
|
163
175
|
|
|
164
176
|
export function parseDate(d: AnyDate) {
|