@publish.os/nextjs 0.0.1-alpha.81 → 0.0.1-alpha.91

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 (265) hide show
  1. package/compiler-assets/nextjs/defaults/app/globals.css +1 -0
  2. package/compiler-assets/nextjs/defaults/group/index.tsx +50 -0
  3. package/compiler-assets/nextjs/defaults/group/layout.tsx +8 -8
  4. package/compiler-assets/nextjs/defaults/group/page.tsx +44 -43
  5. package/compiler-assets/nextjs/defaults/project/next.config.mjs +33 -13
  6. package/compiler-assets/nextjs/defaults/project/tsconfig.json.template +10 -3
  7. package/compiler-assets/nextjs/defaults/root/css/animation.css +131 -0
  8. package/compiler-assets/nextjs/defaults/root/css/components/code-block.css +18 -0
  9. package/compiler-assets/nextjs/defaults/root/css/components/dialog.css +4 -1
  10. package/compiler-assets/nextjs/defaults/root/css/components/menu.css +1 -1
  11. package/compiler-assets/nextjs/defaults/root/css/components/navigation-menu.css +1 -1
  12. package/compiler-assets/nextjs/defaults/root/css/components/popover.css +1 -1
  13. package/compiler-assets/nextjs/defaults/root/css/components/select.css +1 -1
  14. package/compiler-assets/nextjs/defaults/root/css/components/tooltip.css +1 -1
  15. package/compiler-assets/nextjs/defaults/root/css/shadow.css +6 -25
  16. package/compiler-assets/nextjs/defaults/root/css/typography.css +51 -68
  17. package/compiler-assets/nextjs/defaults/root/globals.css +25 -0
  18. package/compiler-assets/nextjs/defaults/root/{page.tsx → index.tsx} +6 -2
  19. package/compiler-assets/nextjs/defaults/root/layout.tsx +7 -1
  20. package/compiler-assets/nextjs/defaults/root/theme.css +22 -22
  21. package/compiler-assets/nextjs/shims/document.tsx +38 -0
  22. package/compiler-assets/nextjs/shims/generated-group-page.tsx +19 -2
  23. package/compiler-assets/nextjs/shims/generated-leaf-page.tsx +18 -2
  24. package/compiler-assets/nextjs/shims/global-layout.tsx +19 -85
  25. package/compiler-assets/nextjs/shims/global-not-found.tsx +69 -0
  26. package/compiler-assets/nextjs/shims/markdown-route.ts +2 -0
  27. package/compiler-assets/nextjs/shims/metadata-icons.tsx +39 -0
  28. package/compiler-assets/nextjs/shims/not-found-content.tsx +53 -0
  29. package/compiler-assets/nextjs/shims/not-found-navigation.tsx +60 -0
  30. package/compiler-assets/nextjs/shims/proxy.ts +143 -65
  31. package/compiler-assets/nextjs/shims/publish-os-theme-provider.tsx +76 -15
  32. package/compiler-assets/nextjs/shims/root-page.tsx +7 -1
  33. package/compiler-assets/nextjs/shims/site-fenced-code-block.tsx +30 -0
  34. package/compiler-assets/nextjs/shims/site-heading-level.tsx +14 -0
  35. package/compiler-assets/nextjs/shims/site-mdx-components.tsx +112 -0
  36. package/compiler-assets/nextjs/shims/site-mdx.tsx +17 -0
  37. package/compiler-assets/nextjs/shims/theme-defaults.css +41 -25
  38. package/dist/build-operation-5QMLXF7N.js +89 -0
  39. package/dist/{button-CFdx-ohV.d.ts → button-BdCScEKi.d.ts} +6 -6
  40. package/dist/capture-local-source-WGGDIUU2.js +258 -0
  41. package/dist/chunk-22RSSUNV.js +13 -0
  42. package/dist/chunk-4BC2L2KA.js +620 -0
  43. package/dist/chunk-5J3YUNRY.js +121 -0
  44. package/dist/chunk-5KAD7W53.js +248 -0
  45. package/dist/chunk-6C65KV7O.js +142 -0
  46. package/dist/chunk-6D2E6UMD.js +695 -0
  47. package/dist/chunk-7NY22B5U.js +161 -0
  48. package/dist/chunk-AI2UULNX.js +9 -0
  49. package/dist/chunk-EFO6AWXN.js +19 -0
  50. package/dist/chunk-F3AGNDF4.js +2377 -0
  51. package/dist/chunk-GBPLER5H.js +426 -0
  52. package/dist/chunk-IL4RJOKI.js +186 -0
  53. package/dist/chunk-NNBJZPFM.js +193 -0
  54. package/dist/chunk-ORIUWJBQ.js +58 -0
  55. package/dist/chunk-OXOFRXEI.js +7129 -0
  56. package/dist/chunk-UYGCOWRF.js +1709 -0
  57. package/dist/chunk-WL75GQ5M.js +80 -0
  58. package/dist/compiler.d.ts +54 -7
  59. package/dist/compiler.js +121 -13147
  60. package/dist/components/blocks/agent-actions.d.ts +81 -0
  61. package/dist/components/blocks/agent-actions.js +594 -0
  62. package/dist/components/blocks/toc.d.ts +43 -0
  63. package/dist/components/blocks/toc.js +136 -0
  64. package/dist/components/ui/button.d.ts +5 -0
  65. package/dist/components/ui/button.js +94 -0
  66. package/dist/compose-CVBJRAF6.js +16 -0
  67. package/dist/config/createNextConfig.js +27 -0
  68. package/dist/dev-operation-OSHHWRWK.js +1095 -0
  69. package/dist/framework-selection-ZVO323PK.js +11 -0
  70. package/dist/ide-support-CU6Z5PVR.js +16 -0
  71. package/dist/index.d.ts +55 -4
  72. package/dist/jsx-dev-runtime.d.ts +6 -0
  73. package/dist/jsx-dev-runtime.js +100 -0
  74. package/dist/jsx-runtime.d.ts +7 -0
  75. package/dist/jsx-runtime.js +97 -0
  76. package/dist/kernel/components/blocks/AgentActions.d.ts +35 -6
  77. package/dist/kernel/components/blocks/AgentActions.js +401 -150
  78. package/dist/kernel/components/blocks/agent-actions.d.ts +5 -0
  79. package/dist/kernel/components/blocks/agent-actions.js +594 -0
  80. package/dist/kernel/components/blocks/animated-icon-swap.js +1 -1
  81. package/dist/kernel/components/blocks/color-palette.js +4 -4
  82. package/dist/kernel/components/blocks/logo-block.js +3 -3
  83. package/dist/kernel/components/blocks/nav-breadcrumb.d.ts +10 -2
  84. package/dist/kernel/components/blocks/nav-breadcrumb.js +22 -7
  85. package/dist/kernel/components/blocks/navbar.d.ts +2 -2
  86. package/dist/kernel/components/blocks/navbar.js +406 -65
  87. package/dist/kernel/components/blocks/navigation-progress.js +6 -3
  88. package/dist/kernel/components/blocks/next-prev.d.ts +1 -1
  89. package/dist/kernel/components/blocks/next-prev.js +12 -24
  90. package/dist/kernel/components/blocks/page-list.d.ts +1 -1
  91. package/dist/kernel/components/blocks/page-list.js +7 -6
  92. package/dist/kernel/components/blocks/search.d.ts +83 -58
  93. package/dist/kernel/components/blocks/search.js +554 -428
  94. package/dist/kernel/components/blocks/sidebar-node.d.ts +2 -2
  95. package/dist/kernel/components/blocks/sidebar-node.js +12 -10
  96. package/dist/kernel/components/blocks/sidebar.d.ts +3 -3
  97. package/dist/kernel/components/blocks/sidebar.js +24 -14
  98. package/dist/kernel/components/blocks/theme-toggle.d.ts +2 -2
  99. package/dist/kernel/components/blocks/theme-toggle.js +47 -1
  100. package/dist/kernel/components/blocks/toc-client.d.ts +40 -0
  101. package/dist/kernel/components/blocks/toc-client.js +495 -0
  102. package/dist/kernel/components/blocks/toc.d.ts +19 -1
  103. package/dist/kernel/components/blocks/toc.js +122 -180
  104. package/dist/kernel/components/mdx/components/blockquote.js +2 -2
  105. package/dist/kernel/components/mdx/components/callout.d.ts +5 -7
  106. package/dist/kernel/components/mdx/components/callout.js +67 -36
  107. package/dist/kernel/components/mdx/components/code-block.d.ts +5 -2
  108. package/dist/kernel/components/mdx/components/code-block.js +106 -5
  109. package/dist/kernel/components/mdx/components/copy-code-button.d.ts +8 -0
  110. package/dist/kernel/components/mdx/components/copy-code-button.js +61 -0
  111. package/dist/kernel/components/mdx/components/figure-caption.d.ts +1 -1
  112. package/dist/kernel/components/mdx/components/figure-caption.js +4 -3
  113. package/dist/kernel/components/mdx/components/figure.d.ts +6 -2
  114. package/dist/kernel/components/mdx/components/figure.js +24 -14
  115. package/dist/kernel/components/mdx/components/footnotes.js +1 -1
  116. package/dist/kernel/components/mdx/components/heading-copy-link.js +4 -4
  117. package/dist/kernel/components/mdx/components/heading.js +6 -3
  118. package/dist/kernel/components/mdx/components/hr.js +2 -2
  119. package/dist/kernel/components/mdx/components/image-zoom.js +2 -2
  120. package/dist/kernel/components/mdx/components/image.d.ts +1 -1
  121. package/dist/kernel/components/mdx/components/image.js +94 -68
  122. package/dist/kernel/components/mdx/components/inline-code.js +2 -2
  123. package/dist/kernel/components/mdx/components/kbd.d.ts +2 -2
  124. package/dist/kernel/components/mdx/components/kbd.js +5 -4
  125. package/dist/kernel/components/mdx/components/link.d.ts +35 -4
  126. package/dist/kernel/components/mdx/components/link.js +3 -3
  127. package/dist/kernel/components/mdx/components/paragraph.js +2 -5
  128. package/dist/kernel/components/mdx/components/strikethrough.js +1 -1
  129. package/dist/kernel/components/mdx/components/table.js +2 -2
  130. package/dist/kernel/components/mdx/components/task-list.js +2 -2
  131. package/dist/kernel/components/mdx/components/video-player.d.ts +6 -2
  132. package/dist/kernel/components/mdx/components/video-player.js +8 -4
  133. package/dist/kernel/components/mdx/components/video.d.ts +5 -3
  134. package/dist/kernel/components/mdx/components/video.js +8 -6
  135. package/dist/kernel/components/mdx/error-boundary.js +2 -2
  136. package/dist/kernel/components/mdx/error-fallback.js +1 -1
  137. package/dist/kernel/components/mdx/mdx.d.ts +28 -14
  138. package/dist/kernel/components/mdx/mdx.js +336 -63
  139. package/dist/kernel/components/mdx/rehype-heading-ids.d.ts +1 -0
  140. package/dist/kernel/components/mdx/rehype-heading-ids.js +6 -4
  141. package/dist/kernel/components/next-image.d.ts +12 -0
  142. package/dist/kernel/components/next-image.js +61 -0
  143. package/dist/kernel/components/ui/accordion.js +1 -1
  144. package/dist/kernel/components/ui/breadcrumb-trail.d.ts +6 -23
  145. package/dist/kernel/components/ui/breadcrumb-trail.js +2 -2
  146. package/dist/kernel/components/ui/breadcrumb.d.ts +11 -3
  147. package/dist/kernel/components/ui/breadcrumb.js +10 -8
  148. package/dist/kernel/components/ui/button-group.js +8 -7
  149. package/dist/kernel/components/ui/button.d.ts +58 -6
  150. package/dist/kernel/components/ui/button.js +43 -39
  151. package/dist/kernel/components/ui/card.d.ts +2 -2
  152. package/dist/kernel/components/ui/card.js +1 -1
  153. package/dist/kernel/components/ui/dialog.js +1 -1
  154. package/dist/kernel/components/ui/drawer.d.ts +3 -1
  155. package/dist/kernel/components/ui/drawer.js +6 -2
  156. package/dist/kernel/components/ui/input.d.ts +2 -2
  157. package/dist/kernel/components/ui/input.js +1 -1
  158. package/dist/kernel/components/ui/kbd.js +10 -17
  159. package/dist/kernel/components/ui/link.d.ts +11 -3
  160. package/dist/kernel/components/ui/link.js +12 -11
  161. package/dist/kernel/components/ui/menu.js +6 -6
  162. package/dist/kernel/components/ui/mod-key.d.ts +10 -0
  163. package/dist/kernel/components/ui/mod-key.js +36 -0
  164. package/dist/kernel/components/ui/navigation-menu.js +3 -3
  165. package/dist/kernel/components/ui/popover.js +1 -1
  166. package/dist/kernel/components/ui/progress.js +2 -2
  167. package/dist/kernel/components/ui/scroll-area.js +5 -5
  168. package/dist/kernel/components/ui/select.js +8 -11
  169. package/dist/kernel/components/ui/separator.js +1 -1
  170. package/dist/kernel/components/ui/table.js +1 -1
  171. package/dist/kernel/components/ui/tabs.js +1 -1
  172. package/dist/kernel/components/ui/tag.js +1 -1
  173. package/dist/kernel/components/ui/text.d.ts +2 -2
  174. package/dist/kernel/components/ui/text.js +1 -1
  175. package/dist/kernel/components/ui/toast.js +1 -1
  176. package/dist/kernel/components/ui/tooltip.js +1 -1
  177. package/dist/kernel/defaults.registry.d.ts +11 -24
  178. package/dist/kernel/defaults.registry.js +11 -26
  179. package/dist/kernel/routes/agent/markdown.d.ts +3 -1
  180. package/dist/kernel/routes/agent/markdown.js +219 -48
  181. package/dist/kernel/routes/layouts/group.d.ts +1 -1
  182. package/dist/kernel/routes/layouts/group.js +5 -7
  183. package/dist/kernel/routes/metadata/feed.d.ts +1 -1
  184. package/dist/kernel/routes/metadata/feed.js +111 -81
  185. package/dist/kernel/routes/metadata/llms.d.ts +12 -3
  186. package/dist/kernel/routes/metadata/llms.js +156 -59
  187. package/dist/kernel/routes/metadata/og-image.js +1 -1
  188. package/dist/kernel/routes/metadata/robots.d.ts +1 -1
  189. package/dist/kernel/routes/metadata/robots.js +2 -2
  190. package/dist/kernel/routes/metadata/sitemap.d.ts +26 -4
  191. package/dist/kernel/routes/metadata/sitemap.js +206 -38
  192. package/dist/kernel/routes/not-found.d.ts +34 -0
  193. package/dist/kernel/routes/not-found.js +213 -0
  194. package/dist/kernel/routes/pages/group.d.ts +2 -2
  195. package/dist/kernel/routes/pages/group.js +21 -13
  196. package/dist/kernel/routes/pages/leaf.d.ts +28 -1
  197. package/dist/kernel/routes/pages/leaf.js +25 -16
  198. package/dist/kernel/routes/pages/root.js +19 -13
  199. package/dist/keyboard-shortcuts.js +1 -1
  200. package/dist/resolvers/manifest-resolver.js +29 -6
  201. package/dist/search.d.ts +6 -7
  202. package/dist/search.js +52 -29
  203. package/dist/{sidebar-types-Bgchdfd6.d.ts → sidebar-types-DKpR27II.d.ts} +1 -1
  204. package/dist/theme-scope.js +1 -1
  205. package/dist/{types-DHBm7-j6.d.ts → types-CJWRG05y.d.ts} +20 -1
  206. package/dist/{types-B_b3C0U6.d.ts → types-CUtrppxt.d.ts} +8 -2
  207. package/dist/{types-CIwwieNw.d.ts → types-J2w_puPF.d.ts} +11 -10
  208. package/dist/types.d.ts +15 -6
  209. package/dist/utils/heading-ids.js +30 -11
  210. package/dist/utils/toc-selection.d.ts +7 -0
  211. package/dist/utils/toc-selection.js +14 -0
  212. package/dist/validate-local-source-SV44DBQT.js +16 -0
  213. package/dist/validate-publish-os-source-NZJF3TB2.js +14 -0
  214. package/init/seed/minimal/.gitignore +1 -0
  215. package/init/seed/minimal/publish.os/assets/blog/hello-world.svg +13 -0
  216. package/init/seed/minimal/publish.os/assets/favicon.dark.svg +13 -0
  217. package/init/seed/minimal/publish.os/assets/favicon.svg +13 -0
  218. package/init/seed/minimal/publish.os/blog/content/hello-world.mdx +48 -0
  219. package/init/seed/minimal/publish.os/blog/content/series-a.mdx +11 -0
  220. package/init/seed/minimal/publish.os/blog/index.tsx +82 -0
  221. package/init/seed/minimal/publish.os/blog/layout.tsx +13 -0
  222. package/init/seed/minimal/publish.os/blog/page.tsx +76 -0
  223. package/init/seed/minimal/publish.os/components/blog/copy-link.tsx +64 -0
  224. package/init/seed/minimal/publish.os/docs/content/get-started.mdx +6 -11
  225. package/init/seed/minimal/publish.os/docs/content/groups.mdx +6 -7
  226. package/init/seed/minimal/publish.os/docs/content/{theme.mdx → themes.mdx} +14 -12
  227. package/init/seed/minimal/publish.os/publish.os.config.json +7 -7
  228. package/init/seed/minimal/publish.os/theme.css +52 -24
  229. package/init/seed/minimal/publish.os/tsconfig.json +3 -0
  230. package/init/seed/minimal/seed.json +12 -2
  231. package/init/seed/scratch/publish.os/docs/content/get-started.mdx +6 -0
  232. package/init/seed/scratch/publish.os/publish.os.config.json +4 -0
  233. package/init/seed/scratch/seed.json +5 -0
  234. package/package.json +55 -44
  235. package/release/app/phosphor/package.json +5 -5
  236. package/release/app/phosphor/pnpm-lock.yaml.template +553 -377
  237. package/release/app/phosphor/pnpm-workspace.yaml +3 -0
  238. package/release/compiler/package.json +5 -3
  239. package/release/compiler/pnpm-lock.yaml.template +500 -303
  240. package/release/compiler/pnpm-workspace.yaml +3 -0
  241. package/release/release.json +8 -37
  242. package/compiler-assets/nextjs/defaults/group/leaf.tsx +0 -48
  243. package/dist/icons.d.ts +0 -1
  244. package/dist/icons.js +0 -2
  245. package/dist/kernel/components/blocks/design-system-preview.d.ts +0 -61
  246. package/dist/kernel/components/blocks/design-system-preview.js +0 -648
  247. package/dist/kernel/components/blocks/link-playground.d.ts +0 -5
  248. package/dist/kernel/components/blocks/link-playground.js +0 -744
  249. package/dist/kernel/components/blocks/navigation-progress-playground.d.ts +0 -5
  250. package/dist/kernel/components/blocks/navigation-progress-playground.js +0 -629
  251. package/dist/kernel/components/mdx/components/pre.d.ts +0 -6
  252. package/dist/kernel/components/mdx/components/pre.js +0 -18
  253. package/dist/kernel/components/ui/meta-key.d.ts +0 -17
  254. package/dist/kernel/components/ui/meta-key.js +0 -9
  255. package/dist/kernel/components/ui/theme-toggle.d.ts +0 -24
  256. package/dist/kernel/components/ui/theme-toggle.js +0 -58
  257. package/dist/kernel/framework-icons.d.ts +0 -1
  258. package/dist/kernel/framework-icons.js +0 -39
  259. package/dist/link-CYaCRDb6.d.ts +0 -35
  260. package/release/app/lucide/package.json +0 -30
  261. package/release/app/lucide/pnpm-lock.yaml.template +0 -2905
  262. package/release/app/lucide/pnpm-workspace.yaml +0 -11
  263. package/release/app/tabler/package.json +0 -30
  264. package/release/app/tabler/pnpm-lock.yaml.template +0 -2911
  265. package/release/app/tabler/pnpm-workspace.yaml +0 -11
@@ -34,12 +34,196 @@ function createCachedTextResponse(options) {
34
34
  });
35
35
  }
36
36
 
37
+ // src/route-not-found.ts
38
+ var MAX_PATH_LENGTH = 2048, UNSAFE_PATH_CHARACTERS = /[\p{Cc}\p{Cs}\u200b-\u200f\u2028-\u202f\u2060-\u206f\ufeff]/u, INTERNAL_PATHS = ["/__publishos", "/_next", "/_not-found", "/publishos"], DEFAULT_MARKDOWN = serializeNotFoundMarkdown({
39
+ recommendations: [],
40
+ indexes: []
41
+ });
42
+ function normalizePublicPath(pathname) {
43
+ let path = pathname.split(/[?#]/u, 1)[0];
44
+ if (!path?.startsWith("/") || path.startsWith("//") || path.length > MAX_PATH_LENGTH || UNSAFE_PATH_CHARACTERS.test(path))
45
+ return;
46
+ let segments = [];
47
+ for (let segment of path.split("/")) {
48
+ if (!segment) continue;
49
+ let decoded;
50
+ try {
51
+ decoded = decodeURIComponent(segment);
52
+ } catch {
53
+ return;
54
+ }
55
+ if (decoded === "." || decoded === ".." || /[/\\]/u.test(decoded) || /%[\da-f]{2}/iu.test(decoded) || UNSAFE_PATH_CHARACTERS.test(decoded))
56
+ return;
57
+ segments.push(decoded);
58
+ }
59
+ return `/${segments.join("/")}`;
60
+ }
61
+ function containsPath({ parent, path }) {
62
+ return parent === "/" || path === parent || path.startsWith(`${parent}/`);
63
+ }
64
+ function missingPagePath(pathname) {
65
+ let normalized = normalizePublicPath(pathname);
66
+ if (!normalized) return;
67
+ let path = normalized.endsWith(".md") ? normalized.slice(0, -3) || "/" : normalized;
68
+ return INTERNAL_PATHS.some((parent) => containsPath({ parent, path })) ? void 0 : path;
69
+ }
70
+ function resolveNotFoundScope({
71
+ scopes,
72
+ pathname
73
+ }) {
74
+ let path = missingPagePath(pathname);
75
+ if (!path) return;
76
+ let matched, matchedLength = -1;
77
+ for (let scope of scopes) {
78
+ let scopePath = normalizePublicPath(scope.path);
79
+ !scopePath || !containsPath({ parent: scopePath, path }) || (scopePath.length > matchedLength || scopePath.length === matchedLength && scope.group && !matched?.group) && (matched = scope, matchedLength = scopePath.length);
80
+ }
81
+ return matched;
82
+ }
83
+ function trustedHostname(origin) {
84
+ if (origin)
85
+ try {
86
+ let url = new URL(origin);
87
+ return !["http:", "https:"].includes(url.protocol) || url.username || url.password ? void 0 : url.host.replace(/`/gu, "%60");
88
+ } catch {
89
+ return;
90
+ }
91
+ }
92
+ function requestExplanation({
93
+ pathname,
94
+ origin
95
+ }) {
96
+ let path = pathname.split("/").map(encodeURIComponent).join("/"), hostname = trustedHostname(origin);
97
+ return `No page exists at \`${path}\`${hostname ? ` on ${hostname}` : ""}.`;
98
+ }
99
+ function indexKind(link) {
100
+ if (link.kind) return link.kind;
101
+ switch (link.title) {
102
+ case "Sitemap":
103
+ return "sitemap";
104
+ case "Markdown sitemap":
105
+ return "sitemap-md";
106
+ case "llms.txt":
107
+ case "LLMS index":
108
+ return "llms";
109
+ case "llms-full.txt":
110
+ return "llms-full";
111
+ default:
112
+ return;
113
+ }
114
+ }
115
+ function publicRecoveryHref(href) {
116
+ if (href.includes("\\") || UNSAFE_PATH_CHARACTERS.test(href))
117
+ return;
118
+ let relative = href.startsWith("/") && !href.startsWith("//");
119
+ try {
120
+ let url = new URL(
121
+ href,
122
+ relative ? "https://publishos.invalid" : void 0
123
+ );
124
+ return !["http:", "https:"].includes(url.protocol) || url.username || url.password ? void 0 : relative ? `${url.pathname}${url.search}${url.hash}` : url.href;
125
+ } catch {
126
+ return;
127
+ }
128
+ }
129
+ function markdownText(value) {
130
+ return value.replace(/\s+/gu, " ").replace(/[\p{Cc}\p{Cs}]/gu, "").trim().replace(/[\\`*_[\]{}<>|~]/gu, "\\$&");
131
+ }
132
+ function markdownLink(link) {
133
+ let title = markdownText(link.title), href = publicRecoveryHref(link.href)?.replace(
134
+ /[()`<>]/gu,
135
+ (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`
136
+ );
137
+ if (!title || !href) return;
138
+ let description = link.description ? markdownText(link.description) : void 0;
139
+ return `- [${title}](${href})${description ? `: ${description}` : ""}`;
140
+ }
141
+ function serializeNotFoundMarkdown({
142
+ recommendations,
143
+ indexes
144
+ }) {
145
+ let sections = [
146
+ { title: "Recommendations", links: recommendations },
147
+ { title: "For crawlers and agents", links: indexes }
148
+ ], lines = [
149
+ "# 404 \u2014 Not Found",
150
+ "",
151
+ "This page does not exist. Please check the URL and try again.",
152
+ ""
153
+ ];
154
+ for (let section of sections) {
155
+ let links = section.links.map(markdownLink).filter((link) => link !== void 0);
156
+ links.length && lines.push(`## ${section.title}`, "", ...links, "");
157
+ }
158
+ return lines.join(`
159
+ `);
160
+ }
161
+ function discoveryHeaders(scope) {
162
+ let headers = new Headers(), links = [];
163
+ for (let link of scope?.indexes ?? []) {
164
+ let kind = indexKind(link), href = /[\s<>"\\]/u.test(link.href) ? void 0 : publicRecoveryHref(link.href);
165
+ if (!(!kind || !href))
166
+ switch (kind) {
167
+ case "llms":
168
+ if (scope?.describedBy !== void 0) break;
169
+ links.push(`<${href}>; rel="describedby"; type="text/plain"`), headers.set("x-publishos-llms", href);
170
+ break;
171
+ case "llms-full":
172
+ links.push(
173
+ `<${href}>; rel="related"; type="text/plain"; title="Full content"`
174
+ );
175
+ break;
176
+ case "sitemap":
177
+ case "sitemap-md":
178
+ links.push(
179
+ `<${href}>; rel="sitemap"; type="${kind === "sitemap-md" ? "text/markdown" : "application/xml"}"`
180
+ ), headers.set("x-publishos-sitemap", href);
181
+ break;
182
+ }
183
+ }
184
+ if (scope?.describedBy !== void 0) {
185
+ let href = /[\s<>"\\]/u.test(scope.describedBy) ? void 0 : publicRecoveryHref(scope.describedBy);
186
+ href && (links.push(`<${href}>; rel="describedby"; type="text/plain"`), headers.set("x-publishos-llms", href));
187
+ }
188
+ return links.length && headers.set("link", links.join(", ")), headers;
189
+ }
190
+ function createNotFoundTextResponse({
191
+ scope,
192
+ pathname,
193
+ method,
194
+ contentType = "text/markdown; charset=utf-8",
195
+ vary = !1
196
+ }) {
197
+ let path = pathname === void 0 ? void 0 : missingPagePath(pathname), resolvedScope = scope && (pathname === void 0 || resolveNotFoundScope({ scopes: [scope], pathname })) ? scope : void 0, body = resolvedScope?.markdown ?? DEFAULT_MARKDOWN;
198
+ if (resolvedScope && path) {
199
+ let explanation = requestExplanation({
200
+ pathname: path,
201
+ origin: scope?.origin
202
+ }), headingEnd = body.indexOf(`
203
+
204
+ `);
205
+ body = headingEnd === -1 ? `${body}
206
+
207
+ ${explanation}
208
+ ` : `${body.slice(0, headingEnd)}
209
+
210
+ ${explanation}
211
+
212
+ ${body.slice(headingEnd + 2)}`;
213
+ }
214
+ let headers = discoveryHeaders(resolvedScope);
215
+ return vary && headers.set("vary", "Accept, User-Agent"), createCachedTextResponse({
216
+ body,
217
+ cachePolicy: "short",
218
+ contentType,
219
+ headers,
220
+ method,
221
+ noindex: !0,
222
+ status: 404
223
+ });
224
+ }
225
+
37
226
  // src/route-agent-markdown.ts
38
- var DEFAULT_DISCOVERY_LINKS = {
39
- home: "/",
40
- llms: "/llms.txt",
41
- sitemap: "/sitemap.md"
42
- };
43
227
  function debugMarkdownResponse(details) {
44
228
  log.debug("[agent-route]", "md-response", details);
45
229
  }
@@ -62,56 +246,28 @@ function markdownHeaders(artifact) {
62
246
  contentType: "text/markdown; charset=utf-8"
63
247
  };
64
248
  }
65
- function markdown404Body(discoveryLinks) {
66
- return [
67
- "# Not found",
68
- "",
69
- ...[
70
- discoveryLinks.home ? `> Home: ${discoveryLinks.home}` : void 0,
71
- discoveryLinks.sitemap ? `> Sitemap: ${discoveryLinks.sitemap}` : void 0,
72
- discoveryLinks.llms ? `> LLMS index: ${discoveryLinks.llms}` : void 0
73
- ].filter((line) => !!line),
74
- "",
75
- "The requested Markdown page was not found.",
76
- ""
77
- ].join(`
78
- `);
79
- }
80
- function notFoundResponse(method, discoveryLinks, artifactPath, reason) {
249
+ function notFoundResponse(method, scopes, artifactPath, reason) {
81
250
  return debugMarkdownResponse({
82
251
  artifactPath,
83
252
  method,
84
253
  reason,
85
254
  status: 404
86
- }), createCachedTextResponse({
87
- body: markdown404Body(discoveryLinks),
88
- cachePolicy: "short",
89
- contentType: "text/markdown; charset=utf-8",
90
- method,
91
- noindex: !0,
92
- status: 404
255
+ }), createNotFoundTextResponse({
256
+ scope: artifactPath ? resolveNotFoundScope({ scopes, pathname: artifactPath }) : void 0,
257
+ pathname: artifactPath,
258
+ method
93
259
  });
94
260
  }
95
- async function markdownResponse(artifacts, discoveryLinks, method, context) {
261
+ async function markdownResponse(artifacts, scopes, method, context) {
96
262
  let params = await Promise.resolve(context.params), artifactPath = normalizeArtifactPath(params?.path);
97
263
  if (!artifactPath)
98
- return notFoundResponse(method, discoveryLinks, void 0, "invalid-path");
264
+ return notFoundResponse(method, scopes, void 0, "invalid-path");
99
265
  let artifactKey = findArtifactKey(artifacts.index, artifactPath);
100
266
  if (!artifactKey)
101
- return notFoundResponse(
102
- method,
103
- discoveryLinks,
104
- artifactPath,
105
- "missing-index"
106
- );
267
+ return notFoundResponse(method, scopes, artifactPath, "missing-index");
107
268
  let artifact = await artifacts.loadArtifact(artifactKey);
108
269
  if (!artifact)
109
- return notFoundResponse(
110
- method,
111
- discoveryLinks,
112
- artifactPath,
113
- "missing-shard"
114
- );
270
+ return notFoundResponse(method, scopes, artifactPath, "missing-shard");
115
271
  let { contentType, headers } = markdownHeaders(artifact);
116
272
  return debugMarkdownResponse({
117
273
  artifactPath: artifact.markdownPath,
@@ -127,13 +283,28 @@ async function markdownResponse(artifacts, discoveryLinks, method, context) {
127
283
  });
128
284
  }
129
285
  function createMarkdownRouteHandlers(artifacts, options = {}) {
130
- let discoveryLinks = {
131
- ...DEFAULT_DISCOVERY_LINKS,
132
- ...options.discoveryLinks
133
- };
286
+ let links = options.discoveryLinks, recommendations = links?.home ? [{ title: "Go home", href: links.home }] : [], indexes = [
287
+ ...links?.sitemap ? [
288
+ {
289
+ title: "Markdown sitemap",
290
+ href: links.sitemap,
291
+ kind: "sitemap-md"
292
+ }
293
+ ] : [],
294
+ ...links?.llms ? [{ title: "llms.txt", href: links.llms, kind: "llms" }] : []
295
+ ], scopes = options.notFoundScopes ?? (links ? [
296
+ {
297
+ id: "root",
298
+ path: "/",
299
+ htmlPath: "",
300
+ recommendations,
301
+ indexes,
302
+ markdown: serializeNotFoundMarkdown({ recommendations, indexes })
303
+ }
304
+ ] : []);
134
305
  return {
135
- GET: (_request, context) => markdownResponse(artifacts, discoveryLinks, "GET", context),
136
- HEAD: (_request, context) => markdownResponse(artifacts, discoveryLinks, "HEAD", context),
306
+ GET: (_request, context) => markdownResponse(artifacts, scopes, "GET", context),
307
+ HEAD: (_request, context) => markdownResponse(artifacts, scopes, "HEAD", context),
137
308
  generateStaticParams: () => Object.keys(artifacts.index).map((artifactPath) => ({
138
309
  path: artifactPath.replace(/^\//, "").replace(/\.md$/, "").split("/")
139
310
  }))
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactElement, ReactNode } from 'react';
3
- import { M as ManifestLike, L as LayoutProps } from '../../../types-CIwwieNw.js';
3
+ import { M as ManifestLike, L as LayoutProps } from '../../../types-J2w_puPF.js';
4
4
 
5
5
  type LayoutComponent = (props: LayoutProps) => ReactElement | Promise<ReactElement>;
6
6
  type GroupLayoutConfig = {
@@ -21,8 +21,8 @@ var isDev = process.env.NODE_ENV !== "production", isDebugEnabled = process.env.
21
21
  };
22
22
 
23
23
  // src/route-layout-group.tsx
24
- import { jsx } from "react/jsx-runtime";
25
- var manifests = /* @__PURE__ */ new Map(), layoutChains = /* @__PURE__ */ new Map();
24
+ import { jsx } from "@publish.os/nextjs/jsx-runtime";
25
+ var manifests = /* @__PURE__ */ new Map();
26
26
  async function CachedGroupLayoutData({
27
27
  routeGroup,
28
28
  layoutGroup
@@ -39,12 +39,10 @@ function createGroupLayout({
39
39
  manifest,
40
40
  layouts
41
41
  }) {
42
- return manifests.set(group, manifest), layoutChains.set(group, layouts), async function({ children }) {
43
- log.debug("[render]", `${group}/layout`);
44
- let chain = layoutChains.get(group);
45
- chain?.length || notFound();
42
+ return manifests.set(group, manifest), async function({ children }) {
43
+ log.debug("[render]", `${group}/layout`), layouts.length || notFound();
46
44
  let resolvedLayouts = await Promise.all(
47
- chain.map(async (item) => ({
45
+ layouts.map(async (item) => ({
48
46
  item,
49
47
  props: await CachedGroupLayoutData({
50
48
  layoutGroup: item.group,
@@ -1,4 +1,4 @@
1
- import { P as PageStatus, M as ManifestLike } from '../../../types-CIwwieNw.js';
1
+ import { P as PageStatus, M as ManifestLike } from '../../../types-J2w_puPF.js';
2
2
 
3
3
  type FeedScope = "site" | "group" | "self";
4
4
  type FeedRouteOptions = {
@@ -3,8 +3,8 @@ import { tags } from "@publish.os/nextjs/cache/tags";
3
3
  import { cacheLife, cacheTag } from "next/cache";
4
4
 
5
5
  // src/lib/runtime/metadata/canonical-url.ts
6
- function canonicalUrl(manifest, path) {
7
- let origin = manifest.site.url?.replace(/\/+$/, "");
6
+ function canonicalUrl(manifest, path, group) {
7
+ let origin = (group && manifest.groups[group]?.origin) ?? manifest.site.origin;
8
8
  if (!origin) return path;
9
9
  try {
10
10
  return new URL(path, `${origin}/`).toString();
@@ -13,6 +13,90 @@ function canonicalUrl(manifest, path) {
13
13
  }
14
14
  }
15
15
 
16
+ // src/lib/runtime/metadata/feed-serialization.ts
17
+ function xmlEscape(value) {
18
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
19
+ }
20
+ function latestDate(pages) {
21
+ let timestamp = Math.max(
22
+ 0,
23
+ ...pages.map((page) => {
24
+ let date = page.publishedAt ?? page.updatedAt;
25
+ if (!date) return -1 / 0;
26
+ let parsed = Date.parse(date);
27
+ return Number.isNaN(parsed) ? -1 / 0 : parsed;
28
+ })
29
+ );
30
+ return new Date(timestamp).toISOString();
31
+ }
32
+ function serializeRssFeed(input) {
33
+ let description = input.description ?? input.title, items = input.pages.map((page) => {
34
+ let publishedAt = page.publishedAt, pubDate = publishedAt ? `
35
+ <pubDate>${xmlEscape(new Date(publishedAt).toUTCString())}</pubDate>` : "", itemDescription = page.description ? `
36
+ <description>${xmlEscape(page.description)}</description>` : "";
37
+ return ` <item>
38
+ <title>${xmlEscape(page.title)}</title>
39
+ <link>${xmlEscape(page.url)}</link>
40
+ <guid>${xmlEscape(page.url)}</guid>${pubDate}${itemDescription}
41
+ </item>`;
42
+ }).join(`
43
+ `);
44
+ return `<?xml version="1.0" encoding="UTF-8"?>
45
+ <rss version="2.0">
46
+ <channel>
47
+ <title>${xmlEscape(input.title)}</title>
48
+ <link>${xmlEscape(input.homeUrl)}</link>
49
+ <description>${xmlEscape(description)}</description>
50
+ ${items}
51
+ </channel>
52
+ </rss>
53
+ `;
54
+ }
55
+ function serializeAtomFeed(input) {
56
+ let entries = input.pages.map((page) => {
57
+ let date = page.publishedAt ?? page.updatedAt, updated = date ? new Date(date).toISOString() : latestDate([]), summary = page.description ? `
58
+ <summary>${xmlEscape(page.description)}</summary>` : "";
59
+ return ` <entry>
60
+ <title>${xmlEscape(page.title)}</title>
61
+ <id>${xmlEscape(page.url)}</id>
62
+ <link href="${xmlEscape(page.url)}" />
63
+ <updated>${xmlEscape(updated)}</updated>${summary}
64
+ </entry>`;
65
+ }).join(`
66
+ `);
67
+ return `<?xml version="1.0" encoding="UTF-8"?>
68
+ <feed xmlns="http://www.w3.org/2005/Atom">
69
+ <title>${xmlEscape(input.title)}</title>
70
+ <id>${xmlEscape(input.homeUrl)}</id>
71
+ <updated>${xmlEscape(latestDate(input.pages))}</updated>
72
+ ${entries}
73
+ </feed>
74
+ `;
75
+ }
76
+ function serializeJsonFeed(input) {
77
+ return `${JSON.stringify(
78
+ {
79
+ version: "https://jsonfeed.org/version/1.1",
80
+ title: input.title,
81
+ description: input.description,
82
+ home_page_url: input.homeUrl,
83
+ items: input.pages.map((page) => ({
84
+ id: page.url,
85
+ url: page.url,
86
+ title: page.title,
87
+ summary: page.description,
88
+ content_text: page.body,
89
+ date_published: page.publishedAt,
90
+ date_modified: page.updatedAt,
91
+ tags: page.tags
92
+ }))
93
+ },
94
+ null,
95
+ 2
96
+ )}
97
+ `;
98
+ }
99
+
16
100
  // src/lib/runtime/response/cached-text-response.ts
17
101
  var CACHE_CONTROL = "public, max-age=300, s-maxage=3600, stale-while-revalidate=3600, must-revalidate", CDN_CACHE_CONTROL = "public, max-age=3600, stale-while-revalidate=3600, must-revalidate", SHORT_CACHE_CONTROL = "public, max-age=60, s-maxage=600, stale-while-revalidate=300, must-revalidate", SHORT_CDN_CACHE_CONTROL = "public, max-age=300, stale-while-revalidate=3600";
18
102
  function cacheControl(policy) {
@@ -34,11 +118,8 @@ function createCachedTextResponse(options) {
34
118
  }
35
119
 
36
120
  // src/route-metadata-feed.ts
37
- function xmlEscape(value) {
38
- return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
39
- }
40
121
  function pageTimestamp(page) {
41
- let value = pageDate(page);
122
+ let value = validDate(page.publishedAt) ?? validDate(page.updatedAt);
42
123
  return value ? Date.parse(value) : -1 / 0;
43
124
  }
44
125
  function validDate(value) {
@@ -51,98 +132,47 @@ function feedPages(manifest, options) {
51
132
  let statuses = options.status ?? ["published"], pages = manifest.pages.filter((page) => statuses.includes(page.status)).filter((page) => pageInScope(page, options)).sort((a, b) => pageTimestamp(b) - pageTimestamp(a));
52
133
  return options.limit ? pages.slice(0, options.limit) : pages;
53
134
  }
135
+ function feedInput(manifest, options = {}) {
136
+ let serializedPages = feedPages(manifest, options).map((page) => ({
137
+ url: canonicalUrl(manifest, page.path, page.group),
138
+ title: page.title,
139
+ publishedAt: validDate(page.publishedAt),
140
+ updatedAt: validDate(page.updatedAt),
141
+ description: page.description,
142
+ body: page.body,
143
+ tags: page.tags
144
+ })), group = options.group, homePath = group ? manifest.groups[group]?.path ?? "/" : "/";
145
+ return {
146
+ // Public route factories use the site name; generated group feeds use the group title.
147
+ title: manifest.site.name,
148
+ description: manifest.site.description,
149
+ homeUrl: canonicalUrl(manifest, homePath, group),
150
+ pages: serializedPages
151
+ };
152
+ }
54
153
  async function rssXml(manifest, options = {}) {
55
154
  "use cache";
56
- cacheLife("page"), cacheTag(
155
+ return cacheLife("page"), cacheTag(
57
156
  tags.site(),
58
157
  tags.feed("rss", options.group ?? options.scope ?? "site"),
59
158
  tags.manifest(manifest.contentHash)
60
- );
61
- let title = manifest.site.name, description = manifest.site.description ?? title, pages = feedPages(manifest, options), homeUrl = canonicalUrl(manifest, "/"), items = pages.map((page) => {
62
- let pageUrl = canonicalUrl(manifest, page.path), publishedAt = validDate(page.publishedAt), pubDate = publishedAt ? `
63
- <pubDate>${xmlEscape(new Date(publishedAt).toUTCString())}</pubDate>` : "", description2 = page.description ? `
64
- <description>${xmlEscape(page.description)}</description>` : "";
65
- return ` <item>
66
- <title>${xmlEscape(page.title)}</title>
67
- <link>${xmlEscape(pageUrl)}</link>
68
- <guid>${xmlEscape(pageUrl)}</guid>${pubDate}${description2}
69
- </item>`;
70
- }).join(`
71
- `);
72
- return `<?xml version="1.0" encoding="UTF-8"?>
73
- <rss version="2.0">
74
- <channel>
75
- <title>${xmlEscape(title)}</title>
76
- <link>${xmlEscape(homeUrl)}</link>
77
- <description>${xmlEscape(description)}</description>
78
- ${items}
79
- </channel>
80
- </rss>
81
- `;
82
- }
83
- function pageDate(page) {
84
- return validDate(page.publishedAt) ?? validDate(page.updatedAt);
85
- }
86
- function latestFeedDate(pages) {
87
- let timestamp = Math.max(0, ...pages.map((page) => pageTimestamp(page)));
88
- return new Date(timestamp).toISOString();
159
+ ), serializeRssFeed(feedInput(manifest, options));
89
160
  }
90
161
  async function atomXml(manifest, options = {}) {
91
162
  "use cache";
92
- cacheLife("page"), cacheTag(
163
+ return cacheLife("page"), cacheTag(
93
164
  tags.site(),
94
165
  tags.feed("atom", options.group ?? options.scope ?? "site"),
95
166
  tags.manifest(manifest.contentHash)
96
- );
97
- let title = manifest.site.name, pages = feedPages(manifest, options), homeUrl = canonicalUrl(manifest, "/"), entries = pages.map((page) => {
98
- let date = pageDate(page), updated = date ? new Date(date).toISOString() : latestFeedDate([]), pageUrl = canonicalUrl(manifest, page.path), summary = page.description ? `
99
- <summary>${xmlEscape(page.description)}</summary>` : "";
100
- return ` <entry>
101
- <title>${xmlEscape(page.title)}</title>
102
- <id>${xmlEscape(pageUrl)}</id>
103
- <link href="${xmlEscape(pageUrl)}" />
104
- <updated>${xmlEscape(updated)}</updated>${summary}
105
- </entry>`;
106
- }).join(`
107
- `);
108
- return `<?xml version="1.0" encoding="UTF-8"?>
109
- <feed xmlns="http://www.w3.org/2005/Atom">
110
- <title>${xmlEscape(title)}</title>
111
- <id>${xmlEscape(homeUrl)}</id>
112
- <updated>${xmlEscape(latestFeedDate(pages))}</updated>
113
- ${entries}
114
- </feed>
115
- `;
167
+ ), serializeAtomFeed(feedInput(manifest, options));
116
168
  }
117
169
  async function jsonFeed(manifest, options = {}) {
118
170
  "use cache";
119
- cacheLife("page"), cacheTag(
171
+ return cacheLife("page"), cacheTag(
120
172
  tags.site(),
121
173
  tags.feed("json", options.group ?? options.scope ?? "site"),
122
174
  tags.manifest(manifest.contentHash)
123
- );
124
- let pages = feedPages(manifest, options);
125
- return `${JSON.stringify(
126
- {
127
- version: "https://jsonfeed.org/version/1.1",
128
- title: manifest.site.name,
129
- description: manifest.site.description,
130
- home_page_url: canonicalUrl(manifest, "/"),
131
- items: pages.map((page) => ({
132
- id: canonicalUrl(manifest, page.path),
133
- url: canonicalUrl(manifest, page.path),
134
- title: page.title,
135
- summary: page.description,
136
- content_text: page.body,
137
- date_published: validDate(page.publishedAt),
138
- date_modified: validDate(page.updatedAt),
139
- tags: page.tags
140
- }))
141
- },
142
- null,
143
- 2
144
- )}
145
- `;
175
+ ), serializeJsonFeed(feedInput(manifest, options));
146
176
  }
147
177
  function createRssFeedRoute(manifest, options = {}) {
148
178
  return async function() {
@@ -1,5 +1,6 @@
1
- import { MarkdownRouteArtifacts } from '../agent/markdown.js';
2
- import { M as ManifestLike } from '../../../types-CIwwieNw.js';
1
+ import { MarkdownRouteArtifacts, MarkdownRouteArtifactManifest } from '../agent/markdown.js';
2
+ import { M as ManifestLike } from '../../../types-J2w_puPF.js';
3
+ import '../not-found.js';
3
4
 
4
5
  type LlmsRouteOptions = {
5
6
  scope?: "site" | "group" | "self";
@@ -9,15 +10,23 @@ type LlmsRouteOptions = {
9
10
  links?: Array<{
10
11
  title: string;
11
12
  path: string;
13
+ group?: string;
14
+ }>;
15
+ otherGroupLinks?: Array<{
16
+ title: string;
17
+ path: string;
18
+ group?: string;
12
19
  }>;
13
20
  };
14
21
  type LlmsFullRouteOptions = {
15
22
  maxBytes?: number;
23
+ indexPath?: string | false;
24
+ sitemapPath?: string | false;
16
25
  };
17
26
  type PrecomputedLlmsTxtOutput = {
18
27
  body: string;
19
28
  };
20
- declare function createLlmsTxtRoute(manifest: ManifestLike, options?: LlmsRouteOptions): () => Promise<Response>;
29
+ declare function createLlmsTxtRoute(manifest: ManifestLike, options?: LlmsRouteOptions, artifactManifest?: MarkdownRouteArtifactManifest): () => Promise<Response>;
21
30
  declare function createPrecomputedLlmsTxtRoute(output: PrecomputedLlmsTxtOutput): () => Response;
22
31
  declare function llmsFullTxtResponse(manifest: ManifestLike, artifacts: MarkdownRouteArtifacts, options?: LlmsFullRouteOptions): Promise<Response>;
23
32
  declare function createLlmsFullTxtRoute(manifest: ManifestLike, artifacts: MarkdownRouteArtifacts, options?: LlmsFullRouteOptions): () => Promise<Response>;