@farm.js/core 0.1.0-beta.96 → 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 +6 -6
- 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 +4 -4
- package/dist/api.cjs +239 -70
- package/dist/api.d.mts +7 -6
- package/dist/api.d.ts +7 -6
- package/dist/api.mjs +17 -11
- 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-MM46HTX6.mjs → chunk-3TWQERDE.mjs} +4 -3
- package/dist/chunk-3TWQERDE.mjs.map +1 -0
- package/dist/{chunk-RWYRFCLG.mjs → chunk-4X57GXQA.mjs} +2 -2
- package/dist/{chunk-3I55IGXU.mjs → chunk-52BR7LTX.mjs} +14 -15
- package/dist/chunk-52BR7LTX.mjs.map +1 -0
- package/dist/{chunk-RAGSHKDC.mjs → chunk-6EJHNHH4.mjs} +38 -3
- 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-54XSGLKT.mjs → chunk-D7F7YZ7L.mjs} +93 -67
- package/dist/chunk-D7F7YZ7L.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-LZTGDH3H.mjs → chunk-EPDIF432.mjs} +424 -10
- package/dist/chunk-EPDIF432.mjs.map +1 -0
- package/dist/{chunk-GZHKWHCH.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-LKKMI7JG.mjs → chunk-IZBX2TEU.mjs} +153 -68
- package/dist/chunk-IZBX2TEU.mjs.map +1 -0
- package/dist/{chunk-74QPONAN.mjs → chunk-J3MPQ4MQ.mjs} +2 -2
- package/dist/{chunk-74QPONAN.mjs.map → chunk-J3MPQ4MQ.mjs.map} +1 -1
- package/dist/{chunk-ODJGAWDH.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-WMAYETRD.mjs → chunk-TT3E2JOF.mjs} +3 -3
- package/dist/{chunk-FVAM43KI.mjs → chunk-UMUWR5XA.mjs} +2 -2
- package/dist/{chunk-VOUJW4FL.mjs → chunk-WD2EBM3I.mjs} +70 -15
- package/dist/chunk-WD2EBM3I.mjs.map +1 -0
- package/dist/{chunk-ZPG6SNHH.mjs → chunk-WMJGA32P.mjs} +47 -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 +757 -104
- package/dist/client.d.mts +124 -16
- package/dist/client.d.ts +124 -16
- package/dist/client.mjs +28 -14
- 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-EOVDBPOI.mjs → devtools-client-Z7QQA3Q2.mjs} +2 -2
- 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 +1578 -772
- package/dist/index.d.mts +28 -20
- package/dist/index.d.ts +28 -20
- package/dist/index.mjs +53 -33
- 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 +710 -532
- package/dist/internal/build-runtime.d.mts +5 -4
- package/dist/internal/build-runtime.d.ts +5 -4
- package/dist/internal/build-runtime.mjs +15 -15
- 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 +474 -334
- package/dist/plugin.d.mts +3 -2
- package/dist/plugin.d.ts +3 -2
- package/dist/plugin.mjs +12 -12
- 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 +11 -3
- package/dist/query/client.mjs +12 -4
- 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 +140 -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 +34 -2
- package/dist/server-fn-client.d.mts +6 -0
- package/dist/server-fn-client.d.ts +6 -0
- package/dist/server-fn-client.mjs +1 -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 +146 -27
- 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 +499 -355
- package/dist/server.d.mts +11 -10
- package/dist/server.d.ts +11 -10
- package/dist/server.mjs +16 -16
- 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 +8 -8
- 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 +482 -338
- package/dist/vite.d.mts +3 -2
- package/dist/vite.d.ts +3 -2
- package/dist/vite.mjs +16 -12
- package/package.json +17 -17
- package/types/client.d.ts +87 -1
- 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-3I55IGXU.mjs.map +0 -1
- package/dist/chunk-54XSGLKT.mjs.map +0 -1
- package/dist/chunk-7MABZJIM.mjs.map +0 -1
- package/dist/chunk-AXVJCMVF.mjs.map +0 -1
- package/dist/chunk-GZHKWHCH.mjs.map +0 -1
- package/dist/chunk-HHZAOTQD.mjs.map +0 -1
- package/dist/chunk-LKKMI7JG.mjs.map +0 -1
- package/dist/chunk-LZTGDH3H.mjs.map +0 -1
- package/dist/chunk-MM46HTX6.mjs.map +0 -1
- package/dist/chunk-MRVJCLYQ.mjs.map +0 -1
- package/dist/chunk-Q7GPJZCO.mjs.map +0 -1
- package/dist/chunk-RAGSHKDC.mjs.map +0 -1
- package/dist/chunk-RBRLLZL5.mjs.map +0 -1
- package/dist/chunk-SCFX4UTD.mjs.map +0 -1
- package/dist/chunk-VOUJW4FL.mjs.map +0 -1
- package/dist/chunk-WB75GIX2.mjs.map +0 -1
- package/dist/chunk-ZFNK77WN.mjs.map +0 -1
- package/dist/chunk-ZPG6SNHH.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-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-ODJGAWDH.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-WMAYETRD.mjs.map → chunk-TT3E2JOF.mjs.map} +0 -0
- /package/dist/{chunk-FVAM43KI.mjs.map → chunk-UMUWR5XA.mjs.map} +0 -0
- /package/dist/{devtools-S52RRRMN.mjs.map → devtools-XWZX6CCL.mjs.map} +0 -0
- /package/dist/{devtools-client-EOVDBPOI.mjs.map → devtools-client-Z7QQA3Q2.mjs.map} +0 -0
package/dist/plugin.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { Z as PluginRoutes, P as PluginRoutesFactory, W as RouteDefinition } from './route-
|
|
2
|
-
export {
|
|
1
|
+
export { Z as PluginRoutes, P as PluginRoutesFactory, W as RouteDefinition } from './route-CvEr4Uc9.mjs';
|
|
2
|
+
export { bq as APIHandlerLifecyclePayload, bm as APIRouteDiscoveredPayload, bt as BundleLifecyclePayload, B as BundleResultPayload, br as ErrorLifecyclePayload, e4 as FARM_NODE_RESPONSE_END_PENDING, a as FarmPlugin, bg as FarmPluginBuildHooks, bi as FarmPluginClientConfig, aV as FarmPluginContext, bh as FarmPluginDevHooks, bd as FarmPluginDiscoveredRoute, aW as FarmPluginIntegrationContext, aX as FarmPluginLifecycle, bf as FarmPluginRenderHooks, a$ as FarmPluginRouteRuntimePayload, be as FarmPluginRouterHooks, b5 as FarmPluginRuntimeAfterEvent, b2 as FarmPluginRuntimeBaseEvent, b4 as FarmPluginRuntimeBeforeEvent, b8 as FarmPluginRuntimeCloseEvent, b3 as FarmPluginRuntimeContextEvent, b6 as FarmPluginRuntimeErrorEvent, b9 as FarmPluginRuntimeHooks, a_ as FarmPluginRuntimeKind, bb as FarmPluginRuntimeRequestHandler, ba as FarmPluginRuntimeRequestOptions, bc as FarmPluginRuntimeSession, b7 as FarmPluginRuntimeStartEvent, b0 as FarmPluginSetupContext, b1 as FarmPluginStateContext, aY as FarmRequestPluginContext, aZ as FarmRequestStore, au as FarmRuntimeShutdownError, bs as HMRUpdatePayload, bl as MiddlewareDiscoveredPayload, bu as NitroBuildLifecyclePayload, av as PluginManager, aU as PluginRequestContext, bp as RenderLifecyclePayload, bj as RouteDiscoveredPayload, bn as RouteMatchPayload, bo as RouteMatchResultPayload, bk as RoutesGeneratedPayload, bv as ShutdownPayload, at as definePlugin, s as farmPlugin } from './client-plugins-B6-07YmP.mjs';
|
|
3
3
|
import 'vite';
|
|
4
4
|
import './lifecycle-De0vQG45.mjs';
|
|
5
5
|
import './env.mjs';
|
|
@@ -10,6 +10,7 @@ import './types-Cc8l9IqS.mjs';
|
|
|
10
10
|
import 'db0';
|
|
11
11
|
import 'unstorage';
|
|
12
12
|
import 'react';
|
|
13
|
+
import './integration-api-BT024nuJ.mjs';
|
|
13
14
|
import '@farming-labs/orm';
|
|
14
15
|
import './types-CKwggz9n.mjs';
|
|
15
16
|
import '@farming-labs/docs';
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { Z as PluginRoutes, P as PluginRoutesFactory, W as RouteDefinition } from './route-
|
|
2
|
-
export {
|
|
1
|
+
export { Z as PluginRoutes, P as PluginRoutesFactory, W as RouteDefinition } from './route-4pd-EVtw.js';
|
|
2
|
+
export { bq as APIHandlerLifecyclePayload, bm as APIRouteDiscoveredPayload, bt as BundleLifecyclePayload, B as BundleResultPayload, br as ErrorLifecyclePayload, e4 as FARM_NODE_RESPONSE_END_PENDING, a as FarmPlugin, bg as FarmPluginBuildHooks, bi as FarmPluginClientConfig, aV as FarmPluginContext, bh as FarmPluginDevHooks, bd as FarmPluginDiscoveredRoute, aW as FarmPluginIntegrationContext, aX as FarmPluginLifecycle, bf as FarmPluginRenderHooks, a$ as FarmPluginRouteRuntimePayload, be as FarmPluginRouterHooks, b5 as FarmPluginRuntimeAfterEvent, b2 as FarmPluginRuntimeBaseEvent, b4 as FarmPluginRuntimeBeforeEvent, b8 as FarmPluginRuntimeCloseEvent, b3 as FarmPluginRuntimeContextEvent, b6 as FarmPluginRuntimeErrorEvent, b9 as FarmPluginRuntimeHooks, a_ as FarmPluginRuntimeKind, bb as FarmPluginRuntimeRequestHandler, ba as FarmPluginRuntimeRequestOptions, bc as FarmPluginRuntimeSession, b7 as FarmPluginRuntimeStartEvent, b0 as FarmPluginSetupContext, b1 as FarmPluginStateContext, aY as FarmRequestPluginContext, aZ as FarmRequestStore, au as FarmRuntimeShutdownError, bs as HMRUpdatePayload, bl as MiddlewareDiscoveredPayload, bu as NitroBuildLifecyclePayload, av as PluginManager, aU as PluginRequestContext, bp as RenderLifecyclePayload, bj as RouteDiscoveredPayload, bn as RouteMatchPayload, bo as RouteMatchResultPayload, bk as RoutesGeneratedPayload, bv as ShutdownPayload, at as definePlugin, s as farmPlugin } from './client-plugins-By6MVUX-.js';
|
|
3
3
|
import 'vite';
|
|
4
4
|
import './lifecycle-De0vQG45.js';
|
|
5
5
|
import './env.js';
|
|
@@ -10,6 +10,7 @@ import './types-Cc8l9IqS.js';
|
|
|
10
10
|
import 'db0';
|
|
11
11
|
import 'unstorage';
|
|
12
12
|
import 'react';
|
|
13
|
+
import './integration-api-BT024nuJ.js';
|
|
13
14
|
import '@farming-labs/orm';
|
|
14
15
|
import './types-CKwggz9n.js';
|
|
15
16
|
import '@farming-labs/docs';
|
package/dist/plugin.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
PluginManager,
|
|
5
5
|
definePlugin,
|
|
6
6
|
farmPlugin
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-FP5Q67FO.mjs";
|
|
8
8
|
import "./chunk-YVPFZ2TK.mjs";
|
|
9
9
|
import "./chunk-KDP5ZSWP.mjs";
|
|
10
10
|
import "./chunk-WQDQCTC5.mjs";
|
|
@@ -16,7 +16,7 @@ import "./chunk-USWZZUEH.mjs";
|
|
|
16
16
|
import "./chunk-USLFXFFH.mjs";
|
|
17
17
|
import "./chunk-CG4GPK3Z.mjs";
|
|
18
18
|
import "./chunk-YKAUAZA4.mjs";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-7PYVLJ4J.mjs";
|
|
20
20
|
import "./chunk-7T2QYWDH.mjs";
|
|
21
21
|
import "./chunk-5EZRXIFH.mjs";
|
|
22
22
|
import "./chunk-7ZVN3YZI.mjs";
|
|
@@ -27,19 +27,19 @@ import "./chunk-A5VG2BDG.mjs";
|
|
|
27
27
|
import "./chunk-EUYRVVXL.mjs";
|
|
28
28
|
import "./chunk-2SKCXYLB.mjs";
|
|
29
29
|
import "./chunk-BZAIS65C.mjs";
|
|
30
|
-
import "./chunk-
|
|
30
|
+
import "./chunk-35NPLKQJ.mjs";
|
|
31
31
|
import "./chunk-N2KC75H7.mjs";
|
|
32
32
|
import "./chunk-H53KVQUU.mjs";
|
|
33
33
|
import "./chunk-QKVUNGAH.mjs";
|
|
34
34
|
import "./chunk-AAC66ILR.mjs";
|
|
35
35
|
import "./chunk-ISSFLGJ5.mjs";
|
|
36
|
-
import "./chunk-
|
|
36
|
+
import "./chunk-4X57GXQA.mjs";
|
|
37
37
|
import "./chunk-IGOLMCE3.mjs";
|
|
38
38
|
import "./chunk-YUE4CJNB.mjs";
|
|
39
|
-
import "./chunk-
|
|
40
|
-
import "./chunk-
|
|
39
|
+
import "./chunk-6JNGOC37.mjs";
|
|
40
|
+
import "./chunk-TT3E2JOF.mjs";
|
|
41
41
|
import "./chunk-NXV52RNX.mjs";
|
|
42
|
-
import "./chunk-
|
|
42
|
+
import "./chunk-TQTB33JS.mjs";
|
|
43
43
|
import "./chunk-STV7A2LH.mjs";
|
|
44
44
|
import "./chunk-XNWHZQ6A.mjs";
|
|
45
45
|
import "./chunk-SXWF4QRU.mjs";
|
|
@@ -48,7 +48,7 @@ import "./chunk-LBRRZEEK.mjs";
|
|
|
48
48
|
import "./chunk-HAG2HEDU.mjs";
|
|
49
49
|
import "./chunk-VFPFBYG5.mjs";
|
|
50
50
|
import "./chunk-35SSRS5K.mjs";
|
|
51
|
-
import "./chunk-
|
|
51
|
+
import "./chunk-3TWQERDE.mjs";
|
|
52
52
|
import "./chunk-4OAR7CTF.mjs";
|
|
53
53
|
import "./chunk-O2IGROSM.mjs";
|
|
54
54
|
import "./chunk-4N7DAFLY.mjs";
|
|
@@ -62,12 +62,12 @@ import "./chunk-6YPPIPKR.mjs";
|
|
|
62
62
|
import "./chunk-776TTMU3.mjs";
|
|
63
63
|
import "./chunk-3BXGOVKE.mjs";
|
|
64
64
|
import "./chunk-4C3Z34O7.mjs";
|
|
65
|
-
import "./chunk-
|
|
66
|
-
import "./chunk-
|
|
65
|
+
import "./chunk-2HDOV47R.mjs";
|
|
66
|
+
import "./chunk-34IAPZBG.mjs";
|
|
67
67
|
import "./chunk-WZ5QFROO.mjs";
|
|
68
|
-
import "./chunk-
|
|
68
|
+
import "./chunk-N2FY2QZ7.mjs";
|
|
69
69
|
import "./chunk-FXG2PS27.mjs";
|
|
70
|
-
import "./chunk-
|
|
70
|
+
import "./chunk-J3MPQ4MQ.mjs";
|
|
71
71
|
import "./chunk-PHN22XB2.mjs";
|
|
72
72
|
import "./chunk-XYTDSPBD.mjs";
|
|
73
73
|
import "./chunk-OMQWEX4N.mjs";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ad as ReadonlyMiddlewareStore, ae as FarmMiddlewareConfig, af as MiddlewareModule } from './client-plugins-
|
|
1
|
+
import { ad as ReadonlyMiddlewareStore, ae as FarmMiddlewareConfig, af as MiddlewareModule } from './client-plugins-B6-07YmP.mjs';
|
|
2
2
|
import { R as ResolvedFarmI18nConfig } from './types-CnH8DOqo.mjs';
|
|
3
3
|
import { R as ResolvedFarmServerConfig } from './workflows-ChyK_oTu.mjs';
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ad as ReadonlyMiddlewareStore, ae as FarmMiddlewareConfig, af as MiddlewareModule } from './client-plugins-
|
|
1
|
+
import { ad as ReadonlyMiddlewareStore, ae as FarmMiddlewareConfig, af as MiddlewareModule } from './client-plugins-By6MVUX-.js';
|
|
2
2
|
import { R as ResolvedFarmI18nConfig } from './types-CnH8DOqo.js';
|
|
3
3
|
import { R as ResolvedFarmServerConfig } from './workflows-ChyK_oTu.js';
|
|
4
4
|
|
package/dist/query/client.cjs
CHANGED
|
@@ -611,9 +611,10 @@ var updateURL = /* @__PURE__ */ __name((updates, options = {}, emitUpdate = true
|
|
|
611
611
|
}, throttleMs);
|
|
612
612
|
throttleTimers.set(throttleKey, { timer: timeout, updates, href: currentUrl.href });
|
|
613
613
|
return () => {
|
|
614
|
-
if (throttleTimers.get(throttleKey)?.timer !== timeout) return;
|
|
614
|
+
if (throttleTimers.get(throttleKey)?.timer !== timeout) return false;
|
|
615
615
|
clearTimeout(timeout);
|
|
616
616
|
throttleTimers.delete(throttleKey);
|
|
617
|
+
return true;
|
|
617
618
|
};
|
|
618
619
|
}, "updateURL");
|
|
619
620
|
function useQueryState(key, parser, options) {
|
|
@@ -678,8 +679,11 @@ function useQueryState(key, parser, options) {
|
|
|
678
679
|
}, [key, parser]);
|
|
679
680
|
(0, import_react.useEffect)(
|
|
680
681
|
() => () => {
|
|
681
|
-
cancelPendingUpdateRef.current?.();
|
|
682
|
+
const canceledPendingWrite = cancelPendingUpdateRef.current?.() ?? false;
|
|
682
683
|
cancelPendingUpdateRef.current = void 0;
|
|
684
|
+
if (canceledPendingWrite && typeof window !== "undefined") {
|
|
685
|
+
emitter.emitUpdate(getCurrentSearchParams());
|
|
686
|
+
}
|
|
683
687
|
},
|
|
684
688
|
[key]
|
|
685
689
|
);
|
|
@@ -780,10 +784,14 @@ function useQueryStates(parsers, options = {}) {
|
|
|
780
784
|
}, [watchKeys, parsers]);
|
|
781
785
|
(0, import_react.useEffect)(
|
|
782
786
|
() => () => {
|
|
787
|
+
let canceledPendingWrite = false;
|
|
783
788
|
for (const cancelPendingUpdate of pendingUpdatesRef.current.values()) {
|
|
784
|
-
cancelPendingUpdate();
|
|
789
|
+
if (cancelPendingUpdate()) canceledPendingWrite = true;
|
|
785
790
|
}
|
|
786
791
|
pendingUpdatesRef.current.clear();
|
|
792
|
+
if (canceledPendingWrite && typeof window !== "undefined") {
|
|
793
|
+
emitter.emitUpdate(getCurrentSearchParams());
|
|
794
|
+
}
|
|
787
795
|
},
|
|
788
796
|
[watchKeys]
|
|
789
797
|
);
|
package/dist/query/client.mjs
CHANGED
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
notifyHistoryChange,
|
|
18
18
|
subscribeHistoryChange,
|
|
19
19
|
writeFarmURLSearchHistory
|
|
20
|
-
} from "../chunk-
|
|
20
|
+
} from "../chunk-PSQ7N4XP.mjs";
|
|
21
21
|
import "../chunk-ULD4ENAH.mjs";
|
|
22
22
|
import "../chunk-JIT7GXDP.mjs";
|
|
23
23
|
import "../chunk-3BXGOVKE.mjs";
|
|
@@ -252,9 +252,10 @@ var updateURL = /* @__PURE__ */ __name((updates, options = {}, emitUpdate = true
|
|
|
252
252
|
}, throttleMs);
|
|
253
253
|
throttleTimers.set(throttleKey, { timer: timeout, updates, href: currentUrl.href });
|
|
254
254
|
return () => {
|
|
255
|
-
if (throttleTimers.get(throttleKey)?.timer !== timeout) return;
|
|
255
|
+
if (throttleTimers.get(throttleKey)?.timer !== timeout) return false;
|
|
256
256
|
clearTimeout(timeout);
|
|
257
257
|
throttleTimers.delete(throttleKey);
|
|
258
|
+
return true;
|
|
258
259
|
};
|
|
259
260
|
}, "updateURL");
|
|
260
261
|
function useQueryState(key, parser, options) {
|
|
@@ -319,8 +320,11 @@ function useQueryState(key, parser, options) {
|
|
|
319
320
|
}, [key, parser]);
|
|
320
321
|
useEffect(
|
|
321
322
|
() => () => {
|
|
322
|
-
cancelPendingUpdateRef.current?.();
|
|
323
|
+
const canceledPendingWrite = cancelPendingUpdateRef.current?.() ?? false;
|
|
323
324
|
cancelPendingUpdateRef.current = void 0;
|
|
325
|
+
if (canceledPendingWrite && typeof window !== "undefined") {
|
|
326
|
+
emitter.emitUpdate(getCurrentSearchParams());
|
|
327
|
+
}
|
|
324
328
|
},
|
|
325
329
|
[key]
|
|
326
330
|
);
|
|
@@ -421,10 +425,14 @@ function useQueryStates(parsers, options = {}) {
|
|
|
421
425
|
}, [watchKeys, parsers]);
|
|
422
426
|
useEffect(
|
|
423
427
|
() => () => {
|
|
428
|
+
let canceledPendingWrite = false;
|
|
424
429
|
for (const cancelPendingUpdate of pendingUpdatesRef.current.values()) {
|
|
425
|
-
cancelPendingUpdate();
|
|
430
|
+
if (cancelPendingUpdate()) canceledPendingWrite = true;
|
|
426
431
|
}
|
|
427
432
|
pendingUpdatesRef.current.clear();
|
|
433
|
+
if (canceledPendingWrite && typeof window !== "undefined") {
|
|
434
|
+
emitter.emitUpdate(getCurrentSearchParams());
|
|
435
|
+
}
|
|
428
436
|
},
|
|
429
437
|
[watchKeys]
|
|
430
438
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/query/client.ts","../../src/query/sync.ts"],"sourcesContent":["/**\n * Farm.js Client-Side Query State Management\n *\n * Type-safe URL search parameter state management - Like useState, but stored in the URL query string.\n * Client-only hooks for managing query parameters in the browser.\n * Inspired by nuqs implementation patterns.\n */\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport {\n notifyHistoryChange,\n subscribeHistoryChange,\n writeFarmURLSearchHistory,\n} from \"../client/history-sync\";\nimport { _resolveCurrentRequest } from \"../server/request-bridge\";\nimport { emitter, type KeyUpdate } from \"./sync\";\nexport { parseRouteParams, loadRouteParams, type RouteParamsInput } from \"./params\";\n\nimport { asString as asStringClient, asInteger as asIntegerClient, type Parser } from \"./parsers\";\n\nexport {\n asString,\n asInteger,\n asFloat,\n asBoolean,\n asArrayOf,\n asJson,\n asIsoDate,\n asIsoDateTime,\n createParser,\n type ArrayParserOptions,\n type Parser,\n type inferParserType,\n} from \"./parsers\";\n\nexport type UrlUpdateType = \"push\" | \"replace\";\nexport type HistoryMethod = \"pushState\" | \"replaceState\";\n\nexport interface Options {\n history?: HistoryMethod;\n shallow?: boolean;\n scroll?: boolean;\n throttleMs?: number;\n}\n\nconst getCurrentSearchParams = (): URLSearchParams => {\n if (typeof window !== \"undefined\") {\n discardDepartedURLUpdates();\n let params = new URLSearchParams(window.location.search);\n // Draft values belong to the existing throttle queue, not to a parser's\n // identity. Inline parsers and newly mounted consumers see the same draft.\n for (const pending of throttleTimers.values()) {\n if (pending.href === window.location.href) params = applyChange(params, pending.updates);\n }\n return params;\n }\n\n // Server rendering used to see an empty query string here, so a hook read one\n // value on the server and another in the browser. React reports that as a\n // hydration mismatch and discards the server rendered markup for the branch.\n const request = _resolveCurrentRequest();\n if (!request) return new URLSearchParams();\n try {\n return new URL(request.url).searchParams;\n } catch {\n return new URLSearchParams();\n }\n};\n\nconst readSearchParam = (searchParams: URLSearchParams, key: string): string => {\n const values = searchParams.getAll(key);\n return values.length > 1 ? values.join(\",\") : (values[0] ?? \"\");\n};\n\nconst throttleTimers = new Map<\n string,\n {\n timer: ReturnType<typeof setTimeout>;\n updates: Record<string, string | null>;\n href: string;\n }\n>();\n\nfunction discardDepartedURLUpdates(): void {\n for (const [key, pending] of throttleTimers) {\n if (pending.href === window.location.href) continue;\n clearTimeout(pending.timer);\n throttleTimers.delete(key);\n }\n}\n\nfunction getUpdateKey(updates: Record<string, unknown>): string {\n return JSON.stringify(Object.keys(updates).sort());\n}\n\nfunction supersedeQueuedKeys(updates: Record<string, string | null>): void {\n const keys = Object.keys(updates);\n for (const [queueKey, pending] of throttleTimers) {\n for (const key of keys) delete pending.updates[key];\n if (Object.keys(pending.updates).length > 0) continue;\n clearTimeout(pending.timer);\n throttleTimers.delete(queueKey);\n }\n}\n\nconst compareStructuredValues = (\n current: unknown,\n next: unknown,\n seen = new WeakMap<object, object>(),\n): boolean | undefined => {\n if (Object.is(current, next)) return true;\n if (current === null || next === null || typeof current !== typeof next) return false;\n if (typeof current !== \"object\" || typeof next !== \"object\") return false;\n if (current instanceof Date || next instanceof Date) {\n return current instanceof Date && next instanceof Date && current.getTime() === next.getTime();\n }\n if (Array.isArray(current) || Array.isArray(next)) {\n if (!Array.isArray(current) || !Array.isArray(next) || current.length !== next.length) {\n return false;\n }\n const knownNext = seen.get(current);\n if (knownNext) return knownNext === next;\n seen.set(current, next);\n for (let index = 0; index < current.length; index++) {\n const equal = compareStructuredValues(current[index], next[index], seen);\n if (equal !== true) return equal;\n }\n return true;\n }\n\n const currentPrototype = Object.getPrototypeOf(current);\n const nextPrototype = Object.getPrototypeOf(next);\n if (currentPrototype !== nextPrototype) return false;\n if (currentPrototype !== Object.prototype && currentPrototype !== null) return undefined;\n\n const knownNext = seen.get(current);\n if (knownNext) return knownNext === next;\n seen.set(current, next);\n\n const currentKeys = Object.keys(current);\n const nextKeys = Object.keys(next);\n if (\n currentKeys.length !== nextKeys.length ||\n currentKeys.some((key) => !Object.prototype.hasOwnProperty.call(next, key))\n ) {\n return false;\n }\n for (const key of currentKeys) {\n const equal = compareStructuredValues(\n (current as Record<string, unknown>)[key],\n (next as Record<string, unknown>)[key],\n seen,\n );\n if (equal !== true) return equal;\n }\n return true;\n};\n\nconst areParsedValuesEqual = <T>(parser: Parser<T>, current: T | null, next: T | null) => {\n if (Object.is(current, next)) return true;\n const structuredResult = compareStructuredValues(current, next);\n if (structuredResult === false) return false;\n if (current === null || next === null) return false;\n\n try {\n return parser.serialize(current) === parser.serialize(next);\n } catch {\n return structuredResult === true;\n }\n};\n\nconst applyChange = (\n searchParams: URLSearchParams,\n updates: Record<string, string | null>,\n keepExisting = true,\n): URLSearchParams => {\n const newParams = keepExisting ? new URLSearchParams(searchParams) : new URLSearchParams();\n\n Object.entries(updates).forEach(([key, value]) => {\n if (value === null || value === undefined || value === \"\") {\n newParams.delete(key);\n } else {\n newParams.set(key, value);\n }\n });\n\n return newParams;\n};\n\nconst commitURLUpdate = (\n updates: Record<string, string | null>,\n options: Options,\n emitUpdate: boolean,\n) => {\n const { history = \"pushState\", shallow = true, scroll = false } = options;\n const url = new URL(window.location.href);\n const newSearchParams = applyChange(url.searchParams, updates);\n const newSearch = newSearchParams.toString();\n const newUrl = url.pathname + (newSearch ? `?${newSearch}` : \"\") + url.hash;\n const currentUrl = url.pathname + url.search + url.hash;\n\n if (newUrl === currentUrl) return;\n\n const historyAction = history === \"replaceState\" ? \"replace\" : \"push\";\n if (!writeFarmURLSearchHistory(historyAction, newUrl)) {\n const historyState = window.history.state;\n const nextHistoryState =\n historyState && typeof historyState === \"object\" && \"path\" in historyState\n ? { ...historyState, path: newUrl }\n : historyState;\n window.history[history](nextHistoryState, \"\", newUrl);\n }\n\n if (emitUpdate) {\n // Composing one queued key must not discard drafts for other keys. Only\n // carry drafts forward across this write, never across unrelated navigation.\n for (const pending of throttleTimers.values()) {\n if (pending.href === url.href) pending.href = window.location.href;\n }\n emitter.emitUpdate(getCurrentSearchParams());\n }\n\n if (shallow) notifyHistoryChange(\"url-search\");\n\n if (scroll) {\n window.scrollTo(0, 0);\n }\n};\n\nconst updateURL = (\n updates: Record<string, string | null>,\n options: Options = {},\n emitUpdate = true,\n): (() => void) | undefined => {\n if (typeof window === \"undefined\") return;\n\n discardDepartedURLUpdates();\n\n const { throttleMs } = options;\n // Latest intent owns each key, including immediate writes and URL no-ops.\n // Keep unrelated keys in an older batch scheduled with their original owner.\n supersedeQueuedKeys(updates);\n if (!throttleMs || throttleMs <= 0) {\n commitURLUpdate(updates, options, emitUpdate);\n return;\n }\n\n const throttleKey = getUpdateKey(updates);\n\n const currentUrl = new URL(window.location.href);\n const nextSearch = applyChange(currentUrl.searchParams, updates).toString();\n if (nextSearch === currentUrl.searchParams.toString()) return;\n\n const timeout = setTimeout(() => {\n const pending = throttleTimers.get(throttleKey);\n if (pending?.timer !== timeout) return;\n throttleTimers.delete(throttleKey);\n if (pending.href !== window.location.href) return;\n commitURLUpdate(updates, options, emitUpdate);\n }, throttleMs);\n\n throttleTimers.set(throttleKey, { timer: timeout, updates, href: currentUrl.href });\n return () => {\n if (throttleTimers.get(throttleKey)?.timer !== timeout) return;\n clearTimeout(timeout);\n throttleTimers.delete(throttleKey);\n };\n};\n\nexport function useQueryState<TParser extends Parser<any>>(\n key: string,\n parser: TParser,\n options?: Options,\n): [\n NonNullable<ReturnType<TParser[\"parse\"]>> | null,\n (value: NonNullable<ReturnType<TParser[\"parse\"]>> | null) => void,\n];\nexport function useQueryState<T>(\n key: string,\n parser: Parser<T>,\n options?: Options,\n): [T | null, (value: T | null) => void];\nexport function useQueryState<TParser extends Parser<any>>(\n key: string,\n parser: TParser,\n options?: Options,\n): [\n NonNullable<ReturnType<TParser[\"parse\"]>> | null,\n (value: NonNullable<ReturnType<TParser[\"parse\"]>> | null) => void,\n] {\n type T = NonNullable<ReturnType<TParser[\"parse\"]>>;\n const [state, setState] = useState<T | null>(() => {\n const searchParams = getCurrentSearchParams();\n const parsed = parser.parse(readSearchParam(searchParams, key));\n return parsed;\n });\n\n const stateRef = useRef(state);\n const stateKeyRef = useRef(key);\n const cancelPendingUpdateRef = useRef<(() => void) | undefined>(undefined);\n stateRef.current = state;\n\n const setValue = useCallback(\n (value: T | null) => {\n setState(value);\n stateRef.current = value;\n\n const serialized = value === null ? null : parser.serialize(value);\n\n emitter.emitKey(key, { state: value, query: serialized, source: stateRef });\n\n cancelPendingUpdateRef.current?.();\n cancelPendingUpdateRef.current = updateURL({ [key]: serialized }, options, true);\n },\n [key, parser, options],\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const onPopState = () => {\n const searchParams = getCurrentSearchParams();\n const parsed = parser.parse(readSearchParam(searchParams, key));\n const sourceChanged = stateKeyRef.current !== key;\n stateKeyRef.current = key;\n if (sourceChanged || !areParsedValuesEqual(parser, stateRef.current, parsed)) {\n setState(parsed);\n stateRef.current = parsed;\n }\n };\n\n const onEmitterUpdate = (searchParams: URLSearchParams) => {\n const parsed = parser.parse(readSearchParam(searchParams, key));\n if (!areParsedValuesEqual(parser, stateRef.current, parsed)) {\n setState(parsed);\n stateRef.current = parsed;\n }\n };\n\n const onKeyUpdate = (payload: KeyUpdate) => {\n // Skip only this hook's synchronous echo, never a peer's newer edit.\n // The ref identity is stable across renders and is not serialized.\n if (payload.source === stateRef) {\n return;\n }\n\n // Consumers may use different parsers for the same URL key.\n const parsed = parser.parse(payload.query ?? \"\");\n if (!areParsedValuesEqual(parser, stateRef.current, parsed)) {\n setState(parsed);\n stateRef.current = parsed;\n }\n };\n\n // Page-state writes with an href can change the query string without a\n // popstate, so listen through the shared history channel (real\n // back/forward events included). Self-updates no-op via the Object.is\n // comparison above.\n onPopState();\n const unsubscribeHistory = subscribeHistoryChange(onPopState);\n emitter.on(\"update\", onEmitterUpdate);\n emitter.onKey(key, onKeyUpdate);\n\n return () => {\n unsubscribeHistory();\n emitter.off(\"update\", onEmitterUpdate);\n emitter.offKey(key, onKeyUpdate);\n };\n }, [key, parser]);\n\n useEffect(\n () => () => {\n cancelPendingUpdateRef.current?.();\n cancelPendingUpdateRef.current = undefined;\n },\n [key],\n );\n\n return [state, setValue];\n}\n\nexport function useQueryStates<T extends Record<string, Parser<any>>>(\n parsers: T,\n options: Options = {},\n): [\n { [K in keyof T]: ReturnType<T[K][\"parse\"]> },\n (updates: Partial<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> | null }>) => void,\n] {\n const keys = Object.keys(parsers);\n const watchKeys = JSON.stringify(keys);\n\n const [state, setState] = useState<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> }>(() => {\n const searchParams = getCurrentSearchParams();\n const result = {} as { [K in keyof T]: ReturnType<T[K][\"parse\"]> };\n\n Object.entries(parsers).forEach(([key, parser]) => {\n result[key as keyof T] = parser.parse(readSearchParam(searchParams, key));\n });\n\n return result;\n });\n\n const stateRef = useRef(state);\n const pendingUpdatesRef = useRef(new Map<string, () => void>());\n stateRef.current = state;\n\n const setValues = useCallback(\n (updates: Partial<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> | null }>) => {\n const newState = { ...stateRef.current, ...updates };\n setState(newState);\n stateRef.current = newState;\n\n Object.entries(updates).forEach(([key, value]) => {\n const parser = parsers[key];\n if (parser) {\n const serialized = value === null ? null : parser.serialize(value);\n emitter.emitKey(key, { state: value, query: serialized, source: stateRef });\n }\n });\n\n const urlUpdates: Record<string, string | null> = {};\n Object.entries(updates).forEach(([key, value]) => {\n const parser = parsers[key];\n if (parser) {\n const serialized = value === null ? null : parser.serialize(value);\n urlUpdates[key] = serialized;\n }\n });\n\n const updateKey = getUpdateKey(urlUpdates);\n pendingUpdatesRef.current.get(updateKey)?.();\n const cancelPendingUpdate = updateURL(urlUpdates, options, true);\n if (cancelPendingUpdate) {\n pendingUpdatesRef.current.set(updateKey, cancelPendingUpdate);\n } else {\n pendingUpdatesRef.current.delete(updateKey);\n }\n },\n [parsers, options],\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const applyChange = (searchParams: URLSearchParams) => {\n const result = {} as { [K in keyof T]: ReturnType<T[K][\"parse\"]> };\n const currentKeys = Object.keys(stateRef.current);\n let hasChanged =\n currentKeys.length !== keys.length ||\n currentKeys.some((key) => !Object.prototype.hasOwnProperty.call(parsers, key));\n\n Object.entries(parsers).forEach(([key, parser]) => {\n const parsed = parser.parse(readSearchParam(searchParams, key));\n const currentValue = stateRef.current[key as keyof T];\n\n if (!areParsedValuesEqual(parser, currentValue, parsed)) {\n hasChanged = true;\n }\n result[key as keyof T] = parsed;\n });\n\n if (hasChanged) {\n setState(result);\n stateRef.current = result;\n }\n };\n\n const onPopState = () => {\n const searchParams = getCurrentSearchParams();\n applyChange(searchParams);\n };\n\n const onEmitterUpdate = (searchParams: URLSearchParams) => {\n applyChange(searchParams);\n };\n\n applyChange(getCurrentSearchParams());\n const unsubscribeHistory = subscribeHistoryChange(onPopState);\n emitter.on(\"update\", onEmitterUpdate);\n const unsubscribeKeys = Object.entries(parsers).map(([key, parser]) => {\n const onKeyUpdate = (payload: KeyUpdate) => {\n if (payload.source === stateRef) return;\n const parsed = parser.parse(payload.query ?? \"\");\n if (areParsedValuesEqual(parser, stateRef.current[key as keyof T], parsed)) return;\n\n // Update only this key, preserving local drafts for the other fields.\n const next = { ...stateRef.current, [key]: parsed };\n stateRef.current = next;\n setState(next);\n };\n emitter.onKey(key, onKeyUpdate);\n return () => emitter.offKey(key, onKeyUpdate);\n });\n\n return () => {\n unsubscribeHistory();\n emitter.off(\"update\", onEmitterUpdate);\n for (const unsubscribe of unsubscribeKeys) unsubscribe();\n };\n }, [watchKeys, parsers]);\n\n useEffect(\n () => () => {\n for (const cancelPendingUpdate of pendingUpdatesRef.current.values()) {\n cancelPendingUpdate();\n }\n pendingUpdatesRef.current.clear();\n },\n [watchKeys],\n );\n\n return [state, setValues];\n}\n\nexport function usePagination(options?: {\n defaultPage?: number;\n defaultLimit?: number;\n pageKey?: string;\n limitKey?: string;\n}) {\n const {\n defaultPage = 1,\n defaultLimit = 10,\n pageKey = \"page\",\n limitKey = \"limit\",\n } = options || {};\n\n const [page, setPage] = useQueryState(pageKey, asIntegerClient.withDefault!(defaultPage));\n const [limit, setLimit] = useQueryState(limitKey, asIntegerClient.withDefault!(defaultLimit));\n\n const currentPage = page ?? defaultPage;\n const currentLimit = limit ?? defaultLimit;\n const offset = ((currentPage as number) - 1) * (currentLimit as number);\n\n return {\n page: currentPage,\n setPage,\n limit: currentLimit,\n setLimit,\n offset,\n resetPagination: () => {\n setPage(defaultPage);\n setLimit(defaultLimit);\n },\n };\n}\n\nexport function useSearchFilters<T extends Record<string, any>>(options?: {\n searchKey?: string;\n defaultFilters?: T;\n filterKeys?: (keyof T)[];\n}) {\n const {\n searchKey = \"search\",\n defaultFilters = {} as T,\n filterKeys = Object.keys(defaultFilters) as (keyof T)[],\n } = options || {};\n\n const [search, setSearch] = useQueryState(searchKey, asStringClient);\n\n const filterParsers = filterKeys.reduce(\n (acc, key) => {\n acc[key as string] = asStringClient;\n return acc;\n },\n {} as Record<string, Parser<string>>,\n );\n\n const [filters, setFilters] = useQueryStates(filterParsers);\n\n const clearFilters = () => {\n setSearch(null);\n const clearedFilters = filterKeys.reduce(\n (acc, key) => {\n acc[key as string] = null;\n return acc;\n },\n {} as Record<string, null>,\n );\n setFilters(clearedFilters);\n };\n\n return {\n search,\n setSearch,\n filters: filters as T,\n setFilters,\n clearFilters,\n };\n}\n","/**\n * Cross-hook synchronization system for query state\n * Inspired by nuqs implementation\n */\n\ntype Listener = (searchParams: URLSearchParams) => void;\nexport type KeyUpdate = { state: any; query: string | null; source?: object };\ntype KeyListener = (payload: KeyUpdate) => void;\n\nclass Emitter {\n private listeners: Map<string, Set<Listener>> = new Map();\n private keyListeners: Map<string, Set<KeyListener>> = new Map();\n\n /**\n * Emit a global update event (all hooks should sync)\n */\n emitUpdate(searchParams: URLSearchParams): void {\n const listeners = this.listeners.get(\"update\") || new Set();\n listeners.forEach((listener) => listener(searchParams));\n }\n\n /**\n * Emit a key-specific update (for cross-hook sync)\n */\n emitKey(key: string, payload: KeyUpdate): void {\n const listeners = this.keyListeners.get(key) || new Set();\n listeners.forEach((listener) => listener(payload));\n }\n\n /**\n * Subscribe to global updates\n */\n on(event: \"update\", listener: Listener): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n }\n\n /**\n * Subscribe to key-specific updates\n */\n onKey(key: string, listener: KeyListener): void {\n if (!this.keyListeners.has(key)) {\n this.keyListeners.set(key, new Set());\n }\n this.keyListeners.get(key)!.add(listener);\n }\n\n /**\n * Unsubscribe from global updates\n */\n off(event: \"update\", listener: Listener): void {\n const listeners = this.listeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * Unsubscribe from key-specific updates\n */\n offKey(key: string, listener: KeyListener): void {\n const listeners = this.keyListeners.get(key);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n}\n\nexport const emitter = new Emitter();\n"],"mappings":"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","names":["knownNext","applyChange"]}
|
|
1
|
+
{"version":3,"sources":["../../src/query/client.ts","../../src/query/sync.ts"],"sourcesContent":["/**\n * Farm.js Client-Side Query State Management\n *\n * Type-safe URL search parameter state management - Like useState, but stored in the URL query string.\n * Client-only hooks for managing query parameters in the browser.\n * Inspired by nuqs implementation patterns.\n */\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport {\n notifyHistoryChange,\n subscribeHistoryChange,\n writeFarmURLSearchHistory,\n} from \"../client/history-sync\";\nimport { _resolveCurrentRequest } from \"../server/request-bridge\";\nimport { emitter, type KeyUpdate } from \"./sync\";\nexport { parseRouteParams, loadRouteParams, type RouteParamsInput } from \"./params\";\n\nimport { asString as asStringClient, asInteger as asIntegerClient, type Parser } from \"./parsers\";\n\nexport {\n asString,\n asInteger,\n asFloat,\n asBoolean,\n asArrayOf,\n asJson,\n asIsoDate,\n asIsoDateTime,\n createParser,\n type ArrayParserOptions,\n type Parser,\n type inferParserType,\n} from \"./parsers\";\n\nexport type UrlUpdateType = \"push\" | \"replace\";\nexport type HistoryMethod = \"pushState\" | \"replaceState\";\n\nexport interface Options {\n history?: HistoryMethod;\n shallow?: boolean;\n scroll?: boolean;\n throttleMs?: number;\n}\n\nconst getCurrentSearchParams = (): URLSearchParams => {\n if (typeof window !== \"undefined\") {\n discardDepartedURLUpdates();\n let params = new URLSearchParams(window.location.search);\n // Draft values belong to the existing throttle queue, not to a parser's\n // identity. Inline parsers and newly mounted consumers see the same draft.\n for (const pending of throttleTimers.values()) {\n if (pending.href === window.location.href) params = applyChange(params, pending.updates);\n }\n return params;\n }\n\n // Server rendering used to see an empty query string here, so a hook read one\n // value on the server and another in the browser. React reports that as a\n // hydration mismatch and discards the server rendered markup for the branch.\n const request = _resolveCurrentRequest();\n if (!request) return new URLSearchParams();\n try {\n return new URL(request.url).searchParams;\n } catch {\n return new URLSearchParams();\n }\n};\n\nconst readSearchParam = (searchParams: URLSearchParams, key: string): string => {\n const values = searchParams.getAll(key);\n return values.length > 1 ? values.join(\",\") : (values[0] ?? \"\");\n};\n\nconst throttleTimers = new Map<\n string,\n {\n timer: ReturnType<typeof setTimeout>;\n updates: Record<string, string | null>;\n href: string;\n }\n>();\n\nfunction discardDepartedURLUpdates(): void {\n for (const [key, pending] of throttleTimers) {\n if (pending.href === window.location.href) continue;\n clearTimeout(pending.timer);\n throttleTimers.delete(key);\n }\n}\n\nfunction getUpdateKey(updates: Record<string, unknown>): string {\n return JSON.stringify(Object.keys(updates).sort());\n}\n\nfunction supersedeQueuedKeys(updates: Record<string, string | null>): void {\n const keys = Object.keys(updates);\n for (const [queueKey, pending] of throttleTimers) {\n for (const key of keys) delete pending.updates[key];\n if (Object.keys(pending.updates).length > 0) continue;\n clearTimeout(pending.timer);\n throttleTimers.delete(queueKey);\n }\n}\n\nconst compareStructuredValues = (\n current: unknown,\n next: unknown,\n seen = new WeakMap<object, object>(),\n): boolean | undefined => {\n if (Object.is(current, next)) return true;\n if (current === null || next === null || typeof current !== typeof next) return false;\n if (typeof current !== \"object\" || typeof next !== \"object\") return false;\n if (current instanceof Date || next instanceof Date) {\n return current instanceof Date && next instanceof Date && current.getTime() === next.getTime();\n }\n if (Array.isArray(current) || Array.isArray(next)) {\n if (!Array.isArray(current) || !Array.isArray(next) || current.length !== next.length) {\n return false;\n }\n const knownNext = seen.get(current);\n if (knownNext) return knownNext === next;\n seen.set(current, next);\n for (let index = 0; index < current.length; index++) {\n const equal = compareStructuredValues(current[index], next[index], seen);\n if (equal !== true) return equal;\n }\n return true;\n }\n\n const currentPrototype = Object.getPrototypeOf(current);\n const nextPrototype = Object.getPrototypeOf(next);\n if (currentPrototype !== nextPrototype) return false;\n if (currentPrototype !== Object.prototype && currentPrototype !== null) return undefined;\n\n const knownNext = seen.get(current);\n if (knownNext) return knownNext === next;\n seen.set(current, next);\n\n const currentKeys = Object.keys(current);\n const nextKeys = Object.keys(next);\n if (\n currentKeys.length !== nextKeys.length ||\n currentKeys.some((key) => !Object.prototype.hasOwnProperty.call(next, key))\n ) {\n return false;\n }\n for (const key of currentKeys) {\n const equal = compareStructuredValues(\n (current as Record<string, unknown>)[key],\n (next as Record<string, unknown>)[key],\n seen,\n );\n if (equal !== true) return equal;\n }\n return true;\n};\n\nconst areParsedValuesEqual = <T>(parser: Parser<T>, current: T | null, next: T | null) => {\n if (Object.is(current, next)) return true;\n const structuredResult = compareStructuredValues(current, next);\n if (structuredResult === false) return false;\n if (current === null || next === null) return false;\n\n try {\n return parser.serialize(current) === parser.serialize(next);\n } catch {\n return structuredResult === true;\n }\n};\n\nconst applyChange = (\n searchParams: URLSearchParams,\n updates: Record<string, string | null>,\n keepExisting = true,\n): URLSearchParams => {\n const newParams = keepExisting ? new URLSearchParams(searchParams) : new URLSearchParams();\n\n Object.entries(updates).forEach(([key, value]) => {\n if (value === null || value === undefined || value === \"\") {\n newParams.delete(key);\n } else {\n newParams.set(key, value);\n }\n });\n\n return newParams;\n};\n\nconst commitURLUpdate = (\n updates: Record<string, string | null>,\n options: Options,\n emitUpdate: boolean,\n) => {\n const { history = \"pushState\", shallow = true, scroll = false } = options;\n const url = new URL(window.location.href);\n const newSearchParams = applyChange(url.searchParams, updates);\n const newSearch = newSearchParams.toString();\n const newUrl = url.pathname + (newSearch ? `?${newSearch}` : \"\") + url.hash;\n const currentUrl = url.pathname + url.search + url.hash;\n\n if (newUrl === currentUrl) return;\n\n const historyAction = history === \"replaceState\" ? \"replace\" : \"push\";\n if (!writeFarmURLSearchHistory(historyAction, newUrl)) {\n const historyState = window.history.state;\n const nextHistoryState =\n historyState && typeof historyState === \"object\" && \"path\" in historyState\n ? { ...historyState, path: newUrl }\n : historyState;\n window.history[history](nextHistoryState, \"\", newUrl);\n }\n\n if (emitUpdate) {\n // Composing one queued key must not discard drafts for other keys. Only\n // carry drafts forward across this write, never across unrelated navigation.\n for (const pending of throttleTimers.values()) {\n if (pending.href === url.href) pending.href = window.location.href;\n }\n emitter.emitUpdate(getCurrentSearchParams());\n }\n\n if (shallow) notifyHistoryChange(\"url-search\");\n\n if (scroll) {\n window.scrollTo(0, 0);\n }\n};\n\nconst updateURL = (\n updates: Record<string, string | null>,\n options: Options = {},\n emitUpdate = true,\n): (() => boolean) | undefined => {\n if (typeof window === \"undefined\") return;\n\n discardDepartedURLUpdates();\n\n const { throttleMs } = options;\n // Latest intent owns each key, including immediate writes and URL no-ops.\n // Keep unrelated keys in an older batch scheduled with their original owner.\n supersedeQueuedKeys(updates);\n if (!throttleMs || throttleMs <= 0) {\n commitURLUpdate(updates, options, emitUpdate);\n return;\n }\n\n const throttleKey = getUpdateKey(updates);\n\n const currentUrl = new URL(window.location.href);\n const nextSearch = applyChange(currentUrl.searchParams, updates).toString();\n if (nextSearch === currentUrl.searchParams.toString()) return;\n\n const timeout = setTimeout(() => {\n const pending = throttleTimers.get(throttleKey);\n if (pending?.timer !== timeout) return;\n throttleTimers.delete(throttleKey);\n if (pending.href !== window.location.href) return;\n commitURLUpdate(updates, options, emitUpdate);\n }, throttleMs);\n\n throttleTimers.set(throttleKey, { timer: timeout, updates, href: currentUrl.href });\n return () => {\n if (throttleTimers.get(throttleKey)?.timer !== timeout) return false;\n clearTimeout(timeout);\n throttleTimers.delete(throttleKey);\n return true;\n };\n};\n\nexport function useQueryState<TParser extends Parser<any>>(\n key: string,\n parser: TParser,\n options?: Options,\n): [\n NonNullable<ReturnType<TParser[\"parse\"]>> | null,\n (value: NonNullable<ReturnType<TParser[\"parse\"]>> | null) => void,\n];\nexport function useQueryState<T>(\n key: string,\n parser: Parser<T>,\n options?: Options,\n): [T | null, (value: T | null) => void];\nexport function useQueryState<TParser extends Parser<any>>(\n key: string,\n parser: TParser,\n options?: Options,\n): [\n NonNullable<ReturnType<TParser[\"parse\"]>> | null,\n (value: NonNullable<ReturnType<TParser[\"parse\"]>> | null) => void,\n] {\n type T = NonNullable<ReturnType<TParser[\"parse\"]>>;\n const [state, setState] = useState<T | null>(() => {\n const searchParams = getCurrentSearchParams();\n const parsed = parser.parse(readSearchParam(searchParams, key));\n return parsed;\n });\n\n const stateRef = useRef(state);\n const stateKeyRef = useRef(key);\n const cancelPendingUpdateRef = useRef<(() => boolean) | undefined>(undefined);\n stateRef.current = state;\n\n const setValue = useCallback(\n (value: T | null) => {\n setState(value);\n stateRef.current = value;\n\n const serialized = value === null ? null : parser.serialize(value);\n\n emitter.emitKey(key, { state: value, query: serialized, source: stateRef });\n\n cancelPendingUpdateRef.current?.();\n cancelPendingUpdateRef.current = updateURL({ [key]: serialized }, options, true);\n },\n [key, parser, options],\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const onPopState = () => {\n const searchParams = getCurrentSearchParams();\n const parsed = parser.parse(readSearchParam(searchParams, key));\n const sourceChanged = stateKeyRef.current !== key;\n stateKeyRef.current = key;\n if (sourceChanged || !areParsedValuesEqual(parser, stateRef.current, parsed)) {\n setState(parsed);\n stateRef.current = parsed;\n }\n };\n\n const onEmitterUpdate = (searchParams: URLSearchParams) => {\n const parsed = parser.parse(readSearchParam(searchParams, key));\n if (!areParsedValuesEqual(parser, stateRef.current, parsed)) {\n setState(parsed);\n stateRef.current = parsed;\n }\n };\n\n const onKeyUpdate = (payload: KeyUpdate) => {\n // Skip only this hook's synchronous echo, never a peer's newer edit.\n // The ref identity is stable across renders and is not serialized.\n if (payload.source === stateRef) {\n return;\n }\n\n // Consumers may use different parsers for the same URL key.\n const parsed = parser.parse(payload.query ?? \"\");\n if (!areParsedValuesEqual(parser, stateRef.current, parsed)) {\n setState(parsed);\n stateRef.current = parsed;\n }\n };\n\n // Page-state writes with an href can change the query string without a\n // popstate, so listen through the shared history channel (real\n // back/forward events included). Self-updates no-op via the Object.is\n // comparison above.\n onPopState();\n const unsubscribeHistory = subscribeHistoryChange(onPopState);\n emitter.on(\"update\", onEmitterUpdate);\n emitter.onKey(key, onKeyUpdate);\n\n return () => {\n unsubscribeHistory();\n emitter.off(\"update\", onEmitterUpdate);\n emitter.offKey(key, onKeyUpdate);\n };\n }, [key, parser]);\n\n useEffect(\n () => () => {\n const canceledPendingWrite = cancelPendingUpdateRef.current?.() ?? false;\n cancelPendingUpdateRef.current = undefined;\n // A throttled write is discarded on unmount, but its value was already\n // broadcast to peers via emitKey. Peers that adopted the optimistic draft\n // get no other reconciliation signal (unmount fires no history event), so\n // tell them to re-read the URL, which no longer carries this draft.\n if (canceledPendingWrite && typeof window !== \"undefined\") {\n emitter.emitUpdate(getCurrentSearchParams());\n }\n },\n [key],\n );\n\n return [state, setValue];\n}\n\nexport function useQueryStates<T extends Record<string, Parser<any>>>(\n parsers: T,\n options: Options = {},\n): [\n { [K in keyof T]: ReturnType<T[K][\"parse\"]> },\n (updates: Partial<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> | null }>) => void,\n] {\n const keys = Object.keys(parsers);\n const watchKeys = JSON.stringify(keys);\n\n const [state, setState] = useState<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> }>(() => {\n const searchParams = getCurrentSearchParams();\n const result = {} as { [K in keyof T]: ReturnType<T[K][\"parse\"]> };\n\n Object.entries(parsers).forEach(([key, parser]) => {\n result[key as keyof T] = parser.parse(readSearchParam(searchParams, key));\n });\n\n return result;\n });\n\n const stateRef = useRef(state);\n const pendingUpdatesRef = useRef(new Map<string, () => boolean>());\n stateRef.current = state;\n\n const setValues = useCallback(\n (updates: Partial<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> | null }>) => {\n const newState = { ...stateRef.current, ...updates };\n setState(newState);\n stateRef.current = newState;\n\n Object.entries(updates).forEach(([key, value]) => {\n const parser = parsers[key];\n if (parser) {\n const serialized = value === null ? null : parser.serialize(value);\n emitter.emitKey(key, { state: value, query: serialized, source: stateRef });\n }\n });\n\n const urlUpdates: Record<string, string | null> = {};\n Object.entries(updates).forEach(([key, value]) => {\n const parser = parsers[key];\n if (parser) {\n const serialized = value === null ? null : parser.serialize(value);\n urlUpdates[key] = serialized;\n }\n });\n\n const updateKey = getUpdateKey(urlUpdates);\n pendingUpdatesRef.current.get(updateKey)?.();\n const cancelPendingUpdate = updateURL(urlUpdates, options, true);\n if (cancelPendingUpdate) {\n pendingUpdatesRef.current.set(updateKey, cancelPendingUpdate);\n } else {\n pendingUpdatesRef.current.delete(updateKey);\n }\n },\n [parsers, options],\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const applyChange = (searchParams: URLSearchParams) => {\n const result = {} as { [K in keyof T]: ReturnType<T[K][\"parse\"]> };\n const currentKeys = Object.keys(stateRef.current);\n let hasChanged =\n currentKeys.length !== keys.length ||\n currentKeys.some((key) => !Object.prototype.hasOwnProperty.call(parsers, key));\n\n Object.entries(parsers).forEach(([key, parser]) => {\n const parsed = parser.parse(readSearchParam(searchParams, key));\n const currentValue = stateRef.current[key as keyof T];\n\n if (!areParsedValuesEqual(parser, currentValue, parsed)) {\n hasChanged = true;\n }\n result[key as keyof T] = parsed;\n });\n\n if (hasChanged) {\n setState(result);\n stateRef.current = result;\n }\n };\n\n const onPopState = () => {\n const searchParams = getCurrentSearchParams();\n applyChange(searchParams);\n };\n\n const onEmitterUpdate = (searchParams: URLSearchParams) => {\n applyChange(searchParams);\n };\n\n applyChange(getCurrentSearchParams());\n const unsubscribeHistory = subscribeHistoryChange(onPopState);\n emitter.on(\"update\", onEmitterUpdate);\n const unsubscribeKeys = Object.entries(parsers).map(([key, parser]) => {\n const onKeyUpdate = (payload: KeyUpdate) => {\n if (payload.source === stateRef) return;\n const parsed = parser.parse(payload.query ?? \"\");\n if (areParsedValuesEqual(parser, stateRef.current[key as keyof T], parsed)) return;\n\n // Update only this key, preserving local drafts for the other fields.\n const next = { ...stateRef.current, [key]: parsed };\n stateRef.current = next;\n setState(next);\n };\n emitter.onKey(key, onKeyUpdate);\n return () => emitter.offKey(key, onKeyUpdate);\n });\n\n return () => {\n unsubscribeHistory();\n emitter.off(\"update\", onEmitterUpdate);\n for (const unsubscribe of unsubscribeKeys) unsubscribe();\n };\n }, [watchKeys, parsers]);\n\n useEffect(\n () => () => {\n let canceledPendingWrite = false;\n for (const cancelPendingUpdate of pendingUpdatesRef.current.values()) {\n if (cancelPendingUpdate()) canceledPendingWrite = true;\n }\n pendingUpdatesRef.current.clear();\n // Discarded throttled writes were already broadcast to peers via emitKey;\n // reconcile any peer that adopted a now-cancelled draft (see useQueryState).\n if (canceledPendingWrite && typeof window !== \"undefined\") {\n emitter.emitUpdate(getCurrentSearchParams());\n }\n },\n [watchKeys],\n );\n\n return [state, setValues];\n}\n\nexport function usePagination(options?: {\n defaultPage?: number;\n defaultLimit?: number;\n pageKey?: string;\n limitKey?: string;\n}) {\n const {\n defaultPage = 1,\n defaultLimit = 10,\n pageKey = \"page\",\n limitKey = \"limit\",\n } = options || {};\n\n const [page, setPage] = useQueryState(pageKey, asIntegerClient.withDefault!(defaultPage));\n const [limit, setLimit] = useQueryState(limitKey, asIntegerClient.withDefault!(defaultLimit));\n\n const currentPage = page ?? defaultPage;\n const currentLimit = limit ?? defaultLimit;\n const offset = ((currentPage as number) - 1) * (currentLimit as number);\n\n return {\n page: currentPage,\n setPage,\n limit: currentLimit,\n setLimit,\n offset,\n resetPagination: () => {\n setPage(defaultPage);\n setLimit(defaultLimit);\n },\n };\n}\n\nexport function useSearchFilters<T extends Record<string, any>>(options?: {\n searchKey?: string;\n defaultFilters?: T;\n filterKeys?: (keyof T)[];\n}) {\n const {\n searchKey = \"search\",\n defaultFilters = {} as T,\n filterKeys = Object.keys(defaultFilters) as (keyof T)[],\n } = options || {};\n\n const [search, setSearch] = useQueryState(searchKey, asStringClient);\n\n const filterParsers = filterKeys.reduce(\n (acc, key) => {\n acc[key as string] = asStringClient;\n return acc;\n },\n {} as Record<string, Parser<string>>,\n );\n\n const [filters, setFilters] = useQueryStates(filterParsers);\n\n const clearFilters = () => {\n setSearch(null);\n const clearedFilters = filterKeys.reduce(\n (acc, key) => {\n acc[key as string] = null;\n return acc;\n },\n {} as Record<string, null>,\n );\n setFilters(clearedFilters);\n };\n\n return {\n search,\n setSearch,\n filters: filters as T,\n setFilters,\n clearFilters,\n };\n}\n","/**\n * Cross-hook synchronization system for query state\n * Inspired by nuqs implementation\n */\n\ntype Listener = (searchParams: URLSearchParams) => void;\nexport type KeyUpdate = { state: any; query: string | null; source?: object };\ntype KeyListener = (payload: KeyUpdate) => void;\n\nclass Emitter {\n private listeners: Map<string, Set<Listener>> = new Map();\n private keyListeners: Map<string, Set<KeyListener>> = new Map();\n\n /**\n * Emit a global update event (all hooks should sync)\n */\n emitUpdate(searchParams: URLSearchParams): void {\n const listeners = this.listeners.get(\"update\") || new Set();\n listeners.forEach((listener) => listener(searchParams));\n }\n\n /**\n * Emit a key-specific update (for cross-hook sync)\n */\n emitKey(key: string, payload: KeyUpdate): void {\n const listeners = this.keyListeners.get(key) || new Set();\n listeners.forEach((listener) => listener(payload));\n }\n\n /**\n * Subscribe to global updates\n */\n on(event: \"update\", listener: Listener): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n }\n\n /**\n * Subscribe to key-specific updates\n */\n onKey(key: string, listener: KeyListener): void {\n if (!this.keyListeners.has(key)) {\n this.keyListeners.set(key, new Set());\n }\n this.keyListeners.get(key)!.add(listener);\n }\n\n /**\n * Unsubscribe from global updates\n */\n off(event: \"update\", listener: Listener): void {\n const listeners = this.listeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * Unsubscribe from key-specific updates\n */\n offKey(key: string, listener: KeyListener): void {\n const listeners = this.keyListeners.get(key);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n}\n\nexport const emitter = new Emitter();\n"],"mappings":"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","names":["knownNext","applyChange"]}
|