@effect-app/vue 4.0.0-beta.18 → 4.0.0-beta.181

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 (100) hide show
  1. package/CHANGELOG.md +1275 -0
  2. package/dist/commander.d.ts +450 -0
  3. package/dist/commander.d.ts.map +1 -0
  4. package/dist/commander.js +687 -0
  5. package/dist/confirm.d.ts +19 -0
  6. package/dist/confirm.d.ts.map +1 -0
  7. package/dist/confirm.js +24 -0
  8. package/dist/errorReporter.d.ts +4 -4
  9. package/dist/errorReporter.d.ts.map +1 -1
  10. package/dist/errorReporter.js +12 -18
  11. package/dist/form.d.ts +13 -4
  12. package/dist/form.d.ts.map +1 -1
  13. package/dist/form.js +41 -12
  14. package/dist/index.d.ts +1 -1
  15. package/dist/intl.d.ts +15 -0
  16. package/dist/intl.d.ts.map +1 -0
  17. package/dist/intl.js +9 -0
  18. package/dist/lib.d.ts +6 -8
  19. package/dist/lib.d.ts.map +1 -1
  20. package/dist/lib.js +34 -7
  21. package/dist/makeClient.d.ts +191 -290
  22. package/dist/makeClient.d.ts.map +1 -1
  23. package/dist/makeClient.js +231 -361
  24. package/dist/makeContext.d.ts +1 -1
  25. package/dist/makeContext.d.ts.map +1 -1
  26. package/dist/makeIntl.d.ts +1 -1
  27. package/dist/makeIntl.d.ts.map +1 -1
  28. package/dist/makeUseCommand.d.ts +8 -0
  29. package/dist/makeUseCommand.d.ts.map +1 -0
  30. package/dist/makeUseCommand.js +13 -0
  31. package/dist/mutate.d.ts +57 -25
  32. package/dist/mutate.d.ts.map +1 -1
  33. package/dist/mutate.js +160 -33
  34. package/dist/query.d.ts +11 -15
  35. package/dist/query.d.ts.map +1 -1
  36. package/dist/query.js +19 -27
  37. package/dist/routeParams.d.ts +1 -1
  38. package/dist/runtime.d.ts +5 -2
  39. package/dist/runtime.d.ts.map +1 -1
  40. package/dist/runtime.js +27 -17
  41. package/dist/toast.d.ts +46 -0
  42. package/dist/toast.d.ts.map +1 -0
  43. package/dist/toast.js +32 -0
  44. package/dist/withToast.d.ts +26 -0
  45. package/dist/withToast.d.ts.map +1 -0
  46. package/dist/withToast.js +49 -0
  47. package/eslint.config.mjs +2 -2
  48. package/examples/streamMutation.ts +85 -0
  49. package/package.json +48 -48
  50. package/src/{experimental/commander.ts → commander.ts} +1158 -275
  51. package/src/{experimental/confirm.ts → confirm.ts} +10 -14
  52. package/src/errorReporter.ts +62 -74
  53. package/src/form.ts +55 -16
  54. package/src/intl.ts +12 -0
  55. package/src/lib.ts +46 -13
  56. package/src/makeClient.ts +670 -1038
  57. package/src/{experimental/makeUseCommand.ts → makeUseCommand.ts} +4 -4
  58. package/src/mutate.ts +306 -72
  59. package/src/query.ts +39 -50
  60. package/src/runtime.ts +39 -18
  61. package/src/{experimental/toast.ts → toast.ts} +11 -25
  62. package/src/{experimental/withToast.ts → withToast.ts} +15 -6
  63. package/test/Mutation.test.ts +130 -10
  64. package/test/dist/form.test.d.ts.map +1 -1
  65. package/test/dist/lib.test.d.ts.map +1 -0
  66. package/test/dist/streamFinal.test.d.ts.map +1 -0
  67. package/test/dist/stubs.d.ts +3220 -117
  68. package/test/dist/stubs.d.ts.map +1 -1
  69. package/test/dist/stubs.js +132 -25
  70. package/test/form-validation-errors.test.ts +23 -19
  71. package/test/form.test.ts +20 -2
  72. package/test/lib.test.ts +240 -0
  73. package/test/makeClient.test.ts +240 -38
  74. package/test/streamFinal.test.ts +110 -0
  75. package/test/stubs.ts +172 -42
  76. package/tsconfig.examples.json +20 -0
  77. package/tsconfig.json +0 -1
  78. package/tsconfig.json.bak +5 -2
  79. package/tsconfig.src.json +34 -34
  80. package/tsconfig.test.json +2 -2
  81. package/vitest.config.ts +5 -5
  82. package/dist/experimental/commander.d.ts +0 -359
  83. package/dist/experimental/commander.d.ts.map +0 -1
  84. package/dist/experimental/commander.js +0 -557
  85. package/dist/experimental/confirm.d.ts +0 -19
  86. package/dist/experimental/confirm.d.ts.map +0 -1
  87. package/dist/experimental/confirm.js +0 -28
  88. package/dist/experimental/intl.d.ts +0 -16
  89. package/dist/experimental/intl.d.ts.map +0 -1
  90. package/dist/experimental/intl.js +0 -5
  91. package/dist/experimental/makeUseCommand.d.ts +0 -8
  92. package/dist/experimental/makeUseCommand.d.ts.map +0 -1
  93. package/dist/experimental/makeUseCommand.js +0 -13
  94. package/dist/experimental/toast.d.ts +0 -47
  95. package/dist/experimental/toast.d.ts.map +0 -1
  96. package/dist/experimental/toast.js +0 -41
  97. package/dist/experimental/withToast.d.ts +0 -25
  98. package/dist/experimental/withToast.d.ts.map +0 -1
  99. package/dist/experimental/withToast.js +0 -45
  100. package/src/experimental/intl.ts +0 -9
@@ -0,0 +1,687 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { asResult, deepToRaw, reportRuntimeError } from "@effect-app/vue";
3
+ import { reportMessage } from "@effect-app/vue/errorReporter";
4
+ import { Cause, Context, Effect, flow, Layer, Match, MutableHashMap, Option, Predicate, S } from "effect-app";
5
+ import { SupportedErrors } from "effect-app/client";
6
+ import { OperationFailure, OperationSuccess } from "effect-app/Operations";
7
+ import { isGeneratorFunction, wrapEffect } from "effect-app/utils";
8
+ import { computed, reactive, ref, toRaw } from "vue";
9
+ import { Confirm } from "./confirm.js";
10
+ import { I18n } from "./intl.js";
11
+ import { WithToast } from "./withToast.js";
12
+ export const DefaultIntl = {
13
+ de: {
14
+ "handle.confirmation": "{action} bestätigen?",
15
+ "handle.waiting": "{action} wird ausgeführt...",
16
+ "handle.success": "{action} erfolgreich",
17
+ "handle.with_errors": "{action} fehlgeschlagen",
18
+ "handle.with_warnings": "{action} erfolgreich, mit Warnungen",
19
+ "handle.error_response": "Die Anfrage war nicht erfolgreich:\n{error}\nWir wurden benachrichtigt und werden das Problem in Kürze beheben.",
20
+ "handle.response_error": "Die Antwort konnte nicht verarbeitet werden:\n{error}",
21
+ "handle.request_error": "Die Anfrage konnte nicht gesendet werden:\n{error}",
22
+ "handle.unexpected_error2": "{action} unerwarteter Fehler, probieren sie es in kurze nochmals.",
23
+ "handle.unexpected_error": "Unerwarteter Fehler:\n{error}",
24
+ "handle.not_found": "Das gesuchte war nicht gefunden"
25
+ },
26
+ en: {
27
+ "handle.confirmation": "Confirm {action}?",
28
+ "handle.waiting": "{action} executing...",
29
+ "handle.success": "{action} Success",
30
+ "handle.with_errors": "{action} Failed",
31
+ "handle.with_warnings": "{action}, with warnings",
32
+ "handle.error_response": "There was an error in processing the response:\n{error}\nWe have been notified and will fix the problem shortly.",
33
+ "handle.request_error": "There was an error in the request:\n{error}",
34
+ "handle.response_error": "The request was not successful:\n{error}",
35
+ "handle.unexpected_error2": "{action} unexpected error, please try again shortly.",
36
+ "handle.unexpected_error": "Unexpected Error:\n{error}",
37
+ "handle.not_found": "The requested item was not found."
38
+ }
39
+ };
40
+ export class CommandContext extends Context.Service()("CommandContext") {
41
+ }
42
+ /**
43
+ * Use to wrap emit calls with a callback to signal completion.
44
+ * Useful when the publisher wants to wait for the subscriber to finish processing.
45
+ */
46
+ export const wrapEmit = (emit, event) => (value) => new Promise((resolve) => emit(event, value, resolve));
47
+ export class CommanderErrorRenderers extends Context.Reference("Commander.ErrorRenderers", {
48
+ defaultValue: () => []
49
+ }) {
50
+ }
51
+ export const makeRegisteredErrorRenderer = (guard, render) => ({
52
+ guard,
53
+ render
54
+ });
55
+ const renderErrorMaker = Effect.gen(function* () {
56
+ const { intl } = yield* I18n;
57
+ const registeredRenderers = yield* CommanderErrorRenderers;
58
+ return ((action, errorRenderer) => (e, ...args) => {
59
+ if (errorRenderer) {
60
+ const m = errorRenderer(e, action, ...args);
61
+ if (m !== undefined) {
62
+ return m;
63
+ }
64
+ }
65
+ for (const entry of registeredRenderers) {
66
+ if (!entry.guard(e)) {
67
+ continue;
68
+ }
69
+ const m = entry.render(e);
70
+ if (m !== undefined) {
71
+ return m;
72
+ }
73
+ }
74
+ if (!S.is(SupportedErrors)(e) && !S.isSchemaError(e)) {
75
+ if (typeof e === "object" && e !== null) {
76
+ if ("message" in e) {
77
+ return `${e.message}`;
78
+ }
79
+ if ("_tag" in e) {
80
+ return `${e._tag}`;
81
+ }
82
+ }
83
+ return "";
84
+ }
85
+ const e2 = e;
86
+ return Match.value(e2).pipe(Match.tags({
87
+ NotFoundError: (e) => {
88
+ return intl.formatMessage({ id: "handle.not_found" }, { type: e.type, id: e.id });
89
+ },
90
+ SchemaError: (e) => {
91
+ console.warn(e.toString());
92
+ return intl.formatMessage({ id: "validation.failed" });
93
+ }
94
+ }), Match.orElse((e) => `${e.message ?? e._tag ?? e}`));
95
+ });
96
+ });
97
+ const defaultFailureMessageHandler = (actionMaker, errorRenderer) => Effect.fnUntraced(function* (o, ...args) {
98
+ const action = yield* wrapEffect(actionMaker)(o, ...args);
99
+ const { intl } = yield* I18n;
100
+ const renderError = yield* renderErrorMaker;
101
+ return Option.match(o, {
102
+ onNone: () => intl.formatMessage({ id: "handle.unexpected_error2" }, {
103
+ action,
104
+ error: "" // TODO consider again Cause.pretty(cause), // will be reported to Sentry/Otel anyway.. and we shouldn't bother users with error dumps?
105
+ }),
106
+ onSome: (e) => {
107
+ const rendered = renderError(action, errorRenderer)(e, ...args);
108
+ return S.is(OperationFailure)(e)
109
+ ? {
110
+ level: "warn",
111
+ message: `${intl.formatMessage({ id: "handle.with_warnings" }, { action })}${rendered ? "\n" + rendered : ""}`
112
+ }
113
+ : {
114
+ level: "warn",
115
+ message: `${intl.formatMessage({ id: "handle.with_errors" }, { action })}:\n` + rendered
116
+ };
117
+ }
118
+ });
119
+ });
120
+ export const CommanderStatic = {
121
+ accessArgs: (cb) => (self, arg, arg2) => cb(arg, arg2)(self),
122
+ /** Version of @see confirmOrInterrupt that automatically includes the action name in the default messages */
123
+ confirmOrInterrupt: Effect.fnUntraced(function* (message = undefined) {
124
+ const context = yield* CommandContext;
125
+ const { intl } = yield* I18n;
126
+ yield* Confirm.confirmOrInterrupt(message
127
+ ?? intl.formatMessage({ id: "handle.confirmation" }, { action: context.action }));
128
+ }),
129
+ /** Version of @see confirm that automatically includes the action name in the default messages */
130
+ confirm: Effect.fnUntraced(function* (message = undefined) {
131
+ const context = yield* CommandContext;
132
+ const { intl } = yield* I18n;
133
+ return yield* Confirm.confirm(message
134
+ ?? intl.formatMessage({ id: "handle.confirmation" }, { action: context.action }));
135
+ }),
136
+ updateAction: (update) => (_, ...input) => Effect.updateService(_, CommandContext, (c) => ({ ...c, action: update(c.action, ...input) })),
137
+ registerErrorRenderer: (guard, render) => Layer.effect(CommanderErrorRenderers, Effect.gen(function* () {
138
+ const current = yield* CommanderErrorRenderers;
139
+ return [...current, makeRegisteredErrorRenderer(guard, render)];
140
+ })),
141
+ defaultFailureMessageHandler,
142
+ renderError: renderErrorMaker,
143
+ /**
144
+ * Version of withDefaultToast that automatically includes the action name in the default messages and uses intl.
145
+ * uses the Command id as i18n namespace. `action.{id}` is the main action name,
146
+ * and `action.{id}.waiting`, `action.{id}.success`, `action.{id}.failure` can be used to override the default messages for the respective states.
147
+ *
148
+ * 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)
149
+ *
150
+ * Note: if you provide `onWaiting` or `onSuccess` as `null`, no toast will be shown for that state.
151
+ * If you provide a string or function, it will be used instead of the i18n message.
152
+ * If you provide an `errorRenderer`, it will be used to render errors in the failure message.
153
+ */
154
+ withDefaultToast: (options) => Effect.fnUntraced(function* (self, ...args) {
155
+ const cc = yield* CommandContext;
156
+ const { intl } = yield* I18n;
157
+ const withToast = yield* WithToast;
158
+ const customWaiting = cc.namespaced("waiting");
159
+ const hasCustomWaiting = !!intl.messages[customWaiting];
160
+ const customSuccess = cc.namespaced("success");
161
+ const hasCustomSuccess = !!intl.messages[customSuccess];
162
+ const customFailure = cc.namespaced("failure");
163
+ const hasCustomFailure = !!intl.messages[customFailure];
164
+ const stableToastId = options?.stableToastId
165
+ ? typeof options.stableToastId === "string"
166
+ ? options.stableToastId
167
+ : typeof options.stableToastId === "boolean"
168
+ ? cc.id
169
+ : typeof options.stableToastId === "function"
170
+ ? (...args) => {
171
+ const r = options.stableToastId(cc.id, ...args);
172
+ if (typeof r === "string")
173
+ return r;
174
+ if (r === true)
175
+ return cc.id;
176
+ return undefined;
177
+ }
178
+ : undefined
179
+ : undefined;
180
+ return yield* self.pipe((_) => withToast({
181
+ onWaiting: options?.onWaiting === null ? null : hasCustomWaiting
182
+ ? intl.formatMessage({
183
+ id: customWaiting
184
+ }, cc.state)
185
+ : intl.formatMessage({ id: "handle.waiting" }, { action: cc.action }),
186
+ onSuccess: options?.onSuccess === null
187
+ ? null
188
+ : (a, ..._args) => hasCustomSuccess
189
+ ? intl.formatMessage({ id: customSuccess }, cc.state)
190
+ : (intl.formatMessage({ id: "handle.success" }, { action: cc.action })
191
+ + (S.is(OperationSuccess)(a) && a.message ? "\n" + a.message : "")),
192
+ onFailure: defaultFailureMessageHandler(hasCustomFailure ? intl.formatMessage({ id: customFailure }, cc.state) : cc.action, options?.errorRenderer),
193
+ stableToastId,
194
+ ...options?.showSpanInfo === false ? { showSpanInfo: options.showSpanInfo } : {}
195
+ })(_, ...args));
196
+ }),
197
+ /** borrowing the idea from Families in Effect Atom */
198
+ family: (maker, keyMaker) => {
199
+ const commands = MutableHashMap.empty();
200
+ const registry = new FinalizationRegistry((arg) => {
201
+ MutableHashMap.remove(commands, arg);
202
+ });
203
+ return (_k) => {
204
+ const k = keyMaker ? keyMaker(_k) : _k;
205
+ // we want to compare structurally, unless custom equal/hash has been implemented
206
+ const item = MutableHashMap.get(commands, k).pipe(Option.flatMap((r) => Option.fromNullishOr(r.deref())));
207
+ if (item.value) {
208
+ return item.value;
209
+ }
210
+ const v = maker(k);
211
+ MutableHashMap.set(commands, k, new WeakRef(v));
212
+ registry.register(v, k);
213
+ return v;
214
+ };
215
+ }
216
+ };
217
+ const makeBaseInfo = (id, options) => {
218
+ if (!id)
219
+ throw new Error("must specify an id");
220
+ const i18nKey = options?.i18nCustomKey ?? id;
221
+ const namespace = `action.${i18nKey}`;
222
+ const context = {
223
+ id,
224
+ i18nKey,
225
+ namespace,
226
+ namespaced: (k) => `${namespace}.${k}`
227
+ };
228
+ return context;
229
+ };
230
+ const waitState = ref({});
231
+ const registerWait = (id) => {
232
+ // console.debug("register wait", id)
233
+ waitState.value[id] = waitState.value[id] ? waitState.value[id] + 1 : 1;
234
+ };
235
+ const unregisterWait = (id) => {
236
+ // console.debug("unregister wait", id)
237
+ if (waitState.value[id]) {
238
+ waitState.value[id] = waitState.value[id] - 1;
239
+ if (waitState.value[id] <= 0) {
240
+ delete waitState.value[id];
241
+ }
242
+ }
243
+ };
244
+ const getStateValues = (options) => {
245
+ const state_ = options?.state;
246
+ const state = !state_ ? computed(() => undefined) : typeof state_ === "function"
247
+ ? computed(state_)
248
+ : state_;
249
+ return state;
250
+ };
251
+ // class preserves JSDoc throughout..
252
+ export class CommanderImpl {
253
+ rt;
254
+ intl;
255
+ hooks;
256
+ constructor(rt, intl, hooks) {
257
+ this.rt = rt;
258
+ this.intl = intl;
259
+ this.hooks = hooks;
260
+ }
261
+ makeContext = (id, options) => {
262
+ if (!id)
263
+ throw new Error("must specify an id");
264
+ const i18nKey = options?.i18nCustomKey ?? id;
265
+ const namespace = `action.${i18nKey}`;
266
+ // must remain stable through out single call
267
+ const action = this.intl.formatMessage({
268
+ id: namespace,
269
+ defaultMessage: id
270
+ }, { ...options?.state, _isLabel: false });
271
+ const label = this.intl.formatMessage({
272
+ id: namespace,
273
+ defaultMessage: id
274
+ }, { ...options?.state, _isLabel: true });
275
+ const context = CommandContext.of({
276
+ ...makeBaseInfo(id, options),
277
+ action,
278
+ label,
279
+ state: options?.state
280
+ });
281
+ return context;
282
+ };
283
+ makeCommand = (id_, options, errorDef, streamMeta) => {
284
+ const id = typeof id_ === "string" ? id_ : id_.id;
285
+ const state = getStateValues(options);
286
+ return Object.assign((handler) => {
287
+ // we capture the definition stack here, so we can append it to later stack traces
288
+ const limit = Error.stackTraceLimit;
289
+ Error.stackTraceLimit = 2;
290
+ const localErrorDef = new Error();
291
+ Error.stackTraceLimit = limit;
292
+ if (!errorDef) {
293
+ errorDef = localErrorDef;
294
+ }
295
+ const key = `Commander.Command.${id}.state`;
296
+ const stateTag = Context.Service(key);
297
+ const makeContext_ = () => this.makeContext(id, { ...options, state: state?.value });
298
+ const initialContext = makeContext_();
299
+ const context = computed(() => makeContext_());
300
+ const action = computed(() => context.value.action);
301
+ const label = computed(() => context.value.label);
302
+ const errorReporter = (self) => self.pipe(Effect.tapCause(Effect.fnUntraced(function* (cause) {
303
+ if (Cause.hasInterruptsOnly(cause)) {
304
+ console.info(`Interrupted while trying to ${id}`);
305
+ return;
306
+ }
307
+ const fail = Cause.findErrorOption(cause);
308
+ if (Option.isSome(fail)) {
309
+ // if (fail.value._tag === "SuppressErrors") {
310
+ // console.info(
311
+ // `Suppressed error trying to ${action}`,
312
+ // fail.value,
313
+ // )
314
+ // return
315
+ // }
316
+ const message = `Failure trying to ${id}`;
317
+ yield* reportMessage(message, {
318
+ action: id,
319
+ error: fail.value
320
+ });
321
+ return;
322
+ }
323
+ const context = yield* CommandContext;
324
+ const extra = {
325
+ action: context.action,
326
+ message: `Unexpected Error trying to ${id}`
327
+ };
328
+ yield* reportRuntimeError(cause, extra);
329
+ }, Effect.uninterruptible)));
330
+ const currentState = Effect.sync(() => state.value);
331
+ const theHandler = flow(handler, errorReporter,
332
+ // all must be within the Effect.fn to fit within the Span
333
+ Effect.provideServiceEffect(stateTag, currentState), Effect.provideServiceEffect(CommandContext, Effect.sync(() => makeContext_())));
334
+ const waitId = options?.waitKey ? options.waitKey(id) : undefined;
335
+ const blockId = options?.blockKey ? options.blockKey(id) : undefined;
336
+ const [result, exec_] = asResult(theHandler);
337
+ const exec = Effect
338
+ .fnUntraced(function* (...args) {
339
+ if (waitId !== undefined)
340
+ registerWait(waitId);
341
+ if (blockId !== undefined && blockId !== waitId) {
342
+ registerWait(blockId);
343
+ }
344
+ return yield* exec_(...args);
345
+ }, Effect.onExit(() => Effect.sync(() => {
346
+ if (waitId !== undefined)
347
+ unregisterWait(waitId);
348
+ if (blockId !== undefined && blockId !== waitId) {
349
+ unregisterWait(blockId);
350
+ }
351
+ })));
352
+ const waiting = waitId !== undefined
353
+ ? computed(() => result.value.waiting || (waitState.value[waitId] ?? 0) > 0)
354
+ : computed(() => result.value.waiting);
355
+ const blocked = blockId !== undefined
356
+ ? computed(() => waiting.value || (waitState.value[blockId] ?? 0) > 0)
357
+ : computed(() => waiting.value);
358
+ const computeAllowed = options?.allowed;
359
+ const allowed = computeAllowed ? computed(() => computeAllowed(id, state)) : true;
360
+ const rt = Effect.context().pipe(Effect.provide(this.hooks)).pipe(Effect.runSyncWith(this.rt));
361
+ const runFork = Effect.runForkWith(rt);
362
+ const handle = Object.assign((arg) => {
363
+ arg = toRaw(arg); // remove outside vue proxy bs
364
+ // we capture the call site stack here
365
+ const limit = Error.stackTraceLimit;
366
+ Error.stackTraceLimit = 2;
367
+ const errorCall = new Error();
368
+ Error.stackTraceLimit = limit;
369
+ let cache = false;
370
+ const captureStackTrace = () => {
371
+ // in case of an error, we want to append the definition stack to the call site stack,
372
+ // so we can see where the handler was defined too
373
+ if (cache !== false) {
374
+ return cache;
375
+ }
376
+ if (errorCall.stack) {
377
+ const stackDef = errorDef.stack.trim().split("\n");
378
+ const stackCall = errorCall.stack.trim().split("\n");
379
+ let endStackDef = stackDef.slice(2).join("\n").trim();
380
+ if (!endStackDef.includes(`(`)) {
381
+ endStackDef = endStackDef.replace(/at (.*)/, "at ($1)");
382
+ }
383
+ let endStackCall = stackCall.slice(2).join("\n").trim();
384
+ if (!endStackCall.includes(`(`)) {
385
+ endStackCall = endStackCall.replace(/at (.*)/, "at ($1)");
386
+ }
387
+ cache = `${endStackDef}\n${endStackCall}`;
388
+ return cache;
389
+ }
390
+ };
391
+ const command = currentState.pipe(Effect.flatMap((state) => {
392
+ const rawArg = deepToRaw(arg);
393
+ const rawState = deepToRaw(state);
394
+ return Effect.withSpan(exec(arg, { ...context.value, state }), id, {
395
+ captureStackTrace,
396
+ attributes: {
397
+ input: rawArg,
398
+ state: rawState,
399
+ action: initialContext.action,
400
+ label: initialContext.label,
401
+ id: initialContext.id,
402
+ i18nKey: initialContext.i18nKey
403
+ }
404
+ });
405
+ }));
406
+ return runFork(command);
407
+ }, { action, label });
408
+ return reactive({
409
+ /** static */
410
+ id,
411
+ /** the base i18n key, based on id by default. static */
412
+ i18nKey: initialContext.i18nKey,
413
+ /** the `action.` namespace based on i18nKey.. static */
414
+ namespace: initialContext.namespace,
415
+ /** easy generate namespaced 18n keys, based on namespace. static */
416
+ namespaced: initialContext.namespaced,
417
+ /** reactive */
418
+ result,
419
+ /** reactive – live AsyncResult of the underlying stream, exposed only when
420
+ * the stream factory was called with a `progress` formatter */
421
+ running: streamMeta?.running,
422
+ /** reactive – formatted progress info for current `running` state, when `progress`
423
+ * formatter was supplied to the stream factory */
424
+ progress: streamMeta?.progress,
425
+ /** reactive */
426
+ waiting,
427
+ /** reactive */
428
+ blocked,
429
+ /** reactive */
430
+ allowed,
431
+ /** reactive */
432
+ action,
433
+ /** reactive */
434
+ label,
435
+ /** reactive */
436
+ state,
437
+ handle
438
+ });
439
+ }, { id });
440
+ };
441
+ // /** @experimental */
442
+ // takeOver:
443
+ // <Args extends any[], A, E, R, const Id extends string>(command: Commander.CommandOut<Args, A, E, R, Id,I18nKey>) =>
444
+ // (...args: Args) => {
445
+ // // we capture the call site stack here
446
+ // const limit = Error.stackTraceLimit
447
+ // Error.stackTraceLimit = 2
448
+ // const errorCall = new Error()
449
+ // const localErrorDef = new Error()
450
+ // Error.stackTraceLimit = limit
451
+ // // TODO
452
+ // const errorDef = localErrorDef
453
+ // let cache: false | string = false
454
+ // const captureStackTrace = () => {
455
+ // // in case of an error, we want to append the definition stack to the call site stack,
456
+ // // so we can see where the handler was defined too
457
+ // if (cache !== false) {
458
+ // return cache
459
+ // }
460
+ // if (errorCall.stack) {
461
+ // const stackDef = errorDef.stack!.trim().split("\n")
462
+ // const stackCall = errorCall.stack.trim().split("\n")
463
+ // let endStackDef = stackDef.slice(2).join("\n").trim()
464
+ // if (!endStackDef.includes(`(`)) {
465
+ // endStackDef = endStackDef.replace(/at (.*)/, "at ($1)")
466
+ // }
467
+ // let endStackCall = stackCall.slice(2).join("\n").trim()
468
+ // if (!endStackCall.includes(`(`)) {
469
+ // endStackCall = endStackCall.replace(/at (.*)/, "at ($1)")
470
+ // }
471
+ // cache = `${endStackDef}\n${endStackCall}`
472
+ // return cache
473
+ // }
474
+ // }
475
+ // return Effect.gen(function*() {
476
+ // const ctx = yield* CommandContext
477
+ // ctx.action = command.action
478
+ // return yield* command.exec(...args).pipe(
479
+ // Effect.flatten,
480
+ // Effect.withSpan(
481
+ // command.action,
482
+ // { captureStackTrace }
483
+ // )
484
+ // )
485
+ // })
486
+ // },
487
+ /**
488
+ * Define a Command for handling user actions with built-in error reporting and state management.
489
+ *
490
+ * @param id The internal identifier for the action. Used as a tracing span and to lookup
491
+ * the user-facing name via internationalization (`action.${id}`).
492
+ * @param options Optional configuration for internationalization and state.
493
+ * @param options.i18nCustomKey Custom i18n key to use instead of `id` (e.g., for grouping similar actions)
494
+ * @param options.state Optional reactive state object (or function returning one) that is
495
+ * made available to the command effects and can be used for i18n interpolation.
496
+ * The state is captured at the start of each command execution and remains stable throughout.
497
+ * @returns A function that executes the command when called (e.g., directly in `@click` handlers).
498
+ * Built-in error reporting handles failures automatically.
499
+ *
500
+ * **Effect Context**: Effects have access to the `CommandContext` service, which provides
501
+ * the user-facing action name.
502
+ *
503
+ * **Returned Properties**:
504
+ * - `action`: User-facing action name from intl messages (useful for button labels)
505
+ * - `result`: The command result state
506
+ * - `waiting`: Boolean indicating if the command is in progress (shorthand for `result.waiting`)
507
+ * - `handle`: Function to execute the command
508
+ * - `exec`: The raw Effect that will be executed when calling `handle` (for advanced use cases)
509
+ * - `i18nKey`, `namespace`, `namespaced`: Helpers for internationalization keys
510
+ *
511
+ * **User Feedback**: Use the `withDefaultToast` helper for status notifications, or render
512
+ * the `result` inline for custom UI feedback.
513
+ */
514
+ fn = (id, options) => {
515
+ // Resolve id and (optionally) per-build stream metadata.
516
+ const resolvedId = typeof id === "string" ? id : id.id;
517
+ const isStreamFactory = typeof id === "function" && "id" in id && id.length <= 1;
518
+ const isStreamTuple = Array.isArray(id) && "id" in id;
519
+ const resolveStreamMeta = () => {
520
+ if (isStreamTuple) {
521
+ const t = id;
522
+ return { running: t.running, progress: t.progress };
523
+ }
524
+ if (isStreamFactory) {
525
+ const t = id();
526
+ return { running: t.running, progress: t.progress };
527
+ }
528
+ return undefined;
529
+ };
530
+ return Object.assign((fn, ...combinators) => {
531
+ // we capture the definition stack here, so we can append it to later stack traces
532
+ const limit = Error.stackTraceLimit;
533
+ Error.stackTraceLimit = 2;
534
+ const errorDef = new Error();
535
+ Error.stackTraceLimit = limit;
536
+ const streamMeta = resolveStreamMeta();
537
+ return this.makeCommand(resolvedId, options, errorDef, streamMeta)(Effect.fnUntraced(
538
+ // fnUntraced only supports generators as first arg, so we convert to generator if needed
539
+ isGeneratorFunction(fn) ? fn : function* (...args) {
540
+ return yield* fn(...args);
541
+ }, ...combinators));
542
+ }, makeBaseInfo(resolvedId, options), {
543
+ state: Context.Service(`Commander.Command.${resolvedId}.state`)
544
+ });
545
+ };
546
+ /** @deprecated */
547
+ alt2 = (_id, options) => {
548
+ const isObject = Predicate.isObjectKeyword(_id);
549
+ const id = isObject ? _id.id : _id;
550
+ const baseInfo = makeBaseInfo(id, options);
551
+ const idCmd = this.makeCommand(id, options);
552
+ // TODO: implement proper tracing stack
553
+ return Object.assign((cb) => idCmd(cb(Object.assign((fn, ...combinators) => Effect.fnUntraced(
554
+ // fnUntraced only supports generators as first arg, so we convert to generator if needed
555
+ isGeneratorFunction(fn) ? fn : function* (...args) {
556
+ return yield* fn(...args);
557
+ }, ...combinators), baseInfo, isObject
558
+ ? { mutate: "mutate" in _id ? _id.mutate : typeof _id === "function" ? _id : undefined }
559
+ : {}))), baseInfo);
560
+ };
561
+ alt = this.makeCommand;
562
+ /**
563
+ * Define a Command for handling user actions with built-in error reporting and state management.
564
+ *
565
+ * @param mutation The mutation function to take the identifier and initial handler from. Used as a tracing span and to lookup
566
+ * the user-facing name via internationalization (`action.${id}`).
567
+ * @param options Optional configuration for internationalization and state.
568
+ * @param options.i18nCustomKey Custom i18n key to use instead of `id` (e.g., for grouping similar actions)
569
+ * @param options.state Optional reactive state object (or function returning one) that is
570
+ * made available to the command effects and can be used for i18n interpolation.
571
+ * The state is captured at the start of each command execution and remains stable throughout.
572
+ * @returns A function that executes the command when called (e.g., directly in `@click` handlers).
573
+ * Built-in error reporting handles failures automatically.
574
+ *
575
+ * **Effect Context**: Effects have access to the `CommandContext` service, which provides
576
+ * the user-facing action name.
577
+ *
578
+ * **Returned Properties**:
579
+ * - `action`: User-facing action name from intl messages (useful for button labels)
580
+ * - `result`: The command result state
581
+ * - `waiting`: Boolean indicating if the command is in progress (shorthand for `result.waiting`)
582
+ * - `handle`: Function to execute the command
583
+ * - `exec`: The raw Effect that will be executed when calling `handle` (for advanced use cases)
584
+ * - `i18nKey`, `namespace`, `namespaced`: Helpers for internationalization keys
585
+ *
586
+ * **User Feedback**: Use the `withDefaultToast` helper for status notifications, or render
587
+ * the `result` inline for custom UI feedback.
588
+ */
589
+ wrap = (mutation, options) => {
590
+ if (mutation !== null && typeof mutation === "object" && "mutateStream" in mutation) {
591
+ return this.wrapStream(mutation, options);
592
+ }
593
+ if (Array.isArray(mutation) && "id" in mutation) {
594
+ return this.wrapStream(mutation, options);
595
+ }
596
+ if (typeof mutation === "function" && "id" in mutation && mutation.length <= 1) {
597
+ return this.wrapStream(mutation, options);
598
+ }
599
+ // At this point mutation is either { mutate, id } or (fn & { id })
600
+ const callMutation = mutation;
601
+ return Object.assign((...combinators) => {
602
+ // we capture the definition stack here, so we can append it to later stack traces
603
+ const limit = Error.stackTraceLimit;
604
+ Error.stackTraceLimit = 2;
605
+ const errorDef = new Error();
606
+ Error.stackTraceLimit = limit;
607
+ const mutate = "mutate" in callMutation
608
+ ? callMutation.mutate
609
+ : callMutation;
610
+ return this.makeCommand(callMutation.id, options, errorDef)(Effect.fnUntraced(
611
+ // fnUntraced only supports generators as first arg, so we convert to generator if needed
612
+ isGeneratorFunction(mutate) ? mutate : function* (arg) {
613
+ return yield* mutate(arg);
614
+ }, ...combinators));
615
+ }, makeBaseInfo(callMutation.id, options), {
616
+ state: Context.Service(`Commander.Command.${callMutation.id}.state`)
617
+ });
618
+ };
619
+ /**
620
+ * Define a Command from a stream-type mutation (`mutateStream` factory).
621
+ * The stream's reactive `AsyncResult` ref is exposed as `running` for independent progress tracking.
622
+ * The command's own `result` reflects the execution outcome of the `execute` function.
623
+ * Supports the same combinator pipeline as `wrap` (e.g. `withDefaultToast`).
624
+ *
625
+ * Each invocation of the resulting wrap call produces a fresh `[ref, execute]` pair
626
+ * (the `mutateStream` factory is called once per build), so independent commands
627
+ * don't share progress state.
628
+ *
629
+ * Accepts either:
630
+ * - An object with `id` and `mutateStream` factory (e.g. a client entry)
631
+ * - The `mutateStream` factory directly (callable, with `id`)
632
+ * - An already-called factory result (`[resultRef, execute] & { id }`) — shared ref across builds
633
+ *
634
+ * @example
635
+ * ```ts
636
+ * // Via client entry (recommended):
637
+ * const exportCmd = Command.wrapStream(client.myExport)()
638
+ *
639
+ * // Via factory directly:
640
+ * const exportCmd = Command.wrapStream(client.myExport.mutateStream)()
641
+ *
642
+ * // Via already-called factory (shared ref):
643
+ * const stream = client.myExport.mutateStream()
644
+ * const exportCmd = Command.wrapStream(stream)()
645
+ * ```
646
+ */
647
+ wrapStream = (mutation, options) => {
648
+ const id = mutation.id;
649
+ // Resolve `source` to the factory or already-called tuple.
650
+ const source = mutation !== null && typeof mutation === "object" && "mutateStream" in mutation
651
+ ? mutation.mutateStream
652
+ : mutation;
653
+ const resolveTuple = () => (typeof source === "function" ? source() : source);
654
+ return Object.assign((...combinators) => {
655
+ // we capture the definition stack here, so we can append it to later stack traces
656
+ const limit = Error.stackTraceLimit;
657
+ Error.stackTraceLimit = 2;
658
+ const errorDef = new Error();
659
+ Error.stackTraceLimit = limit;
660
+ // Fresh per build: call the factory once per command instance so each
661
+ // wrap call gets its own ComputedRef + execute pair. `running`/`progress`
662
+ // are only surfaced when the factory was called with a `progress` formatter.
663
+ const tuple = resolveTuple();
664
+ const [, executeRaw] = tuple;
665
+ const mutate = Effect.isEffect(executeRaw)
666
+ ? (_arg) => executeRaw
667
+ : executeRaw;
668
+ const streamMeta = { running: tuple.running, progress: tuple.progress };
669
+ return this.makeCommand(id, options, errorDef, streamMeta)(Effect.fnUntraced(isGeneratorFunction(mutate) ? mutate : function* (arg) {
670
+ return yield* mutate(arg);
671
+ }, ...combinators));
672
+ }, makeBaseInfo(id, options), {
673
+ state: Context.Service(`Commander.Command.${id}.state`)
674
+ });
675
+ };
676
+ }
677
+ // @effect-diagnostics-next-line missingEffectServiceDependency:off
678
+ export class Commander extends Context.Service()("Commander", {
679
+ make: Effect.gen(function* () {
680
+ const i18n = yield* I18n;
681
+ return (rt, rtHooks) => new CommanderImpl(rt, i18n, rtHooks);
682
+ })
683
+ }) {
684
+ static DefaultWithoutDependencies = Layer.effect(this, this.make);
685
+ static Default = this.DefaultWithoutDependencies;
686
+ }
687
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQTRCLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDbkcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQzdELE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBeUIsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3BJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFJbEUsT0FBTyxFQUFFLFFBQVEsRUFBb0IsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQTBEMUMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLEVBQUUsRUFBRTtRQUNGLHFCQUFxQixFQUFFLHNCQUFzQjtRQUM3QyxnQkFBZ0IsRUFBRSw2QkFBNkI7UUFDL0MsZ0JBQWdCLEVBQUUsc0JBQXNCO1FBQ3hDLG9CQUFvQixFQUFFLHlCQUF5QjtRQUMvQyxzQkFBc0IsRUFBRSxxQ0FBcUM7UUFDN0QsdUJBQXVCLEVB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