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'));