@rikalabs/effect-react 0.0.1

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 (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +179 -0
  3. package/dist/actions/http.d.ts +18 -0
  4. package/dist/actions/index.d.ts +4 -0
  5. package/dist/actions/react.d.ts +7 -0
  6. package/dist/actions/service.d.ts +18 -0
  7. package/dist/actions/types.d.ts +33 -0
  8. package/dist/boundary/codecs.d.ts +40 -0
  9. package/dist/boundary/errors.d.ts +22 -0
  10. package/dist/boundary/index.d.ts +2 -0
  11. package/dist/chunk-2GIUCKL2.js +16 -0
  12. package/dist/chunk-2GIUCKL2.js.map +1 -0
  13. package/dist/chunk-2TG7YEVD.js +11 -0
  14. package/dist/chunk-2TG7YEVD.js.map +1 -0
  15. package/dist/chunk-6FI4ROTW.js +152 -0
  16. package/dist/chunk-6FI4ROTW.js.map +1 -0
  17. package/dist/chunk-C5JI7D7W.js +213 -0
  18. package/dist/chunk-C5JI7D7W.js.map +1 -0
  19. package/dist/chunk-EEYASTXR.js +99 -0
  20. package/dist/chunk-EEYASTXR.js.map +1 -0
  21. package/dist/chunk-H7MOLKTU.js +301 -0
  22. package/dist/chunk-H7MOLKTU.js.map +1 -0
  23. package/dist/chunk-IVIYY6S5.js +77 -0
  24. package/dist/chunk-IVIYY6S5.js.map +1 -0
  25. package/dist/chunk-JKN75OYC.js +87 -0
  26. package/dist/chunk-JKN75OYC.js.map +1 -0
  27. package/dist/chunk-M2CJG6T7.js +24 -0
  28. package/dist/chunk-M2CJG6T7.js.map +1 -0
  29. package/dist/chunk-MDGEGQZB.js +206 -0
  30. package/dist/chunk-MDGEGQZB.js.map +1 -0
  31. package/dist/chunk-NI2GNZ7S.js +78 -0
  32. package/dist/chunk-NI2GNZ7S.js.map +1 -0
  33. package/dist/chunk-O7XTA7H3.js +423 -0
  34. package/dist/chunk-O7XTA7H3.js.map +1 -0
  35. package/dist/chunk-S67FHWAR.js +88 -0
  36. package/dist/chunk-S67FHWAR.js.map +1 -0
  37. package/dist/chunk-SKC3HMF3.js +17 -0
  38. package/dist/chunk-SKC3HMF3.js.map +1 -0
  39. package/dist/chunk-TUJZ6XJY.js +127 -0
  40. package/dist/chunk-TUJZ6XJY.js.map +1 -0
  41. package/dist/chunk-WPV3WFMS.js +38 -0
  42. package/dist/chunk-WPV3WFMS.js.map +1 -0
  43. package/dist/chunk-XIBEKS5A.js +301 -0
  44. package/dist/chunk-XIBEKS5A.js.map +1 -0
  45. package/dist/chunk-YG22YP5K.js +68 -0
  46. package/dist/chunk-YG22YP5K.js.map +1 -0
  47. package/dist/chunk-ZMZQBREU.js +262 -0
  48. package/dist/chunk-ZMZQBREU.js.map +1 -0
  49. package/dist/client/index.cjs +191 -0
  50. package/dist/client/index.cjs.map +1 -0
  51. package/dist/client/index.d.ts +8 -0
  52. package/dist/client/index.js +14 -0
  53. package/dist/client/index.js.map +1 -0
  54. package/dist/config/index.cjs +63 -0
  55. package/dist/config/index.cjs.map +1 -0
  56. package/dist/config/index.d.ts +32 -0
  57. package/dist/config/index.js +9 -0
  58. package/dist/config/index.js.map +1 -0
  59. package/dist/data/index.d.ts +3 -0
  60. package/dist/data/react.d.ts +10 -0
  61. package/dist/data/service.d.ts +20 -0
  62. package/dist/data/types.d.ts +31 -0
  63. package/dist/devtools/events.d.ts +37 -0
  64. package/dist/devtools/index.cjs +149 -0
  65. package/dist/devtools/index.cjs.map +1 -0
  66. package/dist/devtools/index.d.ts +2 -0
  67. package/dist/devtools/index.js +18 -0
  68. package/dist/devtools/index.js.map +1 -0
  69. package/dist/devtools/react.d.ts +8 -0
  70. package/dist/form/index.cjs +301 -0
  71. package/dist/form/index.cjs.map +1 -0
  72. package/dist/form/index.d.ts +3 -0
  73. package/dist/form/index.js +14 -0
  74. package/dist/form/index.js.map +1 -0
  75. package/dist/form/react.d.ts +9 -0
  76. package/dist/form/service.d.ts +3 -0
  77. package/dist/form/types.d.ts +41 -0
  78. package/dist/framework/app.d.ts +21 -0
  79. package/dist/framework/cache.d.ts +10 -0
  80. package/dist/framework/contracts.d.ts +32 -0
  81. package/dist/framework/index.cjs +1006 -0
  82. package/dist/framework/index.cjs.map +1 -0
  83. package/dist/framework/index.d.ts +4 -0
  84. package/dist/framework/index.js +35 -0
  85. package/dist/framework/index.js.map +1 -0
  86. package/dist/framework/manifest.d.ts +12 -0
  87. package/dist/framework/vite.d.ts +13 -0
  88. package/dist/framework-vite/index.cjs +163 -0
  89. package/dist/framework-vite/index.cjs.map +1 -0
  90. package/dist/framework-vite/index.d.ts +1 -0
  91. package/dist/framework-vite/index.js +125 -0
  92. package/dist/framework-vite/index.js.map +1 -0
  93. package/dist/grid/grid.d.ts +8 -0
  94. package/dist/grid/index.cjs +238 -0
  95. package/dist/grid/index.cjs.map +1 -0
  96. package/dist/grid/index.d.ts +2 -0
  97. package/dist/grid/index.js +19 -0
  98. package/dist/grid/index.js.map +1 -0
  99. package/dist/grid/types.d.ts +35 -0
  100. package/dist/index.cjs +2512 -0
  101. package/dist/index.cjs.map +1 -0
  102. package/dist/index.d.ts +13 -0
  103. package/dist/index.js +207 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/kernel/app.d.ts +26 -0
  106. package/dist/kernel/index.d.ts +3 -0
  107. package/dist/kernel/runtime.d.ts +5 -0
  108. package/dist/kernel/telemetry.d.ts +37 -0
  109. package/dist/navigation/index.d.ts +4 -0
  110. package/dist/navigation/matcher.d.ts +13 -0
  111. package/dist/navigation/react.d.ts +12 -0
  112. package/dist/navigation/service.d.ts +23 -0
  113. package/dist/navigation/types.d.ts +65 -0
  114. package/dist/query/index.cjs +361 -0
  115. package/dist/query/index.cjs.map +1 -0
  116. package/dist/query/index.d.ts +3 -0
  117. package/dist/query/index.js +30 -0
  118. package/dist/query/index.js.map +1 -0
  119. package/dist/query/react.d.ts +27 -0
  120. package/dist/query/service.d.ts +10 -0
  121. package/dist/query/types.d.ts +5 -0
  122. package/dist/react/index.d.ts +1 -0
  123. package/dist/react/provider.d.ts +10 -0
  124. package/dist/realtime/channel.d.ts +15 -0
  125. package/dist/realtime/index.cjs +117 -0
  126. package/dist/realtime/index.cjs.map +1 -0
  127. package/dist/realtime/index.d.ts +2 -0
  128. package/dist/realtime/index.js +15 -0
  129. package/dist/realtime/index.js.map +1 -0
  130. package/dist/realtime/presence.d.ts +22 -0
  131. package/dist/render/hydration.d.ts +24 -0
  132. package/dist/render/index.d.ts +2 -0
  133. package/dist/render/ssr.d.ts +13 -0
  134. package/dist/router/helpers.d.ts +26 -0
  135. package/dist/router/index.cjs +236 -0
  136. package/dist/router/index.cjs.map +1 -0
  137. package/dist/router/index.d.ts +4 -0
  138. package/dist/router/index.js +40 -0
  139. package/dist/router/index.js.map +1 -0
  140. package/dist/router/react.d.ts +5 -0
  141. package/dist/router/service.d.ts +5 -0
  142. package/dist/router/types.d.ts +1 -0
  143. package/dist/server/index.cjs +174 -0
  144. package/dist/server/index.cjs.map +1 -0
  145. package/dist/server/index.d.ts +16 -0
  146. package/dist/server/index.js +12 -0
  147. package/dist/server/index.js.map +1 -0
  148. package/dist/state/index.cjs +128 -0
  149. package/dist/state/index.cjs.map +1 -0
  150. package/dist/state/index.d.ts +2 -0
  151. package/dist/state/index.js +36 -0
  152. package/dist/state/index.js.map +1 -0
  153. package/dist/state/react.d.ts +3 -0
  154. package/dist/state/service.d.ts +28 -0
  155. package/dist/testing/index.cjs +970 -0
  156. package/dist/testing/index.cjs.map +1 -0
  157. package/dist/testing/index.d.ts +2 -0
  158. package/dist/testing/index.js +13 -0
  159. package/dist/testing/index.js.map +1 -0
  160. package/dist/virtual/index.cjs +160 -0
  161. package/dist/virtual/index.cjs.map +1 -0
  162. package/dist/virtual/index.d.ts +2 -0
  163. package/dist/virtual/index.js +21 -0
  164. package/dist/virtual/index.js.map +1 -0
  165. package/dist/virtual/types.d.ts +25 -0
  166. package/dist/virtual/virtual.d.ts +9 -0
  167. package/package.json +156 -0
@@ -0,0 +1,361 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/query/index.ts
21
+ var query_exports = {};
22
+ __export(query_exports, {
23
+ QueryRuntimeError: () => QueryRuntimeError,
24
+ defineQuery: () => defineQuery,
25
+ fetchQuery: () => fetchQuery2,
26
+ invalidate: () => invalidate,
27
+ invalidateQuery: () => invalidateQuery,
28
+ prefetch: () => prefetch,
29
+ prefetchQuery: () => prefetchQuery,
30
+ useInfiniteQuery: () => useInfiniteQuery,
31
+ useQuery: () => useQuery2,
32
+ useSuspenseQuery: () => useSuspenseQuery2
33
+ });
34
+ module.exports = __toCommonJS(query_exports);
35
+
36
+ // src/data/types.ts
37
+ var defineQuery = (definition) => definition;
38
+ var QueryRuntimeError = class extends Error {
39
+ constructor(messageText) {
40
+ super(messageText);
41
+ this.messageText = messageText;
42
+ this.name = "QueryRuntimeError";
43
+ }
44
+ _tag = "QueryRuntimeError";
45
+ };
46
+
47
+ // src/query/service.ts
48
+ var import_effect3 = require("effect");
49
+
50
+ // src/data/service.ts
51
+ var import_effect = require("effect");
52
+ var Data = class extends import_effect.Context.Tag("EffectReact/Data")() {
53
+ };
54
+ var fetchQuery = (definition, input, options) => import_effect.Effect.flatMap(Data, (service) => service.fetch(definition, input, options));
55
+
56
+ // src/data/react.tsx
57
+ var import_effect2 = require("effect");
58
+ var import_react2 = require("react");
59
+
60
+ // src/react/provider.tsx
61
+ var import_react = require("react");
62
+ var import_jsx_runtime = require("react/jsx-runtime");
63
+ var RuntimeContext = (0, import_react.createContext)(null);
64
+ var useEffectRuntime = () => {
65
+ const runtime = (0, import_react.useContext)(RuntimeContext);
66
+ if (runtime === null) {
67
+ throw new Error("Effect runtime is not available. Wrap your app with <EffectProvider>.");
68
+ }
69
+ return runtime;
70
+ };
71
+
72
+ // src/data/react.tsx
73
+ var useDataService = () => {
74
+ const runtime = useEffectRuntime();
75
+ return (0, import_react2.useMemo)(() => runtime.runSync(Data), [runtime]);
76
+ };
77
+ var useQuery = (definition, input, options = {}) => {
78
+ const runtime = useEffectRuntime();
79
+ const data = useDataService();
80
+ const subscribe = (0, import_react2.useCallback)(
81
+ (listener) => {
82
+ const fiber = runtime.runFork(
83
+ import_effect2.Stream.runForEach(data.snapshots, () => import_effect2.Effect.sync(listener))
84
+ );
85
+ return () => {
86
+ runtime.runFork(import_effect2.Fiber.interrupt(fiber));
87
+ };
88
+ },
89
+ [data, runtime]
90
+ );
91
+ const getSnapshot = (0, import_react2.useCallback)(
92
+ () => runtime.runSync(data.getSnapshot(definition, input)),
93
+ [data, definition, input, runtime]
94
+ );
95
+ const snapshot = (0, import_react2.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
96
+ (0, import_react2.useEffect)(() => {
97
+ if (options.enabled === false) {
98
+ return;
99
+ }
100
+ runtime.runFork(data.prefetch(definition, input));
101
+ }, [data, definition, input, options.enabled, runtime]);
102
+ const refetch = (0, import_react2.useCallback)(
103
+ () => runtime.runPromise(data.fetch(definition, input, { ...options.run, forceRefresh: true })),
104
+ [data, definition, input, options.run, runtime]
105
+ );
106
+ const invalidate2 = (0, import_react2.useCallback)(
107
+ () => runtime.runPromise(data.invalidate(definition, input)),
108
+ [data, definition, input, runtime]
109
+ );
110
+ return {
111
+ ...snapshot,
112
+ refetch,
113
+ invalidate: invalidate2
114
+ };
115
+ };
116
+ var useSuspenseQuery = (definition, input) => {
117
+ const result = useQuery(definition, input);
118
+ if (result.phase === "failure") {
119
+ throw result.error;
120
+ }
121
+ if (result.phase === "success") {
122
+ return result.data;
123
+ }
124
+ throw result.refetch();
125
+ };
126
+
127
+ // src/query/service.ts
128
+ var fetchQuery2 = fetchQuery;
129
+ var prefetchQuery = (definition, input) => import_effect3.Effect.flatMap(Data, (service) => service.prefetch(definition, input));
130
+ var invalidateQuery = (definition, input) => import_effect3.Effect.flatMap(Data, (service) => service.invalidate(definition, input));
131
+ var prefetch = prefetchQuery;
132
+ var invalidate = invalidateQuery;
133
+
134
+ // src/query/react.tsx
135
+ var import_effect4 = require("effect");
136
+ var import_react3 = require("react");
137
+ var upsertInfiniteEntry = (entries, nextEntry) => {
138
+ const index = entries.findIndex((entry) => entry.key === nextEntry.key);
139
+ if (index < 0) {
140
+ return [...entries, nextEntry];
141
+ }
142
+ const next = [...entries];
143
+ next[index] = nextEntry;
144
+ return next;
145
+ };
146
+ var useDataService2 = () => {
147
+ const runtime = useEffectRuntime();
148
+ return (0, import_react3.useMemo)(() => runtime.runSync(Data), [runtime]);
149
+ };
150
+ var useQuery2 = (definition, input, options = {}) => useQuery(definition, input, options);
151
+ var useSuspenseQuery2 = (definition, input) => useSuspenseQuery(definition, input);
152
+ var useInfiniteQuery = (definition, options) => {
153
+ const optionsRef = (0, import_react3.useRef)(options);
154
+ optionsRef.current = options;
155
+ const initialPageParam = options.initialPageParam;
156
+ const enabled = options.enabled;
157
+ const run = options.run;
158
+ const getInput = (0, import_react3.useCallback)(
159
+ (pageParam) => optionsRef.current.getInput(pageParam),
160
+ []
161
+ );
162
+ const getNextPageParam = (0, import_react3.useCallback)(
163
+ (lastPage, allPages, lastPageParam, allPageParams) => optionsRef.current.getNextPageParam(lastPage, allPages, lastPageParam, allPageParams),
164
+ []
165
+ );
166
+ const runtime = useEffectRuntime();
167
+ const data = useDataService2();
168
+ const [initialInput, setInitialInput] = (0, import_react3.useState)(
169
+ () => getInput(initialPageParam)
170
+ );
171
+ const [entries, setEntries] = (0, import_react3.useState)([]);
172
+ const [error, setError] = (0, import_react3.useState)(void 0);
173
+ const [isFetchingNextPage, setIsFetchingNextPage] = (0, import_react3.useState)(false);
174
+ const initialQuery = useQuery2(
175
+ definition,
176
+ initialInput,
177
+ {
178
+ ...enabled !== void 0 ? { enabled } : {},
179
+ ...run !== void 0 ? { run } : {}
180
+ }
181
+ );
182
+ (0, import_react3.useEffect)(() => {
183
+ setInitialInput(getInput(initialPageParam));
184
+ setEntries([]);
185
+ setError(void 0);
186
+ setIsFetchingNextPage(false);
187
+ }, [definition, getInput, initialPageParam]);
188
+ (0, import_react3.useEffect)(() => {
189
+ if (initialQuery.phase === "success") {
190
+ setEntries(
191
+ (current) => upsertInfiniteEntry(current, {
192
+ key: initialQuery.key,
193
+ pageParam: initialPageParam,
194
+ data: initialQuery.data
195
+ })
196
+ );
197
+ setError(void 0);
198
+ return;
199
+ }
200
+ if (initialQuery.phase === "failure") {
201
+ setError(initialQuery.error);
202
+ }
203
+ }, [
204
+ initialQuery.data,
205
+ initialQuery.error,
206
+ initialQuery.key,
207
+ initialQuery.phase,
208
+ initialPageParam
209
+ ]);
210
+ const pages = (0, import_react3.useMemo)(() => entries.map((entry) => entry.data), [entries]);
211
+ const pageParams = (0, import_react3.useMemo)(() => entries.map((entry) => entry.pageParam), [entries]);
212
+ const resolveNextPageParam = (0, import_react3.useCallback)(() => {
213
+ const lastEntry = entries[entries.length - 1];
214
+ if (lastEntry !== void 0) {
215
+ return getNextPageParam(lastEntry.data, pages, lastEntry.pageParam, pageParams);
216
+ }
217
+ if (initialQuery.phase !== "success") {
218
+ return void 0;
219
+ }
220
+ const initialPage = initialQuery.data;
221
+ return getNextPageParam(
222
+ initialPage,
223
+ [initialPage],
224
+ initialPageParam,
225
+ [initialPageParam]
226
+ );
227
+ }, [
228
+ entries,
229
+ getNextPageParam,
230
+ initialPageParam,
231
+ initialQuery.data,
232
+ initialQuery.phase,
233
+ pageParams,
234
+ pages
235
+ ]);
236
+ const fetchNextPage = (0, import_react3.useCallback)(() => {
237
+ const nextPageParam = resolveNextPageParam();
238
+ if (nextPageParam === void 0) {
239
+ return runtime.runPromise(import_effect4.Effect.succeed(void 0));
240
+ }
241
+ setIsFetchingNextPage(true);
242
+ setError(void 0);
243
+ const input = getInput(nextPageParam);
244
+ const program = import_effect4.Effect.gen(function* () {
245
+ const value = yield* data.fetch(definition, input, run);
246
+ const snapshot = yield* data.getSnapshot(definition, input);
247
+ return {
248
+ key: snapshot.key,
249
+ pageParam: nextPageParam,
250
+ value
251
+ };
252
+ });
253
+ return runtime.runPromise(program).then(
254
+ ({ key, pageParam, value }) => {
255
+ setEntries(
256
+ (current) => upsertInfiniteEntry(current, {
257
+ key,
258
+ pageParam,
259
+ data: value
260
+ })
261
+ );
262
+ setIsFetchingNextPage(false);
263
+ return value;
264
+ },
265
+ (cause) => {
266
+ setIsFetchingNextPage(false);
267
+ const resolved = cause;
268
+ setError(resolved);
269
+ return runtime.runPromise(import_effect4.Effect.fail(resolved));
270
+ }
271
+ );
272
+ }, [data, definition, getInput, resolveNextPageParam, run, runtime]);
273
+ const refetch = (0, import_react3.useCallback)(() => {
274
+ const targets = pageParams.length === 0 ? [initialPageParam] : pageParams;
275
+ setError(void 0);
276
+ const program = import_effect4.Effect.forEach(
277
+ targets,
278
+ (pageParam) => {
279
+ const input = getInput(pageParam);
280
+ return import_effect4.Effect.gen(function* () {
281
+ const value = yield* data.fetch(definition, input, {
282
+ ...run,
283
+ forceRefresh: true
284
+ });
285
+ const snapshot = yield* data.getSnapshot(definition, input);
286
+ return {
287
+ key: snapshot.key,
288
+ pageParam,
289
+ data: value
290
+ };
291
+ });
292
+ },
293
+ {
294
+ concurrency: 1,
295
+ discard: false
296
+ }
297
+ );
298
+ return runtime.runPromise(program).then(
299
+ (fetchedEntries) => {
300
+ setEntries(fetchedEntries);
301
+ return fetchedEntries.map((entry) => entry.data);
302
+ },
303
+ (cause) => {
304
+ const resolved = cause;
305
+ setError(resolved);
306
+ return runtime.runPromise(import_effect4.Effect.fail(resolved));
307
+ }
308
+ );
309
+ }, [data, definition, getInput, initialPageParam, pageParams, run, runtime]);
310
+ const invalidate2 = (0, import_react3.useCallback)(() => {
311
+ const targets = pageParams.length === 0 ? [initialPageParam] : pageParams;
312
+ const program = import_effect4.Effect.forEach(
313
+ targets,
314
+ (pageParam) => data.invalidate(definition, getInput(pageParam)),
315
+ {
316
+ concurrency: 1,
317
+ discard: true
318
+ }
319
+ );
320
+ return runtime.runPromise(program).then(
321
+ () => {
322
+ setEntries([]);
323
+ setError(void 0);
324
+ setIsFetchingNextPage(false);
325
+ return void 0;
326
+ },
327
+ (cause) => {
328
+ const resolved = cause;
329
+ setError(resolved);
330
+ return runtime.runPromise(import_effect4.Effect.fail(resolved));
331
+ }
332
+ );
333
+ }, [data, definition, getInput, initialPageParam, pageParams, runtime]);
334
+ const resolvedError = error ?? (initialQuery.phase === "failure" ? initialQuery.error : void 0);
335
+ const phase = resolvedError !== void 0 ? "failure" : entries.length > 0 ? "success" : initialQuery.phase;
336
+ return {
337
+ phase,
338
+ pages,
339
+ pageParams,
340
+ error: resolvedError,
341
+ hasNextPage: resolveNextPageParam() !== void 0,
342
+ isFetchingNextPage,
343
+ fetchNextPage,
344
+ refetch,
345
+ invalidate: invalidate2
346
+ };
347
+ };
348
+ // Annotate the CommonJS export names for ESM import in node:
349
+ 0 && (module.exports = {
350
+ QueryRuntimeError,
351
+ defineQuery,
352
+ fetchQuery,
353
+ invalidate,
354
+ invalidateQuery,
355
+ prefetch,
356
+ prefetchQuery,
357
+ useInfiniteQuery,
358
+ useQuery,
359
+ useSuspenseQuery
360
+ });
361
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/query/index.ts","../../src/data/types.ts","../../src/query/service.ts","../../src/data/service.ts","../../src/data/react.tsx","../../src/react/provider.tsx","../../src/query/react.tsx"],"sourcesContent":["export * from \"./types\";\nexport * from \"./service\";\nexport * from \"./react\";\n","import type { Duration, Effect, Schema } from \"effect\";\nimport type { BoundaryDecodeError } from \"../boundary\";\nimport type { BoundaryProtocolError } from \"../boundary/errors\";\n\nexport interface QueryDefinition<\n Name extends string,\n Input,\n Output,\n E,\n InputEncoded = Input,\n OutputEncoded = Output,\n> {\n readonly name: Name;\n readonly input: Schema.Schema<Input, InputEncoded, never>;\n readonly output: Schema.Schema<Output, OutputEncoded, never>;\n readonly run: (input: Input) => Effect.Effect<Output, E, never>;\n readonly key?: (input: Input) => unknown;\n}\n\nexport const defineQuery = <\n Name extends string,\n Input,\n Output,\n E,\n InputEncoded = Input,\n OutputEncoded = Output,\n>(\n definition: QueryDefinition<Name, Input, Output, E, InputEncoded, OutputEncoded>,\n): QueryDefinition<Name, Input, Output, E, InputEncoded, OutputEncoded> => definition;\n\nexport type QueryPhase = \"initial\" | \"loading\" | \"success\" | \"failure\";\n\nexport interface QuerySnapshot<Output, E> {\n readonly key: string;\n readonly phase: QueryPhase;\n readonly data: Output | undefined;\n readonly error: E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError | undefined;\n readonly updatedAt: number | null | undefined;\n}\n\nexport interface QueryRunOptions {\n readonly forceRefresh?: boolean;\n}\n\nexport interface QueryRuntimeOptions {\n readonly capacity?: number;\n readonly timeToLive?: Duration.DurationInput;\n}\n\nexport class QueryRuntimeError extends Error {\n readonly _tag = \"QueryRuntimeError\" as const;\n\n constructor(readonly messageText: string) {\n super(messageText);\n this.name = \"QueryRuntimeError\";\n }\n}\n","import { Effect } from \"effect\";\nimport { Data, fetchQuery as fetchDataQuery } from \"../data\";\nimport type { BoundaryDecodeError } from \"../boundary\";\nimport type { BoundaryProtocolError } from \"../boundary/errors\";\nimport type { QueryDefinition, QueryRuntimeError } from \"./types\";\n\nexport const fetchQuery = fetchDataQuery;\n\nexport const prefetchQuery = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n): Effect.Effect<void, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, Data> =>\n Effect.flatMap(Data, (service) => service.prefetch(definition, input));\n\nexport const invalidateQuery = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n): Effect.Effect<void, QueryRuntimeError, Data> =>\n Effect.flatMap(Data, (service) => service.invalidate(definition, input));\n\nexport const prefetch = prefetchQuery;\nexport const invalidate = invalidateQuery;\n","import {\n Cache,\n Context,\n Effect,\n Layer,\n SubscriptionRef,\n type Stream,\n} from \"effect\";\nimport { Boundary, type BoundaryDecodeError } from \"../boundary\";\nimport type { BoundaryProtocolError } from \"../boundary/errors\";\nimport { Telemetry } from \"../kernel/telemetry\";\nimport {\n type QueryDefinition,\n type QueryRunOptions,\n type QueryRuntimeOptions,\n type QuerySnapshot,\n QueryRuntimeError,\n} from \"./types\";\n\nconst defaultRuntimeOptions: Required<QueryRuntimeOptions> = {\n capacity: 2048,\n timeToLive: \"5 minutes\",\n};\n\nconst stableStringify = (value: unknown): string => {\n if (value === null || value === undefined) {\n return String(value);\n }\n\n if (typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n return `{${entries.map(([key, nested]) => `${JSON.stringify(key)}:${stableStringify(nested)}`).join(\",\")}}`;\n};\n\nconst initialSnapshot = <Output, E>(key: string): QuerySnapshot<Output, E> => ({\n key,\n phase: \"initial\",\n data: undefined,\n error: undefined,\n updatedAt: null,\n});\n\nexport interface DataService {\n readonly fetch: <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n options?: QueryRunOptions,\n ) => Effect.Effect<Output, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, never>;\n readonly prefetch: <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n ) => Effect.Effect<void, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, never>;\n readonly invalidate: <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n ) => Effect.Effect<void, QueryRuntimeError, never>;\n readonly getSnapshot: <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n ) => Effect.Effect<QuerySnapshot<Output, E>, never, never>;\n readonly getAllSnapshots: Effect.Effect<ReadonlyMap<string, QuerySnapshot<unknown, unknown>>, never, never>;\n readonly hydrateSnapshots: (\n snapshots: ReadonlyMap<string, QuerySnapshot<unknown, unknown>>,\n ) => Effect.Effect<void, never, never>;\n readonly snapshots: Stream.Stream<ReadonlyMap<string, QuerySnapshot<unknown, unknown>>>;\n}\n\nexport class Data extends Context.Tag(\"EffectReact/Data\")<Data, DataService>() {}\n\nexport const makeDataLayer = (\n options: QueryRuntimeOptions = {},\n): Layer.Layer<Data, never, Boundary | Telemetry> => {\n const merged = {\n ...defaultRuntimeOptions,\n ...options,\n };\n\n return Layer.effect(\n Data,\n Effect.gen(function* () {\n const boundary = yield* Boundary;\n const telemetry = yield* Telemetry;\n const lookups = new Map<string, Effect.Effect<unknown, unknown, never>>();\n const snapshots = yield* SubscriptionRef.make(\n new Map<string, QuerySnapshot<unknown, unknown>>() as ReadonlyMap<\n string,\n QuerySnapshot<unknown, unknown>\n >,\n );\n\n const cache = yield* Cache.make<string, unknown, unknown>({\n capacity: merged.capacity,\n timeToLive: merged.timeToLive,\n lookup: (key) =>\n Effect.suspend(() => {\n const lookup = lookups.get(key);\n if (lookup === undefined) {\n return Effect.fail(new QueryRuntimeError(`No query executor registered for ${key}`));\n }\n return lookup;\n }),\n });\n\n const setSnapshot = <Output, E>(\n key: string,\n update: (previous: QuerySnapshot<Output, E>) => QuerySnapshot<Output, E>,\n ): Effect.Effect<void> =>\n SubscriptionRef.update(snapshots, (current) => {\n const next = new Map(current);\n const previous =\n (next.get(key) as QuerySnapshot<Output, E> | undefined) ?? initialSnapshot<Output, E>(key);\n next.set(key, update(previous));\n return next;\n }).pipe(Effect.asVoid);\n\n const buildKey = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: Input,\n ): string => {\n const base = definition.key ? definition.key(input) : input;\n return `${definition.name}:${stableStringify(base)}`;\n };\n\n const fetch = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n runOptions?: QueryRunOptions,\n ): Effect.Effect<\n Output,\n E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError,\n never\n > =>\n Effect.gen(function* () {\n const decodedInput = yield* boundary.decodeUnknown({\n source: `query:${definition.name}:input`,\n schema: definition.input,\n value: input,\n });\n\n const key = buildKey(definition, decodedInput);\n yield* telemetry.emit({\n _tag: \"query\",\n phase: \"start\",\n key,\n timestamp: Date.now(),\n });\n\n yield* setSnapshot(key, (previous) => ({\n ...previous,\n phase: \"loading\",\n error: undefined,\n }));\n\n lookups.set(\n key,\n definition\n .run(decodedInput)\n .pipe(\n Effect.flatMap((output) =>\n boundary.decodeUnknown({\n source: `query:${definition.name}:output`,\n schema: definition.output,\n value: output,\n }),\n ),\n ) as Effect.Effect<unknown, unknown, never>,\n );\n\n if (runOptions?.forceRefresh === true) {\n yield* cache.refresh(key).pipe(Effect.ignore);\n }\n\n const value = yield* cache.get(key).pipe(\n Effect.mapError(\n (error) =>\n error as E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError,\n ),\n );\n\n yield* setSnapshot(key, () => ({\n key,\n phase: \"success\",\n data: value,\n error: undefined,\n updatedAt: Date.now(),\n }));\n\n yield* telemetry.emit({\n _tag: \"query\",\n phase: \"success\",\n key,\n timestamp: Date.now(),\n });\n\n return value as Output;\n }).pipe(\n Effect.tapError((error) =>\n Effect.gen(function* () {\n const decodedInput = yield* boundary.decodeUnknown({\n source: `query:${definition.name}:input`,\n schema: definition.input,\n value: input,\n });\n const key = buildKey(definition, decodedInput);\n yield* setSnapshot(key, (previous) => ({\n ...previous,\n phase: \"failure\",\n error,\n updatedAt: previous.updatedAt,\n }));\n yield* telemetry.emit({\n _tag: \"query\",\n phase: \"failure\",\n key,\n timestamp: Date.now(),\n detail: error,\n });\n }),\n ),\n );\n\n const prefetch: DataService[\"prefetch\"] = (definition, input) =>\n fetch(definition, input).pipe(Effect.asVoid);\n\n const invalidate: DataService[\"invalidate\"] = (definition, input) =>\n Effect.gen(function* () {\n const key = `${definition.name}:${stableStringify(input)}`;\n yield* cache.invalidate(key);\n yield* SubscriptionRef.update(snapshots, (current) => {\n const next = new Map(current);\n next.delete(key);\n return next;\n }).pipe(Effect.asVoid);\n yield* telemetry.emit({\n _tag: \"query\",\n phase: \"invalidate\",\n key,\n timestamp: Date.now(),\n });\n });\n\n const getSnapshot = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n ): Effect.Effect<QuerySnapshot<Output, E>, never, never> =>\n Effect.gen(function* () {\n const key = `${definition.name}:${stableStringify(input)}`;\n const current = yield* SubscriptionRef.get(snapshots);\n const snapshot = current.get(key);\n if (snapshot === undefined) {\n return initialSnapshot<Output, E>(key);\n }\n return snapshot as QuerySnapshot<Output, E>;\n });\n\n return {\n fetch,\n prefetch,\n invalidate,\n getSnapshot,\n getAllSnapshots: SubscriptionRef.get(snapshots),\n hydrateSnapshots: (nextSnapshots) => SubscriptionRef.set(snapshots, new Map(nextSnapshots)),\n snapshots: snapshots.changes,\n } satisfies DataService;\n }),\n );\n};\n\nexport const fetchQuery = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n options?: QueryRunOptions,\n): Effect.Effect<Output, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, Data> =>\n Effect.flatMap(Data, (service) => service.fetch(definition, input, options));\n","import { Effect, Fiber, Stream } from \"effect\";\nimport { useCallback, useEffect, useMemo, useSyncExternalStore } from \"react\";\nimport { useEffectRuntime } from \"../react/provider\";\nimport { Data } from \"./service\";\nimport type { QueryDefinition, QueryRunOptions, QuerySnapshot } from \"./types\";\n\nconst useDataService = () => {\n const runtime = useEffectRuntime();\n return useMemo(() => runtime.runSync(Data), [runtime]);\n};\n\nexport interface UseQueryOptions {\n readonly enabled?: boolean;\n readonly run?: QueryRunOptions;\n}\n\nexport const useQuery = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n options: UseQueryOptions = {},\n): QuerySnapshot<Output, E> & {\n readonly refetch: () => Promise<Output>;\n readonly invalidate: () => Promise<void>;\n} => {\n const runtime = useEffectRuntime();\n const data = useDataService();\n\n const subscribe = useCallback(\n (listener: () => void) => {\n const fiber = runtime.runFork(\n Stream.runForEach(data.snapshots, () => Effect.sync(listener)),\n );\n\n return () => {\n runtime.runFork(Fiber.interrupt(fiber));\n };\n },\n [data, runtime],\n );\n\n const getSnapshot = useCallback(\n () => runtime.runSync(data.getSnapshot(definition, input)) as QuerySnapshot<Output, E>,\n [data, definition, input, runtime],\n );\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n useEffect(() => {\n if (options.enabled === false) {\n return;\n }\n runtime.runFork(data.prefetch(definition, input));\n }, [data, definition, input, options.enabled, runtime]);\n\n const refetch = useCallback(\n () => runtime.runPromise(data.fetch(definition, input, { ...options.run, forceRefresh: true })),\n [data, definition, input, options.run, runtime],\n );\n\n const invalidate = useCallback(\n () => runtime.runPromise(data.invalidate(definition, input)),\n [data, definition, input, runtime],\n );\n\n return {\n ...snapshot,\n refetch,\n invalidate,\n };\n};\n\nexport const useSuspenseQuery = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n): Output => {\n const result = useQuery(definition, input);\n if (result.phase === \"failure\") {\n throw result.error;\n }\n if (result.phase === \"success\") {\n return result.data as Output;\n }\n throw result.refetch();\n};\n","import type { ManagedRuntime } from \"effect\";\nimport { createContext, useContext, useEffect, type ReactNode } from \"react\";\nimport type { AppServices } from \"../kernel/app\";\n\nexport type EffectReactManagedRuntime<R = AppServices> = ManagedRuntime.ManagedRuntime<R, never>;\n\nconst RuntimeContext = createContext<EffectReactManagedRuntime | null>(null);\n\nexport interface EffectProviderProps {\n readonly runtime: EffectReactManagedRuntime;\n readonly children?: ReactNode;\n}\n\nexport const EffectProvider = ({ runtime, children }: EffectProviderProps) => {\n useEffect(\n () => () => {\n void runtime.dispose();\n },\n [runtime],\n );\n\n return <RuntimeContext.Provider value={runtime}>{children}</RuntimeContext.Provider>;\n};\n\nexport const useEffectRuntime = (): EffectReactManagedRuntime => {\n const runtime = useContext(RuntimeContext);\n if (runtime === null) {\n throw new Error(\"Effect runtime is not available. Wrap your app with <EffectProvider>.\");\n }\n return runtime;\n};\n","import { Effect } from \"effect\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useQuery as useDataQuery,\n useSuspenseQuery as useDataSuspenseQuery,\n type UseQueryOptions,\n} from \"../data\";\nimport { Data } from \"../data\";\nimport { useEffectRuntime } from \"../react/provider\";\nimport type {\n QueryDefinition,\n QueryError,\n QueryPhase,\n QueryRunOptions,\n} from \"./types\";\n\ninterface InfiniteQueryEntry<Output, PageParam> {\n readonly key: string;\n readonly pageParam: PageParam;\n readonly data: Output;\n}\n\nconst upsertInfiniteEntry = <Output, PageParam>(\n entries: readonly InfiniteQueryEntry<Output, PageParam>[],\n nextEntry: InfiniteQueryEntry<Output, PageParam>,\n): readonly InfiniteQueryEntry<Output, PageParam>[] => {\n const index = entries.findIndex((entry) => entry.key === nextEntry.key);\n if (index < 0) {\n return [...entries, nextEntry];\n }\n const next = [...entries];\n next[index] = nextEntry;\n return next;\n};\n\nconst useDataService = () => {\n const runtime = useEffectRuntime();\n return useMemo(() => runtime.runSync(Data), [runtime]);\n};\n\nexport { type UseQueryOptions };\n\nexport const useQuery = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n options: UseQueryOptions = {},\n) => useDataQuery(definition, input, options);\n\nexport const useSuspenseQuery = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n): Output => useDataSuspenseQuery(definition, input);\n\nexport interface UseInfiniteQueryOptions<Input, Output, PageParam> {\n readonly initialPageParam: PageParam;\n readonly getInput: (pageParam: PageParam) => Input;\n readonly getNextPageParam: (\n lastPage: Output,\n allPages: readonly Output[],\n lastPageParam: PageParam,\n allPageParams: readonly PageParam[],\n ) => PageParam | undefined;\n readonly enabled?: boolean;\n readonly run?: QueryRunOptions;\n}\n\nexport interface UseInfiniteQueryResult<Output, E, PageParam> {\n readonly phase: QueryPhase;\n readonly pages: readonly Output[];\n readonly pageParams: readonly PageParam[];\n readonly error: QueryError<E> | undefined;\n readonly hasNextPage: boolean;\n readonly isFetchingNextPage: boolean;\n readonly fetchNextPage: () => Promise<Output | undefined>;\n readonly refetch: () => Promise<readonly Output[]>;\n readonly invalidate: () => Promise<void>;\n}\n\nexport const useInfiniteQuery = <Name extends string, Input, Output, E, PageParam>(\n definition: QueryDefinition<Name, Input, Output, E>,\n options: UseInfiniteQueryOptions<Input, Output, PageParam>,\n): UseInfiniteQueryResult<Output, E, PageParam> => {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const initialPageParam = options.initialPageParam;\n const enabled = options.enabled;\n const run = options.run;\n\n const getInput = useCallback(\n (pageParam: PageParam): Input => optionsRef.current.getInput(pageParam),\n [],\n );\n\n const getNextPageParam = useCallback(\n (\n lastPage: Output,\n allPages: readonly Output[],\n lastPageParam: PageParam,\n allPageParams: readonly PageParam[],\n ): PageParam | undefined =>\n optionsRef.current.getNextPageParam(lastPage, allPages, lastPageParam, allPageParams),\n [],\n );\n\n const runtime = useEffectRuntime();\n const data = useDataService();\n const [initialInput, setInitialInput] = useState<Input>(() =>\n getInput(initialPageParam),\n );\n const [entries, setEntries] = useState<readonly InfiniteQueryEntry<Output, PageParam>[]>([]);\n const [error, setError] = useState<QueryError<E> | undefined>(undefined);\n const [isFetchingNextPage, setIsFetchingNextPage] = useState(false);\n\n const initialQuery = useQuery(\n definition,\n initialInput,\n {\n ...(enabled !== undefined ? { enabled } : {}),\n ...(run !== undefined ? { run } : {}),\n },\n );\n\n useEffect(() => {\n setInitialInput(getInput(initialPageParam));\n setEntries([]);\n setError(undefined);\n setIsFetchingNextPage(false);\n }, [definition, getInput, initialPageParam]);\n\n useEffect(() => {\n if (initialQuery.phase === \"success\") {\n setEntries((current) =>\n upsertInfiniteEntry(current, {\n key: initialQuery.key,\n pageParam: initialPageParam,\n data: initialQuery.data as Output,\n }),\n );\n setError(undefined);\n return;\n }\n if (initialQuery.phase === \"failure\") {\n setError(initialQuery.error as QueryError<E>);\n }\n }, [\n initialQuery.data,\n initialQuery.error,\n initialQuery.key,\n initialQuery.phase,\n initialPageParam,\n ]);\n\n const pages = useMemo(() => entries.map((entry) => entry.data), [entries]);\n const pageParams = useMemo(() => entries.map((entry) => entry.pageParam), [entries]);\n\n const resolveNextPageParam = useCallback((): PageParam | undefined => {\n const lastEntry = entries[entries.length - 1];\n if (lastEntry !== undefined) {\n return getNextPageParam(lastEntry.data, pages, lastEntry.pageParam, pageParams);\n }\n if (initialQuery.phase !== \"success\") {\n return undefined;\n }\n const initialPage = initialQuery.data as Output;\n return getNextPageParam(\n initialPage,\n [initialPage],\n initialPageParam,\n [initialPageParam],\n );\n }, [\n entries,\n getNextPageParam,\n initialPageParam,\n initialQuery.data,\n initialQuery.phase,\n pageParams,\n pages,\n ]);\n\n const fetchNextPage = useCallback((): Promise<Output | undefined> => {\n const nextPageParam = resolveNextPageParam();\n if (nextPageParam === undefined) {\n return runtime.runPromise(Effect.succeed<Output | undefined>(undefined));\n }\n\n setIsFetchingNextPage(true);\n setError(undefined);\n\n const input = getInput(nextPageParam);\n const program = Effect.gen(function* () {\n const value = yield* data.fetch(definition, input, run);\n const snapshot = yield* data.getSnapshot(definition, input);\n return {\n key: snapshot.key,\n pageParam: nextPageParam,\n value,\n };\n });\n\n return runtime.runPromise(program).then(\n ({ key, pageParam, value }) => {\n setEntries((current) =>\n upsertInfiniteEntry(current, {\n key,\n pageParam,\n data: value,\n }),\n );\n setIsFetchingNextPage(false);\n return value;\n },\n (cause: unknown) => {\n setIsFetchingNextPage(false);\n const resolved = cause as QueryError<E>;\n setError(resolved);\n return runtime.runPromise(Effect.fail(resolved));\n },\n );\n }, [data, definition, getInput, resolveNextPageParam, run, runtime]);\n\n const refetch = useCallback((): Promise<readonly Output[]> => {\n const targets = pageParams.length === 0\n ? [initialPageParam]\n : pageParams;\n\n setError(undefined);\n\n const program = Effect.forEach(\n targets,\n (pageParam) => {\n const input = getInput(pageParam);\n return Effect.gen(function* () {\n const value = yield* data.fetch(definition, input, {\n ...run,\n forceRefresh: true,\n });\n const snapshot = yield* data.getSnapshot(definition, input);\n return {\n key: snapshot.key,\n pageParam,\n data: value,\n } satisfies InfiniteQueryEntry<Output, PageParam>;\n });\n },\n {\n concurrency: 1,\n discard: false,\n },\n );\n\n return runtime.runPromise(program).then(\n (fetchedEntries) => {\n setEntries(fetchedEntries);\n return fetchedEntries.map((entry) => entry.data);\n },\n (cause: unknown) => {\n const resolved = cause as QueryError<E>;\n setError(resolved);\n return runtime.runPromise(Effect.fail(resolved));\n },\n );\n }, [data, definition, getInput, initialPageParam, pageParams, run, runtime]);\n\n const invalidate = useCallback((): Promise<void> => {\n const targets = pageParams.length === 0\n ? [initialPageParam]\n : pageParams;\n\n const program = Effect.forEach(\n targets,\n (pageParam) => data.invalidate(definition, getInput(pageParam)),\n {\n concurrency: 1,\n discard: true,\n },\n );\n\n return runtime.runPromise(program).then(\n () => {\n setEntries([]);\n setError(undefined);\n setIsFetchingNextPage(false);\n return undefined;\n },\n (cause: unknown) => {\n const resolved = cause as QueryError<E>;\n setError(resolved);\n return runtime.runPromise(Effect.fail(resolved));\n },\n );\n }, [data, definition, getInput, initialPageParam, pageParams, runtime]);\n\n const resolvedError = error ??\n (initialQuery.phase === \"failure\" ? (initialQuery.error as QueryError<E>) : undefined);\n\n const phase: QueryPhase = resolvedError !== undefined\n ? \"failure\"\n : entries.length > 0\n ? \"success\"\n : initialQuery.phase;\n\n return {\n phase,\n pages,\n pageParams,\n error: resolvedError,\n hasNextPage: resolveNextPageParam() !== undefined,\n isFetchingNextPage,\n fetchNextPage,\n refetch,\n invalidate,\n };\n};\n"],"mappings":"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","names":["fetchQuery","useQuery","useSuspenseQuery","import_effect","import_effect","import_react","invalidate","fetchQuery","import_effect","import_react","useDataService","useQuery","useSuspenseQuery","useDataService","invalidate"]}
@@ -0,0 +1,3 @@
1
+ export * from "./types";
2
+ export * from "./service";
3
+ export * from "./react";
@@ -0,0 +1,30 @@
1
+ import {
2
+ fetchQuery,
3
+ invalidate,
4
+ invalidateQuery,
5
+ prefetch,
6
+ prefetchQuery,
7
+ useInfiniteQuery,
8
+ useQuery,
9
+ useSuspenseQuery
10
+ } from "../chunk-H7MOLKTU.js";
11
+ import "../chunk-2GIUCKL2.js";
12
+ import {
13
+ QueryRuntimeError,
14
+ defineQuery
15
+ } from "../chunk-C5JI7D7W.js";
16
+ import "../chunk-YG22YP5K.js";
17
+ import "../chunk-SKC3HMF3.js";
18
+ export {
19
+ QueryRuntimeError,
20
+ defineQuery,
21
+ fetchQuery,
22
+ invalidate,
23
+ invalidateQuery,
24
+ prefetch,
25
+ prefetchQuery,
26
+ useInfiniteQuery,
27
+ useQuery,
28
+ useSuspenseQuery
29
+ };
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,27 @@
1
+ import { type UseQueryOptions } from "../data";
2
+ import type { QueryDefinition, QueryError, QueryPhase, QueryRunOptions } from "./types";
3
+ export { type UseQueryOptions };
4
+ export declare const useQuery: <Name extends string, Input, Output, E>(definition: QueryDefinition<Name, Input, Output, E>, input: unknown, options?: UseQueryOptions) => import("./types").QuerySnapshot<Output, E> & {
5
+ readonly refetch: () => Promise<Output>;
6
+ readonly invalidate: () => Promise<void>;
7
+ };
8
+ export declare const useSuspenseQuery: <Name extends string, Input, Output, E>(definition: QueryDefinition<Name, Input, Output, E>, input: unknown) => Output;
9
+ export interface UseInfiniteQueryOptions<Input, Output, PageParam> {
10
+ readonly initialPageParam: PageParam;
11
+ readonly getInput: (pageParam: PageParam) => Input;
12
+ readonly getNextPageParam: (lastPage: Output, allPages: readonly Output[], lastPageParam: PageParam, allPageParams: readonly PageParam[]) => PageParam | undefined;
13
+ readonly enabled?: boolean;
14
+ readonly run?: QueryRunOptions;
15
+ }
16
+ export interface UseInfiniteQueryResult<Output, E, PageParam> {
17
+ readonly phase: QueryPhase;
18
+ readonly pages: readonly Output[];
19
+ readonly pageParams: readonly PageParam[];
20
+ readonly error: QueryError<E> | undefined;
21
+ readonly hasNextPage: boolean;
22
+ readonly isFetchingNextPage: boolean;
23
+ readonly fetchNextPage: () => Promise<Output | undefined>;
24
+ readonly refetch: () => Promise<readonly Output[]>;
25
+ readonly invalidate: () => Promise<void>;
26
+ }
27
+ export declare const useInfiniteQuery: <Name extends string, Input, Output, E, PageParam>(definition: QueryDefinition<Name, Input, Output, E>, options: UseInfiniteQueryOptions<Input, Output, PageParam>) => UseInfiniteQueryResult<Output, E, PageParam>;
@@ -0,0 +1,10 @@
1
+ import { Effect } from "effect";
2
+ import { Data } from "../data";
3
+ import type { BoundaryDecodeError } from "../boundary";
4
+ import type { BoundaryProtocolError } from "../boundary/errors";
5
+ import type { QueryDefinition, QueryRuntimeError } from "./types";
6
+ export declare const fetchQuery: <Name extends string, Input, Output, E>(definition: QueryDefinition<Name, Input, Output, E>, input: unknown, options?: import("./types").QueryRunOptions) => Effect.Effect<Output, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, Data>;
7
+ export declare const prefetchQuery: <Name extends string, Input, Output, E>(definition: QueryDefinition<Name, Input, Output, E>, input: unknown) => Effect.Effect<void, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, Data>;
8
+ export declare const invalidateQuery: <Name extends string, Input, Output, E>(definition: QueryDefinition<Name, Input, Output, E>, input: unknown) => Effect.Effect<void, QueryRuntimeError, Data>;
9
+ export declare const prefetch: <Name extends string, Input, Output, E>(definition: QueryDefinition<Name, Input, Output, E>, input: unknown) => Effect.Effect<void, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, Data>;
10
+ export declare const invalidate: <Name extends string, Input, Output, E>(definition: QueryDefinition<Name, Input, Output, E>, input: unknown) => Effect.Effect<void, QueryRuntimeError, Data>;
@@ -0,0 +1,5 @@
1
+ import type { BoundaryDecodeError } from "../boundary";
2
+ import type { BoundaryProtocolError } from "../boundary/errors";
3
+ import type { QueryRuntimeError } from "../data/types";
4
+ export { defineQuery, QueryRuntimeError, type QueryDefinition, type QueryPhase, type QuerySnapshot, type QueryRunOptions, type QueryRuntimeOptions, } from "../data/types";
5
+ export type QueryError<E> = E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError;
@@ -0,0 +1 @@
1
+ export * from "./provider";
@@ -0,0 +1,10 @@
1
+ import type { ManagedRuntime } from "effect";
2
+ import { type ReactNode } from "react";
3
+ import type { AppServices } from "../kernel/app";
4
+ export type EffectReactManagedRuntime<R = AppServices> = ManagedRuntime.ManagedRuntime<R, never>;
5
+ export interface EffectProviderProps {
6
+ readonly runtime: EffectReactManagedRuntime;
7
+ readonly children?: ReactNode;
8
+ }
9
+ export declare const EffectProvider: ({ runtime, children }: EffectProviderProps) => import("react/jsx-runtime").JSX.Element;
10
+ export declare const useEffectRuntime: () => EffectReactManagedRuntime;
@@ -0,0 +1,15 @@
1
+ import { Effect, Stream } from "effect";
2
+ export interface CreateChannelOptions {
3
+ readonly replay?: number;
4
+ }
5
+ export interface RealtimeChannel<Message> {
6
+ readonly publish: (message: Message) => Effect.Effect<void>;
7
+ readonly publishAll: (messages: Iterable<Message>) => Effect.Effect<void>;
8
+ readonly subscribe: () => Stream.Stream<Message>;
9
+ readonly stream: Stream.Stream<Message>;
10
+ readonly shutdown: Effect.Effect<void>;
11
+ }
12
+ export declare const createChannel: <Message>(options?: CreateChannelOptions) => Effect.Effect<RealtimeChannel<Message>>;
13
+ export declare const publish: <Message>(channel: RealtimeChannel<Message>, message: Message) => Effect.Effect<void>;
14
+ export declare const publishAll: <Message>(channel: RealtimeChannel<Message>, messages: Iterable<Message>) => Effect.Effect<void>;
15
+ export declare const subscribe: <Message>(channel: RealtimeChannel<Message>) => Stream.Stream<Message>;