convex-cms 0.0.1 → 0.0.3

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 (267) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +99 -0
  3. package/admin-dist/nitro.json +15 -0
  4. package/admin-dist/public/assets/CmsEmptyState-CRswfTzk.js +5 -0
  5. package/admin-dist/public/assets/CmsPageHeader-CirpXndm.js +1 -0
  6. package/admin-dist/public/assets/CmsStatusBadge-CbEUpQu-.js +1 -0
  7. package/admin-dist/public/assets/CmsToolbar-BI2nZOXp.js +1 -0
  8. package/admin-dist/public/assets/ContentEntryEditor-CBeCyK_m.js +4 -0
  9. package/admin-dist/public/assets/ErrorState-BIVaWmom.js +1 -0
  10. package/admin-dist/public/assets/TaxonomyFilter-ChaY6Y_x.js +1 -0
  11. package/admin-dist/public/assets/_contentTypeId-DQ8k_Rvw.js +1 -0
  12. package/admin-dist/public/assets/_entryId-CKU_glsK.js +1 -0
  13. package/admin-dist/public/assets/alert-BXjTqrwQ.js +1 -0
  14. package/admin-dist/public/assets/badge-hvUOzpVZ.js +1 -0
  15. package/admin-dist/public/assets/circle-check-big-CF_pR17r.js +1 -0
  16. package/admin-dist/public/assets/command-DU82cJlt.js +1 -0
  17. package/admin-dist/public/assets/content-_LXl3pp7.js +1 -0
  18. package/admin-dist/public/assets/content-types-KjxaXGxY.js +2 -0
  19. package/admin-dist/public/assets/globals-CS6BZ0zp.css +1 -0
  20. package/admin-dist/public/assets/index-DNGIZHL-.js +1 -0
  21. package/admin-dist/public/assets/label-KNtpL71g.js +1 -0
  22. package/admin-dist/public/assets/link-2-Bw2aI4V4.js +1 -0
  23. package/admin-dist/public/assets/list-sYepHjt_.js +1 -0
  24. package/admin-dist/public/assets/main-CKj5yfEi.js +97 -0
  25. package/admin-dist/public/assets/media-Bkrkffm7.js +1 -0
  26. package/admin-dist/public/assets/new._contentTypeId-C3LstjNs.js +1 -0
  27. package/admin-dist/public/assets/plus-DUn8v_Xf.js +1 -0
  28. package/admin-dist/public/assets/rotate-ccw-DJEoHcRI.js +1 -0
  29. package/admin-dist/public/assets/scroll-area-DfIlT0in.js +1 -0
  30. package/admin-dist/public/assets/search-MuAUDJKR.js +1 -0
  31. package/admin-dist/public/assets/select-BD29IXCI.js +1 -0
  32. package/admin-dist/public/assets/settings-DmMyn_6A.js +1 -0
  33. package/admin-dist/public/assets/switch-h3Rrnl5i.js +1 -0
  34. package/admin-dist/public/assets/tabs-imc8h-Dp.js +1 -0
  35. package/admin-dist/public/assets/taxonomies-dAsrT65H.js +1 -0
  36. package/admin-dist/public/assets/textarea-BTy7nwzR.js +1 -0
  37. package/admin-dist/public/assets/trash-SAWKZZHv.js +1 -0
  38. package/admin-dist/public/assets/triangle-alert-E52Vfeuh.js +1 -0
  39. package/admin-dist/public/assets/useBreadcrumbLabel-BECBMCzM.js +1 -0
  40. package/admin-dist/public/assets/usePermissions-Basjs9BT.js +1 -0
  41. package/admin-dist/public/favicon.ico +0 -0
  42. package/admin-dist/server/_chunks/_libs/@date-fns/tz.mjs +217 -0
  43. package/admin-dist/server/_chunks/_libs/@floating-ui/core.mjs +719 -0
  44. package/admin-dist/server/_chunks/_libs/@floating-ui/dom.mjs +622 -0
  45. package/admin-dist/server/_chunks/_libs/@floating-ui/react-dom.mjs +292 -0
  46. package/admin-dist/server/_chunks/_libs/@floating-ui/utils.mjs +320 -0
  47. package/admin-dist/server/_chunks/_libs/@radix-ui/number.mjs +6 -0
  48. package/admin-dist/server/_chunks/_libs/@radix-ui/primitive.mjs +11 -0
  49. package/admin-dist/server/_chunks/_libs/@radix-ui/react-arrow.mjs +23 -0
  50. package/admin-dist/server/_chunks/_libs/@radix-ui/react-avatar.mjs +119 -0
  51. package/admin-dist/server/_chunks/_libs/@radix-ui/react-checkbox.mjs +270 -0
  52. package/admin-dist/server/_chunks/_libs/@radix-ui/react-collection.mjs +69 -0
  53. package/admin-dist/server/_chunks/_libs/@radix-ui/react-compose-refs.mjs +39 -0
  54. package/admin-dist/server/_chunks/_libs/@radix-ui/react-context.mjs +137 -0
  55. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dialog.mjs +325 -0
  56. package/admin-dist/server/_chunks/_libs/@radix-ui/react-direction.mjs +9 -0
  57. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dismissable-layer.mjs +210 -0
  58. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dropdown-menu.mjs +253 -0
  59. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-guards.mjs +29 -0
  60. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-scope.mjs +206 -0
  61. package/admin-dist/server/_chunks/_libs/@radix-ui/react-id.mjs +14 -0
  62. package/admin-dist/server/_chunks/_libs/@radix-ui/react-label.mjs +23 -0
  63. package/admin-dist/server/_chunks/_libs/@radix-ui/react-menu.mjs +812 -0
  64. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popover.mjs +300 -0
  65. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popper.mjs +286 -0
  66. package/admin-dist/server/_chunks/_libs/@radix-ui/react-portal.mjs +16 -0
  67. package/admin-dist/server/_chunks/_libs/@radix-ui/react-presence.mjs +128 -0
  68. package/admin-dist/server/_chunks/_libs/@radix-ui/react-primitive.mjs +141 -0
  69. package/admin-dist/server/_chunks/_libs/@radix-ui/react-roving-focus.mjs +224 -0
  70. package/admin-dist/server/_chunks/_libs/@radix-ui/react-scroll-area.mjs +721 -0
  71. package/admin-dist/server/_chunks/_libs/@radix-ui/react-select.mjs +1163 -0
  72. package/admin-dist/server/_chunks/_libs/@radix-ui/react-separator.mjs +28 -0
  73. package/admin-dist/server/_chunks/_libs/@radix-ui/react-slot.mjs +601 -0
  74. package/admin-dist/server/_chunks/_libs/@radix-ui/react-switch.mjs +152 -0
  75. package/admin-dist/server/_chunks/_libs/@radix-ui/react-tabs.mjs +189 -0
  76. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-callback-ref.mjs +11 -0
  77. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-controllable-state.mjs +69 -0
  78. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-effect-event.mjs +1 -0
  79. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-escape-keydown.mjs +17 -0
  80. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-is-hydrated.mjs +15 -0
  81. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-layout-effect.mjs +6 -0
  82. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-previous.mjs +14 -0
  83. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-size.mjs +39 -0
  84. package/admin-dist/server/_chunks/_libs/@radix-ui/react-visually-hidden.mjs +33 -0
  85. package/admin-dist/server/_chunks/_libs/@tanstack/history.mjs +409 -0
  86. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +1711 -0
  87. package/admin-dist/server/_chunks/_libs/@tanstack/react-store.mjs +56 -0
  88. package/admin-dist/server/_chunks/_libs/@tanstack/router-core.mjs +4829 -0
  89. package/admin-dist/server/_chunks/_libs/@tanstack/store.mjs +134 -0
  90. package/admin-dist/server/_chunks/_libs/react-dom.mjs +10781 -0
  91. package/admin-dist/server/_chunks/_libs/react.mjs +513 -0
  92. package/admin-dist/server/_libs/aria-hidden.mjs +122 -0
  93. package/admin-dist/server/_libs/class-variance-authority.mjs +44 -0
  94. package/admin-dist/server/_libs/clsx.mjs +16 -0
  95. package/admin-dist/server/_libs/cmdk.mjs +315 -0
  96. package/admin-dist/server/_libs/convex.mjs +4841 -0
  97. package/admin-dist/server/_libs/cookie-es.mjs +58 -0
  98. package/admin-dist/server/_libs/croner.mjs +1 -0
  99. package/admin-dist/server/_libs/crossws.mjs +1 -0
  100. package/admin-dist/server/_libs/date-fns.mjs +1716 -0
  101. package/admin-dist/server/_libs/detect-node-es.mjs +1 -0
  102. package/admin-dist/server/_libs/get-nonce.mjs +9 -0
  103. package/admin-dist/server/_libs/h3-v2.mjs +277 -0
  104. package/admin-dist/server/_libs/h3.mjs +401 -0
  105. package/admin-dist/server/_libs/hookable.mjs +1 -0
  106. package/admin-dist/server/_libs/isbot.mjs +20 -0
  107. package/admin-dist/server/_libs/lucide-react.mjs +850 -0
  108. package/admin-dist/server/_libs/ohash.mjs +1 -0
  109. package/admin-dist/server/_libs/react-day-picker.mjs +2201 -0
  110. package/admin-dist/server/_libs/react-remove-scroll-bar.mjs +82 -0
  111. package/admin-dist/server/_libs/react-remove-scroll.mjs +328 -0
  112. package/admin-dist/server/_libs/react-style-singleton.mjs +69 -0
  113. package/admin-dist/server/_libs/rou3.mjs +8 -0
  114. package/admin-dist/server/_libs/seroval-plugins.mjs +58 -0
  115. package/admin-dist/server/_libs/seroval.mjs +1765 -0
  116. package/admin-dist/server/_libs/srvx.mjs +719 -0
  117. package/admin-dist/server/_libs/tailwind-merge.mjs +3010 -0
  118. package/admin-dist/server/_libs/tiny-invariant.mjs +12 -0
  119. package/admin-dist/server/_libs/tiny-warning.mjs +5 -0
  120. package/admin-dist/server/_libs/tslib.mjs +39 -0
  121. package/admin-dist/server/_libs/ufo.mjs +54 -0
  122. package/admin-dist/server/_libs/unctx.mjs +1 -0
  123. package/admin-dist/server/_libs/unstorage.mjs +1 -0
  124. package/admin-dist/server/_libs/use-callback-ref.mjs +66 -0
  125. package/admin-dist/server/_libs/use-sidecar.mjs +106 -0
  126. package/admin-dist/server/_libs/use-sync-external-store.mjs +139 -0
  127. package/admin-dist/server/_libs/zod.mjs +4223 -0
  128. package/admin-dist/server/_ssr/CmsEmptyState-DU7-7-mV.mjs +290 -0
  129. package/admin-dist/server/_ssr/CmsPageHeader-CseW0AHm.mjs +24 -0
  130. package/admin-dist/server/_ssr/CmsStatusBadge-B_pi4KCp.mjs +127 -0
  131. package/admin-dist/server/_ssr/CmsToolbar-X75ex6ek.mjs +49 -0
  132. package/admin-dist/server/_ssr/ContentEntryEditor-CepusRsA.mjs +3720 -0
  133. package/admin-dist/server/_ssr/ErrorState-cI-bKLez.mjs +89 -0
  134. package/admin-dist/server/_ssr/TaxonomyFilter-Bwrq0-cz.mjs +188 -0
  135. package/admin-dist/server/_ssr/_contentTypeId-BqYKEcLr.mjs +379 -0
  136. package/admin-dist/server/_ssr/_entryId-CRfnqeDf.mjs +161 -0
  137. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BwDlABVk.mjs +4 -0
  138. package/admin-dist/server/_ssr/alert-CVt45UUP.mjs +92 -0
  139. package/admin-dist/server/_ssr/badge-6BsP37vG.mjs +125 -0
  140. package/admin-dist/server/_ssr/command-fy8epIKf.mjs +128 -0
  141. package/admin-dist/server/_ssr/config.server-D7JHDcDv.mjs +117 -0
  142. package/admin-dist/server/_ssr/content-B5RhL7uW.mjs +532 -0
  143. package/admin-dist/server/_ssr/content-types-BIOqCQYN.mjs +1166 -0
  144. package/admin-dist/server/_ssr/index-DHSHDPt1.mjs +193 -0
  145. package/admin-dist/server/_ssr/index.mjs +1275 -0
  146. package/admin-dist/server/_ssr/label-C8Dko1j7.mjs +22 -0
  147. package/admin-dist/server/_ssr/media-CSx3XttC.mjs +1832 -0
  148. package/admin-dist/server/_ssr/new._contentTypeId-DzanEZQM.mjs +144 -0
  149. package/admin-dist/server/_ssr/router-DDWcF-kt.mjs +1556 -0
  150. package/admin-dist/server/_ssr/scroll-area-bjPYwhXN.mjs +59 -0
  151. package/admin-dist/server/_ssr/select-BUhDDf4T.mjs +142 -0
  152. package/admin-dist/server/_ssr/settings-DAsxnw2q.mjs +348 -0
  153. package/admin-dist/server/_ssr/start-HYkvq4Ni.mjs +4 -0
  154. package/admin-dist/server/_ssr/switch-BgyRtQ1Z.mjs +31 -0
  155. package/admin-dist/server/_ssr/tabs-DzMdRB1A.mjs +628 -0
  156. package/admin-dist/server/_ssr/taxonomies-C8j8g5Q5.mjs +915 -0
  157. package/admin-dist/server/_ssr/textarea-9jNeYJSc.mjs +18 -0
  158. package/admin-dist/server/_ssr/trash-DYMxwhZB.mjs +291 -0
  159. package/admin-dist/server/_ssr/useBreadcrumbLabel-FNSAr2Ha.mjs +16 -0
  160. package/admin-dist/server/_ssr/usePermissions-BJGGahrJ.mjs +68 -0
  161. package/admin-dist/server/favicon.ico +0 -0
  162. package/admin-dist/server/index.mjs +627 -0
  163. package/dist/cli/index.js +0 -0
  164. package/dist/client/admin-config.d.ts +0 -1
  165. package/dist/client/admin-config.d.ts.map +1 -1
  166. package/dist/client/admin-config.js +0 -1
  167. package/dist/client/admin-config.js.map +1 -1
  168. package/dist/client/adminApi.d.ts.map +1 -1
  169. package/dist/client/agentTools.d.ts +1237 -135
  170. package/dist/client/agentTools.d.ts.map +1 -1
  171. package/dist/client/agentTools.js +33 -9
  172. package/dist/client/agentTools.js.map +1 -1
  173. package/dist/client/index.d.ts +1 -1
  174. package/dist/client/index.d.ts.map +1 -1
  175. package/dist/client/index.js.map +1 -1
  176. package/dist/component/_generated/component.d.ts +9 -0
  177. package/dist/component/_generated/component.d.ts.map +1 -1
  178. package/dist/component/mediaAssets.d.ts +35 -0
  179. package/dist/component/mediaAssets.d.ts.map +1 -1
  180. package/dist/component/mediaAssets.js +81 -0
  181. package/dist/component/mediaAssets.js.map +1 -1
  182. package/dist/test.d.ts.map +1 -1
  183. package/dist/test.js +2 -1
  184. package/dist/test.js.map +1 -1
  185. package/package.json +24 -9
  186. package/dist/component/auditLog.d.ts +0 -410
  187. package/dist/component/auditLog.d.ts.map +0 -1
  188. package/dist/component/auditLog.js +0 -607
  189. package/dist/component/auditLog.js.map +0 -1
  190. package/dist/component/types.d.ts +0 -4
  191. package/dist/component/types.d.ts.map +0 -1
  192. package/dist/component/types.js +0 -2
  193. package/dist/component/types.js.map +0 -1
  194. package/src/cli/commands/admin.ts +0 -104
  195. package/src/cli/index.ts +0 -21
  196. package/src/cli/utils/detectConvexUrl.ts +0 -54
  197. package/src/cli/utils/openBrowser.ts +0 -16
  198. package/src/client/admin-config.ts +0 -138
  199. package/src/client/adminApi.ts +0 -942
  200. package/src/client/agentTools.ts +0 -1311
  201. package/src/client/argTypes.ts +0 -316
  202. package/src/client/field-types.ts +0 -187
  203. package/src/client/index.ts +0 -1301
  204. package/src/client/queryBuilder.ts +0 -1100
  205. package/src/client/schema/codegen.ts +0 -500
  206. package/src/client/schema/defineContentType.ts +0 -501
  207. package/src/client/schema/index.ts +0 -169
  208. package/src/client/schema/schemaDrift.ts +0 -574
  209. package/src/client/schema/typedClient.ts +0 -688
  210. package/src/client/schema/types.ts +0 -666
  211. package/src/client/types.ts +0 -723
  212. package/src/client/workflows.ts +0 -141
  213. package/src/client/wrapper.ts +0 -4304
  214. package/src/component/_generated/api.ts +0 -140
  215. package/src/component/_generated/component.ts +0 -5029
  216. package/src/component/_generated/dataModel.ts +0 -60
  217. package/src/component/_generated/server.ts +0 -156
  218. package/src/component/authorization.ts +0 -647
  219. package/src/component/authorizationHooks.ts +0 -668
  220. package/src/component/bulkOperations.ts +0 -687
  221. package/src/component/contentEntries.ts +0 -1976
  222. package/src/component/contentEntryMutations.ts +0 -1223
  223. package/src/component/contentEntryValidation.ts +0 -707
  224. package/src/component/contentLock.ts +0 -550
  225. package/src/component/contentTypeMigration.ts +0 -1064
  226. package/src/component/contentTypeMutations.ts +0 -969
  227. package/src/component/contentTypes.ts +0 -346
  228. package/src/component/convex.config.ts +0 -44
  229. package/src/component/documentTypes.ts +0 -240
  230. package/src/component/eventEmitter.ts +0 -485
  231. package/src/component/exportImport.ts +0 -1169
  232. package/src/component/index.ts +0 -491
  233. package/src/component/lib/deepReferenceResolver.ts +0 -999
  234. package/src/component/lib/errors.ts +0 -816
  235. package/src/component/lib/index.ts +0 -145
  236. package/src/component/lib/mediaReferenceResolver.ts +0 -495
  237. package/src/component/lib/metadataExtractor.ts +0 -792
  238. package/src/component/lib/mutationAuth.ts +0 -199
  239. package/src/component/lib/queries.ts +0 -79
  240. package/src/component/lib/ragContentChunker.ts +0 -1371
  241. package/src/component/lib/referenceResolver.ts +0 -430
  242. package/src/component/lib/slugGenerator.ts +0 -262
  243. package/src/component/lib/slugUniqueness.ts +0 -333
  244. package/src/component/lib/softDelete.ts +0 -44
  245. package/src/component/localeFallbackChain.ts +0 -673
  246. package/src/component/localeFields.ts +0 -896
  247. package/src/component/mediaAssetMutations.ts +0 -725
  248. package/src/component/mediaAssets.ts +0 -932
  249. package/src/component/mediaFolderMutations.ts +0 -1046
  250. package/src/component/mediaUploadMutations.ts +0 -224
  251. package/src/component/mediaVariantMutations.ts +0 -900
  252. package/src/component/mediaVariants.ts +0 -793
  253. package/src/component/ragContentIndexer.ts +0 -1067
  254. package/src/component/rateLimitHooks.ts +0 -572
  255. package/src/component/roles.ts +0 -1360
  256. package/src/component/scheduledPublish.ts +0 -358
  257. package/src/component/schema.ts +0 -617
  258. package/src/component/taxonomies.ts +0 -949
  259. package/src/component/taxonomyMutations.ts +0 -1210
  260. package/src/component/trash.ts +0 -724
  261. package/src/component/userContext.ts +0 -898
  262. package/src/component/validation.ts +0 -1388
  263. package/src/component/validators.ts +0 -949
  264. package/src/component/versionMutations.ts +0 -392
  265. package/src/component/webhookTrigger.ts +0 -1922
  266. package/src/react/index.ts +0 -898
  267. package/src/test.ts +0 -1580
@@ -1,617 +0,0 @@
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;