convex-cms 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/dist/cli/commands/admin.d.ts +16 -0
  2. package/dist/cli/commands/admin.d.ts.map +1 -0
  3. package/dist/cli/commands/admin.js +88 -0
  4. package/dist/cli/commands/admin.js.map +1 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +18 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/cli/utils/detectConvexUrl.d.ts +13 -0
  10. package/dist/cli/utils/detectConvexUrl.d.ts.map +1 -0
  11. package/dist/cli/utils/detectConvexUrl.js +48 -0
  12. package/dist/cli/utils/detectConvexUrl.js.map +1 -0
  13. package/dist/cli/utils/openBrowser.d.ts +7 -0
  14. package/dist/cli/utils/openBrowser.d.ts.map +1 -0
  15. package/dist/cli/utils/openBrowser.js +17 -0
  16. package/dist/cli/utils/openBrowser.js.map +1 -0
  17. package/dist/client/admin-config.d.ts +126 -0
  18. package/dist/client/admin-config.d.ts.map +1 -0
  19. package/dist/client/admin-config.js +117 -0
  20. package/dist/client/admin-config.js.map +1 -0
  21. package/dist/client/adminApi.d.ts +2273 -0
  22. package/dist/client/adminApi.d.ts.map +1 -0
  23. package/dist/client/adminApi.js +716 -0
  24. package/dist/client/adminApi.js.map +1 -0
  25. package/dist/client/agentTools.d.ts +933 -0
  26. package/dist/client/agentTools.d.ts.map +1 -0
  27. package/dist/client/agentTools.js +1004 -0
  28. package/dist/client/agentTools.js.map +1 -0
  29. package/dist/client/argTypes.d.ts +212 -0
  30. package/dist/client/argTypes.d.ts.map +1 -0
  31. package/dist/client/argTypes.js +5 -0
  32. package/dist/client/argTypes.js.map +1 -0
  33. package/dist/client/field-types.d.ts +55 -0
  34. package/dist/client/field-types.d.ts.map +1 -0
  35. package/dist/client/field-types.js +152 -0
  36. package/dist/client/field-types.js.map +1 -0
  37. package/dist/client/index.d.ts +189 -0
  38. package/dist/client/index.d.ts.map +1 -0
  39. package/dist/client/index.js +668 -0
  40. package/dist/client/index.js.map +1 -0
  41. package/dist/client/queryBuilder.d.ts +765 -0
  42. package/dist/client/queryBuilder.d.ts.map +1 -0
  43. package/dist/client/queryBuilder.js +970 -0
  44. package/dist/client/queryBuilder.js.map +1 -0
  45. package/dist/client/schema/codegen.d.ts +128 -0
  46. package/dist/client/schema/codegen.d.ts.map +1 -0
  47. package/dist/client/schema/codegen.js +318 -0
  48. package/dist/client/schema/codegen.js.map +1 -0
  49. package/dist/client/schema/defineContentType.d.ts +221 -0
  50. package/dist/client/schema/defineContentType.d.ts.map +1 -0
  51. package/dist/client/schema/defineContentType.js +380 -0
  52. package/dist/client/schema/defineContentType.js.map +1 -0
  53. package/dist/client/schema/index.d.ts +85 -0
  54. package/dist/client/schema/index.d.ts.map +1 -0
  55. package/dist/client/schema/index.js +92 -0
  56. package/dist/client/schema/index.js.map +1 -0
  57. package/dist/client/schema/schemaDrift.d.ts +199 -0
  58. package/dist/client/schema/schemaDrift.d.ts.map +1 -0
  59. package/dist/client/schema/schemaDrift.js +340 -0
  60. package/dist/client/schema/schemaDrift.js.map +1 -0
  61. package/dist/client/schema/typedClient.d.ts +401 -0
  62. package/dist/client/schema/typedClient.d.ts.map +1 -0
  63. package/dist/client/schema/typedClient.js +269 -0
  64. package/dist/client/schema/typedClient.js.map +1 -0
  65. package/dist/client/schema/types.d.ts +477 -0
  66. package/dist/client/schema/types.d.ts.map +1 -0
  67. package/dist/client/schema/types.js +39 -0
  68. package/dist/client/schema/types.js.map +1 -0
  69. package/dist/client/types.d.ts +449 -0
  70. package/dist/client/types.d.ts.map +1 -0
  71. package/dist/client/types.js +149 -0
  72. package/dist/client/types.js.map +1 -0
  73. package/dist/client/workflows.d.ts +51 -0
  74. package/dist/client/workflows.d.ts.map +1 -0
  75. package/dist/client/workflows.js +103 -0
  76. package/dist/client/workflows.js.map +1 -0
  77. package/dist/client/wrapper.d.ts +2198 -0
  78. package/dist/client/wrapper.d.ts.map +1 -0
  79. package/dist/client/wrapper.js +2651 -0
  80. package/dist/client/wrapper.js.map +1 -0
  81. package/dist/component/_generated/api.d.ts +124 -0
  82. package/dist/component/_generated/api.d.ts.map +1 -0
  83. package/dist/component/_generated/api.js +31 -0
  84. package/dist/component/_generated/api.js.map +1 -0
  85. package/dist/component/_generated/component.d.ts +4321 -0
  86. package/dist/component/_generated/component.d.ts.map +1 -0
  87. package/dist/component/_generated/component.js +11 -0
  88. package/dist/component/_generated/component.js.map +1 -0
  89. package/dist/component/_generated/dataModel.d.ts +46 -0
  90. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  91. package/dist/component/_generated/dataModel.js +11 -0
  92. package/dist/component/_generated/dataModel.js.map +1 -0
  93. package/dist/component/_generated/server.d.ts +121 -0
  94. package/dist/component/_generated/server.d.ts.map +1 -0
  95. package/dist/component/_generated/server.js +78 -0
  96. package/dist/component/_generated/server.js.map +1 -0
  97. package/dist/component/auditLog.d.ts +410 -0
  98. package/dist/component/auditLog.d.ts.map +1 -0
  99. package/dist/component/auditLog.js +607 -0
  100. package/dist/component/auditLog.js.map +1 -0
  101. package/dist/component/authorization.d.ts +323 -0
  102. package/dist/component/authorization.d.ts.map +1 -0
  103. package/dist/component/authorization.js +464 -0
  104. package/dist/component/authorization.js.map +1 -0
  105. package/dist/component/authorizationHooks.d.ts +184 -0
  106. package/dist/component/authorizationHooks.d.ts.map +1 -0
  107. package/dist/component/authorizationHooks.js +521 -0
  108. package/dist/component/authorizationHooks.js.map +1 -0
  109. package/dist/component/bulkOperations.d.ts +200 -0
  110. package/dist/component/bulkOperations.d.ts.map +1 -0
  111. package/dist/component/bulkOperations.js +568 -0
  112. package/dist/component/bulkOperations.js.map +1 -0
  113. package/dist/component/contentEntries.d.ts +719 -0
  114. package/dist/component/contentEntries.d.ts.map +1 -0
  115. package/dist/component/contentEntries.js +1617 -0
  116. package/dist/component/contentEntries.js.map +1 -0
  117. package/dist/component/contentEntryMutations.d.ts +505 -0
  118. package/dist/component/contentEntryMutations.d.ts.map +1 -0
  119. package/dist/component/contentEntryMutations.js +1009 -0
  120. package/dist/component/contentEntryMutations.js.map +1 -0
  121. package/dist/component/contentEntryValidation.d.ts +115 -0
  122. package/dist/component/contentEntryValidation.d.ts.map +1 -0
  123. package/dist/component/contentEntryValidation.js +546 -0
  124. package/dist/component/contentEntryValidation.js.map +1 -0
  125. package/dist/component/contentLock.d.ts +328 -0
  126. package/dist/component/contentLock.d.ts.map +1 -0
  127. package/dist/component/contentLock.js +471 -0
  128. package/dist/component/contentLock.js.map +1 -0
  129. package/dist/component/contentTypeMigration.d.ts +411 -0
  130. package/dist/component/contentTypeMigration.d.ts.map +1 -0
  131. package/dist/component/contentTypeMigration.js +805 -0
  132. package/dist/component/contentTypeMigration.js.map +1 -0
  133. package/dist/component/contentTypeMutations.d.ts +975 -0
  134. package/dist/component/contentTypeMutations.d.ts.map +1 -0
  135. package/dist/component/contentTypeMutations.js +768 -0
  136. package/dist/component/contentTypeMutations.js.map +1 -0
  137. package/dist/component/contentTypes.d.ts +538 -0
  138. package/dist/component/contentTypes.d.ts.map +1 -0
  139. package/dist/component/contentTypes.js +304 -0
  140. package/dist/component/contentTypes.js.map +1 -0
  141. package/dist/component/convex.config.d.ts +42 -0
  142. package/dist/component/convex.config.d.ts.map +1 -0
  143. package/dist/component/convex.config.js +43 -0
  144. package/dist/component/convex.config.js.map +1 -0
  145. package/dist/component/documentTypes.d.ts +186 -0
  146. package/dist/component/documentTypes.d.ts.map +1 -0
  147. package/dist/component/documentTypes.js +23 -0
  148. package/dist/component/documentTypes.js.map +1 -0
  149. package/dist/component/eventEmitter.d.ts +281 -0
  150. package/dist/component/eventEmitter.d.ts.map +1 -0
  151. package/dist/component/eventEmitter.js +300 -0
  152. package/dist/component/eventEmitter.js.map +1 -0
  153. package/dist/component/exportImport.d.ts +1120 -0
  154. package/dist/component/exportImport.d.ts.map +1 -0
  155. package/dist/component/exportImport.js +931 -0
  156. package/dist/component/exportImport.js.map +1 -0
  157. package/dist/component/index.d.ts +28 -0
  158. package/dist/component/index.d.ts.map +1 -0
  159. package/dist/component/index.js +142 -0
  160. package/dist/component/index.js.map +1 -0
  161. package/dist/component/lib/deepReferenceResolver.d.ts +252 -0
  162. package/dist/component/lib/deepReferenceResolver.d.ts.map +1 -0
  163. package/dist/component/lib/deepReferenceResolver.js +601 -0
  164. package/dist/component/lib/deepReferenceResolver.js.map +1 -0
  165. package/dist/component/lib/errors.d.ts +306 -0
  166. package/dist/component/lib/errors.d.ts.map +1 -0
  167. package/dist/component/lib/errors.js +407 -0
  168. package/dist/component/lib/errors.js.map +1 -0
  169. package/dist/component/lib/index.d.ts +10 -0
  170. package/dist/component/lib/index.d.ts.map +1 -0
  171. package/dist/component/lib/index.js +33 -0
  172. package/dist/component/lib/index.js.map +1 -0
  173. package/dist/component/lib/mediaReferenceResolver.d.ts +217 -0
  174. package/dist/component/lib/mediaReferenceResolver.d.ts.map +1 -0
  175. package/dist/component/lib/mediaReferenceResolver.js +326 -0
  176. package/dist/component/lib/mediaReferenceResolver.js.map +1 -0
  177. package/dist/component/lib/metadataExtractor.d.ts +245 -0
  178. package/dist/component/lib/metadataExtractor.d.ts.map +1 -0
  179. package/dist/component/lib/metadataExtractor.js +548 -0
  180. package/dist/component/lib/metadataExtractor.js.map +1 -0
  181. package/dist/component/lib/mutationAuth.d.ts +95 -0
  182. package/dist/component/lib/mutationAuth.d.ts.map +1 -0
  183. package/dist/component/lib/mutationAuth.js +146 -0
  184. package/dist/component/lib/mutationAuth.js.map +1 -0
  185. package/dist/component/lib/queries.d.ts +17 -0
  186. package/dist/component/lib/queries.d.ts.map +1 -0
  187. package/dist/component/lib/queries.js +49 -0
  188. package/dist/component/lib/queries.js.map +1 -0
  189. package/dist/component/lib/ragContentChunker.d.ts +423 -0
  190. package/dist/component/lib/ragContentChunker.d.ts.map +1 -0
  191. package/dist/component/lib/ragContentChunker.js +897 -0
  192. package/dist/component/lib/ragContentChunker.js.map +1 -0
  193. package/dist/component/lib/referenceResolver.d.ts +175 -0
  194. package/dist/component/lib/referenceResolver.d.ts.map +1 -0
  195. package/dist/component/lib/referenceResolver.js +293 -0
  196. package/dist/component/lib/referenceResolver.js.map +1 -0
  197. package/dist/component/lib/slugGenerator.d.ts +71 -0
  198. package/dist/component/lib/slugGenerator.d.ts.map +1 -0
  199. package/dist/component/lib/slugGenerator.js +207 -0
  200. package/dist/component/lib/slugGenerator.js.map +1 -0
  201. package/dist/component/lib/slugUniqueness.d.ts +131 -0
  202. package/dist/component/lib/slugUniqueness.d.ts.map +1 -0
  203. package/dist/component/lib/slugUniqueness.js +229 -0
  204. package/dist/component/lib/slugUniqueness.js.map +1 -0
  205. package/dist/component/lib/softDelete.d.ts +18 -0
  206. package/dist/component/lib/softDelete.d.ts.map +1 -0
  207. package/dist/component/lib/softDelete.js +29 -0
  208. package/dist/component/lib/softDelete.js.map +1 -0
  209. package/dist/component/localeFallbackChain.d.ts +410 -0
  210. package/dist/component/localeFallbackChain.d.ts.map +1 -0
  211. package/dist/component/localeFallbackChain.js +467 -0
  212. package/dist/component/localeFallbackChain.js.map +1 -0
  213. package/dist/component/localeFields.d.ts +508 -0
  214. package/dist/component/localeFields.d.ts.map +1 -0
  215. package/dist/component/localeFields.js +592 -0
  216. package/dist/component/localeFields.js.map +1 -0
  217. package/dist/component/mediaAssetMutations.d.ts +235 -0
  218. package/dist/component/mediaAssetMutations.d.ts.map +1 -0
  219. package/dist/component/mediaAssetMutations.js +558 -0
  220. package/dist/component/mediaAssetMutations.js.map +1 -0
  221. package/dist/component/mediaAssets.d.ts +168 -0
  222. package/dist/component/mediaAssets.d.ts.map +1 -0
  223. package/dist/component/mediaAssets.js +618 -0
  224. package/dist/component/mediaAssets.js.map +1 -0
  225. package/dist/component/mediaFolderMutations.d.ts +642 -0
  226. package/dist/component/mediaFolderMutations.d.ts.map +1 -0
  227. package/dist/component/mediaFolderMutations.js +849 -0
  228. package/dist/component/mediaFolderMutations.js.map +1 -0
  229. package/dist/component/mediaUploadMutations.d.ts +136 -0
  230. package/dist/component/mediaUploadMutations.d.ts.map +1 -0
  231. package/dist/component/mediaUploadMutations.js +205 -0
  232. package/dist/component/mediaUploadMutations.js.map +1 -0
  233. package/dist/component/mediaVariantMutations.d.ts +468 -0
  234. package/dist/component/mediaVariantMutations.d.ts.map +1 -0
  235. package/dist/component/mediaVariantMutations.js +737 -0
  236. package/dist/component/mediaVariantMutations.js.map +1 -0
  237. package/dist/component/mediaVariants.d.ts +525 -0
  238. package/dist/component/mediaVariants.d.ts.map +1 -0
  239. package/dist/component/mediaVariants.js +661 -0
  240. package/dist/component/mediaVariants.js.map +1 -0
  241. package/dist/component/ragContentIndexer.d.ts +595 -0
  242. package/dist/component/ragContentIndexer.d.ts.map +1 -0
  243. package/dist/component/ragContentIndexer.js +794 -0
  244. package/dist/component/ragContentIndexer.js.map +1 -0
  245. package/dist/component/rateLimitHooks.d.ts +266 -0
  246. package/dist/component/rateLimitHooks.d.ts.map +1 -0
  247. package/dist/component/rateLimitHooks.js +412 -0
  248. package/dist/component/rateLimitHooks.js.map +1 -0
  249. package/dist/component/roles.d.ts +649 -0
  250. package/dist/component/roles.d.ts.map +1 -0
  251. package/dist/component/roles.js +884 -0
  252. package/dist/component/roles.js.map +1 -0
  253. package/dist/component/scheduledPublish.d.ts +182 -0
  254. package/dist/component/scheduledPublish.d.ts.map +1 -0
  255. package/dist/component/scheduledPublish.js +304 -0
  256. package/dist/component/scheduledPublish.js.map +1 -0
  257. package/dist/component/schema.d.ts +4114 -0
  258. package/dist/component/schema.d.ts.map +1 -0
  259. package/dist/component/schema.js +469 -0
  260. package/dist/component/schema.js.map +1 -0
  261. package/dist/component/taxonomies.d.ts +476 -0
  262. package/dist/component/taxonomies.d.ts.map +1 -0
  263. package/dist/component/taxonomies.js +785 -0
  264. package/dist/component/taxonomies.js.map +1 -0
  265. package/dist/component/taxonomyMutations.d.ts +206 -0
  266. package/dist/component/taxonomyMutations.d.ts.map +1 -0
  267. package/dist/component/taxonomyMutations.js +1001 -0
  268. package/dist/component/taxonomyMutations.js.map +1 -0
  269. package/dist/component/trash.d.ts +265 -0
  270. package/dist/component/trash.d.ts.map +1 -0
  271. package/dist/component/trash.js +621 -0
  272. package/dist/component/trash.js.map +1 -0
  273. package/dist/component/types.d.ts +4 -0
  274. package/dist/component/types.d.ts.map +1 -0
  275. package/dist/component/types.js +2 -0
  276. package/dist/component/types.js.map +1 -0
  277. package/dist/component/userContext.d.ts +508 -0
  278. package/dist/component/userContext.d.ts.map +1 -0
  279. package/dist/component/userContext.js +615 -0
  280. package/dist/component/userContext.js.map +1 -0
  281. package/dist/component/validation.d.ts +387 -0
  282. package/dist/component/validation.d.ts.map +1 -0
  283. package/dist/component/validation.js +1052 -0
  284. package/dist/component/validation.js.map +1 -0
  285. package/dist/component/validators.d.ts +4645 -0
  286. package/dist/component/validators.d.ts.map +1 -0
  287. package/dist/component/validators.js +641 -0
  288. package/dist/component/validators.js.map +1 -0
  289. package/dist/component/versionMutations.d.ts +216 -0
  290. package/dist/component/versionMutations.d.ts.map +1 -0
  291. package/dist/component/versionMutations.js +321 -0
  292. package/dist/component/versionMutations.js.map +1 -0
  293. package/dist/component/webhookTrigger.d.ts +770 -0
  294. package/dist/component/webhookTrigger.d.ts.map +1 -0
  295. package/dist/component/webhookTrigger.js +1413 -0
  296. package/dist/component/webhookTrigger.js.map +1 -0
  297. package/dist/react/index.d.ts +316 -0
  298. package/dist/react/index.d.ts.map +1 -0
  299. package/dist/react/index.js +558 -0
  300. package/dist/react/index.js.map +1 -0
  301. package/dist/test.d.ts +2230 -0
  302. package/dist/test.d.ts.map +1 -0
  303. package/dist/test.js +1107 -0
  304. package/dist/test.js.map +1 -0
  305. package/package.json +95 -0
  306. package/src/cli/commands/admin.ts +104 -0
  307. package/src/cli/index.ts +21 -0
  308. package/src/cli/utils/detectConvexUrl.ts +54 -0
  309. package/src/cli/utils/openBrowser.ts +16 -0
  310. package/src/client/admin-config.ts +138 -0
  311. package/src/client/adminApi.ts +942 -0
  312. package/src/client/agentTools.ts +1311 -0
  313. package/src/client/argTypes.ts +316 -0
  314. package/src/client/field-types.ts +187 -0
  315. package/src/client/index.ts +1301 -0
  316. package/src/client/queryBuilder.ts +1100 -0
  317. package/src/client/schema/codegen.ts +500 -0
  318. package/src/client/schema/defineContentType.ts +501 -0
  319. package/src/client/schema/index.ts +169 -0
  320. package/src/client/schema/schemaDrift.ts +574 -0
  321. package/src/client/schema/typedClient.ts +688 -0
  322. package/src/client/schema/types.ts +666 -0
  323. package/src/client/types.ts +723 -0
  324. package/src/client/workflows.ts +141 -0
  325. package/src/client/wrapper.ts +4304 -0
  326. package/src/component/_generated/api.ts +140 -0
  327. package/src/component/_generated/component.ts +5029 -0
  328. package/src/component/_generated/dataModel.ts +60 -0
  329. package/src/component/_generated/server.ts +156 -0
  330. package/src/component/authorization.ts +647 -0
  331. package/src/component/authorizationHooks.ts +668 -0
  332. package/src/component/bulkOperations.ts +687 -0
  333. package/src/component/contentEntries.ts +1976 -0
  334. package/src/component/contentEntryMutations.ts +1223 -0
  335. package/src/component/contentEntryValidation.ts +707 -0
  336. package/src/component/contentLock.ts +550 -0
  337. package/src/component/contentTypeMigration.ts +1064 -0
  338. package/src/component/contentTypeMutations.ts +969 -0
  339. package/src/component/contentTypes.ts +346 -0
  340. package/src/component/convex.config.ts +44 -0
  341. package/src/component/documentTypes.ts +240 -0
  342. package/src/component/eventEmitter.ts +485 -0
  343. package/src/component/exportImport.ts +1169 -0
  344. package/src/component/index.ts +491 -0
  345. package/src/component/lib/deepReferenceResolver.ts +999 -0
  346. package/src/component/lib/errors.ts +816 -0
  347. package/src/component/lib/index.ts +145 -0
  348. package/src/component/lib/mediaReferenceResolver.ts +495 -0
  349. package/src/component/lib/metadataExtractor.ts +792 -0
  350. package/src/component/lib/mutationAuth.ts +199 -0
  351. package/src/component/lib/queries.ts +79 -0
  352. package/src/component/lib/ragContentChunker.ts +1371 -0
  353. package/src/component/lib/referenceResolver.ts +430 -0
  354. package/src/component/lib/slugGenerator.ts +262 -0
  355. package/src/component/lib/slugUniqueness.ts +333 -0
  356. package/src/component/lib/softDelete.ts +44 -0
  357. package/src/component/localeFallbackChain.ts +673 -0
  358. package/src/component/localeFields.ts +896 -0
  359. package/src/component/mediaAssetMutations.ts +725 -0
  360. package/src/component/mediaAssets.ts +932 -0
  361. package/src/component/mediaFolderMutations.ts +1046 -0
  362. package/src/component/mediaUploadMutations.ts +224 -0
  363. package/src/component/mediaVariantMutations.ts +900 -0
  364. package/src/component/mediaVariants.ts +793 -0
  365. package/src/component/ragContentIndexer.ts +1067 -0
  366. package/src/component/rateLimitHooks.ts +572 -0
  367. package/src/component/roles.ts +1360 -0
  368. package/src/component/scheduledPublish.ts +358 -0
  369. package/src/component/schema.ts +617 -0
  370. package/src/component/taxonomies.ts +949 -0
  371. package/src/component/taxonomyMutations.ts +1210 -0
  372. package/src/component/trash.ts +724 -0
  373. package/src/component/userContext.ts +898 -0
  374. package/src/component/validation.ts +1388 -0
  375. package/src/component/validators.ts +949 -0
  376. package/src/component/versionMutations.ts +392 -0
  377. package/src/component/webhookTrigger.ts +1922 -0
  378. package/src/react/index.ts +898 -0
  379. package/src/test.ts +1580 -0
@@ -0,0 +1,617 @@
1
+ import { defineSchema, defineTable } from "convex/server";
2
+ import { v } from "convex/values";
3
+
4
+ export const fieldTypes = [
5
+ "text",
6
+ "richText",
7
+ "number",
8
+ "boolean",
9
+ "date",
10
+ "datetime",
11
+ "reference",
12
+ "media",
13
+ "json",
14
+ "select",
15
+ "multiSelect",
16
+ "tags",
17
+ "category",
18
+ ] as const;
19
+
20
+ export const fieldTypeValidator = v.union(
21
+ v.literal("text"),
22
+ v.literal("richText"),
23
+ v.literal("number"),
24
+ v.literal("boolean"),
25
+ v.literal("date"),
26
+ v.literal("datetime"),
27
+ v.literal("reference"),
28
+ v.literal("media"),
29
+ v.literal("json"),
30
+ v.literal("select"),
31
+ v.literal("multiSelect"),
32
+ v.literal("tags"),
33
+ v.literal("category"),
34
+ );
35
+
36
+ /**
37
+ * Default content statuses for the built-in workflow.
38
+ * Custom workflows can define additional statuses via defineWorkflow().
39
+ */
40
+ export const contentStatuses = [
41
+ "draft",
42
+ "published",
43
+ "archived",
44
+ "scheduled",
45
+ ] as const;
46
+
47
+ /**
48
+ * Content status validator.
49
+ *
50
+ * Uses v.string() instead of a literal union to support custom workflow states.
51
+ * Validation of allowed transitions happens at the application layer via
52
+ * the WorkflowConfig (see src/client/workflows.ts).
53
+ *
54
+ * Built-in statuses: "draft", "published", "archived", "scheduled"
55
+ * Custom statuses: Defined via defineWorkflow() in CMS config
56
+ */
57
+ export const contentStatusValidator = v.string();
58
+
59
+ export const mediaTypes = [
60
+ "image",
61
+ "video",
62
+ "audio",
63
+ "document",
64
+ "other",
65
+ ] as const;
66
+
67
+ export const mediaTypeValidator = v.union(
68
+ v.literal("image"),
69
+ v.literal("video"),
70
+ v.literal("audio"),
71
+ v.literal("document"),
72
+ v.literal("other"),
73
+ );
74
+
75
+ export const variantTypeValidator = v.union(
76
+ v.literal("thumbnail"),
77
+ v.literal("responsive"),
78
+ v.literal("format"),
79
+ );
80
+
81
+ export const variantStatusValidator = v.union(
82
+ v.literal("pending"),
83
+ v.literal("processing"),
84
+ v.literal("completed"),
85
+ v.literal("failed"),
86
+ );
87
+
88
+ export const variantTypes = ["thumbnail", "responsive", "format"] as const;
89
+ export const variantStatuses = ["pending", "processing", "completed", "failed"] as const;
90
+ export const variantFormats = ["webp", "avif", "jpeg", "png"] as const;
91
+
92
+ const baseFieldDefinition = {
93
+ name: v.string(),
94
+ label: v.string(),
95
+ required: v.boolean(),
96
+ searchable: v.optional(v.boolean()),
97
+ localized: v.optional(v.boolean()),
98
+ description: v.optional(v.string()),
99
+ defaultValue: v.optional(v.any()),
100
+ };
101
+
102
+ export const textFieldDefinitionValidator = v.object({
103
+ ...baseFieldDefinition,
104
+ type: v.literal("text"),
105
+ options: v.optional(v.object({
106
+ minLength: v.optional(v.number()),
107
+ maxLength: v.optional(v.number()),
108
+ pattern: v.optional(v.string()),
109
+ })),
110
+ });
111
+
112
+ export const numberFieldDefinitionValidator = v.object({
113
+ ...baseFieldDefinition,
114
+ type: v.literal("number"),
115
+ options: v.optional(v.object({
116
+ min: v.optional(v.number()),
117
+ max: v.optional(v.number()),
118
+ step: v.optional(v.number()),
119
+ precision: v.optional(v.number()),
120
+ })),
121
+ });
122
+
123
+ export const booleanFieldDefinitionValidator = v.object({
124
+ ...baseFieldDefinition,
125
+ type: v.literal("boolean"),
126
+ options: v.optional(v.object({
127
+ trueLabel: v.optional(v.string()),
128
+ falseLabel: v.optional(v.string()),
129
+ })),
130
+ });
131
+
132
+ export const richTextFieldDefinitionValidator = v.object({
133
+ ...baseFieldDefinition,
134
+ type: v.literal("richText"),
135
+ options: v.optional(v.object({
136
+ allowedBlocks: v.optional(v.array(v.string())),
137
+ allowedMarks: v.optional(v.array(v.string())),
138
+ })),
139
+ });
140
+
141
+ export const mediaFieldDefinitionValidator = v.object({
142
+ ...baseFieldDefinition,
143
+ type: v.literal("media"),
144
+ options: v.optional(v.object({
145
+ mediaType: v.optional(mediaTypeValidator),
146
+ allowedMimeTypes: v.optional(v.array(v.string())),
147
+ maxFileSize: v.optional(v.number()),
148
+ multiple: v.optional(v.boolean()),
149
+ })),
150
+ });
151
+
152
+ export const selectFieldDefinitionValidator = v.object({
153
+ ...baseFieldDefinition,
154
+ type: v.literal("select"),
155
+ options: v.optional(v.object({
156
+ options: v.optional(
157
+ v.array(
158
+ v.object({
159
+ value: v.string(),
160
+ label: v.string(),
161
+ }),
162
+ ),
163
+ ),
164
+ })),
165
+ });
166
+
167
+ export const tagsFieldDefinitionValidator = v.object({
168
+ ...baseFieldDefinition,
169
+ type: v.literal("tags"),
170
+ options: v.optional(v.object({
171
+ taxonomyId: v.optional(v.id("taxonomies")),
172
+ allowCreate: v.optional(v.boolean()),
173
+ maxTags: v.optional(v.number()),
174
+ minTags: v.optional(v.number()),
175
+ })),
176
+ });
177
+
178
+ export const categoryFieldDefinitionValidator = v.object({
179
+ ...baseFieldDefinition,
180
+ type: v.literal("category"),
181
+ options: v.optional(v.object({
182
+ allowMultiple: v.optional(v.boolean()),
183
+ })),
184
+ });
185
+
186
+ export const jsonFieldDefinitionValidator = v.object({
187
+ ...baseFieldDefinition,
188
+ type: v.literal("json"),
189
+ options: v.optional(v.object({
190
+ schema: v.optional(v.any()),
191
+ })),
192
+ });
193
+
194
+ export const referenceFieldDefinitionValidator = v.object({
195
+ ...baseFieldDefinition,
196
+ type: v.literal("reference"),
197
+ options: v.optional(v.object({
198
+ allowedContentTypes: v.optional(v.array(v.string())),
199
+ multiple: v.optional(v.boolean()),
200
+ minItems: v.optional(v.number()),
201
+ })),
202
+ });
203
+
204
+ export const multiSelectFieldDefinitionValidator = v.object({
205
+ ...baseFieldDefinition,
206
+ type: v.literal("multiSelect"),
207
+ options: v.optional(v.object({
208
+ options: v.optional(
209
+ v.array(
210
+ v.object({
211
+ value: v.string(),
212
+ label: v.string(),
213
+ }),
214
+ ),
215
+ ),
216
+ })),
217
+ });
218
+
219
+ export const dateFieldDefinitionValidator = v.object({
220
+ ...baseFieldDefinition,
221
+ type: v.literal("date"),
222
+ options: v.optional(v.object({
223
+ min: v.optional(v.number()),
224
+ max: v.optional(v.number()),
225
+ })),
226
+ });
227
+
228
+ export const datetimeFieldDefinitionValidator = v.object({
229
+ ...baseFieldDefinition,
230
+ type: v.literal("datetime"),
231
+ options: v.optional(v.object({
232
+ min: v.optional(v.number()),
233
+ max: v.optional(v.number()),
234
+ })),
235
+ });
236
+
237
+ export const fieldDefinitionValidator = v.union(
238
+ textFieldDefinitionValidator,
239
+ numberFieldDefinitionValidator,
240
+ booleanFieldDefinitionValidator,
241
+ richTextFieldDefinitionValidator,
242
+ mediaFieldDefinitionValidator,
243
+ selectFieldDefinitionValidator,
244
+ multiSelectFieldDefinitionValidator,
245
+ tagsFieldDefinitionValidator,
246
+ categoryFieldDefinitionValidator,
247
+ jsonFieldDefinitionValidator,
248
+ dateFieldDefinitionValidator,
249
+ datetimeFieldDefinitionValidator,
250
+ referenceFieldDefinitionValidator,
251
+ );
252
+
253
+ const contentTypeFields = {
254
+ name: v.string(),
255
+ displayName: v.string(),
256
+ createdBy: v.string(),
257
+ description: v.optional(v.string()),
258
+ fields: v.array(fieldDefinitionValidator),
259
+ icon: v.optional(v.string()),
260
+ singleton: v.optional(v.boolean()),
261
+ slugField: v.optional(v.string()),
262
+ titleField: v.optional(v.string()),
263
+ sortOrder: v.optional(v.number()),
264
+ isActive: v.boolean(),
265
+ deletedAt: v.optional(v.number()),
266
+ updatedBy: v.optional(v.string()),
267
+ };
268
+
269
+ const contentEntryFields = {
270
+ contentTypeId: v.id("contentTypes"),
271
+ slug: v.string(),
272
+ status: contentStatusValidator,
273
+ data: v.any(),
274
+ locale: v.optional(v.string()),
275
+ primaryEntryId: v.optional(v.id("contentEntries")),
276
+ version: v.number(),
277
+ scheduledPublishAt: v.optional(v.number()),
278
+ firstPublishedAt: v.optional(v.number()),
279
+ lastPublishedAt: v.optional(v.number()),
280
+ lockedBy: v.optional(v.string()),
281
+ lockExpiresAt: v.optional(v.number()),
282
+ deletedAt: v.optional(v.number()),
283
+ createdBy: v.optional(v.string()),
284
+ updatedBy: v.optional(v.string()),
285
+ searchText: v.optional(v.string()),
286
+ };
287
+
288
+ const contentVersionFields = {
289
+ entryId: v.id("contentEntries"),
290
+ versionNumber: v.number(),
291
+ data: v.any(),
292
+ slug: v.string(),
293
+ status: contentStatusValidator,
294
+ changeDescription: v.optional(v.string()),
295
+ createdBy: v.optional(v.string()),
296
+ wasPublished: v.boolean(),
297
+ publishedAt: v.optional(v.number()),
298
+ };
299
+
300
+ const mediaItemBaseFields = {
301
+ name: v.string(),
302
+ title: v.optional(v.string()),
303
+ description: v.optional(v.string()),
304
+ parentId: v.optional(v.id("mediaItems")),
305
+ path: v.string(),
306
+ tags: v.optional(v.array(v.string())),
307
+ size: v.optional(v.number()),
308
+ metadata: v.optional(v.record(v.string(), v.any())),
309
+ deletedAt: v.optional(v.number()),
310
+ createdBy: v.optional(v.string()),
311
+ updatedBy: v.optional(v.string()),
312
+ searchText: v.optional(v.string()),
313
+ };
314
+
315
+ const mediaAssetSpecificFields = {
316
+ kind: v.literal("asset"),
317
+ storageId: v.id("_storage"),
318
+ mimeType: v.string(),
319
+ width: v.optional(v.number()),
320
+ height: v.optional(v.number()),
321
+ duration: v.optional(v.number()),
322
+ altText: v.optional(v.string()),
323
+ };
324
+
325
+ const mediaFolderSpecificFields = {
326
+ kind: v.literal("folder"),
327
+ sortOrder: v.optional(v.number()),
328
+ };
329
+
330
+ export const mediaAssetItemValidator = v.object({
331
+ ...mediaItemBaseFields,
332
+ ...mediaAssetSpecificFields,
333
+ });
334
+
335
+ export const mediaFolderItemValidator = v.object({
336
+ ...mediaItemBaseFields,
337
+ ...mediaFolderSpecificFields,
338
+ });
339
+
340
+ export const mediaItemValidator = v.union(
341
+ mediaAssetItemValidator,
342
+ mediaFolderItemValidator,
343
+ );
344
+
345
+ const mediaVariantFields = {
346
+ assetId: v.id("mediaItems"),
347
+ storageId: v.id("_storage"),
348
+ variantType: v.union(
349
+ v.literal("thumbnail"),
350
+ v.literal("responsive"),
351
+ v.literal("format"),
352
+ ),
353
+ width: v.optional(v.number()),
354
+ height: v.optional(v.number()),
355
+ format: v.string(),
356
+ mimeType: v.string(),
357
+ size: v.number(),
358
+ quality: v.optional(v.number()),
359
+ preset: v.optional(v.string()),
360
+ autoGenerated: v.boolean(),
361
+ status: v.union(
362
+ v.literal("pending"),
363
+ v.literal("processing"),
364
+ v.literal("completed"),
365
+ v.literal("failed"),
366
+ ),
367
+ errorMessage: v.optional(v.string()),
368
+ processingStartedAt: v.optional(v.number()),
369
+ processingCompletedAt: v.optional(v.number()),
370
+ deletedAt: v.optional(v.number()),
371
+ createdBy: v.optional(v.string()),
372
+ };
373
+
374
+ const taxonomyFields = {
375
+ name: v.string(),
376
+ displayName: v.string(),
377
+ description: v.optional(v.string()),
378
+ isHierarchical: v.boolean(),
379
+ allowInlineCreation: v.boolean(),
380
+ icon: v.optional(v.string()),
381
+ sortOrder: v.optional(v.number()),
382
+ isActive: v.boolean(),
383
+ deletedAt: v.optional(v.number()),
384
+ createdBy: v.optional(v.string()),
385
+ updatedBy: v.optional(v.string()),
386
+ };
387
+
388
+ const taxonomyTermFields = {
389
+ taxonomyId: v.id("taxonomies"),
390
+ slug: v.string(),
391
+ name: v.string(),
392
+ description: v.optional(v.string()),
393
+ parentId: v.optional(v.id("taxonomyTerms")),
394
+ path: v.optional(v.string()),
395
+ depth: v.number(),
396
+ color: v.optional(v.string()),
397
+ icon: v.optional(v.string()),
398
+ sortOrder: v.optional(v.number()),
399
+ usageCount: v.number(),
400
+ deletedAt: v.optional(v.number()),
401
+ createdBy: v.optional(v.string()),
402
+ updatedBy: v.optional(v.string()),
403
+ searchText: v.optional(v.string()),
404
+ };
405
+
406
+ const schema = defineSchema({
407
+ contentTypes: defineTable({
408
+ ...contentTypeFields,
409
+ })
410
+ .index("by_name", ["name"])
411
+ .index("by_active", ["isActive"])
412
+ .index("by_deleted", ["deletedAt"]),
413
+ contentEntries: defineTable({
414
+ ...contentEntryFields,
415
+ })
416
+ .index("by_content_type", ["contentTypeId"])
417
+ .index("by_content_type_and_slug", ["contentTypeId", "slug"])
418
+ .index("by_status", ["status"])
419
+ .index("by_content_type_and_status", ["contentTypeId", "status"])
420
+ .index("by_primary_entry", ["primaryEntryId"])
421
+ .index("by_locale", ["locale"])
422
+ .index("by_deleted", ["deletedAt"])
423
+ .index("by_scheduled_publish", ["status", "scheduledPublishAt"])
424
+ .index("by_locked", ["lockedBy"])
425
+ .searchIndex("search_content", {
426
+ searchField: "searchText",
427
+ filterFields: ["contentTypeId", "status", "locale"],
428
+ }),
429
+ contentVersions: defineTable({
430
+ ...contentVersionFields,
431
+ })
432
+ .index("by_entry", ["entryId"])
433
+ .index("by_entry_and_version", ["entryId", "versionNumber"])
434
+ .index("by_entry_and_published", ["entryId", "wasPublished"]),
435
+ mediaItems: defineTable(
436
+ v.union(
437
+ v.object({
438
+ ...mediaItemBaseFields,
439
+ ...mediaAssetSpecificFields,
440
+ }),
441
+ v.object({
442
+ ...mediaItemBaseFields,
443
+ ...mediaFolderSpecificFields,
444
+ }),
445
+ ),
446
+ )
447
+ .index("by_parent", ["parentId"])
448
+ .index("by_path", ["path"])
449
+ .index("by_kind", ["kind"])
450
+ .index("by_kind_and_parent", ["kind", "parentId"])
451
+ .index("by_storage_id", ["storageId"])
452
+ .index("by_mime_type", ["mimeType"])
453
+ .index("by_deleted", ["deletedAt"])
454
+ .searchIndex("search_media", {
455
+ searchField: "searchText",
456
+ }),
457
+ mediaVariants: defineTable({
458
+ ...mediaVariantFields,
459
+ })
460
+ .index("by_asset", ["assetId"])
461
+ .index("by_asset_and_type", ["assetId", "variantType"])
462
+ .index("by_asset_and_preset", ["assetId", "preset"])
463
+ .index("by_asset_and_format", ["assetId", "format"])
464
+ .index("by_status", ["status"])
465
+ .index("by_deleted", ["deletedAt"]),
466
+ taxonomies: defineTable({
467
+ ...taxonomyFields,
468
+ })
469
+ .index("by_name", ["name"])
470
+ .index("by_active", ["isActive"])
471
+ .index("by_deleted", ["deletedAt"]),
472
+ taxonomyTerms: defineTable({
473
+ ...taxonomyTermFields,
474
+ })
475
+ .index("by_taxonomy", ["taxonomyId"])
476
+ .index("by_taxonomy_and_slug", ["taxonomyId", "slug"])
477
+ .index("by_parent", ["parentId"])
478
+ .index("by_taxonomy_and_path", ["taxonomyId", "path"])
479
+ .index("by_deleted", ["deletedAt"])
480
+ .index("by_taxonomy_and_usage", ["taxonomyId", "usageCount"])
481
+ .searchIndex("search_terms", {
482
+ searchField: "searchText",
483
+ filterFields: ["taxonomyId"],
484
+ }),
485
+ contentEntryTags: defineTable({
486
+ entryId: v.id("contentEntries"),
487
+ termId: v.id("taxonomyTerms"),
488
+ taxonomyId: v.id("taxonomies"),
489
+ fieldName: v.string(),
490
+ sortOrder: v.optional(v.number()),
491
+ })
492
+ .index("by_entry", ["entryId"])
493
+ .index("by_term", ["termId"])
494
+ .index("by_taxonomy", ["taxonomyId"])
495
+ .index("by_entry_and_field", ["entryId", "fieldName"])
496
+ .index("by_taxonomy_and_term", ["taxonomyId", "termId"]),
497
+ mediaAssetTags: defineTable({
498
+ mediaId: v.id("mediaItems"),
499
+ termId: v.id("taxonomyTerms"),
500
+ taxonomyId: v.id("taxonomies"),
501
+ sortOrder: v.optional(v.number()),
502
+ })
503
+ .index("by_media", ["mediaId"])
504
+ .index("by_term", ["termId"])
505
+ .index("by_taxonomy", ["taxonomyId"])
506
+ .index("by_media_and_taxonomy", ["mediaId", "taxonomyId"])
507
+ .index("by_taxonomy_and_term", ["taxonomyId", "termId"]),
508
+ trashConfig: defineTable({
509
+ retentionDays: v.number(),
510
+ autoCleanupEnabled: v.boolean(),
511
+ lastCleanupAt: v.optional(v.number()),
512
+ lastCleanupCount: v.optional(v.number()),
513
+ updatedBy: v.optional(v.string()),
514
+ }),
515
+ cmsEvents: defineTable({
516
+ eventType: v.string(),
517
+ resourceType: v.union(
518
+ v.literal("contentEntry"),
519
+ v.literal("contentType"),
520
+ v.literal("mediaAsset"),
521
+ v.literal("mediaFolder"),
522
+ ),
523
+ resourceId: v.string(),
524
+ action: v.union(
525
+ v.literal("created"),
526
+ v.literal("updated"),
527
+ v.literal("published"),
528
+ v.literal("unpublished"),
529
+ v.literal("deleted"),
530
+ v.literal("restored"),
531
+ v.literal("duplicated"),
532
+ v.literal("scheduled"),
533
+ ),
534
+ payload: v.any(),
535
+ userId: v.optional(v.string()),
536
+ processed: v.boolean(),
537
+ processedAt: v.optional(v.number()),
538
+ correlationId: v.optional(v.string()),
539
+ metadata: v.optional(v.any()),
540
+ })
541
+ .index("by_event_type", ["eventType"])
542
+ .index("by_resource", ["resourceType", "resourceId"])
543
+ .index("by_processed", ["processed"])
544
+ .index("by_user", ["userId"])
545
+ .index("by_correlation_id", ["correlationId"]),
546
+ webhookConfigs: defineTable({
547
+ name: v.string(),
548
+ description: v.optional(v.string()),
549
+ url: v.string(),
550
+ secret: v.optional(v.string()),
551
+ eventTypes: v.array(v.string()),
552
+ resourceTypes: v.optional(
553
+ v.array(
554
+ v.union(
555
+ v.literal("contentEntry"),
556
+ v.literal("contentType"),
557
+ v.literal("mediaAsset"),
558
+ v.literal("mediaFolder"),
559
+ ),
560
+ ),
561
+ ),
562
+ contentTypes: v.optional(v.array(v.string())),
563
+ headers: v.optional(v.any()),
564
+ enabled: v.boolean(),
565
+ maxRetries: v.optional(v.number()),
566
+ timeoutMs: v.optional(v.number()),
567
+ deletedAt: v.optional(v.number()),
568
+ createdBy: v.optional(v.string()),
569
+ updatedBy: v.optional(v.string()),
570
+ })
571
+ .index("by_enabled", ["enabled"])
572
+ .index("by_deleted", ["deletedAt"]),
573
+ webhookDeliveries: defineTable({
574
+ webhookId: v.id("webhookConfigs"),
575
+ eventId: v.id("cmsEvents"),
576
+ eventType: v.string(),
577
+ status: v.union(
578
+ v.literal("pending"),
579
+ v.literal("processing"),
580
+ v.literal("delivered"),
581
+ v.literal("failed"),
582
+ v.literal("retrying"),
583
+ ),
584
+ attemptCount: v.number(),
585
+ maxAttempts: v.number(),
586
+ lastAttemptAt: v.optional(v.number()),
587
+ nextRetryAt: v.optional(v.number()),
588
+ lastStatusCode: v.optional(v.number()),
589
+ lastError: v.optional(v.string()),
590
+ lastResponseBody: v.optional(v.string()),
591
+ lastDurationMs: v.optional(v.number()),
592
+ payload: v.any(),
593
+ deliveredAt: v.optional(v.number()),
594
+ })
595
+ .index("by_webhook", ["webhookId"])
596
+ .index("by_event", ["eventId"])
597
+ .index("by_status", ["status"])
598
+ .index("by_next_retry", ["status", "nextRetryAt"])
599
+ .index("by_webhook_and_status", ["webhookId", "status"]),
600
+ });
601
+
602
+ export default schema;
603
+
604
+ export const {
605
+ contentTypes,
606
+ contentEntries,
607
+ contentVersions,
608
+ mediaItems,
609
+ mediaVariants,
610
+ taxonomies,
611
+ taxonomyTerms,
612
+ contentEntryTags,
613
+ mediaAssetTags,
614
+ cmsEvents,
615
+ webhookConfigs,
616
+ webhookDeliveries,
617
+ } = schema.tables;