@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
package/README.md CHANGED
@@ -1,39 +1,8 @@
1
1
  # @mdsnai/sdk
2
2
 
3
- `@mdsnai/sdk` is the reference SDK and runtime for MDSN.
3
+ `@mdsnai/sdk` is the reference SDK for building apps with MDSN.
4
4
 
5
- MDSN keeps page content and page interaction in the same source by combining a Markdown body with an executable `mdsn` block.
6
-
7
- ## Start With One Package
8
-
9
- For most projects, start with:
10
-
11
- ```ts
12
- import { createFrameworkApp, defineConfig } from "@mdsnai/sdk";
13
- ```
14
-
15
- ```ts
16
- import {
17
- createHostedApp,
18
- createActionContextFromRequest,
19
- defineActions,
20
- renderHostedPage,
21
- renderMarkdownFragment,
22
- renderMarkdownValue,
23
- } from "@mdsnai/sdk";
24
- ```
25
-
26
- ```ts
27
- import { parsePage, parseFragment } from "@mdsnai/sdk";
28
- ```
29
-
30
- Use the root entry point for the common paths:
31
-
32
- - build a site with the built-in framework
33
- - host MDSN pages and actions inside your own server
34
- - render the UI yourself with React or Vue
35
-
36
- Move to `@mdsnai/sdk/framework`, `@mdsnai/sdk/server`, `@mdsnai/sdk/web`, or `@mdsnai/sdk/core` only when you want stricter boundaries or narrower imports.
5
+ MDSN is a Markdown-first page and interaction format. `@mdsnai/sdk` gives you the parser, server runtime, browser runtime, and default UI for working with it.
37
6
 
38
7
  ## Why MDSN
39
8
 
@@ -41,67 +10,62 @@ Plain Markdown is good for content, but weak at expressing interaction.
41
10
 
42
11
  Once a page needs inputs, actions, partial updates, or navigation, that structure usually gets pushed into templates, frontend state, and custom API glue.
43
12
 
44
- MDSN makes that interaction layer explicit while keeping the page source readable for humans, AI agents, and agentic AI systems.
13
+ MDSN makes that interaction layer explicit while keeping the page source readable for humans, AI agents, and agentic systems.
45
14
 
46
- In MDSN, page content is not just presentation. It is also shared prompt context for AI agents.
15
+ In MDSN, page content is not only presentation. It is also shared prompt context for AI agents.
47
16
 
48
- That means the same Markdown source can carry:
17
+ The same Markdown source can carry:
49
18
 
50
19
  - content for humans to read
51
20
  - state and task context for AI agents to interpret
52
21
  - explicit interaction structure for both sides to continue from
53
22
 
54
- ## What This Package Includes
23
+ ## Use Cases
55
24
 
56
- - the MDSN parser and core model
57
- - server helpers for actions and Markdown fragments
58
- - a built-in framework host and CLI
59
- - headless web APIs for custom rendering
60
- - default browser runtime utilities
25
+ - skills apps with guided inputs and step-by-step actions for non-technical users
26
+ - agent apps that agents can read, enter, and continue over HTTP
27
+ - interactive docs, runbooks, and internal tools with embedded actions
28
+ - shared pages where humans and agents work from the same content and next-step actions
29
+ - agentic workflows where the server returns both updated results and the next actions to take
30
+ - custom hosted interfaces built with React, Vue, or your own server stack
61
31
 
62
- ## Package Entry Points
32
+ ## Syntax
63
33
 
64
- - `@mdsnai/sdk`
65
- - `@mdsnai/sdk/core`
66
- - `@mdsnai/sdk/server`
67
- - `@mdsnai/sdk/web`
68
- - `@mdsnai/sdk/framework`
69
- - `@mdsnai/sdk/cli`
34
+ The starter uses this minimal page shape:
70
35
 
71
- ## Use Cases
36
+ ````md
37
+ ---
38
+ title: "Agent App"
39
+ ---
72
40
 
73
- - skills apps for non-technical users
74
- - agent apps that agents can enter and operate directly
75
- - interactive documents with embedded actions
76
- - human-agent collaboration on the same page model
77
- - agentic workflows and AI workflow automation
78
- - custom hosted interfaces with React, Vue, or your own server stack
41
+ # Agent App
79
42
 
80
- ## Quick Start
43
+ Use this starter as the smallest end-to-end MDSN app.
81
44
 
82
- ```bash
83
- npm create mdsn@latest skills-app
84
- cd skills-app
85
- npm install
86
- npm run dev
87
- ```
45
+ <!-- mdsn:block main -->
88
46
 
89
- Open:
90
-
91
- ```text
92
- http://localhost:3000/
47
+ ```mdsn
48
+ BLOCK main {
49
+ INPUT text required -> message
50
+ GET "/list" -> refresh label:"Refresh"
51
+ POST "/post" (message) -> submit label:"Submit"
52
+ }
93
53
  ```
54
+ ````
94
55
 
95
- The starter generates a minimal runnable site with:
56
+ ## Quick Start
96
57
 
97
- - `pages/index.md`
98
- - `server/actions.cjs`
58
+ ```bash
59
+ npm create mdsn@latest agent-app
60
+ cd agent-app
61
+ npm install
62
+ npm start
63
+ ```
99
64
 
100
65
  ## Docs
101
66
 
102
67
  - [Getting Started](https://docs.mdsn.ai/docs/getting-started)
103
- - [Framework Development](https://docs.mdsn.ai/docs/site-development)
104
- - [Server Development](https://docs.mdsn.ai/docs/server-development)
105
- - [HTTP Content Negotiation and Shared Interaction](https://docs.mdsn.ai/docs/shared-interaction)
106
- - [Action Reference](https://docs.mdsn.ai/docs/action-reference)
107
- - [SDK Reference](https://docs.mdsn.ai/docs/sdk-reference)
68
+ - [Understanding MDSN](https://docs.mdsn.ai/docs/understanding-mdsn)
69
+ - [SDK Overview](https://docs.mdsn.ai/docs/sdk)
70
+ - [Custom Rendering](https://docs.mdsn.ai/docs/custom-rendering)
71
+ - [API Reference](https://docs.mdsn.ai/docs/api-reference)
@@ -0,0 +1,14 @@
1
+ export interface MdsnSourceLocation {
2
+ line: number;
3
+ column: number;
4
+ }
5
+ declare class MdsnBaseError extends Error {
6
+ readonly location: MdsnSourceLocation | undefined;
7
+ constructor(message: string, location?: MdsnSourceLocation);
8
+ }
9
+ export declare class MdsnParseError extends MdsnBaseError {
10
+ }
11
+ export declare class MdsnValidationError extends MdsnBaseError {
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,aAAc,SAAQ,KAAK;IAC/B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,CAAC;gBAEtC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,kBAAkB;CAK3D;AAED,qBAAa,cAAe,SAAQ,aAAa;CAAG;AAEpD,qBAAa,mBAAoB,SAAQ,aAAa;CAAG"}
@@ -0,0 +1,13 @@
1
+ class MdsnBaseError extends Error {
2
+ location;
3
+ constructor(message, location) {
4
+ super(message);
5
+ this.name = new.target.name;
6
+ this.location = location;
7
+ }
8
+ }
9
+ export class MdsnParseError extends MdsnBaseError {
10
+ }
11
+ export class MdsnValidationError extends MdsnBaseError {
12
+ }
13
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAKA,MAAM,aAAc,SAAQ,KAAK;IACtB,QAAQ,CAAiC;IAElD,YAAY,OAAe,EAAE,QAA6B;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,aAAa;CAAG;AAEpD,MAAM,OAAO,mBAAoB,SAAQ,aAAa;CAAG"}
@@ -1,4 +1,16 @@
1
- export { parsePageDefinition } from "./document/page-definition";
2
- export type { FrontmatterData } from "./model/document";
3
- export type { BlockAnchorDefinition, BlockDefinition, DocumentDefinition, InputDefinition, InputType, ReadDefinition, WriteDefinition, } from "./model";
4
- export { escapeHtml, escapeRegExp, validateInputLength, trimTrailingBlankLines, MAX_INPUT_LENGTH, MAX_IDENTIFIER_LENGTH, createLogger, type Logger, type LogLevel, type CreateLoggerOptions, } from "./utils";
1
+ import type { MdsnComposedPage, MdsnPage } from "./types.js";
2
+ export * from "./errors.js";
3
+ export * from "./markdown-renderer.js";
4
+ export * from "./markdown-body.js";
5
+ export * from "./negotiate.js";
6
+ export * from "./serialize.js";
7
+ export * from "./types.js";
8
+ export * from "./validate.js";
9
+ export interface ComposePageOptions {
10
+ blocks?: Record<string, string>;
11
+ visibleBlocks?: string[];
12
+ }
13
+ export declare function parsePage(source: string): MdsnPage;
14
+ export declare function parseAndValidatePage(source: string): MdsnPage;
15
+ export declare function composePage(source: string, options?: ComposePageOptions): MdsnComposedPage;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAgB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3E,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAgBlD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAE7D;AAaD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,gBAAgB,CAS9F"}
@@ -1,13 +1,69 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createLogger = exports.MAX_IDENTIFIER_LENGTH = exports.MAX_INPUT_LENGTH = exports.trimTrailingBlankLines = exports.validateInputLength = exports.escapeRegExp = exports.escapeHtml = exports.parsePageDefinition = void 0;
4
- var page_definition_1 = require("./document/page-definition");
5
- Object.defineProperty(exports, "parsePageDefinition", { enumerable: true, get: function () { return page_definition_1.parsePageDefinition; } });
6
- var utils_1 = require("./utils");
7
- Object.defineProperty(exports, "escapeHtml", { enumerable: true, get: function () { return utils_1.escapeHtml; } });
8
- Object.defineProperty(exports, "escapeRegExp", { enumerable: true, get: function () { return utils_1.escapeRegExp; } });
9
- Object.defineProperty(exports, "validateInputLength", { enumerable: true, get: function () { return utils_1.validateInputLength; } });
10
- Object.defineProperty(exports, "trimTrailingBlankLines", { enumerable: true, get: function () { return utils_1.trimTrailingBlankLines; } });
11
- Object.defineProperty(exports, "MAX_INPUT_LENGTH", { enumerable: true, get: function () { return utils_1.MAX_INPUT_LENGTH; } });
12
- Object.defineProperty(exports, "MAX_IDENTIFIER_LENGTH", { enumerable: true, get: function () { return utils_1.MAX_IDENTIFIER_LENGTH; } });
13
- Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return utils_1.createLogger; } });
1
+ import { MdsnParseError } from "./errors.js";
2
+ import { parseAnchors } from "./parse/anchors.js";
3
+ import { parseBlocks } from "./parse/block-parser.js";
4
+ import { extractExecutableBlock } from "./parse/executable-block.js";
5
+ import { parseFrontmatter } from "./parse/frontmatter.js";
6
+ import { validatePage } from "./validate.js";
7
+ export * from "./errors.js";
8
+ export * from "./markdown-renderer.js";
9
+ export * from "./markdown-body.js";
10
+ export * from "./negotiate.js";
11
+ export * from "./serialize.js";
12
+ export * from "./types.js";
13
+ export * from "./validate.js";
14
+ export function parsePage(source) {
15
+ const { frontmatter, body } = parseFrontmatter(source);
16
+ const { markdown, executableContent } = extractExecutableBlock(body);
17
+ try {
18
+ return {
19
+ frontmatter,
20
+ markdown,
21
+ blocks: parseBlocks(executableContent),
22
+ blockAnchors: parseAnchors(markdown)
23
+ };
24
+ }
25
+ catch (error) {
26
+ if (error instanceof Error) {
27
+ throw error;
28
+ }
29
+ throw new MdsnParseError("Unknown parse failure.");
30
+ }
31
+ }
32
+ export function parseAndValidatePage(source) {
33
+ return validatePage(parsePage(source));
34
+ }
35
+ function attachFragmentHelper(page) {
36
+ const composed = page;
37
+ Object.defineProperty(composed, "fragment", {
38
+ value(blockName) {
39
+ return resolveFragmentForBlock(composed, blockName);
40
+ },
41
+ enumerable: false
42
+ });
43
+ return composed;
44
+ }
45
+ export function composePage(source, options = {}) {
46
+ const page = parseAndValidatePage(source);
47
+ if (options.blocks) {
48
+ page.blockContent = { ...options.blocks };
49
+ }
50
+ if (options.visibleBlocks) {
51
+ page.visibleBlockNames = [...options.visibleBlocks];
52
+ }
53
+ return attachFragmentHelper(page);
54
+ }
55
+ function resolveFragmentForBlock(page, blockName) {
56
+ const block = page.blocks.find((candidate) => candidate.name === blockName);
57
+ if (!block) {
58
+ throw new Error(`Unknown block "${blockName}".`);
59
+ }
60
+ const markdown = page.blockContent?.[blockName];
61
+ if (!markdown?.trim()) {
62
+ throw new Error(`Block "${blockName}" has no composed markdown content.`);
63
+ }
64
+ return {
65
+ markdown,
66
+ blocks: [block]
67
+ };
68
+ }
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function parseMarkdownBody(body: string): Record<string, string>;
2
+ export declare function serializeMarkdownBody(values: Record<string, string>): string;
3
+ //# sourceMappingURL=markdown-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-body.d.ts","sourceRoot":"","sources":["../../src/core/markdown-body.ts"],"names":[],"mappings":"AA+CA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBtE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAI5E"}
@@ -0,0 +1,65 @@
1
+ import { MdsnParseError } from "./errors.js";
2
+ function splitMarkdownBody(body) {
3
+ const parts = [];
4
+ let current = "";
5
+ let inString = false;
6
+ let escaped = false;
7
+ for (const char of body) {
8
+ if (escaped) {
9
+ current += char;
10
+ escaped = false;
11
+ continue;
12
+ }
13
+ if (char === "\\") {
14
+ current += char;
15
+ escaped = true;
16
+ continue;
17
+ }
18
+ if (char === "\"") {
19
+ current += char;
20
+ inString = !inString;
21
+ continue;
22
+ }
23
+ if (!inString && (char === "," || char === "\n")) {
24
+ const trimmed = current.trim();
25
+ if (trimmed) {
26
+ parts.push(trimmed);
27
+ }
28
+ current = "";
29
+ continue;
30
+ }
31
+ current += char;
32
+ }
33
+ const trimmed = current.trim();
34
+ if (trimmed) {
35
+ parts.push(trimmed);
36
+ }
37
+ return parts;
38
+ }
39
+ export function parseMarkdownBody(body) {
40
+ const result = {};
41
+ for (const part of splitMarkdownBody(body)) {
42
+ const match = part.match(/^([a-zA-Z_][\w-]*)\s*:\s*(.+)$/);
43
+ if (!match) {
44
+ throw new MdsnParseError(`Invalid markdown body line: ${part}`);
45
+ }
46
+ let value;
47
+ try {
48
+ value = JSON.parse(match[2].trim());
49
+ }
50
+ catch {
51
+ throw new MdsnParseError(`Invalid markdown body line: ${part}`);
52
+ }
53
+ if (typeof value !== "string") {
54
+ throw new MdsnParseError(`Invalid markdown body line: ${part}`);
55
+ }
56
+ result[match[1]] = value;
57
+ }
58
+ return result;
59
+ }
60
+ export function serializeMarkdownBody(values) {
61
+ return Object.entries(values)
62
+ .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
63
+ .join(", ");
64
+ }
65
+ //# sourceMappingURL=markdown-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-body.js","sourceRoot":"","sources":["../../src/core/markdown-body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,IAAI,IAAI,CAAC;YAChB,OAAO,GAAG,KAAK,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,IAAI,CAAC;YAChB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,IAAI,CAAC;YAChB,QAAQ,GAAG,CAAC,QAAQ,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;YACD,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,cAAc,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,cAAc,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,cAAc,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAA8B;IAClE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;SACzD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface MdsnMarkdownRenderer {
2
+ render(markdown: string): string;
3
+ }
4
+ export declare const basicMarkdownRenderer: MdsnMarkdownRenderer;
5
+ //# sourceMappingURL=markdown-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-renderer.d.ts","sourceRoot":"","sources":["../../src/core/markdown-renderer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAoED,eAAO,MAAM,qBAAqB,EAAE,oBAiBnC,CAAC"}
@@ -0,0 +1,75 @@
1
+ function escapeHtml(value) {
2
+ return value
3
+ .replaceAll("&", "&amp;")
4
+ .replaceAll("<", "&lt;")
5
+ .replaceAll(">", "&gt;")
6
+ .replaceAll('"', "&quot;");
7
+ }
8
+ function parseRenderableMarkdown(markdown) {
9
+ const lines = markdown.split("\n");
10
+ const visible = [];
11
+ let inFrontmatter = false;
12
+ let frontmatterHandled = false;
13
+ let inCode = false;
14
+ for (const line of lines) {
15
+ const trimmed = line.trim();
16
+ if (!frontmatterHandled && trimmed === "---") {
17
+ inFrontmatter = !inFrontmatter;
18
+ if (!inFrontmatter) {
19
+ frontmatterHandled = true;
20
+ }
21
+ continue;
22
+ }
23
+ if (inFrontmatter) {
24
+ continue;
25
+ }
26
+ if (trimmed.startsWith("```")) {
27
+ inCode = !inCode;
28
+ continue;
29
+ }
30
+ if (inCode || trimmed.startsWith("<!-- mdsn:block")) {
31
+ continue;
32
+ }
33
+ visible.push(line);
34
+ }
35
+ return visible
36
+ .join("\n")
37
+ .split(/\n{2,}/)
38
+ .map((chunk) => chunk.trim())
39
+ .filter(Boolean)
40
+ .map((chunk) => {
41
+ const rows = chunk.split("\n").map((row) => row.trim()).filter(Boolean);
42
+ if (rows.every((row) => row.startsWith("- "))) {
43
+ return {
44
+ type: "ul",
45
+ items: rows.map((row) => row.slice(2).trim())
46
+ };
47
+ }
48
+ if (chunk.startsWith("# ")) {
49
+ return { type: "h1", text: chunk.slice(2).trim() };
50
+ }
51
+ if (chunk.startsWith("## ")) {
52
+ return { type: "h2", text: chunk.slice(3).trim() };
53
+ }
54
+ return { type: "p", text: rows.join(" ") };
55
+ });
56
+ }
57
+ export const basicMarkdownRenderer = {
58
+ render(markdown) {
59
+ return parseRenderableMarkdown(markdown)
60
+ .map((node) => {
61
+ if (node.type === "h1") {
62
+ return `<h1>${escapeHtml(node.text)}</h1>`;
63
+ }
64
+ if (node.type === "h2") {
65
+ return `<h2>${escapeHtml(node.text)}</h2>`;
66
+ }
67
+ if (node.type === "p") {
68
+ return `<p>${escapeHtml(node.text)}</p>`;
69
+ }
70
+ return `<ul>${node.items.map((item) => `<li>${escapeHtml(item)}</li>`).join("")}</ul>`;
71
+ })
72
+ .join("\n");
73
+ }
74
+ };
75
+ //# sourceMappingURL=markdown-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-renderer.js","sourceRoot":"","sources":["../../src/core/markdown-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { MdsnRepresentation } from "./types.js";
2
+ export declare function negotiateRepresentation(acceptHeader?: string): MdsnRepresentation;
3
+ //# sourceMappingURL=negotiate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negotiate.d.ts","sourceRoot":"","sources":["../../src/core/negotiate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAuBrD,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,kBAAkB,CA0DjF"}
@@ -0,0 +1,63 @@
1
+ function parseAcceptHeader(acceptHeader) {
2
+ return acceptHeader
3
+ .split(",")
4
+ .map((part) => part.trim())
5
+ .filter(Boolean)
6
+ .map((part) => {
7
+ const [mediaType = "", ...params] = part.split(";").map((value) => value.trim());
8
+ const qParam = params.find((value) => value.startsWith("q="));
9
+ const q = qParam ? Number(qParam.slice(2)) : 1;
10
+ return {
11
+ mediaType: mediaType.toLowerCase(),
12
+ q: Number.isFinite(q) ? q : 1
13
+ };
14
+ });
15
+ }
16
+ export function negotiateRepresentation(acceptHeader) {
17
+ if (!acceptHeader) {
18
+ return "html";
19
+ }
20
+ const accepted = parseAcceptHeader(acceptHeader);
21
+ const weightByRepresentation = {
22
+ "event-stream": 0,
23
+ markdown: 0,
24
+ html: 0
25
+ };
26
+ for (const entry of accepted) {
27
+ if (entry.q <= 0) {
28
+ continue;
29
+ }
30
+ if (entry.mediaType === "text/event-stream") {
31
+ weightByRepresentation["event-stream"] = Math.max(weightByRepresentation["event-stream"], entry.q);
32
+ continue;
33
+ }
34
+ if (entry.mediaType === "text/markdown") {
35
+ weightByRepresentation.markdown = Math.max(weightByRepresentation.markdown, entry.q);
36
+ continue;
37
+ }
38
+ if (["text/html", "text/*", "*/*"].includes(entry.mediaType)) {
39
+ weightByRepresentation.html = Math.max(weightByRepresentation.html, entry.q);
40
+ }
41
+ }
42
+ const candidates = Object.entries(weightByRepresentation).filter(([, weight]) => weight > 0);
43
+ if (candidates.length === 0) {
44
+ return "not-acceptable";
45
+ }
46
+ const tieBreaker = {
47
+ "event-stream": 3,
48
+ markdown: 2,
49
+ html: 1
50
+ };
51
+ candidates.sort((left, right) => {
52
+ if (right[1] !== left[1]) {
53
+ return right[1] - left[1];
54
+ }
55
+ return tieBreaker[right[0]] - tieBreaker[left[0]];
56
+ });
57
+ const winner = candidates[0]?.[0];
58
+ if (!winner) {
59
+ return "not-acceptable";
60
+ }
61
+ return winner;
62
+ }
63
+ //# sourceMappingURL=negotiate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negotiate.js","sourceRoot":"","sources":["../../src/core/negotiate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function parseAnchors(markdown: string): string[];
2
+ //# sourceMappingURL=anchors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchors.d.ts","sourceRoot":"","sources":["../../../src/core/parse/anchors.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BvD"}
@@ -0,0 +1,26 @@
1
+ import { MdsnParseError } from "../errors.js";
2
+ const anchorPattern = /<!--\s*mdsn:block\s+([a-zA-Z_][\w-]*)\s*-->/g;
3
+ export function parseAnchors(markdown) {
4
+ const anchors = [];
5
+ const lines = markdown.split("\n");
6
+ let insideFence = false;
7
+ for (const line of lines) {
8
+ if (/^```/.test(line.trim())) {
9
+ insideFence = !insideFence;
10
+ continue;
11
+ }
12
+ if (insideFence) {
13
+ continue;
14
+ }
15
+ const matches = [...line.matchAll(anchorPattern)];
16
+ for (const match of matches) {
17
+ const name = match[1];
18
+ if (!name) {
19
+ throw new MdsnParseError("Encountered malformed block anchor.");
20
+ }
21
+ anchors.push(name);
22
+ }
23
+ }
24
+ return anchors;
25
+ }
26
+ //# sourceMappingURL=anchors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchors.js","sourceRoot":"","sources":["../../../src/core/parse/anchors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,aAAa,GAAG,8CAA8C,CAAC;AAErE,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC7B,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,cAAc,CAAC,qCAAqC,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MdsnBlock } from "../types.js";
2
+ export declare function parseBlocks(source: string): MdsnBlock[];
3
+ //# sourceMappingURL=block-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-parser.d.ts","sourceRoot":"","sources":["../../../src/core/parse/block-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAA4B,MAAM,aAAa,CAAC;AA0EvE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CA0DvD"}