convex-cms 0.0.3 → 0.0.5-alpha.2

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 (375) hide show
  1. package/README.md +107 -60
  2. package/admin/README.md +99 -0
  3. package/admin/src/components/AdminLayout.tsx +22 -0
  4. package/admin/src/components/BreakingChangesWarningDialog.tsx +81 -0
  5. package/admin/src/components/BulkActionBar.tsx +190 -0
  6. package/admin/src/components/BulkOperationModal.tsx +177 -0
  7. package/admin/src/components/ContentEntryEditor.tsx +1104 -0
  8. package/admin/src/components/ContentTypeFormModal.tsx +1012 -0
  9. package/admin/src/components/ErrorBoundary.tsx +83 -0
  10. package/admin/src/components/ErrorState.tsx +147 -0
  11. package/admin/src/components/Header.tsx +294 -0
  12. package/admin/src/components/RouteGuard.tsx +264 -0
  13. package/admin/src/components/Sidebar.tsx +90 -0
  14. package/admin/src/components/TaxonomyEditor.tsx +348 -0
  15. package/admin/src/components/TermTree.tsx +533 -0
  16. package/admin/src/components/UploadDropzone.tsx +383 -0
  17. package/admin/src/components/VersionCompare.tsx +250 -0
  18. package/admin/src/components/VersionHistory.tsx +279 -0
  19. package/admin/src/components/VersionRollbackModal.tsx +79 -0
  20. package/admin/src/components/cmsds/CmsButton.tsx +101 -0
  21. package/admin/src/components/cmsds/CmsDialog.tsx +139 -0
  22. package/admin/src/components/cmsds/CmsDropdown.tsx +62 -0
  23. package/admin/src/components/cmsds/CmsEmptyState.tsx +54 -0
  24. package/admin/src/components/cmsds/CmsField.tsx +47 -0
  25. package/admin/src/components/cmsds/CmsPageHeader.tsx +35 -0
  26. package/admin/src/components/cmsds/CmsStatusBadge.tsx +153 -0
  27. package/admin/src/components/cmsds/CmsSurface.tsx +52 -0
  28. package/admin/src/components/cmsds/CmsTable.tsx +164 -0
  29. package/admin/src/components/cmsds/CmsToolbar.tsx +58 -0
  30. package/admin/src/components/cmsds/index.ts +10 -0
  31. package/admin/src/components/fields/BooleanField.tsx +74 -0
  32. package/admin/src/components/fields/CategoryField.tsx +394 -0
  33. package/admin/src/components/fields/DateField.tsx +173 -0
  34. package/admin/src/components/fields/DefaultFieldRenderer.tsx +74 -0
  35. package/admin/src/components/fields/FieldRenderer.tsx +180 -0
  36. package/admin/src/components/fields/FieldWrapper.tsx +57 -0
  37. package/admin/src/components/fields/JsonField.tsx +172 -0
  38. package/admin/src/components/fields/MediaField.tsx +367 -0
  39. package/admin/src/components/fields/MultiSelectField.tsx +118 -0
  40. package/admin/src/components/fields/NumberField.tsx +77 -0
  41. package/admin/src/components/fields/ReferenceField.tsx +386 -0
  42. package/admin/src/components/fields/RichTextField.tsx +171 -0
  43. package/admin/src/components/fields/SelectField.tsx +62 -0
  44. package/admin/src/components/fields/TagField.tsx +325 -0
  45. package/admin/src/components/fields/TextAreaField.tsx +68 -0
  46. package/admin/src/components/fields/TextField.tsx +56 -0
  47. package/admin/src/components/fields/index.ts +54 -0
  48. package/admin/src/components/fields/registry.ts +64 -0
  49. package/admin/src/components/fields/types.ts +217 -0
  50. package/admin/src/components/filters/TaxonomyFilter.tsx +254 -0
  51. package/admin/src/components/filters/index.ts +1 -0
  52. package/admin/src/components/index.ts +8 -0
  53. package/admin/src/components/media/MediaAssetActions.tsx +115 -0
  54. package/admin/src/components/media/MediaAssetEditDialog.tsx +217 -0
  55. package/admin/src/components/media/MediaBulkActionBar.tsx +51 -0
  56. package/admin/src/components/media/MediaFolderActions.tsx +69 -0
  57. package/admin/src/components/media/MediaFolderEditDialog.tsx +126 -0
  58. package/admin/src/components/media/MediaMoveModal.tsx +179 -0
  59. package/admin/src/components/media/MediaPreviewModal.tsx +370 -0
  60. package/admin/src/components/media/MediaTaxonomyPicker.tsx +304 -0
  61. package/admin/src/components/media/MediaTrashBulkActionBar.tsx +59 -0
  62. package/admin/src/components/ui/accordion.tsx +64 -0
  63. package/admin/src/components/ui/alert-dialog.tsx +155 -0
  64. package/admin/src/components/ui/alert.tsx +66 -0
  65. package/admin/src/components/ui/avatar.tsx +53 -0
  66. package/admin/src/components/ui/badge.tsx +46 -0
  67. package/admin/src/components/ui/breadcrumb.tsx +109 -0
  68. package/admin/src/components/ui/button.tsx +62 -0
  69. package/admin/src/components/ui/calendar.tsx +220 -0
  70. package/admin/src/components/ui/card.tsx +92 -0
  71. package/admin/src/components/ui/checkbox.tsx +30 -0
  72. package/admin/src/components/ui/command.tsx +182 -0
  73. package/admin/src/components/ui/dialog.tsx +143 -0
  74. package/admin/src/components/ui/dropdown-menu.tsx +257 -0
  75. package/admin/src/components/ui/form.tsx +167 -0
  76. package/admin/src/components/ui/input.tsx +21 -0
  77. package/admin/src/components/ui/label.tsx +24 -0
  78. package/admin/src/components/ui/popover.tsx +46 -0
  79. package/admin/src/components/ui/scroll-area.tsx +56 -0
  80. package/admin/src/components/ui/select.tsx +190 -0
  81. package/admin/src/components/ui/separator.tsx +26 -0
  82. package/admin/src/components/ui/sheet.tsx +137 -0
  83. package/admin/src/components/ui/sidebar.tsx +724 -0
  84. package/admin/src/components/ui/skeleton.tsx +13 -0
  85. package/admin/src/components/ui/sonner.tsx +38 -0
  86. package/admin/src/components/ui/switch.tsx +31 -0
  87. package/admin/src/components/ui/table.tsx +114 -0
  88. package/admin/src/components/ui/tabs.tsx +66 -0
  89. package/admin/src/components/ui/textarea.tsx +18 -0
  90. package/admin/src/components/ui/tooltip.tsx +61 -0
  91. package/admin/src/contexts/AdminConfigContext.tsx +30 -0
  92. package/admin/src/contexts/AuthContext.tsx +330 -0
  93. package/admin/src/contexts/BreadcrumbContext.tsx +49 -0
  94. package/admin/src/contexts/SettingsConfigContext.tsx +57 -0
  95. package/admin/src/contexts/ThemeContext.tsx +91 -0
  96. package/admin/src/contexts/index.ts +20 -0
  97. package/admin/src/embed/components/EmbedHeader.tsx +103 -0
  98. package/admin/src/embed/components/EmbedLayout.tsx +29 -0
  99. package/admin/src/embed/components/EmbedSidebar.tsx +119 -0
  100. package/admin/src/embed/components/index.ts +3 -0
  101. package/admin/src/embed/contexts/ApiContext.tsx +32 -0
  102. package/admin/src/embed/index.tsx +184 -0
  103. package/admin/src/embed/navigation.tsx +202 -0
  104. package/admin/src/embed/pages/Content.tsx +19 -0
  105. package/admin/src/embed/pages/ContentTypes.tsx +19 -0
  106. package/admin/src/embed/pages/Dashboard.tsx +19 -0
  107. package/admin/src/embed/pages/Media.tsx +19 -0
  108. package/admin/src/embed/pages/Settings.tsx +22 -0
  109. package/admin/src/embed/pages/Taxonomies.tsx +22 -0
  110. package/admin/src/embed/pages/Trash.tsx +22 -0
  111. package/admin/src/embed/pages/index.ts +7 -0
  112. package/admin/src/embed/types.ts +24 -0
  113. package/admin/src/hooks/index.ts +2 -0
  114. package/admin/src/hooks/use-mobile.ts +19 -0
  115. package/admin/src/hooks/useBreadcrumbLabel.ts +15 -0
  116. package/admin/src/hooks/usePermissions.ts +211 -0
  117. package/admin/src/lib/admin-config.ts +111 -0
  118. package/admin/src/lib/cn.ts +6 -0
  119. package/admin/src/lib/config.server.ts +56 -0
  120. package/admin/src/lib/convex.ts +26 -0
  121. package/admin/src/lib/embed-adapter.ts +80 -0
  122. package/admin/src/lib/icons.tsx +96 -0
  123. package/admin/src/lib/loadAdminConfig.ts +92 -0
  124. package/admin/src/lib/motion.ts +29 -0
  125. package/admin/src/lib/navigation.ts +43 -0
  126. package/admin/src/lib/tanstack-adapter.ts +82 -0
  127. package/admin/src/pages/ContentPage.tsx +337 -0
  128. package/admin/src/pages/ContentTypesPage.tsx +457 -0
  129. package/admin/src/pages/DashboardPage.tsx +163 -0
  130. package/admin/src/pages/MediaPage.tsx +34 -0
  131. package/admin/src/pages/SettingsPage.tsx +486 -0
  132. package/admin/src/pages/TaxonomiesPage.tsx +289 -0
  133. package/admin/src/pages/TrashPage.tsx +421 -0
  134. package/admin/src/pages/index.ts +14 -0
  135. package/admin/src/routeTree.gen.ts +262 -0
  136. package/admin/src/router.tsx +22 -0
  137. package/admin/src/routes/__root.tsx +250 -0
  138. package/admin/src/routes/content-types.tsx +20 -0
  139. package/admin/src/routes/content.tsx +20 -0
  140. package/admin/src/routes/entries/$entryId.tsx +107 -0
  141. package/admin/src/routes/entries/new.$contentTypeId.tsx +69 -0
  142. package/admin/src/routes/entries/type/$contentTypeId.tsx +503 -0
  143. package/admin/src/routes/index.tsx +20 -0
  144. package/admin/src/routes/media.tsx +1095 -0
  145. package/admin/src/routes/settings.tsx +20 -0
  146. package/admin/src/routes/taxonomies.tsx +20 -0
  147. package/admin/src/routes/trash.tsx +20 -0
  148. package/admin/src/styles/globals.css +69 -0
  149. package/admin/src/styles/tailwind-config.css +74 -0
  150. package/admin/src/styles/theme.css +73 -0
  151. package/admin/src/types/index.ts +221 -0
  152. package/admin/src/utils/errorParsing.ts +163 -0
  153. package/admin/src/utils/index.ts +5 -0
  154. package/admin/src/vite-env.d.ts +14 -0
  155. package/admin/tailwind.preset.cjs +102 -0
  156. package/admin-dist/nitro.json +1 -1
  157. package/admin-dist/public/assets/{CmsEmptyState-CRswfTzk.js → CmsEmptyState-CkqBIab3.js} +2 -2
  158. package/admin-dist/public/assets/{CmsPageHeader-CirpXndm.js → CmsPageHeader-CUtl5MMG.js} +1 -1
  159. package/admin-dist/public/assets/{CmsStatusBadge-CbEUpQu-.js → CmsStatusBadge-CUYFgEe-.js} +1 -1
  160. package/admin-dist/public/assets/CmsSurface-CsJfAVa3.js +1 -0
  161. package/admin-dist/public/assets/{CmsToolbar-BI2nZOXp.js → CmsToolbar-CnfbcxeP.js} +1 -1
  162. package/admin-dist/public/assets/{ContentEntryEditor-CBeCyK_m.js → ContentEntryEditor-BU220CCy.js} +1 -1
  163. package/admin-dist/public/assets/TaxonomyFilter-CWCxC5HZ.js +1 -0
  164. package/admin-dist/public/assets/_contentTypeId-DK8cskRt.js +1 -0
  165. package/admin-dist/public/assets/{_entryId-CKU_glsK.js → _entryId-CuVMExbb.js} +1 -1
  166. package/admin-dist/public/assets/alert-CF1BSzGR.js +1 -0
  167. package/admin-dist/public/assets/{badge-hvUOzpVZ.js → badge-CmuOIVKp.js} +1 -1
  168. package/admin-dist/public/assets/{circle-check-big-CF_pR17r.js → circle-check-big-BKDVG6DU.js} +1 -1
  169. package/admin-dist/public/assets/{command-DU82cJlt.js → command-XJxnF2Sd.js} +1 -1
  170. package/admin-dist/public/assets/content-QBUxdxbS.js +1 -0
  171. package/admin-dist/public/assets/content-types-CrNEm8Hf.js +2 -0
  172. package/admin-dist/public/assets/globals-B7Wsfh_v.css +1 -0
  173. package/admin-dist/public/assets/index-C7xOwudI.js +1 -0
  174. package/admin-dist/public/assets/{label-KNtpL71g.js → label-CHCnXeBk.js} +1 -1
  175. package/admin-dist/public/assets/{link-2-Bw2aI4V4.js → link-2-Bb34judH.js} +1 -1
  176. package/admin-dist/public/assets/{list-sYepHjt_.js → list-9Pzt48ld.js} +1 -1
  177. package/admin-dist/public/assets/{main-CKj5yfEi.js → main-CjQ2VI9L.js} +3 -3
  178. package/admin-dist/public/assets/media-Dc5PWt2Q.js +1 -0
  179. package/admin-dist/public/assets/{new._contentTypeId-C3LstjNs.js → new._contentTypeId-C_I4YxIa.js} +1 -1
  180. package/admin-dist/public/assets/{plus-DUn8v_Xf.js → plus-Ceef7DHk.js} +1 -1
  181. package/admin-dist/public/assets/{rotate-ccw-DJEoHcRI.js → rotate-ccw-7k7-4VUq.js} +1 -1
  182. package/admin-dist/public/assets/scroll-area-CC6wujnp.js +1 -0
  183. package/admin-dist/public/assets/{search-MuAUDJKR.js → search-DwoUV2pv.js} +1 -1
  184. package/admin-dist/public/assets/select-hOZTp8aC.js +1 -0
  185. package/admin-dist/public/assets/settings-t2PbCZh4.js +1 -0
  186. package/admin-dist/public/assets/switch-jX2pDaNU.js +1 -0
  187. package/admin-dist/public/assets/tabs-q4EbZk7c.js +1 -0
  188. package/admin-dist/public/assets/tanstack-adapter-B-Glm4kH.js +1 -0
  189. package/admin-dist/public/assets/taxonomies-kyk5P4ZW.js +1 -0
  190. package/admin-dist/public/assets/{textarea-BTy7nwzR.js → textarea-B6SfBmr0.js} +1 -1
  191. package/admin-dist/public/assets/trash-BOCnIznD.js +1 -0
  192. package/admin-dist/public/assets/{triangle-alert-E52Vfeuh.js → triangle-alert-CXFIO_Gu.js} +1 -1
  193. package/admin-dist/public/assets/useBreadcrumbLabel-_6qBagc3.js +1 -0
  194. package/admin-dist/public/assets/{usePermissions-Basjs9BT.js → usePermissions-M1ijZ7a6.js} +1 -1
  195. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +7 -0
  196. package/admin-dist/server/_ssr/{badge-6BsP37vG.mjs → CmsButton-DOiTVKQq.mjs} +33 -33
  197. package/admin-dist/server/_ssr/{CmsEmptyState-DU7-7-mV.mjs → CmsEmptyState-fbnGt3LD.mjs} +2 -2
  198. package/admin-dist/server/_ssr/{CmsPageHeader-CseW0AHm.mjs → CmsPageHeader-DHRrdOZa.mjs} +1 -1
  199. package/admin-dist/server/_ssr/{CmsStatusBadge-B_pi4KCp.mjs → CmsStatusBadge-s7obWbKZ.mjs} +2 -2
  200. package/admin-dist/server/_ssr/CmsSurface-rFoYjb62.mjs +44 -0
  201. package/admin-dist/server/_ssr/{CmsToolbar-X75ex6ek.mjs → CmsToolbar-zTE45z2q.mjs} +2 -2
  202. package/admin-dist/server/_ssr/{ContentEntryEditor-CepusRsA.mjs → ContentEntryEditor-BLoEjT_m.mjs} +12 -12
  203. package/admin-dist/server/_ssr/{TaxonomyFilter-Bwrq0-cz.mjs → TaxonomyFilter-XAtaJC2z.mjs} +5 -5
  204. package/admin-dist/server/_ssr/{_contentTypeId-BqYKEcLr.mjs → _contentTypeId-Csl4822C.mjs} +13 -13
  205. package/admin-dist/server/_ssr/{_entryId-CRfnqeDf.mjs → _entryId-D8alLFBx.mjs} +15 -15
  206. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BffZedId.mjs +4 -0
  207. package/admin-dist/server/_ssr/{command-fy8epIKf.mjs → command-C0Di14--.mjs} +1 -1
  208. package/admin-dist/server/_ssr/{content-B5RhL7uW.mjs → content-CT-FPsmV.mjs} +170 -98
  209. package/admin-dist/server/_ssr/{content-types-BIOqCQYN.mjs → content-types-C8cBFdzE.mjs} +260 -115
  210. package/admin-dist/server/_ssr/{index-DHSHDPt1.mjs → index-BJtcrEc-.mjs} +88 -17
  211. package/admin-dist/server/_ssr/index.mjs +2 -2
  212. package/admin-dist/server/_ssr/{label-C8Dko1j7.mjs → label-qn2Afwl4.mjs} +1 -1
  213. package/admin-dist/server/_ssr/{media-CSx3XttC.mjs → media-qv5IAsMZ.mjs} +43 -43
  214. package/admin-dist/server/_ssr/{new._contentTypeId-DzanEZQM.mjs → new._contentTypeId-DdGyrhqs.mjs} +13 -13
  215. package/admin-dist/server/_ssr/{router-DDWcF-kt.mjs → router-nSVkxb6Y.mjs} +11 -11
  216. package/admin-dist/server/_ssr/{scroll-area-bjPYwhXN.mjs → scroll-area-BCinP455.mjs} +1 -1
  217. package/admin-dist/server/_ssr/{select-BUhDDf4T.mjs → select-BKQlQScw.mjs} +1 -1
  218. package/admin-dist/server/_ssr/{settings-DAsxnw2q.mjs → settings-BCr2KQlk.mjs} +236 -139
  219. package/admin-dist/server/_ssr/{switch-BgyRtQ1Z.mjs → switch-BaOi42fE.mjs} +1 -1
  220. package/admin-dist/server/_ssr/{tabs-DzMdRB1A.mjs → tabs-DYXEi9kq.mjs} +5 -3
  221. package/admin-dist/server/_ssr/tanstack-adapter-Bsz8kha-.mjs +119 -0
  222. package/admin-dist/server/_ssr/{taxonomies-C8j8g5Q5.mjs → taxonomies-CueMHTbE.mjs} +184 -73
  223. package/admin-dist/server/_ssr/{textarea-9jNeYJSc.mjs → textarea-CI0Jqx2x.mjs} +1 -1
  224. package/admin-dist/server/_ssr/{trash-DYMxwhZB.mjs → trash-DE6W8GoX.mjs} +211 -88
  225. package/admin-dist/server/_ssr/{useBreadcrumbLabel-FNSAr2Ha.mjs → useBreadcrumbLabel-B5Yi72lM.mjs} +1 -1
  226. package/admin-dist/server/_ssr/{usePermissions-BJGGahrJ.mjs → usePermissions-C3nZ-Izm.mjs} +1 -1
  227. package/admin-dist/server/index.mjs +189 -182
  228. package/dist/cli/commands/init.d.ts +6 -0
  229. package/dist/cli/commands/init.d.ts.map +1 -0
  230. package/dist/cli/commands/init.js +156 -0
  231. package/dist/cli/commands/init.js.map +1 -0
  232. package/dist/cli/index.js +6 -0
  233. package/dist/cli/index.js.map +1 -1
  234. package/dist/client/admin/bulk.d.ts +79 -0
  235. package/dist/client/admin/bulk.d.ts.map +1 -0
  236. package/dist/client/admin/bulk.js +72 -0
  237. package/dist/client/admin/bulk.js.map +1 -0
  238. package/dist/client/admin/contentLock.d.ts +118 -0
  239. package/dist/client/admin/contentLock.d.ts.map +1 -0
  240. package/dist/client/admin/contentLock.js +81 -0
  241. package/dist/client/admin/contentLock.js.map +1 -0
  242. package/dist/client/admin/contentTypes.d.ts +1204 -0
  243. package/dist/client/admin/contentTypes.d.ts.map +1 -0
  244. package/dist/client/admin/contentTypes.js +122 -0
  245. package/dist/client/admin/contentTypes.js.map +1 -0
  246. package/dist/client/admin/dashboard.d.ts +16 -0
  247. package/dist/client/admin/dashboard.d.ts.map +1 -0
  248. package/dist/client/admin/dashboard.js +33 -0
  249. package/dist/client/admin/dashboard.js.map +1 -0
  250. package/dist/client/admin/entries.d.ts +358 -0
  251. package/dist/client/admin/entries.d.ts.map +1 -0
  252. package/dist/client/admin/entries.js +220 -0
  253. package/dist/client/admin/entries.js.map +1 -0
  254. package/dist/client/admin/index.d.ts +6568 -0
  255. package/dist/client/admin/index.d.ts.map +1 -0
  256. package/dist/client/admin/index.js +305 -0
  257. package/dist/client/admin/index.js.map +1 -0
  258. package/dist/client/admin/media.d.ts +1038 -0
  259. package/dist/client/admin/media.d.ts.map +1 -0
  260. package/dist/client/admin/media.js +489 -0
  261. package/dist/client/admin/media.js.map +1 -0
  262. package/dist/client/admin/taxonomies.d.ts +339 -0
  263. package/dist/client/admin/taxonomies.d.ts.map +1 -0
  264. package/dist/client/admin/taxonomies.js +364 -0
  265. package/dist/client/admin/taxonomies.js.map +1 -0
  266. package/dist/client/admin/trash.d.ts +91 -0
  267. package/dist/client/admin/trash.d.ts.map +1 -0
  268. package/dist/client/admin/trash.js +71 -0
  269. package/dist/client/admin/trash.js.map +1 -0
  270. package/dist/client/admin/types.d.ts +320 -0
  271. package/dist/client/admin/types.d.ts.map +1 -0
  272. package/dist/client/admin/types.js +7 -0
  273. package/dist/client/admin/types.js.map +1 -0
  274. package/dist/client/admin/validators.d.ts +3886 -0
  275. package/dist/client/admin/validators.d.ts.map +1 -0
  276. package/dist/client/admin/validators.js +322 -0
  277. package/dist/client/admin/validators.js.map +1 -0
  278. package/dist/client/admin/versions.d.ts +106 -0
  279. package/dist/client/admin/versions.d.ts.map +1 -0
  280. package/dist/client/admin/versions.js +57 -0
  281. package/dist/client/admin/versions.js.map +1 -0
  282. package/dist/client/adminApiTypes.d.ts +27 -0
  283. package/dist/client/adminApiTypes.d.ts.map +1 -0
  284. package/dist/client/adminApiTypes.js +12 -0
  285. package/dist/client/adminApiTypes.js.map +1 -0
  286. package/dist/client/{admin-config.d.ts → adminConfig.d.ts} +4 -4
  287. package/dist/client/adminConfig.d.ts.map +1 -0
  288. package/dist/client/{admin-config.js → adminConfig.js} +3 -3
  289. package/dist/client/adminConfig.js.map +1 -0
  290. package/dist/client/agentTools.d.ts +11 -21
  291. package/dist/client/agentTools.d.ts.map +1 -1
  292. package/dist/client/agentTools.js +4 -4
  293. package/dist/client/index.d.ts +6 -6
  294. package/dist/client/index.d.ts.map +1 -1
  295. package/dist/client/index.js +19 -6
  296. package/dist/client/index.js.map +1 -1
  297. package/dist/client/schema/codegen.d.ts +2 -2
  298. package/dist/client/schema/codegen.d.ts.map +1 -1
  299. package/dist/client/schema/codegen.js +3 -3
  300. package/dist/client/schema/codegen.js.map +1 -1
  301. package/dist/client/schema/defineContentType.d.ts +3 -3
  302. package/dist/client/schema/defineContentType.js +3 -3
  303. package/dist/client/schema/index.d.ts +7 -7
  304. package/dist/client/schema/index.d.ts.map +1 -1
  305. package/dist/client/schema/index.js +5 -5
  306. package/dist/client/schema/index.js.map +1 -1
  307. package/dist/client/schema/schemaDrift.d.ts +1 -1
  308. package/dist/client/schema/schemaDrift.js +1 -1
  309. package/dist/client/schema/typedClient.d.ts +2 -2
  310. package/dist/client/schema/typedClient.js +2 -2
  311. package/dist/client/schema/types.d.ts +1 -1
  312. package/dist/client/schema/types.js +1 -1
  313. package/dist/client/wrapper.d.ts +108 -65
  314. package/dist/client/wrapper.d.ts.map +1 -1
  315. package/dist/client/wrapper.js +22 -22
  316. package/dist/client/wrapper.js.map +1 -1
  317. package/dist/component/contentEntries.d.ts +4 -4
  318. package/dist/component/contentEntryMutations.d.ts +46 -0
  319. package/dist/component/contentEntryMutations.d.ts.map +1 -1
  320. package/dist/component/contentEntryMutations.js +1 -1
  321. package/dist/component/contentEntryMutations.js.map +1 -1
  322. package/dist/component/contentTypeMigration.d.ts +1 -1
  323. package/dist/component/contentTypeMutations.d.ts +22 -0
  324. package/dist/component/contentTypeMutations.d.ts.map +1 -1
  325. package/dist/component/contentTypeMutations.js +1 -1
  326. package/dist/component/contentTypeMutations.js.map +1 -1
  327. package/dist/component/convex.config.d.ts +2 -2
  328. package/dist/component/convex.config.js +2 -2
  329. package/dist/component/index.d.ts +1 -1
  330. package/dist/component/index.js +1 -1
  331. package/dist/component/lib/ragContentChunker.d.ts +1 -1
  332. package/dist/component/lib/ragContentChunker.js +1 -1
  333. package/dist/component/mediaAssetMutations.d.ts +47 -0
  334. package/dist/component/mediaAssetMutations.d.ts.map +1 -1
  335. package/dist/component/mediaAssetMutations.js +1 -1
  336. package/dist/component/mediaAssetMutations.js.map +1 -1
  337. package/dist/component/roles.d.ts +1 -1
  338. package/dist/component/roles.js +1 -1
  339. package/dist/component/schema.d.ts +9 -0
  340. package/dist/component/schema.d.ts.map +1 -1
  341. package/dist/component/schema.js +1 -1
  342. package/dist/component/schema.js.map +1 -1
  343. package/dist/react/index.d.ts +2 -2
  344. package/dist/react/index.d.ts.map +1 -1
  345. package/dist/react/index.js +13 -7
  346. package/dist/react/index.js.map +1 -1
  347. package/dist/test.d.ts +2 -2
  348. package/dist/test.js +2 -2
  349. package/package.json +115 -13
  350. package/admin-dist/public/assets/ErrorState-BIVaWmom.js +0 -1
  351. package/admin-dist/public/assets/TaxonomyFilter-ChaY6Y_x.js +0 -1
  352. package/admin-dist/public/assets/_contentTypeId-DQ8k_Rvw.js +0 -1
  353. package/admin-dist/public/assets/alert-BXjTqrwQ.js +0 -1
  354. package/admin-dist/public/assets/content-_LXl3pp7.js +0 -1
  355. package/admin-dist/public/assets/content-types-KjxaXGxY.js +0 -2
  356. package/admin-dist/public/assets/globals-CS6BZ0zp.css +0 -1
  357. package/admin-dist/public/assets/index-DNGIZHL-.js +0 -1
  358. package/admin-dist/public/assets/media-Bkrkffm7.js +0 -1
  359. package/admin-dist/public/assets/scroll-area-DfIlT0in.js +0 -1
  360. package/admin-dist/public/assets/select-BD29IXCI.js +0 -1
  361. package/admin-dist/public/assets/settings-DmMyn_6A.js +0 -1
  362. package/admin-dist/public/assets/switch-h3Rrnl5i.js +0 -1
  363. package/admin-dist/public/assets/tabs-imc8h-Dp.js +0 -1
  364. package/admin-dist/public/assets/taxonomies-dAsrT65H.js +0 -1
  365. package/admin-dist/public/assets/trash-SAWKZZHv.js +0 -1
  366. package/admin-dist/public/assets/useBreadcrumbLabel-BECBMCzM.js +0 -1
  367. package/admin-dist/server/_ssr/ErrorState-cI-bKLez.mjs +0 -89
  368. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BwDlABVk.mjs +0 -4
  369. package/admin-dist/server/_ssr/alert-CVt45UUP.mjs +0 -92
  370. package/dist/client/admin-config.d.ts.map +0 -1
  371. package/dist/client/admin-config.js.map +0 -1
  372. package/dist/client/adminApi.d.ts +0 -2273
  373. package/dist/client/adminApi.d.ts.map +0 -1
  374. package/dist/client/adminApi.js +0 -716
  375. package/dist/client/adminApi.js.map +0 -1
@@ -1,716 +0,0 @@
1
- /**
2
- * Admin API Helper for Convex CMS
3
- *
4
- * This module provides the `defineAdminAPI` function that creates typed
5
- * Convex functions for the admin UI to call. Users export these functions
6
- * from their `convex/` directory, which the admin UI then calls.
7
- *
8
- * This follows the standard Convex component pattern used by:
9
- * - @convex-dev/agent's `definePlaygroundAPI`
10
- * - template-component's `exposeApi`
11
- * - @dodopayments/convex's class-based API
12
- *
13
- * @example
14
- * ```typescript
15
- * // convex/admin.ts
16
- * import { defineAdminAPI } from "@convex-cms/core";
17
- * import { components } from "./_generated/api";
18
- *
19
- * export const {
20
- * contentTypes,
21
- * entries,
22
- * media,
23
- * stats,
24
- * } = defineAdminAPI(components.convexCms, {
25
- * auth: async (ctx, operation) => {
26
- * // Optional: validate user has admin access
27
- * const identity = await ctx.auth.getUserIdentity();
28
- * if (!identity) throw new Error("Unauthorized");
29
- * return identity.subject;
30
- * },
31
- * });
32
- * ```
33
- */
34
- import { queryGeneric, mutationGeneric, } from "convex/server";
35
- import { v } from "convex/values";
36
- import { fieldDefinitionValidator, contentStatusValidator, mediaTypeValidator, } from "../component/schema.js";
37
- // =============================================================================
38
- // Validators (reused across functions)
39
- // =============================================================================
40
- const paginationOptsValidator = v.object({
41
- numItems: v.number(),
42
- cursor: v.union(v.string(), v.null()),
43
- });
44
- // =============================================================================
45
- // defineAdminAPI
46
- // =============================================================================
47
- /**
48
- * Creates typed Convex functions for the CMS admin UI.
49
- *
50
- * This function returns an object containing query and mutation functions
51
- * that the admin UI calls. Users export these from their `convex/` directory.
52
- *
53
- * @param component - The CMS component API from `components.convexCms`
54
- * @param options - Optional configuration including auth callback
55
- * @returns Object with namespaced admin functions
56
- *
57
- * @example
58
- * ```typescript
59
- * // convex/admin.ts
60
- * import { defineAdminAPI } from "@convex-cms/core";
61
- * import { components } from "./_generated/api";
62
- *
63
- * export const { contentTypes, entries, media, stats } = defineAdminAPI(
64
- * components.convexCms
65
- * );
66
- * ```
67
- */
68
- export function defineAdminAPI(component, options = {}) {
69
- const { auth } = options;
70
- // Helper to run auth check if configured
71
- const checkAuth = async (ctx, operation) => {
72
- if (auth) {
73
- return await auth(ctx, operation);
74
- }
75
- return null;
76
- };
77
- return {
78
- // =========================================================================
79
- // Content Types
80
- // =========================================================================
81
- contentTypes: {
82
- list: queryGeneric({
83
- args: {
84
- isActive: v.optional(v.boolean()),
85
- },
86
- returns: v.any(),
87
- handler: async (ctx, args) => {
88
- await checkAuth(ctx, { type: "contentTypes.list" });
89
- // Returns paginated result: { page, continueCursor, isDone }
90
- return await ctx.runQuery(component.contentTypes.list, {
91
- isActive: args.isActive,
92
- });
93
- },
94
- }),
95
- get: queryGeneric({
96
- args: {
97
- id: v.optional(v.string()),
98
- name: v.optional(v.string()),
99
- },
100
- returns: v.union(v.any(), v.null()),
101
- handler: async (ctx, args) => {
102
- await checkAuth(ctx, { type: "contentTypes.get", id: args.id ?? "" });
103
- return await ctx.runQuery(component.contentTypes.get, {
104
- id: args.id,
105
- name: args.name,
106
- });
107
- },
108
- }),
109
- create: mutationGeneric({
110
- args: {
111
- name: v.string(),
112
- displayName: v.string(),
113
- fields: v.array(fieldDefinitionValidator),
114
- description: v.optional(v.string()),
115
- icon: v.optional(v.string()),
116
- singleton: v.optional(v.boolean()),
117
- slugField: v.optional(v.string()),
118
- titleField: v.optional(v.string()),
119
- sortOrder: v.optional(v.number()),
120
- /** Required for audit tracking - the user ID creating this content type */
121
- createdBy: v.string(),
122
- },
123
- returns: v.any(),
124
- handler: async (ctx, args) => {
125
- await checkAuth(ctx, { type: "contentTypes.create" });
126
- return await ctx.runMutation(component.contentTypeMutations.createContentType, {
127
- name: args.name,
128
- displayName: args.displayName,
129
- fields: args.fields,
130
- description: args.description,
131
- icon: args.icon,
132
- singleton: args.singleton,
133
- slugField: args.slugField,
134
- titleField: args.titleField,
135
- sortOrder: args.sortOrder,
136
- createdBy: args.createdBy,
137
- });
138
- },
139
- }),
140
- update: mutationGeneric({
141
- args: {
142
- id: v.string(),
143
- displayName: v.optional(v.string()),
144
- fields: v.optional(v.array(fieldDefinitionValidator)),
145
- description: v.optional(v.string()),
146
- icon: v.optional(v.string()),
147
- singleton: v.optional(v.boolean()),
148
- slugField: v.optional(v.string()),
149
- titleField: v.optional(v.string()),
150
- sortOrder: v.optional(v.number()),
151
- isActive: v.optional(v.boolean()),
152
- updatedBy: v.optional(v.string()),
153
- },
154
- returns: v.any(),
155
- handler: async (ctx, args) => {
156
- await checkAuth(ctx, { type: "contentTypes.update", id: args.id });
157
- return await ctx.runMutation(component.contentTypeMutations.updateContentType, {
158
- id: args.id,
159
- displayName: args.displayName,
160
- fields: args.fields,
161
- description: args.description,
162
- icon: args.icon,
163
- singleton: args.singleton,
164
- slugField: args.slugField,
165
- titleField: args.titleField,
166
- sortOrder: args.sortOrder,
167
- isActive: args.isActive,
168
- updatedBy: args.updatedBy,
169
- });
170
- },
171
- }),
172
- delete: mutationGeneric({
173
- args: {
174
- id: v.string(),
175
- cascade: v.optional(v.boolean()),
176
- hardDelete: v.optional(v.boolean()),
177
- deletedBy: v.optional(v.string()),
178
- },
179
- returns: v.any(),
180
- handler: async (ctx, args) => {
181
- await checkAuth(ctx, { type: "contentTypes.delete", id: args.id });
182
- return await ctx.runMutation(component.contentTypeMutations.deleteContentType, {
183
- id: args.id,
184
- cascade: args.cascade,
185
- hardDelete: args.hardDelete,
186
- deletedBy: args.deletedBy,
187
- });
188
- },
189
- }),
190
- },
191
- // =========================================================================
192
- // Content Entries
193
- // =========================================================================
194
- entries: {
195
- list: queryGeneric({
196
- args: {
197
- contentTypeId: v.optional(v.string()),
198
- status: v.optional(contentStatusValidator),
199
- search: v.optional(v.string()),
200
- locale: v.optional(v.string()),
201
- paginationOpts: paginationOptsValidator,
202
- },
203
- returns: v.any(),
204
- handler: async (ctx, args) => {
205
- await checkAuth(ctx, {
206
- type: "entries.list",
207
- contentTypeId: args.contentTypeId ?? "",
208
- });
209
- return await ctx.runQuery(component.contentEntries.list, {
210
- contentTypeId: args.contentTypeId,
211
- status: args.status,
212
- search: args.search,
213
- locale: args.locale,
214
- paginationOpts: args.paginationOpts,
215
- });
216
- },
217
- }),
218
- get: queryGeneric({
219
- args: {
220
- id: v.string(),
221
- },
222
- returns: v.union(v.any(), v.null()),
223
- handler: async (ctx, args) => {
224
- await checkAuth(ctx, { type: "entries.get", id: args.id });
225
- return await ctx.runQuery(component.contentEntries.get, {
226
- id: args.id,
227
- });
228
- },
229
- }),
230
- create: mutationGeneric({
231
- args: {
232
- contentTypeId: v.string(),
233
- data: v.any(),
234
- slug: v.optional(v.string()),
235
- status: v.optional(contentStatusValidator),
236
- locale: v.optional(v.string()),
237
- primaryEntryId: v.optional(v.string()),
238
- createdBy: v.optional(v.string()),
239
- },
240
- returns: v.any(),
241
- handler: async (ctx, args) => {
242
- await checkAuth(ctx, {
243
- type: "entries.create",
244
- contentTypeId: args.contentTypeId,
245
- });
246
- return await ctx.runMutation(component.contentEntryMutations.createEntry, {
247
- contentTypeId: args.contentTypeId,
248
- data: args.data,
249
- slug: args.slug,
250
- status: args.status,
251
- locale: args.locale,
252
- primaryEntryId: args.primaryEntryId,
253
- createdBy: args.createdBy,
254
- });
255
- },
256
- }),
257
- update: mutationGeneric({
258
- args: {
259
- id: v.string(),
260
- data: v.optional(v.any()),
261
- slug: v.optional(v.string()),
262
- status: v.optional(contentStatusValidator),
263
- scheduledPublishAt: v.optional(v.number()),
264
- updatedBy: v.optional(v.string()),
265
- regenerateSlug: v.optional(v.boolean()),
266
- },
267
- returns: v.any(),
268
- handler: async (ctx, args) => {
269
- await checkAuth(ctx, { type: "entries.update", id: args.id });
270
- return await ctx.runMutation(component.contentEntryMutations.updateEntry, {
271
- id: args.id,
272
- data: args.data,
273
- slug: args.slug,
274
- status: args.status,
275
- scheduledPublishAt: args.scheduledPublishAt,
276
- updatedBy: args.updatedBy,
277
- regenerateSlug: args.regenerateSlug,
278
- });
279
- },
280
- }),
281
- publish: mutationGeneric({
282
- args: {
283
- id: v.string(),
284
- changeDescription: v.optional(v.string()),
285
- updatedBy: v.optional(v.string()),
286
- },
287
- returns: v.any(),
288
- handler: async (ctx, args) => {
289
- await checkAuth(ctx, { type: "entries.publish", id: args.id });
290
- return await ctx.runMutation(component.contentEntryMutations.publishEntry, {
291
- id: args.id,
292
- changeDescription: args.changeDescription,
293
- updatedBy: args.updatedBy,
294
- });
295
- },
296
- }),
297
- unpublish: mutationGeneric({
298
- args: {
299
- id: v.string(),
300
- updatedBy: v.optional(v.string()),
301
- },
302
- returns: v.any(),
303
- handler: async (ctx, args) => {
304
- await checkAuth(ctx, { type: "entries.unpublish", id: args.id });
305
- return await ctx.runMutation(component.contentEntryMutations.unpublishEntry, {
306
- id: args.id,
307
- updatedBy: args.updatedBy,
308
- });
309
- },
310
- }),
311
- delete: mutationGeneric({
312
- args: {
313
- id: v.string(),
314
- hardDelete: v.optional(v.boolean()),
315
- deletedBy: v.optional(v.string()),
316
- },
317
- returns: v.any(),
318
- handler: async (ctx, args) => {
319
- await checkAuth(ctx, { type: "entries.delete", id: args.id });
320
- return await ctx.runMutation(component.contentEntryMutations.deleteEntry, {
321
- id: args.id,
322
- hardDelete: args.hardDelete,
323
- deletedBy: args.deletedBy,
324
- });
325
- },
326
- }),
327
- duplicate: mutationGeneric({
328
- args: {
329
- id: v.string(),
330
- copyMediaReferences: v.optional(v.boolean()),
331
- createdBy: v.optional(v.string()),
332
- },
333
- returns: v.any(),
334
- handler: async (ctx, args) => {
335
- await checkAuth(ctx, { type: "entries.duplicate", id: args.id });
336
- return await ctx.runMutation(component.contentEntryMutations.duplicateEntry, {
337
- sourceEntryId: args.id,
338
- copyMediaReferences: args.copyMediaReferences,
339
- createdBy: args.createdBy,
340
- });
341
- },
342
- }),
343
- schedule: mutationGeneric({
344
- args: {
345
- id: v.string(),
346
- publishAt: v.number(),
347
- updatedBy: v.optional(v.string()),
348
- },
349
- returns: v.any(),
350
- handler: async (ctx, args) => {
351
- await checkAuth(ctx, { type: "entries.schedule", id: args.id });
352
- return await ctx.runMutation(component.scheduledPublish.scheduleEntry, {
353
- id: args.id,
354
- publishAt: args.publishAt,
355
- updatedBy: args.updatedBy,
356
- });
357
- },
358
- }),
359
- cancelSchedule: mutationGeneric({
360
- args: {
361
- id: v.string(),
362
- updatedBy: v.optional(v.string()),
363
- },
364
- returns: v.any(),
365
- handler: async (ctx, args) => {
366
- await checkAuth(ctx, { type: "entries.cancelSchedule", id: args.id });
367
- return await ctx.runMutation(component.scheduledPublish.cancelScheduledPublish, {
368
- id: args.id,
369
- updatedBy: args.updatedBy,
370
- });
371
- },
372
- }),
373
- getScheduled: queryGeneric({
374
- args: {},
375
- returns: v.array(v.any()),
376
- handler: async (ctx) => {
377
- await checkAuth(ctx, { type: "entries.getScheduled" });
378
- return await ctx.runQuery(component.scheduledPublish.getScheduledEntries, {});
379
- },
380
- }),
381
- },
382
- // =========================================================================
383
- // Media (Assets and Folders)
384
- // =========================================================================
385
- media: {
386
- // --- Assets ---
387
- listAssets: queryGeneric({
388
- args: {
389
- folderId: v.optional(v.string()),
390
- type: v.optional(mediaTypeValidator),
391
- search: v.optional(v.string()),
392
- paginationOpts: paginationOptsValidator,
393
- },
394
- returns: v.any(),
395
- handler: async (ctx, args) => {
396
- await checkAuth(ctx, { type: "media.assets.list" });
397
- return await ctx.runQuery(component.mediaAssets.list, {
398
- folderId: args.folderId,
399
- type: args.type,
400
- search: args.search,
401
- paginationOpts: args.paginationOpts,
402
- });
403
- },
404
- }),
405
- getAsset: queryGeneric({
406
- args: {
407
- id: v.string(),
408
- },
409
- returns: v.union(v.any(), v.null()),
410
- handler: async (ctx, args) => {
411
- await checkAuth(ctx, { type: "media.assets.get", id: args.id });
412
- return await ctx.runQuery(component.mediaAssets.get, {
413
- id: args.id,
414
- });
415
- },
416
- }),
417
- createAsset: mutationGeneric({
418
- args: {
419
- storageId: v.string(),
420
- name: v.string(),
421
- mimeType: v.string(),
422
- size: v.number(),
423
- parentId: v.optional(v.string()),
424
- width: v.optional(v.number()),
425
- height: v.optional(v.number()),
426
- title: v.optional(v.string()),
427
- description: v.optional(v.string()),
428
- altText: v.optional(v.string()),
429
- createdBy: v.optional(v.string()),
430
- },
431
- returns: v.any(),
432
- handler: async (ctx, args) => {
433
- await checkAuth(ctx, { type: "media.assets.create" });
434
- return await ctx.runMutation(component.mediaAssetMutations.createMediaAsset, {
435
- storageId: args.storageId,
436
- name: args.name,
437
- mimeType: args.mimeType,
438
- size: args.size,
439
- parentId: args.parentId,
440
- width: args.width,
441
- height: args.height,
442
- title: args.title,
443
- description: args.description,
444
- altText: args.altText,
445
- createdBy: args.createdBy,
446
- });
447
- },
448
- }),
449
- updateAsset: mutationGeneric({
450
- args: {
451
- id: v.string(),
452
- name: v.optional(v.string()),
453
- title: v.optional(v.string()),
454
- description: v.optional(v.string()),
455
- altText: v.optional(v.string()),
456
- parentId: v.optional(v.string()),
457
- tags: v.optional(v.array(v.string())),
458
- },
459
- returns: v.any(),
460
- handler: async (ctx, args) => {
461
- await checkAuth(ctx, { type: "media.assets.update", id: args.id });
462
- return await ctx.runMutation(component.mediaAssetMutations.updateMediaAsset, {
463
- id: args.id,
464
- name: args.name,
465
- title: args.title,
466
- description: args.description,
467
- altText: args.altText,
468
- parentId: args.parentId,
469
- tags: args.tags,
470
- });
471
- },
472
- }),
473
- deleteAsset: mutationGeneric({
474
- args: {
475
- id: v.string(),
476
- hardDelete: v.optional(v.boolean()),
477
- deletedBy: v.optional(v.string()),
478
- },
479
- returns: v.any(),
480
- handler: async (ctx, args) => {
481
- await checkAuth(ctx, { type: "media.assets.delete", id: args.id });
482
- return await ctx.runMutation(component.mediaAssetMutations.deleteMediaAsset, {
483
- id: args.id,
484
- hardDelete: args.hardDelete,
485
- deletedBy: args.deletedBy,
486
- });
487
- },
488
- }),
489
- restoreAsset: mutationGeneric({
490
- args: {
491
- id: v.string(),
492
- },
493
- returns: v.any(),
494
- handler: async (ctx, args) => {
495
- await checkAuth(ctx, { type: "media.assets.restore", id: args.id });
496
- return await ctx.runMutation(component.mediaAssetMutations.restoreMediaAsset, {
497
- id: args.id,
498
- });
499
- },
500
- }),
501
- moveAssets: mutationGeneric({
502
- args: {
503
- assetIds: v.array(v.string()),
504
- targetFolderId: v.optional(v.string()),
505
- },
506
- returns: v.any(),
507
- handler: async (ctx, args) => {
508
- await checkAuth(ctx, { type: "media.assets.move" });
509
- return await ctx.runMutation(component.mediaAssetMutations.moveMediaAssets, {
510
- assetIds: args.assetIds,
511
- targetFolderId: args.targetFolderId,
512
- });
513
- },
514
- }),
515
- // --- Folders ---
516
- listFolders: queryGeneric({
517
- args: {
518
- parentId: v.optional(v.string()),
519
- },
520
- returns: v.array(v.any()),
521
- handler: async (ctx, args) => {
522
- await checkAuth(ctx, { type: "media.folders.list" });
523
- return await ctx.runQuery(component.mediaFolderMutations.listMediaFolders, {
524
- parentId: args.parentId,
525
- });
526
- },
527
- }),
528
- getFolder: queryGeneric({
529
- args: {
530
- id: v.string(),
531
- },
532
- returns: v.union(v.any(), v.null()),
533
- handler: async (ctx, args) => {
534
- await checkAuth(ctx, { type: "media.folders.get", id: args.id });
535
- return await ctx.runQuery(component.mediaFolderMutations.getMediaFolder, {
536
- id: args.id,
537
- });
538
- },
539
- }),
540
- getFolderTree: queryGeneric({
541
- args: {},
542
- returns: v.array(v.any()),
543
- handler: async (ctx) => {
544
- await checkAuth(ctx, { type: "media.folders.getTree" });
545
- return await ctx.runQuery(component.mediaFolderMutations.getFolderTree, {});
546
- },
547
- }),
548
- createFolder: mutationGeneric({
549
- args: {
550
- name: v.string(),
551
- parentId: v.optional(v.string()),
552
- description: v.optional(v.string()),
553
- createdBy: v.optional(v.string()),
554
- },
555
- returns: v.any(),
556
- handler: async (ctx, args) => {
557
- await checkAuth(ctx, { type: "media.folders.create" });
558
- return await ctx.runMutation(component.mediaFolderMutations.createMediaFolder, {
559
- name: args.name,
560
- parentId: args.parentId,
561
- description: args.description,
562
- createdBy: args.createdBy,
563
- });
564
- },
565
- }),
566
- updateFolder: mutationGeneric({
567
- args: {
568
- id: v.string(),
569
- name: v.optional(v.string()),
570
- description: v.optional(v.string()),
571
- sortOrder: v.optional(v.number()),
572
- },
573
- returns: v.any(),
574
- handler: async (ctx, args) => {
575
- await checkAuth(ctx, { type: "media.folders.update", id: args.id });
576
- return await ctx.runMutation(component.mediaFolderMutations.updateMediaFolder, {
577
- id: args.id,
578
- name: args.name,
579
- description: args.description,
580
- sortOrder: args.sortOrder,
581
- });
582
- },
583
- }),
584
- moveFolder: mutationGeneric({
585
- args: {
586
- id: v.string(),
587
- newParentId: v.optional(v.string()),
588
- },
589
- returns: v.any(),
590
- handler: async (ctx, args) => {
591
- await checkAuth(ctx, { type: "media.folders.move", id: args.id });
592
- return await ctx.runMutation(component.mediaFolderMutations.moveMediaFolder, {
593
- id: args.id,
594
- newParentId: args.newParentId,
595
- });
596
- },
597
- }),
598
- deleteFolder: mutationGeneric({
599
- args: {
600
- id: v.string(),
601
- recursive: v.optional(v.boolean()),
602
- hardDelete: v.optional(v.boolean()),
603
- deletedBy: v.optional(v.string()),
604
- },
605
- returns: v.any(),
606
- handler: async (ctx, args) => {
607
- await checkAuth(ctx, { type: "media.folders.delete", id: args.id });
608
- return await ctx.runMutation(component.mediaFolderMutations.deleteMediaFolder, {
609
- id: args.id,
610
- recursive: args.recursive,
611
- hardDelete: args.hardDelete,
612
- deletedBy: args.deletedBy,
613
- });
614
- },
615
- }),
616
- restoreFolder: mutationGeneric({
617
- args: {
618
- id: v.string(),
619
- recursive: v.optional(v.boolean()),
620
- },
621
- returns: v.any(),
622
- handler: async (ctx, args) => {
623
- await checkAuth(ctx, { type: "media.folders.restore", id: args.id });
624
- return await ctx.runMutation(component.mediaFolderMutations.restoreMediaFolder, {
625
- id: args.id,
626
- recursive: args.recursive,
627
- });
628
- },
629
- }),
630
- // --- Upload ---
631
- generateUploadUrl: mutationGeneric({
632
- args: {},
633
- returns: v.string(),
634
- handler: async (ctx) => {
635
- await checkAuth(ctx, { type: "media.generateUploadUrl" });
636
- return await ctx.storage.generateUploadUrl();
637
- },
638
- }),
639
- },
640
- // =========================================================================
641
- // Dashboard Stats
642
- // =========================================================================
643
- stats: {
644
- getDashboardStats: queryGeneric({
645
- args: {},
646
- returns: v.object({
647
- contentTypes: v.object({
648
- total: v.number(),
649
- active: v.number(),
650
- }),
651
- entries: v.object({
652
- total: v.number(),
653
- published: v.number(),
654
- draft: v.number(),
655
- scheduled: v.number(),
656
- }),
657
- media: v.object({
658
- total: v.number(),
659
- images: v.number(),
660
- videos: v.number(),
661
- documents: v.number(),
662
- }),
663
- }),
664
- handler: async (ctx) => {
665
- await checkAuth(ctx, { type: "stats.getDashboardStats" });
666
- // Fetch all content types (returns paginated result)
667
- const contentTypesResult = await ctx.runQuery(component.contentTypes.list, {});
668
- const contentTypes = contentTypesResult.page || [];
669
- // Fetch all entries (paginated, get counts)
670
- const entriesResult = await ctx.runQuery(component.contentEntries.list, {
671
- paginationOpts: { numItems: 1000, cursor: null },
672
- });
673
- // Fetch all media assets
674
- const mediaResult = await ctx.runQuery(component.mediaAssets.list, {
675
- paginationOpts: { numItems: 1000, cursor: null },
676
- });
677
- // Calculate content type stats
678
- const activeContentTypes = contentTypes.filter((ct) => ct.isActive).length;
679
- // Calculate entry stats
680
- const entries = entriesResult.page || [];
681
- const publishedEntries = entries.filter((e) => e.status === "published").length;
682
- const draftEntries = entries.filter((e) => e.status === "draft").length;
683
- const scheduledEntries = entries.filter((e) => e.status === "scheduled").length;
684
- // Calculate media stats by filtering on mimeType prefix
685
- const mediaAssets = (mediaResult.page || []);
686
- const assets = mediaAssets.filter((m) => m.kind === "asset");
687
- const images = assets.filter((m) => m.mimeType?.startsWith("image/")).length;
688
- const videos = assets.filter((m) => m.mimeType?.startsWith("video/")).length;
689
- const documents = assets.filter((m) => m.mimeType?.startsWith("application/pdf") ||
690
- m.mimeType?.includes("document") ||
691
- m.mimeType?.includes("sheet") ||
692
- m.mimeType?.includes("presentation")).length;
693
- return {
694
- contentTypes: {
695
- total: contentTypes.length,
696
- active: activeContentTypes,
697
- },
698
- entries: {
699
- total: entries.length,
700
- published: publishedEntries,
701
- draft: draftEntries,
702
- scheduled: scheduledEntries,
703
- },
704
- media: {
705
- total: mediaAssets.length,
706
- images,
707
- videos,
708
- documents,
709
- },
710
- };
711
- },
712
- }),
713
- },
714
- };
715
- }
716
- //# sourceMappingURL=adminApi.js.map