@giveback007/util-lib 0.25.4 → 1.0.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.
Files changed (58) hide show
  1. package/README.md +7 -7
  2. package/dist/@types.d.ts +40 -42
  3. package/dist/@types.js +2 -2
  4. package/dist/array.d.ts +66 -66
  5. package/dist/array.js +128 -128
  6. package/dist/array.js.map +1 -1
  7. package/dist/clone.d.ts +2 -2
  8. package/dist/clone.js +44 -45
  9. package/dist/clone.js.map +1 -1
  10. package/dist/equality.d.ts +1 -1
  11. package/dist/equality.js +81 -82
  12. package/dist/equality.js.map +1 -1
  13. package/dist/general.d.ts +44 -37
  14. package/dist/general.js +172 -139
  15. package/dist/general.js.map +1 -1
  16. package/dist/index.d.ts +11 -11
  17. package/dist/index.js +27 -23
  18. package/dist/index.js.map +1 -1
  19. package/dist/iterate.d.ts +44 -44
  20. package/dist/iterate.js +43 -44
  21. package/dist/iterate.js.map +1 -1
  22. package/dist/number.d.ts +33 -32
  23. package/dist/number.js +57 -55
  24. package/dist/number.js.map +1 -1
  25. package/dist/object.d.ts +45 -49
  26. package/dist/object.js +82 -92
  27. package/dist/object.js.map +1 -1
  28. package/dist/string.d.ts +3 -4
  29. package/dist/string.js +8 -18
  30. package/dist/string.js.map +1 -1
  31. package/dist/test.d.ts +40 -41
  32. package/dist/test.js +65 -67
  33. package/dist/test.js.map +1 -1
  34. package/dist/time.d.ts +87 -93
  35. package/dist/time.js +230 -174
  36. package/dist/time.js.map +1 -1
  37. package/package.json +33 -45
  38. package/src/@types/types.d.ts +34 -0
  39. package/src/@types.ts +67 -67
  40. package/src/array.ts +175 -175
  41. package/src/clone.ts +34 -35
  42. package/src/equality.ts +80 -80
  43. package/src/general.ts +192 -152
  44. package/src/index.ts +11 -11
  45. package/src/iterate.ts +86 -86
  46. package/src/number.ts +64 -62
  47. package/src/object.ts +109 -123
  48. package/src/string.ts +6 -20
  49. package/src/test.ts +71 -74
  50. package/src/time.ts +268 -219
  51. package/dist/node/file-systems.d.ts +0 -1
  52. package/dist/node/file-systems.js +0 -16
  53. package/dist/node/file-systems.js.map +0 -1
  54. package/dist/node/index.d.ts +0 -1
  55. package/dist/node/index.js +0 -14
  56. package/dist/node/index.js.map +0 -1
  57. package/src/node/file-systems.ts +0 -16
  58. package/src/node/index.ts +0 -1
package/src/test.ts CHANGED
@@ -1,74 +1,71 @@
1
- import { equal, JsType } from '.';
2
- import { JsTypeFind, objVals, type } from '.';
3
-
4
- /** Check if `x` is equal to any of the values in the array. */
5
- export const equalAny = (x: any, equals: any[]) => !!equals.find((y) => equal(x, y));
6
-
7
- /**
8
- * Checks if object has the key, made as a function for type transfer.
9
- *
10
- * Uses `obj.hasOwnProperty(key)` instead of `key in obj`
11
- *
12
- * https://stackoverflow.com/questions/13632999/if-key-in-object-or-ifobject-hasownpropertykey
13
- */
14
- export const hasKey = <
15
- K extends (string | number)
16
- >(obj: any, key: K): obj is { [P in K]: any } =>
17
- isType(obj, 'object') && obj.hasOwnProperty(key);
18
-
19
- /** Checks if object has keys from an array of keys, made as a function for type transfer */
20
- export function hasKeys<
21
- K extends (string | number)
22
- >(obj: any, keys: K[]): obj is { [P in K]: any } {
23
- if (!isType(obj, 'object')) return false;
24
-
25
- for (const key of keys)
26
- if (!obj.hasOwnProperty(key)) return false;
27
-
28
- return true;
29
- }
30
-
31
- /**
32
- * The function will test if the type of the first
33
- * argument equals testType. Argument testType is a string
34
- * representing a javascript type.
35
- *
36
- * @param val value to be tested
37
- * @param testType to check if typeof val === testType
38
- * @example
39
- * ```js
40
- * isType([], 'array') //=> true
41
- * isType(null, 'undefined') //=> false
42
- * ```
43
- */
44
- export const isType = <T extends JsType> (
45
- val: any, testType: T
46
- ): val is JsTypeFind<T> => type(val) === testType;
47
-
48
- /** any of the values in the first "example" return `true`
49
- * @example
50
- * ```js
51
- * nullOrEmpty(null | undefined | '' | [ ] | { }) //=> true
52
- * nullOrEmpty([1, 2] | { key: 'value' } | true) //=> false
53
- * ```
54
- */
55
- export function nullOrEmpty(x: any): boolean
56
- {
57
- // null || undefined
58
- if (nonValue(x)) return true;
59
-
60
- // (string || array).length === 0
61
- if (isType(x, 'string') || isType(x, 'array')) return !x.length;
62
-
63
- // object // { key: 'val' } => false, { } => true
64
- if (isType(x, 'object')) return !objVals(x).length;
65
-
66
- return false;
67
- }
68
-
69
- /** val `is` (null || undefined) */
70
- export const nonValue = (val: any): val is (null | undefined) =>
71
- val === null || val === undefined;
72
-
73
- export const isValidEmail = (email: string) =>
74
- /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(email)
1
+ import { equal, JsType } from '.';
2
+ import { JsTypeFind, objVals, type } from '.';
3
+
4
+ /** Check if `x` is equal to any of the values in the array. */
5
+ export const equalAny = (x: any, equals: any[]) => !!equals.find((y) => equal(x, y));
6
+
7
+ /**
8
+ * Checks if object has the key, made as a function for type transfer.
9
+ *
10
+ * Uses `obj.hasOwnProperty(key)` instead of `key in obj`
11
+ *
12
+ * https://stackoverflow.com/questions/13632999/if-key-in-object-or-ifobject-hasownpropertykey
13
+ */
14
+ export const hasKey = <
15
+ K extends (string | number)
16
+ >(obj: any, key: K): obj is { [P in K]: any } =>
17
+ isType(obj, 'object') && obj.hasOwnProperty(key);
18
+
19
+ /** Checks if object has keys from an array of keys, made as a function for type transfer */
20
+ export function hasKeys<
21
+ K extends (string | number)
22
+ >(obj: any, keys: K[]): obj is { [P in K]: any } {
23
+ if (!isType(obj, 'object')) return false;
24
+
25
+ for (const key of keys)
26
+ if (!obj.hasOwnProperty(key)) return false;
27
+
28
+ return true;
29
+ }
30
+
31
+ /**
32
+ * The function will test if the type of the first
33
+ * argument equals testType. Argument testType is a string
34
+ * representing a javascript type.
35
+ *
36
+ * @param val value to be tested
37
+ * @param testType to check if typeof val === testType
38
+ * @example
39
+ * ```js
40
+ * isType([], 'array') //=> true
41
+ * isType(null, 'undefined') //=> false
42
+ * ```
43
+ */
44
+ export const isType = <T extends JsType>(
45
+ val: any, testType: T
46
+ ): val is JsTypeFind<T> => type(val) === testType;
47
+
48
+ /** any of the values in the first "example" return `true`
49
+ * @example
50
+ * ```js
51
+ * nullOrEmpty(null | undefined | '' | [ ] | { }) //=> true
52
+ * nullOrEmpty([1, 2] | { key: 'value' } | true) //=> false
53
+ * ```
54
+ */
55
+ export function nullOrEmpty(x: any): boolean {
56
+ // null || undefined
57
+ if (nonVal(x)) return true;
58
+
59
+ // (string || array).length === 0
60
+ if (isType(x, 'string') || isType(x, 'array')) return !x.length;
61
+
62
+ // object // { key: 'val' } => false, { } => true
63
+ if (isType(x, 'object')) return !objVals(x).length;
64
+
65
+ return false;
66
+ }
67
+
68
+ /** val `is` (null || undefined) */
69
+ export const nonVal = <T>(
70
+ x: T | null | undefined
71
+ ): x is (undefined | null) => x === null || x === undefined;
package/src/time.ts CHANGED
@@ -1,219 +1,268 @@
1
- import { isType, MsTime } from '.';
2
-
3
- export const msTime: MsTime = {
4
- s: 1000,
5
- m: 60000,
6
- h: 3600000,
7
- d: 86400000,
8
- w: 604800000,
9
- }
10
-
11
- export const weekTuple = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'] as const;
12
-
13
- /**
14
- * Converts Date to time of day.
15
- * Good for use in loging.
16
- *
17
- * If no parameter `dt = new Date()`.
18
- * @param dt instance of Date obj
19
- * @returns `hh:mm:ss:ms`
20
- * @example "15:07:56:150"
21
- */
22
- export function dateTimeToString(dt = new Date())
23
- {
24
- const h = ('0' + dt.getHours()).slice(-2);
25
- const m = ('0' + dt.getMinutes()).slice(-2);
26
- const s = ('0' + dt.getSeconds()).slice(-2);
27
- const ms = ('00' + dt.getMilliseconds()).slice(-3);
28
- return `${h}:${m}:${s}:${ms}`;
29
- }
30
-
31
- export const msToSec = (ms: number) => ms / msTime.s;
32
- export const msToMin = (ms: number) => ms / msTime.m;
33
- export const msToHrs = (ms: number) => ms / msTime.h;
34
- export const msToDys = (ms: number) => ms / msTime.d;
35
- export const msToWks = (ms: number) => ms / msTime.w;
36
-
37
- type TimeObjS = { d: string; h: string; m: string; s: string; ms: string; };
38
- type TimeObjN = { d: number; h: number; m: number; s: number; ms: number; };
39
- /**
40
- * DEPRECATED use `msTimeObj()`
41
- *
42
- * ----------------------------
43
- *
44
- * Takes milliseconds and outputs to human readable time
45
- * @returns `'ddd:hh:mm:ss:ms'` | `{ d: number; h: number; m: number; s: number; ms: number; }`
46
- * @example
47
- * ```js
48
- * msToTime(86400005) => '001:00:00:00:005'
49
- * msToTime(86400005, true) => { d: 1; h: 0; m: 0; s: 0; ms: 5; }
50
- * ```
51
- */
52
- export function msToTime<T extends boolean>(msT: number, toObj?: boolean): string | TimeObjN;
53
- export function msToTime<T extends boolean>(msT: number, toObj: true): TimeObjN;
54
- export function msToTime<T extends boolean>(msT: number, toObj?: false): string;
55
- export function msToTime(msT: number, toObj = false) {
56
- // N - number;
57
- const msN = (msT % 1000);
58
- let sN = Math.floor(msT / 1000);
59
- let mN = Math.floor(sN / 60);
60
- sN = sN % 60;
61
-
62
- let hN = Math.floor(mN / 60);
63
- mN = mN % 60;
64
-
65
- const dN = Math.floor(hN / 24);
66
- hN = hN % 24;
67
-
68
- const d = ('00' + dN).slice(-3);
69
- const h = (('0' + hN).slice(-2));
70
- const m = (('0' + mN).slice(-2));
71
- const s = (('0' + sN)).slice(-2);
72
- const ms = (('00' + msN).slice(-3));
73
-
74
- if (toObj) return { d: dN, h: hN, m: mN, s: sN, ms: msN };
75
- return `${dN ? d + ':' : ''}${h}:${m}:${s}:${ms}`;
76
- }
77
-
78
- export function msTimeObj<T extends boolean>(msT: number, toNumbers?: boolean): TimeObjS
79
- export function msTimeObj<T extends boolean>(msT: number, toNumbers: true): TimeObjN;
80
- export function msTimeObj(msT: number, toNumbers = false) {
81
- // N - number;
82
- const ms = (msT % 1000);
83
- let s = Math.floor(msT / 1000);
84
- let m = Math.floor(s / 60);
85
- s = s % 60;
86
-
87
- let h = Math.floor(m / 60);
88
- m = m % 60;
89
-
90
- const d = Math.floor(h / 24);
91
- h = h % 24;
92
-
93
- if (toNumbers) return { d, h, m, s, ms };
94
-
95
- return {
96
- d: ('00' + d).slice(-3),
97
- h: (('0' + h).slice(-2)),
98
- m: (('0' + m).slice(-2)),
99
- s: (('0' + s)).slice(-2),
100
- ms: (('00' + ms).slice(-3)),
101
- }
102
- }
103
-
104
- /** Gives seconds in milliseconds | `sec(s) => s * 1000` */
105
- export const seconds = (s: number) => s * msTime.s;
106
-
107
- /** Analog of seconds() */
108
- export const sec = seconds;
109
-
110
- /** Gives minutes in milliseconds | `min(m) => m * 60000` */
111
- export const minutes = (m: number) => m * msTime.m;
112
-
113
- /** Analog of minutes() */
114
- export const min = minutes;
115
-
116
- /** Gives hours in milliseconds | `hrs(h) => h * 3600000` */
117
- export const hours = (h: number) => h * msTime.h;
118
-
119
- /** Analog of hours */
120
- export const hrs = hours;
121
-
122
- /** Gives days in milliseconds | `dys(d) => d * 86400000` */
123
- export const days = (d: number) => d * msTime.d;
124
-
125
- /** Analog of days */
126
- export const dys = days;
127
-
128
- /** Gives weeks in milliseconds | `wks(w) => w * 604800000` */
129
- export const weeks = (w: number) => w * msTime.w;
130
-
131
- /** Analog of weeks */
132
- export const wks = weeks;
133
-
134
- /** Gives the 'start' and 'end' of a day.
135
- *
136
- * Start of day is the first ms of the day
137
- *
138
- * End of day is the last ms of the day
139
- */
140
- export function getDayStartEnd(t: number | Date, type: 'unix' | 'local' = 'local') {
141
- if (isType(t, 'number')) t = new Date(t);
142
-
143
- const y = t.getFullYear();
144
- const m = t.getMonth();
145
- const d = t.getDate();
146
-
147
- let start = new Date(y, m, d);
148
- let end = new Date(y, m, d, 23, 59, 59, 999);
149
-
150
- if (type === 'unix') {
151
- const tzOffset = min(start.getTimezoneOffset());
152
-
153
- start = new Date(start.getTime() + tzOffset);
154
- end = new Date(end.getTime() + tzOffset);
155
- }
156
-
157
- return { start, end };
158
- }
159
-
160
- export function weekStartEnd(t: number | Date, weekStart: 'sun' | 'mon' = 'sun', type: 'unix' | 'local' = 'local') {
161
- if (isType(t, 'number')) t = new Date(t);
162
-
163
- const wd = t.getDay();
164
-
165
- const startOffset = wd * -1 + (weekStart === 'mon' ? 1 : 0);
166
- const endOffset = 6 + startOffset;
167
-
168
- const s = new Date(t.getTime() + days(startOffset));
169
- const e = new Date(t.getTime() + days(endOffset));
170
-
171
- let start = new Date(s.getFullYear(), s.getMonth(), s.getDate());
172
- let end = new Date(e.getFullYear(), e.getMonth(), e.getDate(), 23, 59, 59, 999);
173
-
174
- if (type === 'unix') {
175
- const tzOffset = min(start.getTimezoneOffset());
176
-
177
- start = new Date(start.getTime() + tzOffset);
178
- end = new Date(end.getTime() + tzOffset);
179
- }
180
-
181
- return { start, end };
182
- }
183
-
184
- export function monthStartEnd(t: number | Date, type: 'unix' | 'local' = 'local') {
185
- if (isType(t, 'number')) t = new Date(t);
186
-
187
- const y = t.getFullYear();
188
- const m = t.getMonth();
189
-
190
- let start = new Date(y, m, 1);
191
- let end = new Date(y, m + 1, 0, 23, 59, 59, 999);
192
-
193
- if (type === 'unix') {
194
- const tzOffset = min(start.getTimezoneOffset());
195
-
196
- start = new Date(start.getTime() + tzOffset);
197
- end = new Date(end.getTime() + tzOffset);
198
- }
199
-
200
- return { start, end };
201
- }
202
-
203
- export function yearStartEnd(t: number | Date, type: 'unix' | 'local' = 'local') {
204
- if (isType(t, 'number')) t = new Date(t);
205
-
206
- const y = t.getFullYear();
207
-
208
- let start = new Date(y, 0, 1);
209
- let end = new Date(y, 12, 0, 23, 59, 59, 999);
210
-
211
- if (type === 'unix') {
212
- const tzOffset = min(start.getTimezoneOffset());
213
-
214
- start = new Date(start.getTime() + tzOffset);
215
- end = new Date(end.getTime() + tzOffset);
216
- }
217
-
218
- return { start, end };
219
- }
1
+ import { isType, MsTime } from '.';
2
+
3
+ export const msTime: MsTime = {
4
+ s: 1000,
5
+ m: 60000,
6
+ h: 3600000,
7
+ d: 86400000,
8
+ w: 604800000,
9
+ }
10
+
11
+ export const weekTuple = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const;
12
+
13
+ /**
14
+ * Converts Date to time of day.
15
+ * Good for use in logging.
16
+ *
17
+ * If no parameter `dt = new Date()`.
18
+ * @param dt instance of Date obj
19
+ * @returns `hh:mm:ss:ms`
20
+ * @example "15:07:56:150"
21
+ */
22
+ export function dateTimeToString(dt = new Date())
23
+ {
24
+ const h = ('0' + dt.getHours()).slice(-2);
25
+ const m = ('0' + dt.getMinutes()).slice(-2);
26
+ const s = ('0' + dt.getSeconds()).slice(-2);
27
+ const ms = ('00' + dt.getMilliseconds()).slice(-3);
28
+
29
+ return `${h}:${m}:${s}:${ms}`;
30
+ }
31
+
32
+ /** Gives the 'start' and 'end' of a day.
33
+ *
34
+ * Start of day is the first ms of the day
35
+ *
36
+ * End of day is the last ms of the day
37
+ */
38
+ export function getDayStartEnd(t: number | Date, type: 'unix' | 'local' = 'local') {
39
+ if (isType(t, 'number')) t = new Date(t);
40
+
41
+ const y = t.getFullYear();
42
+ const m = t.getMonth();
43
+ const d = t.getDate();
44
+
45
+ let start = new Date(y, m, d);
46
+ let end = new Date(y, m, d, 23, 59, 59, 999);
47
+
48
+ if (type === 'unix') {
49
+ const tzOffset = time.min(start.getTimezoneOffset());
50
+
51
+ start = new Date(start.getTime() + tzOffset);
52
+ end = new Date(end.getTime() + tzOffset);
53
+ }
54
+
55
+ return { start, end };
56
+ }
57
+
58
+ export function weekStartEnd(t: number | Date, weekStart: 'sun' | 'mon' = 'sun', type: 'unix' | 'local' = 'local') {
59
+ if (isType(t, 'number')) t = new Date(t);
60
+
61
+ const wd = t.getDay();
62
+
63
+ const startOffset = wd * -1 + (weekStart === 'mon' ? 1 : 0);
64
+ const endOffset = 6 + startOffset;
65
+
66
+ const s = new Date(t.getTime() + time.dys(startOffset));
67
+ const e = new Date(t.getTime() + time.dys(endOffset));
68
+
69
+ let start = new Date(s.getFullYear(), s.getMonth(), s.getDate());
70
+ let end = new Date(e.getFullYear(), e.getMonth(), e.getDate(), 23, 59, 59, 999);
71
+
72
+ if (type === 'unix') {
73
+ const tzOffset = time.min(start.getTimezoneOffset());
74
+
75
+ start = new Date(start.getTime() + tzOffset);
76
+ end = new Date(end.getTime() + tzOffset);
77
+ }
78
+
79
+ return { start, end };
80
+ }
81
+
82
+ export function monthStartEnd(t: number | Date, type: 'unix' | 'local' = 'local') {
83
+ if (isType(t, 'number')) t = new Date(t);
84
+
85
+ const y = t.getFullYear();
86
+ const m = t.getMonth();
87
+
88
+ let start = new Date(y, m, 1);
89
+ let end = new Date(y, m, 0, 23, 59, 59, 999);
90
+
91
+ if (type === 'unix') {
92
+ const tzOffset = time.min(start.getTimezoneOffset());
93
+
94
+ start = new Date(start.getTime() + tzOffset);
95
+ end = new Date(end.getTime() + tzOffset);
96
+ }
97
+
98
+ return { start, end };
99
+ }
100
+
101
+ export function yearStartEnd(t: number | Date, type: 'unix' | 'local' = 'local') {
102
+ if (isType(t, 'number')) t = new Date(t);
103
+
104
+ const y = t.getFullYear();
105
+
106
+ let start = new Date(y, 0, 1);
107
+ let end = new Date(y, 12, 0, 23, 59, 59, 999);
108
+
109
+ if (type === 'unix') {
110
+ const tzOffset = time.min(start.getTimezoneOffset());
111
+
112
+ start = new Date(start.getTime() + tzOffset);
113
+ end = new Date(end.getTime() + tzOffset);
114
+ }
115
+
116
+ return { start, end };
117
+ }
118
+
119
+ export const time = {
120
+ /** Seconds(n) -> to ms */
121
+ sec: (n: num) => 1_000 * n,
122
+ /** Minutes(n) -> to ms */
123
+ min: (n: num) => 60_000 * n,
124
+ /** Hours(n) -> to ms */
125
+ hrs: (n: num) => 3_600_000 * n,
126
+ /** Days(n) -> to ms */
127
+ dys: (n: num) => 86_400_000 * n,
128
+ /** Weeks(n) -> to ms */
129
+ wks: (n: num) => 604_800_000 * n,
130
+
131
+ /** Count time elapsed since: `from` until `to`, `to` def to `Date.now()` */
132
+ since: (from: num, to: num = Date.now()) => to - from,
133
+ /** Count down to: `target` time from `from`, `from` def to `Date.now()` */
134
+ until: (target: num, from: num = Date.now()) => target - from,
135
+
136
+ future: {
137
+ /** fnc(n) -> add ms to now */
138
+ ms: (n: num) => Date.now() + n,
139
+ /** fnc(n) -> add sec to now */
140
+ sec: (n: num) => Date.now() + n * msTime.s,
141
+ /** fnc(n) -> add min to now */
142
+ min: (n: num) => Date.now() + n * msTime.m,
143
+ },
144
+
145
+ msTo: {
146
+ /** fnc(n) -> from ms to num of seconds */
147
+ sec: (ms: num) => ms / msTime.s,
148
+ /** fnc(n) -> from ms to num of minutes */
149
+ min: (ms: num) => ms / msTime.m,
150
+ /** fnc(n) -> from ms to num of hours */
151
+ hrs: (ms: num) => ms / msTime.h,
152
+ /** fnc(n) -> from ms to num of days */
153
+ dys: (ms: num) => ms / msTime.d,
154
+ /** fnc(n) -> from ms to num of weeks */
155
+ wks: (ms: num) => ms / msTime.w,
156
+ },
157
+
158
+ get now() { return Date.now(); }
159
+ } as const;
160
+
161
+ export const humanizedTime = (date: AnyDate) => {
162
+ const dt = parseDate(date);
163
+ if (!dt) return null;
164
+ const dif = time.since(dt.getTime());
165
+
166
+ /** p for plural */
167
+ const p = (n: num) => n > 1 ? 's' : '';
168
+
169
+ if (dif < 0) {
170
+ return dt.toLocaleString();
171
+ } else if (dif < time.min(1)) {
172
+ const s = Math.ceil(time.msTo.sec(dif)) || 1;
173
+ return `${s} second${p(s)} ago`
174
+ } else if (dif < time.hrs(1)) {
175
+ const m = Math.floor(time.msTo.min(dif));
176
+ return `${m} minute${p(m)} ago`
177
+ } else if (dif < time.hrs(24) && dt.getDate() === new Date().getDate()) {
178
+ const h = Math.floor(time.msTo.hrs(dif));
179
+ const m = Math.floor(time.msTo.min(dif - time.hrs(h)))
180
+ return `${h} hour${p(h)} ${m > 1 ? `${m} minute${p(m)} ` : ''}ago`
181
+ } else {
182
+ return dt.toLocaleString();
183
+ }
184
+ }
185
+
186
+ // Intl.supportedValuesOf('timeZone');
187
+ /** A Date substitute, to make working with time easier and more versatile */
188
+ export function getTime(
189
+ date: TimeObj | PartialTimeObj | TimeArr,
190
+ ianaTimeZone?: str
191
+ ) {
192
+ const dt = parseDate(date);
193
+ if (!dt) throw new Error('Invalid Date');
194
+
195
+ ianaTimeZone = ianaTimeZone || Intl.DateTimeFormat().resolvedOptions().timeZone;
196
+ const tzOffsetMin = timeZoneOffsetMin(ianaTimeZone, dt);
197
+
198
+ const localISO = toLocalISOString(dt, tzOffsetMin);
199
+ const finalDateObj = new Date(localISO);
200
+
201
+ return {
202
+ tzOffsetMin, // this flips from the JS output, to align with the ISO output (- when js would be +)
203
+ localISO,
204
+ isoStr: finalDateObj.toISOString(),
205
+ Date: finalDateObj,
206
+ epochMs: finalDateObj.getTime(),
207
+ ianaTZ: ianaTimeZone,
208
+ timeObj: timeObj(dt),
209
+ }
210
+ }
211
+
212
+ export function timeZoneOffsetMin(
213
+ ianaTimeZone: string,
214
+ date = new Date(),
215
+ ) {
216
+ const local = new Date(date);
217
+ local.setMilliseconds(0);
218
+ local.setSeconds(0);
219
+ const tzTime = local.toLocaleString('US-en', { timeZone: ianaTimeZone });
220
+ const tzDt = new Date(tzTime);
221
+
222
+ const offsetMs = -local.getTimezoneOffset() * 60_000;
223
+ const utcTime = tzDt.getTime() + offsetMs;
224
+
225
+ return (utcTime - local.getTime()) / 60_000
226
+ }
227
+
228
+ export const timeObj = (dt: Date): TimeObj => ({
229
+ y: dt.getFullYear(),
230
+ m: dt.getMonth() + 1,
231
+ d: dt.getDate(),
232
+ h: dt.getHours(),
233
+ min: dt.getMinutes(),
234
+ sec: dt.getSeconds(),
235
+ ms: dt.getMilliseconds(),
236
+ wDay: weekTuple[dt.getDay()]!
237
+ });
238
+
239
+ export function parseDate(d: AnyDate) {
240
+ const dt =
241
+ Array.isArray(d) ?
242
+ new Date(d[0], (d[1] || 1) - 1, d[2] || 1, d[3] || 0, d[4] || 0, d[5] || 0, d[6] || 0)
243
+ :
244
+ isType(d, 'object') && !(d instanceof Date) ?
245
+ new Date(d.y, (d?.m || 1) - 1, d.d || 1, d.h || 0, d.min || 0, d.sec || 0, d.ms || 0)
246
+ :
247
+ new Date(d);
248
+
249
+ if (isNaN(dt as any)) {
250
+ console.error(new Error(`Invalid Date: ${isType(d, 'string') ? `"${d}"` : JSON.stringify(d)}`));
251
+ return null
252
+ }
253
+
254
+ return dt;
255
+ }
256
+
257
+ export function toLocalISOString(
258
+ date: Date,
259
+ tzOffsetMin = -date.getTimezoneOffset()
260
+ ) {
261
+ const sign = tzOffsetMin >= 0 ? '+' : '-';
262
+ const diffHours = String(Math.floor(Math.abs(tzOffsetMin) / 60)).padStart(2, '0');
263
+ const diffMinutes = String(Math.abs(tzOffsetMin) % 60).padStart(2, '0');
264
+
265
+ return date.toLocaleString('lt').replace(' ', 'T') // or use: "sv-SE" (same effect)
266
+ + '.' + (date.getMilliseconds() + '').padStart(3, '0')
267
+ + sign + diffHours + ':' + diffMinutes;
268
+ }
@@ -1 +0,0 @@
1
- export declare const deleteFile: (path: string) => void;