@mdsnai/sdk 0.2.2 → 0.3.3

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 +40 -76
  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
@@ -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;
@@ -1,80 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mapPageTargetToHttpPath = mapPageTargetToHttpPath;
4
- exports.joinUrl = joinUrl;
5
- exports.resolveCanonicalUrl = resolveCanonicalUrl;
6
- exports.resolveMarkdownAlternateUrl = resolveMarkdownAlternateUrl;
7
- exports.resolveHreflangLinks = resolveHreflangLinks;
8
- const routes_1 = require("./routes");
9
- function mapPageTargetToHttpPath(target) {
10
- if (/^https?:\/\//i.test(target)) {
11
- return target;
12
- }
13
- const markdownRoutePath = (0, routes_1.markdownPathToRoutePath)(target);
14
- if (markdownRoutePath) {
15
- return markdownRoutePath;
16
- }
17
- return target;
18
- }
19
- function joinUrl(baseUrl, routePath) {
20
- const normalizedBase = baseUrl.replace(/\/+$/, "");
21
- const normalizedPath = routePath.startsWith("/") ? routePath : `/${routePath}`;
22
- return `${normalizedBase}${normalizedPath}`;
23
- }
24
- function resolveCanonicalUrl(routePath, siteBaseUrl) {
25
- if (!siteBaseUrl) {
26
- return undefined;
27
- }
28
- return joinUrl(siteBaseUrl, routePath);
29
- }
30
- function resolveMarkdownAlternateUrl(routePath, siteBaseUrl) {
31
- const markdownPath = (0, routes_1.routePathToMarkdownPath)(routePath);
32
- if (!siteBaseUrl) {
33
- return markdownPath;
34
- }
35
- return joinUrl(siteBaseUrl, markdownPath);
36
- }
37
- function normalizeRoutePath(routePath) {
38
- if (!routePath || routePath === "/") {
39
- return "/";
40
- }
41
- return routePath.replace(/\/+$/, "") || "/";
42
- }
43
- function resolveRouteSuffix(routePath, locales) {
44
- const normalized = normalizeRoutePath(routePath);
45
- if (normalized === "/")
46
- return "/";
47
- const segments = normalized.split("/").filter(Boolean);
48
- const first = segments[0];
49
- if (first && locales.includes(first)) {
50
- const suffix = `/${segments.slice(1).join("/")}`;
51
- return suffix === "/" ? "/" : suffix.replace(/\/+$/, "") || "/";
52
- }
53
- return normalized;
54
- }
55
- function resolveLocalizedRoutePath(locale, suffix, defaultLocale) {
56
- if (locale === defaultLocale) {
57
- return suffix;
58
- }
59
- if (suffix === "/") {
60
- return `/${locale}`;
61
- }
62
- return `/${locale}${suffix}`;
63
- }
64
- function resolveHreflangLinks(options) {
65
- const suffix = resolveRouteSuffix(options.routePath, options.locales);
66
- const links = [];
67
- const toHref = (routePath) => {
68
- if (!options.siteBaseUrl) {
69
- return routePath;
70
- }
71
- return joinUrl(options.siteBaseUrl, routePath);
72
- };
73
- for (const locale of options.locales) {
74
- const href = toHref(resolveLocalizedRoutePath(locale, suffix, options.defaultLocale));
75
- links.push(`<link rel="alternate" hreflang="${locale}" href="${href}" />`);
76
- }
77
- const defaultHref = toHref(resolveLocalizedRoutePath(options.defaultLocale, suffix, options.defaultLocale));
78
- links.push(`<link rel="alternate" hreflang="x-default" href="${defaultHref}" />`);
79
- return links.join("\n ");
80
- }
@@ -1,6 +0,0 @@
1
- type RoutablePage = {
2
- routePath: string;
3
- };
4
- export declare function sortRoutedPagesForMatching<T extends RoutablePage>(routedPages: T[]): T[];
5
- export declare function resolveRoutedPageForPath<T extends RoutablePage>(requestPath: string, routedPages: T[]): T | null;
6
- export {};
@@ -1,73 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sortRoutedPagesForMatching = sortRoutedPagesForMatching;
4
- exports.resolveRoutedPageForPath = resolveRoutedPageForPath;
5
- function normalizeRoutePath(pathname) {
6
- if (!pathname)
7
- return "/";
8
- if (pathname === "/")
9
- return pathname;
10
- return pathname.replace(/\/+$/, "") || "/";
11
- }
12
- function isDynamicRouteSegment(segment) {
13
- return /^\[[^\]/]+\]$/.test(segment);
14
- }
15
- function compareRouteSpecificity(left, right) {
16
- const leftSegments = normalizeRoutePath(left.routePath).split("/").filter(Boolean);
17
- const rightSegments = normalizeRoutePath(right.routePath).split("/").filter(Boolean);
18
- const maxLength = Math.max(leftSegments.length, rightSegments.length);
19
- for (let index = 0; index < maxLength; index += 1) {
20
- const leftSegment = leftSegments[index];
21
- const rightSegment = rightSegments[index];
22
- const leftWeight = leftSegment
23
- ? (isDynamicRouteSegment(leftSegment) ? 1 : 2)
24
- : 0;
25
- const rightWeight = rightSegment
26
- ? (isDynamicRouteSegment(rightSegment) ? 1 : 2)
27
- : 0;
28
- if (leftWeight !== rightWeight) {
29
- return rightWeight - leftWeight;
30
- }
31
- }
32
- if (leftSegments.length !== rightSegments.length) {
33
- return rightSegments.length - leftSegments.length;
34
- }
35
- return left.routePath.localeCompare(right.routePath);
36
- }
37
- function routePathMatchesRequestPath(routePath, requestPath) {
38
- const normalizedRoutePath = normalizeRoutePath(routePath);
39
- const normalizedRequestPath = normalizeRoutePath(requestPath);
40
- if (normalizedRoutePath === normalizedRequestPath) {
41
- return true;
42
- }
43
- if (!normalizedRoutePath.includes("[")) {
44
- return false;
45
- }
46
- const routeSegments = normalizedRoutePath.split("/").filter(Boolean);
47
- const requestSegments = normalizedRequestPath.split("/").filter(Boolean);
48
- if (routeSegments.length !== requestSegments.length) {
49
- return false;
50
- }
51
- for (let index = 0; index < routeSegments.length; index += 1) {
52
- const routeSegment = routeSegments[index];
53
- const requestSegment = requestSegments[index];
54
- if (isDynamicRouteSegment(routeSegment)) {
55
- continue;
56
- }
57
- if (routeSegment !== requestSegment) {
58
- return false;
59
- }
60
- }
61
- return true;
62
- }
63
- function sortRoutedPagesForMatching(routedPages) {
64
- return [...routedPages].sort(compareRouteSpecificity);
65
- }
66
- function resolveRoutedPageForPath(requestPath, routedPages) {
67
- for (const page of routedPages) {
68
- if (routePathMatchesRequestPath(page.routePath, requestPath)) {
69
- return page;
70
- }
71
- }
72
- return null;
73
- }
@@ -1,6 +0,0 @@
1
- export declare function pagePathToRoutePath(filePath: string, pagesDir: string): string;
2
- export declare function routePathToExpressPath(routePath: string): string;
3
- export declare function routePathToMarkdownPath(routePath: string): string;
4
- export declare function markdownPathToRoutePath(pathname: string): string | null;
5
- export declare function extractRouteParamNames(routePath: string): string[];
6
- export declare function defaultLocaleRouteToFallbackPath(routePath: string, defaultLocale: string): string | null;
@@ -1,73 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pagePathToRoutePath = pagePathToRoutePath;
4
- exports.routePathToExpressPath = routePathToExpressPath;
5
- exports.routePathToMarkdownPath = routePathToMarkdownPath;
6
- exports.markdownPathToRoutePath = markdownPathToRoutePath;
7
- exports.extractRouteParamNames = extractRouteParamNames;
8
- exports.defaultLocaleRouteToFallbackPath = defaultLocaleRouteToFallbackPath;
9
- function normalizeSegments(relativePath) {
10
- return relativePath.split("/").filter(Boolean);
11
- }
12
- function normalizeRoutePath(routePath) {
13
- if (!routePath || routePath === "/") {
14
- return "/";
15
- }
16
- return routePath.startsWith("/")
17
- ? (routePath.replace(/\/+$/, "") || "/")
18
- : (`/${routePath}`.replace(/\/+$/, "") || "/");
19
- }
20
- function pagePathToRoutePath(filePath, pagesDir) {
21
- const normalizedFilePath = filePath.replace(/\\/g, "/");
22
- const normalizedPagesDir = pagesDir.replace(/\\/g, "/").replace(/\/+$/, "");
23
- const withPrefix = `${normalizedPagesDir}/`;
24
- const relativePath = normalizedFilePath.startsWith(withPrefix)
25
- ? normalizedFilePath.slice(withPrefix.length)
26
- : normalizedFilePath;
27
- const withoutExtension = relativePath.replace(/\.md$/, "");
28
- const segments = normalizeSegments(withoutExtension);
29
- if (segments[segments.length - 1] === "index") {
30
- segments.pop();
31
- }
32
- if (segments.length === 0) {
33
- return "/";
34
- }
35
- return `/${segments.join("/")}`;
36
- }
37
- function routePathToExpressPath(routePath) {
38
- return routePath.replace(/\[([^\]]+)\]/g, ":$1");
39
- }
40
- function routePathToMarkdownPath(routePath) {
41
- const normalized = normalizeRoutePath(routePath);
42
- if (normalized === "/") {
43
- return "/index.md";
44
- }
45
- return `${normalized}.md`;
46
- }
47
- function markdownPathToRoutePath(pathname) {
48
- if (!pathname || !pathname.toLowerCase().endsWith(".md")) {
49
- return null;
50
- }
51
- const normalized = normalizeRoutePath(pathname);
52
- if (normalized === "/index.md") {
53
- return "/";
54
- }
55
- const stripped = normalized.slice(0, -3);
56
- if (stripped.endsWith("/index")) {
57
- return stripped.slice(0, -6) || "/";
58
- }
59
- return stripped.length > 0 ? stripped : "/";
60
- }
61
- function extractRouteParamNames(routePath) {
62
- return Array.from(routePath.matchAll(/\[([^\]]+)\]/g), (match) => match[1]);
63
- }
64
- function defaultLocaleRouteToFallbackPath(routePath, defaultLocale) {
65
- const localePrefix = `/${defaultLocale}`;
66
- if (routePath === localePrefix) {
67
- return "/";
68
- }
69
- if (routePath.startsWith(`${localePrefix}/`)) {
70
- return routePath.slice(localePrefix.length);
71
- }
72
- return null;
73
- }
@@ -1,28 +0,0 @@
1
- import type { Express } from "express";
2
- import { type CreateFrameworkAppOptions } from "../framework/create-framework-app";
3
- import { type MdsnConfig } from "./config";
4
- import { type Logger } from "../core";
5
- export type CreateFrameworkAppFn = (options: CreateFrameworkAppOptions) => Express;
6
- export type ListenFn = (options: {
7
- app: Express;
8
- port: number;
9
- log: (message: string) => void;
10
- }) => Promise<void>;
11
- export type OpenBrowserFn = (url: string) => Promise<void> | void;
12
- export declare function loadUserConfig(rootDir: string, logger?: Logger): Promise<MdsnConfig>;
13
- export declare function loadBuiltConfig(distDir: string): MdsnConfig | null;
14
- export declare function listenOnPort(options: {
15
- app: Express;
16
- port: number;
17
- log: (message: string) => void;
18
- }): Promise<void>;
19
- export declare function openBrowser(url: string): void;
20
- export declare function startFrameworkServer(options?: {
21
- cwd?: string;
22
- port?: number;
23
- mode?: "dev" | "start";
24
- createApp?: CreateFrameworkAppFn;
25
- listen?: ListenFn;
26
- openBrowser?: OpenBrowserFn;
27
- log?: (message: string) => void;
28
- }): Promise<void>;
@@ -1,161 +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.loadUserConfig = loadUserConfig;
7
- exports.loadBuiltConfig = loadBuiltConfig;
8
- exports.listenOnPort = listenOnPort;
9
- exports.openBrowser = openBrowser;
10
- exports.startFrameworkServer = startFrameworkServer;
11
- const node_child_process_1 = require("node:child_process");
12
- const node_fs_1 = require("node:fs");
13
- const node_path_1 = __importDefault(require("node:path"));
14
- const create_framework_app_1 = require("../framework/create-framework-app");
15
- const config_1 = require("./config");
16
- const dev_1 = require("./dev");
17
- const module_loader_1 = require("./module-loader");
18
- const core_1 = require("../core");
19
- const USER_CONFIG_CANDIDATES = [
20
- "mdsn.config.cjs",
21
- "mdsn.config.js",
22
- "mdsn.config.json",
23
- "mdsn.config.ts",
24
- "mdsn.config.mts",
25
- "mdsn.config.cts",
26
- ];
27
- function formatConfigLoadError(configPath, error) {
28
- const message = error instanceof Error ? error.message : String(error);
29
- const extension = node_path_1.default.extname(configPath).toLowerCase();
30
- const isTypeScriptConfig = extension === ".ts" || extension === ".mts" || extension === ".cts";
31
- if (isTypeScriptConfig) {
32
- return new Error(`Failed to load ${node_path_1.default.basename(configPath)}: ${message}. `
33
- + "If you are using the published mdsn CLI binary, prefer mdsn.config.cjs for portable runtime loading.");
34
- }
35
- return new Error(`Failed to load ${node_path_1.default.basename(configPath)}: ${message}`);
36
- }
37
- async function loadConfigFromFile(configPath, logger) {
38
- const extension = node_path_1.default.extname(configPath).toLowerCase();
39
- if (extension === ".json") {
40
- return JSON.parse((0, node_fs_1.readFileSync)(configPath, "utf8"));
41
- }
42
- try {
43
- const loadedModule = await (0, module_loader_1.importModuleFromFile)(configPath);
44
- return (loadedModule.default ?? loadedModule);
45
- }
46
- catch (error) {
47
- logger.debug("Failed to load config file", { path: configPath });
48
- throw formatConfigLoadError(configPath, error);
49
- }
50
- }
51
- async function loadUserConfig(rootDir, logger) {
52
- const log = logger ?? (0, core_1.createLogger)({ prefix: "config" });
53
- const availableConfigPaths = USER_CONFIG_CANDIDATES
54
- .map((name) => node_path_1.default.join(rootDir, name))
55
- .filter((candidatePath) => (0, node_fs_1.existsSync)(candidatePath));
56
- if (availableConfigPaths.length === 0) {
57
- log.debug("No config file found, using defaults");
58
- return {};
59
- }
60
- const errors = [];
61
- for (const configPath of availableConfigPaths) {
62
- try {
63
- log.debug("Loading config file", { path: configPath });
64
- return await loadConfigFromFile(configPath, log);
65
- }
66
- catch (error) {
67
- errors.push(error instanceof Error ? error : new Error(String(error)));
68
- }
69
- }
70
- if (errors.length === 1) {
71
- throw errors[0];
72
- }
73
- const details = errors.map((error) => `- ${error.message}`).join("\n");
74
- throw new Error(`Failed to load user config from ${rootDir}:\n${details}`);
75
- }
76
- function loadBuiltConfig(distDir) {
77
- const configPath = node_path_1.default.join(distDir, "mdsn.config.json");
78
- if (!(0, node_fs_1.existsSync)(configPath)) {
79
- return null;
80
- }
81
- return JSON.parse((0, node_fs_1.readFileSync)(configPath, "utf8"));
82
- }
83
- async function listenOnPort(options) {
84
- const { app, port, log } = options;
85
- await new Promise((resolve, reject) => {
86
- const server = app.listen(port, () => {
87
- log(`MDSN framework server listening on http://localhost:${port}`);
88
- resolve();
89
- });
90
- server.on("error", reject);
91
- });
92
- }
93
- function openBrowser(url) {
94
- const command = process.platform === "darwin"
95
- ? { file: "open", args: [url] }
96
- : process.platform === "win32"
97
- ? { file: "cmd", args: ["/c", "start", "", url] }
98
- : { file: "xdg-open", args: [url] };
99
- const child = (0, node_child_process_1.spawn)(command.file, command.args, {
100
- detached: true,
101
- stdio: "ignore",
102
- });
103
- child.unref();
104
- }
105
- async function startFrameworkServer(options = {}) {
106
- const logger = (0, core_1.createLogger)({ prefix: "server" });
107
- const cwd = node_path_1.default.resolve(options.cwd ?? process.cwd());
108
- const distDir = node_path_1.default.join(cwd, "dist");
109
- const shouldUseDist = options.mode === "start";
110
- const builtConfig = shouldUseDist ? loadBuiltConfig(distDir) : null;
111
- const rootDir = builtConfig ? distDir : cwd;
112
- const config = builtConfig ?? await loadUserConfig(rootDir, logger);
113
- const resolvedConfig = (0, config_1.resolveConfig)(config);
114
- const devState = options.mode === "dev" ? (0, dev_1.createDevState)() : undefined;
115
- const app = (options.createApp ?? create_framework_app_1.createFrameworkApp)({
116
- rootDir,
117
- mode: options.mode,
118
- config,
119
- devState,
120
- });
121
- if (devState) {
122
- for (const directoryName of [
123
- resolvedConfig.dirs.pages,
124
- resolvedConfig.dirs.server,
125
- resolvedConfig.dirs.public,
126
- resolvedConfig.dirs.layouts,
127
- ]) {
128
- const targetDir = node_path_1.default.join(rootDir, directoryName);
129
- if (!(0, node_fs_1.existsSync)(targetDir))
130
- continue;
131
- try {
132
- (0, node_fs_1.watch)(targetDir, { recursive: true }, (_eventType, fileName) => {
133
- const relativeName = typeof fileName === "string" && fileName
134
- ? node_path_1.default.join(directoryName, fileName).split(node_path_1.default.sep).join("/")
135
- : directoryName;
136
- devState.bumpVersion(relativeName);
137
- logger.debug("File changed, bumping version", { file: relativeName });
138
- });
139
- logger.info("Watching directory for changes", { directory: directoryName });
140
- }
141
- catch (error) {
142
- logger.warn("Failed to setup file watcher", { directory: directoryName, error: String(error) });
143
- }
144
- }
145
- }
146
- const port = options.port ?? resolvedConfig.server.port;
147
- await (options.listen ?? listenOnPort)({
148
- app,
149
- port,
150
- log: options.log ?? console.log,
151
- });
152
- if (options.mode === "dev" && resolvedConfig.dev.openBrowser) {
153
- try {
154
- await (options.openBrowser ?? openBrowser)(`http://localhost:${port}`);
155
- logger.info("Opening browser", { url: `http://localhost:${port}` });
156
- }
157
- catch (error) {
158
- logger.warn("Failed to open browser", { error: String(error) });
159
- }
160
- }
161
- }
@@ -1,11 +0,0 @@
1
- import { type MdsnConfig } from "./config";
2
- export type FrameworkSitePaths = {
3
- rootDir: string;
4
- pagesDir: string;
5
- serverDir: string;
6
- publicDir: string;
7
- layoutsDir: string;
8
- };
9
- export declare function resolveSitePaths(rootDir: string, config: MdsnConfig): FrameworkSitePaths;
10
- export declare function findPageFiles(pagesDir: string): string[];
11
- export declare function findActionFiles(serverDir: string): string[];
@@ -1,59 +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.resolveSitePaths = resolveSitePaths;
7
- exports.findPageFiles = findPageFiles;
8
- exports.findActionFiles = findActionFiles;
9
- const node_path_1 = __importDefault(require("node:path"));
10
- const node_fs_1 = require("node:fs");
11
- const config_1 = require("./config");
12
- function resolveSitePaths(rootDir, config) {
13
- const resolved = (0, config_1.resolveConfig)(config);
14
- return {
15
- rootDir,
16
- pagesDir: node_path_1.default.join(rootDir, resolved.dirs.pages),
17
- serverDir: node_path_1.default.join(rootDir, resolved.dirs.server),
18
- publicDir: node_path_1.default.join(rootDir, resolved.dirs.public),
19
- layoutsDir: node_path_1.default.join(rootDir, resolved.dirs.layouts),
20
- };
21
- }
22
- function walkFiles(rootDir) {
23
- try {
24
- const entries = (0, node_fs_1.readdirSync)(rootDir, { withFileTypes: true });
25
- const files = [];
26
- for (const entry of entries) {
27
- const absolutePath = node_path_1.default.join(rootDir, entry.name);
28
- if (entry.isDirectory()) {
29
- files.push(...walkFiles(absolutePath));
30
- continue;
31
- }
32
- if (entry.isFile()) {
33
- files.push(absolutePath);
34
- }
35
- }
36
- return files;
37
- }
38
- catch (error) {
39
- if (error.code === "ENOENT") {
40
- return [];
41
- }
42
- throw error;
43
- }
44
- }
45
- function hasIgnoredPrivateSegment(rootDir, filePath) {
46
- const relativeSegments = node_path_1.default.relative(rootDir, filePath).split(node_path_1.default.sep).filter(Boolean);
47
- return relativeSegments.some((segment) => segment.startsWith("_") || segment === "lib");
48
- }
49
- function findPageFiles(pagesDir) {
50
- return walkFiles(pagesDir)
51
- .filter((filePath) => filePath.endsWith(".md"))
52
- .sort();
53
- }
54
- function findActionFiles(serverDir) {
55
- return walkFiles(serverDir)
56
- .filter((filePath) => /\.(js|mjs|cjs)$/.test(filePath))
57
- .filter((filePath) => !hasIgnoredPrivateSegment(serverDir, filePath))
58
- .sort();
59
- }
@@ -1,7 +0,0 @@
1
- export type FrameworkTarget = {
2
- kind: "action";
3
- target: string;
4
- actionPath: string;
5
- };
6
- export declare function parseFrameworkTarget(target: string): FrameworkTarget | null;
7
- export declare function isActionTarget(target: string): boolean;
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseFrameworkTarget = parseFrameworkTarget;
4
- exports.isActionTarget = isActionTarget;
5
- function parseFrameworkTarget(target) {
6
- if (!target || /\.md$/i.test(target) || /^https?:\/\//i.test(target)) {
7
- return null;
8
- }
9
- const actionPath = target.replace(/^\/+/, "");
10
- if (!actionPath) {
11
- return null;
12
- }
13
- return {
14
- kind: "action",
15
- target,
16
- actionPath,
17
- };
18
- }
19
- function isActionTarget(target) {
20
- return parseFrameworkTarget(target) !== null;
21
- }
@@ -1,2 +0,0 @@
1
- export declare function createBlockRegionMarkup(blockName: string, innerHtml: string): string;
2
- export declare function replaceBlockRegionMarkup(html: string, blockName: string, replacementInnerHtml: string): string;
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createBlockRegionMarkup = createBlockRegionMarkup;
4
- exports.replaceBlockRegionMarkup = replaceBlockRegionMarkup;
5
- const core_1 = require("../core");
6
- function createRegionMarker(kind, blockName) {
7
- return `<!--mdsn:block-region:${kind}:${(0, core_1.escapeHtml)(blockName)}-->`;
8
- }
9
- function createBlockRegionMarkup(blockName, innerHtml) {
10
- return `${createRegionMarker("start", blockName)}<section class="mdsn-block-region" data-mdsn-block-region="${(0, core_1.escapeHtml)(blockName)}">${innerHtml}</section>${createRegionMarker("end", blockName)}`;
11
- }
12
- const blockRegionPatterns = new Map();
13
- function getBlockRegionPattern(blockName) {
14
- let pattern = blockRegionPatterns.get(blockName);
15
- if (!pattern) {
16
- const escapedName = (0, core_1.escapeRegExp)((0, core_1.escapeHtml)(blockName));
17
- pattern = new RegExp(`<!--mdsn:block-region:start:${escapedName}-->[\\s\\S]*?<!--mdsn:block-region:end:${escapedName}-->`, "g");
18
- blockRegionPatterns.set(blockName, pattern);
19
- }
20
- return pattern;
21
- }
22
- function replaceBlockRegionMarkup(html, blockName, replacementInnerHtml) {
23
- const pattern = getBlockRegionPattern(blockName);
24
- return html.replace(pattern, createBlockRegionMarkup(blockName, replacementInnerHtml));
25
- }
@@ -1,8 +0,0 @@
1
- import type { BlockDefinition } from "../core/model/block";
2
- import { type CreatePageRenderOptions } from "./page-render";
3
- export interface ParsedBlockFragment {
4
- markdown: string;
5
- blocks: BlockDefinition[];
6
- }
7
- export declare function parseBlockFragment(raw: string): ParsedBlockFragment;
8
- export declare function renderBlockFragmentHtml(raw: string, blockName?: string, options?: CreatePageRenderOptions): string;
@@ -1,58 +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.parseBlockFragment = parseBlockFragment;
7
- exports.renderBlockFragmentHtml = renderBlockFragmentHtml;
8
- const markdown_it_1 = __importDefault(require("markdown-it"));
9
- const headless_1 = require("./headless");
10
- const page_render_1 = require("./page-render");
11
- function escapeHtml(value) {
12
- return value
13
- .replace(/&/g, "&amp;")
14
- .replace(/</g, "&lt;")
15
- .replace(/>/g, "&gt;")
16
- .replace(/"/g, "&quot;")
17
- .replace(/'/g, "&#39;");
18
- }
19
- function unwrapBlockRegionMarkup(renderedHtml, blockName) {
20
- const escapedName = escapeHtml(blockName).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
21
- const pattern = new RegExp(`<!--mdsn:block-region:start:${escapedName}--><section class="mdsn-block-region" data-mdsn-block-region="${escapedName}">([\\s\\S]*?)<\\/section><!--mdsn:block-region:end:${escapedName}-->`, "gu");
22
- return renderedHtml.replace(pattern, "$1");
23
- }
24
- function parseBlockFragment(raw) {
25
- const parsed = (0, headless_1.parseFragment)(raw);
26
- return {
27
- markdown: parsed.containers.map((container) => container.markdown).join("\n\n").trim(),
28
- blocks: parsed.block ? [parsed.block] : [],
29
- };
30
- }
31
- function createMarkdownRenderer(options) {
32
- return new markdown_it_1.default({
33
- html: true,
34
- linkify: options?.linkify ?? true,
35
- typographer: options?.typographer ?? false,
36
- });
37
- }
38
- function renderBlockFragmentHtml(raw, blockName, options) {
39
- const fragment = (0, headless_1.parseFragment)(raw);
40
- const effectiveBlockName = blockName ?? fragment.block?.name;
41
- const renderer = createMarkdownRenderer(options?.markdown);
42
- const renderedHtml = fragment.segments.map((segment) => {
43
- if (segment.type === "container") {
44
- return renderer.render(segment.container.markdown).trimEnd();
45
- }
46
- if (!effectiveBlockName) {
47
- throw new Error("Interactive block fragments require a block name");
48
- }
49
- const block = segment.block.name === effectiveBlockName
50
- ? segment.block
51
- : { ...segment.block, name: effectiveBlockName };
52
- return (0, page_render_1.renderBlockPanelHtml)(block, options, "plain");
53
- }).join("");
54
- if (!fragment.block || !effectiveBlockName) {
55
- return renderedHtml.trimEnd();
56
- }
57
- return unwrapBlockRegionMarkup(renderedHtml, effectiveBlockName).trimEnd();
58
- }