algolia / algolia/algoliasearch-client-javascript

[bug]: TS recursivity error in SearchResponse

Open
#1,571 0 comments 7 reactions 0 assignees View on GitHub
bug
Dominant language
TypeScript
Stars
1.4k
Forks
226
PR merge metrics
No merged PRs in 30d

Description

### Description

We encountered the issue `Type instantiation is excessively deep and possibly infinite.ts(2589)` while upgrading algoliasearch from v5.1 to v5.15 and working with Immer `produce` function and `SearchResponse` type.

Here's a reproducible example of the issue:
- [TS Playground](https://www.typescriptlang.org/play/?ts=5.6.3#code/FASwtgDg9gTgLgAgN7AQgrgZwKYCVsAm6AxtjADSoJwCeE2C+RpMwAvggGYxRgIDkMbAENicfsFCRYiJAgg9mDDt14DwYMhOC16CABIgA5gAsANsZNx8mdGbgB5CHBBQAdggC8yKgDdhZujYAFwImHAwIG5GANzscTp0DIamFqbW2Lb2XgaWaVY2do7Orh4APj5oANoA1tg0oeGR0QC6oSnmlhlZcHEcFQCCMDDCNAA8HfndRQB8CbrJIHBjACo5+MSwBGNNUUbkGG41blAA7m4zMzlrAGSVCAD6JnldhfYA-KEoaNV1DWERPZtXKpV6ZIpxNBsPrzJIIADKIhgxBMhjgmFW62wmxg2120QO6COJ3OlyxOLxgIJCGEbhoVzu3wQz3R7SWqxmVRaMMkCwQAzMRigFmEiOEyJMNmgbhwmO8Gy2Oyp+0OxzOFyu3jFErRGJWc15cIGEAg8LgwjgDG8TIARrSagB1SIuaKYN6shAACgFQpF2pRUvcsoAQvanUs9gzkPJhEYohbSqEAAqx+MudwINgASgQFTcdjM7ENegGYlKXioFSZaDtR3DLqMbvB9kwoR9wpAoqRAcy0pDYedkdzhwI2E4UUIVDQC1C-AAwvoBgA5ADiAFEHrg1-CAKoAGRW8IkUOLDBTcbcCYz1qoxHQw2wbjg55CCHzYBtZCobmwAA9n7Gr7vp+MDDvmZiFmg9AwC+oTAV+UFCL4rhYLBb7oB+ZBgQWVBwFA5pmHOUBEnAcEYSBuH4QEL6tuhmGsGwp4IKGdaDtEORMiABCNMqVDoBABAWoQAykQgAAiQlFsAmwyogUQRgEZpCRxVC1o6bGNu6tHgWYlAcJgCaYOOmT8iaSmWpIMnhDGF5Xh4N5oHeD5PmhACMlBoD+-5oQATB58hkG5-kKNgyHEZgaEAAz+XhBFESRoR+ZRBE0YlelhIZxmYAg55pqUllBogQhKDAoRMCQZBjMaprmpaBylumFw5AoUBKJ6noECMnBwAcoiNTmnhXEymCnEsKJen1pQAHQLDm1YIMQwg4AIC7Luum7bvuh78MEU4-CAnATWW7hTWp9Z7E2PSYHNe0-AgnXCN1p0DhGrpaRxCBTV9k0nWdGmXUUmAHBAqaXo1ma3ZmCDYGYy3zXdD1PX9r2ac26I5DpkOMQjY7CEUu13TWQjCDUVCMdmkjSYVCBVOEQkHAQICYCDcAoi0ORYHghAVTAnrFTzBzyS4im1dgWZAA)

The issue stems from two types: `highlightResult` and `snippetResult`(which both have the same structure). They create a recursive reference in the [Yaml definition here](https://github.com/algolia/api-clients-automation/blob/065b093aede93566b5c36d35d1eee2b3edb7639d/specs/common/schemas/HighlightResult.yml#L50) where `highlightResultMap` and `highlightResultArray` both reference the same `highlightResult`.

```yml
highlightResultArray:
type: array
description: Surround words that match the query with HTML tags for highlighting.
items:
$ref: '#/highlightResult'

highlightResultMap:
type: object
description: Surround words that match the query with HTML tags for highlighting.
additionalProperties:
x-additionalPropertiesName: attribute
$ref: '#/highlightResult'

highlightResult:
oneOf:
- $ref: '#/highlightResultOption'
- $ref: '#/highlightResultMap'
- $ref: '#/highlightResultArray'
```

This type actually changed in the previous commits and did not create any issue in v5.1.0. Last working version is 5.3.2.

We see two possible fixes:
1. Create a new `highlightResultLevelTwo` that won't reference `highlightResultMap` or `highlightResultArray` and breaks the cycle.
2. Patch the TS definitions to prevent a excessively deep recursion. [TS Playground with a modified type `HighlightResult` as generic](https://www.typescriptlang.org/play/?ts=5.6.3#code/FASwtgDg9gTgLgAgN7AQgrgZwKYCVsAm6AxtjADSoJwCeE2C+RpMwAvggGYxRgIDkMbAENicfsFCRYiJAgg9mDDt14DwYMhOC16CABIgA5gAsANsZNx8mdGbgB5CHBBQAdggC8yKgDdhZujYAFwImHAwIG5GANzscTp0DABC6CBmBAAq6BBm2AA8AHII2AAecNhuBJgIbuhgAEZk5AiZJeWV1QjCbjQA2gC6XgiDAHzDmX38edFwJvxDZRVVNYVUAPytVKGp6Vk5eUUtfQB0Z5ktPTQDowm6DADK6A0RonD5AILty111jc0IZLfTo1P5NGDjby7DLZXIFD7jJYgkZnE7Q-Zw-LJUYtVFRThkRjYcIDDZE8JTGZGOYLba1bC+Mh3JIGSwWUzWYl2d4AEWwzhMwJWtXq4OGAGZIQg+QKhV0AAwITaGUzsqw2blOFzuBChFXmSyc2z2LWuDwAHx8aD6AGtsDRQuFItEBnq2YaNfZ8k8XjA3vkZXMWgBGUa3dgIS0fGB+mj5fVqo3c73PV5iAP8oMIUNh5l6QzvNrefDEWAEfJOqJGFroNw2txQADubjDEwQADIrQgAPomd0cz1wdahFBoa12h1hCJV12s1Uern2OJoNhxVeSe4IB4iGDEEwFzD5ItE0swcuV6I1usN5ut4vYU-n6eX7q9cad0cIPtwTBuwujQY1zzBgPjMIwoAsYRt2EXcTBsaA3BwI9hhLMsK2fasMGvJsWylaDYIPI9w0SPQPggCAHjgYQKmGT8Gh6G0AHVIhcaJMEHX8EAAClA8DIPwvd4PcJDkgY5iQFYox32QeRhCMKJqLNUIAAU5IU7UPDYABKSMRTMMx2A3FkPjEM0vCoS1PzQei63EyT2MXH9Ql4iCQCgndBOJBCRLEliq3GS1awIbBOCiQgqDQe5Qn4ABhfQPkKABxABRbtcGSh4AFUABlMgeCQVyMvRVPktxFJ1bxP2IdAY0qOASpCEV-lYNA3CWBrQjBQlLTqfSqHoGAOqa8F+qEXxXCwIaupgXTeoMyKoCoswYqgWs4E60UyCoOBFoCBrOOmwySJSXyJKrWiqBAAhHQwqgcgIajCA+dbpUeo7S0QxAojOgJKMei7rNO+yOI2-TKA4TBFMwULiQQMiKKoipJA+8JZNK8qPEqqhqtqtx6rkxrg0oVr2oJ0IACZifkMghqJ0aGQmzAhvlKmdqWla1op1ndrMfauYjSGXGhkBYZK9SzWR4TECEJQYFCJgSDIT5yL+ioWhMjSpQUKAlC4riCD9Tg4EuUz3B0zxxk-TBGwkvduLeM0TnuHSrIQYhhBwAQ4oSlK0oynK8v4YIIrHEBOHt023BOGymL8tiOJdkOxwQA3hCN6OgarBzjR-WiEFRB33Az2y46MbPuUwFoIDUsqNIQNgk-rkozE913k9T9OY7srOOOGObG4b9uQuEblg+T6yhGEG0qAb7TJGAFHED6cJHpaAgQEwau4D3IZvCwPBCEVmAuJlo+Wm+lxfsR7AtKAA)

Thanks!

### Client

Search

### Version

5.15.0

### Relevant log output

_No response_

Contributor guide

No contributing guide indexed for this repository

Research direction

Reproduce the TypeScript 5.6.3 error using the linked TS Playground and inspect the generated SearchResponse, highlightResult, and snippetResult definitions alongside specs/common/schemas/HighlightResult.yml. Trace the recursive references in highlightResultMap and highlightResultArray, then compare with the last working v5.3.2 type; done means the v5.15 definitions compile without TS2589 while preserving the response shape.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
api
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.