-
Notifications
You must be signed in to change notification settings - Fork 47.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Bug: Eslint hooks returned by factory functions not linted #25065
Comments
We're very happy to do a PR to change the behavior to suit our needs, but before doing so I'd love some takes & constraints from the React team so we don't do a bunch of work in vain that might be rejected regardless. |
This also potentially impacts RTK Query. While most of our users probably use export const { useAddUserQuery } = api
// in another file
const result = useAddUserQuery(arg) it is also valid to just import const result = api.endpoints.addUser.useQuery() and while I have never noticed it, it seems like this would also not count as a hook for the eslint rules then? |
I understand that people want this to count as a hook but also consider the larger ecosystem impact.
I would strongly encourage you to do so regardless. PRs aren't predicated on the fact that they will get merged. They're after all, a request. A PR will allow trying out the rule in existing codebase to find potential false-positives and false-negatives. Otherwise we continue to rely on each others biases on what we think is important without having an actual real-word picture: testing something in production. |
To your knowledge, are there any such apis that are actively being called within React components? (useFakeTimers would only be called in tests, not components) Maybe there could be a middle ground that would apply only some rules of hooks for nested |
So you'd be ok with |
Personally: Yes, because it would in 100% of the cases produce a runtime error that would pop up during development. It's nice to lint for that, but it's easy to detect and easy to fix. Conditionally calling a hook in a component is something that might take a lot of time to actually surface and produce a runtime error during development though - so here the lint rule adds a lot more value. Another completely different idea: eslint rules can be type aware - why not make use of that and allow library authors to mark functions as "yes, this is a hook and the rules of hooks should apply"? |
This would require type-aware linting which is super slow and definitely not viable at the current state of the ecosystem. It would also require lint rules that understand flow and would break with untyped code.
If @KATT is ok with that then I would suggest updating the issue description so that we're all on the same page. |
This seems like a good idea to me. The problem with the conditional hook call not being flagged is that it might be introduced silently by adding an early return to an already existing component. Then, you might not get the "fewer hooks have been rendered" error until you actually render that branch that does return early. So here, the lint rule is very important to work reliably (even if there might be some false positives). |
Sorry, I dropped the ball on this until someone reminded me that this was not solved.
Yes, this would be fine for me too. I've updated the description. Is there anything we can do to enable this behaviour? Would you accept a PR? |
This issue has been automatically marked as stale. If this issue is still affecting you, please leave any comment (for example, "bump"), and we'll keep it open. We are sorry that we haven't been able to prioritize it yet. If you have any new additional information, please include it with your comment! |
bump |
Is there any update on this? Or @KATT is there another workaround that trpc users can adopt? |
This issue has been automatically marked as stale. If this issue is still affecting you, please leave any comment (for example, "bump"), and we'll keep it open. We are sorry that we haven't been able to prioritize it yet. If you have any new additional information, please include it with your comment! |
I believe this ask still stands. |
This issue has been automatically marked as stale. If this issue is still affecting you, please leave any comment (for example, "bump"), and we'll keep it open. We are sorry that we haven't been able to prioritize it yet. If you have any new additional information, please include it with your comment! |
bump. even more relevant with the this pattern TanStack Router/Start is doing: export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params: { postId } }) => fetchPost(postId),
})
function PostComponent() {
const post = Route.useLoaderData() |
React version: *
Steps To Reproduce
Given the following code:
The current behavior
The linting does not catch that the
hooks.foo.useQuery()
is used conditionally.The expected behavior
The linting should catch that the
hooks.foo.useQuery()
is used conditionally.Failing tests / link to code
See my draft PR with failing tests 👉 #25066.
I've highlighted areas and things that are up for discussions around this.
Additional context
Partial workaround
If the object returned is not a deep getter, it's possible to
PascalCase
it and do it like this:It's okay if hooks can be called outside of React-components
#25065 (comment)
Background
I'm the creator of tRPC where we use the following pattern for users to create the root hooks:
In the coming version of tRPC, we are planning on have an API that looks like the below, which also won't be caught.
The text was updated successfully, but these errors were encountered: