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,323 @@
1
+ /**
2
+ * Authorization Module
3
+ *
4
+ * Core permission checking logic that evaluates user roles against requested
5
+ * actions and resources. This module is called internally by all CMS operations
6
+ * to enforce access control.
7
+ *
8
+ * Key concepts:
9
+ * - Users are mapped to roles via the getUserRole hook (configured in ComponentConfig)
10
+ * - Roles have permissions that define what actions can be performed on resources
11
+ * - Permissions can be scoped to "all" (any resource) or "own" (resources created by the user)
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { requirePermission, checkPermission, UnauthorizedError } from './authorization';
16
+ *
17
+ * // In a mutation handler:
18
+ * const userRole = await getUserRole(userId);
19
+ * await requirePermission({
20
+ * userId,
21
+ * role: userRole,
22
+ * resource: 'contentEntries',
23
+ * action: 'update',
24
+ * resourceOwnerId: entry.createdBy,
25
+ * });
26
+ *
27
+ * // Throws UnauthorizedError if permission denied
28
+ * ```
29
+ */
30
+ import { type Resource, type Action, type OwnershipScope, type RoleDefinition } from "./roles.js";
31
+ /**
32
+ * Error codes for authorization failures.
33
+ * These provide machine-readable error classification.
34
+ */
35
+ export type AuthorizationErrorCode = "NO_ROLE" | "UNKNOWN_ROLE" | "PERMISSION_DENIED" | "OWNERSHIP_REQUIRED" | "INVALID_RESOURCE" | "INVALID_ACTION";
36
+ /**
37
+ * Error thrown when a user lacks permission to perform an action.
38
+ *
39
+ * Includes detailed context about the failed authorization check,
40
+ * making it easy to understand why access was denied.
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * try {
45
+ * await requirePermission({ ... });
46
+ * } catch (error) {
47
+ * if (error instanceof UnauthorizedError) {
48
+ * console.log(error.code); // 'PERMISSION_DENIED'
49
+ * console.log(error.resource); // 'contentEntries'
50
+ * console.log(error.action); // 'delete'
51
+ * console.log(error.message); // Human-readable message
52
+ * }
53
+ * }
54
+ * ```
55
+ */
56
+ export declare class UnauthorizedError extends Error {
57
+ /** Machine-readable error code for classification */
58
+ readonly code: AuthorizationErrorCode;
59
+ /** The resource being accessed (if applicable) */
60
+ readonly resource?: Resource;
61
+ /** The action being attempted (if applicable) */
62
+ readonly action?: Action;
63
+ /** The user's role (if known) */
64
+ readonly role?: string;
65
+ /** The user ID (if provided) */
66
+ readonly userId?: string;
67
+ /** The scope that was required but not granted */
68
+ readonly requiredScope?: OwnershipScope;
69
+ constructor(message: string, options: {
70
+ code: AuthorizationErrorCode;
71
+ resource?: Resource;
72
+ action?: Action;
73
+ role?: string;
74
+ userId?: string;
75
+ requiredScope?: OwnershipScope;
76
+ });
77
+ /**
78
+ * Create a JSON-serializable representation of the error.
79
+ * Useful for logging or API responses.
80
+ */
81
+ toJSON(): Record<string, unknown>;
82
+ }
83
+ /**
84
+ * Options for checking a user's permission to perform an action.
85
+ */
86
+ export interface PermissionCheckOptions {
87
+ /** The user ID performing the action (for error messages and ownership checks) */
88
+ userId?: string;
89
+ /** The role name to check permissions for (null means no role assigned) */
90
+ role: string | null;
91
+ /** The resource type being accessed */
92
+ resource: Resource;
93
+ /** The action being performed on the resource */
94
+ action: Action;
95
+ /**
96
+ * The ID of the user who owns the resource.
97
+ * Required when the user's role only has "own" scope permission.
98
+ * If not provided and "own" scope is needed, the check will fail.
99
+ */
100
+ resourceOwnerId?: string;
101
+ /**
102
+ * Custom roles to check in addition to default roles.
103
+ * Use this to support organization-specific role definitions.
104
+ */
105
+ customRoles?: Record<string, RoleDefinition>;
106
+ }
107
+ /**
108
+ * Result of a permission check that passed.
109
+ */
110
+ export interface PermissionGranted {
111
+ allowed: true;
112
+ /** The scope that was granted (how the permission was satisfied) */
113
+ grantedScope: OwnershipScope;
114
+ /** Whether ownership was verified (true if resourceOwnerId matched userId) */
115
+ ownershipVerified: boolean;
116
+ }
117
+ /**
118
+ * Result of a permission check that failed.
119
+ */
120
+ export interface PermissionDenied {
121
+ allowed: false;
122
+ /** The reason the permission was denied */
123
+ reason: string;
124
+ /** Machine-readable error code */
125
+ code: AuthorizationErrorCode;
126
+ }
127
+ /**
128
+ * Result of a permission check.
129
+ */
130
+ export type PermissionCheckResult = PermissionGranted | PermissionDenied;
131
+ /**
132
+ * Check if a user has permission to perform an action on a resource.
133
+ *
134
+ * This is the core permission evaluation function. It returns a result object
135
+ * indicating whether the permission was granted or denied, with details about
136
+ * why.
137
+ *
138
+ * The function checks permissions in the following order:
139
+ * 1. Validates that the user has a role assigned
140
+ * 2. Validates that the role exists (in default or custom roles)
141
+ * 3. Checks if the role has the required permission
142
+ * 4. For "own" scope permissions, validates ownership if resourceOwnerId is provided
143
+ *
144
+ * @param options - The permission check configuration
145
+ * @returns Result indicating whether permission was granted or denied
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * // Check if an editor can update any content entry
150
+ * const result = checkPermission({
151
+ * role: 'editor',
152
+ * resource: 'contentEntries',
153
+ * action: 'update',
154
+ * });
155
+ * if (result.allowed) {
156
+ * console.log('Permission granted with scope:', result.grantedScope);
157
+ * }
158
+ *
159
+ * // Check if an author can update their own content entry
160
+ * const result = checkPermission({
161
+ * userId: 'user123',
162
+ * role: 'author',
163
+ * resource: 'contentEntries',
164
+ * action: 'update',
165
+ * resourceOwnerId: 'user123', // Same as userId - ownership verified
166
+ * });
167
+ * ```
168
+ */
169
+ export declare function checkPermission(options: PermissionCheckOptions): PermissionCheckResult;
170
+ /**
171
+ * Require that a user has permission to perform an action.
172
+ *
173
+ * This is the throwing version of `checkPermission`. It's designed to be used
174
+ * at the start of mutation/query handlers to enforce access control. If the
175
+ * permission check fails, it throws an UnauthorizedError with a descriptive
176
+ * message.
177
+ *
178
+ * @param options - The permission check configuration
179
+ * @returns The granted permission details (if allowed)
180
+ * @throws UnauthorizedError if the permission is denied
181
+ *
182
+ * @example
183
+ * ```typescript
184
+ * // In a content entry update mutation:
185
+ * export const updateEntry = mutation({
186
+ * args: { id: v.id("contentEntries"), data: v.any() },
187
+ * handler: async (ctx, { id, data }) => {
188
+ * const entry = await ctx.db.get(id);
189
+ * if (!entry) throw new Error("Entry not found");
190
+ *
191
+ * // Check authorization before proceeding
192
+ * const userRole = await getUserRole(ctx.auth.userId);
193
+ * await requirePermission({
194
+ * userId: ctx.auth.userId,
195
+ * role: userRole,
196
+ * resource: 'contentEntries',
197
+ * action: 'update',
198
+ * resourceOwnerId: entry.createdBy,
199
+ * });
200
+ *
201
+ * // If we get here, the user is authorized
202
+ * await ctx.db.patch(id, data);
203
+ * },
204
+ * });
205
+ * ```
206
+ */
207
+ export declare function requirePermission(options: PermissionCheckOptions): PermissionGranted;
208
+ /**
209
+ * Check if a user owns a resource.
210
+ *
211
+ * This is a simple helper for ownership checks without full permission validation.
212
+ * Use this when you've already verified the permission and just need to check
213
+ * ownership for scope enforcement.
214
+ *
215
+ * @param userId - The ID of the user performing the action
216
+ * @param resourceOwnerId - The ID of the user who created/owns the resource
217
+ * @returns True if the user owns the resource
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * // Check ownership before allowing a delete
222
+ * if (!isResourceOwner(currentUserId, entry.createdBy)) {
223
+ * throw new UnauthorizedError(
224
+ * 'You can only delete your own content entries',
225
+ * { code: 'OWNERSHIP_REQUIRED', resource: 'contentEntries', action: 'delete' }
226
+ * );
227
+ * }
228
+ * ```
229
+ */
230
+ export declare function isResourceOwner(userId: string | undefined, resourceOwnerId: string | undefined): boolean;
231
+ /**
232
+ * Require that a user owns a resource.
233
+ *
234
+ * Throws an UnauthorizedError if the user doesn't own the resource.
235
+ * Use this when you need to enforce "own" scope on a resource.
236
+ *
237
+ * @param userId - The ID of the user performing the action
238
+ * @param resourceOwnerId - The ID of the user who created/owns the resource
239
+ * @param options - Additional context for the error message
240
+ * @throws UnauthorizedError if the user doesn't own the resource
241
+ *
242
+ * @example
243
+ * ```typescript
244
+ * // Require ownership before allowing update
245
+ * requireResourceOwnership(currentUserId, entry.createdBy, {
246
+ * resource: 'contentEntries',
247
+ * action: 'update',
248
+ * role: userRole,
249
+ * });
250
+ * ```
251
+ */
252
+ export declare function requireResourceOwnership(userId: string | undefined, resourceOwnerId: string | undefined, options: {
253
+ resource: Resource;
254
+ action: Action;
255
+ role?: string;
256
+ }): void;
257
+ /**
258
+ * Context for performing authorization checks within a request.
259
+ * This can be built up at the start of a handler and reused for multiple checks.
260
+ */
261
+ export interface AuthorizationContext {
262
+ /** The user's ID */
263
+ userId: string;
264
+ /** The user's CMS role */
265
+ role: string;
266
+ /** Optional custom roles to check */
267
+ customRoles?: Record<string, RoleDefinition>;
268
+ }
269
+ /**
270
+ * Create an authorization context for a user.
271
+ *
272
+ * This is a convenience function for building the context object used by
273
+ * authorization functions. It validates that the user has a role assigned.
274
+ *
275
+ * @param userId - The user's ID
276
+ * @param role - The user's role (from getUserRole hook)
277
+ * @param customRoles - Optional custom role definitions
278
+ * @returns Authorization context for permission checks
279
+ * @throws UnauthorizedError if the user has no role assigned
280
+ *
281
+ * @example
282
+ * ```typescript
283
+ * // At the start of a mutation handler:
284
+ * const userRole = await getUserRole({ userId });
285
+ * const authCtx = createAuthContext(userId, userRole);
286
+ *
287
+ * // Later, check permissions with the context:
288
+ * requirePermission({
289
+ * ...authCtx,
290
+ * resource: 'contentEntries',
291
+ * action: 'create',
292
+ * });
293
+ * ```
294
+ */
295
+ export declare function createAuthContext(userId: string, role: string | null, customRoles?: Record<string, RoleDefinition>): AuthorizationContext;
296
+ /**
297
+ * Check if a user can perform an action using an authorization context.
298
+ *
299
+ * This is a convenience wrapper around checkPermission that uses a pre-built
300
+ * authorization context.
301
+ *
302
+ * @param authCtx - The authorization context
303
+ * @param resource - The resource type being accessed
304
+ * @param action - The action being performed
305
+ * @param resourceOwnerId - Optional owner ID for ownership validation
306
+ * @returns Permission check result
307
+ */
308
+ export declare function canPerform(authCtx: AuthorizationContext, resource: Resource, action: Action, resourceOwnerId?: string): PermissionCheckResult;
309
+ /**
310
+ * Require that a user can perform an action using an authorization context.
311
+ *
312
+ * This is a convenience wrapper around requirePermission that uses a pre-built
313
+ * authorization context.
314
+ *
315
+ * @param authCtx - The authorization context
316
+ * @param resource - The resource type being accessed
317
+ * @param action - The action being performed
318
+ * @param resourceOwnerId - Optional owner ID for ownership validation
319
+ * @returns The granted permission details
320
+ * @throws UnauthorizedError if permission is denied
321
+ */
322
+ export declare function mustPerform(authCtx: AuthorizationContext, resource: Resource, action: Action, resourceOwnerId?: string): PermissionGranted;
323
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/component/authorization.ts"],"names":[],"mappings":"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"}