@naturalcycles/js-lib 14.186.0 → 14.188.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.
@@ -59,6 +59,16 @@ export declare class LocalDate {
59
59
  * Third argument allows to override "today".
60
60
  */
61
61
  isOlderThan(n: number, unit: LocalDateUnitStrict, today?: LocalDateInput): boolean;
62
+ /**
63
+ * Checks if this localDate is younger than "today" by X units.
64
+ *
65
+ * Example:
66
+ *
67
+ * localDate(expirationDate).isYoungerThan(5, 'day')
68
+ *
69
+ * Third argument allows to override "today".
70
+ */
71
+ isYoungerThan(n: number, unit: LocalDateUnitStrict, today?: LocalDateInput): boolean;
62
72
  /**
63
73
  * Returns 1 if this > d
64
74
  * returns 0 if they are equal
@@ -77,6 +87,10 @@ export declare class LocalDate {
77
87
  diff(d: LocalDateInput, unit: LocalDateUnit): number;
78
88
  add(num: number, unit: LocalDateUnit, mutate?: boolean): LocalDate;
79
89
  subtract(num: number, unit: LocalDateUnit, mutate?: boolean): LocalDate;
90
+ /**
91
+ * Alias to subtract
92
+ */
93
+ minus(num: number, unit: LocalDateUnit, mutate?: boolean): LocalDate;
80
94
  startOf(unit: LocalDateUnitStrict): LocalDate;
81
95
  endOf(unit: LocalDateUnitStrict): LocalDate;
82
96
  static getYearLength(year: number): number;
@@ -191,6 +191,18 @@ class LocalDate {
191
191
  isOlderThan(n, unit, today) {
192
192
  return this.isBefore(LocalDate.of(today || new Date()).add(-n, unit));
193
193
  }
194
+ /**
195
+ * Checks if this localDate is younger than "today" by X units.
196
+ *
197
+ * Example:
198
+ *
199
+ * localDate(expirationDate).isYoungerThan(5, 'day')
200
+ *
201
+ * Third argument allows to override "today".
202
+ */
203
+ isYoungerThan(n, unit, today) {
204
+ return !this.isOlderThan(n, unit, today);
205
+ }
194
206
  /**
195
207
  * Returns 1 if this > d
196
208
  * returns 0 if they are equal
@@ -340,6 +352,12 @@ class LocalDate {
340
352
  subtract(num, unit, mutate = false) {
341
353
  return this.add(-num, unit, mutate);
342
354
  }
355
+ /**
356
+ * Alias to subtract
357
+ */
358
+ minus(num, unit, mutate = false) {
359
+ return this.add(-num, unit, mutate);
360
+ }
343
361
  startOf(unit) {
344
362
  if (unit === 'day')
345
363
  return this;
@@ -72,6 +72,10 @@ export declare class LocalTime {
72
72
  setComponents(c: Partial<LocalTimeComponents>, mutate?: boolean): LocalTime;
73
73
  add(num: number, unit: LocalTimeUnit, mutate?: boolean): LocalTime;
74
74
  subtract(num: number, unit: LocalTimeUnit, mutate?: boolean): LocalTime;
75
+ /**
76
+ * Alias to subtract.
77
+ */
78
+ minus(num: number, unit: LocalTimeUnit, mutate?: boolean): LocalTime;
75
79
  absDiff(other: LocalTimeInput, unit: LocalTimeUnit): number;
76
80
  diff(other: LocalTimeInput, unit: LocalTimeUnit): number;
77
81
  startOf(unit: LocalTimeUnit, mutate?: boolean): LocalTime;
@@ -97,6 +101,16 @@ export declare class LocalTime {
97
101
  * Third argument allows to override "now".
98
102
  */
99
103
  isOlderThan(n: number, unit: LocalTimeUnit, now?: LocalTimeInput): boolean;
104
+ /**
105
+ * Checks if this localTime is younger than "now" by X units.
106
+ *
107
+ * Example:
108
+ *
109
+ * localTime(expirationDate).isYoungerThan(5, 'day')
110
+ *
111
+ * Third argument allows to override "now".
112
+ */
113
+ isYoungerThan(n: number, unit: LocalTimeUnit, now?: LocalTimeInput): boolean;
100
114
  /**
101
115
  * Returns 1 if this > d
102
116
  * returns 0 if they are equal
@@ -214,6 +214,12 @@ class LocalTime {
214
214
  subtract(num, unit, mutate = false) {
215
215
  return this.add(num * -1, unit, mutate);
216
216
  }
217
+ /**
218
+ * Alias to subtract.
219
+ */
220
+ minus(num, unit, mutate = false) {
221
+ return this.add(num * -1, unit, mutate);
222
+ }
217
223
  absDiff(other, unit) {
218
224
  return Math.abs(this.diff(other, unit));
219
225
  }
@@ -369,6 +375,18 @@ class LocalTime {
369
375
  isOlderThan(n, unit, now) {
370
376
  return this.isBefore(LocalTime.of(now ?? new Date()).add(-n, unit));
371
377
  }
378
+ /**
379
+ * Checks if this localTime is younger than "now" by X units.
380
+ *
381
+ * Example:
382
+ *
383
+ * localTime(expirationDate).isYoungerThan(5, 'day')
384
+ *
385
+ * Third argument allows to override "now".
386
+ */
387
+ isYoungerThan(n, unit, now) {
388
+ return !this.isOlderThan(n, unit, now);
389
+ }
372
390
  /**
373
391
  * Returns 1 if this > d
374
392
  * returns 0 if they are equal
@@ -1,20 +1,20 @@
1
1
  import type { NumberEnum, StringEnum } from './types';
2
2
  /**
3
- * Returns all number keys of a number-enum.
3
+ * Returns all String keys of a number-enum.
4
4
  */
5
5
  export declare function _numberEnumKeys(en: NumberEnum): string[];
6
6
  /**
7
- * Returns all number values of a number-enum.
7
+ * Returns all Number values of a number-enum.
8
8
  */
9
9
  export declare function _numberEnumValues(en: NumberEnum): number[];
10
10
  /**
11
- * Returns all string keys of a string-enum.
11
+ * Returns all String keys of a string-enum.
12
12
  */
13
13
  export declare function _stringEnumKeys(en: StringEnum): string[];
14
14
  /**
15
- * Returns all string values of a string-enum.
15
+ * Returns all String values of a string-enum.
16
16
  */
17
- export declare function _stringEnumValues(en: StringEnum): string[];
17
+ export declare function _stringEnumValues<T extends StringEnum>(en: T): T[keyof T][];
18
18
  /**
19
19
  * Returns all number-enum "entries", where entry is a tuple of [key, value],
20
20
  * where key is a String key, value is a Number value, typed as Enum itself.
@@ -22,28 +22,55 @@ export declare function _stringEnumValues(en: StringEnum): string[];
22
22
  * Doesn't work on String-enums!
23
23
  */
24
24
  export declare function _numberEnumEntries<T extends NumberEnum>(en: T): [k: string, v: T[keyof T]][];
25
+ /**
26
+ * Like _numberEnumEntries, but reversed.
27
+ * So, keys are Numbers, values are Strings.
28
+ */
29
+ export declare function _numberEnumEntriesReversed<T extends NumberEnum>(en: T): [k: number, v: keyof T][];
30
+ /**
31
+ * Like _numberEnumEntries, but as a Map.
32
+ * Keys are Strings, values are Numbers.
33
+ */
34
+ export declare function _numberEnumAsMap<T extends NumberEnum>(en: T): Map<string, T[keyof T]>;
35
+ /**
36
+ * Like _numberEnumEntriesReversed, but as a Map.
37
+ * Keys are Numbers (actual Numbers, because it's a Map, not an Object), values are Strings.
38
+ */
39
+ export declare function _numberEnumAsMapReversed<T extends NumberEnum>(en: T): Map<number, keyof T>;
25
40
  /**
26
41
  * Returns all string-enum "entries", where entry is a tuple of [key, value],
27
42
  * where key is a String key, value is a String value, typed as Enum itself.
28
43
  *
29
44
  * Doesn't work on Number-enums!
30
45
  */
31
- export declare function _stringEnumEntries<T extends StringEnum>(en: T): [k: string, v: T[keyof T]][];
46
+ export declare function _stringEnumEntries<T extends StringEnum>(en: T): [k: keyof T, v: T[keyof T]][];
47
+ /**
48
+ * Like _stringEnumEntries, but keys and values are reversed.
49
+ */
50
+ export declare function _stringEnumEntriesReversed<T extends StringEnum>(en: T): [k: T[keyof T], v: keyof T][];
51
+ /**
52
+ * Return String enum as Map (with the same keys and values).
53
+ */
54
+ export declare function _stringEnumAsMap<T extends StringEnum>(en: T): Map<keyof T, T[keyof T]>;
55
+ /**
56
+ * Return String enum as Map, with keys and values reversed.
57
+ */
58
+ export declare function _stringEnumAsMapReversed<T extends StringEnum>(en: T): Map<T[keyof T], keyof T>;
32
59
  /**
33
60
  * Allows to return a Number enum value (typed as Enum itself) based on it's String key.
34
61
  * e.g:
35
- * const v = SomeEnum['stringValue']
62
+ * const v = SomeEnum['stringKey']
36
63
  * // v is of type SomeEnum, which is of type Number
37
64
  *
38
65
  * Throws if value is not found!
39
66
  */
40
- export declare function _numberEnumInverse<T extends NumberEnum>(en: T, v: string): T[keyof T];
67
+ export declare function _numberEnumValue<T extends NumberEnum>(en: T, k: keyof T): T[keyof T];
41
68
  /**
42
- * _numberEnumInverse, but allows to get/return undefined output.
69
+ * _numberEnumKey, but allows to get/return undefined output.
43
70
  */
44
- export declare function _numberEnumInverseNullable<T extends NumberEnum>(en: T, v: string | undefined): T[keyof T] | undefined;
71
+ export declare function _numberEnumValueOrUndefined<T extends NumberEnum>(en: T, k: keyof T | undefined): T[keyof T] | undefined;
45
72
  /**
46
- * Takes number or string enum input, returns normalized Enum output.
73
+ * Takes number or string enum input, returns normalized Enum output (Number).
47
74
  * Only works for number enums.
48
75
  *
49
76
  * Throws if value is not found!
@@ -52,14 +79,14 @@ export declare function _numberEnumNormalize<T extends NumberEnum>(en: T, v: str
52
79
  /**
53
80
  * Same as _numberEnumNormalize, but allows to return undefined values.
54
81
  */
55
- export declare function _numberEnumNormalizeNullable<T extends NumberEnum>(en: T, v: string | number | undefined): T[keyof T] | undefined;
82
+ export declare function _numberEnumNormalizeOrUndefined<T extends NumberEnum>(en: T, v: string | number | undefined): T[keyof T] | undefined;
56
83
  /**
57
84
  * Returns a String key for given NumberEnum value, or undefined if not found.
58
85
  */
59
- export declare function _numberEnumKeyNullable<T extends NumberEnum>(en: T, v: T[keyof T] | undefined | null): keyof T | undefined;
86
+ export declare function _numberEnumKeyOrUndefined<T extends NumberEnum>(en: T, v: T[keyof T] | undefined | null): keyof T | undefined;
60
87
  /**
61
88
  * Returns a String key for given NumberEnum value, throws if not found.
62
89
  */
63
90
  export declare function _numberEnumKey<T extends NumberEnum>(en: T, v: T[keyof T] | undefined | null): keyof T;
64
- export declare function _stringEnumKeyNullable<T extends StringEnum>(en: T, v: string | undefined | null): keyof T | undefined;
91
+ export declare function _stringEnumKeyOrUndefined<T extends StringEnum>(en: T, v: string | undefined | null): keyof T | undefined;
65
92
  export declare function _stringEnumKey<T extends StringEnum>(en: T, v: string | undefined | null): keyof T;
package/dist/enum.util.js CHANGED
@@ -1,29 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports._stringEnumKey = exports._stringEnumKeyNullable = exports._numberEnumKey = exports._numberEnumKeyNullable = exports._numberEnumNormalizeNullable = exports._numberEnumNormalize = exports._numberEnumInverseNullable = exports._numberEnumInverse = exports._stringEnumEntries = exports._numberEnumEntries = exports._stringEnumValues = exports._stringEnumKeys = exports._numberEnumValues = exports._numberEnumKeys = void 0;
3
+ exports._stringEnumKey = exports._stringEnumKeyOrUndefined = exports._numberEnumKey = exports._numberEnumKeyOrUndefined = exports._numberEnumNormalizeOrUndefined = exports._numberEnumNormalize = exports._numberEnumValueOrUndefined = exports._numberEnumValue = exports._stringEnumAsMapReversed = exports._stringEnumAsMap = exports._stringEnumEntriesReversed = exports._stringEnumEntries = exports._numberEnumAsMapReversed = exports._numberEnumAsMap = exports._numberEnumEntriesReversed = exports._numberEnumEntries = exports._stringEnumValues = exports._stringEnumKeys = exports._numberEnumValues = exports._numberEnumKeys = void 0;
4
4
  /**
5
- * Returns all number keys of a number-enum.
5
+ * Returns all String keys of a number-enum.
6
6
  */
7
7
  function _numberEnumKeys(en) {
8
8
  return Object.values(en).filter(k => typeof k === 'string');
9
9
  }
10
10
  exports._numberEnumKeys = _numberEnumKeys;
11
11
  /**
12
- * Returns all number values of a number-enum.
12
+ * Returns all Number values of a number-enum.
13
13
  */
14
14
  function _numberEnumValues(en) {
15
15
  return Object.values(en).filter(k => typeof k === 'number');
16
16
  }
17
17
  exports._numberEnumValues = _numberEnumValues;
18
18
  /**
19
- * Returns all string keys of a string-enum.
19
+ * Returns all String keys of a string-enum.
20
20
  */
21
21
  function _stringEnumKeys(en) {
22
22
  return Object.keys(en);
23
23
  }
24
24
  exports._stringEnumKeys = _stringEnumKeys;
25
25
  /**
26
- * Returns all string values of a string-enum.
26
+ * Returns all String values of a string-enum.
27
27
  */
28
28
  function _stringEnumValues(en) {
29
29
  // filtering here is unnecessary, but works as a safety in case Number-enum is passed
@@ -42,6 +42,36 @@ function _numberEnumEntries(en) {
42
42
  .map(k => [k, en[k]]);
43
43
  }
44
44
  exports._numberEnumEntries = _numberEnumEntries;
45
+ /**
46
+ * Like _numberEnumEntries, but reversed.
47
+ * So, keys are Numbers, values are Strings.
48
+ */
49
+ function _numberEnumEntriesReversed(en) {
50
+ return Object.values(en)
51
+ .filter(k => typeof k === 'string')
52
+ .map(k => [en[k], k]);
53
+ }
54
+ exports._numberEnumEntriesReversed = _numberEnumEntriesReversed;
55
+ /**
56
+ * Like _numberEnumEntries, but as a Map.
57
+ * Keys are Strings, values are Numbers.
58
+ */
59
+ function _numberEnumAsMap(en) {
60
+ return new Map(Object.values(en)
61
+ .filter(k => typeof k === 'string')
62
+ .map(k => [k, en[k]]));
63
+ }
64
+ exports._numberEnumAsMap = _numberEnumAsMap;
65
+ /**
66
+ * Like _numberEnumEntriesReversed, but as a Map.
67
+ * Keys are Numbers (actual Numbers, because it's a Map, not an Object), values are Strings.
68
+ */
69
+ function _numberEnumAsMapReversed(en) {
70
+ return new Map(Object.values(en)
71
+ .filter(k => typeof k === 'string')
72
+ .map(k => [en[k], k]));
73
+ }
74
+ exports._numberEnumAsMapReversed = _numberEnumAsMapReversed;
45
75
  /**
46
76
  * Returns all string-enum "entries", where entry is a tuple of [key, value],
47
77
  * where key is a String key, value is a String value, typed as Enum itself.
@@ -52,36 +82,57 @@ function _stringEnumEntries(en) {
52
82
  return Object.entries(en);
53
83
  }
54
84
  exports._stringEnumEntries = _stringEnumEntries;
85
+ /**
86
+ * Like _stringEnumEntries, but keys and values are reversed.
87
+ */
88
+ function _stringEnumEntriesReversed(en) {
89
+ return Object.entries(en).map(([k, v]) => [v, k]);
90
+ }
91
+ exports._stringEnumEntriesReversed = _stringEnumEntriesReversed;
92
+ /**
93
+ * Return String enum as Map (with the same keys and values).
94
+ */
95
+ function _stringEnumAsMap(en) {
96
+ return new Map(Object.entries(en));
97
+ }
98
+ exports._stringEnumAsMap = _stringEnumAsMap;
99
+ /**
100
+ * Return String enum as Map, with keys and values reversed.
101
+ */
102
+ function _stringEnumAsMapReversed(en) {
103
+ return new Map(Object.entries(en).map(([k, v]) => [v, k]));
104
+ }
105
+ exports._stringEnumAsMapReversed = _stringEnumAsMapReversed;
55
106
  /**
56
107
  * Allows to return a Number enum value (typed as Enum itself) based on it's String key.
57
108
  * e.g:
58
- * const v = SomeEnum['stringValue']
109
+ * const v = SomeEnum['stringKey']
59
110
  * // v is of type SomeEnum, which is of type Number
60
111
  *
61
112
  * Throws if value is not found!
62
113
  */
63
- function _numberEnumInverse(en, v) {
64
- const r = en[v];
114
+ function _numberEnumValue(en, k) {
115
+ const r = en[k];
65
116
  if (!r)
66
- throw new Error(`_numberEnumInverse value not found for: ${v}`);
117
+ throw new Error(`_numberEnumValue not found for: ${k}`);
67
118
  return r;
68
119
  }
69
- exports._numberEnumInverse = _numberEnumInverse;
120
+ exports._numberEnumValue = _numberEnumValue;
70
121
  /**
71
- * _numberEnumInverse, but allows to get/return undefined output.
122
+ * _numberEnumKey, but allows to get/return undefined output.
72
123
  */
73
- function _numberEnumInverseNullable(en, v) {
74
- return en[v];
124
+ function _numberEnumValueOrUndefined(en, k) {
125
+ return en[k];
75
126
  }
76
- exports._numberEnumInverseNullable = _numberEnumInverseNullable;
127
+ exports._numberEnumValueOrUndefined = _numberEnumValueOrUndefined;
77
128
  /**
78
- * Takes number or string enum input, returns normalized Enum output.
129
+ * Takes number or string enum input, returns normalized Enum output (Number).
79
130
  * Only works for number enums.
80
131
  *
81
132
  * Throws if value is not found!
82
133
  */
83
134
  function _numberEnumNormalize(en, v) {
84
- const r = _numberEnumNormalizeNullable(en, v);
135
+ const r = _numberEnumNormalizeOrUndefined(en, v);
85
136
  if (!r || !en[r])
86
137
  throw new Error(`_numberEnumNormalize value not found for: ${v}`);
87
138
  return r;
@@ -90,19 +141,19 @@ exports._numberEnumNormalize = _numberEnumNormalize;
90
141
  /**
91
142
  * Same as _numberEnumNormalize, but allows to return undefined values.
92
143
  */
93
- function _numberEnumNormalizeNullable(en, v) {
144
+ function _numberEnumNormalizeOrUndefined(en, v) {
94
145
  return typeof v === 'string' ? en[v] : v;
95
146
  }
96
- exports._numberEnumNormalizeNullable = _numberEnumNormalizeNullable;
147
+ exports._numberEnumNormalizeOrUndefined = _numberEnumNormalizeOrUndefined;
97
148
  /**
98
149
  * Returns a String key for given NumberEnum value, or undefined if not found.
99
150
  */
100
- function _numberEnumKeyNullable(en, v) {
151
+ function _numberEnumKeyOrUndefined(en, v) {
101
152
  const key = en[v];
102
153
  // This prevents passing a Key (not a Value) of enum here, which returns unexpected result (number, not string)
103
154
  return typeof key === 'string' ? key : undefined;
104
155
  }
105
- exports._numberEnumKeyNullable = _numberEnumKeyNullable;
156
+ exports._numberEnumKeyOrUndefined = _numberEnumKeyOrUndefined;
106
157
  /**
107
158
  * Returns a String key for given NumberEnum value, throws if not found.
108
159
  */
@@ -114,14 +165,14 @@ function _numberEnumKey(en, v) {
114
165
  return key;
115
166
  }
116
167
  exports._numberEnumKey = _numberEnumKey;
117
- function _stringEnumKeyNullable(en,
168
+ function _stringEnumKeyOrUndefined(en,
118
169
  // v: T[keyof T] | undefined | null, // cannot make it type-safe :(
119
170
  v) {
120
171
  return Object.entries(en).find(([_, v2]) => v2 === v)?.[0];
121
172
  }
122
- exports._stringEnumKeyNullable = _stringEnumKeyNullable;
173
+ exports._stringEnumKeyOrUndefined = _stringEnumKeyOrUndefined;
123
174
  function _stringEnumKey(en, v) {
124
- const r = _stringEnumKeyNullable(en, v);
175
+ const r = _stringEnumKeyOrUndefined(en, v);
125
176
  if (!r)
126
177
  throw new Error(`_stringEnumKey not found for: ${v}`);
127
178
  return r;
@@ -188,6 +188,18 @@ export class LocalDate {
188
188
  isOlderThan(n, unit, today) {
189
189
  return this.isBefore(LocalDate.of(today || new Date()).add(-n, unit));
190
190
  }
191
+ /**
192
+ * Checks if this localDate is younger than "today" by X units.
193
+ *
194
+ * Example:
195
+ *
196
+ * localDate(expirationDate).isYoungerThan(5, 'day')
197
+ *
198
+ * Third argument allows to override "today".
199
+ */
200
+ isYoungerThan(n, unit, today) {
201
+ return !this.isOlderThan(n, unit, today);
202
+ }
191
203
  /**
192
204
  * Returns 1 if this > d
193
205
  * returns 0 if they are equal
@@ -337,6 +349,12 @@ export class LocalDate {
337
349
  subtract(num, unit, mutate = false) {
338
350
  return this.add(-num, unit, mutate);
339
351
  }
352
+ /**
353
+ * Alias to subtract
354
+ */
355
+ minus(num, unit, mutate = false) {
356
+ return this.add(-num, unit, mutate);
357
+ }
340
358
  startOf(unit) {
341
359
  if (unit === 'day')
342
360
  return this;
@@ -212,6 +212,12 @@ export class LocalTime {
212
212
  subtract(num, unit, mutate = false) {
213
213
  return this.add(num * -1, unit, mutate);
214
214
  }
215
+ /**
216
+ * Alias to subtract.
217
+ */
218
+ minus(num, unit, mutate = false) {
219
+ return this.add(num * -1, unit, mutate);
220
+ }
215
221
  absDiff(other, unit) {
216
222
  return Math.abs(this.diff(other, unit));
217
223
  }
@@ -367,6 +373,18 @@ export class LocalTime {
367
373
  isOlderThan(n, unit, now) {
368
374
  return this.isBefore(LocalTime.of(now !== null && now !== void 0 ? now : new Date()).add(-n, unit));
369
375
  }
376
+ /**
377
+ * Checks if this localTime is younger than "now" by X units.
378
+ *
379
+ * Example:
380
+ *
381
+ * localTime(expirationDate).isYoungerThan(5, 'day')
382
+ *
383
+ * Third argument allows to override "now".
384
+ */
385
+ isYoungerThan(n, unit, now) {
386
+ return !this.isOlderThan(n, unit, now);
387
+ }
370
388
  /**
371
389
  * Returns 1 if this > d
372
390
  * returns 0 if they are equal
@@ -1,23 +1,23 @@
1
1
  /**
2
- * Returns all number keys of a number-enum.
2
+ * Returns all String keys of a number-enum.
3
3
  */
4
4
  export function _numberEnumKeys(en) {
5
5
  return Object.values(en).filter(k => typeof k === 'string');
6
6
  }
7
7
  /**
8
- * Returns all number values of a number-enum.
8
+ * Returns all Number values of a number-enum.
9
9
  */
10
10
  export function _numberEnumValues(en) {
11
11
  return Object.values(en).filter(k => typeof k === 'number');
12
12
  }
13
13
  /**
14
- * Returns all string keys of a string-enum.
14
+ * Returns all String keys of a string-enum.
15
15
  */
16
16
  export function _stringEnumKeys(en) {
17
17
  return Object.keys(en);
18
18
  }
19
19
  /**
20
- * Returns all string values of a string-enum.
20
+ * Returns all String values of a string-enum.
21
21
  */
22
22
  export function _stringEnumValues(en) {
23
23
  // filtering here is unnecessary, but works as a safety in case Number-enum is passed
@@ -34,6 +34,33 @@ export function _numberEnumEntries(en) {
34
34
  .filter(k => typeof k === 'string')
35
35
  .map(k => [k, en[k]]);
36
36
  }
37
+ /**
38
+ * Like _numberEnumEntries, but reversed.
39
+ * So, keys are Numbers, values are Strings.
40
+ */
41
+ export function _numberEnumEntriesReversed(en) {
42
+ return Object.values(en)
43
+ .filter(k => typeof k === 'string')
44
+ .map(k => [en[k], k]);
45
+ }
46
+ /**
47
+ * Like _numberEnumEntries, but as a Map.
48
+ * Keys are Strings, values are Numbers.
49
+ */
50
+ export function _numberEnumAsMap(en) {
51
+ return new Map(Object.values(en)
52
+ .filter(k => typeof k === 'string')
53
+ .map(k => [k, en[k]]));
54
+ }
55
+ /**
56
+ * Like _numberEnumEntriesReversed, but as a Map.
57
+ * Keys are Numbers (actual Numbers, because it's a Map, not an Object), values are Strings.
58
+ */
59
+ export function _numberEnumAsMapReversed(en) {
60
+ return new Map(Object.values(en)
61
+ .filter(k => typeof k === 'string')
62
+ .map(k => [en[k], k]));
63
+ }
37
64
  /**
38
65
  * Returns all string-enum "entries", where entry is a tuple of [key, value],
39
66
  * where key is a String key, value is a String value, typed as Enum itself.
@@ -43,34 +70,52 @@ export function _numberEnumEntries(en) {
43
70
  export function _stringEnumEntries(en) {
44
71
  return Object.entries(en);
45
72
  }
73
+ /**
74
+ * Like _stringEnumEntries, but keys and values are reversed.
75
+ */
76
+ export function _stringEnumEntriesReversed(en) {
77
+ return Object.entries(en).map(([k, v]) => [v, k]);
78
+ }
79
+ /**
80
+ * Return String enum as Map (with the same keys and values).
81
+ */
82
+ export function _stringEnumAsMap(en) {
83
+ return new Map(Object.entries(en));
84
+ }
85
+ /**
86
+ * Return String enum as Map, with keys and values reversed.
87
+ */
88
+ export function _stringEnumAsMapReversed(en) {
89
+ return new Map(Object.entries(en).map(([k, v]) => [v, k]));
90
+ }
46
91
  /**
47
92
  * Allows to return a Number enum value (typed as Enum itself) based on it's String key.
48
93
  * e.g:
49
- * const v = SomeEnum['stringValue']
94
+ * const v = SomeEnum['stringKey']
50
95
  * // v is of type SomeEnum, which is of type Number
51
96
  *
52
97
  * Throws if value is not found!
53
98
  */
54
- export function _numberEnumInverse(en, v) {
55
- const r = en[v];
99
+ export function _numberEnumValue(en, k) {
100
+ const r = en[k];
56
101
  if (!r)
57
- throw new Error(`_numberEnumInverse value not found for: ${v}`);
102
+ throw new Error(`_numberEnumValue not found for: ${k}`);
58
103
  return r;
59
104
  }
60
105
  /**
61
- * _numberEnumInverse, but allows to get/return undefined output.
106
+ * _numberEnumKey, but allows to get/return undefined output.
62
107
  */
63
- export function _numberEnumInverseNullable(en, v) {
64
- return en[v];
108
+ export function _numberEnumValueOrUndefined(en, k) {
109
+ return en[k];
65
110
  }
66
111
  /**
67
- * Takes number or string enum input, returns normalized Enum output.
112
+ * Takes number or string enum input, returns normalized Enum output (Number).
68
113
  * Only works for number enums.
69
114
  *
70
115
  * Throws if value is not found!
71
116
  */
72
117
  export function _numberEnumNormalize(en, v) {
73
- const r = _numberEnumNormalizeNullable(en, v);
118
+ const r = _numberEnumNormalizeOrUndefined(en, v);
74
119
  if (!r || !en[r])
75
120
  throw new Error(`_numberEnumNormalize value not found for: ${v}`);
76
121
  return r;
@@ -78,13 +123,13 @@ export function _numberEnumNormalize(en, v) {
78
123
  /**
79
124
  * Same as _numberEnumNormalize, but allows to return undefined values.
80
125
  */
81
- export function _numberEnumNormalizeNullable(en, v) {
126
+ export function _numberEnumNormalizeOrUndefined(en, v) {
82
127
  return typeof v === 'string' ? en[v] : v;
83
128
  }
84
129
  /**
85
130
  * Returns a String key for given NumberEnum value, or undefined if not found.
86
131
  */
87
- export function _numberEnumKeyNullable(en, v) {
132
+ export function _numberEnumKeyOrUndefined(en, v) {
88
133
  const key = en[v];
89
134
  // This prevents passing a Key (not a Value) of enum here, which returns unexpected result (number, not string)
90
135
  return typeof key === 'string' ? key : undefined;
@@ -99,14 +144,14 @@ export function _numberEnumKey(en, v) {
99
144
  throw new Error(`_numberEnumKey not found for: ${v}`);
100
145
  return key;
101
146
  }
102
- export function _stringEnumKeyNullable(en,
147
+ export function _stringEnumKeyOrUndefined(en,
103
148
  // v: T[keyof T] | undefined | null, // cannot make it type-safe :(
104
149
  v) {
105
150
  var _a;
106
151
  return (_a = Object.entries(en).find(([_, v2]) => v2 === v)) === null || _a === void 0 ? void 0 : _a[0];
107
152
  }
108
153
  export function _stringEnumKey(en, v) {
109
- const r = _stringEnumKeyNullable(en, v);
154
+ const r = _stringEnumKeyOrUndefined(en, v);
110
155
  if (!r)
111
156
  throw new Error(`_stringEnumKey not found for: ${v}`);
112
157
  return r;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturalcycles/js-lib",
3
- "version": "14.186.0",
3
+ "version": "14.188.0",
4
4
  "scripts": {
5
5
  "prepare": "husky install",
6
6
  "build-prod": "build-prod-esm-cjs",
@@ -253,6 +253,19 @@ export class LocalDate {
253
253
  return this.isBefore(LocalDate.of(today || new Date()).add(-n, unit))
254
254
  }
255
255
 
256
+ /**
257
+ * Checks if this localDate is younger than "today" by X units.
258
+ *
259
+ * Example:
260
+ *
261
+ * localDate(expirationDate).isYoungerThan(5, 'day')
262
+ *
263
+ * Third argument allows to override "today".
264
+ */
265
+ isYoungerThan(n: number, unit: LocalDateUnitStrict, today?: LocalDateInput): boolean {
266
+ return !this.isOlderThan(n, unit, today)
267
+ }
268
+
256
269
  /**
257
270
  * Returns 1 if this > d
258
271
  * returns 0 if they are equal
@@ -419,6 +432,13 @@ export class LocalDate {
419
432
  return this.add(-num, unit, mutate)
420
433
  }
421
434
 
435
+ /**
436
+ * Alias to subtract
437
+ */
438
+ minus(num: number, unit: LocalDateUnit, mutate = false): LocalDate {
439
+ return this.add(-num, unit, mutate)
440
+ }
441
+
422
442
  startOf(unit: LocalDateUnitStrict): LocalDate {
423
443
  if (unit === 'day') return this
424
444
  if (unit === 'month') return LocalDate.create(this.$year, this.$month, 1)
@@ -284,6 +284,13 @@ export class LocalTime {
284
284
  return this.add(num * -1, unit, mutate)
285
285
  }
286
286
 
287
+ /**
288
+ * Alias to subtract.
289
+ */
290
+ minus(num: number, unit: LocalTimeUnit, mutate = false): LocalTime {
291
+ return this.add(num * -1, unit, mutate)
292
+ }
293
+
287
294
  absDiff(other: LocalTimeInput, unit: LocalTimeUnit): number {
288
295
  return Math.abs(this.diff(other, unit))
289
296
  }
@@ -453,6 +460,19 @@ export class LocalTime {
453
460
  return this.isBefore(LocalTime.of(now ?? new Date()).add(-n, unit))
454
461
  }
455
462
 
463
+ /**
464
+ * Checks if this localTime is younger than "now" by X units.
465
+ *
466
+ * Example:
467
+ *
468
+ * localTime(expirationDate).isYoungerThan(5, 'day')
469
+ *
470
+ * Third argument allows to override "now".
471
+ */
472
+ isYoungerThan(n: number, unit: LocalTimeUnit, now?: LocalTimeInput): boolean {
473
+ return !this.isOlderThan(n, unit, now)
474
+ }
475
+
456
476
  /**
457
477
  * Returns 1 if this > d
458
478
  * returns 0 if they are equal
package/src/enum.util.ts CHANGED
@@ -1,32 +1,32 @@
1
1
  import type { NumberEnum, StringEnum } from './types'
2
2
 
3
3
  /**
4
- * Returns all number keys of a number-enum.
4
+ * Returns all String keys of a number-enum.
5
5
  */
6
6
  export function _numberEnumKeys(en: NumberEnum): string[] {
7
7
  return Object.values(en).filter(k => typeof k === 'string') as string[]
8
8
  }
9
9
 
10
10
  /**
11
- * Returns all number values of a number-enum.
11
+ * Returns all Number values of a number-enum.
12
12
  */
13
13
  export function _numberEnumValues(en: NumberEnum): number[] {
14
14
  return Object.values(en).filter(k => typeof k === 'number') as number[]
15
15
  }
16
16
 
17
17
  /**
18
- * Returns all string keys of a string-enum.
18
+ * Returns all String keys of a string-enum.
19
19
  */
20
20
  export function _stringEnumKeys(en: StringEnum): string[] {
21
21
  return Object.keys(en)
22
22
  }
23
23
 
24
24
  /**
25
- * Returns all string values of a string-enum.
25
+ * Returns all String values of a string-enum.
26
26
  */
27
- export function _stringEnumValues(en: StringEnum): string[] {
27
+ export function _stringEnumValues<T extends StringEnum>(en: T): T[keyof T][] {
28
28
  // filtering here is unnecessary, but works as a safety in case Number-enum is passed
29
- return Object.values(en).filter(k => typeof k === 'string')
29
+ return Object.values(en).filter(k => typeof k === 'string') as any
30
30
  }
31
31
 
32
32
  /**
@@ -41,48 +41,105 @@ export function _numberEnumEntries<T extends NumberEnum>(en: T): [k: string, v:
41
41
  .map(k => [k, en[k]]) as any
42
42
  }
43
43
 
44
+ /**
45
+ * Like _numberEnumEntries, but reversed.
46
+ * So, keys are Numbers, values are Strings.
47
+ */
48
+ export function _numberEnumEntriesReversed<T extends NumberEnum>(en: T): [k: number, v: keyof T][] {
49
+ return Object.values(en)
50
+ .filter(k => typeof k === 'string')
51
+ .map(k => [en[k], k]) as any
52
+ }
53
+
54
+ /**
55
+ * Like _numberEnumEntries, but as a Map.
56
+ * Keys are Strings, values are Numbers.
57
+ */
58
+ export function _numberEnumAsMap<T extends NumberEnum>(en: T): Map<string, T[keyof T]> {
59
+ return new Map(
60
+ Object.values(en)
61
+ .filter(k => typeof k === 'string')
62
+ .map(k => [k, en[k]]) as any,
63
+ )
64
+ }
65
+
66
+ /**
67
+ * Like _numberEnumEntriesReversed, but as a Map.
68
+ * Keys are Numbers (actual Numbers, because it's a Map, not an Object), values are Strings.
69
+ */
70
+ export function _numberEnumAsMapReversed<T extends NumberEnum>(en: T): Map<number, keyof T> {
71
+ return new Map(
72
+ Object.values(en)
73
+ .filter(k => typeof k === 'string')
74
+ .map(k => [en[k], k]) as any,
75
+ )
76
+ }
77
+
44
78
  /**
45
79
  * Returns all string-enum "entries", where entry is a tuple of [key, value],
46
80
  * where key is a String key, value is a String value, typed as Enum itself.
47
81
  *
48
82
  * Doesn't work on Number-enums!
49
83
  */
50
- export function _stringEnumEntries<T extends StringEnum>(en: T): [k: string, v: T[keyof T]][] {
84
+ export function _stringEnumEntries<T extends StringEnum>(en: T): [k: keyof T, v: T[keyof T]][] {
51
85
  return Object.entries(en) as any
52
86
  }
53
87
 
88
+ /**
89
+ * Like _stringEnumEntries, but keys and values are reversed.
90
+ */
91
+ export function _stringEnumEntriesReversed<T extends StringEnum>(
92
+ en: T,
93
+ ): [k: T[keyof T], v: keyof T][] {
94
+ return Object.entries(en).map(([k, v]) => [v, k]) as any
95
+ }
96
+
97
+ /**
98
+ * Return String enum as Map (with the same keys and values).
99
+ */
100
+ export function _stringEnumAsMap<T extends StringEnum>(en: T): Map<keyof T, T[keyof T]> {
101
+ return new Map(Object.entries(en)) as any
102
+ }
103
+
104
+ /**
105
+ * Return String enum as Map, with keys and values reversed.
106
+ */
107
+ export function _stringEnumAsMapReversed<T extends StringEnum>(en: T): Map<T[keyof T], keyof T> {
108
+ return new Map(Object.entries(en).map(([k, v]) => [v, k])) as any
109
+ }
110
+
54
111
  /**
55
112
  * Allows to return a Number enum value (typed as Enum itself) based on it's String key.
56
113
  * e.g:
57
- * const v = SomeEnum['stringValue']
114
+ * const v = SomeEnum['stringKey']
58
115
  * // v is of type SomeEnum, which is of type Number
59
116
  *
60
117
  * Throws if value is not found!
61
118
  */
62
- export function _numberEnumInverse<T extends NumberEnum>(en: T, v: string): T[keyof T] {
63
- const r = en[v as keyof T] as any
64
- if (!r) throw new Error(`_numberEnumInverse value not found for: ${v}`)
119
+ export function _numberEnumValue<T extends NumberEnum>(en: T, k: keyof T): T[keyof T] {
120
+ const r = en[k]
121
+ if (!r) throw new Error(`_numberEnumValue not found for: ${k as string}`)
65
122
  return r
66
123
  }
67
124
 
68
125
  /**
69
- * _numberEnumInverse, but allows to get/return undefined output.
126
+ * _numberEnumKey, but allows to get/return undefined output.
70
127
  */
71
- export function _numberEnumInverseNullable<T extends NumberEnum>(
128
+ export function _numberEnumValueOrUndefined<T extends NumberEnum>(
72
129
  en: T,
73
- v: string | undefined,
130
+ k: keyof T | undefined,
74
131
  ): T[keyof T] | undefined {
75
- return en[v as keyof T]
132
+ return en[k!]
76
133
  }
77
134
 
78
135
  /**
79
- * Takes number or string enum input, returns normalized Enum output.
136
+ * Takes number or string enum input, returns normalized Enum output (Number).
80
137
  * Only works for number enums.
81
138
  *
82
139
  * Throws if value is not found!
83
140
  */
84
141
  export function _numberEnumNormalize<T extends NumberEnum>(en: T, v: string | number): T[keyof T] {
85
- const r = _numberEnumNormalizeNullable(en, v)
142
+ const r = _numberEnumNormalizeOrUndefined(en, v)
86
143
  if (!r || !en[r as keyof T]) throw new Error(`_numberEnumNormalize value not found for: ${v}`)
87
144
  return r
88
145
  }
@@ -90,7 +147,7 @@ export function _numberEnumNormalize<T extends NumberEnum>(en: T, v: string | nu
90
147
  /**
91
148
  * Same as _numberEnumNormalize, but allows to return undefined values.
92
149
  */
93
- export function _numberEnumNormalizeNullable<T extends NumberEnum>(
150
+ export function _numberEnumNormalizeOrUndefined<T extends NumberEnum>(
94
151
  en: T,
95
152
  v: string | number | undefined,
96
153
  ): T[keyof T] | undefined {
@@ -100,7 +157,7 @@ export function _numberEnumNormalizeNullable<T extends NumberEnum>(
100
157
  /**
101
158
  * Returns a String key for given NumberEnum value, or undefined if not found.
102
159
  */
103
- export function _numberEnumKeyNullable<T extends NumberEnum>(
160
+ export function _numberEnumKeyOrUndefined<T extends NumberEnum>(
104
161
  en: T,
105
162
  v: T[keyof T] | undefined | null,
106
163
  ): keyof T | undefined {
@@ -122,7 +179,7 @@ export function _numberEnumKey<T extends NumberEnum>(
122
179
  return key
123
180
  }
124
181
 
125
- export function _stringEnumKeyNullable<T extends StringEnum>(
182
+ export function _stringEnumKeyOrUndefined<T extends StringEnum>(
126
183
  en: T,
127
184
  // v: T[keyof T] | undefined | null, // cannot make it type-safe :(
128
185
  v: string | undefined | null,
@@ -131,7 +188,7 @@ export function _stringEnumKeyNullable<T extends StringEnum>(
131
188
  }
132
189
 
133
190
  export function _stringEnumKey<T extends StringEnum>(en: T, v: string | undefined | null): keyof T {
134
- const r = _stringEnumKeyNullable(en, v)
191
+ const r = _stringEnumKeyOrUndefined(en, v)
135
192
  if (!r) throw new Error(`_stringEnumKey not found for: ${v}`)
136
193
  return r
137
194
  }