@effect-app/vue 4.0.0-beta.31 → 4.0.0-beta.310

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 (141) hide show
  1. package/CHANGELOG.md +2306 -0
  2. package/dist/atomQuery.d.ts +119 -0
  3. package/dist/atomQuery.d.ts.map +1 -0
  4. package/dist/atomQuery.js +422 -0
  5. package/dist/commander.d.ts +634 -0
  6. package/dist/commander.d.ts.map +1 -0
  7. package/dist/commander.js +1070 -0
  8. package/dist/{experimental/confirm.d.ts → confirm.d.ts} +6 -4
  9. package/dist/confirm.d.ts.map +1 -0
  10. package/dist/confirm.js +26 -0
  11. package/dist/dependencyMetadata.d.ts +18 -0
  12. package/dist/dependencyMetadata.d.ts.map +1 -0
  13. package/dist/dependencyMetadata.js +67 -0
  14. package/dist/errorReporter.d.ts +6 -4
  15. package/dist/errorReporter.d.ts.map +1 -1
  16. package/dist/errorReporter.js +14 -19
  17. package/dist/form.d.ts +14 -5
  18. package/dist/form.d.ts.map +1 -1
  19. package/dist/form.js +46 -13
  20. package/dist/internal/tanstackQuery.d.ts +9 -0
  21. package/dist/internal/tanstackQuery.d.ts.map +1 -0
  22. package/dist/internal/tanstackQuery.js +200 -0
  23. package/dist/intl.d.ts +15 -0
  24. package/dist/intl.d.ts.map +1 -0
  25. package/dist/intl.js +9 -0
  26. package/dist/lib.d.ts +7 -9
  27. package/dist/lib.d.ts.map +1 -1
  28. package/dist/lib.js +35 -10
  29. package/dist/liveQueryInvalidation.d.ts +16 -0
  30. package/dist/liveQueryInvalidation.d.ts.map +1 -0
  31. package/dist/liveQueryInvalidation.js +115 -0
  32. package/dist/makeClient.d.ts +236 -336
  33. package/dist/makeClient.d.ts.map +1 -1
  34. package/dist/makeClient.js +417 -408
  35. package/dist/makeContext.d.ts.map +1 -1
  36. package/dist/makeIntl.d.ts.map +1 -1
  37. package/dist/{experimental/makeUseCommand.d.ts → makeUseCommand.d.ts} +4 -3
  38. package/dist/makeUseCommand.d.ts.map +1 -0
  39. package/dist/makeUseCommand.js +13 -0
  40. package/dist/mutate.d.ts +109 -40
  41. package/dist/mutate.d.ts.map +1 -1
  42. package/dist/mutate.js +224 -58
  43. package/dist/query.d.ts +158 -45
  44. package/dist/query.d.ts.map +1 -1
  45. package/dist/query.js +380 -122
  46. package/dist/routeParams.d.ts +4 -4
  47. package/dist/routeParams.d.ts.map +1 -1
  48. package/dist/routeParams.js +4 -3
  49. package/dist/runtime.d.ts +1 -14
  50. package/dist/runtime.d.ts.map +1 -1
  51. package/dist/runtime.js +2 -26
  52. package/dist/suspense.d.ts +19 -0
  53. package/dist/suspense.d.ts.map +1 -0
  54. package/dist/suspense.js +38 -0
  55. package/dist/toast.d.ts +2 -0
  56. package/dist/toast.d.ts.map +1 -0
  57. package/dist/toast.js +2 -0
  58. package/dist/withToast.d.ts +2 -0
  59. package/dist/withToast.d.ts.map +1 -0
  60. package/dist/withToast.js +2 -0
  61. package/docs/atom-query-api-redesign.md +207 -0
  62. package/docs/query-key-invalidation.md +106 -0
  63. package/examples/streamMutation.ts +72 -0
  64. package/package.json +36 -95
  65. package/src/atomQuery.ts +588 -0
  66. package/src/commander.ts +3413 -0
  67. package/src/{experimental/confirm.ts → confirm.ts} +13 -15
  68. package/src/dependencyMetadata.ts +84 -0
  69. package/src/errorReporter.ts +65 -75
  70. package/src/form.ts +61 -18
  71. package/src/index.ts +7 -7
  72. package/src/internal/tanstackQuery.ts +304 -0
  73. package/src/intl.ts +12 -0
  74. package/src/lib.ts +49 -21
  75. package/src/liveQueryInvalidation.ts +138 -0
  76. package/src/makeClient.ts +971 -1159
  77. package/src/makeIntl.ts +2 -2
  78. package/src/{experimental/makeUseCommand.ts → makeUseCommand.ts} +9 -6
  79. package/src/mutate.ts +396 -153
  80. package/src/query.ts +763 -260
  81. package/src/routeParams.ts +7 -7
  82. package/src/runtime.ts +1 -31
  83. package/src/suspense.ts +43 -0
  84. package/src/toast.ts +1 -0
  85. package/src/withToast.ts +1 -0
  86. package/test/Mutation.test.ts +181 -24
  87. package/test/dependencyInvalidation.test.ts +397 -0
  88. package/test/dist/dependencyInvalidation.test.d.ts.map +1 -0
  89. package/test/dist/form.test.d.ts.map +1 -1
  90. package/test/dist/interrupt-refetch-repro.test.d.ts.map +1 -0
  91. package/test/dist/lib.test.d.ts.map +1 -0
  92. package/test/dist/liveQueryInvalidation.test.d.ts.map +1 -0
  93. package/test/dist/query-span.test.d.ts.map +1 -0
  94. package/test/dist/queryOptions.test.d.ts.map +1 -0
  95. package/test/dist/streamFinal.test.d.ts.map +1 -0
  96. package/test/dist/streamFn.test.d.ts.map +1 -0
  97. package/test/dist/stubs.d.ts +3756 -122
  98. package/test/dist/stubs.d.ts.map +1 -1
  99. package/test/dist/stubs.js +192 -32
  100. package/test/dist/suspense-regression.test.d.ts.map +1 -0
  101. package/test/dist/suspense.test.d.ts.map +1 -0
  102. package/test/form-validation-errors.test.ts +25 -20
  103. package/test/form.test.ts +22 -3
  104. package/test/interrupt-refetch-repro.test.ts +623 -0
  105. package/test/lib.test.ts +240 -0
  106. package/test/liveQueryInvalidation.test.ts +108 -0
  107. package/test/makeClient.test.ts +437 -38
  108. package/test/query-span.test.ts +92 -0
  109. package/test/queryOptions.test.ts +88 -0
  110. package/test/streamFinal.test.ts +64 -0
  111. package/test/streamFn.test.ts +457 -0
  112. package/test/stubs.ts +228 -43
  113. package/test/suspense-regression.test.ts +168 -0
  114. package/test/suspense.test.ts +160 -0
  115. package/tsconfig.examples.json +20 -0
  116. package/tsconfig.json +9 -2
  117. package/tsconfig.src.json +34 -34
  118. package/tsconfig.test.json +2 -2
  119. package/vitest.config.ts +5 -5
  120. package/dist/experimental/commander.d.ts +0 -359
  121. package/dist/experimental/commander.d.ts.map +0 -1
  122. package/dist/experimental/commander.js +0 -557
  123. package/dist/experimental/confirm.d.ts.map +0 -1
  124. package/dist/experimental/confirm.js +0 -28
  125. package/dist/experimental/intl.d.ts +0 -16
  126. package/dist/experimental/intl.d.ts.map +0 -1
  127. package/dist/experimental/intl.js +0 -5
  128. package/dist/experimental/makeUseCommand.d.ts.map +0 -1
  129. package/dist/experimental/makeUseCommand.js +0 -13
  130. package/dist/experimental/toast.d.ts +0 -47
  131. package/dist/experimental/toast.d.ts.map +0 -1
  132. package/dist/experimental/toast.js +0 -41
  133. package/dist/experimental/withToast.d.ts +0 -25
  134. package/dist/experimental/withToast.d.ts.map +0 -1
  135. package/dist/experimental/withToast.js +0 -45
  136. package/eslint.config.mjs +0 -24
  137. package/src/experimental/commander.ts +0 -1835
  138. package/src/experimental/intl.ts +0 -9
  139. package/src/experimental/toast.ts +0 -66
  140. package/src/experimental/withToast.ts +0 -99
  141. package/tsconfig.json.bak +0 -12
@@ -0,0 +1,200 @@
1
+ import { injectRegistry } from "@effect/atom-vue";
2
+ import { QueryClient, useQuery as useTanstackQuery } from "@tanstack/vue-query";
3
+ import { DataDependencies, makeQueryKey } from "effect-app/client";
4
+ import { CauseException, ServiceUnavailableError } from "effect-app/client/errors";
5
+ import * as Effect from "effect-app/Effect";
6
+ import * as Option from "effect-app/Option";
7
+ import * as S from "effect-app/Schema";
8
+ import * as Cause from "effect/Cause";
9
+ import * as Ref from "effect/Ref";
10
+ import { isHttpClientError } from "effect/unstable/http/HttpClientError";
11
+ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
12
+ import * as Atom from "effect/unstable/reactivity/Atom";
13
+ import { computed, shallowRef, toValue, watch } from "vue";
14
+ import { replaceEqualDeep } from "../atomQuery.js";
15
+ import { clearQueryReadDependencies, registerQueryInvalidationMode, setQueryReadDependencies } from "../dependencyMetadata.js";
16
+ import { reportRuntimeError } from "../lib.js";
17
+ import { makeRunPromise } from "../runtime.js";
18
+ const swrToQuery = (r) => {
19
+ if (r.error !== undefined && r.error !== null) {
20
+ return AsyncResult.failureWithPrevious(r.error.originalCause, {
21
+ previous: r.data === undefined ? Option.none() : Option.some(AsyncResult.success(r.data)),
22
+ waiting: r.isValidating
23
+ });
24
+ }
25
+ if (r.data !== undefined) {
26
+ return AsyncResult.success(r.data, { waiting: r.isValidating });
27
+ }
28
+ return AsyncResult.initial(r.isValidating);
29
+ };
30
+ const recoverCauseException = (error) => error instanceof CauseException
31
+ ? Effect.failCause(error.originalCause)
32
+ : Effect.die(error);
33
+ const isRetryable = (error) => {
34
+ if (error instanceof CauseException) {
35
+ return isHttpClientError(error.cause) || S.is(ServiceUnavailableError)(error.cause);
36
+ }
37
+ return false;
38
+ };
39
+ const isInputOption = (value) => Option.isOption(value);
40
+ const resolveInput = (arg, mode) => {
41
+ if (mode === "optional") {
42
+ const option = toValue(arg);
43
+ return isInputOption(option) && Option.isSome(option) ? option.value : undefined;
44
+ }
45
+ const value = toValue(arg);
46
+ return isInputOption(value) ? undefined : value;
47
+ };
48
+ const resolveEnabled = (arg, options) => {
49
+ if (options?.mode === "optional") {
50
+ return computed(() => {
51
+ const option = toValue(arg);
52
+ return Option.isSome(option);
53
+ });
54
+ }
55
+ return computed(() => {
56
+ const enabled = options?.enabled;
57
+ if (enabled === undefined)
58
+ return true;
59
+ return !!toValue(enabled);
60
+ });
61
+ };
62
+ export const makeTanstackQueryClient = () => new QueryClient();
63
+ export const makeTanstackQueryInvalidator = (queryClient) => ({
64
+ invalidateAndAwait: (keys) => Effect.gen(function* () {
65
+ const span = yield* Effect.currentParentSpan.pipe(Effect.orElseSucceed(() => undefined));
66
+ yield* Effect.forEach(keys, (queryKey) => {
67
+ const options = { updateMeta: { span } };
68
+ return Effect.promise(() => queryClient.invalidateQueries({ queryKey }, options));
69
+ }, { discard: true, concurrency: "inherit" });
70
+ }),
71
+ invalidateSoft: (keys) => Effect.gen(function* () {
72
+ const span = yield* Effect.currentParentSpan.pipe(Effect.orElseSucceed(() => undefined));
73
+ yield* Effect.forEach(keys, (queryKey) => Effect.promise(() => queryClient.invalidateQueries({ queryKey }, { updateMeta: { span } })), { discard: true, concurrency: "inherit" });
74
+ })
75
+ });
76
+ const fullQueryKey = (q, queryKey, input) => q.queryKeyProjectionHash === undefined ? [...queryKey, input] : [...queryKey, q.queryKeyProjectionHash, input];
77
+ export const makeTanstackQueryCacheUpdater = (queryClient) => ({
78
+ update: (_registry, query, input, updater) => {
79
+ const queryKey = fullQueryKey(query, makeQueryKey(query), input);
80
+ if (queryClient.getQueryData(queryKey) === undefined) {
81
+ console.warn(`Query ${query.id} has not been used yet; nothing to update`);
82
+ return;
83
+ }
84
+ queryClient.setQueryData(queryKey, (data) => data === undefined ? data : updater(data));
85
+ }
86
+ });
87
+ export const makeTanstackQuery = (getRuntime, queryClient) => {
88
+ // Drop a query's recorded read-dependencies when tanstack evicts it from the cache, so the
89
+ // registry mirrors the live queries (mirrors the atom engine's `trackReadDependencies` finalizer).
90
+ queryClient.getQueryCache().subscribe((event) => {
91
+ if (event.type === "removed")
92
+ clearQueryReadDependencies(event.query.queryKey);
93
+ });
94
+ const useQuery = (q) => (arg, options) => {
95
+ const runPromise = makeRunPromise(getRuntime());
96
+ const queryKey = makeQueryKey(q);
97
+ const enabled = resolveEnabled(arg, options);
98
+ const structuralSharing = options?.structuralSharing === false ? false : replaceEqualDeep;
99
+ const tanstackOptions = {
100
+ ...(options?.staleTime !== undefined ? { staleTime: options.staleTime } : {}),
101
+ ...(typeof options?.gcTime === "number" ? { gcTime: options.gcTime } : {}),
102
+ ...(options?.refetchOnWindowFocus !== undefined ? { refetchOnWindowFocus: options.refetchOnWindowFocus } : {}),
103
+ structuralSharing,
104
+ ...(options?.refetchInterval !== undefined ? { refetchInterval: options.refetchInterval } : {}),
105
+ ...(options?.select !== undefined ? { select: options.select } : {})
106
+ };
107
+ const resolvedQueryKey = computed(() => {
108
+ const input = resolveInput(arg, options?.mode);
109
+ return fullQueryKey(q, queryKey, input);
110
+ });
111
+ watch(resolvedQueryKey, (key, _, onCleanup) => onCleanup(registerQueryInvalidationMode(key, options?.invalidation ?? "await")), { immediate: true });
112
+ const tanstack = useTanstackQuery({
113
+ ...tanstackOptions,
114
+ enabled,
115
+ throwOnError: false,
116
+ retry: (retryCount, error) => isRetryable(error) && retryCount < 5,
117
+ queryKey: resolvedQueryKey,
118
+ queryFn: ({ meta, signal }) => runPromise(Effect.gen(function* () {
119
+ const input = resolveInput(arg, options?.mode);
120
+ // Record the repository/server read-dependencies seen while fetching, keyed by the
121
+ // tanstack queryKey, so a later mutation whose writes intersect them derives this query
122
+ // as an invalidation target (the tanstack invalidator invalidates by this same key).
123
+ const readsRef = yield* Ref.make(DataDependencies.empty());
124
+ const writesRef = yield* Ref.make(DataDependencies.empty());
125
+ const recorder = DataDependencies.makeDataDependencyRecorder(readsRef, writesRef);
126
+ const result = yield* q
127
+ .handler(input)
128
+ .pipe(Effect.provideService(DataDependencies.DataDependencyRecorder, recorder), Effect.tapCauseIf(Cause.hasDies, (cause) => reportRuntimeError(cause)), Effect.withSpan(`query ${q.id}`, {}, { captureStackTrace: false }), meta?.span === undefined
129
+ ? (effect) => effect
130
+ : Effect.withParentSpan(meta.span, { captureStackTrace: false }));
131
+ setQueryReadDependencies(fullQueryKey(q, queryKey, input), yield* Ref.get(readsRef));
132
+ return result;
133
+ }), { signal })
134
+ }, queryClient);
135
+ const latestSuccess = shallowRef();
136
+ const result = computed(() => swrToQuery({
137
+ error: tanstack.error.value,
138
+ data: tanstack.data.value === undefined ? latestSuccess.value : tanstack.data.value,
139
+ isValidating: tanstack.isFetching.value
140
+ }));
141
+ watch(result, (value) => latestSuccess.value = Option.getOrUndefined(AsyncResult.value(value)), { immediate: true });
142
+ const seedLatestSuccess = (data) => {
143
+ if (latestSuccess.value === undefined) {
144
+ latestSuccess.value = data;
145
+ }
146
+ };
147
+ const registry = injectRegistry();
148
+ const latestSuccessRef = computed(() => latestSuccess.value);
149
+ const atom = computed(() => Atom.readable(() => result.value));
150
+ const awaitResult = () => Effect
151
+ .tryPromise({
152
+ try: async () => {
153
+ const queryResult = await tanstack.suspense();
154
+ const data = queryResult.data;
155
+ if (data === undefined) {
156
+ throw new Error("TanStack query resolved without data");
157
+ }
158
+ seedLatestSuccess(data);
159
+ return data;
160
+ },
161
+ catch: (error) => error
162
+ })
163
+ .pipe(Effect.catch((error) => recoverCauseException(error)));
164
+ const refetch = () => Effect.gen(function* () {
165
+ const span = yield* Effect.currentParentSpan.pipe(Effect.orElseSucceed(() => undefined));
166
+ return yield* Effect
167
+ .tryPromise({
168
+ try: async () => {
169
+ const options = { throwOnError: true, updateMeta: { span } };
170
+ const queryResult = await tanstack.refetch(options);
171
+ const data = queryResult.data;
172
+ if (data === undefined) {
173
+ throw new Error("TanStack query refetched without data");
174
+ }
175
+ return data;
176
+ },
177
+ catch: (error) => error
178
+ })
179
+ .pipe(Effect.catch((error) => recoverCauseException(error)));
180
+ });
181
+ const handle = {
182
+ awaitResult,
183
+ refetch,
184
+ refresh: () => {
185
+ void tanstack.refetch();
186
+ },
187
+ registry,
188
+ atom
189
+ };
190
+ const fetch = (_options) => refetch().pipe(Effect.exit, Effect.map(AsyncResult.fromExit));
191
+ return [
192
+ result,
193
+ latestSuccessRef,
194
+ fetch,
195
+ handle
196
+ ];
197
+ };
198
+ return useQuery;
199
+ };
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuc3RhY2tRdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcm5hbC90YW5zdGFja1F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQVksTUFBTSxtQkFBbUIsQ0FBQTtBQUU1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFbEYsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUE7QUFFakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDeEUsT0FBTyxLQUFLLFdBQVcsTUFBTSx3Q0FBd0MsQ0FBQTtBQUNyRSxPQUFPLEtBQUssSUFBSSxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQXlCLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFvQixNQUFNLEtBQUssQ0FBQTtBQUNuRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsNkJBQTZCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUM5SCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFHOUMsT0FBTyxFQUFFLGNB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
package/dist/intl.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import * as Context from "effect-app/Context";
2
+ declare const I18n_base: Context.OpaqueClass<I18n, "I18n", {
3
+ locale: import("vue").Ref<string, string>;
4
+ trans: (id: string, values?: Record<string, import("intl-messageformat").PrimitiveType | import("intl-messageformat").FormatXMLElementFn<string, string>>) => string;
5
+ readonly formatMessage: (descriptor: import("@formatjs/intl").MessageDescriptor, values?: Record<string, import("intl-messageformat").PrimitiveType | import("intl-messageformat").FormatXMLElementFn<string, string>>, opts?: import("intl-messageformat").Options) => string;
6
+ readonly intl: import("./makeIntl.js").IntlShape<string>;
7
+ }>;
8
+ export declare class I18n extends I18n_base {
9
+ static readonly locale: import("effect/Effect").Effect<import("vue").Ref<string, string>, never, I18n>;
10
+ static readonly trans: (id: string, values?: Record<string, import("intl-messageformat").FormatXMLElementFn<string, string> | import("intl-messageformat").PrimitiveType> | undefined) => import("effect/Effect").Effect<string, never, I18n>;
11
+ static readonly formatMessage: (descriptor: import("@formatjs/intl").MessageDescriptor, values?: Record<string, import("intl-messageformat").FormatXMLElementFn<string, string> | import("intl-messageformat").PrimitiveType> | undefined, opts?: import("intl-messageformat").Options | undefined) => import("effect/Effect").Effect<string, never, I18n>;
12
+ static readonly intl: import("effect/Effect").Effect<import("./makeIntl.js").IntlShape<string>, never, I18n>;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=intl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intl.d.ts","sourceRoot":"","sources":["../src/intl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;;;;;;;AAM7C,qBAAa,IAAK,SAAQ,SAAyC;IACjE,MAAM,CAAC,QAAQ,CAAC,MAAM,iFAA2B;IACjD,MAAM,CAAC,QAAQ,CAAC,KAAK,yNAA0B;IAC/C,MAAM,CAAC,QAAQ,CAAC,aAAa,8TAAkC;IAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,yFAAyB;CAC9C"}
package/dist/intl.js ADDED
@@ -0,0 +1,9 @@
1
+ import * as Context from "effect-app/Context";
2
+ import { accessCn, accessFn } from "effect-app/Context";
3
+ export class I18n extends Context.Opaque()("I18n") {
4
+ static locale = accessCn(this, "locale");
5
+ static trans = accessFn(this, "trans");
6
+ static formatMessage = accessFn(this, "formatMessage");
7
+ static intl = accessCn(this, "intl");
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50bC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnRsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUt2RCxNQUFNLE9BQU8sSUFBSyxTQUFRLE9BQU8sQ0FBQyxNQUFNLEVBQW1CLENBQUMsTUFBTSxDQUFDO0lBQ2pFLE1BQU0sQ0FBVSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNqRCxNQUFNLENBQVUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDL0MsTUFBTSxDQUFVLGFBQWEsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sQ0FBVSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtDQUM5QyJ9
package/dist/lib.d.ts CHANGED
@@ -1,14 +1,12 @@
1
1
  import { type Pausable, type UseIntervalFnOptions } from "@vueuse/core";
2
- import { Cause, type Effect } from "effect-app";
3
- import { type Req } from "effect-app/client";
4
- import type { ClientForOptions, RequestHandler, RequestHandlerWithInput } from "effect-app/client/clientFor";
5
- import type { MaybeRefOrGetter } from "vue";
2
+ import type { Req } from "effect-app/client";
3
+ import type { RequestHandlerWithInput } from "effect-app/client/clientFor";
4
+ import type * as Effect from "effect-app/Effect";
5
+ import * as Cause from "effect/Cause";
6
+ import { type MaybeRefOrGetter } from "vue";
6
7
  export * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
7
8
  export declare const reportRuntimeError: (cause: Cause.Cause<unknown>, extras?: Record<string, unknown>) => Effect.Effect<unknown, never, never>;
8
- export declare const makeQueryKey: ({ id, options }: {
9
- id: string;
10
- options?: ClientForOptions;
11
- }) => [string, ...string[]];
9
+ export { makeQueryKey } from "effect-app/client";
12
10
  export declare function pauseWhileProcessing(iv: Pausable, pmf: () => Promise<unknown>): Promise<unknown>;
13
11
  export declare function useIntervalPauseWhileProcessing(pmf: () => Promise<unknown>, interval?: MaybeRefOrGetter<number>, options?: Omit<UseIntervalFnOptions, "immediateCallback">): {
14
12
  isActive: Readonly<import("vue").ShallowRef<boolean>>;
@@ -19,6 +17,6 @@ export declare function useIntervalPauseWhileProcessing(pmf: () => Promise<unkno
19
17
  */
20
18
  export declare const mapHandler: {
21
19
  <I, E, R, A, E2, A2, R2, Request extends Req, Name extends string>(self: RequestHandlerWithInput<I, A, E, R, Request, Name>, map: (handler: (i: I) => Effect.Effect<A, E, R>) => (i: I) => Effect.Effect<A2, E2, R2>): RequestHandlerWithInput<I, A2, E2, R2, Request, Name>;
22
- <E, A, R, E2, A2, R2, Request extends Req, Name extends string>(self: RequestHandler<A, E, R, Request, Name>, map: (handler: Effect.Effect<A, E, R>) => Effect.Effect<A2, E2, R2>): RequestHandler<A2, E2, R2, Request, Name>;
23
20
  };
21
+ export declare function deepToRaw<T>(sourceObj: T): T;
24
22
  //# sourceMappingURL=lib.d.ts.map
package/dist/lib.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAiB,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACtF,OAAO,EAAE,KAAK,EAAE,KAAK,MAAM,EAAQ,MAAM,YAAY,CAAA;AACrD,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAE5G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAA;AAG3C,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAA;AAsBrE,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,yCACrC,CAAA;AAI3D,eAAO,MAAM,YAAY,GAAI,iBAAiB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAE,0BAMzE,CAAA;AAEf,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,EACZ,GAAG,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,oBAM5B;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC3B,QAAQ,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,EACnC,OAAO,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;;EAU1D;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE;IACvB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,SAAS,GAAG,EAAE,IAAI,SAAS,MAAM,EAC/D,IAAI,EAAE,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EACxD,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GACtF,uBAAuB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,SAAS,GAAG,EAAE,IAAI,SAAS,MAAM,EAC5D,IAAI,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAC5C,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAClE,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;CAM5C,CAAA"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAiB,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACtF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,KAAK,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,EAA8B,KAAK,gBAAgB,EAAS,MAAM,KAAK,CAAA;AAG9E,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAA;AAsBrE,eAAO,MAAM,kBAAkB,UAAW,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,yCACrC,CAAA;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,EACZ,GAAG,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,oBAM5B;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC3B,QAAQ,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,EACnC,OAAO,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;IAQvD,QAAQ;EAEX;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE;IACvB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,SAAS,GAAG,EAAE,IAAI,SAAS,MAAM,EAC/D,IAAI,EAAE,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EACxD,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GACtF,uBAAuB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;CAIxD,CAAA;AAEF,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAuC5C"}
package/dist/lib.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { useIntervalFn } from "@vueuse/core";
2
- import { Cause, pipe } from "effect-app";
2
+ import * as Cause from "effect/Cause";
3
3
  import { isHttpClientError } from "effect/unstable/http/HttpClientError";
4
+ import { isProxy, isReactive, isRef, toRaw } from "vue";
4
5
  import { reportError } from "./errorReporter.js";
5
6
  export * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
6
7
  const reportRuntimeError_ = reportError("Runtime");
@@ -21,11 +22,7 @@ const determineLevel = (cause) => {
21
22
  }
22
23
  };
23
24
  export const reportRuntimeError = (cause, extras) => reportRuntimeError_(cause, extras, determineLevel(cause));
24
- // $Project/$Configuration.Index
25
- // -> "$Project", "$Configuration", "Index"
26
- export const makeQueryKey = ({ id, options }) => pipe(id.split("/"), (split) => split.filter((_) => !options || !options?.skipQueryKey?.includes(_)).map((_) => "$" + _))
27
- .join(".")
28
- .split(".");
25
+ export { makeQueryKey } from "effect-app/client";
29
26
  export function pauseWhileProcessing(iv, pmf) {
30
27
  return Promise
31
28
  .resolve(iv.pause())
@@ -44,8 +41,36 @@ export function useIntervalPauseWhileProcessing(pmf, interval, options) {
44
41
  */
45
42
  export const mapHandler = (self, map) => ({
46
43
  ...self,
47
- handler: typeof self.handler === "function"
48
- ? (i) => map(self.handler)(i)
49
- : map(self.handler)
44
+ handler: (i) => map(self.handler)(i)
50
45
  });
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLGFBQWEsRUFBNkIsTUFBTSxjQUFjLENBQUE7QUFDdEYsT0FBTyxFQUFFLEtBQUssRUFBZSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFHckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFFeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRWhELE9BQU8sS0FBSyxXQUFXLE1BQU0sd0NBQXdDLENBQUE7QUFFckUsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFbEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyw0QkFBNEIsRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0FBRXhGLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBMkIsRUFBRSxFQUFFO0lBQ3JELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDM0IsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFBO0lBQ2pELFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixLQUFLLGdCQUFnQjtZQUNuQixPQUFPLE1BQWUsQ0FBQTtRQUN4QixLQUFLLGFBQWE7WUFDaEIsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBQ2pGO1lBQ0UsT0FBTyxTQUFTLENBQUE7SUFDcEIsQ0FBQztBQUNILENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBMkIsRUFBRSxNQUFnQyxFQUFFLEVBQUUsQ0FDbEcsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUUzRCxnQ0FBZ0M7QUFDaEMsMkNBQTJDO0FBQzNDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBOEMsRUFBRSxFQUFFLENBQzFGLElBQUksQ0FDRixFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUNiLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQ3BHO0tBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQztLQUNULEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUVmLE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsRUFBWSxFQUNaLEdBQTJCO0lBRTNCLE9BQU8sT0FBTztTQUNYLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDbkIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ2pCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtBQUMvQixDQUFDO0FBRUQsTUFBTSxVQUFVLCtCQUErQixDQUM3QyxHQUEyQixFQUMzQixRQUFtQyxFQUNuQyxPQUF5RDtJQUV6RCxNQUFNLEVBQUUsR0FBRyxhQUFhLENBQ3RCLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFDbkMsUUFBUSxFQUNSLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUM3RCxDQUFBO0lBQ0QsT0FBTztRQUNMLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUTtLQUN0QixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FTbkIsQ0FBQyxJQUFTLEVBQUUsR0FBUSxFQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLEdBQUcsSUFBSTtJQUNQLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssVUFBVTtRQUN6QyxDQUFDLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBbUQsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Q0FDdEIsQ0FBQyxDQUFBIn0=
46
+ export function deepToRaw(sourceObj) {
47
+ const objectIterator = (input) => {
48
+ if (isRef(input)) {
49
+ return objectIterator(input.value);
50
+ }
51
+ const rawInput = isReactive(input) || isProxy(input)
52
+ ? toRaw(input)
53
+ : input;
54
+ if (Array.isArray(rawInput)) {
55
+ return rawInput.map((item) => objectIterator(item));
56
+ }
57
+ if (rawInput instanceof Map) {
58
+ return new Map(Array.from(rawInput.entries(), ([key, value]) => [objectIterator(key), objectIterator(value)]));
59
+ }
60
+ if (rawInput instanceof Set) {
61
+ return new Set(Array.from(rawInput.values(), (value) => objectIterator(value)));
62
+ }
63
+ if (rawInput instanceof Date) {
64
+ return new Date(rawInput);
65
+ }
66
+ if (rawInput && typeof rawInput === "object") {
67
+ return Object.keys(rawInput).reduce((acc, key) => {
68
+ acc[key] = objectIterator(rawInput[key]);
69
+ return acc;
70
+ }, {});
71
+ }
72
+ return rawInput;
73
+ };
74
+ return objectIterator(sourceObj);
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLGFBQWEsRUFBNkIsTUFBTSxjQUFjLENBQUE7QUFJdEYsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDeEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUF5QixLQUFLLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRWhELE9BQU8sS0FBSyxXQUFXLE1BQU0sd0NBQXdDLENBQUE7QUFFckUsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFbEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyw0QkFBNEIsRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0FBRXhGLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBMkIsRUFBRSxFQUFFO0lBQ3JELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDM0IsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFBO0lBQ2pELFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixLQUFLLGdCQUFnQjtZQUNuQixPQUFPLE1BQWUsQ0FBQTtRQUN4QixLQUFLLGFBQWE7WUFDaEIsT0FBTyxPQUFPLENB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
@@ -0,0 +1,16 @@
1
+ import { DataDependencies } from "effect-app/client";
2
+ export interface LiveQueryOptions {
3
+ /** Fixed maximum delay from the first matching write. Zero reacts immediately. */
4
+ readonly maxDelayMs?: number;
5
+ }
6
+ export interface LiveQueryInvalidationSource {
7
+ /** Resolve only after events received after this point can no longer be missed. */
8
+ readonly ready: () => Promise<void>;
9
+ readonly subscribe: (onWrites: (writes: DataDependencies.DataDependencies) => void, onReset: () => void) => () => void;
10
+ readonly invalidate: (keys: ReadonlyArray<ReadonlyArray<unknown>>) => void;
11
+ }
12
+ export declare const configureLiveQueryInvalidation: (next: LiveQueryInvalidationSource) => void;
13
+ export declare const registerLiveQuery: (key: ReadonlyArray<unknown>, reads: () => DataDependencies.DataDependencies, options: LiveQueryOptions) => () => void;
14
+ export declare const beginLiveQueryFetch: (key: ReadonlyArray<unknown>) => Promise<boolean>;
15
+ export declare const endLiveQueryFetch: (wasLive: boolean) => void;
16
+ //# sourceMappingURL=liveQueryInvalidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveQueryInvalidation.d.ts","sourceRoot":"","sources":["../src/liveQueryInvalidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGpD,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,2BAA2B;IAC1C,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,QAAQ,CAAC,SAAS,EAAE,CAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,gBAAgB,KAAK,IAAI,EAC7D,OAAO,EAAE,MAAM,IAAI,KAChB,MAAM,IAAI,CAAA;IACf,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAA;CAC3E;AAwDD,eAAO,MAAM,8BAA8B,SAAU,2BAA2B,SAK/E,CAAA;AAED,eAAO,MAAM,iBAAiB,QACvB,aAAa,CAAC,OAAO,CAAC,SACpB,MAAM,gBAAgB,CAAC,gBAAgB,WACrC,gBAAgB,eAkC1B,CAAA;AAED,eAAO,MAAM,mBAAmB,QAAe,aAAa,CAAC,OAAO,CAAC,qBAUpE,CAAA;AAED,eAAO,MAAM,iBAAiB,YAAa,OAAO,SAOjD,CAAA"}
@@ -0,0 +1,115 @@
1
+ import { DataDependencies } from "effect-app/client";
2
+ import * as Hash from "effect/Hash";
3
+ const entries = new Map();
4
+ let source;
5
+ let unsubscribe;
6
+ let discovering = 0;
7
+ let bufferedWrites = DataDependencies.empty();
8
+ const invalidateEntry = (entry) => {
9
+ entry.timer = undefined;
10
+ source?.invalidate([entry.key]);
11
+ };
12
+ const schedule = (entry) => {
13
+ if (entry.timer !== undefined)
14
+ return;
15
+ const maxDelayMs = Math.min(...entry.delays.keys());
16
+ if (maxDelayMs <= 0)
17
+ return invalidateEntry(entry);
18
+ entry.timer = setTimeout(() => invalidateEntry(entry), maxDelayMs);
19
+ };
20
+ const dispatch = (writes) => {
21
+ if (!DataDependencies.isNonEmpty(writes))
22
+ return;
23
+ for (const entry of entries.values()) {
24
+ if (DataDependencies.intersects(entry.reads(), writes))
25
+ schedule(entry);
26
+ }
27
+ };
28
+ const receive = (writes) => {
29
+ if (discovering > 0) {
30
+ bufferedWrites = DataDependencies.merge(bufferedWrites, writes);
31
+ return;
32
+ }
33
+ dispatch(writes);
34
+ };
35
+ const reset = () => {
36
+ bufferedWrites = DataDependencies.empty();
37
+ for (const entry of entries.values()) {
38
+ if (DataDependencies.isNonEmpty(entry.reads()))
39
+ schedule(entry);
40
+ }
41
+ };
42
+ const ensureSubscribed = () => {
43
+ if (unsubscribe === undefined && source !== undefined && entries.size > 0) {
44
+ unsubscribe = source.subscribe(receive, reset);
45
+ }
46
+ };
47
+ export const configureLiveQueryInvalidation = (next) => {
48
+ unsubscribe?.();
49
+ unsubscribe = undefined;
50
+ source = next;
51
+ ensureSubscribed();
52
+ };
53
+ export const registerLiveQuery = (key, reads, options) => {
54
+ const hash = Hash.hash(key);
55
+ const delay = options.maxDelayMs ?? 0;
56
+ const current = entries.get(hash);
57
+ if (current !== undefined) {
58
+ current.observers++;
59
+ current.delays.set(delay, (current.delays.get(delay) ?? 0) + 1);
60
+ }
61
+ else {
62
+ entries.set(hash, {
63
+ key,
64
+ reads,
65
+ observers: 1,
66
+ delays: new Map([[delay, 1]]),
67
+ timer: undefined
68
+ });
69
+ }
70
+ ensureSubscribed();
71
+ return () => {
72
+ const entry = entries.get(hash);
73
+ if (entry === undefined)
74
+ return;
75
+ const delayObservers = entry.delays.get(delay) ?? 0;
76
+ if (delayObservers <= 1)
77
+ entry.delays.delete(delay);
78
+ else
79
+ entry.delays.set(delay, delayObservers - 1);
80
+ if (--entry.observers > 0)
81
+ return;
82
+ if (entry.timer !== undefined)
83
+ clearTimeout(entry.timer);
84
+ entries.delete(hash);
85
+ if (entries.size === 0) {
86
+ unsubscribe?.();
87
+ unsubscribe = undefined;
88
+ bufferedWrites = DataDependencies.empty();
89
+ }
90
+ };
91
+ };
92
+ export const beginLiveQueryFetch = async (key) => {
93
+ if (!entries.has(Hash.hash(key)) || source === undefined)
94
+ return false;
95
+ discovering++;
96
+ try {
97
+ await source.ready();
98
+ return true;
99
+ }
100
+ catch (error) {
101
+ discovering--;
102
+ throw error;
103
+ }
104
+ };
105
+ export const endLiveQueryFetch = (wasLive) => {
106
+ if (!wasLive)
107
+ return;
108
+ discovering = Math.max(0, discovering - 1);
109
+ if (discovering > 0 || !DataDependencies.isNonEmpty(bufferedWrites))
110
+ return;
111
+ const writes = bufferedWrites;
112
+ bufferedWrites = DataDependencies.empty();
113
+ dispatch(writes);
114
+ };
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZVF1ZXJ5SW52YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xpdmVRdWVyeUludmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNwRCxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQXlCbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUE7QUFDakQsSUFBSSxNQUErQyxDQUFBO0FBQ25ELElBQUksV0FBcUMsQ0FBQTtBQUN6QyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUE7QUFDbkIsSUFBSSxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUE7QUFFN0MsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFxQixFQUFFLEVBQUU7SUFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7SUFDdkIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ2pDLENBQUMsQ0FBQTtBQUVELE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBcUIsRUFBRSxFQUFFO0lBQ3pDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTTtJQUNyQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ25ELElBQUksVUFBVSxJQUFJLENBQUM7UUFBRSxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsRCxLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUE7QUFDcEUsQ0FBQyxDQUFBO0FBRUQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxN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