algolia / instantsearch

⚡️ Libraries for building performant and instant search and recommend experiences with Algolia. Compatible with JavaScript, TypeScript, React and Vue.
https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/js/
MIT License
3.73k stars 526 forks source link

react-instantsearch-core introduces DOM types into react native Apps. #6365

Open giantslogik opened 2 months ago

giantslogik commented 2 months ago

🐛 Current behavior

"react-instantsearch-core": "^7.13.1" introduces DOM types into react native apps. We have experienced this issue with "react-instantsearch-hooks": "^6.33.0" as well.

This causes invalid code in react native to be accepted as valid by tsc causing crashes at run time in our Apps. (At run time typescript/javascript support is provided by hermes.)

All variables and functions valid in DOM environment (eg. close() , the window global , ScrollY, StyleSheet ) and thousands of other variables / functions are considered valid due to node_modules/typescript/lib/lib.dom.d.ts being included.

Via the tsconfig explainFiles flag i was able to determine the responsible node modules. https://www.typescriptlang.org/tsconfig/#explainFiles

node_modules/typescript/lib/lib.dom.d.ts
  Library referenced via 'dom' from file 'node_modules/preact/src/jsx.d.ts'
node_modules/preact/src/index.d.ts
  Imported via "preact" from file 'node_modules/instantsearch.js/..........' with packageId 'preact/src/index.d.ts@10.21.0'
node_modules/instantsearch.js/es/index.d.ts
  Imported via 'instantsearch.js' from file 'node_modules/react-instantsearch-core/......' with packageId 'instantsearch.js/es/index.d.ts@4.74.1'

🔍 Steps to reproduce

  1. Add "react-instantsearch-core": "^7.13.1" to a react native App
  2. In any source file import { InstantSearch } from 'react-instantsearch-core';
  3. Edit any App source file and call the close() method.
  4. run tsc (or within VSCode) . It fails to mark the close() call as an error as in a DOM environment close() calls the global window.close()

Live reproduction

https://itdoesntseemtobefeasibletoreproRN.com

💭 Expected behavior

tsc should flag close() as an undefined function when running under React Native. Using instantsearch-core / instantsearch.js treats any code valid in a browser environment as valid, even when invalid for react-native.

Package version

"react-instantsearch-core": "^7.13.1"

Operating system

NA

Browser

NA

Code of Conduct

Haroenv commented 2 months ago

I wasn't aware of this issue, but we have a medium-term goal of splitting up InstantSearch.js into a core part that doesn't import preact and any browser code and one that does, which can then be used for React InstantSearch core too. Unfortunately for now I don't see a workaround without that amount of work