From b28367381234c42c4db99c1574b5b52c5e7ea96c Mon Sep 17 00:00:00 2001 From: Jaco Date: Thu, 18 Nov 2021 10:52:31 +0100 Subject: [PATCH] Squeek less recursion out of DetectCodec (#4232) * Squeek less recursion out of DetectCodec * Flatten more * TS 4.5.2 for checking --- package.json | 2 +- packages/types/src/checkTypes.manual.ts | 3 +- packages/types/src/primitive/StorageKey.ts | 2 +- packages/types/src/types/detect.ts | 57 ++++++++++------------ yarn.lock | 16 +++--- 5 files changed, 38 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index f522524b97..14b8926505 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,6 @@ "copyfiles": "^2.4.1" }, "resolutions": { - "typescript": "^4.4.4" + "typescript": "^4.5.2" } } diff --git a/packages/types/src/checkTypes.manual.ts b/packages/types/src/checkTypes.manual.ts index be2c6b5cd7..8bc12af37b 100644 --- a/packages/types/src/checkTypes.manual.ts +++ b/packages/types/src/checkTypes.manual.ts @@ -81,8 +81,9 @@ assert(hh[0].bitLength() && ms[0].strings && ms[1].values && ms[2].keys, 'All ok const tt1 = registry.createType('(u32, Compact, u128 , Something)'); // unwraps into a u32 const tt2 = registry.createType('(((u32)))'); +// TEST: Adding a single param makes this go over the recursion limit in 4.4.4 // lots and lots of params (indicates recursion limit) -const tt4 = registry.createType('(u8,u16,u32,u64,u128,u256,u8,u16,u32,u64,u128,u256,u8,u16,u32,u64,u128,u256)'); +const tt4 = registry.createType('(u8,u16,u32,u64,u128,u256,u8,u16,u32,u64,u128,u256,u8,u16,u32,u64,u128,u256,u8)'); // empty const tt5 = registry.createType('()'); // nested tuples diff --git a/packages/types/src/primitive/StorageKey.ts b/packages/types/src/primitive/StorageKey.ts index f4a7be9f01..be0b504503 100644 --- a/packages/types/src/primitive/StorageKey.ts +++ b/packages/types/src/primitive/StorageKey.ts @@ -46,7 +46,7 @@ export function unwrapStorageType (registry: Registry, type: StorageEntryTypeLat const outputType = getSiName(registry.lookup, unwrapStorageSi(type)); return isOptional - ? `Option<${outputType}>` as keyof InterfaceTypes + ? `Option<${outputType}>` as unknown as keyof InterfaceTypes : outputType as keyof InterfaceTypes; } diff --git a/packages/types/src/types/detect.ts b/packages/types/src/types/detect.ts index 1353e99b44..3057b1381c 100644 --- a/packages/types/src/types/detect.ts +++ b/packages/types/src/types/detect.ts @@ -62,13 +62,6 @@ export type __WrapTwo = keyof __MapWrapTwo; export type __Wrap = __WrapOne | __WrapTwo; -export type __ToStruct> = - K['_enum'] extends true - ? Enum - : K['_set'] extends true - ? CodecSet - : Struct; - export type __ToTuple = O[0] extends Codec ? O[1] extends Codec @@ -76,15 +69,6 @@ export type __ToTuple = : O[0] : Null; -export type __CodecFirst = - K extends keyof InterfaceTypes - ? InterfaceTypes[K] - : K extends unknown[] - ? __ToTuple<__Codecs> - : K extends Record - ? __ToStruct - : Codec; - export type __CodecsNext = K extends __WrapOne ? C extends [Codec, ...infer X] @@ -94,7 +78,22 @@ export type __CodecsNext = ? C extends [Codec, Codec, ...infer X] ? [__MapWrapTwo[K], ...X] : Codec - : [__CodecFirst, ...C]; + : [ + // __CodecFirst + K extends keyof InterfaceTypes + ? InterfaceTypes[K] + : K extends unknown[] + ? __ToTuple<__Codecs> + : K extends Record + // __ToStruct> + ? K['_enum'] extends true + ? Enum + : K['_set'] extends true + ? CodecSet + : Struct + : Codec, + ...C + ]; export type __Codecs = T extends [infer K, ...infer N] @@ -123,25 +122,18 @@ export type __TokenizeStruct = __Tokenize>; -export type __TokenizeWrapped = - K extends `${infer X}${R}` - ? X extends '[' - ? __Tokenize, '[']> - : __Tokenize> - : never; - -export type __TokenizeKnown = - K extends `${infer X}${',' | '>'}${R}` - ? __Tokenize> - : never; - // NOTE For recursion limits, it is more optimal to use __Sanitize with conjunction with __Tokenize // below, even while we do more matching (Number of characters iterated through is the most problematic) export type __Tokenize = K extends '' | '>' | ')' | '}' ? [__Combine, ''] : K extends `${__Wrap}${infer R}` - ? __TokenizeWrapped + // __TokenizeWrapped + ? K extends `${infer X}${R}` + ? X extends '[' + ? __Tokenize, '[']> + : __Tokenize> + : never : K extends `${',' | '>'}${infer R}` ? __Tokenize> : K extends `${')' | '}'}${infer R}` @@ -151,7 +143,10 @@ export type __Tokenize, V, I, R> : K extends `${keyof InterfaceTypes}${',' | '>'}${infer R}` - ? __TokenizeKnown + // __TokenizeKnown + ? K extends `${infer X}${',' | '>'}${R}` + ? __Tokenize> + : never : K extends `${infer C}${infer R}` ? __Tokenize : [__Combine, '']; diff --git a/yarn.lock b/yarn.lock index b8cdd68dce..227fba860f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9882,23 +9882,23 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"typescript@npm:^4.4.4": - version: 4.4.4 - resolution: "typescript@npm:4.4.4" +"typescript@npm:^4.5.2": + version: 4.5.2 + resolution: "typescript@npm:4.5.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 89ecb8436bb48ef5594d49289f5f89103071716b6e4844278f4fb3362856e31203e187a9c76d205c3f0b674d221a058fd28310dbcbcf5d95e9a57229bb5203f1 + checksum: 74f9ce65d532bdf5d0214b3f60cf37992180023388c87a11ee6f838a803067ef0b63c600fa501b0deb07f989257dce1e244c9635ed79feca40bbccf6e0aa1ebc languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^4.4.4#~builtin": - version: 4.4.4 - resolution: "typescript@patch:typescript@npm%3A4.4.4#~builtin::version=4.4.4&hash=d8b4e7" +"typescript@patch:typescript@npm%3A^4.5.2#~builtin": + version: 4.5.2 + resolution: "typescript@patch:typescript@npm%3A4.5.2#~builtin::version=4.5.2&hash=d8b4e7" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 4a639b6886be13616582ab82abdb4ffbbf5b0458069d13c10cd5d44fc1cafa33eab005e8ac8691ad8fae249fee85844bb7d523263c4568fe9a2ca31cd3c91c3d + checksum: 02cf0f190f0cb6d216558d8db9c3a968feeab4965c340a351e5e6e84a42a3946e5e200a9538b6e427af9d17e4f713254dd0707d5fd6f238ce93f0aee1986ab57 languageName: node linkType: hard