@krantho/api 0.0.0-stage → 1.0.1

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 +51 -3
  675. package/README.md +0 -3
@@ -0,0 +1,50 @@
1
+ import type { KranthoConfig } from '@krantho/config';
2
+ import type { PageStructure } from '@krantho/core';
3
+ import type { DocumentMeta } from '@krantho/persistence';
4
+ import type { SeoConfigData } from '@krantho/seo-shared';
5
+ import type { SeoConfigReader } from './seo-config-snapshot.js';
6
+ /** What composing a page's JSON-LD reads */
7
+ export interface PageJsonLdInput {
8
+ collection: string;
9
+ slug: string;
10
+ /** Where the document renders (`documentPath()`); null when its collection has no pages */
11
+ path: string | null;
12
+ /** The document fields the graph describes */
13
+ fields: Record<string, unknown>;
14
+ /** Version metadata for system-derived properties (dates, author) */
15
+ documentMeta?: DocumentMeta | undefined;
16
+ metadata?: Record<string, Record<string, unknown>> | undefined;
17
+ /** The site's configuration: its identity, SEO definitions and readers */
18
+ config: KranthoConfig;
19
+ /** SEO configuration store; without one, the code-defined archetype applies */
20
+ seoConfigs?: SeoConfigReader | undefined;
21
+ /** The structure the page's template renders: its trail, its place in a sequence, its kind */
22
+ structure?: PageStructure | undefined;
23
+ }
24
+ /** The SEO configuration a page composes from: the site, its collection, its URL pattern and the document */
25
+ export interface PageSeoConfig {
26
+ site: SeoConfigData | null;
27
+ effective: SeoConfigData;
28
+ }
29
+ /** Whether a route configuration's URL pattern (`/blog/*`, `/docs/**`) matches a page path */
30
+ export declare function routeMatches(pattern: string, path: string): boolean;
31
+ /**
32
+ * The SEO configuration a page composes from: the stored site scope, and the
33
+ * collection, URL-pattern and document scopes resolved into one — or, when
34
+ * nothing is configured for the page, the code-defined article archetype with
35
+ * no site entities. The page's graph and the editor's resolved values both
36
+ * start here. Rejects when `@krantho/seo` is not installed.
37
+ */
38
+ export declare function pageSeoConfig(input: Pick<PageJsonLdInput, 'collection' | 'slug' | 'path' | 'seoConfigs' | 'metadata'>): Promise<PageSeoConfig>;
39
+ /**
40
+ * Compose a page's JSON-LD graph from its SEO configuration (see
41
+ * `pageSeoConfig`) and the site's identity; a minimal `WebPage` when
42
+ * `@krantho/seo` is not installed. The SEO preview endpoint and
43
+ * server-rendered pages share it.
44
+ *
45
+ * Every URL in the graph is the document's page, so a document whose
46
+ * collection renders no pages gets an empty `@graph`: it has no page for
47
+ * Schema.org entities to describe.
48
+ */
49
+ export declare function composePageJsonLd(input: PageJsonLdInput): Promise<Record<string, unknown>>;
50
+ //# sourceMappingURL=seo-compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-compose.d.ts","sourceRoot":"","sources":["../src/seo-compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAOxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAI/D,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,2FAA2F;IAC3F,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,qEAAqE;IACrE,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IAC9D,0EAA0E;IAC1E,MAAM,EAAE,aAAa,CAAA;IACrB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,eAAe,GAAG,SAAS,CAAA;IACxC,8FAA8F;IAC9F,SAAS,CAAC,EAAE,aAAa,GAAG,SAAS,CAAA;CACtC;AAED,6GAA6G;AAC7G,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,GAAG,IAAI,CAAA;IAC1B,SAAS,EAAE,aAAa,CAAA;CACzB;AAkBD,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnE;AAeD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC,GACvF,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA8BhG"}
@@ -0,0 +1,104 @@
1
+ import { buildSeoFieldMap, documentSeoConfig, documentSeoProperties, resolveSeoField, } from '@krantho/seo-shared';
2
+ import { loadSeoModule } from './seo-loader.js';
3
+ import { isSeoModuleMissing, loadSeo } from './seo-subsystem.js';
4
+ const ROUTE_PREFIX = 'route:';
5
+ /** A URL pattern as a regular expression: `**` stands for any rest of the path, `*` for one segment */
6
+ function routePattern(pattern) {
7
+ const source = pattern
8
+ .split('**')
9
+ .map((part) => part
10
+ .split('*')
11
+ .map((literal) => literal.replace(/[.+?^${}()|[\]\\]/g, '\\$&'))
12
+ .join('[^/]+'))
13
+ .join('.*');
14
+ return new RegExp(`^${source}$`);
15
+ }
16
+ /** Whether a route configuration's URL pattern (`/blog/*`, `/docs/**`) matches a page path */
17
+ export function routeMatches(pattern, path) {
18
+ return routePattern(pattern).test(path);
19
+ }
20
+ /** The configuration of the most specific URL pattern matching the path: the one with the most literal characters */
21
+ async function routeConfig(seoConfigs, path) {
22
+ if (path === null)
23
+ return null;
24
+ const literal = (id) => id.replaceAll('*', '').length;
25
+ const matching = (await seoConfigs.listConfigs('route'))
26
+ .filter((stored) => routeMatches(stored.id.slice(ROUTE_PREFIX.length), path))
27
+ .sort((a, b) => literal(b.id) - literal(a.id));
28
+ return matching[0]?.config ?? null;
29
+ }
30
+ /**
31
+ * The SEO configuration a page composes from: the stored site scope, and the
32
+ * collection, URL-pattern and document scopes resolved into one — or, when
33
+ * nothing is configured for the page, the code-defined article archetype with
34
+ * no site entities. The page's graph and the editor's resolved values both
35
+ * start here. Rejects when `@krantho/seo` is not installed.
36
+ */
37
+ export async function pageSeoConfig(input) {
38
+ const { resolveEffectiveConfig, blogPostArchetype } = await loadSeoModule();
39
+ const [siteRes, colRes, routeRes] = input.seoConfigs
40
+ ? await Promise.all([
41
+ input.seoConfigs.getConfig('site'),
42
+ input.seoConfigs.getConfig(`collection:${input.collection}`),
43
+ routeConfig(input.seoConfigs, input.path),
44
+ ])
45
+ : [null, null, null];
46
+ const site = siteRes?.config ?? null;
47
+ const document = documentSeoConfig(input.metadata ?? {});
48
+ const scopes = [site, colRes?.config, routeRes, document];
49
+ if (scopes.every((scope) => (scope?.entities.length ?? 0) === 0)) {
50
+ const entities = blogPostArchetype.schemas.map((type) => ({ '@type': type, properties: {} }));
51
+ return { site: null, effective: { entities } };
52
+ }
53
+ return {
54
+ site,
55
+ effective: resolveEffectiveConfig({
56
+ collection: colRes?.config ?? null,
57
+ route: routeRes,
58
+ document,
59
+ }),
60
+ };
61
+ }
62
+ /**
63
+ * Compose a page's JSON-LD graph from its SEO configuration (see
64
+ * `pageSeoConfig`) and the site's identity; a minimal `WebPage` when
65
+ * `@krantho/seo` is not installed. The SEO preview endpoint and
66
+ * server-rendered pages share it.
67
+ *
68
+ * Every URL in the graph is the document's page, so a document whose
69
+ * collection renders no pages gets an empty `@graph`: it has no page for
70
+ * Schema.org entities to describe.
71
+ */
72
+ export async function composePageJsonLd(input) {
73
+ const { slug, path, fields, config } = input;
74
+ if (path === null)
75
+ return { '@context': 'https://schema.org', '@graph': [] };
76
+ try {
77
+ const seo = await loadSeo(config);
78
+ const page = await pageSeoConfig(input);
79
+ return {
80
+ ...seo.compose({
81
+ config: page.effective,
82
+ fields: { ...fields, ...documentSeoProperties(input.metadata ?? {}) },
83
+ path,
84
+ siteLevel: page.site,
85
+ ...(input.documentMeta ? { documentMeta: input.documentMeta } : {}),
86
+ structure: input.structure,
87
+ }),
88
+ };
89
+ }
90
+ catch (err) {
91
+ if (!isSeoModuleMissing(err))
92
+ throw err;
93
+ }
94
+ // @krantho/seo not available — minimal JSON-LD using the canonical field resolver.
95
+ const fieldMap = buildSeoFieldMap(Object.keys(fields));
96
+ return {
97
+ '@context': 'https://schema.org',
98
+ '@type': 'WebPage',
99
+ name: resolveSeoField(fieldMap, 'title', fields) || slug,
100
+ description: resolveSeoField(fieldMap, 'description', fields),
101
+ url: `${config.site.baseUrl}${path}`,
102
+ };
103
+ }
104
+ //# sourceMappingURL=seo-compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-compose.js","sourceRoot":"","sources":["../src/seo-compose.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AA2BhE,MAAM,YAAY,GAAG,QAAQ,CAAA;AAE7B,uGAAuG;AACvG,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,MAAM,GAAG,OAAO;SACnB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACZ,IAAI;SACD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;SAC/D,IAAI,CAAC,OAAO,CAAC,CACjB;SACA,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAA;AAClC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAY;IACxD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzC,CAAC;AAED,qHAAqH;AACrH,KAAK,UAAU,WAAW,CACxB,UAA2B,EAC3B,IAAmB;IAEnB,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC9B,MAAM,OAAO,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAA;IACrE,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SACrD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;SAC5E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAChD,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAA;AACpC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAwF;IAExF,MAAM,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,GAAG,MAAM,aAAa,EAAE,CAAA;IAC3E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,UAAU;QAClD,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC;YAClC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,KAAK,CAAC,UAAU,EAAE,CAAC;YAC5D,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC;SAC1C,CAAC;QACJ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACtB,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAA;IACpC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACzD,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC7F,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAA;IAChD,CAAC;IACD,OAAO;QACL,IAAI;QACJ,SAAS,EAAE,sBAAsB,CAAC;YAChC,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI;YAClC,KAAK,EAAE,QAAQ;YACf,QAAQ;SACT,CAAC;KACH,CAAA;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAsB;IAC5D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAC5C,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IAE5E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAA;QACvC,OAAO;YACL,GAAG,GAAG,CAAC,OAAO,CAAC;gBACb,MAAM,EAAE,IAAI,CAAC,SAAS;gBACtB,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;gBACrE,IAAI;gBACJ,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC;SACH,CAAA;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAA;IACzC,CAAC;IAED,mFAAmF;IACnF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACtD,OAAO;QACL,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,IAAI;QACxD,WAAW,EAAE,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC;QAC7D,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE;KACrC,CAAA;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ISeoConfigAdapter } from '@krantho/persistence';
2
+ /** What composing a page's JSON-LD reads from the SEO configuration store */
3
+ export type SeoConfigReader = Pick<ISeoConfigAdapter, 'getConfig' | 'listConfigs'>;
4
+ /**
5
+ * Every stored SEO configuration, read once and answered from memory. A request
6
+ * that composes many pages' graphs (the site's findings) would otherwise read
7
+ * the site, collection, URL-pattern and document scopes again for each page.
8
+ */
9
+ export declare function seoConfigSnapshot(store: ISeoConfigAdapter | undefined): Promise<SeoConfigReader | undefined>;
10
+ //# sourceMappingURL=seo-config-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-config-snapshot.d.ts","sourceRoot":"","sources":["../src/seo-config-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,aAAa,CAAC,CAAA;AAElF;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GACnC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAStC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Every stored SEO configuration, read once and answered from memory. A request
3
+ * that composes many pages' graphs (the site's findings) would otherwise read
4
+ * the site, collection, URL-pattern and document scopes again for each page.
5
+ */
6
+ export async function seoConfigSnapshot(store) {
7
+ if (!store)
8
+ return undefined;
9
+ const configs = await store.listConfigs();
10
+ const byId = new Map(configs.map((stored) => [stored.id, stored]));
11
+ return {
12
+ getConfig: async (id) => byId.get(id) ?? null,
13
+ listConfigs: async (scope) => scope === undefined ? [...configs] : configs.filter((stored) => stored.scope === scope),
14
+ };
15
+ }
16
+ //# sourceMappingURL=seo-config-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-config-snapshot.js","sourceRoot":"","sources":["../src/seo-config-snapshot.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAoC;IAEpC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAA;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IAClE,OAAO;QACL,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI;QAC7C,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAC3B,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;KAC1F,CAAA;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ type SeoModule = typeof import('@krantho/seo');
2
+ /**
3
+ * Lazily load and cache the optional @krantho/seo package. The specifier is a
4
+ * literal the bundler can see, so a build that has the package installed packs
5
+ * it with the server code; a deployment that ships only traced files (Vercel,
6
+ * Next.js standalone output) would otherwise leave it out.
7
+ */
8
+ export declare function loadSeoModule(): Promise<SeoModule>;
9
+ export {};
10
+ //# sourceMappingURL=seo-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-loader.d.ts","sourceRoot":"","sources":["../src/seo-loader.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,cAAc,cAAc,CAAC,CAAA;AAI9C;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,CAIlD"}
@@ -0,0 +1,14 @@
1
+ let cached = null;
2
+ /**
3
+ * Lazily load and cache the optional @krantho/seo package. The specifier is a
4
+ * literal the bundler can see, so a build that has the package installed packs
5
+ * it with the server code; a deployment that ships only traced files (Vercel,
6
+ * Next.js standalone output) would otherwise leave it out.
7
+ */
8
+ export function loadSeoModule() {
9
+ if (cached)
10
+ return cached;
11
+ cached = import('@krantho/seo');
12
+ return cached;
13
+ }
14
+ //# sourceMappingURL=seo-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-loader.js","sourceRoot":"","sources":["../src/seo-loader.ts"],"names":[],"mappings":"AAEA,IAAI,MAAM,GAA8B,IAAI,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAAA;IAC/B,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { loadSeo } from './seo-subsystem.js';
2
+ import type { ApiContext } from './types.js';
3
+ type Seo = Awaited<ReturnType<typeof loadSeo>>;
4
+ /** How many findings of each severity one reader (or the page checks) has */
5
+ export interface FindingCounts {
6
+ errors: number;
7
+ warnings: number;
8
+ info: number;
9
+ }
10
+ /** One published page's SEO: findings counted per reader, and the search features it can appear in */
11
+ export interface PageSeoSummary {
12
+ collection: string;
13
+ slug: string;
14
+ path: string;
15
+ /** Keyed by reader id, `schema.org` for the vocabulary, `page` for the title and meta description */
16
+ readers: Record<string, FindingCounts>;
17
+ features: ReturnType<Seo['features']>;
18
+ }
19
+ /**
20
+ * The SEO of every published page of the site in its default locale — what
21
+ * search engines read: each page's findings per reader and the search
22
+ * features its entities can appear in. Rejects when `@krantho/seo` is not
23
+ * installed.
24
+ */
25
+ export declare function siteSeoSummary(ctx: ApiContext): Promise<PageSeoSummary[]>;
26
+ export {};
27
+ //# sourceMappingURL=seo-site-findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-site-findings.d.ts","sourceRoot":"","sources":["../src/seo-site-findings.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,KAAK,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAA;AAE9C,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,sGAAsG;AACtG,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,qGAAqG;IACrG,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACtC,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;CACtC;AAuDD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAwB/E"}
@@ -0,0 +1,87 @@
1
+ import { documentPath, rendersPages } from '@krantho/core';
2
+ import { canQuery } from '@krantho/persistence';
3
+ import { documentSeoProperties } from '@krantho/seo-shared';
4
+ import { groupByCollection } from './group-by-collection.js';
5
+ import { composePageJsonLd } from './seo-compose.js';
6
+ import { seoConfigSnapshot } from './seo-config-snapshot.js';
7
+ import { loadSeo } from './seo-subsystem.js';
8
+ import { metaFindings, structuredFindings } from './seo-validation.js';
9
+ /** Findings counted by the reader they come from */
10
+ function countByReader(findings) {
11
+ const counts = {};
12
+ for (const finding of findings) {
13
+ const reader = finding.reader ?? 'page';
14
+ counts[reader] ??= { errors: 0, warnings: 0, info: 0 };
15
+ const bucket = counts[reader];
16
+ if (finding.severity === 'error')
17
+ bucket.errors++;
18
+ else if (finding.severity === 'warning')
19
+ bucket.warnings++;
20
+ else
21
+ bucket.info++;
22
+ }
23
+ return counts;
24
+ }
25
+ /** One live page: its graph composed once, validated once */
26
+ async function pageSummary(ctx, seo, seoConfigs, collection, path, doc) {
27
+ const properties = documentSeoProperties(doc.metadata);
28
+ const graph = await composePageJsonLd({
29
+ collection,
30
+ slug: doc.meta.slug,
31
+ path,
32
+ fields: { ...doc.fields, ...documentSeoProperties(doc.metadata) },
33
+ metadata: doc.metadata,
34
+ documentMeta: doc.meta,
35
+ config: ctx.config,
36
+ seoConfigs,
37
+ });
38
+ const findings = [
39
+ ...metaFindings(ctx, {
40
+ ...doc.fields,
41
+ ...properties,
42
+ title: properties['headline'] ?? properties['name'] ?? doc.fields['title'],
43
+ 'meta-description': properties['description'] ?? doc.fields['meta-description'] ?? doc.fields['description'],
44
+ }),
45
+ ...structuredFindings(seo, graph),
46
+ ];
47
+ return {
48
+ collection,
49
+ slug: doc.meta.slug,
50
+ path,
51
+ readers: countByReader(findings),
52
+ features: seo.features(graph),
53
+ };
54
+ }
55
+ /**
56
+ * The SEO of every published page of the site in its default locale — what
57
+ * search engines read: each page's findings per reader and the search
58
+ * features its entities can appear in. Rejects when `@krantho/seo` is not
59
+ * installed.
60
+ */
61
+ export async function siteSeoSummary(ctx) {
62
+ const seo = await loadSeo(ctx.config);
63
+ if (!canQuery(ctx.adapter))
64
+ return [];
65
+ const seoConfigs = await seoConfigSnapshot(ctx.seoConfigAdapter);
66
+ const rendered = [...ctx.contentConfig.collections].filter(([, collection]) => rendersPages(collection));
67
+ if (rendered.length === 0)
68
+ return [];
69
+ const names = rendered.map(([name]) => name);
70
+ const { items } = await ctx.adapter.query({
71
+ state: 'published',
72
+ projection: 'summary',
73
+ collections: names,
74
+ locale: ctx.config.site.defaultLocale,
75
+ });
76
+ const live = groupByCollection(items, names, (doc) => doc.meta.collection);
77
+ const pages = [];
78
+ for (const [name, collection] of rendered) {
79
+ for (const doc of live.get(name) ?? []) {
80
+ const path = documentPath(collection, doc.meta.slug);
81
+ if (path !== null)
82
+ pages.push(await pageSummary(ctx, seo, seoConfigs, name, path, doc));
83
+ }
84
+ }
85
+ return pages;
86
+ }
87
+ //# sourceMappingURL=seo-site-findings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-site-findings.js","sourceRoot":"","sources":["../src/seo-site-findings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { KranthoConfig } from '@krantho/config';
2
+ import { loadSeoModule } from './seo-loader.js';
3
+ type SeoModule = Awaited<ReturnType<typeof loadSeoModule>>;
4
+ type Seo = ReturnType<SeoModule['createSeo']>;
5
+ /**
6
+ * The site's SEO subsystem, created once per configuration instance from its
7
+ * site identity, SEO definitions and readers. Rejects when `@krantho/seo` is
8
+ * not installed, or with its `SeoConfigurationError` when the configuration
9
+ * lacks what the structured data requires.
10
+ */
11
+ export declare function loadSeo(config: KranthoConfig): Promise<Seo>;
12
+ /**
13
+ * Whether an error is `@krantho/seo` itself missing from the installation —
14
+ * Node's "Cannot find package '@krantho/seo'", a bundler's "Cannot find module
15
+ * '@krantho/seo'". A dependency missing inside the package names that
16
+ * dependency instead, and is not mistaken for it.
17
+ */
18
+ export declare function isSeoModuleMissing(err: unknown): boolean;
19
+ /**
20
+ * Create the SEO subsystem when the site starts, so the configuration is
21
+ * checked before anything is served: a value the structured data requires
22
+ * that is missing throws a {@link KranthoConfigError} naming the setting and
23
+ * its environment variable; a recommended one is logged as a warning. A site
24
+ * without `@krantho/seo` has nothing to check.
25
+ */
26
+ export declare function startSeo(config: KranthoConfig): Promise<void>;
27
+ export {};
28
+ //# sourceMappingURL=seo-subsystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-subsystem.d.ts","sourceRoot":"","sources":["../src/seo-subsystem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,KAAK,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAA;AAC1D,KAAK,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAA;AAI7C;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAQ3D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMxD;AASD;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnE"}
@@ -0,0 +1,62 @@
1
+ import { envNameFor, KranthoConfigError, leafByPath } from '@krantho/config';
2
+ import { loadSeoModule } from './seo-loader.js';
3
+ const subsystems = new WeakMap();
4
+ /**
5
+ * The site's SEO subsystem, created once per configuration instance from its
6
+ * site identity, SEO definitions and readers. Rejects when `@krantho/seo` is
7
+ * not installed, or with its `SeoConfigurationError` when the configuration
8
+ * lacks what the structured data requires.
9
+ */
10
+ export function loadSeo(config) {
11
+ let seo = subsystems.get(config);
12
+ if (!seo) {
13
+ seo = loadSeoModule().then((module) => module.createSeo(config));
14
+ seo.catch(() => subsystems.delete(config));
15
+ subsystems.set(config, seo);
16
+ }
17
+ return seo;
18
+ }
19
+ /**
20
+ * Whether an error is `@krantho/seo` itself missing from the installation —
21
+ * Node's "Cannot find package '@krantho/seo'", a bundler's "Cannot find module
22
+ * '@krantho/seo'". A dependency missing inside the package names that
23
+ * dependency instead, and is not mistaken for it.
24
+ */
25
+ export function isSeoModuleMissing(err) {
26
+ return (err instanceof Error &&
27
+ err.message.includes('Cannot find') &&
28
+ err.message.includes("'@krantho/seo'"));
29
+ }
30
+ /** A setting with the environment variable that overrides it, as configuration errors name it */
31
+ function settingLabel(setting) {
32
+ const leaf = leafByPath(setting);
33
+ const env = leaf ? envNameFor(leaf) : null;
34
+ return env ? `${env} (${setting})` : setting;
35
+ }
36
+ /**
37
+ * Create the SEO subsystem when the site starts, so the configuration is
38
+ * checked before anything is served: a value the structured data requires
39
+ * that is missing throws a {@link KranthoConfigError} naming the setting and
40
+ * its environment variable; a recommended one is logged as a warning. A site
41
+ * without `@krantho/seo` has nothing to check.
42
+ */
43
+ export async function startSeo(config) {
44
+ let seo;
45
+ try {
46
+ seo = await loadSeo(config);
47
+ }
48
+ catch (err) {
49
+ if (isSeoModuleMissing(err))
50
+ return;
51
+ const { SeoConfigurationError } = await loadSeoModule();
52
+ if (!(err instanceof SeoConfigurationError))
53
+ throw err;
54
+ throw new KranthoConfigError(err.findings.map((f) => `${settingLabel(f.setting)}: ${f.message}`));
55
+ }
56
+ for (const finding of seo.findings) {
57
+ if (finding.severity !== 'warning')
58
+ continue;
59
+ console.warn(`[krantho] WARNING: ${settingLabel(finding.setting)}: ${finding.message}`);
60
+ }
61
+ }
62
+ //# sourceMappingURL=seo-subsystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-subsystem.js","sourceRoot":"","sources":["../src/seo-subsystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAK/C,MAAM,UAAU,GAAG,IAAI,OAAO,EAA+B,CAAA;AAE7D;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,MAAqB;IAC3C,IAAI,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QAChE,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1C,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,OAAO,CACL,GAAG,YAAY,KAAK;QACpB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;QACnC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CACvC,CAAA;AACH,CAAC;AAED,iGAAiG;AACjG,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1C,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAqB;IAClD,IAAI,GAAwC,CAAA;IAC5C,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,kBAAkB,CAAC,GAAG,CAAC;YAAE,OAAM;QACnC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,aAAa,EAAE,CAAA;QACvD,IAAI,CAAC,CAAC,GAAG,YAAY,qBAAqB,CAAC;YAAE,MAAM,GAAG,CAAA;QACtD,MAAM,IAAI,kBAAkB,CAC1B,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CACpE,CAAA;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,SAAQ;QAC5C,OAAO,CAAC,IAAI,CAAC,sBAAsB,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACzF,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { SeoFinding } from './assistant/protocol.js';
2
+ import { loadSeo } from './seo-subsystem.js';
3
+ import type { ApiContext } from './types.js';
4
+ /** Title and meta description checks, with the limits the site's configuration sets */
5
+ export declare function metaFindings(ctx: ApiContext, fields: Record<string, unknown>): SeoFinding[];
6
+ /** The document a check names does not exist */
7
+ export declare class DocumentNotFoundError extends Error {
8
+ constructor(collection: string, slug: string);
9
+ }
10
+ /**
11
+ * Check a document's current version (the draft the assistant works on) for
12
+ * SEO: its title and meta description against the configured limits, and its
13
+ * composed JSON-LD against the Schema.org vocabulary and each active reader's
14
+ * rules — every structured-data finding names the reader it comes from.
15
+ * Throws a {@link DocumentNotFoundError} when the document does not exist.
16
+ */
17
+ export declare function validateDocumentSeo(ctx: ApiContext, collection: string, slug: string, locale: string | undefined): Promise<SeoFinding[]>;
18
+ /** A graph's structured-data findings, each naming the reader (or Schema.org) it comes from */
19
+ export declare function structuredFindings(seo: Awaited<ReturnType<typeof loadSeo>>, graph: Record<string, unknown>): SeoFinding[];
20
+ //# sourceMappingURL=seo-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-validation.d.ts","sourceRoot":"","sources":["../src/seo-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,EAAsB,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,EAAE,CAuB3F;AAED,gDAAgD;AAChD,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI7C;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,OAAO,CAAC,UAAU,EAAE,CAAC,CAsCvB;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,EACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,UAAU,EAAE,CAWd"}
@@ -0,0 +1,96 @@
1
+ import { documentPath } from '@krantho/core';
2
+ import { canGetContent } from '@krantho/persistence';
3
+ import { buildSeoFieldMap, documentSeoProperties, resolveSeoField } from '@krantho/seo-shared';
4
+ import { composePageJsonLd } from './seo-compose.js';
5
+ import { isSeoModuleMissing, loadSeo } from './seo-subsystem.js';
6
+ /** Title and meta description checks, with the limits the site's configuration sets */
7
+ export function metaFindings(ctx, fields) {
8
+ const findings = [];
9
+ const fieldMap = buildSeoFieldMap(Object.keys(fields));
10
+ const title = resolveSeoField(fieldMap, 'title', fields);
11
+ const titleMax = ctx.config.seo.enrichment.title.maxChars;
12
+ if (!title) {
13
+ findings.push({ severity: 'error', check: 'title', message: 'The document has no title.' });
14
+ }
15
+ else if (title.length > titleMax) {
16
+ const message = `The title is ${title.length} characters; the site's limit is ${titleMax}.`;
17
+ findings.push({ severity: 'warning', check: 'title', message });
18
+ }
19
+ const { minChars, maxChars } = ctx.config.seo.enrichment.meta;
20
+ const description = resolveSeoField(fieldMap, 'description', fields);
21
+ if (!description) {
22
+ const message = 'The document has no meta description.';
23
+ findings.push({ severity: 'error', check: 'meta-description', message });
24
+ }
25
+ else if (description.length < minChars || description.length > maxChars) {
26
+ const message = `The meta description is ${description.length} characters; aim for ${minChars}–${maxChars}.`;
27
+ findings.push({ severity: 'warning', check: 'meta-description', message });
28
+ }
29
+ return findings;
30
+ }
31
+ /** The document a check names does not exist */
32
+ export class DocumentNotFoundError extends Error {
33
+ constructor(collection, slug) {
34
+ super(`Content "${collection}/${slug}" not found`);
35
+ this.name = 'DocumentNotFoundError';
36
+ }
37
+ }
38
+ /**
39
+ * Check a document's current version (the draft the assistant works on) for
40
+ * SEO: its title and meta description against the configured limits, and its
41
+ * composed JSON-LD against the Schema.org vocabulary and each active reader's
42
+ * rules — every structured-data finding names the reader it comes from.
43
+ * Throws a {@link DocumentNotFoundError} when the document does not exist.
44
+ */
45
+ export async function validateDocumentSeo(ctx, collection, slug, locale) {
46
+ const current = canGetContent(ctx.adapter)
47
+ ? await ctx.adapter.getContent(collection, slug, locale)
48
+ : null;
49
+ if (!current || current.meta.locale !== (locale ?? ctx.config.site.defaultLocale))
50
+ throw new DocumentNotFoundError(collection, slug);
51
+ const properties = documentSeoProperties(current.metadata);
52
+ const findings = metaFindings(ctx, {
53
+ ...current.fields,
54
+ ...properties,
55
+ title: properties['headline'] ?? properties['name'] ?? current.fields['title'],
56
+ 'meta-description': properties['description'] ??
57
+ current.fields['meta-description'] ??
58
+ current.fields['description'],
59
+ });
60
+ let seo;
61
+ try {
62
+ seo = await loadSeo(ctx.config);
63
+ }
64
+ catch (err) {
65
+ if (!isSeoModuleMissing(err))
66
+ throw err;
67
+ const message = 'Structured-data checks need the @krantho/seo package.';
68
+ return [...findings, { severity: 'info', check: 'structured-data', message }];
69
+ }
70
+ const collectionDef = ctx.contentConfig.collections.get(collection) ?? { name: collection };
71
+ const graph = await composePageJsonLd({
72
+ collection,
73
+ slug,
74
+ path: documentPath(collectionDef, slug),
75
+ fields: { ...current.fields, ...documentSeoProperties(current.metadata) },
76
+ metadata: current.metadata,
77
+ documentMeta: current.meta,
78
+ config: ctx.config,
79
+ seoConfigs: ctx.seoConfigAdapter,
80
+ });
81
+ return [...findings, ...structuredFindings(seo, graph)];
82
+ }
83
+ /** A graph's structured-data findings, each naming the reader (or Schema.org) it comes from */
84
+ export function structuredFindings(seo, graph) {
85
+ return seo.validate(graph).map((finding) => ({
86
+ severity: finding.severity,
87
+ check: 'structured-data',
88
+ message: finding.message,
89
+ reader: finding.profile,
90
+ code: finding.code,
91
+ type: finding.type,
92
+ property: finding.property,
93
+ source: finding.source,
94
+ }));
95
+ }
96
+ //# sourceMappingURL=seo-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-validation.js","sourceRoot":"","sources":["../src/seo-validation.ts"],"names":[],"mappings":"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"}