Skip to content

Commit f1755db

Browse files
committed
Export reusable internal selectors
1 parent d0b2077 commit f1755db

File tree

3 files changed

+48
-21
lines changed

3 files changed

+48
-21
lines changed

packages/toolkit/src/query/core/buildMiddleware/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import type {
2626
ThunkResult,
2727
} from '../buildThunks'
2828
import type { QueryActionCreatorResult } from '../buildInitiate'
29+
import type { AllSelectors } from '../buildSelectors'
2930

3031
export type QueryStateMeta<T> = Record<string, undefined | T>
3132
export type TimeoutId = ReturnType<typeof setTimeout>
@@ -52,6 +53,7 @@ export interface BuildMiddlewareInput<
5253
infiniteQueryThunk: InfiniteQueryThunk<any>
5354
api: Api<any, Definitions, ReducerPath, TagTypes>
5455
assertTagType: AssertTagTypes
56+
selectors: AllSelectors
5557
}
5658

5759
export type SubMiddlewareApi = MiddlewareAPI<
@@ -69,6 +71,7 @@ export interface BuildSubMiddlewareInput
6971
>,
7072
): ThunkAction<QueryActionCreatorResult<any>, any, any, UnknownAction>
7173
isThisApiSliceAction: (action: Action) => boolean
74+
selectors: AllSelectors
7275
}
7376

7477
export type SubMiddlewareBuilder = (

packages/toolkit/src/query/core/buildSelectors.ts

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ const defaultMutationSubState = /* @__PURE__ */ createNextState(
159159
() => {},
160160
)
161161

162+
export type AllSelectors = ReturnType<typeof buildSelectors>
163+
162164
export function buildSelectors<
163165
Definitions extends EndpointDefinitions,
164166
ReducerPath extends string,
@@ -182,6 +184,11 @@ export function buildSelectors<
182184
buildMutationSelector,
183185
selectInvalidatedBy,
184186
selectCachedArgsForQuery,
187+
selectApiState,
188+
selectQueries,
189+
selectMutations,
190+
selectQueryEntry,
191+
selectConfig,
185192
}
186193

187194
function withRequestFlags<T extends { status: QueryStatus }>(
@@ -193,12 +200,12 @@ export function buildSelectors<
193200
}
194201
}
195202

196-
function selectInternalState(rootState: RootState) {
203+
function selectApiState(rootState: RootState) {
197204
const state = rootState[reducerPath]
198205
if (process.env.NODE_ENV !== 'production') {
199206
if (!state) {
200-
if ((selectInternalState as any).triggered) return state
201-
;(selectInternalState as any).triggered = true
207+
if ((selectApiState as any).triggered) return state
208+
;(selectApiState as any).triggered = true
202209
console.error(
203210
`Error: No data found at \`state.${reducerPath}\`. Did you forget to add the reducer to the store?`,
204211
)
@@ -207,6 +214,22 @@ export function buildSelectors<
207214
return state
208215
}
209216

217+
function selectQueries(rootState: RootState) {
218+
return selectApiState(rootState)?.queries
219+
}
220+
221+
function selectQueryEntry(rootState: RootState, cacheKey: QueryCacheKey) {
222+
return selectQueries(rootState)?.[cacheKey]
223+
}
224+
225+
function selectMutations(rootState: RootState) {
226+
return selectApiState(rootState)?.mutations
227+
}
228+
229+
function selectConfig(rootState: RootState) {
230+
return selectApiState(rootState)?.config
231+
}
232+
210233
function buildAnyQuerySelector(
211234
endpointName: string,
212235
endpointDefinition: EndpointDefinition<any, any, any, any>,
@@ -221,8 +244,7 @@ export function buildSelectors<
221244
endpointName,
222245
})
223246
const selectQuerySubstate = (state: RootState) =>
224-
selectInternalState(state)?.queries?.[serializedArgs] ??
225-
defaultQuerySubState
247+
selectQueryEntry(state, serializedArgs) ?? defaultQuerySubState
226248
const finalSelectQuerySubState =
227249
queryArgs === skipToken ? selectSkippedQuery : selectQuerySubstate
228250

@@ -292,7 +314,7 @@ export function buildSelectors<
292314
mutationId = id
293315
}
294316
const selectMutationSubstate = (state: RootState) =>
295-
selectInternalState(state)?.mutations?.[mutationId as string] ??
317+
selectApiState(state)?.mutations?.[mutationId as string] ??
296318
defaultMutationSubState
297319
const finalSelectMutationSubstate =
298320
mutationId === skipToken
@@ -351,7 +373,7 @@ export function buildSelectors<
351373
state: RootState,
352374
queryName: QueryName,
353375
): Array<QueryArgFrom<Definitions[QueryName]>> {
354-
return Object.values(state[reducerPath].queries as QueryState<any>)
376+
return Object.values(selectQueries(state) as QueryState<any>)
355377
.filter(
356378
(
357379
entry,

packages/toolkit/src/query/core/module.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,22 @@ export const coreModule = ({
546546
util: {},
547547
})
548548

549+
const selectors = buildSelectors({
550+
serializeQueryArgs: serializeQueryArgs as any,
551+
reducerPath,
552+
createSelector,
553+
})
554+
555+
const {
556+
selectInvalidatedBy,
557+
selectCachedArgsForQuery,
558+
buildQuerySelector,
559+
buildInfiniteQuerySelector,
560+
buildMutationSelector,
561+
} = selectors
562+
563+
safeAssign(api.util, { selectInvalidatedBy, selectCachedArgsForQuery })
564+
549565
const {
550566
queryThunk,
551567
infiniteQueryThunk,
@@ -605,20 +621,6 @@ export const coreModule = ({
605621

606622
safeAssign(api, { reducer: reducer as any, middleware })
607623

608-
const {
609-
buildQuerySelector,
610-
buildInfiniteQuerySelector,
611-
buildMutationSelector,
612-
selectInvalidatedBy,
613-
selectCachedArgsForQuery,
614-
} = buildSelectors({
615-
serializeQueryArgs: serializeQueryArgs as any,
616-
reducerPath,
617-
createSelector,
618-
})
619-
620-
safeAssign(api.util, { selectInvalidatedBy, selectCachedArgsForQuery })
621-
622624
const {
623625
buildInitiateQuery,
624626
buildInitiateInfiniteQuery,

0 commit comments

Comments
 (0)