gemi 0.76.0 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/AgentController.d.ts +81 -6
- package/dist/ai/AgentController.d.ts.map +1 -1
- package/dist/ai/client/index.js +2 -1
- package/dist/ai/client/index.js.map +1 -1
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +9 -9
- package/dist/ai/index.js.map +3 -3
- package/dist/ai/useChat.d.ts +4 -1
- package/dist/ai/useChat.d.ts.map +1 -1
- package/dist/app/index.js +1 -1
- package/dist/broadcasting/index.js +1 -1
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-fy2f8sq8.js → chunk-0472aphj.js} +2 -2
- package/dist/{chunk-fy2f8sq8.js.map → chunk-0472aphj.js.map} +1 -1
- package/dist/{chunk-bm97dwbp.js → chunk-0da5t7vs.js} +2 -2
- package/dist/{chunk-bm97dwbp.js.map → chunk-0da5t7vs.js.map} +1 -1
- package/dist/{chunk-17q5kheg.js → chunk-0pqsp84p.js} +2 -2
- package/dist/{chunk-17q5kheg.js.map → chunk-0pqsp84p.js.map} +1 -1
- package/dist/{chunk-8ef9n5pk.js → chunk-1712rv0r.js} +2 -2
- package/dist/{chunk-8ef9n5pk.js.map → chunk-1712rv0r.js.map} +1 -1
- package/dist/{chunk-9gn3x603.js → chunk-1ap69pez.js} +1 -1
- package/dist/{chunk-a1n0thja.js → chunk-1qwkhbc4.js} +2 -2
- package/dist/{chunk-a1n0thja.js.map → chunk-1qwkhbc4.js.map} +1 -1
- package/dist/{chunk-qn7rr4bw.js → chunk-27pnn95c.js} +2 -2
- package/dist/{chunk-qn7rr4bw.js.map → chunk-27pnn95c.js.map} +1 -1
- package/dist/{chunk-q60vevbt.js → chunk-34s3tfgk.js} +3 -3
- package/dist/{chunk-q60vevbt.js.map → chunk-34s3tfgk.js.map} +1 -1
- package/dist/{chunk-9h0cz1f0.js → chunk-3hfwbp2m.js} +2 -2
- package/dist/{chunk-9h0cz1f0.js.map → chunk-3hfwbp2m.js.map} +1 -1
- package/dist/{chunk-3dd2gwrj.js → chunk-3jyz4378.js} +2 -2
- package/dist/{chunk-3dd2gwrj.js.map → chunk-3jyz4378.js.map} +1 -1
- package/dist/{chunk-t20b1xn4.js → chunk-443yr2km.js} +3 -3
- package/dist/{chunk-t20b1xn4.js.map → chunk-443yr2km.js.map} +1 -1
- package/dist/{chunk-xrd9xx3c.js → chunk-4h7z32zp.js} +3 -3
- package/dist/{chunk-xrd9xx3c.js.map → chunk-4h7z32zp.js.map} +1 -1
- package/dist/{chunk-3nxkn558.js → chunk-5ddn8mfj.js} +2 -2
- package/dist/{chunk-3nxkn558.js.map → chunk-5ddn8mfj.js.map} +1 -1
- package/dist/{chunk-pxfw8dg1.js → chunk-6h5gvcs8.js} +2 -2
- package/dist/{chunk-pxfw8dg1.js.map → chunk-6h5gvcs8.js.map} +1 -1
- package/dist/{chunk-7e4rhaqs.js → chunk-7yhsy039.js} +2 -2
- package/dist/{chunk-7e4rhaqs.js.map → chunk-7yhsy039.js.map} +1 -1
- package/dist/{chunk-dsgb59xm.js → chunk-971a8v3v.js} +2 -2
- package/dist/{chunk-dsgb59xm.js.map → chunk-971a8v3v.js.map} +1 -1
- package/dist/{chunk-zat41156.js → chunk-989rzqd6.js} +3 -3
- package/dist/{chunk-zat41156.js.map → chunk-989rzqd6.js.map} +1 -1
- package/dist/{chunk-hny56r47.js → chunk-9z3y20ms.js} +2 -2
- package/dist/{chunk-hny56r47.js.map → chunk-9z3y20ms.js.map} +1 -1
- package/dist/{chunk-yqb9cpkx.js → chunk-axxbkm30.js} +2 -2
- package/dist/{chunk-yqb9cpkx.js.map → chunk-axxbkm30.js.map} +1 -1
- package/dist/{chunk-mc7nbgct.js → chunk-b941c34r.js} +2 -2
- package/dist/{chunk-mc7nbgct.js.map → chunk-b941c34r.js.map} +1 -1
- package/dist/{chunk-62pzr6vf.js → chunk-bdfdjnht.js} +3 -3
- package/dist/{chunk-62pzr6vf.js.map → chunk-bdfdjnht.js.map} +1 -1
- package/dist/chunk-cr9f0s09.js +5 -0
- package/dist/{chunk-krjkgg9v.js.map → chunk-cr9f0s09.js.map} +1 -1
- package/dist/{chunk-0yfgptrq.js → chunk-dgqqv3pb.js} +2 -2
- package/dist/{chunk-0yfgptrq.js.map → chunk-dgqqv3pb.js.map} +1 -1
- package/dist/{chunk-j9r5w8xf.js → chunk-dmdmt3gw.js} +2 -2
- package/dist/{chunk-j9r5w8xf.js.map → chunk-dmdmt3gw.js.map} +1 -1
- package/dist/chunk-e8z3nyd5.js +19 -0
- package/dist/{chunk-ytt205yt.js.map → chunk-e8z3nyd5.js.map} +8 -7
- package/dist/{chunk-8rqdeyhv.js → chunk-e97kq9tn.js} +2 -2
- package/dist/{chunk-8rqdeyhv.js.map → chunk-e97kq9tn.js.map} +1 -1
- package/dist/{chunk-evbvpfv6.js → chunk-eekg7k6d.js} +1 -1
- package/dist/{chunk-26rqzgsr.js → chunk-ezae18wm.js} +2 -2
- package/dist/{chunk-26rqzgsr.js.map → chunk-ezae18wm.js.map} +1 -1
- package/dist/{chunk-d6dz2706.js → chunk-fd0n8sav.js} +2 -2
- package/dist/{chunk-1x8gzkpq.js.map → chunk-fd0n8sav.js.map} +1 -1
- package/dist/{chunk-3sdrj0ma.js → chunk-fmhkn266.js} +2 -2
- package/dist/{chunk-3sdrj0ma.js.map → chunk-fmhkn266.js.map} +1 -1
- package/dist/{chunk-9ecgk1c5.js → chunk-fms4fcd1.js} +2 -2
- package/dist/{chunk-9ecgk1c5.js.map → chunk-fms4fcd1.js.map} +1 -1
- package/dist/{chunk-f90k29w1.js → chunk-fvn78g6k.js} +2 -2
- package/dist/{chunk-f90k29w1.js.map → chunk-fvn78g6k.js.map} +1 -1
- package/dist/{chunk-8ypzxfvx.js → chunk-gzs2y282.js} +2 -2
- package/dist/{chunk-8ypzxfvx.js.map → chunk-gzs2y282.js.map} +1 -1
- package/dist/{chunk-gpys09rg.js → chunk-j1w19cec.js} +3 -3
- package/dist/{chunk-gpys09rg.js.map → chunk-j1w19cec.js.map} +1 -1
- package/dist/{chunk-8jgj7vdp.js → chunk-j8nbjpkg.js} +2 -2
- package/dist/{chunk-8jgj7vdp.js.map → chunk-j8nbjpkg.js.map} +1 -1
- package/dist/{chunk-achgw308.js → chunk-jcq0tbdv.js} +2 -2
- package/dist/{chunk-achgw308.js.map → chunk-jcq0tbdv.js.map} +1 -1
- package/dist/{chunk-9sqw5bjy.js → chunk-m2bmwre5.js} +2 -2
- package/dist/{chunk-9sqw5bjy.js.map → chunk-m2bmwre5.js.map} +1 -1
- package/dist/{chunk-pp9c3f5m.js → chunk-mmhf39tr.js} +2 -2
- package/dist/{chunk-pp9c3f5m.js.map → chunk-mmhf39tr.js.map} +1 -1
- package/dist/{chunk-15gc8m24.js → chunk-n03frt02.js} +2 -2
- package/dist/{chunk-15gc8m24.js.map → chunk-n03frt02.js.map} +1 -1
- package/dist/{chunk-wtwkzgec.js → chunk-njh95es7.js} +2 -2
- package/dist/{chunk-wtwkzgec.js.map → chunk-njh95es7.js.map} +1 -1
- package/dist/{chunk-ngq4n2b3.js → chunk-q0nqypca.js} +2 -2
- package/dist/{chunk-ngq4n2b3.js.map → chunk-q0nqypca.js.map} +1 -1
- package/dist/{chunk-jpej3172.js → chunk-q623tx9p.js} +2 -2
- package/dist/{chunk-jpej3172.js.map → chunk-q623tx9p.js.map} +1 -1
- package/dist/{chunk-dz7b35tn.js → chunk-qgvg10ad.js} +3 -3
- package/dist/{chunk-dz7b35tn.js.map → chunk-qgvg10ad.js.map} +1 -1
- package/dist/{chunk-9p5vwn4d.js → chunk-qjgfrsw7.js} +2 -2
- package/dist/{chunk-9p5vwn4d.js.map → chunk-qjgfrsw7.js.map} +1 -1
- package/dist/{chunk-371tt28q.js → chunk-rkx6qhwg.js} +4 -4
- package/dist/{chunk-371tt28q.js.map → chunk-rkx6qhwg.js.map} +1 -1
- package/dist/{chunk-1k0gv92y.js → chunk-rv9k5bqn.js} +2 -2
- package/dist/{chunk-1k0gv92y.js.map → chunk-rv9k5bqn.js.map} +1 -1
- package/dist/{chunk-407t1q1d.js → chunk-s7hv9qgp.js} +2 -2
- package/dist/{chunk-407t1q1d.js.map → chunk-s7hv9qgp.js.map} +1 -1
- package/dist/{chunk-wbxmwzdb.js → chunk-sbqy6r29.js} +1 -1
- package/dist/{chunk-a82m12q4.js → chunk-sp4wwg7s.js} +3 -3
- package/dist/{chunk-a82m12q4.js.map → chunk-sp4wwg7s.js.map} +1 -1
- package/dist/{chunk-3eejq348.js → chunk-sqvw7rv2.js} +3 -3
- package/dist/{chunk-3eejq348.js.map → chunk-sqvw7rv2.js.map} +1 -1
- package/dist/{chunk-1yr8qejy.js → chunk-ss7ymqfm.js} +2 -2
- package/dist/{chunk-1yr8qejy.js.map → chunk-ss7ymqfm.js.map} +1 -1
- package/dist/{chunk-p2ny6anh.js → chunk-sw0kvtpt.js} +2 -2
- package/dist/{chunk-p2ny6anh.js.map → chunk-sw0kvtpt.js.map} +1 -1
- package/dist/{chunk-cr2wpeh5.js → chunk-sww4kgk4.js} +2 -2
- package/dist/{chunk-cr2wpeh5.js.map → chunk-sww4kgk4.js.map} +1 -1
- package/dist/{chunk-4z5qqq1t.js → chunk-tnt0ybj9.js} +2 -2
- package/dist/{chunk-4z5qqq1t.js.map → chunk-tnt0ybj9.js.map} +1 -1
- package/dist/{chunk-th77kbcq.js → chunk-tnx6jt4r.js} +2 -2
- package/dist/{chunk-th77kbcq.js.map → chunk-tnx6jt4r.js.map} +1 -1
- package/dist/{chunk-pjcdekm1.js → chunk-tpdsfr2k.js} +2 -2
- package/dist/{chunk-pjcdekm1.js.map → chunk-tpdsfr2k.js.map} +1 -1
- package/dist/{chunk-1x8gzkpq.js → chunk-xzp2ptj5.js} +2 -2
- package/dist/{chunk-d6dz2706.js.map → chunk-xzp2ptj5.js.map} +1 -1
- package/dist/{chunk-ywf0kz71.js → chunk-yaz93haz.js} +2 -2
- package/dist/{chunk-ywf0kz71.js.map → chunk-yaz93haz.js.map} +1 -1
- package/dist/{chunk-1rnzaqpm.js → chunk-yernnzqs.js} +2 -2
- package/dist/{chunk-1rnzaqpm.js.map → chunk-yernnzqs.js.map} +1 -1
- package/dist/{chunk-a4xxmmct.js → chunk-zjg31baf.js} +2 -2
- package/dist/{chunk-a4xxmmct.js.map → chunk-zjg31baf.js.map} +1 -1
- package/dist/{chunk-14pybfjk.js → chunk-zkty5j42.js} +2 -2
- package/dist/{chunk-14pybfjk.js.map → chunk-zkty5j42.js.map} +1 -1
- package/dist/{chunk-g2hwd2ts.js → chunk-zzh52t0y.js} +2 -2
- package/dist/{chunk-g2hwd2ts.js.map → chunk-zzh52t0y.js.map} +1 -1
- package/dist/client/MutationError.d.ts +16 -1
- package/dist/client/MutationError.d.ts.map +1 -1
- package/dist/client/index.js +94 -76
- package/dist/client/index.js.map +1 -1
- package/dist/client/useMutation.d.ts +1 -1
- package/dist/client/useMutation.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/console/run.js +2 -2
- package/dist/console/run.js.map +1 -1
- package/dist/container/index.js +2 -2
- package/dist/container/index.js.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/email/index.js +2 -2
- package/dist/email/index.js.map +1 -1
- package/dist/facades/index.js +2 -2
- package/dist/facades/index.js.map +1 -1
- package/dist/foundation/index.js +2 -2
- package/dist/foundation/index.js.map +1 -1
- package/dist/http/ApiRouter.d.ts +3 -2
- package/dist/http/ApiRouter.d.ts.map +1 -1
- package/dist/http/HttpResponse.d.ts +83 -0
- package/dist/http/HttpResponse.d.ts.map +1 -0
- package/dist/http/ViewRouter.d.ts.map +1 -1
- package/dist/http/index.d.ts +1 -0
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +2 -2
- package/dist/http/index.js.map +1 -1
- package/dist/i18n/dictionaryRuntime.js +2 -2
- package/dist/i18n/dictionaryRuntime.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/kernel/index.js +2 -2
- package/dist/kernel/index.js.map +1 -1
- package/dist/orm/index.js +2 -2
- package/dist/orm/index.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/services/index.js +2 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/queue/work.js +2 -2
- package/dist/services/queue/work.js.map +1 -1
- package/dist/services/router/ApiRouteDispatcher.d.ts.map +1 -1
- package/dist/services/router/serverQueryFetcher.d.ts.map +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-krjkgg9v.js +0 -5
- package/dist/chunk-ytt205yt.js +0 -19
- /package/dist/{chunk-9gn3x603.js.map → chunk-1ap69pez.js.map} +0 -0
- /package/dist/{chunk-evbvpfv6.js.map → chunk-eekg7k6d.js.map} +0 -0
- /package/dist/{chunk-wbxmwzdb.js.map → chunk-sbqy6r29.js.map} +0 -0
package/dist/client/index.js
CHANGED
|
@@ -485,6 +485,96 @@ function useInfiniteQuery(url, options, config) {
|
|
|
485
485
|
};
|
|
486
486
|
}
|
|
487
487
|
//#endregion
|
|
488
|
+
//#region client/MutationError.ts
|
|
489
|
+
var AUTHENTICATION = "Authentication error";
|
|
490
|
+
var PERMISSION = ["Insufficient permissions", "Not authorized"];
|
|
491
|
+
var CSRF = "Invalid CSRF token";
|
|
492
|
+
var SERVER = "Internal Server Error";
|
|
493
|
+
function isObject(error) {
|
|
494
|
+
return typeof error === "object" && error !== null;
|
|
495
|
+
}
|
|
496
|
+
function bodyMessage(error) {
|
|
497
|
+
return isObject(error) && !(error instanceof Error) && !("kind" in error) ? error.message : void 0;
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* The `MutationError` a non-2xx response's parsed body stands for.
|
|
501
|
+
*
|
|
502
|
+
* gemi's own error bodies are `{ error }`, and the value under `error` is what
|
|
503
|
+
* the guards above read, so that is what is handed over. An app's body without
|
|
504
|
+
* one — `HttpResponse.json({ message: "Taken" }, { status: 409 })` — is handed
|
|
505
|
+
* over whole: read as `body.error` it was `undefined`, and a failed request
|
|
506
|
+
* left `error` looking like no error at all. A body with no content to hand
|
|
507
|
+
* over (`null`) becomes a `{ message }` naming the status.
|
|
508
|
+
*
|
|
509
|
+
* @internal
|
|
510
|
+
*/
|
|
511
|
+
function mutationErrorFromBody(body, status) {
|
|
512
|
+
if (isObject(body) && "error" in body && body.error != null) return body.error;
|
|
513
|
+
if (body == null) return { message: `Request failed with status ${status}` };
|
|
514
|
+
return body;
|
|
515
|
+
}
|
|
516
|
+
/** Field messages, as `<ValidationErrors>` renders them. */
|
|
517
|
+
function isValidationError(error) {
|
|
518
|
+
return isObject(error) && error.kind === "validation_error";
|
|
519
|
+
}
|
|
520
|
+
/** A form-level message, as `<FormError>` renders it. */
|
|
521
|
+
function isFormError(error) {
|
|
522
|
+
return isObject(error) && error.kind === "form_error";
|
|
523
|
+
}
|
|
524
|
+
/** No signed-in user: `AuthenticationError` (401). */
|
|
525
|
+
function isAuthenticationError(error) {
|
|
526
|
+
return error === AUTHENTICATION;
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* A signed-in user who may not do this: `InsufficientPermissionsError` (403),
|
|
530
|
+
* `AuthorizationError` (401) or a policy denial (403, `{ message:
|
|
531
|
+
* "Forbidden" }`). Recognised by the framework's default messages.
|
|
532
|
+
*/
|
|
533
|
+
function isPermissionError(error) {
|
|
534
|
+
return typeof error === "string" && PERMISSION.includes(error) || bodyMessage(error) === "Forbidden";
|
|
535
|
+
}
|
|
536
|
+
/** The CSRF cookie is missing or stale (403). A reload fixes it. */
|
|
537
|
+
function isCsrfError(error) {
|
|
538
|
+
return error === CSRF;
|
|
539
|
+
}
|
|
540
|
+
/** A missing record, file or route (404). */
|
|
541
|
+
function isNotFoundError(error) {
|
|
542
|
+
return bodyMessage(error) === "Not found";
|
|
543
|
+
}
|
|
544
|
+
/** `RateLimitMiddleware` refused the request (429). */
|
|
545
|
+
function isRateLimitError(error) {
|
|
546
|
+
return bodyMessage(error) === "Rate limit exceeded";
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* The server failed (a production 500), or answered something that is not
|
|
550
|
+
* JSON. Under `gemi dev` a 500 carries the exception's message instead, which
|
|
551
|
+
* is `"unknown"`.
|
|
552
|
+
*/
|
|
553
|
+
function isServerError(error) {
|
|
554
|
+
return error === SERVER || isObject(error) && error.kind === "server_error" || error instanceof SyntaxError;
|
|
555
|
+
}
|
|
556
|
+
/** The request got no answer: offline, DNS, CORS, a dropped connection. */
|
|
557
|
+
function isNetworkError(error) {
|
|
558
|
+
return error instanceof TypeError;
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Which of the guards above `error` passes, for a `switch` over all of them.
|
|
562
|
+
* `"unknown"` is everything else: a refusal thrown with a message of its own,
|
|
563
|
+
* a 500 under `gemi dev`, an error body of the app's own shape.
|
|
564
|
+
*/
|
|
565
|
+
function mutationErrorKind(error) {
|
|
566
|
+
if (isValidationError(error)) return "validation";
|
|
567
|
+
if (isFormError(error)) return "form";
|
|
568
|
+
if (isAuthenticationError(error)) return "authentication";
|
|
569
|
+
if (isPermissionError(error)) return "permission";
|
|
570
|
+
if (isCsrfError(error)) return "csrf";
|
|
571
|
+
if (isNotFoundError(error)) return "not_found";
|
|
572
|
+
if (isRateLimitError(error)) return "rate_limit";
|
|
573
|
+
if (isServerError(error)) return "server";
|
|
574
|
+
if (isNetworkError(error)) return "network";
|
|
575
|
+
return "unknown";
|
|
576
|
+
}
|
|
577
|
+
//#endregion
|
|
488
578
|
//#region client/useMutation.ts
|
|
489
579
|
function applyParams(url, params = {}) {
|
|
490
580
|
let out = url;
|
|
@@ -546,12 +636,13 @@ function useMutation(method, url, ...args) {
|
|
|
546
636
|
if (!isLatest()) return;
|
|
547
637
|
formData.current = new FormData();
|
|
548
638
|
if (!response.ok) {
|
|
639
|
+
const error = mutationErrorFromBody(data, response.status);
|
|
549
640
|
setState((prev) => ({
|
|
550
641
|
data: prev.data,
|
|
551
|
-
error
|
|
642
|
+
error,
|
|
552
643
|
loading: false
|
|
553
644
|
}));
|
|
554
|
-
options.onError(
|
|
645
|
+
options.onError(error);
|
|
555
646
|
return;
|
|
556
647
|
}
|
|
557
648
|
clearPrefetchCache?.();
|
|
@@ -675,7 +766,7 @@ function useUpload(url, ...args) {
|
|
|
675
766
|
message: result.statusText
|
|
676
767
|
};
|
|
677
768
|
try {
|
|
678
|
-
error = (await result.json())
|
|
769
|
+
error = mutationErrorFromBody(await result.json(), result.status);
|
|
679
770
|
} catch (e) {}
|
|
680
771
|
setState("error");
|
|
681
772
|
options?.onError?.(error);
|
|
@@ -743,79 +834,6 @@ function useMutate() {
|
|
|
743
834
|
};
|
|
744
835
|
}
|
|
745
836
|
//#endregion
|
|
746
|
-
//#region client/MutationError.ts
|
|
747
|
-
var AUTHENTICATION = "Authentication error";
|
|
748
|
-
var PERMISSION = ["Insufficient permissions", "Not authorized"];
|
|
749
|
-
var CSRF = "Invalid CSRF token";
|
|
750
|
-
var SERVER = "Internal Server Error";
|
|
751
|
-
function isObject(error) {
|
|
752
|
-
return typeof error === "object" && error !== null;
|
|
753
|
-
}
|
|
754
|
-
function bodyMessage(error) {
|
|
755
|
-
return isObject(error) && !(error instanceof Error) && !("kind" in error) ? error.message : void 0;
|
|
756
|
-
}
|
|
757
|
-
/** Field messages, as `<ValidationErrors>` renders them. */
|
|
758
|
-
function isValidationError(error) {
|
|
759
|
-
return isObject(error) && error.kind === "validation_error";
|
|
760
|
-
}
|
|
761
|
-
/** A form-level message, as `<FormError>` renders it. */
|
|
762
|
-
function isFormError(error) {
|
|
763
|
-
return isObject(error) && error.kind === "form_error";
|
|
764
|
-
}
|
|
765
|
-
/** No signed-in user: `AuthenticationError` (401). */
|
|
766
|
-
function isAuthenticationError(error) {
|
|
767
|
-
return error === AUTHENTICATION;
|
|
768
|
-
}
|
|
769
|
-
/**
|
|
770
|
-
* A signed-in user who may not do this: `InsufficientPermissionsError` (403),
|
|
771
|
-
* `AuthorizationError` (401) or a policy denial (403, `{ message:
|
|
772
|
-
* "Forbidden" }`). Recognised by the framework's default messages.
|
|
773
|
-
*/
|
|
774
|
-
function isPermissionError(error) {
|
|
775
|
-
return typeof error === "string" && PERMISSION.includes(error) || bodyMessage(error) === "Forbidden";
|
|
776
|
-
}
|
|
777
|
-
/** The CSRF cookie is missing or stale (403). A reload fixes it. */
|
|
778
|
-
function isCsrfError(error) {
|
|
779
|
-
return error === CSRF;
|
|
780
|
-
}
|
|
781
|
-
/** A missing record, file or route (404). */
|
|
782
|
-
function isNotFoundError(error) {
|
|
783
|
-
return bodyMessage(error) === "Not found";
|
|
784
|
-
}
|
|
785
|
-
/** `RateLimitMiddleware` refused the request (429). */
|
|
786
|
-
function isRateLimitError(error) {
|
|
787
|
-
return bodyMessage(error) === "Rate limit exceeded";
|
|
788
|
-
}
|
|
789
|
-
/**
|
|
790
|
-
* The server failed (a production 500), or answered something that is not
|
|
791
|
-
* JSON. Under `gemi dev` a 500 carries the exception's message instead, which
|
|
792
|
-
* is `"unknown"`.
|
|
793
|
-
*/
|
|
794
|
-
function isServerError(error) {
|
|
795
|
-
return error === SERVER || isObject(error) && error.kind === "server_error" || error instanceof SyntaxError;
|
|
796
|
-
}
|
|
797
|
-
/** The request got no answer: offline, DNS, CORS, a dropped connection. */
|
|
798
|
-
function isNetworkError(error) {
|
|
799
|
-
return error instanceof TypeError;
|
|
800
|
-
}
|
|
801
|
-
/**
|
|
802
|
-
* Which of the guards above `error` passes, for a `switch` over all of them.
|
|
803
|
-
* `"unknown"` is everything else: a refusal thrown with a message of its own,
|
|
804
|
-
* a 500 under `gemi dev`, an error body of the app's own shape.
|
|
805
|
-
*/
|
|
806
|
-
function mutationErrorKind(error) {
|
|
807
|
-
if (isValidationError(error)) return "validation";
|
|
808
|
-
if (isFormError(error)) return "form";
|
|
809
|
-
if (isAuthenticationError(error)) return "authentication";
|
|
810
|
-
if (isPermissionError(error)) return "permission";
|
|
811
|
-
if (isCsrfError(error)) return "csrf";
|
|
812
|
-
if (isNotFoundError(error)) return "not_found";
|
|
813
|
-
if (isRateLimitError(error)) return "rate_limit";
|
|
814
|
-
if (isServerError(error)) return "server";
|
|
815
|
-
if (isNetworkError(error)) return "network";
|
|
816
|
-
return "unknown";
|
|
817
|
-
}
|
|
818
|
-
//#endregion
|
|
819
837
|
//#region client/Mutation.tsx
|
|
820
838
|
var MutationContext = createContext({
|
|
821
839
|
isPending: false,
|