@mdsnai/sdk 0.2.2 → 0.3.0

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 (255) hide show
  1. package/README.md +39 -75
  2. package/dist/core/errors.d.ts +14 -0
  3. package/dist/core/errors.d.ts.map +1 -0
  4. package/dist/core/errors.js +13 -0
  5. package/dist/core/errors.js.map +1 -0
  6. package/dist/core/index.d.ts +16 -4
  7. package/dist/core/index.d.ts.map +1 -0
  8. package/dist/core/index.js +69 -13
  9. package/dist/core/index.js.map +1 -0
  10. package/dist/core/markdown-body.d.ts +3 -0
  11. package/dist/core/markdown-body.d.ts.map +1 -0
  12. package/dist/core/markdown-body.js +65 -0
  13. package/dist/core/markdown-body.js.map +1 -0
  14. package/dist/core/markdown-renderer.d.ts +5 -0
  15. package/dist/core/markdown-renderer.d.ts.map +1 -0
  16. package/dist/core/markdown-renderer.js +75 -0
  17. package/dist/core/markdown-renderer.js.map +1 -0
  18. package/dist/core/negotiate.d.ts +3 -0
  19. package/dist/core/negotiate.d.ts.map +1 -0
  20. package/dist/core/negotiate.js +63 -0
  21. package/dist/core/negotiate.js.map +1 -0
  22. package/dist/core/parse/anchors.d.ts +2 -0
  23. package/dist/core/parse/anchors.d.ts.map +1 -0
  24. package/dist/core/parse/anchors.js +26 -0
  25. package/dist/core/parse/anchors.js.map +1 -0
  26. package/dist/core/parse/block-parser.d.ts +3 -0
  27. package/dist/core/parse/block-parser.d.ts.map +1 -0
  28. package/dist/core/parse/block-parser.js +116 -0
  29. package/dist/core/parse/block-parser.js.map +1 -0
  30. package/dist/core/parse/executable-block.d.ts +6 -0
  31. package/dist/core/parse/executable-block.d.ts.map +1 -0
  32. package/dist/core/parse/executable-block.js +48 -0
  33. package/dist/core/parse/executable-block.js.map +1 -0
  34. package/dist/core/parse/frontmatter.d.ts +7 -0
  35. package/dist/core/parse/frontmatter.d.ts.map +1 -0
  36. package/dist/core/parse/frontmatter.js +45 -0
  37. package/dist/core/parse/frontmatter.js.map +1 -0
  38. package/dist/core/serialize.d.ts +4 -0
  39. package/dist/core/serialize.d.ts.map +1 -0
  40. package/dist/core/serialize.js +123 -0
  41. package/dist/core/serialize.js.map +1 -0
  42. package/dist/core/types.d.ts +66 -0
  43. package/dist/core/types.d.ts.map +1 -0
  44. package/dist/core/types.js +2 -0
  45. package/dist/core/types.js.map +1 -0
  46. package/dist/core/validate.d.ts +3 -0
  47. package/dist/core/validate.d.ts.map +1 -0
  48. package/dist/core/validate.js +91 -0
  49. package/dist/core/validate.js.map +1 -0
  50. package/dist/elements/components/mdsn-action.d.ts +6 -0
  51. package/dist/elements/components/mdsn-action.d.ts.map +1 -0
  52. package/dist/elements/components/mdsn-action.js +34 -0
  53. package/dist/elements/components/mdsn-action.js.map +1 -0
  54. package/dist/elements/components/mdsn-block.d.ts +9 -0
  55. package/dist/elements/components/mdsn-block.d.ts.map +1 -0
  56. package/dist/elements/components/mdsn-block.js +36 -0
  57. package/dist/elements/components/mdsn-block.js.map +1 -0
  58. package/dist/elements/components/mdsn-error.d.ts +9 -0
  59. package/dist/elements/components/mdsn-error.d.ts.map +1 -0
  60. package/dist/elements/components/mdsn-error.js +36 -0
  61. package/dist/elements/components/mdsn-error.js.map +1 -0
  62. package/dist/elements/components/mdsn-field.d.ts +6 -0
  63. package/dist/elements/components/mdsn-field.d.ts.map +1 -0
  64. package/dist/elements/components/mdsn-field.js +35 -0
  65. package/dist/elements/components/mdsn-field.js.map +1 -0
  66. package/dist/elements/components/mdsn-form.d.ts +6 -0
  67. package/dist/elements/components/mdsn-form.d.ts.map +1 -0
  68. package/dist/elements/components/mdsn-form.js +22 -0
  69. package/dist/elements/components/mdsn-form.js.map +1 -0
  70. package/dist/elements/components/mdsn-page.d.ts +9 -0
  71. package/dist/elements/components/mdsn-page.d.ts.map +1 -0
  72. package/dist/elements/components/mdsn-page.js +46 -0
  73. package/dist/elements/components/mdsn-page.js.map +1 -0
  74. package/dist/elements/index.d.ts +3 -0
  75. package/dist/elements/index.d.ts.map +1 -0
  76. package/dist/elements/index.js +3 -0
  77. package/dist/elements/index.js.map +1 -0
  78. package/dist/elements/mount.d.ts +11 -0
  79. package/dist/elements/mount.d.ts.map +1 -0
  80. package/dist/elements/mount.js +245 -0
  81. package/dist/elements/mount.js.map +1 -0
  82. package/dist/elements/register.d.ts +2 -0
  83. package/dist/elements/register.d.ts.map +1 -0
  84. package/dist/elements/register.js +27 -0
  85. package/dist/elements/register.js.map +1 -0
  86. package/dist/elements/theme.d.ts +2 -0
  87. package/dist/elements/theme.d.ts.map +1 -0
  88. package/dist/elements/theme.js +13 -0
  89. package/dist/elements/theme.js.map +1 -0
  90. package/dist/index.d.ts +4 -8
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +5 -35
  93. package/dist/index.js.map +1 -0
  94. package/dist/server/hosted-app.d.ts +35 -0
  95. package/dist/server/hosted-app.d.ts.map +1 -0
  96. package/dist/server/hosted-app.js +105 -0
  97. package/dist/server/hosted-app.js.map +1 -0
  98. package/dist/server/html-render.d.ts +13 -0
  99. package/dist/server/html-render.d.ts.map +1 -0
  100. package/dist/server/html-render.js +316 -0
  101. package/dist/server/html-render.js.map +1 -0
  102. package/dist/server/index.d.ts +8 -15
  103. package/dist/server/index.d.ts.map +1 -0
  104. package/dist/server/index.js +6 -32
  105. package/dist/server/index.js.map +1 -0
  106. package/dist/server/node.d.ts +23 -0
  107. package/dist/server/node.d.ts.map +1 -0
  108. package/dist/server/node.js +200 -0
  109. package/dist/server/node.js.map +1 -0
  110. package/dist/server/result.d.ts +15 -0
  111. package/dist/server/result.d.ts.map +1 -0
  112. package/dist/server/result.js +64 -0
  113. package/dist/server/result.js.map +1 -0
  114. package/dist/server/router.d.ts +12 -0
  115. package/dist/server/router.d.ts.map +1 -0
  116. package/dist/server/router.js +24 -0
  117. package/dist/server/router.js.map +1 -0
  118. package/dist/server/runtime.d.ts +15 -0
  119. package/dist/server/runtime.d.ts.map +1 -0
  120. package/dist/server/runtime.js +245 -0
  121. package/dist/server/runtime.js.map +1 -0
  122. package/dist/server/session.d.ts +5 -40
  123. package/dist/server/session.d.ts.map +1 -0
  124. package/dist/server/session.js +11 -213
  125. package/dist/server/session.js.map +1 -0
  126. package/dist/server/types.d.ts +62 -0
  127. package/dist/server/types.d.ts.map +1 -0
  128. package/dist/server/types.js +2 -0
  129. package/dist/server/types.js.map +1 -0
  130. package/dist/web/headless.d.ts +22 -92
  131. package/dist/web/headless.d.ts.map +1 -0
  132. package/dist/web/headless.js +311 -337
  133. package/dist/web/headless.js.map +1 -0
  134. package/dist/web/index.d.ts +2 -11
  135. package/dist/web/index.d.ts.map +1 -0
  136. package/dist/web/index.js +2 -23
  137. package/dist/web/index.js.map +1 -0
  138. package/package.json +19 -43
  139. package/LICENSE +0 -21
  140. package/dist/cli/args.d.ts +0 -8
  141. package/dist/cli/args.js +0 -63
  142. package/dist/cli/commands/build.d.ts +0 -5
  143. package/dist/cli/commands/build.js +0 -19
  144. package/dist/cli/commands/create.d.ts +0 -2
  145. package/dist/cli/commands/create.js +0 -39
  146. package/dist/cli/commands/dev.d.ts +0 -10
  147. package/dist/cli/commands/dev.js +0 -13
  148. package/dist/cli/commands/start.d.ts +0 -9
  149. package/dist/cli/commands/start.js +0 -13
  150. package/dist/cli/entry.d.ts +0 -2
  151. package/dist/cli/entry.js +0 -8
  152. package/dist/cli/index.d.ts +0 -9
  153. package/dist/cli/index.js +0 -58
  154. package/dist/core/document/frontmatter.d.ts +0 -5
  155. package/dist/core/document/frontmatter.js +0 -41
  156. package/dist/core/document/markdown.d.ts +0 -5
  157. package/dist/core/document/markdown.js +0 -81
  158. package/dist/core/document/page-definition.d.ts +0 -2
  159. package/dist/core/document/page-definition.js +0 -23
  160. package/dist/core/model/block.d.ts +0 -26
  161. package/dist/core/model/block.js +0 -8
  162. package/dist/core/model/document.d.ts +0 -11
  163. package/dist/core/model/document.js +0 -2
  164. package/dist/core/model/fragment.d.ts +0 -4
  165. package/dist/core/model/fragment.js +0 -2
  166. package/dist/core/model/index.d.ts +0 -4
  167. package/dist/core/model/index.js +0 -2
  168. package/dist/core/model/input.d.ts +0 -10
  169. package/dist/core/model/input.js +0 -2
  170. package/dist/core/protocol/mdsn.d.ts +0 -4
  171. package/dist/core/protocol/mdsn.js +0 -66
  172. package/dist/core/protocol/statements.d.ts +0 -7
  173. package/dist/core/protocol/statements.js +0 -115
  174. package/dist/core/protocol/validation.d.ts +0 -3
  175. package/dist/core/protocol/validation.js +0 -70
  176. package/dist/core/utils/html.d.ts +0 -6
  177. package/dist/core/utils/html.js +0 -28
  178. package/dist/core/utils/index.d.ts +0 -2
  179. package/dist/core/utils/index.js +0 -12
  180. package/dist/core/utils/logger.d.ts +0 -12
  181. package/dist/core/utils/logger.js +0 -45
  182. package/dist/framework/create-framework-app.d.ts +0 -13
  183. package/dist/framework/create-framework-app.js +0 -12
  184. package/dist/framework/hosted-app.d.ts +0 -34
  185. package/dist/framework/hosted-app.js +0 -223
  186. package/dist/framework/index.d.ts +0 -6
  187. package/dist/framework/index.js +0 -9
  188. package/dist/framework/site-app.d.ts +0 -13
  189. package/dist/framework/site-app.js +0 -147
  190. package/dist/server/action-context.d.ts +0 -11
  191. package/dist/server/action-context.js +0 -26
  192. package/dist/server/action-host.d.ts +0 -2
  193. package/dist/server/action-host.js +0 -10
  194. package/dist/server/action-inputs.d.ts +0 -3
  195. package/dist/server/action-inputs.js +0 -178
  196. package/dist/server/action-runtime.d.ts +0 -8
  197. package/dist/server/action-runtime.js +0 -62
  198. package/dist/server/action.d.ts +0 -33
  199. package/dist/server/action.js +0 -101
  200. package/dist/server/build.d.ts +0 -10
  201. package/dist/server/build.js +0 -170
  202. package/dist/server/config.d.ts +0 -56
  203. package/dist/server/config.js +0 -42
  204. package/dist/server/dev.d.ts +0 -48
  205. package/dist/server/dev.js +0 -90
  206. package/dist/server/error-fragments.d.ts +0 -46
  207. package/dist/server/error-fragments.js +0 -77
  208. package/dist/server/init.d.ts +0 -1
  209. package/dist/server/init.js +0 -176
  210. package/dist/server/layout.d.ts +0 -17
  211. package/dist/server/layout.js +0 -40
  212. package/dist/server/markdown.d.ts +0 -49
  213. package/dist/server/markdown.js +0 -77
  214. package/dist/server/module-loader.d.ts +0 -4
  215. package/dist/server/module-loader.js +0 -71
  216. package/dist/server/negotiate.d.ts +0 -3
  217. package/dist/server/negotiate.js +0 -61
  218. package/dist/server/page-host.d.ts +0 -21
  219. package/dist/server/page-host.js +0 -66
  220. package/dist/server/page-links.d.ts +0 -10
  221. package/dist/server/page-links.js +0 -80
  222. package/dist/server/route-matcher.d.ts +0 -6
  223. package/dist/server/route-matcher.js +0 -73
  224. package/dist/server/routes.d.ts +0 -6
  225. package/dist/server/routes.js +0 -73
  226. package/dist/server/server.d.ts +0 -28
  227. package/dist/server/server.js +0 -161
  228. package/dist/server/site.d.ts +0 -11
  229. package/dist/server/site.js +0 -59
  230. package/dist/server/targets.d.ts +0 -7
  231. package/dist/server/targets.js +0 -21
  232. package/dist/web/block-runtime.d.ts +0 -2
  233. package/dist/web/block-runtime.js +0 -25
  234. package/dist/web/fragment-render.d.ts +0 -8
  235. package/dist/web/fragment-render.js +0 -58
  236. package/dist/web/i18n.d.ts +0 -29
  237. package/dist/web/i18n.js +0 -65
  238. package/dist/web/navigation.d.ts +0 -3
  239. package/dist/web/navigation.js +0 -32
  240. package/dist/web/page-bootstrap.d.ts +0 -6
  241. package/dist/web/page-bootstrap.js +0 -28
  242. package/dist/web/page-client-runtime.d.ts +0 -4
  243. package/dist/web/page-client-runtime.js +0 -7
  244. package/dist/web/page-client-script.d.ts +0 -1
  245. package/dist/web/page-client-script.js +0 -579
  246. package/dist/web/page-html.d.ts +0 -8
  247. package/dist/web/page-html.js +0 -42
  248. package/dist/web/page-render.d.ts +0 -20
  249. package/dist/web/page-render.js +0 -84
  250. package/dist/web/public-client-runtime.d.ts +0 -1
  251. package/dist/web/public-client-runtime.js +0 -5
  252. package/dist/web/public-render.d.ts +0 -12
  253. package/dist/web/public-render.js +0 -18
  254. package/dist/web/target-path.d.ts +0 -1
  255. package/dist/web/target-path.js +0 -35
@@ -0,0 +1,23 @@
1
+ import type { RequestListener } from "node:http";
2
+ import type { MdsnRequest, MdsnResponse } from "./types.js";
3
+ interface MdsnRequestHandler {
4
+ handle(request: MdsnRequest): Promise<MdsnResponse>;
5
+ }
6
+ export interface CreateNodeRequestListenerOptions {
7
+ transformHtml?: (html: string) => string;
8
+ maxBodyBytes?: number;
9
+ }
10
+ export interface NodeStaticMount {
11
+ urlPrefix: string;
12
+ directory: string;
13
+ }
14
+ export interface CreateNodeHostOptions extends CreateNodeRequestListenerOptions {
15
+ rootRedirect?: string;
16
+ ignoreFavicon?: boolean;
17
+ staticFiles?: Record<string, string>;
18
+ staticMounts?: NodeStaticMount[];
19
+ }
20
+ export declare function createNodeRequestListener(handler: MdsnRequestHandler, options?: CreateNodeRequestListenerOptions): RequestListener;
21
+ export declare function createNodeHost(handler: MdsnRequestHandler, options?: CreateNodeHostOptions): RequestListener;
22
+ export {};
23
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/server/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,eAAe,EAAkB,MAAM,WAAW,CAAC;AAQlF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,UAAU,kBAAkB;IAC1B,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,gCAAgC;IAC/C,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAsB,SAAQ,gCAAgC;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;CAClC;AAuKD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,GAAE,gCAAqC,GAC7C,eAAe,CAmBjB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,GAAE,qBAA0B,GAAG,eAAe,CAiChH"}
@@ -0,0 +1,200 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { stat } from "node:fs/promises";
3
+ import { extname, resolve } from "node:path";
4
+ import { pipeline } from "node:stream/promises";
5
+ import { serializeMarkdownBody } from "../core/index.js";
6
+ const DEFAULT_MAX_BODY_BYTES = 1024 * 1024;
7
+ class PayloadTooLargeError extends Error {
8
+ constructor() {
9
+ super("Payload Too Large");
10
+ }
11
+ }
12
+ async function readBody(request, maxBodyBytes) {
13
+ let body = "";
14
+ let totalBytes = 0;
15
+ for await (const chunk of request) {
16
+ const textChunk = typeof chunk === "string" ? chunk : chunk.toString("utf8");
17
+ const chunkBytes = typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.byteLength;
18
+ totalBytes += chunkBytes;
19
+ if (totalBytes > maxBodyBytes) {
20
+ throw new PayloadTooLargeError();
21
+ }
22
+ body += textChunk;
23
+ }
24
+ return body || undefined;
25
+ }
26
+ function normalizeHeaderValue(value) {
27
+ if (Array.isArray(value)) {
28
+ return value.join(", ");
29
+ }
30
+ return value;
31
+ }
32
+ function parseCookies(header) {
33
+ if (!header?.trim()) {
34
+ return {};
35
+ }
36
+ const cookies = {};
37
+ for (const pair of header.split(";")) {
38
+ const [rawName, ...rawValue] = pair.split("=");
39
+ const name = rawName?.trim();
40
+ if (!name) {
41
+ continue;
42
+ }
43
+ const serializedValue = rawValue.join("=").trim();
44
+ try {
45
+ cookies[name] = decodeURIComponent(serializedValue);
46
+ }
47
+ catch {
48
+ cookies[name] = serializedValue;
49
+ }
50
+ }
51
+ return cookies;
52
+ }
53
+ function normalizeBody(body, contentType) {
54
+ if (!body) {
55
+ return undefined;
56
+ }
57
+ if (!contentType.includes("application/x-www-form-urlencoded")) {
58
+ return body;
59
+ }
60
+ const params = new URLSearchParams(body);
61
+ return serializeMarkdownBody(Object.fromEntries(params.entries()));
62
+ }
63
+ function getContentType(filePath) {
64
+ const extension = extname(filePath);
65
+ return extension === ".js"
66
+ ? "text/javascript"
67
+ : extension === ".css"
68
+ ? "text/css"
69
+ : extension === ".map" || extension === ".json"
70
+ ? "application/json"
71
+ : extension === ".html"
72
+ ? "text/html"
73
+ : extension === ".svg"
74
+ ? "image/svg+xml"
75
+ : extension === ".mjs"
76
+ ? "text/javascript"
77
+ : extension === ".txt"
78
+ ? "text/plain"
79
+ : "application/octet-stream";
80
+ }
81
+ function toEtag(size, mtimeMs) {
82
+ return `W/"${size.toString(16)}-${Math.floor(mtimeMs).toString(16)}"`;
83
+ }
84
+ async function tryServeStaticFile(request, response, filePath) {
85
+ try {
86
+ const fileStat = await stat(filePath);
87
+ if (!fileStat.isFile()) {
88
+ return false;
89
+ }
90
+ const contentType = getContentType(filePath);
91
+ const etag = toEtag(fileStat.size, fileStat.mtimeMs);
92
+ response.setHeader("content-type", contentType);
93
+ response.setHeader("cache-control", "public, max-age=0, must-revalidate");
94
+ response.setHeader("etag", etag);
95
+ if (request.headers["if-none-match"] === etag) {
96
+ response.statusCode = 304;
97
+ response.end();
98
+ return true;
99
+ }
100
+ response.statusCode = 200;
101
+ await pipeline(createReadStream(filePath), response);
102
+ return true;
103
+ }
104
+ catch {
105
+ return false;
106
+ }
107
+ }
108
+ function resolveMountedFile(directory, urlPrefix, pathname) {
109
+ if (!pathname.startsWith(urlPrefix)) {
110
+ return null;
111
+ }
112
+ const relativePath = pathname.slice(urlPrefix.length);
113
+ const baseDirectory = resolve(directory);
114
+ const target = resolve(baseDirectory, relativePath);
115
+ if (target !== baseDirectory && !target.startsWith(`${baseDirectory}/`)) {
116
+ return null;
117
+ }
118
+ return target;
119
+ }
120
+ function toMdsnRequest(request, body) {
121
+ const method = request.method === "POST" ? "POST" : "GET";
122
+ const host = request.headers.host ?? "127.0.0.1";
123
+ const headers = Object.fromEntries(Object.entries(request.headers).map(([key, value]) => [key, normalizeHeaderValue(value)]));
124
+ headers.accept ??= "text/html";
125
+ if (body && headers["content-type"]?.includes("application/x-www-form-urlencoded")) {
126
+ headers["content-type"] = "text/markdown";
127
+ }
128
+ return {
129
+ method,
130
+ url: new URL(request.url ?? "/", `http://${host}`).toString(),
131
+ headers,
132
+ ...(body ? { body } : {}),
133
+ cookies: parseCookies(headers.cookie)
134
+ };
135
+ }
136
+ async function writeResponse(response, result, transformHtml) {
137
+ response.statusCode = result.status;
138
+ for (const [key, value] of Object.entries(result.headers)) {
139
+ response.setHeader(key, value);
140
+ }
141
+ const contentType = String(result.headers["content-type"] ?? "");
142
+ if (typeof result.body === "string") {
143
+ response.end(contentType.includes("text/html") && transformHtml ? transformHtml(result.body) : result.body);
144
+ return;
145
+ }
146
+ for await (const chunk of result.body) {
147
+ response.write(chunk);
148
+ }
149
+ response.end();
150
+ }
151
+ export function createNodeRequestListener(handler, options = {}) {
152
+ return async (request, response) => {
153
+ const contentType = request.headers["content-type"] ?? "";
154
+ const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;
155
+ let normalizedBody;
156
+ try {
157
+ normalizedBody = normalizeBody(await readBody(request, maxBodyBytes), contentType);
158
+ }
159
+ catch (error) {
160
+ if (error instanceof PayloadTooLargeError) {
161
+ response.statusCode = 413;
162
+ response.setHeader("content-type", "text/markdown");
163
+ response.end("## Payload Too Large\n\nRequest body exceeded maxBodyBytes.");
164
+ return;
165
+ }
166
+ throw error;
167
+ }
168
+ const result = await handler.handle(toMdsnRequest(request, normalizedBody));
169
+ await writeResponse(response, result, options.transformHtml);
170
+ };
171
+ }
172
+ export function createNodeHost(handler, options = {}) {
173
+ const requestListener = createNodeRequestListener(handler, options);
174
+ return async (request, response) => {
175
+ const url = new URL(request.url ?? "/", `http://${request.headers.host ?? "127.0.0.1"}`);
176
+ if (options.rootRedirect && url.pathname === "/") {
177
+ response.statusCode = 302;
178
+ response.setHeader("location", options.rootRedirect);
179
+ response.end();
180
+ return;
181
+ }
182
+ if (options.ignoreFavicon !== false && url.pathname === "/favicon.ico") {
183
+ response.statusCode = 204;
184
+ response.end();
185
+ return;
186
+ }
187
+ const staticFile = options.staticFiles?.[url.pathname];
188
+ if (staticFile && (await tryServeStaticFile(request, response, staticFile))) {
189
+ return;
190
+ }
191
+ for (const mount of options.staticMounts ?? []) {
192
+ const target = resolveMountedFile(mount.directory, mount.urlPrefix, url.pathname);
193
+ if (target && (await tryServeStaticFile(request, response, target))) {
194
+ return;
195
+ }
196
+ }
197
+ await requestListener(request, response);
198
+ };
199
+ }
200
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/server/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { MdsnComposedPage } from "../core/index.js";
2
+ import type { MdsnActionResult, MdsnStreamChunk, MdsnStreamResult } from "./types.js";
3
+ export declare function ok(result: MdsnActionResult): MdsnActionResult;
4
+ export declare function fail(result: MdsnActionResult): MdsnActionResult;
5
+ export declare function block(page: MdsnComposedPage, blockName: string, result?: Omit<MdsnActionResult, "fragment">): MdsnActionResult;
6
+ export interface NavigateOptions extends Omit<MdsnActionResult, "fragment" | "page" | "navigation"> {
7
+ blockName: string;
8
+ target: string;
9
+ markdown: string;
10
+ name?: string;
11
+ label?: string;
12
+ }
13
+ export declare function navigate(options: NavigateOptions): MdsnActionResult;
14
+ export declare function stream(source: AsyncIterable<MdsnStreamChunk> | Iterable<MdsnStreamChunk>, result?: Omit<MdsnStreamResult, "stream">): MdsnStreamResult;
15
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/server/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtF,wBAAgB,EAAE,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAK7D;AAED,wBAAgB,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAK/D;AAED,wBAAgB,KAAK,CACnB,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAM,GAC9C,gBAAgB,CAKlB;AAYD,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,MAAM,GAAG,YAAY,CAAC;IACjG,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,gBAAgB,CA8BnE;AAED,wBAAgB,MAAM,CACpB,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC,EAClE,MAAM,GAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAM,GAC5C,gBAAgB,CAMlB"}
@@ -0,0 +1,64 @@
1
+ export function ok(result) {
2
+ return {
3
+ status: 200,
4
+ ...result
5
+ };
6
+ }
7
+ export function fail(result) {
8
+ return {
9
+ status: 400,
10
+ ...result
11
+ };
12
+ }
13
+ export function block(page, blockName, result = {}) {
14
+ return ok({
15
+ ...result,
16
+ fragment: page.fragment(blockName)
17
+ });
18
+ }
19
+ function deriveNavigationName(target) {
20
+ const segment = target.split("/").filter(Boolean).at(-1) ?? "next";
21
+ return `open_${segment.replace(/[^a-zA-Z0-9_]+/g, "_")}`;
22
+ }
23
+ function deriveNavigationLabel(target) {
24
+ const segment = target.split("/").filter(Boolean).at(-1) ?? "Next";
25
+ return `Open ${segment.charAt(0).toUpperCase()}${segment.slice(1)}`;
26
+ }
27
+ export function navigate(options) {
28
+ const name = options.name ?? deriveNavigationName(options.target);
29
+ const label = options.label ?? deriveNavigationLabel(options.target);
30
+ return ok({
31
+ ...(typeof options.status === "number" ? { status: options.status } : {}),
32
+ ...(options.headers ? { headers: options.headers } : {}),
33
+ ...(options.session ? { session: options.session } : {}),
34
+ navigation: {
35
+ target: options.target
36
+ },
37
+ fragment: {
38
+ markdown: options.markdown,
39
+ blocks: [
40
+ {
41
+ name: options.blockName,
42
+ inputs: [],
43
+ operations: [
44
+ {
45
+ method: "GET",
46
+ target: options.target,
47
+ name,
48
+ inputs: [],
49
+ label
50
+ }
51
+ ]
52
+ }
53
+ ]
54
+ }
55
+ });
56
+ }
57
+ export function stream(source, result = {}) {
58
+ return {
59
+ status: 200,
60
+ ...result,
61
+ stream: source
62
+ };
63
+ }
64
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/server/result.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,EAAE,CAAC,MAAwB;IACzC,OAAO;QACL,MAAM,EAAE,GAAG;QACX,GAAG,MAAM;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,MAAwB;IAC3C,OAAO;QACL,MAAM,EAAE,GAAG;QACX,GAAG,MAAM;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,IAAsB,EACtB,SAAiB,EACjB,SAA6C,EAAE;IAE/C,OAAO,EAAE,CAAC;QACR,GAAG,MAAM;QACT,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;KACnC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IACnE,OAAO,QAAQ,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IACnE,OAAO,QAAQ,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACtE,CAAC;AAUD,MAAM,UAAU,QAAQ,CAAC,OAAwB;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAErE,OAAO,EAAE,CAAC;QACR,GAAG,CAAC,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,UAAU,EAAE;YACV,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB;QACD,QAAQ,EAAE;YACR,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,OAAO,CAAC,SAAS;oBACvB,MAAM,EAAE,EAAE;oBACV,UAAU,EAAE;wBACV;4BACE,MAAM,EAAE,KAAK;4BACb,MAAM,EAAE,OAAO,CAAC,MAAM;4BACtB,IAAI;4BACJ,MAAM,EAAE,EAAE;4BACV,KAAK;yBACN;qBACF;iBACF;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,MAAkE,EAClE,SAA2C,EAAE;IAE7C,OAAO;QACL,MAAM,EAAE,GAAG;QACX,GAAG,MAAM;QACT,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { MdsnHandler, MdsnPageHandler } from "./types.js";
2
+ export declare class MdsnRouter {
3
+ private readonly getHandlers;
4
+ private readonly postHandlers;
5
+ private readonly pageHandlers;
6
+ get(path: string, handler: MdsnHandler): void;
7
+ post(path: string, handler: MdsnHandler): void;
8
+ page(path: string, handler: MdsnPageHandler): void;
9
+ resolve(method: "GET" | "POST", path: string): MdsnHandler | undefined;
10
+ resolvePage(path: string): MdsnPageHandler | undefined;
11
+ }
12
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/D,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IAEnE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAI7C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAI9C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAIlD,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAOtE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;CAGvD"}
@@ -0,0 +1,24 @@
1
+ export class MdsnRouter {
2
+ getHandlers = new Map();
3
+ postHandlers = new Map();
4
+ pageHandlers = new Map();
5
+ get(path, handler) {
6
+ this.getHandlers.set(path, handler);
7
+ }
8
+ post(path, handler) {
9
+ this.postHandlers.set(path, handler);
10
+ }
11
+ page(path, handler) {
12
+ this.pageHandlers.set(path, handler);
13
+ }
14
+ resolve(method, path) {
15
+ if (method === "GET") {
16
+ return this.getHandlers.get(path);
17
+ }
18
+ return this.postHandlers.get(path);
19
+ }
20
+ resolvePage(path) {
21
+ return this.pageHandlers.get(path);
22
+ }
23
+ }
24
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IACJ,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,YAAY,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnE,GAAG,CAAC,IAAY,EAAE,OAAoB;QACpC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,OAAoB;QACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,OAAwB;QACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,MAAsB,EAAE,IAAY;QAC1C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import { type MdsnMarkdownRenderer } from "../core/index.js";
2
+ import { renderHtmlDocument } from "./html-render.js";
3
+ import type { MdsnHandler, MdsnPageHandler, MdsnRequest, MdsnResponse, MdsnSessionProvider } from "./types.js";
4
+ export interface CreateMdsnServerOptions {
5
+ session?: MdsnSessionProvider;
6
+ renderHtml?: typeof renderHtmlDocument;
7
+ markdownRenderer?: MdsnMarkdownRenderer;
8
+ }
9
+ export declare function createMdsnServer(options?: CreateMdsnServerOptions): {
10
+ get(path: string, handler: MdsnHandler): void;
11
+ page(path: string, handler: MdsnPageHandler): void;
12
+ post(path: string, handler: MdsnHandler): void;
13
+ handle(request: MdsnRequest): Promise<MdsnResponse>;
14
+ };
15
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/server/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,oBAAoB,EAE1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,KAAK,EAAoB,WAAW,EAAqB,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAqC,MAAM,YAAY,CAAC;AAEvL,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,kBAAkB,CAAC;IACvC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAqKD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B;cAYxD,MAAM,WAAW,WAAW,GAAG,IAAI;eAGlC,MAAM,WAAW,eAAe,GAAG,IAAI;eAGvC,MAAM,WAAW,WAAW,GAAG,IAAI;oBAGxB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;EAwH5D"}
@@ -0,0 +1,245 @@
1
+ import { MdsnParseError, negotiateRepresentation, parseMarkdownBody, serializeFragment, serializePage } from "../core/index.js";
2
+ import { renderHtmlDocument } from "./html-render.js";
3
+ import { MdsnRouter } from "./router.js";
4
+ import { fail } from "./result.js";
5
+ function getPathname(request) {
6
+ return new URL(request.url).pathname;
7
+ }
8
+ function getInputs(request) {
9
+ if (request.method === "GET") {
10
+ const url = new URL(request.url);
11
+ return Object.fromEntries(url.searchParams.entries());
12
+ }
13
+ return parseMarkdownBody(request.body ?? "");
14
+ }
15
+ function isSupportedWriteContentType(contentType) {
16
+ if (!contentType) {
17
+ return false;
18
+ }
19
+ return contentType.includes("text/markdown");
20
+ }
21
+ function hasRequestBody(request) {
22
+ return typeof request.body === "string" && request.body.trim().length > 0;
23
+ }
24
+ function createErrorFragment(title, detail) {
25
+ return {
26
+ markdown: detail ? `## ${title}\n\n${detail}` : `## ${title}`,
27
+ blocks: []
28
+ };
29
+ }
30
+ function createInternalServerErrorResult() {
31
+ return fail({
32
+ status: 500,
33
+ fragment: createErrorFragment("Internal Server Error", "The host hit an unexpected failure. Retry the previous action or refresh the page.")
34
+ });
35
+ }
36
+ function getRenderablePage(page) {
37
+ const visibleBlockNames = page.visibleBlockNames ? new Set(page.visibleBlockNames) : null;
38
+ const blocks = visibleBlockNames ? page.blocks.filter((block) => visibleBlockNames.has(block.name)) : page.blocks;
39
+ const blockContent = page.blockContent && visibleBlockNames
40
+ ? Object.fromEntries(Object.entries(page.blockContent).filter(([name]) => visibleBlockNames.has(name)))
41
+ : page.blockContent;
42
+ return blockContent
43
+ ? {
44
+ markdown: page.markdown,
45
+ blockContent,
46
+ blocks
47
+ }
48
+ : {
49
+ markdown: page.markdown,
50
+ blocks
51
+ };
52
+ }
53
+ function resolveResponseBody(result, representation, renderHtml) {
54
+ if (result.page) {
55
+ return representation === "markdown"
56
+ ? serializePage(result.page)
57
+ : renderHtml(getRenderablePage(result.page), {
58
+ kind: "page",
59
+ ...(result.navigation?.target ? { continueTarget: result.navigation.target } : {})
60
+ });
61
+ }
62
+ if (!result.fragment) {
63
+ throw new Error("Action results must include either a fragment or a page.");
64
+ }
65
+ return representation === "markdown"
66
+ ? serializeFragment(result.fragment)
67
+ : renderHtml(result.fragment, {
68
+ kind: "fragment",
69
+ ...(result.navigation?.target ? { continueTarget: result.navigation.target } : {})
70
+ });
71
+ }
72
+ function isStreamResult(result) {
73
+ return "stream" in result;
74
+ }
75
+ function toAsyncIterable(stream) {
76
+ if (Symbol.asyncIterator in stream) {
77
+ return stream;
78
+ }
79
+ return (async function* () {
80
+ yield* stream;
81
+ })();
82
+ }
83
+ function serializeSseMessage(markdown) {
84
+ const normalized = markdown.replaceAll("\r\n", "\n");
85
+ const lines = normalized.split("\n");
86
+ return `${lines.map((line) => `data: ${line}`).join("\n")}\n\n`;
87
+ }
88
+ function createStreamBody(result) {
89
+ if (!isStreamResult(result)) {
90
+ if (!result.fragment) {
91
+ throw new Error("Non-stream event-stream responses must include a fragment.");
92
+ }
93
+ return serializeSseMessage(serializeFragment(result.fragment));
94
+ }
95
+ return (async function* () {
96
+ for await (const chunk of toAsyncIterable(result.stream)) {
97
+ const markdown = typeof chunk === "string" ? chunk : serializeFragment(chunk);
98
+ yield serializeSseMessage(markdown);
99
+ }
100
+ })();
101
+ }
102
+ function createResponse(result, representation, renderHtml) {
103
+ const headers = {
104
+ "content-type": representation === "markdown" ? "text/markdown" : representation === "html" ? "text/html" : "text/event-stream",
105
+ ...(result.headers ?? {})
106
+ };
107
+ const body = representation === "markdown"
108
+ ? resolveResponseBody(result, "markdown", renderHtml)
109
+ : representation === "html"
110
+ ? resolveResponseBody(result, "html", renderHtml)
111
+ : createStreamBody(result);
112
+ return {
113
+ status: result.status ?? 200,
114
+ headers,
115
+ body
116
+ };
117
+ }
118
+ function createPageResponse(page, representation, renderHtml, route) {
119
+ return {
120
+ status: 200,
121
+ headers: {
122
+ "content-type": representation === "markdown" ? "text/markdown" : "text/html"
123
+ },
124
+ body: representation === "markdown"
125
+ ? serializePage(page)
126
+ : renderHtml(getRenderablePage(page), {
127
+ kind: "page",
128
+ ...(route ? { route } : {})
129
+ })
130
+ };
131
+ }
132
+ export function createMdsnServer(options = {}) {
133
+ const router = new MdsnRouter();
134
+ const sessionProvider = options.session;
135
+ const htmlRenderer = options.renderHtml ??
136
+ ((fragment, renderOptions) => renderHtmlDocument(fragment, {
137
+ ...renderOptions,
138
+ ...(options.markdownRenderer ? { markdownRenderer: options.markdownRenderer } : {})
139
+ }));
140
+ return {
141
+ get(path, handler) {
142
+ router.get(path, handler);
143
+ },
144
+ page(path, handler) {
145
+ router.page(path, handler);
146
+ },
147
+ post(path, handler) {
148
+ router.post(path, handler);
149
+ },
150
+ async handle(request) {
151
+ const representation = negotiateRepresentation(request.headers.accept);
152
+ if (representation === "not-acceptable") {
153
+ return createResponse(fail({
154
+ status: 406,
155
+ fragment: {
156
+ markdown: "## Not Acceptable",
157
+ blocks: []
158
+ }
159
+ }), "markdown", htmlRenderer);
160
+ }
161
+ const pathname = getPathname(request);
162
+ const session = sessionProvider ? await sessionProvider.read(request) : null;
163
+ if (request.method === "GET") {
164
+ const pageHandler = router.resolvePage(pathname);
165
+ if (pageHandler) {
166
+ if (representation === "event-stream") {
167
+ return createResponse(fail({
168
+ status: 406,
169
+ fragment: createErrorFragment("Not Acceptable", "Page routes do not support text/event-stream.")
170
+ }), "markdown", htmlRenderer);
171
+ }
172
+ let page;
173
+ try {
174
+ page = await pageHandler({
175
+ request,
176
+ session
177
+ });
178
+ }
179
+ catch {
180
+ return createResponse(createInternalServerErrorResult(), representation, htmlRenderer);
181
+ }
182
+ if (page) {
183
+ return createPageResponse(page, representation, htmlRenderer, pathname);
184
+ }
185
+ }
186
+ }
187
+ const handler = router.resolve(request.method, pathname);
188
+ if (!handler) {
189
+ return createResponse(fail({
190
+ status: 404,
191
+ fragment: {
192
+ markdown: "## Not Found",
193
+ blocks: []
194
+ }
195
+ }), representation, htmlRenderer);
196
+ }
197
+ if (request.method === "POST" && hasRequestBody(request) && !isSupportedWriteContentType(request.headers["content-type"])) {
198
+ return createResponse(fail({
199
+ status: 415,
200
+ fragment: createErrorFragment("Unsupported Media Type", 'POST requests must use Content-Type: "text/markdown".')
201
+ }), representation, htmlRenderer);
202
+ }
203
+ let inputs;
204
+ try {
205
+ inputs = getInputs(request);
206
+ }
207
+ catch (error) {
208
+ if (error instanceof MdsnParseError) {
209
+ return createResponse(fail({
210
+ status: 400,
211
+ fragment: createErrorFragment("Invalid Request Body", error.message)
212
+ }), representation, htmlRenderer);
213
+ }
214
+ throw error;
215
+ }
216
+ let result;
217
+ try {
218
+ result = await handler({
219
+ request,
220
+ inputs,
221
+ session
222
+ });
223
+ }
224
+ catch {
225
+ return createResponse(createInternalServerErrorResult(), representation, htmlRenderer);
226
+ }
227
+ const response = createResponse(result, representation, htmlRenderer);
228
+ if (sessionProvider) {
229
+ try {
230
+ if (result.session?.type === "sign-out") {
231
+ await sessionProvider.clear(session, response, request);
232
+ }
233
+ else {
234
+ await sessionProvider.commit(result.session ?? null, response);
235
+ }
236
+ }
237
+ catch {
238
+ return createResponse(createInternalServerErrorResult(), representation, htmlRenderer);
239
+ }
240
+ }
241
+ return response;
242
+ }
243
+ };
244
+ }
245
+ //# sourceMappingURL=runtime.js.map