@farm.js/core 0.1.0-beta.48 → 0.1.0-beta.49

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 (92) 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.cjs.map +1 -1
  4. package/dist/api.mjs +3 -3
  5. package/dist/{chunk-TIESOJ7Z.mjs → chunk-BOSVED4K.mjs} +2 -2
  6. package/dist/{chunk-XR7M5VXU.mjs → chunk-DF6GAB63.mjs} +2 -2
  7. package/dist/{chunk-3P63LWDM.mjs → chunk-DWG3W2FN.mjs} +2 -2
  8. package/dist/{chunk-3UUEBVR3.mjs → chunk-ECGXDMBF.mjs} +3 -3
  9. package/dist/{chunk-MP2SDRRB.mjs → chunk-HB3XKQ5X.mjs} +2 -2
  10. package/dist/{chunk-EHUGMAWL.mjs → chunk-LIBL3V6K.mjs} +3 -3
  11. package/dist/{chunk-ECLWCE4H.mjs → chunk-MHE2AMUC.mjs} +2 -2
  12. package/dist/{chunk-GXASWWJU.mjs → chunk-RS5Z5M26.mjs} +5 -2
  13. package/dist/chunk-RS5Z5M26.mjs.map +1 -0
  14. package/dist/{chunk-HEZHCCMF.mjs → chunk-UQ3PDDAK.mjs} +65 -29
  15. package/dist/chunk-UQ3PDDAK.mjs.map +1 -0
  16. package/dist/{chunk-VZKOMD6C.mjs → chunk-VVVDVGAS.mjs} +8 -8
  17. package/dist/{chunk-NKIHYEWC.mjs → chunk-X3JR4G7L.mjs} +2 -2
  18. package/dist/{chunk-NKIHYEWC.mjs.map → chunk-X3JR4G7L.mjs.map} +1 -1
  19. package/dist/{chunk-4E6VRJ6P.mjs → chunk-XY3B4K5E.mjs} +6 -3
  20. package/dist/chunk-XY3B4K5E.mjs.map +1 -0
  21. package/dist/{chunk-U5SPS2HR.mjs → chunk-YB7QPRM4.mjs} +6 -1
  22. package/dist/chunk-YB7QPRM4.mjs.map +1 -0
  23. package/dist/client/lifecycle.mjs +2 -2
  24. package/dist/client-plugins.cjs +1 -1
  25. package/dist/client-plugins.cjs.map +1 -1
  26. package/dist/client-plugins.mjs +2 -2
  27. package/dist/client.cjs +1 -1
  28. package/dist/client.cjs.map +1 -1
  29. package/dist/client.mjs +2 -2
  30. package/dist/cron.cjs +9 -1
  31. package/dist/cron.cjs.map +1 -1
  32. package/dist/cron.mjs +2 -1
  33. package/dist/{devtools-BUFIHBX3.mjs → devtools-S7KR2MMF.mjs} +5 -4
  34. package/dist/{devtools-BUFIHBX3.mjs.map → devtools-S7KR2MMF.mjs.map} +1 -1
  35. package/dist/docs.mjs +5 -4
  36. package/dist/index.cjs +66 -23
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.mts +1 -1
  39. package/dist/index.d.ts +1 -1
  40. package/dist/index.mjs +15 -13
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/internal/build-runtime.cjs +230 -189
  43. package/dist/internal/build-runtime.cjs.map +1 -1
  44. package/dist/internal/build-runtime.d.mts +1 -1
  45. package/dist/internal/build-runtime.d.ts +1 -1
  46. package/dist/internal/build-runtime.mjs +10 -10
  47. package/dist/internal/client-runtime.cjs +1 -1
  48. package/dist/internal/client-runtime.cjs.map +1 -1
  49. package/dist/internal/client-runtime.mjs +2 -2
  50. package/dist/internal/config-runtime.cjs +10 -10
  51. package/dist/internal/config-runtime.cjs.map +1 -1
  52. package/dist/internal/config-runtime.d.mts +1 -1
  53. package/dist/internal/config-runtime.d.ts +1 -1
  54. package/dist/internal/config-runtime.mjs +4 -4
  55. package/dist/middleware.cjs.map +1 -1
  56. package/dist/middleware.mjs +3 -3
  57. package/dist/{nitro-G3BP7E7F.mjs → nitro-VXD26VW2.mjs} +4 -3
  58. package/dist/{nitro-G3BP7E7F.mjs.map → nitro-VXD26VW2.mjs.map} +1 -1
  59. package/dist/plugin.cjs +171 -149
  60. package/dist/plugin.cjs.map +1 -1
  61. package/dist/plugin.mjs +7 -7
  62. package/dist/server.cjs +203 -177
  63. package/dist/server.cjs.map +1 -1
  64. package/dist/server.d.mts +1 -1
  65. package/dist/server.d.ts +1 -1
  66. package/dist/server.mjs +10 -8
  67. package/dist/server.mjs.map +1 -1
  68. package/dist/testing.mjs +2 -2
  69. package/dist/{utils-9OPxcT1T.d.mts → utils--3v-RtD3.d.mts} +7 -1
  70. package/dist/{utils-CIIoLfn9.d.ts → utils-J3ipMElz.d.ts} +7 -1
  71. package/dist/version.cjs +1 -1
  72. package/dist/version.cjs.map +1 -1
  73. package/dist/version.mjs +1 -1
  74. package/dist/vite.cjs +171 -149
  75. package/dist/vite.cjs.map +1 -1
  76. package/dist/vite.mjs +7 -7
  77. package/dist/workflows.cjs +8 -2
  78. package/dist/workflows.cjs.map +1 -1
  79. package/dist/workflows.mjs +2 -1
  80. package/package.json +1 -1
  81. package/dist/chunk-4E6VRJ6P.mjs.map +0 -1
  82. package/dist/chunk-GXASWWJU.mjs.map +0 -1
  83. package/dist/chunk-HEZHCCMF.mjs.map +0 -1
  84. package/dist/chunk-U5SPS2HR.mjs.map +0 -1
  85. /package/dist/{chunk-TIESOJ7Z.mjs.map → chunk-BOSVED4K.mjs.map} +0 -0
  86. /package/dist/{chunk-XR7M5VXU.mjs.map → chunk-DF6GAB63.mjs.map} +0 -0
  87. /package/dist/{chunk-3P63LWDM.mjs.map → chunk-DWG3W2FN.mjs.map} +0 -0
  88. /package/dist/{chunk-3UUEBVR3.mjs.map → chunk-ECGXDMBF.mjs.map} +0 -0
  89. /package/dist/{chunk-MP2SDRRB.mjs.map → chunk-HB3XKQ5X.mjs.map} +0 -0
  90. /package/dist/{chunk-EHUGMAWL.mjs.map → chunk-LIBL3V6K.mjs.map} +0 -0
  91. /package/dist/{chunk-ECLWCE4H.mjs.map → chunk-MHE2AMUC.mjs.map} +0 -0
  92. /package/dist/{chunk-VZKOMD6C.mjs.map → chunk-VVVDVGAS.mjs.map} +0 -0
package/dist/api.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  farmApiPlugin
3
- } from "./chunk-3UUEBVR3.mjs";
3
+ } from "./chunk-ECGXDMBF.mjs";
4
4
  import {
5
5
  APIClientError,
6
6
  FARM_API_ROUTE_META_SYMBOL,
@@ -15,12 +15,12 @@ import "./chunk-E6EPN5BT.mjs";
15
15
  import {
16
16
  APIRouteManager,
17
17
  API_ROUTE_METHODS
18
- } from "./chunk-MP2SDRRB.mjs";
18
+ } from "./chunk-HB3XKQ5X.mjs";
19
19
  import "./chunk-XJ65E7MB.mjs";
20
20
  import "./chunk-FQYDHKKU.mjs";
21
21
  import "./chunk-SXWF4QRU.mjs";
22
22
  import "./chunk-GIELMNBG.mjs";
23
- import "./chunk-U5SPS2HR.mjs";
23
+ import "./chunk-YB7QPRM4.mjs";
24
24
  import "./chunk-QGOHVJ6J.mjs";
25
25
  import {
26
26
  DELETE,
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-GIELMNBG.mjs";
7
7
  import {
8
8
  logger
9
- } from "./chunk-U5SPS2HR.mjs";
9
+ } from "./chunk-YB7QPRM4.mjs";
10
10
  import {
11
11
  sendWebResponse
12
12
  } from "./chunk-QGOHVJ6J.mjs";
@@ -631,4 +631,4 @@ export {
631
631
  createContext,
632
632
  MiddlewareManager
633
633
  };
634
- //# sourceMappingURL=chunk-TIESOJ7Z.mjs.map
634
+ //# sourceMappingURL=chunk-BOSVED4K.mjs.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-V7RBCSDJ.mjs";
5
5
  import {
6
6
  resolveDocsConfig
7
- } from "./chunk-EHUGMAWL.mjs";
7
+ } from "./chunk-LIBL3V6K.mjs";
8
8
  import {
9
9
  resolveFarmDocsFontAssets,
10
10
  toFarmDocsPublicFontAssets
@@ -2544,4 +2544,4 @@ export {
2544
2544
  createDocsAPI,
2545
2545
  createFarmDocsAPIHandler
2546
2546
  };
2547
- //# sourceMappingURL=chunk-XR7M5VXU.mjs.map
2547
+ //# sourceMappingURL=chunk-DF6GAB63.mjs.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-FXG2PS27.mjs";
4
4
  import {
5
5
  FARM_VERSION
6
- } from "./chunk-NKIHYEWC.mjs";
6
+ } from "./chunk-X3JR4G7L.mjs";
7
7
  import {
8
8
  __name
9
9
  } from "./chunk-CGILA3WO.mjs";
@@ -1476,4 +1476,4 @@ export {
1476
1476
  FarmClientPluginManager,
1477
1477
  createClientPluginManager
1478
1478
  };
1479
- //# sourceMappingURL=chunk-3P63LWDM.mjs.map
1479
+ //# sourceMappingURL=chunk-DWG3W2FN.mjs.map
@@ -5,13 +5,13 @@ import {
5
5
  API_ROUTE_METHODS,
6
6
  findProgrammaticRouteFilesInDir,
7
7
  isProgrammaticRoutesFileName
8
- } from "./chunk-MP2SDRRB.mjs";
8
+ } from "./chunk-HB3XKQ5X.mjs";
9
9
  import {
10
10
  createCliColors
11
11
  } from "./chunk-GIELMNBG.mjs";
12
12
  import {
13
13
  toViteModuleId
14
- } from "./chunk-U5SPS2HR.mjs";
14
+ } from "./chunk-YB7QPRM4.mjs";
15
15
  import {
16
16
  sendWebResponse
17
17
  } from "./chunk-QGOHVJ6J.mjs";
@@ -433,4 +433,4 @@ __name(farmApiPlugin, "farmApiPlugin");
433
433
  export {
434
434
  farmApiPlugin
435
435
  };
436
- //# sourceMappingURL=chunk-3UUEBVR3.mjs.map
436
+ //# sourceMappingURL=chunk-ECGXDMBF.mjs.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-SXWF4QRU.mjs";
8
8
  import {
9
9
  logger
10
- } from "./chunk-U5SPS2HR.mjs";
10
+ } from "./chunk-YB7QPRM4.mjs";
11
11
  import {
12
12
  invokeAPIRouteEndpoint,
13
13
  matchAPIRoute
@@ -471,4 +471,4 @@ export {
471
471
  API_ROUTE_METHODS,
472
472
  APIRouteManager
473
473
  };
474
- //# sourceMappingURL=chunk-MP2SDRRB.mjs.map
474
+ //# sourceMappingURL=chunk-HB3XKQ5X.mjs.map
@@ -37,10 +37,10 @@ import {
37
37
  } from "./chunk-7FBJLMQH.mjs";
38
38
  import {
39
39
  resolveWorkflowsConfig
40
- } from "./chunk-4E6VRJ6P.mjs";
40
+ } from "./chunk-XY3B4K5E.mjs";
41
41
  import {
42
42
  resolveCronConfig
43
- } from "./chunk-GXASWWJU.mjs";
43
+ } from "./chunk-RS5Z5M26.mjs";
44
44
  import {
45
45
  resolveServerActionsConfig
46
46
  } from "./chunk-WORFTBLU.mjs";
@@ -525,4 +525,4 @@ export {
525
525
  resolveConfig,
526
526
  loadConfig
527
527
  };
528
- //# sourceMappingURL=chunk-EHUGMAWL.mjs.map
528
+ //# sourceMappingURL=chunk-LIBL3V6K.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MiddlewareManager
3
- } from "./chunk-TIESOJ7Z.mjs";
3
+ } from "./chunk-BOSVED4K.mjs";
4
4
  import {
5
5
  __name
6
6
  } from "./chunk-CGILA3WO.mjs";
@@ -455,4 +455,4 @@ export {
455
455
  hasMiddlewareData,
456
456
  farmMiddlewarePlugin
457
457
  };
458
- //# sourceMappingURL=chunk-ECLWCE4H.mjs.map
458
+ //# sourceMappingURL=chunk-MHE2AMUC.mjs.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ toPosixPath
3
+ } from "./chunk-YB7QPRM4.mjs";
1
4
  import {
2
5
  __name
3
6
  } from "./chunk-CGILA3WO.mjs";
@@ -60,7 +63,7 @@ async function prepareFarmCronForNitro(config) {
60
63
  const tasks = {};
61
64
  for (const job of cron.jobs) {
62
65
  const taskName = getFarmCronTaskName(job.name);
63
- const wrapperPath = path.join(generatedDir, `${safeFileName(job.name)}.mjs`);
66
+ const wrapperPath = toPosixPath(path.join(generatedDir, `${safeFileName(job.name)}.mjs`));
64
67
  await fs.writeFile(wrapperPath, createNitroCronTaskWrapper(job, cron.secretEnv), "utf8");
65
68
  tasks[taskName] = {
66
69
  handler: wrapperPath,
@@ -361,4 +364,4 @@ export {
361
364
  isCronRequestAuthorized,
362
365
  cronRoute
363
366
  };
364
- //# sourceMappingURL=chunk-GXASWWJU.mjs.map
367
+ //# sourceMappingURL=chunk-RS5Z5M26.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cron.ts"],"sourcesContent":["import { toPosixPath } from \"./utils\";\n\nexport type FarmCronSchedule = string | string[];\n\nexport interface FarmCronJobConfig {\n /** Portable five-field cron expression, or a list of expressions. */\n schedule: FarmCronSchedule;\n /** Farm API route invoked with GET when the schedule fires. */\n path: string;\n /** Human-readable purpose shown by local tooling and deployment manifests. */\n description?: string;\n /** Disable this schedule without removing its configuration. */\n enabled?: boolean;\n}\n\nexport type FarmCronUserConfig = Record<string, FarmCronJobConfig>;\n\nexport interface FarmCronJob {\n name: string;\n schedule: string[];\n path: string;\n description?: string;\n}\n\nexport interface FarmCronResolvedConfig {\n enabled: boolean;\n secretEnv: typeof DEFAULT_FARM_CRON_SECRET_ENV;\n jobs: FarmCronJob[];\n}\n\nexport interface PreparedFarmCron {\n jobs: FarmCronJob[];\n tasks: Record<string, { handler: string; description: string }>;\n scheduledTasks: Record<string, string | string[]>;\n manifestPath?: string;\n}\n\nexport interface FarmCronRouteOptions {\n /** Environment variable containing the bearer token. */\n secretEnv?: string;\n /** Inline token, primarily useful in tests. Environment variables are preferred. */\n secret?: string;\n /** Allow a production route without a secret. Defaults to false. */\n allowUnsecured?: boolean;\n}\n\nexport interface FarmCronCloudflareConfig {\n deployConfig: true;\n wrangler: {\n triggers: {\n crons: string[];\n };\n };\n}\n\nexport const DEFAULT_FARM_CRON_SECRET_ENV = \"CRON_SECRET\";\nexport const FARM_CRON_MANIFEST = \"cron-manifest.json\";\n\nconst CRON_FIELD_RANGES = [\n [0, 59, \"minute\"],\n [0, 23, \"hour\"],\n [1, 31, \"day of month\"],\n [1, 12, \"month\"],\n [0, 6, \"day of week\"],\n] as const;\n\nexport function resolveCronConfig(\n cron: FarmCronResolvedConfig | FarmCronUserConfig | false | undefined,\n): FarmCronResolvedConfig {\n if (isResolvedCronConfig(cron)) return cron;\n if (!cron) {\n return {\n enabled: false,\n secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,\n jobs: [],\n };\n }\n\n const jobs: FarmCronJob[] = [];\n for (const [name, job] of Object.entries(cron)) {\n if (!job || typeof job !== \"object\" || Array.isArray(job)) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);\n }\n if (job.enabled === false) continue;\n jobs.push(normalizeCronJob(name, job));\n }\n\n return {\n enabled: jobs.length > 0,\n secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,\n jobs,\n };\n}\n\nexport async function prepareFarmCronForNitro(config: {\n root?: string;\n distDir?: string;\n cron?: FarmCronResolvedConfig | FarmCronUserConfig | false;\n}): Promise<PreparedFarmCron> {\n const cron = isResolvedCronConfig(config.cron) ? config.cron : resolveCronConfig(config.cron);\n const root = config.root || process.cwd();\n const distDir = config.distDir || \".farm\";\n const fs = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n const manifestPath = path.join(root, distDir, FARM_CRON_MANIFEST);\n const generatedDir = path.join(root, distDir, \".nitro\", \"farm-cron\");\n\n if (!cron.enabled) {\n await Promise.all([\n fs.rm(manifestPath, { force: true }),\n fs.rm(generatedDir, { recursive: true, force: true }),\n ]);\n return {\n jobs: [],\n tasks: {},\n scheduledTasks: {},\n };\n }\n\n await fs.rm(generatedDir, { recursive: true, force: true });\n await fs.mkdir(generatedDir, { recursive: true });\n\n const tasks: PreparedFarmCron[\"tasks\"] = {};\n for (const job of cron.jobs) {\n const taskName = getFarmCronTaskName(job.name);\n const wrapperPath = toPosixPath(path.join(generatedDir, `${safeFileName(job.name)}.mjs`));\n await fs.writeFile(wrapperPath, createNitroCronTaskWrapper(job, cron.secretEnv), \"utf8\");\n tasks[taskName] = {\n handler: wrapperPath,\n description: job.description || `Farm cron ${job.name}`,\n };\n }\n\n const manifest = createFarmCronManifest(cron);\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf8\");\n\n return {\n jobs: cron.jobs,\n tasks,\n scheduledTasks: createCronScheduledTasks(cron.jobs),\n manifestPath,\n };\n}\n\nexport function createFarmCronManifest(cron: FarmCronResolvedConfig) {\n return {\n schemaVersion: 1,\n secretEnv: cron.secretEnv,\n jobs: cron.jobs.map((job) => ({\n name: job.name,\n schedule: job.schedule,\n path: job.path,\n description: job.description || null,\n })),\n };\n}\n\nexport function createFarmCronVercelCrons(\n jobs: FarmCronJob[],\n): Array<{ path: string; schedule: string }> {\n return jobs.flatMap((job) =>\n job.schedule.map((schedule) => ({\n path: job.path,\n schedule,\n })),\n );\n}\n\nexport function applyFarmCronVercelCrons(\n vercelConfig: Record<string, any>,\n jobs: FarmCronJob[],\n): Record<string, any> {\n const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n const crons = [...existingCrons];\n\n for (const cron of createFarmCronVercelCrons(jobs)) {\n const key = `${cron.path}:${cron.schedule}`;\n if (seen.has(key)) continue;\n seen.add(key);\n crons.push(cron);\n }\n\n return crons.length > 0 ? { ...vercelConfig, crons } : vercelConfig;\n}\n\nexport function createFarmCronCloudflareTriggers(jobs: FarmCronJob[]): string[] {\n return [...new Set(jobs.flatMap((job) => job.schedule))];\n}\n\nexport function createFarmCronCloudflareConfig(\n jobs: FarmCronJob[],\n): FarmCronCloudflareConfig | undefined {\n const crons = createFarmCronCloudflareTriggers(jobs);\n if (crons.length === 0) return undefined;\n\n return {\n deployConfig: true,\n wrangler: {\n triggers: { crons },\n },\n };\n}\n\nexport function mergeScheduledTasks(\n ...maps: Array<Record<string, string | string[]> | undefined>\n): Record<string, string | string[]> {\n const merged = new Map<string, string[]>();\n\n for (const map of maps) {\n for (const [schedule, taskNames] of Object.entries(map || {})) {\n const current = merged.get(schedule) || [];\n for (const taskName of Array.isArray(taskNames) ? taskNames : [taskNames]) {\n if (!current.includes(taskName)) current.push(taskName);\n }\n merged.set(schedule, current);\n }\n }\n\n return Object.fromEntries(\n [...merged].map(([schedule, taskNames]) => [\n schedule,\n taskNames.length === 1 ? taskNames[0] : taskNames,\n ]),\n );\n}\n\nexport function isCronRequestAuthorized(\n request: Request,\n options: FarmCronRouteOptions = {},\n): boolean {\n const secretEnv = options.secretEnv || DEFAULT_FARM_CRON_SECRET_ENV;\n const secret = options.secret || readEnvironmentValue(secretEnv);\n if (!secret) {\n return (\n options.allowUnsecured === true ||\n (!getFarmRuntimeBindings() && readEnvironmentValue(\"NODE_ENV\") !== \"production\")\n );\n }\n\n const authorization = request.headers.get(\"authorization\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n return bearer === secret || request.headers.get(\"x-farm-cron-secret\") === secret;\n}\n\nexport function cronRoute<TArgs extends unknown[], TResult>(\n handler: (request: Request, ...args: TArgs) => TResult,\n options: FarmCronRouteOptions = {},\n): (request: Request, ...args: TArgs) => TResult | Promise<Response> {\n return (request, ...args) => {\n if (!isCronRequestAuthorized(request, options)) {\n return Promise.resolve(\n Response.json({ error: \"Unauthorized cron request.\" }, { status: 401 }),\n );\n }\n return handler(request, ...args);\n };\n}\n\nfunction normalizeCronJob(name: string, job: FarmCronJobConfig): FarmCronJob {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name)) {\n throw new TypeError(\n `Farm cron name ${JSON.stringify(name)} must start with a letter or number and contain only letters, numbers, dots, underscores, or hyphens.`,\n );\n }\n if (!job || typeof job !== \"object\" || Array.isArray(job)) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);\n }\n\n const path = normalizeCronPath(name, job.path);\n const rawSchedule = Array.isArray(job.schedule) ? job.schedule : [job.schedule];\n const schedule = [...new Set(rawSchedule.map((value) => normalizeCronExpression(name, value)))];\n if (schedule.length === 0) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must define at least one schedule.`);\n }\n\n return {\n name,\n schedule,\n path,\n description: job.description?.trim() || undefined,\n };\n}\n\nfunction normalizeCronPath(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !value.trim().startsWith(\"/\")) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} path must start with \"/\".`);\n }\n\n const path = value.trim();\n if (path.startsWith(\"//\") || path.includes(\"?\") || path.includes(\"#\")) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} path must be an application pathname without a host, query, or hash.`,\n );\n }\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n}\n\nfunction normalizeCronExpression(name: string, value: unknown): string {\n if (typeof value !== \"string\") {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} schedule must be a string.`);\n }\n\n const expression = value.trim().replace(/\\s+/g, \" \");\n const fields = expression.split(\" \");\n if (fields.length !== CRON_FIELD_RANGES.length) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} must use five fields: minute hour day-of-month month day-of-week.`,\n );\n }\n\n fields.forEach((field, index) => {\n const [minimum, maximum, label] = CRON_FIELD_RANGES[index];\n validateCronField(name, expression, field, minimum, maximum, label);\n });\n if (fields[2] !== \"*\" && fields[4] !== \"*\") {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} cannot constrain both day-of-month and day-of-week.`,\n );\n }\n return expression;\n}\n\nfunction validateCronField(\n name: string,\n expression: string,\n field: string,\n minimum: number,\n maximum: number,\n label: string,\n): void {\n for (const segment of field.split(\",\")) {\n const [range, stepText, ...extra] = segment.split(\"/\");\n if (!range || extra.length > 0 || (stepText !== undefined && !isIntegerInRange(stepText, 1))) {\n throwInvalidCronField(name, expression, label);\n }\n\n if (range === \"*\") continue;\n const bounds = range.split(\"-\");\n if (bounds.length > 2 || !bounds.every((value) => isIntegerInRange(value, minimum, maximum))) {\n throwInvalidCronField(name, expression, label);\n }\n if (bounds.length === 2 && Number(bounds[0]) > Number(bounds[1])) {\n throwInvalidCronField(name, expression, label);\n }\n }\n}\n\nfunction isIntegerInRange(value: string, minimum: number, maximum = Number.MAX_SAFE_INTEGER) {\n if (!/^\\d+$/.test(value)) return false;\n const parsed = Number(value);\n return parsed >= minimum && parsed <= maximum;\n}\n\nfunction throwInvalidCronField(name: string, expression: string, label: string): never {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} has an invalid ${label} field.`,\n );\n}\n\nfunction isResolvedCronConfig(value: unknown): value is FarmCronResolvedConfig {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"enabled\" in value &&\n typeof (value as FarmCronResolvedConfig).enabled === \"boolean\" &&\n \"jobs\" in value &&\n Array.isArray((value as FarmCronResolvedConfig).jobs) &&\n \"secretEnv\" in value\n );\n}\n\nfunction createCronScheduledTasks(jobs: FarmCronJob[]): Record<string, string | string[]> {\n const scheduledTasks: Record<string, string | string[]> = {};\n for (const job of jobs) {\n const taskName = getFarmCronTaskName(job.name);\n for (const schedule of job.schedule) {\n scheduledTasks[schedule] = mergeTaskNames(scheduledTasks[schedule], taskName);\n }\n }\n return scheduledTasks;\n}\n\nfunction mergeTaskNames(\n current: string | string[] | undefined,\n taskName: string,\n): string | string[] {\n if (!current) return taskName;\n const names = Array.isArray(current) ? current : [current];\n return names.includes(taskName) ? names : [...names, taskName];\n}\n\nfunction getFarmCronTaskName(name: string): string {\n return `farm:cron:${name}`;\n}\n\nfunction createNitroCronTaskWrapper(job: FarmCronJob, secretEnv: string): string {\n return `\nimport { defineTask, useNitroApp } from \"nitro/runtime\";\n\nconst name = ${JSON.stringify(job.name)};\nconst path = ${JSON.stringify(job.path)};\nconst secretEnv = ${JSON.stringify(secretEnv)};\n\nfunction readSecret(event) {\n const runtimeEnv = event?.context?.cloudflare?.env || event?.context?.env || {};\n return runtimeEnv[secretEnv] || (typeof process !== \"undefined\" ? process.env?.[secretEnv] : \"\") || \"\";\n}\n\nexport default defineTask({\n meta: {\n name: ${JSON.stringify(getFarmCronTaskName(job.name))},\n description: ${JSON.stringify(job.description || `Farm cron ${job.name}`)}\n },\n async run(event) {\n const headers = new Headers({\n \"x-farm-cron-name\": name,\n \"x-farm-cron-scheduled-at\": String(event?.payload?.scheduledTime || Date.now())\n });\n const secret = readSecret(event);\n if (secret) headers.set(\"authorization\", \"Bearer \" + secret);\n\n const response = await useNitroApp().fetch(path, { method: \"GET\", headers });\n const contentType = response.headers.get(\"content-type\") || \"\";\n const body = response.status === 204\n ? null\n : contentType.includes(\"application/json\")\n ? await response.json().catch(() => null)\n : await response.text();\n\n if (!response.ok) {\n const detail = typeof body === \"string\" ? body : JSON.stringify(body);\n throw new Error(\n \"Farm cron \" + JSON.stringify(name) + \" received \" + response.status +\n \" from \" + path + (detail ? \": \" + detail : \"\")\n );\n }\n\n return { result: body };\n }\n});\n`.trim();\n}\n\nfunction readEnvironmentValue(name: string): string | undefined {\n const runtimeValue = getFarmRuntimeBindings()?.[name];\n if (typeof runtimeValue === \"string\") return runtimeValue;\n return typeof process !== \"undefined\" ? process.env?.[name] : undefined;\n}\n\nfunction getFarmRuntimeBindings(): Record<string, unknown> | undefined {\n const runtimeBindings = (\n globalThis as typeof globalThis & {\n __env__?: Record<string, unknown>;\n }\n ).__env__;\n return runtimeBindings && typeof runtimeBindings === \"object\" ? runtimeBindings : undefined;\n}\n\nfunction safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\") || \"cron\";\n}\n"],"mappings":"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","names":[]}
@@ -9,7 +9,7 @@ import {
9
9
  FARM_DOCS_LAST_MODIFIED_MANIFEST,
10
10
  createFarmDocsLastModifiedManifest,
11
11
  getFarmDocsRouteTypeEntries
12
- } from "./chunk-XR7M5VXU.mjs";
12
+ } from "./chunk-DF6GAB63.mjs";
13
13
  import {
14
14
  generateFarmDocsSearchClientRuntime,
15
15
  isFarmDocsSearchEnabled,
@@ -18,7 +18,7 @@ import {
18
18
  import {
19
19
  hasCustomFarmRouteContext,
20
20
  resolveDeployOutputPath
21
- } from "./chunk-EHUGMAWL.mjs";
21
+ } from "./chunk-LIBL3V6K.mjs";
22
22
  import {
23
23
  resolveFarmInstrumentationFile
24
24
  } from "./chunk-5NAM3OTS.mjs";
@@ -37,7 +37,7 @@ import {
37
37
  mergeFarmFontCss,
38
38
  mergeFarmViteConfig,
39
39
  resolveRouteRenderingConfigFromFile
40
- } from "./chunk-VZKOMD6C.mjs";
40
+ } from "./chunk-VVVDVGAS.mjs";
41
41
  import {
42
42
  farmEnvironmentFunctionsPlugin
43
43
  } from "./chunk-V6WE6JSZ.mjs";
@@ -63,19 +63,19 @@ import {
63
63
  import {
64
64
  applyFarmWorkflowVercelCrons,
65
65
  prepareFarmWorkflowsForNitro
66
- } from "./chunk-4E6VRJ6P.mjs";
66
+ } from "./chunk-XY3B4K5E.mjs";
67
67
  import {
68
68
  applyFarmCronVercelCrons,
69
69
  createFarmCronCloudflareConfig,
70
70
  mergeScheduledTasks,
71
71
  prepareFarmCronForNitro
72
- } from "./chunk-GXASWWJU.mjs";
72
+ } from "./chunk-RS5Z5M26.mjs";
73
73
  import {
74
74
  getFarmIntegrationPluginServerRuntime
75
75
  } from "./chunk-HFQ2I2EA.mjs";
76
76
  import {
77
77
  APIRouteManager
78
- } from "./chunk-MP2SDRRB.mjs";
78
+ } from "./chunk-HB3XKQ5X.mjs";
79
79
  import {
80
80
  readFarmI18nCatalogs
81
81
  } from "./chunk-XJ65E7MB.mjs";
@@ -89,8 +89,9 @@ import {
89
89
  resolveFarmRouteRuntimeConfig
90
90
  } from "./chunk-SXWF4QRU.mjs";
91
91
  import {
92
- logger
93
- } from "./chunk-U5SPS2HR.mjs";
92
+ logger,
93
+ toPosixPath
94
+ } from "./chunk-YB7QPRM4.mjs";
94
95
  import {
95
96
  getFarmPresetRuntime
96
97
  } from "./chunk-3BXGOVKE.mjs";
@@ -3409,6 +3410,10 @@ function generateFarmDocsRuntimeConfigExpression(docs) {
3409
3410
  : ${JSON.stringify(docs)}`;
3410
3411
  }
3411
3412
  __name(generateFarmDocsRuntimeConfigExpression, "generateFarmDocsRuntimeConfigExpression");
3413
+ function toVirtualEntryImportSpecifier(modulePath) {
3414
+ return JSON.stringify(modulePath.replace(/\\/g, "/"));
3415
+ }
3416
+ __name(toVirtualEntryImportSpecifier, "toVirtualEntryImportSpecifier");
3412
3417
  function generateVirtualEntryCode(apiRoutes, pageRoutes, layoutRoutes, routeSlots, errorRoutes, metadataImageRoutes, applicationMetadataRoutes, middlewareRoutes, redirectRoutes, configuredRewriteRoutes, configuredHeaderRoutes, notFoundPath, instrumentationPath, config, configModulePath, hasServerRuntimeIntegrations, hasRuntimeIntegrationConfig, hasConfiguredRuntimePlugins, preset, i18nCatalogs) {
3413
3418
  const hasPluginRuntime = hasRuntimeIntegrationConfig || hasConfiguredRuntimePlugins;
3414
3419
  const adapterOwnsDocsRuntime = Boolean(
@@ -3425,7 +3430,9 @@ import * as ReactDOMServer from "react-dom/server";` : `import React, * as React
3425
3430
  const apiRegistrations = [];
3426
3431
  apiRoutes.forEach((route, index) => {
3427
3432
  const varName = `apiRoute${index}`;
3428
- apiImports.push(`import * as ${varName} from "${route.filePath}";`);
3433
+ apiImports.push(
3434
+ `import * as ${varName} from ${toVirtualEntryImportSpecifier(route.filePath)};`
3435
+ );
3429
3436
  apiRegistrations.push(`
3430
3437
  {
3431
3438
  path: ${JSON.stringify(route.path)},
@@ -3458,7 +3465,9 @@ import * as ReactDOMServer from "react-dom/server";` : `import React, * as React
3458
3465
  }`);
3459
3466
  return;
3460
3467
  }
3461
- pageImports.push(`import * as ${varName} from "${route.modulePath}";`);
3468
+ pageImports.push(
3469
+ `import * as ${varName} from ${toVirtualEntryImportSpecifier(route.modulePath)};`
3470
+ );
3462
3471
  const clientMetadata = getClientModuleMetadata(route.modulePath, config.root);
3463
3472
  pageRegistrations.push(`
3464
3473
  {
@@ -3477,7 +3486,9 @@ import * as ReactDOMServer from "react-dom/server";` : `import React, * as React
3477
3486
  layoutRoutes.forEach((layout, index) => {
3478
3487
  const varName = `layoutRoute${index}`;
3479
3488
  const clientMetadata = getClientModuleMetadata(layout.modulePath, config.root);
3480
- layoutImports.push(`import * as ${varName} from "${layout.modulePath}";`);
3489
+ layoutImports.push(
3490
+ `import * as ${varName} from ${toVirtualEntryImportSpecifier(layout.modulePath)};`
3491
+ );
3481
3492
  layoutRegistrations.push(`
3482
3493
  {
3483
3494
  pattern: ${JSON.stringify(layout.pattern)},
@@ -3490,7 +3501,9 @@ import * as ReactDOMServer from "react-dom/server";` : `import React, * as React
3490
3501
  const routeSlotRegistrations = [];
3491
3502
  routeSlots.forEach((slot, index) => {
3492
3503
  const varName = `routeSlot${index}`;
3493
- routeSlotImports.push(`import * as ${varName} from "${slot.modulePath}";`);
3504
+ routeSlotImports.push(
3505
+ `import * as ${varName} from ${toVirtualEntryImportSpecifier(slot.modulePath)};`
3506
+ );
3494
3507
  routeSlotRegistrations.push(`
3495
3508
  {
3496
3509
  name: ${JSON.stringify(slot.name)},
@@ -3506,7 +3519,9 @@ import * as ReactDOMServer from "react-dom/server";` : `import React, * as React
3506
3519
  const errorRegistrations = [];
3507
3520
  errorRoutes.forEach((errorRoute, index) => {
3508
3521
  const varName = `errorRoute${index}`;
3509
- errorImports.push(`import * as ${varName} from "${errorRoute.modulePath}";`);
3522
+ errorImports.push(
3523
+ `import * as ${varName} from ${toVirtualEntryImportSpecifier(errorRoute.modulePath)};`
3524
+ );
3510
3525
  errorRegistrations.push(`
3511
3526
  {
3512
3527
  pattern: ${JSON.stringify(errorRoute.pattern)},
@@ -3516,9 +3531,11 @@ import * as ReactDOMServer from "react-dom/server";` : `import React, * as React
3516
3531
  const metadataImageImports = [];
3517
3532
  const metadataImageRegistrations = [];
3518
3533
  metadataImageRoutes.forEach((image, index) => {
3519
- if (image.sourceType === "module") {
3534
+ if (image.sourceType === "module" && image.modulePath) {
3520
3535
  const varName = `metadataImageRoute${index}`;
3521
- metadataImageImports.push(`import * as ${varName} from "${image.modulePath}";`);
3536
+ metadataImageImports.push(
3537
+ `import * as ${varName} from ${toVirtualEntryImportSpecifier(image.modulePath)};`
3538
+ );
3522
3539
  metadataImageRegistrations.push(`
3523
3540
  {
3524
3541
  pattern: ${JSON.stringify(image.pattern)},
@@ -3535,7 +3552,9 @@ import * as ReactDOMServer from "react-dom/server";` : `import React, * as React
3535
3552
  const applicationMetadataRegistrations = [];
3536
3553
  applicationMetadataRoutes.forEach((metadata, index) => {
3537
3554
  const varName = `applicationMetadataRoute${index}`;
3538
- applicationMetadataImports.push(`import * as ${varName} from "${metadata.modulePath}";`);
3555
+ applicationMetadataImports.push(
3556
+ `import * as ${varName} from ${toVirtualEntryImportSpecifier(metadata.modulePath)};`
3557
+ );
3539
3558
  applicationMetadataRegistrations.push(`
3540
3559
  {
3541
3560
  pattern: ${JSON.stringify(metadata.pattern)},
@@ -3548,7 +3567,9 @@ import * as ReactDOMServer from "react-dom/server";` : `import React, * as React
3548
3567
  const middlewareRegistrations = [];
3549
3568
  middlewareRoutes.forEach((middlewareRoute, index) => {
3550
3569
  const varName = `fileMiddleware${index}`;
3551
- middlewareImports.push(`import * as ${varName} from "${middlewareRoute.filePath}";`);
3570
+ middlewareImports.push(
3571
+ `import * as ${varName} from ${toVirtualEntryImportSpecifier(middlewareRoute.filePath)};`
3572
+ );
3552
3573
  middlewareRegistrations.push(`
3553
3574
  {
3554
3575
  path: ${JSON.stringify(middlewareRoute.path)},
@@ -3556,7 +3577,7 @@ import * as ReactDOMServer from "react-dom/server";` : `import React, * as React
3556
3577
  module: ${varName},
3557
3578
  }`);
3558
3579
  });
3559
- const notFoundImport = notFoundPath ? `import * as CustomNotFound from "${notFoundPath}";` : "";
3580
+ const notFoundImport = notFoundPath ? `import * as CustomNotFound from ${toVirtualEntryImportSpecifier(notFoundPath)};` : "";
3560
3581
  const apiRouteHelpersImport = apiRoutes.length > 0 ? `import { invokeAPIRouteEndpoint, matchAPIRoute } from "@farm.js/core/api/runtime";` : "";
3561
3582
  const productionRuntimeImport = `import {
3562
3583
  _runWithAfterRequest,
@@ -3615,10 +3636,10 @@ import { fileURLToPath as farmDocsFileURLToPath } from "node:url";` : "";
3615
3636
  const markdownHandlerImport = config.md?.enabled ? `import { applyMarkdownNegotiationHeaders, createMarkdownMirrorResponse } from "@farm.js/core/markdown";` : "";
3616
3637
  const appMarkdownImport = hasMarkdownPages ? `import { createFarmMarkdownRouteModule, createFarmMarkdownSourceResponse } from "@farm.js/core/app-markdown";` : "const createFarmMarkdownSourceResponse = null;";
3617
3638
  const mdxComponentsPath = typeof config.mdx?.components === "string" ? path4.isAbsolute(config.mdx.components) ? config.mdx.components : path4.join(config.root, config.mdx.components) : null;
3618
- const mdxComponentsImport = mdxComponentsPath ? `import * as FarmMdxComponentsModule from "${mdxComponentsPath.replace(/\\/g, "/")}";` : "";
3639
+ const mdxComponentsImport = mdxComponentsPath ? `import * as FarmMdxComponentsModule from ${toVirtualEntryImportSpecifier(mdxComponentsPath)};` : "";
3619
3640
  const layerConfigPaths = (config.layers || []).map((layer) => layer.configFile).filter((configFile) => Boolean(configFile)).filter((configFile) => configFile !== configModulePath);
3620
3641
  const layerConfigImports = layerConfigPaths.map(
3621
- (configFile, index) => `import * as FarmLayerConfigModule${index} from "${configFile.replace(/\\/g, "/")}";`
3642
+ (configFile, index) => `import * as FarmLayerConfigModule${index} from ${toVirtualEntryImportSpecifier(configFile)};`
3622
3643
  ).join("\n");
3623
3644
  const layerConfigValues = layerConfigPaths.map(
3624
3645
  (_configFile, index) => `(FarmLayerConfigModule${index}.default || FarmLayerConfigModule${index})`
@@ -3630,9 +3651,9 @@ import { fileURLToPath as farmDocsFileURLToPath } from "node:url";` : "";
3630
3651
  ])
3631
3652
  );
3632
3653
  const integrationRuntimeImport = integrationRuntimeExports.length ? `import { ${integrationRuntimeExports.join(", ")} } from "@farm.js/core/integrations";` : "";
3633
- const instrumentationImport = instrumentationPath ? `import * as FarmInstrumentationModule from "${instrumentationPath.replace(/\\/g, "/")}";` : "";
3654
+ const instrumentationImport = instrumentationPath ? `import * as FarmInstrumentationModule from ${toVirtualEntryImportSpecifier(instrumentationPath)};` : "";
3634
3655
  const integrationImports = `
3635
- ${configModulePath ? `import * as FarmUserConfigModule from "${configModulePath}";` : ""}
3656
+ ${configModulePath ? `import * as FarmUserConfigModule from ${toVirtualEntryImportSpecifier(configModulePath)};` : ""}
3636
3657
  ${layerConfigImports}
3637
3658
  ${integrationRuntimeImport}
3638
3659
  `;
@@ -6799,7 +6820,7 @@ export default async function farmNitroEventHandler(event) {
6799
6820
  ] : [],
6800
6821
  {
6801
6822
  route: "/**",
6802
- handler: nitroEntryPath
6823
+ handler: toPosixPath(nitroEntryPath)
6803
6824
  }
6804
6825
  ],
6805
6826
  routeRules: {
@@ -7047,6 +7068,20 @@ async function registerPrebuiltSSRPackageImport(serverDir, ssrEntryFile, fs) {
7047
7068
  `);
7048
7069
  }
7049
7070
  __name(registerPrebuiltSSRPackageImport, "registerPrebuiltSSRPackageImport");
7071
+ async function moveVercelOutputPath(src, dest, fs) {
7072
+ try {
7073
+ await fs.rename(src, dest);
7074
+ return;
7075
+ } catch (error) {
7076
+ const code = error?.code;
7077
+ if (code !== "EPERM" && code !== "EACCES" && code !== "EXDEV" && code !== "ENOTEMPTY") {
7078
+ throw error;
7079
+ }
7080
+ }
7081
+ await fs.cp(src, dest, { recursive: true, force: true });
7082
+ await fs.rm(src, { recursive: true, force: true });
7083
+ }
7084
+ __name(moveVercelOutputPath, "moveVercelOutputPath");
7050
7085
  async function postProcessVercelOutput(root, outputDir, fs, config, farmWorkflows, routeRuntimeManifest) {
7051
7086
  const serverDir = path4.join(outputDir, "server");
7052
7087
  const functionsDir = path4.join(outputDir, "functions");
@@ -7058,12 +7093,13 @@ async function postProcessVercelOutput(root, outputDir, fs, config, farmWorkflow
7058
7093
  for (const file of serverContents) {
7059
7094
  const src = path4.join(serverDir, file);
7060
7095
  const dest = path4.join(nitroFuncDir, file);
7061
- await fs.rename(src, dest);
7096
+ await moveVercelOutputPath(src, dest, fs);
7062
7097
  }
7063
- await fs.rmdir(serverDir);
7098
+ await fs.rm(serverDir, { recursive: true, force: true });
7064
7099
  try {
7065
- await fs.rename(publicDir, staticDir);
7066
- } catch {
7100
+ await moveVercelOutputPath(publicDir, staticDir, fs);
7101
+ } catch (error) {
7102
+ if (error?.code !== "ENOENT") throw error;
7067
7103
  }
7068
7104
  await copyFarmDocsContentForVercel(config, root, nitroFuncDir, fs);
7069
7105
  await copyPrismaClientForVercel(root, nitroFuncDir, fs);
@@ -7552,7 +7588,7 @@ function resolveLegacyPageEntry(config, root, srcDir) {
7552
7588
  __name(resolveLegacyPageEntry, "resolveLegacyPageEntry");
7553
7589
  async function buildNitro(config, routeManager, apiRouteManager, serverRenderer, preset, root, distDir, pluginManager) {
7554
7590
  const [{ createNitroConfig }, { createNitro, build: nitroBuild }] = await Promise.all([
7555
- import("./nitro-G3BP7E7F.mjs"),
7591
+ import("./nitro-VXD26VW2.mjs"),
7556
7592
  import("nitro")
7557
7593
  ]);
7558
7594
  let nitroConfig = await createNitroConfig(
@@ -7645,4 +7681,4 @@ __name(buildNitro, "buildNitro");
7645
7681
  export {
7646
7682
  build
7647
7683
  };
7648
- //# sourceMappingURL=chunk-HEZHCCMF.mjs.map
7684
+ //# sourceMappingURL=chunk-UQ3PDDAK.mjs.map