@farm.js/core 0.1.0-beta.5 → 0.1.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/agent-runtime.d.mts +2 -2
  2. package/dist/agent-runtime.d.ts +2 -2
  3. package/dist/api/route-manager.d.mts +3 -3
  4. package/dist/api/route-manager.d.ts +3 -3
  5. package/dist/api.d.mts +3 -3
  6. package/dist/api.d.ts +3 -3
  7. package/dist/{app-CakAr8Be.d.mts → app-BWtqQu3R.d.mts} +6 -4
  8. package/dist/app-markdown.cjs +31 -7
  9. package/dist/app-markdown.cjs.map +1 -1
  10. package/dist/app-markdown.d.mts +2 -2
  11. package/dist/app-markdown.d.ts +2 -2
  12. package/dist/app-markdown.mjs +2 -1
  13. package/dist/{app-BjN-da13.d.ts → app-xltejvLY.d.ts} +6 -4
  14. package/dist/{chunk-A2LUXHD2.mjs → chunk-5VYHFKWE.mjs} +214 -58
  15. package/dist/chunk-5VYHFKWE.mjs.map +1 -0
  16. package/dist/{chunk-EEABSBKK.mjs → chunk-6F5OI5GA.mjs} +2 -2
  17. package/dist/chunk-6F5OI5GA.mjs.map +1 -0
  18. package/dist/{chunk-LLC7BNXW.mjs → chunk-7FBJLMQH.mjs} +73 -10
  19. package/dist/chunk-7FBJLMQH.mjs.map +1 -0
  20. package/dist/{chunk-NM3CRAAL.mjs → chunk-B4W3BNTL.mjs} +24 -8
  21. package/dist/chunk-B4W3BNTL.mjs.map +1 -0
  22. package/dist/{chunk-BHG3LVHH.mjs → chunk-CGIXMLSY.mjs} +15 -7
  23. package/dist/chunk-CGIXMLSY.mjs.map +1 -0
  24. package/dist/{chunk-C3DLZMBU.mjs → chunk-DJSGLHCN.mjs} +2 -2
  25. package/dist/{chunk-2NHCNRF6.mjs → chunk-GFMBXLGP.mjs} +56 -20
  26. package/dist/chunk-GFMBXLGP.mjs.map +1 -0
  27. package/dist/chunk-I4CUBGVF.mjs +93 -0
  28. package/dist/chunk-I4CUBGVF.mjs.map +1 -0
  29. package/dist/{chunk-HNIQFZKB.mjs → chunk-ME4MO2RJ.mjs} +27 -37
  30. package/dist/chunk-ME4MO2RJ.mjs.map +1 -0
  31. package/dist/{chunk-RSKVYESE.mjs → chunk-RQ633A5I.mjs} +1 -1
  32. package/dist/chunk-RQ633A5I.mjs.map +1 -0
  33. package/dist/{chunk-2CUKEMVR.mjs → chunk-WDU6QXNK.mjs} +1 -1
  34. package/dist/chunk-WDU6QXNK.mjs.map +1 -0
  35. package/dist/{chunk-QGQX7SFC.mjs → chunk-ZVWA4ZQ3.mjs} +17 -8
  36. package/dist/chunk-ZVWA4ZQ3.mjs.map +1 -0
  37. package/dist/{client-plugins-DQQ1adXM.d.mts → client-plugins-BI2R6Eae.d.mts} +74 -3
  38. package/dist/{client-plugins-Cw4qUGsw.d.ts → client-plugins-DU9oMspX.d.ts} +74 -3
  39. package/dist/client-plugins.d.mts +2 -2
  40. package/dist/client-plugins.d.ts +2 -2
  41. package/dist/client.cjs.map +1 -1
  42. package/dist/client.d.mts +2 -2
  43. package/dist/client.d.ts +2 -2
  44. package/dist/client.mjs +1 -1
  45. package/dist/config.d.mts +2 -2
  46. package/dist/config.d.ts +2 -2
  47. package/dist/{devtools-LVC3VB5P.mjs → devtools-REQTS3I7.mjs} +6 -5
  48. package/dist/{devtools-LVC3VB5P.mjs.map → devtools-REQTS3I7.mjs.map} +1 -1
  49. package/dist/docs.cjs +51 -56
  50. package/dist/docs.cjs.map +1 -1
  51. package/dist/docs.mjs +6 -5
  52. package/dist/env-types.cjs +14 -5
  53. package/dist/env-types.cjs.map +1 -1
  54. package/dist/env-types.d.mts +2 -1
  55. package/dist/env-types.d.ts +2 -1
  56. package/dist/env-types.mjs +3 -1
  57. package/dist/env.cjs.map +1 -1
  58. package/dist/env.d.mts +1 -1
  59. package/dist/env.d.ts +1 -1
  60. package/dist/env.mjs +1 -1
  61. package/dist/i18n/client.d.mts +2 -2
  62. package/dist/i18n/client.d.ts +2 -2
  63. package/dist/i18n/index.d.mts +3 -3
  64. package/dist/i18n/index.d.ts +3 -3
  65. package/dist/i18n/server.d.mts +5 -5
  66. package/dist/i18n/server.d.ts +5 -5
  67. package/dist/index.cjs +931 -567
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.mts +15 -13
  70. package/dist/index.d.ts +15 -13
  71. package/dist/index.mjs +23 -16
  72. package/dist/index.mjs.map +1 -1
  73. package/dist/integrations.d.mts +2 -2
  74. package/dist/integrations.d.ts +2 -2
  75. package/dist/internal/build-runtime.cjs +643 -322
  76. package/dist/internal/build-runtime.cjs.map +1 -1
  77. package/dist/internal/build-runtime.d.mts +4 -4
  78. package/dist/internal/build-runtime.d.ts +4 -4
  79. package/dist/internal/build-runtime.mjs +11 -10
  80. package/dist/internal/config-runtime.cjs +135 -39
  81. package/dist/internal/config-runtime.cjs.map +1 -1
  82. package/dist/internal/config-runtime.d.mts +3 -3
  83. package/dist/internal/config-runtime.d.ts +3 -3
  84. package/dist/internal/config-runtime.mjs +5 -4
  85. package/dist/internal/production-runtime.d.mts +6 -6
  86. package/dist/internal/production-runtime.d.ts +6 -6
  87. package/dist/markdown.cjs +73 -8
  88. package/dist/markdown.cjs.map +1 -1
  89. package/dist/markdown.d.mts +19 -2
  90. package/dist/markdown.d.ts +19 -2
  91. package/dist/markdown.mjs +5 -1
  92. package/dist/{metadata-BAPg_Nmo.d.ts → metadata-Cm9ujH4I.d.ts} +1 -1
  93. package/dist/{metadata-_6i9oFG3.d.mts → metadata-DacXbnLA.d.mts} +1 -1
  94. package/dist/middleware.d.mts +4 -4
  95. package/dist/middleware.d.ts +4 -4
  96. package/dist/plugin.cjs +679 -434
  97. package/dist/plugin.cjs.map +1 -1
  98. package/dist/plugin.d.mts +2 -2
  99. package/dist/plugin.d.ts +2 -2
  100. package/dist/plugin.mjs +8 -7
  101. package/dist/{production-runtime-DPfgMV9Y.d.mts → production-runtime-4KKq1AVC.d.mts} +2 -2
  102. package/dist/{production-runtime-BoJDc5mc.d.ts → production-runtime-DRsWDN2x.d.ts} +2 -2
  103. package/dist/{request-BrFBuc8G.d.mts → request-Dsq4kGW0.d.mts} +1 -1
  104. package/dist/{request-BslSZIRz.d.ts → request-udtobOLv.d.ts} +1 -1
  105. package/dist/request.d.mts +2 -2
  106. package/dist/request.d.ts +2 -2
  107. package/dist/{resolver-DlOPpjkB.d.mts → resolver-DJqjLMg_.d.mts} +1 -1
  108. package/dist/{resolver-C6iecsDV.d.ts → resolver-IH4RmPEl.d.ts} +1 -1
  109. package/dist/routes.d.mts +2 -2
  110. package/dist/routes.d.ts +2 -2
  111. package/dist/{runtime-DeAAZ6gO.d.mts → runtime-Cxpq6xZN.d.mts} +2 -2
  112. package/dist/{runtime-B6GvwDS1.d.ts → runtime-bv63eUiO.d.ts} +2 -2
  113. package/dist/server-plugins.d.mts +3 -3
  114. package/dist/server-plugins.d.ts +3 -3
  115. package/dist/server.cjs +731 -447
  116. package/dist/server.cjs.map +1 -1
  117. package/dist/server.d.mts +9 -9
  118. package/dist/server.d.ts +9 -9
  119. package/dist/server.mjs +9 -8
  120. package/dist/server.mjs.map +1 -1
  121. package/dist/testing.d.mts +2 -2
  122. package/dist/testing.d.ts +2 -2
  123. package/dist/{types-BH1lhg5G.d.mts → types-BMxWr97v.d.mts} +2 -2
  124. package/dist/{types-BH1lhg5G.d.ts → types-BMxWr97v.d.ts} +2 -2
  125. package/dist/{utils-Drsyz1Vj.d.ts → utils-B-cUHwoK.d.ts} +1 -1
  126. package/dist/{utils-CHXlMDkg.d.mts → utils-Cm41AefV.d.mts} +1 -1
  127. package/dist/version.cjs +1 -1
  128. package/dist/version.cjs.map +1 -1
  129. package/dist/version.mjs +1 -1
  130. package/dist/vite.cjs +682 -437
  131. package/dist/vite.cjs.map +1 -1
  132. package/dist/vite.d.mts +2 -2
  133. package/dist/vite.d.ts +2 -2
  134. package/dist/vite.mjs +6 -5
  135. package/package.json +3 -2
  136. package/types/client.d.ts +1 -1
  137. package/types/image.d.ts +4 -0
  138. package/types/images.d.ts +59 -0
  139. package/dist/chunk-2CUKEMVR.mjs.map +0 -1
  140. package/dist/chunk-2NHCNRF6.mjs.map +0 -1
  141. package/dist/chunk-A2LUXHD2.mjs.map +0 -1
  142. package/dist/chunk-BHG3LVHH.mjs.map +0 -1
  143. package/dist/chunk-EEABSBKK.mjs.map +0 -1
  144. package/dist/chunk-HNIQFZKB.mjs.map +0 -1
  145. package/dist/chunk-LLC7BNXW.mjs.map +0 -1
  146. package/dist/chunk-NM3CRAAL.mjs.map +0 -1
  147. package/dist/chunk-QGQX7SFC.mjs.map +0 -1
  148. package/dist/chunk-RSKVYESE.mjs.map +0 -1
  149. /package/dist/{chunk-C3DLZMBU.mjs.map → chunk-DJSGLHCN.mjs.map} +0 -0
@@ -1,6 +1,6 @@
1
- export { a4 as loadConfig, a3 as resolveConfig, a5 as resolveDeployConfig } from '../client-plugins-DQQ1adXM.mjs';
1
+ export { a5 as loadConfig, a4 as resolveConfig, a6 as resolveDeployConfig } from '../client-plugins-BI2R6Eae.mjs';
2
2
  import { build, createServer, loadEnv } from 'vite';
3
- export { l as logger } from '../utils-CHXlMDkg.mjs';
3
+ export { l as logger } from '../utils-Cm41AefV.mjs';
4
4
  import '../plugin-BJDf43dc.mjs';
5
5
  import 'react';
6
6
  import 'http';
@@ -18,7 +18,7 @@ import '../cron.mjs';
18
18
  import '../env.mjs';
19
19
  import '../server-action-security.mjs';
20
20
  import '../image-config-Duob7wER.mjs';
21
- import '../types-BH1lhg5G.mjs';
21
+ import '../types-BMxWr97v.mjs';
22
22
  import '../cache.mjs';
23
23
  import '../route-runtime-DoOHzCAD.mjs';
24
24
 
@@ -1,6 +1,6 @@
1
- export { a4 as loadConfig, a3 as resolveConfig, a5 as resolveDeployConfig } from '../client-plugins-Cw4qUGsw.js';
1
+ export { a5 as loadConfig, a4 as resolveConfig, a6 as resolveDeployConfig } from '../client-plugins-DU9oMspX.js';
2
2
  import { build, createServer, loadEnv } from 'vite';
3
- export { l as logger } from '../utils-Drsyz1Vj.js';
3
+ export { l as logger } from '../utils-B-cUHwoK.js';
4
4
  import '../plugin-BJDf43dc.js';
5
5
  import 'react';
6
6
  import 'http';
@@ -18,7 +18,7 @@ import '../cron.js';
18
18
  import '../env.js';
19
19
  import '../server-action-security.js';
20
20
  import '../image-config-Duob7wER.js';
21
- import '../types-BH1lhg5G.js';
21
+ import '../types-BMxWr97v.js';
22
22
  import '../cache.js';
23
23
  import '../route-runtime-DoOHzCAD.js';
24
24
 
@@ -5,16 +5,17 @@ import {
5
5
  loadConfig,
6
6
  resolveConfig,
7
7
  resolveDeployConfig
8
- } from "../chunk-NM3CRAAL.mjs";
8
+ } from "../chunk-B4W3BNTL.mjs";
9
9
  import "../chunk-UVCIEUJC.mjs";
10
- import "../chunk-RSKVYESE.mjs";
10
+ import "../chunk-RQ633A5I.mjs";
11
+ import "../chunk-I4CUBGVF.mjs";
11
12
  import "../chunk-74YTBPTY.mjs";
12
13
  import "../chunk-7MABZJIM.mjs";
13
14
  import "../chunk-YW7OBE6Q.mjs";
14
15
  import "../chunk-GY2STC2S.mjs";
15
16
  import "../chunk-UB5UOSHB.mjs";
16
- import "../chunk-LLC7BNXW.mjs";
17
- import "../chunk-QGQX7SFC.mjs";
17
+ import "../chunk-ZVWA4ZQ3.mjs";
18
+ import "../chunk-7FBJLMQH.mjs";
18
19
  import "../chunk-XIVV5IWN.mjs";
19
20
  import "../chunk-GXASWWJU.mjs";
20
21
  import "../chunk-K4667E2Q.mjs";
@@ -1,15 +1,15 @@
1
1
  export { _runWithAfterRequest } from '../after.mjs';
2
- export { _ as _runWithCurrentRequest, g as getCurrentRequest } from '../request-BrFBuc8G.mjs';
2
+ export { _ as _runWithCurrentRequest, g as getCurrentRequest } from '../request-Dsq4kGW0.mjs';
3
3
  export { configureFarmCache, createFarmCacheKey, getFarmDataCache, normalizeRevalidatePath } from '../cache.mjs';
4
- export { c as createFarmLocaleCookie, g as getFarmLocaleVaryHeaders } from '../resolver-DlOPpjkB.mjs';
4
+ export { c as createFarmLocaleCookie, g as getFarmLocaleVaryHeaders } from '../resolver-DJqjLMg_.mjs';
5
5
  export { localizeFarmHref, localizeFarmPathname, stripFarmLocaleFromPathname } from '../i18n/index.mjs';
6
- export { a as addMetadataImageReference, m as mergeMetadata, r as renderMetadataHead } from '../metadata-_6i9oFG3.mjs';
7
- export { _ as _runWithMiddlewareContext, b as _runWithMiddlewareData, a as applyProductionMiddlewareHeaders, c as createProductionMiddlewareRunner } from '../production-runtime-DPfgMV9Y.mjs';
6
+ export { a as addMetadataImageReference, m as mergeMetadata, r as renderMetadataHead } from '../metadata-DacXbnLA.mjs';
7
+ export { _ as _runWithMiddlewareContext, b as _runWithMiddlewareData, a as applyProductionMiddlewareHeaders, c as createProductionMiddlewareRunner } from '../production-runtime-4KKq1AVC.mjs';
8
8
  export { g as getFarmRedirectError, i as isFarmNotFoundError, a as isFarmRedirectError } from '../navigation-errors-Dvwpzaer.mjs';
9
9
  export { configureFarmObservability, emitFarmEvent } from '../observability.mjs';
10
- import { F as FarmConfig, e as FarmContextFactoryInput } from '../client-plugins-DQQ1adXM.mjs';
10
+ import { F as FarmConfig, e as FarmContextFactoryInput } from '../client-plugins-BI2R6Eae.mjs';
11
11
  import 'node:http';
12
- import '../types-BH1lhg5G.mjs';
12
+ import '../types-BMxWr97v.mjs';
13
13
  import '../plugin-BJDf43dc.mjs';
14
14
  import 'react';
15
15
  import 'http';
@@ -1,15 +1,15 @@
1
1
  export { _runWithAfterRequest } from '../after.js';
2
- export { _ as _runWithCurrentRequest, g as getCurrentRequest } from '../request-BslSZIRz.js';
2
+ export { _ as _runWithCurrentRequest, g as getCurrentRequest } from '../request-udtobOLv.js';
3
3
  export { configureFarmCache, createFarmCacheKey, getFarmDataCache, normalizeRevalidatePath } from '../cache.js';
4
- export { c as createFarmLocaleCookie, g as getFarmLocaleVaryHeaders } from '../resolver-C6iecsDV.js';
4
+ export { c as createFarmLocaleCookie, g as getFarmLocaleVaryHeaders } from '../resolver-IH4RmPEl.js';
5
5
  export { localizeFarmHref, localizeFarmPathname, stripFarmLocaleFromPathname } from '../i18n/index.js';
6
- export { a as addMetadataImageReference, m as mergeMetadata, r as renderMetadataHead } from '../metadata-BAPg_Nmo.js';
7
- export { _ as _runWithMiddlewareContext, b as _runWithMiddlewareData, a as applyProductionMiddlewareHeaders, c as createProductionMiddlewareRunner } from '../production-runtime-BoJDc5mc.js';
6
+ export { a as addMetadataImageReference, m as mergeMetadata, r as renderMetadataHead } from '../metadata-Cm9ujH4I.js';
7
+ export { _ as _runWithMiddlewareContext, b as _runWithMiddlewareData, a as applyProductionMiddlewareHeaders, c as createProductionMiddlewareRunner } from '../production-runtime-DRsWDN2x.js';
8
8
  export { g as getFarmRedirectError, i as isFarmNotFoundError, a as isFarmRedirectError } from '../navigation-errors-Dvwpzaer.js';
9
9
  export { configureFarmObservability, emitFarmEvent } from '../observability.js';
10
- import { F as FarmConfig, e as FarmContextFactoryInput } from '../client-plugins-Cw4qUGsw.js';
10
+ import { F as FarmConfig, e as FarmContextFactoryInput } from '../client-plugins-DU9oMspX.js';
11
11
  import 'node:http';
12
- import '../types-BH1lhg5G.js';
12
+ import '../types-BMxWr97v.js';
13
13
  import '../plugin-BJDf43dc.js';
14
14
  import 'react';
15
15
  import 'http';
package/dist/markdown.cjs CHANGED
@@ -21,14 +21,16 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  // src/markdown.ts
22
22
  var markdown_exports = {};
23
23
  __export(markdown_exports, {
24
+ applyMarkdownNegotiationHeaders: () => applyMarkdownNegotiationHeaders,
24
25
  createMarkdownMirrorResponse: () => createMarkdownMirrorResponse,
25
26
  htmlToMarkdown: () => htmlToMarkdown,
27
+ requestAcceptsMarkdown: () => requestAcceptsMarkdown,
26
28
  resolveMarkdownConfig: () => resolveMarkdownConfig,
27
29
  resolveMarkdownMirrorTarget: () => resolveMarkdownMirrorTarget
28
30
  });
29
31
  module.exports = __toCommonJS(markdown_exports);
30
32
  function resolveMarkdownConfig(config) {
31
- if (config === false || config === void 0) {
33
+ if (config === false) {
32
34
  return {
33
35
  enabled: false,
34
36
  expose: [],
@@ -36,7 +38,7 @@ function resolveMarkdownConfig(config) {
36
38
  includeMetadata: true
37
39
  };
38
40
  }
39
- if (config === true) {
41
+ if (config === true || config === void 0) {
40
42
  return {
41
43
  enabled: true,
42
44
  expose: true,
@@ -44,7 +46,7 @@ function resolveMarkdownConfig(config) {
44
46
  includeMetadata: true
45
47
  };
46
48
  }
47
- const exposeInput = config.expose ?? config.routes ?? [];
49
+ const exposeInput = config.expose ?? config.routes ?? true;
48
50
  const expose = exposeInput === true ? true : Array.isArray(exposeInput) ? exposeInput.map(normalizeMarkdownRouteInput) : [];
49
51
  return {
50
52
  enabled: config.enabled !== false && (expose === true || expose.length > 0),
@@ -54,11 +56,14 @@ function resolveMarkdownConfig(config) {
54
56
  };
55
57
  }
56
58
  __name(resolveMarkdownConfig, "resolveMarkdownConfig");
57
- function resolveMarkdownMirrorTarget(config, pathname) {
58
- if (!config?.enabled || !pathname.endsWith(".md")) {
59
+ function resolveMarkdownMirrorTarget(config, pathname, options = {}) {
60
+ const hasMarkdownExtension = pathname.toLowerCase().endsWith(".md");
61
+ if (!config?.enabled || !hasMarkdownExtension && !requestAcceptsMarkdown(options.accept)) {
59
62
  return null;
60
63
  }
61
- const targetPathname = normalizeMarkdownRoute(pathname.slice(0, -".md".length) || "/");
64
+ const targetPathname = normalizeMarkdownRoute(
65
+ hasMarkdownExtension ? pathname.slice(0, -".md".length) || "/" : pathname
66
+ );
62
67
  const route = findExposedMarkdownRoute(config, targetPathname);
63
68
  if (!route && config.expose !== true) {
64
69
  return null;
@@ -74,7 +79,10 @@ async function createMarkdownMirrorResponse(options) {
74
79
  return null;
75
80
  }
76
81
  const requestUrl = new URL(options.request.url);
77
- const target = resolveMarkdownMirrorTarget(options.config, requestUrl.pathname);
82
+ const hasMarkdownExtension = requestUrl.pathname.toLowerCase().endsWith(".md");
83
+ const target = resolveMarkdownMirrorTarget(options.config, requestUrl.pathname, {
84
+ accept: options.request.headers.get("accept")
85
+ });
78
86
  if (!target) {
79
87
  return null;
80
88
  }
@@ -102,8 +110,12 @@ async function createMarkdownMirrorResponse(options) {
102
110
  });
103
111
  const headersOut = new Headers({
104
112
  "Content-Type": "text/markdown; charset=utf-8",
113
+ "Content-Location": target.pathname === "/" ? "/index.md" : `${target.pathname}.md`,
105
114
  "X-Farm-Markdown-Route": target.pathname
106
115
  });
116
+ if (!hasMarkdownExtension) {
117
+ headersOut.set("Vary", "Accept");
118
+ }
107
119
  const cache = target.route?.cache ?? options.config?.cache ?? false;
108
120
  headersOut.set("Cache-Control", createMarkdownCacheHeader(cache));
109
121
  return new Response(options.request.method === "HEAD" ? null : markdown, {
@@ -112,6 +124,27 @@ async function createMarkdownMirrorResponse(options) {
112
124
  });
113
125
  }
114
126
  __name(createMarkdownMirrorResponse, "createMarkdownMirrorResponse");
127
+ function applyMarkdownNegotiationHeaders(response, options) {
128
+ if (!isHtmlResponse(response)) {
129
+ return response;
130
+ }
131
+ const target = resolveMarkdownMirrorTarget(options.config, options.pathname, {
132
+ accept: "text/markdown"
133
+ });
134
+ if (!target) {
135
+ return response;
136
+ }
137
+ const alternatePath = getMarkdownAlternatePath(target.pathname);
138
+ const headers = new Headers(response.headers);
139
+ appendHeaderToken(headers, "Vary", "Accept");
140
+ headers.append("Link", `<${alternatePath}>; rel="alternate"; type="text/markdown"`);
141
+ return new Response(response.body, {
142
+ status: response.status,
143
+ statusText: response.statusText,
144
+ headers
145
+ });
146
+ }
147
+ __name(applyMarkdownNegotiationHeaders, "applyMarkdownNegotiationHeaders");
115
148
  function htmlToMarkdown(html, options = {}) {
116
149
  const title = options.title ?? extractHtmlTitle(html);
117
150
  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, "");
@@ -192,12 +225,42 @@ function normalizeMarkdownRouteInput(input) {
192
225
  }
193
226
  __name(normalizeMarkdownRouteInput, "normalizeMarkdownRouteInput");
194
227
  function normalizeMarkdownRoute(route) {
195
- const withoutMarkdownExtension = route.endsWith(".md") ? route.slice(0, -3) : route;
228
+ const withoutMarkdownExtension = route.toLowerCase().endsWith(".md") ? route.slice(0, -3) : route;
196
229
  const withSlash = withoutMarkdownExtension.startsWith("/") ? withoutMarkdownExtension : `/${withoutMarkdownExtension}`;
197
230
  const normalized = withSlash.replace(/\/+/g, "/").replace(/\/$/g, "");
198
231
  return normalized === "" || normalized === "/index" ? "/" : normalized;
199
232
  }
200
233
  __name(normalizeMarkdownRoute, "normalizeMarkdownRoute");
234
+ function requestAcceptsMarkdown(accept) {
235
+ if (!accept) {
236
+ return false;
237
+ }
238
+ return accept.split(",").some((entry) => {
239
+ const [mediaType, ...parameters] = entry.trim().toLowerCase().split(";").map((part) => part.trim());
240
+ if (mediaType !== "text/markdown") {
241
+ return false;
242
+ }
243
+ const quality = parameters.find((parameter) => parameter.startsWith("q="));
244
+ return quality === void 0 || Number(quality.slice(2)) > 0;
245
+ });
246
+ }
247
+ __name(requestAcceptsMarkdown, "requestAcceptsMarkdown");
248
+ function getMarkdownAlternatePath(pathname) {
249
+ return pathname === "/" ? "/index.md" : `${pathname}.md`;
250
+ }
251
+ __name(getMarkdownAlternatePath, "getMarkdownAlternatePath");
252
+ function appendHeaderToken(headers, name, token) {
253
+ const current = headers.get(name);
254
+ if (!current) {
255
+ headers.set(name, token);
256
+ return;
257
+ }
258
+ const tokens = current.split(",").map((value) => value.trim().toLowerCase());
259
+ if (!tokens.includes(token.toLowerCase())) {
260
+ headers.set(name, `${current}, ${token}`);
261
+ }
262
+ }
263
+ __name(appendHeaderToken, "appendHeaderToken");
201
264
  function findExposedMarkdownRoute(config, pathname) {
202
265
  if (config.expose === true) {
203
266
  return null;
@@ -291,8 +354,10 @@ function decodeHtml(input) {
291
354
  __name(decodeHtml, "decodeHtml");
292
355
  // Annotate the CommonJS export names for ESM import in node:
293
356
  0 && (module.exports = {
357
+ applyMarkdownNegotiationHeaders,
294
358
  createMarkdownMirrorResponse,
295
359
  htmlToMarkdown,
360
+ requestAcceptsMarkdown,
296
361
  resolveMarkdownConfig,
297
362
  resolveMarkdownMirrorTarget
298
363
  });
@@ -1 +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 enabled?: boolean;\n expose?: boolean | FarmMarkdownRouteInput[];\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 CreateMarkdownMirrorResponseOptions {\n request: Request;\n config?: FarmMarkdownResolvedConfig;\n routeExists?: (pathname: string) => boolean;\n renderPage: (request: Request) => Response | Promise<Response>;\n}\n\nexport function resolveMarkdownConfig(\n config: FarmMarkdownUserConfig | boolean | undefined,\n): FarmMarkdownResolvedConfig {\n if (config === false || config === undefined) {\n return {\n enabled: false,\n expose: [],\n cache: false,\n includeMetadata: true,\n };\n }\n\n if (config === true) {\n return {\n enabled: true,\n expose: true,\n cache: false,\n includeMetadata: true,\n };\n }\n\n const exposeInput = config.expose ?? config.routes ?? [];\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): FarmMarkdownMirrorTarget | null {\n if (!config?.enabled || !pathname.endsWith(\".md\")) {\n return null;\n }\n\n const targetPathname = normalizeMarkdownRoute(pathname.slice(0, -\".md\".length) || \"/\");\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 target = resolveMarkdownMirrorTarget(options.config, requestUrl.pathname);\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 \"X-Farm-Markdown-Route\": target.pathname,\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 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.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\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 `![${decodeHtml(alt)}](${decodeHtml(src)})`;\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(/&nbsp;/g, \" \")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/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":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyCO,SAAS,sBACd,QAC4B;AAC5B,MAAI,WAAW,SAAS,WAAW,QAAW;AAC5C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,OAAO;AAAA,MACP,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,UAAU,OAAO,UAAU,CAAC;AACvD,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,UACiC;AACjC,MAAI,CAAC,QAAQ,WAAW,CAAC,SAAS,SAAS,KAAK,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,uBAAuB,SAAS,MAAM,GAAG,CAAC,MAAM,MAAM,KAAK,GAAG;AACrF,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;AAlBgB;AAoBhB,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,SAAS,4BAA4B,QAAQ,QAAQ,WAAW,QAAQ;AAC9E,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,yBAAyB,OAAO;AAAA,EAClC,CAAC;AACD,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;AAlDsB;AAoDf,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,SAAS,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AAC9E,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;AAST,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
+ {"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 `![${decodeHtml(alt)}](${decodeHtml(src)})`;\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(/&nbsp;/g, \" \")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/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":"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","names":[]}
@@ -4,8 +4,16 @@ type FarmMarkdownRouteInput = string | {
4
4
  cache?: number | false;
5
5
  };
6
6
  interface FarmMarkdownUserConfig {
7
+ /**
8
+ * Enable generated markdown representations for React pages.
9
+ * @default true
10
+ */
7
11
  enabled?: boolean;
12
+ /**
13
+ * Routes that may expose generated markdown. Every page is exposed by default.
14
+ */
8
15
  expose?: boolean | FarmMarkdownRouteInput[];
16
+ /** @deprecated Use `expose`. */
9
17
  routes?: FarmMarkdownRouteInput[];
10
18
  cache?: number | false;
11
19
  includeMetadata?: boolean;
@@ -25,19 +33,28 @@ interface FarmMarkdownMirrorTarget {
25
33
  pathname: string;
26
34
  route: FarmMarkdownResolvedRoute | null;
27
35
  }
36
+ interface ResolveMarkdownMirrorTargetOptions {
37
+ accept?: string | null;
38
+ }
28
39
  interface CreateMarkdownMirrorResponseOptions {
29
40
  request: Request;
30
41
  config?: FarmMarkdownResolvedConfig;
31
42
  routeExists?: (pathname: string) => boolean;
32
43
  renderPage: (request: Request) => Response | Promise<Response>;
33
44
  }
45
+ interface ApplyMarkdownNegotiationHeadersOptions {
46
+ config?: FarmMarkdownResolvedConfig;
47
+ pathname: string;
48
+ }
34
49
  declare function resolveMarkdownConfig(config: FarmMarkdownUserConfig | boolean | undefined): FarmMarkdownResolvedConfig;
35
- declare function resolveMarkdownMirrorTarget(config: FarmMarkdownResolvedConfig | undefined, pathname: string): FarmMarkdownMirrorTarget | null;
50
+ declare function resolveMarkdownMirrorTarget(config: FarmMarkdownResolvedConfig | undefined, pathname: string, options?: ResolveMarkdownMirrorTargetOptions): FarmMarkdownMirrorTarget | null;
36
51
  declare function createMarkdownMirrorResponse(options: CreateMarkdownMirrorResponseOptions): Promise<Response | null>;
52
+ declare function applyMarkdownNegotiationHeaders(response: Response, options: ApplyMarkdownNegotiationHeadersOptions): Response;
37
53
  declare function htmlToMarkdown(html: string, options?: {
38
54
  title?: string;
39
55
  sourcePath?: string;
40
56
  includeMetadata?: boolean;
41
57
  }): string;
58
+ declare function requestAcceptsMarkdown(accept: string | null | undefined): boolean;
42
59
 
43
- export { type CreateMarkdownMirrorResponseOptions, type FarmMarkdownMirrorTarget, type FarmMarkdownResolvedConfig, type FarmMarkdownResolvedRoute, type FarmMarkdownRouteInput, type FarmMarkdownUserConfig, createMarkdownMirrorResponse, htmlToMarkdown, resolveMarkdownConfig, resolveMarkdownMirrorTarget };
60
+ export { type ApplyMarkdownNegotiationHeadersOptions, type CreateMarkdownMirrorResponseOptions, type FarmMarkdownMirrorTarget, type FarmMarkdownResolvedConfig, type FarmMarkdownResolvedRoute, type FarmMarkdownRouteInput, type FarmMarkdownUserConfig, type ResolveMarkdownMirrorTargetOptions, applyMarkdownNegotiationHeaders, createMarkdownMirrorResponse, htmlToMarkdown, requestAcceptsMarkdown, resolveMarkdownConfig, resolveMarkdownMirrorTarget };
@@ -4,8 +4,16 @@ type FarmMarkdownRouteInput = string | {
4
4
  cache?: number | false;
5
5
  };
6
6
  interface FarmMarkdownUserConfig {
7
+ /**
8
+ * Enable generated markdown representations for React pages.
9
+ * @default true
10
+ */
7
11
  enabled?: boolean;
12
+ /**
13
+ * Routes that may expose generated markdown. Every page is exposed by default.
14
+ */
8
15
  expose?: boolean | FarmMarkdownRouteInput[];
16
+ /** @deprecated Use `expose`. */
9
17
  routes?: FarmMarkdownRouteInput[];
10
18
  cache?: number | false;
11
19
  includeMetadata?: boolean;
@@ -25,19 +33,28 @@ interface FarmMarkdownMirrorTarget {
25
33
  pathname: string;
26
34
  route: FarmMarkdownResolvedRoute | null;
27
35
  }
36
+ interface ResolveMarkdownMirrorTargetOptions {
37
+ accept?: string | null;
38
+ }
28
39
  interface CreateMarkdownMirrorResponseOptions {
29
40
  request: Request;
30
41
  config?: FarmMarkdownResolvedConfig;
31
42
  routeExists?: (pathname: string) => boolean;
32
43
  renderPage: (request: Request) => Response | Promise<Response>;
33
44
  }
45
+ interface ApplyMarkdownNegotiationHeadersOptions {
46
+ config?: FarmMarkdownResolvedConfig;
47
+ pathname: string;
48
+ }
34
49
  declare function resolveMarkdownConfig(config: FarmMarkdownUserConfig | boolean | undefined): FarmMarkdownResolvedConfig;
35
- declare function resolveMarkdownMirrorTarget(config: FarmMarkdownResolvedConfig | undefined, pathname: string): FarmMarkdownMirrorTarget | null;
50
+ declare function resolveMarkdownMirrorTarget(config: FarmMarkdownResolvedConfig | undefined, pathname: string, options?: ResolveMarkdownMirrorTargetOptions): FarmMarkdownMirrorTarget | null;
36
51
  declare function createMarkdownMirrorResponse(options: CreateMarkdownMirrorResponseOptions): Promise<Response | null>;
52
+ declare function applyMarkdownNegotiationHeaders(response: Response, options: ApplyMarkdownNegotiationHeadersOptions): Response;
37
53
  declare function htmlToMarkdown(html: string, options?: {
38
54
  title?: string;
39
55
  sourcePath?: string;
40
56
  includeMetadata?: boolean;
41
57
  }): string;
58
+ declare function requestAcceptsMarkdown(accept: string | null | undefined): boolean;
42
59
 
43
- export { type CreateMarkdownMirrorResponseOptions, type FarmMarkdownMirrorTarget, type FarmMarkdownResolvedConfig, type FarmMarkdownResolvedRoute, type FarmMarkdownRouteInput, type FarmMarkdownUserConfig, createMarkdownMirrorResponse, htmlToMarkdown, resolveMarkdownConfig, resolveMarkdownMirrorTarget };
60
+ export { type ApplyMarkdownNegotiationHeadersOptions, type CreateMarkdownMirrorResponseOptions, type FarmMarkdownMirrorTarget, type FarmMarkdownResolvedConfig, type FarmMarkdownResolvedRoute, type FarmMarkdownRouteInput, type FarmMarkdownUserConfig, type ResolveMarkdownMirrorTargetOptions, applyMarkdownNegotiationHeaders, createMarkdownMirrorResponse, htmlToMarkdown, requestAcceptsMarkdown, resolveMarkdownConfig, resolveMarkdownMirrorTarget };
package/dist/markdown.mjs CHANGED
@@ -1,13 +1,17 @@
1
1
  import {
2
+ applyMarkdownNegotiationHeaders,
2
3
  createMarkdownMirrorResponse,
3
4
  htmlToMarkdown,
5
+ requestAcceptsMarkdown,
4
6
  resolveMarkdownConfig,
5
7
  resolveMarkdownMirrorTarget
6
- } from "./chunk-LLC7BNXW.mjs";
8
+ } from "./chunk-7FBJLMQH.mjs";
7
9
  import "./chunk-CGILA3WO.mjs";
8
10
  export {
11
+ applyMarkdownNegotiationHeaders,
9
12
  createMarkdownMirrorResponse,
10
13
  htmlToMarkdown,
14
+ requestAcceptsMarkdown,
11
15
  resolveMarkdownConfig,
12
16
  resolveMarkdownMirrorTarget
13
17
  };
@@ -1,4 +1,4 @@
1
- import { s as Metadata } from './client-plugins-Cw4qUGsw.js';
1
+ import { s as Metadata } from './client-plugins-DU9oMspX.js';
2
2
 
3
3
  type MetadataImageKind = "opengraph" | "twitter";
4
4
  interface FarmMetadataImageReference {
@@ -1,4 +1,4 @@
1
- import { s as Metadata } from './client-plugins-DQQ1adXM.mjs';
1
+ import { s as Metadata } from './client-plugins-BI2R6Eae.mjs';
2
2
 
3
3
  type MetadataImageKind = "opengraph" | "twitter";
4
4
  interface FarmMetadataImageReference {
@@ -1,9 +1,9 @@
1
- import { cm as MiddlewareChain, cq as RateLimitStorage, cr as RateLimitStatus, ch as MiddlewareContext, Y as FarmMiddlewareConfig, ci as MiddlewareFunction, cY as MiddlewareConfig, M as MiddlewareProps } from './client-plugins-DQQ1adXM.mjs';
2
- export { cn as CookieJar, co as CookieOptions, ct as MiddlewareResult, cl as MiddlewareStore, cs as NextFunction, cp as RateLimitConfig, X as ReadonlyMiddlewareStore, cj as RequestMiddleware, ck as RequestMiddlewareContext } from './client-plugins-DQQ1adXM.mjs';
1
+ import { cs as MiddlewareChain, cw as RateLimitStorage, cx as RateLimitStatus, cn as MiddlewareContext, Y as FarmMiddlewareConfig, co as MiddlewareFunction, d2 as MiddlewareConfig, M as MiddlewareProps } from './client-plugins-BI2R6Eae.mjs';
2
+ export { ct as CookieJar, cu as CookieOptions, cz as MiddlewareResult, cr as MiddlewareStore, cy as NextFunction, cv as RateLimitConfig, X as ReadonlyMiddlewareStore, cp as RequestMiddleware, cq as RequestMiddlewareContext } from './client-plugins-BI2R6Eae.mjs';
3
3
  import { IncomingMessage, ServerResponse } from 'http';
4
4
  import { ViteDevServer, Plugin } from 'vite';
5
- import { R as ResolvedFarmI18nConfig } from './types-BH1lhg5G.mjs';
6
- export { _ as _runWithMiddlewareContext, b as _runWithMiddlewareData, a as applyProductionMiddlewareHeaders, c as createProductionMiddlewareRunner, g as getMiddlewareContext, d as getMiddlewareData, e as getMiddlewareValue } from './production-runtime-DPfgMV9Y.mjs';
5
+ import { R as ResolvedFarmI18nConfig } from './types-BMxWr97v.mjs';
6
+ export { _ as _runWithMiddlewareContext, b as _runWithMiddlewareData, a as applyProductionMiddlewareHeaders, c as createProductionMiddlewareRunner, g as getMiddlewareContext, d as getMiddlewareData, e as getMiddlewareValue } from './production-runtime-4KKq1AVC.mjs';
7
7
  import './plugin-BJDf43dc.mjs';
8
8
  import 'react';
9
9
  import './types-D1A6-XvH.mjs';
@@ -1,9 +1,9 @@
1
- import { cm as MiddlewareChain, cq as RateLimitStorage, cr as RateLimitStatus, ch as MiddlewareContext, Y as FarmMiddlewareConfig, ci as MiddlewareFunction, cY as MiddlewareConfig, M as MiddlewareProps } from './client-plugins-Cw4qUGsw.js';
2
- export { cn as CookieJar, co as CookieOptions, ct as MiddlewareResult, cl as MiddlewareStore, cs as NextFunction, cp as RateLimitConfig, X as ReadonlyMiddlewareStore, cj as RequestMiddleware, ck as RequestMiddlewareContext } from './client-plugins-Cw4qUGsw.js';
1
+ import { cs as MiddlewareChain, cw as RateLimitStorage, cx as RateLimitStatus, cn as MiddlewareContext, Y as FarmMiddlewareConfig, co as MiddlewareFunction, d2 as MiddlewareConfig, M as MiddlewareProps } from './client-plugins-DU9oMspX.js';
2
+ export { ct as CookieJar, cu as CookieOptions, cz as MiddlewareResult, cr as MiddlewareStore, cy as NextFunction, cv as RateLimitConfig, X as ReadonlyMiddlewareStore, cp as RequestMiddleware, cq as RequestMiddlewareContext } from './client-plugins-DU9oMspX.js';
3
3
  import { IncomingMessage, ServerResponse } from 'http';
4
4
  import { ViteDevServer, Plugin } from 'vite';
5
- import { R as ResolvedFarmI18nConfig } from './types-BH1lhg5G.js';
6
- export { _ as _runWithMiddlewareContext, b as _runWithMiddlewareData, a as applyProductionMiddlewareHeaders, c as createProductionMiddlewareRunner, g as getMiddlewareContext, d as getMiddlewareData, e as getMiddlewareValue } from './production-runtime-BoJDc5mc.js';
5
+ import { R as ResolvedFarmI18nConfig } from './types-BMxWr97v.js';
6
+ export { _ as _runWithMiddlewareContext, b as _runWithMiddlewareData, a as applyProductionMiddlewareHeaders, c as createProductionMiddlewareRunner, g as getMiddlewareContext, d as getMiddlewareData, e as getMiddlewareValue } from './production-runtime-DRsWDN2x.js';
7
7
  import './plugin-BJDf43dc.js';
8
8
  import 'react';
9
9
  import './types-D1A6-XvH.js';