@farm.js/core 0.1.22 → 0.1.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.
Files changed (150) hide show
  1. package/dist/agent-runtime.d.mts +3 -2
  2. package/dist/agent-runtime.d.ts +3 -2
  3. package/dist/api/route-manager.cjs +3 -2
  4. package/dist/api/route-manager.d.mts +3 -2
  5. package/dist/api/route-manager.d.ts +3 -2
  6. package/dist/api/route-manager.mjs +2 -1
  7. package/dist/api.cjs +4 -3
  8. package/dist/api.d.mts +4 -3
  9. package/dist/api.d.ts +4 -3
  10. package/dist/api.mjs +3 -2
  11. package/dist/{app-B7qKw8Ny.d.ts → app-BV-7wV5q.d.ts} +3 -3
  12. package/dist/{app-0e-oTC_R.d.mts → app-BZDWwwFa.d.mts} +3 -3
  13. package/dist/app-markdown.d.mts +4 -3
  14. package/dist/app-markdown.d.ts +4 -3
  15. package/dist/chunk-2VQKKQ6D.mjs +51 -0
  16. package/dist/{chunk-EGJDUF4Q.mjs → chunk-3ATMYLLJ.mjs} +6 -12
  17. package/dist/{chunk-HSDL2AUR.mjs → chunk-47H7VENP.mjs} +20 -32
  18. package/dist/{chunk-EXUMQVY3.cjs → chunk-4DKZ6JR3.cjs} +258 -256
  19. package/dist/{chunk-PUCUVI7K.mjs → chunk-72VJRKJD.mjs} +1 -1
  20. package/dist/{chunk-PC33YKTC.mjs → chunk-7LU4IOXQ.mjs} +128 -126
  21. package/dist/{chunk-SPSQFO3Z.mjs → chunk-BDJNP7AQ.mjs} +9 -13
  22. package/dist/{chunk-GXXONIAR.cjs → chunk-DNLQMFER.cjs} +12 -16
  23. package/dist/{chunk-SO7CRMP6.cjs → chunk-DW34V5SM.cjs} +5 -5
  24. package/dist/{chunk-X2ZUD4GI.mjs → chunk-EHUZ2MKO.mjs} +1 -1
  25. package/dist/{chunk-3NM6SRI6.mjs → chunk-F3VB7ONA.mjs} +10 -8
  26. package/dist/{chunk-P5HSJCXI.cjs → chunk-III667SJ.cjs} +291 -260
  27. package/dist/chunk-IK6LVLKC.cjs +51 -0
  28. package/dist/{chunk-B3WK4DTX.cjs → chunk-IMBMOEWT.cjs} +5 -1
  29. package/dist/{chunk-IILNZK5G.mjs → chunk-JHWOVJ3M.mjs} +46 -62
  30. package/dist/{chunk-TKNSDBBN.cjs → chunk-K3F2E6GS.cjs} +20 -1
  31. package/dist/{chunk-RTHIVJ2G.cjs → chunk-KCMTCM6I.cjs} +7 -8
  32. package/dist/{chunk-Q3PX2TGL.cjs → chunk-LQIRVSBY.cjs} +30 -40
  33. package/dist/chunk-LYLEZIG3.cjs +73 -0
  34. package/dist/{chunk-NBAHDVOJ.cjs → chunk-LYM7HY34.cjs} +20 -32
  35. package/dist/{chunk-K6FNHVDR.cjs → chunk-MPEYMSCF.cjs} +6 -12
  36. package/dist/{chunk-BHJUZ64B.cjs → chunk-QTBEAKCJ.cjs} +7 -7
  37. package/dist/{chunk-J6JRB2ER.mjs → chunk-S67OYZU7.mjs} +1 -1
  38. package/dist/chunk-SFGWNC43.mjs +97 -0
  39. package/dist/{chunk-AYJR42WX.cjs → chunk-UFDV5N3C.cjs} +2 -2
  40. package/dist/chunk-UYIHRDE4.cjs +97 -0
  41. package/dist/{chunk-Y4YMF2NQ.cjs → chunk-VPTDD5XF.cjs} +46 -62
  42. package/dist/{chunk-AAWTJW2G.mjs → chunk-VPY755R2.mjs} +58 -27
  43. package/dist/{chunk-GKT4ONKN.mjs → chunk-VVJCWBIE.mjs} +2 -2
  44. package/dist/{chunk-2HCEC2YO.cjs → chunk-VXCA7RZP.cjs} +1 -1
  45. package/dist/{chunk-CQHFU55R.mjs → chunk-WNUBR4CA.mjs} +5 -1
  46. package/dist/{chunk-CIAGU2X4.cjs → chunk-XSIRSMAS.cjs} +10 -8
  47. package/dist/{chunk-ONMW3EVV.mjs → chunk-YGMK6ESJ.mjs} +20 -30
  48. package/dist/chunk-YOZYCI6Z.mjs +73 -0
  49. package/dist/{chunk-HLCDYJY7.mjs → chunk-YQVSHTMR.mjs} +20 -1
  50. package/dist/{chunk-F5D4XEAS.mjs → chunk-ZZSRYEYU.mjs} +7 -8
  51. package/dist/{client-plugins-CWrhb1ir.d.mts → client-plugins-B_XzCegf.d.mts} +11 -9
  52. package/dist/{client-plugins-DPf0qZey.d.ts → client-plugins-CKsXQfXY.d.ts} +11 -9
  53. package/dist/client-plugins.d.mts +3 -2
  54. package/dist/client-plugins.d.ts +3 -2
  55. package/dist/client.d.mts +7 -6
  56. package/dist/client.d.ts +7 -6
  57. package/dist/config.d.mts +3 -2
  58. package/dist/config.d.ts +3 -2
  59. package/dist/{devtools-EZ5ORGAK.mjs → devtools-OY4SNU3P.mjs} +4 -3
  60. package/dist/{devtools-6DQHO7EK.cjs → devtools-UHRSZ7VA.cjs} +5 -4
  61. package/dist/docs.cjs +9 -6
  62. package/dist/docs.mjs +8 -5
  63. package/dist/index.cjs +23 -20
  64. package/dist/index.d.mts +14 -13
  65. package/dist/index.d.ts +14 -13
  66. package/dist/index.mjs +18 -15
  67. package/dist/instrumentation.cjs +3 -2
  68. package/dist/instrumentation.mjs +2 -1
  69. package/dist/integrations.d.mts +3 -2
  70. package/dist/integrations.d.ts +3 -2
  71. package/dist/internal/app-markdown-runtime.d.mts +3 -2
  72. package/dist/internal/app-markdown-runtime.d.ts +3 -2
  73. package/dist/internal/build-runtime.cjs +17 -14
  74. package/dist/internal/build-runtime.d.mts +5 -4
  75. package/dist/internal/build-runtime.d.ts +5 -4
  76. package/dist/internal/build-runtime.mjs +16 -13
  77. package/dist/internal/cli-runtime.cjs +10 -7
  78. package/dist/internal/cli-runtime.mjs +9 -6
  79. package/dist/internal/client-error-overlay.cjs +4 -4
  80. package/dist/internal/client-error-overlay.mjs +1 -1
  81. package/dist/internal/compression-runtime.d.mts +3 -2
  82. package/dist/internal/compression-runtime.d.ts +3 -2
  83. package/dist/internal/config-runtime.cjs +5 -4
  84. package/dist/internal/config-runtime.d.mts +4 -3
  85. package/dist/internal/config-runtime.d.ts +4 -3
  86. package/dist/internal/config-runtime.mjs +4 -3
  87. package/dist/internal/metadata-image-runtime.cjs +3 -2
  88. package/dist/internal/metadata-image-runtime.mjs +2 -1
  89. package/dist/internal/product-telemetry-runtime.cjs +2 -2
  90. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  91. package/dist/internal/production-runtime.d.mts +9 -8
  92. package/dist/internal/production-runtime.d.ts +9 -8
  93. package/dist/layers-4PNE2HOY.cjs +18 -0
  94. package/dist/{layers-CJKSJGLN.mjs → layers-BRQF5ETU.mjs} +2 -1
  95. package/dist/{manager-NPG43N46.mjs → manager-RT733VRK.mjs} +2 -2
  96. package/dist/{manager-G4B2IPYE.cjs → manager-XZ5TX7AO.cjs} +3 -3
  97. package/dist/{metadata-CO9fRyyJ.d.mts → metadata-B08w4EYV.d.mts} +1 -1
  98. package/dist/{metadata-zY9wltwH.d.ts → metadata-IQEblkZp.d.ts} +1 -1
  99. package/dist/middleware.d.mts +5 -4
  100. package/dist/middleware.d.ts +5 -4
  101. package/dist/navigation.d.mts +6 -5
  102. package/dist/navigation.d.ts +6 -5
  103. package/dist/{nitro-TSGDUJMN.cjs → nitro-KQDU7CFE.cjs} +2 -2
  104. package/dist/{nitro-4LFVTT24.mjs → nitro-ZKLGOTVY.mjs} +1 -1
  105. package/dist/node-module-bundle-L5L7JCZ4.mjs +11 -0
  106. package/dist/node-module-bundle-VAFZOXMJ.cjs +11 -0
  107. package/dist/plugin.cjs +11 -9
  108. package/dist/plugin.d.mts +3 -2
  109. package/dist/plugin.d.ts +3 -2
  110. package/dist/plugin.mjs +10 -8
  111. package/dist/{production-runtime-CywsHwnG.d.mts → production-runtime-C3bGFEaM.d.mts} +1 -1
  112. package/dist/{production-runtime-lkfwujwK.d.ts → production-runtime-DRSOkc-d.d.ts} +1 -1
  113. package/dist/{render-plan-LVy6sGQe.d.mts → render-plan-B6CKNl4e.d.mts} +1 -1
  114. package/dist/{render-plan-DHF0GeWo.d.ts → render-plan-CCFuMLNS.d.ts} +1 -1
  115. package/dist/renderer-client.d.mts +5 -4
  116. package/dist/renderer-client.d.ts +5 -4
  117. package/dist/{request-6AkmhEYE.d.mts → request-DgD1XsTx.d.mts} +1 -1
  118. package/dist/{request-BYxlRqA9.d.ts → request-Dn6VURbE.d.ts} +1 -1
  119. package/dist/request.d.mts +4 -3
  120. package/dist/request.d.ts +4 -3
  121. package/dist/{route-rendering-Dd8Jmml7.d.mts → route-rendering-76A5I_kE.d.mts} +1 -1
  122. package/dist/{route-rendering-CWaKiUbS.d.ts → route-rendering-LAmQEdyG.d.ts} +1 -1
  123. package/dist/{router-B2m4fvve.d.ts → router-BSOOGya2.d.ts} +1 -1
  124. package/dist/{router-xwEE112q.d.mts → router-CnrRSa9d.d.mts} +1 -1
  125. package/dist/routes.d.mts +3 -2
  126. package/dist/routes.d.ts +3 -2
  127. package/dist/server-plugins.d.mts +4 -3
  128. package/dist/server-plugins.d.ts +4 -3
  129. package/dist/server.cjs +39 -26
  130. package/dist/server.d.mts +9 -8
  131. package/dist/server.d.ts +9 -8
  132. package/dist/server.mjs +24 -11
  133. package/dist/{spa-router-Y8rrXTVK.d.ts → spa-router-BMrSsG5b.d.ts} +2 -2
  134. package/dist/{spa-router-DVEHQnWo.d.mts → spa-router-DnYhWCvI.d.mts} +2 -2
  135. package/dist/testing.cjs +2 -1
  136. package/dist/testing.d.mts +3 -2
  137. package/dist/testing.d.ts +3 -2
  138. package/dist/testing.mjs +2 -1
  139. package/dist/{utils-DSPx34-A.d.mts → utils-ABkktwku.d.mts} +1 -1
  140. package/dist/{utils-Dvuny_08.d.ts → utils-C3GguS-Q.d.ts} +1 -1
  141. package/dist/version.cjs +2 -2
  142. package/dist/version.mjs +1 -1
  143. package/dist/vite.cjs +11 -9
  144. package/dist/vite.d.mts +3 -2
  145. package/dist/vite.d.ts +3 -2
  146. package/dist/vite.mjs +10 -8
  147. package/dist/workflows.cjs +2 -2
  148. package/dist/workflows.mjs +1 -1
  149. package/package.json +21 -11
  150. package/dist/layers-E4WPJNY5.cjs +0 -17
@@ -6,7 +6,7 @@ import {
6
6
  parseRouteSlotFile,
7
7
  resolveRouteRenderingConfig,
8
8
  resolveRouteRenderingConfigFromFile
9
- } from "./chunk-GKT4ONKN.mjs";
9
+ } from "./chunk-VVJCWBIE.mjs";
10
10
  import {
11
11
  collectSchemaExtensions,
12
12
  declareSchemaTables,
@@ -30,7 +30,7 @@ import {
30
30
  } from "./chunk-BOYNDCZL.mjs";
31
31
  import {
32
32
  createFarmMetadataImageResponse
33
- } from "./chunk-HLCDYJY7.mjs";
33
+ } from "./chunk-YQVSHTMR.mjs";
34
34
  import {
35
35
  createFarmImageHandler
36
36
  } from "./chunk-F6XEGFHO.mjs";
@@ -74,7 +74,7 @@ import {
74
74
  getFarmAppDirectories,
75
75
  getFarmLayerAliases,
76
76
  getFarmSourceRoots
77
- } from "./chunk-IILNZK5G.mjs";
77
+ } from "./chunk-JHWOVJ3M.mjs";
78
78
  import {
79
79
  REACT_RENDERER,
80
80
  assertFarmRendererStreamingRuntime,
@@ -144,7 +144,7 @@ import {
144
144
  } from "./chunk-OFEY6KHO.mjs";
145
145
  import {
146
146
  resolveWorkflowsConfig
147
- } from "./chunk-EGJDUF4Q.mjs";
147
+ } from "./chunk-3ATMYLLJ.mjs";
148
148
  import {
149
149
  initStorage
150
150
  } from "./chunk-UWPLULNK.mjs";
@@ -182,7 +182,7 @@ import {
182
182
  } from "./chunk-IOEH4VWN.mjs";
183
183
  import {
184
184
  APIRouteManager
185
- } from "./chunk-CQHFU55R.mjs";
185
+ } from "./chunk-WNUBR4CA.mjs";
186
186
  import {
187
187
  findProgrammaticRouteFiles,
188
188
  loadProgrammaticRouteManifests
@@ -193,6 +193,12 @@ import {
193
193
  createFarmI18nRuntime,
194
194
  getFarmI18nClientSnapshot
195
195
  } from "./chunk-JNGIWIY6.mjs";
196
+ import {
197
+ VERCEL_OG_INSTALL_HINT,
198
+ formatOptionalPeerInstallHint,
199
+ isMissingPackageError,
200
+ isOptionalPeerInstalled
201
+ } from "./chunk-YOZYCI6Z.mjs";
196
202
  import {
197
203
  isFarmAPIPathname
198
204
  } from "./chunk-XP777LRD.mjs";
@@ -265,7 +271,7 @@ import {
265
271
  } from "./chunk-Z2RZJZIZ.mjs";
266
272
  import {
267
273
  FARM_VERSION
268
- } from "./chunk-X2ZUD4GI.mjs";
274
+ } from "./chunk-EHUZ2MKO.mjs";
269
275
  import {
270
276
  resolveFarmTrailingSlashRedirect,
271
277
  setFarmTrailingSlashPreference
@@ -7419,20 +7425,6 @@ __name(createFarmApp, "createFarmApp");
7419
7425
  // src/build/tailwind.ts
7420
7426
  import path11 from "path";
7421
7427
 
7422
- // src/optional-peer.ts
7423
- function isMissingPackageError(error, packageName) {
7424
- if (!error || typeof error !== "object") return false;
7425
- const { code, message } = error;
7426
- if (code !== "ERR_MODULE_NOT_FOUND" && code !== "MODULE_NOT_FOUND") return false;
7427
- if (typeof message !== "string") return false;
7428
- return message.includes(`'${packageName}'`) || message.includes(`"${packageName}"`);
7429
- }
7430
- __name(isMissingPackageError, "isMissingPackageError");
7431
- function formatOptionalPeerInstallHint(packageName, purpose, options = {}) {
7432
- return `Install "${packageName}" to ${purpose}: pnpm add ${options.dev ? "-D " : ""}${packageName}`;
7433
- }
7434
- __name(formatOptionalPeerInstallHint, "formatOptionalPeerInstallHint");
7435
-
7436
7428
  // src/build/vite-plugin-compat.ts
7437
7429
  function adaptTailwindVitePlugin(pluginOption, builder) {
7438
7430
  if (builder !== "rolldown") return pluginOption;
@@ -7525,6 +7517,26 @@ function createMissingTailwindPlugin() {
7525
7517
  }
7526
7518
  __name(createMissingTailwindPlugin, "createMissingTailwindPlugin");
7527
7519
 
7520
+ // src/image-runtime.ts
7521
+ var SHARP_INSTALL_HINT = formatOptionalPeerInstallHint("sharp", "optimize images");
7522
+ var CLOUDFLARE_IMAGE_PRESETS = /* @__PURE__ */ new Set(["cloudflare", "cloudflare-pages", "cloudflare-module"]);
7523
+ function resolveFarmImageProviderForRuntime(images, options) {
7524
+ const provider = images?.provider ?? "auto";
7525
+ if (provider === "none") return images;
7526
+ const usesSharp = options.dev ? true : provider === "node" || provider === "auto" && !CLOUDFLARE_IMAGE_PRESETS.has(options.preset || "");
7527
+ if (!usesSharp || isOptionalPeerInstalled(options.root, "sharp")) return images;
7528
+ if (provider === "node") {
7529
+ throw new Error(
7530
+ `images.provider "node" optimizes images with sharp, which is not installed. ${SHARP_INSTALL_HINT}`
7531
+ );
7532
+ }
7533
+ logger.info(
7534
+ `Image optimization is off because sharp is not installed; images use their original URLs. ${SHARP_INSTALL_HINT}, or set images.provider to "none".`
7535
+ );
7536
+ return Object.freeze({ ...images, provider: "none" });
7537
+ }
7538
+ __name(resolveFarmImageProviderForRuntime, "resolveFarmImageProviderForRuntime");
7539
+
7528
7540
  // src/schema-step-types.ts
7529
7541
  function validateSchemaSteps(owner, schema, steps) {
7530
7542
  if (steps === void 0) return;
@@ -9494,7 +9506,7 @@ function loadFarmDocsSearchDevRuntime() {
9494
9506
  }
9495
9507
  __name(loadFarmDocsSearchDevRuntime, "loadFarmDocsSearchDevRuntime");
9496
9508
  function loadFarmOpenAPIDevRuntime() {
9497
- return import("./manager-NPG43N46.mjs");
9509
+ return import("./manager-RT733VRK.mjs");
9498
9510
  }
9499
9511
  __name(loadFarmOpenAPIDevRuntime, "loadFarmOpenAPIDevRuntime");
9500
9512
  function loadFarmWorkflowsDevRuntime() {
@@ -9502,7 +9514,7 @@ function loadFarmWorkflowsDevRuntime() {
9502
9514
  }
9503
9515
  __name(loadFarmWorkflowsDevRuntime, "loadFarmWorkflowsDevRuntime");
9504
9516
  function loadFarmDevtoolsSnapshotRuntime() {
9505
- return import("./devtools-EZ5ORGAK.mjs");
9517
+ return import("./devtools-OY4SNU3P.mjs");
9506
9518
  }
9507
9519
  __name(loadFarmDevtoolsSnapshotRuntime, "loadFarmDevtoolsSnapshotRuntime");
9508
9520
  function loadFarmDevtoolsUIRuntime() {
@@ -9532,14 +9544,29 @@ function farmI18nClientBridgePlugin() {
9532
9544
  __name(farmI18nClientBridgePlugin, "farmI18nClientBridgePlugin");
9533
9545
  var FARM_SERVER_ONLY_ENTRIES = /* @__PURE__ */ new Set(["@farm.js/core/og"]);
9534
9546
  function farmServerOnlyEntriesPlugin() {
9547
+ let root = process.cwd();
9548
+ let vercelOgInstalled = false;
9535
9549
  return {
9536
9550
  name: "farm:server-only-entries",
9537
9551
  enforce: "pre",
9552
+ configResolved(config) {
9553
+ root = config.root;
9554
+ },
9538
9555
  resolveId(id, importer, options) {
9539
- if (options?.ssr || !FARM_SERVER_ONLY_ENTRIES.has(id)) return null;
9540
- this.error(
9541
- `${id} is server-only and cannot be imported into client code${importer ? ` (imported by ${importer})` : ""}. Use it from an API route or another server module.`
9542
- );
9556
+ if (!FARM_SERVER_ONLY_ENTRIES.has(id)) return null;
9557
+ const importedBy = importer ? ` (imported by ${importer})` : "";
9558
+ if (!options?.ssr) {
9559
+ this.error(
9560
+ `${id} is server-only and cannot be imported into client code${importedBy}. Use it from an API route or another server module.`
9561
+ );
9562
+ }
9563
+ vercelOgInstalled || (vercelOgInstalled = isOptionalPeerInstalled(root, "@vercel/og"));
9564
+ if (!vercelOgInstalled) {
9565
+ this.error(
9566
+ `${id} needs @vercel/og, which is not installed${importedBy}. ${VERCEL_OG_INSTALL_HINT}`
9567
+ );
9568
+ }
9569
+ return null;
9543
9570
  }
9544
9571
  };
9545
9572
  }
@@ -10180,6 +10207,7 @@ function farmPlugin(options = {}, initialPluginManager) {
10180
10207
  }
10181
10208
  const apiServerBasePath = resolveFarmAPIServerBasePath(farmConfig.api);
10182
10209
  const serverConfig = resolveFarmServerConfig(farmConfig.server);
10210
+ globalThis.__FARM_IMAGE_CONFIG__ = getPublicFarmImageConfig(farmConfig.images);
10183
10211
  let imageHandler = null;
10184
10212
  if (farmConfig.images.provider !== "none") {
10185
10213
  const { createNodeImageFetcher, createNodeImageUrlValidator, createSharpImageTransformer } = await import("./image/sharp.mjs");
@@ -14158,7 +14186,7 @@ async function defineConfig(config = {}) {
14158
14186
  const tailwindVitePlugin = await loadTailwindVitePlugin();
14159
14187
  const appRoot = path17.resolve(config.root || process.cwd());
14160
14188
  if (config.extends?.length) {
14161
- const { config: layeredConfig } = await import("./layers-CJKSJGLN.mjs").then(
14189
+ const { config: layeredConfig } = await import("./layers-BRQF5ETU.mjs").then(
14162
14190
  ({ resolveFarmLayers }) => resolveFarmLayers(config, {
14163
14191
  root: appRoot,
14164
14192
  mode: process.env.NODE_ENV === "production" ? "production" : "development"
@@ -14167,6 +14195,7 @@ async function defineConfig(config = {}) {
14167
14195
  config = layeredConfig;
14168
14196
  }
14169
14197
  config.renderer = resolveFarmRenderer(config.renderer);
14198
+ config.images = resolveFarmImageProviderForRuntime(config.images, { root: appRoot, dev: true });
14170
14199
  const rendererVitePlugins = await loadFarmRendererVitePlugins(config.renderer, appRoot, {
14171
14200
  ssr: true
14172
14201
  });
@@ -14393,6 +14422,8 @@ export {
14393
14422
  FarmPluginOptionsError,
14394
14423
  farmPluginMayAffectRuntimePath,
14395
14424
  loadTailwindVitePlugin,
14425
+ SHARP_INSTALL_HINT,
14426
+ resolveFarmImageProviderForRuntime,
14396
14427
  generateFarmClientPluginEntryCode,
14397
14428
  resolveFarmClientCacheAdapterEntry,
14398
14429
  generateClientCachePersistenceCode,
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-ZMSZZXOR.mjs";
7
7
  import {
8
8
  APITypeGenerator
9
- } from "./chunk-3NM6SRI6.mjs";
9
+ } from "./chunk-F3VB7ONA.mjs";
10
10
  import {
11
11
  mergeRouteRenderingDirectiveConfig
12
12
  } from "./chunk-DAO7JGTS.mjs";
@@ -20,7 +20,7 @@ import {
20
20
  import {
21
21
  getFarmAppDirectories,
22
22
  getFarmSourceRoots
23
- } from "./chunk-IILNZK5G.mjs";
23
+ } from "./chunk-JHWOVJ3M.mjs";
24
24
  import {
25
25
  resolveFarmComponentExtensions
26
26
  } from "./chunk-DAATZTKJ.mjs";
@@ -1,5 +1,5 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});// package.json
2
- var version = "0.1.22";
2
+ var version = "0.1.23";
3
3
 
4
4
  // src/version.ts
5
5
  var FARM_VERSION = version;
@@ -7,6 +7,9 @@ import {
7
7
  import {
8
8
  _runWithFarmI18nRequest
9
9
  } from "./chunk-JNGIWIY6.mjs";
10
+ import {
11
+ explainMissingOptionalPeer
12
+ } from "./chunk-YOZYCI6Z.mjs";
10
13
  import {
11
14
  API_ROUTE_METHODS,
12
15
  getAllowedAPIRouteMethods,
@@ -226,7 +229,8 @@ var _APIRouteManager = class _APIRouteManager {
226
229
  }
227
230
  }
228
231
  }
229
- handleLoadError(message, error) {
232
+ handleLoadError(message, loadError) {
233
+ const error = explainMissingOptionalPeer(loadError, message.replace(/^Error loading /, ""));
230
234
  logger.error(`${message}: ${error}`);
231
235
  if (this.throwOnLoadError || error instanceof APIRouteConflictError || error instanceof AmbiguousRouteError || error instanceof NonTerminalCatchAllRouteError) {
232
236
  throw error;
@@ -18,13 +18,15 @@ var _module = require('module');
18
18
  var _path = require('path');
19
19
  var _esmodulelexer = require('es-module-lexer');
20
20
  var moduleLexerInitialized = false;
21
- var JSX_ROUTE_LOADERS = { ".jsx": "jsx", ".tsx": "tsx" };
22
- var esbuildTransformSync;
23
- function transformJSXRoute(content, loader, filePath) {
24
- _nullishCoalesce(esbuildTransformSync, () => ( (esbuildTransformSync = _module.createRequire.call(void 0, typeof __filename === "string" ? __filename : _chunkS3JO3N4Hcjs.define_import_meta_default.url)(
25
- "esbuild"
21
+ var JSX_ROUTE_LANGS = { ".jsx": "jsx", ".tsx": "tsx" };
22
+ var oxcTransformSync;
23
+ function transformJSXRoute(content, lang, filePath) {
24
+ _nullishCoalesce(oxcTransformSync, () => ( (oxcTransformSync = _module.createRequire.call(void 0, typeof __filename === "string" ? __filename : _chunkS3JO3N4Hcjs.define_import_meta_default.url)(
25
+ "rolldown/utils"
26
26
  ).transformSync)));
27
- return esbuildTransformSync(content, { loader, sourcefile: filePath }).code;
27
+ const result = oxcTransformSync(filePath, content, { lang, sourceType: "module" });
28
+ if (result.errors.length > 0) throw result.errors[0];
29
+ return result.code;
28
30
  }
29
31
  _chunkS3JO3N4Hcjs.__name.call(void 0, transformJSXRoute, "transformJSXRoute");
30
32
  var API_CLIENT_METHOD_SEGMENTS = /* @__PURE__ */ new Set([
@@ -121,8 +123,8 @@ var _APITypeGenerator = class _APITypeGenerator {
121
123
  moduleLexerInitialized = true;
122
124
  }
123
125
  const httpMethods = ["GET", "HEAD", "QUERY", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"];
124
- const loader = JSX_ROUTE_LOADERS[_path.extname.call(void 0, filePath)];
125
- const source = loader ? transformJSXRoute(content, loader, filePath) : content;
126
+ const lang = JSX_ROUTE_LANGS[_path.extname.call(void 0, filePath)];
127
+ const source = lang ? transformJSXRoute(content, lang, filePath) : content;
126
128
  const [, exports] = _esmodulelexer.parse.call(void 0, source);
127
129
  const valueExports = new Set(
128
130
  exports.filter((specifier) => !this.isTypeOnlyExportSpecifier(source, specifier.s)).map((specifier) => specifier.n)
@@ -3,10 +3,14 @@ import {
3
3
  loadFarmDocsPage,
4
4
  resolveFarmDocsContentDir,
5
5
  toFarmDocsMarkdownPage
6
- } from "./chunk-HSDL2AUR.mjs";
6
+ } from "./chunk-47H7VENP.mjs";
7
+ import {
8
+ docsEngine,
9
+ loadFarmDocsEngine
10
+ } from "./chunk-2VQKKQ6D.mjs";
7
11
  import {
8
12
  resolveDocsConfig
9
- } from "./chunk-SPSQFO3Z.mjs";
13
+ } from "./chunk-BDJNP7AQ.mjs";
10
14
  import {
11
15
  getFarmDocsAdapterConfigModule
12
16
  } from "./chunk-VVBO3QH7.mjs";
@@ -120,21 +124,6 @@ async function createFarmDocsAdapterHandler(docs, options) {
120
124
  __name(createFarmDocsAdapterHandler, "createFarmDocsAdapterHandler");
121
125
 
122
126
  // src/docs/api.ts
123
- import {
124
- buildDocsAgentDiscoverySpec,
125
- buildDocsConfigMap,
126
- buildDocsDiagnostics as buildFarmingDocsDiagnostics,
127
- buildDocsSitemapManifest,
128
- performDocsSearch,
129
- renderDocsAgentsDocument,
130
- renderDocsLlmsTxt,
131
- renderDocsMarkdownDocument,
132
- renderDocsRobotsTxt,
133
- renderDocsSitemapMarkdown,
134
- renderDocsSitemapXml,
135
- renderDocsSkillDocument
136
- } from "@farming-labs/docs";
137
- import { resolveApiReferenceOpenApiDiscovery } from "@farming-labs/docs/server";
138
127
  function isRecord(value) {
139
128
  return typeof value === "object" && value !== null && !Array.isArray(value);
140
129
  }
@@ -344,7 +333,7 @@ function getDocsDiscoveryOptions(context, request) {
344
333
  llms: getDocsLlmsOptions(context, request),
345
334
  sitemap: context.docs.config.sitemap ?? true,
346
335
  robots: context.docs.config.robots ?? true,
347
- openapi: resolveApiReferenceOpenApiDiscovery(context.docs.config.apiReference),
336
+ openapi: docsEngine().resolveApiReferenceOpenApiDiscovery(context.docs.config.apiReference),
348
337
  markdown: {
349
338
  acceptHeader: true,
350
339
  signatureAgentHeader: true
@@ -354,7 +343,7 @@ function getDocsDiscoveryOptions(context, request) {
354
343
  __name(getDocsDiscoveryOptions, "getDocsDiscoveryOptions");
355
344
  function buildSitemapManifest(context, request) {
356
345
  const origin = new URL(request.url).origin;
357
- return buildDocsSitemapManifest({
346
+ return docsEngine().buildDocsSitemapManifest({
358
347
  pages: getLoadedDocsPages(context).map(toDocsSitemapPage),
359
348
  entry: context.docs.entry,
360
349
  siteTitle: getDocsTitle(context.docs),
@@ -363,7 +352,7 @@ function buildSitemapManifest(context, request) {
363
352
  }
364
353
  __name(buildSitemapManifest, "buildSitemapManifest");
365
354
  function renderLlmsTxt(context, request, full) {
366
- const generated = renderDocsLlmsTxt(
355
+ const generated = docsEngine().renderDocsLlmsTxt(
367
356
  getLoadedDocsPages(context).map(toDocsLlmsPage),
368
357
  getDocsLlmsOptions(context, request)
369
358
  );
@@ -383,14 +372,14 @@ function renderSkillDocument(context, request) {
383
372
  "- Sitemap XML: /api/docs?format=sitemap-xml",
384
373
  "- Agent spec JSON: /api/docs/agent/spec"
385
374
  ].join("\n");
386
- return `${renderDocsSkillDocument(getDocsDiscoveryOptions(context, request)).trim()}
375
+ return `${docsEngine().renderDocsSkillDocument(getDocsDiscoveryOptions(context, request)).trim()}
387
376
 
388
377
  ${farmAliases}
389
378
  `;
390
379
  }
391
380
  __name(renderSkillDocument, "renderSkillDocument");
392
381
  function renderAgentsDocument(context, request) {
393
- return `${renderDocsAgentsDocument(getDocsDiscoveryOptions(context, request)).trim()}
382
+ return `${docsEngine().renderDocsAgentsDocument(getDocsDiscoveryOptions(context, request)).trim()}
394
383
  `;
395
384
  }
396
385
  __name(renderAgentsDocument, "renderAgentsDocument");
@@ -398,7 +387,7 @@ function buildAgentSpec(context, request) {
398
387
  const url = new URL(request.url);
399
388
  const origin = url.origin;
400
389
  const pages = discoverFarmDocsPages(context.contentDir, context.docs);
401
- const spec = buildDocsAgentDiscoverySpec(getDocsDiscoveryOptions(context, request));
390
+ const spec = docsEngine().buildDocsAgentDiscoverySpec(getDocsDiscoveryOptions(context, request));
402
391
  const title = getDocsTitle(context.docs);
403
392
  return {
404
393
  ...spec,
@@ -440,7 +429,7 @@ function buildAgentSpec(context, request) {
440
429
  __name(buildAgentSpec, "buildAgentSpec");
441
430
  function buildDiagnostics(context) {
442
431
  const pages = discoverFarmDocsPages(context.contentDir, context.docs);
443
- const diagnostics = buildFarmingDocsDiagnostics(context.docs.config, {
432
+ const diagnostics = docsEngine().buildDocsDiagnostics(context.docs.config, {
444
433
  entry: context.docs.entry,
445
434
  mcp: {
446
435
  enabled: false,
@@ -477,7 +466,7 @@ async function searchDocs(context, request, query) {
477
466
  const sourcePages = loadedPages.map(toDocsSourcePage);
478
467
  const sourcePageByUrl = new Map(sourcePages.map((page) => [page.url, page]));
479
468
  const resultLimit = isRecord(context.docs.config.search) && typeof context.docs.config.search.maxResults === "number" ? context.docs.config.search.maxResults : void 0;
480
- const results = await performDocsSearch({
469
+ const results = await docsEngine().performDocsSearch({
481
470
  pages: sourcePages,
482
471
  query,
483
472
  search: context.docs.config.search ?? true,
@@ -498,6 +487,7 @@ async function searchDocs(context, request, query) {
498
487
  }
499
488
  __name(searchDocs, "searchDocs");
500
489
  async function resolveAPIContext(options) {
490
+ await loadFarmDocsEngine();
501
491
  const runtimeConfig = globalThis.__FARM_DOCS_RUNTIME_CONFIG__;
502
492
  const root = options.rootDir || options.root || runtimeConfig?.root || process.cwd();
503
493
  const srcDir = options.srcDir || runtimeConfig?.srcDir || "src";
@@ -531,7 +521,7 @@ async function handleDocsAPIGet(request, context) {
531
521
  entry: context.docs.entry,
532
522
  contentDir: context.docs.contentDir || context.docs.config.contentDir || null,
533
523
  config: context.docs.config,
534
- map: buildDocsConfigMap(context.docs.config, {
524
+ map: docsEngine().buildDocsConfigMap(context.docs.config, {
535
525
  file: context.docs.configPath || "farm.config.ts"
536
526
  })
537
527
  });
@@ -548,7 +538,7 @@ async function handleDocsAPIGet(request, context) {
548
538
  return text(renderLlmsTxt(context, request, true), "text/plain; charset=utf-8");
549
539
  if (format === "sitemap-md") {
550
540
  return text(
551
- renderDocsSitemapMarkdown(buildSitemapManifest(context, request), {
541
+ docsEngine().renderDocsSitemapMarkdown(buildSitemapManifest(context, request), {
552
542
  includeDescriptions: true
553
543
  }),
554
544
  "text/markdown; charset=utf-8"
@@ -557,7 +547,7 @@ async function handleDocsAPIGet(request, context) {
557
547
  if (format === "sitemap-xml" || format === "sitemap") {
558
548
  const origin = new URL(request.url).origin;
559
549
  return text(
560
- renderDocsSitemapXml(buildSitemapManifest(context, request), {
550
+ docsEngine().renderDocsSitemapXml(buildSitemapManifest(context, request), {
561
551
  baseUrl: origin,
562
552
  includeLastmod: true
563
553
  }),
@@ -566,7 +556,7 @@ async function handleDocsAPIGet(request, context) {
566
556
  }
567
557
  if (format === "robots") {
568
558
  return text(
569
- renderDocsRobotsTxt({
559
+ docsEngine().renderDocsRobotsTxt({
570
560
  entry: context.docs.entry,
571
561
  sitemap: context.docs.config.sitemap ?? true,
572
562
  robots: context.docs.config.robots ?? true,
@@ -581,7 +571,7 @@ async function handleDocsAPIGet(request, context) {
581
571
  const page = loadFarmDocsPage(context.contentDir, context.docs, slug);
582
572
  if (!page) return text("Docs page not found\n", "text/plain; charset=utf-8", { status: 404 });
583
573
  return text(
584
- renderDocsMarkdownDocument(toFarmDocsMarkdownPage(page), {
574
+ docsEngine().renderDocsMarkdownDocument(toFarmDocsMarkdownPage(page), {
585
575
  origin: new URL(request.url).origin,
586
576
  llms: getDocsLlmsOptions(context, request),
587
577
  sitemap: context.docs.config.sitemap
@@ -0,0 +1,73 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-LPEX4YW6.mjs";
4
+
5
+ // src/optional-peer.ts
6
+ import { createRequire } from "module";
7
+ import path from "path";
8
+ function isMissingPackageError(error, packageName) {
9
+ let current = error;
10
+ for (let depth = 0; depth < 4; depth++) {
11
+ if (!current || typeof current !== "object") return false;
12
+ const { code, message, cause } = current;
13
+ if ((code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND") && typeof message === "string") {
14
+ return message.includes(`'${packageName}'`) || message.includes(`"${packageName}"`);
15
+ }
16
+ current = cause;
17
+ }
18
+ return false;
19
+ }
20
+ __name(isMissingPackageError, "isMissingPackageError");
21
+ function isOptionalPeerInstalled(root, packageName) {
22
+ const appRequire = createRequire(path.join(root, "package.json"));
23
+ const requires = [appRequire];
24
+ try {
25
+ requires.push(createRequire(appRequire.resolve("@farm.js/core")));
26
+ } catch {
27
+ }
28
+ return requires.some((parentRequire) => {
29
+ try {
30
+ parentRequire.resolve(`${packageName}/package.json`);
31
+ return true;
32
+ } catch (error) {
33
+ return error.code === "ERR_PACKAGE_PATH_NOT_EXPORTED";
34
+ }
35
+ });
36
+ }
37
+ __name(isOptionalPeerInstalled, "isOptionalPeerInstalled");
38
+ function formatOptionalPeerInstallHint(packageName, purpose, options = {}) {
39
+ return `Install "${packageName}" to ${purpose}: pnpm add ${options.dev ? "-D " : ""}${packageName}`;
40
+ }
41
+ __name(formatOptionalPeerInstallHint, "formatOptionalPeerInstallHint");
42
+ var VERCEL_OG_INSTALL_HINT = formatOptionalPeerInstallHint(
43
+ "@vercel/og",
44
+ "render OG and metadata images"
45
+ );
46
+ var APP_IMPORTED_OPTIONAL_PEERS = [
47
+ ["@vercel/og", VERCEL_OG_INSTALL_HINT]
48
+ ];
49
+ function explainMissingOptionalPeer(error, context) {
50
+ for (const [packageName, hint] of APP_IMPORTED_OPTIONAL_PEERS) {
51
+ if (isMissingPackageError(error, packageName)) {
52
+ return withOptionalPeerCause(
53
+ new Error(`${context} needs ${packageName}, which is not installed. ${hint}`),
54
+ error
55
+ );
56
+ }
57
+ }
58
+ return error;
59
+ }
60
+ __name(explainMissingOptionalPeer, "explainMissingOptionalPeer");
61
+ function withOptionalPeerCause(error, cause) {
62
+ return Object.assign(error, { cause });
63
+ }
64
+ __name(withOptionalPeerCause, "withOptionalPeerCause");
65
+
66
+ export {
67
+ isMissingPackageError,
68
+ isOptionalPeerInstalled,
69
+ formatOptionalPeerInstallHint,
70
+ VERCEL_OG_INSTALL_HINT,
71
+ explainMissingOptionalPeer,
72
+ withOptionalPeerCause
73
+ };
@@ -1,3 +1,8 @@
1
+ import {
2
+ VERCEL_OG_INSTALL_HINT,
3
+ isMissingPackageError,
4
+ withOptionalPeerCause
5
+ } from "./chunk-YOZYCI6Z.mjs";
1
6
  import {
2
7
  omitFarmResponseBody
3
8
  } from "./chunk-5WI2S4CO.mjs";
@@ -141,6 +146,20 @@ async function finalizeMetadataImageResponse(body, headers, options) {
141
146
  });
142
147
  }
143
148
  __name(finalizeMetadataImageResponse, "finalizeMetadataImageResponse");
149
+ async function loadVercelOg() {
150
+ try {
151
+ return await import("@vercel/og");
152
+ } catch (error) {
153
+ if (!isMissingPackageError(error, "@vercel/og")) throw error;
154
+ throw withOptionalPeerCause(
155
+ new Error(
156
+ `Rendering a metadata image from JSX needs @vercel/og, which is not installed. ${VERCEL_OG_INSTALL_HINT}`
157
+ ),
158
+ error
159
+ );
160
+ }
161
+ }
162
+ __name(loadVercelOg, "loadVercelOg");
144
163
  async function createFarmMetadataImageResponse(value, imageModule, options = {}) {
145
164
  const method = (options.method || "GET").toUpperCase();
146
165
  if (method !== "GET" && method !== "HEAD") {
@@ -152,7 +171,7 @@ async function createFarmMetadataImageResponse(value, imageModule, options = {})
152
171
  const cacheControl = resolveCacheControl(imageModule.revalidate);
153
172
  const explicitContentType = imageModule.contentType?.split(";", 1)[0]?.trim().toLowerCase();
154
173
  if (isReactElement(value) && explicitContentType !== "image/svg+xml") {
155
- const { ImageResponse } = await import("@vercel/og");
174
+ const { ImageResponse } = await loadVercelOg();
156
175
  const element = await prepareMetadataImageNode(value);
157
176
  const response = new ImageResponse(element, {
158
177
  width: imageModule.size?.width || 1200,
@@ -1,9 +1,11 @@
1
+ import {
2
+ bundleNodeModule
3
+ } from "./chunk-SFGWNC43.mjs";
1
4
  import {
2
5
  __name
3
6
  } from "./chunk-LPEX4YW6.mjs";
4
7
 
5
8
  // src/instrumentation.ts
6
- import { build } from "esbuild";
7
9
  import fs from "fs";
8
10
  import path from "path";
9
11
  import { pathToFileURL } from "url";
@@ -32,15 +34,12 @@ async function loadFarmInstrumentation(filePath, root) {
32
34
  const outputDirectory = path.join(root, ".farm", ".instrumentation-loader");
33
35
  const outputFile = path.join(outputDirectory, "instrumentation.mjs");
34
36
  await fs.promises.mkdir(outputDirectory, { recursive: true });
35
- await build({
36
- entryPoints: [filePath],
37
+ await bundleNodeModule({
38
+ root,
39
+ entry: filePath,
37
40
  outfile: outputFile,
38
- bundle: true,
39
- format: "esm",
40
- platform: "node",
41
41
  target: "node20",
42
- packages: "external",
43
- sourcemap: "inline"
42
+ externalPackages: true
44
43
  });
45
44
  const url = pathToFileURL(outputFile);
46
45
  url.searchParams.set("t", String(Date.now()));
@@ -12,12 +12,13 @@ import { OrmClient, SchemaDefinition, ModelDefinition, FieldBuilder, JsonValue,
12
12
  import { a as FarmDocsUserConfig, F as FarmDocsResolvedConfig } from './types-DFbjpjXX.mjs';
13
13
  import { FarmObservabilityUserConfig } from './observability.mjs';
14
14
  import * as vite from 'vite';
15
- import { ViteDevServer, UserConfig, Plugin, Connect } from 'vite';
15
+ import { ViteDevServer, UserConfig, Plugin as Plugin$1, Connect } from 'vite';
16
16
  import { k as FarmWorkflowsUserConfig, a as FarmServerConfig, F as FarmWorkflowsResolvedConfig, R as ResolvedFarmServerConfig } from './workflows-CR9ex-gz.mjs';
17
17
  import { FarmCronUserConfig, FarmCronResolvedConfig } from './cron.mjs';
18
18
  import { ResolvedFarmEnv, FarmEnvConfig } from './env.mjs';
19
19
  import { FarmServerActionsConfig, ResolvedFarmServerActionsConfig } from './server-action-security.mjs';
20
- import * as esbuild from 'esbuild';
20
+ import * as rolldown_utils from 'rolldown/utils';
21
+ import { Plugin } from 'rolldown';
21
22
  import { F as FarmImageConfig, R as ResolvedFarmImageConfig } from './image-config-Duob7wER.mjs';
22
23
  import { g as FarmI18nUserConfig, R as ResolvedFarmI18nConfig } from './types-Z0aotQ8w.mjs';
23
24
  import { FarmCacheUserConfig } from './cache.mjs';
@@ -947,7 +948,7 @@ declare function routeRulesToRedirects(routeRules: FarmRouteRules): RedirectConf
947
948
  declare function routeRulesToHeaders(routeRules: FarmRouteRules): HeaderConfig[];
948
949
  declare function routeRulesToNitroRouteRules(routeRules: FarmRouteRules): Record<string, any>;
949
950
 
950
- type EsbuildTransform = (typeof esbuild)["transform"];
951
+ type OxcTransform = (typeof rolldown_utils)["transform"];
951
952
  type FarmLayerEntry = string;
952
953
  interface ResolvedFarmLayer {
953
954
  /** The value used in `extends`. */
@@ -991,8 +992,8 @@ declare function getFarmAppDirectories(config: {
991
992
  }): string[];
992
993
  declare function getFarmLayerAliases(layers: readonly ResolvedFarmLayer[] | undefined): Record<string, string>;
993
994
  declare function createFarmConfigResolutionPlugin(options: {
994
- transform: EsbuildTransform;
995
- }): esbuild.Plugin;
995
+ transform: OxcTransform;
996
+ }): Plugin;
996
997
  declare function loadFarmConfigFile<TConfig = Record<string, any>>(configPath: string, options: {
997
998
  root: string;
998
999
  cacheRoot?: string;
@@ -1509,13 +1510,14 @@ interface FarmVitePluginOptions extends FarmConfig {
1509
1510
  /** @internal Modules selected by the compiled isolated-hydration ownership plan. */
1510
1511
  isolatedClientBoundaryModules?: ReadonlySet<string>;
1511
1512
  }
1512
- declare function farmI18nClientBridgePlugin(): Plugin;
1513
+ declare function farmI18nClientBridgePlugin(): Plugin$1;
1513
1514
  /**
1514
1515
  * Fail a browser graph that imports a server-only core entry, instead of
1515
1516
  * bundling its server runtime (for `@farm.js/core/og`, the `@vercel/og` wasm
1516
- * renderer) into client code.
1517
+ * renderer) into client code. A server graph that imports `@farm.js/core/og`
1518
+ * without the optional `@vercel/og` peer fails with the install command.
1517
1519
  */
1518
- declare function farmServerOnlyEntriesPlugin(): Plugin;
1520
+ declare function farmServerOnlyEntriesPlugin(): Plugin$1;
1519
1521
 
1520
1522
  /** Exported for tests: the request boundary all Farm dev middlewares share. */
1521
1523
  declare function withFarmRequestTracing(handler: Parameters<typeof _withAfterNodeMiddleware>[0], apiRuntime?: APIRequestRuntime, resolveTraceUrl?: (request: Connect.IncomingMessage) => URL): Connect.NextHandleFunction;
@@ -1548,7 +1550,7 @@ declare function transformIsolatedClientBoundaryModule(options: {
1548
1550
  * Farm leaves the module unaccepted.
1549
1551
  */
1550
1552
  declare function shouldEmitFarmClientRootHmr(renderer?: FarmRenderer): boolean;
1551
- declare function farmPlugin(options?: FarmVitePluginOptions, initialPluginManager?: PluginManager): Plugin;
1553
+ declare function farmPlugin(options?: FarmVitePluginOptions, initialPluginManager?: PluginManager): Plugin$1;
1552
1554
  declare function defineConfig(config?: FarmVitePluginOptions): Promise<UserConfig>;
1553
1555
 
1554
1556
  type MaybePromise$1<T> = T | Promise<T>;