@farm.js/core 0.1.0-beta.95 → 0.1.0-beta.97
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/after.cjs +1 -1
- package/dist/after.mjs +1 -1
- package/dist/agent-runtime.d.mts +3 -2
- package/dist/agent-runtime.d.ts +3 -2
- package/dist/api/route-manager.cjs +43 -4
- package/dist/api/route-manager.d.mts +4 -3
- package/dist/api/route-manager.d.ts +4 -3
- package/dist/api/route-manager.mjs +7 -7
- package/dist/api/runtime.cjs +43 -4
- package/dist/api/runtime.d.mts +1 -1
- package/dist/api/runtime.d.ts +1 -1
- package/dist/api/runtime.mjs +5 -5
- package/dist/api.cjs +352 -109
- package/dist/api.d.mts +7 -6
- package/dist/api.d.ts +7 -6
- package/dist/api.mjs +19 -12
- package/dist/{app-CIIEvA4r.d.ts → app-CIOx3LvY.d.ts} +4 -4
- package/dist/{app-O4AEC1OH.d.mts → app-DBd6437H.d.mts} +4 -4
- package/dist/app-markdown.d.mts +4 -3
- package/dist/app-markdown.d.ts +4 -3
- package/dist/cache.cjs +42 -4
- package/dist/cache.d.mts +68 -1
- package/dist/cache.d.ts +68 -1
- package/dist/cache.mjs +3 -3
- package/dist/{chunk-AXVJCMVF.mjs → chunk-2HDOV47R.mjs} +3 -3
- package/dist/chunk-2HDOV47R.mjs.map +1 -0
- package/dist/{chunk-RBRLLZL5.mjs → chunk-34IAPZBG.mjs} +16 -3
- package/dist/chunk-34IAPZBG.mjs.map +1 -0
- package/dist/{chunk-VV24CC42.mjs → chunk-35NPLKQJ.mjs} +2 -2
- package/dist/{chunk-D7QH7MDU.mjs → chunk-3TWQERDE.mjs} +5 -4
- package/dist/chunk-3TWQERDE.mjs.map +1 -0
- package/dist/{chunk-RWYRFCLG.mjs → chunk-4X57GXQA.mjs} +2 -2
- package/dist/{chunk-KOTSX5JH.mjs → chunk-52BR7LTX.mjs} +30 -21
- package/dist/chunk-52BR7LTX.mjs.map +1 -0
- package/dist/{chunk-SALMKQXH.mjs → chunk-6EJHNHH4.mjs} +80 -27
- package/dist/chunk-6EJHNHH4.mjs.map +1 -0
- package/dist/{chunk-ZFNK77WN.mjs → chunk-6JNGOC37.mjs} +2 -2
- package/dist/{after.cjs.map → chunk-6JNGOC37.mjs.map} +1 -1
- package/dist/{chunk-MOW47IF5.mjs → chunk-6UYVU46O.mjs} +2 -2
- package/dist/{chunk-7MABZJIM.mjs → chunk-7PYVLJ4J.mjs} +1 -1
- package/dist/chunk-7PYVLJ4J.mjs.map +1 -0
- package/dist/{chunk-FLHLPB57.mjs → chunk-D7F7YZ7L.mjs} +93 -67
- package/dist/chunk-D7F7YZ7L.mjs.map +1 -0
- package/dist/chunk-DU3PKDVQ.mjs +35 -0
- package/dist/chunk-DU3PKDVQ.mjs.map +1 -0
- package/dist/{chunk-SCFX4UTD.mjs → chunk-EHTUKVSW.mjs} +1 -1
- package/dist/chunk-EHTUKVSW.mjs.map +1 -0
- package/dist/{chunk-KWCNQUH5.mjs → chunk-EPDIF432.mjs} +526 -50
- package/dist/chunk-EPDIF432.mjs.map +1 -0
- package/dist/{chunk-A3636IHN.mjs → chunk-FP5Q67FO.mjs} +167 -96
- package/dist/chunk-FP5Q67FO.mjs.map +1 -0
- package/dist/{chunk-HHZAOTQD.mjs → chunk-GJ7W6LNK.mjs} +7 -6
- package/dist/chunk-GJ7W6LNK.mjs.map +1 -0
- package/dist/{chunk-RLGUZ3HS.mjs → chunk-I3OOUWO5.mjs} +3 -3
- package/dist/{chunk-75CGAL6E.mjs → chunk-IZBX2TEU.mjs} +217 -105
- package/dist/chunk-IZBX2TEU.mjs.map +1 -0
- package/dist/{chunk-22VG4DFJ.mjs → chunk-J3MPQ4MQ.mjs} +2 -2
- package/dist/{chunk-22VG4DFJ.mjs.map → chunk-J3MPQ4MQ.mjs.map} +1 -1
- package/dist/{chunk-2LS3KKE7.mjs → chunk-JV7JUD7Q.mjs} +4 -4
- package/dist/{chunk-Q3OX763A.mjs → chunk-LXDASSTE.mjs} +2 -2
- package/dist/{chunk-ZRBCBOEX.mjs → chunk-N2FY2QZ7.mjs} +28 -3
- package/dist/chunk-N2FY2QZ7.mjs.map +1 -0
- package/dist/{chunk-MRVJCLYQ.mjs → chunk-PSQ7N4XP.mjs} +4 -2
- package/dist/chunk-PSQ7N4XP.mjs.map +1 -0
- package/dist/{chunk-HVG3HLQZ.mjs → chunk-Q7WGOOAI.mjs} +3 -3
- package/dist/{chunk-WTYAPO5I.mjs → chunk-RCNWMEBT.mjs} +3 -2
- package/dist/{chunk-WTYAPO5I.mjs.map → chunk-RCNWMEBT.mjs.map} +1 -1
- package/dist/{chunk-3INDBMUU.mjs → chunk-TGDIACZT.mjs} +2 -2
- package/dist/{chunk-WB75GIX2.mjs → chunk-TQTB33JS.mjs} +14 -3
- package/dist/chunk-TQTB33JS.mjs.map +1 -0
- package/dist/{chunk-MH27UH72.mjs → chunk-TT3E2JOF.mjs} +3 -3
- package/dist/{chunk-UWRGX3J3.mjs → chunk-UMUWR5XA.mjs} +2 -2
- package/dist/{chunk-XTLLHCWU.mjs → chunk-V4VRLVLW.mjs} +52 -31
- package/dist/chunk-V4VRLVLW.mjs.map +1 -0
- package/dist/{chunk-EXCGBERG.mjs → chunk-WD2EBM3I.mjs} +79 -17
- package/dist/chunk-WD2EBM3I.mjs.map +1 -0
- package/dist/{chunk-DLBUAJTK.mjs → chunk-WMJGA32P.mjs} +74 -5
- package/dist/chunk-WMJGA32P.mjs.map +1 -0
- package/dist/{chunk-TKQCJMY7.mjs → chunk-X4SFHKFH.mjs} +7 -4
- package/dist/{chunk-TKQCJMY7.mjs.map → chunk-X4SFHKFH.mjs.map} +1 -1
- package/dist/{chunk-Q7GPJZCO.mjs → chunk-YIBV77KZ.mjs} +26 -7
- package/dist/chunk-YIBV77KZ.mjs.map +1 -0
- package/dist/client/lifecycle.mjs +2 -2
- package/dist/{client-mcMC334J.d.mts → client-DWoLZ3QU.d.mts} +52 -5
- package/dist/{client-d5ONQ-Pd.d.ts → client-DuQuQC1h.d.ts} +52 -5
- package/dist/client-cache-BMxuFqwH.d.ts +18 -0
- package/dist/client-cache-CCK-fCe0.d.mts +18 -0
- package/dist/{client-plugins-BvClItiL.d.mts → client-plugins-B6-07YmP.d.mts} +52 -99
- package/dist/{client-plugins-B9Sq-iMg.d.ts → client-plugins-By6MVUX-.d.ts} +52 -99
- package/dist/client-plugins.cjs +1 -1
- package/dist/client-plugins.d.mts +3 -2
- package/dist/client-plugins.d.ts +3 -2
- package/dist/client-plugins.mjs +2 -2
- package/dist/client.cjs +1046 -211
- package/dist/client.d.mts +136 -18
- package/dist/client.d.ts +136 -18
- package/dist/client.mjs +32 -15
- package/dist/config.d.mts +3 -2
- package/dist/config.d.ts +3 -2
- package/dist/{devtools-S52RRRMN.mjs → devtools-XWZX6CCL.mjs} +5 -5
- package/dist/{devtools-client-3XRTBND5.mjs → devtools-client-Z7QQA3Q2.mjs} +56 -17
- package/dist/devtools-client-Z7QQA3Q2.mjs.map +1 -0
- package/dist/{devtools-ui-NJKFORTG.mjs → devtools-ui-2HG5M4EL.mjs} +3 -1
- package/dist/devtools-ui-2HG5M4EL.mjs.map +1 -0
- package/dist/docs.cjs +24 -5
- package/dist/docs.mjs +5 -5
- package/dist/i18n/server.cjs +13 -2
- package/dist/i18n/server.d.mts +2 -2
- package/dist/i18n/server.d.ts +2 -2
- package/dist/i18n/server.mjs +1 -1
- package/dist/index.cjs +1928 -894
- package/dist/index.d.mts +139 -21
- package/dist/index.d.ts +139 -21
- package/dist/index.mjs +57 -34
- package/dist/index.mjs.map +1 -1
- package/dist/integration-api-BT024nuJ.d.mts +97 -0
- package/dist/integration-api-BT024nuJ.d.ts +97 -0
- package/dist/integrations.d.mts +3 -2
- package/dist/integrations.d.ts +3 -2
- package/dist/internal/build-runtime.cjs +764 -547
- package/dist/internal/build-runtime.d.mts +5 -4
- package/dist/internal/build-runtime.d.ts +5 -4
- package/dist/internal/build-runtime.mjs +16 -16
- package/dist/internal/client-runtime.cjs +1 -1
- package/dist/internal/client-runtime.mjs +2 -2
- package/dist/internal/config-runtime.cjs +4 -1
- package/dist/internal/config-runtime.d.mts +4 -3
- package/dist/internal/config-runtime.d.ts +4 -3
- package/dist/internal/config-runtime.mjs +4 -4
- package/dist/internal/product-telemetry-runtime.cjs +1 -1
- package/dist/internal/product-telemetry-runtime.mjs +1 -1
- package/dist/internal/production-runtime.cjs +29 -3
- package/dist/internal/production-runtime.d.mts +8 -7
- package/dist/internal/production-runtime.d.ts +8 -7
- package/dist/internal/production-runtime.mjs +5 -5
- package/dist/{metadata-route-yV4U6X8h.d.ts → metadata-route-8_V3UonT.d.ts} +1 -1
- package/dist/{metadata-route-p4K1l92V.d.mts → metadata-route-CWP_HjGU.d.mts} +1 -1
- package/dist/middleware.cjs +28 -2
- package/dist/middleware.d.mts +5 -4
- package/dist/middleware.d.ts +5 -4
- package/dist/middleware.mjs +4 -4
- package/dist/navigation.cjs +3 -1
- package/dist/navigation.mjs +3 -3
- package/dist/observability.cjs +27 -2
- package/dist/observability.mjs +1 -1
- package/dist/plugin.cjs +528 -349
- package/dist/plugin.d.mts +3 -2
- package/dist/plugin.d.ts +3 -2
- package/dist/plugin.mjs +13 -13
- package/dist/{production-runtime-IkB0Qj4i.d.mts → production-runtime-BGRH1dKG.d.mts} +1 -1
- package/dist/{production-runtime-0JTch4_d.d.ts → production-runtime-CdmzsDax.d.ts} +1 -1
- package/dist/query/client.cjs +68 -29
- package/dist/query/client.mjs +69 -30
- package/dist/query/client.mjs.map +1 -1
- package/dist/{render-plan-Dc8CjNI7.d.ts → render-plan-0GeHiGVZ.d.ts} +1 -1
- package/dist/{render-plan-CU31j-Jk.d.mts → render-plan-DLxJYAA5.d.mts} +1 -1
- package/dist/renderer-client.cjs +169 -26
- package/dist/renderer-client.d.mts +7 -6
- package/dist/renderer-client.d.ts +7 -6
- package/dist/renderer-client.mjs +16 -19
- package/dist/renderer-client.mjs.map +1 -1
- package/dist/{request-BXa1KY8i.d.mts → request-BCNXSXLh.d.mts} +1 -1
- package/dist/{request-CUUBujZt.d.ts → request-BstWbZ6O.d.ts} +1 -1
- package/dist/request.d.mts +4 -3
- package/dist/request.d.ts +4 -3
- package/dist/{route-Y8lfz1wF.d.ts → route-4pd-EVtw.d.ts} +45 -50
- package/dist/{route-Cq3aObmj.d.mts → route-CvEr4Uc9.d.mts} +45 -50
- package/dist/routes.cjs +27 -2
- package/dist/routes.d.mts +3 -2
- package/dist/routes.d.ts +3 -2
- package/dist/routes.mjs +4 -4
- package/dist/{runtime-j1S3sDTh.d.ts → runtime-BgDQzBiu.d.ts} +1 -0
- package/dist/{runtime-DDwvDtS4.d.mts → runtime-CV2UCV-5.d.mts} +1 -0
- package/dist/server-action-security.mjs +2 -2
- package/dist/server-fn-client.cjs +102 -26
- package/dist/server-fn-client.d.mts +6 -0
- package/dist/server-fn-client.d.ts +6 -0
- package/dist/server-fn-client.mjs +2 -1
- package/dist/server-fn.cjs +42 -4
- package/dist/server-fn.mjs +5 -5
- package/dist/server-plugins.d.mts +4 -3
- package/dist/server-plugins.d.ts +4 -3
- package/dist/server-query-client.cjs +195 -34
- package/dist/server-query-client.d.mts +3 -3
- package/dist/server-query-client.d.ts +3 -3
- package/dist/server-query-client.mjs +7 -7
- package/dist/{server-query-runtime-3zAj77yv.d.ts → server-query-runtime-DXRNhX_3.d.ts} +2 -0
- package/dist/{server-query-runtime-B50KAcj5.d.mts → server-query-runtime-aP52iuL5.d.mts} +2 -0
- package/dist/server-query.cjs +44 -5
- package/dist/server-query.d.mts +4 -0
- package/dist/server-query.d.ts +4 -0
- package/dist/server-query.mjs +7 -7
- package/dist/server.cjs +553 -370
- package/dist/server.d.mts +11 -10
- package/dist/server.d.ts +11 -10
- package/dist/server.mjs +17 -17
- package/dist/{spa-router-CyLkwst6.d.mts → spa-router-BeyAVSc6.d.mts} +1 -1
- package/dist/{spa-router-BkqGXaV_.d.ts → spa-router-COgu4txb.d.ts} +1 -1
- package/dist/testing.cjs +27 -2
- package/dist/testing.d.mts +3 -2
- package/dist/testing.d.ts +3 -2
- package/dist/testing.mjs +9 -9
- package/dist/{utils-NKR6SoNv.d.mts → utils-DL2VwDQl.d.mts} +1 -1
- package/dist/{utils-B2OHrb9F.d.ts → utils-DkU2c_1B.d.ts} +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +536 -353
- package/dist/vite.d.mts +3 -2
- package/dist/vite.d.ts +3 -2
- package/dist/vite.mjs +17 -13
- package/package.json +17 -17
- package/types/client.d.ts +115 -10
- package/dist/agent-runtime.cjs.map +0 -1
- package/dist/api/route-manager.cjs.map +0 -1
- package/dist/api/runtime.cjs.map +0 -1
- package/dist/api.cjs.map +0 -1
- package/dist/app-markdown.cjs.map +0 -1
- package/dist/cache.cjs.map +0 -1
- package/dist/chunk-75CGAL6E.mjs.map +0 -1
- package/dist/chunk-7MABZJIM.mjs.map +0 -1
- package/dist/chunk-A3636IHN.mjs.map +0 -1
- package/dist/chunk-AXVJCMVF.mjs.map +0 -1
- package/dist/chunk-D7QH7MDU.mjs.map +0 -1
- package/dist/chunk-DLBUAJTK.mjs.map +0 -1
- package/dist/chunk-EXCGBERG.mjs.map +0 -1
- package/dist/chunk-FLHLPB57.mjs.map +0 -1
- package/dist/chunk-HHZAOTQD.mjs.map +0 -1
- package/dist/chunk-KOTSX5JH.mjs.map +0 -1
- package/dist/chunk-KWCNQUH5.mjs.map +0 -1
- package/dist/chunk-MRVJCLYQ.mjs.map +0 -1
- package/dist/chunk-Q7GPJZCO.mjs.map +0 -1
- package/dist/chunk-RBRLLZL5.mjs.map +0 -1
- package/dist/chunk-SALMKQXH.mjs.map +0 -1
- package/dist/chunk-SCFX4UTD.mjs.map +0 -1
- package/dist/chunk-WB75GIX2.mjs.map +0 -1
- package/dist/chunk-XTLLHCWU.mjs.map +0 -1
- package/dist/chunk-ZFNK77WN.mjs.map +0 -1
- package/dist/chunk-ZRBCBOEX.mjs.map +0 -1
- package/dist/client/lifecycle.cjs.map +0 -1
- package/dist/client-cache-CopR_MaI.d.mts +0 -6
- package/dist/client-cache-Djy_TlE8.d.ts +0 -6
- package/dist/client-plugins.cjs.map +0 -1
- package/dist/client.cjs.map +0 -1
- package/dist/config.cjs.map +0 -1
- package/dist/cron.cjs.map +0 -1
- package/dist/deferred.cjs.map +0 -1
- package/dist/deployment.cjs.map +0 -1
- package/dist/devtools-client-3XRTBND5.mjs.map +0 -1
- package/dist/devtools-ui-NJKFORTG.mjs.map +0 -1
- package/dist/docs.cjs.map +0 -1
- package/dist/env-types.cjs.map +0 -1
- package/dist/env.cjs.map +0 -1
- package/dist/environment/vite.cjs.map +0 -1
- package/dist/environment.cjs.map +0 -1
- package/dist/font.cjs.map +0 -1
- package/dist/headers.cjs.map +0 -1
- package/dist/i18n/client.cjs.map +0 -1
- package/dist/i18n/index.cjs.map +0 -1
- package/dist/i18n/server.cjs.map +0 -1
- package/dist/image/server.cjs.map +0 -1
- package/dist/image/sharp.cjs.map +0 -1
- package/dist/image.cjs.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/instrumentation.cjs.map +0 -1
- package/dist/integrations.cjs.map +0 -1
- package/dist/internal/build-runtime.cjs.map +0 -1
- package/dist/internal/client-runtime.cjs.map +0 -1
- package/dist/internal/config-runtime.cjs.map +0 -1
- package/dist/internal/isolated-boundary.cjs.map +0 -1
- package/dist/internal/metadata-image-runtime.cjs.map +0 -1
- package/dist/internal/product-telemetry-runtime.cjs.map +0 -1
- package/dist/internal/production-node-env.cjs.map +0 -1
- package/dist/internal/production-runtime.cjs.map +0 -1
- package/dist/markdown.cjs.map +0 -1
- package/dist/middleware.cjs.map +0 -1
- package/dist/navigation.cjs.map +0 -1
- package/dist/observability.cjs.map +0 -1
- package/dist/plugin.cjs.map +0 -1
- package/dist/query/client.cjs.map +0 -1
- package/dist/query/index.cjs.map +0 -1
- package/dist/query/parsers.cjs.map +0 -1
- package/dist/query/server.cjs.map +0 -1
- package/dist/renderer/react/client.cjs.map +0 -1
- package/dist/renderer/react/server.cjs.map +0 -1
- package/dist/renderer/react/vite.cjs.map +0 -1
- package/dist/renderer-client.cjs.map +0 -1
- package/dist/renderer.cjs.map +0 -1
- package/dist/request.cjs.map +0 -1
- package/dist/router.cjs.map +0 -1
- package/dist/routes.cjs.map +0 -1
- package/dist/server-action-security.cjs.map +0 -1
- package/dist/server-fn-client.cjs.map +0 -1
- package/dist/server-fn.cjs.map +0 -1
- package/dist/server-plugins.cjs.map +0 -1
- package/dist/server-query-client.cjs.map +0 -1
- package/dist/server-query.cjs.map +0 -1
- package/dist/server.cjs.map +0 -1
- package/dist/storage.cjs.map +0 -1
- package/dist/testing.cjs.map +0 -1
- package/dist/theme/client.cjs.map +0 -1
- package/dist/theme/index.cjs.map +0 -1
- package/dist/theme/runtime.cjs.map +0 -1
- package/dist/theme/server.cjs.map +0 -1
- package/dist/version.cjs.map +0 -1
- package/dist/vite.cjs.map +0 -1
- package/dist/workflows.cjs.map +0 -1
- /package/dist/{chunk-VV24CC42.mjs.map → chunk-35NPLKQJ.mjs.map} +0 -0
- /package/dist/{chunk-RWYRFCLG.mjs.map → chunk-4X57GXQA.mjs.map} +0 -0
- /package/dist/{chunk-MOW47IF5.mjs.map → chunk-6UYVU46O.mjs.map} +0 -0
- /package/dist/{chunk-RLGUZ3HS.mjs.map → chunk-I3OOUWO5.mjs.map} +0 -0
- /package/dist/{chunk-2LS3KKE7.mjs.map → chunk-JV7JUD7Q.mjs.map} +0 -0
- /package/dist/{chunk-Q3OX763A.mjs.map → chunk-LXDASSTE.mjs.map} +0 -0
- /package/dist/{chunk-HVG3HLQZ.mjs.map → chunk-Q7WGOOAI.mjs.map} +0 -0
- /package/dist/{chunk-3INDBMUU.mjs.map → chunk-TGDIACZT.mjs.map} +0 -0
- /package/dist/{chunk-MH27UH72.mjs.map → chunk-TT3E2JOF.mjs.map} +0 -0
- /package/dist/{chunk-UWRGX3J3.mjs.map → chunk-UMUWR5XA.mjs.map} +0 -0
- /package/dist/{devtools-S52RRRMN.mjs.map → devtools-XWZX6CCL.mjs.map} +0 -0
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
+
invokeMutationWithRetry
|
|
3
|
+
} from "./chunk-6EJHNHH4.mjs";
|
|
4
|
+
import {
|
|
5
|
+
applyServerFnOptimisticUpdates,
|
|
2
6
|
getAPIRouteRefMetadata,
|
|
3
|
-
isAPIRouteRef
|
|
4
|
-
|
|
7
|
+
isAPIRouteRef,
|
|
8
|
+
resolveServerFnInvalidateTargets,
|
|
9
|
+
settleServerFnOptimisticUpdates
|
|
10
|
+
} from "./chunk-IZBX2TEU.mjs";
|
|
11
|
+
import {
|
|
12
|
+
notifyClientObserver
|
|
13
|
+
} from "./chunk-DU3PKDVQ.mjs";
|
|
5
14
|
import {
|
|
6
15
|
buildFarmRoutePath
|
|
7
16
|
} from "./chunk-X5GRVT7B.mjs";
|
|
@@ -9,9 +18,18 @@ import {
|
|
|
9
18
|
isFarmLocaleChangeHref,
|
|
10
19
|
localizeActiveFarmHref
|
|
11
20
|
} from "./chunk-ULD4ENAH.mjs";
|
|
21
|
+
import {
|
|
22
|
+
getFarmClientDataCache
|
|
23
|
+
} from "./chunk-WMJGA32P.mjs";
|
|
12
24
|
import {
|
|
13
25
|
getFarmTrailingSlashPreference
|
|
14
26
|
} from "./chunk-RCNUKRBF.mjs";
|
|
27
|
+
import {
|
|
28
|
+
decodeFarmCacheInvalidations,
|
|
29
|
+
encodeFarmCacheInvalidations,
|
|
30
|
+
notifyFarmCacheInvalidation,
|
|
31
|
+
subscribeFarmCacheInvalidation
|
|
32
|
+
} from "./chunk-34IAPZBG.mjs";
|
|
15
33
|
import {
|
|
16
34
|
applyFarmBasePath,
|
|
17
35
|
getFarmBasePath,
|
|
@@ -23,65 +41,156 @@ import {
|
|
|
23
41
|
|
|
24
42
|
// src/mutation-client.ts
|
|
25
43
|
import { useCallback, useMemo, useRef, useState } from "react";
|
|
44
|
+
|
|
45
|
+
// src/client-network-status.ts
|
|
46
|
+
function isNavigatorOnline() {
|
|
47
|
+
if (typeof navigator === "undefined" || typeof navigator.onLine !== "boolean") return true;
|
|
48
|
+
return navigator.onLine;
|
|
49
|
+
}
|
|
50
|
+
__name(isNavigatorOnline, "isNavigatorOnline");
|
|
51
|
+
function subscribeOnline(listener) {
|
|
52
|
+
if (typeof window === "undefined") return () => {
|
|
53
|
+
};
|
|
54
|
+
window.addEventListener("online", listener);
|
|
55
|
+
return () => window.removeEventListener("online", listener);
|
|
56
|
+
}
|
|
57
|
+
__name(subscribeOnline, "subscribeOnline");
|
|
58
|
+
|
|
59
|
+
// src/mutation-client.ts
|
|
26
60
|
function useMutation(target, options = {}) {
|
|
61
|
+
return useMutationLifecycle(target, options).mutation;
|
|
62
|
+
}
|
|
63
|
+
__name(useMutation, "useMutation");
|
|
64
|
+
function useMutationLifecycle(target, options = {}) {
|
|
27
65
|
const initialData = options.initialData ?? null;
|
|
28
66
|
const optionsRef = useRef(options);
|
|
29
67
|
const targetRef = useRef(target);
|
|
30
68
|
const requestIdRef = useRef(0);
|
|
69
|
+
const lastResetIdRef = useRef(0);
|
|
31
70
|
const initialState = {
|
|
32
71
|
pendingCount: 0,
|
|
72
|
+
pausedCount: 0,
|
|
33
73
|
status: "idle",
|
|
34
74
|
data: initialData,
|
|
35
75
|
error: null,
|
|
36
76
|
variables: void 0
|
|
37
77
|
};
|
|
38
78
|
const stateRef = useRef(initialState);
|
|
79
|
+
const resetWakersRef = useRef(/* @__PURE__ */ new Set());
|
|
39
80
|
const [state, setState] = useState(initialState);
|
|
40
81
|
optionsRef.current = options;
|
|
41
82
|
targetRef.current = target;
|
|
42
83
|
const setMutationState = useCallback(
|
|
43
84
|
(value) => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return next;
|
|
48
|
-
});
|
|
85
|
+
const next = typeof value === "function" ? value(stateRef.current) : value;
|
|
86
|
+
stateRef.current = next;
|
|
87
|
+
setState(next);
|
|
49
88
|
},
|
|
50
89
|
[]
|
|
51
90
|
);
|
|
52
|
-
const
|
|
53
|
-
async (
|
|
91
|
+
const waitForReconnect = useCallback(
|
|
92
|
+
async (requestId) => {
|
|
93
|
+
while (!isNavigatorOnline()) {
|
|
94
|
+
if (requestId < lastResetIdRef.current) return;
|
|
95
|
+
setMutationState((current) => ({ ...current, pausedCount: current.pausedCount + 1 }));
|
|
96
|
+
try {
|
|
97
|
+
await new Promise((resolve) => {
|
|
98
|
+
const wake = /* @__PURE__ */ __name(() => {
|
|
99
|
+
unsubscribe();
|
|
100
|
+
resetWakersRef.current.delete(wake);
|
|
101
|
+
resolve();
|
|
102
|
+
}, "wake");
|
|
103
|
+
const unsubscribe = subscribeOnline(wake);
|
|
104
|
+
resetWakersRef.current.add(wake);
|
|
105
|
+
});
|
|
106
|
+
} finally {
|
|
107
|
+
setMutationState((current) => ({
|
|
108
|
+
...current,
|
|
109
|
+
pausedCount: Math.max(0, current.pausedCount - 1)
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
[setMutationState]
|
|
115
|
+
);
|
|
116
|
+
const mutatePreparedAsync = useCallback(
|
|
117
|
+
async (prepare) => {
|
|
54
118
|
const requestId = ++requestIdRef.current;
|
|
55
119
|
const currentOptions = optionsRef.current;
|
|
56
120
|
const previousData = stateRef.current.data;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
121
|
+
let variables;
|
|
122
|
+
let preparationFailed = false;
|
|
123
|
+
let preparationError;
|
|
124
|
+
try {
|
|
125
|
+
variables = prepare();
|
|
126
|
+
} catch (error) {
|
|
127
|
+
preparationFailed = true;
|
|
128
|
+
preparationError = error;
|
|
129
|
+
}
|
|
130
|
+
const optimisticData = preparationFailed ? void 0 : currentOptions.optimistic?.({ variables, current: previousData });
|
|
61
131
|
const hasOptimisticData = optimisticData !== void 0;
|
|
62
|
-
setMutationState((current) =>
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
132
|
+
setMutationState((current) => {
|
|
133
|
+
if (requestId < lastResetIdRef.current) return current;
|
|
134
|
+
const pendingCount = current.pendingCount + 1;
|
|
135
|
+
if (requestId !== requestIdRef.current) return { ...current, pendingCount };
|
|
136
|
+
return {
|
|
137
|
+
pendingCount,
|
|
138
|
+
pausedCount: current.pausedCount,
|
|
139
|
+
status: "pending",
|
|
140
|
+
data: hasOptimisticData ? optimisticData : currentOptions.resetOnMutate === false ? current.data : null,
|
|
141
|
+
error: null,
|
|
142
|
+
variables
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
const mutationTarget = targetRef.current;
|
|
146
|
+
const isAPITarget = isAPIRouteRef(mutationTarget);
|
|
147
|
+
const sharedOptimistic = !preparationFailed && !isAPITarget ? currentOptions.request?.optimistic : void 0;
|
|
148
|
+
const sharedSnapshots = sharedOptimistic?.update?.length ? applyServerFnOptimisticUpdates(sharedOptimistic.update) : [];
|
|
69
149
|
try {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
150
|
+
if (preparationFailed) throw preparationError;
|
|
151
|
+
let data;
|
|
152
|
+
while (true) {
|
|
153
|
+
if (currentOptions.networkMode === "online") {
|
|
154
|
+
await waitForReconnect(requestId);
|
|
155
|
+
if (requestId < lastResetIdRef.current) {
|
|
156
|
+
throw new Error("Mutation reset while waiting for reconnection");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const rawResult = isAPITarget ? await mutationTarget(variables, currentOptions.request) : await invokeMutationWithRetry(
|
|
161
|
+
() => targetRef.current(variables),
|
|
162
|
+
currentOptions.request?.retry,
|
|
163
|
+
// A reset disowns this submission; stop scheduling retries then.
|
|
164
|
+
() => requestId >= lastResetIdRef.current
|
|
165
|
+
);
|
|
166
|
+
data = unwrapMutationResult(rawResult, isAPITarget);
|
|
167
|
+
break;
|
|
168
|
+
} catch (cause) {
|
|
169
|
+
if (currentOptions.networkMode === "online" && !isNavigatorOnline() && requestId >= lastResetIdRef.current) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
throw cause;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
settleServerFnOptimisticUpdates(sharedSnapshots, "commit");
|
|
176
|
+
if (!isAPITarget && currentOptions.request?.invalidate) {
|
|
177
|
+
for (const key of resolveServerFnInvalidateTargets(currentOptions.request.invalidate)) {
|
|
178
|
+
notifyFarmCacheInvalidation(key);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
73
181
|
const isLatestRequest = requestId === requestIdRef.current;
|
|
74
182
|
setMutationState((current) => {
|
|
183
|
+
if (requestId < lastResetIdRef.current) return current;
|
|
75
184
|
const pendingCount = Math.max(0, current.pendingCount - 1);
|
|
76
185
|
if (!isLatestRequest) {
|
|
77
186
|
return {
|
|
78
187
|
...current,
|
|
79
|
-
pendingCount
|
|
80
|
-
status: pendingCount > 0 ? "pending" : current.status
|
|
188
|
+
pendingCount
|
|
81
189
|
};
|
|
82
190
|
}
|
|
83
191
|
return {
|
|
84
192
|
pendingCount,
|
|
193
|
+
pausedCount: current.pausedCount,
|
|
85
194
|
status: "success",
|
|
86
195
|
data,
|
|
87
196
|
error: null,
|
|
@@ -89,24 +198,35 @@ function useMutation(target, options = {}) {
|
|
|
89
198
|
};
|
|
90
199
|
});
|
|
91
200
|
if (isLatestRequest) {
|
|
92
|
-
currentOptions.onSuccess
|
|
93
|
-
|
|
201
|
+
notifyClientObserver(currentOptions.onSuccess, [data, variables], "Mutation onSuccess");
|
|
202
|
+
if (requestId === requestIdRef.current) {
|
|
203
|
+
notifyClientObserver(
|
|
204
|
+
currentOptions.onSettled,
|
|
205
|
+
[data, null, variables],
|
|
206
|
+
"Mutation onSettled"
|
|
207
|
+
);
|
|
208
|
+
}
|
|
94
209
|
}
|
|
95
210
|
return data;
|
|
96
211
|
} catch (cause) {
|
|
212
|
+
settleServerFnOptimisticUpdates(
|
|
213
|
+
sharedSnapshots,
|
|
214
|
+
sharedOptimistic?.rollbackOnError ? "rollback" : "invalidate"
|
|
215
|
+
);
|
|
97
216
|
const error = normalizeMutationError(cause);
|
|
98
217
|
const isLatestRequest = requestId === requestIdRef.current;
|
|
99
218
|
setMutationState((current) => {
|
|
219
|
+
if (requestId < lastResetIdRef.current) return current;
|
|
100
220
|
const pendingCount = Math.max(0, current.pendingCount - 1);
|
|
101
221
|
if (!isLatestRequest) {
|
|
102
222
|
return {
|
|
103
223
|
...current,
|
|
104
|
-
pendingCount
|
|
105
|
-
status: pendingCount > 0 ? "pending" : current.status
|
|
224
|
+
pendingCount
|
|
106
225
|
};
|
|
107
226
|
}
|
|
108
227
|
return {
|
|
109
228
|
pendingCount,
|
|
229
|
+
pausedCount: current.pausedCount,
|
|
110
230
|
status: "error",
|
|
111
231
|
data: hasOptimisticData && currentOptions.rollbackOnError ? previousData : currentOptions.resetOnMutate === false ? current.data : null,
|
|
112
232
|
error,
|
|
@@ -114,13 +234,23 @@ function useMutation(target, options = {}) {
|
|
|
114
234
|
};
|
|
115
235
|
});
|
|
116
236
|
if (isLatestRequest) {
|
|
117
|
-
currentOptions.onError
|
|
118
|
-
|
|
237
|
+
notifyClientObserver(currentOptions.onError, [error, variables], "Mutation onError");
|
|
238
|
+
if (requestId === requestIdRef.current) {
|
|
239
|
+
notifyClientObserver(
|
|
240
|
+
currentOptions.onSettled,
|
|
241
|
+
[null, error, variables],
|
|
242
|
+
"Mutation onSettled"
|
|
243
|
+
);
|
|
244
|
+
}
|
|
119
245
|
}
|
|
120
246
|
throw error;
|
|
121
247
|
}
|
|
122
248
|
},
|
|
123
|
-
[setMutationState]
|
|
249
|
+
[setMutationState, waitForReconnect]
|
|
250
|
+
);
|
|
251
|
+
const mutateAsync = useCallback(
|
|
252
|
+
(variables) => mutatePreparedAsync(() => variables),
|
|
253
|
+
[mutatePreparedAsync]
|
|
124
254
|
);
|
|
125
255
|
const mutate = useCallback(
|
|
126
256
|
(variables) => {
|
|
@@ -130,18 +260,23 @@ function useMutation(target, options = {}) {
|
|
|
130
260
|
[mutateAsync]
|
|
131
261
|
);
|
|
132
262
|
const reset = useCallback(() => {
|
|
133
|
-
|
|
263
|
+
lastResetIdRef.current = ++requestIdRef.current;
|
|
134
264
|
setMutationState({
|
|
135
265
|
pendingCount: 0,
|
|
266
|
+
pausedCount: 0,
|
|
136
267
|
status: "idle",
|
|
137
268
|
data: optionsRef.current.initialData ?? null,
|
|
138
269
|
error: null,
|
|
139
270
|
variables: void 0
|
|
140
271
|
});
|
|
272
|
+
const wakers = Array.from(resetWakersRef.current);
|
|
273
|
+
resetWakersRef.current.clear();
|
|
274
|
+
for (const wake of wakers) wake();
|
|
141
275
|
}, [setMutationState]);
|
|
142
|
-
|
|
276
|
+
const mutation = useMemo(
|
|
143
277
|
() => ({
|
|
144
278
|
pending: state.pendingCount > 0,
|
|
279
|
+
paused: state.pausedCount > 0,
|
|
145
280
|
status: state.status,
|
|
146
281
|
data: state.data,
|
|
147
282
|
error: state.error,
|
|
@@ -156,13 +291,15 @@ function useMutation(target, options = {}) {
|
|
|
156
291
|
reset,
|
|
157
292
|
state.data,
|
|
158
293
|
state.error,
|
|
294
|
+
state.pausedCount,
|
|
159
295
|
state.pendingCount,
|
|
160
296
|
state.status,
|
|
161
297
|
state.variables
|
|
162
298
|
]
|
|
163
299
|
);
|
|
300
|
+
return { mutation, mutatePreparedAsync };
|
|
164
301
|
}
|
|
165
|
-
__name(
|
|
302
|
+
__name(useMutationLifecycle, "useMutationLifecycle");
|
|
166
303
|
function unwrapMutationResult(result, apiRoute) {
|
|
167
304
|
if (!apiRoute) return result;
|
|
168
305
|
const apiResult = result;
|
|
@@ -188,13 +325,27 @@ import {
|
|
|
188
325
|
useRef as useRef2,
|
|
189
326
|
useState as useState2
|
|
190
327
|
} from "react";
|
|
328
|
+
var _FetcherInputError = class _FetcherInputError extends Error {
|
|
329
|
+
constructor(cause) {
|
|
330
|
+
super(
|
|
331
|
+
cause instanceof Error ? cause.message : typeof cause === "string" ? cause : "Could not prepare form input"
|
|
332
|
+
);
|
|
333
|
+
this.name = "FetcherInputError";
|
|
334
|
+
this.code = "input_error";
|
|
335
|
+
this.status = 0;
|
|
336
|
+
this.data = void 0;
|
|
337
|
+
this.cause = cause;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
__name(_FetcherInputError, "FetcherInputError");
|
|
341
|
+
var FetcherInputError = _FetcherInputError;
|
|
191
342
|
var formDataContexts = /* @__PURE__ */ new WeakMap();
|
|
192
343
|
function useFetcher(target, options = {}) {
|
|
193
344
|
const targetRef = useRef2(target);
|
|
194
345
|
const optionsRef = useRef2(options);
|
|
195
346
|
const submissionIdRef = useRef2(0);
|
|
196
347
|
const [formData, setFormData] = useState2(null);
|
|
197
|
-
const mutation =
|
|
348
|
+
const { mutation, mutatePreparedAsync } = useMutationLifecycle(target, options);
|
|
198
349
|
targetRef.current = target;
|
|
199
350
|
optionsRef.current = options;
|
|
200
351
|
const submitAsync = useCallback2(
|
|
@@ -203,15 +354,20 @@ function useFetcher(target, options = {}) {
|
|
|
203
354
|
const submittedFormData = isFormData(input) ? input : null;
|
|
204
355
|
setFormData(submittedFormData);
|
|
205
356
|
try {
|
|
206
|
-
|
|
207
|
-
|
|
357
|
+
return await mutatePreparedAsync(() => {
|
|
358
|
+
try {
|
|
359
|
+
return submittedFormData ? mapFetcherFormData(targetRef.current, submittedFormData, optionsRef.current) : input;
|
|
360
|
+
} catch (error) {
|
|
361
|
+
throw new FetcherInputError(error);
|
|
362
|
+
}
|
|
363
|
+
});
|
|
208
364
|
} finally {
|
|
209
365
|
if (submissionId === submissionIdRef.current) {
|
|
210
366
|
setFormData(null);
|
|
211
367
|
}
|
|
212
368
|
}
|
|
213
369
|
},
|
|
214
|
-
[
|
|
370
|
+
[mutatePreparedAsync]
|
|
215
371
|
);
|
|
216
372
|
const submit = useCallback2(
|
|
217
373
|
(input) => {
|
|
@@ -261,6 +417,7 @@ function useFetcher(target, options = {}) {
|
|
|
261
417
|
state: mutation.pending ? "submitting" : "idle",
|
|
262
418
|
status: mutation.status,
|
|
263
419
|
pending: mutation.pending,
|
|
420
|
+
paused: mutation.paused,
|
|
264
421
|
data: mutation.data,
|
|
265
422
|
error: mutation.error,
|
|
266
423
|
variables: mutation.variables,
|
|
@@ -275,6 +432,7 @@ function useFetcher(target, options = {}) {
|
|
|
275
432
|
formData,
|
|
276
433
|
mutation.data,
|
|
277
434
|
mutation.error,
|
|
435
|
+
mutation.paused,
|
|
278
436
|
mutation.pending,
|
|
279
437
|
mutation.status,
|
|
280
438
|
mutation.variables,
|
|
@@ -293,9 +451,18 @@ function mapFetcherFormData(target, formData, options) {
|
|
|
293
451
|
if (!isAPIRouteRef(target)) {
|
|
294
452
|
return formData;
|
|
295
453
|
}
|
|
296
|
-
const values = formDataToObject(formData);
|
|
297
454
|
const method = getAPIRouteRefMetadata(target)?.method;
|
|
298
|
-
|
|
455
|
+
const query = method === "GET" || method === "HEAD";
|
|
456
|
+
const encoding = context.submitter?.getAttribute("formenctype") ?? context.form?.enctype;
|
|
457
|
+
if (!query && (encoding?.toLowerCase() === "multipart/form-data" || Array.from(formData.values()).some((value) => typeof value !== "string"))) {
|
|
458
|
+
const body = new FormData();
|
|
459
|
+
for (const [key, value] of formData) {
|
|
460
|
+
if (!isUnsafeFormKey(key)) body.append(key, value);
|
|
461
|
+
}
|
|
462
|
+
return { body };
|
|
463
|
+
}
|
|
464
|
+
const values = formDataToObject(formData);
|
|
465
|
+
return query ? { query: values } : { body: values };
|
|
299
466
|
}
|
|
300
467
|
__name(mapFetcherFormData, "mapFetcherFormData");
|
|
301
468
|
function resolveFetcherFormAction(target, metadata) {
|
|
@@ -307,7 +474,7 @@ __name(resolveFetcherFormAction, "resolveFetcherFormAction");
|
|
|
307
474
|
function formDataToObject(formData) {
|
|
308
475
|
const output = /* @__PURE__ */ Object.create(null);
|
|
309
476
|
for (const [key, value] of formData.entries()) {
|
|
310
|
-
if (key
|
|
477
|
+
if (isUnsafeFormKey(key)) continue;
|
|
311
478
|
const current = output[key];
|
|
312
479
|
if (current === void 0) {
|
|
313
480
|
output[key] = value;
|
|
@@ -320,6 +487,10 @@ function formDataToObject(formData) {
|
|
|
320
487
|
return output;
|
|
321
488
|
}
|
|
322
489
|
__name(formDataToObject, "formDataToObject");
|
|
490
|
+
function isUnsafeFormKey(key) {
|
|
491
|
+
return key === "__proto__" || key === "constructor" || key === "prototype";
|
|
492
|
+
}
|
|
493
|
+
__name(isUnsafeFormKey, "isUnsafeFormKey");
|
|
323
494
|
function createSubmitterFormData(form, submitter) {
|
|
324
495
|
try {
|
|
325
496
|
return new FormData(form, submitter);
|
|
@@ -349,6 +520,296 @@ function isFormData(value) {
|
|
|
349
520
|
}
|
|
350
521
|
__name(isFormData, "isFormData");
|
|
351
522
|
|
|
523
|
+
// src/cache-invalidation-broadcast.ts
|
|
524
|
+
var FARM_CACHE_INVALIDATION_CHANNEL = "farm:cache-invalidation";
|
|
525
|
+
var activeBridge;
|
|
526
|
+
function enableCrossTabCacheInvalidation(options = {}) {
|
|
527
|
+
if (typeof BroadcastChannel !== "function") return () => {
|
|
528
|
+
};
|
|
529
|
+
const channelName = options.channelName ?? FARM_CACHE_INVALIDATION_CHANNEL;
|
|
530
|
+
if (activeBridge) {
|
|
531
|
+
if (activeBridge.channelName !== channelName) {
|
|
532
|
+
throw new Error(
|
|
533
|
+
`Cross-tab cache invalidation is already enabled on channel "${activeBridge.channelName}".`
|
|
534
|
+
);
|
|
535
|
+
}
|
|
536
|
+
activeBridge.refCount += 1;
|
|
537
|
+
} else {
|
|
538
|
+
activeBridge = createBridge(channelName);
|
|
539
|
+
}
|
|
540
|
+
let disposed = false;
|
|
541
|
+
return () => {
|
|
542
|
+
if (disposed || !activeBridge) return;
|
|
543
|
+
disposed = true;
|
|
544
|
+
activeBridge.refCount -= 1;
|
|
545
|
+
if (activeBridge.refCount === 0) {
|
|
546
|
+
activeBridge.teardown();
|
|
547
|
+
activeBridge = void 0;
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
__name(enableCrossTabCacheInvalidation, "enableCrossTabCacheInvalidation");
|
|
552
|
+
function createBridge(channelName) {
|
|
553
|
+
const channel = new BroadcastChannel(channelName);
|
|
554
|
+
let applyingRemote = false;
|
|
555
|
+
let pending = [];
|
|
556
|
+
let flushScheduled = false;
|
|
557
|
+
let closed = false;
|
|
558
|
+
const flush = /* @__PURE__ */ __name(() => {
|
|
559
|
+
flushScheduled = false;
|
|
560
|
+
if (closed || pending.length === 0) return;
|
|
561
|
+
const encoded = encodeFarmCacheInvalidations(pending);
|
|
562
|
+
pending = [];
|
|
563
|
+
if (encoded !== null) channel.postMessage(encoded);
|
|
564
|
+
}, "flush");
|
|
565
|
+
const unsubscribe = subscribeFarmCacheInvalidation((key) => {
|
|
566
|
+
if (applyingRemote || closed) return;
|
|
567
|
+
pending.push(key);
|
|
568
|
+
if (!flushScheduled) {
|
|
569
|
+
flushScheduled = true;
|
|
570
|
+
queueMicrotask(flush);
|
|
571
|
+
}
|
|
572
|
+
});
|
|
573
|
+
channel.onmessage = (event) => {
|
|
574
|
+
const keys = decodeFarmCacheInvalidations(
|
|
575
|
+
typeof event.data === "string" ? event.data : void 0
|
|
576
|
+
);
|
|
577
|
+
if (keys.length === 0) return;
|
|
578
|
+
applyingRemote = true;
|
|
579
|
+
try {
|
|
580
|
+
for (const key of keys) notifyFarmCacheInvalidation(key);
|
|
581
|
+
} finally {
|
|
582
|
+
applyingRemote = false;
|
|
583
|
+
}
|
|
584
|
+
};
|
|
585
|
+
return {
|
|
586
|
+
channelName,
|
|
587
|
+
refCount: 1,
|
|
588
|
+
teardown() {
|
|
589
|
+
closed = true;
|
|
590
|
+
pending = [];
|
|
591
|
+
unsubscribe();
|
|
592
|
+
channel.onmessage = null;
|
|
593
|
+
channel.close();
|
|
594
|
+
}
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
__name(createBridge, "createBridge");
|
|
598
|
+
|
|
599
|
+
// src/client-cache-persistence.ts
|
|
600
|
+
var FARM_CLIENT_CACHE_PERSIST_VERSION = "1";
|
|
601
|
+
function defineClientCacheAdapter(adapter) {
|
|
602
|
+
for (const method of ["keys", "get", "set", "delete", "clear"]) {
|
|
603
|
+
if (typeof adapter?.[method] !== "function") {
|
|
604
|
+
throw new TypeError(
|
|
605
|
+
`defineClientCacheAdapter expects a "${method}" method. Implement keys/get/set/delete/clear over your storage.`
|
|
606
|
+
);
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
return adapter;
|
|
610
|
+
}
|
|
611
|
+
__name(defineClientCacheAdapter, "defineClientCacheAdapter");
|
|
612
|
+
function storageClientCacheAdapter(storage, options = {}) {
|
|
613
|
+
if (!storage || typeof storage.getItem !== "function" || typeof storage.setItem !== "function" || typeof storage.removeItem !== "function") {
|
|
614
|
+
throw new TypeError("storageClientCacheAdapter expects a compatible key-value client.");
|
|
615
|
+
}
|
|
616
|
+
const base = options.base ?? "farm-client-cache";
|
|
617
|
+
const entryKey = /* @__PURE__ */ __name((key) => `${base}:${key}`, "entryKey");
|
|
618
|
+
const enumerate = storage.getKeys?.bind(storage) ?? storage.keys?.bind(storage);
|
|
619
|
+
return {
|
|
620
|
+
async keys() {
|
|
621
|
+
if (!enumerate) return [];
|
|
622
|
+
const keys = await enumerate(base);
|
|
623
|
+
const prefix = `${base}:`;
|
|
624
|
+
return keys.filter((key) => key.startsWith(prefix)).map((key) => key.slice(prefix.length));
|
|
625
|
+
},
|
|
626
|
+
async get(key) {
|
|
627
|
+
return await storage.getItem(entryKey(key)) ?? null;
|
|
628
|
+
},
|
|
629
|
+
async set(key, entry) {
|
|
630
|
+
await storage.setItem(entryKey(key), entry);
|
|
631
|
+
},
|
|
632
|
+
async delete(key) {
|
|
633
|
+
await storage.removeItem(entryKey(key));
|
|
634
|
+
},
|
|
635
|
+
async clear() {
|
|
636
|
+
if (storage.clear) {
|
|
637
|
+
await storage.clear(base);
|
|
638
|
+
return;
|
|
639
|
+
}
|
|
640
|
+
if (!enumerate) return;
|
|
641
|
+
const prefix = `${base}:`;
|
|
642
|
+
for (const key of await enumerate(base)) {
|
|
643
|
+
if (key.startsWith(prefix)) await storage.removeItem(key);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
__name(storageClientCacheAdapter, "storageClientCacheAdapter");
|
|
649
|
+
var activeEngine;
|
|
650
|
+
function reportPersistenceFailure(error) {
|
|
651
|
+
const report = typeof reportError === "function" ? reportError : console.error;
|
|
652
|
+
if (error instanceof Error) {
|
|
653
|
+
report(error);
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
const normalized = new Error("Client cache persistence failed");
|
|
657
|
+
normalized.cause = error;
|
|
658
|
+
report(normalized);
|
|
659
|
+
}
|
|
660
|
+
__name(reportPersistenceFailure, "reportPersistenceFailure");
|
|
661
|
+
function disableEngine(engine, error) {
|
|
662
|
+
if (engine.disabled) return;
|
|
663
|
+
engine.disabled = true;
|
|
664
|
+
engine.pendingSets.clear();
|
|
665
|
+
engine.pendingDeletes.clear();
|
|
666
|
+
if (engine.flushTimer !== void 0) {
|
|
667
|
+
clearTimeout(engine.flushTimer);
|
|
668
|
+
engine.flushTimer = void 0;
|
|
669
|
+
}
|
|
670
|
+
reportPersistenceFailure(error);
|
|
671
|
+
}
|
|
672
|
+
__name(disableEngine, "disableEngine");
|
|
673
|
+
function scheduleFlush(engine) {
|
|
674
|
+
if (engine.disabled || engine.flushTimer !== void 0) return;
|
|
675
|
+
const timer = setTimeout(() => {
|
|
676
|
+
engine.flushTimer = void 0;
|
|
677
|
+
void flushEngine(engine);
|
|
678
|
+
}, engine.flushDelayMs);
|
|
679
|
+
timer.unref?.();
|
|
680
|
+
engine.flushTimer = timer;
|
|
681
|
+
}
|
|
682
|
+
__name(scheduleFlush, "scheduleFlush");
|
|
683
|
+
async function flushEngine(engine) {
|
|
684
|
+
if (engine.disabled) return;
|
|
685
|
+
const sets = Array.from(engine.pendingSets.entries());
|
|
686
|
+
const deletes = Array.from(engine.pendingDeletes);
|
|
687
|
+
engine.pendingSets.clear();
|
|
688
|
+
engine.pendingDeletes.clear();
|
|
689
|
+
try {
|
|
690
|
+
if (sets.length > 0) {
|
|
691
|
+
if (engine.adapter.setMany) await engine.adapter.setMany(sets);
|
|
692
|
+
else for (const [key, entry] of sets) await engine.adapter.set(key, entry);
|
|
693
|
+
}
|
|
694
|
+
for (const key of deletes) await engine.adapter.delete(key);
|
|
695
|
+
} catch (error) {
|
|
696
|
+
disableEngine(engine, error);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
__name(flushEngine, "flushEngine");
|
|
700
|
+
async function hydrateEngine(engine) {
|
|
701
|
+
const now = Date.now();
|
|
702
|
+
const keys = await engine.adapter.keys();
|
|
703
|
+
if (keys.length === 0) return;
|
|
704
|
+
const persisted = engine.adapter.getMany ? await engine.adapter.getMany(keys) : await Promise.all(keys.map((key) => engine.adapter.get(key)));
|
|
705
|
+
engine.hydrating = true;
|
|
706
|
+
try {
|
|
707
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
708
|
+
const key = keys[index];
|
|
709
|
+
const entry = persisted[index];
|
|
710
|
+
if (engine.disabled) return;
|
|
711
|
+
if (!entry || entry.version !== engine.version || entry.gcAt !== void 0 && now >= entry.gcAt) {
|
|
712
|
+
engine.pendingDeletes.add(key);
|
|
713
|
+
continue;
|
|
714
|
+
}
|
|
715
|
+
if (engine.cache.get(key, now)) continue;
|
|
716
|
+
engine.cache.set(key, {
|
|
717
|
+
data: entry.data,
|
|
718
|
+
updatedAt: entry.updatedAt,
|
|
719
|
+
staleAt: 0,
|
|
720
|
+
gcAt: entry.gcAt,
|
|
721
|
+
status: "success",
|
|
722
|
+
error: null,
|
|
723
|
+
persist: true
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
} finally {
|
|
727
|
+
engine.hydrating = false;
|
|
728
|
+
}
|
|
729
|
+
if (engine.pendingDeletes.size > 0) scheduleFlush(engine);
|
|
730
|
+
}
|
|
731
|
+
__name(hydrateEngine, "hydrateEngine");
|
|
732
|
+
function createSink(engine) {
|
|
733
|
+
return {
|
|
734
|
+
onSet(key, entry) {
|
|
735
|
+
if (engine.disabled || engine.hydrating) return;
|
|
736
|
+
if (!entry.persist || entry.fetching || entry.error || entry.status === "pending") return;
|
|
737
|
+
if (engine.persistKey && !engine.persistKey(key)) return;
|
|
738
|
+
engine.pendingDeletes.delete(key);
|
|
739
|
+
engine.pendingSets.set(key, {
|
|
740
|
+
data: entry.data,
|
|
741
|
+
updatedAt: entry.updatedAt,
|
|
742
|
+
staleAt: entry.staleAt,
|
|
743
|
+
gcAt: entry.gcAt,
|
|
744
|
+
version: engine.version
|
|
745
|
+
});
|
|
746
|
+
scheduleFlush(engine);
|
|
747
|
+
},
|
|
748
|
+
onDelete(key) {
|
|
749
|
+
if (engine.disabled) return;
|
|
750
|
+
engine.pendingSets.delete(key);
|
|
751
|
+
engine.pendingDeletes.add(key);
|
|
752
|
+
scheduleFlush(engine);
|
|
753
|
+
},
|
|
754
|
+
onClear() {
|
|
755
|
+
if (engine.disabled) return;
|
|
756
|
+
engine.pendingSets.clear();
|
|
757
|
+
engine.pendingDeletes.clear();
|
|
758
|
+
void engine.adapter.clear().catch((error) => disableEngine(engine, error));
|
|
759
|
+
}
|
|
760
|
+
};
|
|
761
|
+
}
|
|
762
|
+
__name(createSink, "createSink");
|
|
763
|
+
function initPersistedClientCache(adapter, options = {}) {
|
|
764
|
+
defineClientCacheAdapter(adapter);
|
|
765
|
+
disposePersistedClientCache();
|
|
766
|
+
const engine = {
|
|
767
|
+
adapter,
|
|
768
|
+
cache: getFarmClientDataCache(),
|
|
769
|
+
version: options.version ? `${FARM_CLIENT_CACHE_PERSIST_VERSION}:${options.version}` : FARM_CLIENT_CACHE_PERSIST_VERSION,
|
|
770
|
+
persistKey: options.persistKey,
|
|
771
|
+
flushDelayMs: options.flushDelayMs ?? 300,
|
|
772
|
+
pendingSets: /* @__PURE__ */ new Map(),
|
|
773
|
+
pendingDeletes: /* @__PURE__ */ new Set(),
|
|
774
|
+
flushTimer: void 0,
|
|
775
|
+
hydrating: false,
|
|
776
|
+
disabled: false
|
|
777
|
+
};
|
|
778
|
+
activeEngine = engine;
|
|
779
|
+
engine.cache.attachPersistence(createSink(engine));
|
|
780
|
+
void hydrateEngine(engine).catch((error) => disableEngine(engine, error));
|
|
781
|
+
return () => {
|
|
782
|
+
if (activeEngine !== engine) return;
|
|
783
|
+
disposePersistedClientCache();
|
|
784
|
+
};
|
|
785
|
+
}
|
|
786
|
+
__name(initPersistedClientCache, "initPersistedClientCache");
|
|
787
|
+
function disposePersistedClientCache() {
|
|
788
|
+
const engine = activeEngine;
|
|
789
|
+
if (!engine) return;
|
|
790
|
+
activeEngine = void 0;
|
|
791
|
+
engine.cache.attachPersistence(void 0);
|
|
792
|
+
if (engine.flushTimer !== void 0) {
|
|
793
|
+
clearTimeout(engine.flushTimer);
|
|
794
|
+
engine.flushTimer = void 0;
|
|
795
|
+
}
|
|
796
|
+
engine.pendingSets.clear();
|
|
797
|
+
engine.pendingDeletes.clear();
|
|
798
|
+
}
|
|
799
|
+
__name(disposePersistedClientCache, "disposePersistedClientCache");
|
|
800
|
+
async function clearPersistedCache() {
|
|
801
|
+
const engine = activeEngine;
|
|
802
|
+
if (!engine) return;
|
|
803
|
+
engine.pendingSets.clear();
|
|
804
|
+
engine.pendingDeletes.clear();
|
|
805
|
+
try {
|
|
806
|
+
await engine.adapter.clear();
|
|
807
|
+
} catch (error) {
|
|
808
|
+
disableEngine(engine, error);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
__name(clearPersistedCache, "clearPersistedCache");
|
|
812
|
+
|
|
352
813
|
// src/store.ts
|
|
353
814
|
import { useSyncExternalStore } from "react";
|
|
354
815
|
var RESERVED_STORE_KEYS = /* @__PURE__ */ new Set([
|
|
@@ -371,11 +832,14 @@ function pickState(state, keys) {
|
|
|
371
832
|
return slice;
|
|
372
833
|
}
|
|
373
834
|
__name(pickState, "pickState");
|
|
835
|
+
function getEnumerableKeys(state) {
|
|
836
|
+
return Reflect.ownKeys(state).filter(
|
|
837
|
+
(key) => Object.prototype.propertyIsEnumerable.call(state, key)
|
|
838
|
+
);
|
|
839
|
+
}
|
|
840
|
+
__name(getEnumerableKeys, "getEnumerableKeys");
|
|
374
841
|
function getChangedKeys(state, previousState) {
|
|
375
|
-
const keys = /* @__PURE__ */ new Set([
|
|
376
|
-
...Object.keys(state),
|
|
377
|
-
...Object.keys(previousState)
|
|
378
|
-
]);
|
|
842
|
+
const keys = /* @__PURE__ */ new Set([...getEnumerableKeys(state), ...getEnumerableKeys(previousState)]);
|
|
379
843
|
return [...keys].filter((key) => !Object.is(state[key], previousState[key]));
|
|
380
844
|
}
|
|
381
845
|
__name(getChangedKeys, "getChangedKeys");
|
|
@@ -396,7 +860,11 @@ function createStore(initialState, extend) {
|
|
|
396
860
|
let state = cloneState(initialState);
|
|
397
861
|
const subscriptions = /* @__PURE__ */ new Set();
|
|
398
862
|
const addSubscription = /* @__PURE__ */ __name((keys, notify) => {
|
|
399
|
-
const subscription = {
|
|
863
|
+
const subscription = {
|
|
864
|
+
// Object property enumeration returns numeric keys as strings.
|
|
865
|
+
keys: keys?.map((key) => typeof key === "number" ? String(key) : key) ?? null,
|
|
866
|
+
notify
|
|
867
|
+
};
|
|
400
868
|
subscriptions.add(subscription);
|
|
401
869
|
return () => {
|
|
402
870
|
subscriptions.delete(subscription);
|
|
@@ -488,7 +956,7 @@ function createStore(initialState, extend) {
|
|
|
488
956
|
getSnapshot
|
|
489
957
|
);
|
|
490
958
|
}
|
|
491
|
-
if (
|
|
959
|
+
if (isStoreKey(keyOrKeys)) {
|
|
492
960
|
return useSyncExternalStore(
|
|
493
961
|
(notify) => addSubscription([keyOrKeys], () => notify()),
|
|
494
962
|
() => state[keyOrKeys],
|
|
@@ -509,7 +977,7 @@ function createStore(initialState, extend) {
|
|
|
509
977
|
reset: /* @__PURE__ */ __name(() => replaceState2(cloneState(initialSnapshot)), "reset"),
|
|
510
978
|
subscribe: subscribeState
|
|
511
979
|
};
|
|
512
|
-
for (const key of
|
|
980
|
+
for (const key of getEnumerableKeys(initialSnapshot)) {
|
|
513
981
|
if (RESERVED_STORE_KEYS.has(key)) {
|
|
514
982
|
throw new Error(
|
|
515
983
|
`createStore does not allow the reserved key "${String(key)}" in the initial state.`
|
|
@@ -903,8 +1371,16 @@ __name(matchManifestRoute, "matchManifestRoute");
|
|
|
903
1371
|
export {
|
|
904
1372
|
FarmProvider,
|
|
905
1373
|
useMutation,
|
|
1374
|
+
FetcherInputError,
|
|
906
1375
|
useFetcher,
|
|
1376
|
+
FARM_CACHE_INVALIDATION_CHANNEL,
|
|
1377
|
+
enableCrossTabCacheInvalidation,
|
|
1378
|
+
FARM_CLIENT_CACHE_PERSIST_VERSION,
|
|
1379
|
+
defineClientCacheAdapter,
|
|
1380
|
+
storageClientCacheAdapter,
|
|
1381
|
+
initPersistedClientCache,
|
|
1382
|
+
clearPersistedCache,
|
|
907
1383
|
createStore,
|
|
908
1384
|
Link
|
|
909
1385
|
};
|
|
910
|
-
//# sourceMappingURL=chunk-
|
|
1386
|
+
//# sourceMappingURL=chunk-EPDIF432.mjs.map
|