@farm.js/core 0.1.0-beta.21 → 0.1.0-beta.23
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.d.mts +25 -0
- package/dist/after.d.ts +25 -0
- package/dist/agent-runtime.d.mts +97 -0
- package/dist/agent-runtime.d.ts +97 -0
- package/dist/api/route-manager.d.mts +68 -0
- package/dist/api/route-manager.d.ts +68 -0
- package/dist/api/runtime.d.mts +3 -0
- package/dist/api/runtime.d.ts +3 -0
- package/dist/api.cjs +22 -19
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.mts +50 -0
- package/dist/api.d.ts +50 -0
- package/dist/api.mjs +2 -1
- package/dist/app-CTFnOJaI.d.ts +308 -0
- package/dist/app-DA6ospIq.d.mts +308 -0
- package/dist/app-markdown.d.mts +25 -0
- package/dist/app-markdown.d.ts +25 -0
- package/dist/cache.d.mts +192 -0
- package/dist/cache.d.ts +192 -0
- package/dist/{chunk-MIUW47JX.mjs → chunk-2PEJGY5V.mjs} +15 -20
- package/dist/chunk-2PEJGY5V.mjs.map +1 -0
- package/dist/{chunk-RIXKJPGI.mjs → chunk-42325TLU.mjs} +2 -2
- package/dist/chunk-4IVNW5QD.mjs +82 -0
- package/dist/chunk-4IVNW5QD.mjs.map +1 -0
- package/dist/{chunk-I3UWA2P2.mjs → chunk-5NOVWCFL.mjs} +2 -2
- package/dist/chunk-5NOVWCFL.mjs.map +1 -0
- package/dist/chunk-D42BNPZH.mjs +79 -0
- package/dist/chunk-D42BNPZH.mjs.map +1 -0
- package/dist/{chunk-LLPN5SEZ.mjs → chunk-DVPRBMU2.mjs} +2 -2
- package/dist/{chunk-VIC7NJ77.mjs → chunk-FJGTYLCO.mjs} +67 -20
- package/dist/chunk-FJGTYLCO.mjs.map +1 -0
- package/dist/chunk-GIELMNBG.mjs +15 -0
- package/dist/chunk-GIELMNBG.mjs.map +1 -0
- package/dist/chunk-GQVQESLY.mjs +25 -0
- package/dist/chunk-GQVQESLY.mjs.map +1 -0
- package/dist/chunk-H53KVQUU.mjs +48 -0
- package/dist/chunk-H53KVQUU.mjs.map +1 -0
- package/dist/chunk-HCGQYYHI.mjs +1 -0
- package/dist/chunk-HCGQYYHI.mjs.map +1 -0
- package/dist/{chunk-4EATUJFO.mjs → chunk-ICTGDDV4.mjs} +20 -22
- package/dist/chunk-ICTGDDV4.mjs.map +1 -0
- package/dist/{chunk-UCYWGN2P.mjs → chunk-OHNSROHS.mjs} +1 -1
- package/dist/{chunk-FRPWCMMG.mjs → chunk-SBWOTAX4.mjs} +63 -2
- package/dist/chunk-SBWOTAX4.mjs.map +1 -0
- package/dist/{chunk-FKKM7HVF.mjs → chunk-TX54PXAJ.mjs} +109 -58
- package/dist/chunk-TX54PXAJ.mjs.map +1 -0
- package/dist/{chunk-CEVMYGDL.mjs → chunk-YD5IRKVS.mjs} +13 -9
- package/dist/chunk-YD5IRKVS.mjs.map +1 -0
- package/dist/chunk-recovery-lnQFzcQP.d.mts +26 -0
- package/dist/chunk-recovery-lnQFzcQP.d.ts +26 -0
- package/dist/client-BT1mFQas.d.mts +447 -0
- package/dist/client-Nn0q4eO4.d.ts +447 -0
- package/dist/client-cache-CIlyBlmx.d.ts +6 -0
- package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
- package/dist/client-plugins-CCilIb_G.d.mts +2092 -0
- package/dist/client-plugins-DuuleQKk.d.ts +2092 -0
- package/dist/client-plugins.d.mts +25 -0
- package/dist/client-plugins.d.ts +25 -0
- package/dist/client.cjs +122 -35
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.mts +454 -0
- package/dist/client.d.ts +454 -0
- package/dist/client.mjs +13 -2
- package/dist/config.d.mts +32 -0
- package/dist/config.d.ts +32 -0
- package/dist/cron.d.mts +78 -0
- package/dist/cron.d.ts +78 -0
- package/dist/deferred.d.mts +42 -0
- package/dist/deferred.d.ts +42 -0
- package/dist/deployment.d.mts +36 -0
- package/dist/deployment.d.ts +36 -0
- package/dist/{devtools-52FYXIEK.mjs → devtools-326RBQCN.mjs} +7 -6
- package/dist/{devtools-52FYXIEK.mjs.map → devtools-326RBQCN.mjs.map} +1 -1
- package/dist/docs.cjs.map +1 -1
- package/dist/docs.d.mts +80 -0
- package/dist/docs.d.ts +80 -0
- package/dist/docs.mjs +6 -5
- package/dist/env-types.d.mts +12 -0
- package/dist/env-types.d.ts +12 -0
- package/dist/env.d.mts +45 -0
- package/dist/env.d.ts +45 -0
- package/dist/environment/vite.d.mts +22 -0
- package/dist/environment/vite.d.ts +22 -0
- package/dist/environment.d.mts +18 -0
- package/dist/environment.d.ts +18 -0
- package/dist/font.d.mts +95 -0
- package/dist/font.d.ts +95 -0
- package/dist/headers.d.mts +22 -0
- package/dist/headers.d.ts +22 -0
- package/dist/i18n/client.d.mts +32 -0
- package/dist/i18n/client.d.ts +32 -0
- package/dist/i18n/index.d.mts +20 -0
- package/dist/i18n/index.d.ts +20 -0
- package/dist/i18n/server.d.mts +30 -0
- package/dist/i18n/server.d.ts +30 -0
- package/dist/image/server.d.mts +37 -0
- package/dist/image/server.d.ts +37 -0
- package/dist/image/sharp.d.mts +7 -0
- package/dist/image/sharp.d.ts +7 -0
- package/dist/image-config-Duob7wER.d.mts +50 -0
- package/dist/image-config-Duob7wER.d.ts +50 -0
- package/dist/image.d.mts +39 -0
- package/dist/image.d.ts +39 -0
- package/dist/index.cjs +496 -123
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +480 -0
- package/dist/index.d.ts +480 -0
- package/dist/index.mjs +70 -52
- package/dist/index.mjs.map +1 -1
- package/dist/integration-api-CHT2OKAf.d.mts +93 -0
- package/dist/integration-api-CHT2OKAf.d.ts +93 -0
- package/dist/integrations.d.mts +25 -0
- package/dist/integrations.d.ts +25 -0
- package/dist/internal/build-runtime.cjs +386 -83
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.d.mts +42 -0
- package/dist/internal/build-runtime.d.ts +42 -0
- package/dist/internal/build-runtime.mjs +17 -13
- package/dist/internal/client-runtime.d.mts +17 -0
- package/dist/internal/client-runtime.d.ts +17 -0
- package/dist/internal/config-runtime.cjs +41 -0
- package/dist/internal/config-runtime.cjs.map +1 -1
- package/dist/internal/config-runtime.d.mts +42 -0
- package/dist/internal/config-runtime.d.ts +42 -0
- package/dist/internal/config-runtime.mjs +5 -4
- package/dist/internal/metadata-image-runtime.d.mts +25 -0
- package/dist/internal/metadata-image-runtime.d.ts +25 -0
- package/dist/internal/production-node-env.d.mts +12 -0
- package/dist/internal/production-node-env.d.ts +12 -0
- package/dist/internal/production-runtime.cjs +178 -0
- package/dist/internal/production-runtime.cjs.map +1 -1
- package/dist/internal/production-runtime.d.mts +80 -0
- package/dist/internal/production-runtime.d.ts +80 -0
- package/dist/internal/production-runtime.mjs +13 -1
- package/dist/internal/production-runtime.mjs.map +1 -1
- package/dist/island-CfGru1MO.d.mts +9 -0
- package/dist/island-CfGru1MO.d.ts +9 -0
- package/dist/markdown.d.mts +60 -0
- package/dist/markdown.d.ts +60 -0
- package/dist/metadata-DyPRG0wX.d.ts +22 -0
- package/dist/metadata-_GHcAySx.d.mts +22 -0
- package/dist/middleware.cjs +17 -17
- package/dist/middleware.cjs.map +1 -1
- package/dist/middleware.d.mts +172 -0
- package/dist/middleware.d.ts +172 -0
- package/dist/middleware.mjs +3 -2
- package/dist/navigation-errors-Dvwpzaer.d.mts +13 -0
- package/dist/navigation-errors-Dvwpzaer.d.ts +13 -0
- package/dist/navigation.d.mts +14 -0
- package/dist/navigation.d.ts +14 -0
- package/dist/observability.d.mts +335 -0
- package/dist/observability.d.ts +335 -0
- package/dist/params-BALtrRim.d.ts +15 -0
- package/dist/params-ry-lxqmy.d.mts +15 -0
- package/dist/plugin-BJDf43dc.d.mts +165 -0
- package/dist/plugin-BJDf43dc.d.ts +165 -0
- package/dist/plugin.cjs +261 -62
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.mts +25 -0
- package/dist/plugin.d.ts +25 -0
- package/dist/plugin.mjs +13 -9
- package/dist/production-runtime-C4cO3esK.d.mts +81 -0
- package/dist/production-runtime-DrEy8kBO.d.ts +81 -0
- package/dist/query/client.d.mts +61 -0
- package/dist/query/client.d.ts +61 -0
- package/dist/query/index.d.mts +90 -0
- package/dist/query/index.d.ts +90 -0
- package/dist/query/parsers.d.mts +25 -0
- package/dist/query/parsers.d.ts +25 -0
- package/dist/query/server.d.mts +55 -0
- package/dist/query/server.d.ts +55 -0
- package/dist/request-B2PpOxYK.d.mts +6 -0
- package/dist/request-D40lt6aN.d.ts +6 -0
- package/dist/request.d.mts +26 -0
- package/dist/request.d.ts +26 -0
- package/dist/resolver-DJqjLMg_.d.mts +14 -0
- package/dist/resolver-IH4RmPEl.d.ts +14 -0
- package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
- package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
- package/dist/router.d.mts +36 -0
- package/dist/router.d.ts +36 -0
- package/dist/routes.d.mts +227 -0
- package/dist/routes.d.ts +227 -0
- package/dist/runtime-Bpp-c28k.d.ts +231 -0
- package/dist/runtime-Cxpq6xZN.d.mts +27 -0
- package/dist/runtime-Q3u74Nbq.d.mts +231 -0
- package/dist/runtime-bv63eUiO.d.ts +27 -0
- package/dist/server-action-security.d.mts +45 -0
- package/dist/server-action-security.d.ts +45 -0
- package/dist/server-fn-client.d.mts +33 -0
- package/dist/server-fn-client.d.ts +33 -0
- package/dist/server-fn-error-DDh14a0V.d.mts +26 -0
- package/dist/server-fn-error-DDh14a0V.d.ts +26 -0
- package/dist/server-fn.d.mts +121 -0
- package/dist/server-fn.d.ts +121 -0
- package/dist/server-plugins.d.mts +58 -0
- package/dist/server-plugins.d.ts +58 -0
- package/dist/server-query-client.d.mts +51 -0
- package/dist/server-query-client.d.ts +51 -0
- package/dist/server-query.d.mts +37 -0
- package/dist/server-query.d.ts +37 -0
- package/dist/server.cjs +285 -85
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.mts +53 -0
- package/dist/server.d.ts +53 -0
- package/dist/server.mjs +26 -31
- package/dist/server.mjs.map +1 -1
- package/dist/storage.d.mts +52 -0
- package/dist/storage.d.ts +52 -0
- package/dist/testing.d.mts +104 -0
- package/dist/testing.d.ts +104 -0
- package/dist/theme/client.cjs +115 -0
- package/dist/theme/client.cjs.map +1 -0
- package/dist/theme/client.d.mts +17 -0
- package/dist/theme/client.d.ts +17 -0
- package/dist/theme/client.mjs +16 -0
- package/dist/theme/client.mjs.map +1 -0
- package/dist/theme/index.cjs +71 -0
- package/dist/theme/index.cjs.map +1 -0
- package/dist/theme/index.d.mts +6 -0
- package/dist/theme/index.d.ts +6 -0
- package/dist/theme/index.mjs +9 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/theme/server.cjs +191 -0
- package/dist/theme/server.cjs.map +1 -0
- package/dist/theme/server.d.mts +8 -0
- package/dist/theme/server.d.ts +8 -0
- package/dist/theme/server.mjs +18 -0
- package/dist/theme/server.mjs.map +1 -0
- package/dist/transport-BmbGTXA5.d.mts +49 -0
- package/dist/transport-BmbGTXA5.d.ts +49 -0
- package/dist/types-BMxWr97v.d.mts +81 -0
- package/dist/types-BMxWr97v.d.ts +81 -0
- package/dist/types-CsR8fpgF.d.mts +30 -0
- package/dist/types-CsR8fpgF.d.ts +30 -0
- package/dist/types-D1A6-XvH.d.mts +73 -0
- package/dist/types-D1A6-XvH.d.ts +73 -0
- package/dist/types-DTzm4TCl.d.mts +78 -0
- package/dist/types-DTzm4TCl.d.ts +78 -0
- package/dist/utils-3sQgfkya.d.ts +23 -0
- package/dist/utils-Bop7bly-.d.mts +23 -0
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.mts +3 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +285 -64
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.mts +25 -0
- package/dist/vite.d.ts +25 -0
- package/dist/vite.mjs +13 -9
- package/dist/workflows-CusFV6mn.d.mts +153 -0
- package/dist/workflows-CusFV6mn.d.ts +153 -0
- package/dist/workflows.d.mts +1 -0
- package/dist/workflows.d.ts +1 -0
- package/package.json +25 -1
- package/dist/chunk-4EATUJFO.mjs.map +0 -1
- package/dist/chunk-CEVMYGDL.mjs.map +0 -1
- package/dist/chunk-FKKM7HVF.mjs.map +0 -1
- package/dist/chunk-FRPWCMMG.mjs.map +0 -1
- package/dist/chunk-I3UWA2P2.mjs.map +0 -1
- package/dist/chunk-MIUW47JX.mjs.map +0 -1
- package/dist/chunk-VIC7NJ77.mjs.map +0 -1
- /package/dist/{chunk-RIXKJPGI.mjs.map → chunk-42325TLU.mjs.map} +0 -0
- /package/dist/{chunk-LLPN5SEZ.mjs.map → chunk-DVPRBMU2.mjs.map} +0 -0
- /package/dist/{chunk-UCYWGN2P.mjs.map → chunk-OHNSROHS.mjs.map} +0 -0
|
@@ -20,27 +20,30 @@ import {
|
|
|
20
20
|
loadFarmConfigFile,
|
|
21
21
|
resolveFarmLayers
|
|
22
22
|
} from "./chunk-74YTBPTY.mjs";
|
|
23
|
+
import {
|
|
24
|
+
resolveFarmImageConfig
|
|
25
|
+
} from "./chunk-GY2STC2S.mjs";
|
|
23
26
|
import {
|
|
24
27
|
resolveFarmPerformanceConfig
|
|
25
28
|
} from "./chunk-7ZVN3YZI.mjs";
|
|
26
29
|
import {
|
|
27
|
-
|
|
28
|
-
} from "./chunk-
|
|
30
|
+
resolveWorkflowsConfig
|
|
31
|
+
} from "./chunk-4E6VRJ6P.mjs";
|
|
32
|
+
import {
|
|
33
|
+
resolveCronConfig
|
|
34
|
+
} from "./chunk-GXASWWJU.mjs";
|
|
29
35
|
import {
|
|
30
36
|
resolveServerActionsConfig
|
|
31
37
|
} from "./chunk-WORFTBLU.mjs";
|
|
38
|
+
import {
|
|
39
|
+
resolveFarmThemeConfig
|
|
40
|
+
} from "./chunk-H53KVQUU.mjs";
|
|
32
41
|
import {
|
|
33
42
|
resolveMdxConfig
|
|
34
43
|
} from "./chunk-ZVWA4ZQ3.mjs";
|
|
35
44
|
import {
|
|
36
45
|
resolveMarkdownConfig
|
|
37
46
|
} from "./chunk-7FBJLMQH.mjs";
|
|
38
|
-
import {
|
|
39
|
-
resolveWorkflowsConfig
|
|
40
|
-
} from "./chunk-4E6VRJ6P.mjs";
|
|
41
|
-
import {
|
|
42
|
-
resolveCronConfig
|
|
43
|
-
} from "./chunk-GXASWWJU.mjs";
|
|
44
47
|
import {
|
|
45
48
|
resolveIntegrationPlugins
|
|
46
49
|
} from "./chunk-CRN3AH35.mjs";
|
|
@@ -406,6 +409,7 @@ async function resolveConfig(userConfig, mode) {
|
|
|
406
409
|
routeRules,
|
|
407
410
|
images: resolveFarmImageConfig(userConfig.images),
|
|
408
411
|
performance: resolveFarmPerformanceConfig(userConfig.performance),
|
|
412
|
+
theme: resolveFarmThemeConfig(userConfig.theme, userConfig.basePath || "/"),
|
|
409
413
|
publicDir: userConfig.publicDir || "public",
|
|
410
414
|
i18n: resolveFarmI18nConfig(userConfig.i18n, { root, mode }),
|
|
411
415
|
openapi: {
|
|
@@ -497,4 +501,4 @@ export {
|
|
|
497
501
|
resolveConfig,
|
|
498
502
|
loadConfig
|
|
499
503
|
};
|
|
500
|
-
//# sourceMappingURL=chunk-
|
|
504
|
+
//# sourceMappingURL=chunk-YD5IRKVS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts"],"sourcesContent":["import type {\n FarmConfig as BaseFarmConfig,\n FarmMigrationCommand,\n FarmMigrationsConfig,\n FarmMigrationsUserConfig,\n ResolvedFarmMigrationsConfig,\n} from \"./types\";\nimport type { DocsConfig } from \"@farming-labs/docs\";\nimport type { FarmDocsResolvedConfig, FarmDocsUserConfig } from \"./docs/types\";\nimport type { FarmIntegrationsUserConfig } from \"./integrations\";\nimport type { FarmMarkdownResolvedConfig, FarmMarkdownUserConfig } from \"./markdown\";\nimport type { FarmObservabilityUserConfig } from \"./observability\";\nimport type { FarmMiddlewareConfig } from \"./middleware/types\";\nimport type { FarmPlugin } from \"./plugin\";\nimport type { FarmWorkflowsResolvedConfig, FarmWorkflowsUserConfig } from \"./workflows\";\nimport type { FarmCronResolvedConfig, FarmCronUserConfig } from \"./cron\";\nimport type { FarmEnvConfig, ResolvedFarmEnv } from \"./env\";\nimport type { UserConfig as ViteUserConfig } from \"vite\";\nimport { resolveIntegrationPlugins } from \"./integrations\";\nimport { resolveMarkdownConfig } from \"./markdown\";\nimport { resolveWorkflowsConfig } from \"./workflows\";\nimport { resolveCronConfig } from \"./cron\";\nimport { resolveEnv, setEnv } from \"./env\";\nimport {\n resolveMdxConfig,\n type FarmMdxResolvedConfig,\n type FarmMdxUserConfig,\n} from \"./app-markdown\";\nimport {\n normalizeRouteRules,\n routeRulesToHeaders,\n routeRulesToRedirects,\n type FarmRouteRules,\n} from \"./route-rules\";\nimport {\n resolveServerActionsConfig,\n type FarmServerActionsConfig,\n type ResolvedFarmServerActionsConfig,\n} from \"./server-action-security\";\nimport {\n resolveFarmServerConfig,\n type FarmServerConfig,\n type ResolvedFarmServerConfig,\n} from \"./server-http\";\nimport {\n loadFarmConfigFile,\n resolveFarmLayers,\n type FarmLayerEntry,\n type ResolvedFarmLayer,\n} from \"./layers\";\nimport path from \"path\";\nimport { normalizeFarmDeploymentId } from \"./deployment\";\nimport { resolveFarmDevtoolsConfig, type ResolvedFarmDevtoolsConfig } from \"./devtools-config\";\nimport {\n resolveFarmImageConfig,\n type FarmImageConfig,\n type ResolvedFarmImageConfig,\n} from \"./image-config\";\nimport { resolveFarmI18nConfig } from \"./i18n/config\";\nimport type { FarmI18nUserConfig, ResolvedFarmI18nConfig } from \"./i18n/types\";\nimport type { FarmCacheUserConfig } from \"./cache\";\nimport {\n resolveFarmAuthConfig,\n resolveFarmAuthIntegration,\n type FarmAuthUserConfig,\n type ResolvedFarmAuthConfig,\n} from \"./auth-config\";\nimport { resolveFarmPerformanceConfig, type ResolvedFarmPerformanceConfig } from \"./preload\";\nimport {\n getFarmSecurityHeader,\n resolveFarmSecurityConfig,\n type FarmCspConfig,\n type FarmCspDirectives,\n type FarmCspDirectiveValue,\n type FarmCspOptions,\n type FarmSecurityConfig,\n type ResolvedFarmCspConfig,\n type ResolvedFarmSecurityConfig,\n} from \"./security\";\nimport { resolveFarmThemeConfig } from \"./theme/config\";\nimport type { ResolvedFarmThemeConfig } from \"./theme/types\";\n\nconst FARM_RESOLVED_CUSTOM_CONTEXT = Symbol.for(\"farm.resolvedCustomContext\");\n\nexport type {\n FarmDocsConfigInput,\n FarmDocsNavigationConfig,\n FarmDocsResolvedConfig,\n FarmDocsSidebarItem,\n FarmDocsUserConfig,\n} from \"./docs/types\";\nexport type {\n FarmMarkdownResolvedConfig,\n FarmMarkdownRouteInput,\n FarmMarkdownUserConfig,\n} from \"./markdown\";\nexport type { FarmMdxComponents, FarmMdxResolvedConfig, FarmMdxUserConfig } from \"./app-markdown\";\nexport type {\n FarmMigrationCommand,\n FarmMigrationsConfig,\n FarmMigrationsUserConfig,\n ResolvedFarmMigrationsConfig,\n} from \"./types\";\nexport type { FarmWorkflowsResolvedConfig, FarmWorkflowsUserConfig } from \"./workflows\";\nexport type { FarmCronJobConfig, FarmCronResolvedConfig, FarmCronUserConfig } from \"./cron\";\nexport type {\n FarmRouteRule,\n FarmRouteRuleCors,\n FarmRouteRuleRedirect,\n FarmRouteRuleRenderMode,\n FarmRouteRules,\n} from \"./route-rules\";\nexport type {\n FarmServerActionsConfig,\n ResolvedFarmServerActionsConfig,\n} from \"./server-action-security\";\nexport type {\n FarmServerConfig,\n FarmServerDuration,\n FarmServerHealthConfig,\n ResolvedFarmServerConfig,\n ResolvedFarmServerHealthConfig,\n} from \"./server-http\";\nexport type { FarmLayerEntry, ResolvedFarmLayer } from \"./layers\";\nexport type {\n FarmDevtoolsConfig,\n FarmDevtoolsUserConfig,\n ResolvedFarmDevtoolsConfig,\n} from \"./devtools-config\";\nexport type {\n FarmPerformanceConfig,\n FarmPreloadMode,\n FarmPreloadUserConfig,\n ResolvedFarmPerformanceConfig,\n ResolvedFarmPreloadConfig,\n} from \"./preload\";\nexport type {\n FarmImageConfig,\n FarmImageFormat,\n FarmImageLocalPattern,\n FarmImageProvider,\n FarmImageRemotePattern,\n ResolvedFarmImageConfig,\n} from \"./image-config\";\nexport type {\n FarmI18nCookieConfig,\n FarmI18nDetectionSignal,\n FarmI18nDirection,\n FarmI18nRouting,\n FarmI18nUserConfig,\n ResolvedFarmI18nConfig,\n} from \"./i18n/types\";\nexport type {\n FarmAuthConfig,\n FarmAuthDatabaseConfig,\n FarmAuthEmailAndPasswordConfig,\n FarmAuthSessionConfig,\n FarmAuthUserConfig,\n ResolvedFarmAuthConfig,\n} from \"./auth-config\";\nexport type {\n FarmCspConfig,\n FarmCspDirectives,\n FarmCspDirectiveValue,\n FarmCspOptions,\n FarmSecurityConfig,\n ResolvedFarmCspConfig,\n ResolvedFarmSecurityConfig,\n} from \"./security\";\n\nexport interface RedirectConfig {\n source: string;\n destination: string;\n permanent?: boolean;\n statusCode?: number;\n}\n\nexport interface HeaderConfig {\n source: string;\n headers: Array<{\n key: string;\n value: string;\n }>;\n}\n\nexport interface RewriteConfig {\n source: string;\n destination: string;\n}\n\n/** @deprecated Use FarmImageConfig. */\nexport type ImageConfig = FarmImageConfig;\n\n/** @deprecated Use FarmI18nUserConfig. */\nexport type I18nConfig = FarmI18nUserConfig;\n\nexport interface OpenAPIConfig {\n enabled?: boolean;\n route?: string;\n title?: string;\n description?: string;\n version?: string;\n servers?: Array<{\n url: string;\n description?: string;\n }>;\n contact?: {\n name?: string;\n email?: string;\n url?: string;\n };\n license?: {\n name: string;\n url?: string;\n };\n}\n\nexport type MiddlewareConfig = FarmMiddlewareConfig;\n\nexport interface NotFoundConfig {\n /** Path to a custom 404 page component (e.g., \"./src/app/not-found.tsx\") */\n component?: string;\n}\n\nexport type FarmDeployTarget = \"vercel\" | \"cloudflare\" | \"netlify\" | \"node\" | string;\n\nexport interface FarmDeployConfig {\n /**\n * Deployment platform. When present, Farm picks the matching Nitro preset and\n * output directory unless explicitly overridden.\n */\n target?: FarmDeployTarget;\n /** Nitro preset override. Usually inferred from target. */\n preset?: BaseFarmConfig[\"preset\"];\n /** Deployable output directory, relative to project root unless absolute. */\n outputDir?: string;\n /** Alias for outputDir for terser config. */\n output?: string;\n /** Cloudflare Pages project name used by `farm deploy --cloudflare`. */\n projectName?: string;\n vercel?: {\n outputDirectory?: string;\n buildCommand?: string;\n installCommand?: string;\n framework?: string | null;\n };\n cloudflare?: {\n outputDir?: string;\n projectName?: string;\n };\n netlify?: {\n outputDir?: string;\n site?: string;\n };\n}\n\nexport interface ResolvedFarmDeployConfig extends Omit<FarmDeployConfig, \"output\"> {\n target?: FarmDeployTarget;\n preset: BaseFarmConfig[\"preset\"];\n outputDir: string;\n}\n\nexport interface FarmUserConfig extends Omit<BaseFarmConfig, \"vite\" | \"docs\" | \"env\" | \"layers\"> {\n /** Reusable Farm directories or installed packages, applied from left to right. */\n extends?: readonly FarmLayerEntry[];\n /** Global plugins. Integration-bound plugins must be contributed through an integration. */\n plugins?: FarmPlugin<any, any, any, any, unknown, false>[];\n integrations?: FarmIntegrationsUserConfig;\n /**\n * Farm-native authentication. `true` enables email/password auth with\n * server helpers from `@farm.js/auth/server` and React APIs from\n * `@farm.js/auth/client`.\n */\n auth?: FarmAuthUserConfig;\n /** Shared application data, route, ISR, and PPR cache. */\n cache?: FarmCacheUserConfig;\n migrations?: FarmMigrationsUserConfig;\n /** Map portable cron schedules to ordinary GET API routes. */\n cron?: FarmCronUserConfig | FarmCronResolvedConfig | false;\n workflows?: FarmWorkflowsUserConfig | boolean;\n preset?: BaseFarmConfig[\"preset\"];\n deploy?: FarmDeployConfig;\n docs?: FarmDocsUserConfig;\n md?: FarmMarkdownUserConfig | boolean;\n mdx?: FarmMdxUserConfig;\n observability?: FarmObservabilityUserConfig;\n\n trailingSlash?: boolean;\n redirects?: () => Promise<RedirectConfig[]> | RedirectConfig[];\n rewrites?: () => Promise<RewriteConfig[]> | RewriteConfig[];\n headers?: () => Promise<HeaderConfig[]> | HeaderConfig[];\n\n images?: ImageConfig;\n publicDir?: string;\n\n i18n?: FarmI18nUserConfig | false;\n openapi?: OpenAPIConfig;\n\n middleware?: FarmMiddlewareConfig;\n routeRules?: FarmRouteRules;\n context?: BaseFarmConfig[\"context\"];\n /** Server ingress and trusted-proxy policy. */\n server?: FarmServerConfig;\n serverActions?: FarmServerActionsConfig;\n /** Build identifier used to detect and recover from deployment version skew. */\n deploymentId?: string;\n\n notFound?: NotFoundConfig;\n\n output?: \"standalone\" | \"static\" | \"export\";\n distDir?: string;\n generateBuildId?: () => string | Promise<string>;\n compress?: boolean;\n\n devIndicators?: {\n buildActivity?: boolean;\n buildActivityPosition?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n };\n\n serverRuntimeConfig?: Record<string, any>;\n publicRuntimeConfig?: Record<string, any>;\n\n env?: FarmEnvConfig<any, any>;\n\n typescript?: {\n tsconfigPath?: string;\n ignoreBuildErrors?: boolean;\n };\n\n vite?: ViteUserConfig | ((config: ViteUserConfig) => ViteUserConfig);\n\n [key: string]: any;\n}\n\nexport interface ResolvedFarmConfig extends Required<\n Omit<\n FarmUserConfig,\n | \"extends\"\n | \"plugins\"\n | \"vite\"\n | \"deploy\"\n | \"docs\"\n | \"md\"\n | \"mdx\"\n | \"migrations\"\n | \"cron\"\n | \"workflows\"\n | \"env\"\n | \"server\"\n | \"serverActions\"\n | \"devtools\"\n | \"images\"\n | \"i18n\"\n | \"auth\"\n | \"performance\"\n | \"security\"\n | \"theme\"\n >\n> {\n /** @internal Tracks whether `context` came from user/layer config instead of the default noop. */\n [FARM_RESOLVED_CUSTOM_CONTEXT]?: boolean;\n extends: readonly FarmLayerEntry[];\n layers: ResolvedFarmLayer[];\n plugins: FarmPlugin[];\n vite: ViteUserConfig;\n deploy: ResolvedFarmDeployConfig;\n docs: FarmDocsResolvedConfig;\n md: FarmMarkdownResolvedConfig;\n mdx: FarmMdxResolvedConfig;\n migrations: ResolvedFarmMigrationsConfig;\n cron: FarmCronResolvedConfig;\n workflows: FarmWorkflowsResolvedConfig;\n env: ResolvedFarmEnv;\n server: ResolvedFarmServerConfig;\n serverActions: ResolvedFarmServerActionsConfig;\n devtools: ResolvedFarmDevtoolsConfig;\n images: ResolvedFarmImageConfig;\n i18n: ResolvedFarmI18nConfig;\n auth: ResolvedFarmAuthConfig;\n performance: ResolvedFarmPerformanceConfig;\n security: ResolvedFarmSecurityConfig;\n theme: ResolvedFarmThemeConfig;\n routeRules: FarmRouteRules;\n}\n\nexport function hasCustomFarmRouteContext(config: ResolvedFarmConfig): boolean {\n return config[FARM_RESOLVED_CUSTOM_CONTEXT] === true;\n}\n\nexport type FarmLayerConfig = Omit<\n FarmUserConfig,\n | \"root\"\n | \"outDir\"\n | \"distDir\"\n | \"deploy\"\n | \"output\"\n | \"preset\"\n | \"publicDir\"\n | \"generateBuildId\"\n | \"deploymentId\"\n>;\n\nexport { defineConfig, defineFarmConfig } from \"./config-entry\";\n\nexport function normalizeDeployTarget(target?: FarmDeployTarget): FarmDeployTarget | undefined {\n if (!target) return undefined;\n if (target === \"cloudflare-pages\" || target === \"cloudflare_pages\") return \"cloudflare\";\n if (target === \"node-server\" || target === \"nitro\") return \"node\";\n return target;\n}\n\nexport function getPresetForDeployTarget(\n target?: FarmDeployTarget,\n): BaseFarmConfig[\"preset\"] | undefined {\n switch (normalizeDeployTarget(target)) {\n case \"vercel\":\n return \"vercel\";\n case \"cloudflare\":\n return \"cloudflare-pages\";\n case \"netlify\":\n return \"netlify\";\n case \"node\":\n return \"node-server\";\n default:\n return undefined;\n }\n}\n\nexport function getDeployTargetForPreset(preset?: string): FarmDeployTarget | undefined {\n if (!preset) return undefined;\n if (preset === \"vercel\" || preset === \"vercel-edge\") return \"vercel\";\n if (preset === \"cloudflare\" || preset === \"cloudflare-pages\" || preset === \"cloudflare-module\") {\n return \"cloudflare\";\n }\n if (preset === \"netlify\" || preset === \"netlify-edge\") return \"netlify\";\n if (preset === \"node-server\") return \"node\";\n return undefined;\n}\n\nexport function getDefaultDeployOutputDir(\n target: FarmDeployTarget | undefined,\n preset: string | undefined,\n distDir: string,\n): string {\n const normalizedTarget = normalizeDeployTarget(target) || getDeployTargetForPreset(preset);\n if (normalizedTarget === \"vercel\") return \".vercel/output\";\n return `${distDir}/.output`;\n}\n\nexport function resolveDeployOutputPath(root: string, outputDir: string): string {\n return path.isAbsolute(outputDir) ? outputDir : path.join(root, outputDir);\n}\n\nexport function resolveDeployConfig(\n config: Pick<FarmUserConfig, \"deploy\" | \"preset\" | \"distDir\">,\n overrides: {\n target?: FarmDeployTarget;\n preset?: BaseFarmConfig[\"preset\"];\n outputDir?: string;\n } = {},\n): ResolvedFarmDeployConfig {\n const deploy = config.deploy || {};\n const distDir = config.distDir || \".farm\";\n const target = normalizeDeployTarget(overrides.target || deploy.target);\n const preset =\n overrides.preset ||\n deploy.preset ||\n config.preset ||\n getPresetForDeployTarget(target) ||\n \"node-server\";\n const resolvedTarget = target || getDeployTargetForPreset(preset);\n const platformOutput =\n resolvedTarget === \"vercel\"\n ? deploy.vercel?.outputDirectory\n : resolvedTarget === \"cloudflare\"\n ? deploy.cloudflare?.outputDir\n : resolvedTarget === \"netlify\"\n ? deploy.netlify?.outputDir\n : undefined;\n const outputDir =\n overrides.outputDir ||\n deploy.outputDir ||\n deploy.output ||\n platformOutput ||\n getDefaultDeployOutputDir(resolvedTarget, preset, distDir);\n\n return {\n ...deploy,\n target: resolvedTarget,\n preset,\n outputDir,\n };\n}\n\nexport function resolveMigrationsConfig(\n migrations: FarmMigrationsUserConfig | undefined,\n): ResolvedFarmMigrationsConfig {\n if (!migrations) return { commands: [] };\n if (Array.isArray(migrations)) return { commands: migrations };\n return { commands: migrations.commands || [] };\n}\n\nexport const DOCS_CONFIG_FILENAMES = [\n \"docs.config.ts\",\n \"docs.config.tsx\",\n \"docs.config.mts\",\n \"docs.config.cts\",\n \"docs.config.js\",\n \"docs.config.jsx\",\n \"docs.config.mjs\",\n \"docs.config.cjs\",\n \"docs.json\",\n];\n\nfunction normalizeDocsRoute(value: string | undefined, fallback = \"/docs\"): string {\n const raw = (value || fallback).trim();\n if (!raw || raw === \"/\") return \"/\";\n const normalized = raw\n .replace(/\\\\/g, \"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/^\\/?/, \"/\")\n .replace(/\\/+$/, \"\");\n return normalized || \"/\";\n}\n\nfunction docsRouteToEntry(route: string): string {\n const entry = route.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return entry || \"docs\";\n}\n\nfunction normalizeDocsContentDir(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const normalized = value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return normalized || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction cloneSerializable(value: unknown, seen = new WeakSet<object>()): any {\n if (value === null) return null;\n\n const valueType = typeof value;\n if (valueType === \"string\" || valueType === \"number\" || valueType === \"boolean\") {\n return value;\n }\n if (valueType === \"undefined\" || valueType === \"function\" || valueType === \"symbol\") {\n return undefined;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneSerializable(item, seen)).filter((item) => item !== undefined);\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (isRecord(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const output: Record<string, any> = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n const clonedValue = cloneSerializable(nestedValue, seen);\n if (clonedValue !== undefined) {\n output[key] = clonedValue;\n }\n }\n return output;\n }\n\n return undefined;\n}\n\nfunction sanitizeDocsConfig(config: Partial<DocsConfig>): Partial<DocsConfig> {\n return cloneSerializable(config) || {};\n}\n\nexport async function findDocsConfigPath(\n rootDir: string,\n configPath?: string,\n): Promise<string | undefined> {\n const { existsSync } = await import(\"fs\");\n const root = path.resolve(rootDir || process.cwd());\n\n if (configPath) {\n const resolvedPath = path.isAbsolute(configPath) ? configPath : path.join(root, configPath);\n if (!existsSync(resolvedPath)) {\n throw new Error(`Could not find docs config at ${configPath}.`);\n }\n return path.resolve(resolvedPath);\n }\n\n for (const filename of DOCS_CONFIG_FILENAMES) {\n const resolvedPath = path.join(root, filename);\n if (existsSync(resolvedPath)) {\n return resolvedPath;\n }\n }\n\n return undefined;\n}\n\nexport async function loadDocsConfig(\n rootDir: string,\n configPath?: string,\n): Promise<{ config: Partial<DocsConfig>; configPath: string } | undefined> {\n const fs = await import(\"fs/promises\");\n const { pathToFileURL } = await import(\"url\");\n const root = path.resolve(rootDir || process.cwd());\n const resolvedPath = await findDocsConfigPath(root, configPath);\n\n if (!resolvedPath) return undefined;\n\n try {\n if (resolvedPath.endsWith(\".json\")) {\n const content = await fs.readFile(resolvedPath, \"utf8\");\n return { config: JSON.parse(content), configPath: resolvedPath };\n }\n\n const { build } = await import(\"esbuild\");\n const configCacheDir = path.join(root, \".farm\", \".config-loader\");\n await fs.mkdir(configCacheDir, { recursive: true });\n const modulePath = path.join(\n configCacheDir,\n `docs-config-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: root,\n entryPoints: [resolvedPath],\n outfile: modulePath,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n packages: \"external\",\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n const moduleUrl = pathToFileURL(modulePath).href + `?t=${Date.now()}`;\n let importedConfig: any;\n\n try {\n importedConfig = await import(/* @vite-ignore */ moduleUrl);\n } finally {\n await fs.unlink(modulePath).catch(() => undefined);\n }\n\n return {\n config: importedConfig.default || importedConfig,\n configPath: resolvedPath,\n };\n } catch (error: any) {\n const relativePath = path.relative(root, resolvedPath) || resolvedPath;\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load docs config from ${relativePath}: ${message}`);\n }\n}\n\nexport async function resolveDocsConfig(\n userDocs: FarmDocsUserConfig | undefined,\n options: {\n root?: string;\n srcDir?: string;\n } = {},\n): Promise<FarmDocsResolvedConfig> {\n const root = options.root || process.cwd();\n\n if (userDocs === false) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const docsOptions = isRecord(userDocs) ? userDocs : {};\n if (docsOptions.enabled === false) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const loadedConfig = await loadDocsConfig(root, docsOptions.configPath);\n const hasExplicitDocsConfig = userDocs === true || isRecord(userDocs);\n\n if (!hasExplicitDocsConfig && !loadedConfig) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const inlineDocsConfig = sanitizeDocsConfig(docsOptions.config || {});\n const directDocsConfig = sanitizeDocsConfig({\n ...docsOptions,\n enabled: undefined,\n config: undefined,\n configPath: undefined,\n } as Partial<DocsConfig>);\n const loadedDocsConfig = sanitizeDocsConfig(loadedConfig?.config || {});\n const mergedDocsConfig: Partial<DocsConfig> = {\n ...loadedDocsConfig,\n ...inlineDocsConfig,\n ...directDocsConfig,\n };\n\n const explicitRoute = typeof docsOptions.entry === \"string\" ? docsOptions.entry : undefined;\n const configuredDocsPath =\n typeof mergedDocsConfig.docsPath === \"string\" ? mergedDocsConfig.docsPath : undefined;\n const configuredEntry =\n typeof mergedDocsConfig.entry === \"string\" ? mergedDocsConfig.entry : undefined;\n const entryRoute = normalizeDocsRoute(\n configuredDocsPath || explicitRoute || (configuredEntry ? `/${configuredEntry}` : undefined),\n );\n const docsEntry =\n explicitRoute && explicitRoute.startsWith(\"/\")\n ? docsRouteToEntry(explicitRoute)\n : docsRouteToEntry(configuredEntry || entryRoute);\n const contentDir = normalizeDocsContentDir(docsOptions.contentDir || mergedDocsConfig.contentDir);\n\n return {\n enabled: true,\n entry: entryRoute,\n contentDir,\n configPath: loadedConfig?.configPath,\n config: {\n ...mergedDocsConfig,\n entry: docsEntry,\n docsPath: entryRoute,\n ...(contentDir ? { contentDir } : {}),\n },\n };\n}\n\nexport async function resolveConfig(\n userConfig: FarmUserConfig,\n mode: \"development\" | \"production\",\n): Promise<ResolvedFarmConfig> {\n const projectRoot = userConfig.root || process.cwd();\n const layerResolution = await resolveFarmLayers(userConfig, {\n root: projectRoot,\n mode,\n });\n userConfig = layerResolution.config;\n\n const redirects =\n typeof userConfig.redirects === \"function\"\n ? await userConfig.redirects()\n : userConfig.redirects || [];\n\n const rewrites =\n typeof userConfig.rewrites === \"function\"\n ? await userConfig.rewrites()\n : userConfig.rewrites || [];\n\n const headers =\n typeof userConfig.headers === \"function\"\n ? await userConfig.headers()\n : userConfig.headers || [];\n const routeRules = normalizeRouteRules(userConfig.routeRules);\n const routeRuleRedirects = routeRulesToRedirects(routeRules);\n const routeRuleHeaders = routeRulesToHeaders(routeRules);\n const security = resolveFarmSecurityConfig(userConfig.security);\n const securityHeader = getFarmSecurityHeader(security);\n\n const deploy = resolveDeployConfig(userConfig);\n const root = userConfig.root || process.cwd();\n const srcDir = userConfig.srcDir || \"src\";\n const docs = await resolveDocsConfig(userConfig.docs, { root, srcDir });\n const md = resolveMarkdownConfig(userConfig.md);\n const mdx = resolveMdxConfig(userConfig.mdx);\n const env = resolveEnv(userConfig.env, process.env);\n setEnv(env);\n const auth = resolveFarmAuthConfig(userConfig.auth);\n if (auth.enabled && userConfig.integrations?.auth) {\n throw new Error(\n \"Choose either the top-level `auth` config or `integrations.auth`; they cannot both own the auth route.\",\n );\n }\n const nativeAuthIntegration = await resolveFarmAuthIntegration(auth, {\n root,\n mode,\n });\n const integrations = nativeAuthIntegration\n ? { ...userConfig.integrations, auth: nativeAuthIntegration }\n : userConfig.integrations || {};\n const generateBuildId = userConfig.generateBuildId || (() => `build-${Date.now()}`);\n const deploymentId = normalizeFarmDeploymentId(\n userConfig.deploymentId ||\n process.env.FARM_DEPLOYMENT_ID ||\n process.env.VERCEL_GIT_COMMIT_SHA ||\n process.env.CF_PAGES_COMMIT_SHA ||\n (mode === \"production\" ? await generateBuildId() : \"development\"),\n );\n\n const resolved: ResolvedFarmConfig = {\n [FARM_RESOLVED_CUSTOM_CONTEXT]: typeof userConfig.context === \"function\",\n root,\n srcDir,\n extends: userConfig.extends || [],\n layers: layerResolution.layers,\n outDir: userConfig.outDir || \"dist\",\n basePath: userConfig.basePath || \"/\",\n preset: deploy.preset || \"node-server\",\n deploy,\n docs,\n md,\n mdx,\n migrations: resolveMigrationsConfig(userConfig.migrations),\n cron: resolveCronConfig(userConfig.cron),\n workflows: resolveWorkflowsConfig(userConfig.workflows),\n observability: userConfig.observability ?? false,\n devtools: resolveFarmDevtoolsConfig(userConfig.devtools, mode),\n storage: userConfig.storage || {},\n cache: userConfig.cache || {},\n auth,\n suppressLintOnLink: userConfig.suppressLintOnLink ?? false,\n experimental: {\n serverComponents: false,\n serverActions: false,\n ...userConfig.experimental,\n },\n plugins: [...resolveIntegrationPlugins(integrations), ...(userConfig.plugins || [])],\n integrations,\n trailingSlash: userConfig.trailingSlash ?? false,\n redirects: () => [...redirects, ...routeRuleRedirects],\n rewrites: () => rewrites,\n headers: () => [\n ...headers,\n ...routeRuleHeaders,\n ...(securityHeader ? [{ source: \"/*\", headers: [securityHeader] }] : []),\n ],\n routeRules,\n images: resolveFarmImageConfig(userConfig.images),\n performance: resolveFarmPerformanceConfig(userConfig.performance),\n theme: resolveFarmThemeConfig(userConfig.theme, userConfig.basePath || \"/\"),\n publicDir: userConfig.publicDir || \"public\",\n i18n: resolveFarmI18nConfig(userConfig.i18n, { root, mode }),\n openapi: {\n enabled: false,\n route: \"/docs/reference\",\n title: \"API Documentation\",\n description: \"Auto-generated API documentation\",\n version: \"1.0.0\",\n servers: [{ url: \"http://localhost:3000\", description: \"Development server\" }],\n ...userConfig.openapi,\n },\n middleware: userConfig.middleware || {},\n notFound: userConfig.notFound || {},\n context: userConfig.context || (() => undefined),\n server: resolveFarmServerConfig(userConfig.server),\n serverActions: resolveServerActionsConfig(userConfig.serverActions),\n security,\n deploymentId,\n output: userConfig.output || \"standalone\",\n distDir: userConfig.distDir || \".farm\",\n generateBuildId,\n compress: userConfig.compress ?? true,\n devIndicators: {\n buildActivity: true,\n buildActivityPosition: \"bottom-right\",\n ...userConfig.devIndicators,\n },\n serverRuntimeConfig: userConfig.serverRuntimeConfig || {},\n publicRuntimeConfig: userConfig.publicRuntimeConfig || {},\n env,\n typescript: {\n tsconfigPath: \"tsconfig.json\",\n ignoreBuildErrors: false,\n ...userConfig.typescript,\n },\n vite: typeof userConfig.vite === \"function\" ? userConfig.vite({}) : userConfig.vite || {},\n };\n\n return resolved;\n}\n\nexport async function loadConfig(\n rootDir?: string,\n configPath?: string,\n mode = process.env.NODE_ENV === \"production\" ? \"production\" : \"development\",\n loadEnvironment?: (typeof import(\"vite\"))[\"loadEnv\"],\n): Promise<FarmUserConfig | undefined> {\n const { existsSync } = await import(\"fs\");\n const loadEnv = loadEnvironment || (await import(\"vite\")).loadEnv;\n\n const root = rootDir || process.cwd();\n const loadedEnv = loadEnv(mode, root, \"\");\n for (const [key, value] of Object.entries(loadedEnv)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n const searchPaths = [\n configPath,\n \"farm.config.ts\",\n \"farm.config.mts\",\n \"farm.config.js\",\n \"farm.config.mjs\",\n \"config.ts\",\n \"config.mts\",\n \"config.js\",\n \"config.mjs\",\n ].filter(Boolean) as string[];\n\n for (const relativePath of searchPaths) {\n try {\n // Use path.join for proper path construction\n const absolutePath = relativePath.startsWith(\"/\")\n ? relativePath\n : path.join(root, relativePath);\n\n // Normalize the path to handle any issues\n const normalizedPath = path.resolve(absolutePath);\n\n // Check if file exists before trying to import\n if (!existsSync(normalizedPath)) {\n continue;\n }\n\n const loadedConfig = await loadFarmConfigFile<FarmUserConfig>(normalizedPath, { root });\n return loadedConfig.root === undefined ? { ...loadedConfig, root } : loadedConfig;\n } catch (error: any) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config from ${relativePath}: ${message}`);\n }\n }\n return undefined;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
interface FarmChunkRecoveryOptions {
|
|
2
|
+
/**
|
|
3
|
+
* How long a page is considered already recovered before another chunk
|
|
4
|
+
* failure may trigger a reload. Defaults to 30 seconds.
|
|
5
|
+
*/
|
|
6
|
+
maxAgeMs?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Override the storage key. Mostly useful for tests and embedded runtimes.
|
|
9
|
+
*/
|
|
10
|
+
storageKey?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Called right before Farm reloads the page.
|
|
13
|
+
*/
|
|
14
|
+
onRecover?: (error: unknown) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Test hooks for browser globals.
|
|
17
|
+
*/
|
|
18
|
+
reload?: () => void;
|
|
19
|
+
storage?: Pick<Storage, "getItem" | "setItem" | "removeItem"> | null;
|
|
20
|
+
location?: Pick<Location, "pathname" | "search" | "reload">;
|
|
21
|
+
now?: () => number;
|
|
22
|
+
}
|
|
23
|
+
declare function isChunkLoadError(errorLike: unknown): boolean;
|
|
24
|
+
declare function installChunkErrorRecovery(options?: FarmChunkRecoveryOptions): () => void;
|
|
25
|
+
|
|
26
|
+
export { type FarmChunkRecoveryOptions as F, isChunkLoadError as a, installChunkErrorRecovery as i };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
interface FarmChunkRecoveryOptions {
|
|
2
|
+
/**
|
|
3
|
+
* How long a page is considered already recovered before another chunk
|
|
4
|
+
* failure may trigger a reload. Defaults to 30 seconds.
|
|
5
|
+
*/
|
|
6
|
+
maxAgeMs?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Override the storage key. Mostly useful for tests and embedded runtimes.
|
|
9
|
+
*/
|
|
10
|
+
storageKey?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Called right before Farm reloads the page.
|
|
13
|
+
*/
|
|
14
|
+
onRecover?: (error: unknown) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Test hooks for browser globals.
|
|
17
|
+
*/
|
|
18
|
+
reload?: () => void;
|
|
19
|
+
storage?: Pick<Storage, "getItem" | "setItem" | "removeItem"> | null;
|
|
20
|
+
location?: Pick<Location, "pathname" | "search" | "reload">;
|
|
21
|
+
now?: () => number;
|
|
22
|
+
}
|
|
23
|
+
declare function isChunkLoadError(errorLike: unknown): boolean;
|
|
24
|
+
declare function installChunkErrorRecovery(options?: FarmChunkRecoveryOptions): () => void;
|
|
25
|
+
|
|
26
|
+
export { type FarmChunkRecoveryOptions as F, isChunkLoadError as a, installChunkErrorRecovery as i };
|
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { F as FarmIntegrationAPI, a as FarmIntegrationAPIOperation } from './integration-api-CHT2OKAf.mjs';
|
|
2
|
+
import { F as FarmClientCacheKey } from './client-cache-D-EZ7XVW.mjs';
|
|
3
|
+
import { DefinedCacheKey, RouteDataCacheKey, InferCacheKeyData } from './cache.mjs';
|
|
4
|
+
import { F as FarmAPIStream } from './transport-BmbGTXA5.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Small per-call integration metadata. When sent from a browser, values are
|
|
8
|
+
* client-controlled and should be validated before authorization decisions.
|
|
9
|
+
*/
|
|
10
|
+
type IntegrationClientData = Record<string, unknown>;
|
|
11
|
+
type IntegrationClientOptions = {
|
|
12
|
+
baseURL?: string;
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
credentials?: RequestCredentials;
|
|
15
|
+
data?: IntegrationClientData;
|
|
16
|
+
isServer?: false | undefined;
|
|
17
|
+
};
|
|
18
|
+
type IntegrationRequestOptionsBase = {
|
|
19
|
+
headers?: Record<string, string>;
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
credentials?: RequestCredentials;
|
|
22
|
+
data?: IntegrationClientData;
|
|
23
|
+
};
|
|
24
|
+
type IntegrationClientRequestOptions = IntegrationRequestOptionsBase;
|
|
25
|
+
type IntegrationServerRequestLike = Request | {
|
|
26
|
+
url?: string;
|
|
27
|
+
headers?: HeadersInit;
|
|
28
|
+
};
|
|
29
|
+
type IntegrationServerClientOptions = Omit<IntegrationClientOptions, "isServer"> & {
|
|
30
|
+
isServer: true;
|
|
31
|
+
request?: IntegrationServerRequestLike;
|
|
32
|
+
forwardHeaders?: boolean | readonly string[];
|
|
33
|
+
};
|
|
34
|
+
type IntegrationServerClientRequestOptions = IntegrationRequestOptionsBase & {
|
|
35
|
+
baseURL?: string;
|
|
36
|
+
request?: IntegrationServerRequestLike;
|
|
37
|
+
forwardHeaders?: boolean | readonly string[];
|
|
38
|
+
};
|
|
39
|
+
declare class IntegrationClientError<TData = unknown> extends Error {
|
|
40
|
+
readonly status: number;
|
|
41
|
+
readonly response: Response;
|
|
42
|
+
readonly data: TData | undefined;
|
|
43
|
+
constructor(message: string, response: Response, data?: TData);
|
|
44
|
+
}
|
|
45
|
+
type IntegrationOperationResult<TData = unknown, TError = IntegrationClientError<unknown> | Error> = {
|
|
46
|
+
data: TData | null;
|
|
47
|
+
error: TError | null;
|
|
48
|
+
};
|
|
49
|
+
type ExtractOperationBody<T> = T extends {
|
|
50
|
+
__types?: {
|
|
51
|
+
body: infer TBody;
|
|
52
|
+
};
|
|
53
|
+
} ? TBody : never;
|
|
54
|
+
type ExtractOperationQuery<T> = T extends {
|
|
55
|
+
__types?: {
|
|
56
|
+
query: infer TQuery;
|
|
57
|
+
};
|
|
58
|
+
} ? TQuery : never;
|
|
59
|
+
type ExtractOperationResponse<T> = T extends {
|
|
60
|
+
__types?: {
|
|
61
|
+
response: infer TResponse;
|
|
62
|
+
};
|
|
63
|
+
} ? TResponse : unknown;
|
|
64
|
+
type InferIntegrationOperationBody<T> = ExtractOperationBody<T>;
|
|
65
|
+
type InferIntegrationOperationQuery<T> = ExtractOperationQuery<T>;
|
|
66
|
+
type InferIntegrationOperationResponse<T> = ExtractOperationResponse<T>;
|
|
67
|
+
type IsNever$1<T> = [T] extends [never] ? true : false;
|
|
68
|
+
type OperationInput<T> = IsNever$1<ExtractOperationBody<T>> extends true ? IsNever$1<ExtractOperationQuery<T>> extends true ? {} : {
|
|
69
|
+
query?: ExtractOperationQuery<T>;
|
|
70
|
+
} : IsNever$1<ExtractOperationQuery<T>> extends true ? {
|
|
71
|
+
body: ExtractOperationBody<T>;
|
|
72
|
+
} : {
|
|
73
|
+
body: ExtractOperationBody<T>;
|
|
74
|
+
query?: ExtractOperationQuery<T>;
|
|
75
|
+
};
|
|
76
|
+
type ClientOperation<T> = (options?: OperationInput<T>, requestOptions?: IntegrationClientRequestOptions) => Promise<IntegrationOperationResult<ExtractOperationResponse<T>>>;
|
|
77
|
+
type ServerOperation<T> = (options?: OperationInput<T>, requestOptions?: IntegrationServerClientRequestOptions) => Promise<IntegrationOperationResult<ExtractOperationResponse<T>>>;
|
|
78
|
+
type IsUnion<T, U = T> = T extends any ? ([U] extends [T] ? false : true) : never;
|
|
79
|
+
type SingleKey<T> = [T] extends [never] ? never : IsUnion<T> extends true ? never : T;
|
|
80
|
+
type ExtractAPIFromSource<TSource> = TSource extends {
|
|
81
|
+
api?: infer TAPI;
|
|
82
|
+
} ? NonNullable<TAPI> extends FarmIntegrationAPI ? NonNullable<TAPI> : never : TSource extends FarmIntegrationAPI ? TSource : never;
|
|
83
|
+
type SourceKeysWithAPI<TSources extends Record<string, any>> = {
|
|
84
|
+
[K in keyof TSources]: [ExtractAPIFromSource<TSources[K]>] extends [never] ? never : K;
|
|
85
|
+
}[keyof TSources];
|
|
86
|
+
type IsServerRegisteredOperation<T> = T extends {
|
|
87
|
+
isServer: true;
|
|
88
|
+
} ? true : false;
|
|
89
|
+
type ClientOperationKeys<TAPI> = {
|
|
90
|
+
[K in keyof TAPI]: TAPI[K] extends FarmIntegrationAPIOperation<any, any, any, any> ? IsServerRegisteredOperation<TAPI[K]> extends true ? never : K : never;
|
|
91
|
+
}[keyof TAPI];
|
|
92
|
+
type ClientNamespaceShape<TAPI> = {
|
|
93
|
+
[K in keyof TAPI as TAPI[K] extends FarmIntegrationAPIOperation<any, any, any, any> ? IsServerRegisteredOperation<TAPI[K]> extends true ? never : K : K]: TAPI[K] extends FarmIntegrationAPIOperation<any, any, any, any> ? ClientOperation<TAPI[K]> : TAPI[K] extends Record<string, any> ? IntegrationAPIToClient<TAPI[K]> : never;
|
|
94
|
+
};
|
|
95
|
+
type SingleClientOperationKey<TAPI> = Exclude<keyof TAPI, ClientOperationKeys<TAPI>> extends never ? SingleKey<ClientOperationKeys<TAPI>> : never;
|
|
96
|
+
type IntegrationAPIToClient<TAPI> = TAPI extends FarmIntegrationAPIOperation<any, any, any, any> ? ClientOperation<TAPI> : TAPI extends Record<string, any> ? [SingleClientOperationKey<TAPI>] extends [never] ? ClientNamespaceShape<TAPI> : SingleClientOperationKey<TAPI> extends keyof TAPI ? ClientOperation<TAPI[SingleClientOperationKey<TAPI>]> & ClientNamespaceShape<TAPI> : ClientNamespaceShape<TAPI> : never;
|
|
97
|
+
type IntegrationClient<TSources extends Record<string, any>> = {
|
|
98
|
+
[K in SourceKeysWithAPI<TSources>]: IntegrationAPIToClient<ExtractAPIFromSource<TSources[K]>>;
|
|
99
|
+
};
|
|
100
|
+
type IntegrationClientRoot<TSources extends Record<string, any>> = {
|
|
101
|
+
integrations: IntegrationClient<TSources>;
|
|
102
|
+
};
|
|
103
|
+
type ServerOperationKeys<TAPI> = {
|
|
104
|
+
[K in keyof TAPI]: TAPI[K] extends FarmIntegrationAPIOperation<any, any, any> ? K : never;
|
|
105
|
+
}[keyof TAPI];
|
|
106
|
+
type ServerNamespaceShape<TAPI> = {
|
|
107
|
+
[K in keyof TAPI]: TAPI[K] extends FarmIntegrationAPIOperation<any, any, any> ? ServerOperation<TAPI[K]> : TAPI[K] extends Record<string, any> ? IntegrationAPIToServerClient<TAPI[K]> : never;
|
|
108
|
+
};
|
|
109
|
+
type SingleServerOperationKey<TAPI> = Exclude<keyof TAPI, ServerOperationKeys<TAPI>> extends never ? SingleKey<ServerOperationKeys<TAPI>> : never;
|
|
110
|
+
type IntegrationAPIToServerClient<TAPI> = TAPI extends FarmIntegrationAPIOperation<any, any, any> ? ServerOperation<TAPI> : TAPI extends Record<string, any> ? [SingleServerOperationKey<TAPI>] extends [never] ? ServerNamespaceShape<TAPI> : SingleServerOperationKey<TAPI> extends keyof TAPI ? ServerOperation<TAPI[SingleServerOperationKey<TAPI>]> & ServerNamespaceShape<TAPI> : ServerNamespaceShape<TAPI> : never;
|
|
111
|
+
type IntegrationServerClient<TSources extends Record<string, any>> = {
|
|
112
|
+
[K in SourceKeysWithAPI<TSources>]: IntegrationAPIToServerClient<ExtractAPIFromSource<TSources[K]>>;
|
|
113
|
+
};
|
|
114
|
+
type IntegrationServerClientRoot<TSources extends Record<string, any>> = {
|
|
115
|
+
integrations: IntegrationServerClient<TSources>;
|
|
116
|
+
};
|
|
117
|
+
type IntegrationClientAliases<TSources extends Record<string, any>> = IntegrationClient<TSources> & {
|
|
118
|
+
integrations: IntegrationClient<TSources>;
|
|
119
|
+
};
|
|
120
|
+
type IntegrationServerClientAliases<TSources extends Record<string, any>> = IntegrationServerClient<TSources> & {
|
|
121
|
+
integrations: IntegrationServerClient<TSources>;
|
|
122
|
+
};
|
|
123
|
+
type IntegrationAPI<TSources extends Record<string, any>> = IntegrationClientAliases<TSources> & {
|
|
124
|
+
server: (options: Omit<IntegrationServerClientOptions, "isServer">) => IntegrationServerClientAliases<TSources>;
|
|
125
|
+
};
|
|
126
|
+
type IntegrationClients<TSources extends Record<string, any>> = {
|
|
127
|
+
api: IntegrationServerClientAliases<TSources>;
|
|
128
|
+
apiClient: IntegrationClientAliases<TSources>;
|
|
129
|
+
};
|
|
130
|
+
declare function createIntegrationClient<TSources extends Record<string, any>>(sources: {
|
|
131
|
+
integrations: TSources;
|
|
132
|
+
}, options: IntegrationServerClientOptions): IntegrationServerClientAliases<TSources>;
|
|
133
|
+
declare function createIntegrationClient<TSources extends Record<string, any>>(sources: {
|
|
134
|
+
integrations: TSources;
|
|
135
|
+
}, options?: IntegrationClientOptions): IntegrationClientAliases<TSources>;
|
|
136
|
+
declare function createIntegrationClient<TSources extends Record<string, any>>(sources: TSources, options: IntegrationServerClientOptions): IntegrationServerClient<TSources>;
|
|
137
|
+
declare function createIntegrationClient<TSources extends Record<string, any>>(sources: TSources, options?: IntegrationClientOptions): IntegrationClient<TSources>;
|
|
138
|
+
declare function integrationsClient<TSources extends Record<string, any>>(): IntegrationClientAliases<TSources>;
|
|
139
|
+
declare function integrationsClient<TSources extends Record<string, any>>(options: IntegrationClientOptions): IntegrationClientAliases<TSources>;
|
|
140
|
+
declare function integrationsServer<TSources extends Record<string, any>>(): IntegrationServerClientAliases<TSources>;
|
|
141
|
+
declare function integrationsServer<TSources extends Record<string, any>>(options: Omit<IntegrationServerClientOptions, "isServer">): IntegrationServerClientAliases<TSources>;
|
|
142
|
+
declare function createIntegrationServerClient<TSources extends Record<string, any>>(sources: {
|
|
143
|
+
integrations: TSources;
|
|
144
|
+
}): IntegrationServerClientAliases<TSources>;
|
|
145
|
+
declare function createIntegrationServerClient<TSources extends Record<string, any>>(sources: TSources): IntegrationServerClient<TSources>;
|
|
146
|
+
declare function createIntegrationServerClient<TSources extends Record<string, any>>(sources: {
|
|
147
|
+
integrations: TSources;
|
|
148
|
+
}, options: Omit<IntegrationServerClientOptions, "isServer">): IntegrationServerClientAliases<TSources>;
|
|
149
|
+
declare function createIntegrationServerClient<TSources extends Record<string, any>>(sources: TSources, options: Omit<IntegrationServerClientOptions, "isServer">): IntegrationServerClient<TSources>;
|
|
150
|
+
declare function createIntegrationApi<TSources extends Record<string, any>>(sources: {
|
|
151
|
+
integrations: TSources;
|
|
152
|
+
}, options?: IntegrationClientOptions): IntegrationAPI<TSources>;
|
|
153
|
+
declare function createIntegrationClients<TSources extends Record<string, any>>(clientOptions?: IntegrationClientOptions, serverOptions?: Omit<IntegrationServerClientOptions, "isServer">): IntegrationClients<TSources>;
|
|
154
|
+
declare function createIntegrationClients<TSources extends Record<string, any>>(sources: TSources, clientOptions?: IntegrationClientOptions, serverOptions?: Omit<IntegrationServerClientOptions, "isServer">): IntegrationClients<TSources>;
|
|
155
|
+
declare function createIntegrationClients<TSources extends Record<string, any>>(sources: {
|
|
156
|
+
integrations: TSources;
|
|
157
|
+
}, clientOptions?: IntegrationClientOptions, serverOptions?: Omit<IntegrationServerClientOptions, "isServer">): IntegrationClients<TSources>;
|
|
158
|
+
declare function createIntegrations<TSources extends Record<string, any>>(clientOptions?: IntegrationClientOptions, serverOptions?: Omit<IntegrationServerClientOptions, "isServer">): IntegrationClients<TSources>;
|
|
159
|
+
declare function createIntegrations<TSources extends Record<string, any>>(sources: TSources, clientOptions?: IntegrationClientOptions, serverOptions?: Omit<IntegrationServerClientOptions, "isServer">): IntegrationClients<TSources>;
|
|
160
|
+
declare function createIntegrations<TSources extends Record<string, any>>(sources: {
|
|
161
|
+
integrations: TSources;
|
|
162
|
+
}, clientOptions?: IntegrationClientOptions, serverOptions?: Omit<IntegrationServerClientOptions, "isServer">): IntegrationClients<TSources>;
|
|
163
|
+
declare function getIntegrationAPIManifest(): Record<string, FarmIntegrationAPI>;
|
|
164
|
+
declare function integrationClients<TSources extends Record<string, any>>(clientOptions?: IntegrationClientOptions, serverOptions?: Omit<IntegrationServerClientOptions, "isServer">): IntegrationClients<TSources>;
|
|
165
|
+
declare function integrationClients<TSources extends Record<string, any>>(sources: TSources, clientOptions?: IntegrationClientOptions, serverOptions?: Omit<IntegrationServerClientOptions, "isServer">): IntegrationClients<TSources>;
|
|
166
|
+
declare function integrationClients<TSources extends Record<string, any>>(sources: {
|
|
167
|
+
integrations: TSources;
|
|
168
|
+
}, clientOptions?: IntegrationClientOptions, serverOptions?: Omit<IntegrationServerClientOptions, "isServer">): IntegrationClients<TSources>;
|
|
169
|
+
|
|
170
|
+
declare const FARM_API_ROUTE_REF_SYMBOL: unique symbol;
|
|
171
|
+
declare const FARM_API_ROUTE_META_SYMBOL: unique symbol;
|
|
172
|
+
type APIRouteRefMetadata = {
|
|
173
|
+
path: string;
|
|
174
|
+
method: string;
|
|
175
|
+
baseURL: string;
|
|
176
|
+
sameOrigin: boolean;
|
|
177
|
+
};
|
|
178
|
+
type APIClientOptions = {
|
|
179
|
+
baseURL?: string;
|
|
180
|
+
headers?: Record<string, string>;
|
|
181
|
+
credentials?: RequestCredentials;
|
|
182
|
+
cacheDefaults?: CacheOptions;
|
|
183
|
+
integrations?: IntegrationClientOptions;
|
|
184
|
+
};
|
|
185
|
+
type APIClientWithoutIntegrationsOptions = Omit<APIClientOptions, "integrations"> & {
|
|
186
|
+
integrations: false;
|
|
187
|
+
};
|
|
188
|
+
type ServerAPIClientOptions = {
|
|
189
|
+
integrations?: Omit<IntegrationServerClientOptions, "isServer">;
|
|
190
|
+
};
|
|
191
|
+
type ServerAPIClientWithoutIntegrationsOptions = Omit<ServerAPIClientOptions, "integrations"> & {
|
|
192
|
+
integrations: false;
|
|
193
|
+
};
|
|
194
|
+
type StatusPhase = "idle" | "pending" | "success" | "error" | "revalidating" | "invalidated";
|
|
195
|
+
type StatusEvent<TData = unknown, TError = unknown> = {
|
|
196
|
+
phase: StatusPhase;
|
|
197
|
+
requestId: string;
|
|
198
|
+
method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "HEAD";
|
|
199
|
+
key: string;
|
|
200
|
+
input?: unknown;
|
|
201
|
+
data?: TData;
|
|
202
|
+
error?: TError;
|
|
203
|
+
isBackground?: boolean;
|
|
204
|
+
timestamp: number;
|
|
205
|
+
};
|
|
206
|
+
type CacheKey<TData = unknown> = string & {
|
|
207
|
+
readonly __farmCacheData?: TData;
|
|
208
|
+
};
|
|
209
|
+
type APIResult<TData = unknown, TError = Error> = {
|
|
210
|
+
data: TData | undefined;
|
|
211
|
+
error: TError | null;
|
|
212
|
+
key: CacheKey<TData>;
|
|
213
|
+
};
|
|
214
|
+
declare class APIClientError<TCode extends string = string, TData = unknown, TStatus extends number = number> extends Error {
|
|
215
|
+
readonly code: TCode;
|
|
216
|
+
readonly data: TData;
|
|
217
|
+
readonly status: TStatus;
|
|
218
|
+
readonly response?: Response;
|
|
219
|
+
constructor(code: TCode, data: TData, options: {
|
|
220
|
+
status: TStatus;
|
|
221
|
+
message: string;
|
|
222
|
+
response?: Response;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
type APIClientSystemError = APIClientError<"http_error", unknown, number> | APIClientError<"network_error", unknown, 0>;
|
|
226
|
+
type RequestEvent = {
|
|
227
|
+
requestId: string;
|
|
228
|
+
method: StatusEvent["method"];
|
|
229
|
+
key: string;
|
|
230
|
+
path: string;
|
|
231
|
+
input?: unknown;
|
|
232
|
+
attempt: number;
|
|
233
|
+
timestamp: number;
|
|
234
|
+
};
|
|
235
|
+
type ResponseEvent<TData = unknown, TError = Error> = {
|
|
236
|
+
requestId: string;
|
|
237
|
+
method: StatusEvent["method"];
|
|
238
|
+
key: string;
|
|
239
|
+
path: string;
|
|
240
|
+
input?: unknown;
|
|
241
|
+
attempt: number;
|
|
242
|
+
timestamp: number;
|
|
243
|
+
response?: Response;
|
|
244
|
+
data?: TData;
|
|
245
|
+
error?: TError;
|
|
246
|
+
ok?: boolean;
|
|
247
|
+
status?: number;
|
|
248
|
+
};
|
|
249
|
+
type CachePolicy = "cache-first" | "network-only" | "stale-while-revalidate";
|
|
250
|
+
type CacheOptions = {
|
|
251
|
+
key?: FarmClientCacheKey;
|
|
252
|
+
policy?: CachePolicy;
|
|
253
|
+
staleTime?: number;
|
|
254
|
+
gcTime?: number;
|
|
255
|
+
dedupeMs?: number;
|
|
256
|
+
};
|
|
257
|
+
type RetryOptions = {
|
|
258
|
+
count?: number;
|
|
259
|
+
delay?: number | ((attempt: number) => number);
|
|
260
|
+
};
|
|
261
|
+
type InvalidateTarget = FarmClientCacheKey | {
|
|
262
|
+
key: FarmClientCacheKey;
|
|
263
|
+
} | {
|
|
264
|
+
path: string;
|
|
265
|
+
method?: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "HEAD";
|
|
266
|
+
input?: unknown;
|
|
267
|
+
} | [CallableRouteRef<any>, unknown?];
|
|
268
|
+
type InvalidateOptions = InvalidateTarget[] | {
|
|
269
|
+
targets: InvalidateTarget[];
|
|
270
|
+
refetch?: boolean;
|
|
271
|
+
};
|
|
272
|
+
type OptimisticUpdate = [CallableRouteRef<any>, unknown, (prev: any) => any] | [CacheKey<any> | DefinedCacheKey<any> | string, (prev: any) => any];
|
|
273
|
+
type OptimisticOptions<TUpdates extends readonly unknown[] = readonly OptimisticUpdate[]> = {
|
|
274
|
+
update: TUpdates & NormalizeOptimisticUpdates<TUpdates>;
|
|
275
|
+
rollbackOnError?: boolean;
|
|
276
|
+
};
|
|
277
|
+
type ClientOptions<TData = unknown, TError = unknown, TUpdates extends readonly unknown[] = readonly OptimisticUpdate[]> = {
|
|
278
|
+
key?: CacheKey<TData> | FarmClientCacheKey;
|
|
279
|
+
cache?: CacheOptions;
|
|
280
|
+
retry?: RetryOptions;
|
|
281
|
+
invalidate?: InvalidateOptions;
|
|
282
|
+
optimistic?: OptimisticOptions<TUpdates>;
|
|
283
|
+
onRequest?: (event: RequestEvent) => void;
|
|
284
|
+
onResponse?: (data: TData | undefined, error: TError | null, event: ResponseEvent<TData, TError>) => void;
|
|
285
|
+
onSuccess?: (data: TData) => void;
|
|
286
|
+
onError?: (err: TError) => void;
|
|
287
|
+
onSettled?: (data?: TData, err?: TError | null) => void;
|
|
288
|
+
onStatus?: (event: StatusEvent<TData, TError>) => void;
|
|
289
|
+
};
|
|
290
|
+
type AnyRouteRef = (...args: any[]) => any;
|
|
291
|
+
type RouteRef<TData = any, TInput = any> = {
|
|
292
|
+
readonly __farmRouteInput: TInput;
|
|
293
|
+
readonly __farmRouteData: TData;
|
|
294
|
+
};
|
|
295
|
+
type CallableRouteRef<TData = any, TInput = any> = AnyRouteRef & RouteRef<TData, TInput>;
|
|
296
|
+
type InferRouteInput<TRoute> = TRoute extends {
|
|
297
|
+
readonly __farmRouteInput: infer TInput;
|
|
298
|
+
} ? TInput : never;
|
|
299
|
+
type InferRouteData<TRoute> = TRoute extends {
|
|
300
|
+
readonly __farmRouteData: infer TData;
|
|
301
|
+
} ? TData : never;
|
|
302
|
+
type NormalizeOptimisticUpdate<TUpdate> = TUpdate extends readonly [
|
|
303
|
+
infer TRoute,
|
|
304
|
+
unknown,
|
|
305
|
+
(prev: any) => any
|
|
306
|
+
] ? TRoute extends RouteRef<any, any> ? [
|
|
307
|
+
TRoute,
|
|
308
|
+
InferRouteInput<TRoute> | undefined,
|
|
309
|
+
(prev: InferRouteData<TRoute> | undefined) => InferRouteData<TRoute>
|
|
310
|
+
] : never : TUpdate extends readonly [infer TKey, (prev: any) => any] ? TKey extends DefinedCacheKey<any, RouteDataCacheKey> ? [TKey, (prev: InferCacheKeyData<TKey> | undefined) => InferCacheKeyData<TKey>] : TKey extends CacheKey<infer TData> ? [TKey, (prev: TData | undefined) => TData] : TKey extends string ? [TKey, (prev: unknown) => unknown] : never : never;
|
|
311
|
+
type NormalizeOptimisticUpdates<TUpdates extends readonly unknown[]> = {
|
|
312
|
+
[K in keyof TUpdates]: NormalizeOptimisticUpdate<TUpdates[K]>;
|
|
313
|
+
};
|
|
314
|
+
type TypedEndpointLike = {
|
|
315
|
+
__types: {
|
|
316
|
+
body: any;
|
|
317
|
+
query: any;
|
|
318
|
+
response: any;
|
|
319
|
+
errors?: any;
|
|
320
|
+
};
|
|
321
|
+
};
|
|
322
|
+
type Simplify<T> = {
|
|
323
|
+
[K in keyof T]: T[K];
|
|
324
|
+
} & {};
|
|
325
|
+
type IsNever<T> = [T] extends [never] ? true : false;
|
|
326
|
+
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
327
|
+
type RequiredKeys<T> = T extends object ? {
|
|
328
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? never : K;
|
|
329
|
+
}[keyof T] : never;
|
|
330
|
+
type BodyInputProp<TValue> = IsNever<TValue> extends true ? {} : IsAny<TValue> extends true ? {
|
|
331
|
+
body?: TValue;
|
|
332
|
+
} : undefined extends TValue ? {
|
|
333
|
+
body?: TValue;
|
|
334
|
+
} : {
|
|
335
|
+
body: TValue;
|
|
336
|
+
};
|
|
337
|
+
type QueryInputProp<TValue> = IsNever<TValue> extends true ? {} : IsAny<TValue> extends true ? {
|
|
338
|
+
query?: TValue;
|
|
339
|
+
} : undefined extends TValue ? {
|
|
340
|
+
query?: TValue;
|
|
341
|
+
} : RequiredKeys<TValue> extends never ? {
|
|
342
|
+
query?: TValue;
|
|
343
|
+
} : {
|
|
344
|
+
query: TValue;
|
|
345
|
+
};
|
|
346
|
+
type HasRequiredKeys<T> = RequiredKeys<T> extends never ? false : true;
|
|
347
|
+
type InferEndpointBody<T> = T extends {
|
|
348
|
+
__types: {
|
|
349
|
+
inputBody: infer TInputBody;
|
|
350
|
+
};
|
|
351
|
+
} ? TInputBody : T extends {
|
|
352
|
+
__types: {
|
|
353
|
+
body: infer TBody;
|
|
354
|
+
};
|
|
355
|
+
} ? TBody : never;
|
|
356
|
+
type InferEndpointInput<T> = T extends {
|
|
357
|
+
__types: {
|
|
358
|
+
query: infer TQuery;
|
|
359
|
+
};
|
|
360
|
+
} ? Simplify<BodyInputProp<InferEndpointBody<T>> & QueryInputProp<TQuery>> : {};
|
|
361
|
+
type InferEndpointOutput<T> = T extends {
|
|
362
|
+
__types: {
|
|
363
|
+
response: infer R;
|
|
364
|
+
};
|
|
365
|
+
} ? R extends {
|
|
366
|
+
readonly __farmStreamItem: infer TItem;
|
|
367
|
+
} ? FarmAPIStream<TItem> : R : any;
|
|
368
|
+
type InferEndpointError<T> = T extends {
|
|
369
|
+
__types: {
|
|
370
|
+
errors: infer TErrors;
|
|
371
|
+
};
|
|
372
|
+
} ? keyof TErrors extends never ? Error : {
|
|
373
|
+
[TCode in keyof TErrors]: TErrors[TCode] extends {
|
|
374
|
+
data: infer TData;
|
|
375
|
+
status: infer TStatus extends number;
|
|
376
|
+
} ? APIClientError<TCode & string, TData, TStatus> : never;
|
|
377
|
+
}[keyof TErrors] | APIClientSystemError : Error;
|
|
378
|
+
type EndpointMethod<T = any> = (<TUpdates extends readonly unknown[] = readonly OptimisticUpdate[]>(...args: HasRequiredKeys<InferEndpointInput<T>> extends true ? [
|
|
379
|
+
options: InferEndpointInput<T>,
|
|
380
|
+
clientOptions?: ClientOptions<InferEndpointOutput<T>, InferEndpointError<T>, TUpdates>
|
|
381
|
+
] : [
|
|
382
|
+
options?: InferEndpointInput<T>,
|
|
383
|
+
clientOptions?: ClientOptions<InferEndpointOutput<T>, InferEndpointError<T>, TUpdates>
|
|
384
|
+
]) => Promise<APIResult<InferEndpointOutput<T>, InferEndpointError<T>>>) & RouteRef<InferEndpointOutput<T>, InferEndpointInput<T>>;
|
|
385
|
+
type RouterToClient<T> = {
|
|
386
|
+
[K in keyof T]: T[K] extends TypedEndpointLike ? EndpointMethod<T[K]> : T[K] extends Record<string, any> ? RouterToClient<T[K]> : EndpointMethod<T[K]>;
|
|
387
|
+
};
|
|
388
|
+
type RouteAPIClient<TRouter extends Record<string, any>> = RouterToClient<TRouter>;
|
|
389
|
+
type APIClient<TRouter extends Record<string, any>, TIntegrations extends Record<string, any> = {}> = RouteAPIClient<TRouter> & IntegrationClientRoot<TIntegrations>;
|
|
390
|
+
type ServerAPIClient<TEndpoints extends Record<string, any>, TIntegrations extends Record<string, any> = {}> = TEndpoints & IntegrationServerClientRoot<TIntegrations>;
|
|
391
|
+
/**
|
|
392
|
+
* Create a typed RPC client for Farm.js API routes
|
|
393
|
+
*
|
|
394
|
+
* Returns a nested proxy that supports:
|
|
395
|
+
* - api.hello.get({ query: { name: 'World' } })
|
|
396
|
+
* - api['auth/login'].post({ body: { email: '...', password: '...' } })
|
|
397
|
+
* - api.users.get({ query: { limit: '10' } })
|
|
398
|
+
* - api.integrations.billing.checkout({ body: { priceId: 'price_...' } })
|
|
399
|
+
*
|
|
400
|
+
* @example
|
|
401
|
+
* ```typescript
|
|
402
|
+
* import { createAPIClient } from 'farm/client';
|
|
403
|
+
* import type { APIRouter } from '@/api';
|
|
404
|
+
* import type { AppIntegrations } from '@/lib/integrations';
|
|
405
|
+
*
|
|
406
|
+
* export const api = createAPIClient<APIRouter, AppIntegrations>();
|
|
407
|
+
*
|
|
408
|
+
* // Use it (nested property access)
|
|
409
|
+
* const result = await api.hello.get({ query: { name: 'World' } });
|
|
410
|
+
* if (result.error) console.error(result.error);
|
|
411
|
+
* else console.log(result.data);
|
|
412
|
+
*
|
|
413
|
+
* // Or with string keys for nested paths
|
|
414
|
+
* const result = await api['auth/login'].post({
|
|
415
|
+
* body: { email: 'test@example.com', password: 'pass123' }
|
|
416
|
+
* });
|
|
417
|
+
*
|
|
418
|
+
* // Integration APIs live under a reserved namespace.
|
|
419
|
+
* const checkout = await api.integrations.billing.checkout({
|
|
420
|
+
* body: { priceId: 'price_123' }
|
|
421
|
+
* });
|
|
422
|
+
* ```
|
|
423
|
+
*/
|
|
424
|
+
declare function createAPIClient<TRouter extends Record<string, any>>(options: APIClientWithoutIntegrationsOptions): RouteAPIClient<TRouter>;
|
|
425
|
+
declare function createAPIClient<TRouter extends Record<string, any>, TIntegrations extends Record<string, any> = {}>(options?: APIClientOptions): APIClient<TRouter, TIntegrations>;
|
|
426
|
+
declare function isAPIRouteRef(value: unknown): value is CallableRouteRef;
|
|
427
|
+
declare function getAPIRouteRefMetadata(value: unknown): APIRouteRefMetadata | null;
|
|
428
|
+
/**
|
|
429
|
+
* Server-side API client that calls endpoints directly as functions
|
|
430
|
+
* No HTTP overhead for app endpoints, and registered integration routes can be exposed at
|
|
431
|
+
* api.integrations.* where Farm can dispatch them directly to the integration handler.
|
|
432
|
+
*
|
|
433
|
+
* @example
|
|
434
|
+
* ```typescript
|
|
435
|
+
* import { createServerAPIClient } from 'farm/client';
|
|
436
|
+
* import type { AppIntegrations } from '@/lib/integrations';
|
|
437
|
+
*
|
|
438
|
+
* export const api = createServerAPIClient<{}, AppIntegrations>({});
|
|
439
|
+
*
|
|
440
|
+
* const result = await api.integrations.billing.status();
|
|
441
|
+
* ```
|
|
442
|
+
*/
|
|
443
|
+
declare function createServerAPIClient<TEndpoints extends Record<string, any>>(endpoints: TEndpoints): TEndpoints;
|
|
444
|
+
declare function createServerAPIClient<TEndpoints extends Record<string, any>>(endpoints: TEndpoints, options: ServerAPIClientWithoutIntegrationsOptions): TEndpoints;
|
|
445
|
+
declare function createServerAPIClient<TEndpoints extends Record<string, any>, TIntegrations extends Record<string, any> = {}>(endpoints: TEndpoints, options?: ServerAPIClientOptions): ServerAPIClient<TEndpoints, TIntegrations>;
|
|
446
|
+
|
|
447
|
+
export { type IntegrationServerClientAliases as $, type APIRouteRefMetadata as A, createIntegrationClients as B, type CacheKey as C, createIntegrations as D, createIntegrationServerClient as E, FARM_API_ROUTE_REF_SYMBOL as F, getIntegrationAPIManifest as G, integrationClients as H, type InvalidateTarget as I, integrationsClient as J, integrationsServer as K, type IntegrationClient as L, type IntegrationClientAliases as M, type IntegrationClientRoot as N, type OptimisticUpdate as O, type IntegrationClientOptions as P, type IntegrationClientRequestOptions as Q, type RequestEvent as R, type ServerAPIClientOptions as S, type IntegrationAPI as T, type IntegrationClients as U, type IntegrationClientData as V, type IntegrationOperationResult as W, type InferIntegrationOperationBody as X, type InferIntegrationOperationQuery as Y, type InferIntegrationOperationResponse as Z, type IntegrationServerClient as _, FARM_API_ROUTE_META_SYMBOL as a, type IntegrationServerClientOptions as a0, type IntegrationServerClientRequestOptions as a1, type IntegrationServerClientRoot as a2, type IntegrationServerRequestLike as a3, type APIClientOptions as b, type APIClientWithoutIntegrationsOptions as c, type ServerAPIClientWithoutIntegrationsOptions as d, type StatusPhase as e, type StatusEvent as f, type APIResult as g, APIClientError as h, type APIClientSystemError as i, type ResponseEvent as j, type CachePolicy as k, type CacheOptions as l, type RetryOptions as m, type InvalidateOptions as n, type OptimisticOptions as o, type ClientOptions as p, type RouteAPIClient as q, type APIClient as r, type ServerAPIClient as s, createAPIClient as t, isAPIRouteRef as u, getAPIRouteRefMetadata as v, createServerAPIClient as w, createIntegrationClient as x, IntegrationClientError as y, createIntegrationApi as z };
|