@augment-vir/common 28.1.0 → 28.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/cjs/augments/object/nested-keys.js +1 -0
- package/dist/cjs/augments/promise/wait.js +1 -1
- package/dist/cjs/augments/type-recursion.js +2 -0
- package/dist/cjs/index.js +1 -0
- package/dist/esm/augments/object/nested-keys.js +1 -0
- package/dist/esm/augments/promise/wait.js +1 -1
- package/dist/esm/augments/type-recursion.js +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/types/augments/object/nested-keys.d.ts +7 -5
- package/dist/types/augments/object/pick-deep.d.ts +7 -6
- package/dist/types/augments/type-recursion.d.ts +161 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +5 -5
|
@@ -4,6 +4,7 @@ exports.getValueFromNestedKeys = exports.setValueWithNestedKeys = void 0;
|
|
|
4
4
|
const run_time_assertions_1 = require("run-time-assertions");
|
|
5
5
|
const object_1 = require("./object");
|
|
6
6
|
const typed_has_property_1 = require("./typed-has-property");
|
|
7
|
+
/** This mutates the {@link originalObject} input. */
|
|
7
8
|
function setValueWithNestedKeys(originalObject, nestedKeys, value) {
|
|
8
9
|
/**
|
|
9
10
|
* Lots of as any casts in here because these types are, under the hood, pretty complex. Since
|
package/dist/cjs/index.js
CHANGED
|
@@ -55,4 +55,5 @@ __exportStar(require("./augments/time"), exports);
|
|
|
55
55
|
__exportStar(require("./augments/truncate-number"), exports);
|
|
56
56
|
__exportStar(require("./augments/tuple"), exports);
|
|
57
57
|
__exportStar(require("./augments/type"), exports);
|
|
58
|
+
__exportStar(require("./augments/type-recursion"), exports);
|
|
58
59
|
__exportStar(require("./augments/wrap-in-try"), exports);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isRunTimeType } from 'run-time-assertions';
|
|
2
2
|
import { isObject } from './object';
|
|
3
3
|
import { typedHasProperty } from './typed-has-property';
|
|
4
|
+
/** This mutates the {@link originalObject} input. */
|
|
4
5
|
export function setValueWithNestedKeys(originalObject, nestedKeys, value) {
|
|
5
6
|
/**
|
|
6
7
|
* Lots of as any casts in here because these types are, under the hood, pretty complex. Since
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/esm/index.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { ArrayElement } from '../type';
|
|
2
|
+
import { TsRecurse, TsRecursionStart, TsRecursionTracker, TsTooMuchRecursion } from '../type-recursion';
|
|
2
3
|
import { PropertyValueType } from './object';
|
|
3
4
|
import { UnionToIntersection } from './old-union-to-intersection';
|
|
4
|
-
export type NestedSequentialKeys<ObjectGeneric extends object> = NonNullable<ObjectGeneric> extends ReadonlyArray<any> ? Extract<NonNullable<ObjectGeneric>[number], object> extends never ? [number] : NestedSequentialKeys<Extract<NonNullable<ObjectGeneric>[number], object>> : PropertyValueType<{
|
|
5
|
+
export type NestedSequentialKeys<ObjectGeneric extends object, Depth extends TsRecursionTracker = TsRecursionStart> = Depth extends TsTooMuchRecursion ? ['Error: recursive object depth is too deep.'] : NonNullable<ObjectGeneric> extends ReadonlyArray<any> ? Extract<NonNullable<ObjectGeneric>[number], object> extends never ? [number] : NestedSequentialKeys<Extract<NonNullable<ObjectGeneric>[number], object>, TsRecurse<Depth>> : PropertyValueType<{
|
|
5
6
|
[Prop in keyof ObjectGeneric]: NonNullable<ObjectGeneric[Prop]> extends object ? Readonly<[
|
|
6
7
|
Prop,
|
|
7
|
-
...(NestedSequentialKeys<NonNullable<ObjectGeneric[Prop]>> | [])
|
|
8
|
+
...(NestedSequentialKeys<NonNullable<ObjectGeneric[Prop]>, TsRecurse<Depth>> | [])
|
|
8
9
|
]> : Readonly<[Prop]>;
|
|
9
10
|
}>;
|
|
10
|
-
export type NestedKeys<ObjectGeneric extends object> = ObjectGeneric extends ReadonlyArray<any> ? NestedKeys<ArrayElement<ObjectGeneric>> : UnionToIntersection<Extract<PropertyValueType<ObjectGeneric>, object>> extends object ? [
|
|
11
|
+
export type NestedKeys<ObjectGeneric extends object, Depth extends TsRecursionTracker = TsRecursionStart> = Depth extends TsTooMuchRecursion ? ['Error: recursive object depth is too deep.'] : ObjectGeneric extends ReadonlyArray<any> ? NestedKeys<ArrayElement<ObjectGeneric>, TsRecurse<Depth>> : UnionToIntersection<Extract<PropertyValueType<ObjectGeneric>, object>> extends object ? [
|
|
11
12
|
keyof ObjectGeneric,
|
|
12
|
-
...(NestedKeys<UnionToIntersection<Extract<PropertyValueType<ObjectGeneric>, object
|
|
13
|
+
...(NestedKeys<UnionToIntersection<Extract<PropertyValueType<ObjectGeneric>, object>>, TsRecurse<Depth>> | [])
|
|
13
14
|
] : [keyof ObjectGeneric];
|
|
14
15
|
export type NestedValue<ObjectGeneric extends object, NestedKeysGeneric extends NestedSequentialKeys<ObjectGeneric>> = ObjectGeneric extends ReadonlyArray<any> ? NestedValue<Extract<ObjectGeneric[number], object>, NestedKeysGeneric>[] : NestedKeysGeneric extends readonly [infer FirstEntry, ...infer FollowingEntries] ? FirstEntry extends keyof ObjectGeneric ? FollowingEntries extends never[] ? ObjectGeneric[FirstEntry] : ObjectGeneric[FirstEntry] extends object ? FollowingEntries extends NestedSequentialKeys<ObjectGeneric[FirstEntry]> ? NestedValue<ObjectGeneric[FirstEntry], FollowingEntries> : never : never : never : never;
|
|
15
|
-
|
|
16
|
+
/** This mutates the {@link originalObject} input. */
|
|
17
|
+
export declare function setValueWithNestedKeys<const ObjectGeneric extends object, const KeysGeneric extends NestedSequentialKeys<ObjectGeneric>>(originalObject: ObjectGeneric, nestedKeys: Readonly<KeysGeneric>, value: Readonly<NestedValue<ObjectGeneric, KeysGeneric>>): void;
|
|
16
18
|
export declare function getValueFromNestedKeys<const ObjectGeneric extends object, const KeysGeneric extends NestedSequentialKeys<ObjectGeneric>>(originalObject: ObjectGeneric, nestedKeys: KeysGeneric): NestedValue<ObjectGeneric, KeysGeneric>;
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { OptionalKeysOf, RequiredKeysOf } from 'type-fest';
|
|
2
2
|
import { AnyFunction } from '../function';
|
|
3
3
|
import { ArrayElement } from '../type';
|
|
4
|
+
import { TsRecurse, TsRecursionStart, TsRecursionTracker } from '../type-recursion';
|
|
4
5
|
import { AnyObject } from './any-object';
|
|
5
6
|
import { NestedKeys } from './nested-keys';
|
|
6
|
-
export type InnerPickDeep<OriginalObject extends AnyObject, DeepKeys extends any[]> = DeepKeys extends [infer CurrentLevelPick, ...infer RemainingKeys] ? Extract<CurrentLevelPick, keyof OriginalObject> extends never ? OriginalObject : {
|
|
7
|
-
[CurrentProp in Extract<CurrentLevelPick, RequiredKeysOf<OriginalObject>>]: InnerPickDeepValue<OriginalObject, CurrentProp, RemainingKeys>;
|
|
7
|
+
export type InnerPickDeep<OriginalObject extends AnyObject, DeepKeys extends any[], Depth extends TsRecursionTracker> = DeepKeys extends [infer CurrentLevelPick, ...infer RemainingKeys] ? Extract<CurrentLevelPick, keyof OriginalObject> extends never ? OriginalObject : {
|
|
8
|
+
[CurrentProp in Extract<CurrentLevelPick, RequiredKeysOf<OriginalObject>>]: InnerPickDeepValue<OriginalObject, CurrentProp, RemainingKeys, Depth>;
|
|
8
9
|
} & {
|
|
9
|
-
[CurrentProp in Extract<CurrentLevelPick, OptionalKeysOf<OriginalObject>>]?: InnerPickDeepValue<OriginalObject, CurrentProp, RemainingKeys>;
|
|
10
|
+
[CurrentProp in Extract<CurrentLevelPick, OptionalKeysOf<OriginalObject>>]?: InnerPickDeepValue<OriginalObject, CurrentProp, RemainingKeys, Depth>;
|
|
10
11
|
} : DeepKeys extends [] ? OriginalObject : DeepKeys extends [infer CurrentLevelPick] ? CurrentLevelPick extends keyof OriginalObject ? Pick<OriginalObject, CurrentLevelPick> : never : never;
|
|
11
|
-
type InnerPickDeepValue<OriginalObject, CurrentProp extends keyof OriginalObject, RemainingKeys extends any[]> = AnyFunction extends Extract<OriginalObject[CurrentProp], AnyFunction> ? OriginalObject[CurrentProp] | Exclude<OriginalObject[CurrentProp], AnyFunction> : Array<any> extends Extract<OriginalObject[CurrentProp], Array<any>> ? Array<InnerPickDeep<ArrayElement<Extract<OriginalObject[CurrentProp], Array<any>>>, RemainingKeys
|
|
12
|
+
type InnerPickDeepValue<OriginalObject, CurrentProp extends keyof OriginalObject, RemainingKeys extends any[], Depth extends TsRecursionTracker> = AnyFunction extends Extract<OriginalObject[CurrentProp], AnyFunction> ? OriginalObject[CurrentProp] | Exclude<OriginalObject[CurrentProp], AnyFunction> : Array<any> extends Extract<OriginalObject[CurrentProp], Array<any>> ? Array<InnerPickDeep<ArrayElement<Extract<OriginalObject[CurrentProp], Array<any>>>, RemainingKeys, TsRecurse<Depth>>> | Exclude<OriginalObject[CurrentProp], Array<any>> : ReadonlyArray<any> extends Extract<OriginalObject[CurrentProp], ReadonlyArray<any>> ? ReadonlyArray<InnerPickDeep<ArrayElement<Extract<OriginalObject[CurrentProp], ReadonlyArray<any>>>, RemainingKeys, TsRecurse<Depth>>> | Exclude<OriginalObject[CurrentProp], ReadonlyArray<any>> : Extract<OriginalObject[CurrentProp], Record<any, any>> extends never ? OriginalObject[CurrentProp] : InnerPickDeep<Extract<OriginalObject[CurrentProp], Record<any, any>>, RemainingKeys, TsRecurse<Depth>> | Exclude<OriginalObject[CurrentProp], Record<any, any>>;
|
|
12
13
|
/**
|
|
13
14
|
* Pick nested keys with more strict type parameter requirements. However, these stricter type
|
|
14
15
|
* parameter requirements often lead to "excessively deep" TS compiler errors.
|
|
15
16
|
*/
|
|
16
|
-
export type PickDeepStrict<OriginalObject extends object, DeepKeys extends NestedKeys<OriginalObject>> = InnerPickDeep<OriginalObject, DeepKeys>;
|
|
17
|
+
export type PickDeepStrict<OriginalObject extends object, DeepKeys extends NestedKeys<OriginalObject>> = InnerPickDeep<OriginalObject, DeepKeys, TsRecursionStart>;
|
|
17
18
|
/** Pick nested keys. */
|
|
18
|
-
export type PickDeep<OriginalObject extends object, DeepKeys extends PropertyKey[]> = InnerPickDeep<OriginalObject, DeepKeys>;
|
|
19
|
+
export type PickDeep<OriginalObject extends object, DeepKeys extends PropertyKey[]> = InnerPickDeep<OriginalObject, DeepKeys, TsRecursionStart>;
|
|
19
20
|
export {};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
type TsRecursionArray = [
|
|
2
|
+
1,
|
|
3
|
+
2,
|
|
4
|
+
3,
|
|
5
|
+
4,
|
|
6
|
+
5,
|
|
7
|
+
6,
|
|
8
|
+
7,
|
|
9
|
+
8,
|
|
10
|
+
9,
|
|
11
|
+
10,
|
|
12
|
+
11,
|
|
13
|
+
12,
|
|
14
|
+
13,
|
|
15
|
+
14,
|
|
16
|
+
15,
|
|
17
|
+
16,
|
|
18
|
+
17,
|
|
19
|
+
18,
|
|
20
|
+
19,
|
|
21
|
+
20,
|
|
22
|
+
21,
|
|
23
|
+
22,
|
|
24
|
+
23,
|
|
25
|
+
24,
|
|
26
|
+
25,
|
|
27
|
+
26,
|
|
28
|
+
27,
|
|
29
|
+
28,
|
|
30
|
+
29,
|
|
31
|
+
30,
|
|
32
|
+
31,
|
|
33
|
+
32,
|
|
34
|
+
33,
|
|
35
|
+
34,
|
|
36
|
+
35,
|
|
37
|
+
36,
|
|
38
|
+
37,
|
|
39
|
+
38,
|
|
40
|
+
39,
|
|
41
|
+
40,
|
|
42
|
+
41,
|
|
43
|
+
42,
|
|
44
|
+
43,
|
|
45
|
+
44,
|
|
46
|
+
45,
|
|
47
|
+
46,
|
|
48
|
+
47,
|
|
49
|
+
48,
|
|
50
|
+
49,
|
|
51
|
+
50,
|
|
52
|
+
51,
|
|
53
|
+
52,
|
|
54
|
+
53,
|
|
55
|
+
54,
|
|
56
|
+
55,
|
|
57
|
+
56,
|
|
58
|
+
57,
|
|
59
|
+
58,
|
|
60
|
+
59,
|
|
61
|
+
60,
|
|
62
|
+
61,
|
|
63
|
+
62,
|
|
64
|
+
63,
|
|
65
|
+
64,
|
|
66
|
+
65,
|
|
67
|
+
66,
|
|
68
|
+
67,
|
|
69
|
+
68,
|
|
70
|
+
69,
|
|
71
|
+
70,
|
|
72
|
+
71,
|
|
73
|
+
72,
|
|
74
|
+
73,
|
|
75
|
+
74,
|
|
76
|
+
75,
|
|
77
|
+
76,
|
|
78
|
+
77,
|
|
79
|
+
78,
|
|
80
|
+
79,
|
|
81
|
+
80,
|
|
82
|
+
81,
|
|
83
|
+
82,
|
|
84
|
+
83,
|
|
85
|
+
84,
|
|
86
|
+
85,
|
|
87
|
+
86,
|
|
88
|
+
87,
|
|
89
|
+
88,
|
|
90
|
+
89,
|
|
91
|
+
90,
|
|
92
|
+
91,
|
|
93
|
+
92,
|
|
94
|
+
93,
|
|
95
|
+
94,
|
|
96
|
+
95,
|
|
97
|
+
96,
|
|
98
|
+
97,
|
|
99
|
+
98,
|
|
100
|
+
99,
|
|
101
|
+
100,
|
|
102
|
+
101,
|
|
103
|
+
102,
|
|
104
|
+
103,
|
|
105
|
+
104,
|
|
106
|
+
105,
|
|
107
|
+
106,
|
|
108
|
+
107,
|
|
109
|
+
108,
|
|
110
|
+
109,
|
|
111
|
+
110,
|
|
112
|
+
111,
|
|
113
|
+
112,
|
|
114
|
+
113,
|
|
115
|
+
114,
|
|
116
|
+
115,
|
|
117
|
+
116,
|
|
118
|
+
117,
|
|
119
|
+
118,
|
|
120
|
+
119,
|
|
121
|
+
120,
|
|
122
|
+
121,
|
|
123
|
+
122,
|
|
124
|
+
123,
|
|
125
|
+
124,
|
|
126
|
+
125,
|
|
127
|
+
126,
|
|
128
|
+
127,
|
|
129
|
+
128,
|
|
130
|
+
129,
|
|
131
|
+
130,
|
|
132
|
+
131,
|
|
133
|
+
132,
|
|
134
|
+
133,
|
|
135
|
+
134,
|
|
136
|
+
135,
|
|
137
|
+
136,
|
|
138
|
+
137,
|
|
139
|
+
138,
|
|
140
|
+
139,
|
|
141
|
+
140,
|
|
142
|
+
141,
|
|
143
|
+
142,
|
|
144
|
+
143,
|
|
145
|
+
144,
|
|
146
|
+
145,
|
|
147
|
+
146,
|
|
148
|
+
147,
|
|
149
|
+
148,
|
|
150
|
+
149,
|
|
151
|
+
150
|
|
152
|
+
];
|
|
153
|
+
export type TsRecursionTracker = keyof TsRecursionArray;
|
|
154
|
+
/**
|
|
155
|
+
* Through experimentation on Typescript version 5.4.5, this is the maximum recursion depth we can
|
|
156
|
+
* go to before TypeScript will block recursive types.
|
|
157
|
+
*/
|
|
158
|
+
export type TsTooMuchRecursion = 91;
|
|
159
|
+
export type TsRecursionStart = 0;
|
|
160
|
+
export type TsRecurse<CurrentRecursion extends TsRecursionTracker> = TsRecursionArray[CurrentRecursion] extends TsRecursionTracker ? TsRecursionArray[CurrentRecursion] : TsTooMuchRecursion;
|
|
161
|
+
export {};
|
package/dist/types/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@augment-vir/common",
|
|
3
|
-
"version": "28.
|
|
3
|
+
"version": "28.2.0",
|
|
4
4
|
"homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/electrovir/augment-vir/issues"
|
|
@@ -24,12 +24,12 @@
|
|
|
24
24
|
"test:types": "tsc --noEmit"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"browser-or-node": "^
|
|
28
|
-
"run-time-assertions": "^1.
|
|
29
|
-
"type-fest": "^4.
|
|
27
|
+
"browser-or-node": "^3.0.0",
|
|
28
|
+
"run-time-assertions": "^1.5.1",
|
|
29
|
+
"type-fest": "^4.20.1"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"typescript": "5.
|
|
32
|
+
"typescript": "5.4.5"
|
|
33
33
|
},
|
|
34
34
|
"publishConfig": {
|
|
35
35
|
"access": "public"
|