Skip to content
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

feat: typed query filters #8670

Draft
wants to merge 7 commits into
base: main
Choose a base branch
from
Draft

feat: typed query filters #8670

wants to merge 7 commits into from

Conversation

TkDodo
Copy link
Collaborator

@TkDodo TkDodo commented Feb 19, 2025

No description provided.

Copy link

nx-cloud bot commented Feb 19, 2025

View your CI Pipeline Execution ↗ for commit 3401096.

Command Status Duration Result
nx affected --targets=test:sherif,test:knip,tes... ✅ Succeeded 1m 54s View ↗
nx run-many --target=build --exclude=examples/*... ✅ Succeeded 22s View ↗

☁️ Nx Cloud last updated this comment at 2025-02-25 12:58:15 UTC

Copy link

pkg-pr-new bot commented Feb 20, 2025

Open in Stackblitz

More templates

@tanstack/angular-query-devtools-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-devtools-experimental@8670

@tanstack/angular-query-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-experimental@8670

@tanstack/query-async-storage-persister

npm i https://pkg.pr.new/@tanstack/query-async-storage-persister@8670

@tanstack/query-broadcast-client-experimental

npm i https://pkg.pr.new/@tanstack/query-broadcast-client-experimental@8670

@tanstack/eslint-plugin-query

npm i https://pkg.pr.new/@tanstack/eslint-plugin-query@8670

@tanstack/query-core

npm i https://pkg.pr.new/@tanstack/query-core@8670

@tanstack/query-devtools

npm i https://pkg.pr.new/@tanstack/query-devtools@8670

@tanstack/query-persist-client-core

npm i https://pkg.pr.new/@tanstack/query-persist-client-core@8670

@tanstack/query-sync-storage-persister

npm i https://pkg.pr.new/@tanstack/query-sync-storage-persister@8670

@tanstack/react-query

npm i https://pkg.pr.new/@tanstack/react-query@8670

@tanstack/react-query-devtools

npm i https://pkg.pr.new/@tanstack/react-query-devtools@8670

@tanstack/react-query-next-experimental

npm i https://pkg.pr.new/@tanstack/react-query-next-experimental@8670

@tanstack/react-query-persist-client

npm i https://pkg.pr.new/@tanstack/react-query-persist-client@8670

@tanstack/solid-query

npm i https://pkg.pr.new/@tanstack/solid-query@8670

@tanstack/solid-query-devtools

npm i https://pkg.pr.new/@tanstack/solid-query-devtools@8670

@tanstack/solid-query-persist-client

npm i https://pkg.pr.new/@tanstack/solid-query-persist-client@8670

@tanstack/svelte-query

npm i https://pkg.pr.new/@tanstack/svelte-query@8670

@tanstack/svelte-query-devtools

npm i https://pkg.pr.new/@tanstack/svelte-query-devtools@8670

@tanstack/svelte-query-persist-client

npm i https://pkg.pr.new/@tanstack/svelte-query-persist-client@8670

@tanstack/vue-query

npm i https://pkg.pr.new/@tanstack/vue-query@8670

@tanstack/vue-query-devtools

npm i https://pkg.pr.new/@tanstack/vue-query-devtools@8670

commit: 3401096

Copy link

github-actions bot commented Feb 20, 2025

Sizes for commit 3401096:

Branch Bundle Size
Main
This PR

Copy link

codecov bot commented Feb 20, 2025

Codecov Report

Attention: Patch coverage is 80.00000% with 1 line in your changes missing coverage. Please review.

Project coverage is 63.05%. Comparing base (2d26374) to head (3401096).

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##             main    #8670       +/-   ##
===========================================
+ Coverage   46.28%   63.05%   +16.77%     
===========================================
  Files         199      135       -64     
  Lines        7549     4851     -2698     
  Branches     1732     1371      -361     
===========================================
- Hits         3494     3059      -435     
+ Misses       3675     1547     -2128     
+ Partials      380      245      -135     
Components Coverage Δ
@tanstack/angular-query-devtools-experimental ∅ <ø> (∅)
@tanstack/angular-query-experimental 88.65% <ø> (ø)
@tanstack/eslint-plugin-query ∅ <ø> (∅)
@tanstack/query-async-storage-persister 43.85% <ø> (ø)
@tanstack/query-broadcast-client-experimental ∅ <ø> (∅)
@tanstack/query-codemods ∅ <ø> (∅)
@tanstack/query-core 93.95% <100.00%> (-0.01%) ⬇️
@tanstack/query-devtools 4.78% <ø> (ø)
@tanstack/query-persist-client-core 57.73% <ø> (ø)
@tanstack/query-sync-storage-persister 84.61% <ø> (ø)
@tanstack/react-query 95.37% <ø> (ø)
@tanstack/react-query-devtools 10.00% <ø> (ø)
@tanstack/react-query-next-experimental ∅ <ø> (∅)
@tanstack/react-query-persist-client 100.00% <ø> (ø)
@tanstack/solid-query 78.20% <ø> (ø)
@tanstack/solid-query-devtools ∅ <ø> (∅)
@tanstack/solid-query-persist-client 100.00% <ø> (ø)
@tanstack/svelte-query 87.33% <ø> (ø)
@tanstack/svelte-query-devtools ∅ <ø> (∅)
@tanstack/svelte-query-persist-client 100.00% <ø> (ø)
@tanstack/vue-query 71.01% <50.00%> (ø)
@tanstack/vue-query-devtools ∅ <ø> (∅)

Comment on lines 172 to 187
invalidateQueries<
TQueryFnData = unknown,
TError = DefaultError,
TTaggedQueryKey extends QueryKey = QueryKey,
TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,
TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,
>(
filters?: InvalidateQueryFilters<
TInferredQueryFnData,
TInferredError,
TInferredQueryFnData,
TTaggedQueryKey
>,
options?: MaybeRefDeep<InvalidateOptions>,
): Promise<void>
invalidateQueries(
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DamianOsipiuk I don’t really know what I’m doing here 😂 but I’m getting type errors if I don’t add an overload that has the same signature as the base version 🤔 . Is this correct ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To make TS happy i guess you would need something like below.
And yes, you need to include both base and MaybeRefDeep if you are using TS inference.

invalidateQueries<
  TQueryFnData = unknown,
  TError = DefaultError,
  TTaggedQueryKey extends QueryKey = QueryKey,
  TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,
  TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,
>(
  filters: InvalidateQueryFilters<
    TInferredQueryFnData,
    TInferredError,
    TInferredQueryFnData,
    TTaggedQueryKey
  >,
  options: InvalidateOptions,
): Promise<void>
invalidateQueries<
  TQueryFnData = unknown,
  TError = DefaultError,
  TTaggedQueryKey extends QueryKey = QueryKey,
  TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,
  TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,
>(
  filters: MaybeRefDeep<
    InvalidateQueryFilters<
      TInferredQueryFnData,
      TInferredError,
      TInferredQueryFnData,
      TTaggedQueryKey
    >
  > = {},
  options: MaybeRefDeep<InvalidateOptions> = {},
): Promise<void> {
  const filtersCloned = cloneDeepUnref(filters)
  const optionsCloned = cloneDeepUnref(options)

  super.invalidateQueries(
    { ...filtersCloned, refetchType: 'none' },
    optionsCloned,
  )

  if (filtersCloned.refetchType === 'none') {
    return Promise.resolve()
  }

  const refetchFilters: RefetchQueryFilters<
    TInferredQueryFnData,
    TInferredError,
    TInferredQueryFnData,
    TTaggedQueryKey
  > = {
    ...filtersCloned,
    type: filtersCloned.refetchType ?? filtersCloned.type ?? 'active',
  }

  // (dosipiuk): We need to delay `refetchQueries` execution to next macro task for all reactive values to be updated.
  // This ensures that `context` in `queryFn` while `invalidating` along reactive variable change has correct
  return nextTick().then(() => {
    return super.refetchQueries(refetchFilters, optionsCloned)
  })
}

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you explain why the versions with MaybeDeepRef are optional, but without it, the params are required ? I think they should be optional in both overloads ...

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

like so?

06414eb

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh yeah, overload should include optionals.
MaybeRef just does not like | undefined union, so to get rid of it and properly infer types, it's instead defaulted to empty object = {}

Looks good 👍

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DamianOsipiuk I don’t understand where this type error now comes from:

../vue-query/src/__tests__/queryClient.test.ts(198,11): error TS2322: Type 'Ref<boolean, boolean>' is not assignable to type 'boolean | undefined'.

{ cancelRefetch: ref(false) },

I had to change options again: 3401096

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants