@heyo-sh/heyo-cms 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -2
  3. package/dist/access/index.d.ts +9 -0
  4. package/dist/access/index.d.ts.map +1 -0
  5. package/dist/access/permissions.d.ts +54 -0
  6. package/dist/access/permissions.d.ts.map +1 -0
  7. package/dist/adapters/astro.d.ts +38 -0
  8. package/dist/adapters/astro.d.ts.map +1 -0
  9. package/dist/adapters/astro.js +1 -0
  10. package/dist/adapters/next.d.ts +31 -0
  11. package/dist/adapters/next.d.ts.map +1 -0
  12. package/dist/adapters/next.js +1 -0
  13. package/dist/adapters/nuxt.d.ts +47 -0
  14. package/dist/adapters/nuxt.d.ts.map +1 -0
  15. package/dist/adapters/nuxt.js +1 -0
  16. package/dist/adapters/react-router.d.ts +29 -0
  17. package/dist/adapters/react-router.d.ts.map +1 -0
  18. package/dist/adapters/react-router.js +1 -0
  19. package/dist/adapters/sveltekit.d.ts +37 -0
  20. package/dist/adapters/sveltekit.d.ts.map +1 -0
  21. package/dist/adapters/sveltekit.js +1 -0
  22. package/dist/ai/assistant/context.d.ts +64 -0
  23. package/dist/ai/assistant/context.d.ts.map +1 -0
  24. package/dist/ai/assistant/limits.d.ts +10 -0
  25. package/dist/ai/assistant/limits.d.ts.map +1 -0
  26. package/dist/ai/assistant/plans.d.ts +83 -0
  27. package/dist/ai/assistant/plans.d.ts.map +1 -0
  28. package/dist/ai/assistant/prompt.d.ts +22 -0
  29. package/dist/ai/assistant/prompt.d.ts.map +1 -0
  30. package/dist/ai/assistant/run.d.ts +59 -0
  31. package/dist/ai/assistant/run.d.ts.map +1 -0
  32. package/dist/ai/assistant/runtime.d.ts +35 -0
  33. package/dist/ai/assistant/runtime.d.ts.map +1 -0
  34. package/dist/ai/assistant/schema.d.ts +66 -0
  35. package/dist/ai/assistant/schema.d.ts.map +1 -0
  36. package/dist/ai/assistant/tools.d.ts +41 -0
  37. package/dist/ai/assistant/tools.d.ts.map +1 -0
  38. package/dist/ai/assistant/values.d.ts +33 -0
  39. package/dist/ai/assistant/values.d.ts.map +1 -0
  40. package/dist/ai/crypto.d.ts +12 -0
  41. package/dist/ai/crypto.d.ts.map +1 -0
  42. package/dist/ai/index.d.ts +19 -0
  43. package/dist/ai/index.d.ts.map +1 -0
  44. package/dist/ai/pi.d.ts +89 -0
  45. package/dist/ai/pi.d.ts.map +1 -0
  46. package/dist/ai/registry.d.ts +66 -0
  47. package/dist/ai/registry.d.ts.map +1 -0
  48. package/dist/ai/service.d.ts +31 -0
  49. package/dist/ai/service.d.ts.map +1 -0
  50. package/dist/ai/variant-translation.d.ts +6 -0
  51. package/dist/ai/variant-translation.d.ts.map +1 -0
  52. package/dist/ai.d.ts +12 -0
  53. package/dist/ai.d.ts.map +1 -0
  54. package/dist/ai.js +1 -0
  55. package/dist/auth/config.d.ts +65 -0
  56. package/dist/auth/config.d.ts.map +1 -0
  57. package/dist/auth/crypto.d.ts +44 -0
  58. package/dist/auth/crypto.d.ts.map +1 -0
  59. package/dist/auth/index.d.ts +15 -0
  60. package/dist/auth/index.d.ts.map +1 -0
  61. package/dist/auth/oauth.d.ts +93 -0
  62. package/dist/auth/oauth.d.ts.map +1 -0
  63. package/dist/auth/service.d.ts +38 -0
  64. package/dist/auth/service.d.ts.map +1 -0
  65. package/dist/auth/totp.d.ts +34 -0
  66. package/dist/auth/totp.d.ts.map +1 -0
  67. package/dist/auth.d.ts +9 -0
  68. package/dist/auth.d.ts.map +1 -0
  69. package/dist/auth.js +1 -0
  70. package/dist/cli.d.ts +3 -0
  71. package/dist/cli.d.ts.map +1 -0
  72. package/dist/cli.js +30 -0
  73. package/dist/client/index.d.ts +51 -0
  74. package/dist/client/index.d.ts.map +1 -0
  75. package/dist/client/types.d.ts +340 -0
  76. package/dist/client/types.d.ts.map +1 -0
  77. package/dist/client.d.ts +46 -0
  78. package/dist/client.d.ts.map +1 -0
  79. package/dist/client.js +1 -0
  80. package/dist/config.d.ts +31 -0
  81. package/dist/config.d.ts.map +1 -0
  82. package/dist/config.js +1 -0
  83. package/dist/content/export.d.ts +28 -0
  84. package/dist/content/export.d.ts.map +1 -0
  85. package/dist/content/import.d.ts +65 -0
  86. package/dist/content/import.d.ts.map +1 -0
  87. package/dist/content/records.d.ts +73 -0
  88. package/dist/content/records.d.ts.map +1 -0
  89. package/dist/content.d.ts +12 -0
  90. package/dist/content.d.ts.map +1 -0
  91. package/dist/content.js +1 -0
  92. package/dist/db/d1.d.ts +29 -0
  93. package/dist/db/d1.d.ts.map +1 -0
  94. package/dist/db/d1.js +1 -0
  95. package/dist/db/mongodb.d.ts +128 -0
  96. package/dist/db/mongodb.d.ts.map +1 -0
  97. package/dist/db/mongodb.js +2 -0
  98. package/dist/db/postgres.d.ts +37 -0
  99. package/dist/db/postgres.d.ts.map +1 -0
  100. package/dist/db/postgres.js +1 -0
  101. package/dist/db/sql/adapter.d.ts +57 -0
  102. package/dist/db/sql/adapter.d.ts.map +1 -0
  103. package/dist/db/sql/compile.d.ts +50 -0
  104. package/dist/db/sql/compile.d.ts.map +1 -0
  105. package/dist/db/sql/ddl.d.ts +34 -0
  106. package/dist/db/sql/ddl.d.ts.map +1 -0
  107. package/dist/db/sql/dialect.d.ts +35 -0
  108. package/dist/db/sql/dialect.d.ts.map +1 -0
  109. package/dist/db/sql/driver.d.ts +34 -0
  110. package/dist/db/sql/driver.d.ts.map +1 -0
  111. package/dist/db/sql/introspect.d.ts +15 -0
  112. package/dist/db/sql/introspect.d.ts.map +1 -0
  113. package/dist/db/sqlite.d.ts +39 -0
  114. package/dist/db/sqlite.d.ts.map +1 -0
  115. package/dist/db/sqlite.js +1 -0
  116. package/dist/defaults.d.ts +5 -0
  117. package/dist/defaults.d.ts.map +1 -0
  118. package/dist/duration.d.ts +12 -0
  119. package/dist/duration.d.ts.map +1 -0
  120. package/dist/editor/builtin.d.ts +45 -0
  121. package/dist/editor/builtin.d.ts.map +1 -0
  122. package/dist/editor/index.d.ts +14 -0
  123. package/dist/editor/index.d.ts.map +1 -0
  124. package/dist/editor/markdown.d.ts +19 -0
  125. package/dist/editor/markdown.d.ts.map +1 -0
  126. package/dist/editor/registry.d.ts +30 -0
  127. package/dist/editor/registry.d.ts.map +1 -0
  128. package/dist/editor/serialize.d.ts +41 -0
  129. package/dist/editor/serialize.d.ts.map +1 -0
  130. package/dist/editor.d.ts +10 -0
  131. package/dist/editor.d.ts.map +1 -0
  132. package/dist/editor.js +1 -0
  133. package/dist/engine/access.d.ts +33 -0
  134. package/dist/engine/access.d.ts.map +1 -0
  135. package/dist/engine/activity.d.ts +16 -0
  136. package/dist/engine/activity.d.ts.map +1 -0
  137. package/dist/engine/cursor.d.ts +19 -0
  138. package/dist/engine/cursor.d.ts.map +1 -0
  139. package/dist/engine/documents.d.ts +81 -0
  140. package/dist/engine/documents.d.ts.map +1 -0
  141. package/dist/engine/engine.d.ts +276 -0
  142. package/dist/engine/engine.d.ts.map +1 -0
  143. package/dist/engine/field-access.d.ts +21 -0
  144. package/dist/engine/field-access.d.ts.map +1 -0
  145. package/dist/engine/hooks.d.ts +58 -0
  146. package/dist/engine/hooks.d.ts.map +1 -0
  147. package/dist/engine/index.d.ts +20 -0
  148. package/dist/engine/index.d.ts.map +1 -0
  149. package/dist/engine/jobs.d.ts +63 -0
  150. package/dist/engine/jobs.d.ts.map +1 -0
  151. package/dist/engine/locales.d.ts +40 -0
  152. package/dist/engine/locales.d.ts.map +1 -0
  153. package/dist/engine/outbox.d.ts +81 -0
  154. package/dist/engine/outbox.d.ts.map +1 -0
  155. package/dist/engine/relations.d.ts +60 -0
  156. package/dist/engine/relations.d.ts.map +1 -0
  157. package/dist/engine/scoped-db.d.ts +13 -0
  158. package/dist/engine/scoped-db.d.ts.map +1 -0
  159. package/dist/engine/trash.d.ts +25 -0
  160. package/dist/engine/trash.d.ts.map +1 -0
  161. package/dist/errors.d.ts +42 -0
  162. package/dist/errors.d.ts.map +1 -0
  163. package/dist/fields/builtin.d.ts +142 -0
  164. package/dist/fields/builtin.d.ts.map +1 -0
  165. package/dist/fields/index.d.ts +3 -0
  166. package/dist/fields/index.d.ts.map +1 -0
  167. package/dist/fields/registry.d.ts +35 -0
  168. package/dist/fields/registry.d.ts.map +1 -0
  169. package/dist/fields.d.ts +8 -0
  170. package/dist/fields.d.ts.map +1 -0
  171. package/dist/fields.js +1 -0
  172. package/dist/http/guard.d.ts +45 -0
  173. package/dist/http/guard.d.ts.map +1 -0
  174. package/dist/http/handler.d.ts +31 -0
  175. package/dist/http/handler.d.ts.map +1 -0
  176. package/dist/http/index.d.ts +13 -0
  177. package/dist/http/index.d.ts.map +1 -0
  178. package/dist/http/openapi.d.ts +5 -0
  179. package/dist/http/openapi.d.ts.map +1 -0
  180. package/dist/http/params.d.ts +32 -0
  181. package/dist/http/params.d.ts.map +1 -0
  182. package/dist/http/request-db.d.ts +19 -0
  183. package/dist/http/request-db.d.ts.map +1 -0
  184. package/dist/http/respond.d.ts +48 -0
  185. package/dist/http/respond.d.ts.map +1 -0
  186. package/dist/http/rich-text.d.ts +30 -0
  187. package/dist/http/rich-text.d.ts.map +1 -0
  188. package/dist/http/router.d.ts +55 -0
  189. package/dist/http/router.d.ts.map +1 -0
  190. package/dist/http/routes/access.d.ts +13 -0
  191. package/dist/http/routes/access.d.ts.map +1 -0
  192. package/dist/http/routes/admin.d.ts +28 -0
  193. package/dist/http/routes/admin.d.ts.map +1 -0
  194. package/dist/http/routes/ai.d.ts +26 -0
  195. package/dist/http/routes/ai.d.ts.map +1 -0
  196. package/dist/http/routes/auth.d.ts +13 -0
  197. package/dist/http/routes/auth.d.ts.map +1 -0
  198. package/dist/http/routes/documents.d.ts +24 -0
  199. package/dist/http/routes/documents.d.ts.map +1 -0
  200. package/dist/http/routes/generate.d.ts +5 -0
  201. package/dist/http/routes/generate.d.ts.map +1 -0
  202. package/dist/http/routes/media.d.ts +28 -0
  203. package/dist/http/routes/media.d.ts.map +1 -0
  204. package/dist/http/routes/panel.d.ts +20 -0
  205. package/dist/http/routes/panel.d.ts.map +1 -0
  206. package/dist/http/routes/system.d.ts +25 -0
  207. package/dist/http/routes/system.d.ts.map +1 -0
  208. package/dist/http/routes/webhooks.d.ts +17 -0
  209. package/dist/http/routes/webhooks.d.ts.map +1 -0
  210. package/dist/http/spec.d.ts +28 -0
  211. package/dist/http/spec.d.ts.map +1 -0
  212. package/dist/http.d.ts +17 -0
  213. package/dist/http.d.ts.map +1 -0
  214. package/dist/http.js +1 -0
  215. package/dist/i18n/index.d.ts +12 -0
  216. package/dist/i18n/index.d.ts.map +1 -0
  217. package/dist/i18n/names.d.ts +25 -0
  218. package/dist/i18n/names.d.ts.map +1 -0
  219. package/dist/ids.d.ts +28 -0
  220. package/dist/ids.d.ts.map +1 -0
  221. package/dist/index-2757kej5.js +2 -0
  222. package/dist/index-2kb5nbxx.js +2 -0
  223. package/dist/index-2z1qe5mw.js +2 -0
  224. package/dist/index-34s342fz.js +2 -0
  225. package/dist/index-5ngtc7gy.js +2 -0
  226. package/dist/index-7a231xfp.js +2 -0
  227. package/dist/index-7k091gpe.js +2 -0
  228. package/dist/index-9g2n7xa6.js +2 -0
  229. package/dist/index-9x1z3b85.js +5 -0
  230. package/dist/index-9zqnf6gx.js +23 -0
  231. package/dist/index-b2ecggck.js +26 -0
  232. package/dist/index-cbwwtcm4.js +2 -0
  233. package/dist/index-ebtj6ebd.js +0 -0
  234. package/dist/index-g4crf47y.js +0 -0
  235. package/dist/index-gpwcmmvr.js +2 -0
  236. package/dist/index-hq05mc1n.js +3 -0
  237. package/dist/index-hy1x46nf.js +2 -0
  238. package/dist/index-k8wbg1dw.js +2 -0
  239. package/dist/index-kbsgt44t.js +2 -0
  240. package/dist/index-m82a0shw.js +2 -0
  241. package/dist/index-md79xr6h.js +5 -0
  242. package/dist/index-nvgwyykk.js +40 -0
  243. package/dist/index-ty698y02.js +2 -0
  244. package/dist/index-vq2978e7.js +14 -0
  245. package/dist/index-vxw0a03g.js +2 -0
  246. package/dist/index-wj8y1xcj.js +2 -0
  247. package/dist/index-x72d1hzh.js +2 -0
  248. package/dist/index-y5mwknr9.js +2 -0
  249. package/dist/index-ymq6jsar.js +2 -0
  250. package/dist/index.d.ts +25 -0
  251. package/dist/index.d.ts.map +1 -0
  252. package/dist/index.js +1 -0
  253. package/dist/jobs/runner.d.ts +77 -0
  254. package/dist/jobs/runner.d.ts.map +1 -0
  255. package/dist/jobs.d.ts +11 -0
  256. package/dist/jobs.d.ts.map +1 -0
  257. package/dist/jobs.js +1 -0
  258. package/dist/media/document.d.ts +28 -0
  259. package/dist/media/document.d.ts.map +1 -0
  260. package/dist/media/gc.d.ts +46 -0
  261. package/dist/media/gc.d.ts.map +1 -0
  262. package/dist/media/index.d.ts +20 -0
  263. package/dist/media/index.d.ts.map +1 -0
  264. package/dist/media/pipeline.d.ts +36 -0
  265. package/dist/media/pipeline.d.ts.map +1 -0
  266. package/dist/media/probe.d.ts +6 -0
  267. package/dist/media/probe.d.ts.map +1 -0
  268. package/dist/media/service.d.ts +26 -0
  269. package/dist/media/service.d.ts.map +1 -0
  270. package/dist/media/sharp.d.ts +28 -0
  271. package/dist/media/sharp.d.ts.map +1 -0
  272. package/dist/media/strip.d.ts +16 -0
  273. package/dist/media/strip.d.ts.map +1 -0
  274. package/dist/media/usages.d.ts +69 -0
  275. package/dist/media/usages.d.ts.map +1 -0
  276. package/dist/media/variants.d.ts +50 -0
  277. package/dist/media/variants.d.ts.map +1 -0
  278. package/dist/migrations.d.ts +115 -0
  279. package/dist/migrations.d.ts.map +1 -0
  280. package/dist/migrations.js +1 -0
  281. package/dist/panel.d.ts +31 -0
  282. package/dist/panel.d.ts.map +1 -0
  283. package/dist/query.d.ts +40 -0
  284. package/dist/query.d.ts.map +1 -0
  285. package/dist/query.js +1 -0
  286. package/dist/run-3r72dwhs.js +6 -0
  287. package/dist/schema/describe.d.ts +19 -0
  288. package/dist/schema/describe.d.ts.map +1 -0
  289. package/dist/schema/index.d.ts +5 -0
  290. package/dist/schema/index.d.ts.map +1 -0
  291. package/dist/schema/plan.d.ts +20 -0
  292. package/dist/schema/plan.d.ts.map +1 -0
  293. package/dist/schema/snapshot.d.ts +22 -0
  294. package/dist/schema/snapshot.d.ts.map +1 -0
  295. package/dist/schema/system.d.ts +22 -0
  296. package/dist/schema/system.d.ts.map +1 -0
  297. package/dist/schema.d.ts +7 -0
  298. package/dist/schema.d.ts.map +1 -0
  299. package/dist/schema.js +1 -0
  300. package/dist/storage/bytes.d.ts +17 -0
  301. package/dist/storage/bytes.d.ts.map +1 -0
  302. package/dist/storage/http.d.ts +43 -0
  303. package/dist/storage/http.d.ts.map +1 -0
  304. package/dist/storage/local.d.ts +31 -0
  305. package/dist/storage/local.d.ts.map +1 -0
  306. package/dist/storage/providers.d.ts +95 -0
  307. package/dist/storage/providers.d.ts.map +1 -0
  308. package/dist/storage/sign.d.ts +53 -0
  309. package/dist/storage/sign.d.ts.map +1 -0
  310. package/dist/strings.d.ts +13 -0
  311. package/dist/strings.d.ts.map +1 -0
  312. package/dist/telemetry.d.ts +137 -0
  313. package/dist/telemetry.d.ts.map +1 -0
  314. package/dist/telemetry.js +1 -0
  315. package/dist/types/activity.d.ts +68 -0
  316. package/dist/types/activity.d.ts.map +1 -0
  317. package/dist/types/actor.d.ts +26 -0
  318. package/dist/types/actor.d.ts.map +1 -0
  319. package/dist/types/ai.d.ts +357 -0
  320. package/dist/types/ai.d.ts.map +1 -0
  321. package/dist/types/api.d.ts +212 -0
  322. package/dist/types/api.d.ts.map +1 -0
  323. package/dist/types/auth.d.ts +310 -0
  324. package/dist/types/auth.d.ts.map +1 -0
  325. package/dist/types/config.d.ts +632 -0
  326. package/dist/types/config.d.ts.map +1 -0
  327. package/dist/types/database.d.ts +75 -0
  328. package/dist/types/database.d.ts.map +1 -0
  329. package/dist/types/editor.d.ts +140 -0
  330. package/dist/types/editor.d.ts.map +1 -0
  331. package/dist/types/events.d.ts +72 -0
  332. package/dist/types/events.d.ts.map +1 -0
  333. package/dist/types/fields.d.ts +142 -0
  334. package/dist/types/fields.d.ts.map +1 -0
  335. package/dist/types/hooks.d.ts +142 -0
  336. package/dist/types/hooks.d.ts.map +1 -0
  337. package/dist/types/index.d.ts +25 -0
  338. package/dist/types/index.d.ts.map +1 -0
  339. package/dist/types/instance.d.ts +263 -0
  340. package/dist/types/instance.d.ts.map +1 -0
  341. package/dist/types/jobs.d.ts +78 -0
  342. package/dist/types/jobs.d.ts.map +1 -0
  343. package/dist/types/json.d.ts +24 -0
  344. package/dist/types/json.d.ts.map +1 -0
  345. package/dist/types/locales.d.ts +30 -0
  346. package/dist/types/locales.d.ts.map +1 -0
  347. package/dist/types/media.d.ts +245 -0
  348. package/dist/types/media.d.ts.map +1 -0
  349. package/dist/types/panel.d.ts +249 -0
  350. package/dist/types/panel.d.ts.map +1 -0
  351. package/dist/types/plugin.d.ts +172 -0
  352. package/dist/types/plugin.d.ts.map +1 -0
  353. package/dist/types/query.d.ts +101 -0
  354. package/dist/types/query.d.ts.map +1 -0
  355. package/dist/types/schema.d.ts +203 -0
  356. package/dist/types/schema.d.ts.map +1 -0
  357. package/dist/types/storage.d.ts +61 -0
  358. package/dist/types/storage.d.ts.map +1 -0
  359. package/dist/types/telemetry.d.ts +14 -0
  360. package/dist/types/telemetry.d.ts.map +1 -0
  361. package/dist/types/trash.d.ts +42 -0
  362. package/dist/types/trash.d.ts.map +1 -0
  363. package/dist/types/webhooks.d.ts +133 -0
  364. package/dist/types/webhooks.d.ts.map +1 -0
  365. package/dist/types.d.ts +8 -0
  366. package/dist/types.d.ts.map +1 -0
  367. package/dist/types.js +1 -0
  368. package/dist/uploads.d.ts +21 -0
  369. package/dist/uploads.d.ts.map +1 -0
  370. package/dist/uploads.js +9 -0
  371. package/dist/webhooks/index.d.ts +10 -0
  372. package/dist/webhooks/index.d.ts.map +1 -0
  373. package/dist/webhooks/job.d.ts +17 -0
  374. package/dist/webhooks/job.d.ts.map +1 -0
  375. package/dist/webhooks/service.d.ts +53 -0
  376. package/dist/webhooks/service.d.ts.map +1 -0
  377. package/dist/webhooks/sign.d.ts +26 -0
  378. package/dist/webhooks/sign.d.ts.map +1 -0
  379. package/dist/webhooks.d.ts +10 -0
  380. package/dist/webhooks.d.ts.map +1 -0
  381. package/dist/webhooks.js +1 -0
  382. package/package.json +183 -4
@@ -0,0 +1,2 @@
1
+ import{s,k,t,U,te,u}from"./index-vxw0a03g.js";import{so,Ge,Ct,Tt,c,p}from"./index-2z1qe5mw.js";import{ke,nn,he,Q,io}from"./index-kbsgt44t.js";import{b}from"./index-cbwwtcm4.js";import{O}from"./index-m82a0shw.js";import{w}from"./index-2kb5nbxx.js";import{e}from"./index-x72d1hzh.js";var Dn={github:{id:"github",endpoints:{authorization:"https://github.com/login/oauth/authorize",token:"https://github.com/login/oauth/access_token",userinfo:"https://api.github.com/user"},scope:"read:user user:email",pkce:!1,async profile(l,m){let f=await we(m,"https://api.github.com/user",l.accessToken),g=typeof f.email==="string"?f.email:await Me(m,l.accessToken);return{id:String(f.id??""),email:g,name:q(f.name)??q(f.login),avatarUrl:q(f.avatar_url),claims:f}}},google:{id:"google",endpoints:{authorization:"https://accounts.google.com/o/oauth2/v2/auth",token:"https://oauth2.googleapis.com/token",userinfo:"https://openidconnect.googleapis.com/v1/userinfo"},scope:"openid email profile",pkce:!0,async profile(l,m){let f=l.idToken?kt(l.idToken):await we(m,"https://openidconnect.googleapis.com/v1/userinfo",l.accessToken);return Z(f)}},microsoft:{id:"microsoft",endpoints:{authorization:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",token:"https://login.microsoftonline.com/common/oauth2/v2.0/token",userinfo:"https://graph.microsoft.com/oidc/userinfo"},scope:"openid email profile",pkce:!0,async profile(l,m){let f=l.idToken?kt(l.idToken):await we(m,"https://graph.microsoft.com/oidc/userinfo",l.accessToken);return Z(f)}}};function Z(l){return{id:String(l.sub??""),email:q(l.email),name:q(l.name)??q(l.preferred_username),avatarUrl:q(l.picture),claims:l}}function kt(l){let m=l.split(".")[1];if(!m)return{};let f=m.replaceAll("-","+").replaceAll("_","/");try{let g=atob(f.padEnd(Math.ceil(f.length/4)*4,"=")),A=Uint8Array.from(g,(v)=>v.charCodeAt(0));return JSON.parse(new TextDecoder().decode(A))}catch{return{}}}var pe=new Map;function Ce(l,m){let f=`${O(l)}/.well-known/openid-configuration`,g=pe.get(f);if(g)return g;let A=(async()=>{let v=await m(f,{headers:{accept:"application/json"}});if(!v.ok)throw new e(`OIDC discovery failed for ${l} (${v.status})`,{status:502,code:"oidc_discovery_failed"});let P=await v.json();return{authorization:String(P.authorization_endpoint??""),token:String(P.token_endpoint??""),...typeof P.userinfo_endpoint==="string"?{userinfo:P.userinfo_endpoint}:{}}})();return pe.set(f,A),A.catch(()=>pe.delete(f)),A}function Ue(l){let m=new URL(l.endpoints.authorization);if(m.searchParams.set("response_type","code"),m.searchParams.set("client_id",l.clientId),m.searchParams.set("redirect_uri",l.redirectUri),m.searchParams.set("scope",l.scope),m.searchParams.set("state",l.state),l.codeChallenge)m.searchParams.set("code_challenge",l.codeChallenge),m.searchParams.set("code_challenge_method","S256");for(let[f,g]of Object.entries(l.extra??{}))m.searchParams.set(f,g);return m.toString()}async function Oe(l){return{verifier:l,challenge:await io(l)}}async function xe(l){let m=new URLSearchParams({grant_type:"authorization_code",code:l.code,redirect_uri:l.redirectUri,client_id:l.clientId,client_secret:l.clientSecret});if(l.codeVerifier)m.set("code_verifier",l.codeVerifier);let f=await l.fetchImpl(l.endpoints.token,{method:"POST",headers:{accept:"application/json","content-type":"application/x-www-form-urlencoded"},body:m.toString()}),g=await f.json().catch(()=>({}));if(!f.ok||typeof g.access_token!=="string"){let A=q(g.error_description)??q(g.error)??`HTTP ${f.status}`;throw new e(`OAuth token exchange failed: ${A}`,{status:401,code:"oauth_exchange_failed"})}return{accessToken:g.access_token,...typeof g.id_token==="string"?{idToken:g.id_token}:{},...typeof g.token_type==="string"?{tokenType:g.token_type}:{}}}async function we(l,m,f){let g=await l(m,{headers:{authorization:`Bearer ${f}`,accept:"application/json","user-agent":"heyo-cms"}});if(!g.ok)throw new e(`OAuth profile request failed (${g.status})`,{status:502,code:"oauth_profile_failed"});return await g.json()}async function Me(l,m){let f=await l("https://api.github.com/user/emails",{headers:{authorization:`Bearer ${m}`,accept:"application/json","user-agent":"heyo-cms"}});if(!f.ok)return null;let g=await f.json();return(g.find((v)=>v.primary&&v.verified)??g.find((v)=>v.verified))?.email??null}function q(l){return typeof l==="string"&&l.length>0?l:null}function Mn(){return qe(crypto.getRandomValues(new Uint8Array(20)))}function qn(l){let m=`${encodeURIComponent(l.issuer)}:${encodeURIComponent(l.account)}`,f=new URLSearchParams({secret:l.secret,issuer:l.issuer,algorithm:"SHA1",digits:String(6),period:String(30)});return`otpauth://totp/${m}?${f.toString()}`}async function Wo(l,m=Date.now()){return De(l,Math.floor(m/1000/30))}async function Xt(l,m,f={}){if(!l)return!1;let g=m.replaceAll(/\s/g,"");if(!/^\d{6}$/.test(g))return!1;let A=Math.floor((f.at??Date.now())/1000/30),v=f.window??1;for(let P=-v;P<=v;P+=1){let C=await De(l,A+P),x=0;for(let F=0;F<C.length;F+=1)x|=C.charCodeAt(F)^g.charCodeAt(F);if(x===0)return!0}return!1}async function De(l,m){let f=await crypto.subtle.importKey("raw",Ne(l),{name:"HMAC",hash:"SHA-1"},!1,["sign"]),g=new Uint8Array(8),A=m;for(let x=7;x>=0;x-=1)g[x]=A&255,A=Math.floor(A/256);let v=new Uint8Array(await crypto.subtle.sign("HMAC",f,g)),P=(v[v.length-1]??0)&15,C=((v[P]??0)&127)<<24|((v[P+1]??0)&255)<<16|((v[P+2]??0)&255)<<8|(v[P+3]??0)&255;return String(C%1e6).padStart(6,"0")}function qe(l){let m=0,f=0,g="";for(let A of l){f=f<<8|A,m+=8;while(m>=5)g+="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"[f>>>m-5&31],m-=5}if(m>0)g+="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"[f<<5-m&31];return g}function Ne(l){let m=l.replaceAll("=","").replaceAll(/\s/g,"").toUpperCase(),f=[],g=0,A=0;for(let v of m){let P="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".indexOf(v);if(P===-1)continue;if(A=A<<5|P,g+=5,g>=8)f.push(A>>>g-8&255),g-=8}return new Uint8Array(f)}var T="cms_users",L="cms_sessions",N="cms_tokens",ge="cms_accounts",V="cms_api_keys",J="cms_roles",fe="heyo_cms_session",en="hck_",Je={session:"7d",invite:"7d",magicLink:"15m",passwordReset:"1h",twoFactor:"10m",oauth:"10m"},Be=8,$e=5,Ke=/^[^@\s]+@[^@\s.]+\.[^@\s]+$/,He=/^[a-z][a-z0-9_-]*$/,Ve=1e4;function tn(l){let{config:m}=l,f=l.fetch??((...n)=>fetch(...n)),g,A=()=>g??=ke(he(16)),v,P=!1,C=()=>m.admin.auth,x=(n,i)=>b(i??Je[n]),F=(n)=>{let i=C();if(!i||!i.methods.includes(n))throw new e(`The "${n}" sign-in method is not enabled; add it to admin.auth.methods`,{status:400,code:"method_not_enabled"});return i};async function y(n){let i=await l.database();return i.transaction((r)=>n(r,i))}async function D(n,i,r,o){return(await i.query(n,{table:r,where:o,limit:1}))[0]??null}async function K(n,i,r,o){let d=(await i.mutate(n,{kind:"insert",table:r,values:o})).rows[0];if(!d)throw new e(`Insert into ${r} returned no row.`,{status:500,code:"insert_without_row"});return d}async function I(n,i,r,o,a){return(await i.mutate(n,{kind:"update",table:r,where:o,set:a,returning:!1})).count}async function j(n,i,r,o){return(await i.mutate(n,{kind:"delete",table:r,where:o})).count}async function z(n,i,r,o=null){let a={type:i,data:r,previous:null},d={actor:o};await l.emit(n,[a],d)}async function le(){let n=m.rbac?.roles??{};if(m.rbac?.customRoles!==!0)return n;let i=Date.now();if(v&&i-v.at<Ve)return v.map;let r=await y((d,h)=>h.query(d,{table:J})),o={};for(let d of r)o[String(d.name)]=B(d.permissions);let a={...o,...n};return v={at:i,map:a},a}async function ee(n){let i=n.roles.length>0?n.roles:m.rbac?.defaultRole?[m.rbac.defaultRole]:[];return{id:n.id,source:"session",roles:i,permissions:Ge(i,await le())}}async function Y(n,i,r){let o=r.token??he(),a=new Date(Date.now()+r.ttlMs);return await K(n,i,N,{id:w("tok"),type:r.type,user_id:r.userId??null,email:r.email??null,token_hash:await Q(o),data:r.data??null,expires_at:a,consumed_at:null,created_at:new Date}),{token:o,expiresAt:a}}async function be(n,i,r,o){let a=await D(n,i,N,s(t("token_hash",await Q(o)),t("type",r)));if(!a||_e(a.expires_at))throw e.unauthorized("This link is invalid or has expired");if(a.consumed_at!==null)throw e.unauthorized("This link has already been used");return a}async function ve(n,i,r){if(await I(n,i,N,s(t("id",String(r.id)),t("consumed_at",null)),{consumed_at:new Date})!==1)throw e.unauthorized("This link has already been used")}async function ne(n,i,r,o){let a=await be(n,i,r,o);return await ve(n,i,a),a}async function se(n,i,r,o){let a=he(),d=new Date,h=new Date(d.getTime()+x("session",C()?.session?.expiresIn)),_=await K(n,i,L,{id:w("ses"),user_id:r.id,token_hash:await Q(a),ip:o.ip??null,user_agent:o.userAgent??null,expires_at:h,created_at:d});return await I(n,i,T,t("id",r.id),{last_login_at:d}),{status:"signed-in",token:a,expiresAt:h.toISOString(),session:ye(_),user:{...r,lastLoginAt:d.toISOString()},actor:await ee(r)}}async function ie(n,i,r,o){if(!r.twoFactorEnabled)return se(n,i,r,o);let a=await Y(n,i,{type:"two-factor",ttlMs:x("twoFactor",void 0),userId:r.id,email:r.email});return{status:"two-factor-required",challenge:a.token,expiresAt:a.expiresAt.toISOString(),userId:r.id}}async function E(n,i,r){let o=await D(n,i,T,t("id",r));return o?W(o):null}async function H(n,i,r){let o=await D(n,i,T,t("email",ce(r)));return o?{user:W(o),row:o}:null}function re(n){if(n.status==="disabled")throw e.forbidden("This account has been disabled")}async function Ae(n){let i=C();if(n==="oidc"){let a=i?.sso;if(!a)throw new e("SSO is not configured; set admin.auth.sso",{status:400,code:"method_not_enabled"});let d=await Ce(a.issuer,f),h=Te("oidc",{...a.clientId===void 0?{}:{clientId:a.clientId},...a.clientSecret===void 0?{}:{clientSecret:a.clientSecret}});return{id:"oidc",endpoints:d,scope:a.scope??"openid email profile",pkce:!0,...h,provision:a.provision!==!1,...a.mapRoles?{mapRoles:a.mapRoles}:{},profile:async(_)=>_.idToken?Z(kt(_.idToken)):Z(await je(d,_.accessToken))}}F(n);let r=Dn[n];if(!r)throw new e(`Unknown OAuth provider "${n}"`,{status:400,code:"unknown_provider"});let o=Te(n);return{id:n,endpoints:r.endpoints,scope:i?.providers?.[n]?.scope??r.scope,pkce:r.pkce,...o,provision:!1,profile:r.profile}}async function je(n,i){if(!n.userinfo)return{};let r=await f(n.userinfo,{headers:{authorization:`Bearer ${i}`,accept:"application/json"}});if(!r.ok)return{};return await r.json()}function Te(n,i={}){let r=C()?.providers?.[n],o=n.toUpperCase(),a=i.clientId??r?.clientId??ue(`HEYO_CMS_${o}_CLIENT_ID`)??ue(`${o}_CLIENT_ID`),d=i.clientSecret??r?.clientSecret??ue(`HEYO_CMS_${o}_CLIENT_SECRET`)??ue(`${o}_CLIENT_SECRET`);if(!a||!d)throw new e(`No credentials for "${n}": set admin.auth.providers.${n} or ${o}_CLIENT_ID and ${o}_CLIENT_SECRET`,{status:500,code:"provider_not_configured"});return{clientId:a,clientSecret:d}}async function ze(n,i,r,o){let a=await D(n,i,ge,s(t("provider",r.id),t("provider_account_id",o.id)));if(a){let S=await E(n,i,String(a.user_id));if(!S)throw e.unauthorized("The linked account no longer exists");return Pe(n,i,r,o,S)}let d=o.email?ce(o.email):null;if(!d)throw new e(`${r.id} did not return a verified email address, so the account cannot be matched`,{status:400,code:"oauth_without_email"});let _=(await H(n,i,d))?.user??null;if(!_){if(!r.provision)throw e.forbidden(`No CMS account for ${d}. An administrator has to invite this address first.`);_=await oe(n,i,{email:d,...o.name?{name:o.name}:{},roles:r.mapRoles?r.mapRoles(o.claims):m.rbac?.defaultRole?[m.rbac.defaultRole]:[],status:"active"}),await z(n,"user.joined",{userId:_.id,email:d,provider:r.id,provisioned:!0})}else if(_.status==="invited")await I(n,i,T,t("id",_.id),{status:"active",updated_at:new Date}),_={..._,status:"active"},await z(n,"user.joined",{userId:_.id,email:_.email});return await K(n,i,ge,{id:w("acc"),user_id:_.id,provider:r.id,provider_account_id:o.id,email:d,created_at:new Date,updated_at:new Date}),Pe(n,i,r,o,_)}async function Pe(n,i,r,o,a){if(!r.mapRoles)return a;let d=r.mapRoles(o.claims);if(Fe(d,a.roles))return a;return await I(n,i,T,t("id",a.id),{roles:d,updated_at:new Date}),await z(n,"role.changed",{userId:a.id,roles:d,previous:a.roles,source:r.id}),{...a,roles:d}}async function oe(n,i,r){let o=ce(r.email);if(await D(n,i,T,t("email",o)))throw e.conflict(`A user with the email ${o} already exists`);if(r.password!==void 0)G(r.password);let d=new Date,h=await K(n,i,T,{id:w("usr"),email:o,name:r.name??null,password_hash:r.password===void 0?null:await ke(r.password),two_factor_secret:null,two_factor_enabled:!1,status:r.status??"active",roles:r.roles??[],avatar_url:null,locale:r.locale??null,last_login_at:null,created_at:d,updated_at:d});return W(h)}function G(n){let i=C()?.password?.minLength??Be;if(n.length<i)throw e.validation(`The password must be at least ${i} characters`)}function Se(){let n=C();if(!n||!n.methods.includes("password"))return null;let i=n.firstUser??!0;if(i===!1)return null;if(i!==!0&&i.roles)return i.roles;let r=m.rbac?.roles;if(!r||"admin"in r)return["admin"];let o=Object.entries(r).find(([,a])=>a.includes(so));return o?[o[0]]:["admin"]}async function ae(n){if(n.length===0||!m.rbac)return;let i=await le(),r=n.filter((o)=>!(o in i));if(r.length>0)throw e.validation(`Unknown role ${r.map((o)=>`"${o}"`).join(", ")}`)}let X={async actorFromRequest(n){let i=n.headers.get("authorization"),o=(i?.toLowerCase().startsWith("bearer ")?i.slice(7).trim():null)??We(n,fe);return o?X.actorFromToken(o):null},async actorFromToken(n){if(n.startsWith(en))return X.apiKeys.verify(n);return(await X.sessions.verify(n))?.actor??null},actorForUser:ee,users:{async list(n={}){let i=[];if(n.status)i.push(t("status",n.status));if(n.search){let o=`%${n.search}%`;i.push(k(te("email",o,!0),te("name",o,!0)))}return(await y((o,a)=>a.query(o,{table:T,...i.length>0?{where:s(...i)}:{},orderBy:[u("created_at","asc"),u("id","asc")],limit:n.limit??50,...n.offset===void 0?{}:{offset:n.offset}}))).map(W)},async get(n){return y((i,r)=>E(i,r,n))},async byEmail(n){return y(async(i,r)=>(await H(i,r,n))?.user??null)},async count(){let n=await y((i,r)=>r.query(i,{table:T,count:!0}));return Number(n[0]?.count??0)},async create(n){return await ae(n.roles??[]),y((i,r)=>oe(i,r,n))},async update(n,i){if(i.roles)await ae(i.roles);let r=await y(async(o,a)=>{let d=await E(o,a,n);if(!d)throw e.notFound(`No user with id "${n}"`);let h={updated_at:new Date};if(i.name!==void 0)h.name=i.name;if(i.status!==void 0)h.status=i.status;if(i.locale!==void 0)h.locale=i.locale;if(i.avatarUrl!==void 0)h.avatar_url=i.avatarUrl;if(i.roles!==void 0)h.roles=i.roles;if(await I(o,a,T,t("id",n),h),i.roles&&!Fe(i.roles,d.roles))await z(o,"role.changed",{userId:n,roles:i.roles,previous:d.roles},i.actor??null);if(i.status==="disabled")await j(o,a,L,t("user_id",n));return await E(o,a,n)});return l.deliver(),r},async remove(n,i={}){await y(async(r,o)=>{let a=await E(r,o,n);if(!a)throw e.notFound(`No user with id "${n}"`);for(let d of[L,N,ge,V])await j(r,o,d,t("user_id",n));await j(r,o,T,t("id",n)),await z(r,"user.removed",{userId:n,email:a.email},i.actor??null)}),l.deliver()},async setPassword(n,i){G(i),await y(async(r,o)=>{let a=await ke(i);if(await I(r,o,T,t("id",n),{password_hash:a,updated_at:new Date})===0)throw e.notFound(`No user with id "${n}"`);await j(r,o,L,t("user_id",n))})},async invite(n){await ae(n.roles??[]);let i=await y(async(r,o)=>{let a=ce(n.email),d=await H(r,o,a);if(d&&d.user.status==="active")throw e.conflict(`${a} is already an active user`);let h=d?.user??await oe(r,o,{email:a,...n.name?{name:n.name}:{},roles:n.roles??(m.rbac?.defaultRole?[m.rbac.defaultRole]:[]),status:"invited"}),_=await Y(r,o,{type:"invite",ttlMs:x("invite",C()?.invites?.expiresIn),userId:h.id,email:a});return await z(r,"user.invited",{userId:h.id,email:a,roles:h.roles},n.actor??null),{user:h,token:_.token,expiresAt:_.expiresAt.toISOString(),userId:h.id,email:a}});return l.deliver(),i},async acceptInvite(n){let i=await y(async(r,o)=>{let a=await ne(r,o,"invite",n.token),d=await E(r,o,String(a.user_id));if(!d)throw e.unauthorized("This invitation is no longer valid");let h={status:"active",updated_at:new Date};if(n.password!==void 0)G(n.password),h.password_hash=await ke(n.password);if(n.name!==void 0)h.name=n.name;await I(r,o,T,t("id",d.id),h);let _={...d,status:"active",...n.name===void 0?{}:{name:n.name}};return await z(r,"user.joined",{userId:d.id,email:d.email}),se(r,o,_,n)});return l.deliver(),i}},setup:{async required(){if(Se()===null)return!1;if(P)return!1;let n=await X.users.count();if(n>0)P=!0;return n===0},async claim(n){let i=Se();if(i===null)throw e.forbidden("This deployment does not accept a first account over HTTP; use heyo-cms create-admin");try{await ae(i)}catch(o){if(o instanceof e&&o.code==="validation_failed")throw e.validation(`The first account would be given the role ${i.map((a)=>`"${a}"`).join(", ")}, which rbac.roles does not define; set admin.auth.firstUser.roles`);throw o}G(n.password);let r=await y(async(o,a)=>{let d=await a.query(o,{table:T,count:!0});if(Number(d[0]?.count??0)>0)throw e.conflict("This CMS already has an account; sign in instead");let h=await oe(o,a,{email:n.email,password:n.password,roles:i,status:"active",...n.name===void 0?{}:{name:n.name}});return await z(o,"user.joined",{userId:h.id,email:h.email,first:!0}),se(o,a,h,n)});return P=!0,l.deliver(),r}},sessions:{async verify(n){return y(async(i,r)=>{let o=await D(i,r,L,t("token_hash",await Q(n)));if(!o||_e(o.expires_at))return null;let a=await E(i,r,String(o.user_id));if(!a||a.status!=="active")return null;return{status:"signed-in",token:n,expiresAt:c(o.expires_at)??"",session:ye(o),user:a,actor:await ee(a)}})},async list(n){return(await y((r,o)=>o.query(r,{table:L,where:t("user_id",n),orderBy:[u("created_at","desc")]}))).map(ye)},async revoke(n){let i=await Q(n);return await y((o,a)=>j(o,a,L,t("token_hash",i)))>0},async revokeById(n){return await y((r,o)=>j(r,o,L,t("id",n)))>0},async revokeAll(n){return y((i,r)=>j(i,r,L,t("user_id",n)))},async cleanup(){let n=new Date;return y(async(i,r)=>{let o=await j(i,r,L,U("expires_at",n));return await j(i,r,N,U("expires_at",n)),o})}},password:{async signIn(n){F("password");let i=await y(async(r,o)=>{let a=await H(r,o,n.email),d=a?a.row.password_hash:await A(),h=await nn(n.password,d);if(!a||!h)throw e.unauthorized("Invalid email or password");if(re(a.user),a.user.status==="invited")throw e.forbidden("This invitation has not been accepted yet");return ie(r,o,a.user,n)});return l.deliver(),i},async requestReset(n){return F("password"),y(async(i,r)=>{let o=await H(i,r,n.email);if(!o||o.user.status==="disabled")return null;let a=await Y(i,r,{type:"password-reset",ttlMs:x("passwordReset",C()?.passwordReset?.expiresIn),userId:o.user.id,email:o.user.email});return{token:a.token,expiresAt:a.expiresAt.toISOString(),userId:o.user.id,email:o.user.email}})},async reset(n){return F("password"),G(n.password),y(async(i,r)=>{let o=await ne(i,r,"password-reset",n.token),a=String(o.user_id);await I(i,r,T,t("id",a),{password_hash:await ke(n.password),status:"active",updated_at:new Date}),await j(i,r,L,t("user_id",a));let d=await E(i,r,a);if(!d)throw e.unauthorized("This link is no longer valid");return d})}},magicLink:{async request(n){return F("magic-link"),y(async(i,r)=>{let o=await H(i,r,n.email);if(!o||o.user.status==="disabled")return null;let a=await Y(i,r,{type:"magic-link",ttlMs:x("magicLink",C()?.magicLink?.expiresIn),userId:o.user.id,email:o.user.email});return{token:a.token,expiresAt:a.expiresAt.toISOString(),userId:o.user.id,email:o.user.email}})},async verify(n){F("magic-link");let i=await y(async(r,o)=>{let a=await ne(r,o,"magic-link",n.token),d=await E(r,o,String(a.user_id));if(!d)throw e.unauthorized("This link is no longer valid");if(re(d),d.status==="invited")return await I(r,o,T,t("id",d.id),{status:"active",updated_at:new Date}),await z(r,"user.joined",{userId:d.id,email:d.email}),ie(r,o,{...d,status:"active"},n);return ie(r,o,d,n)});return l.deliver(),i}},oauth:{async authorize(n){let i=await Ae(n.provider),r=he(24),o=he(),a=i.pkce?(await Oe(o)).challenge:void 0;return await y((d,h)=>Y(d,h,{type:"oauth",ttlMs:x("oauth",void 0),token:r,data:{provider:i.id,redirectUri:n.redirectUri,verifier:o,redirectTo:n.redirectTo??null}})),{url:Ue({endpoints:i.endpoints,clientId:i.clientId,redirectUri:n.redirectUri,scope:i.scope,state:r,...a===void 0?{}:{codeChallenge:a}}),state:r}},async callback(n){let i=await Ae(n.provider),r=await y(async(o,a)=>{let d=await ne(o,a,"oauth",n.state),h=p(d.data);if(h.provider!==i.id)throw e.unauthorized("This sign-in request does not match");if(h.redirectUri!==n.redirectUri)throw e.unauthorized("The redirect URI does not match");let _=await xe({endpoints:i.endpoints,clientId:i.clientId,clientSecret:i.clientSecret,code:n.code,redirectUri:n.redirectUri,...i.pkce&&typeof h.verifier==="string"?{codeVerifier:h.verifier}:{},fetchImpl:f}),S=await i.profile(_,f),R=await ze(o,a,i,S);return re(R),{...await ie(o,a,R,n),redirectTo:typeof h.redirectTo==="string"?h.redirectTo:null}});return l.deliver(),r}},twoFactor:{async begin(n){let i=Mn();return y(async(r,o)=>{let a=await E(r,o,n);if(!a)throw e.notFound(`No user with id "${n}"`);if(a.twoFactorEnabled)throw e.conflict("Disable the existing authenticator before enrolling another.");return await I(r,o,T,t("id",n),{two_factor_secret:i,updated_at:new Date}),{secret:i,uri:qn({secret:i,account:a.email,issuer:m.admin.title??"Heyo CMS"})}})},async enable(n){return y(async(i,r)=>{let o=await D(i,r,T,t("id",n.userId));if(!o)throw e.notFound(`No user with id "${n.userId}"`);let a=o.two_factor_secret;if(!a)throw e.validation("Start the setup before enabling it");if(!await Xt(a,n.code))throw e.unauthorized("That code is not valid");return await I(i,r,T,t("id",n.userId),{two_factor_enabled:!0,updated_at:new Date}),{...W(o),twoFactorEnabled:!0}})},async disable(n){return y(async(i,r)=>{if(await I(i,r,T,t("id",n),{two_factor_enabled:!1,two_factor_secret:null,updated_at:new Date})===0)throw e.notFound(`No user with id "${n}"`);return await E(i,r,n)})},async complete(n){let i=await y(async(r,o)=>{let a=await be(r,o,"two-factor",n.challenge),d=await D(r,o,T,t("id",String(a.user_id)));if(!d)throw e.unauthorized("This challenge is no longer valid");if(!await Xt(d.two_factor_secret,n.code)){let S=a;for(let R=0;R<$e;R+=1){let M=p(S.data).attempts,Ie=typeof M==="number"?M:null,Re=Number(Ie??0)+1;if(await I(r,o,N,s(t("id",String(S.id)),t("consumed_at",null),t("data.attempts",Ie)),{data:{...p(S.data),attempts:Re},...Re>=$e?{consumed_at:new Date}:{}})===1)break;let me=await D(r,o,N,t("id",String(S.id)));if(!me||me.consumed_at!==null)break;S=me}return null}await ve(r,o,a);let _=W(d);return re(_),se(r,o,_,n)});if(i===null)throw e.unauthorized("That code is not valid");return l.deliver(),i}},apiKeys:{async create(n){let i=C()?.apiKeys;if(!i?.enabled)throw new e("API keys are not enabled; set admin.auth.apiKeys.enabled",{status:400,code:"method_not_enabled"});let r=n.scopes??i.scopes??["read"],o=i.scopes;if(o){let S=r.filter((R)=>!o.includes(R));if(S.length>0)throw e.validation(`Scope ${S.map((R)=>`"${R}"`).join(", ")} is not in admin.auth.apiKeys.scopes`)}let a=`${en}${he()}`,d=n.expiresIn??i.expiresIn,h=d?new Date(Date.now()+b(d)):null,_=await y(async(S,R)=>{let M=await K(S,R,V,{id:w("key"),name:n.name,user_id:n.userId??null,key_hash:await Q(a),prefix:a.slice(0,en.length+6),scopes:r,last_used_at:null,expires_at:h,revoked_at:null,created_at:new Date});return await z(S,"apikey.created",{id:String(M.id),name:n.name,scopes:r,userId:n.userId??null},n.actor??null),Ee(M)});return l.deliver(),{..._,key:a}},async list(n={}){return(await y((r,o)=>o.query(r,{table:V,...n.userId?{where:t("user_id",n.userId)}:{},orderBy:[u("created_at","desc")]}))).map(Ee)},async revoke(n,i={}){let r=await y(async(o,a)=>{let d=await I(o,a,V,s(t("id",n),t("revoked_at",null)),{revoked_at:new Date});if(d>0)await z(o,"apikey.revoked",{id:n},i.actor??null);return d>0});return l.deliver(),r},async verify(n){return y(async(i,r)=>{let o=await D(i,r,V,t("key_hash",await Q(n)));if(!o)return null;if(o.revoked_at!==null)return null;if(o.expires_at!==null&&_e(o.expires_at))return null;let a=B(o.scopes),d=Tt(a),h=[],_=d,S=String(o.id);if(o.user_id!==null&&o.user_id!==void 0){let R=await E(i,r,String(o.user_id));if(!R||R.status!=="active")return null;let M=await ee(R);h=M.roles,_=Ct(M.permissions,d),S=R.id}return await I(i,r,V,t("id",String(o.id)),{last_used_at:new Date}),{id:S,source:"api-key",roles:h,permissions:_}})}},roles:{async list(){let n=Object.entries(m.rbac?.roles??{}).map(([a,d])=>({name:a,label:null,permissions:d,source:"config"}));if(m.rbac?.customRoles!==!0)return n;let i=await y((a,d)=>d.query(a,{table:J,orderBy:[u("name")]})),r=new Set(n.map((a)=>a.name)),o=i.filter((a)=>!r.has(String(a.name))).map((a)=>({name:String(a.name),label:a.label??null,permissions:B(a.permissions),source:"database"}));return[...n,...o].sort((a,d)=>a.name.localeCompare(d.name))},async create(n){if(de(),Le(n.name),m.rbac?.roles[n.name])throw e.conflict(`"${n.name}" is defined in the configuration; change it there`);let i=await y(async(r,o)=>{if(await D(r,o,J,t("name",n.name)))throw e.conflict(`The role "${n.name}" already exists`);return K(r,o,J,{id:w("rol"),name:n.name,label:n.label??null,permissions:n.permissions,created_at:new Date,updated_at:new Date})});return v=void 0,{name:String(i.name),label:i.label??null,permissions:B(i.permissions),source:"database"}},async update(n,i){de();let r=await y(async(o,a)=>{let d={updated_at:new Date};if(i.permissions)d.permissions=i.permissions;if(i.label!==void 0)d.label=i.label;if(await I(o,a,J,t("name",n),d)===0)throw e.notFound(`No role named "${n}"`);return D(o,a,J,t("name",n))});return v=void 0,{name:n,label:r?.label??null,permissions:B(r?.permissions),source:"database"}},async remove(n){de();let i=await y((r,o)=>j(r,o,J,t("name",n)));return v=void 0,i>0},async permissionsFor(n){return Ge(n,await le())}}};function de(){if(m.rbac?.customRoles!==!0)throw new e("Roles are defined in the configuration; set rbac.customRoles to manage them in the panel",{status:400,code:"custom_roles_disabled"})}function Le(n){if(!He.test(n))throw e.validation(`"${n}" is not a role name; use lowercase letters, digits, dashes and underscores`)}return X}function W(l){return{id:String(l.id),email:String(l.email),name:l.name??null,status:l.status??"active",roles:B(l.roles),avatarUrl:l.avatar_url??null,locale:l.locale??null,twoFactorEnabled:l.two_factor_enabled===!0,lastLoginAt:c(l.last_login_at),createdAt:c(l.created_at)??"",updatedAt:c(l.updated_at)??""}}function ye(l){return{id:String(l.id),userId:String(l.user_id),expiresAt:c(l.expires_at)??"",createdAt:c(l.created_at)??"",ip:l.ip??null,userAgent:l.user_agent??null}}function Ee(l){return{id:String(l.id),name:String(l.name),prefix:String(l.prefix),userId:l.user_id??null,scopes:B(l.scopes),lastUsedAt:c(l.last_used_at),expiresAt:c(l.expires_at),revokedAt:c(l.revoked_at),createdAt:c(l.created_at)??""}}function B(l){if(!Array.isArray(l))return[];return l.filter((m)=>typeof m==="string")}function _e(l){if(l===null||l===void 0)return!1;return(l instanceof Date?l:new Date(String(l))).getTime()<=Date.now()}function ce(l){let m=l.trim().toLowerCase();if(!Ke.test(m))throw e.validation(`"${l}" is not an email address`);return m}function Fe(l,m){if(l.length!==m.length)return!1;let f=[...m].sort();return[...l].sort().every((g,A)=>g===f[A])}function We(l,m){let f=l.headers.get("cookie");if(!f)return null;for(let g of f.split(";")){let A=g.indexOf("=");if(A===-1)continue;if(g.slice(0,A).trim()!==m)continue;return decodeURIComponent(g.slice(A+1).trim())}return null}function ue(l){return globalThis.process?.env?.[l]}
2
+ export{Dn,kt,Mn,qn,Wo,Xt,fe,en,tn};
@@ -0,0 +1,2 @@
1
+ import{e}from"./index-x72d1hzh.js";var c=new Set(["dashboard","collection-list","document","global","media","trash","settings"]),g=100,r=200,f=120,m=new Set(["users","roles","locales","keys","ai","webhooks","deployment","activity"]);function Qn(l){if(typeof l!=="object"||l===null||Array.isArray(l))return;let n=l,i=n.kind;if(typeof i!=="string"||!c.has(i))return;let t=Array.isArray(n.dirtyFields)?n.dirtyFields.filter((s)=>typeof s==="string").slice(0,g):void 0,o=Number(n.baselineRevision);return{kind:i,...typeof n.collectionSlug==="string"?{collectionSlug:n.collectionSlug.slice(0,r)}:{},...typeof n.documentId==="string"?{documentId:n.documentId.slice(0,r)}:{},...typeof n.mediaId==="string"?{mediaId:n.mediaId.slice(0,r)}:{},...typeof n.tab==="string"&&n.tab.trim().length>0?{tab:n.tab.trim().slice(0,f)}:{},...typeof n.locale==="string"?{locale:n.locale}:{},...t&&t.length>0?{dirtyFields:t}:{},...Number.isInteger(o)&&o>0?{baselineRevision:o}:{}}}function Xn(l,n,i){let t=i!==void 0&&a(l,i)?i:l.i18n.defaultLocale;if(!n)return{kind:"dashboard",collection:null,documentId:null,mediaId:null,tab:null,locale:t,dirtyFields:[],baselineRevision:null};let o=n.locale!==void 0&&a(l,n.locale)?n.locale:t,s=C(l,n);return{kind:n.kind,collection:s,documentId:n.documentId??null,mediaId:n.kind==="media"?n.mediaId??null:null,tab:b(n,s),locale:o,dirtyFields:n.dirtyFields??[],baselineRevision:n.baselineRevision??null}}function b(l,n){let i=l.tab;if(!i)return null;if(l.kind==="settings")return m.has(i)?i:null;if(l.kind==="media")return i==="active"||i==="orphaned"?i:null;if(l.kind==="document"||l.kind==="global")return n?.fields[i]?.type==="richText"?i:null;return null}function C(l,n){if(n.collectionSlug===void 0)return null;let i=n.kind==="global"?"global":n.kind==="document"||n.kind==="collection-list"?"collection":void 0;if(i===void 0)return null;let t={...l.collections,...l.globals},o=Object.values(t).find((s)=>s.slug===n.collectionSlug);if(!o||o.kind!==i)return null;return o}function D(l,n,i){let t={...l.collections,...l.globals},o=t[n],s=Object.values(t).find((u)=>u.slug===n);if(o&&s&&o.name!==s.name)throw e.validation(`"${n}" is ambiguous: it names ${o.name} and is the slug of ${s.name}. Use an unambiguous name or slug from describe_cms.`);let d=o??s;if(!d)throw e.notFound(`There is no collection called "${n}". Call describe_cms for the list.`);if(i&&d.kind!==i)throw e.validation(`"${n}" is a ${d.kind}, not a ${i}.`);return d}function a(l,n){return l.i18n.locales.includes(n)}function ie(l,n,i){if(i!==void 0&&a(l,i))return i;if(i!==void 0)throw e.validation(`"${i}" is not a configured locale. Call describe_cms for the list.`);return n.locale}var se={maxTurns:8,maxToolCalls:16,timeoutMs:90000};
2
+ export{Qn,Xn,D,ie,se};
@@ -0,0 +1,2 @@
1
+ var be="x-heyo-signature";async function we(e,n,t=Math.floor(Date.now()/1000)){let o=await crypto.subtle.importKey("raw",new TextEncoder().encode(n),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),a=await crypto.subtle.sign("HMAC",o,new TextEncoder().encode(`${t}.${e}`));return`t=${t},v1=${u(new Uint8Array(a))}`}async function wn(e){let n=new Map(e.header.split(",").map((r)=>{let[l,d]=r.split("=");return[l?.trim()??"",d?.trim()??""]})),t=Number(n.get("t")),o=n.get("v1");if(!Number.isFinite(t)||!o)return!1;let a=e.now??Math.floor(Date.now()/1000),c=e.toleranceSeconds??300;if(Math.abs(a-t)>c)return!1;let s=(await we(e.body,e.secret,t)).split("v1=")[1]??"";if(s.length!==o.length)return!1;let i=0;for(let r=0;r<s.length;r+=1)i|=s.charCodeAt(r)^o.charCodeAt(r);return i===0}function u(e){let n="";for(let t of e)n+=t.toString(16).padStart(2,"0");return n}
2
+ export{be,we,wn};
@@ -0,0 +1,2 @@
1
+ import{e}from"./index-x72d1hzh.js";function d(n,o){let s=(t)=>n.mutate(o,t);return{query:(t)=>n.query(o,t),mutate:s,find:(t,r)=>n.query(o,{table:t,...r===void 0?{}:{where:r}}),async findOne(t,r){return(await n.query(o,{table:t,where:r,limit:1}))[0]??null},async insert(t,r){let i=(await s({kind:"insert",table:t,values:r})).rows[0];if(!i)throw new e(`Insert into ${t} returned no row.`,{status:500,code:"insert_without_row"});return i},async update(t,r,u){return(await s({kind:"update",table:t,where:r,set:u,returning:!1})).count},async delete(t,r){return(await s({kind:"delete",table:t,where:r})).count}}}
2
+ export{d};
@@ -0,0 +1,5 @@
1
+ import{je,En}from"./index-gpwcmmvr.js";import{xt}from"./index-ymq6jsar.js";import{lo}from"./index-2kb5nbxx.js";import{n}from"./index-x72d1hzh.js";import{mkdir as m,readdir as M,readFile as f,writeFile as h}from"node:fs/promises";import{join as p}from"node:path";var y="meta/snapshot.json",w="meta/plugins.json";class Zt{directory;constructor(t){this.directory=t}async readSnapshot(){try{let t=await f(p(this.directory,y),"utf8");return JSON.parse(t)}catch{return xt()}}async writeSnapshot(t){await m(p(this.directory,"meta"),{recursive:!0}),await h(p(this.directory,y),`${JSON.stringify(t,null,2)}
2
+ `,"utf8")}async readPluginLog(){try{let t=await f(p(this.directory,w),"utf8"),r=JSON.parse(t);return Array.isArray(r)?r.filter((i)=>typeof i==="string"):[]}catch{return[]}}async writePluginLog(t){await m(p(this.directory,"meta"),{recursive:!0}),await h(p(this.directory,w),`${JSON.stringify(t,null,2)}
3
+ `,"utf8")}async list(){let t;try{t=await M(this.directory)}catch{return[]}let r=[];for(let i of t.sort()){let c=/^(\d{4}_[a-z0-9_]+)\.(sql|json)$/.exec(i);if(!c)continue;let o=await f(p(this.directory,i),"utf8"),s=c[1],a=c[2];r.push({id:s,file:i,checksum:lo(o),artifact:{id:s,extension:a,content:o,summary:P(o,a)}})}return r}async write(t){await m(this.directory,{recursive:!0});let r=`${t.id}.${t.extension}`;return await h(p(this.directory,r),t.content,"utf8"),r}async nextSequence(){let r=(await this.list()).at(-1),i=r?Number(r.id.slice(0,4))+1:0;return String(i).padStart(4,"0")}}function P(t,r){if(r==="json")return JSON.parse(t).summary??[];return t.split(`
4
+ `).filter((i)=>i.startsWith("-- ")&&!/^-- \d{4}_/.test(i)).map((i)=>i.slice(3))}async function Uo(t){let{adapter:r,store:i}=t;if(t.plugins.length===0)return[];let c=await i.readPluginLog(),o=[],s=new Set(c);for(let a of t.plugins){let e=`${a.plugin}:${a.id}`;if(s.has(e))continue;if(a.steps.length===0){s.add(e);continue}let u=`${await i.nextSequence()}_${S(a.plugin)}_${S(a.id)}`,d=r.render(a.steps,u),l=await i.write(d);s.add(e),o.push({id:u,file:l})}if(o.length>0)await i.writePluginLog([...s]);return o}function S(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_|_$/g,"")}async function $n(t){let{adapter:r,store:i,target:c}=t,o=await i.readSnapshot(),s=r.plan(o,c),a;if(s.length>0){let u=`${await i.nextSequence()}_${t.name??En(s)}`,d=r.render(s,u),l=await i.write(d);await i.writeSnapshot(c),a={id:u,file:l,summary:d.summary}}let e=await Uo({adapter:r,store:i,plugins:t.plugins??[]});if(!a)return{created:!1,summary:[],...e.length===0?{}:{plugins:e}};return{created:!0,id:a.id,file:a.file,summary:a.summary,...e.length===0?{}:{plugins:e}}}async function jn(t){let{adapter:r,store:i}=t,[c,o]=await Promise.all([i.list(),r.listAppliedMigrations()]),s=new Map(o.map((e)=>[e.id,e])),a={applied:[],alreadyApplied:0};for(let e of c){let g=s.get(e.id);if(g){x(e,g.checksum),a.alreadyApplied+=1;continue}await r.applyMigration(e.artifact),await r.recordMigration(e.id,e.checksum),a.applied.push(e.id)}return a}async function In(t){let{adapter:r,store:i}=t,[c,o]=await Promise.all([i.list(),r.listAppliedMigrations()]),s=new Map(o.map((e)=>[e.id,e])),a={applied:[],pending:[],modified:[],unplanned:[]};for(let e of c){let g=s.get(e.id);if(!g){a.pending.push(e.id);continue}if(a.applied.push(e.id),g.checksum!==e.checksum)a.modified.push(e.id)}if(t.target){let e=await i.readSnapshot();a.unplanned=r.plan(e,t.target).map((g)=>je(g))}return a}function x(t,r){if(t.checksum===r)return;throw new n(t.file,"was modified after it was applied; revert it and write a new migration instead")}
5
+ export{Zt,Uo,$n,jn,In};
@@ -0,0 +1,23 @@
1
+ import{n}from"./index-x72d1hzh.js";var u=new Map,m=new Map;function x(t){if(!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(t.name))throw new n(`editor.nodes.${t.name}`,"a node name must be letters, digits and underscores, starting with a letter");if(typeof t.toHtml!=="function")throw new n(`editor.nodes.${t.name}`,"needs a toHtml serialiser; a node that cannot render as HTML is a node the REST API cannot answer with");if(typeof t.toMarkdown!=="function")throw new n(`editor.nodes.${t.name}`,"needs a toMarkdown serialiser; Markdown is what exports and AI prompts speak");let e=u.get(t.name);if(e&&e!==t)throw new n(`editor.nodes.${t.name}`,"a different node with this name is already registered");return u.set(t.name,t),t}function Y(t){if(typeof t.toHtml!=="function"||typeof t.toMarkdown!=="function")throw new n(`editor.marks.${t.name}`,"needs both a toHtml and a toMarkdown serialiser");let e=m.get(t.name);if(e&&e!==t)throw new n(`editor.marks.${t.name}`,"a different mark with this name is already registered");return m.set(t.name,t),t}function Ne(t){return u.get(t)}function wt(t){return m.get(t)}function Tn(){return[...u.keys()].sort()}function Sn(){return[...m.keys()].sort()}function de(){return{nodes:[...u.values()].sort((t,e)=>t.name.localeCompare(e.name)).map((t)=>({name:t.name,...t.group===void 0?{}:{group:t.group},...t.content===void 0?{}:{content:t.content},inline:t.inline===!0,atom:t.atom===!0,attrs:t.attrs??{},...t.marks===void 0?{}:{marks:t.marks},component:t.Component!==void 0})),marks:[...m.values()].sort((t,e)=>t.name.localeCompare(e.name)).map((t)=>({name:t.name,attrs:t.attrs??{}}))}}function ue(t,e){if(!D(t))return"";let r=w(t,{format:e.format,index:0,depth:0,...e.mediaUrl===void 0?{}:{mediaUrl:e.mediaUrl}});return e.format==="html"?r:r.trim()}function On(t,e={}){return ue(t,{...e,format:"html"})}function J(t,e={}){return ue(t,{...e,format:"markdown"})}function _n(t,e={}){return ue(t,{...e,format:"text"})}function w(t,e){let{format:r}=e;if(t.type==="text")return E(t.text??"",t.marks??[],r);let i=t.content??[],o=i.map((l,c)=>w(l,{...e,index:c,depth:e.depth+1})),a=y(i,o,r),s=Ne(t.type);if(!s)return a;return(r==="html"?s.toHtml:r==="markdown"?s.toMarkdown:s.toText??((l)=>l.children))({node:t,children:a,childStrings:o,childNodes:i,depth:e.depth,index:e.index,...e.mediaUrl===void 0?{}:{mediaUrl:e.mediaUrl}})}function y(t,e,r){if(r==="html")return e.join("");if(!t.some((a)=>T(a)))return e.join("");let o=r==="markdown"?`
2
+
3
+ `:`
4
+ `;return e.filter((a)=>a.length>0).join(o)}function T(t){if(t.type==="text")return!1;let e=Ne(t.type);if(!e)return!0;return e.inline!==!0}function E(t,e,r){let i=e.some((a)=>a.type==="code"),o=r==="html"?Ue(t):r==="markdown"&&!i?oo(t):t;if(r==="text")return o;for(let a of e){let s=wt(a.type);if(!s)continue;o=(r==="html"?s.toHtml:s.toMarkdown)({mark:a,text:o})}return o}function Ue(t){return t.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function oo(t){return t.replace(/([\\`*_[\]])/g,"\\$1")}function We(t){let e=[];for(let[r,i]of Object.entries(t)){if(i===void 0||i===null||i===!1)continue;if(i===!0){e.push(` ${r}`);continue}e.push(` ${r}="${Ue(String(i))}"`)}return e.join("")}function vt(t,e){let r=" ".repeat(e);return t.split(`
5
+ `).join(`
6
+ ${r}`)}function R(t,e){return t.attrs?.[e]}function Z(t,e){let r=R(t,e);return typeof r==="string"?r:void 0}function D(t){return typeof t==="object"&&t!==null&&typeof t.type==="string"}var yo=x({name:"doc",content:"block+",toHtml:({children:t})=>t,toMarkdown:({children:t})=>t}),bo=x({name:"paragraph",group:"block",content:"inline*",toHtml:({children:t})=>`<p>${t}</p>`,toMarkdown:({children:t})=>t}),wo=x({name:"heading",group:"block",content:"inline*",attrs:{level:{default:1}},toHtml:({node:t,children:e})=>{let r=b(t.attrs?.level);return`<h${r}>${e}</h${r}>`},toMarkdown:({node:t,children:e})=>`${"#".repeat(b(t.attrs?.level))} ${e}`}),vo=x({name:"blockquote",group:"block",content:"block+",toHtml:({children:t})=>`<blockquote>${t}</blockquote>`,toMarkdown:({children:t})=>t.split(`
7
+ `).map((e)=>e.length===0?">":`> ${e}`).join(`
8
+ `)}),Ao=x({name:"bulletList",group:"block",content:"listItem+",toHtml:({children:t})=>`<ul>${t}</ul>`,toMarkdown:({childStrings:t})=>t.map((e)=>`- ${vt(e,2)}`).join(`
9
+ `)}),xo=x({name:"orderedList",group:"block",content:"listItem+",attrs:{start:{default:1}},toHtml:({node:t,children:e})=>{let r=typeof t.attrs?.start==="number"?t.attrs.start:1;return`<ol${r===1?"":` start="${r}"`}>${e}</ol>`},toMarkdown:({node:t,childStrings:e})=>{let r=typeof t.attrs?.start==="number"?t.attrs.start:1;return e.map((i,o)=>{let a=`${r+o}. `;return`${a}${vt(i,a.length)}`}).join(`
10
+ `)}}),ko=x({name:"listItem",content:"paragraph block*",toHtml:({children:t})=>`<li>${t}</li>`,toMarkdown:({children:t})=>t}),Ro=x({name:"taskList",group:"block",content:"taskItem+",toHtml:({children:t})=>`<ul data-type="taskList">${t}</ul>`,toMarkdown:({childStrings:t})=>t.join(`
11
+ `)}),Co=x({name:"taskItem",content:"paragraph block*",attrs:{checked:{default:!1}},toHtml:({node:t,children:e})=>`<li data-type="taskItem"${We({"data-checked":t.attrs?.checked===!0})}>${e}</li>`,toMarkdown:({node:t,children:e})=>`- [${t.attrs?.checked===!0?"x":" "}] ${vt(e,6)}`}),To=x({name:"codeBlock",group:"block",content:"text*",marks:"",attrs:{language:{default:null}},toHtml:({node:t,childNodes:e})=>{let r=Z(t,"language"),i=Ue(h(e));return`<pre><code${r?` class="language-${Ue(r)}"`:""}>${i}</code></pre>`},toMarkdown:({node:t,childNodes:e})=>{let r=Z(t,"language")??"",i=h(e),o=Math.max(0,...[...i.matchAll(/`+/g)].map((s)=>s[0].length)),a="`".repeat(Math.max(3,o+1));return`${a}${r}
12
+ ${i}
13
+ ${a}`},toText:({childNodes:t})=>h(t)}),So=x({name:"horizontalRule",group:"block",atom:!0,toHtml:()=>"<hr>",toMarkdown:()=>"---",toText:()=>""}),Oo=x({name:"hardBreak",group:"inline",inline:!0,atom:!0,toHtml:()=>"<br>",toMarkdown:()=>`
14
+ `,toText:()=>`
15
+ `}),_o=x({name:"image",group:"block",atom:!0,attrs:{src:{default:null},alt:{default:null},title:{default:null},mediaId:{default:null}},toHtml:({node:t,mediaUrl:e})=>{let r=M(t.attrs,e);return`<img${We({src:r,alt:Z(t,"alt")??"",title:Z(t,"title"),"data-media-id":Z(t,"mediaId")})}>`},toMarkdown:({node:t,mediaUrl:e})=>{let r=M(t.attrs,e)??"",i=Z(t,"alt")??"",o=Z(t,"title");return`![${i}](${r}${o?` "${o}"`:""})`},toText:({node:t})=>Z(t,"alt")??""}),Po=x({name:"table",group:"block",content:"tableRow+",toHtml:({children:t})=>`<table><tbody>${t}</tbody></table>`,toMarkdown:({childStrings:t})=>{let[e,...r]=t;if(e===void 0)return"";let i=e.split(" | ").length,o=`| ${Array.from({length:i},()=>"---").join(" | ")} |`;return[`| ${e} |`,o,...r.map((a)=>`| ${a} |`)].join(`
16
+ `)}}),$o=x({name:"tableRow",content:"(tableCell | tableHeader)*",toHtml:({children:t})=>`<tr>${t}</tr>`,toMarkdown:({childStrings:t})=>t.map((e)=>e.replaceAll(`
17
+ `," ")).join(" | ")}),jo=x({name:"tableHeader",content:"block+",attrs:{colspan:{default:1},rowspan:{default:1},colwidth:{default:null}},toHtml:({node:t,children:e})=>`<th${N(t.attrs)}>${e}</th>`,toMarkdown:({children:t})=>t}),Io=x({name:"tableCell",content:"block+",attrs:{colspan:{default:1},rowspan:{default:1},colwidth:{default:null}},toHtml:({node:t,children:e})=>`<td${N(t.attrs)}>${e}</td>`,toMarkdown:({children:t})=>t}),Eo=Y({name:"bold",toHtml:({text:t})=>`<strong>${t}</strong>`,toMarkdown:({text:t})=>`**${t}**`}),Do=Y({name:"italic",toHtml:({text:t})=>`<em>${t}</em>`,toMarkdown:({text:t})=>`*${t}*`}),Mo=Y({name:"underline",toHtml:({text:t})=>`<u>${t}</u>`,toMarkdown:({text:t})=>`<u>${t}</u>`}),qo=Y({name:"strike",toHtml:({text:t})=>`<s>${t}</s>`,toMarkdown:({text:t})=>`~~${t}~~`}),Lo=Y({name:"code",toHtml:({text:t})=>`<code>${t}</code>`,toMarkdown:({text:t})=>`\`${t}\``}),Fo=Y({name:"link",attrs:{href:{default:null},target:{default:null},rel:{default:null}},toHtml:({mark:t,text:e})=>`<a${We({href:t.attrs?.href??"",target:t.attrs?.target,rel:t.attrs?.rel})}>${e}</a>`,toMarkdown:({mark:t,text:e})=>`[${e}](${String(t.attrs?.href??"")})`});function b(t){let e=typeof t==="number"?Math.trunc(t):1;return Math.min(6,Math.max(1,e))}function h(t){return t.map((e)=>e.text??"").join("")}function N(t){let e=t?.colspan,r=t?.rowspan;return We({colspan:typeof e==="number"&&e>1?e:void 0,rowspan:typeof r==="number"&&r>1?r:void 0})}function M(t,e){let r=t?.mediaId;if(typeof r==="string"&&e){let o=e(r);if(o)return o}let i=t?.src;return typeof i==="string"?i:void 0}function pe(t){let e=t.replaceAll(`\r
18
+ `,`
19
+ `).split(`
20
+ `),r=g(e);return{type:"doc",content:r.length>0?r:[{type:"paragraph"}]}}function Pn(t){let e=t.replaceAll(`\r
21
+ `,`
22
+ `).split(/\n{2,}/).map((r)=>r.trim()).filter((r)=>r.length>0);return{type:"doc",content:e.length===0?[{type:"paragraph"}]:e.map((r)=>({type:"paragraph",content:[{type:"text",text:r}]}))}}function g(t){let e=[],r=0;while(r<t.length){let i=t[r]??"";if(i.trim().length===0){r+=1;continue}let o=/^\s*(`{3,})(.*)$/.exec(i);if(o){let d=o[1],l=(o[2]??"").trim(),c=[];r+=1;while(r<t.length&&!(t[r]??"").startsWith(d))c.push(t[r]??""),r+=1;r+=1,e.push({type:"codeBlock",...l.length>0?{attrs:{language:l}}:{},...c.length>0?{content:[{type:"text",text:c.join(`
23
+ `)}]}:{}});continue}let a=/^(#{1,6})\s+(.*)$/.exec(i);if(a){e.push({type:"heading",attrs:{level:a[1].length},content:k(a[2].trim())}),r+=1;continue}if(/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(i)){e.push({type:"horizontalRule"}),r+=1;continue}if(/^\s*>/.test(i)){let d=[];while(r<t.length&&/^\s*>/.test(t[r]??""))d.push((t[r]??"").replace(/^\s*>\s?/,"")),r+=1;e.push({type:"blockquote",content:g(d)});continue}if(p(i)){let[d,l]=H(t,r);e.push(d),r=l;continue}let s=[];while(r<t.length){let d=t[r]??"";if(d.trim().length===0||p(d)||/^(#{1,6})\s/.test(d)||/^\s*>/.test(d)||/^\s*`{3,}/.test(d))break;s.push(d.trim()),r+=1}e.push({type:"paragraph",content:k(s.join(" "))})}return e}function p(t){let e=/^(\s*)[-*+]\s+(\[([ xX])\]\s+)?(.*)$/.exec(t);if(e){let i=e[3];return{ordered:!1,task:i===void 0?null:i.toLowerCase()==="x",indent:(e[1]??"").length,text:e[4]??"",start:1}}let r=/^(\s*)(\d+)[.)]\s+(.*)$/.exec(t);if(r)return{ordered:!0,task:null,indent:(r[1]??"").length,text:r[3]??"",start:Number(r[2]??1)};return null}function H(t,e){let r=p(t[e]??"");if(!r)return[{type:"paragraph"},e+1];let i=[],o=e;while(o<t.length){let s=p(t[o]??"");if(!s||s.indent!==r.indent)break;if(s.ordered!==r.ordered)break;if(s.task===null!==(r.task===null))break;let d=[s.text];o+=1;while(o<t.length){let l=t[o]??"";if(l.trim().length===0)break;let c=p(l);if(c&&c.indent<=r.indent)break;if(!c&&l.search(/\S/)<=r.indent)break;d.push(l.slice(r.indent+2)),o+=1}i.push({type:r.task===null?"listItem":"taskItem",...s.task===null?{}:{attrs:{checked:s.task}},content:g(d)})}let a=r.task!==null?"taskList":r.ordered?"orderedList":"bulletList";return[{type:a,...a==="orderedList"&&r.start!==1?{attrs:{start:r.start}}:{},content:i},o]}function k(t){let e=[],r="",i=()=>{if(r.length===0)return;e.push({type:"text",text:r}),r=""},o=0;while(o<t.length){let a=t.slice(o);if(a.startsWith("\\")&&a.length>1){r+=a[1],o+=2;continue}let s=/^\[([^\]]*)\]\(([^)\s]*)(?:\s+"([^"]*)")?\)/.exec(a);if(s){if(i(),o>0&&t[o-1]==="!"){e.push({type:"image",attrs:{src:s[2]??"",alt:s[1]??""}});let f=e.at(-2);if(f?.type==="text"&&f.text?.endsWith("!"))f.text=f.text.slice(0,-1)}else e.push({type:"text",text:s[1]??"",marks:[{type:"link",attrs:{href:s[2]??""}}]});o+=s[0].length;continue}let d=A(a);if(d){i();for(let c of k(d.inner))e.push(L(c,d.mark));o+=d.length;continue}let l=/^`([^`]+)`/.exec(a);if(l){i(),e.push({type:"text",text:l[1]??"",marks:[{type:"code"}]}),o+=l[0].length;continue}r+=t[o],o+=1}return i(),e}function A(t){let e=[[/^\*\*\*([^*]+)\*\*\*/,{type:"bold"}],[/^\*\*([^*]+)\*\*/,{type:"bold"}],[/^__([^_]+)__/,{type:"bold"}],[/^~~([^~]+)~~/,{type:"strike"}],[/^\*([^*]+)\*/,{type:"italic"}],[/^_([^_]+)_/,{type:"italic"}]];for(let[r,i]of e){let o=r.exec(t);if(o)return{mark:i,inner:o[1]??"",length:o[0].length}}return null}function L(t,e){if(t.type!=="text")return t;return{...t,marks:[...t.marks??[],e]}}export{x,Y,Ne,wt,Tn,Sn,de,ue,On,J,_n,Ue,oo,We,vt,Z,yo,bo,wo,vo,Ao,xo,ko,Ro,Co,To,So,Oo,_o,Po,$o,jo,Io,Eo,Do,Mo,qo,Lo,Fo,pe,Pn};
@@ -0,0 +1,26 @@
1
+ import{Ae,xe}from"./index-gpwcmmvr.js";import{N}from"./index-y5mwknr9.js";import{e,n}from"./index-x72d1hzh.js";class S{columns=new Map;documentColumns=new Map;constructor(t){if(t)this.use(t)}use(t){this.columns.clear(),this.documentColumns.clear();for(let r of t.tables)if(this.columns.set(r.name,new Map(r.columns.map((i)=>[i.name,i.type]))),r.documentColumn)this.documentColumns.set(r.name,r.documentColumn)}columnType(t,r){return this.columns.get(t)?.get(r)}documentColumn(t){return this.documentColumns.get(t)}tableColumns(t){return[...this.columns.get(t)?.keys()??[]]}knows(t){return this.columns.has(t)}}class E{dialect;catalog;constructor(t,r){this.dialect=t;this.catalog=r}compileQuery(t){let r=[],i=this.dialect.quote(t.table),a=`SELECT ${t.count?"COUNT(*) AS count":this.compileSelect(t)} FROM ${i}`;if(t.where)a+=` WHERE ${this.compileWhere(t.table,t.where,r)}`;if(!t.count&&t.orderBy&&t.orderBy.length>0){let o=t.orderBy.map((c)=>{let u=this.resolve(t.table,c.path),l=c.direction==="desc"?"DESC":"ASC";return`${this.expression(u)} ${l}`}).join(", ");a+=` ORDER BY ${o}`}if(!t.count&&t.limit!==void 0)a+=` LIMIT ${y(t.limit)}`;if(!t.count&&t.offset!==void 0)a+=` OFFSET ${y(t.offset)}`;return{text:a,values:r}}compileMutation(t){let r=[],i=this.dialect.quote(t.table);if(t.kind==="insert"){let o=Object.entries(t.values);if(o.length===0)throw new e("An insert needs at least one column.",{code:"empty_insert"});let c=o.map(([m])=>this.dialect.quote(m)).join(", "),u=o.map(([m,g])=>(r.push(this.encodeColumn(t.table,m,g)),this.dialect.placeholder(r.length))).join(", "),l=t.returning===!1?"":" RETURNING *";return{text:`INSERT INTO ${i} (${c}) VALUES (${u})${l}`,values:r}}if(t.kind==="update"){let o=Object.entries(t.set);if(o.length===0)throw new e("An update needs at least one column.",{code:"empty_update"});let c=o.map(([m,g])=>(r.push(this.encodeColumn(t.table,m,g)),`${this.dialect.quote(m)} = ${this.dialect.placeholder(r.length)}`)).join(", "),u=this.compileWhere(t.table,t.where,r),l=t.returning===!1?"":" RETURNING *";return{text:`UPDATE ${i} SET ${c} WHERE ${u}${l}`,values:r}}let s=this.compileWhere(t.table,t.where,r),a=t.returning===!0?" RETURNING *":"";return{text:`DELETE FROM ${i} WHERE ${s}${a}`,values:r}}decodeRow(t,r){let i={};for(let[s,a]of Object.entries(r)){let o=this.catalog.columnType(t,s);i[s]=o===void 0?a:this.dialect.decode(a,o)}return i}compileSelect(t){if(!t.select||t.select.length===0)return"*";return t.select.map((r)=>{let i=this.resolve(t.table,r);if(i.path.length===0)return this.dialect.quote(r);return`${this.expression(i)} AS "${r.replaceAll('"',"")}"`}).join(", ")}compileWhere(t,r,i){if(r.kind==="and"||r.kind==="or"){if(r.conditions.length===0)return r.kind==="and"?"1 = 1":"1 = 0";return`(${r.conditions.map((o)=>this.compileWhere(t,o,i)).join(r.kind==="and"?" AND ":" OR ")})`}if(r.kind==="not")return`NOT (${this.compileWhere(t,r.condition,i)})`;let s=this.resolve(t,r.path);return this.compileComparison(s,r.operator,r.value,i)}comparisonExpression(t,r){if(t.path.length===0)return this.dialect.quote(t.column);return this.dialect.jsonExtract(t.column,t.path,r)}compileComparison(t,r,i,s){let a=Array.isArray(i)?i[0]:i,o=j(t,a??null),c=this.comparisonExpression(t,o),u=(l)=>(s.push(this.dialect.encode(l,o)),this.dialect.placeholder(s.length));switch(r){case"eq":case"ne":{if(i===null)return`${c} IS ${r==="eq"?"":"NOT "}NULL`;return`${c} ${r==="eq"?"=":"<>"} ${u(i)}`}case"gt":case"gte":case"lt":case"lte":{let l={gt:">",gte:">=",lt:"<",lte:"<="}[r];return`${c} ${l} ${u(i)}`}case"in":case"nin":{let l=Array.isArray(i)?i:[i];if(l.length===0)return r==="in"?"1 = 0":"1 = 1";let m=l.map((g)=>u(g)).join(", ");return`${c} ${r==="in"?"IN":"NOT IN"} (${m})`}case"like":case"ilike":{let l=this.dialect.likeOperator(r==="ilike");return`${c} ${l} ${u(i)}`}case"contains":{s.push(String(i));let l=this.dialect.placeholder(s.length);return this.dialect.jsonArrayMembership(t.column,t.path,l)}case"exists":return`${c} IS ${i===!1?"":"NOT "}NULL`}}expression(t){if(t.path.length===0)return this.dialect.quote(t.column);return this.dialect.jsonExtract(t.column,t.path,t.type)}resolve(t,r){let i=r.split("."),s=i[0],a=this.catalog.columnType(t,s);if(a!==void 0&&i.length===1)return{column:s,path:[],type:a};if(a!==void 0)return{column:s,path:i.slice(1),type:"text"};let o=this.catalog.documentColumn(t);if(!o)throw new e(`Unknown column ${t}.${r}`,{status:400,code:"unknown_column"});return{column:o,path:i,type:"text"}}encodeColumn(t,r,i){let s=this.catalog.columnType(t,r);if(s===void 0)throw new e(`Unknown column ${t}.${r}`,{status:400,code:"unknown_column"});return this.dialect.encode(i,s)}}function j(t,r){if(t.path.length===0)return t.type;if(r instanceof Date)return"timestamp";if(typeof r==="number")return"real";if(typeof r==="boolean")return"boolean";return"text"}function y(t){if(!Number.isInteger(t)||t<0)throw new e(`Expected a non-negative integer, received ${t}`,{code:"invalid_pagination"});return t}class T{dialect;target;constructor(t,r){this.dialect=t;this.target=r}render(t){return`${t.flatMap((i)=>{let s=this.renderStep(i);return[`-- ${xe(i)}`,...s]}).join(`
2
+ `)}
3
+ `}renderStep(t){switch(t.kind){case"create_table":return[this.createTable(t.table)];case"drop_table":return[`DROP TABLE IF EXISTS ${this.q(t.table)};`];case"add_column":return this.addColumn(t.table,t.column);case"drop_column":return[`ALTER TABLE ${this.q(t.table)} DROP COLUMN ${this.q(t.column)};`];case"alter_column":return this.alterColumn(t.table,t.column);case"create_index":return[this.createIndex(t.index)];case"drop_index":return[`DROP INDEX IF EXISTS ${this.q(t.index)};`];case"set_document_field":return[this.setDocumentField(t.table,t.collection,t.documentColumn,t.path,t.value)];case"unset_document_field":return[this.unsetDocumentField(t.table,t.collection,t.documentColumn,t.path)]}}createTable(t){let r=t.columns.map((i)=>this.columnClause(i));if(t.primaryKey.length>0)r.push(`PRIMARY KEY (${t.primaryKey.map((i)=>this.q(i)).join(", ")})`);for(let i of t.columns){if(!i.references)continue;r.push(`FOREIGN KEY (${this.q(i.name)}) REFERENCES ${this.q(i.references.table)} (${this.q(i.references.column)})${I(i.references.onDelete)}`)}return`CREATE TABLE IF NOT EXISTS ${this.q(t.name)} (
4
+ ${r.join(`,
5
+ `)}
6
+ );`}columnClause(t){let r=[this.q(t.name),this.dialect.columnType(t)];if(!t.nullable)r.push("NOT NULL");if(t.default!==void 0)r.push(`DEFAULT ${this.literal(t)}`);return r.join(" ")}addColumn(t,r){if(!r.nullable&&r.default===void 0)throw new n(`${t}.${r.name}`,"a required column needs a default before it can be added to an existing table");return[`ALTER TABLE ${this.q(t)} ADD COLUMN ${this.columnClause(r)};`]}alterColumn(t,r){if(this.dialect.supportsAlterColumn){let o=this.q(r.name),c=[`ALTER TABLE ${this.q(t)} ALTER COLUMN ${o} TYPE ${this.dialect.columnType(r)} USING ${o}::${this.dialect.columnType(r)};`,`ALTER TABLE ${this.q(t)} ALTER COLUMN ${o} ${r.nullable?"DROP NOT NULL":"SET NOT NULL"};`];return c.push(r.default===void 0?`ALTER TABLE ${this.q(t)} ALTER COLUMN ${o} DROP DEFAULT;`:`ALTER TABLE ${this.q(t)} ALTER COLUMN ${o} SET DEFAULT ${this.literal(r)};`),c}let i=this.target().tables.find((o)=>o.name===t);if(!i)throw new n(t,"cannot rebuild a table that is not in the target schema");let s=`${t}__rebuild`,a=i.columns.map((o)=>this.q(o.name)).join(", ");return[this.createTable({...i,name:s}),`INSERT INTO ${this.q(s)} (${a}) SELECT ${a} FROM ${this.q(t)};`,`DROP TABLE ${this.q(t)};`,`ALTER TABLE ${this.q(s)} RENAME TO ${this.q(t)};`,...i.indexes.map((o)=>this.createIndex(o))]}createIndex(t){let r=t.targets.map((a)=>a.kind==="column"?this.q(a.column):`(${this.dialect.jsonExtract(a.column,a.path,a.type)})`).join(", "),i=t.unique?"UNIQUE ":"",s=t.where?` WHERE ${this.q(t.where.column)} = ${d(t.where.equals)}`:"";return`CREATE ${i}INDEX IF NOT EXISTS ${this.q(t.name)} ON ${this.q(t.table)} (${r})${s};`}setDocumentField(t,r,i,s,a){let o=this.q(i),c=d(JSON.stringify(a)),u=`WHERE "collection" = ${d(r)}`;if(this.dialect.id==="postgres"){let m=`'{${s.join(",")}}'`;return`UPDATE ${this.q(t)} SET ${o} = jsonb_set(${o}, ${m}, ${c}::jsonb, true) ${u} AND ${o} #> ${m} IS NULL;`}let l=d(`$.${s.join(".")}`);return`UPDATE ${this.q(t)} SET ${o} = json_set(${o}, ${l}, json(${c})) ${u} AND json_extract(${o}, ${l}) IS NULL;`}unsetDocumentField(t,r,i,s){let a=this.q(i),o=`WHERE "collection" = ${d(r)}`;if(this.dialect.id==="postgres")return`UPDATE ${this.q(t)} SET ${a} = ${a} #- '{${s.join(",")}}' ${o};`;return`UPDATE ${this.q(t)} SET ${a} = json_remove(${a}, ${d(`$.${s.join(".")}`)}) ${o};`}literal(t){let r=t.default;if(r===null||r===void 0)return"NULL";if(typeof r==="number")return String(r);if(typeof r==="boolean")return this.dialect.id==="postgres"?String(r):r?"1":"0";return d(String(r))}q(t){return this.dialect.quote(t)}}function I(t){switch(t){case"cascade":return" ON DELETE CASCADE";case"set-null":return" ON DELETE SET NULL";case"restrict":return" ON DELETE RESTRICT";default:return""}}function d(t){return`'${t.replaceAll("'","''")}'`}function _t(t){let r=[],i="",s=!1;for(let a=0;a<t.length;a+=1){let o=t[a];if(o==="'"){if(s&&t[a+1]==="'"){i+="''",a+=1;continue}s=!s,i+=o;continue}if(o==="-"&&!s&&t[a+1]==="-"){let c=t.indexOf(`
7
+ `,a);a=c===-1?t.length:c;continue}if(o===";"&&!s){if(i.trim())r.push(i.trim());i="";continue}i+=o}if(i.trim())r.push(i.trim());return r}async function R(t){let r=await t.all(`SELECT table_name, column_name, data_type, is_nullable, column_default
8
+ FROM information_schema.columns
9
+ WHERE table_schema = current_schema()
10
+ ORDER BY table_name, column_name`,[]),i=await t.all(`SELECT tablename AS table_name, indexname AS index_name, indexdef AS definition
11
+ FROM pg_indexes
12
+ WHERE schemaname = current_schema()
13
+ ORDER BY tablename, indexname`,[]),s=await t.all(`SELECT tc.table_name, kcu.column_name
14
+ FROM information_schema.table_constraints tc
15
+ JOIN information_schema.key_column_usage kcu
16
+ ON kcu.constraint_name = tc.constraint_name
17
+ AND kcu.table_schema = tc.table_schema
18
+ WHERE tc.constraint_type = 'PRIMARY KEY'
19
+ AND tc.table_schema = current_schema()
20
+ ORDER BY tc.table_name, kcu.ordinal_position`,[]),a=new Map;for(let o of r)A(a,String(o.table_name)).columns.push({name:String(o.column_name),type:M(String(o.data_type)),nullable:o.is_nullable==="YES",storage:"column"});for(let o of s){let c=a.get(String(o.table_name));if(c)c.primaryKey.push(String(o.column_name))}for(let o of i){let c=a.get(String(o.table_name));if(!c)continue;let u=String(o.definition);c.indexes.push({name:String(o.index_name),table:c.name,targets:[],unique:u.startsWith("CREATE UNIQUE")})}return x(a)}async function w(t){let r=await t.all("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name",[]),i=new Map;for(let s of r){let a=String(s.name),o=A(i,a),c=await t.all(`PRAGMA table_info(${C(a)})`,[]);for(let l of c)if(o.columns.push({name:String(l.name),type:k(String(l.type)),nullable:Number(l.notnull)===0,storage:"column"}),Number(l.pk)>0)o.primaryKey.push(String(l.name));let u=await t.all(`PRAGMA index_list(${C(a)})`,[]);for(let l of u){let m=String(l.name);if(m.startsWith("sqlite_autoindex"))continue;o.indexes.push({name:m,table:a,targets:[],unique:Number(l.unique)===1})}}return x(i)}function A(t,r){let i=t.get(r);if(i)return i;let s={name:r,columns:[],primaryKey:[],indexes:[]};return t.set(r,s),s}function x(t){return{version:1,tables:[...t.values()].filter((i)=>i.name!==N).map((i)=>({...i,columns:b(i.columns),indexes:b(i.indexes)})).sort((i,s)=>i.name.localeCompare(s.name)),collections:[]}}function b(t){return[...t].sort((r,i)=>r.name.localeCompare(i.name))}function M(t){switch(t){case"integer":return"integer";case"bigint":return"bigint";case"double precision":case"numeric":case"real":return"real";case"boolean":return"boolean";case"timestamp with time zone":case"timestamp without time zone":return"timestamp";case"jsonb":case"json":return"json";case"bytea":return"blob";default:return"text"}}function k(t){let r=t.toUpperCase();if(r.includes("INT"))return"integer";if(r.includes("REAL")||r.includes("DOUB"))return"real";if(r.includes("BLOB"))return"blob";return"text"}function C(t){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(t))throw Error(`Unsafe SQL identifier: ${t}`);return`"${t}"`}class h{id;real;driver;constructor(t,r,i){this.id=t;this.real=r;this.driver=i}}class re{driver;dialect;id;capabilities;catalog=new S;compiler;renderer;schema={version:1,tables:[],collections:[]};journalReady=!1;transactionDepth=0;constructor(t,r,i={}){this.driver=t;this.dialect=r;if(this.id=t.id,this.capabilities={transactions:!0,sqlMigrations:!0,jsonQuery:!0,...i.capabilities},this.compiler=new E(r,this.catalog),this.renderer=new T(r,()=>this.schema),i.schema)this.useSchema(i.schema)}useSchema(t){this.schema=t,this.catalog.use(t)}introspect(){return this.dialect.id==="postgres"?R(this.driver):w(this.driver)}plan(t,r){return Ae(t,r)}render(t,r){return{id:r,extension:"sql",content:`-- ${r}
21
+ ${this.renderer.render(t)}`,summary:t.map(xe)}}async applyMigration(t){await this.ensureJournal();for(let r of _t(t.content))await this.driver.exec(r)}async listAppliedMigrations(){return await this.ensureJournal(),(await this.driver.all(`SELECT id, checksum, applied_at FROM ${this.dialect.quote(N)} ORDER BY id`,[])).map((r)=>({id:String(r.id),checksum:String(r.checksum),appliedAt:new Date(String(r.applied_at))}))}async recordMigration(t,r){await this.ensureJournal(),await this.driver.run(`INSERT INTO ${this.dialect.quote(N)} (id, checksum, applied_at) VALUES (${this.dialect.placeholder(1)}, ${this.dialect.placeholder(2)}, ${this.dialect.placeholder(3)})`,[t,r,new Date().toISOString()])}async transaction(t){if(!this.capabilities.transactions)return t(new h(f(),!1,this.driver));if(this.transactionDepth>0)return t(new h(f(),!0,this.driver));if(this.driver.transaction)return this.driver.transaction((r)=>t(new h(f(),!0,r)));this.transactionDepth+=1,await this.driver.exec("BEGIN");try{let r=await t(new h(f(),!0,this.driver));return await this.driver.exec("COMMIT"),r}catch(r){throw await this.driver.exec("ROLLBACK"),r}finally{this.transactionDepth-=1}}async query(t,r){let i=this.compiler.compileQuery(r),s=await D(t,this.driver).all(i.text,i.values);if(r.count===!0)return[{count:Number(s[0]?.count??0)}];return s.map((a)=>this.compiler.decodeRow(r.table,a))}async mutate(t,r){let i=this.compiler.compileMutation(r),s=D(t,this.driver);if(i.text.includes(" RETURNING ")){let c=await s.all(i.text,i.values);return{rows:c.map((u)=>this.compiler.decodeRow(r.table,u)),count:c.length}}let o=await s.run(i.text,i.values);return{rows:[],count:o.rowsAffected}}async close(){await this.driver.close?.()}async ensureJournal(){if(this.journalReady)return;await this.driver.exec(`CREATE TABLE IF NOT EXISTS ${this.dialect.quote(N)} (
22
+ ${this.dialect.quote("id")} TEXT NOT NULL PRIMARY KEY,
23
+ ${this.dialect.quote("checksum")} TEXT NOT NULL,
24
+ ${this.dialect.quote("applied_at")} TEXT NOT NULL
25
+ )`),this.journalReady=!0}}function D(t,r){return t instanceof h?t.driver:r}var L=0;function f(){return L+=1,`tx_${L}`}var p=(t)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(t))throw Error(`Unsafe SQL identifier: ${t}`);return`"${t}"`};function q(t){return`$${t.map((r)=>`."${r.replaceAll('"',"\\\"")}"`).join("")}`}var P={text:"text",integer:"integer",bigint:"bigint",real:"double precision",boolean:"boolean",timestamp:"timestamptz",json:"jsonb",blob:"bytea"},Nn={id:"postgres",placeholder:(t)=>`$${t}`,quote:p,columnType:(t)=>t.array===!0?"jsonb":P[t.type],jsonExtract(t,r,i){let s=`${p(t)} #>> '{${r.map(_).join(",")}}'`;switch(i){case"integer":case"bigint":return`(${s})::bigint`;case"real":return`(${s})::double precision`;case"boolean":return`(${s})::boolean`;case"timestamp":return`(${s})::timestamptz`;default:return`(${s})`}},jsonArrayMembership(t,r,i){return`EXISTS (SELECT 1 FROM jsonb_array_elements_text(${r.length===0?p(t):`${p(t)} #> '{${r.map(_).join(",")}}'`}) AS membership(value) WHERE membership.value = ${i})`},likeOperator:(t)=>t?"ILIKE":"LIKE",encode(t,r){if(t===void 0||t===null)return null;if(r==="json")return JSON.stringify(t);if(r==="timestamp")return O(t);return t},decode(t,r){if(t===null||t===void 0)return null;if(r==="timestamp")return t instanceof Date?t:new Date(String(t));if(r==="json"&&typeof t==="string")return JSON.parse(t);if(r==="bigint"&&typeof t==="string")return Number(t);return t},supportsAlterColumn:!0};function _(t){return/[,{}"\s]/.test(t)?`"${t.replaceAll('"',"\\\"")}"`:t}var U={text:"TEXT",integer:"INTEGER",bigint:"INTEGER",real:"REAL",boolean:"INTEGER",timestamp:"INTEGER",json:"TEXT",blob:"BLOB"},Ye={id:"sqlite",placeholder:()=>"?",quote:p,columnType:(t)=>t.array===!0?"TEXT":U[t.type],jsonExtract(t,r,i){let s=`json_extract(${p(t)}, '${q(r)}')`;return i==="timestamp"?`CAST(ROUND((julianday(${s}) - 2440587.5) * 86400000) AS INTEGER)`:s},jsonArrayMembership(t,r,i){return`EXISTS (SELECT 1 FROM json_each(${r.length===0?p(t):`json_extract(${p(t)}, '${q(r)}')`}) WHERE json_each.value = ${i})`},likeOperator:()=>"LIKE",encode(t,r){if(t===void 0||t===null)return null;if(r==="json")return JSON.stringify(t);if(r==="timestamp")return O(t).getTime();if(r==="boolean")return t===!0?1:0;return t},decode(t,r){if(t===null||t===void 0)return null;if(r==="timestamp")return new Date(typeof t==="number"?t:Number(t));if(r==="boolean")return t===1||t===!0;if(r==="json"){if(typeof t!=="string")return t;return JSON.parse(t)}return t},supportsAlterColumn:!1};function O(t){if(t instanceof Date)return t;if(typeof t==="number")return new Date(t);return new Date(String(t))}
26
+ export{_t,re,Nn,Ye};
@@ -0,0 +1,2 @@
1
+ import{n}from"./index-x72d1hzh.js";var e={ms:1,s:1000,m:60000,h:3600000,d:86400000,w:604800000};function b(t,s=""){let r=/^(\d+(?:\.\d+)?)(ms|s|m|h|d|w)$/.exec(t.trim());if(!r)throw new n(s,`"${t}" is not a duration; use 30d, 10s, 1h`);return Number(r[1])*e[r[2]]}var i={b:1,kb:1024,mb:1048576,gb:1073741824};function ee(t,s=""){let r=/^(\d+(?:\.\d+)?)(b|kb|mb|gb)$/i.exec(t.trim());if(!r)throw new n(s,`"${t}" is not a size; use 25mb, 512kb`);return Math.floor(Number(r[1])*i[r[2].toLowerCase()])}
2
+ export{b,ee};
File without changes
File without changes
@@ -0,0 +1,2 @@
1
+ function Ae(e,n){let t=[],a=[],r=[],i=[],c=[],o=[],s=[],f=[],p=d(e.tables),x=d(n.tables),g=[];for(let u of l(n.tables)){let h=p.get(u.name);if(!h){g.push(u);for(let M of l(u.indexes))c.push({kind:"create_index",index:M});continue}C(h,u,a,r,s),T(h,u,i,c)}for(let u of _(g))t.push({kind:"create_table",table:u});let y=l(e.tables).filter((u)=>!x.has(u.name));for(let u of _(y).reverse())f.push({kind:"drop_table",table:u.name});return w(e,n,o),[...t,...a,...r,...i,...c,...o,...s,...f]}function _(e){let n=new Map(l(e).map((i)=>[i.name,i])),t=[],a=new Set,r=(i)=>{if(!n.has(i.name))return;if(a.has(i.name))return;a.add(i.name);for(let c of l(i.columns)){let o=c.references?.table;if(o===void 0||o===i.name)continue;let s=n.get(o);if(s)r(s)}if(a.delete(i.name),n.delete(i.name))t.push(i)};for(let i of l(e))r(i);return t}function C(e,n,t,a,r){let i=d(e.columns),c=d(n.columns);for(let o of l(n.columns)){let s=i.get(o.name);if(!s){t.push({kind:"add_column",table:n.name,column:o});continue}let f=k(s,o);if(f.length>0)a.push({kind:"alter_column",table:n.name,column:o,previous:s,changes:f})}for(let o of l(e.columns))if(!c.has(o.name))r.push({kind:"drop_column",table:e.name,column:o.name})}function k(e,n){let t=[];if(e.type!==n.type||e.array!==n.array)t.push("type");if(e.nullable!==n.nullable)t.push("nullable");if(!m(e.default,n.default))t.push("default");if(!m(e.references,n.references))t.push("references");return t}function T(e,n,t,a){let r=d(e.indexes),i=d(n.indexes);for(let c of l(e.indexes)){let o=i.get(c.name);if(!o){t.push({kind:"drop_index",table:e.name,index:c.name});continue}if(!b(c,o))t.push({kind:"drop_index",table:e.name,index:c.name})}for(let c of l(n.indexes)){let o=r.get(c.name);if(!o||!b(o,c))a.push({kind:"create_index",index:c})}}function b(e,n){return e.unique===n.unique&&m(e.targets,n.targets)&&m(e.where,n.where)}function w(e,n,t){let a=d(e.collections);for(let r of l(n.collections)){let i=a.get(r.name),c=d(i?.fields??[]);for(let o of l(r.fields)){let s=c.get(o.name),f=!m(s?.default,o.default),p=s===void 0;if(o.localized)continue;if(o.default!==void 0&&(p||f))t.push({kind:"set_document_field",table:r.table,collection:r.slug,documentColumn:r.documentColumn,path:S(o),value:o.default})}if(i){let o=d(r.fields);for(let s of l(i.fields))if(!o.has(s.name)&&!s.localized)t.push({kind:"unset_document_field",table:r.table,collection:r.slug,documentColumn:r.documentColumn,path:S(s)})}}}function S(e){return[e.name]}function d(e){return new Map(e.map((n)=>[n.name,n]))}function l(e){return[...e].sort((n,t)=>n.name.localeCompare(t.name))}function m(e,n){if(e===n)return!0;if(e===void 0||n===void 0)return!1;return je(e)===je(n)}function je(e){if(e===null||typeof e!=="object")return JSON.stringify(e)??"null";if(Array.isArray(e))return`[${e.map((t)=>je(t)).join(",")}]`;return`{${Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[a])=>t.localeCompare(a)).map(([t,a])=>`${JSON.stringify(t)}:${je(a)}`).join(",")}}`}function xe(e){switch(e.kind){case"create_table":return`create table ${e.table.name}`;case"drop_table":return`drop table ${e.table}`;case"add_column":return`add ${e.table}.${e.column.name} (${v(e.column.type,e.column.array)})`;case"drop_column":return`drop ${e.table}.${e.column}`;case"alter_column":return`alter ${e.table}.${e.column.name} (${e.changes.join(", ")})`;case"create_index":return`create ${e.index.unique?"unique ":""}index ${e.index.name}`;case"drop_index":return`drop index ${e.index}`;case"set_document_field":return`backfill ${e.collection}.${e.path.join(".")} = ${JSON.stringify(e.value)}`;case"unset_document_field":return`remove ${e.collection}.${e.path.join(".")} from stored documents`}}function v(e,n){return n===!0?`${e}[]`:e}function En(e){if(e.length===0)return"empty";let n=e[0],t=(()=>{switch(n.kind){case"create_table":return e.filter((a)=>a.kind==="create_table").length>1?"create_schema":`create_${n.table.name}`;case"drop_table":return`drop_${n.table}`;case"add_column":return`add_${n.table}_${n.column.name}`;case"drop_column":return`drop_${n.table}_${n.column}`;case"alter_column":return`alter_${n.table}_${n.column.name}`;case"create_index":return`index_${n.index.name.replace(/^(idx|uniq)_/,"")}`;case"drop_index":return`drop_index_${n.index.replace(/^(idx|uniq)_/,"")}`;case"set_document_field":return`backfill_${n.collection}_${n.path.join("_")}`;case"unset_document_field":return`remove_${n.collection}_${n.path.join("_")}`}})();return j(e.length>1?`${t}_and_${e.length-1}_more`:t)}function j(e){let n=e.toLowerCase().replace(/[^a-z0-9]+/g,"_"),t=0,a=n.length;while(t<a&&n[t]==="_")t++;while(a>t&&n[a-1]==="_")a--;return n.slice(t,a).slice(0,60)}
2
+ export{Ae,je,xe,En};
@@ -0,0 +1,3 @@
1
+ import{J}from"./index-9zqnf6gx.js";import{z,$e,bt,C,_}from"./index-vq2978e7.js";import{c}from"./index-2z1qe5mw.js";import{t}from"./index-vxw0a03g.js";import{d}from"./index-9g2n7xa6.js";import{X,on}from"./index-kbsgt44t.js";import{w}from"./index-2kb5nbxx.js";import{e}from"./index-x72d1hzh.js";var L="v1",ee=12;async function V(n){if(n.length<16)throw new e("ai.storage.secret must be at least 16 characters; it encrypts provider keys.",{status:500,code:"ai_secret_too_short"});let i=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(n));return crypto.subtle.importKey("raw",i,{name:"AES-GCM"},!1,["encrypt","decrypt"])}async function I(n,i){let r=await V(i),a=crypto.getRandomValues(new Uint8Array(ee)),l=await crypto.subtle.encrypt({name:"AES-GCM",iv:a},r,new TextEncoder().encode(n));return[L,X(a),X(new Uint8Array(l))].join(".")}async function j(n,i){let[r,a,l]=n.split(".");if(r!==L||!a||!l)throw new e("A stored provider key is not in a format this version can read.",{status:500,code:"ai_credential_unreadable"});let s=await V(i);try{let f=await crypto.subtle.decrypt({name:"AES-GCM",iv:on(a)},s,on(l));return new TextDecoder().decode(f)}catch{throw new e("A stored provider key could not be decrypted; ai.storage.secret has probably changed. Re-enter the key in the panel.",{status:500,code:"ai_credential_unreadable"})}}function E(n){return n.length<=4?"****":`…${n.slice(-4)}`}var U;async function F(){return U??=import("@mariozechner/pi-ai").catch(()=>{throw new e('AI needs "@mariozechner/pi-ai". Install it, or set ai.complete to your own implementation.',{status:500,code:"ai_runtime_missing"})}),U}async function hn(n){let{getModel:i}=await F(),r;try{r=i(n.provider,n.model)}catch{r=void 0}if(r)return r;throw await yn(n.provider,n.model),new e(`pi could not resolve ${n.provider}/${n.model}.`,{status:500,code:"ai_unknown_model"})}function B(n,i){let r=gn(n);if(r.includes(i.type))return;throw new e(`The provider "${n}" needs ${r.map((a)=>`"${a}"`).join(" or ")} credentials.`,{status:500,code:"ai_auth_mismatch"})}async function Vn(n,i){switch(B(n,i),i.type){case"api-key":return{getApiKey:()=>i.token};case"oauth":return{getApiKey:()=>i.getAccessToken()};case"aws":{let{streamSimple:r}=await F();return{streamFn:(a,l,s)=>r(a,l,{...s,region:i.region,...i.accessKeyId===void 0?{}:{accessKeyId:i.accessKeyId},...i.secretAccessKey===void 0?{}:{secretAccessKey:i.secretAccessKey}})}}}}var te=new Set(["github-copilot","openai-codex"]);function gn(n){if(n==="amazon-bedrock")return["aws"];if(te.has(n))return["oauth"];return["api-key"]}async function yn(n,i){let{getModel:r,getProviders:a}=await F();try{if(r(n,i))return}catch{}if(!a().includes(n))throw new e(`The AI provider "${n}" is not in pi's catalogue.`,{status:400,code:"ai_unknown_provider"});throw new e(`The provider "${n}" has no model called "${i}".`,{status:400,code:"ai_unknown_model"})}async function Gn(n){try{let{getModels:i}=await F();return i(n).map((r)=>r.id)}catch{return[]}}var Le=async(n)=>{let{complete:i,stream:r}=await F(),{model:a,auth:l}=n;B(a.provider,l);let s=await hn(a),f={systemPrompt:n.system,messages:[{role:"user",content:[{type:"text",text:n.prompt},...(n.images??[]).map((u)=>({type:"image",data:ne(u.data),mimeType:u.contentType}))],timestamp:Date.now()}]},m={...n.maxTokens===void 0?{}:{maxTokens:n.maxTokens},...n.signal===void 0?{}:{signal:n.signal},...l.type==="api-key"?{apiKey:l.token}:{},...l.type==="oauth"?{apiKey:await l.getAccessToken()}:{},...l.type==="aws"?{region:l.region,...l.accessKeyId===void 0?{}:{accessKeyId:l.accessKeyId},...l.secretAccessKey===void 0?{}:{secretAccessKey:l.secretAccessKey}}:{}},g=await i(s,f,m);if(g.stopReason==="error"||g.errorMessage)throw new e(g.errorMessage??"The model returned an error.",{status:502,code:"ai_provider_error"});return{text:g.content.filter((u)=>u.type==="text").map((u)=>u.text).join(""),usage:bn(g.usage)}};function bn(n){return{input:n.input??0,output:n.output??0,total:n.totalTokens??(n.input??0)+(n.output??0),cost:n.cost?.total??0}}function ne(n){let i="";for(let r of n)i+=String.fromCharCode(r);return btoa(i)}async function q(n){let i={input:0,output:0,total:0,cost:0},r=async(s)=>{if(!s.trim())return s;let f=await n.complete({system:"Translate CMS text. Answer with the translation only, without quotes or a preamble. Keep names, placeholders and URLs intact.",prompt:`Translate from ${n.sourceLocale} to ${n.locale}. This text belongs to the ${n.fieldName} field:
2
+
3
+ ${s}`,...n.signal===void 0?{}:{signal:n.signal}});i.input+=f.usage.input,i.output+=f.usage.output,i.total+=f.usage.total,i.cost+=f.usage.cost;let m=f.text.trim();if(!m)throw Error(`AI returned an empty translation for ${n.fieldName}.`);let g=s.slice(0,s.length-s.trimStart().length),o=s.slice(s.trimEnd().length);return`${g}${m}${o}`},a=async(s)=>{if(Array.isArray(s)){let m=[];for(let g of s)m.push(await a(g));return m}if(!s||typeof s!=="object")return s;let f={...s};if(s.type==="text"&&typeof s.text==="string")f.text=await r(s.text);if(s.type==="image"&&s.attrs&&typeof s.attrs==="object"&&!Array.isArray(s.attrs)){let m={...s.attrs};for(let g of["alt","title"])if(typeof m[g]==="string")m[g]=await r(m[g]);f.attrs=m}if(Array.isArray(s.content))f.content=await a(s.content);return f},l=await a(n.value);return{value:l,preview:J(l),usage:i}}var k="cms_ai_credentials";function ht(n){let{config:i}=n,r=i.ai?.complete??Le,a=async(o)=>{try{return await r(o)}catch(u){if(u instanceof e)throw u;if(o.signal?.aborted)throw new e("The request was cancelled.",{status:499,code:"ai_aborted",cause:u});let p=u instanceof Error?u.message:"The AI provider could not complete the request.";throw new e(p,{status:502,code:"ai_provider_error",cause:u})}},l=()=>{let o=i.ai;if(!o)throw new e("This deployment has no `ai` section, so AI is switched off.",{status:501,code:"ai_disabled"});return o},s=(o)=>{let u={...i.collections,...i.globals},p=u[o];if(p)return p;let y=Object.values(u).find((h)=>h.slug===o);if(y)return y;throw e.notFound(`No collection called "${o}".`)},f=async(o)=>{let u=l(),p=await ie(n,o);if(p)return{type:"api-key",token:p};let y=u.auth?.[o];if(y)return y;throw new e(`No credentials for the AI provider "${o}". Add them to ai.auth or store them in the panel.`,{status:500,code:"ai_credentials_missing"})},m=async(o)=>{if(!i.uploads)return null;try{let u=await n.cms().media.variant({id:o});if(!u||!u.contentType.startsWith("image/"))return null;let p=new Uint8Array(await new Response(u.body).arrayBuffer());return{contentType:u.contentType,data:p}}catch{return null}},g=async(o,u,p,y)=>{await(await n.database()).transaction((A)=>n.emit(A,[{type:o,data:y===void 0?u:{...u,error:y instanceof Error?y.message:String(y)},previous:null}],{actor:p,...typeof u.collection==="string"?{collection:u.collection}:{},...typeof u.documentId==="string"?{documentId:u.documentId}:{}})),n.deliver()};return{get enabled(){return i.ai!==void 0},get assistantEnabled(){return i.ai!==void 0&&i.ai.assistant?.enabled!==!1},actions(o){return $e(o)},async run(o){let u=l(),p=s(o.collection),y=o.actor??null,h=o.locale??i.i18n.defaultLocale,A=p.fields[o.field];if(!A)throw e.notFound(`"${o.field}" is not a field of ${p.name}.`);let x=o.action==="generate"&&A.aiGenerate!==void 0?A.aiGenerate:A.ai?.[o.action],T=o.variantTranslation===!0&&o.action==="translate"&&A.localized&&["text","textarea","richText","email","url"].includes(A.type);if(x===void 0&&!T)throw e.notFound(`"${o.action}" is not configured on ${p.name}.${o.field}.`);let R=x===void 0||x===!0?{}:x,S=z(o.action)??bt(o.action,R.prompt??"");if(S.requiresLocalized&&!A.localized)throw e.validation(`"${o.action}" needs a localized field; ${p.name}.${o.field} stores one value for every language.`);let P=o.sourceLocale??(S.requiresLocalized?i.i18n.defaultLocale:h),{document:O,stored:D}=await N(n,p,o,h),H=S.requiresLocalized&&P!==h?(await N(n,p,o,P,o.variantTranslation===!0)).document:O;await C(p,{actor:y,operation:"update",locale:h,rbac:i.rbac,...D===void 0?{}:{record:D}}),_(p,{[o.field]:null},y,h);let W=oe(p,y,h),Q=(R.context??[]).filter((b)=>{if(!(b in p.fields))throw e.validation(`ai.context names "${b}", which is not a field of ${p.name}.`);return W.has(b)}),v=R.model??u.defaultModel,Y=await f(v.provider),K={action:o.action,value:H[o.field]??null,field:A,fieldName:o.field,collection:p,context:Object.fromEntries(Q.map((b)=>[b,O[b]??null])),document:O,locale:h,sourceLocale:P,options:R,model:v,actor:y,loadImage:m,complete:(b)=>a({...b,model:v,auth:Y}),...o.signal===void 0?{}:{signal:o.signal}},Z=Date.now();try{let b=T&&A.type==="richText"?await q(K):await S.run(K);return await g("ai.task.completed",{collection:p.name,field:o.field,action:o.action,locale:h,provider:v.provider,model:v.model,usage:b.usage,durationMs:Date.now()-Z,...o.id===void 0?{}:{documentId:o.id}},y),{collection:p.name,field:o.field,action:o.action,value:b.value,preview:b.preview,model:v,usage:b.usage}}catch(b){throw await g("ai.task.failed",{collection:p.name,field:o.field,action:o.action,locale:h,provider:v.provider,model:v.model,...o.id===void 0?{}:{documentId:o.id}},y,b),b}},runAssistant(o){return async function*(){let{runAssistant:u}=await import("./run-3r72dwhs.js");yield*u({args:o,config:i,cms:n.cms(),database:()=>n.database(),authFor:f,record:g})}()},approveAssistantPlan(o){return import("./run-3r72dwhs.js").then(({approvePlan:u})=>u({args:o,config:i,cms:n.cms(),database:()=>n.database(),record:g}))},async providers(){let o=i.ai,u=new Map;for(let[y,h]of Object.entries(o?.auth??{}))u.set(y,{provider:y,configured:!0,source:"config",type:h.type,hint:null,updatedAt:null});if(o?.storage?.secret){let y=await n.database(),h=await y.transaction((A)=>y.query(A,{table:k}));for(let A of h)u.set(String(A.provider),{provider:String(A.provider),configured:!0,source:"database",type:"api-key",hint:A.hint===null||A.hint===void 0?null:String(A.hint),updatedAt:c(A.updated_at)})}let p=o?.defaultModel.provider;if(p&&!u.has(p))u.set(p,{provider:p,configured:!1,source:null,type:null,hint:null,updatedAt:null});return[...u.values()].sort((y,h)=>y.provider.localeCompare(h.provider))},async setCredential(o){let p=l().storage?.secret;if(!p)throw new e("Set ai.storage.secret to store provider keys in the database; without it keys can only come from ai.auth.",{status:501,code:"ai_storage_disabled"});let y=o.token.trim();if(y.length===0)throw e.validation("A provider key cannot be empty.");let h=await n.database(),A=new Date,x=await I(y,p),T=E(y);return await h.transaction(async(S)=>{let P=d(h,S);if(await P.findOne(k,t("provider",o.provider)))await P.update(k,t("provider",o.provider),{secret:x,hint:T,updated_at:A});else await P.insert(k,{id:w("aic"),provider:o.provider,auth_type:"api-key",secret:x,hint:T,created_at:A,updated_at:A});return{provider:o.provider,configured:!0,source:"database",type:"api-key",hint:T,updatedAt:A.toISOString()}})},async removeCredential(o){l();let u=await n.database();return u.transaction(async(p)=>await d(u,p).delete(k,t("provider",o.provider))>0)}}}async function ie(n,i){let r=n.config.ai?.storage?.secret;if(!r)return null;let a=await n.database(),l=await a.transaction(async(s)=>d(a,s).findOne(k,t("provider",i)));if(!l||typeof l.secret!=="string")return null;return j(l.secret,r)}async function N(n,i,r,a,l=!1){let s=n.cms(),f=r.actor??null,m;if(i.kind==="global"){let o=s.globals[i.name];if(o)m=await o.get({actor:f,locale:a,...l?{fallbackLocale:!1}:{}})}else if(r.id){let g=s.api[i.name],o=g?await g.findById(r.id,{actor:f,locale:a,...l?{fallbackLocale:!1}:{}}):null;if(!o)throw e.notFound(`No ${i.name} with id "${r.id}", or it is not readable.`);m=o}return{document:{...m??{},...r.document??{}},stored:m}}function oe(n,i,r){let a=new Set;for(let[l,s]of Object.entries(n.fields)){let f=s.access?.read;if(f&&!f({actor:i,locale:r}))continue;a.add(l)}return a}function pt(n,i,r){let a=n.i18n.defaultLocale,l=Object.values(n.collections).map((m)=>G(m,i,a)).filter((m)=>m!==null),s=Object.values(n.globals).map((m)=>G(m,i,a)).filter((m)=>m!==null),f={collections:l,globals:s,defaultLocale:a,locales:r,media:n.uploads!==void 0,trash:n.trash.enabled};return{...f,fingerprint:se(f)}}function G(n,i,r){if(!M(n,"read",i,r))return null;let a=[];for(let[l,s]of Object.entries(n.fields)){let f=s.access?.read;if(f&&!f({actor:i,locale:r}))continue;a.push(re(l,s,n,i,r))}return{name:n.name,slug:n.slug,label:n.label,kind:n.kind,titleField:ft(n),fields:a,can:{read:!0,create:n.kind==="collection"&&M(n,"create",i,r),update:M(n,"update",i,r),delete:n.kind==="collection"&&M(n,"delete",i,r)}}}function re(n,i,r,a,l){let s=i.options,f=Array.isArray(s.options)?s.options.map((m)=>typeof m==="string"?m:typeof m==="object"&&m!==null?String(m.value??""):"").filter((m)=>m.length>0):void 0;return{name:n,type:i.type,label:typeof s.label==="string"?s.label:n,required:i.required,localized:i.localized===!0,...f&&f.length>0?{options:f}:{},...i.relationTo===void 0?{}:{relationTo:i.relationTo},writable:mt(r,n,a,l)}}function mt(n,i,r,a){let l=n.fields[i];if(!l)return!1;if(l.options.readOnly===!0)return!1;try{return _(n,{[i]:null},r,a),!0}catch{return!1}}function Vt(n,i,r,a){let l=n.fields[i]?.access?.read;return l?l({actor:r,locale:a})===!0:!0}function M(n,i,r,a){let l=n.access[i];if(!l)return!0;try{let s=l({actor:r,operation:i,locale:a});if(s instanceof Promise)return!0;return s!==!1}catch{return!0}}function ft(n){let i=n.admin?.useAsTitle;if(i!==void 0&&n.fields[i])return i;for(let a of["title","name","label"])if(n.fields[a])return a;return Object.entries(n.fields).find(([,a])=>a.type==="text")?.[0]??null}function se(n){let i=JSON.stringify(n),r=2166136261;for(let a=0;a<i.length;a+=1)r^=i.charCodeAt(a),r=Math.imul(r,16777619)>>>0;return r.toString(16).padStart(8,"0")}export{hn,Vn,gn,yn,Gn,Le,bn,pt,mt,Vt,ft,ht};
@@ -0,0 +1,2 @@
1
+ import{b}from"./index-cbwwtcm4.js";async function Qe(o,r={}){let{drainEvents:t=!0,...s}=r,i=await o.jobs.run(s);if(t)await o.drainEvents();return i}function ln(o){let{cms:r,interval:t=60000,immediate:s=!0,onReport:i,onError:e,signal:f,...R}=o,v=typeof t==="number"?t:b(t),a=!1,p=null,u,c=async()=>{let n=Qe(r,R);p=n;try{let m=await n;return i?.(m),m}finally{p=null}},l=()=>{if(a)return;u=setTimeout(()=>{c().catch((n)=>{if(e)e(n);else console.error("[heyo-cms] job sweep failed:",n)}).finally(l)},v),u.unref?.()},d={runNow:()=>c(),async stop(){if(a=!0,u)clearTimeout(u);await p?.catch(()=>{return})},get running(){return!a}};if(f?.addEventListener("abort",()=>void d.stop(),{once:!0}),s)c().catch((n)=>{if(e)e(n);else console.error("[heyo-cms] job sweep failed:",n)}).finally(l);else l();return d}function dn(o,r={}){return async(t,s,i)=>{let e=Qe(o,r);i?.waitUntil?.(e),await e}}
2
+ export{Qe,ln,dn};
@@ -0,0 +1,2 @@
1
+ import{n}from"./index-x72d1hzh.js";var r=new Map;function ro(i){let t=r.get(i.name);if(t!==void 0&&t!==i)throw new n(`fields.${i.name}`,"a different field type with this name is already registered");r.set(i.name,i)}function Jo(i){return r.get(i)}function No(){return[...r.keys()].sort()}function T(i){return ro(i),(t)=>{let e=t??{},o=i.optionsSchema?l(i.name,i.optionsSchema,e):e;if(e.admin!==void 0){for(let u of Object.keys(e.admin))if(u!=="hidden"&&u!=="placeholder")throw new n(`fields.${i.name}.admin.${u}`,"unsupported admin option; use only hidden or placeholder")}if(e.generate!==void 0&&typeof e.generate!=="function")throw new n(`fields.${i.name}.generate`,"must be a function");let d=e.required===!0;if(d&&e.admin?.hidden===!0)throw new n(`fields.${i.name}.admin.hidden`,"a hidden field cannot be required; remove required or show the field");let a=e.localized===!0,s=i.column(o);if(a&&(e.unique===!0||s.unique===!0))throw new n(`fields.${i.name}`,"a localized field cannot be unique in v1; enforce it in a hook instead");if(c(i.name,i.aiActions,e.ai),e.aiGenerate!==void 0){if(e.ai?.generate!==void 0)throw new n(`fields.${i.name}.aiGenerate`,"choose either aiGenerate or the legacy ai.generate, not both");if(!["text","textarea","richText","email","url"].includes(i.name))throw new n(`fields.${i.name}.aiGenerate`,"generation currently supports text, textarea, richText, email and url fields")}return{type:i.name,options:e,schema:f(i.schema(o),d),column:{...s,nullable:s.nullable??!d,...e.unique===void 0?{}:{unique:e.unique},...e.index===void 0?{}:{index:e.index},storage:s.storage??"document"},localized:a,required:d,...e.default===void 0?{}:{defaultValue:e.default},...e.generate===void 0?{}:{generate:e.generate},...e.aiGenerate===void 0?{}:{aiGenerate:e.aiGenerate},...e.ai===void 0?{}:{ai:e.ai},...e.access===void 0?{}:{access:e.access},...e.admin===void 0?{}:{admin:e.admin},...typeof e.relationTo==="string"?{relationTo:e.relationTo}:{}}}}function l(i,t,e){let o=t.safeParse(e);if(!o.success){let d=o.error.issues[0],a=d?.path.length?` (${d.path.join(".")})`:"";throw new n(`fields.${i}`,`${d?.message??"invalid options"}${a}`)}return o.data}function f(i,t){return t?i:i.nullable()}function c(i,t,e){if(!e||!t)return;for(let o of Object.keys(e)){let d=t.includes(o),a=typeof e[o]==="object";if(!d&&!a)throw new n(`fields.${i}.ai.${o}`,`unknown AI action; ${i} supports ${t.join(", ")}. Custom actions need an object with a prompt.`)}}
2
+ export{ro,Jo,No,T};
@@ -0,0 +1,2 @@
1
+ async function ke(e){let t=crypto.getRandomValues(new Uint8Array(16)),n=await o(e,t,1e5);return["pbkdf2-sha256",1e5,X(t),X(n)].join("$")}async function nn(e,t){if(!t)return!1;let[n,r,s,i]=t.split("$");if(n!=="pbkdf2-sha256"||!r||!s||!i)return!1;let a=await o(e,on(s),Number(r));return c(X(a),i)}async function o(e,t,n){let r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),"PBKDF2",!1,["deriveBits"]),s=await crypto.subtle.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:"SHA-256"},r,256);return new Uint8Array(s)}function he(e=32){return X(crypto.getRandomValues(new Uint8Array(e)))}async function Q(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return l(new Uint8Array(t))}function c(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r+=1)n|=e.charCodeAt(r)^t.charCodeAt(r);return n===0}function X(e){let t="";for(let n of e)t+=String.fromCharCode(n);return btoa(t).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function on(e){let t=e.replaceAll("-","+").replaceAll("_","/"),n=atob(t.padEnd(Math.ceil(t.length/4)*4,"=")),r=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)r[s]=n.charCodeAt(s);return r}function l(e){let t="";for(let n of e)t+=n.toString(16).padStart(2,"0");return t}async function io(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return X(new Uint8Array(t))}
2
+ export{ke,nn,he,Q,X,on,io};
@@ -0,0 +1,2 @@
1
+ function O(t){let n=t.length;while(n>0&&t.charCodeAt(n-1)===47)n--;return n===t.length?t:t.slice(0,n)}
2
+ export{O};
@@ -0,0 +1,5 @@
1
+ import{c,p}from"./index-2z1qe5mw.js";import{s,t,Ke,I}from"./index-vxw0a03g.js";import{V,it}from"./index-ty698y02.js";import{g}from"./index-ymq6jsar.js";var Ze="heyo-cms/export",Ee=1;function Un(n,e){let o;try{o=JSON.parse(n)}catch{throw Error(`Line ${e} is not JSON.`)}if(!h(o)||typeof o.kind!=="string")throw Error(`Line ${e} has no "kind".`);if(!["header","document","global"].includes(o.kind))throw Error(`Line ${e} has an unknown kind: ${o.kind}.`);if(o.kind==="header"){if(typeof o.format!=="string"||!Number.isInteger(o.version))throw Error(`Line ${e} has an invalid export header.`)}else{let r=o.kind==="document"?o.collection:o.global;if(typeof r!=="string"||r.length===0||!h(o.data))throw Error(`Line ${e} needs a collection/global name and an object "data".`);if(o.kind==="document"&&(typeof o.id!=="string"||o.id.length===0))throw Error(`Line ${e} needs a non-empty document "id".`)}return o}async function*Pt(n){let e=0;for await(let o of n){e+=1;let r=o.trim();if(r.length===0)continue;yield Un(r,e)}}async function*$t(n){let e="";for await(let o of n){e+=o;let r=e.indexOf(`
2
+ `);while(r!==-1)yield e.slice(0,r),e=e.slice(r+1),r=e.indexOf(`
3
+ `)}if(e.length>0)yield e}function jt(n){return`${JSON.stringify(n)}
4
+ `}function h(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}async function*It(n,e={}){let o=n._config,r=w(o.collections,e.collections,"collection"),a=w(o.globals,e.globals,"global"),l=await n.database();yield{kind:"header",format:Ze,version:Ee,exportedAt:new Date().toISOString(),database:l.id,defaultLocale:o.i18n.defaultLocale,collections:r.map((d)=>d.name),globals:a.map((d)=>d.name)};let i=Math.max(1,e.batchSize??200);for(let d of r){let f;for(;;){let m=await y(n,{where:s(t("collection",d.slug),e.includeTrashed?void 0:t("deleted_at",null),f===void 0?void 0:Ke("id",f)),limit:i});if(m.length===0)break;for(let b of m)yield k(d,b,e);if(f=String(m[m.length-1]?.id),m.length<i)break}}if(a.length>0){let d=await y(n,{where:I("id",a.map((m)=>V(m))),limit:a.length}),f=new Map(d.map((m)=>[String(m.id),m]));for(let m of a){let b=f.get(V(m));yield{kind:"global",global:m.name,data:b?p(b.data):{},updatedAt:b?c(b.updated_at):null}}}}function k(n,e,o){let r={kind:"document",collection:n.name,id:String(e.id),data:p(e.data),createdAt:c(e.created_at),updatedAt:c(e.updated_at)};if(o.includeTrashed)r.deletedAt=c(e.deleted_at);let a=c(e.scheduled_at);if(a!==null)r.scheduledAt=a,r.scheduledPatch=p(e.scheduled_patch).data??null;return r}async function y(n,e){let o=await n.database();return o.transaction((r)=>o.query(r,{table:g,...e.where===void 0?{}:{where:e.where},orderBy:[{path:"id",direction:"asc"}],limit:e.limit}))}function w(n,e,o){if(!e)return Object.values(n);return e.map((r)=>{let a=n[r];if(!a){let l=Object.keys(n).join(", ")||"none";throw Error(`Unknown ${o}: ${r}. Declared: ${l}.`)}return a})}async function Et(n,e,o={}){let r={documents:{created:0,updated:0,skipped:0},globals:{updated:0,skipped:0},errors:[]},a=o.actor===void 0?it():o.actor,l=o.onConflict??"skip",u=!1;for await(let i of e){if(i.kind==="header"){A(i.format,i.version),u=!0;continue}if(!u)throw Error("The file does not start with an export header. Was it produced by `heyo-cms export`?");try{if(i.kind==="document")await x(n,i,{actor:a,onConflict:l,...o},r);else await O(n,i,{actor:a,...o},r)}catch(d){let f=i.kind==="document"?`${i.collection}/${i.id}`:`globals/${i.global}`;if(r.errors.push(`${f}: ${J(d)}`),i.kind==="document")r.documents.skipped+=1;else r.globals.skipped+=1}}if(!u)throw Error("The file is empty.");if(!o.dryRun)await n.drainEvents();return r}async function x(n,e,o,r){let a=n._config.collections[e.collection];if(!a)throw Error(`no collection named "${e.collection}" is declared`);if(e.deletedAt){r.documents.skipped+=1;return}let l=C(n,e.collection),u=await l.findById(e.id,{actor:o.actor??null,includeTrashed:!0});if(u&&o.onConflict==="fail")throw Error("a document with this id is already here");if(u&&o.onConflict==="skip"){r.documents.skipped+=1;return}if(o.dryRun){if(u)r.documents.updated+=1;else r.documents.created+=1;return}let i=cn(a,e.data,n._config.i18n.defaultLocale);if(u){if(await l.update({id:e.id,data:i.base,actor:o.actor??null,source:"cli"})===null){r.documents.skipped+=1;return}r.documents.updated+=1}else{if(await l.create({id:e.id,data:i.base,actor:o.actor??null,source:"cli"})===null){r.documents.skipped+=1;return}r.documents.created+=1}for(let[d,f]of Object.entries(i.translations))await l.update({id:e.id,data:f,locale:d,actor:o.actor??null,source:"cli"});if(e.scheduledAt&&R(e.scheduledPatch))await l.schedule({id:e.id,at:e.scheduledAt,data:e.scheduledPatch,actor:o.actor??null,source:"cli"})}async function O(n,e,o,r){let a=n._config.globals[e.global];if(!a)throw Error(`no global named "${e.global}" is declared`);if(o.dryRun){r.globals.updated+=1;return}let l=j(n,e.global),u=cn(a,e.data,n._config.i18n.defaultLocale);await l.update({data:u.base,actor:o.actor??null,source:"cli"});for(let[i,d]of Object.entries(u.translations))await l.update({data:d,locale:i,actor:o.actor??null,source:"cli"});r.globals.updated+=1}function cn(n,e,o){let r=Object.create(null),a=Object.create(null);for(let[l,u]of Object.entries(n.fields)){let i=e[l];if(i===void 0)continue;if(!u.localized){r[l]=i;continue}if(!R(i)){r[l]=i;continue}for(let[d,f]of Object.entries(i)){if(f===void 0)continue;if(d===o){r[l]=f;continue}(a[d]??=Object.create(null))[l]=f}}return{base:r,translations:a}}function A(n,e){if(n!==Ze)throw Error(`Unknown export format: ${n}.`);if(!Number.isInteger(e)||e<1)throw Error(`Invalid export version: ${e}.`);if(e>Ee)throw Error(`This file is version ${e}; this CMS reads up to ${Ee}. Upgrade @heyo-sh/heyo-cms.`)}function C(n,e){return n.api[e]}function j(n,e){return n.globals[e]}function R(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}function J(n){return n instanceof Error?n.message:String(n)}
5
+ export{Ze,Ee,Un,Pt,$t,jt,It,Et,cn};