@farm.js/core 0.1.0-beta.97 → 0.1.0-beta.99
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.map +1 -0
- package/dist/agent-runtime.cjs +7 -3
- package/dist/agent-runtime.cjs.map +1 -0
- package/dist/agent-runtime.d.mts +2 -2
- package/dist/agent-runtime.d.ts +2 -2
- package/dist/agent-runtime.mjs +2 -1
- package/dist/agent-runtime.mjs.map +1 -1
- package/dist/api/route-manager.cjs.map +1 -0
- package/dist/api/route-manager.d.mts +2 -2
- package/dist/api/route-manager.d.ts +2 -2
- package/dist/api/runtime.cjs.map +1 -0
- package/dist/api.cjs +26 -1
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.mts +3 -3
- package/dist/api.d.ts +3 -3
- package/dist/api.mjs +2 -2
- package/dist/{app-CIOx3LvY.d.ts → app-CGjrKNoN.d.ts} +4 -4
- package/dist/{app-DBd6437H.d.mts → app-DOcLs_iq.d.mts} +4 -4
- package/dist/app-markdown.cjs +21 -0
- package/dist/app-markdown.cjs.map +1 -0
- package/dist/app-markdown.d.mts +19 -4
- package/dist/app-markdown.d.ts +19 -4
- package/dist/app-markdown.mjs +7 -1
- package/dist/cache.cjs.map +1 -0
- package/dist/{chunk-VMCHLH3Y.mjs → chunk-26BCDVJS.mjs} +19 -1
- package/dist/chunk-26BCDVJS.mjs.map +1 -0
- package/dist/{chunk-FP5Q67FO.mjs → chunk-2HYYZCCI.mjs} +308 -19
- package/dist/chunk-2HYYZCCI.mjs.map +1 -0
- package/dist/{chunk-WKDAA6V2.mjs → chunk-3BTAMIQE.mjs} +100 -41
- package/dist/chunk-3BTAMIQE.mjs.map +1 -0
- package/dist/{chunk-WD2EBM3I.mjs → chunk-3CQJV3NC.mjs} +2 -2
- package/dist/{chunk-I3OOUWO5.mjs → chunk-3GDRV7SG.mjs} +2 -2
- package/dist/{chunk-YIBV77KZ.mjs → chunk-4WLAVHCY.mjs} +2 -2
- package/dist/{chunk-KDP5ZSWP.mjs → chunk-7PS5NKOM.mjs} +26 -11
- package/dist/chunk-7PS5NKOM.mjs.map +1 -0
- package/dist/{chunk-X4SFHKFH.mjs → chunk-BU65A3LZ.mjs} +10 -6
- package/dist/chunk-BU65A3LZ.mjs.map +1 -0
- package/dist/{chunk-WMJGA32P.mjs → chunk-BXVOHG6B.mjs} +27 -2
- package/dist/{chunk-WMJGA32P.mjs.map → chunk-BXVOHG6B.mjs.map} +1 -1
- package/dist/{chunk-BZAIS65C.mjs → chunk-DIHNOVZZ.mjs} +40 -13
- package/dist/chunk-DIHNOVZZ.mjs.map +1 -0
- package/dist/{chunk-ISSFLGJ5.mjs → chunk-FDWECN3W.mjs} +8 -4
- package/dist/chunk-FDWECN3W.mjs.map +1 -0
- package/dist/chunk-FDWXXTWR.mjs +114 -0
- package/dist/chunk-FDWXXTWR.mjs.map +1 -0
- package/dist/{chunk-FSIXEIOB.mjs → chunk-L7FSTPGS.mjs} +2 -2
- package/dist/{chunk-J3MPQ4MQ.mjs → chunk-LG4XB6RN.mjs} +2 -2
- package/dist/{chunk-J3MPQ4MQ.mjs.map → chunk-LG4XB6RN.mjs.map} +1 -1
- package/dist/{chunk-AAC66ILR.mjs → chunk-LXXG3K2Y.mjs} +61 -2
- package/dist/chunk-LXXG3K2Y.mjs.map +1 -0
- package/dist/{chunk-GJ7W6LNK.mjs → chunk-N5RK4LK6.mjs} +3 -3
- package/dist/{chunk-D7F7YZ7L.mjs → chunk-NCVFPT67.mjs} +100 -40
- package/dist/{chunk-D7F7YZ7L.mjs.map → chunk-NCVFPT67.mjs.map} +1 -1
- package/dist/{chunk-UMUWR5XA.mjs → chunk-PURU7FXR.mjs} +2 -2
- package/dist/{chunk-2SKCXYLB.mjs → chunk-QQCCBMTH.mjs} +60 -6
- package/dist/chunk-QQCCBMTH.mjs.map +1 -0
- package/dist/chunk-RKUPOYQV.mjs +28 -0
- package/dist/chunk-RKUPOYQV.mjs.map +1 -0
- package/dist/{chunk-52BR7LTX.mjs → chunk-STSPSJUI.mjs} +3 -3
- package/dist/{chunk-EPDIF432.mjs → chunk-UOGX6UNO.mjs} +37 -17
- package/dist/chunk-UOGX6UNO.mjs.map +1 -0
- package/dist/{chunk-IZBX2TEU.mjs → chunk-VQG3QWWK.mjs} +2 -2
- package/dist/{chunk-35NPLKQJ.mjs → chunk-XWM2C267.mjs} +21 -105
- package/dist/chunk-XWM2C267.mjs.map +1 -0
- package/dist/{chunk-7ZVN3YZI.mjs → chunk-Z5ARESQG.mjs} +43 -1
- package/dist/chunk-Z5ARESQG.mjs.map +1 -0
- package/dist/client/lifecycle.cjs.map +1 -0
- package/dist/client/lifecycle.mjs +2 -2
- package/dist/{client-plugins-B6-07YmP.d.mts → client-plugins-BqtHoJ9C.d.mts} +91 -3
- package/dist/{client-plugins-By6MVUX-.d.ts → client-plugins-DYprkCKN.d.ts} +91 -3
- package/dist/client-plugins.cjs +1 -1
- package/dist/client-plugins.cjs.map +1 -0
- package/dist/client-plugins.d.mts +2 -2
- package/dist/client-plugins.d.ts +2 -2
- package/dist/client-plugins.mjs +2 -2
- package/dist/client.cjs +61 -16
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.mts +5 -5
- package/dist/client.d.ts +5 -5
- package/dist/client.mjs +7 -7
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.mts +2 -2
- package/dist/config.d.ts +2 -2
- package/dist/cron.cjs +48 -12
- package/dist/cron.cjs.map +1 -0
- package/dist/cron.mjs +2 -1
- package/dist/deferred.cjs.map +1 -0
- package/dist/deployment.cjs.map +1 -0
- package/dist/{devtools-XWZX6CCL.mjs → devtools-24N3U5IG.mjs} +9 -7
- package/dist/{devtools-XWZX6CCL.mjs.map → devtools-24N3U5IG.mjs.map} +1 -1
- package/dist/docs.cjs +7 -3
- package/dist/docs.cjs.map +1 -0
- package/dist/docs.mjs +9 -7
- package/dist/env-types.cjs.map +1 -0
- package/dist/env.cjs.map +1 -0
- package/dist/environment/vite.cjs.map +1 -0
- package/dist/environment.cjs.map +1 -0
- package/dist/font.cjs.map +1 -0
- package/dist/headers.cjs.map +1 -0
- package/dist/i18n/client.cjs.map +1 -0
- package/dist/i18n/index.cjs.map +1 -0
- package/dist/i18n/server.cjs.map +1 -0
- package/dist/image/server.cjs +99 -40
- package/dist/image/server.cjs.map +1 -0
- package/dist/image/server.d.mts +6 -0
- package/dist/image/server.d.ts +6 -0
- package/dist/image/server.mjs +1 -1
- package/dist/image/sharp.cjs +1 -0
- package/dist/image/sharp.cjs.map +1 -0
- package/dist/image/sharp.d.mts +1 -1
- package/dist/image/sharp.d.ts +1 -1
- package/dist/image/sharp.mjs +1 -1
- package/dist/image/sharp.mjs.map +1 -1
- package/dist/image.cjs.map +1 -0
- package/dist/index.cjs +943 -231
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.mjs +38 -24
- package/dist/index.mjs.map +1 -1
- package/dist/instrumentation.cjs.map +1 -0
- package/dist/{integration-orm-LLW6WZNK.mjs → integration-orm-G5BPBT5X.mjs} +3 -3
- package/dist/integrations.cjs +168 -5
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.d.mts +2 -2
- package/dist/integrations.d.ts +2 -2
- package/dist/integrations.mjs +10 -3
- package/dist/internal/build-runtime.cjs +745 -139
- package/dist/internal/build-runtime.cjs.map +1 -0
- package/dist/internal/build-runtime.d.mts +4 -4
- package/dist/internal/build-runtime.d.ts +4 -4
- package/dist/internal/build-runtime.mjs +16 -14
- package/dist/internal/client-runtime.cjs +7 -2
- package/dist/internal/client-runtime.cjs.map +1 -0
- package/dist/internal/client-runtime.mjs +8 -3
- package/dist/internal/client-runtime.mjs.map +1 -1
- package/dist/internal/config-runtime.cjs +59 -42
- package/dist/internal/config-runtime.cjs.map +1 -0
- package/dist/internal/config-runtime.d.mts +3 -3
- package/dist/internal/config-runtime.d.ts +3 -3
- package/dist/internal/config-runtime.mjs +8 -6
- package/dist/internal/isolated-boundary.cjs.map +1 -0
- package/dist/internal/metadata-image-runtime.cjs.map +1 -0
- package/dist/internal/product-telemetry-runtime.cjs +52 -5
- package/dist/internal/product-telemetry-runtime.cjs.map +1 -0
- package/dist/internal/product-telemetry-runtime.d.mts +12 -1
- package/dist/internal/product-telemetry-runtime.d.ts +12 -1
- package/dist/internal/product-telemetry-runtime.mjs +50 -5
- package/dist/internal/product-telemetry-runtime.mjs.map +1 -1
- package/dist/internal/production-node-env.cjs.map +1 -0
- package/dist/internal/production-runtime.cjs +56 -10
- package/dist/internal/production-runtime.cjs.map +1 -0
- package/dist/internal/production-runtime.d.mts +8 -8
- package/dist/internal/production-runtime.d.ts +8 -8
- package/dist/internal/production-runtime.mjs +2 -2
- package/dist/markdown.cjs.map +1 -0
- package/dist/{metadata-route-8_V3UonT.d.ts → metadata-route-D2be_0kC.d.ts} +17 -2
- package/dist/{metadata-route-CWP_HjGU.d.mts → metadata-route-Dw5CrDIZ.d.mts} +17 -2
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.mts +4 -4
- package/dist/middleware.d.ts +4 -4
- package/dist/navigation.cjs.map +1 -0
- package/dist/{nitro-EGRNOB5P.mjs → nitro-YJEP3FWM.mjs} +4 -3
- package/dist/{nitro-EGRNOB5P.mjs.map → nitro-YJEP3FWM.mjs.map} +1 -1
- package/dist/observability.cjs.map +1 -0
- package/dist/plugin.cjs +599 -104
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.mts +2 -2
- package/dist/plugin.d.ts +2 -2
- package/dist/plugin.mjs +13 -11
- package/dist/{production-runtime-CdmzsDax.d.ts → production-runtime-CTqpD1C8.d.ts} +2 -2
- package/dist/{production-runtime-BGRH1dKG.d.mts → production-runtime-HNqNZd4D.d.mts} +2 -2
- package/dist/query/client.cjs.map +1 -0
- package/dist/query/index.cjs.map +1 -0
- package/dist/query/parsers.cjs.map +1 -0
- package/dist/query/server.cjs.map +1 -0
- package/dist/{render-plan-DLxJYAA5.d.mts → render-plan-COscpW-i.d.mts} +1 -1
- package/dist/{render-plan-0GeHiGVZ.d.ts → render-plan-Z4kSxaT_.d.ts} +1 -1
- package/dist/renderer/react/client.cjs.map +1 -0
- package/dist/renderer/react/server.cjs.map +1 -0
- package/dist/renderer/react/vite.cjs.map +1 -0
- package/dist/renderer-client.cjs +26 -1
- package/dist/renderer-client.cjs.map +1 -0
- package/dist/renderer-client.d.mts +4 -4
- package/dist/renderer-client.d.ts +4 -4
- package/dist/renderer-client.mjs +2 -2
- package/dist/renderer.cjs.map +1 -0
- package/dist/{request-BstWbZ6O.d.ts → request-BEDb2jE9.d.ts} +1 -1
- package/dist/{request-BCNXSXLh.d.mts → request-CbIAqJY9.d.mts} +1 -1
- package/dist/request.cjs.map +1 -0
- package/dist/request.d.mts +3 -3
- package/dist/request.d.ts +3 -3
- package/dist/router.cjs.map +1 -0
- package/dist/routes.cjs.map +1 -0
- package/dist/routes.d.mts +2 -2
- package/dist/routes.d.ts +2 -2
- package/dist/server-action-security.cjs +117 -104
- package/dist/server-action-security.cjs.map +1 -0
- package/dist/server-action-security.mjs +2 -1
- package/dist/server-fn-client.cjs.map +1 -0
- package/dist/server-fn.cjs.map +1 -0
- package/dist/server-fn.mjs +3 -2
- package/dist/server-plugins.cjs.map +1 -0
- package/dist/server-plugins.d.mts +3 -3
- package/dist/server-plugins.d.ts +3 -3
- package/dist/server-query-client.cjs +26 -1
- package/dist/server-query-client.cjs.map +1 -0
- package/dist/server-query-client.mjs +3 -3
- package/dist/server-query.cjs.map +1 -0
- package/dist/server-query.mjs +4 -3
- package/dist/server.cjs +686 -170
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.mts +8 -8
- package/dist/server.d.ts +8 -8
- package/dist/server.mjs +16 -14
- package/dist/server.mjs.map +1 -1
- package/dist/{spa-router-COgu4txb.d.ts → spa-router-CjeQites.d.ts} +1 -1
- package/dist/{spa-router-BeyAVSc6.d.mts → spa-router-FJbNou1a.d.mts} +1 -1
- package/dist/storage.cjs +7 -3
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.mjs +1 -1
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.mts +2 -2
- package/dist/testing.d.ts +2 -2
- package/dist/testing.mjs +2 -1
- package/dist/testing.mjs.map +1 -1
- package/dist/theme/client.cjs.map +1 -0
- package/dist/theme/index.cjs.map +1 -0
- package/dist/theme/runtime.cjs.map +1 -0
- package/dist/theme/server.cjs.map +1 -0
- package/dist/{utils-DL2VwDQl.d.mts → utils-BiMJv9Ys.d.mts} +1 -1
- package/dist/{utils-DkU2c_1B.d.ts → utils-BpnKRFv9.d.ts} +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -0
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +599 -104
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.mts +2 -2
- package/dist/vite.d.ts +2 -2
- package/dist/vite.mjs +13 -11
- package/dist/{workflows-ChyK_oTu.d.mts → workflows-BantWytQ.d.mts} +7 -0
- package/dist/{workflows-ChyK_oTu.d.ts → workflows-BantWytQ.d.ts} +7 -0
- package/dist/workflows.cjs +73 -5
- package/dist/workflows.cjs.map +1 -0
- package/dist/workflows.d.mts +1 -1
- package/dist/workflows.d.ts +1 -1
- package/dist/workflows.mjs +2 -1
- package/package.json +17 -17
- package/dist/chunk-2SKCXYLB.mjs.map +0 -1
- package/dist/chunk-35NPLKQJ.mjs.map +0 -1
- package/dist/chunk-7ZVN3YZI.mjs.map +0 -1
- package/dist/chunk-AAC66ILR.mjs.map +0 -1
- package/dist/chunk-BZAIS65C.mjs.map +0 -1
- package/dist/chunk-EPDIF432.mjs.map +0 -1
- package/dist/chunk-FP5Q67FO.mjs.map +0 -1
- package/dist/chunk-ISSFLGJ5.mjs.map +0 -1
- package/dist/chunk-KDP5ZSWP.mjs.map +0 -1
- package/dist/chunk-VMCHLH3Y.mjs.map +0 -1
- package/dist/chunk-WKDAA6V2.mjs.map +0 -1
- package/dist/chunk-X4SFHKFH.mjs.map +0 -1
- /package/dist/{chunk-WD2EBM3I.mjs.map → chunk-3CQJV3NC.mjs.map} +0 -0
- /package/dist/{chunk-I3OOUWO5.mjs.map → chunk-3GDRV7SG.mjs.map} +0 -0
- /package/dist/{chunk-YIBV77KZ.mjs.map → chunk-4WLAVHCY.mjs.map} +0 -0
- /package/dist/{chunk-FSIXEIOB.mjs.map → chunk-L7FSTPGS.mjs.map} +0 -0
- /package/dist/{chunk-GJ7W6LNK.mjs.map → chunk-N5RK4LK6.mjs.map} +0 -0
- /package/dist/{chunk-UMUWR5XA.mjs.map → chunk-PURU7FXR.mjs.map} +0 -0
- /package/dist/{chunk-52BR7LTX.mjs.map → chunk-STSPSJUI.mjs.map} +0 -0
- /package/dist/{chunk-IZBX2TEU.mjs.map → chunk-VQG3QWWK.mjs.map} +0 -0
- /package/dist/{integration-orm-LLW6WZNK.mjs.map → integration-orm-G5BPBT5X.mjs.map} +0 -0
package/dist/testing.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
|
-
import { n as FarmContextFactory, o as MiddlewareProps, g as PluginContextProps, h as RouteModule } from './client-plugins-
|
|
2
|
+
import { n as FarmContextFactory, o as MiddlewareProps, g as PluginContextProps, h as RouteModule } from './client-plugins-BqtHoJ9C.mjs';
|
|
3
3
|
import './types-CnH8DOqo.mjs';
|
|
4
4
|
import { a as APIRouteParams } from './route-pattern-W-SsJGSp.mjs';
|
|
5
5
|
import { ProgrammaticPageRoute, InferProgrammaticRouteData, ProgrammaticRouteComponentProps, ProgrammaticApiRoute } from './routes.mjs';
|
|
@@ -21,7 +21,7 @@ import './markdown.mjs';
|
|
|
21
21
|
import './observability.mjs';
|
|
22
22
|
import '@opentelemetry/api';
|
|
23
23
|
import 'vite';
|
|
24
|
-
import './workflows-
|
|
24
|
+
import './workflows-BantWytQ.mjs';
|
|
25
25
|
import './cron.mjs';
|
|
26
26
|
import './env.mjs';
|
|
27
27
|
import './navigation-errors-Dvwpzaer.mjs';
|
package/dist/testing.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
|
-
import { n as FarmContextFactory, o as MiddlewareProps, g as PluginContextProps, h as RouteModule } from './client-plugins-
|
|
2
|
+
import { n as FarmContextFactory, o as MiddlewareProps, g as PluginContextProps, h as RouteModule } from './client-plugins-DYprkCKN.js';
|
|
3
3
|
import './types-CnH8DOqo.js';
|
|
4
4
|
import { a as APIRouteParams } from './route-pattern-W-SsJGSp.js';
|
|
5
5
|
import { ProgrammaticPageRoute, InferProgrammaticRouteData, ProgrammaticRouteComponentProps, ProgrammaticApiRoute } from './routes.js';
|
|
@@ -21,7 +21,7 @@ import './markdown.js';
|
|
|
21
21
|
import './observability.js';
|
|
22
22
|
import '@opentelemetry/api';
|
|
23
23
|
import 'vite';
|
|
24
|
-
import './workflows-
|
|
24
|
+
import './workflows-BantWytQ.js';
|
|
25
25
|
import './cron.js';
|
|
26
26
|
import './env.js';
|
|
27
27
|
import './navigation-errors-Dvwpzaer.js';
|
package/dist/testing.mjs
CHANGED
|
@@ -7,11 +7,12 @@ import {
|
|
|
7
7
|
} from "./chunk-X5GRVT7B.mjs";
|
|
8
8
|
import {
|
|
9
9
|
runWithServerActionRequest
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-XWM2C267.mjs";
|
|
11
11
|
import {
|
|
12
12
|
resolveFarmRouteContext,
|
|
13
13
|
withFarmRouteContext
|
|
14
14
|
} from "./chunk-QKVUNGAH.mjs";
|
|
15
|
+
import "./chunk-FDWXXTWR.mjs";
|
|
15
16
|
import "./chunk-TT3E2JOF.mjs";
|
|
16
17
|
import "./chunk-NXV52RNX.mjs";
|
|
17
18
|
import "./chunk-TQTB33JS.mjs";
|
package/dist/testing.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/testing.ts"],"sourcesContent":["import { createElement, type ReactElement } from \"react\";\nimport { invokeAPIRouteEndpoint, matchAPIRoute, type APIRouteParams } from \"./api/route-manager\";\nimport { getFarmDataCache } from \"./cache\";\nimport { resolveFarmRouteContext, withFarmRouteContext } from \"./route-context\";\nimport {\n createRouteModuleFromProgrammaticPage,\n type InferProgrammaticRouteData,\n type ProgrammaticApiRoute,\n type ProgrammaticPageRoute,\n type ProgrammaticRouteComponentProps,\n type ProgrammaticRouteMethod,\n} from \"./routes\";\nimport {\n buildFarmRoutePath,\n matchFarmRoute,\n type FarmRouterPathParams,\n type FarmRouterQueryValue,\n} from \"./router\";\nimport { runWithServerActionRequest } from \"./server-action-security\";\nimport type { ServerFn } from \"./server-fn\";\nimport { searchParamsToObject } from \"./search-params\";\nimport type { FarmContextFactory, MiddlewareProps, PluginContextProps, RouteModule } from \"./types\";\n\nexport type FarmTestQuery = URLSearchParams | Record<string, FarmRouterQueryValue>;\nexport type FarmTestPathParams = FarmRouterPathParams;\nexport type FarmTestFormValues = Record<string, FormDataEntryValue | readonly FormDataEntryValue[]>;\n\nexport interface FarmTestRequestOptions extends Omit<RequestInit, \"body\" | \"headers\"> {\n origin?: string;\n headers?: HeadersInit;\n query?: FarmTestQuery;\n cookies?: Record<string, string>;\n json?: unknown;\n form?: FormData | FarmTestFormValues;\n body?: BodyInit | null;\n}\n\nexport interface FarmTestHarnessOptions<TContext = unknown> {\n origin?: string;\n headers?: HeadersInit;\n cookies?: Record<string, string>;\n context?: FarmContextFactory<TContext>;\n}\n\ntype AnyProgrammaticPageRoute = ProgrammaticPageRoute<any, any, any, any>;\n\nexport type InferFarmTestRouteParams<TRoute> =\n TRoute extends ProgrammaticPageRoute<infer TParams, any, any, any> ? TParams : never;\n\nexport type InferFarmTestRouteSearch<TRoute> =\n TRoute extends ProgrammaticPageRoute<any, infer TSearch, any, any> ? TSearch : never;\n\nexport type InferFarmTestRouteData<TRoute> =\n TRoute extends ProgrammaticPageRoute<any, any, infer TDataHooks, any>\n ? InferProgrammaticRouteData<TDataHooks>\n : never;\n\nexport type FarmTestRouteProps<TRoute extends AnyProgrammaticPageRoute> =\n ProgrammaticRouteComponentProps<\n InferFarmTestRouteParams<TRoute>,\n InferFarmTestRouteSearch<TRoute>,\n InferFarmTestRouteData<TRoute>\n >;\n\ntype FarmTestRouteParamsInput<TRoute> =\n InferFarmTestRouteParams<TRoute> extends Record<string, unknown>\n ? Partial<InferFarmTestRouteParams<TRoute>>\n : FarmTestPathParams;\n\ntype FarmTestRouteSearchInput<TRoute> =\n InferFarmTestRouteSearch<TRoute> extends Record<string, unknown>\n ? Partial<InferFarmTestRouteSearch<TRoute>> | URLSearchParams\n : FarmTestQuery;\n\nexport interface FarmTestRouteOptions<\n TRoute extends AnyProgrammaticPageRoute,\n TContext = unknown,\n> extends Pick<FarmTestRequestOptions, \"origin\" | \"headers\" | \"cookies\" | \"signal\"> {\n path?: string | URL;\n params?: FarmTestRouteParamsInput<TRoute>;\n search?: FarmTestRouteSearchInput<TRoute>;\n context?: TContext;\n middleware?: MiddlewareProps;\n pluginContext?: PluginContextProps;\n}\n\nexport interface FarmTestRouteResult<TRoute extends AnyProgrammaticPageRoute> {\n route: TRoute;\n module: RouteModule;\n request: Request;\n props: FarmTestRouteProps<TRoute>;\n element: ReactElement;\n canonicalPath?: string;\n}\n\nexport interface FarmTestApiOptions extends FarmTestRequestOptions {\n path?: string | URL;\n params?: FarmTestPathParams;\n throwOnError?: boolean;\n}\n\nexport interface FarmTestEndpointOptions extends FarmTestRequestOptions {\n path?: string | URL;\n params?: APIRouteParams;\n throwOnError?: boolean;\n}\n\nexport interface FarmTestServerFnOptions extends Pick<\n FarmTestRequestOptions,\n \"origin\" | \"headers\" | \"cookies\" | \"signal\"\n> {\n path?: string | URL;\n request?: Request;\n}\n\nexport type FarmTestServerFnArguments<TInput> = [unknown] extends [TInput]\n ? [input?: TInput | FormData, options?: FarmTestServerFnOptions]\n : [input: TInput | FormData, options?: FarmTestServerFnOptions];\n\nexport interface FarmTestHarness<TContext = unknown> {\n request(path?: string | URL, options?: FarmTestRequestOptions): Request;\n route<TRoute extends AnyProgrammaticPageRoute>(\n route: TRoute,\n options?: FarmTestRouteOptions<TRoute, TContext>,\n ): Promise<FarmTestRouteResult<TRoute>>;\n api(route: ProgrammaticApiRoute, options?: FarmTestApiOptions): Promise<Response>;\n endpoint(endpoint: unknown, options?: FarmTestEndpointOptions): Promise<Response>;\n serverFn<TInput, TResult>(\n serverFn: ServerFn<TInput, TResult>,\n ...args: FarmTestServerFnArguments<TInput>\n ): Promise<TResult>;\n clearCache(): void;\n}\n\n/** Create a deterministic Web Request without depending on a test runner. */\nexport function createTestRequest(\n path: string | URL = \"/\",\n options: FarmTestRequestOptions = {},\n): Request {\n const url = resolveTestURL(path, options.origin);\n applyQuery(url.searchParams, options.query);\n\n const headers = new Headers(options.headers);\n applyCookies(headers, options.cookies);\n const { body, hasBody } = resolveRequestBody(options, headers);\n const method = (options.method ?? (hasBody ? \"POST\" : \"GET\")).toUpperCase();\n\n if ((method === \"GET\" || method === \"HEAD\") && body != null) {\n throw new TypeError(`Farm test requests cannot send a body with ${method}`);\n }\n\n const {\n origin: _origin,\n query: _query,\n cookies: _cookies,\n json: _json,\n form: _form,\n body: _body,\n headers: _headers,\n ...requestInit\n } = options;\n\n return new Request(url, {\n ...requestInit,\n method,\n headers,\n body,\n });\n}\n\n/**\n * Create test helpers that exercise Farm's real route, API, and server-function runtimes.\n * The harness has no dependency on Vitest, Jest, or a DOM environment.\n */\nexport function createFarmTestHarness<TContext = unknown>(\n options: FarmTestHarnessOptions<TContext> = {},\n): FarmTestHarness<TContext> {\n const origin = normalizeOrigin(options.origin);\n\n const request = (path: string | URL = \"/\", requestOptions: FarmTestRequestOptions = {}) =>\n createTestRequest(path, mergeRequestDefaults(options, origin, requestOptions));\n\n return {\n request,\n\n async route<TRoute extends AnyProgrammaticPageRoute>(\n route: TRoute,\n routeOptions: FarmTestRouteOptions<TRoute, TContext> = {},\n ): Promise<FarmTestRouteResult<TRoute>> {\n const requestPath =\n routeOptions.path ??\n buildFarmRoutePath(route.path, (routeOptions.params ?? {}) as FarmRouterPathParams);\n const routeRequest = request(requestPath, {\n origin: routeOptions.origin,\n headers: routeOptions.headers,\n cookies: routeOptions.cookies,\n signal: routeOptions.signal,\n query: routeOptions.search as FarmTestQuery | undefined,\n });\n const url = new URL(routeRequest.url);\n const params = resolvePageParams(route.path, url.pathname, routeOptions.params);\n const search = searchParamsToObject(url.searchParams);\n const routeContext = Object.prototype.hasOwnProperty.call(routeOptions, \"context\")\n ? routeOptions.context\n : await resolveFarmRouteContext(\n { context: options.context },\n {\n request: routeRequest,\n params,\n search,\n path: url.pathname,\n },\n );\n const rawProps = withFarmRouteContext(\n {\n params,\n searchParams: Promise.resolve(search),\n path: url.pathname,\n middleware: routeOptions.middleware,\n context: routeOptions.pluginContext,\n },\n routeContext,\n );\n const routeModule = createRouteModuleFromProgrammaticPage(route);\n const resolveProps = (\n routeModule as RouteModule & {\n __farmResolveRouteProps?: (props: typeof rawProps) => Promise<Record<string, unknown>>;\n }\n ).__farmResolveRouteProps;\n const resolvedProps = resolveProps\n ? await resolveProps(rawProps)\n : { ...rawProps, search, searchParams: Promise.resolve(search) };\n const canonicalPath = readCanonicalPath(resolvedProps);\n const componentProps = stripInternalRouteProps(resolvedProps) as FarmTestRouteProps<TRoute>;\n\n return {\n route,\n module: routeModule,\n request: routeRequest,\n props: componentProps,\n element: createElement(route.component, componentProps),\n canonicalPath,\n };\n },\n\n async api(route, apiOptions = {}) {\n const requestPath =\n apiOptions.path ?? buildFarmRoutePath(route.path, apiOptions.params ?? {});\n const method = apiOptions.method ?? getDefaultApiMethod(route);\n const apiRequest = request(requestPath, omitApiControlOptions({ ...apiOptions, method }));\n const match = matchAPIRoute(new Map([[route.path, route]]), new URL(apiRequest.url).pathname);\n\n if (!match) {\n return jsonErrorResponse(\"Not Found\", 404);\n }\n\n const endpoint = match.route.methods[apiRequest.method as ProgrammaticRouteMethod];\n if (!endpoint) {\n return jsonErrorResponse(\"Method Not Allowed\", 405);\n }\n\n return invokeTestEndpoint(endpoint, apiRequest, match.params, apiOptions.throwOnError);\n },\n\n async endpoint(endpoint, endpointOptions = {}) {\n const endpointRecord = endpoint as { __method?: string; __path?: string };\n const endpointPath = endpointOptions.path ?? endpointRecord.__path ?? \"/__farm/test/endpoint\";\n const endpointRequest = request(endpointPath, {\n ...omitEndpointControlOptions(endpointOptions),\n method: endpointOptions.method ?? endpointRecord.__method ?? \"GET\",\n });\n\n return invokeTestEndpoint(\n endpoint,\n endpointRequest,\n endpointOptions.params,\n endpointOptions.throwOnError,\n );\n },\n\n async serverFn<TInput, TResult>(\n serverFn: ServerFn<TInput, TResult>,\n ...args: FarmTestServerFnArguments<TInput>\n ): Promise<TResult> {\n const [input, serverFnOptions = {}] = args;\n const actionRequest =\n serverFnOptions.request ??\n request(serverFnOptions.path ?? \"/__farm/test/server-fn\", {\n origin: serverFnOptions.origin,\n headers: serverFnOptions.headers,\n cookies: serverFnOptions.cookies,\n signal: serverFnOptions.signal,\n method: \"POST\",\n });\n\n return await runWithServerActionRequest(actionRequest, () => serverFn(input as TInput));\n },\n\n clearCache() {\n getFarmDataCache().clear();\n },\n };\n}\n\nfunction resolveTestURL(path: string | URL, origin: string | undefined): URL {\n const url = path instanceof URL ? new URL(path) : new URL(path, `${normalizeOrigin(origin)}/`);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(`Farm test requests require an HTTP(S) URL, received ${url.protocol}`);\n }\n return url;\n}\n\nfunction normalizeOrigin(origin = \"http://farm.test\"): string {\n let url: URL;\n try {\n url = new URL(origin);\n } catch {\n throw new TypeError(`Invalid Farm test origin: ${JSON.stringify(origin)}`);\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(`Farm test origins must use HTTP(S), received ${url.protocol}`);\n }\n\n return url.origin;\n}\n\nfunction mergeRequestDefaults<TContext>(\n harnessOptions: FarmTestHarnessOptions<TContext>,\n origin: string,\n requestOptions: FarmTestRequestOptions,\n): FarmTestRequestOptions {\n const headers = new Headers(harnessOptions.headers);\n new Headers(requestOptions.headers).forEach((value, key) => headers.set(key, value));\n\n return {\n ...requestOptions,\n origin: requestOptions.origin ?? origin,\n headers,\n cookies: {\n ...harnessOptions.cookies,\n ...requestOptions.cookies,\n },\n };\n}\n\nfunction applyQuery(searchParams: URLSearchParams, query: FarmTestQuery | undefined): void {\n if (!query) return;\n\n if (query instanceof URLSearchParams) {\n for (const key of new Set(query.keys())) {\n searchParams.delete(key);\n for (const value of query.getAll(key)) searchParams.append(key, value);\n }\n return;\n }\n\n for (const [key, rawValue] of Object.entries(query)) {\n searchParams.delete(key);\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n for (const value of values) {\n if (value == null) continue;\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n throw new TypeError(`Invalid query value for ${JSON.stringify(key)}`);\n }\n searchParams.append(key, String(value));\n }\n }\n}\n\nfunction applyCookies(headers: Headers, cookies: Record<string, string> | undefined): void {\n if (!cookies || Object.keys(cookies).length === 0) return;\n\n const value = Object.entries(cookies)\n .map(([name, cookieValue]) => `${encodeURIComponent(name)}=${encodeURIComponent(cookieValue)}`)\n .join(\"; \");\n const current = headers.get(\"cookie\");\n headers.set(\"cookie\", current ? `${current}; ${value}` : value);\n}\n\nfunction resolveRequestBody(\n options: FarmTestRequestOptions,\n headers: Headers,\n): { body: BodyInit | null; hasBody: boolean } {\n const sources = [\n options.json !== undefined,\n options.form !== undefined,\n options.body !== undefined,\n ];\n if (sources.filter(Boolean).length > 1) {\n throw new TypeError(\"Farm test requests accept only one of json, form, or body\");\n }\n\n if (options.json !== undefined) {\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n return { body: JSON.stringify(options.json), hasBody: true };\n }\n\n if (options.form !== undefined) {\n const formData = options.form instanceof FormData ? options.form : createFormData(options.form);\n return { body: formData, hasBody: true };\n }\n\n return {\n body: options.body ?? null,\n hasBody: options.body !== undefined,\n };\n}\n\nfunction createFormData(values: FarmTestFormValues): FormData {\n const formData = new FormData();\n for (const [key, rawValue] of Object.entries(values)) {\n const entries = Array.isArray(rawValue) ? rawValue : [rawValue];\n for (const value of entries) formData.append(key, value);\n }\n return formData;\n}\n\nfunction resolvePageParams(\n pattern: string,\n pathname: string,\n explicitParams: Record<string, unknown> | undefined,\n): Record<string, string> {\n const matchedParams = matchFarmRoute(pattern, pathname);\n if (!matchedParams) {\n throw new Error(\n `Path ${JSON.stringify(pathname)} does not match route ${JSON.stringify(pattern)}`,\n );\n }\n\n if (!explicitParams) return matchedParams;\n\n return Object.fromEntries(\n Object.entries(explicitParams).map(([key, value]) => [\n key,\n Array.isArray(value) ? value.map(String).join(\"/\") : String(value),\n ]),\n );\n}\n\nfunction readCanonicalPath(props: Record<string, unknown>): string | undefined {\n return typeof props.__farmCanonicalPath === \"string\" ? props.__farmCanonicalPath : undefined;\n}\n\nfunction stripInternalRouteProps(props: Record<string, unknown>): Record<string, unknown> {\n const { __farmRoutePropsResolved, __farmCanonicalPath, ...componentProps } = props;\n return componentProps;\n}\n\nfunction getDefaultApiMethod(route: ProgrammaticApiRoute): ProgrammaticRouteMethod {\n if (route.methods.GET) return \"GET\";\n return (Object.keys(route.methods)[0] as ProgrammaticRouteMethod | undefined) ?? \"GET\";\n}\n\nfunction omitApiControlOptions(options: FarmTestApiOptions): FarmTestRequestOptions {\n const { path: _path, params: _params, throwOnError: _throwOnError, ...requestOptions } = options;\n return requestOptions;\n}\n\nfunction omitEndpointControlOptions(options: FarmTestEndpointOptions): FarmTestRequestOptions {\n const { path: _path, params: _params, throwOnError: _throwOnError, ...requestOptions } = options;\n return requestOptions;\n}\n\nasync function invokeTestEndpoint(\n endpoint: unknown,\n request: Request,\n params: APIRouteParams = {},\n throwOnError = false,\n): Promise<Response> {\n try {\n return await invokeAPIRouteEndpoint(endpoint, request, params);\n } catch (error) {\n if (throwOnError) throw error;\n return jsonErrorResponse(error instanceof Error ? error.message : \"Internal Server Error\", 500);\n }\n}\n\nfunction jsonErrorResponse(error: string, status: number): Response {\n return Response.json({ error }, { status });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/testing.ts"],"sourcesContent":["import { createElement, type ReactElement } from \"react\";\nimport { invokeAPIRouteEndpoint, matchAPIRoute, type APIRouteParams } from \"./api/route-manager\";\nimport { getFarmDataCache } from \"./cache\";\nimport { resolveFarmRouteContext, withFarmRouteContext } from \"./route-context\";\nimport {\n createRouteModuleFromProgrammaticPage,\n type InferProgrammaticRouteData,\n type ProgrammaticApiRoute,\n type ProgrammaticPageRoute,\n type ProgrammaticRouteComponentProps,\n type ProgrammaticRouteMethod,\n} from \"./routes\";\nimport {\n buildFarmRoutePath,\n matchFarmRoute,\n type FarmRouterPathParams,\n type FarmRouterQueryValue,\n} from \"./router\";\nimport { runWithServerActionRequest } from \"./server-action-security\";\nimport type { ServerFn } from \"./server-fn\";\nimport { searchParamsToObject } from \"./search-params\";\nimport type { FarmContextFactory, MiddlewareProps, PluginContextProps, RouteModule } from \"./types\";\n\nexport type FarmTestQuery = URLSearchParams | Record<string, FarmRouterQueryValue>;\nexport type FarmTestPathParams = FarmRouterPathParams;\nexport type FarmTestFormValues = Record<string, FormDataEntryValue | readonly FormDataEntryValue[]>;\n\nexport interface FarmTestRequestOptions extends Omit<RequestInit, \"body\" | \"headers\"> {\n origin?: string;\n headers?: HeadersInit;\n query?: FarmTestQuery;\n cookies?: Record<string, string>;\n json?: unknown;\n form?: FormData | FarmTestFormValues;\n body?: BodyInit | null;\n}\n\nexport interface FarmTestHarnessOptions<TContext = unknown> {\n origin?: string;\n headers?: HeadersInit;\n cookies?: Record<string, string>;\n context?: FarmContextFactory<TContext>;\n}\n\ntype AnyProgrammaticPageRoute = ProgrammaticPageRoute<any, any, any, any>;\n\nexport type InferFarmTestRouteParams<TRoute> =\n TRoute extends ProgrammaticPageRoute<infer TParams, any, any, any> ? TParams : never;\n\nexport type InferFarmTestRouteSearch<TRoute> =\n TRoute extends ProgrammaticPageRoute<any, infer TSearch, any, any> ? TSearch : never;\n\nexport type InferFarmTestRouteData<TRoute> =\n TRoute extends ProgrammaticPageRoute<any, any, infer TDataHooks, any>\n ? InferProgrammaticRouteData<TDataHooks>\n : never;\n\nexport type FarmTestRouteProps<TRoute extends AnyProgrammaticPageRoute> =\n ProgrammaticRouteComponentProps<\n InferFarmTestRouteParams<TRoute>,\n InferFarmTestRouteSearch<TRoute>,\n InferFarmTestRouteData<TRoute>\n >;\n\ntype FarmTestRouteParamsInput<TRoute> =\n InferFarmTestRouteParams<TRoute> extends Record<string, unknown>\n ? Partial<InferFarmTestRouteParams<TRoute>>\n : FarmTestPathParams;\n\ntype FarmTestRouteSearchInput<TRoute> =\n InferFarmTestRouteSearch<TRoute> extends Record<string, unknown>\n ? Partial<InferFarmTestRouteSearch<TRoute>> | URLSearchParams\n : FarmTestQuery;\n\nexport interface FarmTestRouteOptions<\n TRoute extends AnyProgrammaticPageRoute,\n TContext = unknown,\n> extends Pick<FarmTestRequestOptions, \"origin\" | \"headers\" | \"cookies\" | \"signal\"> {\n path?: string | URL;\n params?: FarmTestRouteParamsInput<TRoute>;\n search?: FarmTestRouteSearchInput<TRoute>;\n context?: TContext;\n middleware?: MiddlewareProps;\n pluginContext?: PluginContextProps;\n}\n\nexport interface FarmTestRouteResult<TRoute extends AnyProgrammaticPageRoute> {\n route: TRoute;\n module: RouteModule;\n request: Request;\n props: FarmTestRouteProps<TRoute>;\n element: ReactElement;\n canonicalPath?: string;\n}\n\nexport interface FarmTestApiOptions extends FarmTestRequestOptions {\n path?: string | URL;\n params?: FarmTestPathParams;\n throwOnError?: boolean;\n}\n\nexport interface FarmTestEndpointOptions extends FarmTestRequestOptions {\n path?: string | URL;\n params?: APIRouteParams;\n throwOnError?: boolean;\n}\n\nexport interface FarmTestServerFnOptions extends Pick<\n FarmTestRequestOptions,\n \"origin\" | \"headers\" | \"cookies\" | \"signal\"\n> {\n path?: string | URL;\n request?: Request;\n}\n\nexport type FarmTestServerFnArguments<TInput> = [unknown] extends [TInput]\n ? [input?: TInput | FormData, options?: FarmTestServerFnOptions]\n : [input: TInput | FormData, options?: FarmTestServerFnOptions];\n\nexport interface FarmTestHarness<TContext = unknown> {\n request(path?: string | URL, options?: FarmTestRequestOptions): Request;\n route<TRoute extends AnyProgrammaticPageRoute>(\n route: TRoute,\n options?: FarmTestRouteOptions<TRoute, TContext>,\n ): Promise<FarmTestRouteResult<TRoute>>;\n api(route: ProgrammaticApiRoute, options?: FarmTestApiOptions): Promise<Response>;\n endpoint(endpoint: unknown, options?: FarmTestEndpointOptions): Promise<Response>;\n serverFn<TInput, TResult>(\n serverFn: ServerFn<TInput, TResult>,\n ...args: FarmTestServerFnArguments<TInput>\n ): Promise<TResult>;\n clearCache(): void;\n}\n\n/** Create a deterministic Web Request without depending on a test runner. */\nexport function createTestRequest(\n path: string | URL = \"/\",\n options: FarmTestRequestOptions = {},\n): Request {\n const url = resolveTestURL(path, options.origin);\n applyQuery(url.searchParams, options.query);\n\n const headers = new Headers(options.headers);\n applyCookies(headers, options.cookies);\n const { body, hasBody } = resolveRequestBody(options, headers);\n const method = (options.method ?? (hasBody ? \"POST\" : \"GET\")).toUpperCase();\n\n if ((method === \"GET\" || method === \"HEAD\") && body != null) {\n throw new TypeError(`Farm test requests cannot send a body with ${method}`);\n }\n\n const {\n origin: _origin,\n query: _query,\n cookies: _cookies,\n json: _json,\n form: _form,\n body: _body,\n headers: _headers,\n ...requestInit\n } = options;\n\n return new Request(url, {\n ...requestInit,\n method,\n headers,\n body,\n });\n}\n\n/**\n * Create test helpers that exercise Farm's real route, API, and server-function runtimes.\n * The harness has no dependency on Vitest, Jest, or a DOM environment.\n */\nexport function createFarmTestHarness<TContext = unknown>(\n options: FarmTestHarnessOptions<TContext> = {},\n): FarmTestHarness<TContext> {\n const origin = normalizeOrigin(options.origin);\n\n const request = (path: string | URL = \"/\", requestOptions: FarmTestRequestOptions = {}) =>\n createTestRequest(path, mergeRequestDefaults(options, origin, requestOptions));\n\n return {\n request,\n\n async route<TRoute extends AnyProgrammaticPageRoute>(\n route: TRoute,\n routeOptions: FarmTestRouteOptions<TRoute, TContext> = {},\n ): Promise<FarmTestRouteResult<TRoute>> {\n const requestPath =\n routeOptions.path ??\n buildFarmRoutePath(route.path, (routeOptions.params ?? {}) as FarmRouterPathParams);\n const routeRequest = request(requestPath, {\n origin: routeOptions.origin,\n headers: routeOptions.headers,\n cookies: routeOptions.cookies,\n signal: routeOptions.signal,\n query: routeOptions.search as FarmTestQuery | undefined,\n });\n const url = new URL(routeRequest.url);\n const params = resolvePageParams(route.path, url.pathname, routeOptions.params);\n const search = searchParamsToObject(url.searchParams);\n const routeContext = Object.prototype.hasOwnProperty.call(routeOptions, \"context\")\n ? routeOptions.context\n : await resolveFarmRouteContext(\n { context: options.context },\n {\n request: routeRequest,\n params,\n search,\n path: url.pathname,\n },\n );\n const rawProps = withFarmRouteContext(\n {\n params,\n searchParams: Promise.resolve(search),\n path: url.pathname,\n middleware: routeOptions.middleware,\n context: routeOptions.pluginContext,\n },\n routeContext,\n );\n const routeModule = createRouteModuleFromProgrammaticPage(route);\n const resolveProps = (\n routeModule as RouteModule & {\n __farmResolveRouteProps?: (props: typeof rawProps) => Promise<Record<string, unknown>>;\n }\n ).__farmResolveRouteProps;\n const resolvedProps = resolveProps\n ? await resolveProps(rawProps)\n : { ...rawProps, search, searchParams: Promise.resolve(search) };\n const canonicalPath = readCanonicalPath(resolvedProps);\n const componentProps = stripInternalRouteProps(resolvedProps) as FarmTestRouteProps<TRoute>;\n\n return {\n route,\n module: routeModule,\n request: routeRequest,\n props: componentProps,\n element: createElement(route.component, componentProps),\n canonicalPath,\n };\n },\n\n async api(route, apiOptions = {}) {\n const requestPath =\n apiOptions.path ?? buildFarmRoutePath(route.path, apiOptions.params ?? {});\n const method = apiOptions.method ?? getDefaultApiMethod(route);\n const apiRequest = request(requestPath, omitApiControlOptions({ ...apiOptions, method }));\n const match = matchAPIRoute(new Map([[route.path, route]]), new URL(apiRequest.url).pathname);\n\n if (!match) {\n return jsonErrorResponse(\"Not Found\", 404);\n }\n\n const endpoint = match.route.methods[apiRequest.method as ProgrammaticRouteMethod];\n if (!endpoint) {\n return jsonErrorResponse(\"Method Not Allowed\", 405);\n }\n\n return invokeTestEndpoint(endpoint, apiRequest, match.params, apiOptions.throwOnError);\n },\n\n async endpoint(endpoint, endpointOptions = {}) {\n const endpointRecord = endpoint as { __method?: string; __path?: string };\n const endpointPath = endpointOptions.path ?? endpointRecord.__path ?? \"/__farm/test/endpoint\";\n const endpointRequest = request(endpointPath, {\n ...omitEndpointControlOptions(endpointOptions),\n method: endpointOptions.method ?? endpointRecord.__method ?? \"GET\",\n });\n\n return invokeTestEndpoint(\n endpoint,\n endpointRequest,\n endpointOptions.params,\n endpointOptions.throwOnError,\n );\n },\n\n async serverFn<TInput, TResult>(\n serverFn: ServerFn<TInput, TResult>,\n ...args: FarmTestServerFnArguments<TInput>\n ): Promise<TResult> {\n const [input, serverFnOptions = {}] = args;\n const actionRequest =\n serverFnOptions.request ??\n request(serverFnOptions.path ?? \"/__farm/test/server-fn\", {\n origin: serverFnOptions.origin,\n headers: serverFnOptions.headers,\n cookies: serverFnOptions.cookies,\n signal: serverFnOptions.signal,\n method: \"POST\",\n });\n\n return await runWithServerActionRequest(actionRequest, () => serverFn(input as TInput));\n },\n\n clearCache() {\n getFarmDataCache().clear();\n },\n };\n}\n\nfunction resolveTestURL(path: string | URL, origin: string | undefined): URL {\n const url = path instanceof URL ? new URL(path) : new URL(path, `${normalizeOrigin(origin)}/`);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(`Farm test requests require an HTTP(S) URL, received ${url.protocol}`);\n }\n return url;\n}\n\nfunction normalizeOrigin(origin = \"http://farm.test\"): string {\n let url: URL;\n try {\n url = new URL(origin);\n } catch {\n throw new TypeError(`Invalid Farm test origin: ${JSON.stringify(origin)}`);\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(`Farm test origins must use HTTP(S), received ${url.protocol}`);\n }\n\n return url.origin;\n}\n\nfunction mergeRequestDefaults<TContext>(\n harnessOptions: FarmTestHarnessOptions<TContext>,\n origin: string,\n requestOptions: FarmTestRequestOptions,\n): FarmTestRequestOptions {\n const headers = new Headers(harnessOptions.headers);\n new Headers(requestOptions.headers).forEach((value, key) => headers.set(key, value));\n\n return {\n ...requestOptions,\n origin: requestOptions.origin ?? origin,\n headers,\n cookies: {\n ...harnessOptions.cookies,\n ...requestOptions.cookies,\n },\n };\n}\n\nfunction applyQuery(searchParams: URLSearchParams, query: FarmTestQuery | undefined): void {\n if (!query) return;\n\n if (query instanceof URLSearchParams) {\n for (const key of new Set(query.keys())) {\n searchParams.delete(key);\n for (const value of query.getAll(key)) searchParams.append(key, value);\n }\n return;\n }\n\n for (const [key, rawValue] of Object.entries(query)) {\n searchParams.delete(key);\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n for (const value of values) {\n if (value == null) continue;\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n throw new TypeError(`Invalid query value for ${JSON.stringify(key)}`);\n }\n searchParams.append(key, String(value));\n }\n }\n}\n\nfunction applyCookies(headers: Headers, cookies: Record<string, string> | undefined): void {\n if (!cookies || Object.keys(cookies).length === 0) return;\n\n const value = Object.entries(cookies)\n .map(([name, cookieValue]) => `${encodeURIComponent(name)}=${encodeURIComponent(cookieValue)}`)\n .join(\"; \");\n const current = headers.get(\"cookie\");\n headers.set(\"cookie\", current ? `${current}; ${value}` : value);\n}\n\nfunction resolveRequestBody(\n options: FarmTestRequestOptions,\n headers: Headers,\n): { body: BodyInit | null; hasBody: boolean } {\n const sources = [\n options.json !== undefined,\n options.form !== undefined,\n options.body !== undefined,\n ];\n if (sources.filter(Boolean).length > 1) {\n throw new TypeError(\"Farm test requests accept only one of json, form, or body\");\n }\n\n if (options.json !== undefined) {\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n return { body: JSON.stringify(options.json), hasBody: true };\n }\n\n if (options.form !== undefined) {\n const formData = options.form instanceof FormData ? options.form : createFormData(options.form);\n return { body: formData, hasBody: true };\n }\n\n return {\n body: options.body ?? null,\n hasBody: options.body !== undefined,\n };\n}\n\nfunction createFormData(values: FarmTestFormValues): FormData {\n const formData = new FormData();\n for (const [key, rawValue] of Object.entries(values)) {\n const entries = Array.isArray(rawValue) ? rawValue : [rawValue];\n for (const value of entries) formData.append(key, value);\n }\n return formData;\n}\n\nfunction resolvePageParams(\n pattern: string,\n pathname: string,\n explicitParams: Record<string, unknown> | undefined,\n): Record<string, string> {\n const matchedParams = matchFarmRoute(pattern, pathname);\n if (!matchedParams) {\n throw new Error(\n `Path ${JSON.stringify(pathname)} does not match route ${JSON.stringify(pattern)}`,\n );\n }\n\n if (!explicitParams) return matchedParams;\n\n return Object.fromEntries(\n Object.entries(explicitParams).map(([key, value]) => [\n key,\n Array.isArray(value) ? value.map(String).join(\"/\") : String(value),\n ]),\n );\n}\n\nfunction readCanonicalPath(props: Record<string, unknown>): string | undefined {\n return typeof props.__farmCanonicalPath === \"string\" ? props.__farmCanonicalPath : undefined;\n}\n\nfunction stripInternalRouteProps(props: Record<string, unknown>): Record<string, unknown> {\n const { __farmRoutePropsResolved, __farmCanonicalPath, ...componentProps } = props;\n return componentProps;\n}\n\nfunction getDefaultApiMethod(route: ProgrammaticApiRoute): ProgrammaticRouteMethod {\n if (route.methods.GET) return \"GET\";\n return (Object.keys(route.methods)[0] as ProgrammaticRouteMethod | undefined) ?? \"GET\";\n}\n\nfunction omitApiControlOptions(options: FarmTestApiOptions): FarmTestRequestOptions {\n const { path: _path, params: _params, throwOnError: _throwOnError, ...requestOptions } = options;\n return requestOptions;\n}\n\nfunction omitEndpointControlOptions(options: FarmTestEndpointOptions): FarmTestRequestOptions {\n const { path: _path, params: _params, throwOnError: _throwOnError, ...requestOptions } = options;\n return requestOptions;\n}\n\nasync function invokeTestEndpoint(\n endpoint: unknown,\n request: Request,\n params: APIRouteParams = {},\n throwOnError = false,\n): Promise<Response> {\n try {\n return await invokeAPIRouteEndpoint(endpoint, request, params);\n } catch (error) {\n if (throwOnError) throw error;\n return jsonErrorResponse(error instanceof Error ? error.message : \"Internal Server Error\", 500);\n }\n}\n\nfunction jsonErrorResponse(error: string, status: number): Response {\n return Response.json({ error }, { status });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/theme/client.tsx","../../src/theme/bridge.ts","../../src/theme/runtime.ts"],"sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport { getFarmThemeServerSnapshot } from \"./bridge\";\nimport { getTheme, setTheme, subscribeTheme, toggleTheme } from \"./runtime\";\nimport type { FarmThemePreference, FarmThemeSnapshot, FarmResolvedTheme } from \"./types\";\n\nexport { getTheme, setTheme, toggleTheme } from \"./runtime\";\n\nfunction getHydrationSnapshot(): FarmThemeSnapshot {\n if (typeof window !== \"undefined\" && window.__FARM_THEME__?.serverSnapshot) {\n return window.__FARM_THEME__.serverSnapshot;\n }\n return getFarmThemeServerSnapshot();\n}\n\nexport interface UseThemeResult extends FarmThemeSnapshot {\n setTheme(theme: FarmThemePreference): void;\n toggleTheme(): FarmResolvedTheme;\n}\n\nexport function useTheme(): UseThemeResult {\n const snapshot = useSyncExternalStore(subscribeTheme, getTheme, getHydrationSnapshot);\n return {\n ...snapshot,\n setTheme,\n toggleTheme,\n };\n}\n","import type { FarmThemeSnapshot } from \"./types\";\n\nconst FALLBACK_SERVER_SNAPSHOT: FarmThemeSnapshot = Object.freeze({\n theme: \"system\",\n resolvedTheme: undefined,\n mounted: false,\n});\n\nconst FARM_THEME_SERVER_SNAPSHOT_RESOLVER = Symbol.for(\"farm.js.theme.server-snapshot-resolver\");\n\ntype FarmThemeBridgeGlobal = typeof globalThis & {\n [FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?: () => FarmThemeSnapshot;\n};\n\nexport function _setFarmThemeServerSnapshotResolver(resolver: () => FarmThemeSnapshot): void {\n (globalThis as FarmThemeBridgeGlobal)[FARM_THEME_SERVER_SNAPSHOT_RESOLVER] = resolver;\n}\n\nexport function getFarmThemeServerSnapshot(): FarmThemeSnapshot {\n return (\n (globalThis as FarmThemeBridgeGlobal)[FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?.() ??\n FALLBACK_SERVER_SNAPSHOT\n );\n}\n","\"use client\";\n\nimport type {\n FarmResolvedTheme,\n FarmThemePreference,\n FarmThemeRuntime,\n FarmThemeSnapshot,\n} from \"./types\";\n\ndeclare global {\n interface Window {\n __FARM_THEME__?: FarmThemeRuntime;\n }\n}\n\nconst FALLBACK_CLIENT_SNAPSHOT: FarmThemeSnapshot = Object.freeze({\n theme: \"system\",\n resolvedTheme: \"light\",\n mounted: true,\n});\n\nlet cachedClientSnapshot = FALLBACK_CLIENT_SNAPSHOT;\n\nfunction snapshotsMatch(left: FarmThemeSnapshot, right: FarmThemeSnapshot): boolean {\n return (\n left.theme === right.theme &&\n left.resolvedTheme === right.resolvedTheme &&\n left.mounted === right.mounted\n );\n}\n\nexport function getTheme(): FarmThemeSnapshot {\n const next =\n typeof window === \"undefined\" ? FALLBACK_CLIENT_SNAPSHOT : window.__FARM_THEME__?.snapshot;\n if (!next) return cachedClientSnapshot;\n if (!snapshotsMatch(cachedClientSnapshot, next)) cachedClientSnapshot = next;\n return cachedClientSnapshot;\n}\n\nexport function setTheme(theme: FarmThemePreference): void {\n const runtime = typeof window === \"undefined\" ? undefined : window.__FARM_THEME__;\n if (!runtime) {\n throw new Error(\"The FARMJS theme runtime is not enabled. Add `theme` to farm.config.ts.\");\n }\n runtime.setTheme(theme);\n}\n\nexport function toggleTheme(): FarmResolvedTheme {\n const next = getTheme().resolvedTheme === \"dark\" ? \"light\" : \"dark\";\n setTheme(next);\n return next;\n}\n\nexport function subscribeTheme(listener: () => void): () => void {\n if (typeof window === \"undefined\") return () => {};\n const handleThemeChange = () => {\n getTheme();\n listener();\n };\n window.addEventListener(\"farm:themechange\", handleThemeChange);\n return () => window.removeEventListener(\"farm:themechange\", handleThemeChange);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAqC;;;ACArC,IAAM,2BAA8C,OAAO,OAAO;AAAA,EAChE,OAAO;AAAA,EACP,eAAe;AAAA,EACf,SAAS;AACX,CAAC;AAED,IAAM,sCAAsC,uBAAO,IAAI,wCAAwC;AAUxF,SAAS,6BAAgD;AAC9D,SACG,WAAqC,mCAAmC,IAAI,KAC7E;AAEJ;AALgB;;;ACHhB,IAAM,2BAA8C,OAAO,OAAO;AAAA,EAChE,OAAO;AAAA,EACP,eAAe;AAAA,EACf,SAAS;AACX,CAAC;AAED,IAAI,uBAAuB;AAE3B,SAAS,eAAe,MAAyB,OAAmC;AAClF,SACE,KAAK,UAAU,MAAM,SACrB,KAAK,kBAAkB,MAAM,iBAC7B,KAAK,YAAY,MAAM;AAE3B;AANS;AAQF,SAAS,WAA8B;AAC5C,QAAM,OACJ,OAAO,WAAW,cAAc,2BAA2B,OAAO,gBAAgB;AACpF,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,eAAe,sBAAsB,IAAI,EAAG,wBAAuB;AACxE,SAAO;AACT;AANgB;AAQT,SAAS,SAAS,OAAkC;AACzD,QAAM,UAAU,OAAO,WAAW,cAAc,SAAY,OAAO;AACnE,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC3F;AACA,UAAQ,SAAS,KAAK;AACxB;AANgB;AAQT,SAAS,cAAiC;AAC/C,QAAM,OAAO,SAAS,EAAE,kBAAkB,SAAS,UAAU;AAC7D,WAAS,IAAI;AACb,SAAO;AACT;AAJgB;AAMT,SAAS,eAAe,UAAkC;AAC/D,MAAI,OAAO,WAAW,YAAa,QAAO,MAAM;AAAA,EAAC;AACjD,QAAM,oBAAoB,6BAAM;AAC9B,aAAS;AACT,aAAS;AAAA,EACX,GAH0B;AAI1B,SAAO,iBAAiB,oBAAoB,iBAAiB;AAC7D,SAAO,MAAM,OAAO,oBAAoB,oBAAoB,iBAAiB;AAC/E;AARgB;;;AF5ChB,SAAS,uBAA0C;AACjD,MAAI,OAAO,WAAW,eAAe,OAAO,gBAAgB,gBAAgB;AAC1E,WAAO,OAAO,eAAe;AAAA,EAC/B;AACA,SAAO,2BAA2B;AACpC;AALS;AAYF,SAAS,WAA2B;AACzC,QAAM,eAAW,mCAAqB,gBAAgB,UAAU,oBAAoB;AACpF,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;AAPgB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/theme/index.ts","../../src/theme/config.ts"],"sourcesContent":["export { resolveFarmThemeConfig } from \"./config\";\nexport type {\n FarmResolvedTheme,\n FarmThemeConfig,\n FarmThemePreference,\n FarmThemeSnapshot,\n ResolvedFarmThemeConfig,\n} from \"./types\";\n","import type { FarmThemeConfig, ResolvedFarmThemeConfig } from \"./types\";\n\nexport const DEFAULT_FARM_THEME_STORAGE_KEY = \"farm-theme\";\n\nconst STORAGE_KEY_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport function resolveFarmThemeConfig(\n config: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n): ResolvedFarmThemeConfig {\n if (config && \"enabled\" in config) {\n return config;\n }\n\n if (!config) {\n return {\n enabled: false,\n default: \"system\",\n storageKey: DEFAULT_FARM_THEME_STORAGE_KEY,\n cookiePath: normalizeCookiePath(basePath),\n };\n }\n\n const storageKey = config.storageKey?.trim() || DEFAULT_FARM_THEME_STORAGE_KEY;\n if (!STORAGE_KEY_PATTERN.test(storageKey)) {\n throw new Error(\n \"theme.storageKey may only contain letters, numbers, dots, underscores, and hyphens.\",\n );\n }\n\n const defaultTheme = config.default ?? \"system\";\n if (defaultTheme !== \"light\" && defaultTheme !== \"dark\" && defaultTheme !== \"system\") {\n throw new Error('theme.default must be \"light\", \"dark\", or \"system\".');\n }\n\n return {\n enabled: true,\n default: defaultTheme,\n storageKey,\n cookiePath: normalizeCookiePath(basePath),\n };\n}\n\nfunction normalizeCookiePath(basePath: string): string {\n const normalized = `/${basePath}`.replace(/\\/{2,}/g, \"/\");\n if (normalized === \"/\") return normalized;\n return normalized.replace(/\\/$/, \"\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,iCAAiC;AAE9C,IAAM,sBAAsB;AAErB,SAAS,uBACd,QACA,WAAW,KACc;AACzB,MAAI,UAAU,aAAa,QAAQ;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY,oBAAoB,QAAQ;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,aAAa,OAAO,YAAY,KAAK,KAAK;AAChD,MAAI,CAAC,oBAAoB,KAAK,UAAU,GAAG;AACzC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,WAAW;AACvC,MAAI,iBAAiB,WAAW,iBAAiB,UAAU,iBAAiB,UAAU;AACpF,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA,YAAY,oBAAoB,QAAQ;AAAA,EAC1C;AACF;AAnCgB;AAqChB,SAAS,oBAAoB,UAA0B;AACrD,QAAM,aAAa,IAAI,QAAQ,GAAG,QAAQ,WAAW,GAAG;AACxD,MAAI,eAAe,IAAK,QAAO;AAC/B,SAAO,WAAW,QAAQ,OAAO,EAAE;AACrC;AAJS;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/theme/runtime.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n FarmResolvedTheme,\n FarmThemePreference,\n FarmThemeRuntime,\n FarmThemeSnapshot,\n} from \"./types\";\n\ndeclare global {\n interface Window {\n __FARM_THEME__?: FarmThemeRuntime;\n }\n}\n\nconst FALLBACK_CLIENT_SNAPSHOT: FarmThemeSnapshot = Object.freeze({\n theme: \"system\",\n resolvedTheme: \"light\",\n mounted: true,\n});\n\nlet cachedClientSnapshot = FALLBACK_CLIENT_SNAPSHOT;\n\nfunction snapshotsMatch(left: FarmThemeSnapshot, right: FarmThemeSnapshot): boolean {\n return (\n left.theme === right.theme &&\n left.resolvedTheme === right.resolvedTheme &&\n left.mounted === right.mounted\n );\n}\n\nexport function getTheme(): FarmThemeSnapshot {\n const next =\n typeof window === \"undefined\" ? FALLBACK_CLIENT_SNAPSHOT : window.__FARM_THEME__?.snapshot;\n if (!next) return cachedClientSnapshot;\n if (!snapshotsMatch(cachedClientSnapshot, next)) cachedClientSnapshot = next;\n return cachedClientSnapshot;\n}\n\nexport function setTheme(theme: FarmThemePreference): void {\n const runtime = typeof window === \"undefined\" ? undefined : window.__FARM_THEME__;\n if (!runtime) {\n throw new Error(\"The FARMJS theme runtime is not enabled. Add `theme` to farm.config.ts.\");\n }\n runtime.setTheme(theme);\n}\n\nexport function toggleTheme(): FarmResolvedTheme {\n const next = getTheme().resolvedTheme === \"dark\" ? \"light\" : \"dark\";\n setTheme(next);\n return next;\n}\n\nexport function subscribeTheme(listener: () => void): () => void {\n if (typeof window === \"undefined\") return () => {};\n const handleThemeChange = () => {\n getTheme();\n listener();\n };\n window.addEventListener(\"farm:themechange\", handleThemeChange);\n return () => window.removeEventListener(\"farm:themechange\", handleThemeChange);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA,IAAM,2BAA8C,OAAO,OAAO;AAAA,EAChE,OAAO;AAAA,EACP,eAAe;AAAA,EACf,SAAS;AACX,CAAC;AAED,IAAI,uBAAuB;AAE3B,SAAS,eAAe,MAAyB,OAAmC;AAClF,SACE,KAAK,UAAU,MAAM,SACrB,KAAK,kBAAkB,MAAM,iBAC7B,KAAK,YAAY,MAAM;AAE3B;AANS;AAQF,SAAS,WAA8B;AAC5C,QAAM,OACJ,OAAO,WAAW,cAAc,2BAA2B,OAAO,gBAAgB;AACpF,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,eAAe,sBAAsB,IAAI,EAAG,wBAAuB;AACxE,SAAO;AACT;AANgB;AAQT,SAAS,SAAS,OAAkC;AACzD,QAAM,UAAU,OAAO,WAAW,cAAc,SAAY,OAAO;AACnE,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC3F;AACA,UAAQ,SAAS,KAAK;AACxB;AANgB;AAQT,SAAS,cAAiC;AAC/C,QAAM,OAAO,SAAS,EAAE,kBAAkB,SAAS,UAAU;AAC7D,WAAS,IAAI;AACb,SAAO;AACT;AAJgB;AAMT,SAAS,eAAe,UAAkC;AAC/D,MAAI,OAAO,WAAW,YAAa,QAAO,MAAM;AAAA,EAAC;AACjD,QAAM,oBAAoB,6BAAM;AAC9B,aAAS;AACT,aAAS;AAAA,EACX,GAH0B;AAI1B,SAAO,iBAAiB,oBAAoB,iBAAiB;AAC7D,SAAO,MAAM,OAAO,oBAAoB,oBAAoB,iBAAiB;AAC/E;AARgB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/theme/server.ts","../../src/server/request.ts","../../src/server/request-bridge.ts","../../src/theme/bridge.ts","../../src/theme/config.ts"],"sourcesContent":["import { getCurrentRequestOrNull } from \"../server/request\";\nimport { _setFarmThemeServerSnapshotResolver } from \"./bridge\";\nimport { resolveFarmThemeConfig } from \"./config\";\nimport type {\n FarmThemeConfig,\n FarmThemePreference,\n FarmThemeSnapshot,\n ResolvedFarmThemeConfig,\n} from \"./types\";\n\nlet defaultThemeConfig = resolveFarmThemeConfig(undefined);\n\nexport function _setDefaultFarmThemeConfig(\n config: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n): void {\n defaultThemeConfig = resolveFarmThemeConfig(config, basePath);\n}\n\n// The theme preference is cosmetic, so a missing request context must never\n// crash a render: without a request to read the cookie from, the configured\n// default applies. Runtimes with partial AsyncLocalStorage support (for\n// example StackBlitz WebContainers) can lose the store mid-render, and a\n// thrown error here would also take down the error page itself.\nexport function getTheme(request: Request | null = getCurrentRequestOrNull()): FarmThemePreference {\n if (!request) return defaultThemeConfig.default;\n return readFarmThemePreference(request, defaultThemeConfig);\n}\n\nexport function getThemeSnapshot(\n request: Request | null = getCurrentRequestOrNull(),\n): FarmThemeSnapshot {\n const theme = request\n ? readFarmThemePreference(request, defaultThemeConfig)\n : defaultThemeConfig.default;\n return {\n theme,\n resolvedTheme: theme === \"system\" ? undefined : theme,\n mounted: false,\n };\n}\n\nexport function readFarmThemePreference(\n request: Request,\n config: ResolvedFarmThemeConfig,\n): FarmThemePreference {\n if (!config.enabled) return config.default;\n const stored = readCookie(request.headers.get(\"cookie\"), config.storageKey);\n return isFarmThemePreference(stored) ? stored : config.default;\n}\n\nfunction readCookie(cookieHeader: string | null, name: string): string | undefined {\n if (!cookieHeader) return undefined;\n for (const entry of cookieHeader.split(\";\")) {\n const separator = entry.indexOf(\"=\");\n if (separator < 0) continue;\n const key = decodeCookieValue(entry.slice(0, separator).trim());\n if (key !== name) continue;\n return decodeCookieValue(entry.slice(separator + 1).trim());\n }\n return undefined;\n}\n\nfunction decodeCookieValue(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction isFarmThemePreference(value: unknown): value is FarmThemePreference {\n return value === \"light\" || value === \"dark\" || value === \"system\";\n}\n\n_setFarmThemeServerSnapshotResolver(() => {\n try {\n return getThemeSnapshot();\n } catch {\n const theme = defaultThemeConfig.default;\n return {\n theme,\n resolvedTheme: theme === \"system\" ? undefined : theme,\n mounted: false,\n };\n }\n});\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Readable } from \"node:stream\";\nimport type { FarmRequest } from \"../types\";\nimport { _setCurrentRequestResolver } from \"./request-bridge\";\n\nconst REQUEST_STORAGE_KEY = Symbol.for(\"@farm.js/core/request-storage\");\n\nfunction getRequestStore(): AsyncLocalStorage<Request> {\n const runtime = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\n const existing = runtime[REQUEST_STORAGE_KEY];\n if (existing instanceof AsyncLocalStorage) {\n return existing as AsyncLocalStorage<Request>;\n }\n\n const storage = new AsyncLocalStorage<Request>();\n runtime[REQUEST_STORAGE_KEY] = storage;\n return storage;\n}\n\nconst requestStore = getRequestStore();\n\n_setCurrentRequestResolver(() => requestStore.getStore());\n\nexport interface FarmRequestURLOptions {\n origin?: string | URL;\n trustProxy?: boolean;\n}\n\nexport function resolveFarmRequestURL(req: FarmRequest, options: FarmRequestURLOptions = {}): URL {\n if (options.origin) {\n return new URL(req.url || \"/\", options.origin);\n }\n\n const forwardedHost = options.trustProxy\n ? firstForwardedHeaderValue(req.headers[\"x-forwarded-host\"])\n : undefined;\n const fallbackHost = firstForwardedHeaderValue(req.headers.host) || \"localhost\";\n const forwardedProto = options.trustProxy\n ? firstForwardedHeaderValue(req.headers[\"x-forwarded-proto\"])\n : undefined;\n const normalizedProto = forwardedProto?.toLowerCase();\n const proto =\n normalizedProto === \"https\" || normalizedProto === \"http\"\n ? normalizedProto\n : isEncryptedFarmRequest(req)\n ? \"https\"\n : \"http\";\n return new URL(req.url || \"/\", resolveRequestOrigin(proto, forwardedHost, fallbackHost));\n}\n\nexport function createWebRequestFromFarmRequest(\n req: FarmRequest,\n options: FarmRequestURLOptions = {},\n): Request {\n const fullUrl = resolveFarmRequestURL(req, options).toString();\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(key, item);\n }\n continue;\n }\n\n headers.set(key, value);\n }\n\n const method = (req.method || \"GET\").toUpperCase();\n const init: RequestInit & { duplex?: \"half\" } = {\n method: req.method,\n headers,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n init.body = Readable.toWeb(req) as ReadableStream<Uint8Array>;\n init.duplex = \"half\";\n }\n\n return new Request(fullUrl, init);\n}\n\nfunction isEncryptedFarmRequest(req: FarmRequest): boolean {\n return Boolean((req.socket as { encrypted?: boolean } | undefined)?.encrypted);\n}\n\nfunction firstForwardedHeaderValue(value: string | string[] | undefined): string | undefined {\n const first = Array.isArray(value) ? value[0] : value;\n const token = first?.split(\",\", 1)[0]?.trim();\n return token || undefined;\n}\n\nfunction resolveRequestOrigin(proto: \"http\" | \"https\", host: string | undefined, fallback: string) {\n for (const candidate of [host, fallback, \"localhost\"]) {\n if (!candidate) continue;\n if (/[\\s/?#@\\\\]/u.test(candidate)) continue;\n try {\n const url = new URL(`${proto}://${candidate}`);\n if (url.username || url.password || url.pathname !== \"/\" || url.search || url.hash) continue;\n return url.origin;\n } catch {\n // Try the next host instead of turning an untrusted proxy header into a 500.\n }\n }\n return `${proto}://localhost`;\n}\n\nexport async function _runWithCurrentRequest<T>(\n request: Request,\n fn: () => Promise<T> | T,\n): Promise<T> {\n return requestStore.run(request, fn);\n}\n\nexport function getCurrentRequest(): Request {\n const request = requestStore.getStore();\n if (!request) {\n throw new Error(\n \"No current request is available. getCurrentRequest() can only be used during server rendering.\",\n );\n }\n\n return request;\n}\n\n// Some runtimes (StackBlitz WebContainers among them) lose AsyncLocalStorage\n// context across async boundaries mid-render. Callers whose feature can\n// degrade gracefully should use this instead of getCurrentRequest() so a\n// missing store never turns into a 500.\nexport function getCurrentRequestOrNull(): Request | null {\n return requestStore.getStore() ?? null;\n}\n","type CurrentRequestResolver = () => Request | undefined;\n\nconst CURRENT_REQUEST_RESOLVER_KEY = Symbol.for(\"farm.currentRequestResolver\");\n\ntype GlobalWithCurrentRequestResolver = typeof globalThis & {\n [CURRENT_REQUEST_RESOLVER_KEY]?: CurrentRequestResolver;\n};\n\nfunction getGlobalState(): GlobalWithCurrentRequestResolver {\n return globalThis as GlobalWithCurrentRequestResolver;\n}\n\nexport function _setCurrentRequestResolver(resolver: CurrentRequestResolver | undefined): void {\n getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY] = resolver;\n}\n\nexport function _resolveCurrentRequest(): Request | undefined {\n return getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY]?.();\n}\n","import type { FarmThemeSnapshot } from \"./types\";\n\nconst FALLBACK_SERVER_SNAPSHOT: FarmThemeSnapshot = Object.freeze({\n theme: \"system\",\n resolvedTheme: undefined,\n mounted: false,\n});\n\nconst FARM_THEME_SERVER_SNAPSHOT_RESOLVER = Symbol.for(\"farm.js.theme.server-snapshot-resolver\");\n\ntype FarmThemeBridgeGlobal = typeof globalThis & {\n [FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?: () => FarmThemeSnapshot;\n};\n\nexport function _setFarmThemeServerSnapshotResolver(resolver: () => FarmThemeSnapshot): void {\n (globalThis as FarmThemeBridgeGlobal)[FARM_THEME_SERVER_SNAPSHOT_RESOLVER] = resolver;\n}\n\nexport function getFarmThemeServerSnapshot(): FarmThemeSnapshot {\n return (\n (globalThis as FarmThemeBridgeGlobal)[FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?.() ??\n FALLBACK_SERVER_SNAPSHOT\n );\n}\n","import type { FarmThemeConfig, ResolvedFarmThemeConfig } from \"./types\";\n\nexport const DEFAULT_FARM_THEME_STORAGE_KEY = \"farm-theme\";\n\nconst STORAGE_KEY_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport function resolveFarmThemeConfig(\n config: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n): ResolvedFarmThemeConfig {\n if (config && \"enabled\" in config) {\n return config;\n }\n\n if (!config) {\n return {\n enabled: false,\n default: \"system\",\n storageKey: DEFAULT_FARM_THEME_STORAGE_KEY,\n cookiePath: normalizeCookiePath(basePath),\n };\n }\n\n const storageKey = config.storageKey?.trim() || DEFAULT_FARM_THEME_STORAGE_KEY;\n if (!STORAGE_KEY_PATTERN.test(storageKey)) {\n throw new Error(\n \"theme.storageKey may only contain letters, numbers, dots, underscores, and hyphens.\",\n );\n }\n\n const defaultTheme = config.default ?? \"system\";\n if (defaultTheme !== \"light\" && defaultTheme !== \"dark\" && defaultTheme !== \"system\") {\n throw new Error('theme.default must be \"light\", \"dark\", or \"system\".');\n }\n\n return {\n enabled: true,\n default: defaultTheme,\n storageKey,\n cookiePath: normalizeCookiePath(basePath),\n };\n}\n\nfunction normalizeCookiePath(basePath: string): string {\n const normalized = `/${basePath}`.replace(/\\/{2,}/g, \"/\");\n if (normalized === \"/\") return normalized;\n return normalized.replace(/\\/$/, \"\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as ParsedRoute, R as RouteSegment } from './client-plugins-
|
|
1
|
+
import { P as ParsedRoute, R as RouteSegment } from './client-plugins-BqtHoJ9C.mjs';
|
|
2
2
|
|
|
3
3
|
declare function parseRoutePath(filePath: string): ParsedRoute;
|
|
4
4
|
declare function segmentsToPattern(segments: RouteSegment[]): string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as ParsedRoute, R as RouteSegment } from './client-plugins-
|
|
1
|
+
import { P as ParsedRoute, R as RouteSegment } from './client-plugins-DYprkCKN.js';
|
|
2
2
|
|
|
3
3
|
declare function parseRoutePath(filePath: string): ParsedRoute;
|
|
4
4
|
declare function segmentsToPattern(segments: RouteSegment[]): string;
|
package/dist/version.cjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../package.json"],"sourcesContent":["import { version } from \"../package.json\";\n\nexport const FARM_VERSION = version;\n","{\n \"name\": \"@farm.js/core\",\n \"version\": \"0.1.0-beta.99\",\n \"description\": \"Core Farm.js framework for modern integrated apps\",\n \"keywords\": [\n \"@farm.js/core\",\n \"framework\",\n \"react\",\n \"rsc\",\n \"server-components\",\n \"ssr\",\n \"vite\"\n ],\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/farming-labs/farm.js\",\n \"directory\": \"packages/farm\"\n },\n \"files\": [\n \"dist\",\n \"types\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"middleware\": [\n \"./types/middleware.d.ts\",\n \"./dist/middleware.d.ts\"\n ],\n \"version\": [\n \"./dist/version.d.ts\"\n ],\n \"router\": [\n \"./dist/router.d.ts\"\n ],\n \"routes\": [\n \"./dist/routes.d.ts\"\n ],\n \"storage\": [\n \"./dist/storage.d.ts\"\n ],\n \"integrations\": [\n \"./dist/integrations.d.ts\"\n ],\n \"cache\": [\n \"./dist/cache.d.ts\"\n ],\n \"deferred\": [\n \"./dist/deferred.d.ts\"\n ],\n \"after\": [\n \"./dist/after.d.ts\"\n ],\n \"navigation\": [\n \"./dist/navigation.d.ts\"\n ],\n \"headers\": [\n \"./dist/headers.d.ts\"\n ],\n \"theme\": [\n \"./dist/theme/index.d.ts\"\n ],\n \"theme/client\": [\n \"./dist/theme/client.d.ts\"\n ],\n \"theme/runtime\": [\n \"./dist/theme/runtime.d.ts\"\n ],\n \"theme/server\": [\n \"./dist/theme/server.d.ts\"\n ],\n \"docs\": [\n \"./dist/docs.d.ts\"\n ],\n \"markdown\": [\n \"./dist/markdown.d.ts\"\n ],\n \"app-markdown\": [\n \"./dist/app-markdown.d.ts\"\n ],\n \"observability\": [\n \"./dist/observability.d.ts\"\n ],\n \"instrumentation\": [\n \"./dist/instrumentation.d.ts\"\n ],\n \"workflows\": [\n \"./dist/workflows.d.ts\"\n ],\n \"cron\": [\n \"./dist/cron.d.ts\"\n ],\n \"server-fn\": [\n \"./dist/server-fn.d.ts\"\n ],\n \"server-fn/client\": [\n \"./dist/server-fn-client.d.ts\"\n ],\n \"server-query\": [\n \"./dist/server-query.d.ts\"\n ],\n \"server-query/client\": [\n \"./dist/server-query-client.d.ts\"\n ],\n \"server-action-security\": [\n \"./dist/server-action-security.d.ts\"\n ],\n \"deployment\": [\n \"./dist/deployment.d.ts\"\n ],\n \"env\": [\n \"./dist/env.d.ts\"\n ],\n \"env-types\": [\n \"./dist/env-types.d.ts\"\n ],\n \"environment\": [\n \"./dist/environment.d.ts\"\n ],\n \"environment/vite\": [\n \"./dist/environment/vite.d.ts\"\n ],\n \"font\": [\n \"./dist/font.d.ts\"\n ],\n \"testing\": [\n \"./dist/testing.d.ts\"\n ],\n \"agent-runtime\": [\n \"./dist/agent-runtime.d.ts\"\n ],\n \"css\": [\n \"./types/css.d.ts\"\n ],\n \"image\": [\n \"./types/image.d.ts\",\n \"./dist/image.d.ts\"\n ],\n \"image/server\": [\n \"./dist/image/server.d.ts\"\n ],\n \"image/sharp\": [\n \"./dist/image/sharp.d.ts\"\n ],\n \"i18n\": [\n \"./dist/i18n/index.d.ts\"\n ],\n \"i18n/server\": [\n \"./dist/i18n/server.d.ts\"\n ],\n \"i18n/client\": [\n \"./dist/i18n/client.d.ts\"\n ],\n \"internal/production-runtime\": [\n \"./dist/internal/production-runtime.d.ts\"\n ],\n \"internal/product-telemetry-runtime\": [\n \"./dist/internal/product-telemetry-runtime.d.ts\"\n ],\n \"internal/metadata-image-runtime\": [\n \"./dist/internal/metadata-image-runtime.d.ts\"\n ],\n \"internal/client-runtime\": [\n \"./dist/internal/client-runtime.d.ts\"\n ],\n \"internal/isolated-boundary\": [\n \"./dist/internal/isolated-boundary.d.ts\"\n ],\n \"internal/build-runtime\": [\n \"./dist/internal/build-runtime.d.ts\"\n ],\n \"internal/config-runtime\": [\n \"./dist/internal/config-runtime.d.ts\"\n ],\n \"internal/production-node-env\": [\n \"./dist/internal/production-node-env.d.ts\"\n ],\n \"config\": [\n \"./dist/config.d.ts\"\n ],\n \"renderer\": [\n \"./dist/renderer.d.ts\"\n ],\n \"renderer-client\": [\n \"./dist/renderer-client.d.ts\"\n ],\n \"api\": [\n \"./types/api.d.ts\",\n \"./dist/api.d.ts\"\n ],\n \"api/route-manager\": [\n \"./dist/api/route-manager.d.ts\"\n ],\n \"api/runtime\": [\n \"./dist/api/runtime.d.ts\"\n ],\n \"request\": [\n \"./dist/request.d.ts\"\n ],\n \"client\": [\n \"./types/client.d.ts\",\n \"./dist/client.d.ts\"\n ],\n \"client/lifecycle\": [\n \"./dist/client/lifecycle.d.ts\"\n ],\n \"server\": [\n \"./dist/server.d.ts\"\n ],\n \"vite\": [\n \"./dist/vite.d.ts\"\n ],\n \"plugin\": [\n \"./dist/plugin.d.ts\"\n ],\n \"query\": [\n \"./dist/query/index.d.ts\"\n ],\n \"*\": [\n \"./dist/*.d.ts\"\n ]\n }\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.mjs\"\n },\n \"./version\": {\n \"types\": \"./dist/version.d.ts\",\n \"import\": \"./dist/version.mjs\",\n \"require\": \"./dist/version.cjs\"\n },\n \"./config\": {\n \"types\": \"./dist/config.d.ts\",\n \"import\": \"./dist/config.mjs\",\n \"require\": \"./dist/config.cjs\"\n },\n \"./renderer\": {\n \"types\": \"./dist/renderer.d.ts\",\n \"import\": \"./dist/renderer.mjs\",\n \"require\": \"./dist/renderer.cjs\"\n },\n \"./renderer-client\": {\n \"types\": \"./dist/renderer-client.d.ts\",\n \"import\": \"./dist/renderer-client.mjs\",\n \"require\": \"./dist/renderer-client.cjs\"\n },\n \"./renderer/react/server\": {\n \"types\": \"./dist/renderer/react/server.d.ts\",\n \"import\": \"./dist/renderer/react/server.mjs\",\n \"require\": \"./dist/renderer/react/server.cjs\"\n },\n \"./renderer/react/client\": {\n \"types\": \"./dist/renderer/react/client.d.ts\",\n \"import\": \"./dist/renderer/react/client.mjs\",\n \"require\": \"./dist/renderer/react/client.cjs\"\n },\n \"./renderer/react/vite\": {\n \"types\": \"./dist/renderer/react/vite.d.ts\",\n \"import\": \"./dist/renderer/react/vite.mjs\",\n \"require\": \"./dist/renderer/react/vite.cjs\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.mjs\",\n \"require\": \"./dist/server.cjs\"\n },\n \"./client\": {\n \"types\": \"./types/client.d.ts\",\n \"import\": \"./dist/client.mjs\",\n \"require\": \"./dist/client.cjs\"\n },\n \"./client/lifecycle\": {\n \"types\": \"./dist/client/lifecycle.d.ts\",\n \"import\": \"./dist/client/lifecycle.mjs\",\n \"require\": \"./dist/client/lifecycle.cjs\"\n },\n \"./storage\": {\n \"types\": \"./dist/storage.d.ts\",\n \"import\": \"./dist/storage.mjs\",\n \"require\": \"./dist/storage.cjs\"\n },\n \"./integrations\": {\n \"types\": \"./dist/integrations.d.ts\",\n \"import\": \"./dist/integrations.mjs\",\n \"require\": \"./dist/integrations.cjs\"\n },\n \"./cache\": {\n \"types\": \"./dist/cache.d.ts\",\n \"import\": \"./dist/cache.mjs\",\n \"require\": \"./dist/cache.cjs\"\n },\n \"./deferred\": {\n \"types\": \"./dist/deferred.d.ts\",\n \"import\": \"./dist/deferred.mjs\",\n \"require\": \"./dist/deferred.cjs\"\n },\n \"./after\": {\n \"types\": \"./dist/after.d.ts\",\n \"import\": \"./dist/after.mjs\",\n \"require\": \"./dist/after.cjs\"\n },\n \"./navigation\": {\n \"types\": \"./dist/navigation.d.ts\",\n \"import\": \"./dist/navigation.mjs\",\n \"require\": \"./dist/navigation.cjs\"\n },\n \"./headers\": {\n \"types\": \"./dist/headers.d.ts\",\n \"import\": \"./dist/headers.mjs\",\n \"require\": \"./dist/headers.cjs\"\n },\n \"./theme\": {\n \"types\": \"./dist/theme/index.d.ts\",\n \"import\": \"./dist/theme/index.mjs\",\n \"require\": \"./dist/theme/index.cjs\"\n },\n \"./theme/client\": {\n \"types\": \"./dist/theme/client.d.ts\",\n \"import\": \"./dist/theme/client.mjs\",\n \"require\": \"./dist/theme/client.cjs\"\n },\n \"./theme/runtime\": {\n \"types\": \"./dist/theme/runtime.d.ts\",\n \"import\": \"./dist/theme/runtime.mjs\",\n \"require\": \"./dist/theme/runtime.cjs\"\n },\n \"./theme/server\": {\n \"types\": \"./dist/theme/server.d.ts\",\n \"import\": \"./dist/theme/server.mjs\",\n \"require\": \"./dist/theme/server.cjs\"\n },\n \"./docs\": {\n \"types\": \"./dist/docs.d.ts\",\n \"import\": \"./dist/docs.mjs\",\n \"require\": \"./dist/docs.cjs\"\n },\n \"./markdown\": {\n \"types\": \"./dist/markdown.d.ts\",\n \"import\": \"./dist/markdown.mjs\",\n \"require\": \"./dist/markdown.cjs\"\n },\n \"./app-markdown\": {\n \"types\": \"./dist/app-markdown.d.ts\",\n \"import\": \"./dist/app-markdown.mjs\",\n \"require\": \"./dist/app-markdown.cjs\"\n },\n \"./observability\": {\n \"types\": \"./dist/observability.d.ts\",\n \"import\": \"./dist/observability.mjs\",\n \"require\": \"./dist/observability.cjs\"\n },\n \"./instrumentation\": {\n \"types\": \"./dist/instrumentation.d.ts\",\n \"import\": \"./dist/instrumentation.mjs\",\n \"require\": \"./dist/instrumentation.cjs\"\n },\n \"./workflows\": {\n \"types\": \"./dist/workflows.d.ts\",\n \"import\": \"./dist/workflows.mjs\",\n \"require\": \"./dist/workflows.cjs\"\n },\n \"./cron\": {\n \"types\": \"./dist/cron.d.ts\",\n \"import\": \"./dist/cron.mjs\",\n \"require\": \"./dist/cron.cjs\"\n },\n \"./server-fn\": {\n \"types\": \"./dist/server-fn.d.ts\",\n \"import\": \"./dist/server-fn.mjs\",\n \"require\": \"./dist/server-fn.cjs\"\n },\n \"./server-fn/client\": {\n \"types\": \"./dist/server-fn-client.d.ts\",\n \"import\": \"./dist/server-fn-client.mjs\",\n \"require\": \"./dist/server-fn-client.cjs\"\n },\n \"./server-query\": {\n \"types\": \"./dist/server-query.d.ts\",\n \"import\": \"./dist/server-query.mjs\",\n \"require\": \"./dist/server-query.cjs\"\n },\n \"./server-query/client\": {\n \"types\": \"./dist/server-query-client.d.ts\",\n \"import\": \"./dist/server-query-client.mjs\",\n \"require\": \"./dist/server-query-client.cjs\"\n },\n \"./server-action-security\": {\n \"types\": \"./dist/server-action-security.d.ts\",\n \"import\": \"./dist/server-action-security.mjs\",\n \"require\": \"./dist/server-action-security.cjs\"\n },\n \"./deployment\": {\n \"types\": \"./dist/deployment.d.ts\",\n \"import\": \"./dist/deployment.mjs\",\n \"require\": \"./dist/deployment.cjs\"\n },\n \"./env\": {\n \"types\": \"./dist/env.d.ts\",\n \"import\": \"./dist/env.mjs\",\n \"require\": \"./dist/env.cjs\"\n },\n \"./env-types\": {\n \"types\": \"./dist/env-types.d.ts\",\n \"import\": \"./dist/env-types.mjs\",\n \"require\": \"./dist/env-types.cjs\"\n },\n \"./environment\": {\n \"types\": \"./dist/environment.d.ts\",\n \"import\": \"./dist/environment.mjs\",\n \"require\": \"./dist/environment.cjs\"\n },\n \"./environment/vite\": {\n \"types\": \"./dist/environment/vite.d.ts\",\n \"import\": \"./dist/environment/vite.mjs\",\n \"require\": \"./dist/environment/vite.cjs\"\n },\n \"./font\": {\n \"types\": \"./dist/font.d.ts\",\n \"import\": \"./dist/font.mjs\",\n \"require\": \"./dist/font.cjs\"\n },\n \"./vite\": {\n \"types\": \"./dist/vite.d.ts\",\n \"import\": \"./dist/vite.mjs\",\n \"require\": \"./dist/vite.cjs\"\n },\n \"./plugin\": {\n \"types\": \"./dist/plugin.d.ts\",\n \"import\": \"./dist/plugin.mjs\",\n \"require\": \"./dist/plugin.cjs\"\n },\n \"./plugin/server\": {\n \"types\": \"./dist/server-plugins.d.ts\",\n \"import\": \"./dist/server-plugins.mjs\",\n \"require\": \"./dist/server-plugins.cjs\"\n },\n \"./plugin/client\": {\n \"types\": \"./dist/client-plugins.d.ts\",\n \"import\": \"./dist/client-plugins.mjs\",\n \"require\": \"./dist/client-plugins.cjs\"\n },\n \"./query\": {\n \"types\": \"./dist/query/index.d.ts\",\n \"import\": \"./dist/query/index.mjs\",\n \"require\": \"./dist/query/index.cjs\"\n },\n \"./query/parsers\": {\n \"types\": \"./dist/query/parsers.d.ts\",\n \"import\": \"./dist/query/parsers.mjs\",\n \"require\": \"./dist/query/parsers.cjs\"\n },\n \"./query/client\": {\n \"types\": \"./dist/query/client.d.ts\",\n \"import\": \"./dist/query/client.mjs\",\n \"require\": \"./dist/query/client.cjs\"\n },\n \"./query/server\": {\n \"types\": \"./dist/query/server.d.ts\",\n \"import\": \"./dist/query/server.mjs\",\n \"require\": \"./dist/query/server.cjs\"\n },\n \"./middleware\": {\n \"types\": \"./dist/middleware.d.ts\",\n \"import\": \"./dist/middleware.mjs\",\n \"require\": \"./dist/middleware.cjs\"\n },\n \"./api\": {\n \"types\": \"./dist/api.d.ts\",\n \"import\": \"./dist/api.mjs\",\n \"require\": \"./dist/api.cjs\"\n },\n \"./api/route-manager\": {\n \"types\": \"./dist/api/route-manager.d.ts\",\n \"import\": \"./dist/api/route-manager.mjs\",\n \"require\": \"./dist/api/route-manager.cjs\"\n },\n \"./api/runtime\": {\n \"types\": \"./dist/api/runtime.d.ts\",\n \"import\": \"./dist/api/runtime.mjs\",\n \"require\": \"./dist/api/runtime.cjs\"\n },\n \"./request\": {\n \"types\": \"./dist/request.d.ts\",\n \"import\": \"./dist/request.mjs\",\n \"require\": \"./dist/request.cjs\"\n },\n \"./router\": {\n \"types\": \"./dist/router.d.ts\",\n \"import\": \"./dist/router.mjs\",\n \"require\": \"./dist/router.cjs\"\n },\n \"./routes\": {\n \"types\": \"./dist/routes.d.ts\",\n \"import\": \"./dist/routes.mjs\",\n \"require\": \"./dist/routes.cjs\"\n },\n \"./testing\": {\n \"types\": \"./dist/testing.d.ts\",\n \"import\": \"./dist/testing.mjs\",\n \"require\": \"./dist/testing.cjs\"\n },\n \"./agent-runtime\": {\n \"types\": \"./dist/agent-runtime.d.ts\",\n \"import\": \"./dist/agent-runtime.mjs\",\n \"require\": \"./dist/agent-runtime.cjs\"\n },\n \"./css\": {\n \"types\": \"./types/css.d.ts\"\n },\n \"./image\": {\n \"types\": \"./types/image.d.ts\",\n \"import\": \"./dist/image.mjs\",\n \"require\": \"./dist/image.cjs\"\n },\n \"./image/server\": {\n \"types\": \"./dist/image/server.d.ts\",\n \"import\": \"./dist/image/server.mjs\",\n \"require\": \"./dist/image/server.cjs\"\n },\n \"./image/sharp\": {\n \"types\": \"./dist/image/sharp.d.ts\",\n \"import\": \"./dist/image/sharp.mjs\",\n \"require\": \"./dist/image/sharp.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.mjs\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./i18n/server\": {\n \"types\": \"./dist/i18n/server.d.ts\",\n \"import\": \"./dist/i18n/server.mjs\",\n \"require\": \"./dist/i18n/server.cjs\"\n },\n \"./i18n/client\": {\n \"types\": \"./dist/i18n/client.d.ts\",\n \"import\": \"./dist/i18n/client.mjs\",\n \"require\": \"./dist/i18n/client.cjs\"\n },\n \"./internal/production-runtime\": {\n \"types\": \"./dist/internal/production-runtime.d.ts\",\n \"import\": \"./dist/internal/production-runtime.mjs\",\n \"require\": \"./dist/internal/production-runtime.cjs\"\n },\n \"./internal/product-telemetry-runtime\": {\n \"types\": \"./dist/internal/product-telemetry-runtime.d.ts\",\n \"import\": \"./dist/internal/product-telemetry-runtime.mjs\",\n \"require\": \"./dist/internal/product-telemetry-runtime.cjs\"\n },\n \"./internal/metadata-image-runtime\": {\n \"types\": \"./dist/internal/metadata-image-runtime.d.ts\",\n \"import\": \"./dist/internal/metadata-image-runtime.mjs\",\n \"require\": \"./dist/internal/metadata-image-runtime.cjs\"\n },\n \"./internal/client-runtime\": {\n \"types\": \"./dist/internal/client-runtime.d.ts\",\n \"import\": \"./dist/internal/client-runtime.mjs\",\n \"require\": \"./dist/internal/client-runtime.cjs\"\n },\n \"./internal/isolated-boundary\": {\n \"types\": \"./dist/internal/isolated-boundary.d.ts\",\n \"import\": \"./dist/internal/isolated-boundary.mjs\",\n \"require\": \"./dist/internal/isolated-boundary.cjs\"\n },\n \"./internal/build-runtime\": {\n \"types\": \"./dist/internal/build-runtime.d.ts\",\n \"import\": \"./dist/internal/build-runtime.mjs\",\n \"require\": \"./dist/internal/build-runtime.cjs\"\n },\n \"./internal/config-runtime\": {\n \"types\": \"./dist/internal/config-runtime.d.ts\",\n \"import\": \"./dist/internal/config-runtime.mjs\",\n \"require\": \"./dist/internal/config-runtime.cjs\"\n },\n \"./internal/production-node-env\": {\n \"types\": \"./dist/internal/production-node-env.d.ts\",\n \"import\": \"./dist/internal/production-node-env.mjs\",\n \"require\": \"./dist/internal/production-node-env.cjs\"\n }\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"build:runtime\": \"tsup --config tsup.runtime.config.ts\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:coverage\": \"vitest --coverage\",\n \"lint\": \"biome lint .\",\n \"lint:fix\": \"biome lint --write .\",\n \"format\": \"biome format --write .\",\n \"type-check\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"dependencies\": {\n \"@farming-labs/docs\": \"^0.2.44\",\n \"@farming-labs/orm\": \"0.0.62\",\n \"@farming-labs/orm-runtime\": \"0.0.62\",\n \"@formatjs/icu-messageformat-parser\": \"3.5.15\",\n \"@jridgewell/trace-mapping\": \"0.3.31\",\n \"@mdx-js/mdx\": \"^3.1.1\",\n \"@opentelemetry/api\": \"1.9.1\",\n \"@scalar/api-reference\": \"^1.38.1\",\n \"@scalar/openapi-parser\": \"^0.22.3\",\n \"@tailwindcss/vite\": \"4.1.18\",\n \"@vercel/og\": \"0.11.1\",\n \"@vitejs/plugin-react\": \"^4.2.1\",\n \"better-call\": \"^1.0.19\",\n \"db0\": \"^0.3.4\",\n \"es-module-lexer\": \"2.0.0\",\n \"esbuild\": \"^0.28.0\",\n \"fast-glob\": \"^3.3.2\",\n \"h3\": \"2.0.1-rc.5\",\n \"image-size\": \"^2.0.2\",\n \"intl-messageformat\": \"11.2.12\",\n \"marked\": \"^12.0.2\",\n \"nitro\": \"3.0.1-alpha.0\",\n \"pg\": \"^8.20.0\",\n \"picocolors\": \"^1.0.0\",\n \"remark-gfm\": \"^4.0.1\",\n \"sirv\": \"^2.0.4\",\n \"sugar-high\": \"^0.9.5\",\n \"supports-color\": \"^10.2.2\",\n \"tailwindcss\": \"4.1.18\",\n \"unstorage\": \"^2.0.0-alpha.3\",\n \"vite\": \"^5.0.10\",\n \"zod\": \"^4.1.12\"\n },\n \"devDependencies\": {\n \"@clerk/react\": \"^6.1.0\",\n \"@farm.js/otel\": \"workspace:*\",\n \"@farm.js/renderer-tests\": \"workspace:*\",\n \"@opentelemetry/sdk-node\": \"0.221.0\",\n \"@opentelemetry/sdk-trace-base\": \"2.10.0\",\n \"@types/react\": \"^18.2.45\",\n \"@types/react-dom\": \"^18.2.18\",\n \"@vitest/coverage-v8\": \"^3.2.7\",\n \"jsdom\": \"^25.0.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.3.3\",\n \"vitest\": \"^3.2.7\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.2.0 || ^19.0.0\",\n \"react-dom\": \"^18.2.0 || ^19.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"react\": {\n \"optional\": true\n },\n \"react-dom\": {\n \"optional\": true\n }\n },\n \"optionalDependencies\": {\n \"rolldown\": \"1.2.0\",\n \"sharp\": \"^0.34.5\",\n \"vite-rolldown\": \"npm:vite@8.1.5\"\n },\n \"engines\": {\n \"node\": \">=22.13.0\"\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEE,cAAW;;;ADAN,IAAM,eAAe;","names":[]}
|