@jmruthers/pace-core 0.5.189 → 0.5.190

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 (420) hide show
  1. package/core-usage-manifest.json +0 -4
  2. package/dist/{AuthService-B-cd2MA4.d.ts → AuthService-CbP_utw2.d.ts} +7 -3
  3. package/dist/{DataTable-GUFUNZ3N.js → DataTable-ON3IXISJ.js} +8 -8
  4. package/dist/{PublicPageProvider-B8HaLe69.d.ts → PublicPageProvider-C4uxosp6.d.ts} +83 -24
  5. package/dist/{UnifiedAuthProvider-BG0AL5eE.d.ts → UnifiedAuthProvider-BYA9qB-o.d.ts} +4 -3
  6. package/dist/{UnifiedAuthProvider-643PUAIM.js → UnifiedAuthProvider-X5NXANVI.js} +4 -2
  7. package/dist/{api-YP7XD5L6.js → api-I6UCQ5S6.js} +4 -2
  8. package/dist/{chunk-DDM4CCYT.js → chunk-4QYC5L4K.js} +60 -35
  9. package/dist/chunk-4QYC5L4K.js.map +1 -0
  10. package/dist/{chunk-IM4QE42D.js → chunk-73HSNNOQ.js} +141 -326
  11. package/dist/chunk-73HSNNOQ.js.map +1 -0
  12. package/dist/{chunk-YHCN776L.js → chunk-DZWK57KZ.js} +2 -75
  13. package/dist/chunk-DZWK57KZ.js.map +1 -0
  14. package/dist/{chunk-3GOZZZYH.js → chunk-HQVPB5MZ.js} +238 -301
  15. package/dist/chunk-HQVPB5MZ.js.map +1 -0
  16. package/dist/{chunk-THRPYOFK.js → chunk-HW3OVDUF.js} +5 -5
  17. package/dist/chunk-HW3OVDUF.js.map +1 -0
  18. package/dist/{chunk-F2IMUDXZ.js → chunk-I7PSE6JW.js} +75 -2
  19. package/dist/chunk-I7PSE6JW.js.map +1 -0
  20. package/dist/{chunk-VGZZXKBR.js → chunk-J2XXC7R5.js} +280 -52
  21. package/dist/chunk-J2XXC7R5.js.map +1 -0
  22. package/dist/{chunk-UCQSRW7Z.js → chunk-NIU6J6OX.js} +425 -378
  23. package/dist/chunk-NIU6J6OX.js.map +1 -0
  24. package/dist/{chunk-HESYZWZW.js → chunk-QWWZ5CAQ.js} +2 -2
  25. package/dist/{chunk-HEHYGYOX.js → chunk-RUYZKXOD.js} +401 -46
  26. package/dist/chunk-RUYZKXOD.js.map +1 -0
  27. package/dist/{chunk-2UUZZJFT.js → chunk-SDMHPX3X.js} +176 -160
  28. package/dist/{chunk-2UUZZJFT.js.map → chunk-SDMHPX3X.js.map} +1 -1
  29. package/dist/{chunk-MX64ZF6I.js → chunk-STYK4OH2.js} +11 -11
  30. package/dist/chunk-STYK4OH2.js.map +1 -0
  31. package/dist/{chunk-YGPFYGA6.js → chunk-VVBAW5A5.js} +822 -498
  32. package/dist/chunk-VVBAW5A5.js.map +1 -0
  33. package/dist/chunk-Y4BUBBHD.js +614 -0
  34. package/dist/chunk-Y4BUBBHD.js.map +1 -0
  35. package/dist/{chunk-SAUPYVLF.js → chunk-ZSAAAMVR.js} +1 -1
  36. package/dist/chunk-ZSAAAMVR.js.map +1 -0
  37. package/dist/components.d.ts +3 -4
  38. package/dist/components.js +19 -19
  39. package/dist/components.js.map +1 -1
  40. package/dist/eslint-rules/pace-core-compliance.cjs +0 -2
  41. package/dist/{file-reference-D037xOFK.d.ts → file-reference-BavO2eQj.d.ts} +13 -10
  42. package/dist/hooks.d.ts +10 -5
  43. package/dist/hooks.js +14 -8
  44. package/dist/hooks.js.map +1 -1
  45. package/dist/index.d.ts +13 -11
  46. package/dist/index.js +79 -69
  47. package/dist/index.js.map +1 -1
  48. package/dist/providers.d.ts +3 -3
  49. package/dist/providers.js +3 -1
  50. package/dist/rbac/index.d.ts +76 -12
  51. package/dist/rbac/index.js +12 -9
  52. package/dist/types.d.ts +1 -1
  53. package/dist/types.js +1 -1
  54. package/dist/{usePublicRouteParams-CTDELQ7H.d.ts → usePublicRouteParams-DxIDS4bC.d.ts} +16 -9
  55. package/dist/utils.js +16 -16
  56. package/docs/README.md +2 -2
  57. package/docs/api/classes/ColumnFactory.md +1 -1
  58. package/docs/api/classes/ErrorBoundary.md +1 -1
  59. package/docs/api/classes/InvalidScopeError.md +2 -2
  60. package/docs/api/classes/Logger.md +1 -1
  61. package/docs/api/classes/MissingUserContextError.md +2 -2
  62. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  63. package/docs/api/classes/PermissionDeniedError.md +1 -1
  64. package/docs/api/classes/RBACAuditManager.md +1 -1
  65. package/docs/api/classes/RBACCache.md +1 -1
  66. package/docs/api/classes/RBACEngine.md +4 -4
  67. package/docs/api/classes/RBACError.md +1 -1
  68. package/docs/api/classes/RBACNotInitializedError.md +2 -2
  69. package/docs/api/classes/SecureSupabaseClient.md +21 -16
  70. package/docs/api/classes/StorageUtils.md +7 -4
  71. package/docs/api/enums/FileCategory.md +1 -1
  72. package/docs/api/enums/LogLevel.md +1 -1
  73. package/docs/api/enums/RBACErrorCode.md +1 -1
  74. package/docs/api/enums/RPCFunction.md +1 -1
  75. package/docs/api/interfaces/AddressFieldProps.md +1 -1
  76. package/docs/api/interfaces/AddressFieldRef.md +1 -1
  77. package/docs/api/interfaces/AggregateConfig.md +1 -1
  78. package/docs/api/interfaces/AutocompleteOptions.md +1 -1
  79. package/docs/api/interfaces/AvatarProps.md +1 -1
  80. package/docs/api/interfaces/BadgeProps.md +1 -1
  81. package/docs/api/interfaces/ButtonProps.md +1 -1
  82. package/docs/api/interfaces/CalendarProps.md +20 -6
  83. package/docs/api/interfaces/CardProps.md +1 -1
  84. package/docs/api/interfaces/ColorPalette.md +1 -1
  85. package/docs/api/interfaces/ColorShade.md +1 -1
  86. package/docs/api/interfaces/ComplianceResult.md +1 -1
  87. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  88. package/docs/api/interfaces/DataRecord.md +1 -1
  89. package/docs/api/interfaces/DataTableAction.md +1 -1
  90. package/docs/api/interfaces/DataTableColumn.md +1 -1
  91. package/docs/api/interfaces/DataTableProps.md +1 -1
  92. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  93. package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
  94. package/docs/api/interfaces/DatabaseIssue.md +1 -1
  95. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  96. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  97. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  98. package/docs/api/interfaces/ExportColumn.md +1 -1
  99. package/docs/api/interfaces/ExportOptions.md +1 -1
  100. package/docs/api/interfaces/FileDisplayProps.md +62 -16
  101. package/docs/api/interfaces/FileMetadata.md +1 -1
  102. package/docs/api/interfaces/FileReference.md +2 -2
  103. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  104. package/docs/api/interfaces/FileUploadOptions.md +26 -12
  105. package/docs/api/interfaces/FileUploadProps.md +30 -19
  106. package/docs/api/interfaces/FooterProps.md +1 -1
  107. package/docs/api/interfaces/FormFieldProps.md +1 -1
  108. package/docs/api/interfaces/FormProps.md +1 -1
  109. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  110. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  111. package/docs/api/interfaces/InputProps.md +1 -1
  112. package/docs/api/interfaces/LabelProps.md +1 -1
  113. package/docs/api/interfaces/LoggerConfig.md +1 -1
  114. package/docs/api/interfaces/LoginFormProps.md +1 -1
  115. package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
  116. package/docs/api/interfaces/NavigationContextType.md +9 -9
  117. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  118. package/docs/api/interfaces/NavigationItem.md +1 -1
  119. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  120. package/docs/api/interfaces/NavigationProviderProps.md +7 -7
  121. package/docs/api/interfaces/Organisation.md +1 -1
  122. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  123. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  124. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  125. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  126. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  127. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  128. package/docs/api/interfaces/PageAccessRecord.md +8 -8
  129. package/docs/api/interfaces/PagePermissionContextType.md +8 -8
  130. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  131. package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
  132. package/docs/api/interfaces/PaletteData.md +1 -1
  133. package/docs/api/interfaces/ParsedAddress.md +1 -1
  134. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  135. package/docs/api/interfaces/ProgressProps.md +3 -11
  136. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  137. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  138. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  139. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  140. package/docs/api/interfaces/QuickFix.md +1 -1
  141. package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
  142. package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
  143. package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
  144. package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
  145. package/docs/api/interfaces/RBACConfig.md +1 -1
  146. package/docs/api/interfaces/RBACContext.md +1 -1
  147. package/docs/api/interfaces/RBACLogger.md +1 -1
  148. package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
  149. package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
  150. package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
  151. package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
  152. package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
  153. package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
  154. package/docs/api/interfaces/RBACResult.md +1 -1
  155. package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
  156. package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
  157. package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
  158. package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
  159. package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
  160. package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
  161. package/docs/api/interfaces/RBACRolesListParams.md +1 -1
  162. package/docs/api/interfaces/RBACRolesListResult.md +1 -1
  163. package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
  164. package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
  165. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  166. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  167. package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
  168. package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
  169. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  170. package/docs/api/interfaces/RouteAccessRecord.md +10 -10
  171. package/docs/api/interfaces/RouteConfig.md +10 -10
  172. package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
  173. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  174. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  175. package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
  176. package/docs/api/interfaces/SetupIssue.md +1 -1
  177. package/docs/api/interfaces/StorageConfig.md +4 -4
  178. package/docs/api/interfaces/StorageFileInfo.md +7 -7
  179. package/docs/api/interfaces/StorageFileMetadata.md +25 -14
  180. package/docs/api/interfaces/StorageListOptions.md +22 -9
  181. package/docs/api/interfaces/StorageListResult.md +4 -4
  182. package/docs/api/interfaces/StorageUploadOptions.md +21 -8
  183. package/docs/api/interfaces/StorageUploadResult.md +6 -6
  184. package/docs/api/interfaces/StorageUrlOptions.md +19 -6
  185. package/docs/api/interfaces/StyleImport.md +1 -1
  186. package/docs/api/interfaces/SwitchProps.md +1 -1
  187. package/docs/api/interfaces/TabsContentProps.md +1 -1
  188. package/docs/api/interfaces/TabsListProps.md +1 -1
  189. package/docs/api/interfaces/TabsProps.md +1 -1
  190. package/docs/api/interfaces/TabsTriggerProps.md +1 -1
  191. package/docs/api/interfaces/TextareaProps.md +1 -1
  192. package/docs/api/interfaces/ToastActionElement.md +1 -1
  193. package/docs/api/interfaces/ToastProps.md +1 -1
  194. package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
  195. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  196. package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
  197. package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
  198. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  199. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  200. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  201. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  202. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  203. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  204. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
  205. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  206. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  207. package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
  208. package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
  209. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  210. package/docs/api/interfaces/UserEventAccess.md +11 -11
  211. package/docs/api/interfaces/UserMenuProps.md +1 -1
  212. package/docs/api/interfaces/UserProfile.md +1 -1
  213. package/docs/api/modules.md +151 -92
  214. package/docs/api-reference/components.md +15 -7
  215. package/docs/api-reference/providers.md +2 -2
  216. package/docs/api-reference/rpc-functions.md +1 -0
  217. package/docs/best-practices/README.md +1 -1
  218. package/docs/best-practices/deployment.md +8 -8
  219. package/docs/getting-started/examples/README.md +2 -2
  220. package/docs/getting-started/installation-guide.md +4 -4
  221. package/docs/getting-started/quick-start.md +3 -3
  222. package/docs/migration/MIGRATION_GUIDE.md +3 -3
  223. package/docs/rbac/compliance/compliance-guide.md +2 -2
  224. package/docs/rbac/event-based-apps.md +2 -2
  225. package/docs/rbac/getting-started.md +2 -2
  226. package/docs/rbac/quick-start.md +2 -2
  227. package/docs/security/README.md +4 -4
  228. package/docs/standards/07-rbac-and-rls-standard.md +430 -7
  229. package/docs/troubleshooting/README.md +2 -2
  230. package/docs/troubleshooting/migration.md +3 -3
  231. package/package.json +1 -3
  232. package/scripts/check-pace-core-compliance.cjs +1 -1
  233. package/scripts/check-pace-core-compliance.js +1 -1
  234. package/src/__tests__/fixtures/supabase.ts +301 -0
  235. package/src/__tests__/public-recipe-view.test.ts +9 -9
  236. package/src/__tests__/rls-policies.test.ts +197 -61
  237. package/src/components/AddressField/AddressField.test.tsx +42 -0
  238. package/src/components/AddressField/AddressField.tsx +71 -60
  239. package/src/components/AddressField/README.md +1 -0
  240. package/src/components/Alert/Alert.test.tsx +50 -10
  241. package/src/components/Alert/Alert.tsx +5 -3
  242. package/src/components/Avatar/Avatar.test.tsx +95 -43
  243. package/src/components/Avatar/Avatar.tsx +16 -16
  244. package/src/components/Button/Button.test.tsx +2 -1
  245. package/src/components/Button/Button.tsx +3 -3
  246. package/src/components/Calendar/Calendar.test.tsx +53 -37
  247. package/src/components/Calendar/Calendar.tsx +409 -82
  248. package/src/components/Card/Card.test.tsx +7 -4
  249. package/src/components/Card/Card.tsx +3 -6
  250. package/src/components/Checkbox/Checkbox.tsx +2 -2
  251. package/src/components/DataTable/components/ActionButtons.tsx +5 -5
  252. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
  253. package/src/components/DataTable/components/ColumnFilter.tsx +1 -1
  254. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +3 -3
  255. package/src/components/DataTable/components/DataTableBody.tsx +12 -12
  256. package/src/components/DataTable/components/DataTableCore.tsx +3 -3
  257. package/src/components/DataTable/components/DataTableToolbar.tsx +5 -5
  258. package/src/components/DataTable/components/DraggableColumnHeader.tsx +3 -3
  259. package/src/components/DataTable/components/EditableRow.tsx +2 -2
  260. package/src/components/DataTable/components/EmptyState.tsx +3 -3
  261. package/src/components/DataTable/components/GroupHeader.tsx +2 -2
  262. package/src/components/DataTable/components/GroupingDropdown.tsx +1 -1
  263. package/src/components/DataTable/components/ImportModal.tsx +4 -4
  264. package/src/components/DataTable/components/LoadingState.tsx +1 -1
  265. package/src/components/DataTable/components/PaginationControls.tsx +11 -11
  266. package/src/components/DataTable/components/UnifiedTableBody.tsx +9 -9
  267. package/src/components/DataTable/components/ViewRowModal.tsx +2 -2
  268. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +11 -37
  269. package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +157 -0
  270. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +2 -1
  271. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +128 -0
  272. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +19 -0
  273. package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +51 -0
  274. package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +84 -0
  275. package/src/components/DataTable/core/__tests__/DataManager.test.ts +14 -0
  276. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +136 -0
  277. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +16 -0
  278. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +18 -0
  279. package/src/components/DataTable/hooks/useDataTablePermissions.ts +28 -7
  280. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +30 -1
  281. package/src/components/DataTable/utils/hierarchicalUtils.ts +38 -10
  282. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -3
  283. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +4 -4
  284. package/src/components/Dialog/Dialog.tsx +2 -2
  285. package/src/components/EventSelector/EventSelector.tsx +7 -7
  286. package/src/components/FileDisplay/FileDisplay.tsx +291 -179
  287. package/src/components/FileUpload/FileUpload.tsx +7 -4
  288. package/src/components/Header/Header.test.tsx +28 -0
  289. package/src/components/Header/Header.tsx +22 -9
  290. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -2
  291. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +19 -14
  292. package/src/components/LoadingSpinner/LoadingSpinner.tsx +5 -5
  293. package/src/components/NavigationMenu/NavigationMenu.test.tsx +127 -1
  294. package/src/components/OrganisationSelector/OrganisationSelector.tsx +8 -8
  295. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +4 -0
  296. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +3 -0
  297. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +3 -0
  298. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +16 -6
  299. package/src/components/PaceAppLayout/PaceAppLayout.tsx +37 -3
  300. package/src/components/PaceAppLayout/test-setup.tsx +1 -0
  301. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +66 -45
  302. package/src/components/PaceLoginPage/PaceLoginPage.tsx +6 -4
  303. package/src/components/Progress/Progress.test.tsx +18 -19
  304. package/src/components/Progress/Progress.tsx +31 -32
  305. package/src/components/PublicLayout/PublicLayout.test.tsx +6 -6
  306. package/src/components/PublicLayout/PublicPageProvider.tsx +5 -3
  307. package/src/components/Select/Select.tsx +5 -5
  308. package/src/components/Switch/Switch.test.tsx +2 -1
  309. package/src/components/Switch/Switch.tsx +1 -1
  310. package/src/components/Toast/Toast.tsx +1 -1
  311. package/src/components/Tooltip/Tooltip.test.tsx +8 -2
  312. package/src/components/UserMenu/UserMenu.tsx +3 -3
  313. package/src/eslint-rules/pace-core-compliance.cjs +0 -2
  314. package/src/eslint-rules/pace-core-compliance.js +0 -2
  315. package/src/hooks/__tests__/hooks.integration.test.tsx +4 -1
  316. package/src/hooks/__tests__/useAppConfig.unit.test.ts +76 -5
  317. package/src/hooks/__tests__/useDataTableState.test.ts +76 -0
  318. package/src/hooks/__tests__/useFileUrl.unit.test.ts +25 -69
  319. package/src/hooks/__tests__/useFileUrlCache.test.ts +129 -0
  320. package/src/hooks/__tests__/usePreventTabReload.test.ts +88 -0
  321. package/src/hooks/__tests__/{usePublicEvent.unit.test.ts → usePublicEvent.test.ts} +28 -1
  322. package/src/hooks/__tests__/useQueryCache.test.ts +144 -0
  323. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +58 -16
  324. package/src/hooks/index.ts +1 -1
  325. package/src/hooks/public/usePublicEvent.ts +2 -2
  326. package/src/hooks/public/usePublicFileDisplay.ts +173 -87
  327. package/src/hooks/useAppConfig.ts +24 -5
  328. package/src/hooks/useFileDisplay.ts +297 -34
  329. package/src/hooks/useFileReference.ts +56 -11
  330. package/src/hooks/useFileUrl.ts +1 -1
  331. package/src/hooks/useInactivityTracker.ts +16 -7
  332. package/src/hooks/usePermissionCache.test.ts +85 -8
  333. package/src/hooks/useQueryCache.ts +21 -0
  334. package/src/hooks/useSecureDataAccess.test.ts +80 -35
  335. package/src/hooks/useSecureDataAccess.ts +80 -37
  336. package/src/providers/services/EventServiceProvider.tsx +37 -17
  337. package/src/providers/services/InactivityServiceProvider.tsx +4 -4
  338. package/src/providers/services/OrganisationServiceProvider.tsx +8 -1
  339. package/src/providers/services/UnifiedAuthProvider.tsx +115 -29
  340. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +451 -0
  341. package/src/rbac/__tests__/engine.comprehensive.test.ts +12 -0
  342. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +8 -0
  343. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +4 -0
  344. package/src/rbac/api.ts +240 -36
  345. package/src/rbac/cache-invalidation.ts +21 -7
  346. package/src/rbac/compliance/quick-fix-suggestions.ts +1 -1
  347. package/src/rbac/components/NavigationGuard.tsx +23 -63
  348. package/src/rbac/components/NavigationProvider.test.tsx +52 -23
  349. package/src/rbac/components/NavigationProvider.tsx +13 -11
  350. package/src/rbac/components/PagePermissionGuard.tsx +77 -203
  351. package/src/rbac/components/PagePermissionProvider.tsx +13 -11
  352. package/src/rbac/components/PermissionEnforcer.tsx +24 -62
  353. package/src/rbac/components/RoleBasedRouter.tsx +14 -12
  354. package/src/rbac/components/SecureDataProvider.tsx +13 -11
  355. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +104 -41
  356. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +49 -12
  357. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +22 -1
  358. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +161 -82
  359. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +22 -1
  360. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +77 -30
  361. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +39 -5
  362. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +47 -4
  363. package/src/rbac/engine.ts +4 -2
  364. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +144 -52
  365. package/src/rbac/hooks/index.ts +3 -0
  366. package/src/rbac/hooks/useCan.test.ts +101 -53
  367. package/src/rbac/hooks/usePermissions.ts +108 -41
  368. package/src/rbac/hooks/useRBAC.test.ts +11 -3
  369. package/src/rbac/hooks/useRBAC.ts +83 -40
  370. package/src/rbac/hooks/useResolvedScope.test.ts +189 -63
  371. package/src/rbac/hooks/useResolvedScope.ts +128 -70
  372. package/src/rbac/hooks/useSecureSupabase.ts +36 -19
  373. package/src/rbac/hooks/useSuperAdminBypass.ts +126 -0
  374. package/src/rbac/request-deduplication.ts +1 -1
  375. package/src/rbac/secureClient.ts +72 -12
  376. package/src/rbac/security.ts +29 -23
  377. package/src/rbac/types.ts +10 -0
  378. package/src/rbac/utils/__tests__/contextValidator.test.ts +150 -0
  379. package/src/rbac/utils/__tests__/deep-equal.test.ts +53 -0
  380. package/src/rbac/utils/__tests__/eventContext.test.ts +6 -1
  381. package/src/rbac/utils/contextValidator.ts +288 -0
  382. package/src/rbac/utils/eventContext.ts +48 -2
  383. package/src/services/EventService.ts +165 -21
  384. package/src/services/OrganisationService.ts +37 -2
  385. package/src/services/__tests__/EventService.test.ts +26 -21
  386. package/src/types/file-reference.ts +13 -10
  387. package/src/utils/app/appNameResolver.test.ts +346 -73
  388. package/src/utils/context/superAdminOverride.ts +58 -0
  389. package/src/utils/file-reference/index.ts +61 -33
  390. package/src/utils/google-places/googlePlacesUtils.test.ts +98 -0
  391. package/src/utils/google-places/loadGoogleMapsScript.test.ts +83 -0
  392. package/src/utils/storage/helpers.test.ts +1 -1
  393. package/src/utils/storage/helpers.ts +38 -19
  394. package/src/utils/storage/types.ts +15 -8
  395. package/src/utils/validation/__tests__/csrf.test.ts +105 -0
  396. package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +92 -0
  397. package/src/vite-env.d.ts +2 -2
  398. package/dist/chunk-3GOZZZYH.js.map +0 -1
  399. package/dist/chunk-DDM4CCYT.js.map +0 -1
  400. package/dist/chunk-E7UAOUMY.js +0 -75
  401. package/dist/chunk-E7UAOUMY.js.map +0 -1
  402. package/dist/chunk-F2IMUDXZ.js.map +0 -1
  403. package/dist/chunk-HEHYGYOX.js.map +0 -1
  404. package/dist/chunk-IM4QE42D.js.map +0 -1
  405. package/dist/chunk-MX64ZF6I.js.map +0 -1
  406. package/dist/chunk-SAUPYVLF.js.map +0 -1
  407. package/dist/chunk-THRPYOFK.js.map +0 -1
  408. package/dist/chunk-UCQSRW7Z.js.map +0 -1
  409. package/dist/chunk-VGZZXKBR.js.map +0 -1
  410. package/dist/chunk-YGPFYGA6.js.map +0 -1
  411. package/dist/chunk-YHCN776L.js.map +0 -1
  412. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +0 -192
  413. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -741
  414. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +0 -703
  415. package/src/rbac/hooks/useRBAC.simple.test.ts +0 -95
  416. package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -428
  417. /package/dist/{DataTable-GUFUNZ3N.js.map → DataTable-ON3IXISJ.js.map} +0 -0
  418. /package/dist/{UnifiedAuthProvider-643PUAIM.js.map → UnifiedAuthProvider-X5NXANVI.js.map} +0 -0
  419. /package/dist/{api-YP7XD5L6.js.map → api-I6UCQ5S6.js.map} +0 -0
  420. /package/dist/{chunk-HESYZWZW.js.map → chunk-QWWZ5CAQ.js.map} +0 -0
@@ -1,95 +0,0 @@
1
- /**
2
- * @file useRBAC Hook Simple Tests
3
- * @package @jmruthers/pace-core
4
- * @module RBAC/Hooks/useRBAC
5
- * @since 0.3.0
6
- *
7
- * Simple tests for the useRBAC hook to verify basic functionality.
8
- */
9
-
10
- import { renderHook } from '@testing-library/react';
11
- import { vi, describe, it, expect, beforeEach } from 'vitest';
12
-
13
- // Mock the providers with simple mocks
14
- vi.mock('../../providers/UnifiedAuthProvider', () => ({
15
- useUnifiedAuth: vi.fn(() => ({
16
- user: { id: 'user-123' },
17
- session: { access_token: 'mock-token' },
18
- supabase: {
19
- // Ensure realtime init is skipped
20
- channel: undefined,
21
- from: vi.fn(() => ({
22
- select: vi.fn(() => ({
23
- eq: vi.fn(() => ({
24
- eq: vi.fn(() => ({
25
- single: vi.fn().mockResolvedValue({
26
- data: { global_role: 'user' },
27
- error: null
28
- })
29
- }))
30
- }))
31
- }))
32
- }))
33
- },
34
- appName: 'test-app'
35
- }))
36
- }));
37
-
38
- vi.mock('../../providers/OrganisationProvider', () => ({
39
- useOrganisations: vi.fn(() => ({
40
- selectedOrganisation: { id: 'org-123', name: 'Test Org' }
41
- }))
42
- }));
43
-
44
- vi.mock('../../providers/EventProvider', () => ({
45
- useEvents: vi.fn(() => ({
46
- selectedEvent: { event_id: 'event-123', name: 'Test Event' }
47
- }))
48
- }));
49
-
50
- // Import after mocking
51
- vi.mock('./useRBAC', () => ({
52
- useRBAC: () => ({
53
- isLoading: false,
54
- isAuthenticated: true,
55
- globalRole: 'user',
56
- organisationRole: 'member',
57
- eventAppRole: 'participant',
58
- isSuperAdmin: false,
59
- isOrgAdmin: false,
60
- hasGlobalPermission: () => true,
61
- error: null,
62
- }),
63
- }));
64
- import { useRBAC } from './useRBAC';
65
-
66
- describe('useRBAC Hook - Simple Tests', () => {
67
- it('renders without crashing', () => {
68
- const { result } = renderHook(() => useRBAC());
69
-
70
- expect(result.current).toBeDefined();
71
- expect(result.current.globalRole).toBeDefined();
72
- expect(result.current.organisationRole).toBeDefined();
73
- expect(result.current.eventAppRole).toBeDefined();
74
- });
75
-
76
- it('has required properties', () => {
77
- const { result } = renderHook(() => useRBAC());
78
-
79
- expect(result.current).toHaveProperty('globalRole');
80
- expect(result.current).toHaveProperty('organisationRole');
81
- expect(result.current).toHaveProperty('eventAppRole');
82
- expect(result.current).toHaveProperty('hasGlobalPermission');
83
- expect(result.current).toHaveProperty('isSuperAdmin');
84
- expect(result.current).toHaveProperty('isOrgAdmin');
85
- expect(result.current).toHaveProperty('isLoading');
86
- expect(result.current).toHaveProperty('error');
87
- // Note: hasPermission was removed - use useCan() hook instead
88
- });
89
-
90
- it('hasGlobalPermission is a function', () => {
91
- const { result } = renderHook(() => useRBAC());
92
-
93
- expect(typeof result.current.hasGlobalPermission).toBe('function');
94
- });
95
- });
@@ -1,428 +0,0 @@
1
- /**
2
- * @file Event Context Utilities Tests
3
- * @package @jmruthers/pace-core
4
- * @module RBAC/EventContext/Tests
5
- * @since 1.0.0
6
- *
7
- * Comprehensive tests for event context utilities in the RBAC system.
8
- */
9
-
10
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
11
- import { SupabaseClient } from '@supabase/supabase-js';
12
- import { Database } from '../../../types/database';
13
- import { UUID, Scope } from '../../types';
14
- import {
15
- getOrganisationFromEvent,
16
- createScopeFromEvent,
17
- isEventBasedScope,
18
- isValidEventBasedScope
19
- } from '../eventContext';
20
-
21
- // Mock Supabase client
22
- const createMockSupabaseClient = () => {
23
- const mockQuery = {
24
- select: vi.fn().mockReturnThis(),
25
- eq: vi.fn().mockReturnThis(),
26
- single: vi.fn()
27
- };
28
-
29
- return {
30
- from: vi.fn().mockReturnValue(mockQuery),
31
- query: mockQuery
32
- } as unknown as SupabaseClient<Database>;
33
- };
34
-
35
- describe('Event Context Utilities', () => {
36
- let mockSupabase: SupabaseClient<Database>;
37
- let mockQuery: any;
38
-
39
- beforeEach(() => {
40
- mockSupabase = createMockSupabaseClient();
41
- mockQuery = mockSupabase.from('event');
42
- });
43
-
44
- afterEach(() => {
45
- vi.clearAllMocks();
46
- });
47
-
48
- describe('getOrganisationFromEvent', () => {
49
- it('should return organisation ID when event exists', async () => {
50
- const eventId = 'event-123';
51
- const organisationId = 'org-456';
52
-
53
- mockQuery.single.mockResolvedValue({
54
- data: { organisation_id: organisationId },
55
- error: null
56
- });
57
-
58
- const result = await getOrganisationFromEvent(mockSupabase, eventId);
59
-
60
- expect(result).toBe(organisationId);
61
- expect(mockSupabase.from).toHaveBeenCalledWith('event');
62
- expect(mockQuery.select).toHaveBeenCalledWith('organisation_id');
63
- expect(mockQuery.eq).toHaveBeenCalledWith('event_id', eventId);
64
- expect(mockQuery.single).toHaveBeenCalled();
65
- });
66
-
67
- it('should return null when event does not exist', async () => {
68
- const eventId = 'nonexistent-event';
69
-
70
- mockQuery.single.mockResolvedValue({
71
- data: null,
72
- error: { message: 'Event not found' }
73
- });
74
-
75
- const result = await getOrganisationFromEvent(mockSupabase, eventId);
76
-
77
- expect(result).toBeNull();
78
- });
79
-
80
- it('should return null when data is null', async () => {
81
- const eventId = 'event-123';
82
-
83
- mockQuery.single.mockResolvedValue({
84
- data: null,
85
- error: null
86
- });
87
-
88
- const result = await getOrganisationFromEvent(mockSupabase, eventId);
89
-
90
- expect(result).toBeNull();
91
- });
92
-
93
- it('should handle database errors gracefully', async () => {
94
- const eventId = 'event-123';
95
- const dbError = new Error('Database connection failed');
96
-
97
- mockQuery.single.mockRejectedValue(dbError);
98
-
99
- await expect(getOrganisationFromEvent(mockSupabase, eventId))
100
- .rejects.toThrow('Database connection failed');
101
- });
102
-
103
- it('should handle empty organisation_id', async () => {
104
- const eventId = 'event-123';
105
-
106
- mockQuery.single.mockResolvedValue({
107
- data: { organisation_id: null },
108
- error: null
109
- });
110
-
111
- const result = await getOrganisationFromEvent(mockSupabase, eventId);
112
-
113
- expect(result).toBeNull();
114
- });
115
- });
116
-
117
- describe('createScopeFromEvent', () => {
118
- it('should create complete scope when event exists', async () => {
119
- const eventId = 'event-123';
120
- const organisationId = 'org-456';
121
- const appId = 'app-789';
122
-
123
- mockQuery.single.mockResolvedValue({
124
- data: { organisation_id: organisationId },
125
- error: null
126
- });
127
-
128
- const result = await createScopeFromEvent(mockSupabase, eventId, appId);
129
-
130
- expect(result).toEqual({
131
- organisationId,
132
- eventId,
133
- appId
134
- });
135
- });
136
-
137
- it('should create scope without appId when not provided', async () => {
138
- const eventId = 'event-123';
139
- const organisationId = 'org-456';
140
-
141
- mockQuery.single.mockResolvedValue({
142
- data: { organisation_id: organisationId },
143
- error: null
144
- });
145
-
146
- const result = await createScopeFromEvent(mockSupabase, eventId);
147
-
148
- expect(result).toEqual({
149
- organisationId,
150
- eventId,
151
- appId: undefined
152
- });
153
- });
154
-
155
- it('should return null when event does not exist', async () => {
156
- const eventId = 'nonexistent-event';
157
-
158
- mockQuery.single.mockResolvedValue({
159
- data: null,
160
- error: { message: 'Event not found' }
161
- });
162
-
163
- const result = await createScopeFromEvent(mockSupabase, eventId);
164
-
165
- expect(result).toBeNull();
166
- });
167
-
168
- it('should return null when organisation lookup fails', async () => {
169
- const eventId = 'event-123';
170
-
171
- mockQuery.single.mockResolvedValue({
172
- data: { organisation_id: null },
173
- error: null
174
- });
175
-
176
- const result = await createScopeFromEvent(mockSupabase, eventId);
177
-
178
- expect(result).toBeNull();
179
- });
180
-
181
- it('should handle database errors gracefully', async () => {
182
- const eventId = 'event-123';
183
- const dbError = new Error('Database connection failed');
184
-
185
- mockQuery.single.mockRejectedValue(dbError);
186
-
187
- await expect(createScopeFromEvent(mockSupabase, eventId))
188
- .rejects.toThrow('Database connection failed');
189
- });
190
- });
191
-
192
- describe('isEventBasedScope', () => {
193
- it('should return true for event-based scope (no organisationId, has eventId)', () => {
194
- const scope: Scope = {
195
- eventId: 'event-123',
196
- appId: 'app-456'
197
- };
198
-
199
- expect(isEventBasedScope(scope)).toBe(true);
200
- });
201
-
202
- it('should return false when organisationId is present', () => {
203
- const scope: Scope = {
204
- organisationId: 'org-123',
205
- eventId: 'event-123',
206
- appId: 'app-456'
207
- };
208
-
209
- expect(isEventBasedScope(scope)).toBe(false);
210
- });
211
-
212
- it('should return false when eventId is missing', () => {
213
- const scope: Scope = {
214
- appId: 'app-456'
215
- };
216
-
217
- expect(isEventBasedScope(scope)).toBe(false);
218
- });
219
-
220
- it('should return false when both organisationId and eventId are missing', () => {
221
- const scope: Scope = {
222
- appId: 'app-456'
223
- };
224
-
225
- expect(isEventBasedScope(scope)).toBe(false);
226
- });
227
-
228
- it('should return false when eventId is null', () => {
229
- const scope: Scope = {
230
- eventId: null,
231
- appId: 'app-456'
232
- };
233
-
234
- expect(isEventBasedScope(scope)).toBe(false);
235
- });
236
-
237
- it('should return false when eventId is undefined', () => {
238
- const scope: Scope = {
239
- eventId: undefined,
240
- appId: 'app-456'
241
- };
242
-
243
- expect(isEventBasedScope(scope)).toBe(false);
244
- });
245
- });
246
-
247
- describe('isValidEventBasedScope', () => {
248
- it('should return true for valid event-based scope', () => {
249
- const scope: Scope = {
250
- eventId: 'event-123',
251
- appId: 'app-456'
252
- };
253
-
254
- expect(isValidEventBasedScope(scope)).toBe(true);
255
- });
256
-
257
- it('should return false when eventId is missing', () => {
258
- const scope: Scope = {
259
- appId: 'app-456'
260
- };
261
-
262
- expect(isValidEventBasedScope(scope)).toBe(false);
263
- });
264
-
265
- it('should return false when eventId is null', () => {
266
- const scope: Scope = {
267
- eventId: null,
268
- appId: 'app-456'
269
- };
270
-
271
- expect(isValidEventBasedScope(scope)).toBe(false);
272
- });
273
-
274
- it('should return false when eventId is undefined', () => {
275
- const scope: Scope = {
276
- eventId: undefined,
277
- appId: 'app-456'
278
- };
279
-
280
- expect(isValidEventBasedScope(scope)).toBe(false);
281
- });
282
-
283
- it('should return false when organisationId is present (not event-based)', () => {
284
- const scope: Scope = {
285
- organisationId: 'org-123',
286
- eventId: 'event-123',
287
- appId: 'app-456'
288
- };
289
-
290
- expect(isValidEventBasedScope(scope)).toBe(false);
291
- });
292
-
293
- it('should return true for event-based scope without appId', () => {
294
- const scope: Scope = {
295
- eventId: 'event-123'
296
- };
297
-
298
- expect(isValidEventBasedScope(scope)).toBe(true);
299
- });
300
- });
301
-
302
- describe('Edge Cases and Error Handling', () => {
303
- it('should handle malformed event IDs', async () => {
304
- const malformedEventId = '';
305
-
306
- mockQuery.single.mockResolvedValue({
307
- data: null,
308
- error: { message: 'Invalid event ID' }
309
- });
310
-
311
- const result = await getOrganisationFromEvent(mockSupabase, malformedEventId);
312
-
313
- expect(result).toBeNull();
314
- });
315
-
316
- it('should handle very long event IDs', async () => {
317
- const longEventId = 'a'.repeat(1000);
318
- const organisationId = 'org-456';
319
-
320
- mockQuery.single.mockResolvedValue({
321
- data: { organisation_id: organisationId },
322
- error: null
323
- });
324
-
325
- const result = await getOrganisationFromEvent(mockSupabase, longEventId);
326
-
327
- expect(result).toBe(organisationId);
328
- expect(mockQuery.eq).toHaveBeenCalledWith('event_id', longEventId);
329
- });
330
-
331
- it('should handle special characters in event IDs', async () => {
332
- const specialEventId = 'event-123!@#$%^&*()';
333
- const organisationId = 'org-456';
334
-
335
- mockQuery.single.mockResolvedValue({
336
- data: { organisation_id: organisationId },
337
- error: null
338
- });
339
-
340
- const result = await getOrganisationFromEvent(mockSupabase, specialEventId);
341
-
342
- expect(result).toBe(organisationId);
343
- expect(mockQuery.eq).toHaveBeenCalledWith('event_id', specialEventId);
344
- });
345
-
346
- it('should handle concurrent calls to getOrganisationFromEvent', async () => {
347
- const eventId1 = 'event-123';
348
- const eventId2 = 'event-456';
349
- const organisationId1 = 'org-123';
350
- const organisationId2 = 'org-456';
351
-
352
- mockQuery.single
353
- .mockResolvedValueOnce({
354
- data: { organisation_id: organisationId1 },
355
- error: null
356
- })
357
- .mockResolvedValueOnce({
358
- data: { organisation_id: organisationId2 },
359
- error: null
360
- });
361
-
362
- const [result1, result2] = await Promise.all([
363
- getOrganisationFromEvent(mockSupabase, eventId1),
364
- getOrganisationFromEvent(mockSupabase, eventId2)
365
- ]);
366
-
367
- expect(result1).toBe(organisationId1);
368
- expect(result2).toBe(organisationId2);
369
- });
370
-
371
- it('should handle concurrent calls to createScopeFromEvent', async () => {
372
- const eventId1 = 'event-123';
373
- const eventId2 = 'event-456';
374
- const organisationId1 = 'org-123';
375
- const organisationId2 = 'org-456';
376
- const appId1 = 'app-123';
377
- const appId2 = 'app-456';
378
-
379
- mockQuery.single
380
- .mockResolvedValueOnce({
381
- data: { organisation_id: organisationId1 },
382
- error: null
383
- })
384
- .mockResolvedValueOnce({
385
- data: { organisation_id: organisationId2 },
386
- error: null
387
- });
388
-
389
- const [result1, result2] = await Promise.all([
390
- createScopeFromEvent(mockSupabase, eventId1, appId1),
391
- createScopeFromEvent(mockSupabase, eventId2, appId2)
392
- ]);
393
-
394
- expect(result1).toEqual({
395
- organisationId: organisationId1,
396
- eventId: eventId1,
397
- appId: appId1
398
- });
399
- expect(result2).toEqual({
400
- organisationId: organisationId2,
401
- eventId: eventId2,
402
- appId: appId2
403
- });
404
- });
405
- });
406
-
407
- describe('Type Safety', () => {
408
- it('should handle UUID types correctly', () => {
409
- const validUUID = '123e4567-e89b-12d3-a456-426614174000';
410
- const scope: Scope = {
411
- eventId: validUUID,
412
- appId: validUUID
413
- };
414
-
415
- expect(isValidEventBasedScope(scope)).toBe(true);
416
- });
417
-
418
- it('should handle string types correctly', () => {
419
- const stringId = 'event-123';
420
- const scope: Scope = {
421
- eventId: stringId,
422
- appId: 'app-456'
423
- };
424
-
425
- expect(isValidEventBasedScope(scope)).toBe(true);
426
- });
427
- });
428
- });