From 17f31a9ee408ca5a08fe6dbceb8915e710156bd3 Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Tue, 6 Dec 2022 19:21:08 +0100 Subject: [PATCH] fix(puppeteer-core): avoid type instantiation errors (#9370) 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 ccbc231c986..75dda2e433e 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 096dccaffea..a478b5952ce 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'));