@tanstack/lit-query 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -43
  3. package/dist/QueryClientProvider.d.ts +85 -0
  4. package/dist/QueryClientProvider.d.ts.map +1 -0
  5. package/dist/QueryClientProvider.js +137 -0
  6. package/dist/QueryClientProvider.js.map +1 -0
  7. package/dist/accessor.d.ts +32 -0
  8. package/dist/accessor.d.ts.map +1 -0
  9. package/dist/accessor.js +12 -0
  10. package/dist/accessor.js.map +1 -0
  11. package/dist/context.d.ts +59 -0
  12. package/dist/context.d.ts.map +1 -0
  13. package/dist/context.js +100 -0
  14. package/dist/context.js.map +1 -0
  15. package/dist/controllers/BaseController.d.ts +38 -0
  16. package/dist/controllers/BaseController.d.ts.map +1 -0
  17. package/dist/controllers/BaseController.js +204 -0
  18. package/dist/controllers/BaseController.js.map +1 -0
  19. package/dist/createInfiniteQueryController.d.ts +76 -0
  20. package/dist/createInfiniteQueryController.d.ts.map +1 -0
  21. package/dist/createInfiniteQueryController.js +221 -0
  22. package/dist/createInfiniteQueryController.js.map +1 -0
  23. package/dist/createMutationController.d.ts +79 -0
  24. package/dist/createMutationController.d.ts.map +1 -0
  25. package/dist/createMutationController.js +193 -0
  26. package/dist/createMutationController.js.map +1 -0
  27. package/dist/createQueriesController.d.ts +145 -0
  28. package/dist/createQueriesController.d.ts.map +1 -0
  29. package/dist/createQueriesController.js +302 -0
  30. package/dist/createQueriesController.js.map +1 -0
  31. package/dist/createQueryController.d.ts +67 -0
  32. package/dist/createQueryController.d.ts.map +1 -0
  33. package/dist/createQueryController.js +211 -0
  34. package/dist/createQueryController.js.map +1 -0
  35. package/dist/index.d.ts +24 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +15 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/infiniteQueryOptions.d.ts +21 -0
  40. package/dist/infiniteQueryOptions.d.ts.map +1 -0
  41. package/dist/infiniteQueryOptions.js +22 -0
  42. package/dist/infiniteQueryOptions.js.map +1 -0
  43. package/dist/mutationOptions.d.ts +19 -0
  44. package/dist/mutationOptions.d.ts.map +1 -0
  45. package/dist/mutationOptions.js +20 -0
  46. package/dist/mutationOptions.js.map +1 -0
  47. package/dist/queryOptions.d.ts +62 -0
  48. package/dist/queryOptions.d.ts.map +1 -0
  49. package/dist/queryOptions.js +4 -0
  50. package/dist/queryOptions.js.map +1 -0
  51. package/dist/types.d.ts +31 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/useIsFetching.d.ts +45 -0
  56. package/dist/useIsFetching.d.ts.map +1 -0
  57. package/dist/useIsFetching.js +116 -0
  58. package/dist/useIsFetching.js.map +1 -0
  59. package/dist/useIsMutating.d.ts +45 -0
  60. package/dist/useIsMutating.d.ts.map +1 -0
  61. package/dist/useIsMutating.js +116 -0
  62. package/dist/useIsMutating.js.map +1 -0
  63. package/dist/useMutationState.d.ts +57 -0
  64. package/dist/useMutationState.d.ts.map +1 -0
  65. package/dist/useMutationState.js +132 -0
  66. package/dist/useMutationState.js.map +1 -0
  67. package/dist-cjs/QueryClientProvider.d.cts +84 -0
  68. package/dist-cjs/QueryClientProvider.js +141 -0
  69. package/dist-cjs/QueryClientProvider.js.map +1 -0
  70. package/dist-cjs/accessor.d.cts +31 -0
  71. package/dist-cjs/accessor.js +16 -0
  72. package/dist-cjs/accessor.js.map +1 -0
  73. package/dist-cjs/context.d.cts +58 -0
  74. package/dist-cjs/context.js +109 -0
  75. package/dist-cjs/context.js.map +1 -0
  76. package/dist-cjs/controllers/BaseController.d.cts +37 -0
  77. package/dist-cjs/controllers/BaseController.js +208 -0
  78. package/dist-cjs/controllers/BaseController.js.map +1 -0
  79. package/dist-cjs/createInfiniteQueryController.d.cts +75 -0
  80. package/dist-cjs/createInfiniteQueryController.js +224 -0
  81. package/dist-cjs/createInfiniteQueryController.js.map +1 -0
  82. package/dist-cjs/createMutationController.d.cts +78 -0
  83. package/dist-cjs/createMutationController.js +196 -0
  84. package/dist-cjs/createMutationController.js.map +1 -0
  85. package/dist-cjs/createQueriesController.d.cts +144 -0
  86. package/dist-cjs/createQueriesController.js +305 -0
  87. package/dist-cjs/createQueriesController.js.map +1 -0
  88. package/dist-cjs/createQueryController.d.cts +66 -0
  89. package/dist-cjs/createQueryController.js +214 -0
  90. package/dist-cjs/createQueryController.js.map +1 -0
  91. package/dist-cjs/index.d.cts +23 -0
  92. package/dist-cjs/index.js +49 -0
  93. package/dist-cjs/index.js.map +1 -0
  94. package/dist-cjs/infiniteQueryOptions.d.cts +20 -0
  95. package/dist-cjs/infiniteQueryOptions.js +25 -0
  96. package/dist-cjs/infiniteQueryOptions.js.map +1 -0
  97. package/dist-cjs/mutationOptions.d.cts +18 -0
  98. package/dist-cjs/mutationOptions.js +23 -0
  99. package/dist-cjs/mutationOptions.js.map +1 -0
  100. package/dist-cjs/package.json +3 -0
  101. package/dist-cjs/queryOptions.d.cts +61 -0
  102. package/dist-cjs/queryOptions.js +7 -0
  103. package/dist-cjs/queryOptions.js.map +1 -0
  104. package/dist-cjs/types.d.cts +30 -0
  105. package/dist-cjs/types.js +3 -0
  106. package/dist-cjs/types.js.map +1 -0
  107. package/dist-cjs/useIsFetching.d.cts +44 -0
  108. package/dist-cjs/useIsFetching.js +119 -0
  109. package/dist-cjs/useIsFetching.js.map +1 -0
  110. package/dist-cjs/useIsMutating.d.cts +44 -0
  111. package/dist-cjs/useIsMutating.js +119 -0
  112. package/dist-cjs/useIsMutating.js.map +1 -0
  113. package/dist-cjs/useMutationState.d.cts +56 -0
  114. package/dist-cjs/useMutationState.js +135 -0
  115. package/dist-cjs/useMutationState.js.map +1 -0
  116. package/package.json +73 -8
  117. package/src/QueryClientProvider.ts +174 -0
  118. package/src/accessor.ts +43 -0
  119. package/src/context.ts +120 -0
  120. package/src/controllers/BaseController.ts +284 -0
  121. package/src/createInfiniteQueryController.ts +394 -0
  122. package/src/createMutationController.ts +361 -0
  123. package/src/createQueriesController.ts +633 -0
  124. package/src/createQueryController.ts +342 -0
  125. package/src/index.ts +72 -0
  126. package/src/infiniteQueryOptions.ts +48 -0
  127. package/src/mutationOptions.ts +31 -0
  128. package/src/queryOptions.ts +143 -0
  129. package/src/types.ts +77 -0
  130. package/src/useIsFetching.ts +159 -0
  131. package/src/useIsMutating.ts +159 -0
  132. package/src/useMutationState.ts +201 -0
@@ -0,0 +1,193 @@
1
+ import { MutationObserver, } from '@tanstack/query-core';
2
+ import { createValueAccessor, readAccessor, } from './accessor.js';
3
+ import { createMissingQueryClientError } from './context.js';
4
+ import { BaseController } from './controllers/BaseController.js';
5
+ function createIdleMutationResult() {
6
+ return {
7
+ context: undefined,
8
+ data: undefined,
9
+ error: null,
10
+ failureCount: 0,
11
+ failureReason: null,
12
+ isError: false,
13
+ isIdle: true,
14
+ isPending: false,
15
+ isPaused: false,
16
+ isSuccess: false,
17
+ status: 'idle',
18
+ submittedAt: 0,
19
+ variables: undefined,
20
+ mutate: (() => Promise.reject(createMissingQueryClientError())),
21
+ reset: (() => undefined),
22
+ };
23
+ }
24
+ class MutationController extends BaseController {
25
+ options;
26
+ observer;
27
+ unsubscribe;
28
+ queryClient;
29
+ constructor(host, options, queryClient) {
30
+ super(host, createIdleMutationResult(), queryClient);
31
+ this.options = options;
32
+ if (!queryClient) {
33
+ return;
34
+ }
35
+ if (typeof options === 'function') {
36
+ return;
37
+ }
38
+ const observer = new MutationObserver(queryClient, this.defaultOptions(queryClient));
39
+ this.queryClient = queryClient;
40
+ this.observer = observer;
41
+ this.result = observer.getCurrentResult();
42
+ }
43
+ onConnected() {
44
+ if (!this.syncClient()) {
45
+ return;
46
+ }
47
+ this.refreshOptions();
48
+ this.subscribe();
49
+ if (this.observer) {
50
+ this.setResult(this.observer.getCurrentResult());
51
+ }
52
+ }
53
+ onDisconnected() {
54
+ this.unsubscribeObserver();
55
+ this.syncClient();
56
+ }
57
+ onHostUpdate() {
58
+ if (typeof this.options !== 'function') {
59
+ return;
60
+ }
61
+ this.refreshOptions();
62
+ }
63
+ onQueryClientChanged() {
64
+ if (!this.syncClient() || !this.connectedState) {
65
+ return;
66
+ }
67
+ this.refreshOptions();
68
+ this.subscribe();
69
+ if (this.observer) {
70
+ this.setResult(this.observer.getCurrentResult());
71
+ }
72
+ }
73
+ mutate = (variables, mutateOptions) => {
74
+ if (!this.syncClient() || !this.observer) {
75
+ throw createMissingQueryClientError();
76
+ }
77
+ void this.observer.mutate(variables, mutateOptions).catch(() => {
78
+ // Intentionally swallow in sync mutate path.
79
+ });
80
+ };
81
+ mutateAsync = (...args) => {
82
+ if (!this.syncClient() || !this.observer) {
83
+ return Promise.reject(createMissingQueryClientError());
84
+ }
85
+ return this.observer.mutate(...args);
86
+ };
87
+ reset = () => {
88
+ if (!this.syncClient() || !this.observer) {
89
+ return;
90
+ }
91
+ this.observer.reset();
92
+ this.setResult(this.observer.getCurrentResult());
93
+ };
94
+ subscribe() {
95
+ if (!this.observer) {
96
+ return;
97
+ }
98
+ if (this.unsubscribe) {
99
+ return;
100
+ }
101
+ this.unsubscribe = this.observer.subscribe((next) => {
102
+ this.setResult(next);
103
+ });
104
+ }
105
+ unsubscribeObserver() {
106
+ this.unsubscribe?.();
107
+ this.unsubscribe = undefined;
108
+ }
109
+ syncClient() {
110
+ const nextClient = this.tryGetQueryClient();
111
+ if (!nextClient) {
112
+ this.unsubscribeObserver();
113
+ this.queryClient = undefined;
114
+ this.observer = undefined;
115
+ this.setResult(createIdleMutationResult());
116
+ return false;
117
+ }
118
+ if (nextClient === this.queryClient) {
119
+ return true;
120
+ }
121
+ this.unsubscribeObserver();
122
+ this.queryClient = nextClient;
123
+ this.observer = new MutationObserver(this.queryClient, this.defaultOptions(this.queryClient));
124
+ this.setResult(this.observer.getCurrentResult());
125
+ return true;
126
+ }
127
+ refreshOptions() {
128
+ if (!this.syncClient() || !this.observer || !this.queryClient) {
129
+ return false;
130
+ }
131
+ this.observer.setOptions(this.defaultOptions());
132
+ this.setResult(this.observer.getCurrentResult());
133
+ return true;
134
+ }
135
+ defaultOptions(client = this.queryClient) {
136
+ if (!client) {
137
+ throw createMissingQueryClientError();
138
+ }
139
+ return client.defaultMutationOptions(readAccessor(this.options));
140
+ }
141
+ }
142
+ /**
143
+ * Creates a Lit reactive controller that subscribes the host to a mutation.
144
+ *
145
+ * The returned accessor is callable and also exposes `current`, `mutate`,
146
+ * `mutateAsync`, `reset`, and `destroy`. When `options` is a function, it is
147
+ * re-read during host updates so mutation options can follow reactive host
148
+ * state.
149
+ *
150
+ * If `queryClient` is omitted, the controller resolves the client from the
151
+ * nearest connected `QueryClientProvider`.
152
+ *
153
+ * @param host - The Lit reactive controller host that owns the mutation
154
+ * subscription.
155
+ * @param options - Mutation observer options, or a getter that returns options.
156
+ * @param queryClient - Optional explicit query client. Provide this for
157
+ * controllers that should not resolve a client from Lit context.
158
+ * @returns An accessor for the latest mutation result with mutation helper
159
+ * methods.
160
+ *
161
+ * @example
162
+ * ```ts
163
+ * import { LitElement, html } from 'lit'
164
+ * import { createMutationController } from '@tanstack/lit-query'
165
+ *
166
+ * class AddTodoForm extends LitElement {
167
+ * private readonly addTodo = createMutationController(this, {
168
+ * mutationFn: (title: string) =>
169
+ * fetch('/api/todos', { method: 'POST', body: JSON.stringify({ title }) }),
170
+ * })
171
+ *
172
+ * render() {
173
+ * const mutation = this.addTodo()
174
+ *
175
+ * return html`
176
+ * <button ?disabled=${mutation.isPending} @click=${() => this.addTodo.mutate('Ship docs')}>
177
+ * Add todo
178
+ * </button>
179
+ * `
180
+ * }
181
+ * }
182
+ * ```
183
+ */
184
+ export function createMutationController(host, options, queryClient) {
185
+ const controller = new MutationController(host, options, queryClient);
186
+ return Object.assign(createValueAccessor(() => controller.current), {
187
+ mutate: controller.mutate,
188
+ mutateAsync: controller.mutateAsync,
189
+ reset: controller.reset,
190
+ destroy: () => controller.destroy(),
191
+ });
192
+ }
193
+ //# sourceMappingURL=createMutationController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMutationController.js","sourceRoot":"","sources":["../src/createMutationController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { type DefaultError, type DefinedQueryObserverResult, type OmitKeyof, type QueryFunction, type QueryKey, type QueryObserverOptions, type QueryObserverResult, type ThrowOnError } from '@tanstack/query-core';
2
+ import type { QueryClient } from '@tanstack/query-core';
3
+ import type { ReactiveControllerHost } from 'lit';
4
+ import { type Accessor, type ValueAccessor } from './accessor.js';
5
+ /**
6
+ * Options for one query inside `createQueriesController`.
7
+ *
8
+ * This mirrors `QueryObserverOptions` and is used by the tuple inference that
9
+ * maps each input query to its corresponding result.
10
+ */
11
+ export type CreateQueriesInput<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = QueryObserverOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>;
12
+ type CreateQueriesInputForController<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = OmitKeyof<CreateQueriesInput<TQueryFnData, TError, TData, TQueryKey>, never>;
13
+ type MAXIMUM_DEPTH = 20;
14
+ type SkipTokenForCreateQueries = symbol;
15
+ type GetCreateQueriesInput<T> = T extends {
16
+ queryFnData: infer TQueryFnData;
17
+ error?: infer TError;
18
+ data: infer TData;
19
+ } ? CreateQueriesInputForController<TQueryFnData, TError, TData> : T extends {
20
+ queryFnData: infer TQueryFnData;
21
+ error?: infer TError;
22
+ } ? CreateQueriesInputForController<TQueryFnData, TError> : T extends {
23
+ data: infer TData;
24
+ error?: infer TError;
25
+ } ? CreateQueriesInputForController<unknown, TError, TData> : T extends [infer TQueryFnData, infer TError, infer TData] ? CreateQueriesInputForController<TQueryFnData, TError, TData> : T extends [infer TQueryFnData, infer TError] ? CreateQueriesInputForController<TQueryFnData, TError> : T extends [infer TQueryFnData] ? CreateQueriesInputForController<TQueryFnData> : T extends {
26
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> | SkipTokenForCreateQueries;
27
+ select?: (data: any) => infer TData;
28
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
29
+ } ? CreateQueriesInputForController<TQueryFnData, unknown extends TError ? DefaultError : TError, unknown extends TData ? TQueryFnData : TData, TQueryKey> : CreateQueriesInputForController;
30
+ type GetDefinedOrUndefinedCreateQueriesResult<T, TData, TError = unknown> = T extends {
31
+ initialData?: infer TInitialData;
32
+ } ? unknown extends TInitialData ? QueryObserverResult<TData, TError> : TInitialData extends TData ? DefinedQueryObserverResult<TData, TError> : TInitialData extends () => infer TInitialDataResult ? unknown extends TInitialDataResult ? QueryObserverResult<TData, TError> : TInitialDataResult extends TData ? DefinedQueryObserverResult<TData, TError> : QueryObserverResult<TData, TError> : QueryObserverResult<TData, TError> : QueryObserverResult<TData, TError>;
33
+ type GetCreateQueriesResult<T> = T extends {
34
+ queryFnData: any;
35
+ error?: infer TError;
36
+ data: infer TData;
37
+ } ? GetDefinedOrUndefinedCreateQueriesResult<T, TData, TError> : T extends {
38
+ queryFnData: infer TQueryFnData;
39
+ error?: infer TError;
40
+ } ? GetDefinedOrUndefinedCreateQueriesResult<T, TQueryFnData, TError> : T extends {
41
+ data: infer TData;
42
+ error?: infer TError;
43
+ } ? GetDefinedOrUndefinedCreateQueriesResult<T, TData, TError> : T extends [any, infer TError, infer TData] ? GetDefinedOrUndefinedCreateQueriesResult<T, TData, TError> : T extends [infer TQueryFnData, infer TError] ? GetDefinedOrUndefinedCreateQueriesResult<T, TQueryFnData, TError> : T extends [infer TQueryFnData] ? GetDefinedOrUndefinedCreateQueriesResult<T, TQueryFnData> : T extends {
44
+ queryFn?: QueryFunction<infer TQueryFnData, any> | SkipTokenForCreateQueries;
45
+ select?: (data: any) => infer TData;
46
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
47
+ } ? GetDefinedOrUndefinedCreateQueriesResult<T, unknown extends TData ? TQueryFnData : TData, unknown extends TError ? DefaultError : TError> : QueryObserverResult;
48
+ export type CreateQueriesOptions<T extends Array<any>, TResults extends Array<any> = [], TDepth extends ReadonlyArray<number> = []> = TDepth['length'] extends MAXIMUM_DEPTH ? Array<CreateQueriesInputForController> : T extends [] ? [] : T extends [infer Head] ? [...TResults, GetCreateQueriesInput<Head>] : T extends [infer Head, ...infer Tails] ? CreateQueriesOptions<[
49
+ ...Tails
50
+ ], [
51
+ ...TResults,
52
+ GetCreateQueriesInput<Head>
53
+ ], [
54
+ ...TDepth,
55
+ 1
56
+ ]> : ReadonlyArray<unknown> extends T ? T : T extends Array<CreateQueriesInputForController<infer TQueryFnData, infer TError, infer TData, infer TQueryKey>> ? Array<CreateQueriesInputForController<TQueryFnData, TError, TData, TQueryKey>> : Array<CreateQueriesInputForController>;
57
+ /**
58
+ * Tuple of query results inferred from the query inputs passed to
59
+ * `createQueriesController`.
60
+ */
61
+ export type CreateQueriesResults<T extends Array<any>, TResults extends Array<any> = [], TDepth extends ReadonlyArray<number> = []> = TDepth['length'] extends MAXIMUM_DEPTH ? Array<QueryObserverResult> : T extends [] ? [] : T extends [infer Head] ? [...TResults, GetCreateQueriesResult<Head>] : T extends [infer Head, ...infer Tails] ? CreateQueriesResults<[
62
+ ...Tails
63
+ ], [
64
+ ...TResults,
65
+ GetCreateQueriesResult<Head>
66
+ ], [
67
+ ...TDepth,
68
+ 1
69
+ ]> : {
70
+ [K in keyof T]: GetCreateQueriesResult<T[K]>;
71
+ };
72
+ /**
73
+ * Options accepted by `createQueriesController`.
74
+ *
75
+ * `queries` can be a static list or a getter that returns the current list.
76
+ * `combine` can reshape the array of query results into a single value for the
77
+ * returned accessor.
78
+ */
79
+ export type CreateQueriesControllerOptions<TQueryOptions extends Array<any> = Array<any>, TCombinedResult = CreateQueriesResults<TQueryOptions>> = {
80
+ /** Query options to observe, or a getter that returns the current options. */
81
+ queries: Accessor<readonly [...CreateQueriesOptions<TQueryOptions>] | readonly [
82
+ ...{
83
+ [K in keyof TQueryOptions]: GetCreateQueriesInput<TQueryOptions[K]>;
84
+ }
85
+ ]>;
86
+ /** Optional function that combines the query result array into one value. */
87
+ combine?: (result: CreateQueriesResults<TQueryOptions>) => TCombinedResult;
88
+ };
89
+ /**
90
+ * Accessor returned by `createQueriesController`.
91
+ *
92
+ * Call the accessor or read its `current` property to get the latest combined
93
+ * value.
94
+ */
95
+ export type QueriesResultAccessor<TCombinedResult> = ValueAccessor<TCombinedResult> & {
96
+ /** Removes the controller from its Lit host and unsubscribes observers. */
97
+ destroy: () => void;
98
+ };
99
+ /**
100
+ * Creates a Lit reactive controller that subscribes the host to multiple
101
+ * queries.
102
+ *
103
+ * The returned accessor is callable and also exposes `current` and `destroy`.
104
+ * When `options` or `options.queries` is a function, it is re-read during host
105
+ * updates so the query list can follow reactive host state.
106
+ *
107
+ * If `queryClient` is omitted, the controller resolves the client from the
108
+ * nearest connected `QueryClientProvider`.
109
+ *
110
+ * @param host - The Lit reactive controller host that owns the queries
111
+ * subscription.
112
+ * @param options - Queries controller options, or a getter that returns options.
113
+ * @param queryClient - Optional explicit query client. Provide this for
114
+ * controllers that should not resolve a client from Lit context.
115
+ * @returns An accessor for the latest query results, or the value returned by
116
+ * `combine`.
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * import { LitElement, html } from 'lit'
121
+ * import { createQueriesController } from '@tanstack/lit-query'
122
+ *
123
+ * class DashboardView extends LitElement {
124
+ * private readonly dashboard = createQueriesController(this, {
125
+ * queries: [
126
+ * { queryKey: ['stats'], queryFn: fetchStats },
127
+ * { queryKey: ['projects'], queryFn: fetchProjects },
128
+ * ],
129
+ * combine: ([stats, projects]) => ({
130
+ * stats: stats.data,
131
+ * projects: projects.data ?? [],
132
+ * isPending: stats.isPending || projects.isPending,
133
+ * }),
134
+ * })
135
+ *
136
+ * render() {
137
+ * const dashboard = this.dashboard()
138
+ * return html`<p>Projects: ${dashboard.projects.length}</p>`
139
+ * }
140
+ * }
141
+ * ```
142
+ */
143
+ export declare function createQueriesController<TQueryOptions extends Array<any>, TCombinedResult = CreateQueriesResults<TQueryOptions>>(host: ReactiveControllerHost, options: Accessor<CreateQueriesControllerOptions<TQueryOptions, TCombinedResult>>, queryClient?: QueryClient): QueriesResultAccessor<TCombinedResult>;
144
+ export {};
145
+ //# sourceMappingURL=createQueriesController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createQueriesController.d.ts","sourceRoot":"","sources":["../src/createQueriesController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,302 @@
1
+ import { QueriesObserver, } from '@tanstack/query-core';
2
+ import { createValueAccessor, readAccessor, } from './accessor.js';
3
+ import { createMissingQueryClientError } from './context.js';
4
+ import { BaseController } from './controllers/BaseController.js';
5
+ function createPendingQueryObserverResult() {
6
+ return {
7
+ data: undefined,
8
+ dataUpdatedAt: 0,
9
+ error: null,
10
+ errorUpdatedAt: 0,
11
+ failureCount: 0,
12
+ failureReason: null,
13
+ errorUpdateCount: 0,
14
+ isError: false,
15
+ isFetched: false,
16
+ isFetchedAfterMount: false,
17
+ isFetching: false,
18
+ isInitialLoading: false,
19
+ isLoading: false,
20
+ isLoadingError: false,
21
+ isPaused: false,
22
+ isPending: true,
23
+ isPlaceholderData: false,
24
+ isRefetchError: false,
25
+ isRefetching: false,
26
+ isStale: true,
27
+ isEnabled: true,
28
+ isSuccess: false,
29
+ fetchStatus: 'idle',
30
+ status: 'pending',
31
+ refetch: (() => Promise.reject(createMissingQueryClientError())),
32
+ promise: Promise.resolve(undefined),
33
+ };
34
+ }
35
+ function createPlaceholderQueryObserverResult(query) {
36
+ const initialData = typeof query.initialData === 'function'
37
+ ? query.initialData()
38
+ : query.initialData;
39
+ if (initialData === undefined) {
40
+ return createPendingQueryObserverResult();
41
+ }
42
+ const data = query.select ? query.select(initialData) : initialData;
43
+ const initialDataUpdatedAt = typeof query.initialDataUpdatedAt === 'function'
44
+ ? query.initialDataUpdatedAt()
45
+ : query.initialDataUpdatedAt;
46
+ return {
47
+ ...createPendingQueryObserverResult(),
48
+ data,
49
+ dataUpdatedAt: initialDataUpdatedAt ?? Date.now(),
50
+ isPending: false,
51
+ isInitialLoading: false,
52
+ isLoading: false,
53
+ isSuccess: true,
54
+ status: 'success',
55
+ promise: Promise.resolve(data),
56
+ };
57
+ }
58
+ function resolveQueriesOptions(optionsAccessor, client) {
59
+ const resolvedOptions = readAccessor(optionsAccessor);
60
+ const resolvedQueries = readAccessor(resolvedOptions.queries);
61
+ const combine = resolvedOptions.combine;
62
+ return {
63
+ queries: resolvedQueries.map((query) => {
64
+ const defaulted = client.defaultQueryOptions(query);
65
+ defaulted._optimisticResults =
66
+ 'optimistic';
67
+ return defaulted;
68
+ }),
69
+ combine,
70
+ };
71
+ }
72
+ class QueriesController extends BaseController {
73
+ options;
74
+ observer;
75
+ unsubscribe;
76
+ queryClient;
77
+ explicitInitializationError;
78
+ placeholderInitialized = false;
79
+ placeholderRetryableFailure = true;
80
+ constructor(host, options, queryClient) {
81
+ super(host, [], queryClient);
82
+ this.options = options;
83
+ queueMicrotask(() => {
84
+ this.placeholderRetryableFailure = false;
85
+ });
86
+ if (!queryClient) {
87
+ return;
88
+ }
89
+ if (this.shouldRefreshOnHostUpdate()) {
90
+ return;
91
+ }
92
+ this.tryInitializeExplicitClient(queryClient);
93
+ }
94
+ onConnected() {
95
+ if (!this.syncClient()) {
96
+ return;
97
+ }
98
+ this.refreshOptions();
99
+ this.subscribe();
100
+ }
101
+ onDisconnected() {
102
+ this.unsubscribeObserver();
103
+ this.syncClient();
104
+ }
105
+ onHostUpdate() {
106
+ if (!this.shouldRefreshOnHostUpdate()) {
107
+ return;
108
+ }
109
+ if (!this.refreshOptions()) {
110
+ this.setPlaceholderResult();
111
+ }
112
+ }
113
+ onQueryClientChanged() {
114
+ if (!this.syncClient() || !this.connectedState) {
115
+ return;
116
+ }
117
+ this.refreshOptions();
118
+ this.subscribe();
119
+ }
120
+ subscribe() {
121
+ if (!this.observer) {
122
+ return;
123
+ }
124
+ if (this.unsubscribe) {
125
+ return;
126
+ }
127
+ this.unsubscribe = this.observer.subscribe((next) => {
128
+ const { combine } = this.readResolvedOptions();
129
+ this.setResult(this.computeResult(next, combine));
130
+ });
131
+ }
132
+ tryInitializeExplicitClient(queryClient) {
133
+ try {
134
+ const { queries, combine } = resolveQueriesOptions(this.options, queryClient);
135
+ const observer = new QueriesObserver(queryClient, queries, {
136
+ combine,
137
+ });
138
+ this.queryClient = queryClient;
139
+ this.observer = observer;
140
+ this.result = this.computeResult(observer.getCurrentResult(), combine);
141
+ this.explicitInitializationError = undefined;
142
+ this.placeholderInitialized = true;
143
+ return true;
144
+ }
145
+ catch (error) {
146
+ // Retry after construction completes so late host fields used by
147
+ // static queries/combine callbacks can finish initializing first.
148
+ this.explicitInitializationError = error;
149
+ this.queryClient = undefined;
150
+ this.observer = undefined;
151
+ return false;
152
+ }
153
+ }
154
+ retryExplicitInitializationIfNeeded() {
155
+ if (!this.explicitInitializationError || this.shouldRefreshOnHostUpdate()) {
156
+ return false;
157
+ }
158
+ const explicitClient = this.tryGetQueryClient();
159
+ if (!explicitClient) {
160
+ return false;
161
+ }
162
+ return this.tryInitializeExplicitClient(explicitClient);
163
+ }
164
+ unsubscribeObserver() {
165
+ this.unsubscribe?.();
166
+ this.unsubscribe = undefined;
167
+ }
168
+ syncClient() {
169
+ const nextClient = this.tryGetQueryClient();
170
+ if (!nextClient) {
171
+ this.unsubscribeObserver();
172
+ this.queryClient = undefined;
173
+ this.observer = undefined;
174
+ this.setPlaceholderResult();
175
+ return false;
176
+ }
177
+ if (nextClient === this.queryClient) {
178
+ return true;
179
+ }
180
+ this.unsubscribeObserver();
181
+ this.queryClient = nextClient;
182
+ const { queries, combine } = this.readResolvedOptions();
183
+ this.observer = new QueriesObserver(this.queryClient, queries, {
184
+ combine,
185
+ });
186
+ this.setResult(this.computeResult(this.observer.getCurrentResult(), combine));
187
+ this.placeholderInitialized = true;
188
+ return true;
189
+ }
190
+ refreshOptions() {
191
+ if (!this.syncClient() || !this.observer) {
192
+ return false;
193
+ }
194
+ const { queries, combine } = this.readResolvedOptions();
195
+ this.observer.setQueries(queries, {
196
+ combine,
197
+ });
198
+ const [rawResult, getCombinedResult] = this.observer.getOptimisticResult(queries, combine);
199
+ this.setResult(getCombinedResult(rawResult));
200
+ return true;
201
+ }
202
+ readResolvedOptions(client = this.queryClient) {
203
+ if (!client) {
204
+ throw createMissingQueryClientError();
205
+ }
206
+ return resolveQueriesOptions(this.options, client);
207
+ }
208
+ shouldRefreshOnHostUpdate() {
209
+ if (typeof this.options === 'function') {
210
+ return true;
211
+ }
212
+ return typeof this.options.queries === 'function';
213
+ }
214
+ computeResult(rawResult, combine) {
215
+ return (combine ? combine(rawResult) : rawResult);
216
+ }
217
+ static createPlaceholderResult(optionsAccessor) {
218
+ const resolvedOptions = readAccessor(optionsAccessor);
219
+ const queries = readAccessor(resolvedOptions.queries);
220
+ const placeholders = queries.map((query) => createPlaceholderQueryObserverResult(query));
221
+ return (resolvedOptions.combine
222
+ ? resolvedOptions.combine(placeholders)
223
+ : placeholders);
224
+ }
225
+ readCurrent() {
226
+ if (this.retryExplicitInitializationIfNeeded()) {
227
+ return this.current;
228
+ }
229
+ if (this.explicitInitializationError && !this.placeholderRetryableFailure) {
230
+ throw this.explicitInitializationError;
231
+ }
232
+ if (!this.queryClient && !this.observer && !this.placeholderInitialized) {
233
+ try {
234
+ // Early reads can happen during class-field initialization, before
235
+ // accessors referenced by queries/combine are ready. Retry normally
236
+ // after construction finishes and only surface errors after that point.
237
+ this.setPlaceholderResult();
238
+ }
239
+ catch (error) {
240
+ if (!this.placeholderRetryableFailure) {
241
+ throw error;
242
+ }
243
+ }
244
+ }
245
+ return this.current;
246
+ }
247
+ setPlaceholderResult() {
248
+ this.result = QueriesController.createPlaceholderResult(this.options);
249
+ this.placeholderInitialized = true;
250
+ }
251
+ }
252
+ /**
253
+ * Creates a Lit reactive controller that subscribes the host to multiple
254
+ * queries.
255
+ *
256
+ * The returned accessor is callable and also exposes `current` and `destroy`.
257
+ * When `options` or `options.queries` is a function, it is re-read during host
258
+ * updates so the query list can follow reactive host state.
259
+ *
260
+ * If `queryClient` is omitted, the controller resolves the client from the
261
+ * nearest connected `QueryClientProvider`.
262
+ *
263
+ * @param host - The Lit reactive controller host that owns the queries
264
+ * subscription.
265
+ * @param options - Queries controller options, or a getter that returns options.
266
+ * @param queryClient - Optional explicit query client. Provide this for
267
+ * controllers that should not resolve a client from Lit context.
268
+ * @returns An accessor for the latest query results, or the value returned by
269
+ * `combine`.
270
+ *
271
+ * @example
272
+ * ```ts
273
+ * import { LitElement, html } from 'lit'
274
+ * import { createQueriesController } from '@tanstack/lit-query'
275
+ *
276
+ * class DashboardView extends LitElement {
277
+ * private readonly dashboard = createQueriesController(this, {
278
+ * queries: [
279
+ * { queryKey: ['stats'], queryFn: fetchStats },
280
+ * { queryKey: ['projects'], queryFn: fetchProjects },
281
+ * ],
282
+ * combine: ([stats, projects]) => ({
283
+ * stats: stats.data,
284
+ * projects: projects.data ?? [],
285
+ * isPending: stats.isPending || projects.isPending,
286
+ * }),
287
+ * })
288
+ *
289
+ * render() {
290
+ * const dashboard = this.dashboard()
291
+ * return html`<p>Projects: ${dashboard.projects.length}</p>`
292
+ * }
293
+ * }
294
+ * ```
295
+ */
296
+ export function createQueriesController(host, options, queryClient) {
297
+ const controller = new QueriesController(host, options, queryClient);
298
+ return Object.assign(createValueAccessor(() => controller.readCurrent()), {
299
+ destroy: () => controller.destroy(),
300
+ });
301
+ }
302
+ //# sourceMappingURL=createQueriesController.js.map