@farm.js/core 0.1.25 → 0.1.27

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 (181) hide show
  1. package/dist/agent-runtime.d.mts +8 -10
  2. package/dist/agent-runtime.d.ts +8 -10
  3. package/dist/api/client.cjs +3 -3
  4. package/dist/api/client.d.mts +4 -5
  5. package/dist/api/client.d.ts +4 -5
  6. package/dist/api/client.mjs +2 -2
  7. package/dist/api/route-manager.cjs +6 -5
  8. package/dist/api/route-manager.d.mts +7 -9
  9. package/dist/api/route-manager.d.ts +7 -9
  10. package/dist/api/route-manager.mjs +5 -4
  11. package/dist/api/runtime.cjs +10 -4
  12. package/dist/api/runtime.d.mts +35 -3
  13. package/dist/api/runtime.d.ts +35 -3
  14. package/dist/api/runtime.mjs +9 -3
  15. package/dist/{api-client-Cx54IR5g.d.mts → api-client-BjMmY8OD.d.mts} +2 -3
  16. package/dist/{api-client-DykpaKcY.d.ts → api-client-CyFtZFJ4.d.ts} +2 -3
  17. package/dist/api.cjs +9 -8
  18. package/dist/api.d.mts +9 -11
  19. package/dist/api.d.ts +9 -11
  20. package/dist/api.mjs +9 -8
  21. package/dist/{app-ZuWrAMc_.d.mts → app-BfzZdjgX.d.mts} +3 -4
  22. package/dist/{app-BF-ctoxh.d.ts → app-CXK7Prrt.d.ts} +3 -4
  23. package/dist/app-markdown.cjs +12 -4
  24. package/dist/app-markdown.d.mts +9 -11
  25. package/dist/app-markdown.d.ts +9 -11
  26. package/dist/app-markdown.mjs +11 -3
  27. package/dist/{chunk-2BIJGZR3.mjs → chunk-3PTVHMLD.mjs} +1 -1
  28. package/dist/{chunk-XME4TCLB.mjs → chunk-4FHDV7VM.mjs} +2 -2
  29. package/dist/{chunk-KLSSO6YD.mjs → chunk-4UNKCNSL.mjs} +1 -1
  30. package/dist/chunk-5MKEDGLD.cjs +53 -0
  31. package/dist/{chunk-E3RDL2DA.cjs → chunk-DQMTHWPI.cjs} +61 -31
  32. package/dist/{chunk-TTVHACQV.cjs → chunk-FOT7LZEO.cjs} +1 -1
  33. package/dist/{chunk-2KI3CL3N.mjs → chunk-FPW4W3VW.mjs} +1 -1
  34. package/dist/{chunk-6K4SPQWL.cjs → chunk-HF5SIACK.cjs} +3 -3
  35. package/dist/{chunk-T2OPSH6S.mjs → chunk-HG237IEY.mjs} +12 -5
  36. package/dist/chunk-J63ZH5OQ.cjs +62 -0
  37. package/dist/{chunk-BD2U4ZL6.cjs → chunk-JQGDQO2I.cjs} +8 -8
  38. package/dist/{chunk-RR6UGYUT.mjs → chunk-JT25KHDI.mjs} +39 -9
  39. package/dist/{chunk-O5DVPF3R.cjs → chunk-KAERLFD3.cjs} +16 -11
  40. package/dist/{chunk-H7CJRJ4L.cjs → chunk-LAHZ7LZA.cjs} +16 -16
  41. package/dist/{chunk-XM4ZDVD7.mjs → chunk-MBFURXAC.mjs} +1 -1
  42. package/dist/{chunk-6VEHUKZ2.mjs → chunk-MM5D6VLP.mjs} +4 -20
  43. package/dist/chunk-MVL2RAJW.mjs +62 -0
  44. package/dist/{chunk-YA6LLTIJ.cjs → chunk-ND224OE2.cjs} +4 -20
  45. package/dist/{chunk-RYDW7GPR.cjs → chunk-NPFGGBM5.cjs} +13 -13
  46. package/dist/{chunk-VZWO3XVL.mjs → chunk-O2LV5XDG.mjs} +2 -2
  47. package/dist/chunk-O6XNAMBV.mjs +53 -0
  48. package/dist/{chunk-N2Z4ZFDE.mjs → chunk-OGHTEYXS.mjs} +22 -14
  49. package/dist/{chunk-U4MP7XTD.mjs → chunk-POXI72VV.mjs} +180 -16
  50. package/dist/{chunk-QGG336NI.mjs → chunk-Q4BHBO6V.mjs} +1 -1
  51. package/dist/{chunk-AXYTGLF3.cjs → chunk-QI7WQSMI.cjs} +4 -4
  52. package/dist/{chunk-WOI2HOGA.mjs → chunk-QQQNJS2E.mjs} +1 -1
  53. package/dist/{chunk-CFNOGDUS.cjs → chunk-TDWFCC2T.cjs} +2 -2
  54. package/dist/{chunk-R7LCG3BT.cjs → chunk-UNSKL6BI.cjs} +89 -81
  55. package/dist/{chunk-WJYCI56T.mjs → chunk-UWTQTZFN.mjs} +52 -33
  56. package/dist/{chunk-5YYJ6Q2L.mjs → chunk-WIVTGKLY.mjs} +7 -2
  57. package/dist/{chunk-65P6OGYN.cjs → chunk-WJKVTJJR.cjs} +12 -5
  58. package/dist/{chunk-OAVTUMJP.cjs → chunk-YXM74XOW.cjs} +9 -9
  59. package/dist/{chunk-QYMRIVG6.cjs → chunk-YZBV7733.cjs} +120 -101
  60. package/dist/{chunk-2ITKVAIF.cjs → chunk-ZSO5GWGD.cjs} +203 -39
  61. package/dist/{client-plugins-DPG0NeZN.d.mts → client-plugins-1GS4zubE.d.mts} +1940 -1677
  62. package/dist/{client-plugins-Fgni-_25.d.ts → client-plugins-B1Za6F5x.d.ts} +1940 -1677
  63. package/dist/client-plugins.d.mts +8 -10
  64. package/dist/client-plugins.d.ts +8 -10
  65. package/dist/client.cjs +4 -4
  66. package/dist/client.d.mts +10 -12
  67. package/dist/client.d.ts +10 -12
  68. package/dist/client.mjs +3 -3
  69. package/dist/config.d.mts +8 -10
  70. package/dist/config.d.ts +8 -10
  71. package/dist/{devtools-I7TBFOKD.mjs → devtools-6RN6KHTW.mjs} +8 -3
  72. package/dist/{devtools-6OA7FEF6.cjs → devtools-CQJ3H6MX.cjs} +9 -4
  73. package/dist/docs.cjs +11 -6
  74. package/dist/docs.mjs +10 -5
  75. package/dist/{endpoint-1zA994xL.d.ts → endpoint-CA-TNX60.d.ts} +1 -1
  76. package/dist/{endpoint-DAc96i93.d.mts → endpoint-CCHFqyTE.d.mts} +1 -1
  77. package/dist/index.cjs +26 -21
  78. package/dist/index.d.mts +16 -18
  79. package/dist/index.d.ts +16 -18
  80. package/dist/index.mjs +26 -21
  81. package/dist/{integration-api-BbaiokCC.d.ts → integration-api-0y4FXJpC.d.mts} +128 -1
  82. package/dist/{integration-api-BbaiokCC.d.mts → integration-api-BPJo5oXb.d.ts} +128 -1
  83. package/dist/integrations.d.mts +8 -10
  84. package/dist/integrations.d.ts +8 -10
  85. package/dist/internal/app-markdown-runtime.cjs +11 -3
  86. package/dist/internal/app-markdown-runtime.d.mts +9 -10
  87. package/dist/internal/app-markdown-runtime.d.ts +9 -10
  88. package/dist/internal/app-markdown-runtime.mjs +10 -2
  89. package/dist/internal/build-runtime.cjs +19 -17
  90. package/dist/internal/build-runtime.d.mts +10 -12
  91. package/dist/internal/build-runtime.d.ts +10 -12
  92. package/dist/internal/build-runtime.mjs +18 -16
  93. package/dist/internal/cli-runtime.cjs +9 -5
  94. package/dist/internal/cli-runtime.mjs +8 -4
  95. package/dist/internal/client-error-overlay.cjs +4 -4
  96. package/dist/internal/client-error-overlay.mjs +1 -1
  97. package/dist/internal/compression-runtime.d.mts +8 -10
  98. package/dist/internal/compression-runtime.d.ts +8 -10
  99. package/dist/internal/config-runtime.cjs +9 -4
  100. package/dist/internal/config-runtime.d.mts +9 -11
  101. package/dist/internal/config-runtime.d.ts +9 -11
  102. package/dist/internal/config-runtime.mjs +8 -3
  103. package/dist/internal/infra-analytics-runtime.cjs +4 -3
  104. package/dist/internal/infra-analytics-runtime.mjs +2 -1
  105. package/dist/internal/product-telemetry-runtime.cjs +2 -2
  106. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  107. package/dist/internal/production-runtime.cjs +8 -5
  108. package/dist/internal/production-runtime.d.mts +16 -16
  109. package/dist/internal/production-runtime.d.ts +16 -16
  110. package/dist/internal/production-runtime.mjs +7 -4
  111. package/dist/markdown.cjs +10 -2
  112. package/dist/markdown.d.mts +35 -153
  113. package/dist/markdown.d.ts +35 -153
  114. package/dist/markdown.mjs +9 -1
  115. package/dist/{metadata-CDnRHKVq.d.ts → metadata-7LKgQEWF.d.ts} +1 -1
  116. package/dist/{metadata-D0EF7esB.d.mts → metadata-B9mCxKgp.d.mts} +1 -1
  117. package/dist/middleware.d.mts +9 -11
  118. package/dist/middleware.d.ts +9 -11
  119. package/dist/navigation.d.mts +10 -12
  120. package/dist/navigation.d.ts +10 -12
  121. package/dist/{nitro-ZKLGOTVY.mjs → nitro-NAKCRVHX.mjs} +4 -3
  122. package/dist/{nitro-KQDU7CFE.cjs → nitro-VYDZGYFY.cjs} +4 -3
  123. package/dist/observability-BupkiN0m.d.mts +447 -0
  124. package/dist/observability-BupkiN0m.d.ts +447 -0
  125. package/dist/observability.d.mts +2 -417
  126. package/dist/observability.d.ts +2 -417
  127. package/dist/plugin.cjs +14 -12
  128. package/dist/plugin.d.mts +9 -11
  129. package/dist/plugin.d.ts +9 -11
  130. package/dist/plugin.mjs +13 -11
  131. package/dist/{production-runtime-DpCt0opU.d.ts → production-runtime-B3xnY6fI.d.ts} +1 -1
  132. package/dist/{production-runtime-x3W4wVqx.d.mts → production-runtime-DramhI0c.d.mts} +1 -1
  133. package/dist/{render-plan-D5oFRVBV.d.ts → render-plan-CpW32tOL.d.ts} +1 -1
  134. package/dist/{render-plan-tazUJalK.d.mts → render-plan-CtQB-zHS.d.mts} +1 -1
  135. package/dist/renderer-client.d.mts +6 -8
  136. package/dist/renderer-client.d.ts +6 -8
  137. package/dist/{request-CzZX0Aew.d.ts → request-BVGGeQv4.d.ts} +1 -1
  138. package/dist/{request-CXmQy5ks.d.mts → request-DlLVBKe3.d.mts} +1 -1
  139. package/dist/request.d.mts +9 -11
  140. package/dist/request.d.ts +9 -11
  141. package/dist/{route-rendering-Dw3C362T.d.ts → route-rendering-BdEldajn.d.ts} +1 -1
  142. package/dist/{route-rendering-B-qpe32B.d.mts → route-rendering-DChYLNdh.d.mts} +1 -1
  143. package/dist/{router-CLl3xHwl.d.ts → router-D0Az-1Nu.d.ts} +1 -1
  144. package/dist/{router-CafM2jlw.d.mts → router-D5htHn_M.d.mts} +1 -1
  145. package/dist/routes.d.mts +6 -8
  146. package/dist/routes.d.ts +6 -8
  147. package/dist/server-fn-client.d.mts +3 -4
  148. package/dist/server-fn-client.d.ts +3 -4
  149. package/dist/server-fn.d.mts +1 -1
  150. package/dist/server-fn.d.ts +1 -1
  151. package/dist/server-plugins.d.mts +8 -10
  152. package/dist/server-plugins.d.ts +8 -10
  153. package/dist/server-query-client.d.mts +1 -1
  154. package/dist/server-query-client.d.ts +1 -1
  155. package/dist/server-query.d.mts +1 -1
  156. package/dist/server-query.d.ts +1 -1
  157. package/dist/server.cjs +292 -141
  158. package/dist/server.d.mts +13 -15
  159. package/dist/server.d.ts +13 -15
  160. package/dist/server.mjs +278 -127
  161. package/dist/{spa-router-6sJfsMlQ.d.mts → spa-router-DVfSJZ5o.d.mts} +2 -2
  162. package/dist/{spa-router-DePr2aZ6.d.ts → spa-router-DmwP_7QL.d.ts} +2 -2
  163. package/dist/testing.cjs +6 -5
  164. package/dist/testing.d.mts +7 -9
  165. package/dist/testing.d.ts +7 -9
  166. package/dist/testing.mjs +5 -4
  167. package/dist/{utils-BPHr-1mP.d.mts → utils-B_Rmr0-n.d.mts} +1 -1
  168. package/dist/{utils-BBKC3cf3.d.ts → utils-Dv0OuLtF.d.ts} +1 -1
  169. package/dist/version.cjs +2 -2
  170. package/dist/version.mjs +1 -1
  171. package/dist/vite.cjs +14 -12
  172. package/dist/vite.d.mts +8 -10
  173. package/dist/vite.d.ts +8 -10
  174. package/dist/vite.mjs +13 -11
  175. package/package.json +1 -1
  176. package/dist/route-B0XrsrFk.d.mts +0 -128
  177. package/dist/route-DOEpbyWZ.d.ts +0 -128
  178. package/dist/{chunk-GDUYXFIS.mjs → chunk-6EG7U4NF.mjs} +3 -3
  179. package/dist/{chunk-YAOX43YI.cjs → chunk-C7OUJ6JI.cjs} +2 -2
  180. package/dist/{chunk-IXTFU4PL.cjs → chunk-NL3ZSMZB.cjs} +2 -2
  181. package/dist/{chunk-L6V3P73N.mjs → chunk-UOXGA6TO.mjs} +4 -4
package/dist/server.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createFarmInfraAnalyticsPlugin
3
- } from "./chunk-6VEHUKZ2.mjs";
3
+ } from "./chunk-MM5D6VLP.mjs";
4
4
  import {
5
5
  FarmEnvironmentError,
6
6
  createClientOnlyFn,
@@ -16,9 +16,10 @@ import {
16
16
  loadFarmDocsEngine
17
17
  } from "./chunk-2VQKKQ6D.mjs";
18
18
  import {
19
+ isResolvedFarmConfig,
19
20
  loadConfig,
20
21
  resolveConfig
21
- } from "./chunk-5YYJ6Q2L.mjs";
22
+ } from "./chunk-WIVTGKLY.mjs";
22
23
  import "./chunk-XZNTNMHT.mjs";
23
24
  import {
24
25
  loadFarmInstrumentation,
@@ -45,14 +46,14 @@ import {
45
46
  loadTailwindVitePlugin,
46
47
  mergeFarmViteConfig,
47
48
  resolveFarmImageProviderForRuntime
48
- } from "./chunk-N2Z4ZFDE.mjs";
49
+ } from "./chunk-OGHTEYXS.mjs";
49
50
  import "./chunk-VVJCWBIE.mjs";
50
51
  import {
51
52
  readSchemaTables
52
53
  } from "./chunk-HALDNTIV.mjs";
53
54
  import "./chunk-ZMSZZXOR.mjs";
54
55
  import "./chunk-F3VB7ONA.mjs";
55
- import "./chunk-T2OPSH6S.mjs";
56
+ import "./chunk-HG237IEY.mjs";
56
57
  import "./chunk-DAO7JGTS.mjs";
57
58
  import "./chunk-BOYNDCZL.mjs";
58
59
  import "./chunk-YQVSHTMR.mjs";
@@ -86,7 +87,7 @@ import {
86
87
  loadFarmRendererVitePlugins,
87
88
  resolveFarmRenderer
88
89
  } from "./chunk-DAATZTKJ.mjs";
89
- import "./chunk-RR6UGYUT.mjs";
90
+ import "./chunk-JT25KHDI.mjs";
90
91
  import "./chunk-G2KY33I6.mjs";
91
92
  import "./chunk-YHOCRI4H.mjs";
92
93
  import {
@@ -102,11 +103,14 @@ import {
102
103
  sanitizeServerActionError,
103
104
  validateServerActionRequest
104
105
  } from "./chunk-QCFFHV5H.mjs";
105
- import "./chunk-4OOBRCJX.mjs";
106
- import "./chunk-2BIJGZR3.mjs";
107
- import "./chunk-XM4ZDVD7.mjs";
106
+ import {
107
+ setEnv
108
+ } from "./chunk-4OOBRCJX.mjs";
109
+ import "./chunk-3PTVHMLD.mjs";
110
+ import "./chunk-MBFURXAC.mjs";
108
111
  import "./chunk-FA2W42OV.mjs";
109
- import "./chunk-U4MP7XTD.mjs";
112
+ import "./chunk-POXI72VV.mjs";
113
+ import "./chunk-MVL2RAJW.mjs";
110
114
  import "./chunk-SFGWNC43.mjs";
111
115
  import "./chunk-3ATMYLLJ.mjs";
112
116
  import "./chunk-2UC36WAC.mjs";
@@ -154,17 +158,18 @@ import {
154
158
  _withAfterNodeMiddleware,
155
159
  after
156
160
  } from "./chunk-IOEH4VWN.mjs";
157
- import "./chunk-QGG336NI.mjs";
161
+ import "./chunk-Q4BHBO6V.mjs";
158
162
  import "./chunk-YOYF2E4U.mjs";
159
163
  import "./chunk-CU625VAY.mjs";
160
164
  import "./chunk-JNGIWIY6.mjs";
161
165
  import "./chunk-FV45CKBC.mjs";
162
166
  import "./chunk-YOZYCI6Z.mjs";
163
- import "./chunk-GDUYXFIS.mjs";
167
+ import "./chunk-6EG7U4NF.mjs";
164
168
  import "./chunk-SYGGPS4A.mjs";
165
169
  import "./chunk-W3B4PKAW.mjs";
166
- import "./chunk-I6XDAKWQ.mjs";
167
170
  import "./chunk-5WI2S4CO.mjs";
171
+ import "./chunk-O6XNAMBV.mjs";
172
+ import "./chunk-I6XDAKWQ.mjs";
168
173
  import "./chunk-EA5K5BKU.mjs";
169
174
  import "./chunk-2J7W2WND.mjs";
170
175
  import "./chunk-XF7Q24PF.mjs";
@@ -196,13 +201,13 @@ import {
196
201
  } from "./chunk-Z2RZJZIZ.mjs";
197
202
  import {
198
203
  FARM_VERSION
199
- } from "./chunk-WOI2HOGA.mjs";
204
+ } from "./chunk-QQQNJS2E.mjs";
200
205
  import "./chunk-54UPOYFS.mjs";
201
206
  import "./chunk-WNSDDRNU.mjs";
202
207
  import "./chunk-JPLUGGRV.mjs";
203
208
  import "./chunk-G4MWPDSE.mjs";
204
- import "./chunk-O7BH5O46.mjs";
205
209
  import "./chunk-EMLAPBEM.mjs";
210
+ import "./chunk-O7BH5O46.mjs";
206
211
  import "./chunk-7LTCDQRS.mjs";
207
212
  import "./chunk-IXUY2F5U.mjs";
208
213
  import "./chunk-CEYUWDWA.mjs";
@@ -260,14 +265,41 @@ import {
260
265
  __name
261
266
  } from "./chunk-LPEX4YW6.mjs";
262
267
 
263
- // src/server/create-server.ts
264
- import { createServer as createViteServer } from "vite";
265
- import fs from "fs";
266
- import path from "path";
267
- var DEFAULT_FARM_DEV_SERVER_PORT = 3e3;
268
+ // src/server/dev-lifecycle.ts
269
+ import {
270
+ createServer,
271
+ resolveConfig as resolveConfig2
272
+ } from "vite";
268
273
  var VITE_CLOSE_TIMEOUT_MS = 1e4;
269
- async function drainVitePendingRequests(server) {
270
- const registries = Object.values(server.environments ?? {}).map(
274
+ async function createViteDevServer(config, capture) {
275
+ const resolved = await resolveConfig2(
276
+ config,
277
+ "serve",
278
+ void 0,
279
+ void 0,
280
+ false,
281
+ void 0,
282
+ (plugins) => {
283
+ plugins.unshift({
284
+ name: "farm:dev-construction",
285
+ configureServer: { order: "pre", handler: capture }
286
+ });
287
+ }
288
+ );
289
+ return createServer(resolved);
290
+ }
291
+ __name(createViteDevServer, "createViteDevServer");
292
+ async function drainVitePendingWork(server) {
293
+ const environments = Object.values(server.environments ?? {});
294
+ await Promise.allSettled(
295
+ environments.map(async ({ depsOptimizer }) => {
296
+ await depsOptimizer?.scanProcessing;
297
+ await Promise.allSettled(
298
+ Object.values(depsOptimizer?.metadata.discovered ?? {}).map((dep) => dep.processing)
299
+ );
300
+ })
301
+ );
302
+ const registries = environments.map(
271
303
  (environment) => environment._pendingRequests
272
304
  );
273
305
  const pending = /* @__PURE__ */ __name(() => registries.flatMap((registry) => registry ? [...registry.values()] : []), "pending");
@@ -275,7 +307,123 @@ async function drainVitePendingRequests(server) {
275
307
  await Promise.allSettled(requests.map(({ request }) => request));
276
308
  }
277
309
  }
278
- __name(drainVitePendingRequests, "drainVitePendingRequests");
310
+ __name(drainVitePendingWork, "drainVitePendingWork");
311
+ async function closeViteDevServer(server, closeViteServer) {
312
+ const closingHttpServer = server.httpServer;
313
+ const closingWatcher = server.watcher;
314
+ const closingWebSocket = server.ws;
315
+ let timer;
316
+ const timedOut = new Promise((resolve) => {
317
+ timer = setTimeout(() => resolve("timeout"), VITE_CLOSE_TIMEOUT_MS);
318
+ timer.unref?.();
319
+ });
320
+ try {
321
+ const outcome = await Promise.race([
322
+ (async () => {
323
+ await drainVitePendingWork(server);
324
+ await closeViteServer();
325
+ return "closed";
326
+ })(),
327
+ timedOut
328
+ ]);
329
+ if (outcome === "timeout") {
330
+ logger.error(
331
+ `Vite server close did not settle within ${VITE_CLOSE_TIMEOUT_MS}ms; continuing shutdown without it (https://github.com/farming-labs/farm.js/issues/1263)`
332
+ );
333
+ await Promise.allSettled([
334
+ new Promise((resolve) => {
335
+ if (!closingHttpServer || !closingHttpServer.listening) return resolve();
336
+ closingHttpServer.close(() => resolve());
337
+ }),
338
+ Promise.resolve(closingWatcher?.close?.()).catch(() => {
339
+ }),
340
+ Promise.resolve(closingWebSocket?.close?.()).catch(() => {
341
+ })
342
+ ]);
343
+ }
344
+ } finally {
345
+ if (timer) clearTimeout(timer);
346
+ }
347
+ }
348
+ __name(closeViteDevServer, "closeViteDevServer");
349
+ function createFarmDevLifecyclePlugin(pluginManager, instrumentation) {
350
+ let runtimeServer;
351
+ const pendingRestarts = /* @__PURE__ */ new Set();
352
+ const viteClosers = /* @__PURE__ */ new WeakMap();
353
+ let shutdownPromise;
354
+ const shutdownFarmDevRuntime = /* @__PURE__ */ __name((server) => {
355
+ shutdownPromise ?? (shutdownPromise = (async () => {
356
+ await Promise.allSettled(pendingRestarts);
357
+ const closeViteServer = viteClosers.get(server.environments);
358
+ const failures = [];
359
+ const step = /* @__PURE__ */ __name(async (label, run) => {
360
+ try {
361
+ await run();
362
+ } catch (error) {
363
+ failures.push({ label, error });
364
+ }
365
+ }, "step");
366
+ await step("Vite server close", () => closeViteDevServer(server, closeViteServer));
367
+ await step("Plugin runtime shutdown", () => pluginManager.closeRuntime("dev-server-closed"));
368
+ await step("Instrumentation shutdown", () => instrumentation.shutdown());
369
+ if (failures.length === 1) throw failures[0].error;
370
+ if (failures.length > 1) {
371
+ throw new FarmRuntimeShutdownError(
372
+ `Dev server shutdown failed during ${failures.map(({ label }) => label).join(", ")}`,
373
+ failures.map(({ error }) => error)
374
+ );
375
+ }
376
+ })());
377
+ return shutdownPromise;
378
+ }, "shutdownFarmDevRuntime");
379
+ return {
380
+ name: "farm:dev-lifecycle",
381
+ configureServer: {
382
+ order: "post",
383
+ handler(server) {
384
+ return () => {
385
+ runtimeServer ?? (runtimeServer = server);
386
+ const owner = runtimeServer;
387
+ viteClosers.set(server.environments, server.close.bind(server));
388
+ server.close = () => shutdownFarmDevRuntime(owner);
389
+ const restartViteServer = server.restart.bind(server);
390
+ server.restart = async (forceOptimize) => {
391
+ if (shutdownPromise) {
392
+ throw new Error("Cannot restart the Farm dev server during or after shutdown");
393
+ }
394
+ const restart = restartViteServer(forceOptimize);
395
+ pendingRestarts.add(restart);
396
+ try {
397
+ await restart;
398
+ } finally {
399
+ pendingRestarts.delete(restart);
400
+ }
401
+ };
402
+ const httpServer = server.httpServer;
403
+ httpServer?.once("close", () => {
404
+ const closeIfCurrent = /* @__PURE__ */ __name(() => {
405
+ if (owner.httpServer !== httpServer) return;
406
+ shutdownFarmDevRuntime(owner).catch((error) => {
407
+ logger.warn(`Dev server shutdown failed: ${error}`);
408
+ });
409
+ }, "closeIfCurrent");
410
+ if (pendingRestarts.size > 0) {
411
+ void Promise.allSettled(pendingRestarts).then(closeIfCurrent);
412
+ } else {
413
+ closeIfCurrent();
414
+ }
415
+ });
416
+ };
417
+ }
418
+ }
419
+ };
420
+ }
421
+ __name(createFarmDevLifecyclePlugin, "createFarmDevLifecyclePlugin");
422
+
423
+ // src/server/create-server.ts
424
+ import fs from "fs";
425
+ import path from "path";
426
+ var DEFAULT_FARM_DEV_SERVER_PORT = 3e3;
279
427
  function createBrandingPlugin() {
280
428
  let serverStarted = false;
281
429
  let startTime = Date.now();
@@ -354,19 +502,66 @@ function withPortFlag(vite, port) {
354
502
  return port === void 0 ? vite : { ...vite, server: { ...vite?.server, port } };
355
503
  }
356
504
  __name(withPortFlag, "withPortFlag");
357
- async function createServer(config = {}, options = {}) {
505
+ function inlineEnvScope(scope) {
506
+ return Object.fromEntries(
507
+ Object.entries(scope || {}).map(([key, value]) => [
508
+ key,
509
+ typeof value === "function" || value && typeof value === "object" && "parse" in value && typeof value.parse === "function" ? value : () => value
510
+ ])
511
+ );
512
+ }
513
+ __name(inlineEnvScope, "inlineEnvScope");
514
+ async function resolveInlineConfig(config, mode) {
515
+ if (isResolvedFarmConfig(config)) {
516
+ setEnv(config.env);
517
+ return { ...config };
518
+ }
519
+ const docs = config.docs;
520
+ const resolvedDocs = docs && typeof docs === "object" && "enabled" in docs && "entry" in docs && "config" in docs ? docs : void 0;
521
+ const i18n = config.i18n;
522
+ const resolvedI18n = i18n && "enabled" in i18n ? i18n : void 0;
523
+ const auth = config.auth;
524
+ const resolvedAuth = auth && typeof auth === "object" && typeof auth.emailAndPassword === "object" && "enabled" in auth.emailAndPassword ? auth : void 0;
525
+ const resolved = await resolveConfig(
526
+ {
527
+ ...config,
528
+ ...resolvedDocs ? { docs: false } : {},
529
+ ...resolvedI18n ? { i18n: false } : {},
530
+ ...resolvedAuth ? { auth: false } : {},
531
+ ...config.layers ? { extends: [] } : {},
532
+ // FarmConfig also accepts literal runtime env values. Adapt only inline
533
+ // input; file/layer config keeps the normal parser validation contract.
534
+ env: config.env && {
535
+ server: inlineEnvScope(config.env.server),
536
+ public: inlineEnvScope(config.env.public)
537
+ }
538
+ },
539
+ mode
540
+ );
541
+ if (resolvedDocs) resolved.docs = resolvedDocs;
542
+ if (resolvedI18n) resolved.i18n = resolvedI18n;
543
+ if (resolvedAuth) resolved.auth = resolvedAuth;
544
+ if (config.layers) {
545
+ resolved.extends = config.extends || [];
546
+ resolved.layers = [...config.layers];
547
+ }
548
+ return resolved;
549
+ }
550
+ __name(resolveInlineConfig, "resolveInlineConfig");
551
+ async function createServer2(config = {}, options = {}) {
358
552
  let pluginManager = null;
359
553
  let instrumentation = null;
554
+ let server;
555
+ let pendingViteServer;
360
556
  try {
361
557
  const root = config.root || process.cwd();
362
558
  const mode = process.env.NODE_ENV === "production" ? "production" : "development";
363
559
  const userConfig = await loadConfig(root, void 0, mode);
364
- const resolvedConfig = userConfig ? await resolveConfig(userConfig, mode) : null;
365
- const instrumentationConfig = resolvedConfig || config;
366
- const instrumentationRoot = instrumentationConfig.root || root;
560
+ const resolvedConfig = userConfig ? await resolveConfig(userConfig, mode) : await resolveInlineConfig(config, mode);
561
+ const instrumentationRoot = resolvedConfig.root;
367
562
  const instrumentationFile = resolveFarmInstrumentationFile(
368
563
  instrumentationRoot,
369
- instrumentationConfig.srcDir || "src"
564
+ resolvedConfig.srcDir
370
565
  );
371
566
  const instrumentationModule = await loadFarmInstrumentation(
372
567
  instrumentationFile,
@@ -379,31 +574,27 @@ async function createServer(config = {}, options = {}) {
379
574
  });
380
575
  await instrumentation.start();
381
576
  pluginManager = new PluginManager({
382
- config: resolvedConfig || config,
577
+ config: resolvedConfig,
383
578
  isDev: mode === "development",
384
579
  isProd: mode === "production"
385
580
  });
386
- if (resolvedConfig) {
387
- const redirects = await resolvedConfig.redirects();
388
- const headers = await resolvedConfig.headers();
389
- const rewrites = await resolvedConfig.rewrites();
390
- if (redirects.length > 0) {
391
- pluginManager.addPlugin(createRedirectsPlugin(redirects, { i18n: resolvedConfig.i18n }));
392
- }
393
- if (headers.length > 0) {
394
- pluginManager.addPlugin(createHeadersPlugin(headers, { i18n: resolvedConfig.i18n }));
395
- }
396
- if (rewrites.length > 0) {
397
- pluginManager.addPlugin(createRewritesPlugin(rewrites, { i18n: resolvedConfig.i18n }));
398
- }
399
- if (resolvedConfig.compress && mode === "production") {
400
- pluginManager.addPlugin(createCompressionPlugin());
401
- }
402
- if (resolvedConfig.plugins) {
403
- pluginManager.addPlugins(resolvedConfig.plugins);
404
- }
581
+ const redirects = await resolvedConfig.redirects();
582
+ const headers = await resolvedConfig.headers();
583
+ const rewrites = await resolvedConfig.rewrites();
584
+ if (redirects.length > 0) {
585
+ pluginManager.addPlugin(createRedirectsPlugin(redirects, { i18n: resolvedConfig.i18n }));
586
+ }
587
+ if (headers.length > 0) {
588
+ pluginManager.addPlugin(createHeadersPlugin(headers, { i18n: resolvedConfig.i18n }));
589
+ }
590
+ if (rewrites.length > 0) {
591
+ pluginManager.addPlugin(createRewritesPlugin(rewrites, { i18n: resolvedConfig.i18n }));
592
+ }
593
+ if (resolvedConfig.compress && mode === "production") {
594
+ pluginManager.addPlugin(createCompressionPlugin());
405
595
  }
406
- const infraAnalytics = (resolvedConfig || config).analytics !== false ? createFarmInfraAnalyticsPlugin() : null;
596
+ pluginManager.addPlugins(resolvedConfig.plugins);
597
+ const infraAnalytics = resolvedConfig.analytics !== false ? createFarmInfraAnalyticsPlugin() : null;
407
598
  if (infraAnalytics) pluginManager.addPlugin(infraAnalytics);
408
599
  if (mode === "development") {
409
600
  const hasLogger = pluginManager.getPlugins().some((p) => p.name === "farm:logger");
@@ -412,7 +603,7 @@ async function createServer(config = {}, options = {}) {
412
603
  }
413
604
  }
414
605
  await pluginManager.runHookParallel("init");
415
- let finalConfig = resolvedConfig || config;
606
+ let finalConfig = resolvedConfig;
416
607
  finalConfig = await pluginManager.runHookSerial("config", finalConfig);
417
608
  finalConfig.renderer = resolveFarmRenderer(finalConfig.renderer);
418
609
  const projectRoot = finalConfig.root || process.cwd();
@@ -435,7 +626,7 @@ async function createServer(config = {}, options = {}) {
435
626
  } else {
436
627
  tailwindVitePlugin = await loadTailwindVitePlugin();
437
628
  }
438
- const server = await createViteServer(
629
+ server = await createViteDevServer(
439
630
  mergeFarmViteConfig(
440
631
  {
441
632
  root: projectRoot,
@@ -449,7 +640,8 @@ async function createServer(config = {}, options = {}) {
449
640
  farmServerOnlyEntriesPlugin(),
450
641
  farmPlugin(finalConfig, pluginManager),
451
642
  farmEnvironmentFunctionsPlugin(),
452
- createBrandingPlugin()
643
+ createBrandingPlugin(),
644
+ createFarmDevLifecyclePlugin(pluginManager, instrumentation)
453
645
  ],
454
646
  server: {
455
647
  middlewareMode: false,
@@ -506,78 +698,15 @@ async function createServer(config = {}, options = {}) {
506
698
  }
507
699
  },
508
700
  withPortFlag(finalConfig.vite, options.port)
509
- )
701
+ ),
702
+ (candidate) => {
703
+ pendingViteServer = candidate;
704
+ }
510
705
  );
706
+ pendingViteServer = void 0;
511
707
  server.__farmPluginManager = pluginManager;
512
708
  server.__farmResolvedConfig = resolvedConfig;
513
709
  server.__farmInstrumentation = instrumentation;
514
- const closeViteServer = server.close.bind(server);
515
- let shutdownPromise;
516
- const shutdownFarmDevRuntime = /* @__PURE__ */ __name(() => {
517
- shutdownPromise ?? (shutdownPromise = (async () => {
518
- const failures = [];
519
- const step = /* @__PURE__ */ __name(async (label, run) => {
520
- try {
521
- await run();
522
- } catch (error) {
523
- failures.push({ label, error });
524
- }
525
- }, "step");
526
- await step("Vite server close", async () => {
527
- let timer;
528
- const timedOut = new Promise((resolve) => {
529
- timer = setTimeout(() => resolve("timeout"), VITE_CLOSE_TIMEOUT_MS);
530
- timer.unref?.();
531
- });
532
- try {
533
- const outcome = await Promise.race([
534
- (async () => {
535
- await drainVitePendingRequests(server);
536
- await closeViteServer();
537
- return "closed";
538
- })(),
539
- timedOut
540
- ]);
541
- if (outcome === "timeout") {
542
- logger.error(
543
- `Vite server close did not settle within ${VITE_CLOSE_TIMEOUT_MS}ms; continuing shutdown without it (https://github.com/farming-labs/farm.js/issues/1263)`
544
- );
545
- await Promise.allSettled([
546
- new Promise((resolve) => {
547
- if (!server.httpServer || !server.httpServer.listening) return resolve();
548
- server.httpServer.close(() => resolve());
549
- }),
550
- Promise.resolve(server.watcher?.close?.()).catch(() => {
551
- }),
552
- Promise.resolve(server.ws?.close?.()).catch(() => {
553
- })
554
- ]);
555
- }
556
- } finally {
557
- if (timer) clearTimeout(timer);
558
- }
559
- });
560
- await step(
561
- "Plugin runtime shutdown",
562
- () => pluginManager?.closeRuntime("dev-server-closed")
563
- );
564
- await step("Instrumentation shutdown", () => instrumentation?.shutdown());
565
- if (failures.length === 1) throw failures[0].error;
566
- if (failures.length > 1) {
567
- throw new FarmRuntimeShutdownError(
568
- `Dev server shutdown failed during ${failures.map(({ label }) => label).join(", ")}`,
569
- failures.map(({ error }) => error)
570
- );
571
- }
572
- })());
573
- return shutdownPromise;
574
- }, "shutdownFarmDevRuntime");
575
- server.close = shutdownFarmDevRuntime;
576
- server.httpServer?.once("close", () => {
577
- shutdownFarmDevRuntime().catch((error) => {
578
- logger.warn(`Dev server shutdown failed: ${error}`);
579
- });
580
- });
581
710
  pluginManager.updateContext({ config: finalConfig, viteServer: server });
582
711
  await pluginManager.setupPlugins();
583
712
  await pluginManager.runHookParallel("devServerCreated", server);
@@ -585,19 +714,41 @@ async function createServer(config = {}, options = {}) {
585
714
  await pluginManager.runHookParallel("buildStart");
586
715
  return server;
587
716
  } catch (error) {
588
- if (pluginManager) {
589
- await pluginManager.runHookParallel("onError", {
717
+ const attempt = /* @__PURE__ */ __name(async (operation, run) => {
718
+ try {
719
+ await run();
720
+ } catch (cleanupError) {
721
+ console.error(`Failed to ${operation} after a server creation failure:`, cleanupError);
722
+ }
723
+ }, "attempt");
724
+ await attempt(
725
+ "run plugin error hooks",
726
+ () => pluginManager?.runHookParallel("onError", {
590
727
  phase: "createServer",
591
728
  error
592
- });
729
+ })
730
+ );
731
+ if (server) {
732
+ await attempt("close the dev server", server.close.bind(server));
733
+ } else {
734
+ const partialServer = pendingViteServer;
735
+ if (partialServer) {
736
+ await attempt(
737
+ "close the partially created Vite server",
738
+ () => closeViteDevServer(partialServer, partialServer.close.bind(partialServer))
739
+ );
740
+ }
741
+ await attempt(
742
+ "close the plugin runtime",
743
+ () => pluginManager?.closeRuntime("dev-server-creation-failed")
744
+ );
745
+ await attempt("shut down instrumentation", () => instrumentation?.shutdown());
593
746
  }
594
- await instrumentation?.shutdown().catch(() => {
595
- });
596
747
  logger.error(`Failed to create server: ${error}`);
597
748
  throw error;
598
749
  }
599
750
  }
600
- __name(createServer, "createServer");
751
+ __name(createServer2, "createServer");
601
752
  function noticeSchemaChangesInBackground(config) {
602
753
  if (!config) return false;
603
754
  const candidates = [
@@ -611,7 +762,7 @@ function noticeSchemaChangesInBackground(config) {
611
762
  }
612
763
  __name(noticeSchemaChangesInBackground, "noticeSchemaChangesInBackground");
613
764
  async function startDevServer(config = {}, port) {
614
- const server = await createServer(config, { port });
765
+ const server = await createServer2(config, { port });
615
766
  try {
616
767
  await server.listen(port);
617
768
  const pluginManager = server.__farmPluginManager;
@@ -655,7 +806,7 @@ export {
655
806
  createPathCacheTag,
656
807
  createRouteDataCacheKey,
657
808
  createRouteDataCacheTag,
658
- createServer,
809
+ createServer2 as createServer,
659
810
  createServerActionRequestErrorResponse,
660
811
  createServerOnlyFn,
661
812
  createServerQuery,
@@ -1,8 +1,8 @@
1
- import { M as Metadata } from './client-plugins-DPG0NeZN.mjs';
1
+ import { M as Metadata } from './client-plugins-1GS4zubE.mjs';
2
2
  import { F as FarmClientPluginManager } from './lifecycle-DK06VuKP.mjs';
3
3
  import { F as FarmI18nClientSnapshot } from './types-Z0aotQ8w.mjs';
4
4
  import { F as FarmIslandStrategy } from './island-CfGru1MO.mjs';
5
- import { F as FarmRouteRenderPlan } from './render-plan-tazUJalK.mjs';
5
+ import { F as FarmRouteRenderPlan } from './render-plan-CtQB-zHS.mjs';
6
6
 
7
7
  type NavigationMetadata = (Metadata & Record<string, any>) | undefined;
8
8
 
@@ -1,8 +1,8 @@
1
- import { M as Metadata } from './client-plugins-Fgni-_25.js';
1
+ import { M as Metadata } from './client-plugins-B1Za6F5x.js';
2
2
  import { F as FarmClientPluginManager } from './lifecycle-DK06VuKP.js';
3
3
  import { F as FarmI18nClientSnapshot } from './types-Z0aotQ8w.js';
4
4
  import { F as FarmIslandStrategy } from './island-CfGru1MO.js';
5
- import { F as FarmRouteRenderPlan } from './render-plan-D5oFRVBV.js';
5
+ import { F as FarmRouteRenderPlan } from './render-plan-CpW32tOL.js';
6
6
 
7
7
  type NavigationMetadata = (Metadata & Record<string, any>) | undefined;
8
8
 
package/dist/testing.cjs CHANGED
@@ -14,7 +14,7 @@ var _chunkT5CERMEHcjs = require('./chunk-T5CERMEH.cjs');
14
14
 
15
15
  var _chunk6QQDAAAZcjs = require('./chunk-6QQDAAAZ.cjs');
16
16
  require('./chunk-SVRTJOUF.cjs');
17
- require('./chunk-BD2U4ZL6.cjs');
17
+ require('./chunk-JQGDQO2I.cjs');
18
18
  require('./chunk-N4RLRSWW.cjs');
19
19
  require('./chunk-2CQ74SP6.cjs');
20
20
  require('./chunk-UJ2C4ICS.cjs');
@@ -22,11 +22,12 @@ require('./chunk-IQXFRNY2.cjs');
22
22
  require('./chunk-LYLEZIG3.cjs');
23
23
 
24
24
 
25
- var _chunkYAOX43YIcjs = require('./chunk-YAOX43YI.cjs');
25
+ var _chunkC7OUJ6JIcjs = require('./chunk-C7OUJ6JI.cjs');
26
26
  require('./chunk-I4J452B7.cjs');
27
27
  require('./chunk-WMAPPDMM.cjs');
28
- require('./chunk-WPYFSQKK.cjs');
29
28
  require('./chunk-TKJZFIML.cjs');
29
+ require('./chunk-5MKEDGLD.cjs');
30
+ require('./chunk-WPYFSQKK.cjs');
30
31
  require('./chunk-6V4TDWEC.cjs');
31
32
  require('./chunk-SOR334EB.cjs');
32
33
  require('./chunk-EM6SBQKM.cjs');
@@ -36,10 +37,10 @@ require('./chunk-5QIKR7RR.cjs');
36
37
 
37
38
 
38
39
  var _chunkQNPEUFHQcjs = require('./chunk-QNPEUFHQ.cjs');
40
+ require('./chunk-ARJWXNQL.cjs');
39
41
 
40
42
 
41
43
  var _chunkG7HXGLECcjs = require('./chunk-G7HXGLEC.cjs');
42
- require('./chunk-ARJWXNQL.cjs');
43
44
  require('./chunk-S3A45T7F.cjs');
44
45
  require('./chunk-75BRBIFP.cjs');
45
46
 
@@ -325,7 +326,7 @@ function omitEndpointControlOptions(options) {
325
326
  _chunkS3JO3N4Hcjs.__name.call(void 0, omitEndpointControlOptions, "omitEndpointControlOptions");
326
327
  async function invokeTestEndpoint(endpoint, request, params = {}, throwOnError = false) {
327
328
  try {
328
- return await _chunkYAOX43YIcjs.invokeAPIRouteEndpoint.call(void 0, endpoint, request, params);
329
+ return await _chunkC7OUJ6JIcjs.invokeAPIRouteEndpoint.call(void 0, endpoint, request, params);
329
330
  } catch (error) {
330
331
  if (throwOnError) throw error;
331
332
  return jsonErrorResponse(error instanceof Error ? error.message : "Internal Server Error", 500);
@@ -1,38 +1,36 @@
1
1
  import { ReactElement } from 'react';
2
- import { B as FarmContextFactory, C as MiddlewareProps, q as PluginContextProps, s as RouteModule } from './client-plugins-DPG0NeZN.mjs';
3
- import './types-Z0aotQ8w.mjs';
2
+ import { E as FarmContextFactory, G as MiddlewareProps, q as PluginContextProps, s as RouteModule } from './client-plugins-1GS4zubE.mjs';
4
3
  import { ServerFn } from './server-fn.mjs';
4
+ import './types-Z0aotQ8w.mjs';
5
5
  import { a as APIRouteParams } from './route-pattern-W-SsJGSp.mjs';
6
6
  import { ProgrammaticPageRoute, InferProgrammaticRouteData, ProgrammaticRouteComponentProps, ProgrammaticApiRoute } from './routes.mjs';
7
7
  import { FarmRouterQueryValue, FarmRouterPathParams } from './router.mjs';
8
8
  import './lifecycle-DK06VuKP.mjs';
9
- import './route-B0XrsrFk.mjs';
10
- import './endpoint-DAc96i93.mjs';
9
+ import './integration-api-0y4FXJpC.mjs';
10
+ import './endpoint-CCHFqyTE.mjs';
11
11
  import './cache.mjs';
12
12
  import './renderer.mjs';
13
13
  import './deployment.mjs';
14
14
  import 'http';
15
- import './markdown.mjs';
15
+ import './server-query.mjs';
16
+ import './server-fn-error-DDh14a0V.mjs';
16
17
  import './types-Cc8l9IqS.mjs';
17
18
  import 'db0';
18
19
  import 'unstorage';
19
20
  import './schema.mjs';
20
- import './integration-api-BbaiokCC.mjs';
21
21
  import '@farming-labs/orm';
22
22
  import './types-DFbjpjXX.mjs';
23
23
  import '@farming-labs/docs';
24
- import './observability.mjs';
24
+ import './observability-BupkiN0m.mjs';
25
25
  import '@opentelemetry/api';
26
26
  import 'vite';
27
27
  import './workflows-CR9ex-gz.mjs';
28
28
  import './cron.mjs';
29
29
  import './env.mjs';
30
30
  import './server-action-security.mjs';
31
- import './server-fn-error-DDh14a0V.mjs';
32
31
  import 'rolldown/utils';
33
32
  import 'rolldown';
34
33
  import './image-config-Duob7wER.mjs';
35
- import './server-query.mjs';
36
34
  import './types-DQnyD3VD.mjs';
37
35
  import './font.mjs';
38
36
  import './after.mjs';