From 409826498c51278eb14b29ff247392d9fd361289 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 6 Dec 2022 18:52:09 +0100 Subject: [PATCH] fix(puppeteer-core): avoid type instantiation errors Using the accumulator allows enabling the tail-recursion optimization in the TypeScript compiler. Closes #9369 --- packages/puppeteer-core/src/common/types.ts | 38 ++++++++++++--------- test-d/NodeFor.test-d.ts | 12 +++++++ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/packages/puppeteer-core/src/common/types.ts b/packages/puppeteer-core/src/common/types.ts index ccbc231c98633..75dda2e433e15 100644 --- a/packages/puppeteer-core/src/common/types.ts +++ b/packages/puppeteer-core/src/common/types.ts @@ -135,32 +135,36 @@ type BeginSubclassSelectorTokens = ['.', '#', '[', ':']; type CombinatorTokens = [' ', '>', '+', '~', '|', '|']; -type Drop = Arr extends [ - infer Head, - ...infer Tail -] +type Drop< + Arr extends readonly unknown[], + Remove, + Acc extends unknown[] = [] +> = Arr extends [infer Head, ...infer Tail] ? Head extends Remove ? Drop - : [Head, ...Drop] - : []; + : Drop + : Acc; type FlatmapSplitWithDelemiters< Inputs extends readonly string[], - Delemiters extends readonly string[] + Delemiters extends readonly string[], + Acc extends string[] = [] > = Inputs extends [infer FirstInput, ...infer RestInputs] ? FirstInput extends string ? RestInputs extends readonly string[] - ? [ - ...SplitWithDelemiters, - ...FlatmapSplitWithDelemiters - ] - : never - : never - : []; + ? FlatmapSplitWithDelemiters< + RestInputs, + Delemiters, + [...Acc, ...SplitWithDelemiters] + > + : Acc + : Acc + : Acc; type Split< Input extends string, - Delemiter extends string + Delemiter extends string, + Acc extends string[] = [] > = Input extends `${infer Prefix}${Delemiter}${infer Suffix}` - ? [Prefix, ...Split] - : [Input]; + ? Split + : [...Acc, Input]; diff --git a/test-d/NodeFor.test-d.ts b/test-d/NodeFor.test-d.ts index 096dccaffea0e..a478b5952ce88 100644 --- a/test-d/NodeFor.test-d.ts +++ b/test-d/NodeFor.test-d.ts @@ -6,6 +6,18 @@ declare const nodeFor: ( ) => NodeFor; { + { + expectType( + nodeFor( + '[data-testid="my-component"] div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div tbody tr' + ) + ); + expectNotType( + nodeFor( + '[data-testid="my-component"] div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div div tbody tr' + ) + ); + } { expectType(nodeFor('a')); expectNotType(nodeFor('a'));