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,387 @@
1
+ /**
2
+ * Content Validation Functions
3
+ *
4
+ * Runtime validation helpers that check content data against field configurations.
5
+ * These complement the Convex validators by providing detailed validation logic
6
+ * and human-readable error messages.
7
+ *
8
+ * Supports both plain field values and localized field values (LocalizedFieldValue<T>)
9
+ * for fields marked as `localized: true` in their field definition.
10
+ */
11
+ import { FieldType } from "./validators.js";
12
+ /**
13
+ * Field options structure (matches schema.ts fieldOptionsValidator)
14
+ */
15
+ export interface FieldOptions {
16
+ minLength?: number;
17
+ maxLength?: number;
18
+ pattern?: string;
19
+ min?: number;
20
+ max?: number;
21
+ step?: number;
22
+ precision?: number;
23
+ allowedContentTypes?: string[];
24
+ multiple?: boolean;
25
+ /** Minimum number of references required (only applies when multiple is true) */
26
+ minItems?: number;
27
+ allowedMimeTypes?: string[];
28
+ maxFileSize?: number;
29
+ options?: Array<{
30
+ value: string;
31
+ label: string;
32
+ }>;
33
+ allowedBlocks?: string[];
34
+ allowedMarks?: string[];
35
+ taxonomyId?: string;
36
+ allowCreate?: boolean;
37
+ maxTags?: number;
38
+ minTags?: number;
39
+ allowMultiple?: boolean;
40
+ }
41
+ /**
42
+ * Field definition structure (matches schema.ts fieldDefinitionValidator)
43
+ */
44
+ export interface FieldDefinition {
45
+ name: string;
46
+ label: string;
47
+ type: FieldType;
48
+ required: boolean;
49
+ searchable?: boolean;
50
+ localized?: boolean;
51
+ description?: string;
52
+ defaultValue?: unknown;
53
+ options?: FieldOptions;
54
+ }
55
+ /**
56
+ * Content type schema structure
57
+ */
58
+ export interface ContentTypeSchema {
59
+ name: string;
60
+ displayName: string;
61
+ description?: string;
62
+ fields: FieldDefinition[];
63
+ titleField?: string;
64
+ slugField?: string;
65
+ singleton?: boolean;
66
+ }
67
+ /**
68
+ * Content data is a record of field names to their values
69
+ */
70
+ export type ContentData = Record<string, unknown>;
71
+ export type ValidationError = {
72
+ field: string;
73
+ message: string;
74
+ code: ValidationErrorCode;
75
+ };
76
+ export type ValidationErrorCode = "REQUIRED" | "MIN_LENGTH" | "MAX_LENGTH" | "PATTERN_MISMATCH" | "MIN_VALUE" | "MAX_VALUE" | "NOT_INTEGER" | "MIN_DATE" | "MAX_DATE" | "INVALID_TYPE" | "MIN_ITEMS" | "MAX_ITEMS" | "INVALID_CONTENT_TYPE" | "UNKNOWN_FIELD" | "INVALID_MIME_TYPE" | "FILE_TOO_LARGE" | "INVALID_LOCALIZED_STRUCTURE" | "MISSING_LOCALE";
77
+ export type ValidationResult = {
78
+ valid: true;
79
+ errors: [];
80
+ } | {
81
+ valid: false;
82
+ errors: ValidationError[];
83
+ };
84
+ /**
85
+ * Validate a text field value against its configuration
86
+ */
87
+ export declare function validateTextField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
88
+ /**
89
+ * Validate a rich text field value against its configuration
90
+ */
91
+ export declare function validateRichTextField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
92
+ /**
93
+ * Validate a number field value against its configuration
94
+ */
95
+ export declare function validateNumberField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
96
+ /**
97
+ * Validate a boolean field value against its configuration
98
+ */
99
+ export declare function validateBooleanField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
100
+ /**
101
+ * Validate a date or datetime field value against its configuration
102
+ */
103
+ export declare function validateDateField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
104
+ /**
105
+ * Validate a reference field value against its configuration.
106
+ *
107
+ * Reference fields store IDs to other content entries. They support:
108
+ * - Single reference: `string` (one entry ID)
109
+ * - Multiple references: `string[]` (array of entry IDs) when `multiple: true`
110
+ *
111
+ * Configuration options:
112
+ * - `allowedContentTypes`: Array of content type names that can be referenced
113
+ * - `multiple`: If true, accepts an array of references
114
+ * - `minItems`: Minimum number of references required (only when `multiple: true`)
115
+ * - `max`: Maximum number of references allowed (only when `multiple: true`)
116
+ *
117
+ * @example
118
+ * ```typescript
119
+ * // Single reference to an author
120
+ * const authorField: FieldDefinition = {
121
+ * name: "author",
122
+ * label: "Author",
123
+ * type: "reference",
124
+ * required: true,
125
+ * options: {
126
+ * allowedContentTypes: ["user"],
127
+ * },
128
+ * };
129
+ *
130
+ * // Multiple references to related posts (1-5 required)
131
+ * const relatedPostsField: FieldDefinition = {
132
+ * name: "relatedPosts",
133
+ * label: "Related Posts",
134
+ * type: "reference",
135
+ * required: true,
136
+ * options: {
137
+ * allowedContentTypes: ["blog_post"],
138
+ * multiple: true,
139
+ * minItems: 1,
140
+ * max: 5,
141
+ * },
142
+ * };
143
+ * ```
144
+ */
145
+ export declare function validateReferenceField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
146
+ /**
147
+ * Check if a reference value is valid for a given content type constraint.
148
+ *
149
+ * This is a helper function that can be used in mutation handlers to validate
150
+ * that referenced entries exist and belong to allowed content types.
151
+ *
152
+ * @param referenceId - The content entry ID to validate
153
+ * @param allowedContentTypes - Array of allowed content type names (optional)
154
+ * @param contentTypeLookup - Function to get content type name by entry ID
155
+ * @returns Object with `valid` boolean and optional `error` message
156
+ */
157
+ export declare function validateReferenceContentType(referenceId: string, allowedContentTypes: string[] | undefined, contentTypeLookup: (entryId: string) => Promise<string | null>): Promise<{
158
+ valid: boolean;
159
+ error?: string;
160
+ }>;
161
+ /**
162
+ * Validate a media field value against its configuration.
163
+ *
164
+ * Media fields store IDs to media assets. They support:
165
+ * - Single reference: `string` (one media asset ID)
166
+ * - Multiple references (gallery): `string[]` (array of media asset IDs) when `multiple: true`
167
+ *
168
+ * Configuration options:
169
+ * - `allowedMimeTypes`: Array of allowed MIME types (supports wildcards like "image/*")
170
+ * - `multiple`: If true, accepts an array of references (gallery mode)
171
+ * - `minItems`: Minimum number of media assets required (only when `multiple: true`)
172
+ * - `max`: Maximum number of media assets allowed (only when `multiple: true`)
173
+ * - `maxFileSize`: Maximum file size in bytes (validated at upload time, not here)
174
+ *
175
+ * Note: MIME type validation requires database lookups and is performed by
176
+ * `validateAllMediaReferences` in the mediaReferenceResolver module.
177
+ *
178
+ * @example
179
+ * ```typescript
180
+ * // Single featured image (images only)
181
+ * const featuredImageField: FieldDefinition = {
182
+ * name: "featuredImage",
183
+ * label: "Featured Image",
184
+ * type: "media",
185
+ * required: true,
186
+ * options: {
187
+ * allowedMimeTypes: ["image/*"],
188
+ * },
189
+ * };
190
+ *
191
+ * // Gallery with 2-10 images
192
+ * const galleryField: FieldDefinition = {
193
+ * name: "gallery",
194
+ * label: "Photo Gallery",
195
+ * type: "media",
196
+ * required: true,
197
+ * options: {
198
+ * allowedMimeTypes: ["image/jpeg", "image/png", "image/webp"],
199
+ * multiple: true,
200
+ * minItems: 2,
201
+ * max: 10,
202
+ * },
203
+ * };
204
+ * ```
205
+ */
206
+ export declare function validateMediaField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
207
+ /**
208
+ * Validate a select field value against its configuration
209
+ */
210
+ export declare function validateSelectField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
211
+ /**
212
+ * Validate a multi-select field value against its configuration
213
+ */
214
+ export declare function validateMultiSelectField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
215
+ /**
216
+ * Validate a JSON field value
217
+ */
218
+ export declare function validateJsonField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
219
+ /**
220
+ * Validate a tags field value against its configuration.
221
+ *
222
+ * Tags fields store arrays of taxonomy term IDs for flexible content categorization.
223
+ * They support:
224
+ * - Multiple term selection
225
+ * - Optional inline term creation (when allowCreate is true)
226
+ * - Min/max limits on number of tags
227
+ *
228
+ * Configuration options:
229
+ * - `taxonomyId`: The taxonomy these tags belong to (required at content type level)
230
+ * - `allowCreate`: If true, users can create new tags inline
231
+ * - `minTags`: Minimum number of tags required
232
+ * - `maxTags`: Maximum number of tags allowed
233
+ *
234
+ * @example
235
+ * ```typescript
236
+ * const tagsField: FieldDefinition = {
237
+ * name: "tags",
238
+ * label: "Tags",
239
+ * type: "tags",
240
+ * required: true,
241
+ * options: {
242
+ * taxonomyId: "tags_taxonomy_id",
243
+ * allowCreate: true,
244
+ * minTags: 1,
245
+ * maxTags: 10,
246
+ * },
247
+ * };
248
+ * ```
249
+ */
250
+ export declare function validateTagsField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
251
+ /**
252
+ * Validate a category field value against its configuration.
253
+ *
254
+ * Category fields store taxonomy term IDs for hierarchical content organization.
255
+ * They support:
256
+ * - Single category selection (default)
257
+ * - Multiple category selection (when allowMultiple is true)
258
+ *
259
+ * Configuration options:
260
+ * - `taxonomyId`: The taxonomy these categories belong to (required at content type level)
261
+ * - `allowMultiple`: If true, accepts an array of category IDs
262
+ *
263
+ * @example
264
+ * ```typescript
265
+ * // Single category selection
266
+ * const categoryField: FieldDefinition = {
267
+ * name: "category",
268
+ * label: "Category",
269
+ * type: "category",
270
+ * required: true,
271
+ * options: {
272
+ * taxonomyId: "categories_taxonomy_id",
273
+ * },
274
+ * };
275
+ *
276
+ * // Multiple category selection
277
+ * const categoriesField: FieldDefinition = {
278
+ * name: "categories",
279
+ * label: "Categories",
280
+ * type: "category",
281
+ * required: true,
282
+ * options: {
283
+ * taxonomyId: "categories_taxonomy_id",
284
+ * allowMultiple: true,
285
+ * },
286
+ * };
287
+ * ```
288
+ */
289
+ export declare function validateCategoryField(value: unknown, fieldDef: FieldDefinition): ValidationError[];
290
+ /**
291
+ * Options for validating localized fields.
292
+ */
293
+ export interface LocalizedValidationOptions {
294
+ /**
295
+ * The locale to validate. If provided, only that locale's value is validated
296
+ * for localized fields. If not provided, all locale values are validated.
297
+ */
298
+ locale?: string;
299
+ /**
300
+ * Locales that must have values for required localized fields.
301
+ * If not provided, only checks if at least one locale has a value for required fields.
302
+ */
303
+ requiredLocales?: string[];
304
+ }
305
+ /**
306
+ * Validate a localized field value.
307
+ *
308
+ * For localized fields, the value should be a LocalizedFieldValue structure:
309
+ * `{ "en-US": "Hello", "es-ES": "Hola" }`
310
+ *
311
+ * This function validates:
312
+ * 1. The structure is a valid LocalizedFieldValue
313
+ * 2. Each locale's value passes the field type validation
314
+ * 3. Required locales have values (if specified)
315
+ *
316
+ * @param value - The localized field value to validate
317
+ * @param fieldDef - The field definition
318
+ * @param options - Validation options for localized fields
319
+ * @returns Array of validation errors
320
+ */
321
+ export declare function validateLocalizedFieldValue(value: unknown, fieldDef: FieldDefinition, options?: LocalizedValidationOptions): ValidationError[];
322
+ /**
323
+ * Validate a single field value based on its definition.
324
+ *
325
+ * Handles both localized and non-localized fields:
326
+ * - Non-localized fields: Validates the value directly
327
+ * - Localized fields: Validates the LocalizedFieldValue structure and each locale's value
328
+ *
329
+ * @param value - The field value to validate (plain value or LocalizedFieldValue)
330
+ * @param fieldDef - The field definition
331
+ * @param options - Optional validation options for localized fields
332
+ * @returns Array of validation errors
333
+ */
334
+ export declare function validateFieldValue(value: unknown, fieldDef: FieldDefinition, options?: LocalizedValidationOptions): ValidationError[];
335
+ /**
336
+ * Options for validating content data.
337
+ */
338
+ export interface ContentValidationOptions {
339
+ /**
340
+ * If true, reports unknown fields as errors.
341
+ * If false (default), unknown fields are silently ignored.
342
+ */
343
+ strictFields?: boolean;
344
+ /**
345
+ * Locale to validate for localized fields.
346
+ * If provided, only that locale's values are validated.
347
+ */
348
+ locale?: string;
349
+ /**
350
+ * Locales that must have values for required localized fields.
351
+ */
352
+ requiredLocales?: string[];
353
+ }
354
+ /**
355
+ * Validate content data against a content type schema
356
+ *
357
+ * @param data - The content data to validate
358
+ * @param schema - The content type schema defining expected fields
359
+ * @param options - Validation options
360
+ * @returns ValidationResult with any errors found
361
+ *
362
+ * @example
363
+ * ```typescript
364
+ * // Basic validation
365
+ * const result = validateContentData(data, schema);
366
+ *
367
+ * // Validate with localized field support
368
+ * const result = validateContentData(data, schema, {
369
+ * locale: "en-US",
370
+ * requiredLocales: ["en-US", "es-ES"],
371
+ * });
372
+ * ```
373
+ */
374
+ export declare function validateContentData(data: ContentData, schema: ContentTypeSchema, options?: ContentValidationOptions): ValidationResult;
375
+ /**
376
+ * Apply default values to content data based on field definitions
377
+ */
378
+ export declare function applyFieldDefaults(data: ContentData, schema: ContentTypeSchema): ContentData;
379
+ /**
380
+ * Get the field type from a field definition
381
+ */
382
+ export declare function getFieldType(fieldDef: FieldDefinition): FieldType;
383
+ /**
384
+ * Check if a field is required based on its configuration
385
+ */
386
+ export declare function isFieldRequired(fieldDef: FieldDefinition): boolean;
387
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/component/validation.ts"],"names":[],"mappings":"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"}