convex-cms 0.0.2 → 0.0.5-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/README.md +109 -13
  2. package/admin-dist/nitro.json +15 -0
  3. package/admin-dist/public/assets/CmsEmptyState-CiMQwSQV.js +5 -0
  4. package/admin-dist/public/assets/CmsPageHeader-ohOq0luT.js +1 -0
  5. package/admin-dist/public/assets/CmsStatusBadge-BdNf0V9v.js +1 -0
  6. package/admin-dist/public/assets/CmsSurface-CWup6Jh7.js +1 -0
  7. package/admin-dist/public/assets/CmsToolbar-cEBlCHa3.js +1 -0
  8. package/admin-dist/public/assets/ContentEntryEditor-BY5ypfUs.js +4 -0
  9. package/admin-dist/public/assets/ErrorState-C4nJ-ml4.js +1 -0
  10. package/admin-dist/public/assets/TaxonomyFilter-BgE_SR_O.js +1 -0
  11. package/admin-dist/public/assets/_contentTypeId-DtZectcC.js +1 -0
  12. package/admin-dist/public/assets/_entryId-BpSmrfAm.js +1 -0
  13. package/admin-dist/public/assets/alert-Bf2l8kxw.js +1 -0
  14. package/admin-dist/public/assets/badge-qPrc4AUM.js +1 -0
  15. package/admin-dist/public/assets/circle-check-big-Dgozy3vV.js +1 -0
  16. package/admin-dist/public/assets/command-QOmNhlb0.js +1 -0
  17. package/admin-dist/public/assets/content-OEBGlxg1.js +1 -0
  18. package/admin-dist/public/assets/content-types-CjQliqVV.js +2 -0
  19. package/admin-dist/public/assets/globals-hAmgC66w.css +1 -0
  20. package/admin-dist/public/assets/index-BH_ECMhv.js +1 -0
  21. package/admin-dist/public/assets/label-DCsUdvFh.js +1 -0
  22. package/admin-dist/public/assets/link-2-Czw1N61H.js +1 -0
  23. package/admin-dist/public/assets/list-DtCsXj8-.js +1 -0
  24. package/admin-dist/public/assets/main-CXgkZMhe.js +97 -0
  25. package/admin-dist/public/assets/media-DTJ3-ViE.js +1 -0
  26. package/admin-dist/public/assets/new._contentTypeId-CoTDxKzf.js +1 -0
  27. package/admin-dist/public/assets/plus-xCFJK0RC.js +1 -0
  28. package/admin-dist/public/assets/rotate-ccw-DIqK63wY.js +1 -0
  29. package/admin-dist/public/assets/scroll-area-B-yrE66a.js +1 -0
  30. package/admin-dist/public/assets/search-CbCbboeU.js +1 -0
  31. package/admin-dist/public/assets/select-Co3TZFJb.js +1 -0
  32. package/admin-dist/public/assets/settings-BspTTv_o.js +1 -0
  33. package/admin-dist/public/assets/switch-CfavASmR.js +1 -0
  34. package/admin-dist/public/assets/tabs-CN5s5u2W.js +1 -0
  35. package/admin-dist/public/assets/tanstack-adapter-npeE3RdY.js +1 -0
  36. package/admin-dist/public/assets/taxonomies-CgG46fIF.js +1 -0
  37. package/admin-dist/public/assets/textarea-BJ0XFZpT.js +1 -0
  38. package/admin-dist/public/assets/trash-B3daldm5.js +1 -0
  39. package/admin-dist/public/assets/triangle-alert-BZRcqsUg.js +1 -0
  40. package/admin-dist/public/assets/useBreadcrumbLabel-DwZlwvFF.js +1 -0
  41. package/admin-dist/public/assets/usePermissions-C1JQhfqb.js +1 -0
  42. package/admin-dist/public/favicon.ico +0 -0
  43. package/admin-dist/server/_chunks/_libs/@date-fns/tz.mjs +217 -0
  44. package/admin-dist/server/_chunks/_libs/@floating-ui/core.mjs +719 -0
  45. package/admin-dist/server/_chunks/_libs/@floating-ui/dom.mjs +622 -0
  46. package/admin-dist/server/_chunks/_libs/@floating-ui/react-dom.mjs +292 -0
  47. package/admin-dist/server/_chunks/_libs/@floating-ui/utils.mjs +320 -0
  48. package/admin-dist/server/_chunks/_libs/@radix-ui/number.mjs +6 -0
  49. package/admin-dist/server/_chunks/_libs/@radix-ui/primitive.mjs +11 -0
  50. package/admin-dist/server/_chunks/_libs/@radix-ui/react-arrow.mjs +23 -0
  51. package/admin-dist/server/_chunks/_libs/@radix-ui/react-avatar.mjs +119 -0
  52. package/admin-dist/server/_chunks/_libs/@radix-ui/react-checkbox.mjs +270 -0
  53. package/admin-dist/server/_chunks/_libs/@radix-ui/react-collection.mjs +69 -0
  54. package/admin-dist/server/_chunks/_libs/@radix-ui/react-compose-refs.mjs +39 -0
  55. package/admin-dist/server/_chunks/_libs/@radix-ui/react-context.mjs +137 -0
  56. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dialog.mjs +325 -0
  57. package/admin-dist/server/_chunks/_libs/@radix-ui/react-direction.mjs +9 -0
  58. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dismissable-layer.mjs +210 -0
  59. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dropdown-menu.mjs +253 -0
  60. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-guards.mjs +29 -0
  61. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-scope.mjs +206 -0
  62. package/admin-dist/server/_chunks/_libs/@radix-ui/react-id.mjs +14 -0
  63. package/admin-dist/server/_chunks/_libs/@radix-ui/react-label.mjs +23 -0
  64. package/admin-dist/server/_chunks/_libs/@radix-ui/react-menu.mjs +812 -0
  65. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popover.mjs +300 -0
  66. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popper.mjs +286 -0
  67. package/admin-dist/server/_chunks/_libs/@radix-ui/react-portal.mjs +16 -0
  68. package/admin-dist/server/_chunks/_libs/@radix-ui/react-presence.mjs +128 -0
  69. package/admin-dist/server/_chunks/_libs/@radix-ui/react-primitive.mjs +141 -0
  70. package/admin-dist/server/_chunks/_libs/@radix-ui/react-roving-focus.mjs +224 -0
  71. package/admin-dist/server/_chunks/_libs/@radix-ui/react-scroll-area.mjs +721 -0
  72. package/admin-dist/server/_chunks/_libs/@radix-ui/react-select.mjs +1163 -0
  73. package/admin-dist/server/_chunks/_libs/@radix-ui/react-separator.mjs +28 -0
  74. package/admin-dist/server/_chunks/_libs/@radix-ui/react-slot.mjs +601 -0
  75. package/admin-dist/server/_chunks/_libs/@radix-ui/react-switch.mjs +152 -0
  76. package/admin-dist/server/_chunks/_libs/@radix-ui/react-tabs.mjs +189 -0
  77. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-callback-ref.mjs +11 -0
  78. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-controllable-state.mjs +69 -0
  79. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-effect-event.mjs +1 -0
  80. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-escape-keydown.mjs +17 -0
  81. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-is-hydrated.mjs +15 -0
  82. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-layout-effect.mjs +6 -0
  83. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-previous.mjs +14 -0
  84. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-size.mjs +39 -0
  85. package/admin-dist/server/_chunks/_libs/@radix-ui/react-visually-hidden.mjs +33 -0
  86. package/admin-dist/server/_chunks/_libs/@tanstack/history.mjs +409 -0
  87. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +1718 -0
  88. package/admin-dist/server/_chunks/_libs/@tanstack/react-store.mjs +56 -0
  89. package/admin-dist/server/_chunks/_libs/@tanstack/router-core.mjs +4829 -0
  90. package/admin-dist/server/_chunks/_libs/@tanstack/store.mjs +134 -0
  91. package/admin-dist/server/_chunks/_libs/react-dom.mjs +10781 -0
  92. package/admin-dist/server/_chunks/_libs/react.mjs +513 -0
  93. package/admin-dist/server/_libs/aria-hidden.mjs +122 -0
  94. package/admin-dist/server/_libs/class-variance-authority.mjs +44 -0
  95. package/admin-dist/server/_libs/clsx.mjs +16 -0
  96. package/admin-dist/server/_libs/cmdk.mjs +315 -0
  97. package/admin-dist/server/_libs/convex.mjs +4841 -0
  98. package/admin-dist/server/_libs/cookie-es.mjs +58 -0
  99. package/admin-dist/server/_libs/croner.mjs +1 -0
  100. package/admin-dist/server/_libs/crossws.mjs +1 -0
  101. package/admin-dist/server/_libs/date-fns.mjs +1716 -0
  102. package/admin-dist/server/_libs/detect-node-es.mjs +1 -0
  103. package/admin-dist/server/_libs/get-nonce.mjs +9 -0
  104. package/admin-dist/server/_libs/h3-v2.mjs +277 -0
  105. package/admin-dist/server/_libs/h3.mjs +401 -0
  106. package/admin-dist/server/_libs/hookable.mjs +1 -0
  107. package/admin-dist/server/_libs/isbot.mjs +20 -0
  108. package/admin-dist/server/_libs/lucide-react.mjs +850 -0
  109. package/admin-dist/server/_libs/ohash.mjs +1 -0
  110. package/admin-dist/server/_libs/react-day-picker.mjs +2201 -0
  111. package/admin-dist/server/_libs/react-remove-scroll-bar.mjs +82 -0
  112. package/admin-dist/server/_libs/react-remove-scroll.mjs +328 -0
  113. package/admin-dist/server/_libs/react-style-singleton.mjs +69 -0
  114. package/admin-dist/server/_libs/rou3.mjs +8 -0
  115. package/admin-dist/server/_libs/seroval-plugins.mjs +58 -0
  116. package/admin-dist/server/_libs/seroval.mjs +1765 -0
  117. package/admin-dist/server/_libs/srvx.mjs +719 -0
  118. package/admin-dist/server/_libs/tailwind-merge.mjs +3010 -0
  119. package/admin-dist/server/_libs/tiny-invariant.mjs +12 -0
  120. package/admin-dist/server/_libs/tiny-warning.mjs +5 -0
  121. package/admin-dist/server/_libs/tslib.mjs +39 -0
  122. package/admin-dist/server/_libs/ufo.mjs +54 -0
  123. package/admin-dist/server/_libs/unctx.mjs +1 -0
  124. package/admin-dist/server/_libs/unstorage.mjs +1 -0
  125. package/admin-dist/server/_libs/use-callback-ref.mjs +66 -0
  126. package/admin-dist/server/_libs/use-sidecar.mjs +106 -0
  127. package/admin-dist/server/_libs/use-sync-external-store.mjs +139 -0
  128. package/admin-dist/server/_libs/zod.mjs +4223 -0
  129. package/admin-dist/server/_ssr/CmsButton-B45JAKR1.mjs +125 -0
  130. package/admin-dist/server/_ssr/CmsEmptyState-D_BQFAVR.mjs +290 -0
  131. package/admin-dist/server/_ssr/CmsPageHeader-CrUZA59A.mjs +24 -0
  132. package/admin-dist/server/_ssr/CmsStatusBadge-B-sj6yaj.mjs +127 -0
  133. package/admin-dist/server/_ssr/CmsSurface-DKJZhpjk.mjs +44 -0
  134. package/admin-dist/server/_ssr/CmsToolbar-ByaW5iXf.mjs +49 -0
  135. package/admin-dist/server/_ssr/ContentEntryEditor-D3_Jb1dq.mjs +3720 -0
  136. package/admin-dist/server/_ssr/ErrorState-cI-bKLez.mjs +89 -0
  137. package/admin-dist/server/_ssr/TaxonomyFilter-BRJkuCtA.mjs +188 -0
  138. package/admin-dist/server/_ssr/_contentTypeId-B9kA6CaM.mjs +379 -0
  139. package/admin-dist/server/_ssr/_entryId-BddcMkZN.mjs +161 -0
  140. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-Dd7AmelK.mjs +4 -0
  141. package/admin-dist/server/_ssr/command-CGtVr8Gb.mjs +128 -0
  142. package/admin-dist/server/_ssr/config.server-D7JHDcDv.mjs +117 -0
  143. package/admin-dist/server/_ssr/content-D1tbeOd0.mjs +647 -0
  144. package/admin-dist/server/_ssr/content-types-BZqY_BER.mjs +1342 -0
  145. package/admin-dist/server/_ssr/index-BIdq4xaC.mjs +264 -0
  146. package/admin-dist/server/_ssr/index.mjs +1275 -0
  147. package/admin-dist/server/_ssr/label-T-QNKAr6.mjs +22 -0
  148. package/admin-dist/server/_ssr/media-C-xqjBrl.mjs +1832 -0
  149. package/admin-dist/server/_ssr/new._contentTypeId-DWic9cRq.mjs +144 -0
  150. package/admin-dist/server/_ssr/router-D1BMAMJT.mjs +1556 -0
  151. package/admin-dist/server/_ssr/scroll-area-C0pic_WA.mjs +59 -0
  152. package/admin-dist/server/_ssr/select-CqmuN2F6.mjs +142 -0
  153. package/admin-dist/server/_ssr/settings-CAkncGGV.mjs +430 -0
  154. package/admin-dist/server/_ssr/start-HYkvq4Ni.mjs +4 -0
  155. package/admin-dist/server/_ssr/switch-CgmuJkT9.mjs +31 -0
  156. package/admin-dist/server/_ssr/tabs-CnMj0aRy.mjs +630 -0
  157. package/admin-dist/server/_ssr/tanstack-adapter-BXZrMauE.mjs +119 -0
  158. package/admin-dist/server/_ssr/taxonomies-thl3BfVm.mjs +1015 -0
  159. package/admin-dist/server/_ssr/textarea-4K5OJgeh.mjs +18 -0
  160. package/admin-dist/server/_ssr/trash-B40Gx5zP.mjs +411 -0
  161. package/admin-dist/server/_ssr/useBreadcrumbLabel-rn-fL4zV.mjs +16 -0
  162. package/admin-dist/server/_ssr/usePermissions-CKeM6_Vw.mjs +68 -0
  163. package/admin-dist/server/favicon.ico +0 -0
  164. package/admin-dist/server/index.mjs +641 -0
  165. package/dist/cli/commands/init.d.ts +6 -0
  166. package/dist/cli/commands/init.d.ts.map +1 -0
  167. package/dist/cli/commands/init.js +156 -0
  168. package/dist/cli/commands/init.js.map +1 -0
  169. package/dist/cli/index.js +6 -0
  170. package/dist/cli/index.js.map +1 -1
  171. package/dist/client/admin-config.d.ts +2 -3
  172. package/dist/client/admin-config.d.ts.map +1 -1
  173. package/dist/client/admin-config.js +2 -3
  174. package/dist/client/admin-config.js.map +1 -1
  175. package/dist/client/adminApi.d.ts +1877 -1851
  176. package/dist/client/adminApi.d.ts.map +1 -1
  177. package/dist/client/adminApi.js +649 -629
  178. package/dist/client/adminApi.js.map +1 -1
  179. package/dist/client/agentTools.d.ts +1231 -139
  180. package/dist/client/agentTools.d.ts.map +1 -1
  181. package/dist/client/agentTools.js +37 -13
  182. package/dist/client/agentTools.js.map +1 -1
  183. package/dist/client/index.d.ts +5 -5
  184. package/dist/client/index.d.ts.map +1 -1
  185. package/dist/client/index.js +4 -4
  186. package/dist/client/index.js.map +1 -1
  187. package/dist/client/schema/codegen.d.ts +2 -2
  188. package/dist/client/schema/codegen.d.ts.map +1 -1
  189. package/dist/client/schema/codegen.js +3 -3
  190. package/dist/client/schema/codegen.js.map +1 -1
  191. package/dist/client/schema/defineContentType.d.ts +3 -3
  192. package/dist/client/schema/defineContentType.js +3 -3
  193. package/dist/client/schema/index.d.ts +7 -7
  194. package/dist/client/schema/index.d.ts.map +1 -1
  195. package/dist/client/schema/index.js +5 -5
  196. package/dist/client/schema/index.js.map +1 -1
  197. package/dist/client/schema/schemaDrift.d.ts +1 -1
  198. package/dist/client/schema/schemaDrift.js +1 -1
  199. package/dist/client/schema/typedClient.d.ts +2 -2
  200. package/dist/client/schema/typedClient.js +2 -2
  201. package/dist/client/schema/types.d.ts +1 -1
  202. package/dist/client/schema/types.js +1 -1
  203. package/dist/client/wrapper.d.ts +108 -65
  204. package/dist/client/wrapper.d.ts.map +1 -1
  205. package/dist/client/wrapper.js +22 -22
  206. package/dist/client/wrapper.js.map +1 -1
  207. package/dist/component/_generated/component.d.ts +9 -0
  208. package/dist/component/_generated/component.d.ts.map +1 -1
  209. package/dist/component/convex.config.d.ts +2 -2
  210. package/dist/component/convex.config.js +2 -2
  211. package/dist/component/index.d.ts +1 -1
  212. package/dist/component/index.js +1 -1
  213. package/dist/component/lib/ragContentChunker.d.ts +1 -1
  214. package/dist/component/lib/ragContentChunker.js +1 -1
  215. package/dist/component/mediaAssets.d.ts +35 -0
  216. package/dist/component/mediaAssets.d.ts.map +1 -1
  217. package/dist/component/mediaAssets.js +81 -0
  218. package/dist/component/mediaAssets.js.map +1 -1
  219. package/dist/component/roles.d.ts +1 -1
  220. package/dist/component/roles.js +1 -1
  221. package/dist/react/index.d.ts +2 -2
  222. package/dist/react/index.d.ts.map +1 -1
  223. package/dist/react/index.js +13 -7
  224. package/dist/react/index.js.map +1 -1
  225. package/dist/test.d.ts +2 -2
  226. package/dist/test.d.ts.map +1 -1
  227. package/dist/test.js +4 -3
  228. package/dist/test.js.map +1 -1
  229. package/package.json +37 -13
  230. package/dist/component/auditLog.d.ts +0 -410
  231. package/dist/component/auditLog.d.ts.map +0 -1
  232. package/dist/component/auditLog.js +0 -607
  233. package/dist/component/auditLog.js.map +0 -1
  234. package/dist/component/types.d.ts +0 -4
  235. package/dist/component/types.d.ts.map +0 -1
  236. package/dist/component/types.js +0 -2
  237. package/dist/component/types.js.map +0 -1
  238. package/src/cli/commands/admin.ts +0 -104
  239. package/src/cli/index.ts +0 -21
  240. package/src/cli/utils/detectConvexUrl.ts +0 -54
  241. package/src/cli/utils/openBrowser.ts +0 -16
  242. package/src/client/admin-config.ts +0 -138
  243. package/src/client/adminApi.ts +0 -942
  244. package/src/client/agentTools.ts +0 -1311
  245. package/src/client/argTypes.ts +0 -316
  246. package/src/client/field-types.ts +0 -187
  247. package/src/client/index.ts +0 -1301
  248. package/src/client/queryBuilder.ts +0 -1100
  249. package/src/client/schema/codegen.ts +0 -500
  250. package/src/client/schema/defineContentType.ts +0 -501
  251. package/src/client/schema/index.ts +0 -169
  252. package/src/client/schema/schemaDrift.ts +0 -574
  253. package/src/client/schema/typedClient.ts +0 -688
  254. package/src/client/schema/types.ts +0 -666
  255. package/src/client/types.ts +0 -723
  256. package/src/client/workflows.ts +0 -141
  257. package/src/client/wrapper.ts +0 -4304
  258. package/src/component/_generated/api.ts +0 -140
  259. package/src/component/_generated/component.ts +0 -5029
  260. package/src/component/_generated/dataModel.ts +0 -60
  261. package/src/component/_generated/server.ts +0 -156
  262. package/src/component/authorization.ts +0 -647
  263. package/src/component/authorizationHooks.ts +0 -668
  264. package/src/component/bulkOperations.ts +0 -687
  265. package/src/component/contentEntries.ts +0 -1976
  266. package/src/component/contentEntryMutations.ts +0 -1223
  267. package/src/component/contentEntryValidation.ts +0 -707
  268. package/src/component/contentLock.ts +0 -550
  269. package/src/component/contentTypeMigration.ts +0 -1064
  270. package/src/component/contentTypeMutations.ts +0 -969
  271. package/src/component/contentTypes.ts +0 -346
  272. package/src/component/convex.config.ts +0 -44
  273. package/src/component/documentTypes.ts +0 -240
  274. package/src/component/eventEmitter.ts +0 -485
  275. package/src/component/exportImport.ts +0 -1169
  276. package/src/component/index.ts +0 -491
  277. package/src/component/lib/deepReferenceResolver.ts +0 -999
  278. package/src/component/lib/errors.ts +0 -816
  279. package/src/component/lib/index.ts +0 -145
  280. package/src/component/lib/mediaReferenceResolver.ts +0 -495
  281. package/src/component/lib/metadataExtractor.ts +0 -792
  282. package/src/component/lib/mutationAuth.ts +0 -199
  283. package/src/component/lib/queries.ts +0 -79
  284. package/src/component/lib/ragContentChunker.ts +0 -1371
  285. package/src/component/lib/referenceResolver.ts +0 -430
  286. package/src/component/lib/slugGenerator.ts +0 -262
  287. package/src/component/lib/slugUniqueness.ts +0 -333
  288. package/src/component/lib/softDelete.ts +0 -44
  289. package/src/component/localeFallbackChain.ts +0 -673
  290. package/src/component/localeFields.ts +0 -896
  291. package/src/component/mediaAssetMutations.ts +0 -725
  292. package/src/component/mediaAssets.ts +0 -932
  293. package/src/component/mediaFolderMutations.ts +0 -1046
  294. package/src/component/mediaUploadMutations.ts +0 -224
  295. package/src/component/mediaVariantMutations.ts +0 -900
  296. package/src/component/mediaVariants.ts +0 -793
  297. package/src/component/ragContentIndexer.ts +0 -1067
  298. package/src/component/rateLimitHooks.ts +0 -572
  299. package/src/component/roles.ts +0 -1360
  300. package/src/component/scheduledPublish.ts +0 -358
  301. package/src/component/schema.ts +0 -617
  302. package/src/component/taxonomies.ts +0 -949
  303. package/src/component/taxonomyMutations.ts +0 -1210
  304. package/src/component/trash.ts +0 -724
  305. package/src/component/userContext.ts +0 -898
  306. package/src/component/validation.ts +0 -1388
  307. package/src/component/validators.ts +0 -949
  308. package/src/component/versionMutations.ts +0 -392
  309. package/src/component/webhookTrigger.ts +0 -1922
  310. package/src/react/index.ts +0 -898
  311. package/src/test.ts +0 -1580
@@ -1,500 +0,0 @@
1
- /**
2
- * Type Code Generation
3
- *
4
- * Generates TypeScript types from content types stored in the database.
5
- * This allows type safety for content types created via admin UI.
6
- *
7
- * @example
8
- * ```typescript
9
- * // In a build script or CLI tool
10
- * import { generateTypesFromDatabase } from "@convex-cms/core";
11
- *
12
- * const output = await generateTypesFromDatabase(ctx, cms);
13
- * await fs.writeFile("./src/generated/cms-types.ts", output);
14
- * ```
15
- *
16
- * @example CLI Usage
17
- * ```bash
18
- * npx convex-cms codegen --output ./src/generated/cms-types.ts
19
- * ```
20
- */
21
-
22
- import type { ConvexContext } from "../wrapper.js";
23
- import type { CmsClient } from "../wrapper.js";
24
- import type { ContentType, FieldDefinition } from "../types.js";
25
-
26
- // =============================================================================
27
- // Types
28
- // =============================================================================
29
-
30
- /**
31
- * Options for code generation.
32
- */
33
- export interface CodegenOptions {
34
- /**
35
- * Header comment to include at the top of the generated file.
36
- * @default "Auto-generated by @convex-cms/core codegen"
37
- */
38
- header?: string;
39
-
40
- /**
41
- * Whether to include JSDoc comments for fields.
42
- * @default true
43
- */
44
- includeJsDoc?: boolean;
45
-
46
- /**
47
- * Content type names to include. If not provided, includes all.
48
- */
49
- contentTypes?: string[];
50
-
51
- /**
52
- * Content type names to exclude.
53
- */
54
- exclude?: string[];
55
-
56
- /**
57
- * Whether to generate a union type of all content type names.
58
- * @default true
59
- */
60
- includeNameUnion?: boolean;
61
-
62
- /**
63
- * Whether to generate a discriminated union type.
64
- * @default false
65
- */
66
- includeDiscriminatedUnion?: boolean;
67
-
68
- /**
69
- * Custom type name suffix for generated types.
70
- * @default "Data"
71
- */
72
- typeSuffix?: string;
73
-
74
- /**
75
- * Whether to mark all fields as optional (for partial updates).
76
- * @default false
77
- */
78
- allOptional?: boolean;
79
- }
80
-
81
- /**
82
- * Result of code generation.
83
- */
84
- export interface CodegenResult {
85
- /**
86
- * The generated TypeScript code.
87
- */
88
- code: string;
89
-
90
- /**
91
- * Content types that were included.
92
- */
93
- includedTypes: string[];
94
-
95
- /**
96
- * Content types that were excluded.
97
- */
98
- excludedTypes: string[];
99
-
100
- /**
101
- * Timestamp of generation.
102
- */
103
- generatedAt: number;
104
- }
105
-
106
- // =============================================================================
107
- // Code Generation
108
- // =============================================================================
109
-
110
- /**
111
- * Generate TypeScript types from content types in the database.
112
- *
113
- * @param ctx - Convex context
114
- * @param cmsClient - CMS client to query content types
115
- * @param options - Code generation options
116
- * @returns Generated TypeScript code
117
- *
118
- * @example
119
- * ```typescript
120
- * const result = await generateTypesFromDatabase(ctx, cms);
121
- *
122
- * // Write to file
123
- * await fs.writeFile("./src/generated/cms-types.ts", result.code);
124
- *
125
- * // Now you can import the types
126
- * import type { BlogPostData, AuthorData } from "./generated/cms-types";
127
- * ```
128
- */
129
- export async function generateTypesFromDatabase(
130
- ctx: ConvexContext,
131
- cmsClient: CmsClient,
132
- options: CodegenOptions = {},
133
- ): Promise<CodegenResult> {
134
- const {
135
- header = "Auto-generated by @convex-cms/core codegen",
136
- includeJsDoc = true,
137
- contentTypes: includeTypes,
138
- exclude = [],
139
- includeNameUnion = true,
140
- includeDiscriminatedUnion = false,
141
- typeSuffix = "Data",
142
- allOptional = false,
143
- } = options;
144
-
145
- // Fetch all content types
146
- const allTypes = await cmsClient.contentTypes.getAll(ctx);
147
-
148
- // Filter content types
149
- let filteredTypes: ContentType[] = allTypes;
150
- if (includeTypes) {
151
- filteredTypes = filteredTypes.filter((t: ContentType) => includeTypes.includes(t.name));
152
- }
153
- filteredTypes = filteredTypes.filter((t: ContentType) => !exclude.includes(t.name));
154
-
155
- const includedTypes = filteredTypes.map((t: ContentType) => t.name);
156
- const excludedTypes = allTypes
157
- .filter((t: ContentType) => !includedTypes.includes(t.name))
158
- .map((t: ContentType) => t.name);
159
-
160
- // Build output
161
- const lines: string[] = [];
162
-
163
- // Header
164
- lines.push(`/**`);
165
- lines.push(` * ${header}`);
166
- lines.push(` *`);
167
- lines.push(` * DO NOT EDIT - Regenerate with: npx convex-cms codegen`);
168
- lines.push(` *`);
169
- lines.push(` * Generated: ${new Date().toISOString()}`);
170
- lines.push(` * Content types: ${includedTypes.length}`);
171
- lines.push(` */`);
172
- lines.push("");
173
- lines.push("/* eslint-disable */");
174
- lines.push("");
175
-
176
- // Generate types for each content type
177
- for (const contentType of filteredTypes) {
178
- lines.push(
179
- ...generateTypeForContentType(contentType, {
180
- includeJsDoc,
181
- typeSuffix,
182
- allOptional,
183
- }),
184
- );
185
- lines.push("");
186
- }
187
-
188
- // Generate name union
189
- if (includeNameUnion && filteredTypes.length > 0) {
190
- lines.push("/**");
191
- lines.push(" * All content type names.");
192
- lines.push(" */");
193
- const typeNames = filteredTypes.map((t) => `"${t.name}"`).join(" | ");
194
- lines.push(`export type ContentTypeName = ${typeNames};`);
195
- lines.push("");
196
- }
197
-
198
- // Generate discriminated union
199
- if (includeDiscriminatedUnion && filteredTypes.length > 0) {
200
- lines.push("/**");
201
- lines.push(" * Discriminated union of all content data types.");
202
- lines.push(" */");
203
- lines.push("export type ContentData =");
204
- for (let i = 0; i < filteredTypes.length; i++) {
205
- const t = filteredTypes[i];
206
- const typeName = toPascalCase(t.name) + typeSuffix;
207
- const suffix = i < filteredTypes.length - 1 ? "" : ";";
208
- lines.push(` | { _type: "${t.name}"; data: ${typeName} }${suffix}`);
209
- }
210
- lines.push("");
211
- }
212
-
213
- // Generate type map
214
- if (filteredTypes.length > 0) {
215
- lines.push("/**");
216
- lines.push(" * Map from content type name to data type.");
217
- lines.push(" */");
218
- lines.push("export interface ContentTypeMap {");
219
- for (const t of filteredTypes) {
220
- const typeName = toPascalCase(t.name) + typeSuffix;
221
- lines.push(` "${t.name}": ${typeName};`);
222
- }
223
- lines.push("}");
224
- lines.push("");
225
- }
226
-
227
- // Helper type
228
- lines.push("/**");
229
- lines.push(" * Get the data type for a content type name.");
230
- lines.push(" */");
231
- lines.push(
232
- "export type DataForType<T extends ContentTypeName> = ContentTypeMap[T];",
233
- );
234
-
235
- return {
236
- code: lines.join("\n"),
237
- includedTypes,
238
- excludedTypes,
239
- generatedAt: Date.now(),
240
- };
241
- }
242
-
243
- /**
244
- * Generate TypeScript interface for a single content type.
245
- */
246
- function generateTypeForContentType(
247
- contentType: ContentType,
248
- options: {
249
- includeJsDoc: boolean;
250
- typeSuffix: string;
251
- allOptional: boolean;
252
- },
253
- ): string[] {
254
- const { includeJsDoc, typeSuffix, allOptional } = options;
255
- const lines: string[] = [];
256
-
257
- const typeName = toPascalCase(contentType.name) + typeSuffix;
258
-
259
- // JSDoc
260
- if (includeJsDoc) {
261
- lines.push("/**");
262
- lines.push(
263
- ` * Data type for "${contentType.displayName}" content entries.`,
264
- );
265
- if (contentType.description) {
266
- lines.push(` *`);
267
- lines.push(` * ${contentType.description}`);
268
- }
269
- lines.push(` *`);
270
- lines.push(` * @contentType ${contentType.name}`);
271
- lines.push(" */");
272
- }
273
-
274
- // Interface
275
- lines.push(`export interface ${typeName} {`);
276
-
277
- for (const field of contentType.fields) {
278
- // Field JSDoc
279
- if (includeJsDoc && field.description) {
280
- lines.push(` /** ${field.description} */`);
281
- }
282
-
283
- const tsType = fieldTypeToTsType(field);
284
- const optional = allOptional || !field.required ? "?" : "";
285
- lines.push(` ${field.name}${optional}: ${tsType};`);
286
- }
287
-
288
- lines.push("}");
289
-
290
- return lines;
291
- }
292
-
293
- /**
294
- * Convert a field definition to a TypeScript type.
295
- *
296
- * Note: We cast field.type to string because the database may contain
297
- * field types (like "tags", "category") that aren't in the client FieldType union.
298
- */
299
- function fieldTypeToTsType(field: FieldDefinition): string {
300
- // Cast to string to handle potential extra field types from the database
301
- const fieldType = field.type as string;
302
-
303
- switch (fieldType) {
304
- case "text":
305
- case "richText":
306
- return "string";
307
-
308
- case "number":
309
- return "number";
310
-
311
- case "boolean":
312
- return "boolean";
313
-
314
- case "date":
315
- case "datetime":
316
- return "number"; // Unix timestamp
317
-
318
- case "reference": {
319
- // Type narrowing: field.type === "reference" means options has reference shape
320
- const refOpts = field.options as { multiple?: boolean } | undefined;
321
- if (refOpts?.multiple) {
322
- return "string[]";
323
- }
324
- return "string";
325
- }
326
-
327
- case "media": {
328
- // Type narrowing: field.type === "media" means options has media shape
329
- const mediaOpts = field.options as { multiple?: boolean } | undefined;
330
- if (mediaOpts?.multiple) {
331
- return "string[]";
332
- }
333
- return "string";
334
- }
335
-
336
- case "select": {
337
- const selectOpts = field.options as
338
- | { options?: Array<{ value: string; label?: string }> }
339
- | undefined;
340
- return generateSelectUnion(selectOpts?.options);
341
- }
342
-
343
- case "multiSelect": {
344
- const multiOpts = field.options as
345
- | { options?: Array<{ value: string; label?: string }> }
346
- | undefined;
347
- const unionType = generateSelectUnion(multiOpts?.options);
348
- return `(${unionType})[]`;
349
- }
350
-
351
- case "json":
352
- return "unknown";
353
-
354
- // Handle taxonomy fields (may not be in FieldType union)
355
- case "tags":
356
- case "category":
357
- return "string[]";
358
-
359
- default:
360
- return "unknown";
361
- }
362
- }
363
-
364
- /**
365
- * Generate a union type from select options.
366
- */
367
- function generateSelectUnion(
368
- options?: Array<{ value: string; label?: string }>,
369
- ): string {
370
- if (!options || options.length === 0) {
371
- return "string";
372
- }
373
- return options.map((o) => `"${escapeString(o.value)}"`).join(" | ");
374
- }
375
-
376
- /**
377
- * Convert a string to PascalCase.
378
- */
379
- function toPascalCase(str: string): string {
380
- return str
381
- .split(/[-_\s]+/)
382
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
383
- .join("");
384
- }
385
-
386
- /**
387
- * Escape special characters in a string for use in TypeScript.
388
- */
389
- function escapeString(str: string): string {
390
- return str.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n");
391
- }
392
-
393
- // =============================================================================
394
- // String-based Generation (No Convex Context)
395
- // =============================================================================
396
-
397
- /**
398
- * Generate TypeScript types from an array of content type definitions.
399
- *
400
- * Useful when you already have the content types loaded (e.g., from a JSON file).
401
- *
402
- * @param contentTypes - Array of content type definitions
403
- * @param options - Code generation options
404
- * @returns Generated TypeScript code
405
- */
406
- export function generateTypesFromDefinitions(
407
- contentTypes: ContentType[],
408
- options: CodegenOptions = {},
409
- ): string {
410
- const {
411
- header = "Auto-generated by @convex-cms/core codegen",
412
- includeJsDoc = true,
413
- exclude = [],
414
- includeNameUnion = true,
415
- typeSuffix = "Data",
416
- allOptional = false,
417
- } = options;
418
-
419
- // Filter content types
420
- const filteredTypes = contentTypes.filter((t) => !exclude.includes(t.name));
421
-
422
- const lines: string[] = [];
423
-
424
- // Header
425
- lines.push(`/**`);
426
- lines.push(` * ${header}`);
427
- lines.push(` *`);
428
- lines.push(` * DO NOT EDIT`);
429
- lines.push(` */`);
430
- lines.push("");
431
- lines.push("/* eslint-disable */");
432
- lines.push("");
433
-
434
- // Generate types
435
- for (const contentType of filteredTypes) {
436
- lines.push(
437
- ...generateTypeForContentType(contentType, {
438
- includeJsDoc,
439
- typeSuffix,
440
- allOptional,
441
- }),
442
- );
443
- lines.push("");
444
- }
445
-
446
- // Name union
447
- if (includeNameUnion && filteredTypes.length > 0) {
448
- const typeNames = filteredTypes.map((t) => `"${t.name}"`).join(" | ");
449
- lines.push(`export type ContentTypeName = ${typeNames};`);
450
- lines.push("");
451
- }
452
-
453
- // Type map
454
- if (filteredTypes.length > 0) {
455
- lines.push("export interface ContentTypeMap {");
456
- for (const t of filteredTypes) {
457
- const typeName = toPascalCase(t.name) + typeSuffix;
458
- lines.push(` "${t.name}": ${typeName};`);
459
- }
460
- lines.push("}");
461
- }
462
-
463
- return lines.join("\n");
464
- }
465
-
466
- // =============================================================================
467
- // Validation
468
- // =============================================================================
469
-
470
- /**
471
- * Validate that generated types match the expected structure.
472
- *
473
- * @param code - Generated TypeScript code
474
- * @returns Validation result
475
- */
476
- export function validateGeneratedCode(
477
- code: string,
478
- ): {
479
- valid: boolean;
480
- errors: string[];
481
- } {
482
- const errors: string[] = [];
483
-
484
- // Check for basic structure
485
- if (!code.includes("export interface") && !code.includes("export type")) {
486
- errors.push("No exported types found in generated code");
487
- }
488
-
489
- // Check for syntax issues
490
- const openBraces = (code.match(/{/g) || []).length;
491
- const closeBraces = (code.match(/}/g) || []).length;
492
- if (openBraces !== closeBraces) {
493
- errors.push(`Mismatched braces: ${openBraces} open, ${closeBraces} close`);
494
- }
495
-
496
- return {
497
- valid: errors.length === 0,
498
- errors,
499
- };
500
- }