@mdanai/sdk 0.5.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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +126 -0
  3. package/dist/core/errors.d.ts +14 -0
  4. package/dist/core/errors.d.ts.map +1 -0
  5. package/dist/core/errors.js +13 -0
  6. package/dist/core/errors.js.map +1 -0
  7. package/dist/core/index.d.ts +16 -0
  8. package/dist/core/index.d.ts.map +1 -0
  9. package/dist/core/index.js +69 -0
  10. package/dist/core/index.js.map +1 -0
  11. package/dist/core/markdown-body.d.ts +3 -0
  12. package/dist/core/markdown-body.d.ts.map +1 -0
  13. package/dist/core/markdown-body.js +65 -0
  14. package/dist/core/markdown-body.js.map +1 -0
  15. package/dist/core/markdown-renderer.d.ts +5 -0
  16. package/dist/core/markdown-renderer.d.ts.map +1 -0
  17. package/dist/core/markdown-renderer.js +75 -0
  18. package/dist/core/markdown-renderer.js.map +1 -0
  19. package/dist/core/negotiate.d.ts +3 -0
  20. package/dist/core/negotiate.d.ts.map +1 -0
  21. package/dist/core/negotiate.js +63 -0
  22. package/dist/core/negotiate.js.map +1 -0
  23. package/dist/core/parse/anchors.d.ts +2 -0
  24. package/dist/core/parse/anchors.d.ts.map +1 -0
  25. package/dist/core/parse/anchors.js +26 -0
  26. package/dist/core/parse/anchors.js.map +1 -0
  27. package/dist/core/parse/block-parser.d.ts +3 -0
  28. package/dist/core/parse/block-parser.d.ts.map +1 -0
  29. package/dist/core/parse/block-parser.js +117 -0
  30. package/dist/core/parse/block-parser.js.map +1 -0
  31. package/dist/core/parse/executable-block.d.ts +6 -0
  32. package/dist/core/parse/executable-block.d.ts.map +1 -0
  33. package/dist/core/parse/executable-block.js +48 -0
  34. package/dist/core/parse/executable-block.js.map +1 -0
  35. package/dist/core/parse/frontmatter.d.ts +7 -0
  36. package/dist/core/parse/frontmatter.d.ts.map +1 -0
  37. package/dist/core/parse/frontmatter.js +45 -0
  38. package/dist/core/parse/frontmatter.js.map +1 -0
  39. package/dist/core/serialize.d.ts +4 -0
  40. package/dist/core/serialize.d.ts.map +1 -0
  41. package/dist/core/serialize.js +126 -0
  42. package/dist/core/serialize.js.map +1 -0
  43. package/dist/core/types.d.ts +67 -0
  44. package/dist/core/types.d.ts.map +1 -0
  45. package/dist/core/types.js +2 -0
  46. package/dist/core/types.js.map +1 -0
  47. package/dist/core/validate.d.ts +3 -0
  48. package/dist/core/validate.d.ts.map +1 -0
  49. package/dist/core/validate.js +107 -0
  50. package/dist/core/validate.js.map +1 -0
  51. package/dist/elements/components/mdan-action.d.ts +6 -0
  52. package/dist/elements/components/mdan-action.d.ts.map +1 -0
  53. package/dist/elements/components/mdan-action.js +34 -0
  54. package/dist/elements/components/mdan-action.js.map +1 -0
  55. package/dist/elements/components/mdan-block.d.ts +9 -0
  56. package/dist/elements/components/mdan-block.d.ts.map +1 -0
  57. package/dist/elements/components/mdan-block.js +36 -0
  58. package/dist/elements/components/mdan-block.js.map +1 -0
  59. package/dist/elements/components/mdan-error.d.ts +9 -0
  60. package/dist/elements/components/mdan-error.d.ts.map +1 -0
  61. package/dist/elements/components/mdan-error.js +36 -0
  62. package/dist/elements/components/mdan-error.js.map +1 -0
  63. package/dist/elements/components/mdan-field.d.ts +6 -0
  64. package/dist/elements/components/mdan-field.d.ts.map +1 -0
  65. package/dist/elements/components/mdan-field.js +35 -0
  66. package/dist/elements/components/mdan-field.js.map +1 -0
  67. package/dist/elements/components/mdan-form.d.ts +6 -0
  68. package/dist/elements/components/mdan-form.d.ts.map +1 -0
  69. package/dist/elements/components/mdan-form.js +22 -0
  70. package/dist/elements/components/mdan-form.js.map +1 -0
  71. package/dist/elements/components/mdan-page.d.ts +9 -0
  72. package/dist/elements/components/mdan-page.d.ts.map +1 -0
  73. package/dist/elements/components/mdan-page.js +46 -0
  74. package/dist/elements/components/mdan-page.js.map +1 -0
  75. package/dist/elements/index.d.ts +3 -0
  76. package/dist/elements/index.d.ts.map +1 -0
  77. package/dist/elements/index.js +3 -0
  78. package/dist/elements/index.js.map +1 -0
  79. package/dist/elements/mount.d.ts +11 -0
  80. package/dist/elements/mount.d.ts.map +1 -0
  81. package/dist/elements/mount.js +436 -0
  82. package/dist/elements/mount.js.map +1 -0
  83. package/dist/elements/register.d.ts +2 -0
  84. package/dist/elements/register.d.ts.map +1 -0
  85. package/dist/elements/register.js +27 -0
  86. package/dist/elements/register.js.map +1 -0
  87. package/dist/elements/theme.d.ts +2 -0
  88. package/dist/elements/theme.d.ts.map +1 -0
  89. package/dist/elements/theme.js +13 -0
  90. package/dist/elements/theme.js.map +1 -0
  91. package/dist/index.d.ts +4 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +5 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/server/bun.d.ts +19 -0
  96. package/dist/server/bun.d.ts.map +1 -0
  97. package/dist/server/bun.js +214 -0
  98. package/dist/server/bun.js.map +1 -0
  99. package/dist/server/content-type.d.ts +3 -0
  100. package/dist/server/content-type.d.ts.map +1 -0
  101. package/dist/server/content-type.js +5 -0
  102. package/dist/server/content-type.js.map +1 -0
  103. package/dist/server/hosted-app.d.ts +35 -0
  104. package/dist/server/hosted-app.d.ts.map +1 -0
  105. package/dist/server/hosted-app.js +113 -0
  106. package/dist/server/hosted-app.js.map +1 -0
  107. package/dist/server/html-render.d.ts +21 -0
  108. package/dist/server/html-render.d.ts.map +1 -0
  109. package/dist/server/html-render.js +360 -0
  110. package/dist/server/html-render.js.map +1 -0
  111. package/dist/server/index.d.ts +8 -0
  112. package/dist/server/index.d.ts.map +1 -0
  113. package/dist/server/index.js +6 -0
  114. package/dist/server/index.js.map +1 -0
  115. package/dist/server/node-runtime.d.ts +2 -0
  116. package/dist/server/node-runtime.d.ts.map +1 -0
  117. package/dist/server/node-runtime.js +2 -0
  118. package/dist/server/node-runtime.js.map +1 -0
  119. package/dist/server/node.d.ts +23 -0
  120. package/dist/server/node.d.ts.map +1 -0
  121. package/dist/server/node.js +210 -0
  122. package/dist/server/node.js.map +1 -0
  123. package/dist/server/result.d.ts +7 -0
  124. package/dist/server/result.d.ts.map +1 -0
  125. package/dist/server/result.js +26 -0
  126. package/dist/server/result.js.map +1 -0
  127. package/dist/server/router.d.ts +12 -0
  128. package/dist/server/router.d.ts.map +1 -0
  129. package/dist/server/router.js +24 -0
  130. package/dist/server/router.js.map +1 -0
  131. package/dist/server/runtime.d.ts +16 -0
  132. package/dist/server/runtime.d.ts.map +1 -0
  133. package/dist/server/runtime.js +532 -0
  134. package/dist/server/runtime.js.map +1 -0
  135. package/dist/server/session.d.ts +5 -0
  136. package/dist/server/session.d.ts.map +1 -0
  137. package/dist/server/session.js +18 -0
  138. package/dist/server/session.js.map +1 -0
  139. package/dist/server/types.d.ts +72 -0
  140. package/dist/server/types.d.ts.map +1 -0
  141. package/dist/server/types.js +2 -0
  142. package/dist/server/types.js.map +1 -0
  143. package/dist/web/headless.d.ts +32 -0
  144. package/dist/web/headless.d.ts.map +1 -0
  145. package/dist/web/headless.js +391 -0
  146. package/dist/web/headless.js.map +1 -0
  147. package/dist/web/index.d.ts +2 -0
  148. package/dist/web/index.d.ts.map +1 -0
  149. package/dist/web/index.js +2 -0
  150. package/dist/web/index.js.map +1 -0
  151. package/package.json +81 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/server/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { MdanComposedPage } from "../core/index.js";
2
+ import type { MdanActionResult, MdanStreamChunk, MdanStreamResult } from "./types.js";
3
+ export declare function ok(result: MdanActionResult): MdanActionResult;
4
+ export declare function fail(result: MdanActionResult): MdanActionResult;
5
+ export declare function block(page: MdanComposedPage, blockName: string, result?: Omit<MdanActionResult, "fragment">): MdanActionResult;
6
+ export declare function stream(source: AsyncIterable<MdanStreamChunk> | Iterable<MdanStreamChunk>, result?: Omit<MdanStreamResult, "stream">): MdanStreamResult;
7
+ //# 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;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,26 @@
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
+ export function stream(source, result = {}) {
20
+ return {
21
+ status: 200,
22
+ ...result,
23
+ stream: source
24
+ };
25
+ }
26
+ //# 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,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 { MdanHandler, MdanPageHandler } from "./types.js";
2
+ export declare class MdanRouter {
3
+ private readonly getHandlers;
4
+ private readonly postHandlers;
5
+ private readonly pageHandlers;
6
+ get(path: string, handler: MdanHandler): void;
7
+ post(path: string, handler: MdanHandler): void;
8
+ page(path: string, handler: MdanPageHandler): void;
9
+ resolve(method: "GET" | "POST", path: string): MdanHandler | undefined;
10
+ resolvePage(path: string): MdanPageHandler | 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 MdanRouter {
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,16 @@
1
+ import { type MdanMarkdownRenderer } from "../core/index.js";
2
+ import { renderHtmlDocument } from "./html-render.js";
3
+ import type { MdanHandler, MdanHtmlDiscoveryResolver, MdanPageHandler, MdanRequest, MdanResponse, MdanSessionProvider } from "./types.js";
4
+ export interface CreateMdanServerOptions {
5
+ session?: MdanSessionProvider;
6
+ renderHtml?: typeof renderHtmlDocument;
7
+ markdownRenderer?: MdanMarkdownRenderer;
8
+ htmlDiscovery?: MdanHtmlDiscoveryResolver;
9
+ }
10
+ export declare function createMdanServer(options?: CreateMdanServerOptions): {
11
+ get(path: string, handler: MdanHandler): void;
12
+ page(path: string, handler: MdanPageHandler): void;
13
+ post(path: string, handler: MdanHandler): void;
14
+ handle(request: MdanRequest): Promise<MdanResponse>;
15
+ };
16
+ //# 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,EAQL,KAAK,oBAAoB,EAG1B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAA4B,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGhF,OAAO,KAAK,EAEV,WAAW,EAIX,yBAAyB,EACzB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,mBAAmB,EAIpB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,kBAAkB,CAAC;IACvC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C;AAihBD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B;cAcxD,MAAM,WAAW,WAAW,GAAG,IAAI;eAGlC,MAAM,WAAW,eAAe,GAAG,IAAI;eAGvC,MAAM,WAAW,WAAW,GAAG,IAAI;oBAGxB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;EA2J5D"}
@@ -0,0 +1,532 @@
1
+ import { MdanParseError, negotiateRepresentation, parseMarkdownBody, serializeFragment, serializePage } from "../core/index.js";
2
+ import { toMarkdownContentType } from "./content-type.js";
3
+ import { injectHtmlDiscoveryLinks, renderHtmlDocument } from "./html-render.js";
4
+ import { MdanRouter } from "./router.js";
5
+ import { fail } from "./result.js";
6
+ function getPathname(request) {
7
+ return new URL(request.url).pathname;
8
+ }
9
+ function getInputs(request) {
10
+ if (request.method === "GET") {
11
+ const url = new URL(request.url);
12
+ return Object.fromEntries(url.searchParams.entries());
13
+ }
14
+ return parseMarkdownBody(request.body ?? "");
15
+ }
16
+ function isSupportedWriteContentType(contentType) {
17
+ if (!contentType) {
18
+ return false;
19
+ }
20
+ return contentType.includes("text/markdown");
21
+ }
22
+ function hasRequestBody(request) {
23
+ return typeof request.body === "string" && request.body.trim().length > 0;
24
+ }
25
+ function createErrorFragment(title, detail) {
26
+ return {
27
+ markdown: detail ? `## ${title}\n\n${detail}` : `## ${title}`,
28
+ blocks: []
29
+ };
30
+ }
31
+ function createInternalServerErrorResult() {
32
+ return fail({
33
+ status: 500,
34
+ fragment: createErrorFragment("Internal Server Error", "The host hit an unexpected failure. Retry the previous action or refresh the page.")
35
+ });
36
+ }
37
+ function normalizeDiscoveryLink(value) {
38
+ const trimmed = value?.trim();
39
+ return trimmed ? trimmed : undefined;
40
+ }
41
+ function resolveHtmlDiscoveryLinks(htmlDiscovery, context) {
42
+ if (!htmlDiscovery) {
43
+ return null;
44
+ }
45
+ const resolved = typeof htmlDiscovery === "function" ? htmlDiscovery(context) : htmlDiscovery;
46
+ if (!resolved) {
47
+ return null;
48
+ }
49
+ const markdownHref = normalizeDiscoveryLink(resolved.markdownHref);
50
+ const llmsTxtHref = normalizeDiscoveryLink(resolved.llmsTxtHref);
51
+ if (!markdownHref && !llmsTxtHref) {
52
+ return null;
53
+ }
54
+ return {
55
+ ...(markdownHref ? { markdownHref } : {}),
56
+ ...(llmsTxtHref ? { llmsTxtHref } : {})
57
+ };
58
+ }
59
+ function discoveryLinksToHeader(links) {
60
+ if (!links) {
61
+ return undefined;
62
+ }
63
+ const values = [
64
+ links.markdownHref ? `<${links.markdownHref}>; rel="alternate"; type="text/markdown"` : "",
65
+ links.llmsTxtHref ? `<${links.llmsTxtHref}>; rel="llms-txt"` : ""
66
+ ].filter(Boolean);
67
+ return values.length > 0 ? values.join(", ") : undefined;
68
+ }
69
+ function mergeLinkHeader(headers, linkHeader) {
70
+ if (!linkHeader) {
71
+ return headers;
72
+ }
73
+ return {
74
+ ...headers,
75
+ link: headers.link ? `${headers.link}, ${linkHeader}` : linkHeader
76
+ };
77
+ }
78
+ function isAutoDependency(operation) {
79
+ return operation.method === "GET" && operation.auto === true;
80
+ }
81
+ function applySessionMutation(session, mutation) {
82
+ if (!mutation) {
83
+ return session;
84
+ }
85
+ if (mutation.type === "sign-out") {
86
+ return null;
87
+ }
88
+ return mutation.session;
89
+ }
90
+ function createImplicitGetRequest(target, request) {
91
+ const targetUrl = new URL(target, request.url);
92
+ return {
93
+ ...request,
94
+ method: "GET",
95
+ url: targetUrl.toString(),
96
+ headers: {
97
+ ...request.headers,
98
+ accept: "text/markdown"
99
+ },
100
+ query: Object.fromEntries(targetUrl.searchParams.entries())
101
+ };
102
+ }
103
+ function applyImplicitFragmentToPage(page, blockName, operation, fragment) {
104
+ const existingBlock = page.blocks.find((block) => block.name === blockName);
105
+ const returnedBlock = fragment.blocks.find((block) => block.name === blockName) ?? fragment.blocks[0];
106
+ const nextBlock = returnedBlock ??
107
+ (existingBlock
108
+ ? {
109
+ ...existingBlock,
110
+ operations: existingBlock.operations.filter((entry) => entry !== operation)
111
+ }
112
+ : undefined);
113
+ return {
114
+ ...page,
115
+ blocks: page.blocks.map((block) => (block.name === blockName && nextBlock ? nextBlock : block)),
116
+ blockContent: {
117
+ ...(page.blockContent ?? {}),
118
+ [blockName]: fragment.markdown
119
+ }
120
+ };
121
+ }
122
+ async function resolveAutoTarget(target, request, session, router) {
123
+ const implicitRequest = createImplicitGetRequest(target, request);
124
+ const pathname = getPathname(implicitRequest);
125
+ const pageHandler = router.resolvePage(pathname);
126
+ if (pageHandler) {
127
+ const page = await pageHandler({
128
+ request: implicitRequest,
129
+ session
130
+ });
131
+ if (!page) {
132
+ return null;
133
+ }
134
+ return {
135
+ status: 200,
136
+ route: pathname,
137
+ page
138
+ };
139
+ }
140
+ const handler = router.resolve("GET", pathname);
141
+ if (!handler) {
142
+ return null;
143
+ }
144
+ const result = await handler({
145
+ request: implicitRequest,
146
+ inputs: Object.fromEntries(new URL(implicitRequest.url).searchParams.entries()),
147
+ session
148
+ });
149
+ if (isStreamResult(result)) {
150
+ return null;
151
+ }
152
+ return result;
153
+ }
154
+ function findAutoDependency(blocks) {
155
+ for (const block of blocks) {
156
+ const operation = block.operations.find(isAutoDependency);
157
+ if (operation) {
158
+ return {
159
+ blockName: block.name,
160
+ operation
161
+ };
162
+ }
163
+ }
164
+ return null;
165
+ }
166
+ async function resolveAutoDependencies(page, request, session, router) {
167
+ let currentPage = page;
168
+ let currentSession = session;
169
+ let currentMutation;
170
+ let currentRoute;
171
+ for (let pass = 0; pass < 10; pass += 1) {
172
+ let resolved = false;
173
+ for (const block of currentPage.blocks) {
174
+ const operation = block.operations.find(isAutoDependency);
175
+ if (!operation) {
176
+ continue;
177
+ }
178
+ const result = await resolveAutoTarget(operation.target, request, currentSession, router);
179
+ if (!result) {
180
+ continue;
181
+ }
182
+ currentSession = applySessionMutation(currentSession, result.session);
183
+ if (result.session) {
184
+ currentMutation = result.session;
185
+ }
186
+ if (result.route) {
187
+ currentRoute = result.route;
188
+ }
189
+ if (result.page) {
190
+ currentPage = result.page;
191
+ }
192
+ else if (result.fragment) {
193
+ currentPage = applyImplicitFragmentToPage(currentPage, block.name, operation, result.fragment);
194
+ }
195
+ else {
196
+ continue;
197
+ }
198
+ resolved = true;
199
+ break;
200
+ }
201
+ if (!resolved) {
202
+ return {
203
+ page: currentPage,
204
+ ...(currentRoute ? { route: currentRoute } : {}),
205
+ ...(currentMutation ? { session: currentMutation } : {})
206
+ };
207
+ }
208
+ }
209
+ return {
210
+ page: currentPage,
211
+ ...(currentRoute ? { route: currentRoute } : {}),
212
+ ...(currentMutation ? { session: currentMutation } : {})
213
+ };
214
+ }
215
+ async function resolveAutoActionResult(result, request, session, router) {
216
+ if (result.page) {
217
+ const resolvedPage = await resolveAutoDependencies(result.page, request, session, router);
218
+ return {
219
+ ...result,
220
+ ...(resolvedPage.route ? { route: resolvedPage.route } : result.route ? { route: result.route } : {}),
221
+ ...(resolvedPage.session ? { session: resolvedPage.session } : {}),
222
+ page: resolvedPage.page
223
+ };
224
+ }
225
+ if (!result.fragment) {
226
+ return result;
227
+ }
228
+ let current = result;
229
+ for (let pass = 0; pass < 10; pass += 1) {
230
+ const currentSession = applySessionMutation(session, current.session);
231
+ const dependency = findAutoDependency(current.fragment?.blocks ?? []);
232
+ if (!dependency) {
233
+ return current;
234
+ }
235
+ const resolved = await resolveAutoTarget(dependency.operation.target, request, currentSession, router);
236
+ if (!resolved) {
237
+ return current;
238
+ }
239
+ if (resolved.page) {
240
+ const resolvedPage = await resolveAutoDependencies(resolved.page, request, currentSession, router);
241
+ return {
242
+ ...current,
243
+ ...(resolvedPage.session ? { session: resolvedPage.session } : resolved.session ? { session: resolved.session } : {}),
244
+ ...(resolvedPage.route
245
+ ? { route: resolvedPage.route }
246
+ : resolved.route
247
+ ? { route: resolved.route }
248
+ : current.route
249
+ ? { route: current.route }
250
+ : {}),
251
+ page: resolvedPage.page
252
+ };
253
+ }
254
+ if (resolved.fragment) {
255
+ current = {
256
+ ...current,
257
+ ...(resolved.route ? { route: resolved.route } : current.route ? { route: current.route } : {}),
258
+ fragment: resolved.fragment,
259
+ ...(resolved.session ? { session: resolved.session } : {})
260
+ };
261
+ continue;
262
+ }
263
+ return current;
264
+ }
265
+ return current;
266
+ }
267
+ function getRenderablePage(page) {
268
+ const visibleBlockNames = page.visibleBlockNames && page.visibleBlockNames.length > 0 ? new Set(page.visibleBlockNames) : null;
269
+ const blocks = visibleBlockNames ? page.blocks.filter((block) => visibleBlockNames.has(block.name)) : page.blocks;
270
+ const blockContent = page.blockContent && visibleBlockNames
271
+ ? Object.fromEntries(Object.entries(page.blockContent).filter(([name]) => visibleBlockNames.has(name)))
272
+ : page.blockContent;
273
+ return blockContent
274
+ ? {
275
+ markdown: page.markdown,
276
+ blockContent,
277
+ blocks
278
+ }
279
+ : {
280
+ markdown: page.markdown,
281
+ blocks
282
+ };
283
+ }
284
+ function toProtocolRenderOptions(discoveryLinks, fallbackMarkdownHref) {
285
+ const markdownHref = discoveryLinks?.markdownHref ?? fallbackMarkdownHref;
286
+ if (!markdownHref) {
287
+ return {};
288
+ }
289
+ return {
290
+ protocol: {
291
+ discovery: {
292
+ markdownHref,
293
+ ...(discoveryLinks?.llmsTxtHref ? { llmsTxtHref: discoveryLinks.llmsTxtHref } : {})
294
+ }
295
+ }
296
+ };
297
+ }
298
+ function resolveResponseBody(result, representation, renderHtml, discoveryLinks, request) {
299
+ if (result.page) {
300
+ return representation === "markdown"
301
+ ? serializePage(result.page)
302
+ : renderHtml(getRenderablePage(result.page), {
303
+ kind: "page",
304
+ ...(result.route ? { route: result.route } : {}),
305
+ ...toProtocolRenderOptions(discoveryLinks, result.route ?? getPathname(request)),
306
+ ...(discoveryLinks?.markdownHref ? { alternateMarkdownHref: discoveryLinks.markdownHref } : {}),
307
+ ...(discoveryLinks?.llmsTxtHref ? { llmsTxtHref: discoveryLinks.llmsTxtHref } : {})
308
+ });
309
+ }
310
+ if (!result.fragment) {
311
+ throw new Error("Action results must include either a fragment or a page.");
312
+ }
313
+ return representation === "markdown"
314
+ ? serializeFragment(result.fragment)
315
+ : renderHtml(result.fragment, {
316
+ kind: "fragment",
317
+ ...(result.route ? { route: result.route } : {}),
318
+ ...toProtocolRenderOptions(discoveryLinks, result.route ?? getPathname(request)),
319
+ ...(discoveryLinks?.markdownHref ? { alternateMarkdownHref: discoveryLinks.markdownHref } : {}),
320
+ ...(discoveryLinks?.llmsTxtHref ? { llmsTxtHref: discoveryLinks.llmsTxtHref } : {})
321
+ });
322
+ }
323
+ function isStreamResult(result) {
324
+ return "stream" in result;
325
+ }
326
+ function toAsyncIterable(stream) {
327
+ if (Symbol.asyncIterator in stream) {
328
+ return stream;
329
+ }
330
+ return (async function* () {
331
+ yield* stream;
332
+ })();
333
+ }
334
+ function serializeSseMessage(markdown) {
335
+ const normalized = markdown.replaceAll("\r\n", "\n");
336
+ const lines = normalized.split("\n");
337
+ return `${lines.map((line) => `data: ${line}`).join("\n")}\n\n`;
338
+ }
339
+ function createStreamBody(result) {
340
+ if (!isStreamResult(result)) {
341
+ if (!result.fragment) {
342
+ throw new Error("Non-stream event-stream responses must include a fragment.");
343
+ }
344
+ return serializeSseMessage(serializeFragment(result.fragment));
345
+ }
346
+ return (async function* () {
347
+ for await (const chunk of toAsyncIterable(result.stream)) {
348
+ const markdown = typeof chunk === "string" ? chunk : serializeFragment(chunk);
349
+ yield serializeSseMessage(markdown);
350
+ }
351
+ })();
352
+ }
353
+ function createResponse(result, representation, renderHtml, request, htmlDiscovery) {
354
+ const discoveryLinks = representation === "html"
355
+ ? resolveHtmlDiscoveryLinks(htmlDiscovery, {
356
+ request,
357
+ kind: "page" in result && result.page ? "page" : "fragment",
358
+ ...("route" in result && result.route ? { route: result.route } : {})
359
+ })
360
+ : null;
361
+ const headers = mergeLinkHeader({
362
+ "content-type": representation === "markdown" ? toMarkdownContentType() : representation === "html" ? "text/html" : "text/event-stream",
363
+ ...(result.headers ?? {})
364
+ }, discoveryLinksToHeader(discoveryLinks));
365
+ const body = representation === "markdown"
366
+ ? resolveResponseBody(result, "markdown", renderHtml, discoveryLinks, request)
367
+ : representation === "html"
368
+ ? resolveResponseBody(result, "html", renderHtml, discoveryLinks, request)
369
+ : createStreamBody(result);
370
+ return {
371
+ status: result.status ?? 200,
372
+ headers,
373
+ body
374
+ };
375
+ }
376
+ function createPageResponse(page, representation, renderHtml, request, htmlDiscovery, route) {
377
+ const discoveryLinks = representation === "html"
378
+ ? resolveHtmlDiscoveryLinks(htmlDiscovery, {
379
+ request,
380
+ kind: "page",
381
+ ...(route ? { route } : {})
382
+ })
383
+ : null;
384
+ return {
385
+ status: 200,
386
+ headers: mergeLinkHeader({
387
+ "content-type": representation === "markdown" ? toMarkdownContentType() : "text/html"
388
+ }, discoveryLinksToHeader(discoveryLinks)),
389
+ body: representation === "markdown"
390
+ ? serializePage(page)
391
+ : renderHtml(getRenderablePage(page), {
392
+ kind: "page",
393
+ ...(route ? { route } : {}),
394
+ ...toProtocolRenderOptions(discoveryLinks, route ?? getPathname(request)),
395
+ ...(discoveryLinks?.markdownHref ? { alternateMarkdownHref: discoveryLinks.markdownHref } : {}),
396
+ ...(discoveryLinks?.llmsTxtHref ? { llmsTxtHref: discoveryLinks.llmsTxtHref } : {})
397
+ })
398
+ };
399
+ }
400
+ export function createMdanServer(options = {}) {
401
+ const router = new MdanRouter();
402
+ const sessionProvider = options.session;
403
+ const baseHtmlRenderer = options.renderHtml ??
404
+ ((fragment, renderOptions) => renderHtmlDocument(fragment, {
405
+ ...renderOptions,
406
+ ...(options.markdownRenderer ? { markdownRenderer: options.markdownRenderer } : {})
407
+ }));
408
+ const htmlRenderer = (fragment, renderOptions = {}) => injectHtmlDiscoveryLinks(baseHtmlRenderer(fragment, renderOptions), renderOptions);
409
+ return {
410
+ get(path, handler) {
411
+ router.get(path, handler);
412
+ },
413
+ page(path, handler) {
414
+ router.page(path, handler);
415
+ },
416
+ post(path, handler) {
417
+ router.post(path, handler);
418
+ },
419
+ async handle(request) {
420
+ const representation = negotiateRepresentation(request.headers.accept);
421
+ if (representation === "not-acceptable") {
422
+ return createResponse(fail({
423
+ status: 406,
424
+ fragment: {
425
+ markdown: "## Not Acceptable",
426
+ blocks: []
427
+ }
428
+ }), "markdown", htmlRenderer, request, options.htmlDiscovery);
429
+ }
430
+ const pathname = getPathname(request);
431
+ const session = sessionProvider ? await sessionProvider.read(request) : null;
432
+ if (request.method === "GET") {
433
+ const pageHandler = router.resolvePage(pathname);
434
+ if (pageHandler) {
435
+ if (representation === "event-stream") {
436
+ return createResponse(fail({
437
+ status: 406,
438
+ fragment: createErrorFragment("Not Acceptable", "Page routes do not support text/event-stream.")
439
+ }), "markdown", htmlRenderer, request, options.htmlDiscovery);
440
+ }
441
+ let page;
442
+ try {
443
+ page = await pageHandler({
444
+ request,
445
+ session
446
+ });
447
+ }
448
+ catch {
449
+ return createResponse(createInternalServerErrorResult(), representation, htmlRenderer, request, options.htmlDiscovery);
450
+ }
451
+ if (page) {
452
+ const resolvedPage = await resolveAutoDependencies(page, request, session, router);
453
+ const response = createPageResponse(resolvedPage.page, representation, htmlRenderer, request, options.htmlDiscovery, resolvedPage.route ?? pathname);
454
+ if (sessionProvider && resolvedPage.session) {
455
+ try {
456
+ if (resolvedPage.session.type === "sign-out") {
457
+ await sessionProvider.clear(session, response, request);
458
+ }
459
+ else {
460
+ await sessionProvider.commit(resolvedPage.session, response);
461
+ }
462
+ }
463
+ catch {
464
+ return createResponse(createInternalServerErrorResult(), representation, htmlRenderer, request, options.htmlDiscovery);
465
+ }
466
+ }
467
+ return response;
468
+ }
469
+ }
470
+ }
471
+ const handler = router.resolve(request.method, pathname);
472
+ if (!handler) {
473
+ return createResponse(fail({
474
+ status: 404,
475
+ fragment: {
476
+ markdown: "## Not Found",
477
+ blocks: []
478
+ }
479
+ }), representation, htmlRenderer, request, options.htmlDiscovery);
480
+ }
481
+ if (request.method === "POST" && hasRequestBody(request) && !isSupportedWriteContentType(request.headers["content-type"])) {
482
+ return createResponse(fail({
483
+ status: 415,
484
+ fragment: createErrorFragment("Unsupported Media Type", 'POST requests must use Content-Type: "text/markdown".')
485
+ }), representation, htmlRenderer, request, options.htmlDiscovery);
486
+ }
487
+ let inputs;
488
+ try {
489
+ inputs = getInputs(request);
490
+ }
491
+ catch (error) {
492
+ if (error instanceof MdanParseError) {
493
+ return createResponse(fail({
494
+ status: 400,
495
+ fragment: createErrorFragment("Invalid Request Body", error.message)
496
+ }), representation, htmlRenderer, request, options.htmlDiscovery);
497
+ }
498
+ throw error;
499
+ }
500
+ let result;
501
+ try {
502
+ result = await handler({
503
+ request,
504
+ inputs,
505
+ session
506
+ });
507
+ }
508
+ catch {
509
+ return createResponse(createInternalServerErrorResult(), representation, htmlRenderer, request, options.htmlDiscovery);
510
+ }
511
+ const resolvedResult = !isStreamResult(result)
512
+ ? await resolveAutoActionResult(result, request, session, router)
513
+ : result;
514
+ const response = createResponse(resolvedResult, representation, htmlRenderer, request, options.htmlDiscovery);
515
+ if (sessionProvider) {
516
+ try {
517
+ if (resolvedResult.session?.type === "sign-out") {
518
+ await sessionProvider.clear(session, response, request);
519
+ }
520
+ else {
521
+ await sessionProvider.commit(resolvedResult.session ?? null, response);
522
+ }
523
+ }
524
+ catch {
525
+ return createResponse(createInternalServerErrorResult(), representation, htmlRenderer, request, options.htmlDiscovery);
526
+ }
527
+ }
528
+ return response;
529
+ }
530
+ };
531
+ }
532
+ //# sourceMappingURL=runtime.js.map