@effect-app/vue 2.94.0 → 4.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/errorReporter.d.ts +2 -2
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +9 -9
- package/dist/experimental/commander.d.ts +49 -69
- package/dist/experimental/commander.d.ts.map +1 -1
- package/dist/experimental/commander.js +27 -29
- package/dist/experimental/confirm.d.ts +11 -5
- package/dist/experimental/confirm.d.ts.map +1 -1
- package/dist/experimental/confirm.js +19 -6
- package/dist/experimental/intl.d.ts +2 -21
- package/dist/experimental/intl.d.ts.map +1 -1
- package/dist/experimental/intl.js +4 -4
- package/dist/experimental/makeUseCommand.js +2 -2
- package/dist/experimental/toast.d.ts +3 -35
- package/dist/experimental/toast.d.ts.map +1 -1
- package/dist/experimental/toast.js +19 -5
- package/dist/experimental/withToast.d.ts +6 -4
- package/dist/experimental/withToast.d.ts.map +1 -1
- package/dist/experimental/withToast.js +10 -8
- package/dist/form.d.ts +2 -2
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +47 -47
- package/dist/lib.d.ts +1 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +12 -10
- package/dist/makeClient.d.ts +31 -28
- package/dist/makeClient.d.ts.map +1 -1
- package/dist/makeClient.js +31 -32
- package/dist/mutate.d.ts +5 -5
- package/dist/mutate.d.ts.map +1 -1
- package/dist/mutate.js +14 -14
- package/dist/query.d.ts +16 -14
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +37 -28
- package/dist/routeParams.d.ts +2 -4
- package/dist/routeParams.d.ts.map +1 -1
- package/dist/routeParams.js +3 -15
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +4 -4
- package/package.json +19 -20
- package/src/errorReporter.ts +11 -11
- package/src/experimental/commander.ts +83 -86
- package/src/experimental/confirm.ts +21 -6
- package/src/experimental/intl.ts +3 -3
- package/src/experimental/makeUseCommand.ts +1 -1
- package/src/experimental/toast.ts +23 -4
- package/src/experimental/withToast.ts +10 -7
- package/src/form.ts +56 -64
- package/src/lib.ts +11 -9
- package/src/makeClient.ts +70 -63
- package/src/mutate.ts +18 -19
- package/src/query.ts +56 -49
- package/src/routeParams.ts +9 -23
- package/src/runtime.ts +6 -6
- package/test/Mutation.test.ts +52 -53
- package/test/dist/form.test.d.ts.map +1 -1
- package/test/dist/stubs.d.ts +103 -45
- package/test/dist/stubs.d.ts.map +1 -1
- package/test/dist/stubs.js +8 -8
- package/test/form.test.ts +7 -6
- package/test/stubs.ts +43 -41
- package/tsconfig.json +1 -27
package/test/Mutation.test.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { it } from "@effect/vitest"
|
|
3
3
|
import { Cause, Effect, Exit, Fiber, Option } from "effect-app"
|
|
4
|
-
import { type RuntimeFiber } from "effect/Fiber"
|
|
5
4
|
import { CommandContext, DefaultIntl } from "../src/experimental/commander.js"
|
|
6
|
-
import {
|
|
5
|
+
import { AsyncResult } from "../src/lib.js"
|
|
7
6
|
import { useExperimental } from "./stubs.js"
|
|
8
7
|
|
|
9
|
-
const unwrap = <A, E>(r:
|
|
8
|
+
const unwrap = <A, E>(r: Fiber.Fiber<Exit.Exit<A, E>, never>) => Fiber.join(r).pipe(Effect.flatten)
|
|
10
9
|
|
|
11
10
|
// declare const mutation: {
|
|
12
11
|
// name: "myMutation"
|
|
@@ -72,9 +71,9 @@ describe("alt2", () => {
|
|
|
72
71
|
expect(yield* Effect.currentSpan.pipe(Effect.map((_) => _.name))).toBe("Test Action")
|
|
73
72
|
})),
|
|
74
73
|
Effect.tap(() =>
|
|
75
|
-
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => expect(_).toBe("Test Action")))
|
|
74
|
+
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => Effect.sync(() => expect(_).toBe("Test Action"))))
|
|
76
75
|
),
|
|
77
|
-
Effect.tap(() => executed = true)
|
|
76
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
78
77
|
)
|
|
79
78
|
)
|
|
80
79
|
|
|
@@ -89,7 +88,7 @@ describe("alt2", () => {
|
|
|
89
88
|
expect(r).toBe("test-value") // to confirm that the initial function has ran.
|
|
90
89
|
expect(executed).toBe(true) // to confirm that the combinators have ran.
|
|
91
90
|
|
|
92
|
-
expect(command.result.pipe(
|
|
91
|
+
expect(command.result.pipe(AsyncResult.value)).toEqual(Option.some("test-value"))
|
|
93
92
|
|
|
94
93
|
expect(toasts.length).toBe(0)
|
|
95
94
|
|
|
@@ -126,9 +125,9 @@ it.live("works", () =>
|
|
|
126
125
|
expect(yield* Effect.currentSpan.pipe(Effect.map((_) => _.name))).toBe("Test Action")
|
|
127
126
|
})),
|
|
128
127
|
Effect.tap(() =>
|
|
129
|
-
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => expect(_).toBe("Test Action")))
|
|
128
|
+
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => Effect.sync(() => expect(_).toBe("Test Action"))))
|
|
130
129
|
),
|
|
131
|
-
Effect.tap(() => executed = true)
|
|
130
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
132
131
|
)
|
|
133
132
|
expect(command.action).toBe("Test Action")
|
|
134
133
|
expect(command.id).toBe("Test Action")
|
|
@@ -141,7 +140,7 @@ it.live("works", () =>
|
|
|
141
140
|
expect(r).toBe("test-value") // to confirm that the initial function has ran.
|
|
142
141
|
expect(executed).toBe(true) // to confirm that the combinators have ran.
|
|
143
142
|
|
|
144
|
-
expect(command.result.pipe(
|
|
143
|
+
expect(command.result.pipe(AsyncResult.value)).toEqual(Option.some("test-value"))
|
|
145
144
|
|
|
146
145
|
expect(toasts.length).toBe(0)
|
|
147
146
|
|
|
@@ -176,9 +175,9 @@ it.live("works non-gen", () =>
|
|
|
176
175
|
expect(yield* Effect.currentSpan.pipe(Effect.map((_) => _.name))).toBe("Test Action")
|
|
177
176
|
})),
|
|
178
177
|
Effect.tap(() =>
|
|
179
|
-
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => expect(_).toBe("Test Action")))
|
|
178
|
+
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => Effect.sync(() => expect(_).toBe("Test Action"))))
|
|
180
179
|
),
|
|
181
|
-
Effect.tap(() => executed = true)
|
|
180
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
182
181
|
)
|
|
183
182
|
expect(command.action).toBe("Test Action")
|
|
184
183
|
|
|
@@ -188,7 +187,7 @@ it.live("works non-gen", () =>
|
|
|
188
187
|
expect(r).toBe("test-value") // to confirm that the initial function has ran.
|
|
189
188
|
expect(executed).toBe(true) // to confirm that the combinators have ran.
|
|
190
189
|
|
|
191
|
-
expect(command.result.pipe(
|
|
190
|
+
expect(command.result.pipe(AsyncResult.value)).toEqual(Option.some("test-value"))
|
|
192
191
|
|
|
193
192
|
expect(toasts.length).toBe(0)
|
|
194
193
|
}))
|
|
@@ -211,7 +210,7 @@ it.live("has custom action name", () =>
|
|
|
211
210
|
expect(yield* CommandContext).toMatchObject({ action: "Test Action Translated", id: "Test Action" })
|
|
212
211
|
return "test-value"
|
|
213
212
|
},
|
|
214
|
-
Effect.tap(() => executed = true)
|
|
213
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
215
214
|
)
|
|
216
215
|
expect(command.action).toBe("Test Action Translated")
|
|
217
216
|
const r = yield* unwrap(command.handle())
|
|
@@ -235,7 +234,7 @@ it.live("can map the result", () =>
|
|
|
235
234
|
return "test-value"
|
|
236
235
|
},
|
|
237
236
|
Effect.map((_) => _ + _),
|
|
238
|
-
Effect.tap(() => executed = true)
|
|
237
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
239
238
|
)
|
|
240
239
|
const r = yield* unwrap(command.handle())
|
|
241
240
|
|
|
@@ -257,7 +256,7 @@ it.live("can receive and use input", () =>
|
|
|
257
256
|
|
|
258
257
|
return { input1, input2 }
|
|
259
258
|
},
|
|
260
|
-
Effect.tap(() => executed = true)
|
|
259
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
261
260
|
)
|
|
262
261
|
const r = yield* unwrap(command.handle(1))
|
|
263
262
|
|
|
@@ -285,8 +284,8 @@ it.live("can replace the result", () =>
|
|
|
285
284
|
|
|
286
285
|
return "test-value"
|
|
287
286
|
},
|
|
288
|
-
Effect.
|
|
289
|
-
Effect.tap(() => executed = true)
|
|
287
|
+
Effect.andThen(Effect.succeed(42)),
|
|
288
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
290
289
|
)
|
|
291
290
|
const r = yield* unwrap(command.handle())
|
|
292
291
|
|
|
@@ -318,7 +317,7 @@ it.live("with toasts", () =>
|
|
|
318
317
|
expect(yield* Effect.currentSpan.pipe(Effect.map((_) => _.name))).toBe("Test Action")
|
|
319
318
|
})),
|
|
320
319
|
Effect.tap(() =>
|
|
321
|
-
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => expect(_).toBe("Test Action")))
|
|
320
|
+
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => Effect.sync(() => expect(_).toBe("Test Action"))))
|
|
322
321
|
),
|
|
323
322
|
// WithToast.handle({
|
|
324
323
|
// onFailure: "failed",
|
|
@@ -326,7 +325,7 @@ it.live("with toasts", () =>
|
|
|
326
325
|
// onWaiting: null
|
|
327
326
|
// }),
|
|
328
327
|
Command.withDefaultToast(),
|
|
329
|
-
Effect.tap(() => executed = true)
|
|
328
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
330
329
|
)
|
|
331
330
|
|
|
332
331
|
const r = yield* unwrap(command.handle())
|
|
@@ -352,16 +351,16 @@ it.live("interrupted", () =>
|
|
|
352
351
|
return "test-value"
|
|
353
352
|
},
|
|
354
353
|
Command.withDefaultToast(),
|
|
355
|
-
Effect.tap(() => executed = true)
|
|
354
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
356
355
|
)
|
|
357
356
|
|
|
358
357
|
const r = yield* Fiber.join(command.handle())
|
|
359
358
|
|
|
360
359
|
expect(executed).toBe(false) // we were interrupted after all :)
|
|
361
|
-
expect(Exit.
|
|
360
|
+
expect(Exit.hasInterrupts(r)).toBe(true) // to confirm that the initial function has interrupted
|
|
362
361
|
|
|
363
362
|
expect(command.waiting).toBe(false)
|
|
364
|
-
expect(Exit.
|
|
363
|
+
expect(Exit.hasInterrupts(AsyncResult.toExit(command.result))).toBe(true)
|
|
365
364
|
expect(toasts.length).toBe(0) // toast is removed on interruption. TODO: maybe a nicer user experience can be had?
|
|
366
365
|
}))
|
|
367
366
|
|
|
@@ -378,16 +377,16 @@ it.live("fail", () =>
|
|
|
378
377
|
return yield* Effect.fail({ message: "Boom!" })
|
|
379
378
|
},
|
|
380
379
|
Command.withDefaultToast(),
|
|
381
|
-
Effect.tap(() => executed = true)
|
|
380
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
382
381
|
)
|
|
383
382
|
|
|
384
383
|
const r = yield* Fiber.join(command.handle())
|
|
385
384
|
|
|
386
385
|
expect(executed).toBe(false) // we failed after all :)
|
|
387
|
-
expect(Exit.isFailure(r) && Cause.
|
|
386
|
+
expect(Exit.isFailure(r) && Cause.hasFails(r.cause)).toBe(true) // to confirm that the initial function has failed
|
|
388
387
|
|
|
389
388
|
expect(command.waiting).toBe(false)
|
|
390
|
-
expect(Exit.isFailure(
|
|
389
|
+
expect(Exit.isFailure(AsyncResult.toExit(command.result))).toBe(true)
|
|
391
390
|
expect(toasts.length).toBe(1) // toast should show error
|
|
392
391
|
expect(toasts[0].message).toBe("Test Action Failed:\nBoom!")
|
|
393
392
|
}))
|
|
@@ -404,9 +403,9 @@ it.live("fail and recover", () =>
|
|
|
404
403
|
expect(toasts.length).toBe(1)
|
|
405
404
|
return yield* Effect.fail({ message: "Boom!" })
|
|
406
405
|
},
|
|
407
|
-
Effect.
|
|
406
|
+
Effect.orElseSucceed(() => "recovered"), // we recover from the error here, so the final result is success
|
|
408
407
|
Command.withDefaultToast(),
|
|
409
|
-
Effect.tap(() => executed = true)
|
|
408
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
410
409
|
)
|
|
411
410
|
|
|
412
411
|
const r = yield* unwrap(command.handle())
|
|
@@ -415,7 +414,7 @@ it.live("fail and recover", () =>
|
|
|
415
414
|
expect(r).toBe("recovered") // to confirm that the initial function has failed but we recovered
|
|
416
415
|
|
|
417
416
|
expect(command.waiting).toBe(false)
|
|
418
|
-
expect(
|
|
417
|
+
expect(AsyncResult.toExit(command.result)).toEqual(Exit.succeed("recovered"))
|
|
419
418
|
expect(toasts.length).toBe(1) // toast should show error
|
|
420
419
|
expect(toasts[0].message).toBe("Test Action Success")
|
|
421
420
|
}))
|
|
@@ -433,17 +432,17 @@ it.live("defect", () =>
|
|
|
433
432
|
return yield* Effect.die({ message: "Boom!" })
|
|
434
433
|
},
|
|
435
434
|
Command.withDefaultToast(),
|
|
436
|
-
Effect.tap(() => executed = true)
|
|
435
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
437
436
|
)
|
|
438
437
|
|
|
439
438
|
const r = yield* Fiber.join(command.handle())
|
|
440
439
|
// TODO: confirm we reported error
|
|
441
440
|
|
|
442
441
|
expect(executed).toBe(false) // we died after all :)
|
|
443
|
-
expect(Exit.isFailure(r) && Cause.
|
|
442
|
+
expect(Exit.isFailure(r) && Cause.hasDies(r.cause)).toBe(true) // to confirm that the initial function has died
|
|
444
443
|
|
|
445
444
|
expect(command.waiting).toBe(false)
|
|
446
|
-
expect(Exit.isFailure(
|
|
445
|
+
expect(Exit.isFailure(AsyncResult.toExit(command.result))).toBe(true)
|
|
447
446
|
expect(toasts.length).toBe(1) // toast should show error
|
|
448
447
|
expect(toasts[0].message).toBe("Test Action unexpected error, please try again shortly.")
|
|
449
448
|
}))
|
|
@@ -472,9 +471,9 @@ it.live("works with alt", () =>
|
|
|
472
471
|
expect(yield* Effect.currentSpan.pipe(Effect.map((_) => _.name))).toBe("Test Action")
|
|
473
472
|
})),
|
|
474
473
|
Effect.tap(() =>
|
|
475
|
-
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => expect(_).toBe("Test Action")))
|
|
474
|
+
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => Effect.sync(() => expect(_).toBe("Test Action"))))
|
|
476
475
|
),
|
|
477
|
-
Effect.tap(() => executed = true)
|
|
476
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
478
477
|
)
|
|
479
478
|
)
|
|
480
479
|
expect(command.action).toBe("Test Action")
|
|
@@ -485,7 +484,7 @@ it.live("works with alt", () =>
|
|
|
485
484
|
expect(r).toBe("test-value") // to confirm that the initial function has ran.
|
|
486
485
|
expect(executed).toBe(true) // to confirm that the combinators have ran.
|
|
487
486
|
|
|
488
|
-
expect(command.result.pipe(
|
|
487
|
+
expect(command.result.pipe(AsyncResult.value)).toEqual(Option.some("test-value"))
|
|
489
488
|
|
|
490
489
|
expect(toasts.length).toBe(0)
|
|
491
490
|
}))
|
|
@@ -509,7 +508,7 @@ it.live("has custom action name with alt", () =>
|
|
|
509
508
|
expect(yield* CommandContext).toMatchObject({ action: "Test Action Translated", id: "Test Action" })
|
|
510
509
|
return "test-value"
|
|
511
510
|
},
|
|
512
|
-
Effect.tap(() => executed = true)
|
|
511
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
513
512
|
)
|
|
514
513
|
)
|
|
515
514
|
expect(command.action).toBe("Test Action Translated")
|
|
@@ -534,7 +533,7 @@ it.live("can map the result with alt", () =>
|
|
|
534
533
|
return "test-value"
|
|
535
534
|
},
|
|
536
535
|
Effect.map((_) => _ + _),
|
|
537
|
-
Effect.tap(() => executed = true)
|
|
536
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
538
537
|
))
|
|
539
538
|
const r = yield* unwrap(command.handle())
|
|
540
539
|
|
|
@@ -560,7 +559,7 @@ it.live("can receive and use input with alt", () =>
|
|
|
560
559
|
}
|
|
561
560
|
)
|
|
562
561
|
.pipe(
|
|
563
|
-
Effect.tap(() => executed = true)
|
|
562
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
564
563
|
)
|
|
565
564
|
)
|
|
566
565
|
const r = yield* unwrap(command.handle(1))
|
|
@@ -590,8 +589,8 @@ it.live("can replace the result with alt", () =>
|
|
|
590
589
|
|
|
591
590
|
return "test-value"
|
|
592
591
|
},
|
|
593
|
-
Effect.
|
|
594
|
-
Effect.tap(() => executed = true)
|
|
592
|
+
Effect.andThen(Effect.succeed(42)),
|
|
593
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
595
594
|
)
|
|
596
595
|
)
|
|
597
596
|
const r = yield* unwrap(command.handle())
|
|
@@ -625,10 +624,10 @@ it.live("with toasts with alt", () =>
|
|
|
625
624
|
expect(yield* Effect.currentSpan.pipe(Effect.map((_) => _.name))).toBe("Test Action")
|
|
626
625
|
})),
|
|
627
626
|
Effect.tap(() =>
|
|
628
|
-
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => expect(_).toBe("Test Action")))
|
|
627
|
+
Effect.currentSpan.pipe(Effect.map((_) => _.name), Effect.tap((_) => Effect.sync(() => expect(_).toBe("Test Action"))))
|
|
629
628
|
),
|
|
630
629
|
Command.withDefaultToast(),
|
|
631
|
-
Effect.tap(() => executed = true)
|
|
630
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
632
631
|
)
|
|
633
632
|
)
|
|
634
633
|
|
|
@@ -657,17 +656,17 @@ it.live("interrupted with alt", () =>
|
|
|
657
656
|
return "test-value"
|
|
658
657
|
},
|
|
659
658
|
Command.withDefaultToast(),
|
|
660
|
-
Effect.tap(() => executed = true)
|
|
659
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
661
660
|
)
|
|
662
661
|
)
|
|
663
662
|
|
|
664
663
|
const r = yield* Fiber.join(command.handle())
|
|
665
664
|
|
|
666
665
|
expect(executed).toBe(false) // we were interrupted after all :)
|
|
667
|
-
expect(Exit.
|
|
666
|
+
expect(Exit.hasInterrupts(r)).toBe(true) // to confirm that the initial function has interrupted
|
|
668
667
|
|
|
669
668
|
expect(command.waiting).toBe(false)
|
|
670
|
-
expect(Exit.
|
|
669
|
+
expect(Exit.hasInterrupts(AsyncResult.toExit(command.result))).toBe(true)
|
|
671
670
|
expect(toasts.length).toBe(0) // toast is removed on interruption. TODO: maybe a nicer user experience can be had?
|
|
672
671
|
}))
|
|
673
672
|
|
|
@@ -685,17 +684,17 @@ it.live("fail with alt", () =>
|
|
|
685
684
|
return yield* Effect.fail({ message: "Boom!" })
|
|
686
685
|
},
|
|
687
686
|
Command.withDefaultToast(),
|
|
688
|
-
Effect.tap(() => executed = true)
|
|
687
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
689
688
|
)
|
|
690
689
|
)
|
|
691
690
|
|
|
692
691
|
const r = yield* Fiber.join(command.handle())
|
|
693
692
|
|
|
694
693
|
expect(executed).toBe(false) // we failed after all :)
|
|
695
|
-
expect(Exit.isFailure(r) && Cause.
|
|
694
|
+
expect(Exit.isFailure(r) && Cause.hasFails(r.cause)).toBe(true) // to confirm that the initial function has failed
|
|
696
695
|
|
|
697
696
|
expect(command.waiting).toBe(false)
|
|
698
|
-
expect(Exit.isFailure(
|
|
697
|
+
expect(Exit.isFailure(AsyncResult.toExit(command.result))).toBe(true)
|
|
699
698
|
expect(toasts.length).toBe(1) // toast should show error
|
|
700
699
|
expect(toasts[0].message).toBe("Test Action Failed:\nBoom!")
|
|
701
700
|
}))
|
|
@@ -713,9 +712,9 @@ it.live("fail and recover with alt", () =>
|
|
|
713
712
|
expect(toasts.length).toBe(1)
|
|
714
713
|
return yield* Effect.fail({ message: "Boom!" })
|
|
715
714
|
},
|
|
716
|
-
Effect.
|
|
715
|
+
Effect.orElseSucceed(() => "recovered"), // we recover from the error here, so the final result is success
|
|
717
716
|
Command.withDefaultToast(),
|
|
718
|
-
Effect.tap(() => executed = true)
|
|
717
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
719
718
|
)
|
|
720
719
|
)
|
|
721
720
|
|
|
@@ -725,7 +724,7 @@ it.live("fail and recover with alt", () =>
|
|
|
725
724
|
expect(r).toBe("recovered") // to confirm that the initial function has failed but we recovered
|
|
726
725
|
|
|
727
726
|
expect(command.waiting).toBe(false)
|
|
728
|
-
expect(
|
|
727
|
+
expect(AsyncResult.toExit(command.result)).toEqual(Exit.succeed("recovered"))
|
|
729
728
|
expect(toasts.length).toBe(1) // toast should show error
|
|
730
729
|
expect(toasts[0].message).toBe("Test Action Success")
|
|
731
730
|
}))
|
|
@@ -744,7 +743,7 @@ it.live("defect with alt", () =>
|
|
|
744
743
|
return yield* Effect.die({ message: "Boom!" })
|
|
745
744
|
},
|
|
746
745
|
Command.withDefaultToast(),
|
|
747
|
-
Effect.tap(() => executed = true)
|
|
746
|
+
Effect.tap(() => Effect.sync(() => executed = true))
|
|
748
747
|
)
|
|
749
748
|
)
|
|
750
749
|
|
|
@@ -752,10 +751,10 @@ it.live("defect with alt", () =>
|
|
|
752
751
|
// TODO: confirm we reported error
|
|
753
752
|
|
|
754
753
|
expect(executed).toBe(false) // we died after all :)
|
|
755
|
-
expect(Exit.isFailure(r) && Cause.
|
|
754
|
+
expect(Exit.isFailure(r) && Cause.hasDies(r.cause)).toBe(true) // to confirm that the initial function has died
|
|
756
755
|
|
|
757
756
|
expect(command.waiting).toBe(false)
|
|
758
|
-
expect(Exit.isFailure(
|
|
757
|
+
expect(Exit.isFailure(AsyncResult.toExit(command.result))).toBe(true)
|
|
759
758
|
expect(toasts.length).toBe(1) // toast should show error
|
|
760
759
|
expect(toasts[0].message).toBe("Test Action unexpected error, please try again shortly.")
|
|
761
760
|
}))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.test.d.ts","sourceRoot":"","sources":["../form.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,CAAC,EAAE,MAAM,YAAY,CAAA
|
|
1
|
+
{"version":3,"file":"form.test.d.ts","sourceRoot":"","sources":["../form.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,CAAC,EAAE,MAAM,YAAY,CAAA;;;;;;;;;;;;;;;;;AAGtC,qBAAa,YAAa,SAAQ,iBAShC;CAAG;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAEvC;CAAG;;;;;;;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAK/B;CAAG;;;;;;;;AAEL,cAAM,MAAO,SAAQ,WAEnB;CAAG;;;;;;;;AAEL,cAAM,MAAO,SAAQ,WAEnB;CAAG;;;;;;;;;;;AAEL,cAAM,QAAS,SAAQ,aAGrB;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBL,qBAAa,cAAe,SAAQ,mBAGlC;CAAG"}
|
package/test/dist/stubs.d.ts
CHANGED
|
@@ -18,67 +18,125 @@ declare const RequestContextMap_base: (new () => {
|
|
|
18
18
|
readonly config: {};
|
|
19
19
|
}) & {
|
|
20
20
|
config: {};
|
|
21
|
-
getConfig: (rpc: import("
|
|
21
|
+
getConfig: (rpc: import("effect/unstable/rpc/Rpc").AnyWithProps) => RpcContextMap.GetContextConfig<{}>;
|
|
22
22
|
get: <Key extends never>(key: Key) => import("effect-app/rpc/RpcMiddleware").RpcDynamic<Key, {}[Key]>;
|
|
23
23
|
};
|
|
24
24
|
export declare class RequestContextMap extends RequestContextMap_base {
|
|
25
25
|
}
|
|
26
|
-
export declare const Req: <
|
|
26
|
+
export declare const Req: <_Self>() => {
|
|
27
27
|
<Tag extends string, Payload extends S.Struct.Fields, C extends {
|
|
28
|
-
success: S.
|
|
29
|
-
|
|
30
|
-
}>(tag: Tag, fields: Payload, config: RpcContextMap.GetContextConfig<{}> & C): S.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
success: S.Top | S.Struct.Fields;
|
|
29
|
+
error: S.Top | S.Struct.Fields;
|
|
30
|
+
}>(tag: Tag, fields: Payload, config: RpcContextMap.GetContextConfig<{}> & C): S.TaggedStruct<Tag, Payload> & {
|
|
31
|
+
new (...args: any[]): any;
|
|
32
|
+
readonly _tag: Tag;
|
|
33
|
+
readonly fields: {
|
|
34
|
+
readonly _tag: S.tag<Tag>;
|
|
35
|
+
} & Payload;
|
|
36
|
+
readonly success: C["success"] extends infer T ? T extends C["success"] ? T extends S.Top ? T : T extends S.Struct.Fields ? S.Struct<T> : S.Void : never : never;
|
|
37
|
+
readonly error: C extends {
|
|
38
|
+
error: infer E;
|
|
39
|
+
} ? E extends S.Top ? E : E extends S.Struct.Fields ? S.Struct<E> : S.Void : S.Void;
|
|
40
|
+
readonly config: Omit<C, "success" | "error">;
|
|
41
|
+
readonly "~decodingServices": S.Codec.DecodingServices<C["success"] extends infer T_1 ? T_1 extends C["success"] ? T_1 extends S.Top ? T_1 : T_1 extends S.Struct.Fields ? S.Struct<T_1> : S.Void : never : never> | S.Codec.DecodingServices<C extends {
|
|
42
|
+
error: infer E;
|
|
43
|
+
} ? E extends S.Top ? E : E extends S.Struct.Fields ? S.Struct<E> : S.Void : S.Void>;
|
|
34
44
|
};
|
|
35
45
|
<Tag extends string, Payload_1 extends S.Struct.Fields, C_1 extends Pick<{
|
|
36
|
-
success: S.
|
|
37
|
-
|
|
38
|
-
}, "success">>(tag: Tag, fields: Payload_1, config: RpcContextMap.GetContextConfig<{}> & C_1): S.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
46
|
+
success: S.Top | S.Struct.Fields;
|
|
47
|
+
error: S.Top | S.Struct.Fields;
|
|
48
|
+
}, "success">>(tag: Tag, fields: Payload_1, config: RpcContextMap.GetContextConfig<{}> & C_1): S.TaggedStruct<Tag, Payload_1> & {
|
|
49
|
+
new (...args: any[]): any;
|
|
50
|
+
readonly _tag: Tag;
|
|
51
|
+
readonly fields: {
|
|
52
|
+
readonly _tag: S.tag<Tag>;
|
|
53
|
+
} & Payload_1;
|
|
54
|
+
readonly success: C_1["success"] extends infer T ? T extends C_1["success"] ? T extends S.Top ? T : T extends S.Struct.Fields ? S.Struct<T> : S.Void : never : never;
|
|
55
|
+
readonly error: C_1 extends {
|
|
56
|
+
error: infer E;
|
|
57
|
+
} ? E extends S.Top ? E : E extends S.Struct.Fields ? S.Struct<E> : S.Void : S.Void;
|
|
58
|
+
readonly config: Omit<C_1, "success" | "error">;
|
|
59
|
+
readonly "~decodingServices": S.Codec.DecodingServices<C_1["success"] extends infer T_1 ? T_1 extends C_1["success"] ? T_1 extends S.Top ? T_1 : T_1 extends S.Struct.Fields ? S.Struct<T_1> : S.Void : never : never> | S.Codec.DecodingServices<C_1 extends {
|
|
60
|
+
error: infer E;
|
|
61
|
+
} ? E extends S.Top ? E : E extends S.Struct.Fields ? S.Struct<E> : S.Void : S.Void>;
|
|
42
62
|
};
|
|
43
63
|
<Tag extends string, Payload_2 extends S.Struct.Fields, C_2 extends Pick<{
|
|
44
|
-
success: S.
|
|
45
|
-
|
|
46
|
-
}, "
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
64
|
+
success: S.Top | S.Struct.Fields;
|
|
65
|
+
error: S.Top | S.Struct.Fields;
|
|
66
|
+
}, "error">>(tag: Tag, fields: Payload_2, config: RpcContextMap.GetContextConfig<{}> & C_2): S.TaggedStruct<Tag, Payload_2> & {
|
|
67
|
+
new (...args: any[]): any;
|
|
68
|
+
readonly _tag: Tag;
|
|
69
|
+
readonly fields: {
|
|
70
|
+
readonly _tag: S.tag<Tag>;
|
|
71
|
+
} & Payload_2;
|
|
72
|
+
readonly success: S.Schema<void>;
|
|
73
|
+
readonly error: C_2 extends {
|
|
74
|
+
error: infer E;
|
|
75
|
+
} ? E extends S.Top ? E : E extends S.Struct.Fields ? S.Struct<E> : S.Void : S.Void;
|
|
76
|
+
readonly config: Omit<C_2, "success" | "error">;
|
|
77
|
+
readonly "~decodingServices": unknown;
|
|
50
78
|
};
|
|
51
|
-
<Tag extends string, Payload_3 extends S.Struct.Fields, C_3 extends Record<string, any>>(tag: Tag, fields: Payload_3, config: C_3 & RpcContextMap.GetContextConfig<{}>): S.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
79
|
+
<Tag extends string, Payload_3 extends S.Struct.Fields, C_3 extends Record<string, any>>(tag: Tag, fields: Payload_3, config: C_3 & RpcContextMap.GetContextConfig<{}>): S.TaggedStruct<Tag, Payload_3> & {
|
|
80
|
+
new (...args: any[]): any;
|
|
81
|
+
readonly _tag: Tag;
|
|
82
|
+
readonly fields: {
|
|
83
|
+
readonly _tag: S.tag<Tag>;
|
|
84
|
+
} & Payload_3;
|
|
85
|
+
readonly success: S.Schema<void>;
|
|
86
|
+
readonly error: C_3 extends {
|
|
87
|
+
error: infer E;
|
|
88
|
+
} ? E extends S.Top ? E : E extends S.Struct.Fields ? S.Struct<E> : S.Void : S.Void;
|
|
89
|
+
readonly config: Omit<C_3, "success" | "error">;
|
|
90
|
+
readonly "~decodingServices": unknown;
|
|
55
91
|
};
|
|
56
|
-
<Tag extends string, Payload_4 extends S.Struct.Fields>(tag: Tag, fields: Payload_4): S.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
92
|
+
<Tag extends string, Payload_4 extends S.Struct.Fields>(tag: Tag, fields: Payload_4): S.TaggedStruct<Tag, Payload_4> & {
|
|
93
|
+
new (...args: any[]): any;
|
|
94
|
+
readonly _tag: Tag;
|
|
95
|
+
readonly fields: {
|
|
96
|
+
readonly _tag: S.tag<Tag>;
|
|
97
|
+
} & Payload_4;
|
|
98
|
+
readonly success: S.Schema<void>;
|
|
99
|
+
readonly error: never;
|
|
100
|
+
readonly config: Record<string, never>;
|
|
101
|
+
readonly "~decodingServices": unknown;
|
|
60
102
|
};
|
|
61
103
|
};
|
|
62
|
-
declare const GetSomething2_base: S.
|
|
63
|
-
|
|
64
|
-
} & {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
104
|
+
declare const GetSomething2_base: S.TaggedStruct<"GetSomething2", {
|
|
105
|
+
id: S.String;
|
|
106
|
+
}> & {
|
|
107
|
+
new (...args: any[]): any;
|
|
108
|
+
readonly _tag: "GetSomething2";
|
|
109
|
+
readonly fields: {
|
|
110
|
+
readonly _tag: S.tag<"GetSomething2">;
|
|
111
|
+
} & {
|
|
112
|
+
id: S.String;
|
|
113
|
+
};
|
|
114
|
+
readonly success: S.NumberFromString;
|
|
115
|
+
readonly error: S.Void;
|
|
116
|
+
readonly config: Omit<{
|
|
117
|
+
success: S.NumberFromString;
|
|
118
|
+
}, "success" | "error">;
|
|
119
|
+
readonly "~decodingServices": never;
|
|
70
120
|
};
|
|
71
121
|
export declare class GetSomething2 extends GetSomething2_base {
|
|
72
122
|
}
|
|
73
|
-
declare const GetSomething2WithDependencies_base: S.
|
|
74
|
-
|
|
75
|
-
} & {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
123
|
+
declare const GetSomething2WithDependencies_base: S.TaggedStruct<"GetSomething2", {
|
|
124
|
+
id: S.String;
|
|
125
|
+
}> & {
|
|
126
|
+
new (...args: any[]): any;
|
|
127
|
+
readonly _tag: "GetSomething2";
|
|
128
|
+
readonly fields: {
|
|
129
|
+
readonly _tag: S.tag<"GetSomething2">;
|
|
130
|
+
} & {
|
|
131
|
+
id: S.String;
|
|
132
|
+
};
|
|
133
|
+
readonly success: S.Codec<number, string, "dep-a", never>;
|
|
134
|
+
readonly error: S.String;
|
|
135
|
+
readonly config: Omit<{
|
|
136
|
+
success: S.Codec<number, string, "dep-a">;
|
|
137
|
+
error: S.String;
|
|
138
|
+
}, "success" | "error">;
|
|
139
|
+
readonly "~decodingServices": "dep-a";
|
|
82
140
|
};
|
|
83
141
|
export declare class GetSomething2WithDependencies extends GetSomething2WithDependencies_base {
|
|
84
142
|
}
|
package/test/dist/stubs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../stubs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../stubs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,OAAO,EAAU,KAAK,EAA0B,CAAC,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAG9C,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAElD,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAc,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AA8CxD,eAAO,MAAM,YAAY,GAAI,WAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAM,KAepG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAClD,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,WAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAM,oCACpC,CAAA;AAExE,eAAO,MAAM,eAAe,GAC1B,UAAU;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,EAAE,CAAA;CAAE,6GASxG,CAAA;;;;;;;;AAED,qBAAa,iBAAkB,SAAQ,sBAAyB;CAAG;AACnE,eAAO,MAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAqC,CAAA;;;;;;;;;;;;;;;;;;AACtE,qBAAa,aAAc,SAAQ,kBAEA;CAAG;;;;;;;;;;;;;;iBAML,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;;;;;AAJjE,qBAAa,6BAA8B,SAAQ,kCAMjD;CAAG;AAEL,eAAO,MAAM,SAAS;;;;;;CAA+F,CAAA;AAErH,eAAO,MAAM,SAAS,GACpB,UAAU;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,EAAE,CAAA;CAAE;;;;;;;;;CAcxG,CAAA"}
|
package/test/dist/stubs.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { FetchHttpClient } from "@effect/platform";
|
|
3
1
|
import * as Intl from "@formatjs/intl";
|
|
4
2
|
import { Effect, Layer, ManagedRuntime, Option, S } from "effect-app";
|
|
5
3
|
import { ApiClientFactory, makeRpcClient } from "effect-app/client";
|
|
6
4
|
import { RpcContextMap } from "effect-app/rpc";
|
|
5
|
+
import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient";
|
|
7
6
|
import { ref } from "vue";
|
|
8
7
|
import { Commander } from "../src/experimental/commander.js";
|
|
9
8
|
import { I18n } from "../src/experimental/intl.js";
|
|
@@ -11,7 +10,7 @@ import { makeUseCommand } from "../src/experimental/makeUseCommand.js";
|
|
|
11
10
|
import * as Toast from "../src/experimental/toast.js";
|
|
12
11
|
import { WithToast } from "../src/experimental/withToast.js";
|
|
13
12
|
import { LegacyMutation, makeClient } from "../src/makeClient.js";
|
|
14
|
-
const fakeToastLayer = (toasts = []) => Toast.Toast
|
|
13
|
+
const fakeToastLayer = (toasts = []) => Layer.effect(Toast.Toast, Effect.sync(() => {
|
|
15
14
|
const dismiss = (id) => {
|
|
16
15
|
const idx = toasts.findIndex((_) => _.id === id);
|
|
17
16
|
if (idx > -1) {
|
|
@@ -42,13 +41,13 @@ const fakeToastLayer = (toasts = []) => Toast.Toast.toLayer(Effect.sync(() => {
|
|
|
42
41
|
}
|
|
43
42
|
return id;
|
|
44
43
|
};
|
|
45
|
-
return Toast.wrap({
|
|
44
|
+
return Toast.Toast.of(Toast.wrap({
|
|
46
45
|
error: fakeToast,
|
|
47
46
|
warning: fakeToast,
|
|
48
47
|
success: fakeToast,
|
|
49
48
|
info: fakeToast,
|
|
50
49
|
dismiss
|
|
51
|
-
});
|
|
50
|
+
}));
|
|
52
51
|
}));
|
|
53
52
|
export const makeFakeIntl = (messages = {}) => {
|
|
54
53
|
const locale = ref("en");
|
|
@@ -66,7 +65,7 @@ export const makeFakeIntl = (messages = {}) => {
|
|
|
66
65
|
}
|
|
67
66
|
};
|
|
68
67
|
};
|
|
69
|
-
export const fakeIntlLayer = (messages = {}) =>
|
|
68
|
+
export const fakeIntlLayer = (messages = {}) => Layer.effect(I18n, Effect.sync(() => I18n.of(makeFakeIntl(messages))));
|
|
70
69
|
export const useExperimental = (options) => {
|
|
71
70
|
const FakeIntlLayer = fakeIntlLayer(options?.messages);
|
|
72
71
|
const FakeToastLayer = fakeToastLayer(options?.toasts);
|
|
@@ -85,8 +84,9 @@ export class GetSomething2 extends Req()("GetSomething2", {
|
|
|
85
84
|
export class GetSomething2WithDependencies extends Req()("GetSomething2", {
|
|
86
85
|
id: S.String
|
|
87
86
|
}, {
|
|
87
|
+
// this is intentilally fake, to simulate a codec that requires a dependency
|
|
88
88
|
success: S.NumberFromString,
|
|
89
|
-
|
|
89
|
+
error: S.String
|
|
90
90
|
}) {
|
|
91
91
|
}
|
|
92
92
|
export const Something = { GetSomething2, GetSomething2WithDependencies, meta: { moduleName: "Something" } };
|
|
@@ -101,4 +101,4 @@ export const useClient = (options) => {
|
|
|
101
101
|
const clientFor_ = ApiClientFactory.makeFor(Layer.empty);
|
|
102
102
|
return makeClient(() => ManagedRuntime.make(layers), clientFor_, Layer.empty);
|
|
103
103
|
};
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R1YnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zdHVicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssSUFBSSxNQUFNLGdCQUFnQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDOUMsT0FBTyxLQUFLLGVBQWUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBQ3RFLE9BQU8sS0FBSyxLQUFLLE1BQU0sOEJBQThCLENBQUE7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtDQUFrQyxDQUFBO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFHakUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxTQUFnQixFQUFFLEVBQUUsRUFBRSxDQUM1QyxLQUFLLENBQUMsTUFBTSxDQUNWLEtBQUssQ0FBQyxLQUFLLEVBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDZixNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQWlCLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxL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
|