algolia / algolia/algoliasearch-client-javascript
[bug]: TS recursivity error in SearchResponse
- 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