@farm.js/core 0.1.0-beta.97 → 0.1.0-beta.99
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/after.cjs.map +1 -0
- package/dist/agent-runtime.cjs +7 -3
- package/dist/agent-runtime.cjs.map +1 -0
- package/dist/agent-runtime.d.mts +2 -2
- package/dist/agent-runtime.d.ts +2 -2
- package/dist/agent-runtime.mjs +2 -1
- package/dist/agent-runtime.mjs.map +1 -1
- package/dist/api/route-manager.cjs.map +1 -0
- package/dist/api/route-manager.d.mts +2 -2
- package/dist/api/route-manager.d.ts +2 -2
- package/dist/api/runtime.cjs.map +1 -0
- package/dist/api.cjs +26 -1
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.mts +3 -3
- package/dist/api.d.ts +3 -3
- package/dist/api.mjs +2 -2
- package/dist/{app-CIOx3LvY.d.ts → app-CGjrKNoN.d.ts} +4 -4
- package/dist/{app-DBd6437H.d.mts → app-DOcLs_iq.d.mts} +4 -4
- package/dist/app-markdown.cjs +21 -0
- package/dist/app-markdown.cjs.map +1 -0
- package/dist/app-markdown.d.mts +19 -4
- package/dist/app-markdown.d.ts +19 -4
- package/dist/app-markdown.mjs +7 -1
- package/dist/cache.cjs.map +1 -0
- package/dist/{chunk-VMCHLH3Y.mjs → chunk-26BCDVJS.mjs} +19 -1
- package/dist/chunk-26BCDVJS.mjs.map +1 -0
- package/dist/{chunk-FP5Q67FO.mjs → chunk-2HYYZCCI.mjs} +308 -19
- package/dist/chunk-2HYYZCCI.mjs.map +1 -0
- package/dist/{chunk-WKDAA6V2.mjs → chunk-3BTAMIQE.mjs} +100 -41
- package/dist/chunk-3BTAMIQE.mjs.map +1 -0
- package/dist/{chunk-WD2EBM3I.mjs → chunk-3CQJV3NC.mjs} +2 -2
- package/dist/{chunk-I3OOUWO5.mjs → chunk-3GDRV7SG.mjs} +2 -2
- package/dist/{chunk-YIBV77KZ.mjs → chunk-4WLAVHCY.mjs} +2 -2
- package/dist/{chunk-KDP5ZSWP.mjs → chunk-7PS5NKOM.mjs} +26 -11
- package/dist/chunk-7PS5NKOM.mjs.map +1 -0
- package/dist/{chunk-X4SFHKFH.mjs → chunk-BU65A3LZ.mjs} +10 -6
- package/dist/chunk-BU65A3LZ.mjs.map +1 -0
- package/dist/{chunk-WMJGA32P.mjs → chunk-BXVOHG6B.mjs} +27 -2
- package/dist/{chunk-WMJGA32P.mjs.map → chunk-BXVOHG6B.mjs.map} +1 -1
- package/dist/{chunk-BZAIS65C.mjs → chunk-DIHNOVZZ.mjs} +40 -13
- package/dist/chunk-DIHNOVZZ.mjs.map +1 -0
- package/dist/{chunk-ISSFLGJ5.mjs → chunk-FDWECN3W.mjs} +8 -4
- package/dist/chunk-FDWECN3W.mjs.map +1 -0
- package/dist/chunk-FDWXXTWR.mjs +114 -0
- package/dist/chunk-FDWXXTWR.mjs.map +1 -0
- package/dist/{chunk-FSIXEIOB.mjs → chunk-L7FSTPGS.mjs} +2 -2
- package/dist/{chunk-J3MPQ4MQ.mjs → chunk-LG4XB6RN.mjs} +2 -2
- package/dist/{chunk-J3MPQ4MQ.mjs.map → chunk-LG4XB6RN.mjs.map} +1 -1
- package/dist/{chunk-AAC66ILR.mjs → chunk-LXXG3K2Y.mjs} +61 -2
- package/dist/chunk-LXXG3K2Y.mjs.map +1 -0
- package/dist/{chunk-GJ7W6LNK.mjs → chunk-N5RK4LK6.mjs} +3 -3
- package/dist/{chunk-D7F7YZ7L.mjs → chunk-NCVFPT67.mjs} +100 -40
- package/dist/{chunk-D7F7YZ7L.mjs.map → chunk-NCVFPT67.mjs.map} +1 -1
- package/dist/{chunk-UMUWR5XA.mjs → chunk-PURU7FXR.mjs} +2 -2
- package/dist/{chunk-2SKCXYLB.mjs → chunk-QQCCBMTH.mjs} +60 -6
- package/dist/chunk-QQCCBMTH.mjs.map +1 -0
- package/dist/chunk-RKUPOYQV.mjs +28 -0
- package/dist/chunk-RKUPOYQV.mjs.map +1 -0
- package/dist/{chunk-52BR7LTX.mjs → chunk-STSPSJUI.mjs} +3 -3
- package/dist/{chunk-EPDIF432.mjs → chunk-UOGX6UNO.mjs} +37 -17
- package/dist/chunk-UOGX6UNO.mjs.map +1 -0
- package/dist/{chunk-IZBX2TEU.mjs → chunk-VQG3QWWK.mjs} +2 -2
- package/dist/{chunk-35NPLKQJ.mjs → chunk-XWM2C267.mjs} +21 -105
- package/dist/chunk-XWM2C267.mjs.map +1 -0
- package/dist/{chunk-7ZVN3YZI.mjs → chunk-Z5ARESQG.mjs} +43 -1
- package/dist/chunk-Z5ARESQG.mjs.map +1 -0
- package/dist/client/lifecycle.cjs.map +1 -0
- package/dist/client/lifecycle.mjs +2 -2
- package/dist/{client-plugins-B6-07YmP.d.mts → client-plugins-BqtHoJ9C.d.mts} +91 -3
- package/dist/{client-plugins-By6MVUX-.d.ts → client-plugins-DYprkCKN.d.ts} +91 -3
- package/dist/client-plugins.cjs +1 -1
- package/dist/client-plugins.cjs.map +1 -0
- package/dist/client-plugins.d.mts +2 -2
- package/dist/client-plugins.d.ts +2 -2
- package/dist/client-plugins.mjs +2 -2
- package/dist/client.cjs +61 -16
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.mts +5 -5
- package/dist/client.d.ts +5 -5
- package/dist/client.mjs +7 -7
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.mts +2 -2
- package/dist/config.d.ts +2 -2
- package/dist/cron.cjs +48 -12
- package/dist/cron.cjs.map +1 -0
- package/dist/cron.mjs +2 -1
- package/dist/deferred.cjs.map +1 -0
- package/dist/deployment.cjs.map +1 -0
- package/dist/{devtools-XWZX6CCL.mjs → devtools-24N3U5IG.mjs} +9 -7
- package/dist/{devtools-XWZX6CCL.mjs.map → devtools-24N3U5IG.mjs.map} +1 -1
- package/dist/docs.cjs +7 -3
- package/dist/docs.cjs.map +1 -0
- package/dist/docs.mjs +9 -7
- package/dist/env-types.cjs.map +1 -0
- package/dist/env.cjs.map +1 -0
- package/dist/environment/vite.cjs.map +1 -0
- package/dist/environment.cjs.map +1 -0
- package/dist/font.cjs.map +1 -0
- package/dist/headers.cjs.map +1 -0
- package/dist/i18n/client.cjs.map +1 -0
- package/dist/i18n/index.cjs.map +1 -0
- package/dist/i18n/server.cjs.map +1 -0
- package/dist/image/server.cjs +99 -40
- package/dist/image/server.cjs.map +1 -0
- package/dist/image/server.d.mts +6 -0
- package/dist/image/server.d.ts +6 -0
- package/dist/image/server.mjs +1 -1
- package/dist/image/sharp.cjs +1 -0
- package/dist/image/sharp.cjs.map +1 -0
- package/dist/image/sharp.d.mts +1 -1
- package/dist/image/sharp.d.ts +1 -1
- package/dist/image/sharp.mjs +1 -1
- package/dist/image/sharp.mjs.map +1 -1
- package/dist/image.cjs.map +1 -0
- package/dist/index.cjs +943 -231
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.mjs +38 -24
- package/dist/index.mjs.map +1 -1
- package/dist/instrumentation.cjs.map +1 -0
- package/dist/{integration-orm-LLW6WZNK.mjs → integration-orm-G5BPBT5X.mjs} +3 -3
- package/dist/integrations.cjs +168 -5
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.d.mts +2 -2
- package/dist/integrations.d.ts +2 -2
- package/dist/integrations.mjs +10 -3
- package/dist/internal/build-runtime.cjs +745 -139
- package/dist/internal/build-runtime.cjs.map +1 -0
- package/dist/internal/build-runtime.d.mts +4 -4
- package/dist/internal/build-runtime.d.ts +4 -4
- package/dist/internal/build-runtime.mjs +16 -14
- package/dist/internal/client-runtime.cjs +7 -2
- package/dist/internal/client-runtime.cjs.map +1 -0
- package/dist/internal/client-runtime.mjs +8 -3
- package/dist/internal/client-runtime.mjs.map +1 -1
- package/dist/internal/config-runtime.cjs +59 -42
- package/dist/internal/config-runtime.cjs.map +1 -0
- package/dist/internal/config-runtime.d.mts +3 -3
- package/dist/internal/config-runtime.d.ts +3 -3
- package/dist/internal/config-runtime.mjs +8 -6
- package/dist/internal/isolated-boundary.cjs.map +1 -0
- package/dist/internal/metadata-image-runtime.cjs.map +1 -0
- package/dist/internal/product-telemetry-runtime.cjs +52 -5
- package/dist/internal/product-telemetry-runtime.cjs.map +1 -0
- package/dist/internal/product-telemetry-runtime.d.mts +12 -1
- package/dist/internal/product-telemetry-runtime.d.ts +12 -1
- package/dist/internal/product-telemetry-runtime.mjs +50 -5
- package/dist/internal/product-telemetry-runtime.mjs.map +1 -1
- package/dist/internal/production-node-env.cjs.map +1 -0
- package/dist/internal/production-runtime.cjs +56 -10
- package/dist/internal/production-runtime.cjs.map +1 -0
- package/dist/internal/production-runtime.d.mts +8 -8
- package/dist/internal/production-runtime.d.ts +8 -8
- package/dist/internal/production-runtime.mjs +2 -2
- package/dist/markdown.cjs.map +1 -0
- package/dist/{metadata-route-8_V3UonT.d.ts → metadata-route-D2be_0kC.d.ts} +17 -2
- package/dist/{metadata-route-CWP_HjGU.d.mts → metadata-route-Dw5CrDIZ.d.mts} +17 -2
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.mts +4 -4
- package/dist/middleware.d.ts +4 -4
- package/dist/navigation.cjs.map +1 -0
- package/dist/{nitro-EGRNOB5P.mjs → nitro-YJEP3FWM.mjs} +4 -3
- package/dist/{nitro-EGRNOB5P.mjs.map → nitro-YJEP3FWM.mjs.map} +1 -1
- package/dist/observability.cjs.map +1 -0
- package/dist/plugin.cjs +599 -104
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.mts +2 -2
- package/dist/plugin.d.ts +2 -2
- package/dist/plugin.mjs +13 -11
- package/dist/{production-runtime-CdmzsDax.d.ts → production-runtime-CTqpD1C8.d.ts} +2 -2
- package/dist/{production-runtime-BGRH1dKG.d.mts → production-runtime-HNqNZd4D.d.mts} +2 -2
- package/dist/query/client.cjs.map +1 -0
- package/dist/query/index.cjs.map +1 -0
- package/dist/query/parsers.cjs.map +1 -0
- package/dist/query/server.cjs.map +1 -0
- package/dist/{render-plan-DLxJYAA5.d.mts → render-plan-COscpW-i.d.mts} +1 -1
- package/dist/{render-plan-0GeHiGVZ.d.ts → render-plan-Z4kSxaT_.d.ts} +1 -1
- package/dist/renderer/react/client.cjs.map +1 -0
- package/dist/renderer/react/server.cjs.map +1 -0
- package/dist/renderer/react/vite.cjs.map +1 -0
- package/dist/renderer-client.cjs +26 -1
- package/dist/renderer-client.cjs.map +1 -0
- package/dist/renderer-client.d.mts +4 -4
- package/dist/renderer-client.d.ts +4 -4
- package/dist/renderer-client.mjs +2 -2
- package/dist/renderer.cjs.map +1 -0
- package/dist/{request-BstWbZ6O.d.ts → request-BEDb2jE9.d.ts} +1 -1
- package/dist/{request-BCNXSXLh.d.mts → request-CbIAqJY9.d.mts} +1 -1
- package/dist/request.cjs.map +1 -0
- package/dist/request.d.mts +3 -3
- package/dist/request.d.ts +3 -3
- package/dist/router.cjs.map +1 -0
- package/dist/routes.cjs.map +1 -0
- package/dist/routes.d.mts +2 -2
- package/dist/routes.d.ts +2 -2
- package/dist/server-action-security.cjs +117 -104
- package/dist/server-action-security.cjs.map +1 -0
- package/dist/server-action-security.mjs +2 -1
- package/dist/server-fn-client.cjs.map +1 -0
- package/dist/server-fn.cjs.map +1 -0
- package/dist/server-fn.mjs +3 -2
- package/dist/server-plugins.cjs.map +1 -0
- package/dist/server-plugins.d.mts +3 -3
- package/dist/server-plugins.d.ts +3 -3
- package/dist/server-query-client.cjs +26 -1
- package/dist/server-query-client.cjs.map +1 -0
- package/dist/server-query-client.mjs +3 -3
- package/dist/server-query.cjs.map +1 -0
- package/dist/server-query.mjs +4 -3
- package/dist/server.cjs +686 -170
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.mts +8 -8
- package/dist/server.d.ts +8 -8
- package/dist/server.mjs +16 -14
- package/dist/server.mjs.map +1 -1
- package/dist/{spa-router-COgu4txb.d.ts → spa-router-CjeQites.d.ts} +1 -1
- package/dist/{spa-router-BeyAVSc6.d.mts → spa-router-FJbNou1a.d.mts} +1 -1
- package/dist/storage.cjs +7 -3
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.mjs +1 -1
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.mts +2 -2
- package/dist/testing.d.ts +2 -2
- package/dist/testing.mjs +2 -1
- package/dist/testing.mjs.map +1 -1
- package/dist/theme/client.cjs.map +1 -0
- package/dist/theme/index.cjs.map +1 -0
- package/dist/theme/runtime.cjs.map +1 -0
- package/dist/theme/server.cjs.map +1 -0
- package/dist/{utils-DL2VwDQl.d.mts → utils-BiMJv9Ys.d.mts} +1 -1
- package/dist/{utils-DkU2c_1B.d.ts → utils-BpnKRFv9.d.ts} +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -0
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +599 -104
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.mts +2 -2
- package/dist/vite.d.ts +2 -2
- package/dist/vite.mjs +13 -11
- package/dist/{workflows-ChyK_oTu.d.mts → workflows-BantWytQ.d.mts} +7 -0
- package/dist/{workflows-ChyK_oTu.d.ts → workflows-BantWytQ.d.ts} +7 -0
- package/dist/workflows.cjs +73 -5
- package/dist/workflows.cjs.map +1 -0
- package/dist/workflows.d.mts +1 -1
- package/dist/workflows.d.ts +1 -1
- package/dist/workflows.mjs +2 -1
- package/package.json +17 -17
- package/dist/chunk-2SKCXYLB.mjs.map +0 -1
- package/dist/chunk-35NPLKQJ.mjs.map +0 -1
- package/dist/chunk-7ZVN3YZI.mjs.map +0 -1
- package/dist/chunk-AAC66ILR.mjs.map +0 -1
- package/dist/chunk-BZAIS65C.mjs.map +0 -1
- package/dist/chunk-EPDIF432.mjs.map +0 -1
- package/dist/chunk-FP5Q67FO.mjs.map +0 -1
- package/dist/chunk-ISSFLGJ5.mjs.map +0 -1
- package/dist/chunk-KDP5ZSWP.mjs.map +0 -1
- package/dist/chunk-VMCHLH3Y.mjs.map +0 -1
- package/dist/chunk-WKDAA6V2.mjs.map +0 -1
- package/dist/chunk-X4SFHKFH.mjs.map +0 -1
- /package/dist/{chunk-WD2EBM3I.mjs.map → chunk-3CQJV3NC.mjs.map} +0 -0
- /package/dist/{chunk-I3OOUWO5.mjs.map → chunk-3GDRV7SG.mjs.map} +0 -0
- /package/dist/{chunk-YIBV77KZ.mjs.map → chunk-4WLAVHCY.mjs.map} +0 -0
- /package/dist/{chunk-FSIXEIOB.mjs.map → chunk-L7FSTPGS.mjs.map} +0 -0
- /package/dist/{chunk-GJ7W6LNK.mjs.map → chunk-N5RK4LK6.mjs.map} +0 -0
- /package/dist/{chunk-UMUWR5XA.mjs.map → chunk-PURU7FXR.mjs.map} +0 -0
- /package/dist/{chunk-52BR7LTX.mjs.map → chunk-STSPSJUI.mjs.map} +0 -0
- /package/dist/{chunk-IZBX2TEU.mjs.map → chunk-VQG3QWWK.mjs.map} +0 -0
- /package/dist/{integration-orm-LLW6WZNK.mjs.map → integration-orm-G5BPBT5X.mjs.map} +0 -0
package/dist/vite.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import 'vite';
|
|
2
|
-
export {
|
|
2
|
+
export { eb as ClientCachePersistenceEntryCode, t as defineConfig, e5 as farmI18nClientBridgePlugin, s as farmPlugin, e9 as generateClientCachePersistenceCode, ea as resolveFarmClientCacheAdapterEntry, e7 as rewriteEarlySsrRelativeImports, e8 as transformIsolatedClientBoundaryModule, e6 as withFarmRequestTracing } from './client-plugins-BqtHoJ9C.mjs';
|
|
3
3
|
import './after.mjs';
|
|
4
4
|
import './island-CfGru1MO.mjs';
|
|
5
|
-
export { c as createFarmNodeRequestAbortSignal } from './workflows-
|
|
5
|
+
export { c as createFarmNodeRequestAbortSignal } from './workflows-BantWytQ.mjs';
|
|
6
6
|
import './lifecycle-De0vQG45.mjs';
|
|
7
7
|
import './route-CvEr4Uc9.mjs';
|
|
8
8
|
import './cache.mjs';
|
package/dist/vite.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import 'vite';
|
|
2
|
-
export {
|
|
2
|
+
export { eb as ClientCachePersistenceEntryCode, t as defineConfig, e5 as farmI18nClientBridgePlugin, s as farmPlugin, e9 as generateClientCachePersistenceCode, ea as resolveFarmClientCacheAdapterEntry, e7 as rewriteEarlySsrRelativeImports, e8 as transformIsolatedClientBoundaryModule, e6 as withFarmRequestTracing } from './client-plugins-DYprkCKN.js';
|
|
3
3
|
import './after.js';
|
|
4
4
|
import './island-CfGru1MO.js';
|
|
5
|
-
export { c as createFarmNodeRequestAbortSignal } from './workflows-
|
|
5
|
+
export { c as createFarmNodeRequestAbortSignal } from './workflows-BantWytQ.js';
|
|
6
6
|
import './lifecycle-De0vQG45.js';
|
|
7
7
|
import './route-4pd-EVtw.js';
|
|
8
8
|
import './cache.js';
|
package/dist/vite.mjs
CHANGED
|
@@ -7,13 +7,13 @@ import {
|
|
|
7
7
|
rewriteEarlySsrRelativeImports,
|
|
8
8
|
transformIsolatedClientBoundaryModule,
|
|
9
9
|
withFarmRequestTracing
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-2HYYZCCI.mjs";
|
|
11
11
|
import "./chunk-YVPFZ2TK.mjs";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-7PS5NKOM.mjs";
|
|
13
13
|
import "./chunk-WQDQCTC5.mjs";
|
|
14
14
|
import "./chunk-6ZXIQSXE.mjs";
|
|
15
15
|
import "./chunk-V6WE6JSZ.mjs";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-3BTAMIQE.mjs";
|
|
17
17
|
import "./chunk-CGIXMLSY.mjs";
|
|
18
18
|
import "./chunk-USWZZUEH.mjs";
|
|
19
19
|
import "./chunk-USLFXFFH.mjs";
|
|
@@ -22,20 +22,22 @@ import "./chunk-YKAUAZA4.mjs";
|
|
|
22
22
|
import "./chunk-7PYVLJ4J.mjs";
|
|
23
23
|
import "./chunk-7T2QYWDH.mjs";
|
|
24
24
|
import "./chunk-5EZRXIFH.mjs";
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-Z5ARESQG.mjs";
|
|
26
26
|
import "./chunk-235AKA6S.mjs";
|
|
27
27
|
import "./chunk-RQ633A5I.mjs";
|
|
28
|
-
import "./chunk-
|
|
28
|
+
import "./chunk-26BCDVJS.mjs";
|
|
29
29
|
import "./chunk-A5VG2BDG.mjs";
|
|
30
30
|
import "./chunk-EUYRVVXL.mjs";
|
|
31
|
-
import "./chunk-
|
|
32
|
-
import "./chunk-
|
|
33
|
-
import "./chunk-
|
|
31
|
+
import "./chunk-QQCCBMTH.mjs";
|
|
32
|
+
import "./chunk-DIHNOVZZ.mjs";
|
|
33
|
+
import "./chunk-RKUPOYQV.mjs";
|
|
34
|
+
import "./chunk-XWM2C267.mjs";
|
|
34
35
|
import "./chunk-N2KC75H7.mjs";
|
|
35
36
|
import "./chunk-H53KVQUU.mjs";
|
|
36
37
|
import "./chunk-QKVUNGAH.mjs";
|
|
37
|
-
import "./chunk-
|
|
38
|
-
import "./chunk-
|
|
38
|
+
import "./chunk-LXXG3K2Y.mjs";
|
|
39
|
+
import "./chunk-FDWXXTWR.mjs";
|
|
40
|
+
import "./chunk-FDWECN3W.mjs";
|
|
39
41
|
import "./chunk-4X57GXQA.mjs";
|
|
40
42
|
import "./chunk-IGOLMCE3.mjs";
|
|
41
43
|
import "./chunk-YUE4CJNB.mjs";
|
|
@@ -72,7 +74,7 @@ import "./chunk-34IAPZBG.mjs";
|
|
|
72
74
|
import "./chunk-WZ5QFROO.mjs";
|
|
73
75
|
import "./chunk-N2FY2QZ7.mjs";
|
|
74
76
|
import "./chunk-FXG2PS27.mjs";
|
|
75
|
-
import "./chunk-
|
|
77
|
+
import "./chunk-LG4XB6RN.mjs";
|
|
76
78
|
import "./chunk-PHN22XB2.mjs";
|
|
77
79
|
import "./chunk-XYTDSPBD.mjs";
|
|
78
80
|
import "./chunk-OMQWEX4N.mjs";
|
|
@@ -76,6 +76,12 @@ interface FarmWorkflowsUserConfig {
|
|
|
76
76
|
secretEnv?: string;
|
|
77
77
|
/** Inline runner secret. Prefer secretEnv for deployed apps. */
|
|
78
78
|
secret?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Serve the workflow route without a secret in a deployed runtime.
|
|
81
|
+
* Defaults to false: without a secret the route is public, so production
|
|
82
|
+
* requests are rejected unless this is explicitly enabled.
|
|
83
|
+
*/
|
|
84
|
+
allowUnsecured?: boolean;
|
|
79
85
|
}
|
|
80
86
|
interface FarmWorkflowsResolvedConfig {
|
|
81
87
|
enabled: boolean;
|
|
@@ -83,6 +89,7 @@ interface FarmWorkflowsResolvedConfig {
|
|
|
83
89
|
route: string;
|
|
84
90
|
secretEnv: string;
|
|
85
91
|
secret?: string;
|
|
92
|
+
allowUnsecured?: boolean;
|
|
86
93
|
}
|
|
87
94
|
interface FarmWorkflowLogger {
|
|
88
95
|
info: (...args: unknown[]) => void;
|
|
@@ -76,6 +76,12 @@ interface FarmWorkflowsUserConfig {
|
|
|
76
76
|
secretEnv?: string;
|
|
77
77
|
/** Inline runner secret. Prefer secretEnv for deployed apps. */
|
|
78
78
|
secret?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Serve the workflow route without a secret in a deployed runtime.
|
|
81
|
+
* Defaults to false: without a secret the route is public, so production
|
|
82
|
+
* requests are rejected unless this is explicitly enabled.
|
|
83
|
+
*/
|
|
84
|
+
allowUnsecured?: boolean;
|
|
79
85
|
}
|
|
80
86
|
interface FarmWorkflowsResolvedConfig {
|
|
81
87
|
enabled: boolean;
|
|
@@ -83,6 +89,7 @@ interface FarmWorkflowsResolvedConfig {
|
|
|
83
89
|
route: string;
|
|
84
90
|
secretEnv: string;
|
|
85
91
|
secret?: string;
|
|
92
|
+
allowUnsecured?: boolean;
|
|
86
93
|
}
|
|
87
94
|
interface FarmWorkflowLogger {
|
|
88
95
|
info: (...args: unknown[]) => void;
|
package/dist/workflows.cjs
CHANGED
|
@@ -324,6 +324,24 @@ function searchParamsToObject(searchParams) {
|
|
|
324
324
|
}
|
|
325
325
|
__name(searchParamsToObject, "searchParamsToObject");
|
|
326
326
|
|
|
327
|
+
// src/utils/runtime-env.ts
|
|
328
|
+
function getFarmRuntimeBindings() {
|
|
329
|
+
const runtimeBindings = globalThis.__env__;
|
|
330
|
+
return runtimeBindings && typeof runtimeBindings === "object" ? runtimeBindings : void 0;
|
|
331
|
+
}
|
|
332
|
+
__name(getFarmRuntimeBindings, "getFarmRuntimeBindings");
|
|
333
|
+
function readFarmEnvironmentValue(name) {
|
|
334
|
+
const runtimeValue = getFarmRuntimeBindings()?.[name];
|
|
335
|
+
if (typeof runtimeValue === "string") return runtimeValue;
|
|
336
|
+
return typeof process !== "undefined" ? process.env?.[name] : void 0;
|
|
337
|
+
}
|
|
338
|
+
__name(readFarmEnvironmentValue, "readFarmEnvironmentValue");
|
|
339
|
+
function isFarmDeployedRuntime() {
|
|
340
|
+
if (getFarmRuntimeBindings()) return true;
|
|
341
|
+
return readFarmEnvironmentValue("NODE_ENV") === "production";
|
|
342
|
+
}
|
|
343
|
+
__name(isFarmDeployedRuntime, "isFarmDeployedRuntime");
|
|
344
|
+
|
|
327
345
|
// src/utils/decode.ts
|
|
328
346
|
function decodeRouteSegment(segment) {
|
|
329
347
|
try {
|
|
@@ -370,6 +388,7 @@ var import_node_path = require("path");
|
|
|
370
388
|
var DEFAULT_FARM_WORKFLOW_DIRS = ["src/jobs", "src/workflows", "src/cron"];
|
|
371
389
|
var DEFAULT_FARM_WORKFLOW_ROUTE = "/api/_farm/workflows";
|
|
372
390
|
var DEFAULT_FARM_WORKFLOW_SECRET_ENV = "CRON_SECRET";
|
|
391
|
+
var MISSING_FARM_WORKFLOW_SECRET_ERROR = "Workflow route requires a secret. Set the CRON_SECRET environment variable, configure workflows.secret, or set workflows.allowUnsecured to true.";
|
|
373
392
|
function defineWorkflow(definition) {
|
|
374
393
|
return {
|
|
375
394
|
...definition,
|
|
@@ -404,7 +423,8 @@ function resolveWorkflowsConfig(workflows) {
|
|
|
404
423
|
dirs,
|
|
405
424
|
route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),
|
|
406
425
|
secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,
|
|
407
|
-
secret: options.secret
|
|
426
|
+
secret: options.secret,
|
|
427
|
+
allowUnsecured: options.allowUnsecured === true
|
|
408
428
|
};
|
|
409
429
|
}
|
|
410
430
|
__name(resolveWorkflowsConfig, "resolveWorkflowsConfig");
|
|
@@ -534,8 +554,11 @@ async function prepareFarmWorkflowsForNitro(config) {
|
|
|
534
554
|
await fs.mkdir(generatedDir, { recursive: true });
|
|
535
555
|
const tasks = {};
|
|
536
556
|
const scheduledTasks = createScheduledTasks(workflows);
|
|
557
|
+
const wrapperNames = resolveWorkflowWrapperFileNames(workflows.map((workflow) => workflow.id));
|
|
537
558
|
for (const workflow of workflows) {
|
|
538
|
-
const wrapperPath = toPosixPath(
|
|
559
|
+
const wrapperPath = toPosixPath(
|
|
560
|
+
path.join(generatedDir, `${wrapperNames.get(workflow.id)}.mjs`)
|
|
561
|
+
);
|
|
539
562
|
await fs.writeFile(wrapperPath, createNitroTaskWrapper(workflow), "utf8");
|
|
540
563
|
tasks[workflow.id] = {
|
|
541
564
|
handler: wrapperPath,
|
|
@@ -791,6 +814,7 @@ import {
|
|
|
791
814
|
const route = ${JSON.stringify(config.route)};
|
|
792
815
|
const secretEnv = ${JSON.stringify(config.secretEnv)};
|
|
793
816
|
const inlineSecret = ${JSON.stringify(config.secret || "")};
|
|
817
|
+
const allowUnsecured = ${JSON.stringify(config.allowUnsecured === true)};
|
|
794
818
|
const bodySizeLimit = ${JSON.stringify(server.bodySizeLimit)};
|
|
795
819
|
const workflows = ${JSON.stringify(workflows.map(toWorkflowMetadata))};
|
|
796
820
|
const workflowIds = new Set(workflows.map((workflow) => workflow.id));
|
|
@@ -820,7 +844,10 @@ function getSecret() {
|
|
|
820
844
|
|
|
821
845
|
function verifySecret(event) {
|
|
822
846
|
const secret = getSecret();
|
|
823
|
-
if (!secret)
|
|
847
|
+
if (!secret) {
|
|
848
|
+
if (allowUnsecured) return null;
|
|
849
|
+
return json({ error: ${JSON.stringify(MISSING_FARM_WORKFLOW_SECRET_ERROR)} }, 401);
|
|
850
|
+
}
|
|
824
851
|
const authorization = getHeader(event, "authorization") || "";
|
|
825
852
|
const headerSecret = getHeader(event, "x-farm-workflow-secret") || "";
|
|
826
853
|
const bearer = authorization.match(/^Bearer\\s+(.+)$/i)?.[1] || "";
|
|
@@ -918,8 +945,16 @@ function readScheduledTime(payload) {
|
|
|
918
945
|
}
|
|
919
946
|
__name(readScheduledTime, "readScheduledTime");
|
|
920
947
|
function verifyWorkflowSecret(request, config) {
|
|
921
|
-
const secret = config.secret ||
|
|
922
|
-
if (!secret)
|
|
948
|
+
const secret = config.secret || readFarmEnvironmentValue(config.secretEnv) || "";
|
|
949
|
+
if (!secret) {
|
|
950
|
+
if (config.allowUnsecured === true || !isFarmDeployedRuntime()) return null;
|
|
951
|
+
return Response.json(
|
|
952
|
+
{
|
|
953
|
+
error: MISSING_FARM_WORKFLOW_SECRET_ERROR
|
|
954
|
+
},
|
|
955
|
+
{ status: 401 }
|
|
956
|
+
);
|
|
957
|
+
}
|
|
923
958
|
const authorization = request.headers.get("authorization") || "";
|
|
924
959
|
const bearer = authorization.match(/^Bearer\s+(.+)$/i)?.[1] || "";
|
|
925
960
|
const headerSecret = request.headers.get("x-farm-workflow-secret") || "";
|
|
@@ -935,6 +970,39 @@ function trimSlashes(value) {
|
|
|
935
970
|
return value.replace(/^\/+|\/+$/g, "");
|
|
936
971
|
}
|
|
937
972
|
__name(trimSlashes, "trimSlashes");
|
|
973
|
+
function resolveWorkflowWrapperFileNames(ids) {
|
|
974
|
+
const groups = /* @__PURE__ */ new Map();
|
|
975
|
+
for (const id of ids) {
|
|
976
|
+
const key = safeFileName(id).toLowerCase();
|
|
977
|
+
groups.set(key, (groups.get(key) ?? 0) + 1);
|
|
978
|
+
}
|
|
979
|
+
const resolved = /* @__PURE__ */ new Map();
|
|
980
|
+
const claimed = /* @__PURE__ */ new Map();
|
|
981
|
+
for (const id of ids) {
|
|
982
|
+
const base = safeFileName(id);
|
|
983
|
+
const key = base.toLowerCase();
|
|
984
|
+
const fileName = (groups.get(key) ?? 0) > 1 ? `${key}-${workflowIdFingerprint(id)}` : base;
|
|
985
|
+
const claimedBy = claimed.get(fileName.toLowerCase());
|
|
986
|
+
if (claimedBy !== void 0) {
|
|
987
|
+
throw new Error(
|
|
988
|
+
`Farm workflows ${JSON.stringify(claimedBy)} and ${JSON.stringify(id)} generate the same wrapper file ${JSON.stringify(`${fileName}.mjs`)}. Rename one of them.`
|
|
989
|
+
);
|
|
990
|
+
}
|
|
991
|
+
claimed.set(fileName.toLowerCase(), id);
|
|
992
|
+
resolved.set(id, fileName);
|
|
993
|
+
}
|
|
994
|
+
return resolved;
|
|
995
|
+
}
|
|
996
|
+
__name(resolveWorkflowWrapperFileNames, "resolveWorkflowWrapperFileNames");
|
|
997
|
+
function workflowIdFingerprint(value) {
|
|
998
|
+
let hash = 2166136261;
|
|
999
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
1000
|
+
hash ^= value.charCodeAt(index);
|
|
1001
|
+
hash = Math.imul(hash, 16777619);
|
|
1002
|
+
}
|
|
1003
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
1004
|
+
}
|
|
1005
|
+
__name(workflowIdFingerprint, "workflowIdFingerprint");
|
|
938
1006
|
function safeFileName(value) {
|
|
939
1007
|
return value.replace(/[^a-zA-Z0-9._-]+/g, "-") || "workflow";
|
|
940
1008
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/workflows.ts","../src/routing/specificity.ts","../src/server-http.ts","../src/search-params.ts","../src/utils/runtime-env.ts","../src/utils/decode.ts","../src/utils.ts","../src/plugins/route-pattern.ts"],"sourcesContent":["import {\n createFarmRequestBodyErrorResponse,\n readFarmRequestBody,\n resolveFarmServerConfig,\n type FarmServerConfig,\n type ResolvedFarmServerConfig,\n} from \"./server-http\";\nimport { searchParamsToObject } from \"./search-params\";\nimport { isFarmDeployedRuntime, readFarmEnvironmentValue } from \"./utils/runtime-env\";\nimport { decodeRouteSegment } from \"./utils/decode\";\nimport { toPosixPath } from \"./utils\";\nimport { validateConfigRouteSource } from \"./plugins/route-pattern\";\nimport {\n isAbsolute as isAbsolutePath,\n normalize as normalizePath,\n relative as relativeFilePath,\n resolve as resolvePath,\n sep as pathSeparator,\n} from \"node:path\";\n\nexport type FarmWorkflowSchedule = string | string[];\n\nexport interface FarmWorkflowsUserConfig {\n /** Enable or disable Farm workflow discovery. Enabled by default. */\n enabled?: boolean;\n /** Directory or directories to scan for workflow modules. */\n dir?: string | string[];\n /** Alias for dir. */\n dirs?: string[];\n /** HTTP route used for manual and URL-based cron invocation. */\n route?: string;\n /** Environment variable that stores the optional runner secret. */\n secretEnv?: string;\n /** Inline runner secret. Prefer secretEnv for deployed apps. */\n secret?: string;\n /**\n * Serve the workflow route without a secret in a deployed runtime.\n * Defaults to false: without a secret the route is public, so production\n * requests are rejected unless this is explicitly enabled.\n */\n allowUnsecured?: boolean;\n}\n\nexport interface FarmWorkflowsResolvedConfig {\n enabled: boolean;\n dirs: string[];\n route: string;\n secretEnv: string;\n secret?: string;\n allowUnsecured?: boolean;\n}\n\nexport interface FarmWorkflowLogger {\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nexport interface FarmWorkflowRunContext<TPayload = unknown> {\n id: string;\n name: string;\n payload: TPayload;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env: Record<string, string | undefined>;\n data: Map<string, unknown>;\n log: FarmWorkflowLogger;\n}\n\nexport interface FarmWorkflowDefinition<TPayload = unknown, TResult = unknown> {\n kind?: \"farm-workflow\";\n id?: string;\n description?: string;\n schedule?: FarmWorkflowSchedule;\n timezone?: string;\n run: (ctx: FarmWorkflowRunContext<TPayload>) => TResult | Promise<TResult>;\n}\n\nexport interface FarmCronDefinition<\n TPayload = unknown,\n TResult = unknown,\n> extends FarmWorkflowDefinition<TPayload, TResult> {\n schedule: FarmWorkflowSchedule;\n}\n\nexport interface FarmDiscoveredWorkflow {\n id: string;\n filePath: string;\n description?: string;\n schedule: string[];\n timezone?: string;\n routePath: string;\n}\n\nexport interface PreparedFarmWorkflows {\n workflows: FarmDiscoveredWorkflow[];\n tasks: Record<string, { handler: string; description: string }>;\n scheduledTasks: Record<string, string | string[]>;\n handlerPath?: string;\n manifestPath?: string;\n}\n\nexport interface FarmWorkflowHTTPHandlerOptions {\n workflows: FarmDiscoveredWorkflow[];\n config: FarmWorkflowsResolvedConfig;\n loadModule: (workflow: FarmDiscoveredWorkflow) => Promise<Record<string, any>>;\n server?: FarmServerConfig | ResolvedFarmServerConfig;\n}\n\nexport const DEFAULT_FARM_WORKFLOW_DIRS = [\"src/jobs\", \"src/workflows\", \"src/cron\"];\nexport const DEFAULT_FARM_WORKFLOW_ROUTE = \"/api/_farm/workflows\";\nexport const DEFAULT_FARM_WORKFLOW_SECRET_ENV = \"CRON_SECRET\";\nconst MISSING_FARM_WORKFLOW_SECRET_ERROR =\n \"Workflow route requires a secret. Set the CRON_SECRET environment variable, configure workflows.secret, or set workflows.allowUnsecured to true.\";\n\nexport function defineWorkflow<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function defineTask<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return defineWorkflow(definition);\n}\n\n/**\n * @deprecated Configure `cron` in `farm.config.ts` and point it at an API route.\n */\nexport function defineCron<const TPayload = unknown, TResult = unknown>(\n definition: FarmCronDefinition<TPayload, TResult>,\n): FarmCronDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function resolveWorkflowsConfig(\n workflows: FarmWorkflowsUserConfig | boolean | undefined,\n): FarmWorkflowsResolvedConfig {\n if (workflows === false) {\n return {\n enabled: false,\n dirs: [...DEFAULT_FARM_WORKFLOW_DIRS],\n route: DEFAULT_FARM_WORKFLOW_ROUTE,\n secretEnv: DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n };\n }\n\n const options = workflows && typeof workflows === \"object\" ? workflows : {};\n const dirs = normalizeWorkflowDirs(options);\n\n return {\n enabled: options.enabled ?? true,\n dirs,\n route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),\n secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n secret: options.secret,\n allowUnsecured: options.allowUnsecured === true,\n };\n}\n\nexport async function discoverFarmWorkflows(\n config: {\n root?: string;\n workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n },\n options: {\n loadModule?: (filePath: string) => Promise<Record<string, any>>;\n } = {},\n): Promise<FarmDiscoveredWorkflow[]> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n if (!workflowConfig.enabled) return [];\n\n const root = config.root || process.cwd();\n const files = await findWorkflowFiles(root, workflowConfig.dirs);\n const workflows: FarmDiscoveredWorkflow[] = [];\n const seenIds = new Map<string, string>();\n\n for (const filePath of files) {\n const module = options.loadModule\n ? await options.loadModule(filePath)\n : await loadWorkflowModule(filePath, root);\n const definition = resolveWorkflowDefinition(module);\n if (!definition) continue;\n\n const id = normalizeWorkflowId(\n definition.id || workflowIdFromFile(root, workflowConfig.dirs, filePath),\n );\n const previousPath = seenIds.get(id);\n if (previousPath) {\n throw new Error(\n `Duplicate Farm workflow id \"${id}\" found in ${relativePath(root, previousPath)} and ${relativePath(root, filePath)}.`,\n );\n }\n seenIds.set(id, filePath);\n\n workflows.push({\n id,\n filePath,\n description: definition.description,\n schedule: normalizeSchedule(definition.schedule),\n timezone: definition.timezone,\n routePath: joinRoute(workflowConfig.route, encodeURIComponent(id)),\n });\n }\n\n return workflows;\n}\n\nexport function createFarmWorkflowRequestHandler(options: FarmWorkflowHTTPHandlerOptions) {\n const workflowsById = new Map(options.workflows.map((workflow) => [workflow.id, workflow]));\n\n return async function handleFarmWorkflowRequest(request: Request): Promise<Response | null> {\n const url = new URL(request.url);\n const route = normalizeWorkflowRoute(options.config.route);\n if (url.pathname !== route && !url.pathname.startsWith(`${route}/`)) {\n return null;\n }\n\n if (url.pathname === route) {\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n return Response.json({\n workflows: options.workflows.map(toWorkflowMetadata),\n });\n }\n\n const id = decodeRouteSegment(url.pathname.slice(route.length + 1));\n const workflow = workflowsById.get(id);\n if (!workflow) {\n return Response.json({ error: `Workflow \"${id}\" was not found.` }, { status: 404 });\n }\n\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n let payload: unknown;\n try {\n payload = await readWorkflowPayload(\n request,\n resolveFarmServerConfig(options.server).bodySizeLimit,\n );\n } catch (error) {\n const response = createFarmRequestBodyErrorResponse(error);\n if (response) return response;\n if (error instanceof SyntaxError) {\n return Response.json({ error: \"Invalid workflow request body.\" }, { status: 400 });\n }\n throw error;\n }\n const module = await options.loadModule(workflow);\n const result = await runFarmWorkflowModule(module, {\n id: workflow.id,\n name: workflow.id,\n payload,\n request,\n scheduledTime: readScheduledTime(payload),\n });\n\n return Response.json({\n id: workflow.id,\n ok: true,\n result: result ?? null,\n });\n };\n}\n\nexport async function runFarmWorkflowModule(\n module: Record<string, any>,\n context: {\n id: string;\n name?: string;\n payload?: unknown;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env?: Record<string, string | undefined>;\n },\n): Promise<unknown> {\n const definition = resolveWorkflowDefinition(module);\n if (!definition) {\n throw new Error(`Farm workflow \"${context.id}\" does not export a workflow definition.`);\n }\n\n return await definition.run({\n id: context.id,\n name: context.name || context.id,\n payload: context.payload,\n scheduledTime: context.scheduledTime,\n request: context.request,\n event: context.event,\n env: context.env || process.env,\n data: new Map<string, unknown>(),\n log: console,\n });\n}\n\nexport async function prepareFarmWorkflowsForNitro(config: {\n root?: string;\n distDir?: string;\n workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n server?: FarmServerConfig | ResolvedFarmServerConfig;\n}): Promise<PreparedFarmWorkflows> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n const root = config.root || process.cwd();\n const distDir = config.distDir || \".farm\";\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const generatedDir = path.join(root, distDir, \".nitro\", \"farm-workflows\");\n const workflows = await discoverFarmWorkflows({\n root,\n workflows: workflowConfig,\n });\n\n if (workflows.length === 0) {\n await fs.rm(generatedDir, { recursive: true, force: true });\n return {\n workflows,\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: PreparedFarmWorkflows[\"tasks\"] = {};\n const scheduledTasks = createScheduledTasks(workflows);\n\n const wrapperNames = resolveWorkflowWrapperFileNames(workflows.map((workflow) => workflow.id));\n for (const workflow of workflows) {\n const wrapperPath = toPosixPath(\n path.join(generatedDir, `${wrapperNames.get(workflow.id)}.mjs`),\n );\n await fs.writeFile(wrapperPath, createNitroTaskWrapper(workflow), \"utf8\");\n tasks[workflow.id] = {\n handler: wrapperPath,\n description: workflow.description || `Farm workflow ${workflow.id}`,\n };\n }\n\n const handlerPath = toPosixPath(path.join(generatedDir, \"http-handler.mjs\"));\n await fs.writeFile(\n handlerPath,\n createNitroWorkflowHTTPHandler(\n workflowConfig,\n workflows,\n resolveFarmServerConfig(config.server),\n ),\n \"utf8\",\n );\n\n const manifestPath = path.join(generatedDir, \"manifest.json\");\n await fs.writeFile(\n manifestPath,\n JSON.stringify(\n {\n route: workflowConfig.route,\n secretEnv: workflowConfig.secretEnv,\n trigger: {\n method: \"GET\",\n authorization: `Bearer $${workflowConfig.secretEnv}`,\n },\n workflows: workflows.map(toWorkflowMetadata),\n },\n null,\n 2,\n ),\n \"utf8\",\n );\n\n return {\n workflows,\n tasks,\n scheduledTasks,\n handlerPath,\n manifestPath,\n };\n}\n\nexport function createFarmWorkflowVercelCrons(\n workflows: FarmDiscoveredWorkflow[],\n): Array<{ path: string; schedule: string }> {\n return workflows.flatMap((workflow) =>\n workflow.schedule.map((schedule) => ({\n path: workflow.routePath,\n schedule,\n })),\n );\n}\n\nexport function applyFarmWorkflowVercelCrons(\n vercelConfig: Record<string, any>,\n workflows: FarmDiscoveredWorkflow[],\n): Record<string, any> {\n const crons = createFarmWorkflowVercelCrons(workflows);\n if (crons.length === 0) return vercelConfig;\n\n const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n const nextCrons = [...existingCrons];\n for (const cron of crons) {\n const key = `${cron.path}:${cron.schedule}`;\n if (seen.has(key)) continue;\n seen.add(key);\n nextCrons.push(cron);\n }\n return {\n ...vercelConfig,\n crons: nextCrons,\n };\n}\n\nfunction isResolvedWorkflowConfig(value: unknown): value is FarmWorkflowsResolvedConfig {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"dirs\" in value &&\n Array.isArray((value as FarmWorkflowsResolvedConfig).dirs) &&\n typeof (value as FarmWorkflowsResolvedConfig).route === \"string\"\n );\n}\n\nfunction normalizeWorkflowDirs(options: FarmWorkflowsUserConfig): string[] {\n const rawDirs =\n options.dirs ||\n (Array.isArray(options.dir) ? options.dir : options.dir ? [options.dir] : undefined);\n const dirs = rawDirs && rawDirs.length > 0 ? rawDirs : DEFAULT_FARM_WORKFLOW_DIRS;\n return [...new Set(dirs.map(normalizeWorkflowDir).filter(Boolean))];\n}\n\nfunction normalizeWorkflowDir(value: string): string {\n const dir = value.trim();\n if (!dir) return \"\";\n return isAbsolutePath(dir) ? normalizePath(dir) : trimSlashes(dir);\n}\n\nfunction normalizeWorkflowRoute(route: string): string {\n const trimmed = route.trim();\n if (!trimmed || trimmed === \"/\") return DEFAULT_FARM_WORKFLOW_ROUTE;\n const normalized = `/${trimSlashes(trimmed)}`;\n validateConfigRouteSource(normalized, \"workflows.route\");\n return normalized;\n}\n\nfunction normalizeWorkflowId(id: string): string {\n const normalized = id\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\")\n .replace(/\\/index$/, \"\")\n .replace(/[^a-zA-Z0-9._/-]+/g, \"-\")\n .replace(/^\\/+|\\/+$/g, \"\")\n .replace(/\\/+/g, \"/\");\n return normalized || \"workflow\";\n}\n\nfunction normalizeSchedule(schedule: FarmWorkflowSchedule | undefined): string[] {\n if (!schedule) return [];\n return (Array.isArray(schedule) ? schedule : [schedule])\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\nfunction resolveWorkflowDefinition(\n module: Record<string, any>,\n): FarmWorkflowDefinition | FarmCronDefinition | null {\n const candidates = [module.default, module.workflow, module.cron, module.task, module.job];\n for (const candidate of candidates) {\n if (candidate && typeof candidate === \"object\" && typeof candidate.run === \"function\") {\n return candidate as FarmWorkflowDefinition;\n }\n }\n return null;\n}\n\nasync function findWorkflowFiles(root: string, dirs: string[]): Promise<string[]> {\n const path = await import(\"path\");\n const files: string[] = [];\n\n for (const dir of dirs) {\n const absoluteDir = path.isAbsolute(dir) ? dir : path.join(root, dir);\n if (!(await pathExists(absoluteDir))) continue;\n await walkWorkflowDir(absoluteDir, files);\n }\n\n return files.sort();\n}\n\nasync function walkWorkflowDir(dir: string, files: string[]): Promise<void> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const filePath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n await walkWorkflowDir(filePath, files);\n continue;\n }\n if (isWorkflowFile(entry.name)) {\n files.push(filePath);\n }\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n const fs = await import(\"fs/promises\");\n return fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n}\n\nfunction isWorkflowFile(fileName: string): boolean {\n return /\\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(fileName) && !/\\.d\\.[cm]?ts$/.test(fileName);\n}\n\nasync function loadWorkflowModule(filePath: string, root: string): Promise<Record<string, any>> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const { pathToFileURL } = await import(\"url\");\n const { build } = await import(\"esbuild\");\n const outDir = path.join(root, \".farm\", \".workflow-loader\");\n await fs.mkdir(outDir, { recursive: true });\n const outfile = path.join(\n outDir,\n `workflow-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: root,\n entryPoints: [filePath],\n outfile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n packages: \"external\",\n external: [\"@farm.js/core\", \"@farm.js/core/*\", \"nitro\", \"nitro/*\"],\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n try {\n return await import(/* @vite-ignore */ `${pathToFileURL(outfile).href}?t=${Date.now()}`);\n } finally {\n await fs.unlink(outfile).catch(() => undefined);\n }\n}\n\nfunction workflowIdFromFile(root: string, dirs: string[], filePath: string): string {\n for (const dir of dirs) {\n const scanRoot = isAbsolutePath(dir) ? dir : resolvePath(root, dir);\n const candidate = relativeFilePath(scanRoot, filePath);\n if (candidate && candidate !== \"..\" && !candidate.startsWith(`..${pathSeparator}`)) {\n return normalizeWorkflowId(candidate);\n }\n }\n\n return normalizeWorkflowId(relativeFilePath(root, filePath));\n}\n\nfunction createScheduledTasks(\n workflows: FarmDiscoveredWorkflow[],\n): Record<string, string | string[]> {\n const scheduleMap = new Map<string, string[]>();\n for (const workflow of workflows) {\n for (const schedule of workflow.schedule) {\n const taskIds = scheduleMap.get(schedule) || [];\n taskIds.push(workflow.id);\n scheduleMap.set(schedule, taskIds);\n }\n }\n\n return Object.fromEntries(\n [...scheduleMap.entries()].map(([schedule, taskIds]) => [\n schedule,\n taskIds.length === 1 ? taskIds[0] : taskIds,\n ]),\n );\n}\n\nfunction createNitroTaskWrapper(workflow: FarmDiscoveredWorkflow): string {\n const normalizedPath = workflow.filePath.replace(/\\\\/g, \"/\");\n return `\nimport { defineTask } from \"nitro/runtime\";\nimport { runFarmWorkflowModule } from \"@farm.js/core/workflows\";\nimport * as workflowModule from ${JSON.stringify(normalizedPath)};\n\nexport default defineTask({\n meta: {\n description: ${JSON.stringify(workflow.description || `Farm workflow ${workflow.id}`)}\n },\n async run(event) {\n const payload = event?.payload || {};\n const env = event?.context?.cloudflare?.env || event?.context?.env || process.env;\n return await runFarmWorkflowModule(workflowModule, {\n id: ${JSON.stringify(workflow.id)},\n name: event?.name || ${JSON.stringify(workflow.id)},\n payload,\n scheduledTime: payload.scheduledTime,\n request: event?.context?.request,\n event,\n env\n });\n }\n});\n`.trim();\n}\n\nfunction createNitroWorkflowHTTPHandler(\n config: FarmWorkflowsResolvedConfig,\n workflows: FarmDiscoveredWorkflow[],\n server: ResolvedFarmServerConfig,\n): string {\n return `\nimport { H3 } from \"h3\";\nimport { runTask } from \"nitro/runtime\";\nimport {\n createFarmRequestBodyErrorResponse,\n readFarmRequestBody,\n searchParamsToObject\n} from \"@farm.js/core/internal/production-runtime\";\n\nconst route = ${JSON.stringify(config.route)};\nconst secretEnv = ${JSON.stringify(config.secretEnv)};\nconst inlineSecret = ${JSON.stringify(config.secret || \"\")};\nconst allowUnsecured = ${JSON.stringify(config.allowUnsecured === true)};\nconst bodySizeLimit = ${JSON.stringify(server.bodySizeLimit)};\nconst workflows = ${JSON.stringify(workflows.map(toWorkflowMetadata))};\nconst workflowIds = new Set(workflows.map((workflow) => workflow.id));\n\nfunction json(value, status = 200) {\n return new Response(JSON.stringify(value), {\n status,\n headers: { \"content-type\": \"application/json\" }\n });\n}\n\nfunction decodeRouteSegment(segment) {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n\nfunction getHeader(event, name) {\n return event.req.headers.get(name);\n}\n\nfunction getSecret() {\n return inlineSecret || process.env[secretEnv] || \"\";\n}\n\nfunction verifySecret(event) {\n const secret = getSecret();\n if (!secret) {\n if (allowUnsecured) return null;\n return json({ error: ${JSON.stringify(MISSING_FARM_WORKFLOW_SECRET_ERROR)} }, 401);\n }\n const authorization = getHeader(event, \"authorization\") || \"\";\n const headerSecret = getHeader(event, \"x-farm-workflow-secret\") || \"\";\n const bearer = authorization.match(/^Bearer\\\\s+(.+)$/i)?.[1] || \"\";\n if (headerSecret === secret || bearer === secret) return null;\n return json({ error: \"Unauthorized workflow request.\" }, 401);\n}\n\nasync function readPayload(event) {\n if (event.req.method === \"GET\" || event.req.method === \"HEAD\") {\n return searchParamsToObject(event.url.searchParams);\n }\n const bytes = await readFarmRequestBody(event.req, bodySizeLimit);\n const text = new TextDecoder().decode(bytes);\n if (!text) return {};\n const contentType = (getHeader(event, \"content-type\") || \"\").split(\";\", 1)[0].trim().toLowerCase();\n if (\n contentType === \"application/json\" ||\n (contentType.startsWith(\"application/\") && contentType.endsWith(\"+json\"))\n ) {\n return JSON.parse(text);\n }\n return { text };\n}\n\nexport default new H3()\n .get(route, (event) => {\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n return { workflows };\n })\n .all(route + \"/:id\", async (event) => {\n const id = decodeRouteSegment(event.context.params?.id || \"\");\n if (!workflowIds.has(id)) {\n return json({ error: \"Workflow \" + id + \" was not found.\" }, 404);\n }\n\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n\n let payload;\n try {\n payload = await readPayload(event);\n } catch (error) {\n const response = createFarmRequestBodyErrorResponse(error);\n if (response) return response;\n if (error instanceof SyntaxError) return json({ error: \"Invalid workflow request body.\" }, 400);\n throw error;\n }\n const result = await runTask(id, {\n payload,\n context: {\n source: \"http\",\n request: event.req,\n route,\n url: event.url.href,\n method: event.req.method\n }\n });\n return {\n id,\n ok: true,\n result: result ?? null\n };\n });\n`.trim();\n}\n\nfunction toWorkflowMetadata(workflow: FarmDiscoveredWorkflow) {\n return {\n id: workflow.id,\n description: workflow.description || null,\n schedule: workflow.schedule,\n timezone: workflow.timezone || null,\n path: workflow.routePath,\n };\n}\n\nasync function readWorkflowPayload(request: Request, bodySizeLimit: number): Promise<unknown> {\n const url = new URL(request.url);\n if (request.method === \"GET\" || request.method === \"HEAD\") {\n return searchParamsToObject(url.searchParams);\n }\n\n const bytes = await readFarmRequestBody(request, bodySizeLimit);\n const text = new TextDecoder().decode(bytes);\n if (!text) return {};\n const contentType = (request.headers.get(\"content-type\") || \"\")\n .split(\";\", 1)[0]\n .trim()\n .toLowerCase();\n if (\n contentType === \"application/json\" ||\n (contentType.startsWith(\"application/\") && contentType.endsWith(\"+json\"))\n ) {\n return JSON.parse(text);\n }\n\n return { text };\n}\n\nfunction readScheduledTime(payload: unknown): number | string | undefined {\n return payload && typeof payload === \"object\" && \"scheduledTime\" in payload\n ? (payload as { scheduledTime?: number | string }).scheduledTime\n : undefined;\n}\n\nfunction verifyWorkflowSecret(\n request: Request,\n config: FarmWorkflowsResolvedConfig,\n): Response | null {\n const secret = config.secret || readFarmEnvironmentValue(config.secretEnv) || \"\";\n if (!secret) {\n // No secret configured. Local development stays convenient, but a deployed\n // runtime must not expose a route that lists and executes workflows to\n // anonymous callers. Opt back in explicitly with .\n if (config.allowUnsecured === true || !isFarmDeployedRuntime()) return null;\n return Response.json(\n {\n error: MISSING_FARM_WORKFLOW_SECRET_ERROR,\n },\n { status: 401 },\n );\n }\n\n const authorization = request.headers.get(\"authorization\") || \"\";\n const bearer = authorization.match(/^Bearer\\s+(.+)$/i)?.[1] || \"\";\n const headerSecret = request.headers.get(\"x-farm-workflow-secret\") || \"\";\n if (bearer === secret || headerSecret === secret) return null;\n\n return Response.json({ error: \"Unauthorized workflow request.\" }, { status: 401 });\n}\n\nfunction joinRoute(...parts: string[]): string {\n return `/${parts\n .map((part) => trimSlashes(part))\n .filter(Boolean)\n .join(\"/\")}`;\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Wrapper file names for a set of workflow ids.\n *\n * `safeFileName` is not injective: it maps `a/b` and `a-b` onto the same string,\n * and macOS and Windows additionally fold `Daily` onto `daily` on their default\n * case-insensitive filesystems. Two workflows would then share one generated\n * wrapper and both run whichever was written last. Only ids that actually\n * collide are disambiguated, so ordinary ids keep a readable wrapper; every id\n * in a colliding group gets a digest of the exact id appended, which keeps the\n * result independent of discovery order.\n */\nfunction resolveWorkflowWrapperFileNames(ids: readonly string[]): Map<string, string> {\n const groups = new Map<string, number>();\n for (const id of ids) {\n const key = safeFileName(id).toLowerCase();\n groups.set(key, (groups.get(key) ?? 0) + 1);\n }\n\n const resolved = new Map<string, string>();\n const claimed = new Map<string, string>();\n for (const id of ids) {\n const base = safeFileName(id);\n const key = base.toLowerCase();\n const fileName = (groups.get(key) ?? 0) > 1 ? `${key}-${workflowIdFingerprint(id)}` : base;\n const claimedBy = claimed.get(fileName.toLowerCase());\n if (claimedBy !== undefined) {\n throw new Error(\n `Farm workflows ${JSON.stringify(claimedBy)} and ${JSON.stringify(id)} generate the same wrapper file ${JSON.stringify(`${fileName}.mjs`)}. Rename one of them.`,\n );\n }\n claimed.set(fileName.toLowerCase(), id);\n resolved.set(id, fileName);\n }\n return resolved;\n}\n\n/**\n * FNV-1a. This module is bundled into server runtimes that do not provide\n * node:crypto, and the digest only needs to separate file names.\n */\nfunction workflowIdFingerprint(value: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\nfunction safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\") || \"workflow\";\n}\n\nfunction relativePath(root: string, filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\").replace(`${root.replace(/\\\\/g, \"/\")}/`, \"\");\n}\n","export type RouteSegmentSpecificity = \"static\" | \"dynamic\" | \"catch-all\" | \"optional-catch-all\";\n\nexport class AmbiguousRouteError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AmbiguousRouteError\";\n }\n}\n\nexport class NonTerminalCatchAllRouteError extends TypeError {\n constructor(message: string) {\n super(message);\n this.name = \"NonTerminalCatchAllRouteError\";\n }\n}\n\nexport class DuplicateRouteParameterError extends AmbiguousRouteError {\n constructor(message: string) {\n super(message);\n this.name = \"DuplicateRouteParameterError\";\n }\n}\n\nexport class ReservedRouteParameterError extends AmbiguousRouteError {\n constructor(message: string) {\n super(message);\n this.name = \"ReservedRouteParameterError\";\n }\n}\n\nexport class BrowserUnstableRouteError extends TypeError {\n constructor(message: string) {\n super(message);\n this.name = \"BrowserUnstableRouteError\";\n }\n}\n\nconst SEGMENT_RANK: Record<RouteSegmentSpecificity, number> = {\n static: 4,\n dynamic: 3,\n \"catch-all\": 1,\n \"optional-catch-all\": 0,\n};\n\n// Ending a route is more specific than consuming the same path through a\n// catch-all, while a following static or dynamic segment remains more specific.\nconst ROUTE_END_RANK = 2;\n\n/** Sort route patterns from the most specific segment sequence to the least specific. */\nexport function compareRouteSpecificity(\n left: readonly RouteSegmentSpecificity[],\n right: readonly RouteSegmentSpecificity[],\n): number {\n const length = Math.max(left.length, right.length);\n\n for (let index = 0; index < length; index++) {\n const leftRank = index < left.length ? SEGMENT_RANK[left[index]!] : ROUTE_END_RANK;\n const rightRank = index < right.length ? SEGMENT_RANK[right[index]!] : ROUTE_END_RANK;\n if (leftRank !== rightRank) return rightRank - leftRank;\n }\n\n return 0;\n}\n\nexport type RoutePatternSyntax = \"page\" | \"router\" | \"api\";\n\nconst ROUTER_PARAMETER_NAME = \"[A-Za-z0-9_$-]+\";\nconst PAGE_PARAMETER_PATTERN = /^(?:\\[\\[\\.\\.\\.(.+)\\]\\]|\\[\\.\\.\\.(.+)\\]|\\[(.+)\\])$/;\nconst ROUTER_PARAMETER_PATTERN =\n /^(?:\\[\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]\\]|\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]|\\[([A-Za-z0-9_$-]+)\\]|:([A-Za-z0-9_$-]+)|\\*([A-Za-z0-9_$-]+)\\??)$/;\nconst RESERVED_PARAMETER_NAMES = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nexport function assertBrowserStableRoutePath(pattern: string): void {\n if (pattern.includes(\"\\\\\") || hasControlCharacter(pattern)) {\n throw new BrowserUnstableRouteError(\n `Route path \"${pattern}\" cannot contain backslashes or control characters.`,\n );\n }\n\n for (const segment of pattern.split(\"/\").filter(Boolean)) {\n if (\n (segment.startsWith(\"(\") && segment.endsWith(\")\")) ||\n (segment.startsWith(\"[\") && segment.endsWith(\"]\"))\n ) {\n continue;\n }\n\n let decoded = segment;\n try {\n decoded = decodeURIComponent(segment);\n } catch {\n // Malformed escapes stay literal in browser pathnames.\n }\n if (\n decoded === \".\" ||\n decoded === \"..\" ||\n decoded.includes(\"/\") ||\n decoded.includes(\"\\\\\") ||\n hasControlCharacter(decoded)\n ) {\n throw new BrowserUnstableRouteError(\n `Route path \"${pattern}\" contains browser-unstable segment \"${segment}\".`,\n );\n }\n }\n}\n\nfunction hasControlCharacter(value: string): boolean {\n return Array.from(value).some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || (code >= 127 && code <= 159);\n });\n}\n\nexport function assertUniqueRouteParameters(\n pattern: string,\n syntax: RoutePatternSyntax = \"page\",\n): void {\n const parameterPattern = syntax === \"router\" ? ROUTER_PARAMETER_PATTERN : PAGE_PARAMETER_PATTERN;\n const names = new Set<string>();\n\n for (const segment of splitRoutePattern(pattern, syntax)) {\n const match = parameterPattern.exec(segment);\n const name = match?.slice(1).find(Boolean);\n if (!name) continue;\n if (RESERVED_PARAMETER_NAMES.has(name)) {\n throw new ReservedRouteParameterError(\n `Route parameter \"${name}\" in route \"${pattern}\" is reserved. Use a different parameter name.`,\n );\n }\n if (names.has(name)) {\n throw new DuplicateRouteParameterError(\n `Duplicate route parameter \"${name}\" in route \"${pattern}\". Each dynamic segment must use a unique name.`,\n );\n }\n names.add(name);\n }\n}\n\nfunction splitRoutePattern(pattern: string, syntax: RoutePatternSyntax): string[] {\n return pattern\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .filter(Boolean)\n .filter((segment) =>\n syntax === \"api\" ? true : !(segment.startsWith(\"(\") && segment.endsWith(\")\")),\n );\n}\n\nexport function assertTerminalCatchAll(pattern: string, syntax: RoutePatternSyntax = \"page\"): void {\n const segments = splitRoutePattern(pattern, syntax);\n const parameterName = syntax === \"router\" ? ROUTER_PARAMETER_NAME : \".+\";\n const catchAllPattern = new RegExp(\n syntax === \"router\"\n ? `^(?:\\\\[\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]\\\\]|\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]|\\\\*${parameterName}\\\\??)$`\n : `^(?:\\\\[\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]\\\\]|\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\])$`,\n );\n const catchAllIndex = segments.findIndex((segment) => catchAllPattern.test(segment));\n if (catchAllIndex >= 0 && catchAllIndex !== segments.length - 1) {\n throw new NonTerminalCatchAllRouteError(\n `Catch-all segment \"${segments[catchAllIndex]}\" must be the final segment in route \"${pattern}\".`,\n );\n }\n}\n\n/** Return the URL-matching shape of a route without its parameter names. */\nexport function getRoutePatternShape(pattern: string, syntax: RoutePatternSyntax = \"page\"): string {\n assertTerminalCatchAll(pattern, syntax);\n const segments = splitRoutePattern(pattern, syntax).map((segment) => {\n const specificity = getPatternSegmentSpecificity(segment, syntax);\n if (specificity !== \"static\") return specificity;\n\n try {\n return `static:${decodeURIComponent(segment)}`;\n } catch {\n return `static:${segment}`;\n }\n });\n\n return segments.length === 0 ? \"/\" : JSON.stringify(segments);\n}\n\n/** Return the specificity of every URL-consuming segment in a route pattern. */\nexport function getRoutePatternSpecificity(\n pattern: string,\n syntax: RoutePatternSyntax = \"page\",\n): RouteSegmentSpecificity[] {\n assertTerminalCatchAll(pattern, syntax);\n return splitRoutePattern(pattern, syntax).map((segment) =>\n getPatternSegmentSpecificity(segment, syntax),\n );\n}\n\nfunction getPatternSegmentSpecificity(\n segment: string,\n syntax: RoutePatternSyntax,\n): RouteSegmentSpecificity {\n const parameterName = syntax === \"router\" ? ROUTER_PARAMETER_NAME : \".+\";\n const supportsColonAndStar = syntax === \"router\";\n if (\n new RegExp(`^\\\\[\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]\\\\]$`).test(segment) ||\n (supportsColonAndStar && new RegExp(`^\\\\*${parameterName}\\\\?$`).test(segment))\n ) {\n return \"optional-catch-all\";\n }\n if (\n new RegExp(`^\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]$`).test(segment) ||\n (supportsColonAndStar && new RegExp(`^\\\\*${parameterName}$`).test(segment))\n ) {\n return \"catch-all\";\n }\n if (\n new RegExp(`^\\\\[${parameterName}\\\\]$`).test(segment) ||\n (supportsColonAndStar && new RegExp(`^:${parameterName}$`).test(segment))\n ) {\n return \"dynamic\";\n }\n\n return \"static\";\n}\n","import { assertBrowserStableRoutePath } from \"./routing/specificity\";\n\ninterface FarmNodeAbortRequest {\n aborted?: boolean;\n once(event: \"aborted\", listener: () => void): unknown;\n off(event: \"aborted\", listener: () => void): unknown;\n}\n\ninterface FarmNodeAbortResponse {\n writableEnded: boolean;\n once(event: \"close\" | \"finish\", listener: () => void): unknown;\n off(event: \"close\" | \"finish\", listener: () => void): unknown;\n}\n\n/** Share disconnect semantics between development and production Node requests. */\nexport function createFarmNodeRequestAbortSignal(\n req: FarmNodeAbortRequest,\n res: FarmNodeAbortResponse,\n): AbortSignal {\n const controller = new AbortController();\n let disposed = false;\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n req.off(\"aborted\", abort);\n res.off(\"close\", abortOnEarlyClose);\n res.off(\"finish\", dispose);\n controller.signal.removeEventListener(\"abort\", dispose);\n };\n const abort = () => controller.abort();\n const abortOnEarlyClose = () => {\n if (!res.writableEnded) abort();\n dispose();\n };\n\n if (req.aborted) {\n controller.abort();\n return controller.signal;\n }\n\n req.once(\"aborted\", abort);\n res.once(\"close\", abortOnEarlyClose);\n res.once(\"finish\", dispose);\n controller.signal.addEventListener(\"abort\", dispose, { once: true });\n return controller.signal;\n}\n\nexport const DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT = 10_000_000;\nexport const DEFAULT_FARM_SERVER_HEADERS_TIMEOUT = 60_000;\nexport const DEFAULT_FARM_SERVER_REQUEST_TIMEOUT = 300_000;\nexport const DEFAULT_FARM_SERVER_KEEP_ALIVE_TIMEOUT = 5_000;\nexport const DEFAULT_FARM_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT = 30_000;\nconst MAX_FARM_SERVER_TIMEOUT = 2_147_483_647;\n\nexport type FarmServerDuration = number | `${number}${\"ms\" | \"s\" | \"m\" | \"h\"}`;\n\nexport interface FarmServerHealthConfig {\n /** Liveness endpoint. It remains healthy while a production process drains. */\n livenessPath?: string;\n /** Readiness endpoint. It returns 503 until startup completes and while draining. */\n readinessPath?: string;\n}\n\nexport interface ResolvedFarmServerHealthConfig {\n enabled: boolean;\n livenessPath: string;\n readinessPath: string;\n}\n\nexport interface FarmServerConfig {\n /** Maximum request body size for API routes, integrations, workflows, and uploads. */\n bodySizeLimit?: number | string;\n /** Trust proxy-provided client address and request authority headers. Enable only behind a trusted proxy. */\n trustProxy?: boolean;\n /** Maximum time for a Node client to send complete request headers. */\n headersTimeout?: FarmServerDuration;\n /** Maximum time for a Node client to send the complete request. */\n requestTimeout?: FarmServerDuration;\n /** How long an idle Node keep-alive connection remains open after a response. */\n keepAliveTimeout?: FarmServerDuration;\n /** Maximum time the Node adapter drains traffic before forcing shutdown. */\n gracefulShutdownTimeout?: FarmServerDuration;\n /** Production liveness and readiness endpoints. Set to false to disable them. */\n health?: false | FarmServerHealthConfig;\n}\n\nexport interface ResolvedFarmServerConfig {\n bodySizeLimit: number;\n trustProxy: boolean;\n headersTimeout: number;\n requestTimeout: number;\n keepAliveTimeout: number;\n gracefulShutdownTimeout: number;\n health: ResolvedFarmServerHealthConfig;\n}\n\nexport type FarmRequestBodyErrorCode = \"BODY_TOO_LARGE\" | \"INVALID_CONTENT_LENGTH\";\n\n/** Apply the weak entity-tag comparison required by If-None-Match. */\nexport function matchesFarmIfNoneMatch(\n value: string | readonly string[] | null | undefined,\n etag: string,\n): boolean {\n const expected = parseEntityTag(trimOptionalWhitespace(etag));\n if (!expected) return false;\n\n const values = Array.isArray(value) ? value : [value];\n const combined = values\n .filter((header): header is string => typeof header === \"string\")\n .join(\",\");\n const fieldValue = trimOptionalWhitespace(combined);\n if (!fieldValue) return false;\n if (fieldValue === \"*\") return true;\n\n let matched = false;\n let hasEntityTag = false;\n for (const candidate of splitEntityTags(fieldValue)) {\n const token = trimOptionalWhitespace(candidate);\n if (!token) continue;\n\n const parsed = parseEntityTag(token);\n if (!parsed) return false;\n hasEntityTag = true;\n if (parsed === expected) matched = true;\n }\n\n return hasEntityTag && matched;\n}\n\nfunction trimOptionalWhitespace(value: string): string {\n return value.replace(/^[\\t ]+|[\\t ]+$/g, \"\");\n}\n\nfunction parseEntityTag(value: string): string | null {\n const opaqueTag = value.startsWith(\"W/\") ? value.slice(2) : value;\n if (opaqueTag.length < 2 || opaqueTag[0] !== '\"' || opaqueTag.at(-1) !== '\"') return null;\n\n for (let index = 1; index < opaqueTag.length - 1; index++) {\n const code = opaqueTag.charCodeAt(index);\n if (code === 0x21 || (code >= 0x23 && code <= 0x7e) || code >= 0x80) continue;\n return null;\n }\n\n return opaqueTag;\n}\n\nfunction splitEntityTags(value: string): string[] {\n const tags: string[] = [];\n let start = 0;\n let quoted = false;\n\n for (let index = 0; index < value.length; index++) {\n const character = value[index];\n if (character === '\"') {\n quoted = !quoted;\n } else if (character === \",\" && !quoted) {\n tags.push(value.slice(start, index));\n start = index + 1;\n }\n }\n\n tags.push(value.slice(start));\n return tags;\n}\n\nexport class FarmRequestBodyError extends Error {\n readonly code: FarmRequestBodyErrorCode;\n readonly status: number;\n\n constructor(code: FarmRequestBodyErrorCode, status: number, message: string) {\n super(message);\n this.name = \"FarmRequestBodyError\";\n this.code = code;\n this.status = status;\n }\n}\n\nexport function resolveFarmServerConfig(\n config: FarmServerConfig | ResolvedFarmServerConfig | undefined,\n): ResolvedFarmServerConfig {\n const headersTimeout = parseFarmServerDuration(\n config?.headersTimeout ?? DEFAULT_FARM_SERVER_HEADERS_TIMEOUT,\n \"server.headersTimeout\",\n );\n const requestTimeout = parseFarmServerDuration(\n config?.requestTimeout ?? DEFAULT_FARM_SERVER_REQUEST_TIMEOUT,\n \"server.requestTimeout\",\n );\n if (headersTimeout > requestTimeout) {\n throw new TypeError(\"server.headersTimeout must not exceed server.requestTimeout\");\n }\n\n return Object.freeze({\n bodySizeLimit: parseBodySizeLimit(\n config?.bodySizeLimit ?? DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT,\n \"server.bodySizeLimit\",\n ),\n trustProxy: config?.trustProxy === true,\n headersTimeout,\n requestTimeout,\n keepAliveTimeout: parseFarmServerDuration(\n config?.keepAliveTimeout ?? DEFAULT_FARM_SERVER_KEEP_ALIVE_TIMEOUT,\n \"server.keepAliveTimeout\",\n ),\n gracefulShutdownTimeout: parseFarmServerDuration(\n config?.gracefulShutdownTimeout ?? DEFAULT_FARM_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT,\n \"server.gracefulShutdownTimeout\",\n ),\n health: resolveFarmServerHealthConfig(config?.health),\n });\n}\n\nexport function parseFarmServerDuration(\n value: FarmServerDuration,\n optionName = \"duration\",\n): number {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${optionName} must be a positive safe integer`);\n }\n if (value > MAX_FARM_SERVER_TIMEOUT) {\n throw new TypeError(`${optionName} must not exceed ${MAX_FARM_SERVER_TIMEOUT} milliseconds`);\n }\n return value;\n }\n\n const match = value\n .trim()\n .toLowerCase()\n .match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h)$/);\n if (!match) {\n throw new TypeError(`${optionName} must be milliseconds or a duration such as \"30s\" or \"2m\"`);\n }\n\n const amount = Number(match[1]);\n const unit = match[2];\n const multiplier = unit === \"ms\" ? 1 : unit === \"s\" ? 1_000 : unit === \"m\" ? 60_000 : 3_600_000;\n const milliseconds = Math.floor(amount * multiplier);\n if (!Number.isSafeInteger(milliseconds) || milliseconds <= 0) {\n throw new TypeError(`${optionName} must resolve to a positive safe integer`);\n }\n if (milliseconds > MAX_FARM_SERVER_TIMEOUT) {\n throw new TypeError(`${optionName} must not exceed ${MAX_FARM_SERVER_TIMEOUT} milliseconds`);\n }\n return milliseconds;\n}\n\nfunction resolveFarmServerHealthConfig(\n config: false | FarmServerHealthConfig | ResolvedFarmServerHealthConfig | undefined,\n): ResolvedFarmServerHealthConfig {\n if (config === false || (config && \"enabled\" in config && config.enabled === false)) {\n return Object.freeze({\n enabled: false,\n livenessPath: \"/_farm/health/live\",\n readinessPath: \"/_farm/health/ready\",\n });\n }\n\n const livenessPath = normalizeHealthPath(\n config?.livenessPath ?? \"/_farm/health/live\",\n \"server.health.livenessPath\",\n );\n const readinessPath = normalizeHealthPath(\n config?.readinessPath ?? \"/_farm/health/ready\",\n \"server.health.readinessPath\",\n );\n if (livenessPath === readinessPath) {\n throw new TypeError(\"server.health livenessPath and readinessPath must be different\");\n }\n\n return Object.freeze({ enabled: true, livenessPath, readinessPath });\n}\n\nfunction normalizeHealthPath(value: string, optionName: string): string {\n const path = value.trim();\n if (!path.startsWith(\"/\") || path.includes(\"?\") || path.includes(\"#\") || path.includes(\"*\")) {\n throw new TypeError(`${optionName} must be an absolute pathname without a query or wildcard`);\n }\n const normalized = path.length > 1 ? path.replace(/\\/+$/, \"\") || \"/\" : path;\n assertBrowserStableRoutePath(normalized);\n return normalized;\n}\n\nexport function parseBodySizeLimit(value: number | string, optionName = \"bodySizeLimit\"): number {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${optionName} must be a positive safe integer`);\n }\n return value;\n }\n\n const match = value\n .trim()\n .toLowerCase()\n .match(/^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb|kib|mib|gib)?$/);\n if (!match) {\n throw new TypeError(`${optionName} must be bytes or a size string such as \"500kb\" or \"10mb\"`);\n }\n\n const amount = Number(match[1]);\n const unit = match[2] ?? \"b\";\n const multiplier: Record<string, number> = {\n b: 1,\n kb: 1_000,\n mb: 1_000_000,\n gb: 1_000_000_000,\n kib: 1_024,\n mib: 1_048_576,\n gib: 1_073_741_824,\n };\n const bytes = Math.floor(amount * multiplier[unit]);\n\n if (!Number.isSafeInteger(bytes) || bytes <= 0) {\n throw new TypeError(`${optionName} must resolve to a positive safe integer`);\n }\n\n return bytes;\n}\n\nexport async function bufferFarmRequestBody(request: Request, limit: number): Promise<Request> {\n if (request.method === \"GET\" || request.method === \"HEAD\" || request.body === null) {\n return request;\n }\n\n const bytes = await readFarmRequestBody(request, limit);\n const body = new Uint8Array(bytes.byteLength);\n body.set(bytes);\n return new Request(request, {\n // oxlint-disable-next-line unicorn/no-invalid-fetch-options -- GET and HEAD return above.\n body: body.buffer,\n });\n}\n\nexport async function readFarmRequestBody(request: Request, limit: number): Promise<Uint8Array> {\n try {\n validateContentLength(request.headers.get(\"content-length\"), limit);\n } catch (error) {\n // A cloned Request is a tee branch: its cancellation may wait for the\n // untouched branch. Rejection must not wait for producer-owned cleanup.\n void request.body?.cancel(error).catch(() => {});\n throw error;\n }\n throwIfAborted(request.signal);\n if (!request.body) return new Uint8Array();\n\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n const cancelBodyRead = () => {\n void reader.cancel(request.signal.reason).catch(() => {});\n };\n request.signal.addEventListener(\"abort\", cancelBodyRead, { once: true });\n\n try {\n while (true) {\n throwIfAborted(request.signal);\n const { done, value } = await reader.read();\n // Cancellation resolves a pending read as EOF, not necessarily an error.\n throwIfAborted(request.signal);\n if (done) break;\n if (!value) continue;\n\n total += value.byteLength;\n if (total > limit) {\n const error = new FarmRequestBodyError(\"BODY_TOO_LARGE\", 413, \"Request body is too large\");\n void reader.cancel(error).catch(() => {});\n throw error;\n }\n chunks.push(value);\n }\n } catch (error) {\n if (request.signal.aborted) throwIfAborted(request.signal);\n throw error;\n } finally {\n request.signal.removeEventListener(\"abort\", cancelBodyRead);\n reader.releaseLock();\n }\n\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return body;\n}\n\nexport async function readNodeRequestBody(\n request: {\n headers: Record<string, string | string[] | undefined>;\n on(event: \"data\", listener: (chunk: unknown) => void): unknown;\n on(event: \"end\", listener: () => void): unknown;\n on(event: \"error\", listener: (error: Error) => void): unknown;\n removeListener?(event: string, listener: (...args: any[]) => void): unknown;\n resume?(): unknown;\n },\n limit: number,\n): Promise<Buffer> {\n const rawContentLength = request.headers[\"content-length\"];\n const contentLength = Array.isArray(rawContentLength) ? rawContentLength[0] : rawContentLength;\n try {\n validateContentLength(contentLength, limit);\n } catch (error) {\n request.resume?.();\n throw error;\n }\n\n return await new Promise<Buffer>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let total = 0;\n let settled = false;\n\n const cleanup = () => {\n request.removeListener?.(\"data\", onData);\n request.removeListener?.(\"end\", onEnd);\n request.removeListener?.(\"error\", onError);\n };\n const rejectOnce = (error: Error) => {\n if (settled) return;\n settled = true;\n cleanup();\n request.resume?.();\n reject(error);\n };\n const onData = (chunk: unknown) => {\n const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as any);\n total += bytes.byteLength;\n if (total > limit) {\n rejectOnce(new FarmRequestBodyError(\"BODY_TOO_LARGE\", 413, \"Request body is too large\"));\n return;\n }\n chunks.push(bytes);\n };\n const onEnd = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(Buffer.concat(chunks, total));\n };\n const onError = (error: Error) => rejectOnce(error);\n\n request.on(\"data\", onData);\n request.on(\"end\", onEnd);\n request.on(\"error\", onError);\n });\n}\n\nexport function createFarmRequestBodyErrorResponse(error: unknown): Response | null {\n if (!(error instanceof FarmRequestBodyError)) return null;\n\n return new Response(error.status === 413 ? \"Payload Too Large\" : \"Bad Request\", {\n status: error.status,\n headers: {\n \"cache-control\": \"no-store\",\n \"content-type\": \"text/plain; charset=utf-8\",\n \"x-content-type-options\": \"nosniff\",\n },\n });\n}\n\nfunction validateContentLength(value: string | null | undefined, limit: number): void {\n const contentLength = value?.trim();\n if (!contentLength) return;\n if (!/^\\d+$/.test(contentLength)) {\n throw new FarmRequestBodyError(\"INVALID_CONTENT_LENGTH\", 400, \"Invalid content-length header\");\n }\n if (Number(contentLength) > limit) {\n throw new FarmRequestBodyError(\"BODY_TOO_LARGE\", 413, \"Request body is too large\");\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (!signal.aborted) return;\n if (signal.reason !== undefined) throw signal.reason;\n throw new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n","/**\n * Convert URLSearchParams into the object handed to routes as `search` /\n * `searchParams`: single keys stay strings and repeated keys collect into\n * arrays, in order. The dev renderer, the production SSR entry, the SPA\n * page-data endpoint, and the generated client hydration runtime all share\n * this helper so every environment agrees on one representation.\n */\nexport function searchParamsToObject(\n searchParams: URLSearchParams,\n): Record<string, string | string[] | undefined> {\n const output: Record<string, string | string[] | undefined> = {};\n\n searchParams.forEach((value, key) => {\n // Keys come from the request URL. Writing \"__proto__\" onto a plain object\n // replaces its prototype instead of adding an entry, so a crafted query\n // string could reshape the object handed to pages and workflow handlers.\n // The API route helper (entriesToObject in api/runtime.ts) already skips\n // these names; keep both representations consistent.\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") return;\n const existing = Object.prototype.hasOwnProperty.call(output, key) ? output[key] : undefined;\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n output[key] = [existing, value];\n }\n } else {\n output[key] = value;\n }\n });\n\n return output;\n}\n","/**\n * Environment access that works across the runtimes Farm targets.\n *\n * Serverless and edge runtimes (Cloudflare Workers in particular) expose\n * bindings on `globalThis.__env__` rather than `process.env`, so security\n * checks that read `process.env` directly see an empty value there and can\n * silently take an \"unconfigured\" code path in a deployed environment.\n */\nexport function 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\nexport function readFarmEnvironmentValue(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\n/**\n * True when the process looks like a deployed runtime rather than local\n * development: either NODE_ENV is production, or runtime bindings are present\n * (a deployed worker where NODE_ENV is frequently unset).\n */\nexport function isFarmDeployedRuntime(): boolean {\n if (getFarmRuntimeBindings()) return true;\n return readFarmEnvironmentValue(\"NODE_ENV\") === \"production\";\n}\n","/**\n * Decode a percent-encoded path segment, falling back to the raw value.\n *\n * Request paths are not guaranteed to be validly percent-encoded, so\n * `decodeURIComponent` can throw on input that is still a legal URL: a\n * latin-1 escape such as `caf%E9` from an old link, or a truncated `%ZZ`\n * from a crawler. A malformed segment simply will not match a known route,\n * which is a 404, so it must not throw out of route matching.\n */\nexport function decodeRouteSegment(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n","import type { RouteSegment, ParsedRoute } from \"./types\";\nimport path from \"path\";\nimport {\n assertBrowserStableRoutePath,\n assertTerminalCatchAll,\n assertUniqueRouteParameters,\n} from \"./routing/specificity\";\nimport { searchParamsToObject } from \"./search-params\";\nimport { decodeRouteSegment } from \"./utils/decode\";\n\nexport function parseRoutePath(filePath: string): ParsedRoute {\n const segments: RouteSegment[] = [];\n const normalizedPath = filePath.replace(/\\\\/g, \"/\");\n const pathParts = normalizedPath.split(\"/\").filter(Boolean);\n\n const fileName = pathParts.pop() || \"\";\n const fileType = getRouteType(fileName);\n const routePath = `/${pathParts.join(\"/\")}`;\n assertBrowserStableRoutePath(routePath);\n assertTerminalCatchAll(routePath);\n assertUniqueRouteParameters(routePath);\n\n for (const part of pathParts) {\n // Route groups like `(marketing)` organize files without adding URL\n // segments. Mirrors isRouteGroup in router.ts for programmatic routes.\n if (part.startsWith(\"(\") && part.endsWith(\")\")) continue;\n if (part.startsWith(\"[\") && part.endsWith(\"]\")) {\n let segment = part.slice(1, -1);\n const isDynamic = true;\n let isOptional = false;\n let isCatchAll = false;\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n isOptional = true;\n segment = segment.slice(1, -1);\n if (segment.startsWith(\"...\")) {\n segment = segment.slice(3);\n isCatchAll = true;\n }\n } else if (segment.startsWith(\"...\")) {\n segment = segment.slice(3);\n isCatchAll = true;\n }\n\n segments.push({ segment, isDynamic, isOptional, isCatchAll });\n } else {\n segments.push({\n segment: part,\n isDynamic: false,\n isOptional: false,\n isCatchAll: false,\n });\n }\n }\n\n return {\n segments,\n filePath: normalizedPath,\n type: fileType,\n };\n}\n\nfunction getRouteType(fileName: string): ParsedRoute[\"type\"] {\n const baseName = fileName.replace(/\\.(tsx?|jsx?|vue|svelte|mdx?|markdown)$/, \"\");\n\n switch (baseName) {\n case \"page\":\n return \"page\";\n case \"layout\":\n return \"layout\";\n case \"loading\":\n return \"loading\";\n case \"error\":\n return \"error\";\n case \"not-found\":\n return \"not-found\";\n default:\n return \"page\";\n }\n}\n\nexport function segmentsToPattern(segments: RouteSegment[]): string {\n if (segments.length === 0) return \"/\";\n\n return (\n \"/\" +\n segments\n .map((segment) => {\n if (!segment.isDynamic) return segment.segment;\n\n if (segment.isCatchAll) {\n return segment.isOptional ? `*${segment.segment}?` : `*${segment.segment}`;\n }\n\n return `:${segment.segment}`;\n })\n .join(\"/\")\n );\n}\n\nexport function matchRoute(\n url: string,\n segments: RouteSegment[],\n): { params: Record<string, string>; matches: boolean } {\n const urlParts = url.split(\"/\").filter(Boolean).map(decodeRouteSegment);\n const params: Record<string, string> = {};\n if (segments.length === 0) {\n return { params, matches: urlParts.length === 0 };\n }\n\n let urlIndex = 0;\n let segmentIndex = 0;\n\n while (segmentIndex < segments.length && urlIndex <= urlParts.length) {\n const segment = segments[segmentIndex];\n\n if (!segment.isDynamic) {\n if (urlParts[urlIndex] !== segment.segment) {\n return { params: {}, matches: false };\n }\n urlIndex++;\n segmentIndex++;\n } else if (segment.isCatchAll) {\n const remainingParts = urlParts.slice(urlIndex);\n\n if (remainingParts.length === 0 && !segment.isOptional) {\n return { params: {}, matches: false };\n }\n\n params[segment.segment] = remainingParts.join(\"/\");\n urlIndex = urlParts.length;\n segmentIndex++;\n } else {\n if (urlIndex >= urlParts.length) {\n return { params: {}, matches: false };\n }\n\n params[segment.segment] = urlParts[urlIndex];\n urlIndex++;\n segmentIndex++;\n }\n }\n\n const matches = segmentIndex === segments.length && urlIndex === urlParts.length;\n\n return { params, matches };\n}\n\n/** Match a route segment chain as an owner of the pathname or one of its descendants. */\nexport function matchRoutePrefix(url: string, segments: RouteSegment[]): boolean {\n const urlParts = url.split(\"/\").filter(Boolean).map(decodeRouteSegment);\n let urlIndex = 0;\n\n for (const segment of segments) {\n if (segment.isCatchAll) {\n return segment.isOptional || urlIndex < urlParts.length;\n }\n\n const urlPart = urlParts[urlIndex];\n if (urlPart === undefined) return false;\n if (!segment.isDynamic && segment.segment !== urlPart) return false;\n urlIndex++;\n }\n\n return true;\n}\n\nexport function resolveAppPath(root: string, ...paths: string[]): string {\n return path.resolve(root, ...paths);\n}\n\n/**\n * Convert an absolute module path inside the project root to a root-relative\n * URL path with forward slashes (e.g. `/src/app/page.tsx`), for values the\n * client passes to dynamic `import()`. On Windows the naive root-prefix slice\n * yields `\\src\\app\\page.tsx`, which is not a valid module specifier. Returns\n * undefined for paths outside the root so callers keep their own fallbacks.\n */\nexport function toRootRelativeUrlPath(\n absolutePath: string,\n projectRoot: string,\n): string | undefined {\n if (absolutePath === projectRoot) return \"\";\n if (absolutePath.startsWith(`${projectRoot}/`) || absolutePath.startsWith(`${projectRoot}\\\\`)) {\n return absolutePath.slice(projectRoot.length).replace(/\\\\/g, \"/\");\n }\n return undefined;\n}\n\n/**\n * Normalize a filesystem path to forward slashes. Node's fs accepts these on\n * every platform, and module ids handed to bundlers (e.g. Nitro handler and\n * task entries) must not contain backslashes.\n */\nexport function toPosixPath(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\nexport function toViteModuleId(filePath: string, root: string): string {\n if (!path.isAbsolute(filePath)) return filePath;\n\n const relativePath = path.relative(root, filePath);\n if (relativePath && !relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath)) {\n return `/${relativePath.split(path.sep).join(\"/\")}`;\n }\n\n const normalizedPath = filePath.replace(/\\\\/g, \"/\");\n return normalizedPath.startsWith(\"/\") ? `/@fs${normalizedPath}` : `/@fs/${normalizedPath}`;\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n const fs = await import(\"fs/promises\");\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function globFiles(pattern: string, cwd: string): Promise<string[]> {\n const glob = await import(\"fast-glob\");\n return glob.default(pattern, { cwd, absolute: false });\n}\n\nexport function parseSearchParams(\n searchParams: URLSearchParams,\n): Record<string, string | string[]> {\n return searchParamsToObject(searchParams) as Record<string, string | string[]>;\n}\n\nexport const logger = {\n info: (message: string) => console.log(`[info] ${message}`),\n success: (message: string) => console.log(`[success] ${message}`),\n warn: (message: string) => console.warn(`⚠️ ${message}`),\n error: (message: string) => console.error(`❌ ${message}`),\n ready: (message: string) => console.log(`${message}`),\n event: (message: string) => console.log(` ${message}`),\n};\n","import { localizeFarmHref, resolveFarmLocalePath } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport { assertBrowserStableRoutePath } from \"../routing/specificity\";\n\ntype ConfigRoutePatternToken =\n | { kind: \"param\"; name: string; captureIndex: number; catchAll: boolean }\n | { kind: \"wildcard\"; captureIndex: number };\n\nexport interface CompiledConfigRoutePattern {\n regex: RegExp;\n tokens: ConfigRoutePatternToken[];\n}\n\nexport function validateConfigRouteSource(source: string, field = \"Config route source\"): string {\n if (typeof source !== \"string\" || source.length === 0) {\n throw new TypeError(`${field} must be a non-empty pathname pattern.`);\n }\n if (source.trim() !== source) {\n throw new Error(`${field} cannot contain leading or trailing whitespace.`);\n }\n if (!source.startsWith(\"/\")) {\n throw new Error(`${field} must start with \"/\".`);\n }\n if (source.includes(\"?\") || source.includes(\"#\")) {\n throw new Error(`${field} must be a pathname without a query string or hash.`);\n }\n if (\n source.includes(\"\\\\\") ||\n Array.from(source).some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || (code >= 127 && code <= 159);\n })\n ) {\n throw new Error(`${field} cannot contain backslashes or control characters.`);\n }\n assertBrowserStableRoutePath(source);\n return source;\n}\n\nexport function resolveConfigRoutePathname(\n pathname: string,\n i18n?: ResolvedFarmI18nConfig,\n): { pathname: string; locale?: string } {\n if (!i18n?.enabled) return { pathname };\n const match = resolveFarmLocalePath(pathname, i18n);\n return { pathname: match.pathname, locale: match.locale };\n}\n\nexport function localizeConfigRouteDestination(\n destination: string,\n locale: string | undefined,\n i18n?: ResolvedFarmI18nConfig,\n): string {\n return locale && i18n?.enabled ? localizeFarmHref(destination, locale, i18n) : destination;\n}\n\nfunction escapeRegexCharacter(character: string): string {\n return /[\\\\^$.*+?()[\\]{}|]/.test(character) ? `\\\\${character}` : character;\n}\n\nexport function compileConfigRoutePattern(source: string): CompiledConfigRoutePattern {\n validateConfigRouteSource(source);\n const tokens: ConfigRoutePatternToken[] = [];\n let pattern = \"\";\n let captureIndex = 1;\n\n for (let index = 0; index < source.length; ) {\n const rest = source.slice(index);\n const parameter = rest.match(/^:([A-Za-z0-9_]+)(\\*)?/);\n if (parameter) {\n tokens.push({\n kind: \"param\",\n name: parameter[1],\n captureIndex,\n catchAll: parameter[2] === \"*\",\n });\n pattern += parameter[2] ? \"(.*)\" : \"([^/]+)\";\n captureIndex += 1;\n index += parameter[0].length;\n continue;\n }\n\n if (source[index] === \"*\") {\n tokens.push({ kind: \"wildcard\", captureIndex });\n pattern += \"(.*)\";\n captureIndex += 1;\n index += 1;\n continue;\n }\n\n pattern += escapeRegexCharacter(source[index]);\n index += 1;\n }\n\n return { regex: new RegExp(`^${pattern}$`), tokens };\n}\n\nexport function interpolateConfigRouteDestination(\n destination: string,\n match: RegExpMatchArray,\n tokens: readonly ConfigRoutePatternToken[],\n): string {\n const namedCaptures = new Map<string, string>();\n const wildcardCaptures: string[] = [];\n const captures = new Map<number, string>();\n\n for (const token of tokens) {\n const value = normalizeConfigRouteCapture(\n match[token.captureIndex] || \"\",\n token.kind === \"wildcard\" || token.catchAll,\n );\n captures.set(token.captureIndex, value);\n if (token.kind === \"param\") {\n namedCaptures.set(token.name, value);\n } else {\n wildcardCaptures.push(value);\n }\n }\n\n let result = \"\";\n let wildcardIndex = 0;\n for (let index = 0; index < destination.length; ) {\n const rest = destination.slice(index);\n const parameter = rest.match(/^:([A-Za-z0-9_]+)(\\*)?/);\n if (parameter) {\n const value = namedCaptures.get(parameter[1]);\n result += value === undefined ? parameter[0] : value;\n index += parameter[0].length;\n continue;\n }\n\n const capture = rest.match(/^\\$(\\d+)/);\n if (capture) {\n result += captures.get(Number(capture[1])) ?? \"\";\n index += capture[0].length;\n continue;\n }\n\n if (destination[index] === \"*\") {\n result += wildcardCaptures[wildcardIndex] || \"\";\n wildcardIndex += 1;\n index += 1;\n continue;\n }\n\n result += destination[index];\n index += 1;\n }\n\n return result;\n}\n\nfunction normalizeConfigRouteCapture(value: string, catchAll: boolean): string {\n const segments = catchAll ? value.split(\"/\").filter(Boolean) : [value];\n return segments\n .map((segment) => encodeConfigRouteSegment(decodeConfigRouteSegment(segment)))\n .join(\"/\");\n}\n\nfunction decodeConfigRouteSegment(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n\nfunction encodeConfigRouteSegment(segment: string): string {\n return encodeURIComponent(segment).replace(\n /[!'()*]/g,\n (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n"],"mappings":"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","names":["module","secretError","isAbsolutePath","normalizePath","resolvePath","relativeFilePath","pathSeparator"]}
|
package/dist/workflows.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { D as DEFAULT_FARM_WORKFLOW_DIRS, t as DEFAULT_FARM_WORKFLOW_ROUTE, u as DEFAULT_FARM_WORKFLOW_SECRET_ENV, p as FarmCronDefinition, q as FarmDiscoveredWorkflow, o as FarmWorkflowDefinition, s as FarmWorkflowHTTPHandlerOptions, l as FarmWorkflowLogger, n as FarmWorkflowRunContext, k as FarmWorkflowSchedule, F as FarmWorkflowsResolvedConfig, j as FarmWorkflowsUserConfig, P as PreparedFarmWorkflows, G as applyFarmWorkflowVercelCrons, A as createFarmWorkflowRequestHandler, E as createFarmWorkflowVercelCrons, x as defineCron, w as defineTask, v as defineWorkflow, z as discoverFarmWorkflows, C as prepareFarmWorkflowsForNitro, y as resolveWorkflowsConfig, B as runFarmWorkflowModule } from './workflows-
|
|
1
|
+
export { D as DEFAULT_FARM_WORKFLOW_DIRS, t as DEFAULT_FARM_WORKFLOW_ROUTE, u as DEFAULT_FARM_WORKFLOW_SECRET_ENV, p as FarmCronDefinition, q as FarmDiscoveredWorkflow, o as FarmWorkflowDefinition, s as FarmWorkflowHTTPHandlerOptions, l as FarmWorkflowLogger, n as FarmWorkflowRunContext, k as FarmWorkflowSchedule, F as FarmWorkflowsResolvedConfig, j as FarmWorkflowsUserConfig, P as PreparedFarmWorkflows, G as applyFarmWorkflowVercelCrons, A as createFarmWorkflowRequestHandler, E as createFarmWorkflowVercelCrons, x as defineCron, w as defineTask, v as defineWorkflow, z as discoverFarmWorkflows, C as prepareFarmWorkflowsForNitro, y as resolveWorkflowsConfig, B as runFarmWorkflowModule } from './workflows-BantWytQ.mjs';
|
package/dist/workflows.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { D as DEFAULT_FARM_WORKFLOW_DIRS, t as DEFAULT_FARM_WORKFLOW_ROUTE, u as DEFAULT_FARM_WORKFLOW_SECRET_ENV, p as FarmCronDefinition, q as FarmDiscoveredWorkflow, o as FarmWorkflowDefinition, s as FarmWorkflowHTTPHandlerOptions, l as FarmWorkflowLogger, n as FarmWorkflowRunContext, k as FarmWorkflowSchedule, F as FarmWorkflowsResolvedConfig, j as FarmWorkflowsUserConfig, P as PreparedFarmWorkflows, G as applyFarmWorkflowVercelCrons, A as createFarmWorkflowRequestHandler, E as createFarmWorkflowVercelCrons, x as defineCron, w as defineTask, v as defineWorkflow, z as discoverFarmWorkflows, C as prepareFarmWorkflowsForNitro, y as resolveWorkflowsConfig, B as runFarmWorkflowModule } from './workflows-
|
|
1
|
+
export { D as DEFAULT_FARM_WORKFLOW_DIRS, t as DEFAULT_FARM_WORKFLOW_ROUTE, u as DEFAULT_FARM_WORKFLOW_SECRET_ENV, p as FarmCronDefinition, q as FarmDiscoveredWorkflow, o as FarmWorkflowDefinition, s as FarmWorkflowHTTPHandlerOptions, l as FarmWorkflowLogger, n as FarmWorkflowRunContext, k as FarmWorkflowSchedule, F as FarmWorkflowsResolvedConfig, j as FarmWorkflowsUserConfig, P as PreparedFarmWorkflows, G as applyFarmWorkflowVercelCrons, A as createFarmWorkflowRequestHandler, E as createFarmWorkflowVercelCrons, x as defineCron, w as defineTask, v as defineWorkflow, z as discoverFarmWorkflows, C as prepareFarmWorkflowsForNitro, y as resolveWorkflowsConfig, B as runFarmWorkflowModule } from './workflows-BantWytQ.js';
|
package/dist/workflows.mjs
CHANGED
|
@@ -12,7 +12,8 @@ import {
|
|
|
12
12
|
prepareFarmWorkflowsForNitro,
|
|
13
13
|
resolveWorkflowsConfig,
|
|
14
14
|
runFarmWorkflowModule
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-QQCCBMTH.mjs";
|
|
16
|
+
import "./chunk-RKUPOYQV.mjs";
|
|
16
17
|
import "./chunk-LBRRZEEK.mjs";
|
|
17
18
|
import "./chunk-HAG2HEDU.mjs";
|
|
18
19
|
import "./chunk-35SSRS5K.mjs";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@farm.js/core",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.99",
|
|
4
4
|
"description": "Core Farm.js framework for modern integrated apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"@farm.js/core",
|
|
@@ -588,18 +588,6 @@
|
|
|
588
588
|
"publishConfig": {
|
|
589
589
|
"access": "public"
|
|
590
590
|
},
|
|
591
|
-
"scripts": {
|
|
592
|
-
"build": "tsup",
|
|
593
|
-
"build:runtime": "tsup --config tsup.runtime.config.ts",
|
|
594
|
-
"dev": "tsup --watch",
|
|
595
|
-
"test": "vitest run",
|
|
596
|
-
"test:coverage": "vitest --coverage",
|
|
597
|
-
"lint": "biome lint .",
|
|
598
|
-
"lint:fix": "biome lint --write .",
|
|
599
|
-
"format": "biome format --write .",
|
|
600
|
-
"type-check": "tsc --noEmit",
|
|
601
|
-
"clean": "rm -rf dist"
|
|
602
|
-
},
|
|
603
591
|
"dependencies": {
|
|
604
592
|
"@farming-labs/docs": "^0.2.44",
|
|
605
593
|
"@farming-labs/orm": "0.0.62",
|
|
@@ -636,8 +624,6 @@
|
|
|
636
624
|
},
|
|
637
625
|
"devDependencies": {
|
|
638
626
|
"@clerk/react": "^6.1.0",
|
|
639
|
-
"@farm.js/otel": "workspace:*",
|
|
640
|
-
"@farm.js/renderer-tests": "workspace:*",
|
|
641
627
|
"@opentelemetry/sdk-node": "0.221.0",
|
|
642
628
|
"@opentelemetry/sdk-trace-base": "2.10.0",
|
|
643
629
|
"@types/react": "^18.2.45",
|
|
@@ -648,7 +634,9 @@
|
|
|
648
634
|
"react-dom": "19.2.8",
|
|
649
635
|
"tsup": "^8.3.5",
|
|
650
636
|
"typescript": "^5.3.3",
|
|
651
|
-
"vitest": "^3.2.7"
|
|
637
|
+
"vitest": "^3.2.7",
|
|
638
|
+
"@farm.js/renderer-tests": "0.0.0",
|
|
639
|
+
"@farm.js/otel": "0.1.0-beta.25"
|
|
652
640
|
},
|
|
653
641
|
"peerDependencies": {
|
|
654
642
|
"react": "^18.2.0 || ^19.0.0",
|
|
@@ -669,5 +657,17 @@
|
|
|
669
657
|
},
|
|
670
658
|
"engines": {
|
|
671
659
|
"node": ">=22.13.0"
|
|
660
|
+
},
|
|
661
|
+
"scripts": {
|
|
662
|
+
"build": "tsup",
|
|
663
|
+
"build:runtime": "tsup --config tsup.runtime.config.ts",
|
|
664
|
+
"dev": "tsup --watch",
|
|
665
|
+
"test": "vitest run",
|
|
666
|
+
"test:coverage": "vitest --coverage",
|
|
667
|
+
"lint": "biome lint .",
|
|
668
|
+
"lint:fix": "biome lint --write .",
|
|
669
|
+
"format": "biome format --write .",
|
|
670
|
+
"type-check": "tsc --noEmit",
|
|
671
|
+
"clean": "rm -rf dist"
|
|
672
672
|
}
|
|
673
|
-
}
|
|
673
|
+
}
|