@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,14 @@
1
+ import type { ApiContext } from './types.js';
2
+ /** A document field, or its markdown body, that names a media file */
3
+ export interface MediaReference {
4
+ collection: string;
5
+ slug: string;
6
+ field: string;
7
+ }
8
+ /**
9
+ * Where each of the media files is used: every collection is read once, in one
10
+ * query, whatever the number of files asked about. A read that fails fails the
11
+ * answer — an answer of no references is never a guess.
12
+ */
13
+ export declare function mediaReferences(ctx: ApiContext, ids: readonly string[]): Promise<Map<string, MediaReference[]>>;
14
+ //# sourceMappingURL=media-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-references.d.ts","sourceRoot":"","sources":["../src/media-references.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAWD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CASxC"}
@@ -0,0 +1,25 @@
1
+ import { canQuery } from '@krantho/persistence';
2
+ /** The places in one document that name the file: its text fields, then its body */
3
+ function referencesIn(doc, id) {
4
+ const { collection, slug } = doc.meta;
5
+ const fields = Object.entries(doc.fields).flatMap(([field, value]) => typeof value === 'string' && value.includes(id) ? [{ collection, slug, field }] : []);
6
+ return doc.body.includes(id) ? [...fields, { collection, slug, field: 'body' }] : fields;
7
+ }
8
+ /**
9
+ * Where each of the media files is used: every collection is read once, in one
10
+ * query, whatever the number of files asked about. A read that fails fails the
11
+ * answer — an answer of no references is never a guess.
12
+ */
13
+ export async function mediaReferences(ctx, ids) {
14
+ const found = new Map(ids.map((id) => [id, []]));
15
+ const collections = [...ctx.contentConfig.collections.keys()];
16
+ if (ids.length === 0 || collections.length === 0 || !canQuery(ctx.adapter))
17
+ return found;
18
+ const { items } = await ctx.adapter.query({ state: 'current', projection: 'full', collections });
19
+ for (const doc of items) {
20
+ for (const id of ids)
21
+ found.get(id)?.push(...referencesIn(doc, id));
22
+ }
23
+ return found;
24
+ }
25
+ //# sourceMappingURL=media-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-references.js","sourceRoot":"","sources":["../src/media-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAUrE,oFAAoF;AACpF,SAAS,YAAY,CAAC,GAAoB,EAAE,EAAU;IACpD,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CACnE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CACrF,CAAA;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;AAC1F,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAe,EACf,GAAsB;IAEtB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAsB,CAAC,CAAC,CAAC,CAAA;IACpE,MAAM,WAAW,GAAG,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IACxF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IAChG,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,KAAK,MAAM,EAAE,IAAI,GAAG;YAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type IPersistenceAdapter } from '@krantho/persistence';
2
+ import type { Collection } from '@krantho/schema';
3
+ import type { ZodObject, ZodRawShape } from 'zod';
4
+ /**
5
+ * Get the merged schema (code + runtime fields) for validation.
6
+ * Falls back to code-only schema if adapter doesn't support runtime schemas.
7
+ */
8
+ export declare function getMergedSchema(collectionDef: Collection<ZodObject<ZodRawShape>>, adapter: IPersistenceAdapter): Promise<ZodObject<ZodRawShape>>;
9
+ export declare function getActiveContract(collection: Collection, adapter: IPersistenceAdapter): Promise<import('@krantho/persistence').ContentContract>;
10
+ //# sourceMappingURL=merged-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merged-schema.d.ts","sourceRoot":"","sources":["../src/merged-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,KAAK,CAAA;AAEjD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EACjD,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAUjC;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,sBAAsB,EAAE,eAAe,CAAC,CAGzD"}
@@ -0,0 +1,21 @@
1
+ import { hasRuntimeSchema } from '@krantho/persistence';
2
+ import { mergeSchemas, resolveCollectionContract } from '@krantho/schema';
3
+ /**
4
+ * Get the merged schema (code + runtime fields) for validation.
5
+ * Falls back to code-only schema if adapter doesn't support runtime schemas.
6
+ */
7
+ export async function getMergedSchema(collectionDef, adapter) {
8
+ if (!hasRuntimeSchema(adapter))
9
+ return collectionDef.schema;
10
+ const runtimeSchema = await adapter.getRuntimeSchema(collectionDef.name);
11
+ if (!runtimeSchema || runtimeSchema.fields.length === 0) {
12
+ return collectionDef.schema;
13
+ }
14
+ const merged = mergeSchemas(collectionDef.schema, runtimeSchema.fields);
15
+ return merged;
16
+ }
17
+ export async function getActiveContract(collection, adapter) {
18
+ const runtime = hasRuntimeSchema(adapter) ? await adapter.getRuntimeSchema(collection.name) : null;
19
+ return resolveCollectionContract(collection, runtime);
20
+ }
21
+ //# sourceMappingURL=merged-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merged-schema.js","sourceRoot":"","sources":["../src/merged-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA4B,MAAM,sBAAsB,CAAA;AAEjF,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAGzE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAiD,EACjD,OAA4B;IAE5B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAAE,OAAO,aAAa,CAAC,MAAM,CAAA;IAE3D,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACxE,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,aAAa,CAAC,MAAM,CAAA;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACvE,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAsB,EACtB,OAA4B;IAE5B,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAClG,OAAO,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AACvD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AuthSection } from '@krantho/config';
2
+ import type { ApiRequest, ApiResponse, AuthenticatedUser } from '../types.js';
3
+ /** Result of auth check */
4
+ export type AuthResult = {
5
+ isAuthenticated: true;
6
+ user: AuthenticatedUser;
7
+ } | {
8
+ isAuthenticated: false;
9
+ response: ApiResponse;
10
+ };
11
+ /** The token of an `Authorization: Bearer <token>` header, when the request carries one */
12
+ export declare function bearerToken(req: ApiRequest): string | undefined;
13
+ /**
14
+ * Check authentication for a request.
15
+ *
16
+ * In none mode: always passes with anonymous identity.
17
+ * In token/oidc mode: extracts JWT from cookie or Bearer header,
18
+ * verifies signature, checks expiry, and returns user with roles.
19
+ */
20
+ export declare function checkAuth(req: ApiRequest, config: AuthSection): AuthResult;
21
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAIlD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAG7E,2BAA2B;AAC3B,MAAM,MAAM,UAAU,GAClB;IAAE,eAAe,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAClD;IAAE,eAAe,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAA;AAIrD,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAK/D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,UAAU,CAoE1E"}
@@ -0,0 +1,82 @@
1
+ import { accessCookieName } from '../cookies.js';
2
+ import { verifyJwt } from '../jwt.js';
3
+ import { parseCookie } from '../validators.js';
4
+ const WRITE_METHODS = new Set(['POST', 'PUT', 'DELETE', 'PATCH']);
5
+ /** The token of an `Authorization: Bearer <token>` header, when the request carries one */
6
+ export function bearerToken(req) {
7
+ const authHeader = req.headers?.['authorization'] ?? req.headers?.['Authorization'];
8
+ if (!authHeader)
9
+ return undefined;
10
+ const parts = authHeader.split(' ');
11
+ return parts.length === 2 && parts[0] === 'Bearer' ? parts[1] : undefined;
12
+ }
13
+ /**
14
+ * Check authentication for a request.
15
+ *
16
+ * In none mode: always passes with anonymous identity.
17
+ * In token/oidc mode: extracts JWT from cookie or Bearer header,
18
+ * verifies signature, checks expiry, and returns user with roles.
19
+ */
20
+ export function checkAuth(req, config) {
21
+ // No-auth mode: always pass through
22
+ if (config.mode === 'none') {
23
+ return {
24
+ isAuthenticated: true,
25
+ user: {
26
+ id: 'anonymous',
27
+ email: 'anonymous',
28
+ name: 'Anonymous',
29
+ roles: ['admin'],
30
+ mode: 'none',
31
+ },
32
+ };
33
+ }
34
+ // Extract token: cookie first (browser sessions), then Bearer header (API clients)
35
+ let token = parseCookie(req.headers?.['cookie'], accessCookieName(config.session));
36
+ token ||= bearerToken(req);
37
+ const isWrite = WRITE_METHODS.has(req.method.toUpperCase());
38
+ // No token present: reads may be public, writes require auth
39
+ if (!token) {
40
+ if (!isWrite && !config.requireAuthForReads) {
41
+ return {
42
+ isAuthenticated: true,
43
+ user: {
44
+ id: 'anonymous',
45
+ email: 'anonymous',
46
+ name: 'Anonymous',
47
+ roles: ['viewer'],
48
+ mode: config.mode,
49
+ },
50
+ };
51
+ }
52
+ return {
53
+ isAuthenticated: false,
54
+ response: { status: 401, body: { error: 'Authentication required' } },
55
+ };
56
+ }
57
+ // Verify JWT
58
+ if (!config.jwtSecret) {
59
+ return {
60
+ isAuthenticated: false,
61
+ response: { status: 500, body: { error: 'JWT secret not configured' } },
62
+ };
63
+ }
64
+ const result = verifyJwt(token, config.jwtSecret);
65
+ if (!result.valid) {
66
+ return {
67
+ isAuthenticated: false,
68
+ response: { status: 401, body: { error: result.error } },
69
+ };
70
+ }
71
+ return {
72
+ isAuthenticated: true,
73
+ user: {
74
+ id: result.claims.sub,
75
+ email: result.claims.email,
76
+ name: result.claims.name,
77
+ roles: result.claims.roles,
78
+ mode: config.mode,
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { AuthSection } from '@krantho/config';
2
+ /**
3
+ * A pending OIDC sign-in, carried by the browser between the redirect to the
4
+ * provider and the callback.
5
+ *
6
+ * It lives in a short-lived cookie rather than server memory, so the callback
7
+ * succeeds on whichever instance it lands — serverless functions and
8
+ * horizontally scaled servers share nothing between requests. The cookie is
9
+ * encrypted and authenticated (AES-256-GCM, keyed from the resolved signing
10
+ * secret): the browser can neither read the PKCE verifier nor forge a state.
11
+ */
12
+ /** How long a sign-in may take between the redirect and the callback */
13
+ export declare const OIDC_STATE_TTL_SEC = 600;
14
+ /** What the login redirect hands the callback */
15
+ export interface OidcPendingLogin {
16
+ /** CSRF token echoed back by the provider */
17
+ state: string;
18
+ /** PKCE verifier for the token exchange */
19
+ codeVerifier: string;
20
+ /** Must match the `nonce` claim of the ID token */
21
+ nonce: string;
22
+ /** Same-origin path the browser lands on after a successful sign-in */
23
+ returnTo: string;
24
+ }
25
+ /** Encrypt a pending sign-in into a cookie-safe value */
26
+ export declare function sealOidcState(login: OidcPendingLogin, secret: string, now?: number): string;
27
+ /**
28
+ * Decrypt a sealed pending sign-in. Returns null when the value is missing,
29
+ * tampered with, sealed under another secret, or expired.
30
+ */
31
+ export declare function openOidcState(sealed: string | undefined, secret: string, now?: number): OidcPendingLogin | null;
32
+ /** Name of the cookie carrying the pending sign-in */
33
+ export declare function oidcStateCookieName(session: AuthSection['session']): string;
34
+ /**
35
+ * Set-Cookie value for a pending sign-in. Always `SameSite=Lax`, whatever the
36
+ * session cookies use: the callback is a top-level cross-site navigation from
37
+ * the provider, which Lax admits and Strict would drop.
38
+ */
39
+ export declare function oidcStateCookie(sealed: string, auth: AuthSection, headers: Record<string, string> | undefined): string;
40
+ /** Set-Cookie value that clears the pending sign-in */
41
+ export declare function clearOidcStateCookie(auth: AuthSection, headers: Record<string, string> | undefined): string;
42
+ //# sourceMappingURL=oidc-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc-state.d.ts","sourceRoot":"","sources":["../src/oidc-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAGlD;;;;;;;;;GASG;AAEH,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAErC,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAA;IACb,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAA;IACpB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAA;CACjB;AAaD,yDAAyD;AACzD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,MAAmB,GACvB,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,MAAmB,GACvB,gBAAgB,GAAG,IAAI,CAsBzB;AAED,sDAAsD;AACtD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,MAAM,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,MAAM,CAQR;AAED,uDAAuD;AACvD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,MAAM,CAQR"}
@@ -0,0 +1,72 @@
1
+ import { createCipheriv, createDecipheriv, hkdfSync, randomBytes } from 'node:crypto';
2
+ import { buildCookie, isSecureRequest } from './cookies.js';
3
+ /**
4
+ * A pending OIDC sign-in, carried by the browser between the redirect to the
5
+ * provider and the callback.
6
+ *
7
+ * It lives in a short-lived cookie rather than server memory, so the callback
8
+ * succeeds on whichever instance it lands — serverless functions and
9
+ * horizontally scaled servers share nothing between requests. The cookie is
10
+ * encrypted and authenticated (AES-256-GCM, keyed from the resolved signing
11
+ * secret): the browser can neither read the PKCE verifier nor forge a state.
12
+ */
13
+ /** How long a sign-in may take between the redirect and the callback */
14
+ export const OIDC_STATE_TTL_SEC = 600;
15
+ const IV_BYTES = 12;
16
+ const TAG_BYTES = 16;
17
+ function stateKey(secret) {
18
+ return Buffer.from(hkdfSync('sha256', secret, '', 'krantho oidc state', 32));
19
+ }
20
+ /** Encrypt a pending sign-in into a cookie-safe value */
21
+ export function sealOidcState(login, secret, now = Date.now()) {
22
+ const payload = { ...login, expiresAt: now + OIDC_STATE_TTL_SEC * 1000 };
23
+ const iv = randomBytes(IV_BYTES);
24
+ const cipher = createCipheriv('aes-256-gcm', stateKey(secret), iv);
25
+ const ciphertext = Buffer.concat([cipher.update(JSON.stringify(payload), 'utf8'), cipher.final()]);
26
+ return Buffer.concat([iv, cipher.getAuthTag(), ciphertext]).toString('base64url');
27
+ }
28
+ /**
29
+ * Decrypt a sealed pending sign-in. Returns null when the value is missing,
30
+ * tampered with, sealed under another secret, or expired.
31
+ */
32
+ export function openOidcState(sealed, secret, now = Date.now()) {
33
+ if (!sealed)
34
+ return null;
35
+ const raw = Buffer.from(sealed, 'base64url');
36
+ if (raw.length <= IV_BYTES + TAG_BYTES)
37
+ return null;
38
+ let payload;
39
+ try {
40
+ const decipher = createDecipheriv('aes-256-gcm', stateKey(secret), raw.subarray(0, IV_BYTES));
41
+ decipher.setAuthTag(raw.subarray(IV_BYTES, IV_BYTES + TAG_BYTES));
42
+ const plaintext = Buffer.concat([
43
+ decipher.update(raw.subarray(IV_BYTES + TAG_BYTES)),
44
+ decipher.final(),
45
+ ]);
46
+ payload = JSON.parse(plaintext.toString('utf8'));
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ if (typeof payload.expiresAt !== 'number' || payload.expiresAt <= now)
52
+ return null;
53
+ const { state, codeVerifier, nonce, returnTo } = payload;
54
+ return { state, codeVerifier, nonce, returnTo };
55
+ }
56
+ /** Name of the cookie carrying the pending sign-in */
57
+ export function oidcStateCookieName(session) {
58
+ return `${session.cookiePrefix}_oidc`;
59
+ }
60
+ /**
61
+ * Set-Cookie value for a pending sign-in. Always `SameSite=Lax`, whatever the
62
+ * session cookies use: the callback is a top-level cross-site navigation from
63
+ * the provider, which Lax admits and Strict would drop.
64
+ */
65
+ export function oidcStateCookie(sealed, auth, headers) {
66
+ return buildCookie(oidcStateCookieName(auth.session), sealed, OIDC_STATE_TTL_SEC, isSecureRequest(headers, auth), 'lax');
67
+ }
68
+ /** Set-Cookie value that clears the pending sign-in */
69
+ export function clearOidcStateCookie(auth, headers) {
70
+ return buildCookie(oidcStateCookieName(auth.session), '', 0, isSecureRequest(headers, auth), 'lax');
71
+ }
72
+ //# sourceMappingURL=oidc-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc-state.js","sourceRoot":"","sources":["../src/oidc-state.ts"],"names":[],"mappings":"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"}
package/dist/oidc.d.ts ADDED
@@ -0,0 +1,83 @@
1
+ /**
2
+ * OIDC authentication module.
3
+ *
4
+ * Discovery documents and JWKS keys are cached per process — a cold instance
5
+ * simply fetches them again. Nothing a sign-in depends on lives here: the
6
+ * pending state, PKCE verifier and nonce travel in a sealed cookie
7
+ * (`oidc-state.ts`), so login and callback may land on different instances.
8
+ */
9
+ /** OpenID Connect discovery document (subset of fields we use) */
10
+ export interface OidcDiscovery {
11
+ issuer: string;
12
+ authorization_endpoint: string;
13
+ token_endpoint: string;
14
+ jwks_uri: string;
15
+ end_session_endpoint?: string | undefined;
16
+ userinfo_endpoint?: string | undefined;
17
+ }
18
+ /** Fetch and cache the OIDC discovery document */
19
+ export declare function getDiscovery(issuerUrl: string): Promise<OidcDiscovery>;
20
+ /** Clear the discovery cache (for testing) */
21
+ export declare function clearDiscoveryCache(): void;
22
+ /** Clear one key set from the JWKS cache, or all of them (for testing) */
23
+ export declare function clearJwksCache(jwksUri?: string): void;
24
+ /** Decoded ID token claims */
25
+ export interface IdTokenClaims {
26
+ iss: string;
27
+ sub: string;
28
+ aud: string | string[];
29
+ exp: number;
30
+ iat: number;
31
+ nonce?: string | undefined;
32
+ email?: string | undefined;
33
+ email_verified?: boolean | undefined;
34
+ name?: string | undefined;
35
+ picture?: string | undefined;
36
+ }
37
+ /** What an ID token is checked against */
38
+ export interface IdTokenExpectations {
39
+ issuerUrl: string;
40
+ clientId: string;
41
+ jwksUri: string;
42
+ /** The nonce sent on the authorize request */
43
+ nonce: string;
44
+ }
45
+ /**
46
+ * Verify the RS256 signature of a JWT against a JWKS and return its claims.
47
+ *
48
+ * Only RS256 is accepted, so a token signed with a symmetric algorithm (or none)
49
+ * never gets as far as a key. The key is picked by `kid`; an unknown `kid`
50
+ * refetches the key set, for key rotation, at most once a minute per key set. The caller checks the claims.
51
+ */
52
+ export declare function verifySignedJwt(token: string, jwksUri: string): Promise<Record<string, unknown>>;
53
+ /**
54
+ * Verify an OIDC ID token.
55
+ *
56
+ * Checks: signature (RS256 via JWKS), expiry, issuer, audience, nonce.
57
+ * Returns decoded claims on success.
58
+ */
59
+ export declare function verifyIdToken(idToken: string, expected: IdTokenExpectations): Promise<IdTokenClaims>;
60
+ /** Generate a PKCE code verifier (43-128 char random string) */
61
+ export declare function generateCodeVerifier(): string;
62
+ /** Compute S256 code challenge from verifier */
63
+ export declare function computeCodeChallenge(verifier: string): string;
64
+ /** Generate a random state parameter for CSRF protection */
65
+ export declare function generateState(): string;
66
+ /** Generate a random nonce binding the ID token to one sign-in */
67
+ export declare function generateNonce(): string;
68
+ /** The authorization-code grant sent to the token endpoint */
69
+ export interface CodeExchange {
70
+ code: string;
71
+ redirectUri: string;
72
+ clientId: string;
73
+ /** Confidential clients only — sent as `client_secret_post`. Omitted for a public client. */
74
+ clientSecret?: string | undefined;
75
+ codeVerifier: string;
76
+ }
77
+ /** Exchange an authorization code for tokens at the provider's token endpoint */
78
+ export declare function exchangeCode(tokenEndpoint: string, grant: CodeExchange): Promise<{
79
+ access_token: string;
80
+ id_token: string;
81
+ refresh_token?: string;
82
+ }>;
83
+ //# sourceMappingURL=oidc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAIH,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,sBAAsB,EAAE,MAAM,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACvC;AAKD,kDAAkD;AAClD,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiB5E;AAED,8CAA8C;AAC9C,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAyDD,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAQrD;AAID,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B;AAED,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiDlC;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,mBAAmB,GAC5B,OAAO,CAAC,aAAa,CAAC,CA6BxB;AAID,gEAAgE;AAChE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,gDAAgD;AAChD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,kEAAkE;AAClE,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAID,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,iFAAiF;AACjF,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsB7E"}
package/dist/oidc.js ADDED
@@ -0,0 +1,226 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ /** Cached discovery documents with expiry, one per issuer */
3
+ const discoveryCache = new Map();
4
+ /** Fetch and cache the OIDC discovery document */
5
+ export async function getDiscovery(issuerUrl) {
6
+ const now = Date.now();
7
+ const cached = discoveryCache.get(issuerUrl);
8
+ if (cached && cached.expiresAt > now) {
9
+ return cached.doc;
10
+ }
11
+ const url = `${issuerUrl.replace(/\/$/, '')}/.well-known/openid-configuration`;
12
+ const res = await fetch(url);
13
+ if (!res.ok) {
14
+ throw new Error(`OIDC discovery failed: ${res.status} from ${url}`);
15
+ }
16
+ const doc = (await res.json());
17
+ // Cache for 1 hour
18
+ discoveryCache.set(issuerUrl, { doc, expiresAt: now + 3600_000 });
19
+ return doc;
20
+ }
21
+ /** Clear the discovery cache (for testing) */
22
+ export function clearDiscoveryCache() {
23
+ discoveryCache.clear();
24
+ }
25
+ /** Cached JWKS with expiry, one per key set URI */
26
+ const jwksCache = new Map();
27
+ /** Fetch and cache JWKS public keys */
28
+ async function getJwks(jwksUri) {
29
+ const now = Date.now();
30
+ const cached = jwksCache.get(jwksUri);
31
+ if (cached && cached.expiresAt > now) {
32
+ return cached.keys;
33
+ }
34
+ const res = await fetch(jwksUri);
35
+ if (!res.ok) {
36
+ throw new Error(`JWKS fetch failed: ${res.status} from ${jwksUri}`);
37
+ }
38
+ const data = (await res.json());
39
+ // Cache for 1 hour
40
+ jwksCache.set(jwksUri, { keys: data.keys, expiresAt: now + 3600_000 });
41
+ return data.keys;
42
+ }
43
+ /**
44
+ * When each key set was last refetched because a token named a key it did not hold. A token's
45
+ * `kid` is attacker-chosen, so an unknown one may force a refetch only once a minute per key set:
46
+ * rotation is picked up, and a stream of bogus tokens neither reaches the issuer nor evicts the keys.
47
+ */
48
+ const forcedRefetchAt = new Map();
49
+ const FORCED_REFETCH_COOLDOWN_MS = 60_000;
50
+ /** Whether an unknown `kid` may force a refetch of this key set now, recording that it did */
51
+ function mayForceRefetch(jwksUri) {
52
+ const now = Date.now();
53
+ const last = forcedRefetchAt.get(jwksUri);
54
+ if (last !== undefined && now - last < FORCED_REFETCH_COOLDOWN_MS)
55
+ return false;
56
+ forcedRefetchAt.set(jwksUri, now);
57
+ return true;
58
+ }
59
+ /** Clear one key set from the JWKS cache, or all of them (for testing) */
60
+ export function clearJwksCache(jwksUri) {
61
+ if (jwksUri === undefined) {
62
+ jwksCache.clear();
63
+ forcedRefetchAt.clear();
64
+ }
65
+ else {
66
+ jwksCache.delete(jwksUri);
67
+ forcedRefetchAt.delete(jwksUri);
68
+ }
69
+ }
70
+ /**
71
+ * Verify the RS256 signature of a JWT against a JWKS and return its claims.
72
+ *
73
+ * Only RS256 is accepted, so a token signed with a symmetric algorithm (or none)
74
+ * never gets as far as a key. The key is picked by `kid`; an unknown `kid`
75
+ * refetches the key set, for key rotation, at most once a minute per key set. The caller checks the claims.
76
+ */
77
+ export async function verifySignedJwt(token, jwksUri) {
78
+ const parts = token.split('.');
79
+ if (parts.length !== 3) {
80
+ throw new Error('Invalid JWT format');
81
+ }
82
+ const [headerB64, payloadB64, signatureB64] = parts;
83
+ // Decode header to get kid
84
+ const header = JSON.parse(Buffer.from(headerB64, 'base64url').toString());
85
+ if (header?.alg !== 'RS256') {
86
+ throw new Error(`Unsupported algorithm: ${header?.alg}. Only RS256 is supported.`);
87
+ }
88
+ // Fetch JWKS and find matching key
89
+ let keys = await getJwks(jwksUri);
90
+ let key = keys.find((k) => k.kid === header.kid && k.kty === 'RSA');
91
+ // If key not found, fetch the key set again, at most once a minute (key rotation)
92
+ if (!key && mayForceRefetch(jwksUri)) {
93
+ jwksCache.delete(jwksUri);
94
+ keys = await getJwks(jwksUri);
95
+ key = keys.find((k) => k.kid === header.kid && k.kty === 'RSA');
96
+ }
97
+ if (!key) {
98
+ throw new Error(`No matching RSA key found for kid: ${header.kid}`);
99
+ }
100
+ // Verify RS256 signature using Node crypto
101
+ const { createVerify } = await import('node:crypto');
102
+ const pem = jwkToPem(key);
103
+ const verifier = createVerify('RSA-SHA256');
104
+ verifier.update(`${headerB64}.${payloadB64}`);
105
+ const signatureBuffer = Buffer.from(signatureB64, 'base64url');
106
+ if (!verifier.verify(pem, signatureBuffer)) {
107
+ throw new Error('JWT signature verification failed');
108
+ }
109
+ const claims = JSON.parse(Buffer.from(payloadB64, 'base64url').toString());
110
+ if (claims === null || typeof claims !== 'object' || Array.isArray(claims)) {
111
+ throw new Error('Invalid token claims');
112
+ }
113
+ return claims;
114
+ }
115
+ /**
116
+ * Verify an OIDC ID token.
117
+ *
118
+ * Checks: signature (RS256 via JWKS), expiry, issuer, audience, nonce.
119
+ * Returns decoded claims on success.
120
+ */
121
+ export async function verifyIdToken(idToken, expected) {
122
+ const { issuerUrl, clientId, jwksUri } = expected;
123
+ const claims = (await verifySignedJwt(idToken, jwksUri));
124
+ // Validate issuer
125
+ const normalizedIssuer = issuerUrl.replace(/\/$/, '');
126
+ const claimIssuer = claims.iss.replace(/\/$/, '');
127
+ if (claimIssuer !== normalizedIssuer) {
128
+ throw new Error(`Issuer mismatch: expected ${normalizedIssuer}, got ${claimIssuer}`);
129
+ }
130
+ // Validate audience
131
+ const audiences = Array.isArray(claims.aud) ? claims.aud : [claims.aud];
132
+ if (!audiences.includes(clientId)) {
133
+ throw new Error(`Audience mismatch: ${clientId} not in ${audiences.join(', ')}`);
134
+ }
135
+ // Validate expiry
136
+ const now = Math.floor(Date.now() / 1000);
137
+ if (typeof claims.exp !== 'number' || claims.exp <= now) {
138
+ throw new Error('ID token expired');
139
+ }
140
+ // Validate nonce — binds the token to this browser's sign-in
141
+ if (claims.nonce !== expected.nonce) {
142
+ throw new Error('ID token nonce mismatch');
143
+ }
144
+ return claims;
145
+ }
146
+ // --- PKCE ---
147
+ /** Generate a PKCE code verifier (43-128 char random string) */
148
+ export function generateCodeVerifier() {
149
+ return randomBytes(32).toString('base64url');
150
+ }
151
+ /** Compute S256 code challenge from verifier */
152
+ export function computeCodeChallenge(verifier) {
153
+ return createHash('sha256').update(verifier).digest('base64url');
154
+ }
155
+ /** Generate a random state parameter for CSRF protection */
156
+ export function generateState() {
157
+ return randomBytes(16).toString('hex');
158
+ }
159
+ /** Generate a random nonce binding the ID token to one sign-in */
160
+ export function generateNonce() {
161
+ return randomBytes(16).toString('base64url');
162
+ }
163
+ /** Exchange an authorization code for tokens at the provider's token endpoint */
164
+ export async function exchangeCode(tokenEndpoint, grant) {
165
+ const body = new URLSearchParams({
166
+ grant_type: 'authorization_code',
167
+ code: grant.code,
168
+ redirect_uri: grant.redirectUri,
169
+ client_id: grant.clientId,
170
+ code_verifier: grant.codeVerifier,
171
+ });
172
+ if (grant.clientSecret)
173
+ body.set('client_secret', grant.clientSecret);
174
+ const res = await fetch(tokenEndpoint, {
175
+ method: 'POST',
176
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
177
+ body: body.toString(),
178
+ });
179
+ if (!res.ok) {
180
+ const text = await res.text();
181
+ throw new Error(`Token exchange failed: ${res.status} — ${text}`);
182
+ }
183
+ return res.json();
184
+ }
185
+ // --- Helpers ---
186
+ /** Convert a JWK RSA public key to PEM format */
187
+ function jwkToPem(jwk) {
188
+ const n = Buffer.from(jwk.n, 'base64url');
189
+ const e = Buffer.from(jwk.e, 'base64url');
190
+ // Build DER-encoded RSA public key
191
+ const nEncoded = encodeUnsignedInteger(n);
192
+ const eEncoded = encodeUnsignedInteger(e);
193
+ const sequenceContent = Buffer.concat([nEncoded, eEncoded]);
194
+ const rsaPublicKey = encodeSequence(sequenceContent);
195
+ // Wrap in SubjectPublicKeyInfo
196
+ const algorithmOid = Buffer.from([
197
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
198
+ ]);
199
+ const bitString = Buffer.concat([
200
+ Buffer.from([0x03, ...encodeLength(rsaPublicKey.length + 1), 0x00]),
201
+ rsaPublicKey,
202
+ ]);
203
+ const spki = encodeSequence(Buffer.concat([algorithmOid, bitString]));
204
+ const base64 = spki.toString('base64');
205
+ const lines = base64.match(/.{1,64}/g) ?? [];
206
+ return `-----BEGIN PUBLIC KEY-----\n${lines.join('\n')}\n-----END PUBLIC KEY-----`;
207
+ }
208
+ function encodeLength(length) {
209
+ if (length < 128)
210
+ return Buffer.from([length]);
211
+ if (length < 256)
212
+ return Buffer.from([0x81, length]);
213
+ return Buffer.from([0x82, (length >> 8) & 0xff, length & 0xff]);
214
+ }
215
+ function encodeUnsignedInteger(data) {
216
+ if (data.length === 0)
217
+ throw new Error('Cannot encode empty buffer as ASN.1 integer');
218
+ // Add leading zero if high bit is set (to keep it positive)
219
+ const needsPadding = data[0] >= 0x80; // safe: length checked above
220
+ const payload = needsPadding ? Buffer.concat([Buffer.from([0x00]), data]) : data;
221
+ return Buffer.concat([Buffer.from([0x02, ...encodeLength(payload.length)]), payload]);
222
+ }
223
+ function encodeSequence(content) {
224
+ return Buffer.concat([Buffer.from([0x30, ...encodeLength(content.length)]), content]);
225
+ }
226
+ //# sourceMappingURL=oidc.js.map