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,281 @@
1
+ /**
2
+ * Event Emitter Module
3
+ *
4
+ * Internal system to emit events on content changes (created, updated, published, deleted).
5
+ * Events are stored in the cmsEvents table for async processing by external systems,
6
+ * webhooks, audit logging, and other integrations.
7
+ *
8
+ * Design Philosophy:
9
+ * - Events are emitted synchronously within the same transaction as mutations
10
+ * - This ensures atomicity: if the mutation fails, no event is created
11
+ * - Events are stored for later processing (not real-time pub/sub)
12
+ * - Consumers can poll events or use Convex reactivity to process them
13
+ *
14
+ * Usage:
15
+ * ```typescript
16
+ * // In a mutation handler:
17
+ * await emitEvent(ctx, {
18
+ * eventType: "contentEntry.created",
19
+ * resourceType: "contentEntry",
20
+ * resourceId: entry._id.toString(),
21
+ * action: "created",
22
+ * payload: { slug: entry.slug, contentTypeName: "blog_post" },
23
+ * userId: createdBy,
24
+ * });
25
+ * ```
26
+ */
27
+ import { MutationCtx } from "./_generated/server.js";
28
+ /**
29
+ * Resource types that can emit events.
30
+ */
31
+ export type EventResourceType = "contentEntry" | "contentType" | "mediaAsset" | "mediaFolder";
32
+ /**
33
+ * Actions that can be performed on resources.
34
+ */
35
+ export type EventAction = "created" | "updated" | "published" | "unpublished" | "deleted" | "restored" | "duplicated" | "scheduled";
36
+ /**
37
+ * Full event type combining resource and action.
38
+ */
39
+ export type EventType = `${EventResourceType}.${EventAction}`;
40
+ /**
41
+ * Payload structure for content entry events.
42
+ */
43
+ export interface ContentEntryEventPayload {
44
+ slug: string;
45
+ contentTypeName: string;
46
+ contentTypeId: string;
47
+ status: string;
48
+ version: number;
49
+ locale?: string;
50
+ /** For duplicate events, the source entry ID */
51
+ sourceEntryId?: string;
52
+ /** For scheduled events, the scheduled publish time */
53
+ scheduledPublishAt?: number;
54
+ /** Change description if provided */
55
+ changeDescription?: string;
56
+ }
57
+ /**
58
+ * Payload structure for content type events.
59
+ */
60
+ export interface ContentTypeEventPayload {
61
+ name: string;
62
+ displayName: string;
63
+ fieldCount: number;
64
+ isActive: boolean;
65
+ /** For update events, list of changed field names */
66
+ changedFields?: string[];
67
+ }
68
+ /**
69
+ * Payload structure for media asset events.
70
+ */
71
+ export interface MediaAssetEventPayload {
72
+ name: string;
73
+ mimeType: string;
74
+ type: string;
75
+ size: number;
76
+ parentId?: string;
77
+ path?: string;
78
+ }
79
+ /**
80
+ * Payload structure for media folder events.
81
+ */
82
+ export interface MediaFolderEventPayload {
83
+ name: string;
84
+ path: string;
85
+ parentId?: string;
86
+ }
87
+ /**
88
+ * Union type for all event payloads.
89
+ */
90
+ export type EventPayload = ContentEntryEventPayload | ContentTypeEventPayload | MediaAssetEventPayload | MediaFolderEventPayload;
91
+ /**
92
+ * Parameters for emitting an event.
93
+ */
94
+ export interface EmitEventParams {
95
+ eventType: EventType;
96
+ resourceType: EventResourceType;
97
+ resourceId: string;
98
+ action: EventAction;
99
+ payload: EventPayload;
100
+ userId?: string;
101
+ correlationId?: string;
102
+ metadata?: Record<string, unknown>;
103
+ }
104
+ /**
105
+ * CMS Event document structure (as stored in the database).
106
+ */
107
+ export interface CMSEvent {
108
+ _id: string;
109
+ _creationTime: number;
110
+ eventType: string;
111
+ resourceType: EventResourceType;
112
+ resourceId: string;
113
+ action: EventAction;
114
+ payload: EventPayload;
115
+ userId?: string;
116
+ processed: boolean;
117
+ processedAt?: number;
118
+ correlationId?: string;
119
+ metadata?: Record<string, unknown>;
120
+ }
121
+ /**
122
+ * Internal helper function to emit events within mutation handlers.
123
+ *
124
+ * This function inserts an event record into the cmsEvents table.
125
+ * It's designed to be called from within other mutations to ensure
126
+ * the event is part of the same atomic transaction.
127
+ *
128
+ * @param ctx - The mutation context from Convex
129
+ * @param params - Event parameters
130
+ * @returns The created event ID as a string
131
+ */
132
+ export declare function emitEvent(ctx: MutationCtx, params: EmitEventParams): Promise<string>;
133
+ /**
134
+ * Query to list recent events with optional filtering.
135
+ *
136
+ * @param resourceType - Filter by resource type
137
+ * @param action - Filter by action
138
+ * @param processed - Filter by processed status
139
+ * @param limit - Maximum number of events to return
140
+ *
141
+ * @returns Array of recent events
142
+ */
143
+ export declare const listEvents: import("convex/server").RegisteredQuery<"public", {
144
+ resourceType?: "contentEntry" | "contentType" | "mediaAsset" | "mediaFolder" | undefined;
145
+ action?: "published" | "scheduled" | "created" | "updated" | "unpublished" | "deleted" | "restored" | "duplicated" | undefined;
146
+ processed?: boolean | undefined;
147
+ cursor?: string | undefined;
148
+ limit?: number | undefined;
149
+ }, Promise<{
150
+ events: {
151
+ _id: import("convex/values").GenericId<"cmsEvents">;
152
+ _creationTime: number;
153
+ metadata?: any;
154
+ userId?: string | undefined;
155
+ processedAt?: number | undefined;
156
+ correlationId?: string | undefined;
157
+ eventType: string;
158
+ resourceType: "contentEntry" | "contentType" | "mediaAsset" | "mediaFolder";
159
+ resourceId: string;
160
+ action: "published" | "scheduled" | "created" | "updated" | "unpublished" | "deleted" | "restored" | "duplicated";
161
+ payload: any;
162
+ processed: boolean;
163
+ }[];
164
+ hasMore: boolean;
165
+ }>>;
166
+ /**
167
+ * Query to get events for a specific resource.
168
+ *
169
+ * @param resourceType - The resource type
170
+ * @param resourceId - The resource ID
171
+ * @param limit - Maximum number of events to return
172
+ *
173
+ * @returns Array of events for the resource
174
+ */
175
+ export declare const getResourceEvents: import("convex/server").RegisteredQuery<"public", {
176
+ limit?: number | undefined;
177
+ resourceType: "contentEntry" | "contentType" | "mediaAsset" | "mediaFolder";
178
+ resourceId: string;
179
+ }, Promise<{
180
+ _id: import("convex/values").GenericId<"cmsEvents">;
181
+ _creationTime: number;
182
+ metadata?: any;
183
+ userId?: string | undefined;
184
+ processedAt?: number | undefined;
185
+ correlationId?: string | undefined;
186
+ eventType: string;
187
+ resourceType: "contentEntry" | "contentType" | "mediaAsset" | "mediaFolder";
188
+ resourceId: string;
189
+ action: "published" | "scheduled" | "created" | "updated" | "unpublished" | "deleted" | "restored" | "duplicated";
190
+ payload: any;
191
+ processed: boolean;
192
+ }[]>>;
193
+ /**
194
+ * Query to get unprocessed events for async processing.
195
+ *
196
+ * This is useful for building event processors that handle events
197
+ * asynchronously (e.g., sending webhooks, updating search indexes).
198
+ *
199
+ * @param limit - Maximum number of events to return
200
+ *
201
+ * @returns Array of unprocessed events
202
+ */
203
+ export declare const getUnprocessedEvents: import("convex/server").RegisteredQuery<"public", {
204
+ limit?: number | undefined;
205
+ }, Promise<{
206
+ _id: import("convex/values").GenericId<"cmsEvents">;
207
+ _creationTime: number;
208
+ metadata?: any;
209
+ userId?: string | undefined;
210
+ processedAt?: number | undefined;
211
+ correlationId?: string | undefined;
212
+ eventType: string;
213
+ resourceType: "contentEntry" | "contentType" | "mediaAsset" | "mediaFolder";
214
+ resourceId: string;
215
+ action: "published" | "scheduled" | "created" | "updated" | "unpublished" | "deleted" | "restored" | "duplicated";
216
+ payload: any;
217
+ processed: boolean;
218
+ }[]>>;
219
+ /**
220
+ * Mutation to mark events as processed.
221
+ *
222
+ * This should be called by event processors after successfully
223
+ * handling an event. This enables at-least-once processing semantics.
224
+ *
225
+ * @param eventIds - Array of event IDs to mark as processed
226
+ *
227
+ * @returns Count of events marked as processed
228
+ */
229
+ export declare const markEventsProcessed: import("convex/server").RegisteredMutation<"public", {
230
+ eventIds: import("convex/values").GenericId<"cmsEvents">[];
231
+ }, Promise<{
232
+ processedCount: number;
233
+ }>>;
234
+ /**
235
+ * Internal mutation to emit an event from scheduled functions.
236
+ *
237
+ * This is used by internal scheduled functions that need to emit events
238
+ * but don't have direct access to the emitEvent helper.
239
+ */
240
+ export declare const internalEmitEvent: import("convex/server").RegisteredMutation<"internal", {
241
+ metadata?: any;
242
+ userId?: string | undefined;
243
+ correlationId?: string | undefined;
244
+ eventType: string;
245
+ resourceType: "contentEntry" | "contentType" | "mediaAsset" | "mediaFolder";
246
+ resourceId: string;
247
+ action: "published" | "scheduled" | "created" | "updated" | "unpublished" | "deleted" | "restored" | "duplicated";
248
+ payload: any;
249
+ }, Promise<import("convex/values").GenericId<"cmsEvents">>>;
250
+ /**
251
+ * Mutation to clean up old processed events.
252
+ *
253
+ * Events older than the retention period are permanently deleted.
254
+ * This helps prevent unbounded growth of the events table.
255
+ *
256
+ * @param retentionDays - Number of days to retain processed events (default: 30)
257
+ *
258
+ * @returns Count of events deleted
259
+ */
260
+ export declare const cleanupOldEvents: import("convex/server").RegisteredMutation<"public", {
261
+ retentionDays?: number | undefined;
262
+ }, Promise<{
263
+ deletedCount: number;
264
+ }>>;
265
+ /**
266
+ * Helper function to build a content entry event type string.
267
+ */
268
+ export declare function contentEntryEventType(action: EventAction): EventType;
269
+ /**
270
+ * Helper function to build a content type event type string.
271
+ */
272
+ export declare function contentTypeEventType(action: EventAction): EventType;
273
+ /**
274
+ * Helper function to build a media asset event type string.
275
+ */
276
+ export declare function mediaAssetEventType(action: EventAction): EventType;
277
+ /**
278
+ * Helper function to build a media folder event type string.
279
+ */
280
+ export declare function mediaFolderEventType(action: EventAction): EventType;
281
+ //# sourceMappingURL=eventEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventEmitter.d.ts","sourceRoot":"","sources":["../../src/component/eventEmitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Event Emitter Module
3
+ *
4
+ * Internal system to emit events on content changes (created, updated, published, deleted).
5
+ * Events are stored in the cmsEvents table for async processing by external systems,
6
+ * webhooks, audit logging, and other integrations.
7
+ *
8
+ * Design Philosophy:
9
+ * - Events are emitted synchronously within the same transaction as mutations
10
+ * - This ensures atomicity: if the mutation fails, no event is created
11
+ * - Events are stored for later processing (not real-time pub/sub)
12
+ * - Consumers can poll events or use Convex reactivity to process them
13
+ *
14
+ * Usage:
15
+ * ```typescript
16
+ * // In a mutation handler:
17
+ * await emitEvent(ctx, {
18
+ * eventType: "contentEntry.created",
19
+ * resourceType: "contentEntry",
20
+ * resourceId: entry._id.toString(),
21
+ * action: "created",
22
+ * payload: { slug: entry.slug, contentTypeName: "blog_post" },
23
+ * userId: createdBy,
24
+ * });
25
+ * ```
26
+ */
27
+ import { v } from "convex/values";
28
+ import { mutation, query, internalMutation } from "./_generated/server.js";
29
+ import { eventResourceTypeValidator, eventActionValidator, cmsEventDoc, } from "./validators.js";
30
+ // =============================================================================
31
+ // Internal Event Emission Helper
32
+ // =============================================================================
33
+ /**
34
+ * Internal helper function to emit events within mutation handlers.
35
+ *
36
+ * This function inserts an event record into the cmsEvents table.
37
+ * It's designed to be called from within other mutations to ensure
38
+ * the event is part of the same atomic transaction.
39
+ *
40
+ * @param ctx - The mutation context from Convex
41
+ * @param params - Event parameters
42
+ * @returns The created event ID as a string
43
+ */
44
+ export async function emitEvent(ctx, params) {
45
+ const { eventType, resourceType, resourceId, action, payload, userId, correlationId, metadata, } = params;
46
+ const eventId = await ctx.db.insert("cmsEvents", {
47
+ eventType,
48
+ resourceType,
49
+ resourceId,
50
+ action,
51
+ payload,
52
+ userId,
53
+ processed: false,
54
+ correlationId,
55
+ metadata,
56
+ });
57
+ return eventId;
58
+ }
59
+ // =============================================================================
60
+ // Event Query Functions
61
+ // =============================================================================
62
+ /**
63
+ * Query to list recent events with optional filtering.
64
+ *
65
+ * @param resourceType - Filter by resource type
66
+ * @param action - Filter by action
67
+ * @param processed - Filter by processed status
68
+ * @param limit - Maximum number of events to return
69
+ *
70
+ * @returns Array of recent events
71
+ */
72
+ export const listEvents = query({
73
+ args: {
74
+ resourceType: v.optional(eventResourceTypeValidator),
75
+ action: v.optional(eventActionValidator),
76
+ processed: v.optional(v.boolean()),
77
+ limit: v.optional(v.number()),
78
+ cursor: v.optional(v.string()),
79
+ },
80
+ returns: v.object({
81
+ events: v.array(cmsEventDoc),
82
+ hasMore: v.boolean(),
83
+ }),
84
+ handler: async (ctx, args) => {
85
+ const { resourceType, action, processed, limit = 50 } = args;
86
+ // Collect and filter in memory for other filters
87
+ // (In a production system, you might want more specific indexes)
88
+ let events;
89
+ if (processed !== undefined) {
90
+ events = await ctx.db
91
+ .query("cmsEvents")
92
+ .withIndex("by_processed", (q) => q.eq("processed", processed))
93
+ .order("desc")
94
+ .take(limit * 2);
95
+ }
96
+ else {
97
+ events = await ctx.db
98
+ .query("cmsEvents")
99
+ .order("desc")
100
+ .take(limit * 2);
101
+ }
102
+ // Apply additional filters
103
+ if (resourceType !== undefined) {
104
+ events = events.filter((e) => e.resourceType === resourceType);
105
+ }
106
+ if (action !== undefined) {
107
+ events = events.filter((e) => e.action === action);
108
+ }
109
+ // Limit results
110
+ const limitedEvents = events.slice(0, limit);
111
+ const hasMore = events.length > limit;
112
+ return {
113
+ events: limitedEvents,
114
+ hasMore,
115
+ };
116
+ },
117
+ });
118
+ /**
119
+ * Query to get events for a specific resource.
120
+ *
121
+ * @param resourceType - The resource type
122
+ * @param resourceId - The resource ID
123
+ * @param limit - Maximum number of events to return
124
+ *
125
+ * @returns Array of events for the resource
126
+ */
127
+ export const getResourceEvents = query({
128
+ args: {
129
+ resourceType: eventResourceTypeValidator,
130
+ resourceId: v.string(),
131
+ limit: v.optional(v.number()),
132
+ },
133
+ returns: v.array(cmsEventDoc),
134
+ handler: async (ctx, args) => {
135
+ const { resourceType, resourceId, limit = 50 } = args;
136
+ const events = await ctx.db
137
+ .query("cmsEvents")
138
+ .withIndex("by_resource", (q) => q.eq("resourceType", resourceType).eq("resourceId", resourceId))
139
+ .order("desc")
140
+ .take(limit);
141
+ return events;
142
+ },
143
+ });
144
+ /**
145
+ * Query to get unprocessed events for async processing.
146
+ *
147
+ * This is useful for building event processors that handle events
148
+ * asynchronously (e.g., sending webhooks, updating search indexes).
149
+ *
150
+ * @param limit - Maximum number of events to return
151
+ *
152
+ * @returns Array of unprocessed events
153
+ */
154
+ export const getUnprocessedEvents = query({
155
+ args: {
156
+ limit: v.optional(v.number()),
157
+ },
158
+ returns: v.array(cmsEventDoc),
159
+ handler: async (ctx, args) => {
160
+ const { limit = 100 } = args;
161
+ const events = await ctx.db
162
+ .query("cmsEvents")
163
+ .withIndex("by_processed", (q) => q.eq("processed", false))
164
+ .order("asc") // Process oldest first
165
+ .take(limit);
166
+ return events;
167
+ },
168
+ });
169
+ // =============================================================================
170
+ // Event Mutation Functions
171
+ // =============================================================================
172
+ /**
173
+ * Mutation to mark events as processed.
174
+ *
175
+ * This should be called by event processors after successfully
176
+ * handling an event. This enables at-least-once processing semantics.
177
+ *
178
+ * @param eventIds - Array of event IDs to mark as processed
179
+ *
180
+ * @returns Count of events marked as processed
181
+ */
182
+ export const markEventsProcessed = mutation({
183
+ args: {
184
+ eventIds: v.array(v.id("cmsEvents")),
185
+ },
186
+ returns: v.object({
187
+ processedCount: v.number(),
188
+ }),
189
+ handler: async (ctx, args) => {
190
+ const { eventIds } = args;
191
+ const now = Date.now();
192
+ let processedCount = 0;
193
+ for (const eventId of eventIds) {
194
+ const event = await ctx.db.get(eventId);
195
+ if (event && !event.processed) {
196
+ await ctx.db.patch(eventId, {
197
+ processed: true,
198
+ processedAt: now,
199
+ });
200
+ processedCount++;
201
+ }
202
+ }
203
+ return { processedCount };
204
+ },
205
+ });
206
+ /**
207
+ * Internal mutation to emit an event from scheduled functions.
208
+ *
209
+ * This is used by internal scheduled functions that need to emit events
210
+ * but don't have direct access to the emitEvent helper.
211
+ */
212
+ export const internalEmitEvent = internalMutation({
213
+ args: {
214
+ eventType: v.string(),
215
+ resourceType: v.union(v.literal("contentEntry"), v.literal("contentType"), v.literal("mediaAsset"), v.literal("mediaFolder")),
216
+ resourceId: v.string(),
217
+ action: v.union(v.literal("created"), v.literal("updated"), v.literal("published"), v.literal("unpublished"), v.literal("deleted"), v.literal("restored"), v.literal("duplicated"), v.literal("scheduled")),
218
+ payload: v.any(),
219
+ userId: v.optional(v.string()),
220
+ correlationId: v.optional(v.string()),
221
+ metadata: v.optional(v.any()),
222
+ },
223
+ returns: v.id("cmsEvents"),
224
+ handler: async (ctx, args) => {
225
+ const eventId = await ctx.db.insert("cmsEvents", {
226
+ eventType: args.eventType,
227
+ resourceType: args.resourceType,
228
+ resourceId: args.resourceId,
229
+ action: args.action,
230
+ payload: args.payload,
231
+ userId: args.userId,
232
+ processed: false,
233
+ correlationId: args.correlationId,
234
+ metadata: args.metadata,
235
+ });
236
+ return eventId;
237
+ },
238
+ });
239
+ /**
240
+ * Mutation to clean up old processed events.
241
+ *
242
+ * Events older than the retention period are permanently deleted.
243
+ * This helps prevent unbounded growth of the events table.
244
+ *
245
+ * @param retentionDays - Number of days to retain processed events (default: 30)
246
+ *
247
+ * @returns Count of events deleted
248
+ */
249
+ export const cleanupOldEvents = mutation({
250
+ args: {
251
+ retentionDays: v.optional(v.number()),
252
+ },
253
+ returns: v.object({
254
+ deletedCount: v.number(),
255
+ }),
256
+ handler: async (ctx, args) => {
257
+ const { retentionDays = 30 } = args;
258
+ const cutoffTime = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
259
+ let deletedCount = 0;
260
+ // Get old processed events
261
+ const oldEvents = await ctx.db
262
+ .query("cmsEvents")
263
+ .withIndex("by_processed", (q) => q.eq("processed", true))
264
+ .filter((q) => q.lt(q.field("_creationTime"), cutoffTime))
265
+ .take(1000); // Batch limit for safety
266
+ for (const event of oldEvents) {
267
+ await ctx.db.delete(event._id);
268
+ deletedCount++;
269
+ }
270
+ return { deletedCount };
271
+ },
272
+ });
273
+ // =============================================================================
274
+ // Event Type Builders
275
+ // =============================================================================
276
+ /**
277
+ * Helper function to build a content entry event type string.
278
+ */
279
+ export function contentEntryEventType(action) {
280
+ return `contentEntry.${action}`;
281
+ }
282
+ /**
283
+ * Helper function to build a content type event type string.
284
+ */
285
+ export function contentTypeEventType(action) {
286
+ return `contentType.${action}`;
287
+ }
288
+ /**
289
+ * Helper function to build a media asset event type string.
290
+ */
291
+ export function mediaAssetEventType(action) {
292
+ return `mediaAsset.${action}`;
293
+ }
294
+ /**
295
+ * Helper function to build a media folder event type string.
296
+ */
297
+ export function mediaFolderEventType(action) {
298
+ return `mediaFolder.${action}`;
299
+ }
300
+ //# sourceMappingURL=eventEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../../src/component/eventEmitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAe,MAAM,wBAAwB,CAAC;AACxF,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,WAAW,GACZ,MAAM,iBAAiB,CAAC;AA6HzB,gFAAgF;AAChF,iCAAiC;AACjC,gFAAgF;AAEhF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAgB,EAChB,MAAuB;IAEvB,MAAM,EACJ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,MAAM,EACN,OAAO,EACP,MAAM,EACN,aAAa,EACb,QAAQ,GACT,GAAG,MAAM,CAAC;IAEX,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QAC/C,SAAS;QACT,YAAY;QACZ,UAAU;QACV,MAAM;QACN,OAAO;QACP,MAAM;QACN,SAAS,EAAE,KAAK;QAChB,aAAa;QACb,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC;IAC9B,IAAI,EAAE;QACJ,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACpD,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACxC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAClC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;QAC5B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;KACrB,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAE7D,iDAAiD;QACjD,iEAAiE;QACjE,IAAI,MAAM,CAAC;QACX,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;iBAClB,KAAK,CAAC,WAAW,CAAC;iBAClB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;iBAC9D,KAAK,CAAC,MAAM,CAAC;iBACb,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;iBAClB,KAAK,CAAC,WAAW,CAAC;iBAClB,KAAK,CAAC,MAAM,CAAC;iBACb,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACrB,CAAC;QAED,2BAA2B;QAC3B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACrD,CAAC;QAED,gBAAgB;QAChB,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QAEtC,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,OAAO;SACR,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;IACrC,IAAI,EAAE;QACJ,YAAY,EAAE,0BAA0B;QACxC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC9B;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;IAC7B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;aACxB,KAAK,CAAC,WAAW,CAAC;aAClB,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAC9B,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAChE;aACA,KAAK,CAAC,MAAM,CAAC;aACb,IAAI,CAAC,KAAK,CAAC,CAAC;QAEf,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;IACxC,IAAI,EAAE;QACJ,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC9B;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;IAC7B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;QAE7B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;aACxB,KAAK,CAAC,WAAW,CAAC;aAClB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;aAC1D,KAAK,CAAC,KAAK,CAAC,CAAC,uBAAuB;aACpC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEf,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC;AAEH,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAC1C,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;KACrC;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;KAC3B,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC9B,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;oBAC1B,SAAS,EAAE,IAAI;oBACf,WAAW,EAAE,GAAG;iBACjB,CAAC,CAAC;gBACH,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,cAAc,EAAE,CAAC;IAC5B,CAAC;CACF,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;IAChD,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,YAAY,EAAE,CAAC,CAAC,KAAK,CACnB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACzB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EACxB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CACzB;QACD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EACtB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EACxB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EACrB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CACvB;QACD,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE;QAChB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACrC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;KAC9B;IACD,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC;IAC1B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;YAC/C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACvC,IAAI,EAAE;QACJ,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACtC;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,EAAE,aAAa,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACpE,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,2BAA2B;QAC3B,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE;aAC3B,KAAK,CAAC,WAAW,CAAC;aAClB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;aACzD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,CAAC;aACzD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAyB;QAExC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,YAAY,EAAE,CAAC;QACjB,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,CAAC;IAC1B,CAAC;CACF,CAAC,CAAC;AAEH,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IACvD,OAAO,gBAAgB,MAAM,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACtD,OAAO,eAAe,MAAM,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,OAAO,cAAc,MAAM,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACtD,OAAO,eAAe,MAAM,EAAE,CAAC;AACjC,CAAC"}