@farm.js/core 0.1.0-beta.1 → 0.1.0-beta.11
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/README.md +1 -1
- package/dist/agent-runtime.d.mts +3 -2
- package/dist/agent-runtime.d.ts +3 -2
- package/dist/api/route-manager.cjs +410 -15
- package/dist/api/route-manager.cjs.map +1 -1
- package/dist/api/route-manager.d.mts +7 -5
- package/dist/api/route-manager.d.ts +7 -5
- package/dist/api/route-manager.mjs +9 -8
- package/dist/api/runtime.cjs +748 -9
- package/dist/api/runtime.cjs.map +1 -1
- package/dist/api/runtime.d.mts +3 -16
- package/dist/api/runtime.d.ts +3 -16
- package/dist/api/runtime.mjs +8 -1
- package/dist/api.cjs +1243 -342
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.mts +8 -150
- package/dist/api.d.ts +8 -150
- package/dist/api.mjs +51 -21
- package/dist/{app-BiX4qb-d.d.mts → app-BNE2FoZ4.d.mts} +42 -5
- package/dist/{app-CFRNJXP1.d.ts → app-DRGUmJ3s.d.ts} +42 -5
- package/dist/app-markdown.cjs +32 -8
- package/dist/app-markdown.cjs.map +1 -1
- package/dist/app-markdown.d.mts +3 -2
- package/dist/app-markdown.d.ts +3 -2
- package/dist/app-markdown.mjs +2 -1
- package/dist/cache.cjs +414 -12
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.d.mts +120 -6
- package/dist/cache.d.ts +120 -6
- package/dist/cache.mjs +11 -3
- package/dist/{chunk-QF4PHCMA.mjs → chunk-2ED5Q2GH.mjs} +3 -3
- package/dist/chunk-2ED5Q2GH.mjs.map +1 -0
- package/dist/{chunk-GZP5W4K3.mjs → chunk-32W4QEJP.mjs} +1 -1
- package/dist/chunk-32W4QEJP.mjs.map +1 -0
- package/dist/{chunk-G3B5BRDY.mjs → chunk-4677KXB7.mjs} +646 -86
- package/dist/chunk-4677KXB7.mjs.map +1 -0
- package/dist/{chunk-3QJO55ZF.mjs → chunk-4LND3PXF.mjs} +30 -38
- package/dist/chunk-4LND3PXF.mjs.map +1 -0
- package/dist/chunk-5EVQFRL2.mjs +10 -0
- package/dist/chunk-5EVQFRL2.mjs.map +1 -0
- package/dist/{chunk-25D7G34K.mjs → chunk-65A7QIKI.mjs} +5 -5
- package/dist/{chunk-25D7G34K.mjs.map → chunk-65A7QIKI.mjs.map} +1 -1
- package/dist/{chunk-CHFHNEMO.mjs → chunk-77BOAQHI.mjs} +1972 -188
- package/dist/chunk-77BOAQHI.mjs.map +1 -0
- package/dist/{chunk-LLC7BNXW.mjs → chunk-7FBJLMQH.mjs} +73 -10
- package/dist/chunk-7FBJLMQH.mjs.map +1 -0
- package/dist/{chunk-TRORP7E4.mjs → chunk-7N62DNSO.mjs} +2 -2
- package/dist/chunk-ALCLXXTY.mjs +187 -0
- package/dist/chunk-ALCLXXTY.mjs.map +1 -0
- package/dist/chunk-AW6I64AP.mjs +25 -0
- package/dist/chunk-AW6I64AP.mjs.map +1 -0
- package/dist/{chunk-B6N4ZB2H.mjs → chunk-C2ROET2V.mjs} +3 -3
- package/dist/{chunk-BHG3LVHH.mjs → chunk-CGIXMLSY.mjs} +15 -7
- package/dist/chunk-CGIXMLSY.mjs.map +1 -0
- package/dist/{chunk-C3DLZMBU.mjs → chunk-DJSGLHCN.mjs} +2 -2
- package/dist/{chunk-JN3UU635.mjs → chunk-EJ7T4TPB.mjs} +2 -2
- package/dist/chunk-EJ7T4TPB.mjs.map +1 -0
- package/dist/{chunk-ZJQNATYV.mjs → chunk-FRPWCMMG.mjs} +3 -3
- package/dist/chunk-FRPWCMMG.mjs.map +1 -0
- package/dist/{chunk-QM6VV26B.mjs → chunk-GQVGIUSN.mjs} +3 -3
- package/dist/{chunk-QM6VV26B.mjs.map → chunk-GQVGIUSN.mjs.map} +1 -1
- package/dist/{chunk-UREJA4GZ.mjs → chunk-GXASWWJU.mjs} +1 -1
- package/dist/{chunk-UREJA4GZ.mjs.map → chunk-GXASWWJU.mjs.map} +1 -1
- package/dist/chunk-I4CUBGVF.mjs +93 -0
- package/dist/chunk-I4CUBGVF.mjs.map +1 -0
- package/dist/{chunk-HXP3ZSPC.mjs → chunk-J5YWQVI5.mjs} +4 -4
- package/dist/chunk-J5YWQVI5.mjs.map +1 -0
- package/dist/{chunk-PRNYWD7K.mjs → chunk-JDEOUK5V.mjs} +67 -239
- package/dist/chunk-JDEOUK5V.mjs.map +1 -0
- package/dist/{chunk-UHE2TTLK.mjs → chunk-K5ZTUF22.mjs} +34 -17
- package/dist/chunk-K5ZTUF22.mjs.map +1 -0
- package/dist/{chunk-O3HADRW6.mjs → chunk-MIUW47JX.mjs} +2 -2
- package/dist/{chunk-O3HADRW6.mjs.map → chunk-MIUW47JX.mjs.map} +1 -1
- package/dist/chunk-PFE6GMNE.mjs +603 -0
- package/dist/chunk-PFE6GMNE.mjs.map +1 -0
- package/dist/{chunk-RKI6TN3A.mjs → chunk-QM746KUO.mjs} +9 -2
- package/dist/chunk-QM746KUO.mjs.map +1 -0
- package/dist/{chunk-TU4YJICB.mjs → chunk-QTZZ2ISQ.mjs} +41 -16
- package/dist/chunk-QTZZ2ISQ.mjs.map +1 -0
- package/dist/chunk-RBRLLZL5.mjs +81 -0
- package/dist/chunk-RBRLLZL5.mjs.map +1 -0
- package/dist/{chunk-RSKVYESE.mjs → chunk-RQ633A5I.mjs} +1 -1
- package/dist/chunk-RQ633A5I.mjs.map +1 -0
- package/dist/{chunk-6XDUHOEM.mjs → chunk-TQAEEJB4.mjs} +3 -3
- package/dist/{chunk-AGS7UJ52.mjs → chunk-UB5UOSHB.mjs} +24 -12
- package/dist/chunk-UB5UOSHB.mjs.map +1 -0
- package/dist/{chunk-SXZTEK3V.mjs → chunk-UXUAWNO5.mjs} +2 -2
- package/dist/chunk-V3XURYJO.mjs +756 -0
- package/dist/chunk-V3XURYJO.mjs.map +1 -0
- package/dist/{chunk-JLWMCADZ.mjs → chunk-VY2UYN5R.mjs} +24 -4
- package/dist/chunk-VY2UYN5R.mjs.map +1 -0
- package/dist/{chunk-QFQRHRZS.mjs → chunk-W2CRQFF6.mjs} +151 -23
- package/dist/chunk-W2CRQFF6.mjs.map +1 -0
- package/dist/{chunk-Y7A27276.mjs → chunk-WDU6QXNK.mjs} +349 -15
- package/dist/chunk-WDU6QXNK.mjs.map +1 -0
- package/dist/{chunk-Y2OJJD7R.mjs → chunk-XIVV5IWN.mjs} +7 -9
- package/dist/chunk-XIVV5IWN.mjs.map +1 -0
- package/dist/{chunk-OYXO65LI.mjs → chunk-YW7OBE6Q.mjs} +4 -4
- package/dist/chunk-YW7OBE6Q.mjs.map +1 -0
- package/dist/{chunk-YHU7SS6L.mjs → chunk-Z5CQMP54.mjs} +11 -11
- package/dist/{chunk-S2XHZS7W.mjs → chunk-ZVWA4ZQ3.mjs} +18 -9
- package/dist/chunk-ZVWA4ZQ3.mjs.map +1 -0
- package/dist/{chunk-SOU3Q3ZA.mjs → chunk-ZZ57EH5Z.mjs} +1 -1
- package/dist/chunk-ZZ57EH5Z.mjs.map +1 -0
- package/dist/{client-D_yUjVhe.d.mts → client-BT1mFQas.d.mts} +55 -10
- package/dist/{client-Dkc03WP8.d.ts → client-Nn0q4eO4.d.ts} +55 -10
- package/dist/{client-plugins-BZnpeTGA.d.ts → client-plugins-Bc5jHcNr.d.ts} +85 -6
- package/dist/{client-plugins-g4bzuCmo.d.mts → client-plugins-jsk-ZLzJ.d.mts} +85 -6
- package/dist/client-plugins.d.mts +3 -2
- package/dist/client-plugins.d.ts +3 -2
- package/dist/client.cjs +922 -91
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.mts +124 -6
- package/dist/client.d.ts +124 -6
- package/dist/client.mjs +23 -16
- package/dist/config.d.mts +3 -2
- package/dist/config.d.ts +3 -2
- package/dist/cron.cjs.map +1 -1
- package/dist/cron.mjs +1 -1
- package/dist/{devtools-AE4RVXCM.mjs → devtools-A22KUJZT.mjs} +13 -12
- package/dist/{devtools-AE4RVXCM.mjs.map → devtools-A22KUJZT.mjs.map} +1 -1
- package/dist/{devtools-client-6WPY2AQU.mjs → devtools-client-3XRTBND5.mjs} +2 -11
- package/dist/devtools-client-3XRTBND5.mjs.map +1 -0
- package/dist/docs.cjs +65 -58
- package/dist/docs.cjs.map +1 -1
- package/dist/docs.mjs +13 -12
- package/dist/env-types.cjs +14 -5
- package/dist/env-types.cjs.map +1 -1
- package/dist/env-types.d.mts +2 -1
- package/dist/env-types.d.ts +2 -1
- package/dist/env-types.mjs +3 -1
- package/dist/env.cjs.map +1 -1
- package/dist/env.d.mts +1 -1
- package/dist/env.d.ts +1 -1
- package/dist/env.mjs +1 -1
- package/dist/font.cjs +47 -0
- package/dist/font.cjs.map +1 -0
- package/dist/font.d.mts +70 -0
- package/dist/font.d.ts +70 -0
- package/dist/font.mjs +10 -0
- package/dist/font.mjs.map +1 -0
- package/dist/i18n/client.d.mts +2 -2
- package/dist/i18n/client.d.ts +2 -2
- package/dist/i18n/index.d.mts +3 -3
- package/dist/i18n/index.d.ts +3 -3
- package/dist/i18n/server.cjs +2 -2
- package/dist/i18n/server.cjs.map +1 -1
- package/dist/i18n/server.d.mts +5 -5
- package/dist/i18n/server.d.ts +5 -5
- package/dist/i18n/server.mjs +1 -1
- package/dist/index.cjs +5016 -1108
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +23 -19
- package/dist/index.d.ts +23 -19
- package/dist/index.mjs +177 -121
- package/dist/index.mjs.map +1 -1
- package/dist/integrations.d.mts +3 -2
- package/dist/integrations.d.ts +3 -2
- package/dist/internal/build-runtime.cjs +3504 -581
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.d.mts +5 -4
- package/dist/internal/build-runtime.d.ts +5 -4
- package/dist/internal/build-runtime.mjs +32 -29
- package/dist/internal/client-runtime.cjs.map +1 -1
- package/dist/internal/client-runtime.mjs +1 -1
- package/dist/internal/config-runtime.cjs +148 -41
- package/dist/internal/config-runtime.cjs.map +1 -1
- package/dist/internal/config-runtime.d.mts +4 -3
- package/dist/internal/config-runtime.d.ts +4 -3
- package/dist/internal/config-runtime.mjs +12 -11
- package/dist/internal/production-runtime.cjs +300 -9
- package/dist/internal/production-runtime.cjs.map +1 -1
- package/dist/internal/production-runtime.d.mts +10 -8
- package/dist/internal/production-runtime.d.ts +10 -8
- package/dist/internal/production-runtime.mjs +27 -9
- package/dist/internal/production-runtime.mjs.map +1 -1
- package/dist/markdown.cjs +73 -8
- package/dist/markdown.cjs.map +1 -1
- package/dist/markdown.d.mts +19 -2
- package/dist/markdown.d.ts +19 -2
- package/dist/markdown.mjs +5 -1
- package/dist/{metadata-C9NZxMDW.d.mts → metadata-7ffpT3jr.d.mts} +1 -1
- package/dist/{metadata-DAXRaOHx.d.ts → metadata-JHn-8eht.d.ts} +1 -1
- package/dist/middleware.cjs +2 -2
- package/dist/middleware.cjs.map +1 -1
- package/dist/middleware.d.mts +5 -4
- package/dist/middleware.d.ts +5 -4
- package/dist/middleware.mjs +3 -3
- package/dist/navigation.cjs +40 -15
- package/dist/navigation.cjs.map +1 -1
- package/dist/navigation.mjs +3 -3
- package/dist/{nitro-KME62MWG.mjs → nitro-QO5LV6QK.mjs} +11 -13
- package/dist/{nitro-KME62MWG.mjs.map → nitro-QO5LV6QK.mjs.map} +1 -1
- package/dist/plugin.cjs +2854 -590
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.mts +3 -2
- package/dist/plugin.d.ts +3 -2
- package/dist/plugin.mjs +28 -25
- package/dist/{production-runtime-DRkCHUvJ.d.ts → production-runtime-9KG7GuvW.d.ts} +2 -2
- package/dist/{production-runtime-flrjp_nC.d.mts → production-runtime-B-fweKts.d.mts} +2 -2
- package/dist/{request-BrFBuc8G.d.mts → request-Dsq4kGW0.d.mts} +1 -1
- package/dist/{request-BslSZIRz.d.ts → request-udtobOLv.d.ts} +1 -1
- package/dist/request.d.mts +2 -2
- package/dist/request.d.ts +2 -2
- package/dist/{resolver-DlOPpjkB.d.mts → resolver-DJqjLMg_.d.mts} +1 -1
- package/dist/{resolver-C6iecsDV.d.ts → resolver-IH4RmPEl.d.ts} +1 -1
- package/dist/routes.cjs +276 -6
- package/dist/routes.cjs.map +1 -1
- package/dist/routes.d.mts +2 -2
- package/dist/routes.d.ts +2 -2
- package/dist/routes.mjs +4 -4
- package/dist/runtime-9nQjVM7X.d.mts +206 -0
- package/dist/{runtime-DeAAZ6gO.d.mts → runtime-Cxpq6xZN.d.mts} +2 -2
- package/dist/runtime-DgeS2skB.d.ts +206 -0
- package/dist/{runtime-B6GvwDS1.d.ts → runtime-bv63eUiO.d.ts} +2 -2
- package/dist/server-action-security.cjs +28 -10
- package/dist/server-action-security.cjs.map +1 -1
- package/dist/server-action-security.d.mts +2 -1
- package/dist/server-action-security.d.ts +2 -1
- package/dist/server-action-security.mjs +2 -2
- package/dist/server-fn-client.cjs.map +1 -1
- package/dist/server-fn-client.d.mts +1 -0
- package/dist/server-fn-client.d.ts +1 -0
- package/dist/server-fn-client.mjs +1 -1
- package/dist/server-fn.cjs +785 -3
- package/dist/server-fn.cjs.map +1 -1
- package/dist/server-fn.d.mts +10 -1
- package/dist/server-fn.d.ts +10 -1
- package/dist/server-fn.mjs +6 -3
- package/dist/server-plugins.d.mts +4 -3
- package/dist/server-plugins.d.ts +4 -3
- package/dist/server-query-client.cjs +279 -8
- package/dist/server-query-client.cjs.map +1 -1
- package/dist/server-query-client.mjs +4 -4
- package/dist/server-query.cjs +381 -10
- package/dist/server-query.cjs.map +1 -1
- package/dist/server-query.mjs +5 -5
- package/dist/server.cjs +3319 -841
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.mts +12 -11
- package/dist/server.d.ts +12 -11
- package/dist/server.mjs +57 -36
- package/dist/server.mjs.map +1 -1
- package/dist/testing.cjs +436 -25
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.mts +5 -4
- package/dist/testing.d.ts +5 -4
- package/dist/testing.mjs +19 -18
- package/dist/testing.mjs.map +1 -1
- package/dist/transport-BmbGTXA5.d.mts +49 -0
- package/dist/transport-BmbGTXA5.d.ts +49 -0
- package/dist/{types-BH1lhg5G.d.ts → types-BMxWr97v.d.mts} +2 -2
- package/dist/{types-BH1lhg5G.d.mts → types-BMxWr97v.d.ts} +2 -2
- package/dist/{utils-DA1yo54_.d.ts → utils-CA0z0c-2.d.ts} +1 -1
- package/dist/{utils-DOXXivjL.d.mts → utils-mYVkSOt2.d.mts} +1 -1
- package/dist/version.cjs +36 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.mts +3 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.mjs +8 -0
- package/dist/version.mjs.map +1 -0
- package/dist/vite.cjs +2938 -668
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.mts +3 -2
- package/dist/vite.d.ts +3 -2
- package/dist/vite.mjs +26 -23
- package/dist/workflows.cjs +6 -8
- package/dist/workflows.cjs.map +1 -1
- package/dist/workflows.mjs +1 -1
- package/package.json +22 -6
- package/types/api.d.ts +44 -0
- package/types/client.d.ts +221 -17
- package/types/image.d.ts +4 -0
- package/types/images.d.ts +59 -0
- package/dist/chunk-3QJO55ZF.mjs.map +0 -1
- package/dist/chunk-4PTK6KT4.mjs +0 -364
- package/dist/chunk-4PTK6KT4.mjs.map +0 -1
- package/dist/chunk-AGS7UJ52.mjs.map +0 -1
- package/dist/chunk-BHG3LVHH.mjs.map +0 -1
- package/dist/chunk-CHFHNEMO.mjs.map +0 -1
- package/dist/chunk-EVGBEZDF.mjs +0 -215
- package/dist/chunk-EVGBEZDF.mjs.map +0 -1
- package/dist/chunk-G3B5BRDY.mjs.map +0 -1
- package/dist/chunk-GZP5W4K3.mjs.map +0 -1
- package/dist/chunk-HXP3ZSPC.mjs.map +0 -1
- package/dist/chunk-JLWMCADZ.mjs.map +0 -1
- package/dist/chunk-JN3UU635.mjs.map +0 -1
- package/dist/chunk-LLC7BNXW.mjs.map +0 -1
- package/dist/chunk-OYXO65LI.mjs.map +0 -1
- package/dist/chunk-PRNYWD7K.mjs.map +0 -1
- package/dist/chunk-QF4PHCMA.mjs.map +0 -1
- package/dist/chunk-QFQRHRZS.mjs.map +0 -1
- package/dist/chunk-RKI6TN3A.mjs.map +0 -1
- package/dist/chunk-RSKVYESE.mjs.map +0 -1
- package/dist/chunk-S2XHZS7W.mjs.map +0 -1
- package/dist/chunk-SOU3Q3ZA.mjs.map +0 -1
- package/dist/chunk-TU4YJICB.mjs.map +0 -1
- package/dist/chunk-TXCFGOHW.mjs +0 -42
- package/dist/chunk-TXCFGOHW.mjs.map +0 -1
- package/dist/chunk-UHE2TTLK.mjs.map +0 -1
- package/dist/chunk-Y2OJJD7R.mjs.map +0 -1
- package/dist/chunk-Y7A27276.mjs.map +0 -1
- package/dist/chunk-ZJQNATYV.mjs.map +0 -1
- package/dist/devtools-client-6WPY2AQU.mjs.map +0 -1
- /package/dist/{chunk-TRORP7E4.mjs.map → chunk-7N62DNSO.mjs.map} +0 -0
- /package/dist/{chunk-B6N4ZB2H.mjs.map → chunk-C2ROET2V.mjs.map} +0 -0
- /package/dist/{chunk-C3DLZMBU.mjs.map → chunk-DJSGLHCN.mjs.map} +0 -0
- /package/dist/{chunk-6XDUHOEM.mjs.map → chunk-TQAEEJB4.mjs.map} +0 -0
- /package/dist/{chunk-SXZTEK3V.mjs.map → chunk-UXUAWNO5.mjs.map} +0 -0
- /package/dist/{chunk-YHU7SS6L.mjs.map → chunk-Z5CQMP54.mjs.map} +0 -0
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
|
|
5
5
|
// src/markdown.ts
|
|
6
6
|
function resolveMarkdownConfig(config) {
|
|
7
|
-
if (config === false
|
|
7
|
+
if (config === false) {
|
|
8
8
|
return {
|
|
9
9
|
enabled: false,
|
|
10
10
|
expose: [],
|
|
@@ -12,7 +12,7 @@ function resolveMarkdownConfig(config) {
|
|
|
12
12
|
includeMetadata: true
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
|
-
if (config === true) {
|
|
15
|
+
if (config === true || config === void 0) {
|
|
16
16
|
return {
|
|
17
17
|
enabled: true,
|
|
18
18
|
expose: true,
|
|
@@ -20,7 +20,7 @@ function resolveMarkdownConfig(config) {
|
|
|
20
20
|
includeMetadata: true
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
|
-
const exposeInput = config.expose ?? config.routes ??
|
|
23
|
+
const exposeInput = config.expose ?? config.routes ?? true;
|
|
24
24
|
const expose = exposeInput === true ? true : Array.isArray(exposeInput) ? exposeInput.map(normalizeMarkdownRouteInput) : [];
|
|
25
25
|
return {
|
|
26
26
|
enabled: config.enabled !== false && (expose === true || expose.length > 0),
|
|
@@ -30,11 +30,14 @@ function resolveMarkdownConfig(config) {
|
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
__name(resolveMarkdownConfig, "resolveMarkdownConfig");
|
|
33
|
-
function resolveMarkdownMirrorTarget(config, pathname) {
|
|
34
|
-
|
|
33
|
+
function resolveMarkdownMirrorTarget(config, pathname, options = {}) {
|
|
34
|
+
const hasMarkdownExtension = pathname.toLowerCase().endsWith(".md");
|
|
35
|
+
if (!config?.enabled || !hasMarkdownExtension && !requestAcceptsMarkdown(options.accept)) {
|
|
35
36
|
return null;
|
|
36
37
|
}
|
|
37
|
-
const targetPathname = normalizeMarkdownRoute(
|
|
38
|
+
const targetPathname = normalizeMarkdownRoute(
|
|
39
|
+
hasMarkdownExtension ? pathname.slice(0, -".md".length) || "/" : pathname
|
|
40
|
+
);
|
|
38
41
|
const route = findExposedMarkdownRoute(config, targetPathname);
|
|
39
42
|
if (!route && config.expose !== true) {
|
|
40
43
|
return null;
|
|
@@ -50,7 +53,10 @@ async function createMarkdownMirrorResponse(options) {
|
|
|
50
53
|
return null;
|
|
51
54
|
}
|
|
52
55
|
const requestUrl = new URL(options.request.url);
|
|
53
|
-
const
|
|
56
|
+
const hasMarkdownExtension = requestUrl.pathname.toLowerCase().endsWith(".md");
|
|
57
|
+
const target = resolveMarkdownMirrorTarget(options.config, requestUrl.pathname, {
|
|
58
|
+
accept: options.request.headers.get("accept")
|
|
59
|
+
});
|
|
54
60
|
if (!target) {
|
|
55
61
|
return null;
|
|
56
62
|
}
|
|
@@ -78,8 +84,12 @@ async function createMarkdownMirrorResponse(options) {
|
|
|
78
84
|
});
|
|
79
85
|
const headersOut = new Headers({
|
|
80
86
|
"Content-Type": "text/markdown; charset=utf-8",
|
|
87
|
+
"Content-Location": target.pathname === "/" ? "/index.md" : `${target.pathname}.md`,
|
|
81
88
|
"X-Farm-Markdown-Route": target.pathname
|
|
82
89
|
});
|
|
90
|
+
if (!hasMarkdownExtension) {
|
|
91
|
+
headersOut.set("Vary", "Accept");
|
|
92
|
+
}
|
|
83
93
|
const cache = target.route?.cache ?? options.config?.cache ?? false;
|
|
84
94
|
headersOut.set("Cache-Control", createMarkdownCacheHeader(cache));
|
|
85
95
|
return new Response(options.request.method === "HEAD" ? null : markdown, {
|
|
@@ -88,6 +98,27 @@ async function createMarkdownMirrorResponse(options) {
|
|
|
88
98
|
});
|
|
89
99
|
}
|
|
90
100
|
__name(createMarkdownMirrorResponse, "createMarkdownMirrorResponse");
|
|
101
|
+
function applyMarkdownNegotiationHeaders(response, options) {
|
|
102
|
+
if (!isHtmlResponse(response)) {
|
|
103
|
+
return response;
|
|
104
|
+
}
|
|
105
|
+
const target = resolveMarkdownMirrorTarget(options.config, options.pathname, {
|
|
106
|
+
accept: "text/markdown"
|
|
107
|
+
});
|
|
108
|
+
if (!target) {
|
|
109
|
+
return response;
|
|
110
|
+
}
|
|
111
|
+
const alternatePath = getMarkdownAlternatePath(target.pathname);
|
|
112
|
+
const headers = new Headers(response.headers);
|
|
113
|
+
appendHeaderToken(headers, "Vary", "Accept");
|
|
114
|
+
headers.append("Link", `<${alternatePath}>; rel="alternate"; type="text/markdown"`);
|
|
115
|
+
return new Response(response.body, {
|
|
116
|
+
status: response.status,
|
|
117
|
+
statusText: response.statusText,
|
|
118
|
+
headers
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
__name(applyMarkdownNegotiationHeaders, "applyMarkdownNegotiationHeaders");
|
|
91
122
|
function htmlToMarkdown(html, options = {}) {
|
|
92
123
|
const title = options.title ?? extractHtmlTitle(html);
|
|
93
124
|
let source = extractHtmlBody(html).replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, "").replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi, "").replace(/<noscript\b[^>]*>[\s\S]*?<\/noscript>/gi, "").replace(/<!--[\s\S]*?-->/g, "");
|
|
@@ -168,12 +199,42 @@ function normalizeMarkdownRouteInput(input) {
|
|
|
168
199
|
}
|
|
169
200
|
__name(normalizeMarkdownRouteInput, "normalizeMarkdownRouteInput");
|
|
170
201
|
function normalizeMarkdownRoute(route) {
|
|
171
|
-
const withoutMarkdownExtension = route.endsWith(".md") ? route.slice(0, -3) : route;
|
|
202
|
+
const withoutMarkdownExtension = route.toLowerCase().endsWith(".md") ? route.slice(0, -3) : route;
|
|
172
203
|
const withSlash = withoutMarkdownExtension.startsWith("/") ? withoutMarkdownExtension : `/${withoutMarkdownExtension}`;
|
|
173
204
|
const normalized = withSlash.replace(/\/+/g, "/").replace(/\/$/g, "");
|
|
174
205
|
return normalized === "" || normalized === "/index" ? "/" : normalized;
|
|
175
206
|
}
|
|
176
207
|
__name(normalizeMarkdownRoute, "normalizeMarkdownRoute");
|
|
208
|
+
function requestAcceptsMarkdown(accept) {
|
|
209
|
+
if (!accept) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return accept.split(",").some((entry) => {
|
|
213
|
+
const [mediaType, ...parameters] = entry.trim().toLowerCase().split(";").map((part) => part.trim());
|
|
214
|
+
if (mediaType !== "text/markdown") {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
const quality = parameters.find((parameter) => parameter.startsWith("q="));
|
|
218
|
+
return quality === void 0 || Number(quality.slice(2)) > 0;
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
__name(requestAcceptsMarkdown, "requestAcceptsMarkdown");
|
|
222
|
+
function getMarkdownAlternatePath(pathname) {
|
|
223
|
+
return pathname === "/" ? "/index.md" : `${pathname}.md`;
|
|
224
|
+
}
|
|
225
|
+
__name(getMarkdownAlternatePath, "getMarkdownAlternatePath");
|
|
226
|
+
function appendHeaderToken(headers, name, token) {
|
|
227
|
+
const current = headers.get(name);
|
|
228
|
+
if (!current) {
|
|
229
|
+
headers.set(name, token);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const tokens = current.split(",").map((value) => value.trim().toLowerCase());
|
|
233
|
+
if (!tokens.includes(token.toLowerCase())) {
|
|
234
|
+
headers.set(name, `${current}, ${token}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
__name(appendHeaderToken, "appendHeaderToken");
|
|
177
238
|
function findExposedMarkdownRoute(config, pathname) {
|
|
178
239
|
if (config.expose === true) {
|
|
179
240
|
return null;
|
|
@@ -270,6 +331,8 @@ export {
|
|
|
270
331
|
resolveMarkdownConfig,
|
|
271
332
|
resolveMarkdownMirrorTarget,
|
|
272
333
|
createMarkdownMirrorResponse,
|
|
273
|
-
|
|
334
|
+
applyMarkdownNegotiationHeaders,
|
|
335
|
+
htmlToMarkdown,
|
|
336
|
+
requestAcceptsMarkdown
|
|
274
337
|
};
|
|
275
|
-
//# sourceMappingURL=chunk-
|
|
338
|
+
//# sourceMappingURL=chunk-7FBJLMQH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/markdown.ts"],"sourcesContent":["export type FarmMarkdownRouteInput =\n | string\n | {\n route: string;\n title?: string;\n cache?: number | false;\n };\n\nexport interface FarmMarkdownUserConfig {\n /**\n * Enable generated markdown representations for React pages.\n * @default true\n */\n enabled?: boolean;\n /**\n * Routes that may expose generated markdown. Every page is exposed by default.\n */\n expose?: boolean | FarmMarkdownRouteInput[];\n /** @deprecated Use `expose`. */\n routes?: FarmMarkdownRouteInput[];\n cache?: number | false;\n includeMetadata?: boolean;\n}\n\nexport interface FarmMarkdownResolvedRoute {\n route: string;\n title?: string;\n cache?: number | false;\n}\n\nexport interface FarmMarkdownResolvedConfig {\n enabled: boolean;\n expose: true | FarmMarkdownResolvedRoute[];\n cache: number | false;\n includeMetadata: boolean;\n}\n\nexport interface FarmMarkdownMirrorTarget {\n pathname: string;\n route: FarmMarkdownResolvedRoute | null;\n}\n\nexport interface ResolveMarkdownMirrorTargetOptions {\n accept?: string | null;\n}\n\nexport interface CreateMarkdownMirrorResponseOptions {\n request: Request;\n config?: FarmMarkdownResolvedConfig;\n routeExists?: (pathname: string) => boolean;\n renderPage: (request: Request) => Response | Promise<Response>;\n}\n\nexport interface ApplyMarkdownNegotiationHeadersOptions {\n config?: FarmMarkdownResolvedConfig;\n pathname: string;\n}\n\nexport function resolveMarkdownConfig(\n config: FarmMarkdownUserConfig | boolean | undefined,\n): FarmMarkdownResolvedConfig {\n if (config === false) {\n return {\n enabled: false,\n expose: [],\n cache: false,\n includeMetadata: true,\n };\n }\n\n if (config === true || config === undefined) {\n return {\n enabled: true,\n expose: true,\n cache: false,\n includeMetadata: true,\n };\n }\n\n const exposeInput = config.expose ?? config.routes ?? true;\n const expose =\n exposeInput === true\n ? true\n : Array.isArray(exposeInput)\n ? exposeInput.map(normalizeMarkdownRouteInput)\n : [];\n\n return {\n enabled: config.enabled !== false && (expose === true || expose.length > 0),\n expose,\n cache: config.cache ?? false,\n includeMetadata: config.includeMetadata ?? true,\n };\n}\n\nexport function resolveMarkdownMirrorTarget(\n config: FarmMarkdownResolvedConfig | undefined,\n pathname: string,\n options: ResolveMarkdownMirrorTargetOptions = {},\n): FarmMarkdownMirrorTarget | null {\n const hasMarkdownExtension = pathname.toLowerCase().endsWith(\".md\");\n if (!config?.enabled || (!hasMarkdownExtension && !requestAcceptsMarkdown(options.accept))) {\n return null;\n }\n\n const targetPathname = normalizeMarkdownRoute(\n hasMarkdownExtension ? pathname.slice(0, -\".md\".length) || \"/\" : pathname,\n );\n const route = findExposedMarkdownRoute(config, targetPathname);\n if (!route && config.expose !== true) {\n return null;\n }\n\n return {\n pathname: targetPathname,\n route,\n };\n}\n\nexport async function createMarkdownMirrorResponse(\n options: CreateMarkdownMirrorResponseOptions,\n): Promise<Response | null> {\n if (options.request.method !== \"GET\" && options.request.method !== \"HEAD\") {\n return null;\n }\n\n const requestUrl = new URL(options.request.url);\n const hasMarkdownExtension = requestUrl.pathname.toLowerCase().endsWith(\".md\");\n const target = resolveMarkdownMirrorTarget(options.config, requestUrl.pathname, {\n accept: options.request.headers.get(\"accept\"),\n });\n if (!target) {\n return null;\n }\n\n if (options.routeExists && !options.routeExists(target.pathname)) {\n return null;\n }\n\n const pageUrl = new URL(options.request.url);\n pageUrl.pathname = target.pathname;\n const headers = new Headers(options.request.headers);\n headers.set(\"accept\", \"text/html\");\n\n const pageResponse = await options.renderPage(\n new Request(pageUrl, {\n method: \"GET\",\n headers,\n }),\n );\n\n if (!isHtmlResponse(pageResponse)) {\n return null;\n }\n\n const html = await pageResponse.text();\n const markdown = htmlToMarkdown(html, {\n title: target.route?.title,\n includeMetadata: options.config?.includeMetadata ?? true,\n sourcePath: target.pathname,\n });\n const headersOut = new Headers({\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n \"Content-Location\": target.pathname === \"/\" ? \"/index.md\" : `${target.pathname}.md`,\n \"X-Farm-Markdown-Route\": target.pathname,\n });\n if (!hasMarkdownExtension) {\n headersOut.set(\"Vary\", \"Accept\");\n }\n const cache = target.route?.cache ?? options.config?.cache ?? false;\n headersOut.set(\"Cache-Control\", createMarkdownCacheHeader(cache));\n\n return new Response(options.request.method === \"HEAD\" ? null : markdown, {\n status: pageResponse.status,\n headers: headersOut,\n });\n}\n\nexport function applyMarkdownNegotiationHeaders(\n response: Response,\n options: ApplyMarkdownNegotiationHeadersOptions,\n): Response {\n if (!isHtmlResponse(response)) {\n return response;\n }\n\n const target = resolveMarkdownMirrorTarget(options.config, options.pathname, {\n accept: \"text/markdown\",\n });\n if (!target) {\n return response;\n }\n\n const alternatePath = getMarkdownAlternatePath(target.pathname);\n const headers = new Headers(response.headers);\n appendHeaderToken(headers, \"Vary\", \"Accept\");\n headers.append(\"Link\", `<${alternatePath}>; rel=\"alternate\"; type=\"text/markdown\"`);\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nexport function htmlToMarkdown(\n html: string,\n options: {\n title?: string;\n sourcePath?: string;\n includeMetadata?: boolean;\n } = {},\n): string {\n const title = options.title ?? extractHtmlTitle(html);\n let source = extractHtmlBody(html)\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \"\")\n .replace(/<noscript\\b[^>]*>[\\s\\S]*?<\\/noscript>/gi, \"\")\n .replace(/<!--[\\s\\S]*?-->/g, \"\");\n\n source = source.replace(/<pre\\b[^>]*><code\\b[^>]*>([\\s\\S]*?)<\\/code><\\/pre>/gi, (_, code) => {\n return `\\n\\n\\`\\`\\`\\n${decodeHtml(stripTags(code)).trim()}\\n\\`\\`\\`\\n\\n`;\n });\n source = source.replace(/<pre\\b[^>]*>([\\s\\S]*?)<\\/pre>/gi, (_, code) => {\n return `\\n\\n\\`\\`\\`\\n${decodeHtml(stripTags(code)).trim()}\\n\\`\\`\\`\\n\\n`;\n });\n source = source.replace(/<h([1-6])\\b[^>]*>([\\s\\S]*?)<\\/h\\1>/gi, (_, level, content) => {\n return `\\n\\n${\"#\".repeat(Number(level))} ${toInlineMarkdown(content).trim()}\\n\\n`;\n });\n source = source.replace(/<p\\b[^>]*>([\\s\\S]*?)<\\/p>/gi, (_, content) => {\n return `\\n\\n${toInlineMarkdown(content).trim()}\\n\\n`;\n });\n source = source.replace(/<blockquote\\b[^>]*>([\\s\\S]*?)<\\/blockquote>/gi, (_, content) => {\n const quote = htmlToMarkdown(content, { includeMetadata: false })\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0)\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n return `\\n\\n${quote}\\n\\n`;\n });\n source = source.replace(/<li\\b[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, content) => {\n return `\\n- ${toInlineMarkdown(content).trim()}`;\n });\n source = source\n .replace(/<\\/?(ul|ol|main|section|article|header|footer|nav|aside|div)\\b[^>]*>/gi, \"\\n\")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<hr\\s*\\/?>/gi, \"\\n\\n---\\n\\n\");\n\n let markdown = stripTags(source)\n .split(\"\\n\")\n .map((line) => line.replace(/[ \\t]+$/g, \"\"))\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n\n if (options.includeMetadata !== false) {\n const metadata: string[] = [];\n if (title && !markdown.startsWith(\"# \")) {\n metadata.push(`# ${title}`);\n }\n if (options.sourcePath) {\n metadata.push(`Source: ${options.sourcePath}`);\n }\n if (metadata.length) {\n markdown = `${metadata.join(\"\\n\\n\")}${markdown ? `\\n\\n${markdown}` : \"\"}`;\n }\n }\n\n return `${markdown}\\n`;\n}\n\nfunction normalizeMarkdownRouteInput(input: FarmMarkdownRouteInput): FarmMarkdownResolvedRoute {\n if (typeof input === \"string\") {\n return {\n route: normalizeMarkdownRoute(input),\n };\n }\n\n return {\n ...input,\n route: normalizeMarkdownRoute(input.route),\n };\n}\n\nfunction normalizeMarkdownRoute(route: string): string {\n const withoutMarkdownExtension = route.toLowerCase().endsWith(\".md\") ? route.slice(0, -3) : route;\n const withSlash = withoutMarkdownExtension.startsWith(\"/\")\n ? withoutMarkdownExtension\n : `/${withoutMarkdownExtension}`;\n const normalized = withSlash.replace(/\\/+/g, \"/\").replace(/\\/$/g, \"\");\n return normalized === \"\" || normalized === \"/index\" ? \"/\" : normalized;\n}\n\nexport function requestAcceptsMarkdown(accept: string | null | undefined): boolean {\n if (!accept) {\n return false;\n }\n\n return accept.split(\",\").some((entry) => {\n const [mediaType, ...parameters] = entry\n .trim()\n .toLowerCase()\n .split(\";\")\n .map((part) => part.trim());\n if (mediaType !== \"text/markdown\") {\n return false;\n }\n\n const quality = parameters.find((parameter) => parameter.startsWith(\"q=\"));\n return quality === undefined || Number(quality.slice(2)) > 0;\n });\n}\n\nfunction getMarkdownAlternatePath(pathname: string): string {\n return pathname === \"/\" ? \"/index.md\" : `${pathname}.md`;\n}\n\nfunction appendHeaderToken(headers: Headers, name: string, token: string): void {\n const current = headers.get(name);\n if (!current) {\n headers.set(name, token);\n return;\n }\n\n const tokens = current.split(\",\").map((value) => value.trim().toLowerCase());\n if (!tokens.includes(token.toLowerCase())) {\n headers.set(name, `${current}, ${token}`);\n }\n}\n\nfunction findExposedMarkdownRoute(\n config: FarmMarkdownResolvedConfig,\n pathname: string,\n): FarmMarkdownResolvedRoute | null {\n if (config.expose === true) {\n return null;\n }\n\n return config.expose.find((route) => routeMatches(route.route, pathname)) ?? null;\n}\n\nfunction routeMatches(pattern: string, pathname: string): boolean {\n if (pattern === pathname) {\n return true;\n }\n\n const escaped = pattern\n .split(\"/\")\n .map((segment) => {\n if (/^\\[\\.\\.\\.[^\\]]+\\]$/.test(segment)) {\n return \".*\";\n }\n if (/^\\[[^\\]]+\\]$/.test(segment)) {\n return \"[^/]+\";\n }\n return segment.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n })\n .join(\"/\");\n\n return new RegExp(`^${escaped}$`).test(pathname);\n}\n\nfunction isHtmlResponse(response: Response): boolean {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n return contentType.includes(\"text/html\");\n}\n\nfunction createMarkdownCacheHeader(cache: number | false): string {\n if (cache === false || cache <= 0) {\n return \"no-store\";\n }\n\n return `public, max-age=${cache}, s-maxage=${cache}`;\n}\n\nfunction extractHtmlTitle(html: string): string | undefined {\n const match = html.match(/<title\\b[^>]*>([\\s\\S]*?)<\\/title>/i);\n return match ? decodeHtml(stripTags(match[1])).trim() : undefined;\n}\n\nfunction extractHtmlBody(html: string): string {\n const rootMatch = html.match(\n /<div\\b[^>]*id=[\"']root[\"'][^>]*>([\\s\\S]*?)<\\/div>\\s*(?:<script|<\\/body>|$)/i,\n );\n const bodyMatch = html.match(/<body\\b[^>]*>([\\s\\S]*?)<\\/body>/i);\n const body = rootMatch ? rootMatch[1] : bodyMatch ? bodyMatch[1] : html;\n return extractFirstElementContent(body, [\"main\", \"article\"]) ?? body;\n}\n\nfunction extractFirstElementContent(html: string, tagNames: string[]): string | undefined {\n for (const tagName of tagNames) {\n const match = html.match(new RegExp(`<${tagName}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${tagName}>`, \"i\"));\n if (match) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\nfunction toInlineMarkdown(html: string): string {\n let source = html\n .replace(/<a\\b[^>]*href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi, (_, href, text) => {\n const label: string = toInlineMarkdown(text).trim() || href;\n return `[${label}](${decodeHtml(href)})`;\n })\n .replace(\n /<img\\b[^>]*src=[\"']([^\"']+)[\"'][^>]*alt=[\"']([^\"']*)[\"'][^>]*\\/?>/gi,\n (_, src, alt) => {\n return `})`;\n },\n )\n .replace(/<strong\\b[^>]*>([\\s\\S]*?)<\\/strong>/gi, (_, content) => {\n return `**${toInlineMarkdown(content).trim()}**`;\n })\n .replace(/<b\\b[^>]*>([\\s\\S]*?)<\\/b>/gi, (_, content) => {\n return `**${toInlineMarkdown(content).trim()}**`;\n })\n .replace(/<em\\b[^>]*>([\\s\\S]*?)<\\/em>/gi, (_, content) => {\n return `_${toInlineMarkdown(content).trim()}_`;\n })\n .replace(/<i\\b[^>]*>([\\s\\S]*?)<\\/i>/gi, (_, content) => {\n return `_${toInlineMarkdown(content).trim()}_`;\n })\n .replace(/<code\\b[^>]*>([\\s\\S]*?)<\\/code>/gi, (_, content) => {\n return `\\`${decodeHtml(stripTags(content)).trim()}\\``;\n })\n .replace(/<br\\s*\\/?>/gi, \"\\n\");\n\n source = stripTags(source);\n return decodeHtml(source).replace(/\\s+/g, \" \");\n}\n\nfunction stripTags(input: string): string {\n return input.replace(/<[^>]+>/g, \"\");\n}\n\nfunction decodeHtml(input: string): string {\n return input\n .replace(/ /g, \" \")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&#x([0-9a-f]+);/gi, (_, code) => String.fromCodePoint(Number.parseInt(code, 16)))\n .replace(/&#(\\d+);/g, (_, code) => String.fromCodePoint(Number.parseInt(code, 10)));\n}\n"],"mappings":";;;;;AA0DO,SAAS,sBACd,QAC4B;AAC5B,MAAI,WAAW,OAAO;AACpB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,OAAO;AAAA,MACP,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,UAAU,OAAO,UAAU;AACtD,QAAM,SACJ,gBAAgB,OACZ,OACA,MAAM,QAAQ,WAAW,IACvB,YAAY,IAAI,2BAA2B,IAC3C,CAAC;AAET,SAAO;AAAA,IACL,SAAS,OAAO,YAAY,UAAU,WAAW,QAAQ,OAAO,SAAS;AAAA,IACzE;AAAA,IACA,OAAO,OAAO,SAAS;AAAA,IACvB,iBAAiB,OAAO,mBAAmB;AAAA,EAC7C;AACF;AAnCgB;AAqCT,SAAS,4BACd,QACA,UACA,UAA8C,CAAC,GACd;AACjC,QAAM,uBAAuB,SAAS,YAAY,EAAE,SAAS,KAAK;AAClE,MAAI,CAAC,QAAQ,WAAY,CAAC,wBAAwB,CAAC,uBAAuB,QAAQ,MAAM,GAAI;AAC1F,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB;AAAA,IACrB,uBAAuB,SAAS,MAAM,GAAG,CAAC,MAAM,MAAM,KAAK,MAAM;AAAA,EACnE;AACA,QAAM,QAAQ,yBAAyB,QAAQ,cAAc;AAC7D,MAAI,CAAC,SAAS,OAAO,WAAW,MAAM;AACpC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAtBgB;AAwBhB,eAAsB,6BACpB,SAC0B;AAC1B,MAAI,QAAQ,QAAQ,WAAW,SAAS,QAAQ,QAAQ,WAAW,QAAQ;AACzE,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,IAAI,IAAI,QAAQ,QAAQ,GAAG;AAC9C,QAAM,uBAAuB,WAAW,SAAS,YAAY,EAAE,SAAS,KAAK;AAC7E,QAAM,SAAS,4BAA4B,QAAQ,QAAQ,WAAW,UAAU;AAAA,IAC9E,QAAQ,QAAQ,QAAQ,QAAQ,IAAI,QAAQ;AAAA,EAC9C,CAAC;AACD,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,eAAe,CAAC,QAAQ,YAAY,OAAO,QAAQ,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,IAAI,IAAI,QAAQ,QAAQ,GAAG;AAC3C,UAAQ,WAAW,OAAO;AAC1B,QAAM,UAAU,IAAI,QAAQ,QAAQ,QAAQ,OAAO;AACnD,UAAQ,IAAI,UAAU,WAAW;AAEjC,QAAM,eAAe,MAAM,QAAQ;AAAA,IACjC,IAAI,QAAQ,SAAS;AAAA,MACnB,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,eAAe,YAAY,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,MAAM,aAAa,KAAK;AACrC,QAAM,WAAW,eAAe,MAAM;AAAA,IACpC,OAAO,OAAO,OAAO;AAAA,IACrB,iBAAiB,QAAQ,QAAQ,mBAAmB;AAAA,IACpD,YAAY,OAAO;AAAA,EACrB,CAAC;AACD,QAAM,aAAa,IAAI,QAAQ;AAAA,IAC7B,gBAAgB;AAAA,IAChB,oBAAoB,OAAO,aAAa,MAAM,cAAc,GAAG,OAAO,QAAQ;AAAA,IAC9E,yBAAyB,OAAO;AAAA,EAClC,CAAC;AACD,MAAI,CAAC,sBAAsB;AACzB,eAAW,IAAI,QAAQ,QAAQ;AAAA,EACjC;AACA,QAAM,QAAQ,OAAO,OAAO,SAAS,QAAQ,QAAQ,SAAS;AAC9D,aAAW,IAAI,iBAAiB,0BAA0B,KAAK,CAAC;AAEhE,SAAO,IAAI,SAAS,QAAQ,QAAQ,WAAW,SAAS,OAAO,UAAU;AAAA,IACvE,QAAQ,aAAa;AAAA,IACrB,SAAS;AAAA,EACX,CAAC;AACH;AAzDsB;AA2Df,SAAS,gCACd,UACA,SACU;AACV,MAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,4BAA4B,QAAQ,QAAQ,QAAQ,UAAU;AAAA,IAC3E,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,yBAAyB,OAAO,QAAQ;AAC9D,QAAM,UAAU,IAAI,QAAQ,SAAS,OAAO;AAC5C,oBAAkB,SAAS,QAAQ,QAAQ;AAC3C,UAAQ,OAAO,QAAQ,IAAI,aAAa,0CAA0C;AAElF,SAAO,IAAI,SAAS,SAAS,MAAM;AAAA,IACjC,QAAQ,SAAS;AAAA,IACjB,YAAY,SAAS;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAzBgB;AA2BT,SAAS,eACd,MACA,UAII,CAAC,GACG;AACR,QAAM,QAAQ,QAAQ,SAAS,iBAAiB,IAAI;AACpD,MAAI,SAAS,gBAAgB,IAAI,EAC9B,QAAQ,uCAAuC,EAAE,EACjD,QAAQ,qCAAqC,EAAE,EAC/C,QAAQ,2CAA2C,EAAE,EACrD,QAAQ,oBAAoB,EAAE;AAEjC,WAAS,OAAO,QAAQ,wDAAwD,CAAC,GAAG,SAAS;AAC3F,WAAO;AAAA;AAAA;AAAA,EAAe,WAAW,UAAU,IAAI,CAAC,EAAE,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,EAC1D,CAAC;AACD,WAAS,OAAO,QAAQ,mCAAmC,CAAC,GAAG,SAAS;AACtE,WAAO;AAAA;AAAA;AAAA,EAAe,WAAW,UAAU,IAAI,CAAC,EAAE,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,EAC1D,CAAC;AACD,WAAS,OAAO,QAAQ,wCAAwC,CAAC,GAAG,OAAO,YAAY;AACrF,WAAO;AAAA;AAAA,EAAO,IAAI,OAAO,OAAO,KAAK,CAAC,CAAC,IAAI,iBAAiB,OAAO,EAAE,KAAK,CAAC;AAAA;AAAA;AAAA,EAC7E,CAAC;AACD,WAAS,OAAO,QAAQ,+BAA+B,CAAC,GAAG,YAAY;AACrE,WAAO;AAAA;AAAA,EAAO,iBAAiB,OAAO,EAAE,KAAK,CAAC;AAAA;AAAA;AAAA,EAChD,CAAC;AACD,WAAS,OAAO,QAAQ,iDAAiD,CAAC,GAAG,YAAY;AACvF,UAAM,QAAQ,eAAe,SAAS,EAAE,iBAAiB,MAAM,CAAC,EAC7D,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EACzB,KAAK,IAAI;AACZ,WAAO;AAAA;AAAA,EAAO,KAAK;AAAA;AAAA;AAAA,EACrB,CAAC;AACD,WAAS,OAAO,QAAQ,iCAAiC,CAAC,GAAG,YAAY;AACvE,WAAO;AAAA,IAAO,iBAAiB,OAAO,EAAE,KAAK,CAAC;AAAA,EAChD,CAAC;AACD,WAAS,OACN,QAAQ,0EAA0E,IAAI,EACtF,QAAQ,gBAAgB,IAAI,EAC5B,QAAQ,gBAAgB,aAAa;AAExC,MAAI,WAAW,UAAU,MAAM,EAC5B,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,QAAQ,YAAY,EAAE,CAAC,EAC1C,KAAK,IAAI,EACT,QAAQ,WAAW,MAAM,EACzB,KAAK;AAER,MAAI,QAAQ,oBAAoB,OAAO;AACrC,UAAM,WAAqB,CAAC;AAC5B,QAAI,SAAS,CAAC,SAAS,WAAW,IAAI,GAAG;AACvC,eAAS,KAAK,KAAK,KAAK,EAAE;AAAA,IAC5B;AACA,QAAI,QAAQ,YAAY;AACtB,eAAS,KAAK,WAAW,QAAQ,UAAU,EAAE;AAAA,IAC/C;AACA,QAAI,SAAS,QAAQ;AACnB,iBAAW,GAAG,SAAS,KAAK,MAAM,CAAC,GAAG,WAAW;AAAA;AAAA,EAAO,QAAQ,KAAK,EAAE;AAAA,IACzE;AAAA,EACF;AAEA,SAAO,GAAG,QAAQ;AAAA;AACpB;AAhEgB;AAkEhB,SAAS,4BAA4B,OAA0D;AAC7F,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL,OAAO,uBAAuB,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,uBAAuB,MAAM,KAAK;AAAA,EAC3C;AACF;AAXS;AAaT,SAAS,uBAAuB,OAAuB;AACrD,QAAM,2BAA2B,MAAM,YAAY,EAAE,SAAS,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AAC5F,QAAM,YAAY,yBAAyB,WAAW,GAAG,IACrD,2BACA,IAAI,wBAAwB;AAChC,QAAM,aAAa,UAAU,QAAQ,QAAQ,GAAG,EAAE,QAAQ,QAAQ,EAAE;AACpE,SAAO,eAAe,MAAM,eAAe,WAAW,MAAM;AAC9D;AAPS;AASF,SAAS,uBAAuB,QAA4C;AACjF,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,MAAM,GAAG,EAAE,KAAK,CAAC,UAAU;AACvC,UAAM,CAAC,WAAW,GAAG,UAAU,IAAI,MAChC,KAAK,EACL,YAAY,EACZ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAC5B,QAAI,cAAc,iBAAiB;AACjC,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,WAAW,KAAK,CAAC,cAAc,UAAU,WAAW,IAAI,CAAC;AACzE,WAAO,YAAY,UAAa,OAAO,QAAQ,MAAM,CAAC,CAAC,IAAI;AAAA,EAC7D,CAAC;AACH;AAlBgB;AAoBhB,SAAS,yBAAyB,UAA0B;AAC1D,SAAO,aAAa,MAAM,cAAc,GAAG,QAAQ;AACrD;AAFS;AAIT,SAAS,kBAAkB,SAAkB,MAAc,OAAqB;AAC9E,QAAM,UAAU,QAAQ,IAAI,IAAI;AAChC,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,MAAM,KAAK;AACvB;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,YAAY,CAAC;AAC3E,MAAI,CAAC,OAAO,SAAS,MAAM,YAAY,CAAC,GAAG;AACzC,YAAQ,IAAI,MAAM,GAAG,OAAO,KAAK,KAAK,EAAE;AAAA,EAC1C;AACF;AAXS;AAaT,SAAS,yBACP,QACA,UACkC;AAClC,MAAI,OAAO,WAAW,MAAM;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,OAAO,KAAK,CAAC,UAAU,aAAa,MAAM,OAAO,QAAQ,CAAC,KAAK;AAC/E;AATS;AAWT,SAAS,aAAa,SAAiB,UAA2B;AAChE,MAAI,YAAY,UAAU;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QACb,MAAM,GAAG,EACT,IAAI,CAAC,YAAY;AAChB,QAAI,qBAAqB,KAAK,OAAO,GAAG;AACtC,aAAO;AAAA,IACT;AACA,QAAI,eAAe,KAAK,OAAO,GAAG;AAChC,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,QAAQ,uBAAuB,MAAM;AAAA,EACtD,CAAC,EACA,KAAK,GAAG;AAEX,SAAO,IAAI,OAAO,IAAI,OAAO,GAAG,EAAE,KAAK,QAAQ;AACjD;AAnBS;AAqBT,SAAS,eAAe,UAA6B;AACnD,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,SAAO,YAAY,SAAS,WAAW;AACzC;AAHS;AAKT,SAAS,0BAA0B,OAA+B;AAChE,MAAI,UAAU,SAAS,SAAS,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,SAAO,mBAAmB,KAAK,cAAc,KAAK;AACpD;AANS;AAQT,SAAS,iBAAiB,MAAkC;AAC1D,QAAM,QAAQ,KAAK,MAAM,oCAAoC;AAC7D,SAAO,QAAQ,WAAW,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AAC1D;AAHS;AAKT,SAAS,gBAAgB,MAAsB;AAC7C,QAAM,YAAY,KAAK;AAAA,IACrB;AAAA,EACF;AACA,QAAM,YAAY,KAAK,MAAM,kCAAkC;AAC/D,QAAM,OAAO,YAAY,UAAU,CAAC,IAAI,YAAY,UAAU,CAAC,IAAI;AACnE,SAAO,2BAA2B,MAAM,CAAC,QAAQ,SAAS,CAAC,KAAK;AAClE;AAPS;AAST,SAAS,2BAA2B,MAAc,UAAwC;AACxF,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,IAAI,OAAO,4BAA4B,OAAO,KAAK,GAAG,CAAC;AAC3F,QAAI,OAAO;AACT,aAAO,MAAM,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AATS;AAWT,SAAS,iBAAiB,MAAsB;AAC9C,MAAI,SAAS,KACV,QAAQ,yDAAyD,CAAC,GAAG,MAAM,SAAS;AACnF,UAAM,QAAgB,iBAAiB,IAAI,EAAE,KAAK,KAAK;AACvD,WAAO,IAAI,KAAK,KAAK,WAAW,IAAI,CAAC;AAAA,EACvC,CAAC,EACA;AAAA,IACC;AAAA,IACA,CAAC,GAAG,KAAK,QAAQ;AACf,aAAO,KAAK,WAAW,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC;AAAA,IACjD;AAAA,EACF,EACC,QAAQ,yCAAyC,CAAC,GAAG,YAAY;AAChE,WAAO,KAAK,iBAAiB,OAAO,EAAE,KAAK,CAAC;AAAA,EAC9C,CAAC,EACA,QAAQ,+BAA+B,CAAC,GAAG,YAAY;AACtD,WAAO,KAAK,iBAAiB,OAAO,EAAE,KAAK,CAAC;AAAA,EAC9C,CAAC,EACA,QAAQ,iCAAiC,CAAC,GAAG,YAAY;AACxD,WAAO,IAAI,iBAAiB,OAAO,EAAE,KAAK,CAAC;AAAA,EAC7C,CAAC,EACA,QAAQ,+BAA+B,CAAC,GAAG,YAAY;AACtD,WAAO,IAAI,iBAAiB,OAAO,EAAE,KAAK,CAAC;AAAA,EAC7C,CAAC,EACA,QAAQ,qCAAqC,CAAC,GAAG,YAAY;AAC5D,WAAO,KAAK,WAAW,UAAU,OAAO,CAAC,EAAE,KAAK,CAAC;AAAA,EACnD,CAAC,EACA,QAAQ,gBAAgB,IAAI;AAE/B,WAAS,UAAU,MAAM;AACzB,SAAO,WAAW,MAAM,EAAE,QAAQ,QAAQ,GAAG;AAC/C;AA/BS;AAiCT,SAAS,UAAU,OAAuB;AACxC,SAAO,MAAM,QAAQ,YAAY,EAAE;AACrC;AAFS;AAIT,SAAS,WAAW,OAAuB;AACzC,SAAO,MACJ,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,qBAAqB,CAAC,GAAG,SAAS,OAAO,cAAc,OAAO,SAAS,MAAM,EAAE,CAAC,CAAC,EACzF,QAAQ,aAAa,CAAC,GAAG,SAAS,OAAO,cAAc,OAAO,SAAS,MAAM,EAAE,CAAC,CAAC;AACtF;AAVS;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useRouter
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QTZZ2ISQ.mjs";
|
|
4
4
|
import {
|
|
5
5
|
__name
|
|
6
6
|
} from "./chunk-CGILA3WO.mjs";
|
|
@@ -38,4 +38,4 @@ export {
|
|
|
38
38
|
usePathname,
|
|
39
39
|
useSearchParams
|
|
40
40
|
};
|
|
41
|
-
//# sourceMappingURL=chunk-
|
|
41
|
+
//# sourceMappingURL=chunk-7N62DNSO.mjs.map
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-CGILA3WO.mjs";
|
|
4
|
+
|
|
5
|
+
// src/api/transport.ts
|
|
6
|
+
function multipart(schema) {
|
|
7
|
+
if (!Object.isExtensible(schema) && !isMultipartSchema(schema)) {
|
|
8
|
+
throw new TypeError("multipart() requires an extensible schema object");
|
|
9
|
+
}
|
|
10
|
+
if (!isMultipartSchema(schema)) {
|
|
11
|
+
Object.defineProperty(schema, "__farmMultipartSchema", {
|
|
12
|
+
value: true,
|
|
13
|
+
configurable: false,
|
|
14
|
+
enumerable: false,
|
|
15
|
+
writable: false
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return schema;
|
|
19
|
+
}
|
|
20
|
+
__name(multipart, "multipart");
|
|
21
|
+
function isMultipartSchema(value) {
|
|
22
|
+
return typeof value === "object" && value !== null && value.__farmMultipartSchema === true && typeof value.parse === "function";
|
|
23
|
+
}
|
|
24
|
+
__name(isMultipartSchema, "isMultipartSchema");
|
|
25
|
+
function toFormData(values) {
|
|
26
|
+
const formData = new FormData();
|
|
27
|
+
for (const [key, value] of Object.entries(values)) {
|
|
28
|
+
if (isUnsafeFormKey(key)) continue;
|
|
29
|
+
if (Array.isArray(value)) {
|
|
30
|
+
for (const entry of value) appendFormValue(formData, key, entry);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
appendFormValue(formData, key, value);
|
|
34
|
+
}
|
|
35
|
+
return formData;
|
|
36
|
+
}
|
|
37
|
+
__name(toFormData, "toFormData");
|
|
38
|
+
function jsonStream(source, init = {}) {
|
|
39
|
+
const iterator = toAsyncIterator(source);
|
|
40
|
+
const encoder = new TextEncoder();
|
|
41
|
+
let finished = false;
|
|
42
|
+
const body = new ReadableStream(
|
|
43
|
+
{
|
|
44
|
+
async pull(controller) {
|
|
45
|
+
if (finished) return;
|
|
46
|
+
try {
|
|
47
|
+
const next = await iterator.next();
|
|
48
|
+
if (next.done) {
|
|
49
|
+
finished = true;
|
|
50
|
+
controller.close();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
controller.enqueue(encoder.encode(`${JSON.stringify(next.value)}
|
|
54
|
+
`));
|
|
55
|
+
} catch (error) {
|
|
56
|
+
finished = true;
|
|
57
|
+
controller.error(error);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
async cancel(reason) {
|
|
61
|
+
finished = true;
|
|
62
|
+
await iterator.return?.(reason);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
// Do not read the next application event until the response consumer
|
|
67
|
+
// requests another chunk.
|
|
68
|
+
highWaterMark: 0
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
const headers = new Headers(init.headers);
|
|
72
|
+
if (!headers.has("content-type")) {
|
|
73
|
+
headers.set("content-type", "application/x-ndjson; charset=utf-8");
|
|
74
|
+
}
|
|
75
|
+
headers.set("cache-control", headers.get("cache-control") ?? "no-store");
|
|
76
|
+
return new Response(body, {
|
|
77
|
+
...init,
|
|
78
|
+
headers
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
__name(jsonStream, "jsonStream");
|
|
82
|
+
function isJSONStreamResponse(response) {
|
|
83
|
+
const contentType = response.headers?.get?.("content-type")?.toLowerCase() ?? "";
|
|
84
|
+
return contentType.includes("application/x-ndjson") || contentType.includes("application/ndjson");
|
|
85
|
+
}
|
|
86
|
+
__name(isJSONStreamResponse, "isJSONStreamResponse");
|
|
87
|
+
function readJSONStream(response) {
|
|
88
|
+
if (!response.body) {
|
|
89
|
+
throw new TypeError("Cannot read a JSON stream response without a body");
|
|
90
|
+
}
|
|
91
|
+
const reader = response.body.getReader();
|
|
92
|
+
const decoder = new TextDecoder();
|
|
93
|
+
let buffer = "";
|
|
94
|
+
let completed = false;
|
|
95
|
+
let claimed = false;
|
|
96
|
+
const iterator = {
|
|
97
|
+
async next() {
|
|
98
|
+
while (true) {
|
|
99
|
+
const lineEnd = buffer.indexOf("\n");
|
|
100
|
+
if (lineEnd >= 0) {
|
|
101
|
+
const line = buffer.slice(0, lineEnd).trim();
|
|
102
|
+
buffer = buffer.slice(lineEnd + 1);
|
|
103
|
+
if (!line) continue;
|
|
104
|
+
return { done: false, value: JSON.parse(line) };
|
|
105
|
+
}
|
|
106
|
+
if (completed) {
|
|
107
|
+
const line = buffer.trim();
|
|
108
|
+
buffer = "";
|
|
109
|
+
if (!line) return { done: true, value: void 0 };
|
|
110
|
+
return { done: false, value: JSON.parse(line) };
|
|
111
|
+
}
|
|
112
|
+
const chunk = await reader.read();
|
|
113
|
+
completed = chunk.done;
|
|
114
|
+
buffer += decoder.decode(chunk.value, { stream: !chunk.done });
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
async return() {
|
|
118
|
+
completed = true;
|
|
119
|
+
buffer = "";
|
|
120
|
+
await reader.cancel();
|
|
121
|
+
return { done: true, value: void 0 };
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
return {
|
|
125
|
+
response,
|
|
126
|
+
async cancel(reason) {
|
|
127
|
+
completed = true;
|
|
128
|
+
buffer = "";
|
|
129
|
+
await reader.cancel(reason);
|
|
130
|
+
},
|
|
131
|
+
[Symbol.asyncIterator]() {
|
|
132
|
+
if (claimed) {
|
|
133
|
+
throw new TypeError("Farm API streams can only be consumed once");
|
|
134
|
+
}
|
|
135
|
+
claimed = true;
|
|
136
|
+
return iterator;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
__name(readJSONStream, "readJSONStream");
|
|
141
|
+
function isFarmAPIStream(value) {
|
|
142
|
+
return typeof value === "object" && value !== null && "response" in value && typeof value.cancel === "function" && typeof value[Symbol.asyncIterator] === "function";
|
|
143
|
+
}
|
|
144
|
+
__name(isFarmAPIStream, "isFarmAPIStream");
|
|
145
|
+
function appendFormValue(formData, key, value) {
|
|
146
|
+
if (value === void 0) return;
|
|
147
|
+
if (value === null) {
|
|
148
|
+
formData.append(key, "");
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (value instanceof Blob) {
|
|
152
|
+
formData.append(key, value);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (value instanceof Date) {
|
|
156
|
+
formData.append(key, value.toISOString());
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
formData.append(key, String(value));
|
|
160
|
+
}
|
|
161
|
+
__name(appendFormValue, "appendFormValue");
|
|
162
|
+
function isUnsafeFormKey(key) {
|
|
163
|
+
return key === "__proto__" || key === "constructor" || key === "prototype";
|
|
164
|
+
}
|
|
165
|
+
__name(isUnsafeFormKey, "isUnsafeFormKey");
|
|
166
|
+
function toAsyncIterator(source) {
|
|
167
|
+
if (Symbol.asyncIterator in Object(source)) {
|
|
168
|
+
return source[Symbol.asyncIterator]();
|
|
169
|
+
}
|
|
170
|
+
const iterator = source[Symbol.iterator]();
|
|
171
|
+
return {
|
|
172
|
+
next: /* @__PURE__ */ __name(async () => iterator.next(), "next"),
|
|
173
|
+
return: iterator.return ? async (value) => iterator.return(value) : void 0
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
__name(toAsyncIterator, "toAsyncIterator");
|
|
177
|
+
|
|
178
|
+
export {
|
|
179
|
+
multipart,
|
|
180
|
+
isMultipartSchema,
|
|
181
|
+
toFormData,
|
|
182
|
+
jsonStream,
|
|
183
|
+
isJSONStreamResponse,
|
|
184
|
+
readJSONStream,
|
|
185
|
+
isFarmAPIStream
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=chunk-ALCLXXTY.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/transport.ts"],"sourcesContent":["export type MultipartField = string | number | boolean | bigint | Blob | Date | null | undefined;\n\nexport type MultipartValues = Record<string, MultipartField | readonly MultipartField[]>;\n\n/**\n * A real FormData value that retains the submitted value shape for generated\n * API-client inference.\n */\nexport type TypedFormData<TValues> = FormData & {\n readonly __farmMultipartInput: TValues;\n};\n\nexport type MultipartSchema<TSchema> = TSchema & {\n readonly __farmMultipartSchema: true;\n};\n\nexport type FarmStreamResponse<TItem> = Response & {\n readonly __farmStreamItem: TItem;\n};\n\nexport interface FarmAPIStream<TItem> extends AsyncIterable<TItem> {\n readonly response: Response;\n cancel(reason?: unknown): Promise<void>;\n}\n\ntype SchemaLike = {\n parse(data: unknown): unknown;\n};\n\n/**\n * Mark a body schema as multipart. The handler still receives the schema's\n * parsed object; generated clients require `toFormData(...)` for the request.\n */\nexport function multipart<TSchema extends SchemaLike>(schema: TSchema): MultipartSchema<TSchema> {\n if (!Object.isExtensible(schema) && !isMultipartSchema(schema)) {\n throw new TypeError(\"multipart() requires an extensible schema object\");\n }\n\n if (!isMultipartSchema(schema)) {\n Object.defineProperty(schema, \"__farmMultipartSchema\", {\n value: true,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n }\n\n return schema as MultipartSchema<TSchema>;\n}\n\nexport function isMultipartSchema(value: unknown): value is MultipartSchema<SchemaLike> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { __farmMultipartSchema?: unknown }).__farmMultipartSchema === true &&\n typeof (value as SchemaLike).parse === \"function\"\n );\n}\n\n/**\n * Encode a typed object as multipart FormData without converting File or Blob\n * values to JSON or base64.\n */\nexport function toFormData<TValues extends MultipartValues>(\n values: TValues,\n): TypedFormData<TValues> {\n const formData = new FormData();\n\n for (const [key, value] of Object.entries(values)) {\n if (isUnsafeFormKey(key)) continue;\n if (Array.isArray(value)) {\n for (const entry of value) appendFormValue(formData, key, entry);\n continue;\n }\n appendFormValue(formData, key, value as MultipartField);\n }\n\n return formData as TypedFormData<TValues>;\n}\n\n/**\n * Stream JSON values as newline-delimited JSON. Each source value becomes one\n * independently decodable item instead of buffering the whole response.\n */\nexport function jsonStream<TItem>(\n source: AsyncIterable<TItem> | Iterable<TItem>,\n init: ResponseInit = {},\n): FarmStreamResponse<TItem> {\n const iterator = toAsyncIterator(source);\n const encoder = new TextEncoder();\n let finished = false;\n\n const body = new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n if (finished) return;\n\n try {\n const next = await iterator.next();\n if (next.done) {\n finished = true;\n controller.close();\n return;\n }\n controller.enqueue(encoder.encode(`${JSON.stringify(next.value)}\\n`));\n } catch (error) {\n finished = true;\n controller.error(error);\n }\n },\n async cancel(reason) {\n finished = true;\n await iterator.return?.(reason);\n },\n },\n {\n // Do not read the next application event until the response consumer\n // requests another chunk.\n highWaterMark: 0,\n },\n );\n const headers = new Headers(init.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/x-ndjson; charset=utf-8\");\n }\n headers.set(\"cache-control\", headers.get(\"cache-control\") ?? \"no-store\");\n\n return new Response(body, {\n ...init,\n headers,\n }) as FarmStreamResponse<TItem>;\n}\n\nexport function isJSONStreamResponse(response: { headers?: Pick<Headers, \"get\"> | null }): boolean {\n const contentType = response.headers?.get?.(\"content-type\")?.toLowerCase() ?? \"\";\n return contentType.includes(\"application/x-ndjson\") || contentType.includes(\"application/ndjson\");\n}\n\n/**\n * Decode a Farm JSON stream lazily. The response body is read only as the\n * consumer advances the async iterator, preserving fetch backpressure.\n */\nexport function readJSONStream<TItem>(response: Response): FarmAPIStream<TItem> {\n if (!response.body) {\n throw new TypeError(\"Cannot read a JSON stream response without a body\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let completed = false;\n let claimed = false;\n\n const iterator: AsyncIterator<TItem> = {\n async next() {\n while (true) {\n const lineEnd = buffer.indexOf(\"\\n\");\n if (lineEnd >= 0) {\n const line = buffer.slice(0, lineEnd).trim();\n buffer = buffer.slice(lineEnd + 1);\n if (!line) continue;\n return { done: false, value: JSON.parse(line) as TItem };\n }\n\n if (completed) {\n const line = buffer.trim();\n buffer = \"\";\n if (!line) return { done: true, value: undefined };\n return { done: false, value: JSON.parse(line) as TItem };\n }\n\n const chunk = await reader.read();\n completed = chunk.done;\n buffer += decoder.decode(chunk.value, { stream: !chunk.done });\n }\n },\n async return() {\n completed = true;\n buffer = \"\";\n await reader.cancel();\n return { done: true, value: undefined };\n },\n };\n\n return {\n response,\n async cancel(reason) {\n completed = true;\n buffer = \"\";\n await reader.cancel(reason);\n },\n [Symbol.asyncIterator]() {\n if (claimed) {\n throw new TypeError(\"Farm API streams can only be consumed once\");\n }\n claimed = true;\n return iterator;\n },\n };\n}\n\nexport function isFarmAPIStream(value: unknown): value is FarmAPIStream<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"response\" in value &&\n typeof (value as FarmAPIStream<unknown>).cancel === \"function\" &&\n typeof (value as FarmAPIStream<unknown>)[Symbol.asyncIterator] === \"function\"\n );\n}\n\nfunction appendFormValue(formData: FormData, key: string, value: MultipartField): void {\n if (value === undefined) return;\n if (value === null) {\n formData.append(key, \"\");\n return;\n }\n if (value instanceof Blob) {\n formData.append(key, value);\n return;\n }\n if (value instanceof Date) {\n formData.append(key, value.toISOString());\n return;\n }\n formData.append(key, String(value));\n}\n\nfunction isUnsafeFormKey(key: string): boolean {\n return key === \"__proto__\" || key === \"constructor\" || key === \"prototype\";\n}\n\nfunction toAsyncIterator<TItem>(\n source: AsyncIterable<TItem> | Iterable<TItem>,\n): AsyncIterator<TItem> {\n if (Symbol.asyncIterator in Object(source)) {\n return (source as AsyncIterable<TItem>)[Symbol.asyncIterator]();\n }\n\n const iterator = (source as Iterable<TItem>)[Symbol.iterator]();\n return {\n next: async () => iterator.next(),\n return: iterator.return ? async (value?: unknown) => iterator.return!(value) : undefined,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-CGILA3WO.mjs";
|
|
4
|
+
|
|
5
|
+
// src/font.ts
|
|
6
|
+
function fontCompilerError(loader) {
|
|
7
|
+
throw new Error(
|
|
8
|
+
`[Farm fonts] ${loader}() must be called at module scope with static options and compiled by the Farm Vite plugin.`
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
__name(fontCompilerError, "fontCompilerError");
|
|
12
|
+
function localFont(_options) {
|
|
13
|
+
return fontCompilerError("localFont");
|
|
14
|
+
}
|
|
15
|
+
__name(localFont, "localFont");
|
|
16
|
+
function remoteFont(_options) {
|
|
17
|
+
return fontCompilerError("remoteFont");
|
|
18
|
+
}
|
|
19
|
+
__name(remoteFont, "remoteFont");
|
|
20
|
+
|
|
21
|
+
export {
|
|
22
|
+
localFont,
|
|
23
|
+
remoteFont
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=chunk-AW6I64AP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/font.ts"],"sourcesContent":["export type FarmFontDisplay = \"auto\" | \"block\" | \"swap\" | \"fallback\" | \"optional\";\n\nexport interface FarmFontSource {\n /** Local file path or remote URL, depending on the loader. */\n path: string;\n /** A fixed weight (`400`) or variable range (`100 900`). */\n weight?: number | string;\n /** Font style for this source. */\n style?: string;\n /** Optional CSS unicode-range descriptor. */\n unicodeRange?: string;\n}\n\nexport interface FarmFontOptions {\n /** CSS font-family name. */\n family: string;\n /** A fixed weight (`400`) or variable range (`100 900`). */\n weight?: number | string;\n /** Font style. @default \"normal\" */\n style?: string;\n /** Browser loading behavior. @default \"swap\" */\n display?: FarmFontDisplay;\n /** CSS custom property populated by `variable`, for example `--font-sans`. */\n variable?: `--${string}`;\n /** Fallback family names appended to the generated stack. */\n fallback?: string[];\n /** Emit font preload hints. @default true */\n preload?: boolean;\n}\n\nexport interface LocalFontOptions extends FarmFontOptions {\n /**\n * A file relative to this module, a package font specifier, or explicit\n * sources for a multi-weight family.\n */\n src: string | FarmFontSource[];\n}\n\nexport interface RemoteFontSource extends FarmFontSource {\n /** Optional integrity value for this source. Overrides the family-level value. */\n integrity?: string;\n}\n\nexport interface RemoteFontOptions extends FarmFontOptions {\n /** HTTPS font URL, or explicit remote sources for a multi-weight family. */\n src: string | RemoteFontSource[];\n /** Download and fingerprint the font during the build, or retain its URL. */\n strategy?: \"self-host\" | \"external\";\n /** Optional Subresource Integrity value checked while self-hosting. */\n integrity?: string;\n}\n\nexport interface FarmFont {\n /** Generated class that applies the font family and fallback stack. */\n className: string;\n /** Generated class that defines the configured CSS custom property. */\n variable: string;\n /** Inline-style equivalent of the generated family. */\n style: Readonly<{\n fontFamily: string;\n fontStyle?: string;\n fontWeight?: number | string;\n }>;\n}\n\nfunction fontCompilerError(loader: string): never {\n throw new Error(\n `[Farm fonts] ${loader}() must be called at module scope with static options and compiled by the Farm Vite plugin.`,\n );\n}\n\n/**\n * Compile local font files into hashed application assets and generated CSS.\n * The call is removed at build time and adds no font-loader runtime code.\n */\nexport function localFont(_options: LocalFontOptions): FarmFont {\n return fontCompilerError(\"localFont\");\n}\n\n/**\n * Compile a remote font into a self-hosted application asset by default.\n * Use `strategy: \"external\"` only when the browser should retain the remote URL.\n */\nexport function remoteFont(_options: RemoteFontOptions): FarmFont {\n return fontCompilerError(\"remoteFont\");\n}\n"],"mappings":";;;;;AAiEA,SAAS,kBAAkB,QAAuB;AAChD,QAAM,IAAI;AAAA,IACR,gBAAgB,MAAM;AAAA,EACxB;AACF;AAJS;AAUF,SAAS,UAAU,UAAsC;AAC9D,SAAO,kBAAkB,WAAW;AACtC;AAFgB;AAQT,SAAS,WAAW,UAAuC;AAChE,SAAO,kBAAkB,YAAY;AACvC;AAFgB;","names":[]}
|
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
} from "./chunk-QKVUNGAH.mjs";
|
|
4
4
|
import {
|
|
5
5
|
normalizeFarmRouteRuntimeConfig
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GQVGIUSN.mjs";
|
|
7
7
|
import {
|
|
8
8
|
createFarmCacheKey,
|
|
9
9
|
createRouteDataCacheTag,
|
|
10
10
|
getFarmDataCache
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-V3XURYJO.mjs";
|
|
12
12
|
import {
|
|
13
13
|
__name
|
|
14
14
|
} from "./chunk-CGILA3WO.mjs";
|
|
@@ -715,4 +715,4 @@ export {
|
|
|
715
715
|
createLayoutModuleFromProgrammaticLayout,
|
|
716
716
|
scanProgrammaticPagePaths
|
|
717
717
|
};
|
|
718
|
-
//# sourceMappingURL=chunk-
|
|
718
|
+
//# sourceMappingURL=chunk-C2ROET2V.mjs.map
|
|
@@ -30,18 +30,25 @@ var CONFIG_FILENAMES = [
|
|
|
30
30
|
async function generateEnvTypes(options) {
|
|
31
31
|
const root = path.resolve(options.root);
|
|
32
32
|
const srcDir = options.srcDir || "src";
|
|
33
|
-
const
|
|
33
|
+
const outFile = options.outFile || DEFAULT_OUT_FILE;
|
|
34
|
+
const outPath = path.isAbsolute(outFile) ? outFile : path.join(root, srcDir, outFile);
|
|
35
|
+
const content = createEnvTypeDeclarations(options, outPath);
|
|
36
|
+
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
37
|
+
writeFileIfChanged(outPath, content);
|
|
38
|
+
return outPath;
|
|
39
|
+
}
|
|
40
|
+
__name(generateEnvTypes, "generateEnvTypes");
|
|
41
|
+
function createEnvTypeDeclarations(options, outPath) {
|
|
42
|
+
const root = path.resolve(options.root);
|
|
34
43
|
const configPath = findConfigPath(root, options.configPath);
|
|
35
44
|
const configPaths = [
|
|
36
45
|
...(options.layerConfigPaths ?? []).filter((value) => fs.existsSync(value)),
|
|
37
46
|
...configPath ? [configPath] : []
|
|
38
47
|
];
|
|
39
48
|
const content = configPaths.length > 1 ? createLayeredConfigBackedEnvTypes(outPath, configPaths) : configPaths.length === 1 ? createConfigBackedEnvTypes(outPath, configPaths[0]) : createEmptyEnvTypes();
|
|
40
|
-
|
|
41
|
-
writeFileIfChanged(outPath, content);
|
|
42
|
-
return outPath;
|
|
49
|
+
return content;
|
|
43
50
|
}
|
|
44
|
-
__name(
|
|
51
|
+
__name(createEnvTypeDeclarations, "createEnvTypeDeclarations");
|
|
45
52
|
function createLayeredConfigBackedEnvTypes(outPath, configPaths) {
|
|
46
53
|
const imports = configPaths.map(
|
|
47
54
|
(configPath, index) => `import type FarmConfig${index} from ${JSON.stringify(toTypeImportPath(outPath, configPath))};`
|
|
@@ -171,6 +178,7 @@ function toTypeImportPath(outPath, targetPath) {
|
|
|
171
178
|
__name(toTypeImportPath, "toTypeImportPath");
|
|
172
179
|
|
|
173
180
|
export {
|
|
174
|
-
generateEnvTypes
|
|
181
|
+
generateEnvTypes,
|
|
182
|
+
createEnvTypeDeclarations
|
|
175
183
|
};
|
|
176
|
-
//# sourceMappingURL=chunk-
|
|
184
|
+
//# sourceMappingURL=chunk-CGIXMLSY.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/env-types.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { writeFileIfChanged } from \"./write-file-if-changed\";\n\nexport interface GenerateEnvTypesOptions {\n root: string;\n srcDir?: string;\n outFile?: string;\n configPath?: string;\n /** Lower-priority layer config files, ordered before the project config. */\n layerConfigPaths?: readonly string[];\n}\n\nconst DEFAULT_OUT_FILE = \"farm-env.d.ts\";\nconst CONFIG_FILENAMES = [\n \"farm.config.ts\",\n \"farm.config.tsx\",\n \"farm.config.mts\",\n \"farm.config.cts\",\n \"farm.config.js\",\n \"farm.config.jsx\",\n \"farm.config.mjs\",\n \"farm.config.cjs\",\n \"config.ts\",\n \"config.tsx\",\n \"config.mts\",\n \"config.cts\",\n \"config.js\",\n \"config.jsx\",\n \"config.mjs\",\n \"config.cjs\",\n];\n\nexport async function generateEnvTypes(options: GenerateEnvTypesOptions): Promise<string> {\n const root = path.resolve(options.root);\n const srcDir = options.srcDir || \"src\";\n const outFile = options.outFile || DEFAULT_OUT_FILE;\n const outPath = path.isAbsolute(outFile) ? outFile : path.join(root, srcDir, outFile);\n const content = createEnvTypeDeclarations(options, outPath);\n\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\n writeFileIfChanged(outPath, content);\n\n return outPath;\n}\n\nexport function createEnvTypeDeclarations(\n options: GenerateEnvTypesOptions,\n outPath: string,\n): string {\n const root = path.resolve(options.root);\n const configPath = findConfigPath(root, options.configPath);\n const configPaths = [\n ...(options.layerConfigPaths ?? []).filter((value) => fs.existsSync(value)),\n ...(configPath ? [configPath] : []),\n ];\n const content =\n configPaths.length > 1\n ? createLayeredConfigBackedEnvTypes(outPath, configPaths)\n : configPaths.length === 1\n ? createConfigBackedEnvTypes(outPath, configPaths[0])\n : createEmptyEnvTypes();\n\n return content;\n}\n\nfunction createLayeredConfigBackedEnvTypes(outPath: string, configPaths: string[]): string {\n const imports = configPaths\n .map(\n (configPath, index) =>\n `import type FarmConfig${index} from ${JSON.stringify(toTypeImportPath(outPath, configPath))};`,\n )\n .join(\"\\n\");\n const resolvedTypes = configPaths\n .map(\n (_configPath, index) => `\ntype FarmConfigEnv${index} = typeof FarmConfig${index} extends { env?: infer TEnv }\n ? NonNullable<TEnv>\n : never;\ntype FarmResolvedEnv${index} = [FarmConfigEnv${index}] extends [never]\n ? { server: {}; public: {} }\n : InferEnv<FarmConfigEnv${index}>;`,\n )\n .join(\"\\n\");\n const mergedTypes = configPaths\n .slice(1)\n .map(\n (_configPath, index) =>\n `type FarmMergedEnv${index + 1} = MergeFarmEnv<${index === 0 ? \"FarmResolvedEnv0\" : `FarmMergedEnv${index}`}, FarmResolvedEnv${index + 1}>;`,\n )\n .join(\"\\n\");\n const finalType = `FarmMergedEnv${configPaths.length - 1}`;\n\n return `/**\n * Auto-generated env types from Farm layers and farm.config.\n * Regenerated on dev start, build, and farm generate.\n */\n${imports}\nimport type { InferEnv } from \"@farm.js/core/env\";\n\ntype MergeFarmEnv<TBase, TOverride> = {\n server: Omit<TBase extends { server: infer T } ? T : {}, keyof (TOverride extends { server: infer T } ? T : {})> &\n (TOverride extends { server: infer T } ? T : {});\n public: Omit<TBase extends { public: infer T } ? T : {}, keyof (TOverride extends { public: infer T } ? T : {})> &\n (TOverride extends { public: infer T } ? T : {});\n};\n${resolvedTypes}\n${mergedTypes}\n\ntype FarmResolvedEnv = ${finalType};\n\ndeclare module \"@farm.js/core/env\" {\n interface FarmEnvTypes {\n server: FarmResolvedEnv[\"server\"];\n public: FarmResolvedEnv[\"public\"];\n }\n}\n\ndeclare module \"@farm.js/core\" {\n interface FarmEnvTypes {\n server: FarmResolvedEnv[\"server\"];\n public: FarmResolvedEnv[\"public\"];\n }\n}\n\nexport {};\n`;\n}\n\nfunction findConfigPath(root: string, configPath?: string): string | null {\n if (configPath) {\n const resolvedPath = path.isAbsolute(configPath) ? configPath : path.join(root, configPath);\n return fs.existsSync(resolvedPath) ? resolvedPath : null;\n }\n\n for (const filename of CONFIG_FILENAMES) {\n const resolvedPath = path.join(root, filename);\n if (fs.existsSync(resolvedPath)) {\n return resolvedPath;\n }\n }\n\n return null;\n}\n\nfunction createConfigBackedEnvTypes(outPath: string, configPath: string): string {\n const configImportPath = toTypeImportPath(outPath, configPath);\n\n return `/**\n * Auto-generated env types from farm.config.\n * Regenerated on dev start, build, and farm generate.\n */\nimport type FarmConfig from ${JSON.stringify(configImportPath)};\nimport type { InferEnv } from \"@farm.js/core/env\";\n\ntype FarmConfigEnv = typeof FarmConfig extends { env?: infer TEnv } ? NonNullable<TEnv> : never;\ntype FarmResolvedEnv = [FarmConfigEnv] extends [never]\n ? { server: {}; public: {} }\n : InferEnv<FarmConfigEnv>;\n\ndeclare module \"@farm.js/core/env\" {\n interface FarmEnvTypes {\n server: FarmResolvedEnv[\"server\"];\n public: FarmResolvedEnv[\"public\"];\n }\n}\n\ndeclare module \"@farm.js/core\" {\n interface FarmEnvTypes {\n server: FarmResolvedEnv[\"server\"];\n public: FarmResolvedEnv[\"public\"];\n }\n}\n\nexport {};\n`;\n}\n\nfunction createEmptyEnvTypes(): string {\n return `/**\n * Auto-generated env types from farm.config.\n * Regenerated on dev start, build, and farm generate.\n */\ndeclare module \"@farm.js/core/env\" {\n interface FarmEnvTypes {\n server: {};\n public: {};\n }\n}\n\ndeclare module \"@farm.js/core\" {\n interface FarmEnvTypes {\n server: {};\n public: {};\n }\n}\n\nexport {};\n`;\n}\n\nfunction toTypeImportPath(outPath: string, targetPath: string): string {\n const relativePath = path\n .relative(path.dirname(outPath), targetPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(tsx?|jsx?|mjs|cjs|mts|cts)$/, \"\");\n\n return relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getResolvedEnv
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RQ633A5I.mjs";
|
|
4
4
|
import {
|
|
5
5
|
clearRequestContext,
|
|
6
6
|
deleteRequestContext,
|
|
@@ -594,4 +594,4 @@ export {
|
|
|
594
594
|
PluginManager,
|
|
595
595
|
definePlugin
|
|
596
596
|
};
|
|
597
|
-
//# sourceMappingURL=chunk-
|
|
597
|
+
//# sourceMappingURL=chunk-DJSGLHCN.mjs.map
|
|
@@ -371,7 +371,7 @@ function matchRoutePath(pathname, middlewarePath) {
|
|
|
371
371
|
if (!nestedMatch.matched) {
|
|
372
372
|
return { matched: false };
|
|
373
373
|
}
|
|
374
|
-
const params = { ...nestedMatch.params
|
|
374
|
+
const params = { ...nestedMatch.params };
|
|
375
375
|
delete params.__farmRest;
|
|
376
376
|
return {
|
|
377
377
|
matched: true,
|
|
@@ -619,4 +619,4 @@ export {
|
|
|
619
619
|
createProductionMiddlewareRunner,
|
|
620
620
|
applyProductionMiddlewareHeaders
|
|
621
621
|
};
|
|
622
|
-
//# sourceMappingURL=chunk-
|
|
622
|
+
//# sourceMappingURL=chunk-EJ7T4TPB.mjs.map
|