@effect-app/vue 4.0.0-beta.33 → 4.0.0-beta.330

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 (148) hide show
  1. package/CHANGELOG.md +2457 -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 +634 -0
  6. package/dist/commander.d.ts.map +1 -0
  7. package/dist/commander.js +1068 -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 +5 -5
  18. package/dist/form.d.ts.map +1 -1
  19. package/dist/form.js +42 -16
  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 +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 +235 -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/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 -14
  53. package/dist/runtime.d.ts.map +1 -1
  54. package/dist/runtime.js +2 -26
  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 +2 -0
  59. package/dist/toast.d.ts.map +1 -0
  60. package/dist/toast.js +2 -0
  61. package/dist/withToast.d.ts +2 -0
  62. package/dist/withToast.d.ts.map +1 -0
  63. package/dist/withToast.js +2 -0
  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 +36 -95
  69. package/src/atomQuery.ts +600 -0
  70. package/src/commander.ts +3408 -0
  71. package/src/{experimental/confirm.ts → confirm.ts} +13 -15
  72. package/src/dependencyMetadata.ts +84 -0
  73. package/src/errorReporter.ts +65 -75
  74. package/src/form.ts +57 -21
  75. package/src/index.ts +7 -7
  76. package/src/internal/tanstackQuery.ts +308 -0
  77. package/src/intl.ts +12 -0
  78. package/src/lib.ts +49 -21
  79. package/src/liveQueryInvalidation.ts +138 -0
  80. package/src/makeClient.ts +971 -1159
  81. package/src/makeIntl.ts +2 -2
  82. package/src/{experimental/makeUseCommand.ts → makeUseCommand.ts} +9 -6
  83. package/src/mutate.ts +406 -153
  84. package/src/query.ts +763 -260
  85. package/src/queryLifetime.ts +74 -0
  86. package/src/routeParams.ts +7 -7
  87. package/src/runtime.ts +1 -31
  88. package/src/suspense.ts +43 -0
  89. package/src/toast.ts +1 -0
  90. package/src/withToast.ts +1 -0
  91. package/test/Mutation.test.ts +181 -24
  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 +3751 -120
  104. package/test/dist/stubs.d.ts.map +1 -1
  105. package/test/dist/stubs.js +190 -30
  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 +24 -19
  109. package/test/form.test.ts +25 -6
  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 +437 -38
  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 +227 -42
  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 -2
  124. package/tsconfig.src.json +34 -34
  125. package/tsconfig.test.json +2 -2
  126. package/vitest.config.ts +5 -5
  127. package/dist/experimental/commander.d.ts +0 -359
  128. package/dist/experimental/commander.d.ts.map +0 -1
  129. package/dist/experimental/commander.js +0 -557
  130. package/dist/experimental/confirm.d.ts.map +0 -1
  131. package/dist/experimental/confirm.js +0 -28
  132. package/dist/experimental/intl.d.ts +0 -16
  133. package/dist/experimental/intl.d.ts.map +0 -1
  134. package/dist/experimental/intl.js +0 -5
  135. package/dist/experimental/makeUseCommand.d.ts.map +0 -1
  136. package/dist/experimental/makeUseCommand.js +0 -13
  137. package/dist/experimental/toast.d.ts +0 -47
  138. package/dist/experimental/toast.d.ts.map +0 -1
  139. package/dist/experimental/toast.js +0 -41
  140. package/dist/experimental/withToast.d.ts +0 -25
  141. package/dist/experimental/withToast.d.ts.map +0 -1
  142. package/dist/experimental/withToast.js +0 -45
  143. package/eslint.config.mjs +0 -24
  144. package/src/experimental/commander.ts +0 -1835
  145. package/src/experimental/intl.ts +0 -9
  146. package/src/experimental/toast.ts +0 -66
  147. package/src/experimental/withToast.ts +0 -99
  148. package/tsconfig.json.bak +0 -12
@@ -0,0 +1,1068 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { reportMessage } from "@effect-app/vue/errorReporter";
3
+ import { deepToRaw, reportRuntimeError } from "@effect-app/vue/lib";
4
+ import { asResult, asStreamResult } from "@effect-app/vue/mutate";
5
+ import { SupportedErrors } from "effect-app/client";
6
+ import * as Context from "effect-app/Context";
7
+ import * as Effect from "effect-app/Effect";
8
+ import * as Layer from "effect-app/Layer";
9
+ import * as Option from "effect-app/Option";
10
+ import * as S from "effect-app/Schema";
11
+ import { isGeneratorFunction, wrapEffect } from "effect-app/utils";
12
+ import * as Cause from "effect/Cause";
13
+ import { flow } from "effect/Function";
14
+ import * as MutableHashMap from "effect/MutableHashMap";
15
+ import * as Predicate from "effect/Predicate";
16
+ import * as Stream from "effect/Stream";
17
+ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
18
+ import { computed, reactive, ref, toRaw } from "vue";
19
+ import { Confirm } from "./confirm.js";
20
+ import { I18n } from "./intl.js";
21
+ import { CurrentToastId, Toast } from "./toast.js";
22
+ import { WithToast } from "./withToast.js";
23
+ export const DefaultIntl = {
24
+ de: {
25
+ "handle.confirmation": "{action} bestätigen?",
26
+ "handle.waiting": "{action} wird ausgeführt...",
27
+ "handle.success": "{action} erfolgreich",
28
+ "handle.with_errors": "{action} fehlgeschlagen",
29
+ "handle.with_warnings": "{action} erfolgreich, mit Warnungen",
30
+ "handle.error_response": "Die Anfrage war nicht erfolgreich:\n{error}\nWir wurden benachrichtigt und werden das Problem in Kürze beheben.",
31
+ "handle.response_error": "Die Antwort konnte nicht verarbeitet werden:\n{error}",
32
+ "handle.request_error": "Die Anfrage konnte nicht gesendet werden:\n{error}",
33
+ "handle.unexpected_error2": "{action} unerwarteter Fehler, probieren sie es in kurze nochmals.",
34
+ "handle.unexpected_error": "Unerwarteter Fehler:\n{error}",
35
+ "handle.not_found": "Das gesuchte war nicht gefunden"
36
+ },
37
+ en: {
38
+ "handle.confirmation": "Confirm {action}?",
39
+ "handle.waiting": "{action} executing...",
40
+ "handle.success": "{action} Success",
41
+ "handle.with_errors": "{action} Failed",
42
+ "handle.with_warnings": "{action}, with warnings",
43
+ "handle.error_response": "There was an error in processing the response:\n{error}\nWe have been notified and will fix the problem shortly.",
44
+ "handle.request_error": "There was an error in the request:\n{error}",
45
+ "handle.response_error": "The request was not successful:\n{error}",
46
+ "handle.unexpected_error2": "{action} unexpected error, please try again shortly.",
47
+ "handle.unexpected_error": "Unexpected Error:\n{error}",
48
+ "handle.not_found": "The requested item was not found."
49
+ }
50
+ };
51
+ export class CommandContext extends Context.Service()("CommandContext") {
52
+ }
53
+ /**
54
+ * Service available inside `streamFn` stream handlers that lets you imperatively push
55
+ * progress updates to the command's reactive `progress` ref.
56
+ *
57
+ * Use `Command.mapProgress(fn)` or `Command.updateProgress(progress)` to interact with this service.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * // Using mapProgress (recommended) — applied as a stream pipe operator:
62
+ * const exportCmd = Command.streamFn("exportData")(
63
+ * function*(arg, ctx) {
64
+ * return makeExportStream(arg.id).pipe(
65
+ * Command.mapProgress((r) =>
66
+ * AsyncResult.isSuccess(r) && r.value._tag === "OperationProgress"
67
+ * ? { text: `${r.value.completed}/${r.value.total}`, percentage: r.value.completed / r.value.total * 100 }
68
+ * : undefined
69
+ * )
70
+ * )
71
+ * }
72
+ * )
73
+ * // exportCmd.progress is updated for every OperationProgress event
74
+ * ```
75
+ */
76
+ export class CommandProgress extends Context.Reference("Commander.CommandProgress", {
77
+ defaultValue: () => ({ update: (_progress) => Effect.void })
78
+ }) {
79
+ }
80
+ /**
81
+ * Use to wrap emit calls with a callback to signal completion.
82
+ * Useful when the publisher wants to wait for the subscriber to finish processing.
83
+ */
84
+ export const wrapEmit = (emit, event) => (value) => new Promise((resolve) => emit(event, value, resolve));
85
+ export class CommanderErrorRenderers extends Context.Reference("Commander.ErrorRenderers", {
86
+ defaultValue: () => []
87
+ }) {
88
+ }
89
+ export const makeRegisteredErrorRenderer = (guard, render) => ({
90
+ guard,
91
+ render
92
+ });
93
+ const renderErrorMaker = Effect.gen(function* () {
94
+ const { intl } = yield* I18n;
95
+ const registeredRenderers = yield* CommanderErrorRenderers;
96
+ return ((action, errorRenderer) => (e, ...args) => {
97
+ if (errorRenderer) {
98
+ const m = errorRenderer(e, action, ...args);
99
+ if (m !== undefined) {
100
+ return m;
101
+ }
102
+ }
103
+ for (const entry of registeredRenderers) {
104
+ if (!entry.guard(e)) {
105
+ continue;
106
+ }
107
+ const m = entry.render(e);
108
+ if (m !== undefined) {
109
+ return m;
110
+ }
111
+ }
112
+ if (!S.is(SupportedErrors)(e) && !S.isSchemaError(e)) {
113
+ if (typeof e === "object" && e !== null) {
114
+ if ("message" in e) {
115
+ return `${e.message}`;
116
+ }
117
+ if ("_tag" in e) {
118
+ return `${e._tag}`;
119
+ }
120
+ }
121
+ return "";
122
+ }
123
+ const e2 = e;
124
+ if (e2._tag === "NotFoundError") {
125
+ return intl.formatMessage({ id: "handle.not_found" }, { type: e2.type, id: String(e2.id) });
126
+ }
127
+ if (e2._tag === "SchemaError") {
128
+ console.warn(e2.toString());
129
+ return intl.formatMessage({ id: "validation.failed" });
130
+ }
131
+ return e2.message ?? e2._tag ?? e2;
132
+ });
133
+ });
134
+ const defaultFailureMessageHandler = (actionMaker, errorRenderer) => Effect.fnUntraced(function* (o, ...args) {
135
+ const action = yield* wrapEffect(actionMaker)(o, ...args);
136
+ const { intl } = yield* I18n;
137
+ const renderError = yield* renderErrorMaker;
138
+ return Option.match(o, {
139
+ onNone: () => intl.formatMessage({ id: "handle.unexpected_error2" }, {
140
+ action,
141
+ error: "" // TODO consider again Cause.pretty(cause), // will be reported to Sentry/Otel anyway.. and we shouldn't bother users with error dumps?
142
+ }),
143
+ onSome: (e) => {
144
+ const rendered = renderError(action, errorRenderer)(e, ...args);
145
+ return {
146
+ level: "warn",
147
+ message: `${intl.formatMessage({ id: "handle.with_errors" }, { action })}:\n` + rendered
148
+ };
149
+ }
150
+ });
151
+ });
152
+ export const CommanderStatic = {
153
+ accessArgs: (cb) => (self, arg, arg2) => cb(arg, arg2)(self),
154
+ /**
155
+ * Stream pipe operator that maps each emitted value to a `Progress` entry and updates the
156
+ * command's reactive `progress` ref via the `CommandProgress` service.
157
+ *
158
+ * The mapper receives an `AsyncResult<A, E>` (each emitted value wrapped as
159
+ * `AsyncResult.success(value, { waiting: true })`), matching the same shape used by
160
+ * `CommandButton`'s `:progress-map` prop.
161
+ *
162
+ * Designed to be used inside a `streamFn` handler (either directly with `.pipe()`, or as
163
+ * a combinator argument):
164
+ *
165
+ * @example
166
+ * ```ts
167
+ * // Inside the handler body:
168
+ * Command.streamFn("exportData")(function*(arg, ctx) {
169
+ * return makeExportStream(arg.id).pipe(
170
+ * Command.mapProgress((r) =>
171
+ * AsyncResult.isSuccess(r) && r.value._tag === "OperationProgress"
172
+ * ? { text: `${r.value.completed}/${r.value.total}`, percentage: r.value.completed / r.value.total * 100 }
173
+ * : undefined
174
+ * )
175
+ * )
176
+ * })
177
+ *
178
+ * // Or as a stream combinator argument:
179
+ * Command.streamFn("exportData")(
180
+ * function*(arg, ctx) { return makeExportStream(arg.id) },
181
+ * (s) => s.pipe(Command.mapProgress((r) => AsyncResult.isSuccess(r) && r.value._tag === "OperationProgress" ? { text: `${r.value.completed}/${r.value.total}` } : undefined))
182
+ * )
183
+ * ```
184
+ */
185
+ mapProgress: (fn) => (stream) => stream.pipe(Stream.tap((v) => {
186
+ const p = fn(AsyncResult.success(v, { waiting: true }));
187
+ return p !== undefined ? CommandProgress.use((s) => s.update(p)) : Effect.void;
188
+ })),
189
+ /**
190
+ * Imperatively push a progress update from inside a `streamFn` handler.
191
+ * Requires `CommandProgress` to be in context — provided automatically for all `streamFn` streams.
192
+ *
193
+ * @example
194
+ * ```ts
195
+ * // In a streamFn handler:
196
+ * stream.pipe(
197
+ * Stream.tap((event) =>
198
+ * event._tag === "OperationProgress"
199
+ * ? Command.updateProgress({ text: `${event.completed}/${event.total}`, percentage: event.completed / event.total * 100 })
200
+ * : Effect.void
201
+ * )
202
+ * )
203
+ * ```
204
+ */
205
+ updateProgress: (progress) => CommandProgress.use((s) => s.update(progress)),
206
+ /** Version of @see confirmOrInterrupt that automatically includes the action name in the default messages */
207
+ confirmOrInterrupt: Effect.fnUntraced(function* (message) {
208
+ const context = yield* CommandContext;
209
+ const { intl } = yield* I18n;
210
+ yield* Confirm.confirmOrInterrupt(message
211
+ ?? intl.formatMessage({ id: "handle.confirmation" }, { action: context.action }));
212
+ }),
213
+ /** Version of @see confirm that automatically includes the action name in the default messages */
214
+ confirm: Effect.fnUntraced(function* (message) {
215
+ const context = yield* CommandContext;
216
+ const { intl } = yield* I18n;
217
+ return yield* Confirm.confirm(message
218
+ ?? intl.formatMessage({ id: "handle.confirmation" }, { action: context.action }));
219
+ }),
220
+ updateAction: (update) => (_, ...input) => Effect.updateService(_, CommandContext, (c) => ({ ...c, action: update(c.action, ...input) })),
221
+ registerErrorRenderer: (guard, render) => Layer.effect(CommanderErrorRenderers, Effect.gen(function* () {
222
+ const current = yield* CommanderErrorRenderers;
223
+ return [...current, makeRegisteredErrorRenderer(guard, render)];
224
+ })),
225
+ defaultFailureMessageHandler,
226
+ renderError: renderErrorMaker,
227
+ /**
228
+ * Version of withDefaultToast that automatically includes the action name in the default messages and uses intl.
229
+ * uses the Command id as i18n namespace. `action.{id}` is the main action name,
230
+ * and `action.{id}.waiting`, `action.{id}.success`, `action.{id}.failure` can be used to override the default messages for the respective states.
231
+ *
232
+ * the computed `state` provided to the Command can be used for interpolation in the i18n messages. (the state is captured at the start of each command execution and remains stable throughout)
233
+ *
234
+ * Note: if you provide `onWaiting` or `onSuccess` as `null`, no toast will be shown for that state.
235
+ * If you provide a string or function, it will be used instead of the i18n message.
236
+ * If you provide an `errorRenderer`, it will be used to render errors in the failure message.
237
+ */
238
+ withDefaultToast: (options) => Effect.fnUntraced(function* (self, ...args) {
239
+ const cc = yield* CommandContext;
240
+ const { intl } = yield* I18n;
241
+ const withToast = yield* WithToast;
242
+ const customWaiting = cc.namespaced("waiting");
243
+ const hasCustomWaiting = !!intl.messages[customWaiting];
244
+ const customSuccess = cc.namespaced("success");
245
+ const hasCustomSuccess = !!intl.messages[customSuccess];
246
+ const customFailure = cc.namespaced("failure");
247
+ const hasCustomFailure = !!intl.messages[customFailure];
248
+ const stableToastId = options?.stableToastId
249
+ ? typeof options.stableToastId === "string"
250
+ ? options.stableToastId
251
+ : typeof options.stableToastId === "boolean"
252
+ ? cc.id
253
+ : typeof options.stableToastId === "function"
254
+ ? (...args) => {
255
+ const r = options.stableToastId(cc.id, ...args);
256
+ if (typeof r === "string")
257
+ return r;
258
+ if (r === true)
259
+ return cc.id;
260
+ return undefined;
261
+ }
262
+ : undefined
263
+ : undefined;
264
+ return yield* self.pipe((_) => withToast({
265
+ onWaiting: options?.onWaiting === null ? null : hasCustomWaiting
266
+ ? intl.formatMessage({
267
+ id: customWaiting
268
+ }, cc.state)
269
+ : intl.formatMessage({ id: "handle.waiting" }, { action: cc.action }),
270
+ onSuccess: options?.onSuccess === null
271
+ ? null
272
+ : (_a, ..._args) => hasCustomSuccess
273
+ ? intl.formatMessage({ id: customSuccess }, cc.state)
274
+ : intl.formatMessage({ id: "handle.success" }, { action: cc.action }),
275
+ onFailure: defaultFailureMessageHandler(hasCustomFailure ? intl.formatMessage({ id: customFailure }, cc.state) : cc.action, options?.errorRenderer),
276
+ stableToastId,
277
+ groupId: cc.id,
278
+ ...options?.showSpanInfo === false ? { showSpanInfo: options.showSpanInfo } : {}
279
+ })(_, ...args));
280
+ }),
281
+ /**
282
+ * Stream-aware version of `withDefaultToast`. Use this as a combinator inside `streamFn`
283
+ * (or anywhere a `Stream` needs toast lifecycle handling) instead of `withDefaultToast`.
284
+ *
285
+ * Unlike `withDefaultToast` (which only wraps the initial `Effect`), this combinator:
286
+ * - Shows the "waiting" toast **before** the stream starts
287
+ * - Updates the waiting toast with progress text when `progress` is set and a new element arrives
288
+ * - Shows the "success" toast only **after** the stream drains fully without error
289
+ * - Shows the "failure" toast if the stream errors or fails
290
+ *
291
+ * Accepts either a `Stream<A, E, R>` or an `Effect<Stream<A, E, R>, EE, ER>` as input,
292
+ * so it works in both the `NonGenStream` and `StreamGen` overloads of `streamFn`.
293
+ *
294
+ * @example
295
+ * ```ts
296
+ * Command.streamFn("exportData")(
297
+ * function*(arg, ctx) { return makeExportStream(arg.id) },
298
+ * Command.withDefaultToastStream({
299
+ * progress: (r) =>
300
+ * AsyncResult.isSuccess(r) && r.value._tag === "OperationProgress"
301
+ * ? { text: `${r.value.completed}/${r.value.total}`, percentage: r.value.completed / r.value.total * 100 }
302
+ * : undefined
303
+ * })
304
+ * )
305
+ * ```
306
+ */
307
+ withDefaultToastStream: (options) => (self, ...args) => {
308
+ const rawStream = Stream.isStream(self)
309
+ ? self
310
+ : Stream.unwrap(self);
311
+ return Stream.unwrap(Effect.gen(function* () {
312
+ const cc = yield* CommandContext;
313
+ const { intl } = yield* I18n;
314
+ const toast = yield* Toast;
315
+ const customWaiting = cc.namespaced("waiting");
316
+ const hasCustomWaiting = !!intl.messages[customWaiting];
317
+ const customSuccess = cc.namespaced("success");
318
+ const hasCustomSuccess = !!intl.messages[customSuccess];
319
+ const customFailure = cc.namespaced("failure");
320
+ const hasCustomFailure = !!intl.messages[customFailure];
321
+ const stableToastId = options?.stableToastId
322
+ ? typeof options.stableToastId === "string"
323
+ ? options.stableToastId
324
+ : typeof options.stableToastId === "boolean"
325
+ ? cc.id
326
+ : typeof options.stableToastId === "function"
327
+ ? (() => {
328
+ const r = options.stableToastId(cc.id, ...args);
329
+ if (typeof r === "string")
330
+ return r;
331
+ if (r === true)
332
+ return cc.id;
333
+ return undefined;
334
+ })()
335
+ : undefined
336
+ : undefined;
337
+ const baseTimeout = 3_000;
338
+ const waitingMsg = options?.onWaiting === null
339
+ ? null
340
+ : typeof options?.onWaiting === "string"
341
+ ? options.onWaiting
342
+ : typeof options?.onWaiting === "function"
343
+ ? options.onWaiting(cc.id, ...args) ?? null
344
+ : hasCustomWaiting
345
+ ? intl.formatMessage({ id: customWaiting }, cc.state)
346
+ : intl.formatMessage({ id: "handle.waiting" }, { action: cc.action });
347
+ const toastId = waitingMsg === null
348
+ ? stableToastId
349
+ : stableToastId ?? `wait-${Math.random().toString(36).slice(2)}`;
350
+ const requestId = yield* Effect.currentSpan.pipe(Effect.map((span) => span.traceId), Effect.orElseSucceed(() => S.StringId.make()));
351
+ const meta = { groupId: cc.id, requestId };
352
+ if (waitingMsg !== null) {
353
+ yield* toast.info(waitingMsg, { id: toastId, timeout: Infinity, ...meta });
354
+ }
355
+ const failureHandler = defaultFailureMessageHandler(hasCustomFailure ? intl.formatMessage({ id: customFailure }, cc.state) : cc.action, options?.errorRenderer);
356
+ let lastValue = undefined;
357
+ let didFail = false;
358
+ const composed = rawStream.pipe(Stream.tap((v) => Effect.gen(function* () {
359
+ lastValue = v;
360
+ if (options?.progress !== undefined) {
361
+ const p = options.progress(AsyncResult.success(v, { waiting: true }));
362
+ if (p !== undefined) {
363
+ // Update CommandProgress so CommandButton progress indicator is also driven
364
+ yield* CommandProgress.use((s) => s.update(p));
365
+ if (toastId !== undefined) {
366
+ const progressText = typeof p === "string" ? p : p.text;
367
+ const msg = waitingMsg ? `${waitingMsg}\n${progressText}` : progressText;
368
+ yield* toast.info(msg, { id: toastId, timeout: Infinity, ...meta });
369
+ }
370
+ }
371
+ }
372
+ })), Stream.tapCause(Effect.fnUntraced(function* (cause) {
373
+ didFail = true;
374
+ if (Cause.hasInterruptsOnly(cause)) {
375
+ if (toastId !== undefined)
376
+ yield* toast.dismiss(toastId);
377
+ return;
378
+ }
379
+ const spanInfo = options?.showSpanInfo !== false
380
+ ? yield* Effect.currentSpan.pipe(Effect.map((span) => `\nTrace: ${span.traceId}\nSpan: ${span.spanId}`), Effect.orElseSucceed(() => ""))
381
+ : "";
382
+ const t = yield* failureHandler(Cause.findErrorOption(cause));
383
+ const opts = { timeout: baseTimeout * 2, ...meta };
384
+ if (typeof t === "object") {
385
+ const message = t.message + spanInfo;
386
+ yield* t.level === "warn"
387
+ ? toast.warning(message, toastId !== undefined ? { ...opts, id: toastId } : opts)
388
+ : toast.error(message, toastId !== undefined ? { ...opts, id: toastId } : opts);
389
+ }
390
+ else {
391
+ yield* toast.error(t + spanInfo, toastId !== undefined ? { ...opts, id: toastId } : opts);
392
+ }
393
+ }, Effect.uninterruptible)), Stream.ensuring(Effect.suspend(() => {
394
+ if (didFail)
395
+ return Effect.void;
396
+ if (options?.onSuccess === null)
397
+ return Effect.void;
398
+ const successMsg = typeof options?.onSuccess === "string"
399
+ ? options.onSuccess
400
+ : typeof options?.onSuccess === "function"
401
+ ? options.onSuccess(lastValue, cc.action, ...args) ?? null
402
+ : hasCustomSuccess
403
+ ? intl.formatMessage({ id: customSuccess }, cc.state)
404
+ : intl.formatMessage({ id: "handle.success" }, { action: cc.action });
405
+ if (successMsg === null)
406
+ return Effect.void;
407
+ return toast.success(successMsg, toastId !== undefined
408
+ ? { id: toastId, timeout: baseTimeout, ...meta }
409
+ : { timeout: baseTimeout, ...meta });
410
+ })));
411
+ return (toastId !== undefined
412
+ ? composed.pipe(Stream.provideService(CurrentToastId, CurrentToastId.of({ toastId })))
413
+ : composed);
414
+ }));
415
+ },
416
+ /** borrowing the idea from Families in Effect Atom */
417
+ family: (maker, keyMaker) => {
418
+ const commands = MutableHashMap.empty();
419
+ const registry = new FinalizationRegistry((arg) => {
420
+ MutableHashMap.remove(commands, arg);
421
+ });
422
+ return (_k) => {
423
+ const k = keyMaker ? keyMaker(_k) : _k;
424
+ // we want to compare structurally, unless custom equal/hash has been implemented
425
+ const item = MutableHashMap.get(commands, k).pipe(Option.flatMap((r) => Option.fromNullishOr(r.deref())));
426
+ if (item.value) {
427
+ return item.value;
428
+ }
429
+ const v = maker(k);
430
+ MutableHashMap.set(commands, k, new WeakRef(v));
431
+ registry.register(v, k);
432
+ return v;
433
+ };
434
+ }
435
+ };
436
+ const makeBaseInfo = (id, options) => {
437
+ if (!id)
438
+ throw new Error("must specify an id");
439
+ const i18nKey = options?.i18nCustomKey ?? id;
440
+ const namespace = `action.${i18nKey}`;
441
+ const context = {
442
+ id,
443
+ i18nKey,
444
+ namespace,
445
+ namespaced: (k) => `${namespace}.${k}`
446
+ };
447
+ return context;
448
+ };
449
+ const waitState = ref({});
450
+ const registerWait = (id) => {
451
+ // console.debug("register wait", id)
452
+ waitState.value[id] = waitState.value[id] ? waitState.value[id] + 1 : 1;
453
+ };
454
+ const unregisterWait = (id) => {
455
+ // console.debug("unregister wait", id)
456
+ if (waitState.value[id]) {
457
+ waitState.value[id] = waitState.value[id] - 1;
458
+ if (waitState.value[id] <= 0) {
459
+ delete waitState.value[id];
460
+ }
461
+ }
462
+ };
463
+ const getStateValues = (options) => {
464
+ const state_ = options?.state;
465
+ const state = !state_ ? computed(() => undefined) : typeof state_ === "function"
466
+ ? computed(state_)
467
+ : state_;
468
+ return state;
469
+ };
470
+ // class preserves JSDoc throughout..
471
+ export class CommanderImpl {
472
+ rt;
473
+ intl;
474
+ hooks;
475
+ constructor(rt, intl, hooks) {
476
+ this.rt = rt;
477
+ this.intl = intl;
478
+ this.hooks = hooks;
479
+ }
480
+ makeContext = (id, options) => {
481
+ if (!id)
482
+ throw new Error("must specify an id");
483
+ const i18nKey = options?.i18nCustomKey ?? id;
484
+ const namespace = `action.${i18nKey}`;
485
+ // must remain stable through out single call
486
+ const action = this.intl.formatMessage({
487
+ id: namespace,
488
+ defaultMessage: id
489
+ }, { ...options?.state, _isLabel: false });
490
+ const label = this.intl.formatMessage({
491
+ id: namespace,
492
+ defaultMessage: id
493
+ }, { ...options?.state, _isLabel: true });
494
+ const context = CommandContext.of({
495
+ ...makeBaseInfo(id, options),
496
+ action,
497
+ label,
498
+ state: options?.state
499
+ });
500
+ return context;
501
+ };
502
+ makeCommand = (id_, options, errorDef) => {
503
+ const id = typeof id_ === "string" ? id_ : id_.id;
504
+ const state = getStateValues(options);
505
+ return Object.assign((handler) => {
506
+ // we capture the definition stack here, so we can append it to later stack traces
507
+ const limit = Error.stackTraceLimit;
508
+ Error.stackTraceLimit = 2;
509
+ const localErrorDef = new Error();
510
+ Error.stackTraceLimit = limit;
511
+ if (!errorDef) {
512
+ errorDef = localErrorDef;
513
+ }
514
+ const key = `Commander.Command.${id}.state`;
515
+ const stateTag = Context.Service(key);
516
+ const makeContext_ = () => this.makeContext(id, { ...options, state: state?.value });
517
+ const initialContext = makeContext_();
518
+ const context = computed(() => makeContext_());
519
+ const action = computed(() => context.value.action);
520
+ const label = computed(() => context.value.label);
521
+ const errorReporter = (self) => self.pipe(Effect.tapCause(Effect.fnUntraced(function* (cause) {
522
+ if (Cause.hasInterruptsOnly(cause)) {
523
+ console.info(`Interrupted while trying to ${id}`);
524
+ return;
525
+ }
526
+ const fail = Cause.findErrorOption(cause);
527
+ if (Option.isSome(fail)) {
528
+ // if (fail.value._tag === "SuppressErrors") {
529
+ // console.info(
530
+ // `Suppressed error trying to ${action}`,
531
+ // fail.value,
532
+ // )
533
+ // return
534
+ // }
535
+ const message = `Failure trying to ${id}`;
536
+ yield* reportMessage(message, {
537
+ action: id,
538
+ error: fail.value
539
+ });
540
+ return;
541
+ }
542
+ const context = yield* CommandContext;
543
+ const extra = {
544
+ action: context.action,
545
+ message: `Unexpected Error trying to ${id}`
546
+ };
547
+ yield* reportRuntimeError(cause, extra);
548
+ }, Effect.uninterruptible)));
549
+ const currentState = Effect.sync(() => state.value);
550
+ const theHandler = flow(handler, errorReporter,
551
+ // all must be within the Effect.fn to fit within the Span
552
+ Effect.provideServiceEffect(stateTag, currentState), Effect.provideServiceEffect(CommandContext, Effect.sync(() => makeContext_())));
553
+ const waitId = options?.waitKey ? options.waitKey(id) : undefined;
554
+ const blockId = options?.blockKey ? options.blockKey(id) : undefined;
555
+ const [result, exec_] = asResult(theHandler);
556
+ const exec = Effect
557
+ .fnUntraced(function* (...args) {
558
+ if (waitId !== undefined)
559
+ registerWait(waitId);
560
+ if (blockId !== undefined && blockId !== waitId) {
561
+ registerWait(blockId);
562
+ }
563
+ return yield* exec_(...args);
564
+ }, Effect.onExit(() => Effect.sync(() => {
565
+ if (waitId !== undefined)
566
+ unregisterWait(waitId);
567
+ if (blockId !== undefined && blockId !== waitId) {
568
+ unregisterWait(blockId);
569
+ }
570
+ })));
571
+ const waiting = waitId !== undefined
572
+ ? computed(() => result.value.waiting || (waitState.value[waitId] ?? 0) > 0)
573
+ : computed(() => result.value.waiting);
574
+ const blocked = blockId !== undefined
575
+ ? computed(() => waiting.value || (waitState.value[blockId] ?? 0) > 0)
576
+ : computed(() => waiting.value);
577
+ const computeAllowed = options?.allowed;
578
+ const allowed = computeAllowed ? computed(() => computeAllowed(id, state)) : true;
579
+ const rt = Effect.context().pipe(Effect.provide(this.hooks)).pipe(Effect.runSyncWith(this.rt));
580
+ const runFork = Effect.runForkWith(rt);
581
+ const handle = Object.assign((arg) => {
582
+ arg = toRaw(arg); // remove outside vue proxy bs
583
+ // we capture the call site stack here
584
+ const limit = Error.stackTraceLimit;
585
+ Error.stackTraceLimit = 2;
586
+ const errorCall = new Error();
587
+ Error.stackTraceLimit = limit;
588
+ let cache = false;
589
+ const captureStackTrace = () => {
590
+ // in case of an error, we want to append the definition stack to the call site stack,
591
+ // so we can see where the handler was defined too
592
+ if (cache !== false) {
593
+ return cache;
594
+ }
595
+ if (errorCall.stack) {
596
+ const stackDef = errorDef.stack.trim().split("\n");
597
+ const stackCall = errorCall.stack.trim().split("\n");
598
+ let endStackDef = stackDef.slice(2).join("\n").trim();
599
+ if (!endStackDef.includes(`(`)) {
600
+ endStackDef = endStackDef.replace(/at (.*)/, "at ($1)");
601
+ }
602
+ let endStackCall = stackCall.slice(2).join("\n").trim();
603
+ if (!endStackCall.includes(`(`)) {
604
+ endStackCall = endStackCall.replace(/at (.*)/, "at ($1)");
605
+ }
606
+ cache = `${endStackDef}\n${endStackCall}`;
607
+ return cache;
608
+ }
609
+ };
610
+ const command = currentState.pipe(Effect.flatMap((state) => {
611
+ const rawArg = deepToRaw(arg);
612
+ const rawState = deepToRaw(state);
613
+ return Effect.withSpan(exec(arg, { ...context.value, state }), id, {
614
+ captureStackTrace,
615
+ attributes: {
616
+ input: rawArg,
617
+ state: rawState,
618
+ action: initialContext.action,
619
+ label: initialContext.label,
620
+ id: initialContext.id,
621
+ i18nKey: initialContext.i18nKey
622
+ }
623
+ });
624
+ }));
625
+ return runFork(command);
626
+ }, { action, label });
627
+ return reactive({
628
+ /** static */
629
+ id,
630
+ /** the base i18n key, based on id by default. static */
631
+ i18nKey: initialContext.i18nKey,
632
+ /** the `action.` namespace based on i18nKey.. static */
633
+ namespace: initialContext.namespace,
634
+ /** easy generate namespaced 18n keys, based on namespace. static */
635
+ namespaced: initialContext.namespaced,
636
+ /** reactive */
637
+ result,
638
+ /** always undefined for non-stream commands */
639
+ progress: undefined,
640
+ /** reactive */
641
+ waiting,
642
+ /** reactive */
643
+ blocked,
644
+ /** reactive */
645
+ allowed,
646
+ /** reactive */
647
+ action,
648
+ /** reactive */
649
+ label,
650
+ /** reactive */
651
+ state,
652
+ handle
653
+ });
654
+ }, { id });
655
+ };
656
+ // /** @experimental */
657
+ // takeOver:
658
+ // <Args extends any[], A, E, R, const Id extends string>(command: Commander.CommandOut<Args, A, E, R, Id,I18nKey>) =>
659
+ // (...args: Args) => {
660
+ // // we capture the call site stack here
661
+ // const limit = Error.stackTraceLimit
662
+ // Error.stackTraceLimit = 2
663
+ // const errorCall = new Error()
664
+ // const localErrorDef = new Error()
665
+ // Error.stackTraceLimit = limit
666
+ // // TODO
667
+ // const errorDef = localErrorDef
668
+ // let cache: false | string = false
669
+ // const captureStackTrace = () => {
670
+ // // in case of an error, we want to append the definition stack to the call site stack,
671
+ // // so we can see where the handler was defined too
672
+ // if (cache !== false) {
673
+ // return cache
674
+ // }
675
+ // if (errorCall.stack) {
676
+ // const stackDef = errorDef.stack!.trim().split("\n")
677
+ // const stackCall = errorCall.stack.trim().split("\n")
678
+ // let endStackDef = stackDef.slice(2).join("\n").trim()
679
+ // if (!endStackDef.includes(`(`)) {
680
+ // endStackDef = endStackDef.replace(/at (.*)/, "at ($1)")
681
+ // }
682
+ // let endStackCall = stackCall.slice(2).join("\n").trim()
683
+ // if (!endStackCall.includes(`(`)) {
684
+ // endStackCall = endStackCall.replace(/at (.*)/, "at ($1)")
685
+ // }
686
+ // cache = `${endStackDef}\n${endStackCall}`
687
+ // return cache
688
+ // }
689
+ // }
690
+ // return Effect.gen(function*() {
691
+ // const ctx = yield* CommandContext
692
+ // ctx.action = command.action
693
+ // return yield* command.exec(...args).pipe(
694
+ // Effect.flatten,
695
+ // Effect.withSpan(
696
+ // command.action,
697
+ // { captureStackTrace }
698
+ // )
699
+ // )
700
+ // })
701
+ // },
702
+ /**
703
+ * Define a Command for handling user actions with built-in error reporting and state management.
704
+ *
705
+ * @param id The internal identifier for the action. Used as a tracing span and to lookup
706
+ * the user-facing name via internationalization (`action.${id}`).
707
+ * @param options Optional configuration for internationalization and state.
708
+ * @param options.i18nCustomKey Custom i18n key to use instead of `id` (e.g., for grouping similar actions)
709
+ * @param options.state Optional reactive state object (or function returning one) that is
710
+ * made available to the command effects and can be used for i18n interpolation.
711
+ * The state is captured at the start of each command execution and remains stable throughout.
712
+ * @returns A function that executes the command when called (e.g., directly in `@click` handlers).
713
+ * Built-in error reporting handles failures automatically.
714
+ *
715
+ * **Effect Context**: Effects have access to the `CommandContext` service, which provides
716
+ * the user-facing action name.
717
+ *
718
+ * **Returned Properties**:
719
+ * - `action`: User-facing action name from intl messages (useful for button labels)
720
+ * - `result`: The command result state
721
+ * - `waiting`: Boolean indicating if the command is in progress (shorthand for `result.waiting`)
722
+ * - `handle`: Function to execute the command
723
+ * - `exec`: The raw Effect that will be executed when calling `handle` (for advanced use cases)
724
+ * - `i18nKey`, `namespace`, `namespaced`: Helpers for internationalization keys
725
+ *
726
+ * **User Feedback**: Use the `withDefaultToast` helper for status notifications, or render
727
+ * the `result` inline for custom UI feedback.
728
+ */
729
+ fn = (id, options) => {
730
+ const resolvedId = typeof id === "string" ? id : id.id;
731
+ return Object.assign((fn, ...combinators) => {
732
+ // we capture the definition stack here, so we can append it to later stack traces
733
+ const limit = Error.stackTraceLimit;
734
+ Error.stackTraceLimit = 2;
735
+ const errorDef = new Error();
736
+ Error.stackTraceLimit = limit;
737
+ return this.makeCommand(resolvedId, options, errorDef)(Effect.fnUntraced(
738
+ // fnUntraced only supports generators as first arg, so we convert to generator if needed
739
+ isGeneratorFunction(fn) ? fn : function* (...args) {
740
+ return yield* fn(...args);
741
+ }, ...combinators));
742
+ }, makeBaseInfo(resolvedId, options), {
743
+ state: Context.Service(`Commander.Command.${resolvedId}.state`)
744
+ });
745
+ };
746
+ /**
747
+ * Internal factory for stream-backed commands. Accepts a handler that returns a `Stream` directly.
748
+ * Services (`CommandContext`, `stateTag`) are provided to the stream via `Stream.provideServiceEffect`.
749
+ */
750
+ makeStreamCommand = (id_, options, errorDef) => {
751
+ const id = typeof id_ === "string" ? id_ : id_.id;
752
+ const state = getStateValues(options);
753
+ return Object.assign((handler) => {
754
+ const limit = Error.stackTraceLimit;
755
+ Error.stackTraceLimit = 2;
756
+ const localErrorDef = new Error();
757
+ Error.stackTraceLimit = limit;
758
+ if (!errorDef) {
759
+ errorDef = localErrorDef;
760
+ }
761
+ const key = `Commander.Command.${id}.state`;
762
+ const stateTag = Context.Service(key);
763
+ const makeContext_ = () => this.makeContext(id, { ...options, state: state?.value });
764
+ const initialContext = makeContext_();
765
+ const context = computed(() => makeContext_());
766
+ const action = computed(() => context.value.action);
767
+ const label = computed(() => context.value.label);
768
+ const currentState = Effect.sync(() => state.value);
769
+ // Reactive ref driven by the CommandProgress service — updated imperatively
770
+ // from inside the stream via `Command.mapProgress(fn)` or `Command.updateProgress(p)`.
771
+ const progressRef = ref(undefined);
772
+ const commandProgressService = {
773
+ update: (p) => Effect.sync(() => {
774
+ progressRef.value = p;
775
+ })
776
+ };
777
+ const streamErrorReporter = (self) => self.pipe(Stream.tapCause(Effect.fnUntraced(function* (cause) {
778
+ if (Cause.hasInterruptsOnly(cause)) {
779
+ console.info(`Interrupted while trying to ${id}`);
780
+ return;
781
+ }
782
+ const fail = Cause.findErrorOption(cause);
783
+ if (Option.isSome(fail)) {
784
+ const message = `Failure trying to ${id}`;
785
+ yield* reportMessage(message, {
786
+ action: id,
787
+ error: fail.value
788
+ });
789
+ return;
790
+ }
791
+ const ctx = yield* CommandContext;
792
+ const extra = {
793
+ action: ctx.action,
794
+ message: `Unexpected Error trying to ${id}`
795
+ };
796
+ yield* reportRuntimeError(cause, extra);
797
+ }, Effect.uninterruptible)));
798
+ const theStreamHandler = (arg, ctx) => handler(arg, ctx).pipe(streamErrorReporter, Stream.provideService(CommandProgress, commandProgressService), Stream.provideServiceEffect(stateTag, currentState), Stream.provideServiceEffect(CommandContext, Effect.sync(() => makeContext_())));
799
+ const waitId = options?.waitKey ? options.waitKey(id) : undefined;
800
+ const blockId = options?.blockKey ? options.blockKey(id) : undefined;
801
+ const [result, exec_] = asStreamResult(theStreamHandler);
802
+ const exec = Effect
803
+ .fnUntraced(function* (...args) {
804
+ if (waitId !== undefined)
805
+ registerWait(waitId);
806
+ if (blockId !== undefined && blockId !== waitId) {
807
+ registerWait(blockId);
808
+ }
809
+ return yield* exec_(...args);
810
+ }, Effect.onExit(() => Effect.sync(() => {
811
+ if (waitId !== undefined)
812
+ unregisterWait(waitId);
813
+ if (blockId !== undefined && blockId !== waitId) {
814
+ unregisterWait(blockId);
815
+ }
816
+ })));
817
+ const waiting = waitId !== undefined
818
+ ? computed(() => result.value.waiting || (waitState.value[waitId] ?? 0) > 0)
819
+ : computed(() => result.value.waiting);
820
+ const blocked = blockId !== undefined
821
+ ? computed(() => waiting.value || (waitState.value[blockId] ?? 0) > 0)
822
+ : computed(() => waiting.value);
823
+ const computeAllowed = options?.allowed;
824
+ const allowed = computeAllowed ? computed(() => computeAllowed(id, state)) : true;
825
+ const rt = Effect.context().pipe(Effect.provide(this.hooks)).pipe(Effect.runSyncWith(this.rt));
826
+ const runFork = Effect.runForkWith(rt);
827
+ const progress = progressRef;
828
+ const handle = Object.assign((arg) => {
829
+ arg = toRaw(arg);
830
+ progressRef.value = undefined; // reset progress on new invocation
831
+ const limit = Error.stackTraceLimit;
832
+ Error.stackTraceLimit = 2;
833
+ const errorCall = new Error();
834
+ Error.stackTraceLimit = limit;
835
+ let cache = false;
836
+ const captureStackTrace = () => {
837
+ if (cache !== false) {
838
+ return cache;
839
+ }
840
+ if (errorCall.stack) {
841
+ const stackDef = errorDef.stack.trim().split("\n");
842
+ const stackCall = errorCall.stack.trim().split("\n");
843
+ let endStackDef = stackDef.slice(2).join("\n").trim();
844
+ if (!endStackDef.includes(`(`)) {
845
+ endStackDef = endStackDef.replace(/at (.*)/, "at ($1)");
846
+ }
847
+ let endStackCall = stackCall.slice(2).join("\n").trim();
848
+ if (!endStackCall.includes(`(`)) {
849
+ endStackCall = endStackCall.replace(/at (.*)/, "at ($1)");
850
+ }
851
+ cache = `${endStackDef}\n${endStackCall}`;
852
+ return cache;
853
+ }
854
+ };
855
+ const command = currentState.pipe(Effect.flatMap((state) => {
856
+ const rawArg = deepToRaw(arg);
857
+ const rawState = deepToRaw(state);
858
+ return Effect.withSpan(exec(arg, { ...context.value, state }), id, {
859
+ captureStackTrace,
860
+ attributes: {
861
+ input: rawArg,
862
+ state: rawState,
863
+ action: initialContext.action,
864
+ label: initialContext.label,
865
+ id: initialContext.id,
866
+ i18nKey: initialContext.i18nKey
867
+ }
868
+ });
869
+ }));
870
+ return runFork(command);
871
+ }, { action, label });
872
+ return reactive({
873
+ id,
874
+ i18nKey: initialContext.i18nKey,
875
+ namespace: initialContext.namespace,
876
+ namespaced: initialContext.namespaced,
877
+ result,
878
+ /** reactive – progress driven by `Command.mapProgress` or `Command.updateProgress` inside the stream */
879
+ progress,
880
+ waiting,
881
+ blocked,
882
+ allowed,
883
+ action,
884
+ label,
885
+ state,
886
+ handle
887
+ });
888
+ }, { id });
889
+ };
890
+ /**
891
+ * Define a stream-backed Command for handling user actions.
892
+ *
893
+ * Like `fn`, but the body generator (or function) must **return** a `Stream` rather than
894
+ * an `Effect`. The command's `waiting` state stays `true` while the stream is running and
895
+ * is set to `false` once it terminates. The reactive `result` ref is updated for every
896
+ * value emitted by the stream.
897
+ *
898
+ * Three handler shapes are accepted:
899
+ * 1. **Generator returning a Stream** (primary) — may yield Effects freely before returning the stream:
900
+ * ```ts
901
+ * Command.streamFn("exportData")(
902
+ * function*(arg, ctx) {
903
+ * const token = yield* getAuthToken
904
+ * return Stream.fromEffect(startExport(token, arg.id)).pipe(
905
+ * Stream.flatMap((job) => pollProgress(job.id))
906
+ * )
907
+ * }
908
+ * )
909
+ * ```
910
+ * 2. **Function returning a Stream directly**: `(arg, ctx) => Stream.make(1, 2, 3)`
911
+ * 3. **Function returning `Effect<Stream>`**: `(arg, ctx) => Effect.map(setup, (s) => s.stream)`
912
+ *
913
+ * @param id The internal identifier for the action (used for tracing and i18n lookup).
914
+ * @param options Same options as `fn` (`state`, `blockKey`, `waitKey`, `allowed`, `i18nCustomKey`).
915
+ *
916
+ * **Progress** — use `Command.mapProgress(fn)` as a stream pipe operator; the mapper receives
917
+ * `AsyncResult<A, E>` (each value wrapped as `AsyncResult.success(v, { waiting: true })`),
918
+ * matching the same shape as CommandButton’s `:progress-map` prop. Or call
919
+ * `Command.updateProgress(p)` for imperative control:
920
+ *
921
+ * ```ts
922
+ * // mapProgress as a combinator arg (outside the handler):
923
+ * Command.streamFn("exportData")(
924
+ * function*(arg, ctx) { return makeExportStream(arg.id) },
925
+ * (s) => s.pipe(Command.mapProgress((r) => AsyncResult.isSuccess(r) && r.value._tag === "OperationProgress" ? { text: `${r.value.completed}/${r.value.total}` } : undefined))
926
+ * )
927
+ *
928
+ * // Or inline inside the handler body:
929
+ * Command.streamFn("exportData")(function*(arg, ctx) {
930
+ * return makeExportStream(arg.id).pipe(Command.mapProgress((r) => AsyncResult.isSuccess(r) ? ... : undefined))
931
+ * })
932
+ * ```
933
+ *
934
+ * **Pipeable combinators** — the 2nd–Nth args follow the same pattern as `fn`: each combinator
935
+ * receives `(stream, arg, ctx)` and returns a transformed stream:
936
+ * ```ts
937
+ * Command.streamFn("exportData")(
938
+ * handler,
939
+ * (s, arg, ctx) => s.pipe(Command.mapProgress(fn), Stream.take(100))
940
+ * )
941
+ * ```
942
+ *
943
+ * **Returned Properties**: `action`, `label`, `result`, `progress`, `waiting`, `blocked`,
944
+ * `allowed`, `handle`, `i18nKey`, `namespace`, `namespaced`.
945
+ */
946
+ streamFn = (id, options) => {
947
+ const resolvedId = typeof id === "string" ? id : id.id;
948
+ const toRawHandler = (fn) => {
949
+ if (isGeneratorFunction(fn)) {
950
+ return Effect.fnUntraced(function* (arg, ctx) {
951
+ return yield* fn(arg, ctx);
952
+ });
953
+ }
954
+ return fn;
955
+ };
956
+ const toFinalStream = (value) => Stream.isStream(value) ? value : Stream.unwrap(value);
957
+ return Object.assign((fn, ...combinators) => {
958
+ const limit = Error.stackTraceLimit;
959
+ Error.stackTraceLimit = 2;
960
+ const errorDef = new Error();
961
+ Error.stackTraceLimit = limit;
962
+ const rawHandler = toRawHandler(fn);
963
+ const handler = (arg, ctx) => {
964
+ let current = rawHandler(arg, ctx);
965
+ for (const combinator of combinators) {
966
+ current = combinator(current, arg, ctx);
967
+ }
968
+ return toFinalStream(current);
969
+ };
970
+ return this.makeStreamCommand(id, options, errorDef)(handler);
971
+ }, makeBaseInfo(resolvedId, options), {
972
+ state: Context.Service(`Commander.Command.${resolvedId}.state`)
973
+ });
974
+ };
975
+ /** @deprecated */
976
+ alt2 = (_id, options) => {
977
+ const isObject = Predicate.isObjectKeyword(_id);
978
+ const id = isObject ? _id.id : _id;
979
+ const baseInfo = makeBaseInfo(id, options);
980
+ const idCmd = this.makeCommand(id, options);
981
+ // TODO: implement proper tracing stack
982
+ return Object.assign((cb) => idCmd(cb(Object.assign((fn, ...combinators) => Effect.fnUntraced(
983
+ // fnUntraced only supports generators as first arg, so we convert to generator if needed
984
+ isGeneratorFunction(fn) ? fn : function* (...args) {
985
+ return yield* fn(...args);
986
+ }, ...combinators), baseInfo, isObject
987
+ ? { mutate: "mutate" in _id ? _id.mutate : typeof _id === "function" ? _id : undefined }
988
+ : {}))), baseInfo);
989
+ };
990
+ alt = this.makeCommand;
991
+ /**
992
+ * Define a Command for handling user actions with built-in error reporting and state management.
993
+ *
994
+ * @param mutation The mutation function to take the identifier and initial handler from. Used as a tracing span and to lookup
995
+ * the user-facing name via internationalization (`action.${id}`).
996
+ * @param options Optional configuration for internationalization and state.
997
+ * @param options.i18nCustomKey Custom i18n key to use instead of `id` (e.g., for grouping similar actions)
998
+ * @param options.state Optional reactive state object (or function returning one) that is
999
+ * made available to the command effects and can be used for i18n interpolation.
1000
+ * The state is captured at the start of each command execution and remains stable throughout.
1001
+ * @returns A function that executes the command when called (e.g., directly in `@click` handlers).
1002
+ * Built-in error reporting handles failures automatically.
1003
+ *
1004
+ * **Effect Context**: Effects have access to the `CommandContext` service, which provides
1005
+ * the user-facing action name.
1006
+ *
1007
+ * **Returned Properties**:
1008
+ * - `action`: User-facing action name from intl messages (useful for button labels)
1009
+ * - `result`: The command result state
1010
+ * - `waiting`: Boolean indicating if the command is in progress (shorthand for `result.waiting`)
1011
+ * - `handle`: Function to execute the command
1012
+ * - `exec`: The raw Effect that will be executed when calling `handle` (for advanced use cases)
1013
+ * - `i18nKey`, `namespace`, `namespaced`: Helpers for internationalization keys
1014
+ *
1015
+ * **User Feedback**: Use the `withDefaultToast` helper for status notifications, or render
1016
+ * the `result` inline for custom UI feedback.
1017
+ */
1018
+ streamWrap = (handler, id, options) => {
1019
+ return Object.assign((...combinators) => {
1020
+ const limit = Error.stackTraceLimit;
1021
+ Error.stackTraceLimit = 2;
1022
+ const errorDef = new Error();
1023
+ Error.stackTraceLimit = limit;
1024
+ return this.makeStreamCommand(id, options, errorDef)(combinators.length === 0
1025
+ ? handler
1026
+ : (arg, ctx) => {
1027
+ let current = handler(arg, ctx);
1028
+ for (const combinator of combinators) {
1029
+ current = combinator(current, arg, ctx);
1030
+ }
1031
+ return current;
1032
+ });
1033
+ }, makeBaseInfo(id, options), {
1034
+ state: Context.Service(`Commander.Command.${id}.state`)
1035
+ });
1036
+ };
1037
+ wrap = (mutation, options) => {
1038
+ const callMutation = mutation;
1039
+ return Object.assign((...combinators) => {
1040
+ // we capture the definition stack here, so we can append it to later stack traces
1041
+ const limit = Error.stackTraceLimit;
1042
+ Error.stackTraceLimit = 2;
1043
+ const errorDef = new Error();
1044
+ Error.stackTraceLimit = limit;
1045
+ const mutate = "mutate" in callMutation
1046
+ ? callMutation.mutate
1047
+ : callMutation;
1048
+ return this.makeCommand(callMutation.id, options, errorDef)(Effect.fnUntraced(
1049
+ // fnUntraced only supports generators as first arg, so we convert to generator if needed
1050
+ isGeneratorFunction(mutate) ? mutate : function* (arg) {
1051
+ return yield* mutate(arg);
1052
+ }, ...combinators));
1053
+ }, makeBaseInfo(callMutation.id, options), {
1054
+ state: Context.Service(`Commander.Command.${callMutation.id}.state`)
1055
+ });
1056
+ };
1057
+ }
1058
+ // @effect-diagnostics-next-line missingEffectServiceDependency:off
1059
+ export class Commander extends Context.Service()("Commander", {
1060
+ make: Effect.gen(function* () {
1061
+ const i18n = yield* I18n;
1062
+ return (rt, rtHooks) => new CommanderImpl(rt, i18n, rtHooks);
1063
+ })
1064
+ }) {
1065
+ static DefaultWithoutDependencies = Layer.effect(this, this.make);
1066
+ static Default = this.DefaultWithoutDependencies;
1067
+ }
1068
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUVuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRCxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFBO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2xFLE9BQU8sS0FBSyxLQUFLLE1BQU0sY0FBYyxDQUFBO0FBR3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN0QyxPQUFPLEtBQUssY0FBYyxNQUFNLHVCQUF1QixDQUFBO0FBQ3ZELE9BQU8sS0FBSyxTQUFTLE1BQU0sa0JBQWtCLENBQUE7QUFFN0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUE7QUFDdkMsT0FBTyxLQUFLLFdBQVcsTUFBTSx3Q0FBd0MsQ0FBQTtBQUVyRSxPQUFPLEVBQUUsUUFBUSxFQUFvQixRQUFRLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFB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