@farm.js/core 0.1.0-beta.13 → 0.1.0-beta.16

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.
Files changed (94) hide show
  1. package/dist/api/route-manager.cjs.map +1 -1
  2. package/dist/api/route-manager.mjs +2 -2
  3. package/dist/api/runtime.cjs.map +1 -1
  4. package/dist/api/runtime.mjs +1 -1
  5. package/dist/api.cjs +18 -10
  6. package/dist/api.cjs.map +1 -1
  7. package/dist/api.mjs +3 -3
  8. package/dist/{chunk-B232I2GP.mjs → chunk-3HIVDX7J.mjs} +12 -1
  9. package/dist/chunk-3HIVDX7J.mjs.map +1 -0
  10. package/dist/{chunk-JDEOUK5V.mjs → chunk-6YXKHAFU.mjs} +3 -3
  11. package/dist/{chunk-VSDZEB5M.mjs → chunk-AN3PQVKH.mjs} +14 -16
  12. package/dist/{chunk-VSDZEB5M.mjs.map → chunk-AN3PQVKH.mjs.map} +1 -1
  13. package/dist/{chunk-Z5CQMP54.mjs → chunk-ARRYKOI5.mjs} +2 -2
  14. package/dist/{chunk-KLA67WKG.mjs → chunk-B3FFOIWS.mjs} +2 -2
  15. package/dist/{chunk-3WIRO3N7.mjs → chunk-BWJC5ZOD.mjs} +2 -2
  16. package/dist/{chunk-3WIRO3N7.mjs.map → chunk-BWJC5ZOD.mjs.map} +1 -1
  17. package/dist/{chunk-PFE6GMNE.mjs → chunk-HMRFYJK6.mjs} +19 -11
  18. package/dist/chunk-HMRFYJK6.mjs.map +1 -0
  19. package/dist/{chunk-32W4QEJP.mjs → chunk-KFTGPFRD.mjs} +1 -1
  20. package/dist/chunk-KFTGPFRD.mjs.map +1 -0
  21. package/dist/{chunk-Z3YG4OZT.mjs → chunk-OSWV5IJB.mjs} +140 -41
  22. package/dist/chunk-OSWV5IJB.mjs.map +1 -0
  23. package/dist/{chunk-OPHK6OJN.mjs → chunk-SLDBGSC3.mjs} +2 -2
  24. package/dist/{chunk-L2PE36GQ.mjs → chunk-T2KL7VEL.mjs} +3 -3
  25. package/dist/{chunk-WDU6QXNK.mjs → chunk-UCYWGN2P.mjs} +1 -1
  26. package/dist/chunk-UCYWGN2P.mjs.map +1 -0
  27. package/dist/{chunk-65A7QIKI.mjs → chunk-UMVLB3PN.mjs} +3 -3
  28. package/dist/chunk-UMVLB3PN.mjs.map +1 -0
  29. package/dist/{chunk-VY2UYN5R.mjs → chunk-VPCFICID.mjs} +82 -3
  30. package/dist/chunk-VPCFICID.mjs.map +1 -0
  31. package/dist/{chunk-H3TE3LOV.mjs → chunk-XMFTIVJH.mjs} +2 -2
  32. package/dist/{chunk-UB5UOSHB.mjs → chunk-ZVMV3THA.mjs} +71 -2
  33. package/dist/chunk-ZVMV3THA.mjs.map +1 -0
  34. package/dist/client.cjs.map +1 -1
  35. package/dist/client.mjs +3 -3
  36. package/dist/deployment.cjs +12 -0
  37. package/dist/deployment.cjs.map +1 -1
  38. package/dist/deployment.mjs +3 -1
  39. package/dist/{devtools-GAZ7F3KL.mjs → devtools-E4YNCY5J.mjs} +4 -4
  40. package/dist/docs.cjs.map +1 -1
  41. package/dist/docs.mjs +4 -4
  42. package/dist/index.cjs +332 -58
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.mjs +28 -16
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/internal/build-runtime.cjs +159 -46
  47. package/dist/internal/build-runtime.cjs.map +1 -1
  48. package/dist/internal/build-runtime.mjs +11 -11
  49. package/dist/internal/config-runtime.cjs.map +1 -1
  50. package/dist/internal/config-runtime.mjs +3 -3
  51. package/dist/navigation.cjs.map +1 -1
  52. package/dist/navigation.mjs +3 -3
  53. package/dist/plugin.cjs +141 -34
  54. package/dist/plugin.cjs.map +1 -1
  55. package/dist/plugin.mjs +8 -8
  56. package/dist/server-action-security.cjs +23 -1
  57. package/dist/server-action-security.cjs.map +1 -1
  58. package/dist/server-action-security.mjs +1 -1
  59. package/dist/server-fn-client.cjs.map +1 -1
  60. package/dist/server-fn-client.mjs +1 -1
  61. package/dist/server-fn.cjs +140 -3
  62. package/dist/server-fn.cjs.map +1 -1
  63. package/dist/server-fn.mjs +14 -3
  64. package/dist/server-query.cjs +99 -1
  65. package/dist/server-query.cjs.map +1 -1
  66. package/dist/server-query.mjs +3 -3
  67. package/dist/server.cjs +260 -37
  68. package/dist/server.cjs.map +1 -1
  69. package/dist/server.mjs +11 -11
  70. package/dist/testing.cjs.map +1 -1
  71. package/dist/testing.mjs +3 -3
  72. package/dist/version.cjs +1 -1
  73. package/dist/version.cjs.map +1 -1
  74. package/dist/version.mjs +1 -1
  75. package/dist/vite.cjs +142 -35
  76. package/dist/vite.cjs.map +1 -1
  77. package/dist/vite.mjs +8 -8
  78. package/package.json +1 -1
  79. package/types/client.d.ts +115 -4
  80. package/dist/chunk-32W4QEJP.mjs.map +0 -1
  81. package/dist/chunk-65A7QIKI.mjs.map +0 -1
  82. package/dist/chunk-B232I2GP.mjs.map +0 -1
  83. package/dist/chunk-PFE6GMNE.mjs.map +0 -1
  84. package/dist/chunk-UB5UOSHB.mjs.map +0 -1
  85. package/dist/chunk-VY2UYN5R.mjs.map +0 -1
  86. package/dist/chunk-WDU6QXNK.mjs.map +0 -1
  87. package/dist/chunk-Z3YG4OZT.mjs.map +0 -1
  88. /package/dist/{chunk-JDEOUK5V.mjs.map → chunk-6YXKHAFU.mjs.map} +0 -0
  89. /package/dist/{chunk-Z5CQMP54.mjs.map → chunk-ARRYKOI5.mjs.map} +0 -0
  90. /package/dist/{chunk-KLA67WKG.mjs.map → chunk-B3FFOIWS.mjs.map} +0 -0
  91. /package/dist/{chunk-OPHK6OJN.mjs.map → chunk-SLDBGSC3.mjs.map} +0 -0
  92. /package/dist/{chunk-L2PE36GQ.mjs.map → chunk-T2KL7VEL.mjs.map} +0 -0
  93. /package/dist/{chunk-H3TE3LOV.mjs.map → chunk-XMFTIVJH.mjs.map} +0 -0
  94. /package/dist/{devtools-GAZ7F3KL.mjs.map → devtools-E4YNCY5J.mjs.map} +0 -0
package/dist/index.mjs CHANGED
@@ -9,12 +9,12 @@ import {
9
9
  } from "./chunk-VCANOYFI.mjs";
10
10
  import {
11
11
  build
12
- } from "./chunk-VSDZEB5M.mjs";
12
+ } from "./chunk-AN3PQVKH.mjs";
13
13
  import "./chunk-4S3ORGFA.mjs";
14
14
  import "./chunk-SL6HTIOK.mjs";
15
15
  import {
16
16
  useServerFn
17
- } from "./chunk-32W4QEJP.mjs";
17
+ } from "./chunk-KFTGPFRD.mjs";
18
18
  import {
19
19
  cookies,
20
20
  headers
@@ -30,7 +30,7 @@ import {
30
30
  isFarmDocsRequest,
31
31
  loadFarmDocsPage,
32
32
  resolveFarmDocsContentDir
33
- } from "./chunk-OPHK6OJN.mjs";
33
+ } from "./chunk-SLDBGSC3.mjs";
34
34
  import "./chunk-V7RBCSDJ.mjs";
35
35
  import {
36
36
  farmMiddlewarePlugin,
@@ -46,7 +46,7 @@ import {
46
46
  } from "./chunk-EJ7T4TPB.mjs";
47
47
  import {
48
48
  farmApiPlugin
49
- } from "./chunk-JDEOUK5V.mjs";
49
+ } from "./chunk-6YXKHAFU.mjs";
50
50
  import {
51
51
  FarmEnvironmentError,
52
52
  createClientOnlyFn,
@@ -56,13 +56,13 @@ import {
56
56
  import {
57
57
  FARM_SERVER_QUERY_SYMBOL,
58
58
  createServerQuery
59
- } from "./chunk-65A7QIKI.mjs";
59
+ } from "./chunk-UMVLB3PN.mjs";
60
60
  import {
61
61
  FARM_SERVER_FN_SYMBOL,
62
62
  _parseServerFnSchema,
63
63
  createServerFn,
64
64
  createServerMiddleware
65
- } from "./chunk-VY2UYN5R.mjs";
65
+ } from "./chunk-VPCFICID.mjs";
66
66
  import {
67
67
  getDeployTargetForPreset,
68
68
  getPresetForDeployTarget,
@@ -72,7 +72,7 @@ import {
72
72
  resolveDeployConfig,
73
73
  resolveDeployOutputPath,
74
74
  resolveMigrationsConfig
75
- } from "./chunk-L2PE36GQ.mjs";
75
+ } from "./chunk-T2KL7VEL.mjs";
76
76
  import {
77
77
  defineConfig,
78
78
  defineFarmConfig
@@ -96,7 +96,7 @@ import {
96
96
  createStore,
97
97
  useFetcher,
98
98
  useMutation
99
- } from "./chunk-WDU6QXNK.mjs";
99
+ } from "./chunk-UCYWGN2P.mjs";
100
100
  import {
101
101
  installChunkErrorRecovery,
102
102
  isChunkLoadError
@@ -148,7 +148,7 @@ import {
148
148
  parseRouteRenderingDirective,
149
149
  resolveRouteRenderingConfig,
150
150
  resolveRouteRenderingConfigFromFile
151
- } from "./chunk-Z3YG4OZT.mjs";
151
+ } from "./chunk-OSWV5IJB.mjs";
152
152
  import {
153
153
  APITypeGenerator
154
154
  } from "./chunk-LGHEOHBU.mjs";
@@ -170,7 +170,7 @@ import "./chunk-USWZZUEH.mjs";
170
170
  import {
171
171
  usePathname,
172
172
  useSearchParams
173
- } from "./chunk-H3TE3LOV.mjs";
173
+ } from "./chunk-XMFTIVJH.mjs";
174
174
  import {
175
175
  getFarmRedirectError,
176
176
  isFarmNotFoundError,
@@ -203,17 +203,22 @@ import "./chunk-7ZVN3YZI.mjs";
203
203
  import "./chunk-GY2STC2S.mjs";
204
204
  import {
205
205
  DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT,
206
+ FARM_SERVER_FN_FAILURE_SYMBOL,
207
+ ServerActionError,
206
208
  ServerActionRequestError,
209
+ ServerFnFailure,
207
210
  createServerActionRequestErrorResponse,
211
+ createServerFnTransportError,
208
212
  getServerActionExecutionContext,
209
213
  getServerActionInvalidations,
210
214
  getServerActionSignal,
215
+ isServerFnFailure,
211
216
  prepareServerActionRequest,
212
217
  resolveServerActionsConfig,
213
218
  runWithServerActionRequest,
214
219
  sanitizeServerActionError,
215
220
  validateServerActionRequest
216
- } from "./chunk-UB5UOSHB.mjs";
221
+ } from "./chunk-ZVMV3THA.mjs";
217
222
  import {
218
223
  createFarmMarkdownRouteModule,
219
224
  createFarmMarkdownRouteModuleFromFile,
@@ -332,7 +337,7 @@ import "./chunk-QGOHVJ6J.mjs";
332
337
  import {
333
338
  APIRouteManager,
334
339
  API_ROUTE_METHODS
335
- } from "./chunk-Z5CQMP54.mjs";
340
+ } from "./chunk-ARRYKOI5.mjs";
336
341
  import "./chunk-2ED5Q2GH.mjs";
337
342
  import "./chunk-GN72QAIH.mjs";
338
343
  import "./chunk-FQYDHKKU.mjs";
@@ -389,12 +394,12 @@ import {
389
394
  isWebResponse,
390
395
  matchAPIRoute,
391
396
  normalizeRouteResponse
392
- } from "./chunk-PFE6GMNE.mjs";
397
+ } from "./chunk-HMRFYJK6.mjs";
393
398
  import {
394
399
  getCurrentRequest
395
400
  } from "./chunk-RHIFZZUI.mjs";
396
401
  import "./chunk-LM2YNO4U.mjs";
397
- import "./chunk-3WIRO3N7.mjs";
402
+ import "./chunk-BWJC5ZOD.mjs";
398
403
  import {
399
404
  SPARouter,
400
405
  getRouter,
@@ -408,7 +413,7 @@ import {
408
413
  usePageState,
409
414
  useRouter,
410
415
  useScrollRestoration
411
- } from "./chunk-KLA67WKG.mjs";
416
+ } from "./chunk-B3FFOIWS.mjs";
412
417
  import "./chunk-ITN462YM.mjs";
413
418
  import {
414
419
  FARM_DEPLOYMENT_COOKIE,
@@ -422,12 +427,13 @@ import {
422
427
  createFarmDeploymentMismatchResponse,
423
428
  createFarmDeploymentRequestHeaders,
424
429
  getFarmDeploymentMismatch,
430
+ getFarmPresetRuntime,
425
431
  getFarmRequestDeploymentId,
426
432
  getFarmResponseDeploymentId,
427
433
  isFarmDeploymentMismatchResponse,
428
434
  normalizeFarmDeploymentId,
429
435
  withFarmDeploymentResponse
430
- } from "./chunk-B232I2GP.mjs";
436
+ } from "./chunk-3HIVDX7J.mjs";
431
437
  import {
432
438
  api,
433
439
  defineIntegrationAPI,
@@ -633,6 +639,7 @@ export {
633
639
  FARM_DEVTOOLS_LAUNCH_PARAM,
634
640
  FARM_DEVTOOLS_PATH,
635
641
  FARM_INTEGRATION_INTERNAL_DISPATCH_CONTEXT_KEY,
642
+ FARM_SERVER_FN_FAILURE_SYMBOL,
636
643
  FARM_SERVER_FN_SYMBOL,
637
644
  FARM_SERVER_QUERY_SYMBOL,
638
645
  FarmClientPluginManager,
@@ -655,7 +662,9 @@ export {
655
662
  PluginManager,
656
663
  SPARouter,
657
664
  ScalarAPIDocumentation,
665
+ ServerActionError,
658
666
  ServerActionRequestError,
667
+ ServerFnFailure,
659
668
  _parseServerFnSchema,
660
669
  _runWithAfterNodeResponse,
661
670
  _runWithAfterRequest,
@@ -744,6 +753,7 @@ export {
744
753
  createServerAPIClient,
745
754
  createServerActionRequestErrorResponse,
746
755
  createServerFn,
756
+ createServerFnTransportError,
747
757
  createServerMiddleware,
748
758
  createServerOnlyFn,
749
759
  createServerQuery,
@@ -797,6 +807,7 @@ export {
797
807
  getFarmDocsRouteTypeEntries,
798
808
  getFarmIntegrationPluginServerRuntime,
799
809
  getFarmLayerAliases,
810
+ getFarmPresetRuntime,
800
811
  getFarmRedirectError,
801
812
  getFarmRequestDeploymentId,
802
813
  getFarmResponseDeploymentId,
@@ -860,6 +871,7 @@ export {
860
871
  isProgrammaticRouteManifest,
861
872
  isProgrammaticRoutesFileName,
862
873
  isSSGModule,
874
+ isServerFnFailure,
863
875
  isWebResponse,
864
876
  jsonStream,
865
877
  layout,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx","../src/openapi/scalar-component.tsx","../src/openapi/docs-route.tsx"],"sourcesContent":["import React, { createContext, useContext, type ReactNode } from \"react\";\nimport type { FarmConfig } from \"./types\";\n\ninterface FarmContextValue {\n config: FarmConfig;\n basePath: string;\n}\n\nconst FarmContext = createContext<FarmContextValue | null>(null);\n\ninterface FarmProviderProps {\n children: ReactNode;\n config: FarmConfig;\n}\n\n/**\n * Farm.js context provider for client-side components\n */\nexport function FarmProvider({ children, config }: FarmProviderProps) {\n const value: FarmContextValue = {\n config,\n basePath: config.basePath || \"/\",\n };\n\n return <FarmContext.Provider value={value}>{children}</FarmContext.Provider>;\n}\n\n/**\n * Hook to access Farm.js configuration and utilities\n */\nexport function useFarm(): FarmContextValue {\n const context = useContext(FarmContext);\n\n if (!context) {\n throw new Error(\"useFarm must be used within a FarmProvider\");\n }\n\n return context;\n}\n\n/**\n * Hook to get the current base path\n */\nexport function useBasePath(): string {\n const { basePath } = useFarm();\n return basePath;\n}\n","import React from \"react\";\n\ninterface ScalarAPIDocumentationProps {\n spec: any;\n config?: {\n theme?: \"default\" | \"purple\" | \"blue\" | \"green\" | \"red\" | \"yellow\";\n layout?: \"modern\" | \"classic\";\n showSidebar?: boolean;\n hideDownloadButton?: boolean;\n hideTryItPanel?: boolean;\n };\n}\n\nexport function ScalarAPIDocumentation({ spec, config = {} }: ScalarAPIDocumentationProps) {\n const [isLoaded, setIsLoaded] = React.useState(false);\n\n React.useEffect(() => {\n // Dynamically import Scalar components\n const loadScalar = async () => {\n try {\n // Load Scalar CSS\n const cssLink = document.createElement(\"link\");\n cssLink.rel = \"stylesheet\";\n cssLink.href = \"https://cdn.jsdelivr.net/npm/@scalar/api-reference@latest/dist/style.css\";\n document.head.appendChild(cssLink);\n\n // Load Scalar JS\n const script = document.createElement(\"script\");\n script.src =\n \"https://cdn.jsdelivr.net/npm/@scalar/api-reference@latest/dist/browser/standalone.js\";\n script.onload = () => setIsLoaded(true);\n document.head.appendChild(script);\n } catch (error) {\n console.error(\"Failed to load Scalar:\", error);\n }\n };\n\n loadScalar();\n }, []);\n\n React.useEffect(() => {\n if (isLoaded && window.ScalarApiReference) {\n // Initialize Scalar\n const container = document.getElementById(\"scalar-api-reference\");\n if (container) {\n window.ScalarApiReference({\n spec,\n theme: config.theme || \"default\",\n layout: config.layout || \"modern\",\n showSidebar: config.showSidebar !== false,\n hideDownloadButton: config.hideDownloadButton || false,\n hideTryItPanel: config.hideTryItPanel || false,\n });\n }\n }\n }, [isLoaded, spec, config]);\n\n return (\n <div className=\"scalar-container\">\n <div id=\"scalar-api-reference\" style={{ height: \"100vh\", width: \"100%\" }} />\n </div>\n );\n}\n\n// Extend window type for Scalar\ndeclare global {\n interface Window {\n ScalarApiReference: (config: any) => void;\n }\n}\n","import React from \"react\";\nimport { ScalarAPIDocumentation } from \"./scalar-component\";\n\ninterface DocsRouteProps {\n spec: any;\n config?: any;\n}\n\nexport function DocsRoute({ spec, config }: DocsRouteProps) {\n return (\n <html lang=\"en\">\n <head>\n <meta charSet=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link rel=\"icon\" href=\"data:,\" />\n <title>{config?.title || \"API Documentation\"}</title>\n <style>{`\n body {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n }\n .scalar-container {\n height: 100vh;\n width: 100%;\n }\n `}</style>\n </head>\n <body>\n <ScalarAPIDocumentation spec={spec} config={config} />\n </body>\n </html>\n );\n}\n"],"mappings":"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","names":["createContext","createContext","React","jsx","React","jsx"]}
1
+ {"version":3,"sources":["../src/provider.tsx","../src/openapi/scalar-component.tsx","../src/openapi/docs-route.tsx"],"sourcesContent":["import React, { createContext, useContext, type ReactNode } from \"react\";\nimport type { FarmConfig } from \"./types\";\n\ninterface FarmContextValue {\n config: FarmConfig;\n basePath: string;\n}\n\nconst FarmContext = createContext<FarmContextValue | null>(null);\n\ninterface FarmProviderProps {\n children: ReactNode;\n config: FarmConfig;\n}\n\n/**\n * Farm.js context provider for client-side components\n */\nexport function FarmProvider({ children, config }: FarmProviderProps) {\n const value: FarmContextValue = {\n config,\n basePath: config.basePath || \"/\",\n };\n\n return <FarmContext.Provider value={value}>{children}</FarmContext.Provider>;\n}\n\n/**\n * Hook to access Farm.js configuration and utilities\n */\nexport function useFarm(): FarmContextValue {\n const context = useContext(FarmContext);\n\n if (!context) {\n throw new Error(\"useFarm must be used within a FarmProvider\");\n }\n\n return context;\n}\n\n/**\n * Hook to get the current base path\n */\nexport function useBasePath(): string {\n const { basePath } = useFarm();\n return basePath;\n}\n","import React from \"react\";\n\ninterface ScalarAPIDocumentationProps {\n spec: any;\n config?: {\n theme?: \"default\" | \"purple\" | \"blue\" | \"green\" | \"red\" | \"yellow\";\n layout?: \"modern\" | \"classic\";\n showSidebar?: boolean;\n hideDownloadButton?: boolean;\n hideTryItPanel?: boolean;\n };\n}\n\nexport function ScalarAPIDocumentation({ spec, config = {} }: ScalarAPIDocumentationProps) {\n const [isLoaded, setIsLoaded] = React.useState(false);\n\n React.useEffect(() => {\n // Dynamically import Scalar components\n const loadScalar = async () => {\n try {\n // Load Scalar CSS\n const cssLink = document.createElement(\"link\");\n cssLink.rel = \"stylesheet\";\n cssLink.href = \"https://cdn.jsdelivr.net/npm/@scalar/api-reference@latest/dist/style.css\";\n document.head.appendChild(cssLink);\n\n // Load Scalar JS\n const script = document.createElement(\"script\");\n script.src =\n \"https://cdn.jsdelivr.net/npm/@scalar/api-reference@latest/dist/browser/standalone.js\";\n script.onload = () => setIsLoaded(true);\n document.head.appendChild(script);\n } catch (error) {\n console.error(\"Failed to load Scalar:\", error);\n }\n };\n\n loadScalar();\n }, []);\n\n React.useEffect(() => {\n if (isLoaded && window.ScalarApiReference) {\n // Initialize Scalar\n const container = document.getElementById(\"scalar-api-reference\");\n if (container) {\n window.ScalarApiReference({\n spec,\n theme: config.theme || \"default\",\n layout: config.layout || \"modern\",\n showSidebar: config.showSidebar !== false,\n hideDownloadButton: config.hideDownloadButton || false,\n hideTryItPanel: config.hideTryItPanel || false,\n });\n }\n }\n }, [isLoaded, spec, config]);\n\n return (\n <div className=\"scalar-container\">\n <div id=\"scalar-api-reference\" style={{ height: \"100vh\", width: \"100%\" }} />\n </div>\n );\n}\n\n// Extend window type for Scalar\ndeclare global {\n interface Window {\n ScalarApiReference: (config: any) => void;\n }\n}\n","import React from \"react\";\nimport { ScalarAPIDocumentation } from \"./scalar-component\";\n\ninterface DocsRouteProps {\n spec: any;\n config?: any;\n}\n\nexport function DocsRoute({ spec, config }: DocsRouteProps) {\n return (\n <html lang=\"en\">\n <head>\n <meta charSet=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link rel=\"icon\" href=\"data:,\" />\n <title>{config?.title || \"API Documentation\"}</title>\n <style>{`\n body {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n }\n .scalar-container {\n height: 100vh;\n width: 100%;\n }\n `}</style>\n </head>\n <body>\n <ScalarAPIDocumentation spec={spec} config={config} />\n </body>\n </html>\n );\n}\n"],"mappings":"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","names":["createContext","createContext","React","jsx","React","jsx"]}
@@ -4303,6 +4303,13 @@ var init_cache_invalidation = __esm({
4303
4303
  }
4304
4304
  });
4305
4305
 
4306
+ // src/server-fn-error.ts
4307
+ var init_server_fn_error = __esm({
4308
+ "src/server-fn-error.ts"() {
4309
+ "use strict";
4310
+ }
4311
+ });
4312
+
4306
4313
  // src/server-action-security.ts
4307
4314
  function resolveServerActionsConfig(config) {
4308
4315
  const allowedOrigins = (config?.allowedOrigins ?? []).map(normalizeAllowedOriginPattern);
@@ -4396,6 +4403,7 @@ var init_server_action_security = __esm({
4396
4403
  "use strict";
4397
4404
  import_node_async_hooks = require("async_hooks");
4398
4405
  init_cache_invalidation();
4406
+ init_server_fn_error();
4399
4407
  DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT = 1e6;
4400
4408
  SERVER_ACTION_STORAGE_KEY = /* @__PURE__ */ Symbol.for("farm.serverActionStorage");
4401
4409
  __name(resolveServerActionsConfig, "resolveServerActionsConfig");
@@ -4865,6 +4873,15 @@ var init_layers = __esm({
4865
4873
  });
4866
4874
 
4867
4875
  // src/deployment.ts
4876
+ function getFarmPresetRuntime(preset) {
4877
+ if (preset === "cloudflare" || preset === "cloudflare-pages" || preset === "cloudflare-module" || preset === "netlify-edge" || preset === "vercel-edge" || preset === "deno") {
4878
+ return "edge";
4879
+ }
4880
+ if (preset === "node-server" || preset === "vercel" || preset === "netlify" || preset === "aws-lambda" || preset === "azure" || preset === "firebase" || preset === "bun" || preset === "self-host" || preset === "farm") {
4881
+ return "node";
4882
+ }
4883
+ return "unknown";
4884
+ }
4868
4885
  function normalizeFarmDeploymentId(value) {
4869
4886
  if (typeof value !== "string" || value.trim() === "") {
4870
4887
  throw new TypeError("Farm deploymentId must be a non-empty string");
@@ -4940,6 +4957,7 @@ var init_deployment = __esm({
4940
4957
  FARM_DEPLOYMENT_COOKIE = "__farm_deployment";
4941
4958
  FARM_DEPLOYMENT_MISMATCH_CODE = "FARM_DEPLOYMENT_MISMATCH";
4942
4959
  FARM_DEPLOYMENT_MISMATCH_STATUS = 409;
4960
+ __name(getFarmPresetRuntime, "getFarmPresetRuntime");
4943
4961
  __name(normalizeFarmDeploymentId, "normalizeFarmDeploymentId");
4944
4962
  __name(getFarmRequestDeploymentId, "getFarmRequestDeploymentId");
4945
4963
  __name(getFarmDeploymentMismatch, "getFarmDeploymentMismatch");
@@ -16340,6 +16358,13 @@ function routePatternToTsTypeLiterals(pattern) {
16340
16358
  function routePatternToRouteLiteral(pattern) {
16341
16359
  return JSON.stringify(pattern);
16342
16360
  }
16361
+ function renderTypeUnion(values) {
16362
+ return values.length <= 1 ? values[0] || "never" : `
16363
+ | ${values.join("\n | ")}`;
16364
+ }
16365
+ function renderTypeAlias(name, value) {
16366
+ return `export type ${name} =${value.startsWith("\n") ? "" : " "}${value};`;
16367
+ }
16343
16368
  function createRoutePattern(route) {
16344
16369
  if (route.segments.length === 0) return "/";
16345
16370
  return "/" + route.segments.map((seg) => {
@@ -16362,39 +16387,48 @@ async function createRouteTypeDeclarations(options, outPath) {
16362
16387
  const { root, srcDir = "src", extraRoutes = [], suppressLintOnLink = false } = options;
16363
16388
  const sourceRoots = options.sourceRoots ?? [{ name: "project", root, srcDir, layer: false }];
16364
16389
  const patterns = /* @__PURE__ */ new Set();
16390
+ const routeModulePatterns = /* @__PURE__ */ new Set();
16365
16391
  const glob = await import("fast-glob");
16366
16392
  for (const source of sourceRoots) {
16367
16393
  const appDir = path20.join(source.root, source.srcDir, "app");
16368
16394
  if (fs5.existsSync(appDir)) {
16369
- const pageFiles = await glob.default("**/page.{ts,tsx,js,jsx,md,mdx}", {
16370
- cwd: appDir,
16371
- absolute: false
16372
- });
16373
- for (const file of pageFiles) {
16395
+ const routeModuleFiles = await glob.default(
16396
+ "**/{page,layout,loading,error}.{ts,tsx,js,jsx,md,mdx}",
16397
+ {
16398
+ cwd: appDir,
16399
+ absolute: false
16400
+ }
16401
+ );
16402
+ for (const file of routeModuleFiles) {
16374
16403
  if (parseRouteSlotFile(file)) continue;
16375
16404
  const route = parseRoutePath(file);
16405
+ const pattern = createRoutePattern(route);
16406
+ routeModulePatterns.add(pattern);
16376
16407
  if (route.type === "page") {
16377
- const pattern = createRoutePattern(route);
16378
16408
  patterns.add(pattern);
16379
16409
  }
16380
16410
  }
16381
16411
  }
16382
16412
  for (const route of await discoverProgrammaticRoutePaths(source.root, source.srcDir)) {
16383
16413
  patterns.add(route);
16414
+ routeModulePatterns.add(route);
16384
16415
  }
16385
16416
  }
16386
16417
  for (const route of extraRoutes) {
16387
16418
  if (route.startsWith("/")) {
16388
16419
  patterns.add(route);
16420
+ routeModulePatterns.add(route);
16389
16421
  }
16390
16422
  }
16391
16423
  const sortedPatterns = Array.from(patterns).sort();
16392
16424
  const typeLiterals = Array.from(new Set(sortedPatterns.flatMap(routePatternToTsTypeLiterals)));
16393
16425
  const patternLiterals = sortedPatterns.map(routePatternToRouteLiteral);
16394
- const routePathType = suppressLintOnLink ? "string" : typeLiterals.length ? typeLiterals.join(" | ") : "never";
16395
- const routePatternType = suppressLintOnLink ? "string" : patternLiterals.length ? patternLiterals.join(" | ") : "never";
16426
+ const routeModulePatternLiterals = Array.from(routeModulePatterns).sort().map(routePatternToRouteLiteral);
16427
+ const routePathType = suppressLintOnLink ? "string" : renderTypeUnion(typeLiterals);
16428
+ const routePatternType = suppressLintOnLink ? "string" : renderTypeUnion(patternLiterals);
16429
+ const routeModulePatternType = renderTypeUnion(routeModulePatternLiterals);
16396
16430
  const routeTypesImportPath = `./${path20.basename(outPath).replace(/\.d\.ts$/, "")}`;
16397
- const augmentationBlock = suppressLintOnLink ? "" : `
16431
+ const linkAugmentationBlock = suppressLintOnLink ? "" : `
16398
16432
  declare module "@farm.js/core/client" {
16399
16433
  interface LinkDefaultRoute {
16400
16434
  _: import(${JSON.stringify(routeTypesImportPath)}).RoutePath;
@@ -16418,14 +16452,25 @@ declare module "@farm.js/core/dist/client.js" {
16418
16452
  pattern: import(${JSON.stringify(routeTypesImportPath)}).RoutePattern;
16419
16453
  }
16420
16454
  }
16455
+ `;
16456
+ const routeModuleAugmentationBlock = `
16457
+ declare global {
16458
+ namespace FarmJS {
16459
+ interface RouteRegistry {
16460
+ pattern: import(${JSON.stringify(routeTypesImportPath)}).RouteModulePattern;
16461
+ }
16462
+ }
16463
+ }
16421
16464
  `;
16422
16465
  const content = `/**
16423
16466
  * Auto-generated route types from src/app.
16424
- * Link href is typed automatically via module augmentation. Regenerated on dev start and when routes change.
16467
+ * Link href and route component props are typed automatically from generated declarations.
16468
+ * Regenerated on dev start and when routes change.
16425
16469
  * Set suppressLintOnLink: true in farm.config.ts to accept any string on Link href.
16426
16470
  */
16427
- export type RoutePath = ${routePathType};
16428
- export type RoutePattern = ${routePatternType};${augmentationBlock}
16471
+ ${renderTypeAlias("RoutePath", routePathType)}
16472
+ ${renderTypeAlias("RoutePattern", routePatternType)}
16473
+ ${renderTypeAlias("RouteModulePattern", routeModulePatternType)}${linkAugmentationBlock}${routeModuleAugmentationBlock}
16429
16474
  `;
16430
16475
  return content;
16431
16476
  }
@@ -16442,6 +16487,8 @@ var init_generate_route_types = __esm({
16442
16487
  __name(routeSegmentsToTsTypeLiteral, "routeSegmentsToTsTypeLiteral");
16443
16488
  __name(routePatternToTsTypeLiterals, "routePatternToTsTypeLiterals");
16444
16489
  __name(routePatternToRouteLiteral, "routePatternToRouteLiteral");
16490
+ __name(renderTypeUnion, "renderTypeUnion");
16491
+ __name(renderTypeAlias, "renderTypeAlias");
16445
16492
  __name(createRoutePattern, "createRoutePattern");
16446
16493
  DEFAULT_OUT_FILE = "farm-routes.d.ts";
16447
16494
  __name(generateRouteTypes, "generateRouteTypes");
@@ -16742,7 +16789,8 @@ async function generateFarmTypeArtifacts(options) {
16742
16789
  const sourceRoots = getFarmSourceRoots({ root, srcDir, layers: options.layers });
16743
16790
  const appDirs = getFarmAppDirectories({ root, srcDir, layers: options.layers });
16744
16791
  const result = {
16745
- apiRoutes: []
16792
+ apiRoutes: [],
16793
+ stalePaths: []
16746
16794
  };
16747
16795
  const unifiedTypesPath = (0, import_path11.join)(root, srcDir, "farm.d.ts");
16748
16796
  const shouldRefreshUnifiedTypes = shouldGenerateRoutes && !options.routeTypesOutFile || shouldGenerateEnv && !options.envTypesOutFile || shouldGenerateI18n && !options.i18nTypesOutFile;
@@ -16758,22 +16806,29 @@ async function generateFarmTypeArtifacts(options) {
16758
16806
  unifiedSections.push(await createRouteTypeDeclarations(routeOptions, unifiedTypesPath));
16759
16807
  result.routeTypesPath = unifiedTypesPath;
16760
16808
  } else if (shouldGenerateRoutes) {
16761
- result.routeTypesPath = await generateRouteTypes({
16809
+ const routeOptions = {
16762
16810
  root,
16763
16811
  srcDir,
16764
16812
  outFile: options.routeTypesOutFile,
16765
16813
  extraRoutes: options.extraRoutes || [],
16766
16814
  suppressLintOnLink: options.suppressLintOnLink,
16767
16815
  sourceRoots
16768
- });
16816
+ };
16817
+ if (options.check) {
16818
+ const routeTypesPath = resolveGeneratedPath(root, srcDir, options.routeTypesOutFile);
16819
+ const content = await createRouteTypeDeclarations(routeOptions, routeTypesPath);
16820
+ checkGeneratedFile(routeTypesPath, content, result.stalePaths);
16821
+ result.routeTypesPath = routeTypesPath;
16822
+ } else {
16823
+ result.routeTypesPath = await generateRouteTypes(routeOptions);
16824
+ }
16769
16825
  }
16770
16826
  if (shouldGenerateApi) {
16771
16827
  const generator = new APITypeGenerator(appDirs);
16772
16828
  const apiRoutes = generator.scanAPIRoutes();
16773
16829
  const apiTypesPath = options.apiTypesOutFile ? (0, import_path11.resolve)(root, options.apiTypesOutFile) : (0, import_path11.join)(root, srcDir, "lib", "api.generated.ts");
16774
16830
  const content = generator.generateAPIRouter(apiRoutes, { outFile: apiTypesPath });
16775
- (0, import_fs4.mkdirSync)((0, import_path11.dirname)(apiTypesPath), { recursive: true });
16776
- writeFileIfChanged(apiTypesPath, content);
16831
+ writeOrCheckGeneratedFile(apiTypesPath, content, options.check, result.stalePaths);
16777
16832
  result.apiTypesPath = apiTypesPath;
16778
16833
  result.apiRoutes = apiRoutes;
16779
16834
  }
@@ -16791,36 +16846,63 @@ async function generateFarmTypeArtifacts(options) {
16791
16846
  );
16792
16847
  result.envTypesPath = unifiedTypesPath;
16793
16848
  } else if (shouldGenerateEnv) {
16794
- result.envTypesPath = await generateEnvTypes({
16849
+ const envOptions = {
16795
16850
  root,
16796
16851
  srcDir,
16797
16852
  outFile: options.envTypesOutFile,
16798
16853
  configPath: options.configPath,
16799
16854
  layerConfigPaths: (options.layers ?? []).map((layer) => layer.configFile).filter((configFile) => Boolean(configFile))
16800
- });
16855
+ };
16856
+ if (options.check) {
16857
+ const envTypesPath = resolveGeneratedPath(root, srcDir, options.envTypesOutFile);
16858
+ checkGeneratedFile(
16859
+ envTypesPath,
16860
+ createEnvTypeDeclarations(envOptions, envTypesPath),
16861
+ result.stalePaths
16862
+ );
16863
+ result.envTypesPath = envTypesPath;
16864
+ } else {
16865
+ result.envTypesPath = await generateEnvTypes(envOptions);
16866
+ }
16801
16867
  }
16802
16868
  if (shouldGenerateImages && options.imageTypesOutFile) {
16803
- result.imageTypesPath = generateFarmImageTypes({
16804
- root,
16805
- srcDir,
16806
- outFile: options.imageTypesOutFile
16807
- });
16869
+ const imageTypesPath = resolveGeneratedPath(root, srcDir, options.imageTypesOutFile, false);
16870
+ if (options.check) {
16871
+ checkGeneratedFile(imageTypesPath, createFarmImageTypeDeclarations(), result.stalePaths);
16872
+ result.imageTypesPath = imageTypesPath;
16873
+ } else {
16874
+ result.imageTypesPath = generateFarmImageTypes({
16875
+ root,
16876
+ srcDir,
16877
+ outFile: options.imageTypesOutFile
16878
+ });
16879
+ }
16808
16880
  }
16809
16881
  if (shouldRefreshUnifiedTypes && options.i18nConfig?.enabled && !options.i18nTypesOutFile) {
16810
16882
  const { signatures } = await readFarmI18nCatalogs(options.i18nConfig);
16811
16883
  unifiedSections.push(renderFarmI18nTypes(options.i18nConfig.locales, signatures));
16812
16884
  result.i18nTypesPath = unifiedTypesPath;
16813
16885
  } else if (shouldGenerateI18n && options.i18nConfig) {
16814
- result.i18nTypesPath = await generateFarmI18nTypes({
16815
- root,
16816
- srcDir,
16817
- config: options.i18nConfig,
16818
- outFile: options.i18nTypesOutFile
16819
- });
16886
+ if (options.check) {
16887
+ const i18nTypesPath = resolveGeneratedPath(root, srcDir, options.i18nTypesOutFile, false);
16888
+ const { signatures } = await readFarmI18nCatalogs(options.i18nConfig);
16889
+ checkGeneratedFile(
16890
+ i18nTypesPath,
16891
+ renderFarmI18nTypes(options.i18nConfig.locales, signatures),
16892
+ result.stalePaths
16893
+ );
16894
+ result.i18nTypesPath = i18nTypesPath;
16895
+ } else {
16896
+ result.i18nTypesPath = await generateFarmI18nTypes({
16897
+ root,
16898
+ srcDir,
16899
+ config: options.i18nConfig,
16900
+ outFile: options.i18nTypesOutFile
16901
+ });
16902
+ }
16820
16903
  }
16821
16904
  if (shouldRefreshUnifiedTypes) {
16822
- (0, import_fs4.mkdirSync)((0, import_path11.dirname)(unifiedTypesPath), { recursive: true });
16823
- writeFileIfChanged(
16905
+ writeOrCheckGeneratedFile(
16824
16906
  unifiedTypesPath,
16825
16907
  `/**
16826
16908
  * Generated by Farm.js. Do not edit.
@@ -16829,13 +16911,37 @@ async function generateFarmTypeArtifacts(options) {
16829
16911
 
16830
16912
  import "@farm.js/core/image";
16831
16913
 
16832
- ${unifiedSections.join("\n")}`
16914
+ ${unifiedSections.map((section) => section.trimEnd()).join("\n\n")}
16915
+ `,
16916
+ options.check,
16917
+ result.stalePaths
16833
16918
  );
16834
16919
  result.typesPath = unifiedTypesPath;
16835
- removeLegacyTypeArtifacts(root, srcDir);
16920
+ if (options.check) {
16921
+ collectLegacyTypeArtifacts(root, srcDir, result.stalePaths);
16922
+ } else {
16923
+ removeLegacyTypeArtifacts(root, srcDir);
16924
+ }
16836
16925
  }
16837
16926
  return result;
16838
16927
  }
16928
+ function resolveGeneratedPath(root, srcDir, outFile, relativeToSrc = true) {
16929
+ if ((0, import_path11.isAbsolute)(outFile)) return (0, import_path11.resolve)(outFile);
16930
+ return (0, import_path11.resolve)(root, relativeToSrc ? (0, import_path11.join)(srcDir, outFile) : outFile);
16931
+ }
16932
+ function writeOrCheckGeneratedFile(filePath, content, check, stalePaths) {
16933
+ if (check) {
16934
+ checkGeneratedFile(filePath, content, stalePaths);
16935
+ return;
16936
+ }
16937
+ (0, import_fs4.mkdirSync)((0, import_path11.dirname)(filePath), { recursive: true });
16938
+ writeFileIfChanged(filePath, content);
16939
+ }
16940
+ function checkGeneratedFile(filePath, content, stalePaths) {
16941
+ if (!(0, import_fs4.existsSync)(filePath) || (0, import_fs4.readFileSync)(filePath, "utf8") !== content) {
16942
+ stalePaths.push(filePath);
16943
+ }
16944
+ }
16839
16945
  function removeLegacyTypeArtifacts(root, srcDir) {
16840
16946
  for (const [fileName, marker] of LEGACY_TYPE_ARTIFACTS) {
16841
16947
  const filePath = (0, import_path11.join)(root, srcDir, fileName);
@@ -16846,6 +16952,13 @@ function removeLegacyTypeArtifacts(root, srcDir) {
16846
16952
  }
16847
16953
  }
16848
16954
  }
16955
+ function collectLegacyTypeArtifacts(root, srcDir, stalePaths) {
16956
+ for (const [fileName, marker] of LEGACY_TYPE_ARTIFACTS) {
16957
+ const filePath = (0, import_path11.join)(root, srcDir, fileName);
16958
+ if (!(0, import_fs4.existsSync)(filePath)) continue;
16959
+ if ((0, import_fs4.readFileSync)(filePath, "utf8").includes(marker)) stalePaths.push(filePath);
16960
+ }
16961
+ }
16849
16962
  var import_fs4, import_path11, LEGACY_TYPE_ARTIFACTS;
16850
16963
  var init_type_artifacts = __esm({
16851
16964
  "src/type-artifacts.ts"() {
@@ -16861,6 +16974,9 @@ var init_type_artifacts = __esm({
16861
16974
  init_layers();
16862
16975
  init_write_file_if_changed();
16863
16976
  __name(generateFarmTypeArtifacts, "generateFarmTypeArtifacts");
16977
+ __name(resolveGeneratedPath, "resolveGeneratedPath");
16978
+ __name(writeOrCheckGeneratedFile, "writeOrCheckGeneratedFile");
16979
+ __name(checkGeneratedFile, "checkGeneratedFile");
16864
16980
  LEGACY_TYPE_ARTIFACTS = [
16865
16981
  ["farm-routes.d.ts", "Auto-generated route types"],
16866
16982
  ["farm-env.d.ts", "Auto-generated env types"],
@@ -16868,6 +16984,7 @@ var init_type_artifacts = __esm({
16868
16984
  ["farm-i18n.d.ts", "Generated by Farm.js"]
16869
16985
  ];
16870
16986
  __name(removeLegacyTypeArtifacts, "removeLegacyTypeArtifacts");
16987
+ __name(collectLegacyTypeArtifacts, "collectLegacyTypeArtifacts");
16871
16988
  }
16872
16989
  });
16873
16990
 
@@ -16875,7 +16992,7 @@ var init_type_artifacts = __esm({
16875
16992
  var version;
16876
16993
  var init_package = __esm({
16877
16994
  "package.json"() {
16878
- version = "0.1.0-beta.13";
16995
+ version = "0.1.0-beta.16";
16879
16996
  }
16880
16997
  });
16881
16998
 
@@ -29170,6 +29287,7 @@ init_fonts();
29170
29287
 
29171
29288
  // src/route-runtime-manifest.ts
29172
29289
  var import_path8 = __toESM(require("path"));
29290
+ init_deployment();
29173
29291
  init_route_runtime();
29174
29292
  init_ssg();
29175
29293
  var FARM_ROUTE_RUNTIME_MANIFEST = "route-runtime-manifest.json";
@@ -29230,10 +29348,15 @@ async function writeFarmRouteRuntimeManifest(directory, manifest) {
29230
29348
  }
29231
29349
  __name(writeFarmRouteRuntimeManifest, "writeFarmRouteRuntimeManifest");
29232
29350
  function validateFarmRouteRuntimeDeployment(manifest, preset) {
29233
- const runtime = getPresetRuntime(preset);
29351
+ const runtime = getFarmPresetRuntime(preset);
29234
29352
  const warnings = /* @__PURE__ */ new Set();
29235
29353
  for (const route of manifest.routes) {
29236
29354
  if (route.rendering === "static") continue;
29355
+ if (runtime === "unknown" && route.runtime !== "auto") {
29356
+ warnings.add(
29357
+ `Preset "${preset}" has an unknown runtime, so Farm could not verify routes that explicitly require node or edge.`
29358
+ );
29359
+ }
29237
29360
  if (runtime !== "unknown" && route.runtime !== "auto" && route.runtime !== runtime) {
29238
29361
  throw new Error(
29239
29362
  `Route "${route.pattern}" requires the ${route.runtime} runtime, but preset "${preset}" emits ${runtime} functions. Choose a compatible preset or change the route runtime.`
@@ -29253,16 +29376,6 @@ function validateFarmRouteRuntimeDeployment(manifest, preset) {
29253
29376
  return { runtime, warnings: Array.from(warnings) };
29254
29377
  }
29255
29378
  __name(validateFarmRouteRuntimeDeployment, "validateFarmRouteRuntimeDeployment");
29256
- function getPresetRuntime(preset) {
29257
- if (preset === "cloudflare" || preset === "cloudflare-pages" || preset === "cloudflare-module" || preset === "netlify-edge" || preset === "vercel-edge" || preset === "deno") {
29258
- return "edge";
29259
- }
29260
- if (preset === "node-server" || preset === "vercel" || preset === "netlify" || preset === "aws-lambda" || preset === "azure" || preset === "firebase" || preset === "bun") {
29261
- return "node";
29262
- }
29263
- return "unknown";
29264
- }
29265
- __name(getPresetRuntime, "getPresetRuntime");
29266
29379
  function normalizeManifestSource(root, modulePath) {
29267
29380
  const queryIndex = modulePath.indexOf("?");
29268
29381
  const filePath = queryIndex === -1 ? modulePath : modulePath.slice(0, queryIndex);