@naturalcycles/js-lib 14.187.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.
@@ -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;
@@ -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.187.0",
3
+ "version": "14.188.0",
4
4
  "scripts": {
5
5
  "prepare": "husky install",
6
6
  "build-prod": "build-prod-esm-cjs",
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
  }