@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.
- package/dist/api/route-manager.cjs.map +1 -1
- package/dist/api/route-manager.mjs +2 -2
- package/dist/api.cjs.map +1 -1
- package/dist/api.mjs +3 -3
- package/dist/{chunk-TIESOJ7Z.mjs → chunk-BOSVED4K.mjs} +2 -2
- package/dist/{chunk-XR7M5VXU.mjs → chunk-DF6GAB63.mjs} +2 -2
- package/dist/{chunk-3P63LWDM.mjs → chunk-DWG3W2FN.mjs} +2 -2
- package/dist/{chunk-3UUEBVR3.mjs → chunk-ECGXDMBF.mjs} +3 -3
- package/dist/{chunk-MP2SDRRB.mjs → chunk-HB3XKQ5X.mjs} +2 -2
- package/dist/{chunk-EHUGMAWL.mjs → chunk-LIBL3V6K.mjs} +3 -3
- package/dist/{chunk-ECLWCE4H.mjs → chunk-MHE2AMUC.mjs} +2 -2
- package/dist/{chunk-GXASWWJU.mjs → chunk-RS5Z5M26.mjs} +5 -2
- package/dist/chunk-RS5Z5M26.mjs.map +1 -0
- package/dist/{chunk-HEZHCCMF.mjs → chunk-UQ3PDDAK.mjs} +65 -29
- package/dist/chunk-UQ3PDDAK.mjs.map +1 -0
- package/dist/{chunk-VZKOMD6C.mjs → chunk-VVVDVGAS.mjs} +8 -8
- package/dist/{chunk-NKIHYEWC.mjs → chunk-X3JR4G7L.mjs} +2 -2
- package/dist/{chunk-NKIHYEWC.mjs.map → chunk-X3JR4G7L.mjs.map} +1 -1
- package/dist/{chunk-4E6VRJ6P.mjs → chunk-XY3B4K5E.mjs} +6 -3
- package/dist/chunk-XY3B4K5E.mjs.map +1 -0
- package/dist/{chunk-U5SPS2HR.mjs → chunk-YB7QPRM4.mjs} +6 -1
- package/dist/chunk-YB7QPRM4.mjs.map +1 -0
- package/dist/client/lifecycle.mjs +2 -2
- package/dist/client-plugins.cjs +1 -1
- package/dist/client-plugins.cjs.map +1 -1
- package/dist/client-plugins.mjs +2 -2
- package/dist/client.cjs +1 -1
- package/dist/client.cjs.map +1 -1
- package/dist/client.mjs +2 -2
- package/dist/cron.cjs +9 -1
- package/dist/cron.cjs.map +1 -1
- package/dist/cron.mjs +2 -1
- package/dist/{devtools-BUFIHBX3.mjs → devtools-S7KR2MMF.mjs} +5 -4
- package/dist/{devtools-BUFIHBX3.mjs.map → devtools-S7KR2MMF.mjs.map} +1 -1
- package/dist/docs.mjs +5 -4
- package/dist/index.cjs +66 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +15 -13
- package/dist/index.mjs.map +1 -1
- package/dist/internal/build-runtime.cjs +230 -189
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.d.mts +1 -1
- package/dist/internal/build-runtime.d.ts +1 -1
- package/dist/internal/build-runtime.mjs +10 -10
- package/dist/internal/client-runtime.cjs +1 -1
- package/dist/internal/client-runtime.cjs.map +1 -1
- package/dist/internal/client-runtime.mjs +2 -2
- package/dist/internal/config-runtime.cjs +10 -10
- package/dist/internal/config-runtime.cjs.map +1 -1
- package/dist/internal/config-runtime.d.mts +1 -1
- package/dist/internal/config-runtime.d.ts +1 -1
- package/dist/internal/config-runtime.mjs +4 -4
- package/dist/middleware.cjs.map +1 -1
- package/dist/middleware.mjs +3 -3
- package/dist/{nitro-G3BP7E7F.mjs → nitro-VXD26VW2.mjs} +4 -3
- package/dist/{nitro-G3BP7E7F.mjs.map → nitro-VXD26VW2.mjs.map} +1 -1
- package/dist/plugin.cjs +171 -149
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.mjs +7 -7
- package/dist/server.cjs +203 -177
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.mts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.mjs +10 -8
- package/dist/server.mjs.map +1 -1
- package/dist/testing.mjs +2 -2
- package/dist/{utils-9OPxcT1T.d.mts → utils--3v-RtD3.d.mts} +7 -1
- package/dist/{utils-CIIoLfn9.d.ts → utils-J3ipMElz.d.ts} +7 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +171 -149
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.mjs +7 -7
- package/dist/workflows.cjs +8 -2
- package/dist/workflows.cjs.map +1 -1
- package/dist/workflows.mjs +2 -1
- package/package.json +1 -1
- package/dist/chunk-4E6VRJ6P.mjs.map +0 -1
- package/dist/chunk-GXASWWJU.mjs.map +0 -1
- package/dist/chunk-HEZHCCMF.mjs.map +0 -1
- package/dist/chunk-U5SPS2HR.mjs.map +0 -1
- /package/dist/{chunk-TIESOJ7Z.mjs.map → chunk-BOSVED4K.mjs.map} +0 -0
- /package/dist/{chunk-XR7M5VXU.mjs.map → chunk-DF6GAB63.mjs.map} +0 -0
- /package/dist/{chunk-3P63LWDM.mjs.map → chunk-DWG3W2FN.mjs.map} +0 -0
- /package/dist/{chunk-3UUEBVR3.mjs.map → chunk-ECGXDMBF.mjs.map} +0 -0
- /package/dist/{chunk-MP2SDRRB.mjs.map → chunk-HB3XKQ5X.mjs.map} +0 -0
- /package/dist/{chunk-EHUGMAWL.mjs.map → chunk-LIBL3V6K.mjs.map} +0 -0
- /package/dist/{chunk-ECLWCE4H.mjs.map → chunk-MHE2AMUC.mjs.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
40
|
+
} from "./chunk-XY3B4K5E.mjs";
|
|
41
41
|
import {
|
|
42
42
|
resolveCronConfig
|
|
43
|
-
} from "./chunk-
|
|
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-
|
|
528
|
+
//# sourceMappingURL=chunk-LIBL3V6K.mjs.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MiddlewareManager
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
66
|
+
} from "./chunk-XY3B4K5E.mjs";
|
|
67
67
|
import {
|
|
68
68
|
applyFarmCronVercelCrons,
|
|
69
69
|
createFarmCronCloudflareConfig,
|
|
70
70
|
mergeScheduledTasks,
|
|
71
71
|
prepareFarmCronForNitro
|
|
72
|
-
} from "./chunk-
|
|
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-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
3654
|
+
const instrumentationImport = instrumentationPath ? `import * as FarmInstrumentationModule from ${toVirtualEntryImportSpecifier(instrumentationPath)};` : "";
|
|
3634
3655
|
const integrationImports = `
|
|
3635
|
-
${configModulePath ? `import * as FarmUserConfigModule from
|
|
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
|
|
7096
|
+
await moveVercelOutputPath(src, dest, fs);
|
|
7062
7097
|
}
|
|
7063
|
-
await fs.
|
|
7098
|
+
await fs.rm(serverDir, { recursive: true, force: true });
|
|
7064
7099
|
try {
|
|
7065
|
-
await
|
|
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-
|
|
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-
|
|
7684
|
+
//# sourceMappingURL=chunk-UQ3PDDAK.mjs.map
|