gemi 0.127.0 → 0.129.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/index.js +2 -2
- package/dist/ai/index.js.map +1 -1
- package/dist/app/index.js +1 -1
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-bghxdjqv.js → chunk-03wc6em7.js} +1 -1
- package/dist/{chunk-56ryda9y.js → chunk-0m2fyw7g.js} +2 -2
- package/dist/{chunk-56ryda9y.js.map → chunk-0m2fyw7g.js.map} +1 -1
- package/dist/chunk-0ryswty9.js +120 -0
- package/dist/{chunk-6c8pn6hj.js.map → chunk-0ryswty9.js.map} +10 -4
- package/dist/{chunk-ecb8qggy.js → chunk-0vxwrc4t.js} +2 -2
- package/dist/{chunk-ecb8qggy.js.map → chunk-0vxwrc4t.js.map} +1 -1
- package/dist/{chunk-1v368y9a.js → chunk-1gdzajwb.js} +2 -2
- package/dist/{chunk-1v368y9a.js.map → chunk-1gdzajwb.js.map} +1 -1
- package/dist/{chunk-h4755p9h.js → chunk-1rq53cb0.js} +2 -2
- package/dist/{chunk-h4755p9h.js.map → chunk-1rq53cb0.js.map} +1 -1
- package/dist/{chunk-v7nw1g2n.js → chunk-1yttk239.js} +2 -2
- package/dist/{chunk-v7nw1g2n.js.map → chunk-1yttk239.js.map} +1 -1
- package/dist/{chunk-28bby5pp.js → chunk-1z311hyj.js} +2 -2
- package/dist/{chunk-28bby5pp.js.map → chunk-1z311hyj.js.map} +1 -1
- package/dist/{chunk-n8mxsfc2.js → chunk-2869cbhd.js} +3 -3
- package/dist/{chunk-n8mxsfc2.js.map → chunk-2869cbhd.js.map} +1 -1
- package/dist/{chunk-dm7mada7.js → chunk-2bmk0fzm.js} +3 -3
- package/dist/{chunk-dm7mada7.js.map → chunk-2bmk0fzm.js.map} +1 -1
- package/dist/{chunk-ych1dv5q.js → chunk-2epj17ac.js} +3 -3
- package/dist/{chunk-ych1dv5q.js.map → chunk-2epj17ac.js.map} +1 -1
- package/dist/{chunk-0arss2xy.js → chunk-2z1gd231.js} +2 -2
- package/dist/{chunk-0arss2xy.js.map → chunk-2z1gd231.js.map} +1 -1
- package/dist/{chunk-xe2cfmyb.js → chunk-3dyd4z06.js} +2 -2
- package/dist/{chunk-xe2cfmyb.js.map → chunk-3dyd4z06.js.map} +1 -1
- package/dist/{chunk-p0ccxfkq.js → chunk-43vjbd6n.js} +1 -1
- package/dist/{chunk-nv2t87c3.js → chunk-4yp84g2y.js} +2 -2
- package/dist/{chunk-nv2t87c3.js.map → chunk-4yp84g2y.js.map} +1 -1
- package/dist/{chunk-bhbxhk9e.js → chunk-5bk7767a.js} +2 -2
- package/dist/{chunk-bhbxhk9e.js.map → chunk-5bk7767a.js.map} +1 -1
- package/dist/{chunk-k6gvbvyw.js → chunk-5nkvpc0a.js} +1 -1
- package/dist/{chunk-gxp48t81.js → chunk-5ym464xx.js} +4 -4
- package/dist/{chunk-gxp48t81.js.map → chunk-5ym464xx.js.map} +1 -1
- package/dist/{chunk-v80890xx.js → chunk-7321qjgb.js} +3 -3
- package/dist/{chunk-v80890xx.js.map → chunk-7321qjgb.js.map} +1 -1
- package/dist/{chunk-0f0xxqhy.js → chunk-87rtxv9n.js} +3 -3
- package/dist/{chunk-0f0xxqhy.js.map → chunk-87rtxv9n.js.map} +1 -1
- package/dist/{chunk-avfntxm1.js → chunk-8jqve5dr.js} +2 -2
- package/dist/{chunk-avfntxm1.js.map → chunk-8jqve5dr.js.map} +1 -1
- package/dist/{chunk-5vvfcdpk.js → chunk-9122838b.js} +2 -2
- package/dist/{chunk-5vvfcdpk.js.map → chunk-9122838b.js.map} +1 -1
- package/dist/{chunk-jg3kg55f.js → chunk-9701fx4z.js} +2 -2
- package/dist/{chunk-jg3kg55f.js.map → chunk-9701fx4z.js.map} +1 -1
- package/dist/{chunk-mj7h1dgh.js → chunk-b7wmssj5.js} +2 -2
- package/dist/{chunk-mj7h1dgh.js.map → chunk-b7wmssj5.js.map} +1 -1
- package/dist/{chunk-etf6h5m1.js → chunk-bg5qb9hm.js} +2 -2
- package/dist/{chunk-etf6h5m1.js.map → chunk-bg5qb9hm.js.map} +1 -1
- package/dist/{chunk-w4111j5d.js → chunk-bnp6wpzd.js} +2 -2
- package/dist/{chunk-w4111j5d.js.map → chunk-bnp6wpzd.js.map} +1 -1
- package/dist/{chunk-yg8se4vs.js → chunk-cp84b0ev.js} +3 -3
- package/dist/{chunk-yg8se4vs.js.map → chunk-cp84b0ev.js.map} +1 -1
- package/dist/{chunk-hye22tpt.js → chunk-dak8txaw.js} +2 -2
- package/dist/{chunk-hye22tpt.js.map → chunk-dak8txaw.js.map} +1 -1
- package/dist/{chunk-7x2n788t.js → chunk-er5ed5pg.js} +3 -3
- package/dist/{chunk-7x2n788t.js.map → chunk-er5ed5pg.js.map} +1 -1
- package/dist/{chunk-s2y2b8tz.js → chunk-f8ce6e9c.js} +2 -2
- package/dist/{chunk-s2y2b8tz.js.map → chunk-f8ce6e9c.js.map} +1 -1
- package/dist/{chunk-7eerqsg2.js → chunk-fezaxj28.js} +2 -2
- package/dist/{chunk-7eerqsg2.js.map → chunk-fezaxj28.js.map} +1 -1
- package/dist/{chunk-q9mxjh10.js → chunk-fv53h1q2.js} +2 -2
- package/dist/{chunk-q9mxjh10.js.map → chunk-fv53h1q2.js.map} +1 -1
- package/dist/{chunk-62zn06wb.js → chunk-gpdsxwkt.js} +2 -2
- package/dist/{chunk-62zn06wb.js.map → chunk-gpdsxwkt.js.map} +1 -1
- package/dist/{chunk-15bmfr7f.js → chunk-gzaaspe7.js} +2 -2
- package/dist/{chunk-15bmfr7f.js.map → chunk-gzaaspe7.js.map} +1 -1
- package/dist/{chunk-3fyhd641.js → chunk-h55c9bdf.js} +1 -1
- package/dist/{chunk-x5vpjzpp.js → chunk-ja41ts8v.js} +2 -2
- package/dist/{chunk-x5vpjzpp.js.map → chunk-ja41ts8v.js.map} +1 -1
- package/dist/{chunk-1dzs05dc.js → chunk-jcps2gpp.js} +2 -2
- package/dist/{chunk-1dzs05dc.js.map → chunk-jcps2gpp.js.map} +1 -1
- package/dist/chunk-jj1ppnnk.js +10 -0
- package/dist/{chunk-3p9vj0h6.js.map → chunk-jj1ppnnk.js.map} +5 -4
- package/dist/{chunk-psdyfaf1.js → chunk-jm1f9cas.js} +2 -2
- package/dist/{chunk-psdyfaf1.js.map → chunk-jm1f9cas.js.map} +1 -1
- package/dist/{chunk-99z9d0sa.js → chunk-k107vw69.js} +2 -2
- package/dist/{chunk-99z9d0sa.js.map → chunk-k107vw69.js.map} +1 -1
- package/dist/{chunk-7dzprr9b.js → chunk-k10vbrjx.js} +3 -3
- package/dist/{chunk-7dzprr9b.js.map → chunk-k10vbrjx.js.map} +1 -1
- package/dist/{chunk-c48gag78.js → chunk-kmcnfk2s.js} +1 -1
- package/dist/{chunk-yffm8nxa.js → chunk-mc8mxx2a.js} +2 -2
- package/dist/{chunk-yffm8nxa.js.map → chunk-mc8mxx2a.js.map} +1 -1
- package/dist/{chunk-ewv1m1sv.js → chunk-n1t4ea9g.js} +3 -3
- package/dist/{chunk-ewv1m1sv.js.map → chunk-n1t4ea9g.js.map} +1 -1
- package/dist/{chunk-9hhxy88x.js → chunk-n4dk0dc9.js} +2 -2
- package/dist/{chunk-9hhxy88x.js.map → chunk-n4dk0dc9.js.map} +1 -1
- package/dist/{chunk-rvdsaqdv.js → chunk-nh9ewam0.js} +1 -1
- package/dist/{chunk-84rbdyhe.js → chunk-njaxnv6c.js} +2 -2
- package/dist/{chunk-84rbdyhe.js.map → chunk-njaxnv6c.js.map} +1 -1
- package/dist/{chunk-7nfprr9v.js → chunk-np73p641.js} +2 -2
- package/dist/{chunk-7nfprr9v.js.map → chunk-np73p641.js.map} +1 -1
- package/dist/{chunk-87jj7n9q.js → chunk-nvfhx9d1.js} +2 -2
- package/dist/{chunk-87jj7n9q.js.map → chunk-nvfhx9d1.js.map} +1 -1
- package/dist/{chunk-qmcjh6de.js → chunk-nwzsgzvy.js} +2 -2
- package/dist/{chunk-qmcjh6de.js.map → chunk-nwzsgzvy.js.map} +1 -1
- package/dist/{chunk-43faxwf5.js → chunk-p528pvmm.js} +2 -2
- package/dist/{chunk-43faxwf5.js.map → chunk-p528pvmm.js.map} +1 -1
- package/dist/{chunk-kzk5r6v4.js → chunk-peng31np.js} +3 -3
- package/dist/{chunk-kzk5r6v4.js.map → chunk-peng31np.js.map} +1 -1
- package/dist/{chunk-mj4n5mar.js → chunk-pgddb43b.js} +2 -2
- package/dist/{chunk-mj4n5mar.js.map → chunk-pgddb43b.js.map} +1 -1
- package/dist/{chunk-s2krqtwj.js → chunk-pgh7gsag.js} +2 -2
- package/dist/{chunk-s2krqtwj.js.map → chunk-pgh7gsag.js.map} +1 -1
- package/dist/chunk-pqn9j5s8.js +5 -0
- package/dist/{chunk-87bmhng2.js.map → chunk-pqn9j5s8.js.map} +1 -1
- package/dist/{chunk-m63v6aze.js → chunk-pxsq9841.js} +2 -2
- package/dist/{chunk-m63v6aze.js.map → chunk-pxsq9841.js.map} +1 -1
- package/dist/{chunk-1eb4p352.js → chunk-py1twqh8.js} +2 -2
- package/dist/{chunk-1eb4p352.js.map → chunk-py1twqh8.js.map} +1 -1
- package/dist/{chunk-nrf23yan.js → chunk-qjmcn5m5.js} +2 -2
- package/dist/{chunk-nrf23yan.js.map → chunk-qjmcn5m5.js.map} +1 -1
- package/dist/{chunk-t8kzaxaa.js → chunk-qpwb3gnh.js} +2 -2
- package/dist/{chunk-t8kzaxaa.js.map → chunk-qpwb3gnh.js.map} +1 -1
- package/dist/{chunk-c65rh4k8.js → chunk-qv8sj2z3.js} +2 -2
- package/dist/{chunk-c65rh4k8.js.map → chunk-qv8sj2z3.js.map} +1 -1
- package/dist/{chunk-3hndrc5z.js → chunk-sbdm4enk.js} +2 -2
- package/dist/{chunk-3hndrc5z.js.map → chunk-sbdm4enk.js.map} +1 -1
- package/dist/{chunk-v1eeh7a7.js → chunk-sh39q44t.js} +3 -3
- package/dist/{chunk-v1eeh7a7.js.map → chunk-sh39q44t.js.map} +1 -1
- package/dist/{chunk-b2pdqxj3.js → chunk-t7gvgz20.js} +3 -3
- package/dist/{chunk-b2pdqxj3.js.map → chunk-t7gvgz20.js.map} +1 -1
- package/dist/{chunk-gv59djt3.js → chunk-tn3y2qkj.js} +2 -2
- package/dist/{chunk-gv59djt3.js.map → chunk-tn3y2qkj.js.map} +1 -1
- package/dist/{chunk-9x0pgkns.js → chunk-ty5sp1ym.js} +2 -2
- package/dist/{chunk-9x0pgkns.js.map → chunk-ty5sp1ym.js.map} +1 -1
- package/dist/{chunk-8df7fn7f.js → chunk-v09w6pr2.js} +3 -3
- package/dist/{chunk-8df7fn7f.js.map → chunk-v09w6pr2.js.map} +1 -1
- package/dist/{chunk-s0kns9q1.js → chunk-vc5kpxdk.js} +3 -3
- package/dist/{chunk-s0kns9q1.js.map → chunk-vc5kpxdk.js.map} +1 -1
- package/dist/{chunk-1gd1ykgj.js → chunk-vjpby5sf.js} +3 -3
- package/dist/{chunk-1gd1ykgj.js.map → chunk-vjpby5sf.js.map} +1 -1
- package/dist/{chunk-p7abyc0b.js → chunk-wf3qe12c.js} +2 -2
- package/dist/{chunk-p7abyc0b.js.map → chunk-wf3qe12c.js.map} +1 -1
- package/dist/{chunk-yhxjhrvp.js → chunk-wmkrb1qv.js} +2 -2
- package/dist/{chunk-yhxjhrvp.js.map → chunk-wmkrb1qv.js.map} +1 -1
- package/dist/{chunk-094m8mj3.js → chunk-wn437678.js} +2 -2
- package/dist/{chunk-094m8mj3.js.map → chunk-wn437678.js.map} +1 -1
- package/dist/{chunk-rtb64x14.js → chunk-wv3nnq8c.js} +3 -3
- package/dist/{chunk-rtb64x14.js.map → chunk-wv3nnq8c.js.map} +1 -1
- package/dist/{chunk-wat33wxh.js → chunk-ww86zqbw.js} +2 -2
- package/dist/{chunk-wat33wxh.js.map → chunk-ww86zqbw.js.map} +1 -1
- package/dist/{chunk-ebdkmzm9.js → chunk-x92g4x4w.js} +2 -2
- package/dist/{chunk-ebdkmzm9.js.map → chunk-x92g4x4w.js.map} +1 -1
- package/dist/{chunk-qy3s6pwz.js → chunk-xhm5wgfe.js} +2 -2
- package/dist/{chunk-qy3s6pwz.js.map → chunk-xhm5wgfe.js.map} +1 -1
- package/dist/{chunk-89swy5aq.js → chunk-xtnbcbkf.js} +2 -2
- package/dist/{chunk-89swy5aq.js.map → chunk-xtnbcbkf.js.map} +1 -1
- package/dist/{chunk-pxstrw29.js → chunk-zw5z1k84.js} +2 -2
- package/dist/{chunk-pxstrw29.js.map → chunk-zw5z1k84.js.map} +1 -1
- package/dist/chunks/RealtimeClient-CqGve6h8.js +545 -0
- package/dist/chunks/RealtimeClient-CqGve6h8.js.map +1 -0
- package/dist/chunks/{ThemeProvider-BIrCSrFY.js → ThemeProvider-DaX0eyqs.js} +155 -539
- package/dist/chunks/ThemeProvider-DaX0eyqs.js.map +1 -0
- package/dist/chunks/live-DIUDdLrA.js +69 -0
- package/dist/chunks/live-DIUDdLrA.js.map +1 -0
- package/dist/chunks/subscriptionStream-CULcRbx0.js +166 -0
- package/dist/chunks/subscriptionStream-CULcRbx0.js.map +1 -0
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +118 -330
- package/dist/client/index.js.map +1 -1
- package/dist/client/init.d.ts +1 -1
- package/dist/client/init.d.ts.map +1 -1
- package/dist/client/realtime/FakeSocket.d.ts +1 -1
- package/dist/client/realtime/FakeSocket.d.ts.map +1 -1
- package/dist/client/realtime/RealtimeClient.d.ts +4 -20
- package/dist/client/realtime/RealtimeClient.d.ts.map +1 -1
- package/dist/client/realtime/live.d.ts +25 -0
- package/dist/client/realtime/live.d.ts.map +1 -0
- package/dist/client/realtime/loader.d.ts +59 -0
- package/dist/client/realtime/loader.d.ts.map +1 -0
- package/dist/client/realtime/useChannelSubscription.d.ts +1 -1
- package/dist/client/realtime/useChannelSubscription.d.ts.map +1 -1
- package/dist/client/subscriptionStream.d.ts +36 -0
- package/dist/client/subscriptionStream.d.ts.map +1 -0
- package/dist/client/useChannel.d.ts +1 -13
- package/dist/client/useChannel.d.ts.map +1 -1
- package/dist/client/useQuery.d.ts +1 -1
- package/dist/client/useQuery.d.ts.map +1 -1
- package/dist/client/useSubscription.d.ts +5 -10
- package/dist/client/useSubscription.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/Runs.d.ts +64 -0
- package/dist/facades/Runs.d.ts.map +1 -0
- package/dist/facades/index.d.ts +1 -0
- package/dist/facades/index.d.ts.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/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 +3 -3
- package/dist/kernel/index.js.map +3 -3
- package/dist/kernel/providers.d.ts.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/broadcast/protocol.d.ts +1 -2
- package/dist/services/broadcast/protocol.d.ts.map +1 -1
- package/dist/services/broadcast/socketHeader.d.ts +9 -0
- package/dist/services/broadcast/socketHeader.d.ts.map +1 -0
- package/dist/services/index.d.ts +5 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -3
- package/dist/services/index.js.map +2 -2
- package/dist/services/queue/work.js +2 -2
- package/dist/services/queue/work.js.map +1 -1
- package/dist/services/runs/DatabaseRunStore.d.ts +62 -0
- package/dist/services/runs/DatabaseRunStore.d.ts.map +1 -0
- package/dist/services/runs/RunManager.d.ts +200 -0
- package/dist/services/runs/RunManager.d.ts.map +1 -0
- package/dist/services/runs/RunStore.d.ts +163 -0
- package/dist/services/runs/RunStore.d.ts.map +1 -0
- package/dist/services/runs/RunsServiceProvider.d.ts +5 -0
- package/dist/services/runs/RunsServiceProvider.d.ts.map +1 -0
- package/dist/services/runs/config.d.ts +20 -0
- package/dist/services/runs/config.d.ts.map +1 -0
- package/dist/stats/route-table.js +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/dist/testing/Page.d.ts.map +1 -1
- package/dist/testing/index.js +3 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/vitest/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-3p9vj0h6.js +0 -10
- package/dist/chunk-6c8pn6hj.js +0 -57
- package/dist/chunk-87bmhng2.js +0 -5
- package/dist/chunks/ThemeProvider-BIrCSrFY.js.map +0 -1
- /package/dist/{chunk-bghxdjqv.js.map → chunk-03wc6em7.js.map} +0 -0
- /package/dist/{chunk-p0ccxfkq.js.map → chunk-43vjbd6n.js.map} +0 -0
- /package/dist/{chunk-k6gvbvyw.js.map → chunk-5nkvpc0a.js.map} +0 -0
- /package/dist/{chunk-3fyhd641.js.map → chunk-h55c9bdf.js.map} +0 -0
- /package/dist/{chunk-c48gag78.js.map → chunk-kmcnfk2s.js.map} +0 -0
- /package/dist/{chunk-rvdsaqdv.js.map → chunk-nh9ewam0.js.map} +0 -0
package/dist/client/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as
|
|
1
|
+
import { $ as DEFAULT_STALE_TIME, A as ServerDataContext, B as configureRealtime, C as readRoutePayload, D as useNavigate, E as useSearchParams, G as reconnectRealtime, H as followLive, I as Action, J as QueryConfigContext, K as toVariantKey, M as useLocation, N as domainUrl, O as I18nContext, P as isAbsoluteUrl, Q as pickDefined, R as RealtimeContext, S as setActiveLocale, T as useRoute, U as loadedModule, V as currentSocketId, X as QueryManagerProvider, Y as QueryManagerContext, Z as USER_QUERY_CONFIG_KEYS, _ as isChunkLoadError, a as useRouteTransition, at as Subject, b as loadDictionaryForRender, c as ClientRouterContext, d as ComponentsProvider, et as isRetryableQueryError, f as initialViewModulesReady, g as configureChunkLoadRecovery, h as CHUNK_RELOAD_MARKER, i as RouteTransitionProvider, it as QueryError, j as ServerDataProvider, k as I18nProvider, l as ClientRouterProvider, m as subscribeViewModules, n as useTheme, nt as retryDelayFor, o as useChannelSubscription, p as loadViewModule, q as applyParams$1, r as m, rt as shouldRetryQuery, s as useCoalesced, t as ThemeProvider, tt as parseRetryAfter, u as ComponentsContext, v as recoverFromChunkLoadError, w as routeDataUrl, x as registerDictionary, y as loadDictionary } from "../chunks/ThemeProvider-DaX0eyqs.js";
|
|
2
2
|
import { n as RouteStateContext, r as RouteStateProvider, t as useParams } from "../chunks/useParams-BN3XXfmG.js";
|
|
3
3
|
import { Fragment, StrictMode, Suspense, createContext, createElement, isValidElement, lazy, memo, use, useCallback, useContext, useDeferredValue, useEffect, useMemo, useRef, useState, useSyncExternalStore, useTransition } from "react";
|
|
4
4
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -27,180 +27,6 @@ function isPlainObject(value) {
|
|
|
27
27
|
return value !== null && typeof value === "object" && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
|
|
28
28
|
}
|
|
29
29
|
//#endregion
|
|
30
|
-
//#region client/realtime/useChannelSubscription.ts
|
|
31
|
-
var CLOSED = {
|
|
32
|
-
status: "closed",
|
|
33
|
-
code: null
|
|
34
|
-
};
|
|
35
|
-
var IDLE = {
|
|
36
|
-
status: "idle",
|
|
37
|
-
code: null
|
|
38
|
-
};
|
|
39
|
-
/**
|
|
40
|
-
* The one subscription primitive the channel hooks share. Subscribes only in
|
|
41
|
-
* an effect, so a server render, a static page or an island that never
|
|
42
|
-
* mounts opens no socket; on the server it reports `closed`. Handlers may
|
|
43
|
-
* change between renders without resubscribing.
|
|
44
|
-
*/
|
|
45
|
-
function useChannelSubscription(pattern, params, handlers, enabled) {
|
|
46
|
-
const active = enabled && pattern !== null;
|
|
47
|
-
const [state, setState] = useState(active ? CLOSED : IDLE);
|
|
48
|
-
const provided = useContext(RealtimeContext);
|
|
49
|
-
const handlersRef = useRef(handlers);
|
|
50
|
-
handlersRef.current = handlers;
|
|
51
|
-
const paramsRef = useRef(params);
|
|
52
|
-
paramsRef.current = params;
|
|
53
|
-
useEffect(() => {
|
|
54
|
-
if (!active || pattern === null) {
|
|
55
|
-
setState(IDLE);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
const socket = provided ?? getRealtimeClient();
|
|
59
|
-
if (!socket) return;
|
|
60
|
-
const release = socket.subscribe(pattern, paramsRef.current, {
|
|
61
|
-
onEvent: (event, data) => handlersRef.current.onEvent?.(event, data),
|
|
62
|
-
onResync: () => handlersRef.current.onResync?.(),
|
|
63
|
-
onStatus: (status, code) => setState((previous) => previous.status === status && previous.code === code ? previous : {
|
|
64
|
-
status,
|
|
65
|
-
code
|
|
66
|
-
})
|
|
67
|
-
});
|
|
68
|
-
return () => {
|
|
69
|
-
release();
|
|
70
|
-
setState(CLOSED);
|
|
71
|
-
};
|
|
72
|
-
}, [
|
|
73
|
-
provided,
|
|
74
|
-
pattern === null ? null : channelKey(pattern, params),
|
|
75
|
-
active
|
|
76
|
-
]);
|
|
77
|
-
if (typeof window === "undefined") return active ? CLOSED : IDLE;
|
|
78
|
-
return state;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* `fn`, run at most once per `ms`: the first call starts the window, and the
|
|
82
|
-
* calls inside it fold into the one run at its end. Stable across renders;
|
|
83
|
-
* a pending run is dropped on unmount.
|
|
84
|
-
*/
|
|
85
|
-
function useCoalesced(fn, ms = 150) {
|
|
86
|
-
const fnRef = useRef(fn);
|
|
87
|
-
fnRef.current = fn;
|
|
88
|
-
const timer = useRef(null);
|
|
89
|
-
useEffect(() => () => {
|
|
90
|
-
if (timer.current) clearTimeout(timer.current);
|
|
91
|
-
timer.current = null;
|
|
92
|
-
}, []);
|
|
93
|
-
const coalesced = useRef(null);
|
|
94
|
-
coalesced.current ??= () => {
|
|
95
|
-
if (timer.current) return;
|
|
96
|
-
timer.current = setTimeout(() => {
|
|
97
|
-
timer.current = null;
|
|
98
|
-
fnRef.current();
|
|
99
|
-
}, ms);
|
|
100
|
-
};
|
|
101
|
-
return coalesced.current;
|
|
102
|
-
}
|
|
103
|
-
//#endregion
|
|
104
|
-
//#region client/useChannel.ts
|
|
105
|
-
var warnedWithoutResync = /* @__PURE__ */ new Set();
|
|
106
|
-
/**
|
|
107
|
-
* Subscribes to a broadcast channel while the component is mounted.
|
|
108
|
-
*
|
|
109
|
-
* ```tsx
|
|
110
|
-
* const { status } = useChannel("site.:siteId", { params: { siteId } }, {
|
|
111
|
-
* on: { changed: (d) => mutate({ path: "/pages/:pageId", params: { pageId } }) },
|
|
112
|
-
* onResync: () => mutate({ path: "/pages/:pageId", params: { pageId } }),
|
|
113
|
-
* });
|
|
114
|
-
* ```
|
|
115
|
-
*
|
|
116
|
-
* Events are hints, delivered at most once: pair `on` with `onResync`, which
|
|
117
|
-
* runs whenever some may have been missed. `useChannelInvalidate` does both
|
|
118
|
-
* for the common case. On the server, and until the effect runs, `status` is
|
|
119
|
-
* `closed`.
|
|
120
|
-
*/
|
|
121
|
-
function useChannel(pattern, options = {}, config = {}) {
|
|
122
|
-
const configRef = useRef(config);
|
|
123
|
-
configRef.current = config;
|
|
124
|
-
const hasOn = config.on !== void 0 && Object.keys(config.on).length > 0;
|
|
125
|
-
const hasResync = config.onResync !== void 0;
|
|
126
|
-
useEffect(() => {
|
|
127
|
-
if (process.env.NODE_ENV === "production") return;
|
|
128
|
-
if (!hasOn || hasResync || warnedWithoutResync.has(pattern)) return;
|
|
129
|
-
warnedWithoutResync.add(pattern);
|
|
130
|
-
console.warn(`[gemi] useChannel("${pattern}") has \`on\` handlers but no \`onResync\`. Broadcast events are hints delivered at most once: after a reconnect or a gap the events in between are gone, so refetch in \`onResync\` (or use useChannelInvalidate).`);
|
|
131
|
-
}, [
|
|
132
|
-
pattern,
|
|
133
|
-
hasOn,
|
|
134
|
-
hasResync
|
|
135
|
-
]);
|
|
136
|
-
return useChannelSubscription(pattern, options.params ?? {}, {
|
|
137
|
-
onEvent: (event, data) => {
|
|
138
|
-
const handler = configRef.current.on?.[event];
|
|
139
|
-
handler?.(data);
|
|
140
|
-
},
|
|
141
|
-
onResync: () => configRef.current.onResync?.()
|
|
142
|
-
}, config.enabled !== false);
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Refetches `paths` on any event on the channel and on every resync. Only
|
|
146
|
-
* the variants being rendered refetch now; the rest are marked stale. Events
|
|
147
|
-
* are coalesced: a burst within 150 ms refetches once.
|
|
148
|
-
*
|
|
149
|
-
* ```tsx
|
|
150
|
-
* useChannelInvalidate("page.:pageId", { pageId }, ["/pages/:pageId", "/pages/:pageId/pictures"]);
|
|
151
|
-
* ```
|
|
152
|
-
*/
|
|
153
|
-
function useChannelInvalidate(pattern, params, paths, config = {}) {
|
|
154
|
-
const { getResource } = useContext(QueryManagerContext);
|
|
155
|
-
const routeParams = useParams();
|
|
156
|
-
const channelParams = params ?? {};
|
|
157
|
-
const latest = useRef({
|
|
158
|
-
paths,
|
|
159
|
-
routeParams,
|
|
160
|
-
channelParams,
|
|
161
|
-
getResource
|
|
162
|
-
});
|
|
163
|
-
latest.current = {
|
|
164
|
-
paths,
|
|
165
|
-
routeParams,
|
|
166
|
-
channelParams,
|
|
167
|
-
getResource
|
|
168
|
-
};
|
|
169
|
-
const invalidate = () => {
|
|
170
|
-
const { paths, routeParams, channelParams, getResource } = latest.current;
|
|
171
|
-
for (const entry of paths) {
|
|
172
|
-
const target = typeof entry === "string" ? { path: entry } : entry;
|
|
173
|
-
const resource = getResource(applyParams$1(target.path, {
|
|
174
|
-
...routeParams,
|
|
175
|
-
...channelParams,
|
|
176
|
-
...target.params
|
|
177
|
-
}));
|
|
178
|
-
const keys = target.search ? [toVariantKey(target.search)] : resource.variantKeys();
|
|
179
|
-
for (const key of keys) resource.invalidate(key);
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
return useChannelSubscription(pattern, channelParams, {
|
|
183
|
-
onEvent: useCoalesced(invalidate),
|
|
184
|
-
onResync: invalidate
|
|
185
|
-
}, config.enabled !== false);
|
|
186
|
-
}
|
|
187
|
-
function resolveLiveChannel(live) {
|
|
188
|
-
if (!live) return null;
|
|
189
|
-
if (typeof live === "string") return {
|
|
190
|
-
pattern: live,
|
|
191
|
-
params: {}
|
|
192
|
-
};
|
|
193
|
-
if (Array.isArray(live)) return {
|
|
194
|
-
pattern: live[0],
|
|
195
|
-
params: live[1] ?? {}
|
|
196
|
-
};
|
|
197
|
-
const object = live;
|
|
198
|
-
return {
|
|
199
|
-
pattern: object.channel,
|
|
200
|
-
params: object.params ?? {}
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
//#endregion
|
|
204
30
|
//#region client/useQuery.ts
|
|
205
31
|
/**
|
|
206
32
|
* A DOM event or React's synthetic one. Never a plain object, so a cached
|
|
@@ -275,18 +101,15 @@ function useFrameworkQuery(url, ...args) {
|
|
|
275
101
|
const lazy = config.lazy;
|
|
276
102
|
const configRef = useRef(config);
|
|
277
103
|
configRef.current = config;
|
|
278
|
-
const
|
|
104
|
+
const realtime = useContext(RealtimeContext);
|
|
105
|
+
const [liveOpen, setLiveOpen] = useState(false);
|
|
279
106
|
const liveResourceRef = useRef(resource);
|
|
280
107
|
liveResourceRef.current = resource;
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
const liveOpen = useChannelSubscription(liveChannel?.pattern ?? null, liveChannel?.params ?? {}, {
|
|
287
|
-
onEvent: refreshLiveOnEvent,
|
|
288
|
-
onResync: refreshLive
|
|
289
|
-
}, liveChannel !== null).status === "open";
|
|
108
|
+
const liveKey = config.live ? JSON.stringify(config.live) : null;
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
if (liveKey === null) return;
|
|
111
|
+
return followLive(realtime, JSON.parse(liveKey), () => liveResourceRef.current, setLiveOpen);
|
|
112
|
+
}, [realtime, liveKey]);
|
|
290
113
|
const refreshIntervalRef = useRef(null);
|
|
291
114
|
const fetchedRef = useRef(!lazy);
|
|
292
115
|
const pollRef = useRef({
|
|
@@ -927,6 +750,16 @@ function withMutationErrorHelpers(error) {
|
|
|
927
750
|
return error;
|
|
928
751
|
}
|
|
929
752
|
//#endregion
|
|
753
|
+
//#region services/broadcast/socketHeader.ts
|
|
754
|
+
/**
|
|
755
|
+
* The request header a client sends its socket id in, for `toOthers`.
|
|
756
|
+
*
|
|
757
|
+
* A module of its own, re-exported by `./protocol`: every mutation in the
|
|
758
|
+
* browser reads it, and anything else in `./protocol` it pulled along would
|
|
759
|
+
* land in every route's entry chunk instead of the lazily loaded socket's.
|
|
760
|
+
*/
|
|
761
|
+
var SOCKET_ID_HEADER = "x-gemi-socket";
|
|
762
|
+
//#endregion
|
|
930
763
|
//#region client/useSetQueryData.ts
|
|
931
764
|
/**
|
|
932
765
|
* Write into every variant `target` names. `next` is the value to write, or
|
|
@@ -1382,16 +1215,8 @@ function filenameOf(response) {
|
|
|
1382
1215
|
}
|
|
1383
1216
|
//#endregion
|
|
1384
1217
|
//#region client/useSubscription.ts
|
|
1385
|
-
|
|
1386
|
-
var
|
|
1387
|
-
/** The server answered in a way retrying will not change (401, 403, 404). */
|
|
1388
|
-
var FatalStatus = class extends Error {
|
|
1389
|
-
status;
|
|
1390
|
-
constructor(status) {
|
|
1391
|
-
super(`The subscription was refused with ${status}.`);
|
|
1392
|
-
this.status = status;
|
|
1393
|
-
}
|
|
1394
|
-
};
|
|
1218
|
+
/** `./subscriptionStream`, loaded on first use. Replaceable in tests. */
|
|
1219
|
+
var streamModule = { load: () => import("../chunks/subscriptionStream-CULcRbx0.js") };
|
|
1395
1220
|
/**
|
|
1396
1221
|
* Follows a route that answers with `ChangeFeed.stream`, as long as the
|
|
1397
1222
|
* component is mounted: each change reaches `onChange`, in order, exactly
|
|
@@ -1442,105 +1267,27 @@ function useSubscription(url, options = {}, config = {}) {
|
|
|
1442
1267
|
return;
|
|
1443
1268
|
}
|
|
1444
1269
|
let stopped = false;
|
|
1445
|
-
let
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1270
|
+
let stop = null;
|
|
1271
|
+
streamModule.load().then((module) => {
|
|
1272
|
+
const { follow } = loadedModule(module);
|
|
1273
|
+
if (stopped) return;
|
|
1274
|
+
stop = follow({
|
|
1275
|
+
endpoint,
|
|
1276
|
+
pauseWhenHidden,
|
|
1277
|
+
cursor,
|
|
1278
|
+
callbacks,
|
|
1279
|
+
setState
|
|
1280
|
+
});
|
|
1281
|
+
}).catch((error) => {
|
|
1282
|
+
if (!stopped) setState((s) => ({
|
|
1283
|
+
...s,
|
|
1284
|
+
status: "closed",
|
|
1285
|
+
error
|
|
1286
|
+
}));
|
|
1462
1287
|
});
|
|
1463
|
-
(async () => {
|
|
1464
|
-
while (!stopped) {
|
|
1465
|
-
if (hidden()) {
|
|
1466
|
-
setState((s) => ({
|
|
1467
|
-
...s,
|
|
1468
|
-
status: "paused"
|
|
1469
|
-
}));
|
|
1470
|
-
await new Promise((resolve) => resume = resolve);
|
|
1471
|
-
resume = null;
|
|
1472
|
-
continue;
|
|
1473
|
-
}
|
|
1474
|
-
setState((s) => ({
|
|
1475
|
-
...s,
|
|
1476
|
-
status: "connecting"
|
|
1477
|
-
}));
|
|
1478
|
-
const controller = request = new AbortController();
|
|
1479
|
-
let delay = retryMs;
|
|
1480
|
-
try {
|
|
1481
|
-
const headers = { Accept: "text/event-stream" };
|
|
1482
|
-
if (cursor.current) headers["Last-Event-ID"] = cursor.current;
|
|
1483
|
-
const response = await fetch(endpoint, {
|
|
1484
|
-
headers,
|
|
1485
|
-
signal: controller.signal
|
|
1486
|
-
});
|
|
1487
|
-
if (!response.ok || !response.body) {
|
|
1488
|
-
const status = response.status;
|
|
1489
|
-
if (status >= 400 && status < 500 && status !== 408 && status !== 429) throw new FatalStatus(status);
|
|
1490
|
-
const retryAfter = Number(response.headers.get("Retry-After"));
|
|
1491
|
-
if (Number.isFinite(retryAfter) && retryAfter > 0) delay = retryAfter * 1e3;
|
|
1492
|
-
throw new Error(`The subscription answered ${status}.`);
|
|
1493
|
-
}
|
|
1494
|
-
for await (const { id, message } of readEvents(response.body)) {
|
|
1495
|
-
if (stopped) return;
|
|
1496
|
-
if (id !== void 0) cursor.current = id;
|
|
1497
|
-
if (message.type === "ready") {
|
|
1498
|
-
retryMs = MIN_RETRY_MS;
|
|
1499
|
-
delay = MIN_RETRY_MS;
|
|
1500
|
-
setState({
|
|
1501
|
-
status: "open",
|
|
1502
|
-
cursor: cursor.current,
|
|
1503
|
-
error: null
|
|
1504
|
-
});
|
|
1505
|
-
} else {
|
|
1506
|
-
setState((s) => ({
|
|
1507
|
-
...s,
|
|
1508
|
-
cursor: cursor.current
|
|
1509
|
-
}));
|
|
1510
|
-
if (message.type === "change") callbacks.current.onChange?.(message);
|
|
1511
|
-
else if (message.type === "reset") callbacks.current.onReset?.(message);
|
|
1512
|
-
}
|
|
1513
|
-
}
|
|
1514
|
-
} catch (error) {
|
|
1515
|
-
if (stopped) return;
|
|
1516
|
-
if (error instanceof FatalStatus) {
|
|
1517
|
-
setState((s) => ({
|
|
1518
|
-
...s,
|
|
1519
|
-
status: "closed",
|
|
1520
|
-
error
|
|
1521
|
-
}));
|
|
1522
|
-
return;
|
|
1523
|
-
}
|
|
1524
|
-
if (controller.signal.aborted) continue;
|
|
1525
|
-
setState((s) => ({
|
|
1526
|
-
...s,
|
|
1527
|
-
error
|
|
1528
|
-
}));
|
|
1529
|
-
}
|
|
1530
|
-
if (stopped || controller.signal.aborted) continue;
|
|
1531
|
-
setState((s) => ({
|
|
1532
|
-
...s,
|
|
1533
|
-
status: "connecting"
|
|
1534
|
-
}));
|
|
1535
|
-
await wait(delay);
|
|
1536
|
-
retryMs = Math.min(retryMs * 2, MAX_RETRY_MS);
|
|
1537
|
-
}
|
|
1538
|
-
})();
|
|
1539
1288
|
return () => {
|
|
1540
1289
|
stopped = true;
|
|
1541
|
-
|
|
1542
|
-
resume?.();
|
|
1543
|
-
if (typeof document !== "undefined") document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
1290
|
+
stop?.();
|
|
1544
1291
|
};
|
|
1545
1292
|
}, [
|
|
1546
1293
|
endpoint,
|
|
@@ -1550,48 +1297,89 @@ function useSubscription(url, options = {}, config = {}) {
|
|
|
1550
1297
|
]);
|
|
1551
1298
|
return state;
|
|
1552
1299
|
}
|
|
1300
|
+
//#endregion
|
|
1301
|
+
//#region client/useChannel.ts
|
|
1302
|
+
var warnedWithoutResync = /* @__PURE__ */ new Set();
|
|
1553
1303
|
/**
|
|
1554
|
-
*
|
|
1555
|
-
*
|
|
1556
|
-
*
|
|
1304
|
+
* Subscribes to a broadcast channel while the component is mounted.
|
|
1305
|
+
*
|
|
1306
|
+
* ```tsx
|
|
1307
|
+
* const { status } = useChannel("site.:siteId", { params: { siteId } }, {
|
|
1308
|
+
* on: { changed: (d) => mutate({ path: "/pages/:pageId", params: { pageId } }) },
|
|
1309
|
+
* onResync: () => mutate({ path: "/pages/:pageId", params: { pageId } }),
|
|
1310
|
+
* });
|
|
1311
|
+
* ```
|
|
1312
|
+
*
|
|
1313
|
+
* Events are hints, delivered at most once: pair `on` with `onResync`, which
|
|
1314
|
+
* runs whenever some may have been missed. `useChannelInvalidate` does both
|
|
1315
|
+
* for the common case. On the server, and until the effect runs, `status` is
|
|
1316
|
+
* `closed`.
|
|
1557
1317
|
*/
|
|
1558
|
-
|
|
1559
|
-
const
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1318
|
+
function useChannel(pattern, options = {}, config = {}) {
|
|
1319
|
+
const configRef = useRef(config);
|
|
1320
|
+
configRef.current = config;
|
|
1321
|
+
const hasOn = config.on !== void 0 && Object.keys(config.on).length > 0;
|
|
1322
|
+
const hasResync = config.onResync !== void 0;
|
|
1323
|
+
useEffect(() => {
|
|
1324
|
+
if (process.env.NODE_ENV === "production") return;
|
|
1325
|
+
if (!hasOn || hasResync || warnedWithoutResync.has(pattern)) return;
|
|
1326
|
+
warnedWithoutResync.add(pattern);
|
|
1327
|
+
console.warn(`[gemi] useChannel("${pattern}") has \`on\` handlers but no \`onResync\`. Broadcast events are hints delivered at most once: after a reconnect or a gap the events in between are gone, so refetch in \`onResync\` (or use useChannelInvalidate).`);
|
|
1328
|
+
}, [
|
|
1329
|
+
pattern,
|
|
1330
|
+
hasOn,
|
|
1331
|
+
hasResync
|
|
1332
|
+
]);
|
|
1333
|
+
return useChannelSubscription(pattern, options.params ?? {}, {
|
|
1334
|
+
onEvent: (event, data) => {
|
|
1335
|
+
const handler = configRef.current.on?.[event];
|
|
1336
|
+
handler?.(data);
|
|
1337
|
+
},
|
|
1338
|
+
onResync: () => configRef.current.onResync?.()
|
|
1339
|
+
}, config.enabled !== false);
|
|
1340
|
+
}
|
|
1341
|
+
/**
|
|
1342
|
+
* Refetches `paths` on any event on the channel and on every resync. Only
|
|
1343
|
+
* the variants being rendered refetch now; the rest are marked stale. Events
|
|
1344
|
+
* are coalesced: a burst within 150 ms refetches once.
|
|
1345
|
+
*
|
|
1346
|
+
* ```tsx
|
|
1347
|
+
* useChannelInvalidate("page.:pageId", { pageId }, ["/pages/:pageId", "/pages/:pageId/pictures"]);
|
|
1348
|
+
* ```
|
|
1349
|
+
*/
|
|
1350
|
+
function useChannelInvalidate(pattern, params, paths, config = {}) {
|
|
1351
|
+
const { getResource } = useContext(QueryManagerContext);
|
|
1352
|
+
const routeParams = useParams();
|
|
1353
|
+
const channelParams = params ?? {};
|
|
1354
|
+
const latest = useRef({
|
|
1355
|
+
paths,
|
|
1356
|
+
routeParams,
|
|
1357
|
+
channelParams,
|
|
1358
|
+
getResource
|
|
1359
|
+
});
|
|
1360
|
+
latest.current = {
|
|
1361
|
+
paths,
|
|
1362
|
+
routeParams,
|
|
1363
|
+
channelParams,
|
|
1364
|
+
getResource
|
|
1365
|
+
};
|
|
1366
|
+
const invalidate = () => {
|
|
1367
|
+
const { paths, routeParams, channelParams, getResource } = latest.current;
|
|
1368
|
+
for (const entry of paths) {
|
|
1369
|
+
const target = typeof entry === "string" ? { path: entry } : entry;
|
|
1370
|
+
const resource = getResource(applyParams$1(target.path, {
|
|
1371
|
+
...routeParams,
|
|
1372
|
+
...channelParams,
|
|
1373
|
+
...target.params
|
|
1374
|
+
}));
|
|
1375
|
+
const keys = target.search ? [toVariantKey(target.search)] : resource.variantKeys();
|
|
1376
|
+
for (const key of keys) resource.invalidate(key);
|
|
1591
1377
|
}
|
|
1592
|
-
}
|
|
1593
|
-
|
|
1594
|
-
|
|
1378
|
+
};
|
|
1379
|
+
return useChannelSubscription(pattern, channelParams, {
|
|
1380
|
+
onEvent: useCoalesced(invalidate),
|
|
1381
|
+
onResync: invalidate
|
|
1382
|
+
}, config.enabled !== false);
|
|
1595
1383
|
}
|
|
1596
1384
|
//#endregion
|
|
1597
1385
|
//#region client/Mutation.tsx
|