Skip to content

Commit

Permalink
fix(puppeteer-core): avoid type instantiation errors (#9370)
Browse files Browse the repository at this point in the history
Using the accumulator allows enabling the tail-recursion optimization in
the TypeScript compiler.

Closes #9369
  • Loading branch information
OrKoN committed Dec 6, 2022
1 parent be7626b commit 17f31a9
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 17 deletions.
38 changes: 21 additions & 17 deletions packages/puppeteer-core/src/common/types.ts
Expand Up @@ -135,32 +135,36 @@ type BeginSubclassSelectorTokens = ['.', '#', '[', ':'];

type CombinatorTokens = [' ', '>', '+', '~', '|', '|'];

type Drop<Arr extends readonly unknown[], Remove> = 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<Tail, Remove>
: [Head, ...Drop<Tail, Remove>]
: [];
: Drop<Tail, Remove, [...Acc, Head]>
: 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<FirstInput, Delemiters>,
...FlatmapSplitWithDelemiters<RestInputs, Delemiters>
]
: never
: never
: [];
? FlatmapSplitWithDelemiters<
RestInputs,
Delemiters,
[...Acc, ...SplitWithDelemiters<FirstInput, Delemiters>]
>
: 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<Suffix, Delemiter>]
: [Input];
? Split<Suffix, Delemiter, [...Acc, Prefix]>
: [...Acc, Input];
12 changes: 12 additions & 0 deletions test-d/NodeFor.test-d.ts
Expand Up @@ -6,6 +6,18 @@ declare const nodeFor: <Selector extends string>(
) => NodeFor<Selector>;

{
{
expectType<HTMLTableRowElement>(
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<Element>(
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<HTMLAnchorElement>(nodeFor('a'));
expectNotType<Element>(nodeFor('a'));
Expand Down

0 comments on commit 17f31a9

Please sign in to comment.