@krantho/api 0.0.0-stage → 1.0.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 (675) hide show
  1. package/LICENSE +21 -0
  2. package/dist/active-locales.d.ts +11 -0
  3. package/dist/active-locales.d.ts.map +1 -0
  4. package/dist/active-locales.js +31 -0
  5. package/dist/active-locales.js.map +1 -0
  6. package/dist/assistant/access.d.ts +25 -0
  7. package/dist/assistant/access.d.ts.map +1 -0
  8. package/dist/assistant/access.js +35 -0
  9. package/dist/assistant/access.js.map +1 -0
  10. package/dist/assistant/agent-loop.d.ts +31 -0
  11. package/dist/assistant/agent-loop.d.ts.map +1 -0
  12. package/dist/assistant/agent-loop.js +183 -0
  13. package/dist/assistant/agent-loop.js.map +1 -0
  14. package/dist/assistant/call-handler.d.ts +15 -0
  15. package/dist/assistant/call-handler.d.ts.map +1 -0
  16. package/dist/assistant/call-handler.js +24 -0
  17. package/dist/assistant/call-handler.js.map +1 -0
  18. package/dist/assistant/chat-handler.d.ts +8 -0
  19. package/dist/assistant/chat-handler.d.ts.map +1 -0
  20. package/dist/assistant/chat-handler.js +79 -0
  21. package/dist/assistant/chat-handler.js.map +1 -0
  22. package/dist/assistant/chat-request.d.ts +16 -0
  23. package/dist/assistant/chat-request.d.ts.map +1 -0
  24. package/dist/assistant/chat-request.js +59 -0
  25. package/dist/assistant/chat-request.js.map +1 -0
  26. package/dist/assistant/confirm-handler.d.ts +3 -0
  27. package/dist/assistant/confirm-handler.d.ts.map +1 -0
  28. package/dist/assistant/confirm-handler.js +39 -0
  29. package/dist/assistant/confirm-handler.js.map +1 -0
  30. package/dist/assistant/document-change.d.ts +22 -0
  31. package/dist/assistant/document-change.d.ts.map +1 -0
  32. package/dist/assistant/document-change.js +74 -0
  33. package/dist/assistant/document-change.js.map +1 -0
  34. package/dist/assistant/document-lock.d.ts +12 -0
  35. package/dist/assistant/document-lock.d.ts.map +1 -0
  36. package/dist/assistant/document-lock.js +14 -0
  37. package/dist/assistant/document-lock.js.map +1 -0
  38. package/dist/assistant/execute-action.d.ts +19 -0
  39. package/dist/assistant/execute-action.d.ts.map +1 -0
  40. package/dist/assistant/execute-action.js +167 -0
  41. package/dist/assistant/execute-action.js.map +1 -0
  42. package/dist/assistant/pending-action.d.ts +86 -0
  43. package/dist/assistant/pending-action.d.ts.map +1 -0
  44. package/dist/assistant/pending-action.js +104 -0
  45. package/dist/assistant/pending-action.js.map +1 -0
  46. package/dist/assistant/protocol.d.ts +120 -0
  47. package/dist/assistant/protocol.d.ts.map +1 -0
  48. package/dist/assistant/protocol.js +2 -0
  49. package/dist/assistant/protocol.js.map +1 -0
  50. package/dist/assistant/routes.d.ts +4 -0
  51. package/dist/assistant/routes.d.ts.map +1 -0
  52. package/dist/assistant/routes.js +10 -0
  53. package/dist/assistant/routes.js.map +1 -0
  54. package/dist/assistant/sse-stream.d.ts +15 -0
  55. package/dist/assistant/sse-stream.d.ts.map +1 -0
  56. package/dist/assistant/sse-stream.js +61 -0
  57. package/dist/assistant/sse-stream.js.map +1 -0
  58. package/dist/assistant/status-handler.d.ts +8 -0
  59. package/dist/assistant/status-handler.d.ts.map +1 -0
  60. package/dist/assistant/status-handler.js +39 -0
  61. package/dist/assistant/status-handler.js.map +1 -0
  62. package/dist/assistant/system-prompt.d.ts +18 -0
  63. package/dist/assistant/system-prompt.d.ts.map +1 -0
  64. package/dist/assistant/system-prompt.js +48 -0
  65. package/dist/assistant/system-prompt.js.map +1 -0
  66. package/dist/assistant/tool-registry.d.ts +19 -0
  67. package/dist/assistant/tool-registry.d.ts.map +1 -0
  68. package/dist/assistant/tool-registry.js +69 -0
  69. package/dist/assistant/tool-registry.js.map +1 -0
  70. package/dist/assistant/tools/action-tools.d.ts +4 -0
  71. package/dist/assistant/tools/action-tools.d.ts.map +1 -0
  72. package/dist/assistant/tools/action-tools.js +132 -0
  73. package/dist/assistant/tools/action-tools.js.map +1 -0
  74. package/dist/assistant/tools/aeo-tools.d.ts +4 -0
  75. package/dist/assistant/tools/aeo-tools.d.ts.map +1 -0
  76. package/dist/assistant/tools/aeo-tools.js +162 -0
  77. package/dist/assistant/tools/aeo-tools.js.map +1 -0
  78. package/dist/assistant/tools/define-tool.d.ts +55 -0
  79. package/dist/assistant/tools/define-tool.d.ts.map +1 -0
  80. package/dist/assistant/tools/define-tool.js +5 -0
  81. package/dist/assistant/tools/define-tool.js.map +1 -0
  82. package/dist/assistant/tools/draft-tools.d.ts +7 -0
  83. package/dist/assistant/tools/draft-tools.d.ts.map +1 -0
  84. package/dist/assistant/tools/draft-tools.js +105 -0
  85. package/dist/assistant/tools/draft-tools.js.map +1 -0
  86. package/dist/assistant/tools/draft-write.d.ts +49 -0
  87. package/dist/assistant/tools/draft-write.d.ts.map +1 -0
  88. package/dist/assistant/tools/draft-write.js +122 -0
  89. package/dist/assistant/tools/draft-write.js.map +1 -0
  90. package/dist/assistant/tools/faq-fit.d.ts +32 -0
  91. package/dist/assistant/tools/faq-fit.d.ts.map +1 -0
  92. package/dist/assistant/tools/faq-fit.js +96 -0
  93. package/dist/assistant/tools/faq-fit.js.map +1 -0
  94. package/dist/assistant/tools/read-tools.d.ts +13 -0
  95. package/dist/assistant/tools/read-tools.d.ts.map +1 -0
  96. package/dist/assistant/tools/read-tools.js +242 -0
  97. package/dist/assistant/tools/read-tools.js.map +1 -0
  98. package/dist/assistant/tools/seo-tools.d.ts +4 -0
  99. package/dist/assistant/tools/seo-tools.d.ts.map +1 -0
  100. package/dist/assistant/tools/seo-tools.js +152 -0
  101. package/dist/assistant/tools/seo-tools.js.map +1 -0
  102. package/dist/assistant/tools/support.d.ts +35 -0
  103. package/dist/assistant/tools/support.d.ts.map +1 -0
  104. package/dist/assistant/tools/support.js +63 -0
  105. package/dist/assistant/tools/support.js.map +1 -0
  106. package/dist/assistant/untrusted.d.ts +15 -0
  107. package/dist/assistant/untrusted.d.ts.map +1 -0
  108. package/dist/assistant/untrusted.js +27 -0
  109. package/dist/assistant/untrusted.js.map +1 -0
  110. package/dist/assistant/write-policy.d.ts +20 -0
  111. package/dist/assistant/write-policy.d.ts.map +1 -0
  112. package/dist/assistant/write-policy.js +32 -0
  113. package/dist/assistant/write-policy.js.map +1 -0
  114. package/dist/auth-tokens.d.ts +31 -0
  115. package/dist/auth-tokens.d.ts.map +1 -0
  116. package/dist/auth-tokens.js +35 -0
  117. package/dist/auth-tokens.js.map +1 -0
  118. package/dist/content-change.d.ts +16 -0
  119. package/dist/content-change.d.ts.map +1 -0
  120. package/dist/content-change.js +34 -0
  121. package/dist/content-change.js.map +1 -0
  122. package/dist/content-locks.d.ts +27 -0
  123. package/dist/content-locks.d.ts.map +1 -0
  124. package/dist/content-locks.js +40 -0
  125. package/dist/content-locks.js.map +1 -0
  126. package/dist/cookies.d.ts +19 -0
  127. package/dist/cookies.d.ts.map +1 -0
  128. package/dist/cookies.js +52 -0
  129. package/dist/cookies.js.map +1 -0
  130. package/dist/create-api-handlers.d.ts +128 -0
  131. package/dist/create-api-handlers.d.ts.map +1 -0
  132. package/dist/create-api-handlers.js +384 -0
  133. package/dist/create-api-handlers.js.map +1 -0
  134. package/dist/document-actions.d.ts +25 -0
  135. package/dist/document-actions.d.ts.map +1 -0
  136. package/dist/document-actions.js +157 -0
  137. package/dist/document-actions.js.map +1 -0
  138. package/dist/document-seo.d.ts +15 -0
  139. package/dist/document-seo.d.ts.map +1 -0
  140. package/dist/document-seo.js +41 -0
  141. package/dist/document-seo.js.map +1 -0
  142. package/dist/group-by-collection.d.ts +6 -0
  143. package/dist/group-by-collection.d.ts.map +1 -0
  144. package/dist/group-by-collection.js +11 -0
  145. package/dist/group-by-collection.js.map +1 -0
  146. package/dist/handlers/apply-metadata-defaults.d.ts +4 -0
  147. package/dist/handlers/apply-metadata-defaults.d.ts.map +1 -0
  148. package/dist/handlers/apply-metadata-defaults.js +108 -0
  149. package/dist/handlers/apply-metadata-defaults.js.map +1 -0
  150. package/dist/handlers/auth-callback.d.ts +4 -0
  151. package/dist/handlers/auth-callback.d.ts.map +1 -0
  152. package/dist/handlers/auth-callback.js +217 -0
  153. package/dist/handlers/auth-callback.js.map +1 -0
  154. package/dist/handlers/auth-capabilities.d.ts +4 -0
  155. package/dist/handlers/auth-capabilities.d.ts.map +1 -0
  156. package/dist/handlers/auth-capabilities.js +19 -0
  157. package/dist/handlers/auth-capabilities.js.map +1 -0
  158. package/dist/handlers/auth-login.d.ts +4 -0
  159. package/dist/handlers/auth-login.d.ts.map +1 -0
  160. package/dist/handlers/auth-login.js +60 -0
  161. package/dist/handlers/auth-login.js.map +1 -0
  162. package/dist/handlers/auth-logout.d.ts +4 -0
  163. package/dist/handlers/auth-logout.d.ts.map +1 -0
  164. package/dist/handlers/auth-logout.js +40 -0
  165. package/dist/handlers/auth-logout.js.map +1 -0
  166. package/dist/handlers/auth-me.d.ts +4 -0
  167. package/dist/handlers/auth-me.d.ts.map +1 -0
  168. package/dist/handlers/auth-me.js +54 -0
  169. package/dist/handlers/auth-me.js.map +1 -0
  170. package/dist/handlers/auth-oidc-login.d.ts +4 -0
  171. package/dist/handlers/auth-oidc-login.d.ts.map +1 -0
  172. package/dist/handlers/auth-oidc-login.js +51 -0
  173. package/dist/handlers/auth-oidc-login.js.map +1 -0
  174. package/dist/handlers/auth-refresh.d.ts +15 -0
  175. package/dist/handlers/auth-refresh.d.ts.map +1 -0
  176. package/dist/handlers/auth-refresh.js +82 -0
  177. package/dist/handlers/auth-refresh.js.map +1 -0
  178. package/dist/handlers/bulk-delete.d.ts +8 -0
  179. package/dist/handlers/bulk-delete.d.ts.map +1 -0
  180. package/dist/handlers/bulk-delete.js +72 -0
  181. package/dist/handlers/bulk-delete.js.map +1 -0
  182. package/dist/handlers/bulk-publish.d.ts +8 -0
  183. package/dist/handlers/bulk-publish.d.ts.map +1 -0
  184. package/dist/handlers/bulk-publish.js +48 -0
  185. package/dist/handlers/bulk-publish.js.map +1 -0
  186. package/dist/handlers/capabilities.d.ts +4 -0
  187. package/dist/handlers/capabilities.d.ts.map +1 -0
  188. package/dist/handlers/capabilities.js +44 -0
  189. package/dist/handlers/capabilities.js.map +1 -0
  190. package/dist/handlers/content-changes.d.ts +28 -0
  191. package/dist/handlers/content-changes.d.ts.map +1 -0
  192. package/dist/handlers/content-changes.js +160 -0
  193. package/dist/handlers/content-changes.js.map +1 -0
  194. package/dist/handlers/content-lock.d.ts +13 -0
  195. package/dist/handlers/content-lock.d.ts.map +1 -0
  196. package/dist/handlers/content-lock.js +109 -0
  197. package/dist/handlers/content-lock.js.map +1 -0
  198. package/dist/handlers/content-tree.d.ts +11 -0
  199. package/dist/handlers/content-tree.d.ts.map +1 -0
  200. package/dist/handlers/content-tree.js +28 -0
  201. package/dist/handlers/content-tree.js.map +1 -0
  202. package/dist/handlers/create-content.d.ts +4 -0
  203. package/dist/handlers/create-content.d.ts.map +1 -0
  204. package/dist/handlers/create-content.js +49 -0
  205. package/dist/handlers/create-content.js.map +1 -0
  206. package/dist/handlers/delete-content.d.ts +4 -0
  207. package/dist/handlers/delete-content.d.ts.map +1 -0
  208. package/dist/handlers/delete-content.js +17 -0
  209. package/dist/handlers/delete-content.js.map +1 -0
  210. package/dist/handlers/delete-runtime-field.d.ts +4 -0
  211. package/dist/handlers/delete-runtime-field.d.ts.map +1 -0
  212. package/dist/handlers/delete-runtime-field.js +43 -0
  213. package/dist/handlers/delete-runtime-field.js.map +1 -0
  214. package/dist/handlers/export-bundle.d.ts +13 -0
  215. package/dist/handlers/export-bundle.d.ts.map +1 -0
  216. package/dist/handlers/export-bundle.js +99 -0
  217. package/dist/handlers/export-bundle.js.map +1 -0
  218. package/dist/handlers/export-content.d.ts +7 -0
  219. package/dist/handlers/export-content.d.ts.map +1 -0
  220. package/dist/handlers/export-content.js +69 -0
  221. package/dist/handlers/export-content.js.map +1 -0
  222. package/dist/handlers/export-schema.d.ts +4 -0
  223. package/dist/handlers/export-schema.d.ts.map +1 -0
  224. package/dist/handlers/export-schema.js +13 -0
  225. package/dist/handlers/export-schema.js.map +1 -0
  226. package/dist/handlers/get-content.d.ts +4 -0
  227. package/dist/handlers/get-content.d.ts.map +1 -0
  228. package/dist/handlers/get-content.js +65 -0
  229. package/dist/handlers/get-content.js.map +1 -0
  230. package/dist/handlers/get-runtime-schema.d.ts +4 -0
  231. package/dist/handlers/get-runtime-schema.d.ts.map +1 -0
  232. package/dist/handlers/get-runtime-schema.js +17 -0
  233. package/dist/handlers/get-runtime-schema.js.map +1 -0
  234. package/dist/handlers/get-schema.d.ts +4 -0
  235. package/dist/handlers/get-schema.d.ts.map +1 -0
  236. package/dist/handlers/get-schema.js +87 -0
  237. package/dist/handlers/get-schema.js.map +1 -0
  238. package/dist/handlers/get-version.d.ts +4 -0
  239. package/dist/handlers/get-version.d.ts.map +1 -0
  240. package/dist/handlers/get-version.js +26 -0
  241. package/dist/handlers/get-version.js.map +1 -0
  242. package/dist/handlers/import-bundle.d.ts +4 -0
  243. package/dist/handlers/import-bundle.d.ts.map +1 -0
  244. package/dist/handlers/import-bundle.js +55 -0
  245. package/dist/handlers/import-bundle.js.map +1 -0
  246. package/dist/handlers/import-content.d.ts +4 -0
  247. package/dist/handlers/import-content.d.ts.map +1 -0
  248. package/dist/handlers/import-content.js +152 -0
  249. package/dist/handlers/import-content.js.map +1 -0
  250. package/dist/handlers/index.d.ts +87 -0
  251. package/dist/handlers/index.d.ts.map +1 -0
  252. package/dist/handlers/index.js +87 -0
  253. package/dist/handlers/index.js.map +1 -0
  254. package/dist/handlers/list-collection.d.ts +8 -0
  255. package/dist/handlers/list-collection.d.ts.map +1 -0
  256. package/dist/handlers/list-collection.js +14 -0
  257. package/dist/handlers/list-collection.js.map +1 -0
  258. package/dist/handlers/list-collections.d.ts +4 -0
  259. package/dist/handlers/list-collections.d.ts.map +1 -0
  260. package/dist/handlers/list-collections.js +17 -0
  261. package/dist/handlers/list-collections.js.map +1 -0
  262. package/dist/handlers/list-content.d.ts +8 -0
  263. package/dist/handlers/list-content.d.ts.map +1 -0
  264. package/dist/handlers/list-content.js +22 -0
  265. package/dist/handlers/list-content.js.map +1 -0
  266. package/dist/handlers/list-query.d.ts +7 -0
  267. package/dist/handlers/list-query.d.ts.map +1 -0
  268. package/dist/handlers/list-query.js +36 -0
  269. package/dist/handlers/list-query.js.map +1 -0
  270. package/dist/handlers/list-versions.d.ts +4 -0
  271. package/dist/handlers/list-versions.d.ts.map +1 -0
  272. package/dist/handlers/list-versions.js +19 -0
  273. package/dist/handlers/list-versions.js.map +1 -0
  274. package/dist/handlers/llm-credential.d.ts +46 -0
  275. package/dist/handlers/llm-credential.d.ts.map +1 -0
  276. package/dist/handlers/llm-credential.js +68 -0
  277. package/dist/handlers/llm-credential.js.map +1 -0
  278. package/dist/handlers/llm-resolve.d.ts +45 -0
  279. package/dist/handlers/llm-resolve.d.ts.map +1 -0
  280. package/dist/handlers/llm-resolve.js +126 -0
  281. package/dist/handlers/llm-resolve.js.map +1 -0
  282. package/dist/handlers/llm-settings.d.ts +19 -0
  283. package/dist/handlers/llm-settings.d.ts.map +1 -0
  284. package/dist/handlers/llm-settings.js +209 -0
  285. package/dist/handlers/llm-settings.js.map +1 -0
  286. package/dist/handlers/media-bulk-delete.d.ts +4 -0
  287. package/dist/handlers/media-bulk-delete.d.ts.map +1 -0
  288. package/dist/handlers/media-bulk-delete.js +19 -0
  289. package/dist/handlers/media-bulk-delete.js.map +1 -0
  290. package/dist/handlers/media-bulk-update.d.ts +4 -0
  291. package/dist/handlers/media-bulk-update.d.ts.map +1 -0
  292. package/dist/handlers/media-bulk-update.js +25 -0
  293. package/dist/handlers/media-bulk-update.js.map +1 -0
  294. package/dist/handlers/media-delete.d.ts +4 -0
  295. package/dist/handlers/media-delete.d.ts.map +1 -0
  296. package/dist/handlers/media-delete.js +27 -0
  297. package/dist/handlers/media-delete.js.map +1 -0
  298. package/dist/handlers/media-duplicate.d.ts +4 -0
  299. package/dist/handlers/media-duplicate.d.ts.map +1 -0
  300. package/dist/handlers/media-duplicate.js +20 -0
  301. package/dist/handlers/media-duplicate.js.map +1 -0
  302. package/dist/handlers/media-folders.d.ts +12 -0
  303. package/dist/handlers/media-folders.d.ts.map +1 -0
  304. package/dist/handlers/media-folders.js +119 -0
  305. package/dist/handlers/media-folders.js.map +1 -0
  306. package/dist/handlers/media-get.d.ts +4 -0
  307. package/dist/handlers/media-get.d.ts.map +1 -0
  308. package/dist/handlers/media-get.js +16 -0
  309. package/dist/handlers/media-get.js.map +1 -0
  310. package/dist/handlers/media-image-info.d.ts +4 -0
  311. package/dist/handlers/media-image-info.d.ts.map +1 -0
  312. package/dist/handlers/media-image-info.js +32 -0
  313. package/dist/handlers/media-image-info.js.map +1 -0
  314. package/dist/handlers/media-image.d.ts +11 -0
  315. package/dist/handlers/media-image.d.ts.map +1 -0
  316. package/dist/handlers/media-image.js +116 -0
  317. package/dist/handlers/media-image.js.map +1 -0
  318. package/dist/handlers/media-info.d.ts +4 -0
  319. package/dist/handlers/media-info.d.ts.map +1 -0
  320. package/dist/handlers/media-info.js +18 -0
  321. package/dist/handlers/media-info.js.map +1 -0
  322. package/dist/handlers/media-list.d.ts +4 -0
  323. package/dist/handlers/media-list.d.ts.map +1 -0
  324. package/dist/handlers/media-list.js +14 -0
  325. package/dist/handlers/media-list.js.map +1 -0
  326. package/dist/handlers/media-register.d.ts +4 -0
  327. package/dist/handlers/media-register.d.ts.map +1 -0
  328. package/dist/handlers/media-register.js +57 -0
  329. package/dist/handlers/media-register.js.map +1 -0
  330. package/dist/handlers/media-replace.d.ts +9 -0
  331. package/dist/handlers/media-replace.d.ts.map +1 -0
  332. package/dist/handlers/media-replace.js +53 -0
  333. package/dist/handlers/media-replace.js.map +1 -0
  334. package/dist/handlers/media-tags.d.ts +4 -0
  335. package/dist/handlers/media-tags.d.ts.map +1 -0
  336. package/dist/handlers/media-tags.js +9 -0
  337. package/dist/handlers/media-tags.js.map +1 -0
  338. package/dist/handlers/media-update.d.ts +4 -0
  339. package/dist/handlers/media-update.d.ts.map +1 -0
  340. package/dist/handlers/media-update.js +64 -0
  341. package/dist/handlers/media-update.js.map +1 -0
  342. package/dist/handlers/media-upload.d.ts +4 -0
  343. package/dist/handlers/media-upload.d.ts.map +1 -0
  344. package/dist/handlers/media-upload.js +26 -0
  345. package/dist/handlers/media-upload.js.map +1 -0
  346. package/dist/handlers/media-usage.d.ts +9 -0
  347. package/dist/handlers/media-usage.d.ts.map +1 -0
  348. package/dist/handlers/media-usage.js +36 -0
  349. package/dist/handlers/media-usage.js.map +1 -0
  350. package/dist/handlers/migration-conflicts.d.ts +13 -0
  351. package/dist/handlers/migration-conflicts.d.ts.map +1 -0
  352. package/dist/handlers/migration-conflicts.js +55 -0
  353. package/dist/handlers/migration-conflicts.js.map +1 -0
  354. package/dist/handlers/migration-status.d.ts +4 -0
  355. package/dist/handlers/migration-status.d.ts.map +1 -0
  356. package/dist/handlers/migration-status.js +34 -0
  357. package/dist/handlers/migration-status.js.map +1 -0
  358. package/dist/handlers/publish-content.d.ts +9 -0
  359. package/dist/handlers/publish-content.d.ts.map +1 -0
  360. package/dist/handlers/publish-content.js +47 -0
  361. package/dist/handlers/publish-content.js.map +1 -0
  362. package/dist/handlers/publish-impact.d.ts +11 -0
  363. package/dist/handlers/publish-impact.d.ts.map +1 -0
  364. package/dist/handlers/publish-impact.js +44 -0
  365. package/dist/handlers/publish-impact.js.map +1 -0
  366. package/dist/handlers/resolve-page.d.ts +9 -0
  367. package/dist/handlers/resolve-page.d.ts.map +1 -0
  368. package/dist/handlers/resolve-page.js +105 -0
  369. package/dist/handlers/resolve-page.js.map +1 -0
  370. package/dist/handlers/restore-version.d.ts +4 -0
  371. package/dist/handlers/restore-version.d.ts.map +1 -0
  372. package/dist/handlers/restore-version.js +69 -0
  373. package/dist/handlers/restore-version.js.map +1 -0
  374. package/dist/handlers/runtime-metadata.d.ts +6 -0
  375. package/dist/handlers/runtime-metadata.d.ts.map +1 -0
  376. package/dist/handlers/runtime-metadata.js +82 -0
  377. package/dist/handlers/runtime-metadata.js.map +1 -0
  378. package/dist/handlers/save-runtime-field.d.ts +4 -0
  379. package/dist/handlers/save-runtime-field.d.ts.map +1 -0
  380. package/dist/handlers/save-runtime-field.js +108 -0
  381. package/dist/handlers/save-runtime-field.js.map +1 -0
  382. package/dist/handlers/search-content.d.ts +9 -0
  383. package/dist/handlers/search-content.d.ts.map +1 -0
  384. package/dist/handlers/search-content.js +40 -0
  385. package/dist/handlers/search-content.js.map +1 -0
  386. package/dist/handlers/seo-config.d.ts +16 -0
  387. package/dist/handlers/seo-config.d.ts.map +1 -0
  388. package/dist/handlers/seo-config.js +250 -0
  389. package/dist/handlers/seo-config.js.map +1 -0
  390. package/dist/handlers/seo-document.d.ts +24 -0
  391. package/dist/handlers/seo-document.d.ts.map +1 -0
  392. package/dist/handlers/seo-document.js +119 -0
  393. package/dist/handlers/seo-document.js.map +1 -0
  394. package/dist/handlers/seo-enrich-archetype.d.ts +71 -0
  395. package/dist/handlers/seo-enrich-archetype.d.ts.map +1 -0
  396. package/dist/handlers/seo-enrich-archetype.js +250 -0
  397. package/dist/handlers/seo-enrich-archetype.js.map +1 -0
  398. package/dist/handlers/seo-enrich-meta.d.ts +40 -0
  399. package/dist/handlers/seo-enrich-meta.d.ts.map +1 -0
  400. package/dist/handlers/seo-enrich-meta.js +121 -0
  401. package/dist/handlers/seo-enrich-meta.js.map +1 -0
  402. package/dist/handlers/seo-enrich-runner.d.ts +65 -0
  403. package/dist/handlers/seo-enrich-runner.d.ts.map +1 -0
  404. package/dist/handlers/seo-enrich-runner.js +192 -0
  405. package/dist/handlers/seo-enrich-runner.js.map +1 -0
  406. package/dist/handlers/seo-enrich.d.ts +10 -0
  407. package/dist/handlers/seo-enrich.d.ts.map +1 -0
  408. package/dist/handlers/seo-enrich.js +166 -0
  409. package/dist/handlers/seo-enrich.js.map +1 -0
  410. package/dist/handlers/seo-generate.d.ts +4 -0
  411. package/dist/handlers/seo-generate.d.ts.map +1 -0
  412. package/dist/handlers/seo-generate.js +31 -0
  413. package/dist/handlers/seo-generate.js.map +1 -0
  414. package/dist/handlers/seo-impact.d.ts +36 -0
  415. package/dist/handlers/seo-impact.d.ts.map +1 -0
  416. package/dist/handlers/seo-impact.js +137 -0
  417. package/dist/handlers/seo-impact.js.map +1 -0
  418. package/dist/handlers/seo-indexnow.d.ts +11 -0
  419. package/dist/handlers/seo-indexnow.d.ts.map +1 -0
  420. package/dist/handlers/seo-indexnow.js +15 -0
  421. package/dist/handlers/seo-indexnow.js.map +1 -0
  422. package/dist/handlers/seo-llms-txt.d.ts +26 -0
  423. package/dist/handlers/seo-llms-txt.d.ts.map +1 -0
  424. package/dist/handlers/seo-llms-txt.js +99 -0
  425. package/dist/handlers/seo-llms-txt.js.map +1 -0
  426. package/dist/handlers/seo-preview.d.ts +8 -0
  427. package/dist/handlers/seo-preview.d.ts.map +1 -0
  428. package/dist/handlers/seo-preview.js +49 -0
  429. package/dist/handlers/seo-preview.js.map +1 -0
  430. package/dist/handlers/seo-robots.d.ts +22 -0
  431. package/dist/handlers/seo-robots.d.ts.map +1 -0
  432. package/dist/handlers/seo-robots.js +48 -0
  433. package/dist/handlers/seo-robots.js.map +1 -0
  434. package/dist/handlers/seo-sitemap.d.ts +68 -0
  435. package/dist/handlers/seo-sitemap.d.ts.map +1 -0
  436. package/dist/handlers/seo-sitemap.js +178 -0
  437. package/dist/handlers/seo-sitemap.js.map +1 -0
  438. package/dist/handlers/seo-status.d.ts +4 -0
  439. package/dist/handlers/seo-status.d.ts.map +1 -0
  440. package/dist/handlers/seo-status.js +61 -0
  441. package/dist/handlers/seo-status.js.map +1 -0
  442. package/dist/handlers/seo-structured-data.d.ts +4 -0
  443. package/dist/handlers/seo-structured-data.d.ts.map +1 -0
  444. package/dist/handlers/seo-structured-data.js +18 -0
  445. package/dist/handlers/seo-structured-data.js.map +1 -0
  446. package/dist/handlers/site-config.d.ts +8 -0
  447. package/dist/handlers/site-config.d.ts.map +1 -0
  448. package/dist/handlers/site-config.js +26 -0
  449. package/dist/handlers/site-config.js.map +1 -0
  450. package/dist/handlers/site-preview.d.ts +10 -0
  451. package/dist/handlers/site-preview.d.ts.map +1 -0
  452. package/dist/handlers/site-preview.js +54 -0
  453. package/dist/handlers/site-preview.js.map +1 -0
  454. package/dist/handlers/site-settings.d.ts +17 -0
  455. package/dist/handlers/site-settings.d.ts.map +1 -0
  456. package/dist/handlers/site-settings.js +75 -0
  457. package/dist/handlers/site-settings.js.map +1 -0
  458. package/dist/handlers/snapshot-create.d.ts +4 -0
  459. package/dist/handlers/snapshot-create.d.ts.map +1 -0
  460. package/dist/handlers/snapshot-create.js +15 -0
  461. package/dist/handlers/snapshot-create.js.map +1 -0
  462. package/dist/handlers/snapshot-delete.d.ts +4 -0
  463. package/dist/handlers/snapshot-delete.d.ts.map +1 -0
  464. package/dist/handlers/snapshot-delete.js +21 -0
  465. package/dist/handlers/snapshot-delete.js.map +1 -0
  466. package/dist/handlers/snapshot-get.d.ts +4 -0
  467. package/dist/handlers/snapshot-get.d.ts.map +1 -0
  468. package/dist/handlers/snapshot-get.js +17 -0
  469. package/dist/handlers/snapshot-get.js.map +1 -0
  470. package/dist/handlers/snapshot-list.d.ts +4 -0
  471. package/dist/handlers/snapshot-list.d.ts.map +1 -0
  472. package/dist/handlers/snapshot-list.js +9 -0
  473. package/dist/handlers/snapshot-list.js.map +1 -0
  474. package/dist/handlers/snapshot-restore.d.ts +4 -0
  475. package/dist/handlers/snapshot-restore.d.ts.map +1 -0
  476. package/dist/handlers/snapshot-restore.js +27 -0
  477. package/dist/handlers/snapshot-restore.js.map +1 -0
  478. package/dist/handlers/translation-status.d.ts +9 -0
  479. package/dist/handlers/translation-status.d.ts.map +1 -0
  480. package/dist/handlers/translation-status.js +68 -0
  481. package/dist/handlers/translation-status.js.map +1 -0
  482. package/dist/handlers/update-content.d.ts +4 -0
  483. package/dist/handlers/update-content.d.ts.map +1 -0
  484. package/dist/handlers/update-content.js +66 -0
  485. package/dist/handlers/update-content.js.map +1 -0
  486. package/dist/handlers/user-create.d.ts +4 -0
  487. package/dist/handlers/user-create.d.ts.map +1 -0
  488. package/dist/handlers/user-create.js +38 -0
  489. package/dist/handlers/user-create.js.map +1 -0
  490. package/dist/handlers/user-delete.d.ts +4 -0
  491. package/dist/handlers/user-delete.d.ts.map +1 -0
  492. package/dist/handlers/user-delete.js +25 -0
  493. package/dist/handlers/user-delete.js.map +1 -0
  494. package/dist/handlers/user-get.d.ts +4 -0
  495. package/dist/handlers/user-get.d.ts.map +1 -0
  496. package/dist/handlers/user-get.js +22 -0
  497. package/dist/handlers/user-get.js.map +1 -0
  498. package/dist/handlers/user-list.d.ts +4 -0
  499. package/dist/handlers/user-list.d.ts.map +1 -0
  500. package/dist/handlers/user-list.js +28 -0
  501. package/dist/handlers/user-list.js.map +1 -0
  502. package/dist/handlers/user-permissions.d.ts +6 -0
  503. package/dist/handlers/user-permissions.d.ts.map +1 -0
  504. package/dist/handlers/user-permissions.js +42 -0
  505. package/dist/handlers/user-permissions.js.map +1 -0
  506. package/dist/handlers/user-update.d.ts +4 -0
  507. package/dist/handlers/user-update.d.ts.map +1 -0
  508. package/dist/handlers/user-update.js +54 -0
  509. package/dist/handlers/user-update.js.map +1 -0
  510. package/dist/handlers/validate-all.d.ts +4 -0
  511. package/dist/handlers/validate-all.d.ts.map +1 -0
  512. package/dist/handlers/validate-all.js +14 -0
  513. package/dist/handlers/validate-all.js.map +1 -0
  514. package/dist/handlers/version-retention.d.ts +6 -0
  515. package/dist/handlers/version-retention.d.ts.map +1 -0
  516. package/dist/handlers/version-retention.js +40 -0
  517. package/dist/handlers/version-retention.js.map +1 -0
  518. package/dist/handlers/webhook-deliveries.d.ts +4 -0
  519. package/dist/handlers/webhook-deliveries.d.ts.map +1 -0
  520. package/dist/handlers/webhook-deliveries.js +24 -0
  521. package/dist/handlers/webhook-deliveries.js.map +1 -0
  522. package/dist/handlers/webhook-retry.d.ts +11 -0
  523. package/dist/handlers/webhook-retry.d.ts.map +1 -0
  524. package/dist/handlers/webhook-retry.js +69 -0
  525. package/dist/handlers/webhook-retry.js.map +1 -0
  526. package/dist/head.d.ts +9 -0
  527. package/dist/head.d.ts.map +1 -0
  528. package/dist/head.js +28 -0
  529. package/dist/head.js.map +1 -0
  530. package/dist/hooks.d.ts +34 -0
  531. package/dist/hooks.d.ts.map +1 -0
  532. package/dist/hooks.js +19 -0
  533. package/dist/hooks.js.map +1 -0
  534. package/dist/image-cache.d.ts +47 -0
  535. package/dist/image-cache.d.ts.map +1 -0
  536. package/dist/image-cache.js +112 -0
  537. package/dist/image-cache.js.map +1 -0
  538. package/dist/image-dimensions.d.ts +12 -0
  539. package/dist/image-dimensions.d.ts.map +1 -0
  540. package/dist/image-dimensions.js +129 -0
  541. package/dist/image-dimensions.js.map +1 -0
  542. package/dist/image-optimizer.d.ts +86 -0
  543. package/dist/image-optimizer.d.ts.map +1 -0
  544. package/dist/image-optimizer.js +206 -0
  545. package/dist/image-optimizer.js.map +1 -0
  546. package/dist/image-presets.d.ts +17 -0
  547. package/dist/image-presets.d.ts.map +1 -0
  548. package/dist/image-presets.js +50 -0
  549. package/dist/image-presets.js.map +1 -0
  550. package/dist/image-url.d.ts +26 -0
  551. package/dist/image-url.d.ts.map +1 -0
  552. package/dist/image-url.js +47 -0
  553. package/dist/image-url.js.map +1 -0
  554. package/dist/index.d.ts +37 -0
  555. package/dist/index.d.ts.map +1 -0
  556. package/dist/index.js +23 -0
  557. package/dist/index.js.map +1 -0
  558. package/dist/jwt.d.ts +54 -0
  559. package/dist/jwt.d.ts.map +1 -0
  560. package/dist/jwt.js +114 -0
  561. package/dist/jwt.js.map +1 -0
  562. package/dist/locale-fallback.d.ts +18 -0
  563. package/dist/locale-fallback.d.ts.map +1 -0
  564. package/dist/locale-fallback.js +42 -0
  565. package/dist/locale-fallback.js.map +1 -0
  566. package/dist/media-library.d.ts +46 -0
  567. package/dist/media-library.d.ts.map +1 -0
  568. package/dist/media-library.js +231 -0
  569. package/dist/media-library.js.map +1 -0
  570. package/dist/media-reference-updater.d.ts +24 -0
  571. package/dist/media-reference-updater.d.ts.map +1 -0
  572. package/dist/media-reference-updater.js +124 -0
  573. package/dist/media-reference-updater.js.map +1 -0
  574. package/dist/media-references.d.ts +14 -0
  575. package/dist/media-references.d.ts.map +1 -0
  576. package/dist/media-references.js +25 -0
  577. package/dist/media-references.js.map +1 -0
  578. package/dist/merged-schema.d.ts +10 -0
  579. package/dist/merged-schema.d.ts.map +1 -0
  580. package/dist/merged-schema.js +21 -0
  581. package/dist/merged-schema.js.map +1 -0
  582. package/dist/middleware/auth.d.ts +21 -0
  583. package/dist/middleware/auth.d.ts.map +1 -0
  584. package/dist/middleware/auth.js +82 -0
  585. package/dist/middleware/auth.js.map +1 -0
  586. package/dist/oidc-state.d.ts +42 -0
  587. package/dist/oidc-state.d.ts.map +1 -0
  588. package/dist/oidc-state.js +72 -0
  589. package/dist/oidc-state.js.map +1 -0
  590. package/dist/oidc.d.ts +83 -0
  591. package/dist/oidc.d.ts.map +1 -0
  592. package/dist/oidc.js +226 -0
  593. package/dist/oidc.js.map +1 -0
  594. package/dist/openapi.d.ts +13 -0
  595. package/dist/openapi.d.ts.map +1 -0
  596. package/dist/openapi.js +133 -0
  597. package/dist/openapi.js.map +1 -0
  598. package/dist/permissions.d.ts +37 -0
  599. package/dist/permissions.d.ts.map +1 -0
  600. package/dist/permissions.js +69 -0
  601. package/dist/permissions.js.map +1 -0
  602. package/dist/plugins.d.ts +64 -0
  603. package/dist/plugins.d.ts.map +1 -0
  604. package/dist/plugins.js +73 -0
  605. package/dist/plugins.js.map +1 -0
  606. package/dist/preview-token.d.ts +13 -0
  607. package/dist/preview-token.d.ts.map +1 -0
  608. package/dist/preview-token.js +45 -0
  609. package/dist/preview-token.js.map +1 -0
  610. package/dist/public-cache.d.ts +8 -0
  611. package/dist/public-cache.d.ts.map +1 -0
  612. package/dist/public-cache.js +8 -0
  613. package/dist/public-cache.js.map +1 -0
  614. package/dist/reference-resolver.d.ts +21 -0
  615. package/dist/reference-resolver.d.ts.map +1 -0
  616. package/dist/reference-resolver.js +128 -0
  617. package/dist/reference-resolver.js.map +1 -0
  618. package/dist/return-to.d.ts +7 -0
  619. package/dist/return-to.d.ts.map +1 -0
  620. package/dist/return-to.js +15 -0
  621. package/dist/return-to.js.map +1 -0
  622. package/dist/router.d.ts +14 -0
  623. package/dist/router.d.ts.map +1 -0
  624. package/dist/router.js +51 -0
  625. package/dist/router.js.map +1 -0
  626. package/dist/runtime-field-checks.d.ts +11 -0
  627. package/dist/runtime-field-checks.d.ts.map +1 -0
  628. package/dist/runtime-field-checks.js +72 -0
  629. package/dist/runtime-field-checks.js.map +1 -0
  630. package/dist/save-document.d.ts +71 -0
  631. package/dist/save-document.d.ts.map +1 -0
  632. package/dist/save-document.js +213 -0
  633. package/dist/save-document.js.map +1 -0
  634. package/dist/seo-compose.d.ts +50 -0
  635. package/dist/seo-compose.d.ts.map +1 -0
  636. package/dist/seo-compose.js +104 -0
  637. package/dist/seo-compose.js.map +1 -0
  638. package/dist/seo-config-snapshot.d.ts +10 -0
  639. package/dist/seo-config-snapshot.d.ts.map +1 -0
  640. package/dist/seo-config-snapshot.js +16 -0
  641. package/dist/seo-config-snapshot.js.map +1 -0
  642. package/dist/seo-loader.d.ts +10 -0
  643. package/dist/seo-loader.d.ts.map +1 -0
  644. package/dist/seo-loader.js +14 -0
  645. package/dist/seo-loader.js.map +1 -0
  646. package/dist/seo-site-findings.d.ts +27 -0
  647. package/dist/seo-site-findings.d.ts.map +1 -0
  648. package/dist/seo-site-findings.js +87 -0
  649. package/dist/seo-site-findings.js.map +1 -0
  650. package/dist/seo-subsystem.d.ts +28 -0
  651. package/dist/seo-subsystem.d.ts.map +1 -0
  652. package/dist/seo-subsystem.js +62 -0
  653. package/dist/seo-subsystem.js.map +1 -0
  654. package/dist/seo-validation.d.ts +20 -0
  655. package/dist/seo-validation.d.ts.map +1 -0
  656. package/dist/seo-validation.js +96 -0
  657. package/dist/seo-validation.js.map +1 -0
  658. package/dist/types.d.ts +126 -0
  659. package/dist/types.d.ts.map +1 -0
  660. package/dist/types.js +6 -0
  661. package/dist/types.js.map +1 -0
  662. package/dist/validators.d.ts +107 -0
  663. package/dist/validators.d.ts.map +1 -0
  664. package/dist/validators.js +199 -0
  665. package/dist/validators.js.map +1 -0
  666. package/dist/webhooks.d.ts +29 -0
  667. package/dist/webhooks.d.ts.map +1 -0
  668. package/dist/webhooks.js +123 -0
  669. package/dist/webhooks.js.map +1 -0
  670. package/dist/workload-identity.d.ts +23 -0
  671. package/dist/workload-identity.d.ts.map +1 -0
  672. package/dist/workload-identity.js +145 -0
  673. package/dist/workload-identity.js.map +1 -0
  674. package/package.json +50 -3
  675. package/README.md +0 -3
@@ -0,0 +1,178 @@
1
+ import { documentPath, rendersPages } from '@krantho/core';
2
+ import { canReadPublished } from '@krantho/persistence';
3
+ import { buildSeoFieldMap, resolveSeoField } from '@krantho/seo-shared';
4
+ import { PUBLIC_MACHINE_READ_CACHE_CONTROL } from '../public-cache.js';
5
+ /**
6
+ * Canonical paths for the SEO routes registered in `create-api-handlers.ts`.
7
+ *
8
+ * Exported as constants so callers (e.g., the robots.txt handler) reference
9
+ * the same path the router registers, preventing drift if a route is renamed.
10
+ */
11
+ export const SEO_SITEMAP_PATH = '/api/seo/sitemap';
12
+ /** Where a site serves the sitemap — the address robots.txt names; the site routes it to SEO_SITEMAP_PATH */
13
+ export const SITEMAP_PUBLIC_PATH = '/sitemap.xml';
14
+ export const SEO_SITEMAP_JSON_PATH = '/api/seo/sitemap.json';
15
+ export const SEO_ROBOTS_PATH = '/api/seo/robots.txt';
16
+ /**
17
+ * Whether a document asks not to be indexed. The field name is resolved
18
+ * dynamically so CMS schemas with different conventions (e.g. `robots-index`
19
+ * vs `noindex`) all work.
20
+ */
21
+ export function isNoindex(fields) {
22
+ const fieldMap = buildSeoFieldMap(Object.keys(fields));
23
+ const robotsField = fieldMap.robotsIndex;
24
+ if (!robotsField)
25
+ return false;
26
+ const rawValue = fields[robotsField];
27
+ if (rawValue === false || rawValue === 'false' || rawValue === 'noindex')
28
+ return true;
29
+ // resolveSeoField returns strings; the raw false/string cases are handled above
30
+ const resolved = resolveSeoField(fieldMap, 'robotsIndex', fields);
31
+ return resolved === 'false' || resolved === 'noindex';
32
+ }
33
+ /**
34
+ * Build the list of sitemap URLs from the handler's content config.
35
+ *
36
+ * Pure: reads from the context, returns an array. No side effects. This is
37
+ * the shared core used by both `seoSitemap` (XML output) and `seoSitemapJson`
38
+ * (JSON output for the Studio preview), plus any future consumer that needs
39
+ * the url list.
40
+ *
41
+ * Iterates every published item in every collection that renders pages
42
+ * (`rendersPages()`), skips noindex pages (resolved via the dynamic field map
43
+ * so CMS field names can differ), and derives the URL with `documentPath()`
44
+ * from the collection's `path` — or, without one, `pages` items at the site
45
+ * root (the `home` page is the homepage) and other collections under their
46
+ * name (`/{name}/slug`). A path is listed once: the homepage, and a fixed-path
47
+ * collection whose documents share one page.
48
+ */
49
+ export async function buildSitemapUrls(ctx) {
50
+ const baseUrl = ctx.config.site.baseUrl.replace(/\/$/, '');
51
+ const urls = [];
52
+ const listed = new Set();
53
+ for (const [name, collection] of ctx.contentConfig.collections) {
54
+ if (!rendersPages(collection))
55
+ continue;
56
+ if (!canReadPublished(ctx.adapter))
57
+ continue;
58
+ try {
59
+ // The live version of each document: a page with a newer draft stays
60
+ // listed, and an unpublished page drops out
61
+ const { items } = await ctx.adapter.query({
62
+ state: 'published',
63
+ projection: 'summary',
64
+ collections: [name],
65
+ });
66
+ for (const item of items) {
67
+ if (isNoindex(item.fields))
68
+ continue;
69
+ const path = documentPath(collection, item.meta.slug);
70
+ if (path === null || listed.has(path))
71
+ continue;
72
+ listed.add(path);
73
+ // Each save writes a new version, so the live version's `createdAt` is
74
+ // when the page last changed: an editor's publish, or for an imported
75
+ // file its last commit (`generateContentDates`)
76
+ const lastmod = w3cDatetime(item.meta.createdAt);
77
+ const home = path === '/';
78
+ urls.push({
79
+ loc: `${baseUrl}${path}`,
80
+ ...(lastmod ? { lastmod } : {}),
81
+ changefreq: home || name === 'pages' ? 'weekly' : 'monthly',
82
+ priority: home ? '1.0' : name === 'pages' ? '0.8' : '0.6',
83
+ });
84
+ }
85
+ }
86
+ catch {
87
+ // Collection may not support listing
88
+ }
89
+ }
90
+ return withHomepageFirst(urls, baseUrl);
91
+ }
92
+ /**
93
+ * A timestamp as the sitemap protocol's W3C Datetime, in UTC with full time
94
+ * (`2026-09-30T22:17:06.000Z`), or undefined when there is none to give.
95
+ */
96
+ function w3cDatetime(value) {
97
+ const time = value ? Date.parse(value) : Number.NaN;
98
+ return Number.isNaN(time) ? undefined : new Date(time).toISOString();
99
+ }
100
+ /**
101
+ * The homepage leads the list. A document that renders `/` supplies its entry,
102
+ * with its `lastmod`; without one, the site's root is listed bare.
103
+ */
104
+ function withHomepageFirst(urls, baseUrl) {
105
+ const homeLoc = `${baseUrl}/`;
106
+ const home = urls.find((url) => url.loc === homeLoc) ?? {
107
+ loc: homeLoc,
108
+ changefreq: 'weekly',
109
+ priority: '1.0',
110
+ };
111
+ return [home, ...urls.filter((url) => url.loc !== homeLoc)];
112
+ }
113
+ /**
114
+ * Serialize a list of sitemap URLs to XML.
115
+ *
116
+ * Exported so tests can drive the serializer directly without needing to
117
+ * stub the full ApiContext. Also used by the XML handler below.
118
+ */
119
+ export function serializeSitemapXml(urls) {
120
+ const urlEntries = urls
121
+ .map((u) => {
122
+ const parts = [` <loc>${escapeXml(u.loc)}</loc>`];
123
+ if (u.lastmod)
124
+ parts.push(` <lastmod>${u.lastmod}</lastmod>`);
125
+ parts.push(` <changefreq>${u.changefreq}</changefreq>`);
126
+ parts.push(` <priority>${u.priority}</priority>`);
127
+ return ` <url>\n${parts.join('\n')}\n </url>`;
128
+ })
129
+ .join('\n');
130
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urlEntries}\n</urlset>`;
131
+ }
132
+ /**
133
+ * GET /api/seo/sitemap — generate sitemap XML dynamically from all collections.
134
+ *
135
+ * Lists all published content across the collections that render pages, at
136
+ * site.baseUrl + `documentPath()`. Excludes collections without pages and
137
+ * noindex pages.
138
+ */
139
+ export const seoSitemap = async (_req, ctx) => {
140
+ const urls = await buildSitemapUrls(ctx);
141
+ return {
142
+ status: 200,
143
+ body: serializeSitemapXml(urls),
144
+ headers: {
145
+ 'content-type': 'application/xml; charset=utf-8',
146
+ 'cache-control': PUBLIC_MACHINE_READ_CACHE_CONTROL,
147
+ },
148
+ };
149
+ };
150
+ /**
151
+ * GET /api/seo/sitemap.json — same url list as the XML handler, served as JSON.
152
+ *
153
+ * Used by Studio's Structure → Sitemap & Robots tab to render a sortable table
154
+ * without parsing XML client-side. Not intended as a public SEO endpoint —
155
+ * search engines consume the XML at `/api/seo/sitemap` (or wherever your
156
+ * framework rewrites it, e.g. `/sitemap.xml`).
157
+ */
158
+ export const seoSitemapJson = async (_req, ctx) => {
159
+ const urls = await buildSitemapUrls(ctx);
160
+ return {
161
+ status: 200,
162
+ body: { urls },
163
+ };
164
+ };
165
+ /**
166
+ * Escape XML special characters for use inside `<loc>` element values.
167
+ *
168
+ * Intentionally minimal: only escapes the three characters that XML treats
169
+ * as control characters in element content (`&`, `<`, `>`). Quote characters
170
+ * (`'` and `"`) are not escaped because we never embed values inside attribute
171
+ * contexts in this sitemap output — every interpolated value goes between
172
+ * element tags. If you start emitting values inside attributes (e.g.
173
+ * `<image:image href="...">`), extend this to also escape `'` and `"`.
174
+ */
175
+ function escapeXml(str) {
176
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
177
+ }
178
+ //# sourceMappingURL=seo-sitemap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-sitemap.js","sourceRoot":"","sources":["../../src/handlers/seo-sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAA;AAGtE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAA;AAClD,6GAA6G;AAC7G,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAA;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAA;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,CAAA;AAWpD;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,MAA+B;IACvD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACtD,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAA;IACxC,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAA;IAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAA;IACpC,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACrF,gFAAgF;IAChF,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,CAAA;IACjE,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS,CAAA;AACvD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAe;IACpD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC1D,MAAM,IAAI,GAAiB,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAEhC,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAC/D,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;YAAE,SAAQ;QACvC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAQ;QAE5C,IAAI,CAAC;YACH,qEAAqE;YACrE,4CAA4C;YAC5C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;gBACxC,KAAK,EAAE,WAAW;gBAClB,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,CAAC,IAAI,CAAC;aACpB,CAAC,CAAA;YAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;oBAAE,SAAQ;gBAEpC,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACrD,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAQ;gBAC/C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAChB,uEAAuE;gBACvE,sEAAsE;gBACtE,gDAAgD;gBAChD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBAEhD,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG,CAAA;gBACzB,IAAI,CAAC,IAAI,CAAC;oBACR,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,EAAE;oBACxB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/B,UAAU,EAAE,IAAI,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;oBAC3D,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;iBAC1D,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAyB;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAA;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;AACtE,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,IAAkB,EAAE,OAAe;IAC5D,MAAM,OAAO,GAAG,GAAG,OAAO,GAAG,CAAA;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,IAAI;QACtD,GAAG,EAAE,OAAO;QACZ,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;KAChB,CAAA;IACD,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA2B;IAC7D,MAAM,UAAU,GAAG,IAAI;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,KAAK,GAAG,CAAC,YAAY,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACpD,IAAI,CAAC,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,YAAY,CAAC,CAAA;QAChE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,UAAU,eAAe,CAAC,CAAA;QAC1D,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,aAAa,CAAC,CAAA;QACpD,OAAO,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAA;IACjD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO,yGAAyG,UAAU,aAAa,CAAA;AACzI,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAe,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACxD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACxC,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;QAC/B,OAAO,EAAE;YACP,cAAc,EAAE,gCAAgC;YAChD,eAAe,EAAE,iCAAiC;SACnD;KACF,CAAA;AACH,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAe,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC5D,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACxC,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,EAAE,IAAI,EAAE;KACf,CAAA;AACH,CAAC,CAAA;AAED;;;;;;;;;GASG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAC/E,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ApiHandler } from '../types.js';
2
+ /** GET /api/seo/status — SEO file status overview */
3
+ export declare const seoStatus: ApiHandler;
4
+ //# sourceMappingURL=seo-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-status.d.ts","sourceRoot":"","sources":["../../src/handlers/seo-status.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAuD7C,qDAAqD;AACrD,eAAO,MAAM,SAAS,EAAE,UAevB,CAAA"}
@@ -0,0 +1,61 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ async function checkJsonFile(filePath, countKey) {
4
+ let raw;
5
+ try {
6
+ raw = await readFile(filePath, 'utf-8');
7
+ }
8
+ catch {
9
+ return { exists: false };
10
+ }
11
+ try {
12
+ const data = JSON.parse(raw);
13
+ let count = 0;
14
+ if (Array.isArray(data)) {
15
+ count = data.length;
16
+ }
17
+ else if (data && typeof data === 'object') {
18
+ count = Object.keys(data).length;
19
+ }
20
+ return { exists: true, [countKey]: count };
21
+ }
22
+ catch {
23
+ // File exists but contains invalid JSON
24
+ return { exists: true, [countKey]: 0 };
25
+ }
26
+ }
27
+ async function checkTextFile(filePath) {
28
+ try {
29
+ const info = await stat(filePath);
30
+ return { exists: true, bytes: info.size };
31
+ }
32
+ catch {
33
+ return { exists: false };
34
+ }
35
+ }
36
+ async function checkSitemapFile(filePath) {
37
+ try {
38
+ const raw = await readFile(filePath, 'utf-8');
39
+ const urls = (raw.match(/<url>/g) ?? []).length;
40
+ return { exists: true, urls };
41
+ }
42
+ catch {
43
+ return { exists: false };
44
+ }
45
+ }
46
+ /** GET /api/seo/status — SEO file status overview */
47
+ export const seoStatus = async (_req, ctx) => {
48
+ const basePath = ctx.config.paths.seoGeneratedDir;
49
+ const [structuredData, faqPages, llmsTxt, sitemap, contentDates] = await Promise.all([
50
+ checkJsonFile(join(basePath, 'structured-data.json'), 'entries'),
51
+ checkJsonFile(join(basePath, 'faq-pages.json'), 'routes'),
52
+ checkTextFile(join(basePath, 'llms.txt')),
53
+ checkSitemapFile(join(basePath, 'sitemap.xml')),
54
+ checkJsonFile(join(basePath, 'content-dates.json'), 'entries'),
55
+ ]);
56
+ return {
57
+ status: 200,
58
+ body: { structuredData, faqPages, llmsTxt, sitemap, contentDates },
59
+ };
60
+ };
61
+ //# sourceMappingURL=seo-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-status.js","sourceRoot":"","sources":["../../src/handlers/seo-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ApiHandler } from '../types.js';
2
+ /** GET /api/seo/structured-data — return generated structured-data.json */
3
+ export declare const seoStructuredData: ApiHandler;
4
+ //# sourceMappingURL=seo-structured-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-structured-data.d.ts","sourceRoot":"","sources":["../../src/handlers/seo-structured-data.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,UAa/B,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ /** GET /api/seo/structured-data — return generated structured-data.json */
4
+ export const seoStructuredData = async (_req, ctx) => {
5
+ const basePath = ctx.config.paths.seoGeneratedDir;
6
+ try {
7
+ const raw = await readFile(join(basePath, 'structured-data.json'), 'utf-8');
8
+ const data = JSON.parse(raw);
9
+ return { status: 200, body: data };
10
+ }
11
+ catch {
12
+ return {
13
+ status: 404,
14
+ body: { error: 'structured-data.json not found — run seo:generate to create it' },
15
+ };
16
+ }
17
+ };
18
+ //# sourceMappingURL=seo-structured-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-structured-data.js","sourceRoot":"","sources":["../../src/handlers/seo-structured-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAe,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAA;IAEjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,EAAE,OAAO,CAAC,CAAA;QAC3E,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,EAAE,KAAK,EAAE,gEAAgE,EAAE;SAClF,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { ApiHandler } from '../types.js';
2
+ /**
3
+ * GET /api/site-config — the browser-safe configuration (`PublicConfig`: site
4
+ * identity, SEO limits and readers, features, page-cache settings) and the
5
+ * collection schemas
6
+ */
7
+ export declare const siteConfigHandler: ApiHandler;
8
+ //# sourceMappingURL=site-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-config.d.ts","sourceRoot":"","sources":["../../src/handlers/site-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAwB/B,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { toPublicConfig } from '@krantho/config/public';
2
+ /**
3
+ * GET /api/site-config — the browser-safe configuration (`PublicConfig`: site
4
+ * identity, SEO limits and readers, features, page-cache settings) and the
5
+ * collection schemas
6
+ */
7
+ export const siteConfigHandler = async (_req, ctx) => {
8
+ const collections = [];
9
+ for (const [name, collection] of ctx.contentConfig.collections) {
10
+ const schema = collection.schema;
11
+ let fieldCount = 0;
12
+ if (schema && 'shape' in schema && typeof schema.shape === 'object' && schema.shape) {
13
+ fieldCount = Object.keys(schema.shape).length;
14
+ }
15
+ collections.push({
16
+ name,
17
+ source: collection.source,
18
+ fieldCount,
19
+ });
20
+ }
21
+ return {
22
+ status: 200,
23
+ body: { ...toPublicConfig(ctx.config), collections },
24
+ };
25
+ };
26
+ //# sourceMappingURL=site-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-config.js","sourceRoot":"","sources":["../../src/handlers/site-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAGvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAe,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/D,MAAM,WAAW,GAIZ,EAAE,CAAA;IAEP,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAChC,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACpF,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;QAC/C,CAAC;QACD,WAAW,CAAC,IAAI,CAAC;YACf,IAAI;YACJ,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE;KACrD,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { ApiHandler } from '../types.js';
2
+ /**
3
+ * GET /api/preview?collection=&slug= — may this user preview the document on
4
+ * the site, and at which path? Registered when the host renders drafts for
5
+ * editors (`sitePreview`). In `draft-mode` it answers `{ path }` and the host
6
+ * turns that into its own preview mode; in `signed-url` it sends the editor to
7
+ * the page with a short-lived token bound to that path.
8
+ */
9
+ export declare const sitePreview: ApiHandler;
10
+ //# sourceMappingURL=site-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-preview.d.ts","sourceRoot":"","sources":["../../src/handlers/site-preview.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,aAAa,CAAA;AAM1D;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,UAezB,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { documentPath, resolveSitePath } from '@krantho/core';
2
+ import { requireRole } from '../permissions.js';
3
+ import { PREVIEW_PARAM, signPreviewToken } from '../preview-token.js';
4
+ import { requireParam, validateCollectionParam } from '../validators.js';
5
+ /** Any fixed origin: only the path of the redirect matters, and it must stay on it */
6
+ const SITE_ORIGIN = 'http://localhost';
7
+ /**
8
+ * GET /api/preview?collection=&slug= — may this user preview the document on
9
+ * the site, and at which path? Registered when the host renders drafts for
10
+ * editors (`sitePreview`). In `draft-mode` it answers `{ path }` and the host
11
+ * turns that into its own preview mode; in `signed-url` it sends the editor to
12
+ * the page with a short-lived token bound to that path.
13
+ */
14
+ export const sitePreview = async (req, ctx) => {
15
+ const denied = requireRole(ctx.auth, 'editor');
16
+ if (denied)
17
+ return denied;
18
+ const validated = validateCollectionParam(req.query['collection'], ctx);
19
+ if (!validated.isValid)
20
+ return validated.response;
21
+ const slugResult = requireParam(req.query, 'slug');
22
+ if (!slugResult.isValid)
23
+ return slugResult.response;
24
+ const path = documentPath(validated.collectionDef, slugResult.value);
25
+ if (path === null) {
26
+ return { status: 400, body: { error: `"${validated.collection}" has no pages to preview` } };
27
+ }
28
+ if (ctx.sitePreview !== 'signed-url')
29
+ return { status: 200, body: { path } };
30
+ return signedRedirect(path, ctx.config.auth.jwtSecret);
31
+ };
32
+ /**
33
+ * Send the editor to the page with a token signed for its path. The path is
34
+ * resolved as the browser will request it, and must stay on the site: a slug
35
+ * that normalises to another host (`..//host`) gets no link and no token.
36
+ */
37
+ function signedRedirect(path, secret) {
38
+ // The API always resolves a signing secret (configured or ephemeral); never sign without one
39
+ if (!secret)
40
+ return { status: 500, body: { error: 'No signing secret for preview links' } };
41
+ const target = resolveSitePath(path, SITE_ORIGIN);
42
+ if (!target)
43
+ return { status: 400, body: { error: 'The page path leaves the site' } };
44
+ const token = signPreviewToken(target.pathname, secret);
45
+ return {
46
+ status: 307,
47
+ body: null,
48
+ headers: {
49
+ location: `${target.pathname}?${new URLSearchParams({ [PREVIEW_PARAM]: token })}`,
50
+ 'cache-control': 'no-store',
51
+ },
52
+ };
53
+ }
54
+ //# sourceMappingURL=site-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-preview.js","sourceRoot":"","sources":["../../src/handlers/site-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAErE,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAExE,sFAAsF;AACtF,MAAM,WAAW,GAAG,kBAAkB,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACxD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC9C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAA;IACvE,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC,QAAQ,CAAA;IACjD,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAClD,IAAI,CAAC,UAAU,CAAC,OAAO;QAAE,OAAO,UAAU,CAAC,QAAQ,CAAA;IAEnD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,aAAa,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACpE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,UAAU,2BAA2B,EAAE,EAAE,CAAA;IAC9F,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,KAAK,YAAY;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAA;IAC5E,OAAO,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACxD,CAAC,CAAA;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,MAA0B;IAC9D,6FAA6F;IAC7F,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,qCAAqC,EAAE,EAAE,CAAA;IAC3F,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE,CAAA;IACrF,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACvD,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,eAAe,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;YACjF,eAAe,EAAE,UAAU;SAC5B;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ApiHandler } from '../types.js';
2
+ /**
3
+ * GET /api/settings/locales — the site's locales.
4
+ *
5
+ * The default locale is always the configuration's `site.defaultLocale`.
6
+ * `configuredLocales` are the locales the configuration lists; `supportedLocales`
7
+ * are the active ones (`activeLocales`).
8
+ */
9
+ export declare const getLocaleSettings: ApiHandler;
10
+ /**
11
+ * PUT /api/settings/locales — choose which of the configured locales are active.
12
+ *
13
+ * The body is `{ supportedLocales: string[] }`. The default locale is the
14
+ * configuration's and is not set here.
15
+ */
16
+ export declare const updateLocaleSettings: ApiHandler;
17
+ //# sourceMappingURL=site-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-settings.d.ts","sourceRoot":"","sources":["../../src/handlers/site-settings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAa/B,CAAA;AAoBD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAiClC,CAAA"}
@@ -0,0 +1,75 @@
1
+ import { activeLocales } from '../active-locales.js';
2
+ import { requireRole } from '../permissions.js';
3
+ import { validateRequestBody } from '../validators.js';
4
+ /**
5
+ * GET /api/settings/locales — the site's locales.
6
+ *
7
+ * The default locale is always the configuration's `site.defaultLocale`.
8
+ * `configuredLocales` are the locales the configuration lists; `supportedLocales`
9
+ * are the active ones (`activeLocales`).
10
+ */
11
+ export const getLocaleSettings = async (_req, ctx) => {
12
+ const { defaultLocale, supportedLocales: configuredLocales } = ctx.config.site;
13
+ const { locales, stored } = await activeLocales(ctx);
14
+ return {
15
+ status: 200,
16
+ body: {
17
+ defaultLocale,
18
+ configuredLocales,
19
+ supportedLocales: locales,
20
+ source: stored ? 'database' : 'config',
21
+ },
22
+ };
23
+ };
24
+ /** The reason a list of active locales is not valid for the site, or null */
25
+ function localeListError(locales, configured, defaultLocale) {
26
+ if (locales.length === 0)
27
+ return 'At least one locale is required';
28
+ if (new Set(locales).size !== locales.length)
29
+ return 'The list names a locale more than once';
30
+ const unknown = locales.filter((locale) => !configured.includes(locale));
31
+ if (unknown.length > 0) {
32
+ return `${unknown.join(', ')} is not in site.supportedLocales in the configuration (${configured.join(', ')})`;
33
+ }
34
+ if (!locales.includes(defaultLocale)) {
35
+ return `The default locale ${defaultLocale} must stay active`;
36
+ }
37
+ return null;
38
+ }
39
+ /**
40
+ * PUT /api/settings/locales — choose which of the configured locales are active.
41
+ *
42
+ * The body is `{ supportedLocales: string[] }`. The default locale is the
43
+ * configuration's and is not set here.
44
+ */
45
+ export const updateLocaleSettings = async (req, ctx) => {
46
+ const denied = requireRole(ctx.auth, 'admin');
47
+ if (denied)
48
+ return denied;
49
+ if (!ctx.siteSettingsAdapter) {
50
+ return { status: 501, body: { error: 'Site settings storage not available' } };
51
+ }
52
+ const bodyCheck = validateRequestBody(req.body);
53
+ if (!bodyCheck.isValid)
54
+ return bodyCheck.response;
55
+ const payload = bodyCheck.body;
56
+ const requested = payload['supportedLocales'];
57
+ if (!Array.isArray(requested) || !requested.every((l) => typeof l === 'string')) {
58
+ return { status: 400, body: { error: 'supportedLocales must be an array of locale codes' } };
59
+ }
60
+ const { defaultLocale, supportedLocales: configuredLocales } = ctx.config.site;
61
+ const error = localeListError(requested, configuredLocales, defaultLocale);
62
+ if (error)
63
+ return { status: 400, body: { error } };
64
+ await ctx.siteSettingsAdapter.setSetting('supportedLocales', JSON.stringify(requested));
65
+ return {
66
+ status: 200,
67
+ body: {
68
+ defaultLocale,
69
+ configuredLocales,
70
+ supportedLocales: requested,
71
+ source: 'database',
72
+ },
73
+ };
74
+ };
75
+ //# sourceMappingURL=site-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-settings.js","sourceRoot":"","sources":["../../src/handlers/site-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ApiHandler } from '../types.js';
2
+ /** POST /api/checkpoints — create a manual checkpoint */
3
+ export declare const snapshotCreate: ApiHandler;
4
+ //# sourceMappingURL=snapshot-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-create.d.ts","sourceRoot":"","sources":["../../src/handlers/snapshot-create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,yDAAyD;AACzD,eAAO,MAAM,cAAc,EAAE,UAa5B,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { requireRole } from '../permissions.js';
2
+ /** POST /api/checkpoints — create a manual checkpoint */
3
+ export const snapshotCreate = async (req, ctx) => {
4
+ const denied = requireRole(ctx.auth, 'editor');
5
+ if (denied)
6
+ return denied;
7
+ if (!ctx.checkpointAdapter) {
8
+ return { status: 501, body: { error: 'Checkpoint system not configured' } };
9
+ }
10
+ const body = req.body;
11
+ const name = typeof body?.name === 'string' ? body.name : undefined;
12
+ const checkpoint = await ctx.checkpointAdapter.createCheckpoint(name, 'manual');
13
+ return { status: 201, body: checkpoint };
14
+ };
15
+ //# sourceMappingURL=snapshot-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-create.js","sourceRoot":"","sources":["../../src/handlers/snapshot-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,yDAAyD;AACzD,MAAM,CAAC,MAAM,cAAc,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC9C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,CAAA;IAC7E,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAqC,CAAA;IACtD,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IAEnE,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC/E,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC1C,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { ApiHandler } from '../types.js';
2
+ /** DELETE /api/checkpoints/:version — delete a checkpoint */
3
+ export declare const snapshotDelete: ApiHandler;
4
+ //# sourceMappingURL=snapshot-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-delete.d.ts","sourceRoot":"","sources":["../../src/handlers/snapshot-delete.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,6DAA6D;AAC7D,eAAO,MAAM,cAAc,EAAE,UAkB5B,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { requireRole } from '../permissions.js';
2
+ import { parseCheckpointVersion } from '../validators.js';
3
+ /** DELETE /api/checkpoints/:version — delete a checkpoint */
4
+ export const snapshotDelete = async (req, ctx) => {
5
+ const denied = requireRole(ctx.auth, 'admin');
6
+ if (denied)
7
+ return denied;
8
+ if (!ctx.checkpointAdapter) {
9
+ return { status: 501, body: { error: 'Checkpoint system not configured' } };
10
+ }
11
+ const parsed = parseCheckpointVersion(req.params);
12
+ if (!parsed.isValid)
13
+ return parsed.response;
14
+ const { version } = parsed;
15
+ const deleted = await ctx.checkpointAdapter.deleteCheckpoint(version);
16
+ if (!deleted) {
17
+ return { status: 404, body: { error: `Checkpoint version ${version} not found` } };
18
+ }
19
+ return { status: 200, body: { deleted: true, version } };
20
+ };
21
+ //# sourceMappingURL=snapshot-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-delete.js","sourceRoot":"","sources":["../../src/handlers/snapshot-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,CAAA;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAA;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAE1B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACrE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,sBAAsB,OAAO,YAAY,EAAE,EAAE,CAAA;IACpF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAA;AAC1D,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { ApiHandler } from '../types.js';
2
+ /** GET /api/checkpoints/:version — get checkpoint details */
3
+ export declare const snapshotGet: ApiHandler;
4
+ //# sourceMappingURL=snapshot-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-get.d.ts","sourceRoot":"","sources":["../../src/handlers/snapshot-get.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,6DAA6D;AAC7D,eAAO,MAAM,WAAW,EAAE,UAezB,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { parseCheckpointVersion } from '../validators.js';
2
+ /** GET /api/checkpoints/:version — get checkpoint details */
3
+ export const snapshotGet = async (req, ctx) => {
4
+ if (!ctx.checkpointAdapter) {
5
+ return { status: 501, body: { error: 'Checkpoint system not configured' } };
6
+ }
7
+ const parsed = parseCheckpointVersion(req.params);
8
+ if (!parsed.isValid)
9
+ return parsed.response;
10
+ const { version } = parsed;
11
+ const checkpoint = await ctx.checkpointAdapter.getCheckpoint(version);
12
+ if (!checkpoint) {
13
+ return { status: 404, body: { error: `Checkpoint version ${version} not found` } };
14
+ }
15
+ return { status: 200, body: checkpoint };
16
+ };
17
+ //# sourceMappingURL=snapshot-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-get.js","sourceRoot":"","sources":["../../src/handlers/snapshot-get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACxD,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,CAAA;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAA;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAE1B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACrE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,sBAAsB,OAAO,YAAY,EAAE,EAAE,CAAA;IACpF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC1C,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { ApiHandler } from '../types.js';
2
+ /** GET /api/checkpoints — list all checkpoints */
3
+ export declare const snapshotList: ApiHandler;
4
+ //# sourceMappingURL=snapshot-list.d.ts.map