katecms 0.0.0-stage → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/README.md +5 -3
  2. package/dist/module.d.mts +93 -0
  3. package/dist/module.json +9 -0
  4. package/dist/module.mjs +579 -0
  5. package/dist/runtime/assets/img/katecms-logo.svg +17 -0
  6. package/dist/runtime/composables/getCollection.d.ts +62 -0
  7. package/dist/runtime/composables/getCollection.js +167 -0
  8. package/dist/runtime/composables/getOptions.d.ts +22 -0
  9. package/dist/runtime/composables/getOptions.js +22 -0
  10. package/dist/runtime/composables/getQueryCollection.d.ts +95 -0
  11. package/dist/runtime/composables/getQueryCollection.js +199 -0
  12. package/dist/runtime/composables/getTerms.d.ts +79 -0
  13. package/dist/runtime/composables/getTerms.js +148 -0
  14. package/dist/runtime/composables/useAuth.d.ts +14 -0
  15. package/dist/runtime/composables/useAuth.js +33 -0
  16. package/dist/runtime/composables/useAuthCooldown.d.ts +6 -0
  17. package/dist/runtime/composables/useAuthCooldown.js +44 -0
  18. package/dist/runtime/composables/useCmsPaths.d.ts +15 -0
  19. package/dist/runtime/composables/useCmsPaths.js +21 -0
  20. package/dist/runtime/composables/useKateCmsExtensions.d.ts +49 -0
  21. package/dist/runtime/composables/useKateCmsExtensions.js +29 -0
  22. package/dist/runtime/composables/useMediaLibrary.d.ts +84 -0
  23. package/dist/runtime/composables/useMediaLibrary.js +140 -0
  24. package/dist/runtime/composables/useMenuAccess.d.ts +8 -0
  25. package/dist/runtime/composables/useMenuAccess.js +16 -0
  26. package/dist/runtime/internal/admin/AdminHeader.d.vue.ts +24 -0
  27. package/dist/runtime/internal/admin/AdminHeader.vue +91 -0
  28. package/dist/runtime/internal/admin/AdminHeader.vue.d.ts +24 -0
  29. package/dist/runtime/internal/admin/AppMenu.d.vue.ts +3 -0
  30. package/dist/runtime/internal/admin/AppMenu.vue +244 -0
  31. package/dist/runtime/internal/admin/AppMenu.vue.d.ts +3 -0
  32. package/dist/runtime/internal/admin/AppUser.d.vue.ts +3 -0
  33. package/dist/runtime/internal/admin/AppUser.vue +227 -0
  34. package/dist/runtime/internal/admin/AppUser.vue.d.ts +3 -0
  35. package/dist/runtime/internal/admin/CollectionEntryForm.d.vue.ts +41 -0
  36. package/dist/runtime/internal/admin/CollectionEntryForm.vue +916 -0
  37. package/dist/runtime/internal/admin/CollectionEntryForm.vue.d.ts +41 -0
  38. package/dist/runtime/internal/admin/ConfirmDialog.d.vue.ts +28 -0
  39. package/dist/runtime/internal/admin/ConfirmDialog.vue +136 -0
  40. package/dist/runtime/internal/admin/ConfirmDialog.vue.d.ts +28 -0
  41. package/dist/runtime/internal/admin/DictionaryTermForm.d.vue.ts +33 -0
  42. package/dist/runtime/internal/admin/DictionaryTermForm.vue +328 -0
  43. package/dist/runtime/internal/admin/DictionaryTermForm.vue.d.ts +33 -0
  44. package/dist/runtime/internal/admin/EntryRevisions.d.vue.ts +15 -0
  45. package/dist/runtime/internal/admin/EntryRevisions.vue +125 -0
  46. package/dist/runtime/internal/admin/EntryRevisions.vue.d.ts +15 -0
  47. package/dist/runtime/internal/admin/MediaLibraryFilters.d.vue.ts +16 -0
  48. package/dist/runtime/internal/admin/MediaLibraryFilters.vue +153 -0
  49. package/dist/runtime/internal/admin/MediaLibraryFilters.vue.d.ts +16 -0
  50. package/dist/runtime/internal/admin/MediaLibraryModal.d.vue.ts +65 -0
  51. package/dist/runtime/internal/admin/MediaLibraryModal.vue +451 -0
  52. package/dist/runtime/internal/admin/MediaLibraryModal.vue.d.ts +65 -0
  53. package/dist/runtime/internal/admin/OptionPageForm.d.vue.ts +26 -0
  54. package/dist/runtime/internal/admin/OptionPageForm.vue +222 -0
  55. package/dist/runtime/internal/admin/OptionPageForm.vue.d.ts +26 -0
  56. package/dist/runtime/internal/admin/UserAvatarField.d.vue.ts +12 -0
  57. package/dist/runtime/internal/admin/UserAvatarField.vue +305 -0
  58. package/dist/runtime/internal/admin/UserAvatarField.vue.d.ts +12 -0
  59. package/dist/runtime/internal/fields/AccordionField.d.vue.ts +0 -0
  60. package/dist/runtime/internal/fields/AccordionField.vue +220 -0
  61. package/dist/runtime/internal/fields/AccordionField.vue.d.ts +0 -0
  62. package/dist/runtime/internal/fields/ButtonGroupField.d.vue.ts +0 -0
  63. package/dist/runtime/internal/fields/ButtonGroupField.vue +109 -0
  64. package/dist/runtime/internal/fields/ButtonGroupField.vue.d.ts +0 -0
  65. package/dist/runtime/internal/fields/CheckboxField.d.vue.ts +0 -0
  66. package/dist/runtime/internal/fields/CheckboxField.vue +190 -0
  67. package/dist/runtime/internal/fields/CheckboxField.vue.d.ts +0 -0
  68. package/dist/runtime/internal/fields/ColorPickerField.d.vue.ts +0 -0
  69. package/dist/runtime/internal/fields/ColorPickerField.vue +791 -0
  70. package/dist/runtime/internal/fields/ColorPickerField.vue.d.ts +0 -0
  71. package/dist/runtime/internal/fields/DatePickerField.d.vue.ts +0 -0
  72. package/dist/runtime/internal/fields/DatePickerField.vue +26 -0
  73. package/dist/runtime/internal/fields/DatePickerField.vue.d.ts +0 -0
  74. package/dist/runtime/internal/fields/DateTimePickerField.d.vue.ts +0 -0
  75. package/dist/runtime/internal/fields/DateTimePickerField.vue +26 -0
  76. package/dist/runtime/internal/fields/DateTimePickerField.vue.d.ts +0 -0
  77. package/dist/runtime/internal/fields/DictionaryField.d.vue.ts +0 -0
  78. package/dist/runtime/internal/fields/DictionaryField.vue +345 -0
  79. package/dist/runtime/internal/fields/DictionaryField.vue.d.ts +0 -0
  80. package/dist/runtime/internal/fields/EmailField.d.vue.ts +0 -0
  81. package/dist/runtime/internal/fields/EmailField.vue +21 -0
  82. package/dist/runtime/internal/fields/EmailField.vue.d.ts +0 -0
  83. package/dist/runtime/internal/fields/FileField.d.vue.ts +0 -0
  84. package/dist/runtime/internal/fields/FileField.vue +408 -0
  85. package/dist/runtime/internal/fields/FileField.vue.d.ts +0 -0
  86. package/dist/runtime/internal/fields/FlexibleContentField.d.vue.ts +0 -0
  87. package/dist/runtime/internal/fields/FlexibleContentField.vue +1114 -0
  88. package/dist/runtime/internal/fields/FlexibleContentField.vue.d.ts +0 -0
  89. package/dist/runtime/internal/fields/GalleryField.d.vue.ts +0 -0
  90. package/dist/runtime/internal/fields/GalleryField.vue +584 -0
  91. package/dist/runtime/internal/fields/GalleryField.vue.d.ts +0 -0
  92. package/dist/runtime/internal/fields/GroupField.d.vue.ts +0 -0
  93. package/dist/runtime/internal/fields/GroupField.vue +111 -0
  94. package/dist/runtime/internal/fields/GroupField.vue.d.ts +0 -0
  95. package/dist/runtime/internal/fields/ImageField.d.vue.ts +0 -0
  96. package/dist/runtime/internal/fields/ImageField.vue +638 -0
  97. package/dist/runtime/internal/fields/ImageField.vue.d.ts +0 -0
  98. package/dist/runtime/internal/fields/ImageSelectField.d.vue.ts +0 -0
  99. package/dist/runtime/internal/fields/ImageSelectField.vue +179 -0
  100. package/dist/runtime/internal/fields/ImageSelectField.vue.d.ts +0 -0
  101. package/dist/runtime/internal/fields/LinkField.d.vue.ts +0 -0
  102. package/dist/runtime/internal/fields/LinkField.vue +303 -0
  103. package/dist/runtime/internal/fields/LinkField.vue.d.ts +0 -0
  104. package/dist/runtime/internal/fields/NumberField.d.vue.ts +0 -0
  105. package/dist/runtime/internal/fields/NumberField.vue +25 -0
  106. package/dist/runtime/internal/fields/NumberField.vue.d.ts +0 -0
  107. package/dist/runtime/internal/fields/OembedField.d.vue.ts +0 -0
  108. package/dist/runtime/internal/fields/OembedField.vue +161 -0
  109. package/dist/runtime/internal/fields/OembedField.vue.d.ts +0 -0
  110. package/dist/runtime/internal/fields/OpenStreetMapField.d.vue.ts +0 -0
  111. package/dist/runtime/internal/fields/OpenStreetMapField.vue +1502 -0
  112. package/dist/runtime/internal/fields/OpenStreetMapField.vue.d.ts +0 -0
  113. package/dist/runtime/internal/fields/PageLinkField.d.vue.ts +0 -0
  114. package/dist/runtime/internal/fields/PageLinkField.vue +153 -0
  115. package/dist/runtime/internal/fields/PageLinkField.vue.d.ts +0 -0
  116. package/dist/runtime/internal/fields/PasswordField.d.vue.ts +0 -0
  117. package/dist/runtime/internal/fields/PasswordField.vue +108 -0
  118. package/dist/runtime/internal/fields/PasswordField.vue.d.ts +0 -0
  119. package/dist/runtime/internal/fields/PostObjectField.d.vue.ts +0 -0
  120. package/dist/runtime/internal/fields/PostObjectField.vue +151 -0
  121. package/dist/runtime/internal/fields/PostObjectField.vue.d.ts +0 -0
  122. package/dist/runtime/internal/fields/RadioField.d.vue.ts +0 -0
  123. package/dist/runtime/internal/fields/RadioField.vue +163 -0
  124. package/dist/runtime/internal/fields/RadioField.vue.d.ts +0 -0
  125. package/dist/runtime/internal/fields/RangeField.d.vue.ts +0 -0
  126. package/dist/runtime/internal/fields/RangeField.vue +48 -0
  127. package/dist/runtime/internal/fields/RangeField.vue.d.ts +0 -0
  128. package/dist/runtime/internal/fields/RelationshipField.d.vue.ts +0 -0
  129. package/dist/runtime/internal/fields/RelationshipField.vue +525 -0
  130. package/dist/runtime/internal/fields/RelationshipField.vue.d.ts +0 -0
  131. package/dist/runtime/internal/fields/RepeaterField.d.vue.ts +0 -0
  132. package/dist/runtime/internal/fields/RepeaterField.vue +856 -0
  133. package/dist/runtime/internal/fields/RepeaterField.vue.d.ts +0 -0
  134. package/dist/runtime/internal/fields/SelectField.d.vue.ts +21 -0
  135. package/dist/runtime/internal/fields/SelectField.vue +101 -0
  136. package/dist/runtime/internal/fields/SelectField.vue.d.ts +21 -0
  137. package/dist/runtime/internal/fields/SeparatorField.d.vue.ts +0 -0
  138. package/dist/runtime/internal/fields/SeparatorField.vue +63 -0
  139. package/dist/runtime/internal/fields/SeparatorField.vue.d.ts +0 -0
  140. package/dist/runtime/internal/fields/TabField.d.vue.ts +0 -0
  141. package/dist/runtime/internal/fields/TabField.vue +210 -0
  142. package/dist/runtime/internal/fields/TabField.vue.d.ts +0 -0
  143. package/dist/runtime/internal/fields/TextField.d.vue.ts +0 -0
  144. package/dist/runtime/internal/fields/TextField.vue +22 -0
  145. package/dist/runtime/internal/fields/TextField.vue.d.ts +0 -0
  146. package/dist/runtime/internal/fields/TextareaField.d.vue.ts +0 -0
  147. package/dist/runtime/internal/fields/TextareaField.vue +62 -0
  148. package/dist/runtime/internal/fields/TextareaField.vue.d.ts +0 -0
  149. package/dist/runtime/internal/fields/TimePickerField.d.vue.ts +0 -0
  150. package/dist/runtime/internal/fields/TimePickerField.vue +24 -0
  151. package/dist/runtime/internal/fields/TimePickerField.vue.d.ts +0 -0
  152. package/dist/runtime/internal/fields/TrueFalseField.d.vue.ts +0 -0
  153. package/dist/runtime/internal/fields/TrueFalseField.vue +151 -0
  154. package/dist/runtime/internal/fields/TrueFalseField.vue.d.ts +0 -0
  155. package/dist/runtime/internal/fields/UrlField.d.vue.ts +0 -0
  156. package/dist/runtime/internal/fields/UrlField.vue +21 -0
  157. package/dist/runtime/internal/fields/UrlField.vue.d.ts +0 -0
  158. package/dist/runtime/internal/fields/UserField.d.vue.ts +0 -0
  159. package/dist/runtime/internal/fields/UserField.vue +164 -0
  160. package/dist/runtime/internal/fields/UserField.vue.d.ts +0 -0
  161. package/dist/runtime/internal/fields/WysiwygField.d.vue.ts +0 -0
  162. package/dist/runtime/internal/fields/WysiwygField.vue +971 -0
  163. package/dist/runtime/internal/fields/WysiwygField.vue.d.ts +0 -0
  164. package/dist/runtime/internal/parts/DateTimeControl.d.vue.ts +90 -0
  165. package/dist/runtime/internal/parts/DateTimeControl.vue +568 -0
  166. package/dist/runtime/internal/parts/DateTimeControl.vue.d.ts +90 -0
  167. package/dist/runtime/internal/parts/FieldAddon.d.vue.ts +0 -0
  168. package/dist/runtime/internal/parts/FieldAddon.vue +43 -0
  169. package/dist/runtime/internal/parts/FieldAddon.vue.d.ts +0 -0
  170. package/dist/runtime/internal/parts/FieldInstructions.d.vue.ts +0 -0
  171. package/dist/runtime/internal/parts/FieldInstructions.vue +24 -0
  172. package/dist/runtime/internal/parts/FieldInstructions.vue.d.ts +0 -0
  173. package/dist/runtime/internal/parts/FieldLabel.d.vue.ts +0 -0
  174. package/dist/runtime/internal/parts/FieldLabel.vue +40 -0
  175. package/dist/runtime/internal/parts/FieldLabel.vue.d.ts +0 -0
  176. package/dist/runtime/internal/parts/FieldWrapper.d.vue.ts +0 -0
  177. package/dist/runtime/internal/parts/FieldWrapper.vue +47 -0
  178. package/dist/runtime/internal/parts/FieldWrapper.vue.d.ts +0 -0
  179. package/dist/runtime/internal/parts/ImageCropper.d.vue.ts +17 -0
  180. package/dist/runtime/internal/parts/ImageCropper.vue +363 -0
  181. package/dist/runtime/internal/parts/ImageCropper.vue.d.ts +17 -0
  182. package/dist/runtime/internal/parts/InputControl.d.vue.ts +0 -0
  183. package/dist/runtime/internal/parts/InputControl.vue +163 -0
  184. package/dist/runtime/internal/parts/InputControl.vue.d.ts +0 -0
  185. package/dist/runtime/internal/ui/UiButton.d.vue.ts +35 -0
  186. package/dist/runtime/internal/ui/UiButton.vue +204 -0
  187. package/dist/runtime/internal/ui/UiButton.vue.d.ts +35 -0
  188. package/dist/runtime/internal/ui/UiNotice.d.vue.ts +40 -0
  189. package/dist/runtime/internal/ui/UiNotice.vue +253 -0
  190. package/dist/runtime/internal/ui/UiNotice.vue.d.ts +40 -0
  191. package/dist/runtime/internal/ui/UiSelect.d.vue.ts +61 -0
  192. package/dist/runtime/internal/ui/UiSelect.vue +1212 -0
  193. package/dist/runtime/internal/ui/UiSelect.vue.d.ts +61 -0
  194. package/dist/runtime/middleware/auth-guard.d.ts +9 -0
  195. package/dist/runtime/middleware/auth-guard.js +37 -0
  196. package/dist/runtime/pages/admin/collections/[id].d.vue.ts +3 -0
  197. package/dist/runtime/pages/admin/collections/[id].vue +423 -0
  198. package/dist/runtime/pages/admin/collections/[id].vue.d.ts +3 -0
  199. package/dist/runtime/pages/admin/collections/create.d.vue.ts +3 -0
  200. package/dist/runtime/pages/admin/collections/create.vue +179 -0
  201. package/dist/runtime/pages/admin/collections/create.vue.d.ts +3 -0
  202. package/dist/runtime/pages/admin/collections/index.d.vue.ts +3 -0
  203. package/dist/runtime/pages/admin/collections/index.vue +828 -0
  204. package/dist/runtime/pages/admin/collections/index.vue.d.ts +3 -0
  205. package/dist/runtime/pages/admin/demo-fields.d.vue.ts +3 -0
  206. package/dist/runtime/pages/admin/demo-fields.vue +1327 -0
  207. package/dist/runtime/pages/admin/demo-fields.vue.d.ts +3 -0
  208. package/dist/runtime/pages/admin/dictionaries/[id].d.vue.ts +3 -0
  209. package/dist/runtime/pages/admin/dictionaries/[id].vue +213 -0
  210. package/dist/runtime/pages/admin/dictionaries/[id].vue.d.ts +3 -0
  211. package/dist/runtime/pages/admin/dictionaries/index.d.vue.ts +3 -0
  212. package/dist/runtime/pages/admin/dictionaries/index.vue +387 -0
  213. package/dist/runtime/pages/admin/dictionaries/index.vue.d.ts +3 -0
  214. package/dist/runtime/pages/admin/index.d.vue.ts +3 -0
  215. package/dist/runtime/pages/admin/index.vue +138 -0
  216. package/dist/runtime/pages/admin/index.vue.d.ts +3 -0
  217. package/dist/runtime/pages/admin/login.d.vue.ts +3 -0
  218. package/dist/runtime/pages/admin/login.vue +373 -0
  219. package/dist/runtime/pages/admin/login.vue.d.ts +3 -0
  220. package/dist/runtime/pages/admin/media.d.vue.ts +3 -0
  221. package/dist/runtime/pages/admin/media.vue +1054 -0
  222. package/dist/runtime/pages/admin/media.vue.d.ts +3 -0
  223. package/dist/runtime/pages/admin/options/[page].d.vue.ts +3 -0
  224. package/dist/runtime/pages/admin/options/[page].vue +151 -0
  225. package/dist/runtime/pages/admin/options/[page].vue.d.ts +3 -0
  226. package/dist/runtime/pages/admin/register.d.vue.ts +3 -0
  227. package/dist/runtime/pages/admin/register.vue +391 -0
  228. package/dist/runtime/pages/admin/register.vue.d.ts +3 -0
  229. package/dist/runtime/pages/admin/users/[id].d.vue.ts +3 -0
  230. package/dist/runtime/pages/admin/users/[id].vue +337 -0
  231. package/dist/runtime/pages/admin/users/[id].vue.d.ts +3 -0
  232. package/dist/runtime/pages/admin/users/create.d.vue.ts +3 -0
  233. package/dist/runtime/pages/admin/users/create.vue +201 -0
  234. package/dist/runtime/pages/admin/users/create.vue.d.ts +3 -0
  235. package/dist/runtime/pages/admin/users/index.d.vue.ts +3 -0
  236. package/dist/runtime/pages/admin/users/index.vue +329 -0
  237. package/dist/runtime/pages/admin/users/index.vue.d.ts +3 -0
  238. package/dist/runtime/pages/index.d.vue.ts +3 -0
  239. package/dist/runtime/pages/index.vue +399 -0
  240. package/dist/runtime/pages/index.vue.d.ts +3 -0
  241. package/dist/runtime/server/api/_katecms/auth/login.post.d.ts +5 -0
  242. package/dist/runtime/server/api/_katecms/auth/login.post.js +44 -0
  243. package/dist/runtime/server/api/_katecms/auth/logout.post.d.ts +4 -0
  244. package/dist/runtime/server/api/_katecms/auth/logout.post.js +6 -0
  245. package/dist/runtime/server/api/_katecms/auth/register.post.d.ts +19 -0
  246. package/dist/runtime/server/api/_katecms/auth/register.post.js +83 -0
  247. package/dist/runtime/server/api/_katecms/auth/state.get.d.ts +9 -0
  248. package/dist/runtime/server/api/_katecms/auth/state.get.js +12 -0
  249. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].delete.d.ts +15 -0
  250. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].delete.js +59 -0
  251. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].get.d.ts +4 -0
  252. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].get.js +50 -0
  253. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].patch.d.ts +4 -0
  254. package/dist/runtime/server/api/_katecms/collections/[collection]/[id].patch.js +130 -0
  255. package/dist/runtime/server/api/_katecms/collections/[collection]/revisions/[revisionId].post.d.ts +4 -0
  256. package/dist/runtime/server/api/_katecms/collections/[collection]/revisions/[revisionId].post.js +123 -0
  257. package/dist/runtime/server/api/_katecms/collections/[collection]/revisions.get.d.ts +6 -0
  258. package/dist/runtime/server/api/_katecms/collections/[collection]/revisions.get.js +31 -0
  259. package/dist/runtime/server/api/_katecms/collections/[collection].get.d.ts +8 -0
  260. package/dist/runtime/server/api/_katecms/collections/[collection].get.js +135 -0
  261. package/dist/runtime/server/api/_katecms/collections/[collection].post.d.ts +4 -0
  262. package/dist/runtime/server/api/_katecms/collections/[collection].post.js +91 -0
  263. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].delete.d.ts +7 -0
  264. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].delete.js +31 -0
  265. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].get.d.ts +4 -0
  266. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].get.js +45 -0
  267. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].patch.d.ts +4 -0
  268. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].patch.js +83 -0
  269. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary].get.d.ts +4 -0
  270. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary].get.js +38 -0
  271. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary].post.d.ts +4 -0
  272. package/dist/runtime/server/api/_katecms/dictionaries/[dictionary].post.js +64 -0
  273. package/dist/runtime/server/api/_katecms/media/[id]/regenerate.post.d.ts +8 -0
  274. package/dist/runtime/server/api/_katecms/media/[id]/regenerate.post.js +30 -0
  275. package/dist/runtime/server/api/_katecms/media/[id].delete.d.ts +7 -0
  276. package/dist/runtime/server/api/_katecms/media/[id].delete.js +22 -0
  277. package/dist/runtime/server/api/_katecms/media/[id].get.d.ts +9 -0
  278. package/dist/runtime/server/api/_katecms/media/[id].get.js +17 -0
  279. package/dist/runtime/server/api/_katecms/media/[id].patch.d.ts +6 -0
  280. package/dist/runtime/server/api/_katecms/media/[id].patch.js +48 -0
  281. package/dist/runtime/server/api/_katecms/media/index.get.d.ts +5 -0
  282. package/dist/runtime/server/api/_katecms/media/index.get.js +75 -0
  283. package/dist/runtime/server/api/_katecms/media/index.post.d.ts +9 -0
  284. package/dist/runtime/server/api/_katecms/media/index.post.js +84 -0
  285. package/dist/runtime/server/api/_katecms/media/regenerate.post.d.ts +7 -0
  286. package/dist/runtime/server/api/_katecms/media/regenerate.post.js +30 -0
  287. package/dist/runtime/server/api/_katecms/menu.get.d.ts +8 -0
  288. package/dist/runtime/server/api/_katecms/menu.get.js +14 -0
  289. package/dist/runtime/server/api/_katecms/oembed.get.d.ts +2 -0
  290. package/dist/runtime/server/api/_katecms/oembed.get.js +53 -0
  291. package/dist/runtime/server/api/_katecms/options/[page].get.d.ts +7 -0
  292. package/dist/runtime/server/api/_katecms/options/[page].get.js +28 -0
  293. package/dist/runtime/server/api/_katecms/options/[page].patch.d.ts +4 -0
  294. package/dist/runtime/server/api/_katecms/options/[page].patch.js +36 -0
  295. package/dist/runtime/server/api/_katecms/query.get.d.ts +24 -0
  296. package/dist/runtime/server/api/_katecms/query.get.js +270 -0
  297. package/dist/runtime/server/api/_katecms/relation/entries.get.d.ts +17 -0
  298. package/dist/runtime/server/api/_katecms/relation/entries.get.js +74 -0
  299. package/dist/runtime/server/api/_katecms/relation/terms.get.d.ts +17 -0
  300. package/dist/runtime/server/api/_katecms/relation/terms.get.js +51 -0
  301. package/dist/runtime/server/api/_katecms/resolve.get.d.ts +17 -0
  302. package/dist/runtime/server/api/_katecms/resolve.get.js +116 -0
  303. package/dist/runtime/server/api/_katecms/terms.get.d.ts +20 -0
  304. package/dist/runtime/server/api/_katecms/terms.get.js +201 -0
  305. package/dist/runtime/server/api/_katecms/users/[id].delete.d.ts +11 -0
  306. package/dist/runtime/server/api/_katecms/users/[id].delete.js +45 -0
  307. package/dist/runtime/server/api/_katecms/users/[id].patch.d.ts +19 -0
  308. package/dist/runtime/server/api/_katecms/users/[id].patch.js +129 -0
  309. package/dist/runtime/server/api/_katecms/users.get.d.ts +10 -0
  310. package/dist/runtime/server/api/_katecms/users.get.js +34 -0
  311. package/dist/runtime/server/api/_katecms/users.post.d.ts +10 -0
  312. package/dist/runtime/server/api/_katecms/users.post.js +62 -0
  313. package/dist/runtime/server/api/uploads/[...key].get.d.ts +3 -0
  314. package/dist/runtime/server/api/uploads/[...key].get.js +28 -0
  315. package/dist/runtime/server/kit.d.ts +5 -0
  316. package/dist/runtime/server/kit.js +5 -0
  317. package/dist/runtime/server/middleware/admin-headers.d.ts +3 -0
  318. package/dist/runtime/server/middleware/admin-headers.js +12 -0
  319. package/dist/runtime/server/plugins/auto-migrate.d.ts +2 -0
  320. package/dist/runtime/server/plugins/auto-migrate.js +45 -0
  321. package/dist/runtime/server/tsconfig.json +3 -0
  322. package/dist/runtime/server/utils/auth-attempts.d.ts +22 -0
  323. package/dist/runtime/server/utils/auth-attempts.js +42 -0
  324. package/dist/runtime/server/utils/auth-rate-limit.d.ts +11 -0
  325. package/dist/runtime/server/utils/auth-rate-limit.js +36 -0
  326. package/dist/runtime/server/utils/client-address.d.ts +16 -0
  327. package/dist/runtime/server/utils/client-address.js +23 -0
  328. package/dist/runtime/server/utils/collections.d.ts +42 -0
  329. package/dist/runtime/server/utils/collections.js +300 -0
  330. package/dist/runtime/server/utils/db.d.ts +3 -0
  331. package/dist/runtime/server/utils/db.js +25 -0
  332. package/dist/runtime/server/utils/dictionaries.d.ts +53 -0
  333. package/dist/runtime/server/utils/dictionaries.js +301 -0
  334. package/dist/runtime/server/utils/media-list.d.ts +18 -0
  335. package/dist/runtime/server/utils/media-list.js +84 -0
  336. package/dist/runtime/server/utils/media.d.ts +12 -0
  337. package/dist/runtime/server/utils/media.js +77 -0
  338. package/dist/runtime/server/utils/oembed-fetch.d.ts +4 -0
  339. package/dist/runtime/server/utils/oembed-fetch.js +142 -0
  340. package/dist/runtime/server/utils/options.d.ts +17 -0
  341. package/dist/runtime/server/utils/options.js +66 -0
  342. package/dist/runtime/server/utils/permissions.d.ts +13 -0
  343. package/dist/runtime/server/utils/permissions.js +20 -0
  344. package/dist/runtime/server/utils/public-fields-query.d.ts +6 -0
  345. package/dist/runtime/server/utils/public-fields-query.js +8 -0
  346. package/dist/runtime/server/utils/public-term.d.ts +8 -0
  347. package/dist/runtime/server/utils/public-term.js +80 -0
  348. package/dist/runtime/server/utils/regenerate.d.ts +12 -0
  349. package/dist/runtime/server/utils/regenerate.js +40 -0
  350. package/dist/runtime/server/utils/relation.d.ts +18 -0
  351. package/dist/runtime/server/utils/relation.js +77 -0
  352. package/dist/runtime/server/utils/request-address.d.ts +6 -0
  353. package/dist/runtime/server/utils/request-address.js +10 -0
  354. package/dist/runtime/server/utils/revisions.d.ts +20 -0
  355. package/dist/runtime/server/utils/revisions.js +172 -0
  356. package/dist/runtime/server/utils/session.d.ts +18 -0
  357. package/dist/runtime/server/utils/session.js +71 -0
  358. package/dist/runtime/server/utils/upload-headers.d.ts +2 -0
  359. package/dist/runtime/server/utils/upload-headers.js +30 -0
  360. package/dist/runtime/server/utils/users.d.ts +13 -0
  361. package/dist/runtime/server/utils/users.js +47 -0
  362. package/dist/runtime/utils/admin-users.d.ts +20 -0
  363. package/dist/runtime/utils/admin-users.js +19 -0
  364. package/dist/runtime/utils/auth-error.d.ts +6 -0
  365. package/dist/runtime/utils/auth-error.js +11 -0
  366. package/dist/runtime/utils/cms-paths.d.ts +5 -0
  367. package/dist/runtime/utils/cms-paths.js +13 -0
  368. package/dist/runtime/utils/collections.d.ts +176 -0
  369. package/dist/runtime/utils/collections.js +30 -0
  370. package/dist/runtime/utils/dictionaries.d.ts +65 -0
  371. package/dist/runtime/utils/dictionaries.js +14 -0
  372. package/dist/runtime/utils/field-errors.d.ts +4 -0
  373. package/dist/runtime/utils/field-errors.js +9 -0
  374. package/dist/runtime/utils/field-values.d.ts +19 -0
  375. package/dist/runtime/utils/field-values.js +82 -0
  376. package/dist/runtime/utils/helpers.d.ts +4 -0
  377. package/dist/runtime/utils/helpers.js +20 -0
  378. package/dist/runtime/utils/media-library-query.d.ts +54 -0
  379. package/dist/runtime/utils/media-library-query.js +190 -0
  380. package/dist/runtime/utils/options.d.ts +19 -0
  381. package/dist/runtime/utils/options.js +3 -0
  382. package/dist/runtime/utils/preview.d.ts +22 -0
  383. package/dist/runtime/utils/preview.js +33 -0
  384. package/dist/runtime/utils/relation.d.ts +33 -0
  385. package/dist/runtime/utils/relation.js +23 -0
  386. package/dist/runtime/utils/slugify.d.ts +2 -0
  387. package/dist/runtime/utils/slugify.js +4 -0
  388. package/dist/types.d.mts +7 -0
  389. package/package.json +84 -3
  390. package/src/admin-components.ts +124 -0
  391. package/src/module.ts +592 -0
  392. package/src/runtime/assets/img/katecms-logo.svg +17 -0
  393. package/src/runtime/assets/styles/_functions.scss +70 -0
  394. package/src/runtime/assets/styles/_index.scss +3 -0
  395. package/src/runtime/assets/styles/_mixins.scss +256 -0
  396. package/src/runtime/assets/styles/_variables.scss +35 -0
  397. package/src/runtime/composables/getCollection.ts +253 -0
  398. package/src/runtime/composables/getOptions.ts +42 -0
  399. package/src/runtime/composables/getQueryCollection.ts +325 -0
  400. package/src/runtime/composables/getTerms.ts +231 -0
  401. package/src/runtime/composables/useAuth.ts +43 -0
  402. package/src/runtime/composables/useAuthCooldown.ts +52 -0
  403. package/src/runtime/composables/useCmsPaths.ts +24 -0
  404. package/src/runtime/composables/useKateCmsExtensions.ts +81 -0
  405. package/src/runtime/composables/useMediaLibrary.ts +168 -0
  406. package/src/runtime/composables/useMenuAccess.ts +25 -0
  407. package/src/runtime/internal/admin/AdminHeader.vue +106 -0
  408. package/src/runtime/internal/admin/AppMenu.vue +290 -0
  409. package/src/runtime/internal/admin/AppUser.vue +260 -0
  410. package/src/runtime/internal/admin/CollectionEntryForm.vue +1044 -0
  411. package/src/runtime/internal/admin/ConfirmDialog.vue +164 -0
  412. package/src/runtime/internal/admin/DictionaryTermForm.vue +400 -0
  413. package/src/runtime/internal/admin/EntryRevisions.vue +145 -0
  414. package/src/runtime/internal/admin/MediaLibraryFilters.vue +186 -0
  415. package/src/runtime/internal/admin/MediaLibraryModal.vue +526 -0
  416. package/src/runtime/internal/admin/OptionPageForm.vue +277 -0
  417. package/src/runtime/internal/admin/UserAvatarField.vue +337 -0
  418. package/src/runtime/internal/fields/AccordionField.vue +258 -0
  419. package/src/runtime/internal/fields/ButtonGroupField.vue +144 -0
  420. package/src/runtime/internal/fields/CheckboxField.vue +228 -0
  421. package/src/runtime/internal/fields/ColorPickerField.vue +926 -0
  422. package/src/runtime/internal/fields/DatePickerField.vue +33 -0
  423. package/src/runtime/internal/fields/DateTimePickerField.vue +33 -0
  424. package/src/runtime/internal/fields/DictionaryField.vue +403 -0
  425. package/src/runtime/internal/fields/EmailField.vue +28 -0
  426. package/src/runtime/internal/fields/FileField.vue +480 -0
  427. package/src/runtime/internal/fields/FlexibleContentField.vue +1296 -0
  428. package/src/runtime/internal/fields/GalleryField.vue +677 -0
  429. package/src/runtime/internal/fields/GroupField.vue +136 -0
  430. package/src/runtime/internal/fields/ImageField.vue +730 -0
  431. package/src/runtime/internal/fields/ImageSelectField.vue +213 -0
  432. package/src/runtime/internal/fields/LinkField.vue +338 -0
  433. package/src/runtime/internal/fields/NumberField.vue +32 -0
  434. package/src/runtime/internal/fields/OembedField.vue +187 -0
  435. package/src/runtime/internal/fields/OpenStreetMapField.vue +1716 -0
  436. package/src/runtime/internal/fields/PageLinkField.vue +186 -0
  437. package/src/runtime/internal/fields/PasswordField.vue +127 -0
  438. package/src/runtime/internal/fields/PostObjectField.vue +187 -0
  439. package/src/runtime/internal/fields/RadioField.vue +195 -0
  440. package/src/runtime/internal/fields/RangeField.vue +62 -0
  441. package/src/runtime/internal/fields/RelationshipField.vue +604 -0
  442. package/src/runtime/internal/fields/RepeaterField.vue +999 -0
  443. package/src/runtime/internal/fields/SelectField.vue +118 -0
  444. package/src/runtime/internal/fields/SeparatorField.vue +77 -0
  445. package/src/runtime/internal/fields/TabField.vue +249 -0
  446. package/src/runtime/internal/fields/TextField.vue +29 -0
  447. package/src/runtime/internal/fields/TextareaField.vue +61 -0
  448. package/src/runtime/internal/fields/TimePickerField.vue +31 -0
  449. package/src/runtime/internal/fields/TrueFalseField.vue +181 -0
  450. package/src/runtime/internal/fields/UrlField.vue +28 -0
  451. package/src/runtime/internal/fields/UserField.vue +203 -0
  452. package/src/runtime/internal/fields/WysiwygField.vue +1061 -0
  453. package/src/runtime/internal/parts/DateTimeControl.vue +657 -0
  454. package/src/runtime/internal/parts/FieldAddon.vue +60 -0
  455. package/src/runtime/internal/parts/FieldInstructions.vue +38 -0
  456. package/src/runtime/internal/parts/FieldLabel.vue +56 -0
  457. package/src/runtime/internal/parts/FieldWrapper.vue +63 -0
  458. package/src/runtime/internal/parts/ImageCropper.vue +415 -0
  459. package/src/runtime/internal/parts/InputControl.vue +189 -0
  460. package/src/runtime/internal/ui/UiButton.vue +274 -0
  461. package/src/runtime/internal/ui/UiNotice.vue +302 -0
  462. package/src/runtime/internal/ui/UiSelect.vue +1420 -0
  463. package/src/runtime/middleware/auth-guard.ts +52 -0
  464. package/src/runtime/pages/admin/collections/[id].vue +486 -0
  465. package/src/runtime/pages/admin/collections/create.vue +208 -0
  466. package/src/runtime/pages/admin/collections/index.vue +955 -0
  467. package/src/runtime/pages/admin/demo-fields.vue +1354 -0
  468. package/src/runtime/pages/admin/dictionaries/[id].vue +246 -0
  469. package/src/runtime/pages/admin/dictionaries/index.vue +438 -0
  470. package/src/runtime/pages/admin/index.vue +155 -0
  471. package/src/runtime/pages/admin/login.vue +159 -0
  472. package/src/runtime/pages/admin/media.vue +1176 -0
  473. package/src/runtime/pages/admin/options/[page].vue +174 -0
  474. package/src/runtime/pages/admin/register.vue +179 -0
  475. package/src/runtime/pages/admin/users/[id].vue +382 -0
  476. package/src/runtime/pages/admin/users/create.vue +232 -0
  477. package/src/runtime/pages/admin/users/index.vue +374 -0
  478. package/src/runtime/pages/index.vue +265 -0
  479. package/src/runtime/server/api/_katecms/auth/login.post.ts +62 -0
  480. package/src/runtime/server/api/_katecms/auth/logout.post.ts +7 -0
  481. package/src/runtime/server/api/_katecms/auth/register.post.ts +112 -0
  482. package/src/runtime/server/api/_katecms/auth/state.get.ts +19 -0
  483. package/src/runtime/server/api/_katecms/collections/[collection]/[id].delete.ts +77 -0
  484. package/src/runtime/server/api/_katecms/collections/[collection]/[id].get.ts +57 -0
  485. package/src/runtime/server/api/_katecms/collections/[collection]/[id].patch.ts +157 -0
  486. package/src/runtime/server/api/_katecms/collections/[collection]/revisions/[revisionId].post.ts +133 -0
  487. package/src/runtime/server/api/_katecms/collections/[collection]/revisions.get.ts +35 -0
  488. package/src/runtime/server/api/_katecms/collections/[collection].get.ts +177 -0
  489. package/src/runtime/server/api/_katecms/collections/[collection].post.ts +111 -0
  490. package/src/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].delete.ts +37 -0
  491. package/src/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].get.ts +51 -0
  492. package/src/runtime/server/api/_katecms/dictionaries/[dictionary]/[id].patch.ts +101 -0
  493. package/src/runtime/server/api/_katecms/dictionaries/[dictionary].get.ts +43 -0
  494. package/src/runtime/server/api/_katecms/dictionaries/[dictionary].post.ts +78 -0
  495. package/src/runtime/server/api/_katecms/media/[id]/regenerate.post.ts +39 -0
  496. package/src/runtime/server/api/_katecms/media/[id].delete.ts +28 -0
  497. package/src/runtime/server/api/_katecms/media/[id].get.ts +25 -0
  498. package/src/runtime/server/api/_katecms/media/[id].patch.ts +60 -0
  499. package/src/runtime/server/api/_katecms/media/index.get.ts +96 -0
  500. package/src/runtime/server/api/_katecms/media/index.post.ts +104 -0
  501. package/src/runtime/server/api/_katecms/media/regenerate.post.ts +38 -0
  502. package/src/runtime/server/api/_katecms/menu.get.ts +19 -0
  503. package/src/runtime/server/api/_katecms/oembed.get.ts +62 -0
  504. package/src/runtime/server/api/_katecms/options/[page].get.ts +35 -0
  505. package/src/runtime/server/api/_katecms/options/[page].patch.ts +46 -0
  506. package/src/runtime/server/api/_katecms/query.get.ts +332 -0
  507. package/src/runtime/server/api/_katecms/relation/entries.get.ts +98 -0
  508. package/src/runtime/server/api/_katecms/relation/terms.get.ts +61 -0
  509. package/src/runtime/server/api/_katecms/resolve.get.ts +148 -0
  510. package/src/runtime/server/api/_katecms/terms.get.ts +258 -0
  511. package/src/runtime/server/api/_katecms/users/[id].delete.ts +57 -0
  512. package/src/runtime/server/api/_katecms/users/[id].patch.ts +177 -0
  513. package/src/runtime/server/api/_katecms/users.get.ts +48 -0
  514. package/src/runtime/server/api/_katecms/users.post.ts +85 -0
  515. package/src/runtime/server/api/uploads/[...key].get.ts +33 -0
  516. package/src/runtime/server/kit.ts +5 -0
  517. package/src/runtime/server/middleware/admin-headers.ts +14 -0
  518. package/src/runtime/server/plugins/auto-migrate.ts +53 -0
  519. package/src/runtime/server/tsconfig.json +3 -0
  520. package/src/runtime/server/utils/auth-attempts.ts +71 -0
  521. package/src/runtime/server/utils/auth-rate-limit.ts +48 -0
  522. package/src/runtime/server/utils/client-address.ts +41 -0
  523. package/src/runtime/server/utils/collections.ts +381 -0
  524. package/src/runtime/server/utils/db.ts +36 -0
  525. package/src/runtime/server/utils/dictionaries.ts +397 -0
  526. package/src/runtime/server/utils/media-list.ts +131 -0
  527. package/src/runtime/server/utils/media.ts +94 -0
  528. package/src/runtime/server/utils/oembed-fetch.ts +157 -0
  529. package/src/runtime/server/utils/options.ts +86 -0
  530. package/src/runtime/server/utils/permissions.ts +44 -0
  531. package/src/runtime/server/utils/public-fields-query.ts +14 -0
  532. package/src/runtime/server/utils/public-term.ts +98 -0
  533. package/src/runtime/server/utils/regenerate.ts +56 -0
  534. package/src/runtime/server/utils/relation.ts +96 -0
  535. package/src/runtime/server/utils/request-address.ts +16 -0
  536. package/src/runtime/server/utils/revisions.ts +256 -0
  537. package/src/runtime/server/utils/session.ts +112 -0
  538. package/src/runtime/server/utils/upload-headers.ts +35 -0
  539. package/src/runtime/server/utils/users.ts +67 -0
  540. package/src/runtime/utils/admin-users.ts +43 -0
  541. package/src/runtime/utils/auth-error.ts +22 -0
  542. package/src/runtime/utils/cms-paths.ts +17 -0
  543. package/src/runtime/utils/collections.ts +228 -0
  544. package/src/runtime/utils/dictionaries.ts +89 -0
  545. package/src/runtime/utils/field-errors.ts +12 -0
  546. package/src/runtime/utils/field-values.ts +101 -0
  547. package/src/runtime/utils/helpers.ts +33 -0
  548. package/src/runtime/utils/media-library-query.ts +263 -0
  549. package/src/runtime/utils/options.ts +25 -0
  550. package/src/runtime/utils/preview.ts +56 -0
  551. package/src/runtime/utils/relation.ts +60 -0
  552. package/src/runtime/utils/slugify.ts +10 -0
@@ -0,0 +1,53 @@
1
+ import type { Database, Dictionaries, Dictionary, DictionaryDefinition } from '@katecms/core';
2
+ import type { Kysely } from 'kysely';
3
+ import type { CollectionDictionaryPicker, PublicDictionaryTerm } from '../../utils/collections.js';
4
+ import type { AdminDictionaryMeta, AdminDictionaryTerm, ParentOption } from '../../utils/dictionaries.js';
5
+ import { fail, readEntryId, readFields, readParentId, readSlug, readTitle } from './collections.js';
6
+ export { fail, readEntryId, readFields, readParentId, readSlug, readTitle };
7
+ export declare function getDictionaries(): Dictionaries;
8
+ export declare function getDictionaryDefinition(slug: string): DictionaryDefinition | undefined;
9
+ export declare function requireDictionary(slug: string): DictionaryDefinition;
10
+ export declare function toDictionaryMeta(slug: string, def: DictionaryDefinition): AdminDictionaryMeta;
11
+ export declare function toPublicTerm(row: Dictionary, slugPath: string): PublicDictionaryTerm;
12
+ export declare function toAdminTerm(row: Dictionary, slugPath: string, flags?: {
13
+ canUpdate?: boolean;
14
+ canDelete?: boolean;
15
+ depth?: number;
16
+ }): AdminDictionaryTerm;
17
+ export declare function toParentOption(row: {
18
+ id: number;
19
+ title: string;
20
+ slug: string;
21
+ parent_id: number | null;
22
+ slugPath: string;
23
+ depth: number;
24
+ }): ParentOption;
25
+ export declare function readDictionarySlug(raw: string | undefined): string;
26
+ export declare function requireTermFields(def: DictionaryDefinition, fields: Record<string, unknown>): void;
27
+ export declare function listDictionaryParentOptions(rows: Array<{
28
+ id: number;
29
+ title: string;
30
+ slug: string;
31
+ parent_id: number | null;
32
+ }>, excludeId?: number): ParentOption[];
33
+ export declare function flattenDictionaryTerms(rows: Dictionary[]): Array<{
34
+ row: Dictionary;
35
+ depth: number;
36
+ slugPath: string;
37
+ }>;
38
+ export declare function assertDictionaryParent(rows: Array<{
39
+ id: number;
40
+ type: string;
41
+ parent_id: number | null;
42
+ }>, type: string, parentId: number | null, excludeId?: number): void;
43
+ export declare function rethrowDictionaryWriteError(error: unknown): never;
44
+ export declare function dictionariesForCollection(collectionSlug: string): Array<{
45
+ slug: string;
46
+ def: DictionaryDefinition;
47
+ }>;
48
+ export declare function loadCollectionDictionaryPickers(db: Kysely<Database>, collectionSlug: string): Promise<CollectionDictionaryPicker[]>;
49
+ /** Assigned terms for a public entry, keyed by dictionary slug (empty arrays when none). */
50
+ export declare function loadAssignedEntryDictionaries(db: Kysely<Database>, collectionId: number, collectionSlug: string): Promise<Record<string, PublicDictionaryTerm[]>>;
51
+ export declare function selectedDictionaryIds(db: Kysely<Database>, collectionId: number, pickers: CollectionDictionaryPicker[]): Promise<Record<string, number[]>>;
52
+ export declare function readDictionaryAssignments(value: unknown, pickers: CollectionDictionaryPicker[]): Record<string, number[]>;
53
+ export declare function applyDictionaryAssignments(db: Kysely<Database>, collectionId: number, collectionSlug: string, value: unknown): Promise<Record<string, number[]>>;
@@ -0,0 +1,301 @@
1
+ import { useRuntimeConfig } from "#imports";
2
+ import {
3
+ buildSlugPathMap,
4
+ flattenCollectionTree,
5
+ formatRequiredFieldsError,
6
+ isUniqueConstraintError,
7
+ listDictionaries,
8
+ listDictionariesByCollection,
9
+ setCollectionDictionaries,
10
+ validateRequiredFields
11
+ } from "@katecms/core";
12
+ import {
13
+ fail,
14
+ readEntryId,
15
+ readFields,
16
+ readParentId,
17
+ readSlug,
18
+ readTitle
19
+ } from "./collections.js";
20
+ export { fail, readEntryId, readFields, readParentId, readSlug, readTitle };
21
+ export function getDictionaries() {
22
+ return useRuntimeConfig().katecms?.dictionaries ?? {};
23
+ }
24
+ export function getDictionaryDefinition(slug) {
25
+ return getDictionaries()[slug];
26
+ }
27
+ export function requireDictionary(slug) {
28
+ const dictionary = getDictionaryDefinition(slug);
29
+ if (!dictionary) {
30
+ fail(404, "Dictionary not found.");
31
+ }
32
+ return dictionary;
33
+ }
34
+ export function toDictionaryMeta(slug, def) {
35
+ return {
36
+ slug,
37
+ labels: {
38
+ name: def.labels.name,
39
+ singularName: def.labels.singularName ?? def.labels.name
40
+ },
41
+ fields: def.fields ?? {},
42
+ collections: [...def.collections],
43
+ multiple: def.multiple === true,
44
+ hierarchical: def.hierarchical === true,
45
+ public: def.public !== false,
46
+ rewrite: def.rewrite
47
+ };
48
+ }
49
+ function toIso(value) {
50
+ if (value == null) {
51
+ return (/* @__PURE__ */ new Date(0)).toISOString();
52
+ }
53
+ if (value instanceof Date) {
54
+ return Number.isNaN(value.getTime()) ? (/* @__PURE__ */ new Date(0)).toISOString() : value.toISOString();
55
+ }
56
+ const date = new Date(value);
57
+ return Number.isNaN(date.getTime()) ? (/* @__PURE__ */ new Date(0)).toISOString() : date.toISOString();
58
+ }
59
+ export function toPublicTerm(row, slugPath) {
60
+ return {
61
+ id: row.id,
62
+ type: row.type,
63
+ slug: row.slug,
64
+ slugPath: slugPath || row.slug,
65
+ title: row.title,
66
+ fields: row.fields ?? {},
67
+ parentId: row.parent_id
68
+ };
69
+ }
70
+ export function toAdminTerm(row, slugPath, flags) {
71
+ return {
72
+ id: row.id,
73
+ type: row.type,
74
+ slug: row.slug,
75
+ slugPath: slugPath || row.slug,
76
+ title: row.title,
77
+ fields: row.fields ?? {},
78
+ parentId: row.parent_id,
79
+ createdAt: toIso(row.created_at),
80
+ updatedAt: toIso(row.updated_at),
81
+ ...flags
82
+ };
83
+ }
84
+ export function toParentOption(row) {
85
+ return {
86
+ id: row.id,
87
+ title: row.title,
88
+ slug: row.slug,
89
+ parentId: row.parent_id,
90
+ slugPath: row.slugPath,
91
+ depth: row.depth
92
+ };
93
+ }
94
+ export function readDictionarySlug(raw) {
95
+ const slug = typeof raw === "string" ? raw.trim() : "";
96
+ if (!slug) {
97
+ fail(400, "Dictionary is required.");
98
+ }
99
+ return slug;
100
+ }
101
+ export function requireTermFields(def, fields) {
102
+ const issues = validateRequiredFields(def.fields ?? {}, fields);
103
+ if (issues.length > 0) {
104
+ fail(422, formatRequiredFieldsError(issues));
105
+ }
106
+ }
107
+ function descendantIds(rows, rootId) {
108
+ const children = /* @__PURE__ */ new Map();
109
+ for (const row of rows) {
110
+ if (row.parent_id == null) {
111
+ continue;
112
+ }
113
+ const list = children.get(row.parent_id) ?? [];
114
+ list.push(row.id);
115
+ children.set(row.parent_id, list);
116
+ }
117
+ const out = /* @__PURE__ */ new Set();
118
+ const stack = [...children.get(rootId) ?? []];
119
+ while (stack.length > 0) {
120
+ const id = stack.pop();
121
+ if (out.has(id)) {
122
+ continue;
123
+ }
124
+ out.add(id);
125
+ stack.push(...children.get(id) ?? []);
126
+ }
127
+ return out;
128
+ }
129
+ export function listDictionaryParentOptions(rows, excludeId) {
130
+ const blocked = excludeId === void 0 ? /* @__PURE__ */ new Set() : descendantIds(rows, excludeId);
131
+ if (excludeId !== void 0) {
132
+ blocked.add(excludeId);
133
+ }
134
+ const visible = rows.filter((row) => !blocked.has(row.id));
135
+ const paths = buildSlugPathMap(visible);
136
+ return flattenCollectionTree(visible).map(({ row, depth }) => toParentOption({
137
+ ...row,
138
+ slugPath: paths.get(row.id) ?? row.slug,
139
+ depth
140
+ }));
141
+ }
142
+ export function flattenDictionaryTerms(rows) {
143
+ const paths = buildSlugPathMap(rows);
144
+ return flattenCollectionTree(rows).map(({ row, depth }) => ({
145
+ row,
146
+ depth,
147
+ slugPath: paths.get(row.id) ?? row.slug
148
+ }));
149
+ }
150
+ export function assertDictionaryParent(rows, type, parentId, excludeId) {
151
+ if (parentId == null) {
152
+ return;
153
+ }
154
+ const parent = rows.find((row) => row.id === parentId);
155
+ if (!parent || parent.type !== type) {
156
+ fail(422, "Invalid parent.");
157
+ }
158
+ if (excludeId !== void 0 && parentId === excludeId) {
159
+ fail(422, "Invalid parent.");
160
+ }
161
+ if (excludeId !== void 0) {
162
+ const blocked = descendantIds(rows, excludeId);
163
+ if (blocked.has(parentId)) {
164
+ fail(422, "Invalid parent.");
165
+ }
166
+ }
167
+ }
168
+ export function rethrowDictionaryWriteError(error) {
169
+ if (isUniqueConstraintError(error)) {
170
+ fail(409, "A term with this slug already exists.");
171
+ }
172
+ const message = error instanceof Error ? error.message : "";
173
+ if (/parent/i.test(message) || /descendant/i.test(message) || /hierarchy/i.test(message)) {
174
+ fail(422, message.startsWith("dictionaries:") ? "Invalid parent." : message);
175
+ }
176
+ throw error;
177
+ }
178
+ export function dictionariesForCollection(collectionSlug) {
179
+ return Object.entries(getDictionaries()).filter(([, def]) => def.collections.includes(collectionSlug)).map(([slug, def]) => ({ slug, def }));
180
+ }
181
+ export async function loadCollectionDictionaryPickers(db, collectionSlug) {
182
+ const attached = dictionariesForCollection(collectionSlug);
183
+ const pickers = [];
184
+ for (const { slug, def } of attached) {
185
+ const rows = await listDictionaries(db, slug);
186
+ pickers.push({
187
+ slug,
188
+ labels: {
189
+ name: def.labels.name,
190
+ singularName: def.labels.singularName ?? def.labels.name
191
+ },
192
+ multiple: def.multiple === true,
193
+ terms: listDictionaryParentOptions(rows)
194
+ });
195
+ }
196
+ return pickers;
197
+ }
198
+ export async function loadAssignedEntryDictionaries(db, collectionId, collectionSlug) {
199
+ const attached = dictionariesForCollection(collectionSlug);
200
+ const grouped = Object.fromEntries(
201
+ attached.map(({ slug }) => [slug, []])
202
+ );
203
+ if (attached.length === 0) {
204
+ return grouped;
205
+ }
206
+ const allowed = new Set(attached.map(({ slug }) => slug));
207
+ const linked = (await listDictionariesByCollection(db, collectionId)).filter((term) => allowed.has(term.type));
208
+ if (linked.length === 0) {
209
+ return grouped;
210
+ }
211
+ const typesNeeded = [...new Set(linked.map((term) => term.type))];
212
+ const typeRows = await Promise.all(typesNeeded.map((type) => listDictionaries(db, type)));
213
+ const pathMaps = new Map(typesNeeded.map((type, index) => [
214
+ type,
215
+ buildSlugPathMap(typeRows[index])
216
+ ]));
217
+ for (const term of linked) {
218
+ grouped[term.type].push(toPublicTerm(term, pathMaps.get(term.type)?.get(term.id) ?? term.slug));
219
+ }
220
+ return grouped;
221
+ }
222
+ export async function selectedDictionaryIds(db, collectionId, pickers) {
223
+ const ids = Object.fromEntries(
224
+ pickers.map((picker) => [picker.slug, []])
225
+ );
226
+ if (pickers.length === 0) {
227
+ return ids;
228
+ }
229
+ const allowed = new Set(pickers.map((picker) => picker.slug));
230
+ const linked = await listDictionariesByCollection(db, collectionId);
231
+ for (const term of linked) {
232
+ if (!allowed.has(term.type)) {
233
+ continue;
234
+ }
235
+ ids[term.type].push(term.id);
236
+ }
237
+ return ids;
238
+ }
239
+ function readTermIdList(value) {
240
+ if (value === void 0 || value === null || value === "") {
241
+ return [];
242
+ }
243
+ const raw = Array.isArray(value) ? value : [value];
244
+ const ids = [];
245
+ const seen = /* @__PURE__ */ new Set();
246
+ for (const item of raw) {
247
+ const id = typeof item === "number" ? item : Number(item);
248
+ if (!Number.isInteger(id) || id <= 0) {
249
+ fail(422, "Invalid dictionary term.");
250
+ }
251
+ if (seen.has(id)) {
252
+ continue;
253
+ }
254
+ seen.add(id);
255
+ ids.push(id);
256
+ }
257
+ return ids;
258
+ }
259
+ export function readDictionaryAssignments(value, pickers) {
260
+ if (value === void 0 || value === null) {
261
+ return Object.fromEntries(pickers.map((picker) => [picker.slug, []]));
262
+ }
263
+ if (typeof value !== "object" || Array.isArray(value)) {
264
+ fail(422, "Invalid dictionary selection.");
265
+ }
266
+ const raw = value;
267
+ const allowed = new Set(pickers.map((picker) => picker.slug));
268
+ for (const slug of Object.keys(raw)) {
269
+ if (!allowed.has(slug)) {
270
+ fail(422, "Unknown dictionary.");
271
+ }
272
+ }
273
+ const assigned = {};
274
+ for (const picker of pickers) {
275
+ const termIds = new Set(picker.terms.map((term) => term.id));
276
+ const selected = readTermIdList(raw[picker.slug]);
277
+ for (const id of selected) {
278
+ if (!termIds.has(id)) {
279
+ fail(422, "Invalid dictionary term.");
280
+ }
281
+ }
282
+ if (!picker.multiple && selected.length > 1) {
283
+ fail(422, `Only one ${picker.labels.singularName.toLowerCase()} can be selected.`);
284
+ }
285
+ assigned[picker.slug] = selected;
286
+ }
287
+ return assigned;
288
+ }
289
+ export async function applyDictionaryAssignments(db, collectionId, collectionSlug, value) {
290
+ const pickers = await loadCollectionDictionaryPickers(db, collectionSlug);
291
+ if (pickers.length === 0) {
292
+ return {};
293
+ }
294
+ const assigned = readDictionaryAssignments(value, pickers);
295
+ const linked = await listDictionariesByCollection(db, collectionId);
296
+ const replaceTypes = new Set(pickers.map((picker) => picker.slug));
297
+ const keep = linked.filter((term) => !replaceTypes.has(term.type)).map((term) => term.id);
298
+ const next = [...keep, ...Object.values(assigned).flat()];
299
+ await setCollectionDictionaries(db, collectionId, next);
300
+ return assigned;
301
+ }
@@ -0,0 +1,18 @@
1
+ import type { Database } from '@katecms/core';
2
+ import { type SelectQueryBuilder } from 'kysely';
3
+ import type { Kysely } from 'kysely';
4
+ import type { MediaSort, MediaTypeFilter } from '../../utils/media-library-query.js';
5
+ export interface MediaListFilter {
6
+ type: MediaTypeFilter;
7
+ /** `YYYY-MM`, or empty for every month. */
8
+ month: string;
9
+ search: string;
10
+ offsetMinutes: number;
11
+ sort: MediaSort;
12
+ }
13
+ type MediaQuery<T> = SelectQueryBuilder<Database, 'media', T>;
14
+ export declare function applyMediaListFilter<T>(query: MediaQuery<T>, filter: MediaListFilter, driver: 'sqlite' | 'postgres'): MediaQuery<T>;
15
+ /** Stable order for the paged library. Non-images stay last when sorting by pixel size. */
16
+ export declare function applyMediaListOrder<T>(query: MediaQuery<T>, sort: MediaSort): MediaQuery<T>;
17
+ export declare function listMediaMonths(db: Kysely<Database>, filter: MediaListFilter, driver: 'sqlite' | 'postgres'): Promise<string[]>;
18
+ export {};
@@ -0,0 +1,84 @@
1
+ import { sql } from "kysely";
2
+ import {
3
+ ARCHIVE_MIME_TYPES,
4
+ DOCUMENT_MIME_TYPES,
5
+ SPREADSHEET_MIME_TYPES,
6
+ clampUtcOffsetMinutes,
7
+ searchNeedle
8
+ } from "../../utils/media-library-query.js";
9
+ function exactMimes(type) {
10
+ if (type === "document") {
11
+ return DOCUMENT_MIME_TYPES;
12
+ }
13
+ if (type === "spreadsheet") {
14
+ return SPREADSHEET_MIME_TYPES;
15
+ }
16
+ if (type === "archive") {
17
+ return ARCHIVE_MIME_TYPES;
18
+ }
19
+ return null;
20
+ }
21
+ function monthExpression(driver, offsetMinutes) {
22
+ const offset = clampUtcOffsetMinutes(offsetMinutes);
23
+ if (driver === "postgres") {
24
+ return sql`to_char((media.created_at AT TIME ZONE 'UTC') + (${offset} * interval '1 minute'), 'YYYY-MM')`;
25
+ }
26
+ const modifier = `${offset >= 0 ? "+" : ""}${offset} minutes`;
27
+ return sql`substr(datetime(substr(replace(replace(media.created_at, 'T', ' '), 'Z', ''), 1, 19), ${modifier}), 1, 7)`;
28
+ }
29
+ export function applyMediaListFilter(query, filter, driver) {
30
+ let next = query;
31
+ if (filter.type === "image" || filter.type === "audio" || filter.type === "video") {
32
+ next = next.where(sql`lower(media.mime_type) like ${`${filter.type}/%`}`);
33
+ } else {
34
+ const mimes = exactMimes(filter.type);
35
+ if (mimes) {
36
+ next = next.where(sql`lower(media.mime_type) in (${sql.join(mimes.map((mime) => sql`${mime}`))})`);
37
+ }
38
+ }
39
+ if (/^\d{4}-(0[1-9]|1[0-2])$/.test(filter.month)) {
40
+ const month = monthExpression(driver, filter.offsetMinutes);
41
+ next = next.where(sql`${month} = ${filter.month}`);
42
+ }
43
+ const needle = searchNeedle(filter.search);
44
+ if (needle) {
45
+ const pattern = `%${needle}%`;
46
+ next = next.where(sql`(
47
+ lower(media.filename) like ${pattern}
48
+ or lower(coalesce(media.alt, '')) like ${pattern}
49
+ or lower(coalesce(media.caption, '')) like ${pattern}
50
+ )`);
51
+ }
52
+ return next;
53
+ }
54
+ function sortParts(sort) {
55
+ const direction = sort.endsWith("-asc") ? "asc" : "desc";
56
+ const field = sort.slice(0, -(direction.length + 1));
57
+ return { field, direction };
58
+ }
59
+ export function applyMediaListOrder(query, sort) {
60
+ const { field, direction } = sortParts(sort);
61
+ if (field === "name") {
62
+ return query.orderBy(sql`lower(media.filename)`, direction).orderBy("id", "asc");
63
+ }
64
+ if (field === "filesize") {
65
+ return query.orderBy("filesize", direction).orderBy("id", "asc");
66
+ }
67
+ if (field === "dimensions") {
68
+ return query.orderBy(sql`(media.width is null or media.height is null)`).orderBy(sql`coalesce(media.width, 0) * coalesce(media.height, 0)`, direction).orderBy("id", "asc");
69
+ }
70
+ if (field === "author") {
71
+ const author = sql`(select lower(coalesce(nullif(trim(users.name), ''), users.email)) from users where users.id = media.uploaded_by)`;
72
+ return query.orderBy(sql`${author} is null`).orderBy(author, direction).orderBy("id", "asc");
73
+ }
74
+ return query.orderBy("created_at", direction).orderBy("id", direction);
75
+ }
76
+ export async function listMediaMonths(db, filter, driver) {
77
+ const month = monthExpression(driver, filter.offsetMinutes);
78
+ const rows = await applyMediaListFilter(
79
+ db.selectFrom("media"),
80
+ { ...filter, month: "" },
81
+ driver
82
+ ).select(month.as("month")).distinct().execute();
83
+ return rows.map((row) => String(row.month ?? "")).filter((value) => /^\d{4}-(0[1-9]|1[0-2])$/.test(value)).sort((a, b) => b.localeCompare(a));
84
+ }
@@ -0,0 +1,12 @@
1
+ import type { H3Event } from 'h3';
2
+ import type { Media, MediaItem, MediaStorage, ResolvedMediaConfig, StoredMediaVariant } from '@katecms/core';
3
+ /** Public URL prefix; files in `public/uploads` are served here by Nuxt. */
4
+ export declare const UPLOADS_PUBLIC_PATH = "/uploads";
5
+ export declare function getMediaConfig(): ResolvedMediaConfig;
6
+ export declare function getMediaStorage(): MediaStorage;
7
+ export declare function toClientMedia(row: Media, uploadedByName?: string | null): MediaItem;
8
+ export declare function parseMediaId(raw: string | undefined): number;
9
+ export declare function storedVariants(value: unknown): StoredMediaVariant[];
10
+ export declare function uploaderNames(ids: Array<number | null | undefined>): Promise<Map<number, string>>;
11
+ export declare function toClientMediaRow(row: Media): Promise<MediaItem>;
12
+ export declare function scheduleBackground(event: H3Event, task: Promise<unknown>): void;
@@ -0,0 +1,77 @@
1
+ import { useRuntimeConfig } from "#imports";
2
+ import { createError } from "h3";
3
+ import {
4
+ createLocalMediaStorage,
5
+ findUserById,
6
+ toMediaItem
7
+ } from "@katecms/core";
8
+ import { getDb } from "./db.js";
9
+ export const UPLOADS_PUBLIC_PATH = "/uploads";
10
+ let storage;
11
+ export function getMediaConfig() {
12
+ const media = useRuntimeConfig().katecms?.media;
13
+ if (!media?.dir) {
14
+ throw createError({
15
+ statusCode: 500,
16
+ statusMessage: "Media upload directory is not configured."
17
+ });
18
+ }
19
+ return media;
20
+ }
21
+ export function getMediaStorage() {
22
+ if (storage) {
23
+ return storage;
24
+ }
25
+ storage = createLocalMediaStorage({
26
+ dir: getMediaConfig().dir,
27
+ publicPrefix: UPLOADS_PUBLIC_PATH
28
+ });
29
+ return storage;
30
+ }
31
+ export function toClientMedia(row, uploadedByName) {
32
+ return toMediaItem(row, {
33
+ publicUrl: (key) => getMediaStorage().publicUrl(key),
34
+ uploadedByName
35
+ });
36
+ }
37
+ export function parseMediaId(raw) {
38
+ const id = Number(raw);
39
+ if (!Number.isInteger(id) || id <= 0) {
40
+ throw createError({ statusCode: 400, statusMessage: "Invalid id." });
41
+ }
42
+ return id;
43
+ }
44
+ export function storedVariants(value) {
45
+ if (!Array.isArray(value)) {
46
+ return [];
47
+ }
48
+ return value.filter((row) => {
49
+ if (!row || typeof row !== "object") {
50
+ return false;
51
+ }
52
+ const variant = row;
53
+ return typeof variant.filename === "string" && typeof variant.size === "string" && typeof variant.format === "string";
54
+ });
55
+ }
56
+ export async function uploaderNames(ids) {
57
+ const unique = [...new Set(ids.filter((id) => typeof id === "number"))];
58
+ const names = /* @__PURE__ */ new Map();
59
+ const db = getDb();
60
+ await Promise.all(unique.map(async (id) => {
61
+ const user = await findUserById(db, id);
62
+ if (user) {
63
+ names.set(id, user.name?.trim() || user.email);
64
+ }
65
+ }));
66
+ return names;
67
+ }
68
+ export async function toClientMediaRow(row) {
69
+ const names = await uploaderNames([row.uploaded_by]);
70
+ return toClientMedia(row, row.uploaded_by != null ? names.get(row.uploaded_by) ?? null : null);
71
+ }
72
+ export function scheduleBackground(event, task) {
73
+ const waitUntil = event.waitUntil;
74
+ if (typeof waitUntil === "function") {
75
+ waitUntil(task);
76
+ }
77
+ }
@@ -0,0 +1,4 @@
1
+ import type { OembedConnectInit } from '@katecms/core';
2
+ export declare function resolveOembedHost(hostname: string): Promise<string[]>;
3
+ /** Dial `address` while the request still carries `url`'s hostname. */
4
+ export declare function connectOembed(url: URL, address: string, init: OembedConnectInit): Promise<Response>;
@@ -0,0 +1,142 @@
1
+ import { request as httpRequest } from "node:http";
2
+ import { request as httpsRequest } from "node:https";
3
+ import { isIP } from "node:net";
4
+ import { lookup } from "node:dns/promises";
5
+ import { brotliDecompressSync, gunzipSync, inflateSync } from "node:zlib";
6
+ const MAX_BODY_BYTES = 1e6;
7
+ const SKIP_HEADERS = /* @__PURE__ */ new Set(["content-encoding", "content-length", "transfer-encoding"]);
8
+ export async function resolveOembedHost(hostname) {
9
+ const host = hostname.replace(/^\[|\]$/g, "");
10
+ if (isIP(host)) {
11
+ return [host];
12
+ }
13
+ const records = await lookup(host, { all: true, verbatim: true });
14
+ return records.map((record) => record.address);
15
+ }
16
+ function pinnedLookup(address, family) {
17
+ return (_hostname, options, callback) => {
18
+ if (options.all) {
19
+ callback(null, [{ address, family }]);
20
+ return;
21
+ }
22
+ callback(null, address, family);
23
+ };
24
+ }
25
+ function responseHeaders(raw) {
26
+ const headers = new Headers();
27
+ for (const [key, value] of Object.entries(raw)) {
28
+ if (SKIP_HEADERS.has(key) || value == null) {
29
+ continue;
30
+ }
31
+ if (Array.isArray(value)) {
32
+ for (const item of value) {
33
+ headers.append(key, item);
34
+ }
35
+ continue;
36
+ }
37
+ headers.set(key, value);
38
+ }
39
+ return headers;
40
+ }
41
+ function decodeBody(body, encoding) {
42
+ const maxOutputLength = MAX_BODY_BYTES;
43
+ const kind = encoding?.trim().toLowerCase();
44
+ try {
45
+ if (!kind || kind === "identity") {
46
+ return body;
47
+ }
48
+ if (kind === "gzip" || kind === "x-gzip") {
49
+ return gunzipSync(body, { maxOutputLength });
50
+ }
51
+ if (kind === "deflate") {
52
+ return inflateSync(body, { maxOutputLength });
53
+ }
54
+ if (kind === "br") {
55
+ return brotliDecompressSync(body, { maxOutputLength });
56
+ }
57
+ } catch (error) {
58
+ const code = error && typeof error === "object" && "code" in error ? error.code : "";
59
+ if (code === "ERR_BUFFER_TOO_LARGE") {
60
+ throw new Error("oEmbed response is too large.");
61
+ }
62
+ throw new Error("Failed to fetch oEmbed.");
63
+ }
64
+ throw new Error("Failed to fetch oEmbed.");
65
+ }
66
+ export function connectOembed(url, address, init) {
67
+ const family = isIP(address);
68
+ if (family !== 4 && family !== 6) {
69
+ return Promise.reject(new Error("Failed to resolve host."));
70
+ }
71
+ const secure = url.protocol === "https:";
72
+ const hostname = url.hostname.replace(/^\[|\]$/g, "");
73
+ const port = url.port ? Number(url.port) : secure ? 443 : 80;
74
+ const options = {
75
+ hostname,
76
+ port,
77
+ method: "GET",
78
+ path: `${url.pathname}${url.search}`,
79
+ headers: {
80
+ ...init.headers,
81
+ "accept-encoding": "identity",
82
+ host: url.host
83
+ },
84
+ lookup: pinnedLookup(address, family),
85
+ signal: init.signal
86
+ };
87
+ return new Promise((resolve, reject) => {
88
+ let settled = false;
89
+ let tooLarge = false;
90
+ const fail = (error) => {
91
+ if (settled) {
92
+ return;
93
+ }
94
+ settled = true;
95
+ if (tooLarge) {
96
+ reject(new Error("oEmbed response is too large."));
97
+ return;
98
+ }
99
+ reject(error instanceof Error ? error : new Error("Failed to fetch oEmbed."));
100
+ };
101
+ const succeed = (response) => {
102
+ if (settled) {
103
+ return;
104
+ }
105
+ settled = true;
106
+ resolve(response);
107
+ };
108
+ const onResponse = (incoming) => {
109
+ const chunks = [];
110
+ let received = 0;
111
+ incoming.on("data", (chunk) => {
112
+ received += chunk.length;
113
+ if (received > MAX_BODY_BYTES) {
114
+ tooLarge = true;
115
+ incoming.destroy();
116
+ return;
117
+ }
118
+ chunks.push(chunk);
119
+ });
120
+ incoming.on("error", fail);
121
+ incoming.on("end", () => {
122
+ if (tooLarge) {
123
+ fail(new Error("oEmbed response is too large."));
124
+ return;
125
+ }
126
+ try {
127
+ const encoding = typeof incoming.headers["content-encoding"] === "string" ? incoming.headers["content-encoding"] : void 0;
128
+ const body = decodeBody(Buffer.concat(chunks), encoding);
129
+ succeed(new Response(body, {
130
+ status: incoming.statusCode ?? 502,
131
+ headers: responseHeaders(incoming.headers)
132
+ }));
133
+ } catch (error) {
134
+ fail(error);
135
+ }
136
+ });
137
+ };
138
+ const req = secure ? httpsRequest({ ...options, servername: hostname }, onResponse) : httpRequest(options, onResponse);
139
+ req.on("error", fail);
140
+ req.end();
141
+ });
142
+ }