@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.
Files changed (128) hide show
  1. package/CHANGELOG.md +2701 -0
  2. package/dist/atomQuery.d.ts +120 -0
  3. package/dist/atomQuery.d.ts.map +1 -0
  4. package/dist/atomQuery.js +434 -0
  5. package/dist/commander.d.ts +318 -43
  6. package/dist/commander.d.ts.map +1 -1
  7. package/dist/commander.js +593 -81
  8. package/dist/confirm.d.ts +5 -3
  9. package/dist/confirm.d.ts.map +1 -1
  10. package/dist/confirm.js +12 -14
  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 +5 -5
  18. package/dist/form.d.ts.map +1 -1
  19. package/dist/form.js +16 -10
  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 +204 -0
  23. package/dist/intl.d.ts +4 -4
  24. package/dist/intl.d.ts.map +1 -1
  25. package/dist/intl.js +2 -2
  26. package/dist/lib.d.ts +8 -10
  27. package/dist/lib.d.ts.map +1 -1
  28. package/dist/lib.js +37 -12
  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 +232 -109
  33. package/dist/makeClient.d.ts.map +1 -1
  34. package/dist/makeClient.js +416 -84
  35. package/dist/makeContext.d.ts.map +1 -1
  36. package/dist/makeIntl.d.ts.map +1 -1
  37. package/dist/makeUseCommand.d.ts +3 -2
  38. package/dist/makeUseCommand.d.ts.map +1 -1
  39. package/dist/makeUseCommand.js +2 -2
  40. package/dist/mutate.d.ts +110 -41
  41. package/dist/mutate.d.ts.map +1 -1
  42. package/dist/mutate.js +236 -59
  43. package/dist/query.d.ts +161 -44
  44. package/dist/query.d.ts.map +1 -1
  45. package/dist/query.js +382 -113
  46. package/dist/queryLifetime.d.ts +25 -0
  47. package/dist/queryLifetime.d.ts.map +1 -0
  48. package/dist/queryLifetime.js +54 -0
  49. package/dist/routeParams.d.ts +4 -4
  50. package/dist/routeParams.d.ts.map +1 -1
  51. package/dist/routeParams.js +4 -3
  52. package/dist/runtime.d.ts +1 -17
  53. package/dist/runtime.d.ts.map +1 -1
  54. package/dist/runtime.js +2 -38
  55. package/dist/suspense.d.ts +19 -0
  56. package/dist/suspense.d.ts.map +1 -0
  57. package/dist/suspense.js +38 -0
  58. package/dist/toast.d.ts +1 -45
  59. package/dist/toast.d.ts.map +1 -1
  60. package/dist/toast.js +2 -32
  61. package/dist/withToast.d.ts +1 -24
  62. package/dist/withToast.d.ts.map +1 -1
  63. package/dist/withToast.js +2 -45
  64. package/docs/atom-query-api-redesign.md +207 -0
  65. package/docs/mutation-command-atoms.md +40 -0
  66. package/docs/query-key-invalidation.md +107 -0
  67. package/examples/streamMutation.ts +72 -0
  68. package/package.json +35 -94
  69. package/src/atomQuery.ts +600 -0
  70. package/src/commander.ts +1064 -116
  71. package/src/confirm.ts +12 -14
  72. package/src/dependencyMetadata.ts +84 -0
  73. package/src/errorReporter.ts +65 -75
  74. package/src/form.ts +22 -15
  75. package/src/index.ts +7 -7
  76. package/src/internal/tanstackQuery.ts +308 -0
  77. package/src/intl.ts +2 -2
  78. package/src/lib.ts +51 -23
  79. package/src/liveQueryInvalidation.ts +138 -0
  80. package/src/makeClient.ts +972 -263
  81. package/src/makeIntl.ts +2 -2
  82. package/src/makeUseCommand.ts +8 -5
  83. package/src/mutate.ts +407 -154
  84. package/src/query.ts +758 -242
  85. package/src/queryLifetime.ts +74 -0
  86. package/src/routeParams.ts +7 -7
  87. package/src/runtime.ts +1 -54
  88. package/src/suspense.ts +43 -0
  89. package/src/toast.ts +1 -52
  90. package/src/withToast.ts +1 -99
  91. package/test/Mutation.test.ts +104 -17
  92. package/test/dependencyInvalidation.test.ts +444 -0
  93. package/test/dist/dependencyInvalidation.test.d.ts.map +1 -0
  94. package/test/dist/form.test.d.ts.map +1 -1
  95. package/test/dist/inactiveInvalidation.test.d.ts.map +1 -0
  96. package/test/dist/interrupt-refetch-repro.test.d.ts.map +1 -0
  97. package/test/dist/lib.test.d.ts.map +1 -0
  98. package/test/dist/liveQueryInvalidation.test.d.ts.map +1 -0
  99. package/test/dist/query-span.test.d.ts.map +1 -0
  100. package/test/dist/queryOptions.test.d.ts.map +1 -0
  101. package/test/dist/streamFinal.test.d.ts.map +1 -0
  102. package/test/dist/streamFn.test.d.ts.map +1 -0
  103. package/test/dist/stubs.d.ts +3681 -256
  104. package/test/dist/stubs.d.ts.map +1 -1
  105. package/test/dist/stubs.js +166 -25
  106. package/test/dist/suspense-regression.test.d.ts.map +1 -0
  107. package/test/dist/suspense.test.d.ts.map +1 -0
  108. package/test/form-validation-errors.test.ts +2 -1
  109. package/test/form.test.ts +2 -1
  110. package/test/inactiveInvalidation.test.ts +172 -0
  111. package/test/interrupt-refetch-repro.test.ts +625 -0
  112. package/test/lib.test.ts +240 -0
  113. package/test/liveQueryInvalidation.test.ts +108 -0
  114. package/test/makeClient.test.ts +414 -32
  115. package/test/query-span.test.ts +92 -0
  116. package/test/queryOptions.test.ts +88 -0
  117. package/test/streamFinal.test.ts +64 -0
  118. package/test/streamFn.test.ts +457 -0
  119. package/test/stubs.ts +194 -36
  120. package/test/suspense-regression.test.ts +168 -0
  121. package/test/suspense.test.ts +160 -0
  122. package/tsconfig.examples.json +20 -0
  123. package/tsconfig.json +9 -1
  124. package/tsconfig.src.json +34 -34
  125. package/tsconfig.test.json +2 -2
  126. package/vitest.config.ts +5 -5
  127. package/eslint.config.mjs +0 -24
  128. 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 { Context } from "effect-app";
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<Locale>;
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").PrimitiveType | import("intl-messageformat").FormatXMLElementFn<string, string>> | undefined) => import("effect/Effect").Effect<string, never, I18n>;
11
- static readonly formatMessage: (descriptor: import("@formatjs/intl").MessageDescriptor, values?: Record<string, import("intl-messageformat").PrimitiveType | import("intl-messageformat").FormatXMLElementFn<string, string>> | undefined, opts?: import("intl-messageformat").Options | undefined) => import("effect/Effect").Effect<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
12
  static readonly intl: import("effect/Effect").Effect<import("./makeIntl.js").IntlShape<string>, never, I18n>;
13
13
  }
14
14
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"intl.d.ts","sourceRoot":"","sources":["../src/intl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;;;;;;;AAMpC,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"}
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 { Context } from "effect-app";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50bC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnRsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDcEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUt2RCxNQUFNLE9BQU8sSUFBSyxTQUFRLE9BQU8sQ0FBQyxNQUFNLEVBQW1CLENBQUMsTUFBTSxDQUFDO0lBQ2pFLE1BQU0sQ0FBVSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNqRCxNQUFNLENBQVUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDL0MsTUFBTSxDQUFVLGFBQWEsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sQ0FBVSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQSJ9
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";
6
- export * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
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 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,+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 { Cause, pipe } from "effect-app";
3
- import { isHttpClientError } from "effect/unstable/http/HttpClientError";
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/unstable/reactivity/AsyncResult";
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
- // $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,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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