@mdsnai/sdk 0.2.1 → 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 -55
  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
@@ -1,77 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderErrorFragment = renderErrorFragment;
4
- exports.renderActionNotAvailableFragment = renderActionNotAvailableFragment;
5
- exports.renderUnsupportedContentTypeFragment = renderUnsupportedContentTypeFragment;
6
- exports.renderInternalErrorFragment = renderInternalErrorFragment;
7
- exports.renderAuthRequiredFragment = renderAuthRequiredFragment;
8
- const markdown_1 = require("./markdown");
9
- function renderErrorFragment(options) {
10
- return (0, markdown_1.renderMarkdownFragment)({
11
- body: [
12
- ...(options.preface ?? []),
13
- options.heading ?? "## Action Status",
14
- options.message,
15
- ...(options.details ?? []),
16
- options.nextStep,
17
- ].filter((value) => typeof value === "string" && value.trim().length > 0),
18
- block: options.block,
19
- });
20
- }
21
- function renderActionNotAvailableFragment(options = {}) {
22
- return renderErrorFragment({
23
- heading: options.heading ?? "## Action Status",
24
- message: options.message ?? "This action is not available on the current server.",
25
- nextStep: options.nextStep ?? "Next step: follow another declared action or reload the current page definition.",
26
- block: options.block,
27
- });
28
- }
29
- function renderUnsupportedContentTypeFragment(options = {}) {
30
- return renderErrorFragment({
31
- heading: options.heading ?? "## Action Status",
32
- message: options.message ?? "Unsupported content type for write action.",
33
- nextStep: options.nextStep
34
- ?? "Next step: resend with `Content-Type: text/markdown` and a plain-text `key: value` body.",
35
- block: options.block,
36
- });
37
- }
38
- function renderInternalErrorFragment(options = {}) {
39
- return renderErrorFragment({
40
- heading: options.heading ?? "## Action Status",
41
- message: options.message ?? "The action failed due to an internal error.",
42
- nextStep: options.nextStep ?? "Next step: retry the action, or inspect server logs if the problem persists.",
43
- details: options.error == null
44
- ? []
45
- : [options.error instanceof Error ? options.error.message : String(options.error)],
46
- block: options.block,
47
- });
48
- }
49
- function renderAuthRequiredFragment(options = {}) {
50
- const emailInputName = options.emailInputName ?? "email";
51
- const passwordInputName = options.passwordInputName ?? "password";
52
- const loginActionName = options.loginActionName ?? "login";
53
- const loginTarget = options.loginTarget ?? "/login";
54
- const includeRegisterAction = options.includeRegisterAction ?? true;
55
- const registerActionName = options.registerActionName ?? "go_register";
56
- const registerTarget = options.registerTarget ?? "/register";
57
- const block = {
58
- name: options.blockName ?? "auth",
59
- inputs: [
60
- { name: emailInputName, type: "text", required: true },
61
- { name: passwordInputName, type: "text", required: true, secret: true },
62
- ],
63
- reads: includeRegisterAction
64
- ? [{ name: registerActionName, target: registerTarget }]
65
- : [],
66
- writes: [
67
- { name: loginActionName, target: loginTarget, inputs: [emailInputName, passwordInputName] },
68
- ],
69
- };
70
- return renderErrorFragment({
71
- heading: options.heading ?? "## Login Status",
72
- message: options.message ?? "Login required: sign in before continuing.",
73
- nextStep: options.nextStep
74
- ?? "Next step: enter email/password and run login, or go to register if no account exists.",
75
- block,
76
- });
77
- }
@@ -1 +0,0 @@
1
- export declare function createStarterSite(targetDir: string): void;
@@ -1,176 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createStarterSite = createStarterSite;
7
- const node_fs_1 = require("node:fs");
8
- const node_path_1 = __importDefault(require("node:path"));
9
- function ensureEmptyDirectory(targetDir) {
10
- if (!(0, node_fs_1.existsSync)(targetDir)) {
11
- (0, node_fs_1.mkdirSync)(targetDir, { recursive: true });
12
- return;
13
- }
14
- if ((0, node_fs_1.readdirSync)(targetDir).length > 0) {
15
- throw new Error(`Target directory is not empty: ${targetDir}`);
16
- }
17
- }
18
- function createStarterSite(targetDir) {
19
- ensureEmptyDirectory(targetDir);
20
- (0, node_fs_1.mkdirSync)(node_path_1.default.join(targetDir, "pages"), { recursive: true });
21
- (0, node_fs_1.mkdirSync)(node_path_1.default.join(targetDir, "server"), { recursive: true });
22
- const packageName = node_path_1.default.basename(targetDir).toLowerCase().replace(/[^a-z0-9-]+/g, "-") || "mdsn-site";
23
- (0, node_fs_1.writeFileSync)(node_path_1.default.join(targetDir, "package.json"), JSON.stringify({
24
- name: packageName,
25
- private: true,
26
- scripts: {
27
- dev: "mdsn dev",
28
- build: "mdsn build",
29
- start: "mdsn start",
30
- },
31
- dependencies: {
32
- "@mdsnai/sdk": "^0.2.1",
33
- },
34
- }, null, 2) + "\n", "utf8");
35
- (0, node_fs_1.writeFileSync)(node_path_1.default.join(targetDir, "pages", "index.md"), `---
36
- id: guestbook
37
- title: Guestbook
38
- description: A runnable MDSN guestbook starter
39
- ---
40
-
41
- # Guestbook
42
-
43
- Start with a working guestbook and reshape it into your own app.
44
-
45
- - \`GET\` / \`POST\` both return Markdown fragments
46
- - the Host only replaces the current \`guestbook\` block region
47
- - page content stays static while the block keeps updating
48
-
49
- <!-- mdsn:block guestbook -->
50
-
51
- \`\`\`mdsn
52
- BLOCK guestbook {
53
- INPUT text -> nickname
54
- INPUT text required -> message
55
- GET "/list" -> refresh
56
- POST "/post" (nickname, message) -> submit
57
- }
58
- \`\`\`
59
- `, "utf8");
60
- (0, node_fs_1.writeFileSync)(node_path_1.default.join(targetDir, "server", "actions.cjs"), `const {
61
- defineAction,
62
- defineActions,
63
- renderMarkdownFragment,
64
- renderMarkdownValue,
65
- } = require("@mdsnai/sdk/server");
66
-
67
- const guestbookBlock = {
68
- name: "guestbook",
69
- inputs: [
70
- { name: "nickname", type: "text" },
71
- { name: "message", type: "text", required: true },
72
- ],
73
- reads: [{ name: "refresh", target: "/list" }],
74
- writes: [{ name: "submit", target: "/post", inputs: ["nickname", "message"] }],
75
- };
76
-
77
- function getGuestbookStore() {
78
- if (!globalThis.__mdsnStarterGuestbookMessages) {
79
- globalThis.__mdsnStarterGuestbookMessages = [];
80
- }
81
-
82
- return globalThis.__mdsnStarterGuestbookMessages;
83
- }
84
-
85
- function listGuestbookMessages() {
86
- return getGuestbookStore().map((entry) => ({ ...entry }));
87
- }
88
-
89
- function renderGuestbookFragment(messages) {
90
- return renderMarkdownFragment({
91
- body: [
92
- "## Messages",
93
- messages.length > 0
94
- ? renderMarkdownValue(
95
- "list",
96
- messages.map((entry) => \`**\${entry.nickname}**: \${entry.message}\`),
97
- )
98
- : "_No messages yet._",
99
- ],
100
- block: guestbookBlock,
101
- });
102
- }
103
-
104
- function addGuestbookMessage(message) {
105
- const store = getGuestbookStore();
106
- const entry = {
107
- id: \`\${Date.now()}-\${Math.random().toString(36).slice(2, 8)}\`,
108
- nickname: message.nickname,
109
- message: message.message,
110
- createdAt: new Date().toISOString(),
111
- };
112
-
113
- store.unshift(entry);
114
- if (store.length > 20) {
115
- store.length = 20;
116
- }
117
-
118
- return { ...entry };
119
- }
120
-
121
- module.exports = defineActions({
122
- list: defineAction({
123
- async run() {
124
- return renderGuestbookFragment(listGuestbookMessages());
125
- },
126
- }),
127
- post: defineAction({
128
- async run(ctx) {
129
- const nickname = String(ctx.inputs.nickname ?? "").trim() || "Guest";
130
- const message = String(ctx.inputs.message ?? "").trim();
131
-
132
- if (!message) {
133
- return renderMarkdownFragment({
134
- body: [
135
- "## Action Status",
136
- "Please enter a message before submitting.",
137
- ],
138
- block: guestbookBlock,
139
- });
140
- }
141
-
142
- addGuestbookMessage({ nickname, message });
143
- return renderGuestbookFragment(listGuestbookMessages());
144
- },
145
- }),
146
- });
147
- `, "utf8");
148
- (0, node_fs_1.writeFileSync)(node_path_1.default.join(targetDir, "README.md"), `# ${packageName}
149
-
150
- Starter: runnable guestbook
151
-
152
- ## Commands
153
-
154
- \`\`\`bash
155
- npm run dev
156
- npm run build
157
- npm run start
158
- \`\`\`
159
-
160
- Open:
161
-
162
- \`\`\`text
163
- http://localhost:3000/
164
- \`\`\`
165
-
166
- Key files:
167
-
168
- - \`pages/index.md\`
169
- - \`server/actions.cjs\`
170
-
171
- Optional next steps:
172
-
173
- - Add \`mdsn.config.cjs\` when you need custom settings
174
- - Add \`layouts/default.html\` when you want a custom layout
175
- `, "utf8");
176
- }
@@ -1,17 +0,0 @@
1
- export type LayoutTemplateContext = {
2
- title: string;
3
- description: string;
4
- content: string;
5
- locale: string;
6
- defaultLocale: string;
7
- pathname?: string;
8
- canonicalUrl?: string;
9
- ogImageUrl?: string;
10
- siteName?: string;
11
- markdownAlternateUrl?: string;
12
- hreflangLinks?: string;
13
- posthogProjectApiKey?: string;
14
- posthogHost?: string;
15
- };
16
- export declare function applyLayoutTemplate(template: string, context: LayoutTemplateContext): string;
17
- export declare function resolveLocaleForRoutePath(routePath: string, locales: string[], defaultLocale: string): string;
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.applyLayoutTemplate = applyLayoutTemplate;
4
- exports.resolveLocaleForRoutePath = resolveLocaleForRoutePath;
5
- function escapeHtml(value) {
6
- return value
7
- .replace(/&/g, "&amp;")
8
- .replace(/</g, "&lt;")
9
- .replace(/>/g, "&gt;")
10
- .replace(/"/g, "&quot;")
11
- .replace(/'/g, "&#39;");
12
- }
13
- function applyLayoutTemplate(template, context) {
14
- const replacementByKey = {
15
- title: escapeHtml(context.title),
16
- description: escapeHtml(context.description),
17
- content: context.content,
18
- lang: escapeHtml(context.locale),
19
- locale: escapeHtml(context.locale),
20
- defaultLocale: escapeHtml(context.defaultLocale),
21
- pathname: escapeHtml(context.pathname ?? ""),
22
- canonical_url: escapeHtml(context.canonicalUrl ?? ""),
23
- og_image_url: escapeHtml(context.ogImageUrl ?? ""),
24
- site_name: escapeHtml(context.siteName ?? ""),
25
- markdown_alternate_url: escapeHtml(context.markdownAlternateUrl ?? ""),
26
- hreflang_links: context.hreflangLinks ?? "",
27
- posthog_project_api_key: escapeHtml(context.posthogProjectApiKey ?? ""),
28
- posthog_host: escapeHtml(context.posthogHost ?? ""),
29
- };
30
- return template.replace(/\{\{\s*([a-zA-Z_][\w-]*)\s*\}\}/g, (_match, key) => {
31
- return replacementByKey[key] ?? "";
32
- });
33
- }
34
- function resolveLocaleForRoutePath(routePath, locales, defaultLocale) {
35
- const firstSegment = routePath.split("/").filter(Boolean)[0];
36
- if (firstSegment && locales.includes(firstSegment)) {
37
- return firstSegment;
38
- }
39
- return defaultLocale;
40
- }
@@ -1,49 +0,0 @@
1
- import type { InputType } from "../core";
2
- export type MarkdownValueType = "text" | "list" | "table" | "json" | "image";
3
- export type MarkdownTableValue = {
4
- columns: string[];
5
- rows: Array<Array<string | number | boolean | null | undefined>>;
6
- };
7
- export type MarkdownImageValue = string | {
8
- src: string;
9
- alt?: string;
10
- title?: string;
11
- };
12
- export type MarkdownValue = string | string[] | Record<string, unknown> | MarkdownTableValue | MarkdownImageValue;
13
- export type SerializableInput = {
14
- name: string;
15
- type: InputType;
16
- required?: boolean;
17
- secret?: boolean;
18
- options?: string[];
19
- };
20
- export type SerializableRead = {
21
- name?: string;
22
- target: string;
23
- inputs?: string[];
24
- accept?: string;
25
- };
26
- export type SerializableWrite = {
27
- name: string;
28
- target: string;
29
- inputs?: string[];
30
- };
31
- export type SerializableBlock = {
32
- name: string;
33
- inputs?: SerializableInput[];
34
- reads?: SerializableRead[];
35
- writes?: SerializableWrite[];
36
- };
37
- export type RenderMarkdownFragmentOptions = {
38
- body?: string | string[];
39
- block?: SerializableBlock;
40
- };
41
- export declare function renderMarkdownValue(type: "text", value: string, options?: never): string;
42
- export declare function renderMarkdownValue(type: "list", value: string[], options?: never): string;
43
- export declare function renderMarkdownValue(type: "table", value: MarkdownTableValue, options?: never): string;
44
- export declare function renderMarkdownValue(type: "json", value: Record<string, unknown>, options?: {
45
- indent?: number;
46
- }): string;
47
- export declare function renderMarkdownValue(type: "image", value: MarkdownImageValue, options?: never): string;
48
- export declare function serializeBlock(block: SerializableBlock): string;
49
- export declare function renderMarkdownFragment(options: RenderMarkdownFragmentOptions): string;
@@ -1,77 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderMarkdownValue = renderMarkdownValue;
4
- exports.serializeBlock = serializeBlock;
5
- exports.renderMarkdownFragment = renderMarkdownFragment;
6
- function joinBody(body) {
7
- if (!body) {
8
- return "";
9
- }
10
- return Array.isArray(body)
11
- ? body.filter((part) => part.trim().length > 0).join("\n\n")
12
- : body.trim();
13
- }
14
- function escapeTableCell(value) {
15
- return String(value ?? "").replace(/\|/g, "\\|").replace(/\n/g, "<br />");
16
- }
17
- function formatIdentifierList(inputs, options) {
18
- if (inputs && inputs.length > 0) {
19
- return ` (${inputs.join(", ")})`;
20
- }
21
- return options?.always ? " ()" : "";
22
- }
23
- function renderMarkdownValue(type, value, options) {
24
- switch (type) {
25
- case "text":
26
- return String(value);
27
- case "list":
28
- return value.map((item) => `- ${item}`).join("\n");
29
- case "table": {
30
- const table = value;
31
- const header = `| ${table.columns.map(escapeTableCell).join(" | ")} |`;
32
- const divider = `| ${table.columns.map(() => "---").join(" | ")} |`;
33
- const rows = table.rows.map((row) => `| ${row.map(escapeTableCell).join(" | ")} |`);
34
- return [header, divider, ...rows].join("\n");
35
- }
36
- case "json":
37
- return `\`\`\`json\n${JSON.stringify(value, null, options?.indent ?? 2)}\n\`\`\``;
38
- case "image": {
39
- const image = value;
40
- if (typeof image === "string") {
41
- return `![](${image})`;
42
- }
43
- const title = image.title ? ` "${image.title.replace(/"/g, '\\"')}"` : "";
44
- return `![${image.alt ?? ""}](${image.src}${title})`;
45
- }
46
- }
47
- }
48
- function serializeBlock(block) {
49
- const lines = ["```mdsn", `BLOCK ${block.name} {`];
50
- for (const input of block.inputs ?? []) {
51
- const requiredMarker = input.required ? " required" : "";
52
- const secretMarker = input.secret ? " secret" : "";
53
- const optionsLiteral = input.options ? ` ${JSON.stringify(input.options)}` : "";
54
- lines.push(` INPUT ${input.type}${requiredMarker}${secretMarker}${optionsLiteral} -> ${input.name}`);
55
- }
56
- for (const read of block.reads ?? []) {
57
- const acceptClause = read.accept ? ` accept:${JSON.stringify(read.accept)}` : "";
58
- const nameClause = read.name ? ` -> ${read.name}` : "";
59
- lines.push(` GET "${read.target}"${formatIdentifierList(read.inputs)}${acceptClause}${nameClause}`);
60
- }
61
- for (const write of block.writes ?? []) {
62
- lines.push(` POST "${write.target}"${formatIdentifierList(write.inputs, { always: true })} -> ${write.name}`);
63
- }
64
- lines.push("}", "```");
65
- return lines.join("\n");
66
- }
67
- function renderMarkdownFragment(options) {
68
- const parts = [];
69
- const body = joinBody(options.body);
70
- if (body) {
71
- parts.push(body);
72
- }
73
- if (options.block) {
74
- parts.push(serializeBlock(options.block));
75
- }
76
- return parts.join("\n\n").trimEnd() + "\n";
77
- }
@@ -1,4 +0,0 @@
1
- export type ImportModuleFromFileOptions = {
2
- fresh?: boolean;
3
- };
4
- export declare function importModuleFromFile(filePath: string, options?: ImportModuleFromFileOptions): Promise<Record<string, unknown>>;
@@ -1,71 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.importModuleFromFile = importModuleFromFile;
40
- const node_module_1 = require("node:module");
41
- const node_path_1 = __importDefault(require("node:path"));
42
- const node_url_1 = require("node:url");
43
- const requireFromCwd = (0, node_module_1.createRequire)(node_path_1.default.join(process.cwd(), "package.json"));
44
- function toImportSpecifier(filePath, options) {
45
- const url = (0, node_url_1.pathToFileURL)(filePath);
46
- if (options.fresh) {
47
- url.searchParams.set("ts", String(Date.now()));
48
- }
49
- return url.href;
50
- }
51
- function requireModuleFromFile(filePath, options) {
52
- if (!options.fresh) {
53
- return requireFromCwd(filePath);
54
- }
55
- const resolvedPath = requireFromCwd.resolve(filePath);
56
- delete requireFromCwd.cache[resolvedPath];
57
- return requireFromCwd(filePath);
58
- }
59
- async function importModuleFromFile(filePath, options = {}) {
60
- try {
61
- return await Promise.resolve(`${toImportSpecifier(filePath, options)}`).then(s => __importStar(require(s)));
62
- }
63
- catch (importError) {
64
- try {
65
- return requireModuleFromFile(filePath, options);
66
- }
67
- catch {
68
- throw importError;
69
- }
70
- }
71
- }
@@ -1,3 +0,0 @@
1
- export declare function wantsHtml(acceptHeader?: string): boolean;
2
- export declare function wantsMarkdown(acceptHeader?: string): boolean;
3
- export declare function isNotAcceptableRequest(acceptHeader?: string): boolean;
@@ -1,55 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.wantsHtml = wantsHtml;
4
- exports.wantsMarkdown = wantsMarkdown;
5
- exports.isNotAcceptableRequest = isNotAcceptableRequest;
6
- function parseAcceptHeader(acceptHeader) {
7
- if (!acceptHeader || acceptHeader.trim().length === 0) {
8
- return [];
9
- }
10
- return acceptHeader
11
- .split(",")
12
- .map((raw) => raw.trim())
13
- .filter((raw) => raw.length > 0)
14
- .map((part) => {
15
- const [mediaTypeToken, ...parameterTokens] = part.split(";");
16
- const mediaType = mediaTypeToken.trim().toLowerCase();
17
- const qualityToken = parameterTokens.find((parameter) => parameter.trim().toLowerCase().startsWith("q="));
18
- const parsedQuality = qualityToken ? Number.parseFloat(qualityToken.split("=")[1] ?? "") : 1;
19
- const quality = Number.isFinite(parsedQuality) ? Math.min(Math.max(parsedQuality, 0), 1) : 1;
20
- return {
21
- mediaType,
22
- quality,
23
- };
24
- })
25
- .filter((entry) => entry.mediaType.length > 0);
26
- }
27
- function hasAcceptableMediaType(acceptHeader, matcher) {
28
- return parseAcceptHeader(acceptHeader).some((entry) => entry.quality > 0 && matcher(entry.mediaType));
29
- }
30
- function wantsHtml(acceptHeader) {
31
- return hasAcceptableMediaType(acceptHeader, (mediaType) => mediaType === "text/html" || mediaType === "application/xhtml+xml");
32
- }
33
- function wantsMarkdown(acceptHeader) {
34
- return hasAcceptableMediaType(acceptHeader, (mediaType) => mediaType === "text/markdown");
35
- }
36
- function supportsAnyRepresentation(mediaType) {
37
- if (mediaType === "*/*")
38
- return true;
39
- if (mediaType === "text/*")
40
- return true;
41
- if (mediaType === "text/html")
42
- return true;
43
- if (mediaType === "application/xhtml+xml")
44
- return true;
45
- if (mediaType === "text/markdown")
46
- return true;
47
- return false;
48
- }
49
- function isNotAcceptableRequest(acceptHeader) {
50
- const entries = parseAcceptHeader(acceptHeader);
51
- if (entries.length === 0) {
52
- return false;
53
- }
54
- return !entries.some((entry) => entry.quality > 0 && supportsAnyRepresentation(entry.mediaType));
55
- }
@@ -1,21 +0,0 @@
1
- export interface HostedPageResponse {
2
- status: number;
3
- contentType: string;
4
- body: string;
5
- }
6
- export interface RenderHostedPageOptions {
7
- accept?: string;
8
- routePath?: string;
9
- siteTitle?: string;
10
- siteDescription?: string;
11
- siteBaseUrl?: string;
12
- locales?: string[];
13
- defaultLocale?: string;
14
- markdown?: {
15
- linkify?: boolean;
16
- typographer?: boolean;
17
- };
18
- mapActionTarget?: (target: string) => string;
19
- layoutTemplate?: string;
20
- }
21
- export declare function renderHostedPage(rawPage: string, options: RenderHostedPageOptions): HostedPageResponse;
@@ -1,66 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderHostedPage = renderHostedPage;
4
- const page_definition_1 = require("../core/document/page-definition");
5
- const page_render_1 = require("../web/page-render");
6
- const page_html_1 = require("../web/page-html");
7
- const layout_1 = require("./layout");
8
- const page_links_1 = require("./page-links");
9
- const negotiate_1 = require("./negotiate");
10
- function renderHostedPage(rawPage, options) {
11
- if ((0, negotiate_1.isNotAcceptableRequest)(options.accept)) {
12
- return {
13
- status: 406,
14
- contentType: "text/plain; charset=utf-8",
15
- body: "Not Acceptable",
16
- };
17
- }
18
- if (!(0, negotiate_1.wantsHtml)(options.accept)) {
19
- return {
20
- status: 200,
21
- contentType: "text/markdown; charset=utf-8",
22
- body: rawPage,
23
- };
24
- }
25
- const document = (0, page_definition_1.parsePageDefinition)(rawPage);
26
- const routePath = options.routePath ?? "/";
27
- const model = (0, page_render_1.createPageRenderModel)(document, {
28
- mapActionTarget: options.mapActionTarget,
29
- markdown: options.markdown,
30
- });
31
- const locale = (0, layout_1.resolveLocaleForRoutePath)(routePath, options.locales ?? ["en"], options.defaultLocale ?? "en");
32
- const title = typeof document.frontmatter.title === "string" && document.frontmatter.title.trim().length > 0
33
- ? document.frontmatter.title
34
- : options.siteTitle;
35
- const description = typeof document.frontmatter.description === "string" && document.frontmatter.description.trim().length > 0
36
- ? document.frontmatter.description
37
- : options.siteDescription ?? "";
38
- const defaultLocale = options.defaultLocale ?? locale;
39
- const body = options.layoutTemplate
40
- ? (0, layout_1.applyLayoutTemplate)(options.layoutTemplate, {
41
- title: title ?? "MDSN Page",
42
- description,
43
- content: (0, page_html_1.renderPageHtmlContent)(model),
44
- locale,
45
- defaultLocale,
46
- pathname: routePath,
47
- canonicalUrl: (0, page_links_1.resolveCanonicalUrl)(routePath, options.siteBaseUrl),
48
- siteName: options.siteTitle,
49
- markdownAlternateUrl: (0, page_links_1.resolveMarkdownAlternateUrl)(routePath, options.siteBaseUrl),
50
- hreflangLinks: (0, page_links_1.resolveHreflangLinks)({
51
- routePath,
52
- locales: options.locales ?? ["en"],
53
- defaultLocale,
54
- siteBaseUrl: options.siteBaseUrl,
55
- }),
56
- })
57
- : (0, page_html_1.renderPageHtmlDocument)(model, {
58
- title,
59
- lang: locale,
60
- });
61
- return {
62
- status: 200,
63
- contentType: "text/html; charset=utf-8",
64
- body,
65
- };
66
- }
@@ -1,10 +0,0 @@
1
- export declare function mapPageTargetToHttpPath(target: string): string;
2
- export declare function joinUrl(baseUrl: string, routePath: string): string;
3
- export declare function resolveCanonicalUrl(routePath: string, siteBaseUrl?: string): string | undefined;
4
- export declare function resolveMarkdownAlternateUrl(routePath: string, siteBaseUrl?: string): string;
5
- export declare function resolveHreflangLinks(options: {
6
- routePath: string;
7
- locales: string[];
8
- defaultLocale: string;
9
- siteBaseUrl?: string;
10
- }): string;