@effect-app/vue 4.0.0-beta.99 → 4.0.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.
- package/CHANGELOG.md +2701 -0
- package/dist/atomQuery.d.ts +120 -0
- package/dist/atomQuery.d.ts.map +1 -0
- package/dist/atomQuery.js +434 -0
- package/dist/commander.d.ts +318 -43
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +593 -81
- package/dist/confirm.d.ts +5 -3
- package/dist/confirm.d.ts.map +1 -1
- package/dist/confirm.js +12 -14
- package/dist/dependencyMetadata.d.ts +18 -0
- package/dist/dependencyMetadata.d.ts.map +1 -0
- package/dist/dependencyMetadata.js +67 -0
- package/dist/errorReporter.d.ts +6 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +14 -19
- package/dist/form.d.ts +5 -5
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +16 -10
- package/dist/internal/tanstackQuery.d.ts +9 -0
- package/dist/internal/tanstackQuery.d.ts.map +1 -0
- package/dist/internal/tanstackQuery.js +204 -0
- package/dist/intl.d.ts +4 -4
- package/dist/intl.d.ts.map +1 -1
- package/dist/intl.js +2 -2
- package/dist/lib.d.ts +8 -10
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +37 -12
- package/dist/liveQueryInvalidation.d.ts +16 -0
- package/dist/liveQueryInvalidation.d.ts.map +1 -0
- package/dist/liveQueryInvalidation.js +115 -0
- package/dist/makeClient.d.ts +232 -109
- package/dist/makeClient.d.ts.map +1 -1
- package/dist/makeClient.js +416 -84
- package/dist/makeContext.d.ts.map +1 -1
- package/dist/makeIntl.d.ts.map +1 -1
- package/dist/makeUseCommand.d.ts +3 -2
- package/dist/makeUseCommand.d.ts.map +1 -1
- package/dist/makeUseCommand.js +2 -2
- package/dist/mutate.d.ts +110 -41
- package/dist/mutate.d.ts.map +1 -1
- package/dist/mutate.js +236 -59
- package/dist/query.d.ts +161 -44
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +382 -113
- package/dist/queryLifetime.d.ts +25 -0
- package/dist/queryLifetime.d.ts.map +1 -0
- package/dist/queryLifetime.js +54 -0
- package/dist/routeParams.d.ts +4 -4
- package/dist/routeParams.d.ts.map +1 -1
- package/dist/routeParams.js +4 -3
- package/dist/runtime.d.ts +1 -17
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -38
- package/dist/suspense.d.ts +19 -0
- package/dist/suspense.d.ts.map +1 -0
- package/dist/suspense.js +38 -0
- package/dist/toast.d.ts +1 -45
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +2 -32
- package/dist/withToast.d.ts +1 -24
- package/dist/withToast.d.ts.map +1 -1
- package/dist/withToast.js +2 -45
- package/docs/atom-query-api-redesign.md +207 -0
- package/docs/mutation-command-atoms.md +40 -0
- package/docs/query-key-invalidation.md +107 -0
- package/examples/streamMutation.ts +72 -0
- package/package.json +35 -94
- package/src/atomQuery.ts +600 -0
- package/src/commander.ts +1064 -116
- package/src/confirm.ts +12 -14
- package/src/dependencyMetadata.ts +84 -0
- package/src/errorReporter.ts +65 -75
- package/src/form.ts +22 -15
- package/src/index.ts +7 -7
- package/src/internal/tanstackQuery.ts +308 -0
- package/src/intl.ts +2 -2
- package/src/lib.ts +51 -23
- package/src/liveQueryInvalidation.ts +138 -0
- package/src/makeClient.ts +972 -263
- package/src/makeIntl.ts +2 -2
- package/src/makeUseCommand.ts +8 -5
- package/src/mutate.ts +407 -154
- package/src/query.ts +758 -242
- package/src/queryLifetime.ts +74 -0
- package/src/routeParams.ts +7 -7
- package/src/runtime.ts +1 -54
- package/src/suspense.ts +43 -0
- package/src/toast.ts +1 -52
- package/src/withToast.ts +1 -99
- package/test/Mutation.test.ts +104 -17
- package/test/dependencyInvalidation.test.ts +444 -0
- package/test/dist/dependencyInvalidation.test.d.ts.map +1 -0
- package/test/dist/form.test.d.ts.map +1 -1
- package/test/dist/inactiveInvalidation.test.d.ts.map +1 -0
- package/test/dist/interrupt-refetch-repro.test.d.ts.map +1 -0
- package/test/dist/lib.test.d.ts.map +1 -0
- package/test/dist/liveQueryInvalidation.test.d.ts.map +1 -0
- package/test/dist/query-span.test.d.ts.map +1 -0
- package/test/dist/queryOptions.test.d.ts.map +1 -0
- package/test/dist/streamFinal.test.d.ts.map +1 -0
- package/test/dist/streamFn.test.d.ts.map +1 -0
- package/test/dist/stubs.d.ts +3681 -256
- package/test/dist/stubs.d.ts.map +1 -1
- package/test/dist/stubs.js +166 -25
- package/test/dist/suspense-regression.test.d.ts.map +1 -0
- package/test/dist/suspense.test.d.ts.map +1 -0
- package/test/form-validation-errors.test.ts +2 -1
- package/test/form.test.ts +2 -1
- package/test/inactiveInvalidation.test.ts +172 -0
- package/test/interrupt-refetch-repro.test.ts +625 -0
- package/test/lib.test.ts +240 -0
- package/test/liveQueryInvalidation.test.ts +108 -0
- package/test/makeClient.test.ts +414 -32
- package/test/query-span.test.ts +92 -0
- package/test/queryOptions.test.ts +88 -0
- package/test/streamFinal.test.ts +64 -0
- package/test/streamFn.test.ts +457 -0
- package/test/stubs.ts +194 -36
- package/test/suspense-regression.test.ts +168 -0
- package/test/suspense.test.ts +160 -0
- package/tsconfig.examples.json +20 -0
- package/tsconfig.json +9 -1
- package/tsconfig.src.json +34 -34
- package/tsconfig.test.json +2 -2
- package/vitest.config.ts +5 -5
- package/eslint.config.mjs +0 -24
- package/tsconfig.json.bak +0 -12
|
@@ -0,0 +1,204 @@
|
|
|
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 { isHttpClientError } from "effect/http/HttpClientError";
|
|
10
|
+
import * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
11
|
+
import * as Atom from "effect/reactivity/Atom";
|
|
12
|
+
import * as Ref from "effect/Ref";
|
|
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
|
|
65
|
+
.gen(function* () {
|
|
66
|
+
const span = yield* Effect.currentParentSpan.pipe(Effect.orElseSucceed(() => undefined));
|
|
67
|
+
yield* Effect.forEach(keys, (queryKey) => {
|
|
68
|
+
const options = { updateMeta: { span } };
|
|
69
|
+
return Effect.promise(() => queryClient.invalidateQueries({ queryKey }, options));
|
|
70
|
+
}, { discard: true, concurrency: "unbounded" });
|
|
71
|
+
})
|
|
72
|
+
.pipe(Effect.orDie),
|
|
73
|
+
invalidateSoft: (keys) => Effect
|
|
74
|
+
.gen(function* () {
|
|
75
|
+
const span = yield* Effect.currentParentSpan.pipe(Effect.orElseSucceed(() => undefined));
|
|
76
|
+
yield* Effect.forEach(keys, (queryKey) => Effect.promise(() => queryClient.invalidateQueries({ queryKey }, { updateMeta: { span } })), { discard: true, concurrency: "unbounded" });
|
|
77
|
+
})
|
|
78
|
+
.pipe(Effect.orDie)
|
|
79
|
+
});
|
|
80
|
+
const fullQueryKey = (q, queryKey, input) => q.queryKeyProjectionHash === undefined ? [...queryKey, input] : [...queryKey, q.queryKeyProjectionHash, input];
|
|
81
|
+
export const makeTanstackQueryCacheUpdater = (queryClient) => ({
|
|
82
|
+
update: (_registry, query, input, updater) => {
|
|
83
|
+
const queryKey = fullQueryKey(query, makeQueryKey(query), input);
|
|
84
|
+
if (queryClient.getQueryData(queryKey) === undefined) {
|
|
85
|
+
console.warn(`Query ${query.id} has not been used yet; nothing to update`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
queryClient.setQueryData(queryKey, (data) => data === undefined ? data : updater(data));
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
export const makeTanstackQuery = (getRuntime, queryClient) => {
|
|
92
|
+
// Drop a query's recorded read-dependencies when tanstack evicts it from the cache, so the
|
|
93
|
+
// registry mirrors the live queries (mirrors the atom engine's `trackReadDependencies` finalizer).
|
|
94
|
+
queryClient.getQueryCache().subscribe((event) => {
|
|
95
|
+
if (event.type === "removed")
|
|
96
|
+
clearQueryReadDependencies(event.query.queryKey);
|
|
97
|
+
});
|
|
98
|
+
const useQuery = (q) => (arg, options) => {
|
|
99
|
+
const runPromise = makeRunPromise(getRuntime());
|
|
100
|
+
const queryKey = makeQueryKey(q);
|
|
101
|
+
const enabled = resolveEnabled(arg, options);
|
|
102
|
+
const structuralSharing = options?.structuralSharing === false ? false : replaceEqualDeep;
|
|
103
|
+
const tanstackOptions = {
|
|
104
|
+
...(options?.staleTime !== undefined ? { staleTime: options.staleTime } : {}),
|
|
105
|
+
...(typeof options?.gcTime === "number" ? { gcTime: options.gcTime } : {}),
|
|
106
|
+
...(options?.refetchOnWindowFocus !== undefined ? { refetchOnWindowFocus: options.refetchOnWindowFocus } : {}),
|
|
107
|
+
structuralSharing,
|
|
108
|
+
...(options?.refetchInterval !== undefined ? { refetchInterval: options.refetchInterval } : {}),
|
|
109
|
+
...(options?.select !== undefined ? { select: options.select } : {})
|
|
110
|
+
};
|
|
111
|
+
const resolvedQueryKey = computed(() => {
|
|
112
|
+
const input = resolveInput(arg, options?.mode);
|
|
113
|
+
return fullQueryKey(q, queryKey, input);
|
|
114
|
+
});
|
|
115
|
+
watch(resolvedQueryKey, (key, _, onCleanup) => onCleanup(registerQueryInvalidationMode(key, options?.invalidation ?? "await")), { immediate: true });
|
|
116
|
+
const tanstack = useTanstackQuery({
|
|
117
|
+
...tanstackOptions,
|
|
118
|
+
enabled,
|
|
119
|
+
throwOnError: false,
|
|
120
|
+
retry: (retryCount, error) => isRetryable(error) && retryCount < 5,
|
|
121
|
+
queryKey: resolvedQueryKey,
|
|
122
|
+
queryFn: ({ meta, signal }) => runPromise(Effect.gen(function* () {
|
|
123
|
+
const input = resolveInput(arg, options?.mode);
|
|
124
|
+
// Record the repository/server read-dependencies seen while fetching, keyed by the
|
|
125
|
+
// tanstack queryKey, so a later mutation whose writes intersect them derives this query
|
|
126
|
+
// as an invalidation target (the tanstack invalidator invalidates by this same key).
|
|
127
|
+
const readsRef = yield* Ref.make(DataDependencies.empty());
|
|
128
|
+
const writesRef = yield* Ref.make(DataDependencies.empty());
|
|
129
|
+
const recorder = DataDependencies.makeDataDependencyRecorder(readsRef, writesRef);
|
|
130
|
+
const result = yield* q
|
|
131
|
+
.handler(input)
|
|
132
|
+
.pipe(Effect.provideService(DataDependencies.DataDependencyRecorder, recorder), Effect.tapCauseIf(Cause.hasDies, (cause) => reportRuntimeError(cause)), Effect.withSpan(`query ${q.id}`, {}, { captureStackTrace: false }), meta?.span === undefined
|
|
133
|
+
? (effect) => effect
|
|
134
|
+
: Effect.withParentSpan(meta.span, { captureStackTrace: false }));
|
|
135
|
+
setQueryReadDependencies(fullQueryKey(q, queryKey, input), yield* Ref.get(readsRef));
|
|
136
|
+
return result;
|
|
137
|
+
}), { signal })
|
|
138
|
+
}, queryClient);
|
|
139
|
+
const latestSuccess = shallowRef();
|
|
140
|
+
const result = computed(() => swrToQuery({
|
|
141
|
+
error: tanstack.error.value,
|
|
142
|
+
data: tanstack.data.value === undefined ? latestSuccess.value : tanstack.data.value,
|
|
143
|
+
isValidating: tanstack.isFetching.value
|
|
144
|
+
}));
|
|
145
|
+
watch(result, (value) => latestSuccess.value = Option.getOrUndefined(AsyncResult.value(value)), { immediate: true });
|
|
146
|
+
const seedLatestSuccess = (data) => {
|
|
147
|
+
if (latestSuccess.value === undefined) {
|
|
148
|
+
latestSuccess.value = data;
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
const registry = injectRegistry();
|
|
152
|
+
const latestSuccessRef = computed(() => latestSuccess.value);
|
|
153
|
+
const atom = computed(() => Atom.readable(() => result.value));
|
|
154
|
+
const awaitResult = () => Effect
|
|
155
|
+
.tryPromise({
|
|
156
|
+
try: async () => {
|
|
157
|
+
const queryResult = await tanstack.suspense();
|
|
158
|
+
const data = queryResult.data;
|
|
159
|
+
if (data === undefined) {
|
|
160
|
+
throw new Error("TanStack query resolved without data");
|
|
161
|
+
}
|
|
162
|
+
seedLatestSuccess(data);
|
|
163
|
+
return data;
|
|
164
|
+
},
|
|
165
|
+
catch: (error) => error
|
|
166
|
+
})
|
|
167
|
+
.pipe(Effect.catch((error) => recoverCauseException(error)));
|
|
168
|
+
const refetch = () => Effect.gen(function* () {
|
|
169
|
+
const span = yield* Effect.currentParentSpan.pipe(Effect.orElseSucceed(() => undefined));
|
|
170
|
+
return yield* Effect
|
|
171
|
+
.tryPromise({
|
|
172
|
+
try: async () => {
|
|
173
|
+
const options = { throwOnError: true, updateMeta: { span } };
|
|
174
|
+
const queryResult = await tanstack.refetch(options);
|
|
175
|
+
const data = queryResult.data;
|
|
176
|
+
if (data === undefined) {
|
|
177
|
+
throw new Error("TanStack query refetched without data");
|
|
178
|
+
}
|
|
179
|
+
return data;
|
|
180
|
+
},
|
|
181
|
+
catch: (error) => error
|
|
182
|
+
})
|
|
183
|
+
.pipe(Effect.catch((error) => recoverCauseException(error)));
|
|
184
|
+
});
|
|
185
|
+
const handle = {
|
|
186
|
+
awaitResult,
|
|
187
|
+
refetch,
|
|
188
|
+
refresh: () => {
|
|
189
|
+
void tanstack.refetch();
|
|
190
|
+
},
|
|
191
|
+
registry,
|
|
192
|
+
atom
|
|
193
|
+
};
|
|
194
|
+
const fetch = (_options) => refetch().pipe(Effect.exit, Effect.map(AsyncResult.fromExit));
|
|
195
|
+
return [
|
|
196
|
+
result,
|
|
197
|
+
latestSuccessRef,
|
|
198
|
+
fetch,
|
|
199
|
+
handle
|
|
200
|
+
];
|
|
201
|
+
};
|
|
202
|
+
return useQuery;
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuc3RhY2tRdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcm5hbC90YW5zdGFja1F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQVksTUFBTSxtQkFBbUIsQ0FBQTtBQUU1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFbEYsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxLQUFLLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQTtBQUM1RCxPQUFPLEtBQUssSUFBSSxNQUFNLHdCQUF3QixDQUFBO0FBQzlDLE9BQU8sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFBO0FBRWpDLE9BQU8sRUFBRSxRQUFRLEVBQXlCLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFvQixNQUFNLEtBQUssQ0FBQTtBQUNuRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsNkJBQTZCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUM5SCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFHOUMsT0FBTyxFQUFFLGNB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
|
package/dist/intl.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as Context from "effect-app/Context";
|
|
2
2
|
declare const I18n_base: Context.OpaqueClass<I18n, "I18n", {
|
|
3
3
|
locale: import("vue").Ref<string, string>;
|
|
4
4
|
trans: (id: string, values?: Record<string, import("intl-messageformat").PrimitiveType | import("intl-messageformat").FormatXMLElementFn<string, string>>) => string;
|
|
5
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<
|
|
6
|
+
readonly intl: import("./makeIntl.js").IntlShape<string>;
|
|
7
7
|
}>;
|
|
8
8
|
export declare class I18n extends I18n_base {
|
|
9
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").
|
|
11
|
-
static readonly formatMessage: (descriptor: import("@formatjs/intl").MessageDescriptor, values?: Record<string, import("intl-messageformat").
|
|
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
12
|
static readonly intl: import("effect/Effect").Effect<import("./makeIntl.js").IntlShape<string>, never, I18n>;
|
|
13
13
|
}
|
|
14
14
|
export {};
|
package/dist/intl.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intl.d.ts","sourceRoot":"","sources":["../src/intl.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as Context from "effect-app/Context";
|
|
2
2
|
import { accessCn, accessFn } from "effect-app/Context";
|
|
3
3
|
export class I18n extends Context.Opaque()("I18n") {
|
|
4
4
|
static locale = accessCn(this, "locale");
|
|
@@ -6,4 +6,4 @@ export class I18n extends Context.Opaque()("I18n") {
|
|
|
6
6
|
static formatMessage = accessFn(this, "formatMessage");
|
|
7
7
|
static intl = accessCn(this, "intl");
|
|
8
8
|
}
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import type
|
|
5
|
-
import
|
|
6
|
-
|
|
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";
|
|
7
|
+
export * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
7
8
|
export declare const reportRuntimeError: (cause: Cause.Cause<unknown>, extras?: Record<string, unknown>) => Effect.Effect<unknown, never, never>;
|
|
8
|
-
export
|
|
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,
|
|
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,+BAA+B,CAAA;AAsB5D,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,8 +1,9 @@
|
|
|
1
1
|
import { useIntervalFn } from "@vueuse/core";
|
|
2
|
-
import
|
|
3
|
-
import { isHttpClientError } from "effect/
|
|
2
|
+
import * as Cause from "effect/Cause";
|
|
3
|
+
import { isHttpClientError } from "effect/http/HttpClientError";
|
|
4
|
+
import { isProxy, isReactive, isRef, toRaw } from "vue";
|
|
4
5
|
import { reportError } from "./errorReporter.js";
|
|
5
|
-
export * as AsyncResult from "effect/
|
|
6
|
+
export * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
6
7
|
const reportRuntimeError_ = reportError("Runtime");
|
|
7
8
|
const filters = ["TypeError: failed to fetch", "AbortError"].map((_) => _.toLowerCase());
|
|
8
9
|
const determineLevel = (cause) => {
|
|
@@ -21,11 +22,7 @@ const determineLevel = (cause) => {
|
|
|
21
22
|
}
|
|
22
23
|
};
|
|
23
24
|
export const reportRuntimeError = (cause, extras) => reportRuntimeError_(cause, extras, determineLevel(cause));
|
|
24
|
-
|
|
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:
|
|
48
|
-
? (i) => map(self.handler)(i)
|
|
49
|
-
: map(self.handler)
|
|
44
|
+
handler: (i) => map(self.handler)(i)
|
|
50
45
|
});
|
|
51
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLGFBQWEsRUFBNkIsTUFBTSxjQUFjLENBQUE7QUFJdEYsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUF5QixLQUFLLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRWhELE9BQU8sS0FBSyxXQUFXLE1BQU0sK0JBQStCLENBQUE7QUFFNUQsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFbEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyw0QkFBNEIsRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0FBRXhGLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBMkIsRUFBRSxFQUFFO0lBQ3JELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDM0IsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFBO0lBQ2pELFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixLQUFLLGdCQUFnQjtZQUNuQixPQUFPLE1BQWUsQ0FBQTtRQUN4QixLQUFLLGFBQWE7WUFDaEIsT0FBTyxPQUFPLENB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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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
|