@jmruthers/pace-core 0.6.10 → 0.6.12

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 (1500) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/audit-tool/00-dependencies.cjs +46 -13
  3. package/audit-tool/audits/01-pace-core-compliance.cjs +96 -21
  4. package/audit-tool/audits/02-project-structure.cjs +13 -3
  5. package/audit-tool/audits/03-architecture.cjs +78 -4
  6. package/audit-tool/audits/04-code-quality.cjs +9 -2
  7. package/audit-tool/audits/05-styling.cjs +19 -7
  8. package/audit-tool/audits/06-security-rbac.cjs +105 -14
  9. package/audit-tool/audits/07-api-tech-stack.cjs +31 -15
  10. package/audit-tool/audits/08-testing-documentation.cjs +11 -3
  11. package/audit-tool/audits/09-operations.cjs +19 -7
  12. package/audit-tool/index.cjs +22 -11
  13. package/audit-tool/utils/report-utils.cjs +4 -0
  14. package/cursor-rules/01-pace-core-compliance.mdc +1 -0
  15. package/cursor-rules/02-project-structure.mdc +1 -0
  16. package/cursor-rules/03-architecture.mdc +3 -1
  17. package/cursor-rules/04-code-quality.mdc +1 -0
  18. package/cursor-rules/05-styling.mdc +41 -7
  19. package/cursor-rules/06-security-rbac.mdc +2 -1
  20. package/cursor-rules/07-api-tech-stack.mdc +1 -0
  21. package/cursor-rules/08-testing-documentation.mdc +1 -0
  22. package/cursor-rules/09-operations.mdc +1 -0
  23. package/dist/DataTable-AQAHSFLM.js +17 -0
  24. package/dist/InactivityServiceProvider-BbxwwDz1.d.ts +308 -0
  25. package/dist/UnifiedAuthProvider-Bkt_tzdS.d.ts +183 -0
  26. package/dist/api-6OQXYT67.js +6 -0
  27. package/dist/api-result-USV1Czr-.d.ts +51 -0
  28. package/dist/audit-HI2DHUVU.js +4 -0
  29. package/dist/auth-JvdRVaud.d.ts +49 -0
  30. package/dist/chunk-2DL2WSOE.js +327 -0
  31. package/dist/chunk-2GBDPPUC.js +61 -0
  32. package/dist/chunk-44CNXN4P.js +15 -0
  33. package/dist/chunk-AP5FG7W4.js +2159 -0
  34. package/dist/chunk-CU2BU2MQ.js +2 -0
  35. package/dist/chunk-D6BMFMQZ.js +200 -0
  36. package/dist/chunk-ENLXB7GP.js +721 -0
  37. package/dist/chunk-GHCUP64P.js +105 -0
  38. package/dist/chunk-H6RTU4DZ.js +1098 -0
  39. package/dist/chunk-HQTYP6BX.js +6468 -0
  40. package/dist/chunk-M7QE7XOA.js +529 -0
  41. package/dist/chunk-MVVWZ7JV.js +1329 -0
  42. package/dist/chunk-NJ7FGQWB.js +811 -0
  43. package/dist/chunk-QRYSEPHB.js +429 -0
  44. package/dist/chunk-QWIG36BZ.js +264 -0
  45. package/dist/chunk-S57OLCLO.js +2946 -0
  46. package/dist/chunk-VFLR5K2H.js +23 -0
  47. package/dist/chunk-XOJME5T7.js +407 -0
  48. package/dist/chunk-XPFVT3GN.js +492 -0
  49. package/dist/chunk-Y2LWSLLB.js +9614 -0
  50. package/dist/chunk-YFGNMB67.js +2390 -0
  51. package/dist/components.d.ts +10 -9
  52. package/dist/components.js +20 -17
  53. package/dist/database.generated-qkdoiVrJ.d.ts +9441 -0
  54. package/dist/eslint-rules/index.cjs +3 -0
  55. package/dist/eslint-rules/rules/03-architecture.cjs +74 -0
  56. package/dist/eslint-rules/rules/06-security-rbac.cjs +74 -0
  57. package/dist/event-BfCox3N2.d.ts +265 -0
  58. package/dist/file-reference-DU1hcawx.d.ts +164 -0
  59. package/dist/functions-hF5ImHCr.d.ts +208 -0
  60. package/dist/hooks.d.ts +22 -9
  61. package/dist/hooks.js +35 -25
  62. package/dist/icons/index.d.ts +1 -0
  63. package/dist/icons/index.js +1 -0
  64. package/dist/index.d.ts +69 -180
  65. package/dist/index.js +319 -342
  66. package/dist/pagination-BW1mqywp.d.ts +201 -0
  67. package/dist/providers.d.ts +6 -5
  68. package/dist/providers.js +6 -3
  69. package/dist/rbac/index.d.ts +133 -148
  70. package/dist/rbac/index.js +12 -9
  71. package/dist/theming/runtime.d.ts +19 -2
  72. package/dist/theming/runtime.js +1 -1
  73. package/dist/timezone-BTWWXKVY.d.ts +696 -0
  74. package/dist/types-Besvoyzb.d.ts +55 -0
  75. package/dist/types-CGHrxfqc.d.ts +114 -0
  76. package/dist/types.d.ts +19 -12
  77. package/dist/types.js +1 -0
  78. package/dist/usePublicPageContext-BQrHf95t.d.ts +4367 -0
  79. package/dist/usePublicRouteParams-BgV6VhMi.d.ts +946 -0
  80. package/dist/utils.d.ts +163 -145
  81. package/dist/utils.js +45 -27
  82. package/docs/api/@jmruthers/namespaces/DialogPortal/README.md +14 -0
  83. package/docs/api/@jmruthers/namespaces/DialogPortal/variables/displayName.md +11 -0
  84. package/docs/api/README.md +6 -2
  85. package/docs/api/_media/README.md +186 -0
  86. package/docs/api/classes/ColumnFactory.md +225 -0
  87. package/docs/api/classes/Logger.md +246 -0
  88. package/docs/api/classes/RBACAuditManager.md +299 -0
  89. package/docs/api/classes/RBACCache.md +389 -0
  90. package/docs/api/classes/RBACEngine.md +181 -0
  91. package/docs/api/classes/SecureSupabaseClient.md +168 -0
  92. package/docs/api/classes/StorageUtils.md +324 -0
  93. package/docs/api/enumerations/FileCategory.md +137 -0
  94. package/docs/api/enumerations/LogLevel.md +43 -0
  95. package/docs/api/enumerations/RBACErrorCode.md +169 -0
  96. package/docs/api/enumerations/RPCFunction.md +89 -0
  97. package/docs/api/functions/AccessDenied.md +30 -0
  98. package/docs/api/functions/AppSwitcher.md +21 -0
  99. package/docs/api/functions/Badge.md +42 -0
  100. package/docs/api/functions/ContextSelector.md +43 -0
  101. package/docs/api/functions/DataTable.md +36 -0
  102. package/docs/api/functions/DatePickerWithTimezone.md +28 -0
  103. package/docs/api/functions/DialogBody.md +24 -0
  104. package/docs/api/functions/DialogFooter.md +24 -0
  105. package/docs/api/functions/DialogHeader.md +24 -0
  106. package/docs/api/functions/ErrorBoundaryProvider.md +28 -0
  107. package/docs/api/functions/EventServiceProvider.md +28 -0
  108. package/docs/api/functions/FileDisplay.md +25 -0
  109. package/docs/api/functions/FileUpload.md +21 -0
  110. package/docs/api/functions/Form.md +50 -0
  111. package/docs/api/functions/FormField.md +102 -0
  112. package/docs/api/functions/Header.md +21 -0
  113. package/docs/api/functions/InactivityServiceProvider.md +28 -0
  114. package/docs/api/functions/InactivityWarningModal.md +21 -0
  115. package/docs/api/functions/Input.md +49 -0
  116. package/docs/api/functions/NavigationGuard.md +31 -0
  117. package/docs/api/functions/OrganisationServiceProvider.md +28 -0
  118. package/docs/api/functions/PaceAppLayout.md +169 -0
  119. package/docs/api/functions/PasswordChangeForm.md +21 -0
  120. package/docs/api/functions/ProtectedRoute.md +37 -0
  121. package/docs/api/functions/PublicPageFooter.md +21 -0
  122. package/docs/api/functions/PublicPageHeader.md +21 -0
  123. package/docs/api/functions/PublicPageLayout.md +33 -0
  124. package/docs/api/functions/PublicPageProvider.md +30 -0
  125. package/docs/api/functions/Textarea.md +49 -0
  126. package/docs/api/functions/Toaster.md +34 -0
  127. package/docs/api/functions/UnifiedAuthProvider.md +28 -0
  128. package/docs/api/functions/applyPalette.md +33 -0
  129. package/docs/api/functions/archiveFile.md +47 -0
  130. package/docs/api/functions/average.md +63 -0
  131. package/docs/api/functions/buildAppUrl.md +46 -0
  132. package/docs/api/functions/clearInFlightRequests.md +17 -0
  133. package/docs/api/functions/clearPalette.md +18 -0
  134. package/docs/api/functions/clearPublicEventCache.md +18 -0
  135. package/docs/api/functions/clearPublicFileDisplayCache.md +18 -0
  136. package/docs/api/functions/clearPublicLogoCache.md +18 -0
  137. package/docs/api/functions/cn.md +21 -0
  138. package/docs/api/functions/count.md +56 -0
  139. package/docs/api/functions/createAuditManager.md +45 -0
  140. package/docs/api/functions/createBaseClient.md +75 -0
  141. package/docs/api/functions/createLogger.md +95 -0
  142. package/docs/api/functions/createRBACConfig.md +21 -0
  143. package/docs/api/functions/createRBACEngine.md +33 -0
  144. package/docs/api/functions/createRBACExpressMiddleware.md +84 -0
  145. package/docs/api/functions/createRBACMiddleware.md +88 -0
  146. package/docs/api/functions/createSecureClient.md +80 -0
  147. package/docs/api/functions/createSecureDataAccess.md +39 -0
  148. package/docs/api/functions/deleteFile.md +33 -0
  149. package/docs/api/functions/disablePerformanceMonitoring.md +17 -0
  150. package/docs/api/functions/downloadFile.md +33 -0
  151. package/docs/api/functions/emitAuditEvent.md +27 -0
  152. package/docs/api/functions/enablePerformanceMonitoring.md +17 -0
  153. package/docs/api/functions/err.md +23 -0
  154. package/docs/api/functions/exportToCSV.md +56 -0
  155. package/docs/api/functions/exportToCSVWithTableRows.md +46 -0
  156. package/docs/api/functions/extractEventCodeFromPath.md +24 -0
  157. package/docs/api/functions/extractFileMetadata.md +33 -0
  158. package/docs/api/functions/formatCompactNumber.md +27 -0
  159. package/docs/api/functions/formatCurrency.md +31 -0
  160. package/docs/api/functions/formatDate.md +23 -0
  161. package/docs/api/functions/formatDateTime.md +24 -0
  162. package/docs/api/functions/formatFileSize.md +23 -0
  163. package/docs/api/functions/formatInTimeZone.md +46 -0
  164. package/docs/api/functions/formatNumber.md +31 -0
  165. package/docs/api/functions/formatPercent.md +64 -0
  166. package/docs/api/functions/formatTime.md +24 -0
  167. package/docs/api/functions/formatTimeInTimeZone.md +40 -0
  168. package/docs/api/functions/fromSupabaseClient.md +49 -0
  169. package/docs/api/functions/fromZonedTime.md +41 -0
  170. package/docs/api/functions/generateCSVContent.md +55 -0
  171. package/docs/api/functions/generateFilePath.md +29 -0
  172. package/docs/api/functions/generateFileUrlsBatch.md +33 -0
  173. package/docs/api/functions/generatePublicRoutePath.md +27 -0
  174. package/docs/api/functions/generateUniqueFileName.md +24 -0
  175. package/docs/api/functions/getAccessLevel.md +48 -0
  176. package/docs/api/functions/getAllAppPorts.md +19 -0
  177. package/docs/api/functions/getAllStylePaths.md +15 -0
  178. package/docs/api/functions/getAppConfig.md +17 -0
  179. package/docs/api/functions/getAppPort.md +34 -0
  180. package/docs/api/functions/getBucketName.md +27 -0
  181. package/docs/api/functions/getCurrentAppId.md +17 -0
  182. package/docs/api/functions/getCurrentAppName.md +17 -0
  183. package/docs/api/functions/getFileSizeLimit.md +23 -0
  184. package/docs/api/functions/getGlobalAuditManager.md +19 -0
  185. package/docs/api/functions/getInFlightRequestCount.md +19 -0
  186. package/docs/api/functions/getPerformanceMetrics.md +17 -0
  187. package/docs/api/functions/getPerformanceSummary.md +17 -0
  188. package/docs/api/functions/getPermissionMap.md +52 -0
  189. package/docs/api/functions/getPublicEventCacheStats.md +25 -0
  190. package/docs/api/functions/getPublicFileDisplayCacheStats.md +25 -0
  191. package/docs/api/functions/getPublicLogoCacheStats.md +25 -0
  192. package/docs/api/functions/getPublicUrl.md +39 -0
  193. package/docs/api/functions/getRBACConfig.md +15 -0
  194. package/docs/api/functions/getRBACLogger.md +15 -0
  195. package/docs/api/functions/getRoleContext.md +31 -0
  196. package/docs/api/functions/getSignedUrl.md +34 -0
  197. package/docs/api/functions/getStylePath.md +21 -0
  198. package/docs/api/functions/getTimeZoneDifference.md +40 -0
  199. package/docs/api/functions/getTimezoneAbbreviation.md +40 -0
  200. package/docs/api/functions/getUserTimeZone.md +26 -0
  201. package/docs/api/functions/hasAllPermissions.md +41 -0
  202. package/docs/api/functions/hasAnyPermission.md +41 -0
  203. package/docs/api/functions/isDebugMode.md +15 -0
  204. package/docs/api/functions/isDevelopmentMode.md +15 -0
  205. package/docs/api/functions/isErr.md +29 -0
  206. package/docs/api/functions/isOk.md +29 -0
  207. package/docs/api/functions/isPerformanceMonitoringEnabled.md +17 -0
  208. package/docs/api/functions/isPermitted.md +58 -0
  209. package/docs/api/functions/isPermittedCached.md +36 -0
  210. package/docs/api/functions/isRBACInitialized.md +19 -0
  211. package/docs/api/functions/isSecureClient.md +38 -0
  212. package/docs/api/functions/isValidPermission.md +27 -0
  213. package/docs/api/functions/listFiles.md +29 -0
  214. package/docs/api/functions/max.md +63 -0
  215. package/docs/api/functions/min.md +63 -0
  216. package/docs/api/functions/ok.md +29 -0
  217. package/docs/api/functions/parseAndNormalizeEventColours.md +105 -0
  218. package/docs/api/functions/recordAuditEvent.md +23 -0
  219. package/docs/api/functions/recordPermissionCheck.md +31 -0
  220. package/docs/api/functions/resetPerformanceMetrics.md +17 -0
  221. package/docs/api/functions/resolveAppContext.md +27 -0
  222. package/docs/api/functions/roundToNearestMinutes.md +41 -0
  223. package/docs/api/functions/sanitizeFormData.md +49 -0
  224. package/docs/api/functions/sanitizeHtml.md +39 -0
  225. package/docs/api/functions/sanitizeUserInput.md +27 -0
  226. package/docs/api/functions/setAppConfig.md +23 -0
  227. package/docs/api/functions/setGlobalAuditManager.md +25 -0
  228. package/docs/api/functions/setupRBAC.md +31 -0
  229. package/docs/api/functions/sum.md +63 -0
  230. package/docs/api/functions/toZonedTime.md +41 -0
  231. package/docs/api/functions/uploadFile.md +32 -0
  232. package/docs/api/functions/useAccessLevel.md +71 -0
  233. package/docs/api/functions/useAccessibleApps.md +55 -0
  234. package/docs/api/functions/useAppConfig.md +20 -0
  235. package/docs/api/functions/useAuthService.md +15 -0
  236. package/docs/api/functions/useCan.md +99 -0
  237. package/docs/api/functions/useEventService.md +15 -0
  238. package/docs/api/functions/useEventTheme.md +26 -0
  239. package/docs/api/functions/useEvents.md +45 -0
  240. package/docs/api/functions/useFileReference.md +264 -0
  241. package/docs/api/functions/useFileReferenceById.md +63 -0
  242. package/docs/api/functions/useFileReferenceForRecord.md +129 -0
  243. package/docs/api/functions/useFilesByCategory.md +80 -0
  244. package/docs/api/functions/useFormDialog.md +62 -0
  245. package/docs/api/functions/useInactivityService.md +15 -0
  246. package/docs/api/functions/useInactivityTracker.md +21 -0
  247. package/docs/api/functions/useIsPublicPage.md +19 -0
  248. package/docs/api/functions/useMultiplePermissions.md +88 -0
  249. package/docs/api/functions/useOptionalEvents.md +31 -0
  250. package/docs/api/functions/useOrganisationPermissions.md +27 -0
  251. package/docs/api/functions/useOrganisationSecurity.md +15 -0
  252. package/docs/api/functions/useOrganisationService.md +15 -0
  253. package/docs/api/functions/useOrganisations.md +48 -0
  254. package/docs/api/functions/usePermissions.md +130 -0
  255. package/docs/api/functions/usePublicEvent.md +36 -0
  256. package/docs/api/functions/usePublicEventCode.md +32 -0
  257. package/docs/api/functions/usePublicEventLogo.md +48 -0
  258. package/docs/api/functions/usePublicFileDisplay.md +54 -0
  259. package/docs/api/functions/usePublicPageContext.md +19 -0
  260. package/docs/api/functions/usePublicRouteParams.md +31 -0
  261. package/docs/api/functions/useRBAC.md +21 -0
  262. package/docs/api/functions/useResolvedScope.md +46 -0
  263. package/docs/api/functions/useResourcePermissions.md +25 -0
  264. package/docs/api/functions/useRoleManagement.md +121 -0
  265. package/docs/api/functions/useSecureSupabase.md +51 -0
  266. package/docs/api/functions/useSessionRestoration.md +15 -0
  267. package/docs/api/functions/useSessionTracking.md +62 -0
  268. package/docs/api/functions/useToast.md +83 -0
  269. package/docs/api/functions/useUnifiedAuth.md +24 -0
  270. package/docs/api/functions/useZodForm.md +27 -0
  271. package/docs/api/functions/validateFileSize.md +31 -0
  272. package/docs/api/functions/warnIfInsecureClient.md +40 -0
  273. package/docs/api/functions/withAccessLevelGuard.md +67 -0
  274. package/docs/api/functions/withPermissionGuard.md +73 -0
  275. package/docs/api/functions/withRoleGuard.md +86 -0
  276. package/docs/api/globals.md +502 -0
  277. package/docs/api/interfaces/AccessDeniedProps.md +87 -0
  278. package/docs/api/interfaces/AccessibleApp.md +41 -0
  279. package/docs/api/interfaces/AddressFieldProps.md +195 -0
  280. package/docs/api/interfaces/AddressFieldRef.md +67 -0
  281. package/docs/api/interfaces/AggregateConfig.md +35 -0
  282. package/docs/api/interfaces/AppSwitcherProps.md +51 -0
  283. package/docs/api/interfaces/AuthSessionData.md +27 -0
  284. package/docs/api/interfaces/AutocompleteOptions.md +61 -0
  285. package/docs/api/interfaces/AvatarProps.md +97 -0
  286. package/docs/api/interfaces/BadgeProps.md +30 -0
  287. package/docs/api/interfaces/BuildAppUrlOptions.md +41 -0
  288. package/docs/api/interfaces/ButtonProps.md +46 -0
  289. package/docs/api/interfaces/CalendarProps.md +60 -0
  290. package/docs/api/interfaces/CardProps.md +56 -0
  291. package/docs/api/interfaces/ColorPalette.md +13 -0
  292. package/docs/api/interfaces/ColorShade.md +58 -0
  293. package/docs/api/interfaces/ContextSelectorProps.md +131 -0
  294. package/docs/api/interfaces/DataRecord.md +16 -0
  295. package/docs/api/interfaces/DataTableAction.md +198 -0
  296. package/docs/api/interfaces/DataTableColumn.md +422 -0
  297. package/docs/api/interfaces/DataTableProps.md +511 -0
  298. package/docs/api/interfaces/DataTableToolbarButton.md +75 -0
  299. package/docs/api/interfaces/DatePickerWithTimezoneProps.md +75 -0
  300. package/docs/api/interfaces/DialogBodyProps.md +55 -0
  301. package/docs/api/interfaces/DialogCloseProps.md +25 -0
  302. package/docs/api/interfaces/DialogContentProps.md +160 -0
  303. package/docs/api/interfaces/DialogFooterProps.md +25 -0
  304. package/docs/api/interfaces/DialogHeaderProps.md +25 -0
  305. package/docs/api/interfaces/DialogPortalProps.md +19 -0
  306. package/docs/api/interfaces/DialogProps.md +53 -0
  307. package/docs/api/interfaces/DialogTriggerProps.md +53 -0
  308. package/docs/api/interfaces/EmptyStateConfig.md +55 -0
  309. package/docs/api/interfaces/ErrorBoundaryProps.md +131 -0
  310. package/docs/api/interfaces/ErrorBoundaryProviderProps.md +31 -0
  311. package/docs/api/interfaces/ErrorBoundaryState.md +61 -0
  312. package/docs/api/interfaces/EventAppRoleData.md +54 -0
  313. package/docs/api/interfaces/ExportColumn.md +69 -0
  314. package/docs/api/interfaces/ExportOptions.md +109 -0
  315. package/docs/api/interfaces/FileDisplayProps.md +192 -0
  316. package/docs/api/interfaces/FileMetadata.md +97 -0
  317. package/docs/api/interfaces/FileReference.md +89 -0
  318. package/docs/api/interfaces/FileSizeLimits.md +13 -0
  319. package/docs/api/interfaces/FileUploadOptions.md +107 -0
  320. package/docs/api/interfaces/FooterProps.md +37 -0
  321. package/docs/api/interfaces/FormFieldProps.md +171 -0
  322. package/docs/api/interfaces/FormProps.md +93 -0
  323. package/docs/api/interfaces/GrantEventAppRoleParams.md +97 -0
  324. package/docs/api/interfaces/ImportSummary.md +49 -0
  325. package/docs/api/interfaces/InactivityWarningModalProps.md +87 -0
  326. package/docs/api/interfaces/InputProps.md +46 -0
  327. package/docs/api/interfaces/InvalidScopeError.md +37 -0
  328. package/docs/api/interfaces/LabelProps.md +85 -0
  329. package/docs/api/interfaces/LoggerConfig.md +51 -0
  330. package/docs/api/interfaces/LoginFormProps.md +146 -0
  331. package/docs/api/interfaces/MissingUserContextError.md +37 -0
  332. package/docs/api/interfaces/NavigationGuardProps.md +109 -0
  333. package/docs/api/interfaces/NavigationItem.md +91 -0
  334. package/docs/api/interfaces/NavigationMenuProps.md +169 -0
  335. package/docs/api/interfaces/Organisation.md +105 -0
  336. package/docs/api/interfaces/OrganisationContextRequiredError.md +37 -0
  337. package/docs/api/interfaces/OrganisationMembership.md +105 -0
  338. package/docs/api/interfaces/OrganisationSecurityError.md +49 -0
  339. package/docs/api/interfaces/PaceAppLayoutPermissionConfig.md +127 -0
  340. package/docs/api/interfaces/PaceAppLayoutRouteConfigItem.md +91 -0
  341. package/docs/api/interfaces/PaceAppLayoutRoutingConfig.md +79 -0
  342. package/docs/api/interfaces/PaceLoginPageProps.md +41 -0
  343. package/docs/api/interfaces/PagePermissionGuardProps.md +143 -0
  344. package/docs/api/interfaces/PaletteData.md +33 -0
  345. package/docs/api/interfaces/ParsedAddress.md +91 -0
  346. package/docs/api/interfaces/PermissionDeniedError.md +37 -0
  347. package/docs/api/interfaces/ProgressProps.md +35 -0
  348. package/docs/api/interfaces/ProtectedRouteProps.md +67 -0
  349. package/docs/api/interfaces/PublicPageFooterProps.md +97 -0
  350. package/docs/api/interfaces/PublicPageHeaderProps.md +99 -0
  351. package/docs/api/interfaces/PublicPageLayoutProps.md +153 -0
  352. package/docs/api/interfaces/RBACAccessValidateParams.md +41 -0
  353. package/docs/api/interfaces/RBACAccessValidateResult.md +33 -0
  354. package/docs/api/interfaces/RBACAuditLogParams.md +65 -0
  355. package/docs/api/interfaces/RBACAuditLogResult.md +41 -0
  356. package/docs/api/interfaces/RBACContext.md +41 -0
  357. package/docs/api/interfaces/RBACError.md +37 -0
  358. package/docs/api/interfaces/RBACLogger.md +97 -0
  359. package/docs/api/interfaces/RBACNotInitializedError.md +37 -0
  360. package/docs/api/interfaces/RBACPageAccessCheckParams.md +57 -0
  361. package/docs/api/interfaces/RBACPerformanceMetrics.md +109 -0
  362. package/docs/api/interfaces/RBACPermissionCheckParams.md +57 -0
  363. package/docs/api/interfaces/RBACPermissionCheckResult.md +41 -0
  364. package/docs/api/interfaces/RBACPermissionsGetParams.md +49 -0
  365. package/docs/api/interfaces/RBACPermissionsGetResult.md +49 -0
  366. package/docs/api/interfaces/RBACResult.md +47 -0
  367. package/docs/api/interfaces/RBACRoleGrantParams.md +49 -0
  368. package/docs/api/interfaces/RBACRoleGrantResult.md +41 -0
  369. package/docs/api/interfaces/RBACRoleRevokeParams.md +49 -0
  370. package/docs/api/interfaces/RBACRoleRevokeResult.md +41 -0
  371. package/docs/api/interfaces/RBACRoleValidateParams.md +41 -0
  372. package/docs/api/interfaces/RBACRoleValidateResult.md +49 -0
  373. package/docs/api/interfaces/RBACRolesListParams.md +41 -0
  374. package/docs/api/interfaces/RBACRolesListResult.md +57 -0
  375. package/docs/api/interfaces/RBACSessionTrackParams.md +57 -0
  376. package/docs/api/interfaces/RBACSessionTrackResult.md +41 -0
  377. package/docs/api/interfaces/ResourcePermissions.md +119 -0
  378. package/docs/api/interfaces/RevokeEventAppRoleParams.md +81 -0
  379. package/docs/api/interfaces/RoleManagementResult.md +41 -0
  380. package/docs/api/interfaces/SessionRestorationLoaderProps.md +29 -0
  381. package/docs/api/interfaces/StorageConfig.md +33 -0
  382. package/docs/api/interfaces/StorageFileInfo.md +57 -0
  383. package/docs/api/interfaces/StorageFileMetadata.md +113 -0
  384. package/docs/api/interfaces/StorageListOptions.md +79 -0
  385. package/docs/api/interfaces/StorageListResult.md +33 -0
  386. package/docs/api/interfaces/StorageUploadOptions.md +81 -0
  387. package/docs/api/interfaces/StorageUploadResult.md +49 -0
  388. package/docs/api/interfaces/StorageUploadSuccess.md +35 -0
  389. package/docs/api/interfaces/StorageUrlOptions.md +49 -0
  390. package/docs/api/interfaces/StyleImport.md +17 -0
  391. package/docs/api/interfaces/SwitchProps.md +30 -0
  392. package/docs/api/interfaces/TabsContentProps.md +13 -0
  393. package/docs/api/interfaces/TabsListProps.md +13 -0
  394. package/docs/api/interfaces/TabsProps.md +13 -0
  395. package/docs/api/interfaces/TabsTriggerProps.md +41 -0
  396. package/docs/api/interfaces/TextareaProps.md +43 -0
  397. package/docs/api/interfaces/ToastActionElement.md +16 -0
  398. package/docs/api/interfaces/ToastProps.md +13 -0
  399. package/docs/api/interfaces/UnifiedAuthProviderProps.md +129 -0
  400. package/docs/api/interfaces/UseAccessibleAppsReturn.md +55 -0
  401. package/docs/api/interfaces/UseFormDialogOptions.md +49 -0
  402. package/docs/api/interfaces/UseFormDialogReturn.md +95 -0
  403. package/docs/api/interfaces/UseInactivityTrackerOptions.md +103 -0
  404. package/docs/api/interfaces/UseInactivityTrackerReturn.md +91 -0
  405. package/docs/api/interfaces/UsePublicEventLogoOptions.md +69 -0
  406. package/docs/api/interfaces/UsePublicEventLogoReturn.md +66 -0
  407. package/docs/api/interfaces/UsePublicEventOptions.md +29 -0
  408. package/docs/api/interfaces/UsePublicEventReturn.md +56 -0
  409. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +39 -0
  410. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +96 -0
  411. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +76 -0
  412. package/docs/api/interfaces/UseResolvedScopeOptions.md +49 -0
  413. package/docs/api/interfaces/UseResolvedScopeReturn.md +39 -0
  414. package/docs/api/interfaces/UseResourcePermissionsOptions.md +29 -0
  415. package/docs/api/interfaces/UserEventAccess.md +92 -0
  416. package/docs/api/interfaces/UserMenuProps.md +69 -0
  417. package/docs/api/interfaces/UserProfile.md +49 -0
  418. package/docs/api/type-aliases/AccessLevel.md +11 -0
  419. package/docs/api/type-aliases/AccessLevelContext.md +14 -0
  420. package/docs/api/type-aliases/AllPermissions.md +11 -0
  421. package/docs/api/type-aliases/ApiError.md +37 -0
  422. package/docs/api/type-aliases/ApiResult.md +19 -0
  423. package/docs/api/type-aliases/AuditEventType.md +11 -0
  424. package/docs/api/type-aliases/BadgeVariant.md +18 -0
  425. package/docs/api/type-aliases/DataTableFeatureConfig.md +14 -0
  426. package/docs/api/type-aliases/DialogSize.md +13 -0
  427. package/docs/api/type-aliases/EventAppRole.md +11 -0
  428. package/docs/api/type-aliases/FileUploadProps.md +15 -0
  429. package/docs/api/type-aliases/GetRowId.md +33 -0
  430. package/docs/api/type-aliases/GlobalErrorHandler.md +35 -0
  431. package/docs/api/type-aliases/GlobalRole.md +11 -0
  432. package/docs/api/type-aliases/ImportHandlerResult.md +13 -0
  433. package/docs/api/type-aliases/NavigationMode.md +13 -0
  434. package/docs/api/type-aliases/Operation.md +11 -0
  435. package/docs/api/type-aliases/OrganisationContextType.md +13 -0
  436. package/docs/api/type-aliases/OrganisationRole.md +11 -0
  437. package/docs/api/type-aliases/PaceAppLayoutProps.md +14 -0
  438. package/docs/api/type-aliases/Permission.md +11 -0
  439. package/docs/api/type-aliases/PermissionCheck.md +46 -0
  440. package/docs/api/type-aliases/PermissionMap.md +11 -0
  441. package/docs/api/type-aliases/PermissionSource.md +13 -0
  442. package/docs/api/type-aliases/RBACConfig.md +13 -0
  443. package/docs/api/type-aliases/RBACFunctionResponse.md +57 -0
  444. package/docs/api/type-aliases/Scope.md +41 -0
  445. package/docs/api/type-aliases/SessionType.md +11 -0
  446. package/docs/api/type-aliases/UUID.md +11 -0
  447. package/docs/api/type-aliases/UnifiedAuthContextType.md +13 -0
  448. package/docs/api/type-aliases/UseFileReferenceForRecordReturn.md +161 -0
  449. package/docs/api/type-aliases/UseFileReferenceOptions.md +35 -0
  450. package/docs/api/type-aliases/UseFileReferenceReturn.md +13 -0
  451. package/docs/api/variables/ALL_PERMISSIONS.md +281 -0
  452. package/docs/api/variables/APP_PATH_MAPPING.md +14 -0
  453. package/docs/api/variables/AddressField.md +41 -0
  454. package/docs/api/variables/Alert.md +11 -0
  455. package/docs/api/variables/AlertDescription.md +11 -0
  456. package/docs/api/variables/AlertTitle.md +11 -0
  457. package/docs/api/variables/Avatar.md +13 -0
  458. package/docs/api/variables/Button.md +31 -0
  459. package/docs/api/variables/CACHE_PATTERNS.md +89 -0
  460. package/docs/api/variables/Calendar.md +74 -0
  461. package/docs/api/variables/Card.md +11 -0
  462. package/docs/api/variables/CardActions.md +11 -0
  463. package/docs/api/variables/CardContent.md +11 -0
  464. package/docs/api/variables/CardDescription.md +11 -0
  465. package/docs/api/variables/CardFooter.md +11 -0
  466. package/docs/api/variables/CardHeader.md +11 -0
  467. package/docs/api/variables/CardTitle.md +11 -0
  468. package/docs/api/variables/Checkbox.md +11 -0
  469. package/docs/api/variables/DEFAULT_APP_PORT_MAP.md +14 -0
  470. package/docs/api/variables/DEFAULT_FILE_SIZE_LIMIT.md +13 -0
  471. package/docs/api/variables/Dialog.md +14 -0
  472. package/docs/api/variables/DialogClose.md +14 -0
  473. package/docs/api/variables/DialogContent.md +28 -0
  474. package/docs/api/variables/DialogDescription.md +14 -0
  475. package/docs/api/variables/DialogPortal.md +14 -0
  476. package/docs/api/variables/DialogTitle.md +14 -0
  477. package/docs/api/variables/DialogTrigger.md +14 -0
  478. package/docs/api/variables/EVENT_APP_PERMISSIONS.md +109 -0
  479. package/docs/api/variables/ErrorBoundary.md +15 -0
  480. package/docs/api/variables/FILE_SIZE_LIMITS.md +13 -0
  481. package/docs/api/variables/Footer.md +11 -0
  482. package/docs/api/variables/GLOBAL_PERMISSIONS.md +29 -0
  483. package/docs/api/variables/Label.md +34 -0
  484. package/docs/api/variables/LoadingSpinner.md +28 -0
  485. package/docs/api/variables/LoginForm.md +34 -0
  486. package/docs/api/variables/NavigationMenu.md +203 -0
  487. package/docs/api/variables/ORGANISATION_PERMISSIONS.md +89 -0
  488. package/docs/api/variables/PAGE_PERMISSIONS.md +93 -0
  489. package/docs/api/variables/PaceLoginPage.md +40 -0
  490. package/docs/api/variables/PagePermissionGuard.md +11 -0
  491. package/docs/api/variables/Progress.md +32 -0
  492. package/docs/api/variables/SECURE_CLIENT_SYMBOL.md +14 -0
  493. package/docs/api/variables/STORAGE_CONFIG.md +13 -0
  494. package/docs/api/variables/Select.md +26 -0
  495. package/docs/api/variables/SelectContent.md +26 -0
  496. package/docs/api/variables/SelectGroup.md +26 -0
  497. package/docs/api/variables/SelectItem.md +26 -0
  498. package/docs/api/variables/SelectLabel.md +26 -0
  499. package/docs/api/variables/SelectSeparator.md +26 -0
  500. package/docs/api/variables/SelectTrigger.md +26 -0
  501. package/docs/api/variables/SelectValue.md +26 -0
  502. package/docs/api/variables/SessionRestorationLoader.md +11 -0
  503. package/docs/api/variables/Switch.md +23 -0
  504. package/docs/api/variables/Table.md +35 -0
  505. package/docs/api/variables/TableBody.md +11 -0
  506. package/docs/api/variables/TableCaption.md +11 -0
  507. package/docs/api/variables/TableCell.md +11 -0
  508. package/docs/api/variables/TableFooter.md +11 -0
  509. package/docs/api/variables/TableHead.md +11 -0
  510. package/docs/api/variables/TableHeader.md +11 -0
  511. package/docs/api/variables/TableRow.md +11 -0
  512. package/docs/api/variables/Tabs.md +25 -0
  513. package/docs/api/variables/TabsContent.md +24 -0
  514. package/docs/api/variables/TabsList.md +25 -0
  515. package/docs/api/variables/TabsTrigger.md +34 -0
  516. package/docs/api/variables/Toast.md +36 -0
  517. package/docs/api/variables/ToastAction.md +32 -0
  518. package/docs/api/variables/ToastClose.md +32 -0
  519. package/docs/api/variables/ToastDescription.md +32 -0
  520. package/docs/api/variables/ToastProvider.md +11 -0
  521. package/docs/api/variables/ToastTitle.md +32 -0
  522. package/docs/api/variables/ToastViewport.md +26 -0
  523. package/docs/api/variables/Tooltip.md +34 -0
  524. package/docs/api/variables/TooltipContent.md +34 -0
  525. package/docs/api/variables/TooltipProvider.md +11 -0
  526. package/docs/api/variables/TooltipRoot.md +11 -0
  527. package/docs/api/variables/TooltipTrigger.md +11 -0
  528. package/docs/api/variables/UserMenu.md +11 -0
  529. package/docs/api/variables/emailSchema.md +13 -0
  530. package/docs/api/variables/logger.md +203 -0
  531. package/docs/api/variables/nameSchema.md +13 -0
  532. package/docs/api/variables/passwordSchema.md +13 -0
  533. package/docs/api/variables/phoneSchema.md +13 -0
  534. package/docs/api/variables/rbacCache.md +16 -0
  535. package/docs/api/variables/styleConfig.md +25 -0
  536. package/docs/api/variables/urlSchema.md +13 -0
  537. package/docs/api-reference/hooks.md +2 -0
  538. package/docs/api-reference/rpc-functions.md +12 -3
  539. package/docs/core-concepts/rbac-system.md +8 -0
  540. package/docs/getting-started/cursor-rules.md +17 -20
  541. package/docs/getting-started/dependencies.md +1 -1
  542. package/docs/getting-started/setup.md +235 -0
  543. package/docs/implementation-guides/authentication.md +27 -0
  544. package/docs/implementation-guides/data-tables.md +184 -3
  545. package/docs/migration/ApiResult-migration.md +25 -0
  546. package/docs/rbac/api-reference.md +33 -31
  547. package/docs/rbac/getting-started.md +7 -0
  548. package/docs/rbac/troubleshooting.md +5 -1
  549. package/docs/standards/0-standards-overview.md +50 -15
  550. package/docs/standards/1-pace-core-compliance-standards.md +62 -57
  551. package/docs/standards/2-project-structure-standards.md +33 -16
  552. package/docs/standards/3-architecture-standards.md +41 -1
  553. package/docs/standards/4-code-quality-standards.md +26 -6
  554. package/docs/standards/5-styling-standards.md +35 -1
  555. package/docs/standards/6-security-rbac-standards.md +66 -0
  556. package/docs/standards/7-api-tech-stack-standards.md +25 -14
  557. package/docs/standards/8-testing-documentation-standards.md +31 -0
  558. package/docs/standards/9-operations-standards.md +19 -0
  559. package/docs/standards/README.md +20 -201
  560. package/docs/testing/test-setup-for-consumers.md +2 -0
  561. package/docs/troubleshooting/common-issues.md +17 -1
  562. package/docs/troubleshooting/organisation-context-setup.md +8 -0
  563. package/docs/troubleshooting/print-event-name-css-variable-analysis.md +217 -0
  564. package/eslint-config-pace-core.cjs +20 -0
  565. package/package.json +16 -22
  566. package/scripts/build-docs.js +180 -0
  567. package/scripts/setup.cjs +536 -0
  568. package/scripts/validate.cjs +480 -0
  569. package/src/__tests__/helpers/component-test-utils.test.tsx +260 -0
  570. package/src/__tests__/helpers/optimized-test-setup.test.ts +224 -0
  571. package/src/__tests__/helpers/supabaseMock.test.ts +273 -0
  572. package/src/__tests__/helpers/test-providers.test.tsx +99 -0
  573. package/src/__tests__/helpers/test-providers.tsx +37 -39
  574. package/src/__tests__/helpers/test-utils.test.tsx +447 -0
  575. package/src/__tests__/helpers/timer-utils.test.ts +371 -0
  576. package/src/assets/app-icons/index.test.ts +304 -0
  577. package/src/components/AddressField/AddressField.test.tsx +1 -1
  578. package/src/components/AddressField/AddressField.tsx +238 -212
  579. package/src/components/Button/Button.tsx +1 -1
  580. package/src/components/Card/Card.test.tsx +172 -17
  581. package/src/components/Card/Card.tsx +19 -10
  582. package/src/components/ContextSelector/ContextSelector.internals.tsx +204 -0
  583. package/src/components/ContextSelector/ContextSelector.test.tsx +360 -0
  584. package/src/components/ContextSelector/ContextSelector.tsx +66 -280
  585. package/src/components/ContextSelector/ContextSelector.types.ts +35 -0
  586. package/src/components/ContextSelector/useContextSelectorState.tsx +195 -0
  587. package/src/components/DataTable/AUDIT_REPORT.md +59 -44
  588. package/src/components/DataTable/DataTable.comprehensive.test.tsx +759 -0
  589. package/src/components/DataTable/DataTable.default-state.test.tsx +524 -0
  590. package/src/components/DataTable/DataTable.export.test.tsx +705 -0
  591. package/src/components/DataTable/DataTable.grouping-aggregation.test.tsx +658 -0
  592. package/src/components/DataTable/DataTable.hooks.test.tsx +192 -0
  593. package/src/components/DataTable/DataTable.select-label-display.test.tsx +485 -0
  594. package/src/components/DataTable/DataTable.test.tsx +787 -416
  595. package/src/components/DataTable/DataTable.tsx +12 -12
  596. package/src/components/DataTable/DataTableCore.integration.test.tsx +458 -0
  597. package/src/components/DataTable/DataTableCore.test-setup.ts +221 -0
  598. package/src/components/DataTable/DataTableCore.test.tsx +970 -0
  599. package/src/components/DataTable/README.md +155 -0
  600. package/src/components/DataTable/TESTING.md +101 -0
  601. package/src/components/DataTable/a11y.basic.test.tsx +788 -0
  602. package/src/components/DataTable/components/DataTableCore.tsx +104 -864
  603. package/src/components/DataTable/components/GroupingDropdown.test.tsx +621 -0
  604. package/src/components/DataTable/components/GroupingDropdown.tsx +2 -2
  605. package/src/components/DataTable/components/ImportModal.tsx +61 -559
  606. package/src/components/DataTable/components/ImportModalFileSection.tsx +148 -0
  607. package/src/components/DataTable/context/DataTableContext.test.tsx +328 -0
  608. package/src/components/DataTable/context/DataTableContext.tsx +7 -6
  609. package/src/components/DataTable/core/ColumnFactory.test.ts +403 -0
  610. package/src/components/DataTable/hooks/useColumnOrderPersistence.test.ts +516 -0
  611. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.test.ts +256 -0
  612. package/src/components/DataTable/hooks/useDataTableConfiguration.test.ts +297 -0
  613. package/src/components/DataTable/hooks/useDataTableConfiguration.ts +14 -2
  614. package/src/components/DataTable/hooks/useDataTableDataPipeline.test.ts +270 -0
  615. package/src/components/DataTable/hooks/useDataTableDeletionBatching.test.ts +127 -0
  616. package/src/components/DataTable/hooks/useDataTableDeletionBatching.ts +106 -0
  617. package/src/components/DataTable/hooks/useDataTableEffectiveActions.test.ts +461 -0
  618. package/src/components/DataTable/hooks/useDataTableEffectiveActions.ts +248 -0
  619. package/src/components/DataTable/hooks/useDataTableLayoutHandlers.test.ts +296 -0
  620. package/src/components/DataTable/hooks/useDataTableLayoutHandlers.ts +175 -0
  621. package/src/components/DataTable/hooks/useDataTablePaginationSync.test.ts +203 -0
  622. package/src/components/DataTable/hooks/useDataTablePaginationSync.ts +109 -0
  623. package/src/components/DataTable/hooks/useDataTablePermissions.test.ts +280 -0
  624. package/src/components/DataTable/hooks/useDataTablePermissions.ts +79 -247
  625. package/src/components/DataTable/hooks/useDataTablePipeline.test.tsx +219 -0
  626. package/src/components/DataTable/hooks/useDataTablePipeline.tsx +239 -0
  627. package/src/components/DataTable/hooks/useDataTableRenderGuard.test.tsx +316 -0
  628. package/src/components/DataTable/hooks/useDataTableRenderGuard.tsx +195 -0
  629. package/src/components/DataTable/hooks/useDataTableScope.test.ts +102 -0
  630. package/src/components/DataTable/hooks/useDataTableScope.ts +125 -0
  631. package/src/components/DataTable/hooks/useDataTableState.test.ts +733 -0
  632. package/src/components/DataTable/hooks/useDataTableState.ts +145 -94
  633. package/src/components/DataTable/hooks/useDataTableStateAndPersistence.test.ts +277 -0
  634. package/src/components/DataTable/hooks/useDataTableStateAndPersistence.ts +222 -0
  635. package/src/components/DataTable/hooks/useDataTableSuperAdmin.test.ts +93 -0
  636. package/src/components/DataTable/hooks/useDataTableSuperAdmin.ts +86 -0
  637. package/src/components/DataTable/hooks/useDataTableTableInstance.test.ts +185 -0
  638. package/src/components/DataTable/hooks/useDataTableTableInstance.ts +178 -0
  639. package/src/components/DataTable/hooks/useEffectiveColumnOrder.test.ts +183 -0
  640. package/src/components/DataTable/hooks/useHierarchicalState.test.ts +294 -0
  641. package/src/components/DataTable/hooks/useImportModalFocus.test.ts +184 -0
  642. package/src/components/DataTable/hooks/useImportModalFocus.ts +53 -0
  643. package/src/components/DataTable/hooks/useImportModalState.test.ts +390 -0
  644. package/src/components/DataTable/hooks/useImportModalState.ts +345 -0
  645. package/src/components/DataTable/hooks/useKeyboardNavigation.test.ts +787 -0
  646. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +309 -269
  647. package/src/components/DataTable/hooks/usePermissionTracking.test.ts +381 -0
  648. package/src/components/DataTable/hooks/usePermissionTracking.ts +122 -0
  649. package/src/components/DataTable/hooks/useServerSideDataEffect.test.ts +258 -0
  650. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +14 -3
  651. package/src/components/DataTable/hooks/useTableColumns.test.ts +499 -0
  652. package/src/components/DataTable/hooks/useTableHandlers.test.ts +461 -0
  653. package/src/components/DataTable/hooks/useTableHandlers.ts +5 -2
  654. package/src/components/DataTable/index.ts +18 -17
  655. package/src/components/DataTable/keyboard.test.tsx +734 -0
  656. package/src/components/DataTable/mocks/MockRBACProvider.tsx +66 -0
  657. package/src/components/DataTable/pagination.modes.test.tsx +728 -0
  658. package/src/components/DataTable/ssr.strict-mode.test.tsx +319 -0
  659. package/src/components/DataTable/styles.test.ts +379 -0
  660. package/src/components/DataTable/styles.ts +0 -1
  661. package/src/components/DataTable/test-utils/MockDataTableComponents.tsx +55 -0
  662. package/src/components/DataTable/test-utils/dataFactories.ts +103 -0
  663. package/src/components/DataTable/test-utils/featureConfig.ts +10 -0
  664. package/src/components/DataTable/test-utils/sharedTestUtils.ts +419 -0
  665. package/src/components/DataTable/test-utils.ts +94 -0
  666. package/src/components/DataTable/types/actions.ts +71 -0
  667. package/src/components/DataTable/types/base.ts +39 -0
  668. package/src/components/DataTable/types/columns.ts +125 -0
  669. package/src/components/DataTable/types/export.ts +32 -0
  670. package/src/components/DataTable/types/features.ts +81 -0
  671. package/src/components/DataTable/types/hierarchical.ts +44 -0
  672. package/src/components/DataTable/types/index.ts +43 -0
  673. package/src/components/DataTable/types/pagination.ts +85 -0
  674. package/src/components/DataTable/types/performance.ts +47 -0
  675. package/src/components/DataTable/types/props.ts +62 -0
  676. package/src/components/DataTable/types/rbac.ts +45 -0
  677. package/src/components/DataTable/ui/layout/DataTableCore.test.tsx +1194 -0
  678. package/src/components/DataTable/ui/layout/DataTableCore.tsx +345 -0
  679. package/src/components/DataTable/ui/layout/DataTableErrorBoundary.test.tsx +438 -0
  680. package/src/components/DataTable/ui/layout/DataTableErrorBoundary.tsx +225 -0
  681. package/src/components/DataTable/ui/layout/DataTableLayout.test.tsx +1352 -0
  682. package/src/components/DataTable/ui/layout/DataTableLayout.tsx +661 -0
  683. package/src/components/DataTable/ui/modals/BulkDeleteConfirmDialog.test.tsx +91 -0
  684. package/src/components/DataTable/ui/modals/BulkDeleteConfirmDialog.tsx +43 -0
  685. package/src/components/DataTable/ui/modals/DataTableModals.test.tsx +749 -0
  686. package/src/components/DataTable/ui/modals/DataTableModals.tsx +341 -0
  687. package/src/components/DataTable/ui/modals/ImportModal.test.tsx +1834 -0
  688. package/src/components/DataTable/ui/modals/ImportModal.tsx +197 -0
  689. package/src/components/DataTable/ui/modals/ImportModalFailedRowsSection.tsx +60 -0
  690. package/src/components/DataTable/ui/modals/ImportModalFileSection.tsx +148 -0
  691. package/src/components/DataTable/ui/modals/ImportModalPreviewSection.tsx +60 -0
  692. package/src/components/DataTable/ui/modals/ImportModalSummarySection.tsx +59 -0
  693. package/src/components/DataTable/ui/modals/importModalPersistence.ts +73 -0
  694. package/src/components/DataTable/ui/shared/AccessDeniedPage.test.tsx +245 -0
  695. package/src/components/DataTable/ui/shared/AccessDeniedPage.tsx +159 -0
  696. package/src/components/DataTable/ui/shared/ActionButtons.test.tsx +921 -0
  697. package/src/components/DataTable/ui/shared/ActionButtons.tsx +195 -0
  698. package/src/components/DataTable/ui/shared/ColumnFilter.test.tsx +497 -0
  699. package/src/components/DataTable/ui/shared/ColumnFilter.tsx +113 -0
  700. package/src/components/DataTable/ui/shared/PaginationControls.test.tsx +451 -0
  701. package/src/components/DataTable/ui/shared/PaginationControls.tsx +291 -0
  702. package/src/components/DataTable/ui/shared/SortIndicator.test.tsx +135 -0
  703. package/src/components/DataTable/ui/shared/SortIndicator.tsx +50 -0
  704. package/src/components/DataTable/ui/table/EditFields.test.tsx +526 -0
  705. package/src/components/DataTable/ui/table/EditFields.tsx +355 -0
  706. package/src/components/DataTable/ui/table/EditableRow.test.tsx +1003 -0
  707. package/src/components/DataTable/ui/table/EditableRow.tsx +444 -0
  708. package/src/components/DataTable/ui/table/EmptyState.test.tsx +360 -0
  709. package/src/components/DataTable/ui/table/EmptyState.tsx +74 -0
  710. package/src/components/DataTable/ui/table/FilterRow.test.tsx +416 -0
  711. package/src/components/DataTable/ui/table/FilterRow.tsx +148 -0
  712. package/src/components/DataTable/ui/table/LoadingState.test.tsx +77 -0
  713. package/src/components/DataTable/ui/table/LoadingState.tsx +17 -0
  714. package/src/components/DataTable/ui/table/RowComponent.test.tsx +1024 -0
  715. package/src/components/DataTable/ui/table/RowComponent.tsx +429 -0
  716. package/src/components/DataTable/ui/table/UnifiedTableBody.test.tsx +1273 -0
  717. package/src/components/DataTable/ui/table/UnifiedTableBody.tsx +440 -0
  718. package/src/components/DataTable/ui/table/cellValueUtils.test.ts +453 -0
  719. package/src/components/DataTable/ui/table/cellValueUtils.ts +40 -0
  720. package/src/components/DataTable/ui/toolbar/BulkOperationsDropdown.test.tsx +551 -0
  721. package/src/components/DataTable/ui/toolbar/BulkOperationsDropdown.tsx +160 -0
  722. package/src/components/DataTable/ui/toolbar/ColumnVisibilityDropdown.test.tsx +751 -0
  723. package/src/components/DataTable/ui/toolbar/ColumnVisibilityDropdown.tsx +114 -0
  724. package/src/components/DataTable/ui/toolbar/DataTableToolbar.test.tsx +629 -0
  725. package/src/components/DataTable/ui/toolbar/DataTableToolbar.tsx +271 -0
  726. package/src/components/DataTable/ui/toolbar/GroupingDropdown.test.tsx +621 -0
  727. package/src/components/DataTable/ui/toolbar/GroupingDropdown.tsx +107 -0
  728. package/src/components/DataTable/utils/a11yUtils.test.ts +548 -0
  729. package/src/components/DataTable/utils/aggregationUtils.test.ts +288 -0
  730. package/src/components/DataTable/utils/columnUtils.test.ts +94 -0
  731. package/src/components/DataTable/utils/csvParse.test.ts +74 -0
  732. package/src/components/DataTable/utils/csvParse.ts +65 -0
  733. package/src/components/DataTable/utils/errorHandling.test.ts +209 -0
  734. package/src/components/DataTable/utils/exportUtils.test.ts +954 -0
  735. package/src/components/DataTable/utils/flexibleImport.test.ts +573 -0
  736. package/src/components/DataTable/utils/flexibleImport.ts +3 -186
  737. package/src/components/DataTable/utils/hierarchicalSorting.test.ts +235 -0
  738. package/src/components/DataTable/utils/hierarchicalUtils.test.ts +586 -0
  739. package/src/components/DataTable/utils/importDateParser.test.ts +162 -0
  740. package/src/components/DataTable/utils/importDateParser.ts +114 -0
  741. package/src/components/DataTable/utils/importValueParser.test.ts +138 -0
  742. package/src/components/DataTable/utils/importValueParser.ts +91 -0
  743. package/src/components/DataTable/utils/paginationUtils.test.ts +593 -0
  744. package/src/components/DataTable/utils/paginationUtils.ts +6 -3
  745. package/src/components/DataTable/utils/performanceUtils.test.ts +470 -0
  746. package/src/components/DataTable/utils/rowUtils.test.ts +235 -0
  747. package/src/components/DataTable/utils/selectFieldUtils.test.ts +271 -0
  748. package/src/components/DataTable/utils/selectFieldUtils.ts +97 -60
  749. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
  750. package/src/components/DateTimeField/DateTimeField.test.tsx +1 -1
  751. package/src/components/Dialog/Dialog.test-utils.ts +49 -0
  752. package/src/components/Dialog/Dialog.test.tsx +896 -89
  753. package/src/components/Dialog/Dialog.tsx +174 -882
  754. package/src/components/Dialog/dialogLock.test.ts +238 -0
  755. package/src/components/Dialog/dialogLock.ts +98 -0
  756. package/src/components/Dialog/index.ts +2 -0
  757. package/src/components/Dialog/useDialogDimensions.test.ts +163 -0
  758. package/src/components/Dialog/useDialogDimensions.ts +140 -0
  759. package/src/components/Dialog/useDialogLifecycle.test.ts +361 -0
  760. package/src/components/Dialog/useDialogLifecycle.ts +135 -0
  761. package/src/components/Dialog/useDialogPersistence.test.ts +381 -0
  762. package/src/components/Dialog/useDialogPersistence.ts +357 -0
  763. package/src/components/FileDisplay/FileDisplay.test.tsx +40 -40
  764. package/src/components/FileDisplay/FileDisplay.tsx +24 -656
  765. package/src/components/FileDisplay/FileDisplayContent.test.tsx +395 -0
  766. package/src/components/FileDisplay/FileDisplayContent.tsx +242 -0
  767. package/src/components/FileDisplay/FileDisplayDeleteConfirmDialog.test.tsx +74 -0
  768. package/src/components/FileDisplay/FileDisplayDeleteConfirmDialog.tsx +38 -0
  769. package/src/components/FileDisplay/FileDisplayEmptyView.test.tsx +33 -0
  770. package/src/components/FileDisplay/FileDisplayEmptyView.tsx +33 -0
  771. package/src/components/FileDisplay/FileDisplayErrorView.test.tsx +71 -0
  772. package/src/components/FileDisplay/FileDisplayErrorView.tsx +50 -0
  773. package/src/components/FileDisplay/FileDisplayLoadingFallbackView.test.tsx +22 -0
  774. package/src/components/FileDisplay/FileDisplayLoadingFallbackView.tsx +22 -0
  775. package/src/components/FileDisplay/FileDisplayLoadingView.test.tsx +21 -0
  776. package/src/components/FileDisplay/FileDisplayLoadingView.tsx +23 -0
  777. package/src/components/FileDisplay/FileDisplayMultipleFilesView.test.tsx +101 -0
  778. package/src/components/FileDisplay/FileDisplayMultipleFilesView.tsx +109 -0
  779. package/src/components/FileDisplay/FileDisplaySingleDocumentLinkView.test.tsx +58 -0
  780. package/src/components/FileDisplay/FileDisplaySingleDocumentLinkView.tsx +48 -0
  781. package/src/components/FileDisplay/FileDisplaySingleFileWithActionsView.test.tsx +111 -0
  782. package/src/components/FileDisplay/FileDisplaySingleFileWithActionsView.tsx +270 -0
  783. package/src/components/FileDisplay/FileDisplaySingleImageView.test.tsx +78 -0
  784. package/src/components/FileDisplay/FileDisplaySingleImageView.tsx +67 -0
  785. package/src/components/FileDisplay/fallbackUtils.test.ts +50 -0
  786. package/src/components/FileDisplay/fallbackUtils.ts +44 -0
  787. package/src/components/FileDisplay/fetchFileDisplayData.ts +24 -0
  788. package/src/components/FileDisplay/fetchFileDisplayData.unit.test.ts +183 -0
  789. package/src/components/FileDisplay/fileDisplayUtils.test.ts +58 -0
  790. package/src/components/FileDisplay/fileDisplayUtils.ts +24 -0
  791. package/src/components/FileDisplay/useFileDisplay.test.ts +538 -0
  792. package/src/components/FileDisplay/useFileDisplay.ts +515 -0
  793. package/src/components/FileDisplay/useFileDisplay.unit.test.ts +1442 -0
  794. package/src/components/FileDisplay/useFileDisplayData.ts +126 -0
  795. package/src/components/FileDisplay/usePublicFileDisplay.test.ts +729 -0
  796. package/src/components/FileDisplay/usePublicFileDisplay.ts +579 -0
  797. package/src/components/FileUpload/FileUpload.test.tsx +16 -10
  798. package/src/components/FileUpload/FileUpload.tsx +107 -525
  799. package/src/components/FileUpload/FileUploadDropZone.tsx +112 -0
  800. package/src/components/FileUpload/FileUploadProgressItem.tsx +86 -0
  801. package/src/components/FileUpload/FileUploadProgressList.tsx +40 -0
  802. package/src/components/FileUpload/useFileUploadManager.test.ts +308 -0
  803. package/src/components/FileUpload/useFileUploadManager.ts +454 -0
  804. package/src/components/FileUpload/useResolvedAppId.test.ts +102 -0
  805. package/src/components/FileUpload/useResolvedAppId.ts +77 -0
  806. package/src/components/Footer/Footer.test.tsx +6 -292
  807. package/src/components/Footer/Footer.tsx +8 -125
  808. package/src/components/Form/Form.test.tsx +44 -27
  809. package/src/components/Form/Form.tsx +64 -287
  810. package/src/components/Form/useFormPersistence.ts +257 -0
  811. package/src/components/Header/Header.test.tsx +17 -18
  812. package/src/components/Header/Header.tsx +10 -1
  813. package/src/components/Input/Input.tsx +1 -1
  814. package/src/components/Label/Label.test.tsx +1 -1
  815. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +1 -1
  816. package/src/components/NavigationMenu/HierarchicalNavItem.tsx +104 -0
  817. package/src/components/NavigationMenu/NavigationMenu.test.tsx +1029 -26
  818. package/src/components/NavigationMenu/NavigationMenu.tsx +61 -361
  819. package/src/components/NavigationMenu/index.ts +6 -1
  820. package/src/components/NavigationMenu/navigationPermissionHelper.ts +188 -0
  821. package/src/components/NavigationMenu/useNavigationFiltering.test.ts +1949 -0
  822. package/src/components/NavigationMenu/useNavigationFiltering.ts +197 -296
  823. package/src/components/NavigationMenu/useNavigationScope.ts +125 -0
  824. package/src/components/PaceAppLayout/PaceAppLayout.edge-cases.test.tsx +109 -70
  825. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +3 -3
  826. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +16 -19
  827. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +529 -5
  828. package/src/components/PaceAppLayout/PaceAppLayout.tsx +280 -756
  829. package/src/components/PaceAppLayout/useFilteredNavItems.ts +319 -0
  830. package/src/components/PaceAppLayout/usePaceAppLayoutConfig.ts +163 -0
  831. package/src/components/PaceAppLayout/usePaceAppLayoutGate.tsx +150 -0
  832. package/src/components/PaceAppLayout/usePaceAppLayoutPermissions.ts +162 -0
  833. package/src/components/PaceAppLayout/usePaceAppLayoutScope.ts +81 -0
  834. package/src/components/PaceAppLayout/useRoleBasedRouteAccess.ts +157 -0
  835. package/src/components/PaceAppLayout/useSuperAdminFallback.ts +58 -0
  836. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +31 -25
  837. package/src/components/PaceLoginPage/PaceLoginPage.tsx +31 -122
  838. package/src/components/PaceLoginPage/useLoginAppAccess.ts +153 -0
  839. package/src/components/Progress/Progress.tsx +1 -2
  840. package/src/components/ProtectedRoute/ProtectedRoute.tsx +29 -235
  841. package/src/components/ProtectedRoute/useProtectedRouteState.ts +128 -0
  842. package/src/components/ProtectedRoute/useVisibilityRedirectGrace.ts +89 -0
  843. package/src/components/PublicLayout/PublicLayout.test.tsx +217 -36
  844. package/src/components/PublicLayout/PublicPageLayout.tsx +132 -73
  845. package/src/components/PublicLayout/PublicPageProvider.tsx +5 -1
  846. package/src/components/Select/Select.test.tsx +1 -1
  847. package/src/components/Select/Select.tsx +28 -18
  848. package/src/components/Select/context.test.tsx +56 -0
  849. package/src/components/Select/text.test.tsx +104 -0
  850. package/src/components/Select/text.ts +26 -0
  851. package/src/components/Select/useSelectEvents.test.ts +279 -0
  852. package/src/components/Select/useSelectEvents.ts +87 -0
  853. package/src/components/Select/useSelectSearch.test.tsx +295 -0
  854. package/src/components/Select/useSelectSearch.ts +91 -0
  855. package/src/components/Select/useSelectState.test.ts +268 -0
  856. package/src/components/Select/useSelectState.ts +104 -0
  857. package/src/components/Table/Table.test.tsx +348 -0
  858. package/src/components/Tabs/Tabs.test.tsx +270 -0
  859. package/src/components/Tabs/Tabs.tsx +1 -1
  860. package/src/components/Toast/Toast.test.tsx +420 -0
  861. package/src/components/index.test.ts +346 -0
  862. package/src/constants/performance.test.ts +91 -0
  863. package/src/hooks/ServiceHooks.test.tsx +725 -0
  864. package/src/hooks/hooks.integration.test.tsx +608 -0
  865. package/src/hooks/index.ts +7 -4
  866. package/src/hooks/index.unit.test.ts +220 -0
  867. package/src/hooks/public/usePublicEvent.test.ts +1 -1
  868. package/src/hooks/public/usePublicEventLogo.test.ts +1 -1
  869. package/src/hooks/public/usePublicRouteParams.test.ts +1 -1
  870. package/src/hooks/services/useAuth.ts +9 -7
  871. package/src/hooks/useAddressAutocomplete.test.ts +22 -22
  872. package/src/hooks/useAddressAutocomplete.ts +90 -75
  873. package/src/hooks/useAppConfig.unit.test.ts +720 -0
  874. package/src/hooks/useComponentPerformance.unit.test.tsx +316 -0
  875. package/src/hooks/useDataTablePerformance.ts +100 -120
  876. package/src/hooks/useDataTablePerformance.unit.test.ts +720 -0
  877. package/src/hooks/useDataTableState.test.ts +170 -0
  878. package/src/hooks/useDebounce.unit.test.ts +157 -0
  879. package/src/hooks/useEventTheme.test.ts +4 -1
  880. package/src/hooks/useEventTheme.ts +49 -21
  881. package/src/hooks/useEvents.ts +41 -1
  882. package/src/hooks/useEvents.unit.test.ts +227 -0
  883. package/src/hooks/useFileReference.test.ts +44 -41
  884. package/src/hooks/useFileReference.ts +182 -173
  885. package/src/hooks/useFileUrl.ts +1 -1
  886. package/src/hooks/useFileUrl.unit.test.ts +684 -0
  887. package/src/hooks/useFileUrlCache.test.ts +319 -0
  888. package/src/hooks/useFileUrlCache.ts +1 -1
  889. package/src/hooks/useFocusManagement.unit.test.ts +604 -0
  890. package/src/hooks/useFocusTrap.unit.test.tsx +613 -0
  891. package/src/hooks/useFormDialog.test.ts +307 -0
  892. package/src/hooks/useInactivityTracker.ts +138 -131
  893. package/src/hooks/useInactivityTracker.unit.test.ts +450 -0
  894. package/src/hooks/useIsMobile.unit.test.ts +317 -0
  895. package/src/hooks/useIsPrint.ts +62 -0
  896. package/src/hooks/useIsPrint.unit.test.ts +545 -0
  897. package/src/hooks/useKeyboardShortcuts.unit.test.ts +907 -0
  898. package/src/hooks/useOrganisationPermissions.unit.test.tsx +293 -0
  899. package/src/hooks/useOrganisationSecurity.test.ts +3 -3
  900. package/src/hooks/useOrganisationSecurity.ts +190 -201
  901. package/src/hooks/useOrganisationSecurity.unit.test.tsx +959 -0
  902. package/src/hooks/useOrganisations.unit.test.ts +369 -0
  903. package/src/hooks/usePerformanceMonitor.unit.test.ts +683 -0
  904. package/src/hooks/usePermissionCache.test.ts +505 -0
  905. package/src/hooks/usePermissionCache.ts +276 -271
  906. package/src/hooks/usePreventTabReload.test.ts +307 -0
  907. package/src/hooks/usePublicEvent.simple.test.ts +779 -0
  908. package/src/hooks/usePublicEvent.test.ts +664 -0
  909. package/src/hooks/usePublicEvent.unit.test.ts +638 -0
  910. package/src/hooks/usePublicFileDisplay.test.ts +948 -0
  911. package/src/hooks/usePublicRouteParams.unit.test.ts +442 -0
  912. package/src/hooks/useQueryCache.test.ts +391 -0
  913. package/src/hooks/useQueryCache.ts +0 -2
  914. package/src/hooks/useRBAC.unit.test.ts +253 -0
  915. package/src/hooks/useSessionDraft.test.ts +556 -0
  916. package/src/hooks/useSessionRestoration.unit.test.tsx +381 -0
  917. package/src/hooks/useStorage.ts +21 -16
  918. package/src/hooks/useStorage.unit.test.ts +684 -0
  919. package/src/hooks/useToast.test.ts +413 -0
  920. package/src/hooks/useToast.unit.test.tsx +481 -0
  921. package/src/hooks/useZodForm.unit.test.tsx +191 -0
  922. package/src/icons/index.test.ts +133 -0
  923. package/src/icons/index.ts +2 -0
  924. package/src/index.test.ts +528 -0
  925. package/src/index.ts +15 -7
  926. package/src/providers/AuthProvider.test.tsx +218 -0
  927. package/src/providers/EventProvider.test.tsx +487 -0
  928. package/src/providers/InactivityProvider.test-helper.tsx +40 -0
  929. package/src/providers/InactivityProvider.test.tsx +421 -0
  930. package/src/providers/ProviderLifecycle.test.tsx +308 -0
  931. package/src/providers/UnifiedAuthProvider.test.tsx +503 -0
  932. package/src/providers/index.test.ts +138 -0
  933. package/src/providers/services/AuthServiceProvider.integration.test.tsx +229 -0
  934. package/src/providers/services/AuthServiceProvider.test.tsx +643 -0
  935. package/src/providers/services/EventServiceProvider.test.tsx +844 -0
  936. package/src/providers/services/InactivityServiceProvider.test.tsx +667 -0
  937. package/src/providers/services/OrganisationServiceProvider.test.tsx +445 -0
  938. package/src/providers/services/UnifiedAuthContext.ts +30 -27
  939. package/src/providers/services/UnifiedAuthProvider.advanced.test.tsx +434 -0
  940. package/src/providers/services/UnifiedAuthProvider.appId.test.tsx +408 -0
  941. package/src/providers/services/UnifiedAuthProvider.integration.test.tsx +304 -0
  942. package/src/providers/services/UnifiedAuthProvider.tsx +115 -360
  943. package/src/providers/services/contexts.test.tsx +281 -0
  944. package/src/providers/services/useUnifiedAuth.test.tsx +251 -0
  945. package/src/providers/services/useUnifiedAuthContextValue.ts +279 -0
  946. package/src/providers/useInactivity.test-helper.ts +27 -0
  947. package/src/rbac/README.md +7 -5
  948. package/src/rbac/adapters.comprehensive.test.tsx +429 -0
  949. package/src/rbac/adapters.test.tsx +22 -22
  950. package/src/rbac/adapters.tsx +29 -29
  951. package/src/rbac/api.test.ts +1075 -87
  952. package/src/rbac/api.ts +300 -255
  953. package/src/rbac/audit-batched.test.ts +550 -0
  954. package/src/rbac/audit.ts +4 -1
  955. package/src/rbac/auth-rbac-security.integration.test.tsx +300 -0
  956. package/src/rbac/auth-rbac.e2e.test.tsx +510 -0
  957. package/src/rbac/cache-invalidation.test.ts +715 -0
  958. package/src/rbac/components/AccessDenied.test.tsx +324 -0
  959. package/src/rbac/components/NavigationGuard.test.tsx +1148 -0
  960. package/src/rbac/components/NavigationGuard.tsx +2 -1
  961. package/src/rbac/components/PagePermissionGuard.guard.test.tsx +236 -0
  962. package/src/rbac/components/PagePermissionGuard.performance.test.tsx +252 -0
  963. package/src/rbac/components/PagePermissionGuard.race-condition.test.tsx +243 -0
  964. package/src/rbac/components/PagePermissionGuard.test.tsx +1443 -0
  965. package/src/rbac/components/PagePermissionGuard.tsx +177 -372
  966. package/src/rbac/components/PagePermissionGuard.verification.test.tsx +185 -0
  967. package/src/rbac/config.ts +58 -18
  968. package/src/rbac/engine.comprehensive.test.ts +808 -0
  969. package/src/rbac/engine.test.ts +494 -0
  970. package/src/rbac/engine.ts +23 -1
  971. package/src/rbac/errors.ts +89 -55
  972. package/src/rbac/hooks/permissions/runPermissionCheck.ts +91 -0
  973. package/src/rbac/hooks/permissions/useAccessLevel.test.ts +622 -0
  974. package/src/rbac/hooks/permissions/useAccessLevel.ts +16 -6
  975. package/src/rbac/hooks/permissions/useCan.test.ts +837 -0
  976. package/src/rbac/hooks/permissions/useCan.ts +177 -255
  977. package/src/rbac/hooks/permissions/useMultiplePermissions.test.ts +843 -0
  978. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +24 -11
  979. package/src/rbac/hooks/permissions/usePermissions.test.ts +543 -0
  980. package/src/rbac/hooks/permissions/usePermissions.ts +36 -65
  981. package/src/rbac/hooks/useCan.test.ts +44 -45
  982. package/src/rbac/hooks/usePageAccessLogging.ts +160 -0
  983. package/src/rbac/hooks/usePageGuardScope.ts +119 -0
  984. package/src/rbac/hooks/usePagePermissionCheck.ts +67 -0
  985. package/src/rbac/hooks/usePermissions.integration.test.ts +427 -0
  986. package/src/rbac/hooks/usePermissions.stability.test.ts +268 -0
  987. package/src/rbac/hooks/usePermissions.test.ts +54 -54
  988. package/src/rbac/hooks/useRBAC.test.ts +313 -217
  989. package/src/rbac/hooks/useRBAC.ts +145 -81
  990. package/src/rbac/hooks/useResolvedScope.ts +16 -10
  991. package/src/rbac/hooks/useResourcePermissions.test.ts +73 -83
  992. package/src/rbac/hooks/useResourcePermissions.ts +77 -152
  993. package/src/rbac/hooks/useResourcePermissionsSuperAdmin.ts +67 -0
  994. package/src/rbac/hooks/useRoleManagement.test.ts +27 -112
  995. package/src/rbac/hooks/useRoleManagement.ts +153 -585
  996. package/src/rbac/hooks/useSecureSupabase.test.ts +1179 -0
  997. package/src/rbac/hooks/useSecureSupabase.ts +10 -2
  998. package/src/rbac/hooks/useSuperAdminCheck.ts +80 -0
  999. package/src/rbac/performance.test.ts +451 -0
  1000. package/src/rbac/rbac-core.test.tsx +276 -0
  1001. package/src/rbac/rbac-engine-core-logic.test.ts +387 -0
  1002. package/src/rbac/rbac-engine-simplified.test.ts +252 -0
  1003. package/src/rbac/rbac-functions.test.ts +703 -0
  1004. package/src/rbac/rbac-role-isolation.test.ts +456 -0
  1005. package/src/rbac/request-deduplication.test.ts +14 -9
  1006. package/src/rbac/request-deduplication.ts +5 -4
  1007. package/src/rbac/scenarios.user-role.test.tsx +271 -0
  1008. package/src/rbac/secureClient.test.ts +514 -83
  1009. package/src/rbac/secureClient.ts +8 -2
  1010. package/src/rbac/security.test.ts +323 -0
  1011. package/src/rbac/types/roleManagement.ts +66 -0
  1012. package/src/rbac/types.ts +3 -0
  1013. package/src/rbac/utils/clientSecurity.test.ts +192 -0
  1014. package/src/rbac/utils/contextValidator.test.ts +126 -0
  1015. package/src/rbac/utils/contextValidator.ts +5 -1
  1016. package/src/rbac/utils/deep-equal.test.ts +76 -0
  1017. package/src/rbac/utils/eventContext.test.ts +401 -0
  1018. package/src/rbac/utils/eventContext.ts +37 -33
  1019. package/src/rbac/utils/fetchPermissionMap.ts +13 -0
  1020. package/src/rbac/utils/permissionMapHelpers.ts +34 -0
  1021. package/src/rbac/utils/roleManagementRpc.ts +303 -0
  1022. package/src/services/AuthService.edge-cases.test.ts +746 -0
  1023. package/src/services/AuthService.restoreSession.test.ts +59 -0
  1024. package/src/services/AuthService.test.ts +1362 -0
  1025. package/src/services/AuthService.ts +184 -205
  1026. package/src/services/BaseService.edge-cases.test.ts +506 -0
  1027. package/src/services/BaseService.test.ts +363 -0
  1028. package/src/services/EventService.edge-cases.test.ts +636 -0
  1029. package/src/services/EventService.eventColours.test.ts +64 -0
  1030. package/src/services/EventService.test.ts +1250 -0
  1031. package/src/services/EventService.ts +251 -316
  1032. package/src/services/InactivityService.edge-cases.test.ts +492 -0
  1033. package/src/services/InactivityService.lifecycle.test.ts +406 -0
  1034. package/src/services/InactivityService.test.ts +829 -0
  1035. package/src/services/InactivityService.ts +172 -213
  1036. package/src/services/OrganisationService.edge-cases.test.ts +633 -0
  1037. package/src/services/OrganisationService.pagination.test.ts +409 -0
  1038. package/src/services/OrganisationService.test.ts +1579 -0
  1039. package/src/services/OrganisationService.ts +184 -238
  1040. package/src/services/base/BaseService.test.ts +1 -1
  1041. package/src/services/interfaces/IAuthService.test.ts +184 -0
  1042. package/src/services/interfaces/IAuthService.ts +10 -9
  1043. package/src/services/interfaces/IEventService.test.ts +176 -0
  1044. package/src/services/interfaces/IInactivityService.test.ts +183 -0
  1045. package/src/services/interfaces/IOrganisationService.test.ts +207 -0
  1046. package/src/styles/core.css +243 -12
  1047. package/src/theming/parseEventColours.test.ts +321 -0
  1048. package/src/theming/runtime.test.ts +495 -0
  1049. package/src/theming/runtime.ts +71 -2
  1050. package/src/types/api-result.ts +53 -0
  1051. package/src/types/core.test.ts +397 -0
  1052. package/src/types/database-generated.test.ts +78 -0
  1053. package/src/types/database.generated.ts +45 -10
  1054. package/src/types/event.ts +38 -18
  1055. package/src/types/file-reference.test.ts +351 -0
  1056. package/src/types/file-reference.ts +37 -12
  1057. package/src/types/guards.test.ts +246 -0
  1058. package/src/types/index.test.ts +265 -0
  1059. package/src/types/index.ts +3 -0
  1060. package/src/types/organisation.roles.test.ts +55 -0
  1061. package/src/types/organisation.test.ts +1105 -0
  1062. package/src/types/organisation.ts +15 -15
  1063. package/src/types/supabase.ts +13 -4
  1064. package/src/types/theme.test.ts +830 -0
  1065. package/src/types/type-validation.test.ts +526 -0
  1066. package/src/types/validation.test.ts +729 -0
  1067. package/src/utils/app/appIdResolver.test.ts +98 -71
  1068. package/src/utils/app/appIdResolver.ts +31 -20
  1069. package/src/utils/appConfig.unit.test.ts +55 -0
  1070. package/src/utils/audit.unit.test.ts +69 -0
  1071. package/src/utils/auth-utils.unit.test.ts +69 -0
  1072. package/src/utils/bundleAnalysis.unit.test.ts +326 -0
  1073. package/src/utils/cn.unit.test.ts +34 -0
  1074. package/src/utils/context/organisationContext.test.ts +105 -91
  1075. package/src/utils/context/organisationContext.ts +29 -40
  1076. package/src/utils/core/cn.test.ts +66 -0
  1077. package/src/utils/core/debugLogger.test.ts +113 -0
  1078. package/src/utils/core/logger.test.ts +217 -0
  1079. package/src/utils/core/mergeRefs.ts +24 -0
  1080. package/src/utils/debugLogger.test.ts +417 -0
  1081. package/src/utils/deviceFingerprint.unit.test.ts +818 -0
  1082. package/src/utils/dynamic/createLazyComponent.tsx +9 -1
  1083. package/src/utils/dynamic/dynamicUtils.test.ts +185 -0
  1084. package/src/utils/dynamic/lazyLoad.test.tsx +156 -0
  1085. package/src/utils/dynamicUtils.unit.test.ts +331 -0
  1086. package/src/utils/file-reference/file-reference.test.ts +1249 -0
  1087. package/src/utils/file-reference/index.ts +330 -347
  1088. package/src/utils/formatDate.unit.test.ts +109 -0
  1089. package/src/utils/formatting/formatDateTimeTimezone.test.ts +1 -1
  1090. package/src/utils/formatting/formatNumber.test.ts +1 -1
  1091. package/src/utils/formatting.unit.test.ts +99 -0
  1092. package/src/utils/google-places/googlePlacesUtils.test.ts +70 -48
  1093. package/src/utils/google-places/googlePlacesUtils.ts +67 -99
  1094. package/src/utils/google-places/loadGoogleMapsScript.test.ts +25 -22
  1095. package/src/utils/google-places/loadGoogleMapsScript.ts +138 -117
  1096. package/src/utils/index.unit.test.ts +251 -0
  1097. package/src/utils/lazyLoad.unit.test.tsx +319 -0
  1098. package/src/utils/location/location.test.ts +1 -1
  1099. package/src/utils/logger.unit.test.ts +398 -0
  1100. package/src/utils/organisationContext.unit.test.ts +180 -0
  1101. package/src/utils/performance/bundleAnalysis.test.ts +148 -0
  1102. package/src/utils/performance/performanceBenchmark.test.ts +251 -0
  1103. package/src/utils/performance/performanceBudgets.test.ts +241 -0
  1104. package/src/utils/performanceBenchmark.test.ts +174 -0
  1105. package/src/utils/performanceBudgets.unit.test.ts +288 -0
  1106. package/src/utils/permissionTypes.unit.test.ts +250 -0
  1107. package/src/utils/permissionUtils.unit.test.ts +362 -0
  1108. package/src/utils/permissions/permissionTypes.test.ts +149 -0
  1109. package/src/utils/persistence/keyDerivation.test.ts +306 -0
  1110. package/src/utils/persistence/sensitiveFieldDetection.test.ts +271 -0
  1111. package/src/utils/request-deduplication.test.ts +349 -0
  1112. package/src/utils/sanitization.unit.test.ts +346 -0
  1113. package/src/utils/schemaUtils.unit.test.ts +441 -0
  1114. package/src/utils/secureDataAccess.unit.test.ts +334 -0
  1115. package/src/utils/secureErrors.unit.test.ts +390 -0
  1116. package/src/utils/secureStorage.unit.test.ts +289 -0
  1117. package/src/utils/security/auth-utils.ts +34 -23
  1118. package/src/utils/security/secureDataAccess.ts +241 -281
  1119. package/src/utils/security/secureErrors.test.ts +1 -1
  1120. package/src/utils/security/secureStorage.test.ts +1 -1
  1121. package/src/utils/security/security.test.ts +25 -17
  1122. package/src/utils/security/security.ts +15 -18
  1123. package/src/utils/security/securityMonitor.test.ts +1 -1
  1124. package/src/utils/security.unit.test.ts +155 -0
  1125. package/src/utils/securityMonitor.unit.test.ts +276 -0
  1126. package/src/utils/sessionTracking.unit.test.ts +218 -0
  1127. package/src/utils/storage/config.unit.test.ts +239 -0
  1128. package/src/utils/storage/helpers.test.ts +88 -102
  1129. package/src/utils/storage/helpers.ts +173 -251
  1130. package/src/utils/storage/index.unit.test.ts +68 -0
  1131. package/src/utils/storage/types.ts +7 -0
  1132. package/src/utils/supabase/createBaseClient.test.ts +31 -14
  1133. package/src/utils/timezone/timezone.test.ts +1 -1
  1134. package/src/utils/timezone.test.ts +345 -0
  1135. package/src/utils/validation/common.test.ts +115 -0
  1136. package/src/utils/validation/csrf.test.ts +198 -0
  1137. package/src/utils/validation/csrf.ts +42 -41
  1138. package/src/utils/validation/htmlSanitization.unit.test.ts +618 -0
  1139. package/src/utils/validation/passwordSchema.test.ts +164 -0
  1140. package/src/utils/validation/schema.test.ts +127 -0
  1141. package/src/utils/validation/sqlInjectionProtection.test.ts +165 -0
  1142. package/src/utils/validation/user.test.ts +173 -0
  1143. package/src/utils/validation/validation.test.ts +197 -0
  1144. package/src/utils/validation/validationUtils.test.ts +294 -0
  1145. package/src/utils/validation.unit.test.ts +307 -0
  1146. package/src/utils/validationUtils.unit.test.ts +558 -0
  1147. package/dist/DataTable-SAXFG4XI.js +0 -13
  1148. package/dist/InactivityServiceProvider-DHryoh6K.d.ts +0 -299
  1149. package/dist/UnifiedAuthProvider-BBD2PS3Q.js +0 -7
  1150. package/dist/UnifiedAuthProvider-CiBAl9-s.d.ts +0 -151
  1151. package/dist/api-F47QJ7FX.js +0 -4
  1152. package/dist/audit-Z6ZZBWLU.js +0 -3
  1153. package/dist/auth-BZOJqrdd.d.ts +0 -49
  1154. package/dist/chunk-3GWSPISD.js +0 -61
  1155. package/dist/chunk-66R6RLUZ.js +0 -529
  1156. package/dist/chunk-7YDC7LMU.js +0 -487
  1157. package/dist/chunk-BCTXBU6U.js +0 -704
  1158. package/dist/chunk-FBZ7U3ID.js +0 -2209
  1159. package/dist/chunk-FN52B75D.js +0 -246
  1160. package/dist/chunk-JJEYZ3DX.js +0 -165
  1161. package/dist/chunk-KPYQWGFQ.js +0 -183
  1162. package/dist/chunk-KSNLMI7N.js +0 -481
  1163. package/dist/chunk-KYURMOQM.js +0 -977
  1164. package/dist/chunk-LNHFAF4X.js +0 -2279
  1165. package/dist/chunk-MPY44PWB.js +0 -8510
  1166. package/dist/chunk-NIU6DPQV.js +0 -427
  1167. package/dist/chunk-TFIPNIPE.js +0 -5379
  1168. package/dist/chunk-UZNAFKGW.js +0 -125
  1169. package/dist/chunk-W46INAVW.js +0 -1216
  1170. package/dist/chunk-X5EAU5G7.js +0 -793
  1171. package/dist/chunk-Y4PF6HIM.js +0 -2862
  1172. package/dist/database.generated-DT8JTZiP.d.ts +0 -9406
  1173. package/dist/event-WTAQuGcq.d.ts +0 -239
  1174. package/dist/file-reference-BavO2eQj.d.ts +0 -148
  1175. package/dist/functions-DH45k8ec.d.ts +0 -208
  1176. package/dist/timezone-K-ptz3HO.d.ts +0 -696
  1177. package/dist/types-BE2sEHKd.d.ts +0 -55
  1178. package/dist/types-CvOPXWWZ.d.ts +0 -111
  1179. package/dist/types-D05dCGma.d.ts +0 -521
  1180. package/dist/usePublicPageContext-vxBlEHO9.d.ts +0 -4290
  1181. package/dist/usePublicRouteParams-G3Ks53mk.d.ts +0 -877
  1182. package/docs/api/modules.md +0 -9889
  1183. package/scripts/build-docs-incremental.js +0 -179
  1184. package/scripts/eslint-audit.cjs +0 -222
  1185. package/scripts/generate-docs.js +0 -157
  1186. package/scripts/install-cursor-rules.cjs +0 -255
  1187. package/scripts/install-eslint-config.cjs +0 -349
  1188. package/scripts/setup-build-cache.js +0 -73
  1189. package/scripts/validate-pre-publish.js +0 -145
  1190. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +0 -260
  1191. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +0 -224
  1192. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +0 -273
  1193. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +0 -99
  1194. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +0 -446
  1195. package/src/__tests__/helpers/__tests__/timer-utils.test.ts +0 -371
  1196. package/src/__tests__/hooks/usePermissions.test.ts +0 -268
  1197. package/src/__tests__/index.test.ts +0 -532
  1198. package/src/__tests__/integration/UserProfile.test.tsx +0 -124
  1199. package/src/__tests__/public-recipe-view.test.ts +0 -228
  1200. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +0 -222
  1201. package/src/__tests__/rls-policies.test.ts +0 -472
  1202. package/src/components/ContextSelector/__tests__/ContextSelector.test.tsx +0 -360
  1203. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +0 -759
  1204. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +0 -524
  1205. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +0 -705
  1206. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +0 -658
  1207. package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +0 -192
  1208. package/src/components/DataTable/__tests__/DataTable.select-label-display.test.tsx +0 -485
  1209. package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -876
  1210. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +0 -220
  1211. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +0 -970
  1212. package/src/components/DataTable/__tests__/README.md +0 -145
  1213. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +0 -788
  1214. package/src/components/DataTable/__tests__/keyboard.test.tsx +0 -756
  1215. package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +0 -66
  1216. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +0 -728
  1217. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +0 -319
  1218. package/src/components/DataTable/__tests__/styles.test.ts +0 -382
  1219. package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +0 -103
  1220. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +0 -388
  1221. package/src/components/DataTable/__tests__/test-utils.ts +0 -94
  1222. package/src/components/DataTable/components/AccessDeniedPage.tsx +0 -159
  1223. package/src/components/DataTable/components/ActionButtons.tsx +0 -195
  1224. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +0 -160
  1225. package/src/components/DataTable/components/ColumnFilter.tsx +0 -113
  1226. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +0 -114
  1227. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +0 -225
  1228. package/src/components/DataTable/components/DataTableLayout.tsx +0 -584
  1229. package/src/components/DataTable/components/DataTableModals.tsx +0 -333
  1230. package/src/components/DataTable/components/DataTableToolbar.tsx +0 -271
  1231. package/src/components/DataTable/components/EditFields.tsx +0 -286
  1232. package/src/components/DataTable/components/EditableRow.tsx +0 -462
  1233. package/src/components/DataTable/components/EmptyState.tsx +0 -82
  1234. package/src/components/DataTable/components/FilterRow.tsx +0 -148
  1235. package/src/components/DataTable/components/LoadingState.tsx +0 -17
  1236. package/src/components/DataTable/components/PaginationControls.tsx +0 -285
  1237. package/src/components/DataTable/components/RowComponent.tsx +0 -423
  1238. package/src/components/DataTable/components/SortIndicator.tsx +0 -50
  1239. package/src/components/DataTable/components/UnifiedTableBody.tsx +0 -395
  1240. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +0 -245
  1241. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +0 -919
  1242. package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +0 -544
  1243. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +0 -484
  1244. package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.test.tsx +0 -748
  1245. package/src/components/DataTable/components/__tests__/DataTableCore.test.tsx +0 -792
  1246. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +0 -438
  1247. package/src/components/DataTable/components/__tests__/DataTableLayout.test.tsx +0 -467
  1248. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +0 -358
  1249. package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +0 -629
  1250. package/src/components/DataTable/components/__tests__/EditFields.test.tsx +0 -526
  1251. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +0 -994
  1252. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +0 -420
  1253. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +0 -415
  1254. package/src/components/DataTable/components/__tests__/GroupingDropdown.test.tsx +0 -612
  1255. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +0 -957
  1256. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +0 -81
  1257. package/src/components/DataTable/components/__tests__/PaginationControls.test.tsx +0 -429
  1258. package/src/components/DataTable/components/__tests__/RowComponent.test.tsx +0 -629
  1259. package/src/components/DataTable/components/__tests__/SortIndicator.test.tsx +0 -135
  1260. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +0 -864
  1261. package/src/components/DataTable/components/__tests__/cellValueUtils.test.ts +0 -453
  1262. package/src/components/DataTable/components/cellValueUtils.ts +0 -40
  1263. package/src/components/DataTable/components/hooks/useImportModalFocus.test.ts +0 -184
  1264. package/src/components/DataTable/components/hooks/useImportModalFocus.ts +0 -53
  1265. package/src/components/DataTable/components/hooks/usePermissionTracking.test.ts +0 -381
  1266. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -122
  1267. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +0 -328
  1268. package/src/components/DataTable/core/ActionManager.ts +0 -235
  1269. package/src/components/DataTable/core/ColumnManager.ts +0 -204
  1270. package/src/components/DataTable/core/DataManager.ts +0 -190
  1271. package/src/components/DataTable/core/LocalDataAdapter.ts +0 -274
  1272. package/src/components/DataTable/core/PluginRegistry.ts +0 -229
  1273. package/src/components/DataTable/core/StateManager.ts +0 -312
  1274. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +0 -235
  1275. package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +0 -403
  1276. package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +0 -141
  1277. package/src/components/DataTable/core/__tests__/DataManager.test.ts +0 -178
  1278. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +0 -133
  1279. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +0 -142
  1280. package/src/components/DataTable/core/__tests__/StateManager.test.ts +0 -158
  1281. package/src/components/DataTable/core/interfaces.ts +0 -338
  1282. package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +0 -516
  1283. package/src/components/DataTable/hooks/__tests__/useColumnVisibilityPersistence.test.ts +0 -256
  1284. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +0 -297
  1285. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +0 -270
  1286. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +0 -280
  1287. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +0 -691
  1288. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +0 -183
  1289. package/src/components/DataTable/hooks/__tests__/useHierarchicalState.test.ts +0 -294
  1290. package/src/components/DataTable/hooks/__tests__/useKeyboardNavigation.test.ts +0 -787
  1291. package/src/components/DataTable/hooks/__tests__/useServerSideDataEffect.test.ts +0 -258
  1292. package/src/components/DataTable/hooks/__tests__/useTableColumns.test.ts +0 -499
  1293. package/src/components/DataTable/hooks/__tests__/useTableHandlers.test.ts +0 -440
  1294. package/src/components/DataTable/types.ts +0 -764
  1295. package/src/components/DataTable/utils/__tests__/a11yUtils.test.ts +0 -548
  1296. package/src/components/DataTable/utils/__tests__/aggregationUtils.test.ts +0 -288
  1297. package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +0 -94
  1298. package/src/components/DataTable/utils/__tests__/errorHandling.test.ts +0 -209
  1299. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +0 -954
  1300. package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +0 -573
  1301. package/src/components/DataTable/utils/__tests__/hierarchicalSorting.test.ts +0 -235
  1302. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +0 -586
  1303. package/src/components/DataTable/utils/__tests__/paginationUtils.test.ts +0 -593
  1304. package/src/components/DataTable/utils/__tests__/performanceUtils.test.ts +0 -470
  1305. package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +0 -235
  1306. package/src/components/DataTable/utils/__tests__/selectFieldUtils.test.ts +0 -208
  1307. package/src/components/NavigationMenu/__tests__/useNavigationFiltering.test.ts +0 -1934
  1308. package/src/components/Select/__tests__/context.test.tsx +0 -56
  1309. package/src/components/Select/hooks/__tests__/useSelectEvents.test.ts +0 -279
  1310. package/src/components/Select/hooks/__tests__/useSelectSearch.test.tsx +0 -295
  1311. package/src/components/Select/hooks/__tests__/useSelectState.test.ts +0 -254
  1312. package/src/components/Select/hooks/useSelectEvents.ts +0 -87
  1313. package/src/components/Select/hooks/useSelectSearch.ts +0 -91
  1314. package/src/components/Select/hooks/useSelectState.ts +0 -104
  1315. package/src/components/Select/utils/__tests__/text.test.tsx +0 -104
  1316. package/src/components/Select/utils/text.ts +0 -26
  1317. package/src/components/__tests__/index.test.ts +0 -346
  1318. package/src/constants/__tests__/performance.test.ts +0 -91
  1319. package/src/hooks/__tests__/ServiceHooks.test.tsx +0 -725
  1320. package/src/hooks/__tests__/hooks.integration.test.tsx +0 -608
  1321. package/src/hooks/__tests__/index.unit.test.ts +0 -220
  1322. package/src/hooks/__tests__/useAppConfig.unit.test.ts +0 -406
  1323. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +0 -328
  1324. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +0 -720
  1325. package/src/hooks/__tests__/useDataTableState.test.ts +0 -170
  1326. package/src/hooks/__tests__/useDebounce.unit.test.ts +0 -157
  1327. package/src/hooks/__tests__/useEvents.unit.test.ts +0 -227
  1328. package/src/hooks/__tests__/useFileDisplay.test.ts +0 -540
  1329. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +0 -1109
  1330. package/src/hooks/__tests__/useFileUrl.unit.test.ts +0 -696
  1331. package/src/hooks/__tests__/useFileUrlCache.test.ts +0 -319
  1332. package/src/hooks/__tests__/useFocusManagement.unit.test.ts +0 -604
  1333. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +0 -613
  1334. package/src/hooks/__tests__/useFormDialog.test.ts +0 -307
  1335. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +0 -446
  1336. package/src/hooks/__tests__/useIsMobile.unit.test.ts +0 -317
  1337. package/src/hooks/__tests__/useKeyboardShortcuts.unit.test.ts +0 -907
  1338. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +0 -293
  1339. package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +0 -961
  1340. package/src/hooks/__tests__/useOrganisations.unit.test.ts +0 -369
  1341. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +0 -694
  1342. package/src/hooks/__tests__/usePermissionCache.test.ts +0 -506
  1343. package/src/hooks/__tests__/usePreventTabReload.test.ts +0 -307
  1344. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +0 -794
  1345. package/src/hooks/__tests__/usePublicEvent.test.ts +0 -670
  1346. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +0 -638
  1347. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +0 -948
  1348. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +0 -442
  1349. package/src/hooks/__tests__/useQueryCache.test.ts +0 -391
  1350. package/src/hooks/__tests__/useRBAC.unit.test.ts +0 -236
  1351. package/src/hooks/__tests__/useSessionDraft.test.ts +0 -556
  1352. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +0 -390
  1353. package/src/hooks/__tests__/useStorage.unit.test.ts +0 -721
  1354. package/src/hooks/__tests__/useToast.test.ts +0 -413
  1355. package/src/hooks/__tests__/useToast.unit.test.tsx +0 -481
  1356. package/src/hooks/__tests__/useZodForm.unit.test.tsx +0 -191
  1357. package/src/hooks/public/usePublicFileDisplay.test.ts +0 -723
  1358. package/src/hooks/public/usePublicFileDisplay.ts +0 -534
  1359. package/src/hooks/useFileDisplay.ts +0 -748
  1360. package/src/icons/__tests__/index.test.ts +0 -133
  1361. package/src/providers/OrganisationProvider.test.tsx +0 -40
  1362. package/src/providers/OrganisationProvider.tsx +0 -92
  1363. package/src/providers/__tests__/AuthProvider.test.tsx +0 -218
  1364. package/src/providers/__tests__/EventProvider.test.tsx +0 -487
  1365. package/src/providers/__tests__/InactivityProvider.test-helper.tsx +0 -65
  1366. package/src/providers/__tests__/InactivityProvider.test.tsx +0 -428
  1367. package/src/providers/__tests__/OrganisationProvider.test.tsx +0 -616
  1368. package/src/providers/__tests__/OrganisationProvider.wrapper.test.tsx +0 -591
  1369. package/src/providers/__tests__/ProviderLifecycle.test.tsx +0 -308
  1370. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +0 -503
  1371. package/src/providers/__tests__/index.test.ts +0 -138
  1372. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +0 -229
  1373. package/src/providers/services/__tests__/AuthServiceProvider.test.tsx +0 -638
  1374. package/src/providers/services/__tests__/EventServiceProvider.test.tsx +0 -839
  1375. package/src/providers/services/__tests__/InactivityServiceProvider.test.tsx +0 -662
  1376. package/src/providers/services/__tests__/OrganisationServiceProvider.test.tsx +0 -440
  1377. package/src/providers/services/__tests__/UnifiedAuthProvider.advanced.test.tsx +0 -435
  1378. package/src/providers/services/__tests__/UnifiedAuthProvider.appId.test.tsx +0 -408
  1379. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +0 -301
  1380. package/src/providers/services/__tests__/contexts.test.tsx +0 -281
  1381. package/src/providers/services/__tests__/useUnifiedAuth.test.tsx +0 -251
  1382. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +0 -429
  1383. package/src/rbac/__tests__/audit-batched.test.ts +0 -550
  1384. package/src/rbac/__tests__/auth-rbac-security.integration.test.tsx +0 -300
  1385. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +0 -517
  1386. package/src/rbac/__tests__/cache-invalidation.test.ts +0 -393
  1387. package/src/rbac/__tests__/engine.comprehensive.test.ts +0 -808
  1388. package/src/rbac/__tests__/performance.test.ts +0 -451
  1389. package/src/rbac/__tests__/rbac-core.test.tsx +0 -276
  1390. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +0 -387
  1391. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +0 -252
  1392. package/src/rbac/__tests__/rbac-functions.test.ts +0 -646
  1393. package/src/rbac/__tests__/rbac-role-isolation.test.ts +0 -456
  1394. package/src/rbac/__tests__/scenarios.user-role.test.tsx +0 -271
  1395. package/src/rbac/components/__tests__/AccessDenied.test.tsx +0 -324
  1396. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +0 -1146
  1397. package/src/rbac/components/__tests__/PagePermissionGuard.performance.test.tsx +0 -231
  1398. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +0 -243
  1399. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +0 -1430
  1400. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +0 -185
  1401. package/src/rbac/hooks/__tests__/usePermissions.integration.test.ts +0 -427
  1402. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +0 -1179
  1403. package/src/rbac/hooks/permissions/__tests__/useAccessLevel.test.ts +0 -622
  1404. package/src/rbac/hooks/permissions/__tests__/useCan.test.ts +0 -798
  1405. package/src/rbac/hooks/permissions/__tests__/useMultiplePermissions.test.ts +0 -843
  1406. package/src/rbac/hooks/permissions/__tests__/usePermissions.test.ts +0 -545
  1407. package/src/rbac/utils/__tests__/clientSecurity.test.ts +0 -192
  1408. package/src/rbac/utils/__tests__/contextValidator.test.ts +0 -126
  1409. package/src/rbac/utils/__tests__/deep-equal.test.ts +0 -76
  1410. package/src/rbac/utils/__tests__/eventContext.test.ts +0 -386
  1411. package/src/services/__tests__/AuthService.edge-cases.test.ts +0 -746
  1412. package/src/services/__tests__/AuthService.restoreSession.test.ts +0 -59
  1413. package/src/services/__tests__/AuthService.test.ts +0 -1328
  1414. package/src/services/__tests__/BaseService.edge-cases.test.ts +0 -506
  1415. package/src/services/__tests__/BaseService.test.ts +0 -363
  1416. package/src/services/__tests__/EventService.edge-cases.test.ts +0 -633
  1417. package/src/services/__tests__/EventService.eventColours.test.ts +0 -64
  1418. package/src/services/__tests__/EventService.test.ts +0 -1018
  1419. package/src/services/__tests__/InactivityService.edge-cases.test.ts +0 -492
  1420. package/src/services/__tests__/InactivityService.lifecycle.test.ts +0 -406
  1421. package/src/services/__tests__/InactivityService.test.ts +0 -654
  1422. package/src/services/__tests__/OrganisationService.edge-cases.test.ts +0 -633
  1423. package/src/services/__tests__/OrganisationService.pagination.test.ts +0 -409
  1424. package/src/services/__tests__/OrganisationService.test.ts +0 -1176
  1425. package/src/services/interfaces/__tests__/IAuthService.test.ts +0 -190
  1426. package/src/services/interfaces/__tests__/IEventService.test.ts +0 -176
  1427. package/src/services/interfaces/__tests__/IInactivityService.test.ts +0 -183
  1428. package/src/services/interfaces/__tests__/IOrganisationService.test.ts +0 -207
  1429. package/src/theming/__tests__/parseEventColours.test.ts +0 -321
  1430. package/src/theming/__tests__/runtime.test.ts +0 -504
  1431. package/src/types/__tests__/core.test.ts +0 -397
  1432. package/src/types/__tests__/database-generated.test.ts +0 -78
  1433. package/src/types/__tests__/file-reference.test.ts +0 -351
  1434. package/src/types/__tests__/guards.test.ts +0 -246
  1435. package/src/types/__tests__/index.test.ts +0 -265
  1436. package/src/types/__tests__/organisation.roles.test.ts +0 -55
  1437. package/src/types/__tests__/organisation.test.ts +0 -1133
  1438. package/src/types/__tests__/theme.test.ts +0 -830
  1439. package/src/types/__tests__/type-validation.test.ts +0 -526
  1440. package/src/types/__tests__/validation.test.ts +0 -729
  1441. package/src/utils/__tests__/appConfig.unit.test.ts +0 -55
  1442. package/src/utils/__tests__/audit.unit.test.ts +0 -69
  1443. package/src/utils/__tests__/auth-utils.unit.test.ts +0 -70
  1444. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +0 -326
  1445. package/src/utils/__tests__/cn.unit.test.ts +0 -34
  1446. package/src/utils/__tests__/debugLogger.test.ts +0 -417
  1447. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +0 -818
  1448. package/src/utils/__tests__/dynamicUtils.unit.test.ts +0 -331
  1449. package/src/utils/__tests__/formatDate.unit.test.ts +0 -109
  1450. package/src/utils/__tests__/formatting.unit.test.ts +0 -99
  1451. package/src/utils/__tests__/index.unit.test.ts +0 -251
  1452. package/src/utils/__tests__/lazyLoad.unit.test.tsx +0 -320
  1453. package/src/utils/__tests__/logger.unit.test.ts +0 -398
  1454. package/src/utils/__tests__/organisationContext.unit.test.ts +0 -191
  1455. package/src/utils/__tests__/performanceBenchmark.test.ts +0 -174
  1456. package/src/utils/__tests__/performanceBudgets.unit.test.ts +0 -288
  1457. package/src/utils/__tests__/permissionTypes.unit.test.ts +0 -250
  1458. package/src/utils/__tests__/permissionUtils.unit.test.ts +0 -362
  1459. package/src/utils/__tests__/request-deduplication.test.ts +0 -349
  1460. package/src/utils/__tests__/sanitization.unit.test.ts +0 -346
  1461. package/src/utils/__tests__/schemaUtils.unit.test.ts +0 -441
  1462. package/src/utils/__tests__/secureDataAccess.unit.test.ts +0 -334
  1463. package/src/utils/__tests__/secureErrors.unit.test.ts +0 -390
  1464. package/src/utils/__tests__/secureStorage.unit.test.ts +0 -289
  1465. package/src/utils/__tests__/security.unit.test.ts +0 -149
  1466. package/src/utils/__tests__/securityMonitor.unit.test.ts +0 -276
  1467. package/src/utils/__tests__/sessionTracking.unit.test.ts +0 -218
  1468. package/src/utils/__tests__/timezone.test.ts +0 -345
  1469. package/src/utils/__tests__/validation.unit.test.ts +0 -307
  1470. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -555
  1471. package/src/utils/core/__tests__/cn.test.ts +0 -66
  1472. package/src/utils/core/__tests__/debugLogger.test.ts +0 -113
  1473. package/src/utils/core/__tests__/logger.test.ts +0 -217
  1474. package/src/utils/dynamic/__tests__/dynamicUtils.test.ts +0 -185
  1475. package/src/utils/dynamic/__tests__/lazyLoad.test.tsx +0 -156
  1476. package/src/utils/file-reference/__tests__/file-reference.test.ts +0 -1313
  1477. package/src/utils/performance/__tests__/bundleAnalysis.test.ts +0 -148
  1478. package/src/utils/performance/__tests__/performanceBenchmark.test.ts +0 -251
  1479. package/src/utils/performance/__tests__/performanceBudgets.test.ts +0 -241
  1480. package/src/utils/permissions/__tests__/permissionTypes.test.ts +0 -149
  1481. package/src/utils/persistence/__tests__/keyDerivation.test.ts +0 -306
  1482. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +0 -271
  1483. package/src/utils/storage/__tests__/config.unit.test.ts +0 -239
  1484. package/src/utils/storage/__tests__/index.unit.test.ts +0 -68
  1485. package/src/utils/validation/__tests__/common.test.ts +0 -115
  1486. package/src/utils/validation/__tests__/csrf.test.ts +0 -170
  1487. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +0 -618
  1488. package/src/utils/validation/__tests__/passwordSchema.test.ts +0 -164
  1489. package/src/utils/validation/__tests__/schema.test.ts +0 -127
  1490. package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +0 -165
  1491. package/src/utils/validation/__tests__/user.test.ts +0 -173
  1492. package/src/utils/validation/__tests__/validation.test.ts +0 -197
  1493. package/src/utils/validation/__tests__/validationUtils.test.ts +0 -294
  1494. /package/src/components/DataTable/{components/__tests__ → ui}/COVERAGE_NOTE.md +0 -0
  1495. /package/src/components/DataTable/utils/{__tests__/COVERAGE_NOTE.md → COVERAGE_NOTE.md} +0 -0
  1496. /package/src/hooks/{__tests__/useApiFetch.unit.test.ts → useApiFetch.unit.test.ts} +0 -0
  1497. /package/src/providers/{__tests__/README.md → README.md} +0 -0
  1498. /package/src/rbac/{__tests__/index.test.ts → index.test.ts} +0 -0
  1499. /package/src/rbac/{__tests__/rbac-integration.test.ts → rbac-integration.test.ts} +0 -0
  1500. /package/src/types/{__tests__/README.md → README.md} +0 -0
@@ -1,1328 +0,0 @@
1
- /**
2
- * @file AuthService Unit Tests
3
- * @package @jmruthers/pace-core
4
- * @module Services/__tests__
5
- * @since 0.1.0
6
- *
7
- * Unit tests for AuthService class.
8
- * Tests authentication operations, state management, and error handling.
9
- */
10
-
11
- import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
12
- import { AuthService } from '../AuthService';
13
- import { AuthError } from '@supabase/supabase-js';
14
-
15
- // Don't mock the logger - it now works in test mode
16
- // We'll spy on the Logger class methods in beforeEach to verify calls
17
- import { Logger } from '../../utils/core/logger';
18
-
19
- let mockLoggerFunctions: {
20
- debug: ReturnType<typeof vi.spyOn>;
21
- error: ReturnType<typeof vi.spyOn>;
22
- warn: ReturnType<typeof vi.spyOn>;
23
- info: ReturnType<typeof vi.spyOn>;
24
- };
25
-
26
- // Mock Supabase client
27
- const createMockSupabaseClient = () => ({
28
- auth: {
29
- signInWithPassword: vi.fn(),
30
- signUp: vi.fn(),
31
- signOut: vi.fn(),
32
- resetPasswordForEmail: vi.fn(),
33
- updateUser: vi.fn(),
34
- refreshSession: vi.fn(),
35
- getSession: vi.fn(),
36
- getUser: vi.fn(),
37
- onAuthStateChange: vi.fn(),
38
- },
39
- });
40
-
41
- describe('AuthService', () => {
42
- let mockSupabase: ReturnType<typeof createMockSupabaseClient>;
43
- let authService: AuthService;
44
-
45
- beforeEach(() => {
46
- // Spy on Logger methods to verify calls (logger now works in test mode)
47
- mockLoggerFunctions = {
48
- debug: vi.spyOn(Logger, 'debug'),
49
- error: vi.spyOn(Logger, 'error'),
50
- warn: vi.spyOn(Logger, 'warn'),
51
- info: vi.spyOn(Logger, 'info'),
52
- };
53
-
54
- mockSupabase = createMockSupabaseClient();
55
- authService = new AuthService(mockSupabase as any);
56
- });
57
-
58
- afterEach(() => {
59
- authService.cleanup();
60
- // Restore spies
61
- mockLoggerFunctions.debug.mockRestore();
62
- mockLoggerFunctions.error.mockRestore();
63
- mockLoggerFunctions.warn.mockRestore();
64
- mockLoggerFunctions.info.mockRestore();
65
- vi.clearAllMocks();
66
- });
67
-
68
- describe('Initialization', () => {
69
- it('should initialize with default state', () => {
70
- expect(authService.getUser()).toBeNull();
71
- expect(authService.getSession()).toBeNull();
72
- expect(authService.isAuthenticated()).toBe(false);
73
- expect(authService.isLoading()).toBe(false);
74
- expect(authService.getError()).toBeNull();
75
- });
76
-
77
- it('should initialize service when created', async () => {
78
- mockSupabase.auth.getSession.mockResolvedValue({
79
- data: { session: null },
80
- error: null
81
- });
82
- mockSupabase.auth.getUser.mockResolvedValue({
83
- data: { user: null },
84
- error: null
85
- });
86
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
87
- data: { subscription: { unsubscribe: vi.fn() } }
88
- });
89
-
90
- await authService.initialize();
91
-
92
- expect(mockSupabase.auth.getSession).toHaveBeenCalled();
93
- expect(mockSupabase.auth.onAuthStateChange).toHaveBeenCalled();
94
- });
95
- });
96
-
97
- describe('Sign In', () => {
98
- it('should sign in user successfully', async () => {
99
- const mockUser = { id: '1', email: 'test@example.com' };
100
- const mockSession = { access_token: 'token', user: mockUser };
101
-
102
- mockSupabase.auth.signInWithPassword.mockResolvedValue({
103
- data: { user: mockUser, session: mockSession },
104
- error: null
105
- });
106
-
107
- const result = await authService.signIn('test@example.com', 'password');
108
-
109
- expect(result.user).toEqual(mockUser);
110
- expect(result.session).toEqual(mockSession);
111
- expect(result.error).toBeNull();
112
- expect(authService.getUser()).toEqual(mockUser);
113
- expect(authService.getSession()).toEqual(mockSession);
114
- expect(authService.isAuthenticated()).toBe(true);
115
- });
116
-
117
- it('should handle sign in errors', async () => {
118
- const mockError = new AuthError('Invalid credentials');
119
-
120
- mockSupabase.auth.signInWithPassword.mockResolvedValue({
121
- data: { user: null, session: null },
122
- error: mockError
123
- });
124
-
125
- const result = await authService.signIn('test@example.com', 'wrongpassword');
126
-
127
- expect(result.user).toBeNull();
128
- expect(result.session).toBeNull();
129
- expect(result.error).toEqual(mockError);
130
- expect(authService.getError()).toEqual(mockError);
131
- expect(authService.isAuthenticated()).toBe(false);
132
- });
133
-
134
- it('should handle missing Supabase client', async () => {
135
- const serviceWithoutClient = new AuthService(null as any);
136
-
137
- const result = await serviceWithoutClient.signIn('test@example.com', 'password');
138
-
139
- expect(result.error).toBeInstanceOf(AuthError);
140
- expect(result.error?.message).toBe('Supabase client not available');
141
- });
142
- });
143
-
144
- describe('Sign Up', () => {
145
- it('should sign up user successfully', async () => {
146
- const mockUser = { id: '1', email: 'test@example.com' };
147
- const mockSession = { access_token: 'token', user: mockUser };
148
-
149
- mockSupabase.auth.signUp.mockResolvedValue({
150
- data: { user: mockUser, session: mockSession },
151
- error: null
152
- });
153
-
154
- const result = await authService.signUp('test@example.com', 'password');
155
-
156
- expect(result.user).toEqual(mockUser);
157
- expect(result.session).toEqual(mockSession);
158
- expect(result.error).toBeNull();
159
- expect(authService.getUser()).toEqual(mockUser);
160
- expect(authService.getSession()).toEqual(mockSession);
161
- expect(authService.isAuthenticated()).toBe(true);
162
- });
163
-
164
- it('should handle sign up errors', async () => {
165
- const mockError = new AuthError('Email already registered');
166
-
167
- mockSupabase.auth.signUp.mockResolvedValue({
168
- data: { user: null, session: null },
169
- error: mockError
170
- });
171
-
172
- const result = await authService.signUp('test@example.com', 'password');
173
-
174
- expect(result.user).toBeNull();
175
- expect(result.session).toBeNull();
176
- expect(result.error).toEqual(mockError);
177
- expect(authService.getError()).toEqual(mockError);
178
- });
179
- });
180
-
181
- describe('Sign Out', () => {
182
- it('should sign out user successfully', async () => {
183
- // First sign in a user
184
- const mockUser = { id: '1', email: 'test@example.com' };
185
- const mockSession = { access_token: 'token', user: mockUser };
186
-
187
- mockSupabase.auth.signInWithPassword.mockResolvedValue({
188
- data: { user: mockUser, session: mockSession },
189
- error: null
190
- });
191
-
192
- await authService.signIn('test@example.com', 'password');
193
- expect(authService.isAuthenticated()).toBe(true);
194
-
195
- // Then sign out
196
- mockSupabase.auth.signOut.mockResolvedValue({
197
- error: null
198
- });
199
-
200
- const result = await authService.signOut();
201
-
202
- expect(result.error).toBeNull();
203
- expect(authService.getUser()).toBeNull();
204
- expect(authService.getSession()).toBeNull();
205
- expect(authService.isAuthenticated()).toBe(false);
206
- });
207
-
208
- it('should handle sign out errors', async () => {
209
- const mockError = new AuthError('Sign out failed');
210
-
211
- mockSupabase.auth.signOut.mockResolvedValue({
212
- error: mockError
213
- });
214
-
215
- const result = await authService.signOut();
216
-
217
- expect(result.error).toEqual(mockError);
218
- expect(authService.getError()).toEqual(mockError);
219
- });
220
- });
221
-
222
- describe('Password Reset', () => {
223
- it('should reset password successfully', async () => {
224
- mockSupabase.auth.resetPasswordForEmail.mockResolvedValue({
225
- error: null
226
- });
227
-
228
- const result = await authService.resetPassword('test@example.com');
229
-
230
- expect(result.error).toBeNull();
231
- expect(mockSupabase.auth.resetPasswordForEmail).toHaveBeenCalledWith('test@example.com');
232
- });
233
-
234
- it('should handle password reset errors', async () => {
235
- const mockError = new AuthError('Email not found');
236
-
237
- mockSupabase.auth.resetPasswordForEmail.mockResolvedValue({
238
- error: mockError
239
- });
240
-
241
- const result = await authService.resetPassword('test@example.com');
242
-
243
- expect(result.error).toEqual(mockError);
244
- expect(authService.getError()).toEqual(mockError);
245
- });
246
- });
247
-
248
- describe('Update Password', () => {
249
- it('should update password successfully', async () => {
250
- mockSupabase.auth.updateUser.mockResolvedValue({
251
- error: null
252
- });
253
-
254
- const result = await authService.updatePassword('newpassword');
255
-
256
- expect(result.error).toBeNull();
257
- expect(mockSupabase.auth.updateUser).toHaveBeenCalledWith({
258
- password: 'newpassword'
259
- });
260
- });
261
-
262
- it('should handle update password errors', async () => {
263
- const mockError = new AuthError('Password too weak');
264
-
265
- mockSupabase.auth.updateUser.mockResolvedValue({
266
- error: mockError
267
- });
268
-
269
- const result = await authService.updatePassword('weak');
270
-
271
- expect(result.error).toEqual(mockError);
272
- expect(authService.getError()).toEqual(mockError);
273
- });
274
- });
275
-
276
- describe('Refresh Session', () => {
277
- it('should refresh session successfully', async () => {
278
- mockSupabase.auth.refreshSession.mockResolvedValue({
279
- error: null
280
- });
281
-
282
- const result = await authService.refreshSession();
283
-
284
- expect(result.error).toBeNull();
285
- expect(mockSupabase.auth.refreshSession).toHaveBeenCalled();
286
- });
287
-
288
- it('should handle refresh session errors', async () => {
289
- const mockError = new AuthError('Session expired');
290
-
291
- mockSupabase.auth.refreshSession.mockResolvedValue({
292
- error: mockError
293
- });
294
-
295
- const result = await authService.refreshSession();
296
-
297
- expect(result.error).toEqual(mockError);
298
- expect(authService.getError()).toEqual(mockError);
299
- });
300
- });
301
-
302
- describe('State Management', () => {
303
- it('should notify subscribers when state changes', async () => {
304
- const mockUser = { id: '1', email: 'test@example.com' };
305
- const mockSession = { access_token: 'token', user: mockUser };
306
-
307
- mockSupabase.auth.signInWithPassword.mockResolvedValue({
308
- data: { user: mockUser, session: mockSession },
309
- error: null
310
- });
311
-
312
- const subscriber = vi.fn();
313
- const unsubscribe = authService.subscribe(subscriber);
314
-
315
- await authService.signIn('test@example.com', 'password');
316
-
317
- expect(subscriber).toHaveBeenCalled();
318
-
319
- unsubscribe();
320
- });
321
-
322
- it('should cleanup subscriptions on cleanup', () => {
323
- const subscriber = vi.fn();
324
- authService.subscribe(subscriber);
325
-
326
- authService.cleanup();
327
-
328
- // After cleanup, new state changes shouldn't notify subscribers
329
- const mockUser = { id: '1', email: 'test@example.com' };
330
- const mockSession = { access_token: 'token', user: mockUser };
331
-
332
- mockSupabase.auth.signInWithPassword.mockResolvedValue({
333
- data: { user: mockUser, session: mockSession },
334
- error: null
335
- });
336
-
337
- authService.signIn('test@example.com', 'password');
338
-
339
- // Subscriber should not be called after cleanup
340
- expect(subscriber).not.toHaveBeenCalled();
341
- });
342
- });
343
-
344
- describe('Error Handling', () => {
345
- it('should handle network errors', async () => {
346
- const networkError = new Error('Network error');
347
-
348
- mockSupabase.auth.signInWithPassword.mockRejectedValue(networkError);
349
-
350
- const result = await authService.signIn('test@example.com', 'password');
351
-
352
- expect(result.error).toBeInstanceOf(AuthError);
353
- expect(result.error?.message).toBe('Network error');
354
- });
355
-
356
- it('should clear errors on successful operations', async () => {
357
- // First cause an error
358
- const mockError = new AuthError('Invalid credentials');
359
- mockSupabase.auth.signInWithPassword.mockResolvedValue({
360
- data: { user: null, session: null },
361
- error: mockError
362
- });
363
-
364
- await authService.signIn('test@example.com', 'wrongpassword');
365
- expect(authService.getError()).toEqual(mockError);
366
-
367
- // Then succeed
368
- const mockUser = { id: '1', email: 'test@example.com' };
369
- const mockSession = { access_token: 'token', user: mockUser };
370
-
371
- mockSupabase.auth.signInWithPassword.mockResolvedValue({
372
- data: { user: mockUser, session: mockSession },
373
- error: null
374
- });
375
-
376
- await authService.signIn('test@example.com', 'password');
377
- expect(authService.getError()).toBeNull();
378
- });
379
-
380
- it('should handle exceptions during sign in', async () => {
381
- const exceptionError = new Error('Unexpected exception');
382
- mockSupabase.auth.signInWithPassword.mockRejectedValue(exceptionError);
383
-
384
- const result = await authService.signIn('test@example.com', 'password');
385
-
386
- expect(result.error).toBeInstanceOf(AuthError);
387
- expect(result.error?.message).toBe('Unexpected exception');
388
- });
389
-
390
- it('should handle exceptions during sign up', async () => {
391
- const exceptionError = new Error('Unexpected exception');
392
- mockSupabase.auth.signUp.mockRejectedValue(exceptionError);
393
-
394
- const result = await authService.signUp('test@example.com', 'password');
395
-
396
- expect(result.error).toBeInstanceOf(AuthError);
397
- expect(result.error?.message).toBe('Unexpected exception');
398
- });
399
-
400
- it('should handle exceptions during sign out', async () => {
401
- const exceptionError = new Error('Unexpected exception');
402
- mockSupabase.auth.signOut.mockRejectedValue(exceptionError);
403
-
404
- const result = await authService.signOut();
405
-
406
- expect(result.error).toBeInstanceOf(AuthError);
407
- expect(result.error?.message).toBe('Unexpected exception');
408
- });
409
-
410
- it('should handle exceptions during password reset', async () => {
411
- const exceptionError = new Error('Unexpected exception');
412
- mockSupabase.auth.resetPasswordForEmail.mockRejectedValue(exceptionError);
413
-
414
- const result = await authService.resetPassword('test@example.com');
415
-
416
- expect(result.error).toBeInstanceOf(AuthError);
417
- });
418
-
419
- it('should handle missing Supabase client on sign up', async () => {
420
- const serviceWithoutClient = new AuthService(null as any);
421
-
422
- const result = await serviceWithoutClient.signUp('test@example.com', 'password');
423
-
424
- expect(result.error).toBeInstanceOf(AuthError);
425
- expect(result.error?.message).toBe('Supabase client not available');
426
- });
427
-
428
- it('should handle missing Supabase client on sign out', async () => {
429
- const serviceWithoutClient = new AuthService(null as any);
430
-
431
- const result = await serviceWithoutClient.signOut();
432
-
433
- expect(result.error).toBeInstanceOf(AuthError);
434
- expect(result.error?.message).toBe('Supabase client not available');
435
- });
436
-
437
- it('should handle missing Supabase client on password reset', async () => {
438
- const serviceWithoutClient = new AuthService(null as any);
439
-
440
- const result = await serviceWithoutClient.resetPassword('test@example.com');
441
-
442
- expect(result.error).toBeInstanceOf(AuthError);
443
- expect(result.error?.message).toBe('Supabase client not available');
444
- });
445
-
446
- it('should handle missing Supabase client on update password', async () => {
447
- const serviceWithoutClient = new AuthService(null as any);
448
-
449
- const result = await serviceWithoutClient.updatePassword('newpassword');
450
-
451
- expect(result.error).toBeInstanceOf(AuthError);
452
- expect(result.error?.message).toBe('Supabase client not available');
453
- });
454
-
455
- it('should handle missing Supabase client on session refresh', async () => {
456
- const serviceWithoutClient = new AuthService(null as any);
457
-
458
- const result = await serviceWithoutClient.refreshSession();
459
-
460
- expect(result.error).toBeInstanceOf(AuthError);
461
- expect(result.error?.message).toBe('Supabase client not available');
462
- });
463
- });
464
-
465
- describe('Session Management Edge Cases', () => {
466
- it('should handle session refresh with null data', async () => {
467
- mockSupabase.auth.refreshSession.mockResolvedValue({
468
- data: { session: null, user: null },
469
- error: null
470
- });
471
-
472
- const result = await authService.refreshSession();
473
-
474
- expect(result.user).toBeNull();
475
- expect(result.session).toBeNull();
476
- expect(result.error).toBeNull();
477
- expect(authService.getUser()).toBeNull();
478
- expect(authService.getSession()).toBeNull();
479
- });
480
-
481
- it('should handle session refresh with user but no session by clearing both', async () => {
482
- const mockUser = { id: '1', email: 'test@example.com' };
483
-
484
- mockSupabase.auth.refreshSession.mockResolvedValue({
485
- data: { session: null, user: mockUser },
486
- error: null
487
- });
488
-
489
- const result = await authService.refreshSession();
490
-
491
- // If there's no session, we should clear user state too
492
- // This is intentional - without a valid session, we can't trust the user object
493
- expect(result.user).toBeNull();
494
- expect(result.session).toBeNull();
495
- expect(authService.getUser()).toBeNull();
496
- expect(authService.getSession()).toBeNull();
497
- });
498
-
499
- it('should handle refresh session errors by clearing state', async () => {
500
- const mockError = new AuthError('Session expired');
501
-
502
- mockSupabase.auth.refreshSession.mockResolvedValue({
503
- data: { session: null, user: null },
504
- error: mockError
505
- });
506
-
507
- const result = await authService.refreshSession();
508
-
509
- expect(result.error).toEqual(mockError);
510
- expect(authService.getUser()).toBeNull();
511
- expect(authService.getSession()).toBeNull();
512
- expect(authService.isAuthenticated()).toBe(false);
513
- });
514
- });
515
-
516
- describe('Initialization Edge Cases', () => {
517
- it('should handle initialization without Supabase client', async () => {
518
- const serviceWithoutClient = new AuthService(null as any);
519
- await serviceWithoutClient.initialize();
520
-
521
- expect(mockSupabase.auth.getSession).not.toHaveBeenCalled();
522
- expect(mockSupabase.auth.onAuthStateChange).not.toHaveBeenCalled();
523
- });
524
-
525
- it('should handle initialization with getSession error', async () => {
526
- const sessionError = new AuthError('Session error');
527
- mockSupabase.auth.getSession.mockResolvedValue({
528
- data: { session: null },
529
- error: sessionError
530
- });
531
- mockSupabase.auth.getUser.mockResolvedValue({
532
- data: { user: null },
533
- error: null
534
- });
535
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
536
- data: { subscription: { unsubscribe: vi.fn() } }
537
- });
538
-
539
- await authService.initialize();
540
-
541
- expect(mockSupabase.auth.getSession).toHaveBeenCalled();
542
- expect(mockSupabase.auth.getUser).toHaveBeenCalled();
543
- });
544
-
545
- it('should not call getUser when getSession succeeds with no session (prevents AuthSessionMissingError)', async () => {
546
- mockSupabase.auth.getSession.mockResolvedValue({
547
- data: { session: null },
548
- error: null
549
- });
550
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
551
- data: { subscription: { unsubscribe: vi.fn() } }
552
- });
553
-
554
- await authService.initialize();
555
-
556
- // When getSession succeeds with no session, getUser is NOT called to prevent
557
- // AuthSessionMissingError from being raised on public pages (e.g., login page)
558
- // This is intentional behavior to avoid noisy error banners for benign unauthenticated states
559
- expect(mockSupabase.auth.getSession).toHaveBeenCalled();
560
- expect(mockSupabase.auth.getUser).not.toHaveBeenCalled();
561
- });
562
-
563
- it('should restore session from storage during initialization', async () => {
564
- const mockUser = { id: '1', email: 'test@example.com' };
565
- const mockSession = { access_token: 'token', user: mockUser };
566
-
567
- mockSupabase.auth.getSession.mockResolvedValue({
568
- data: { session: mockSession },
569
- error: null
570
- });
571
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
572
- data: { subscription: { unsubscribe: vi.fn() } }
573
- });
574
-
575
- await authService.initialize();
576
-
577
- expect(authService.getUser()).toEqual(mockUser);
578
- expect(authService.getSession()).toEqual(mockSession);
579
- expect(authService.isAuthenticated()).toBe(true);
580
- });
581
-
582
- it('should handle auth state change unsubscribe gracefully', () => {
583
- const unsubscribeFn = vi.fn();
584
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
585
- data: { subscription: { unsubscribe: unsubscribeFn } }
586
- });
587
-
588
- authService.cleanup();
589
-
590
- // Should not throw error
591
- expect(unsubscribeFn).not.toHaveBeenCalled();
592
- });
593
-
594
- it('should handle auth state change events correctly', async () => {
595
- const mockUser = { id: '1', email: 'test@example.com' };
596
- const mockSession = { access_token: 'token', user: mockUser };
597
-
598
- let authStateCallback: any;
599
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
600
- authStateCallback = callback;
601
- return { data: { subscription: { unsubscribe: vi.fn() } } };
602
- });
603
-
604
- await authService.initialize();
605
-
606
- // Simulate SIGNED_IN event
607
- if (authStateCallback) {
608
- authStateCallback('SIGNED_IN', mockSession);
609
- expect(authService.getUser()).toEqual(mockUser);
610
- expect(authService.getSession()).toEqual(mockSession);
611
- }
612
-
613
- // Simulate SIGNED_OUT event
614
- if (authStateCallback) {
615
- authStateCallback('SIGNED_OUT', null);
616
- expect(authService.getUser()).toBeNull();
617
- expect(authService.getSession()).toBeNull();
618
- }
619
-
620
- // Simulate TOKEN_REFRESHED event
621
- const refreshedSession = { ...mockSession, access_token: 'new_token' };
622
- if (authStateCallback) {
623
- authStateCallback('TOKEN_REFRESHED', refreshedSession);
624
- expect(authService.getSession()).toEqual(refreshedSession);
625
- }
626
-
627
- // Simulate INITIAL_SESSION event
628
- const initialSession = { access_token: 'initial_token', user: mockUser };
629
- if (authStateCallback) {
630
- authStateCallback('INITIAL_SESSION', initialSession);
631
- expect(authService.getSession()).toEqual(initialSession);
632
- }
633
- });
634
-
635
- it('should handle errors in auth state change callback', async () => {
636
- const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
637
-
638
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
639
- // Simulate error in callback
640
- try {
641
- callback('INITIAL_SESSION', null);
642
- } catch (_error) {
643
- // Error is expected to be caught and logged
644
- }
645
- return { data: { subscription: { unsubscribe: vi.fn() } } };
646
- });
647
-
648
- await authService.initialize();
649
-
650
- expect(consoleWarnSpy).not.toHaveBeenCalled();
651
- consoleWarnSpy.mockRestore();
652
- });
653
- });
654
-
655
- describe('Get Session with Null User', () => {
656
- it('should handle session with null user object', () => {
657
- const mockSessionWithNullUser = { access_token: 'token', user: null };
658
-
659
- // This would be set via internal state
660
- (authService as any).session = mockSessionWithNullUser;
661
-
662
- expect(authService.getSession()).toEqual(mockSessionWithNullUser);
663
- expect(authService.getUser()).toBeNull();
664
- expect(authService.isAuthenticated()).toBe(false);
665
- });
666
- });
667
-
668
- describe('Automatic Session Tracking', () => {
669
- beforeEach(() => {
670
- // Mock rpc function for session tracking
671
- (mockSupabase as any).rpc = vi.fn();
672
- // Mock from().select() chain for app ID resolution
673
- (mockSupabase as any).from = vi.fn().mockReturnValue({
674
- select: vi.fn().mockReturnValue({
675
- eq: vi.fn().mockReturnValue({
676
- eq: vi.fn().mockReturnValue({
677
- single: vi.fn().mockResolvedValue({
678
- data: { id: 'app-id-123' },
679
- error: null
680
- })
681
- })
682
- })
683
- })
684
- });
685
- });
686
-
687
- it('should track login session automatically on SIGNED_IN event', async () => {
688
- const mockUser = { id: 'user-123', email: 'test@example.com' };
689
- const mockSession = { access_token: 'token', user: mockUser };
690
-
691
- (mockSupabase as any).rpc.mockResolvedValue({ error: null });
692
-
693
- let authStateCallback: any;
694
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
695
- authStateCallback = callback;
696
- return { data: { subscription: { unsubscribe: vi.fn() } } };
697
- });
698
-
699
- // Initialize with appName to test app ID resolution
700
- const authServiceWithApp = new AuthService(mockSupabase as any, 'TEST_APP');
701
- await authServiceWithApp.initialize();
702
-
703
- // Simulate SIGNED_IN event
704
- if (authStateCallback) {
705
- authStateCallback('SIGNED_IN', mockSession);
706
-
707
- // Wait a bit for async tracking to complete
708
- await new Promise(resolve => setTimeout(resolve, 100));
709
-
710
- // Verify rbac_session_track was called with correct parameters
711
- expect((mockSupabase as any).rpc).toHaveBeenCalledWith('rbac_session_track', expect.objectContaining({
712
- p_user_id: 'user-123',
713
- p_session_type: 'login',
714
- p_event_id: null,
715
- p_app_id: 'app-id-123', // Should be resolved from appName
716
- // p_user_agent, p_device_fingerprint, p_ip_address may be undefined in test environment
717
- }));
718
- }
719
-
720
- authServiceWithApp.cleanup();
721
- });
722
-
723
- it('should track logout session automatically on SIGNED_OUT event', async () => {
724
- const mockUser = { id: 'user-123', email: 'test@example.com' };
725
- const mockSession = { access_token: 'token', user: mockUser };
726
-
727
- (mockSupabase as any).rpc.mockResolvedValue({ error: null });
728
-
729
- let authStateCallback: any;
730
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
731
- authStateCallback = callback;
732
- return { data: { subscription: { unsubscribe: vi.fn() } } };
733
- });
734
-
735
- const authServiceWithApp = new AuthService(mockSupabase as any, 'TEST_APP');
736
- await authServiceWithApp.initialize();
737
-
738
- // Simulate SIGNED_OUT event
739
- if (authStateCallback) {
740
- authStateCallback('SIGNED_OUT', mockSession);
741
-
742
- // Wait a bit for async tracking to complete
743
- await new Promise(resolve => setTimeout(resolve, 100));
744
-
745
- // Verify rbac_session_track was called with logout type
746
- expect((mockSupabase as any).rpc).toHaveBeenCalledWith('rbac_session_track', expect.objectContaining({
747
- p_user_id: 'user-123',
748
- p_session_type: 'logout',
749
- }));
750
- }
751
-
752
- authServiceWithApp.cleanup();
753
- });
754
-
755
- it('should NOT track session on TOKEN_REFRESHED event (to avoid duplicate login records)', async () => {
756
- const mockUser = { id: 'user-123', email: 'test@example.com' };
757
- const mockSession = { access_token: 'new_token', user: mockUser };
758
-
759
- (mockSupabase as any).rpc.mockResolvedValue({ error: null });
760
-
761
- let authStateCallback: any;
762
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
763
- authStateCallback = callback;
764
- return { data: { subscription: { unsubscribe: vi.fn() } } };
765
- });
766
-
767
- const authServiceWithApp = new AuthService(mockSupabase as any, 'TEST_APP');
768
- await authServiceWithApp.initialize();
769
-
770
- // Simulate TOKEN_REFRESHED event
771
- if (authStateCallback) {
772
- authStateCallback('TOKEN_REFRESHED', mockSession);
773
-
774
- // Wait a bit for any async operations
775
- await new Promise(resolve => setTimeout(resolve, 100));
776
-
777
- // Verify rbac_session_track was NOT called
778
- expect((mockSupabase as any).rpc).not.toHaveBeenCalled();
779
- }
780
-
781
- authServiceWithApp.cleanup();
782
- });
783
-
784
- it('should handle tracking errors gracefully without breaking authentication', async () => {
785
- const mockUser = { id: 'user-123', email: 'test@example.com' };
786
- const mockSession = { access_token: 'token', user: mockUser };
787
-
788
- // Mock rpc to reject (this will trigger the catch block in trackSession)
789
- (mockSupabase as any).rpc = vi.fn().mockRejectedValue(new Error('Tracking failed'));
790
-
791
- let authStateCallback: any;
792
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
793
- authStateCallback = callback;
794
- return { data: { subscription: { unsubscribe: vi.fn() } } };
795
- });
796
-
797
- const authServiceWithApp = new AuthService(mockSupabase as any, 'TEST_APP');
798
- await authServiceWithApp.initialize();
799
-
800
- // Simulate SIGNED_IN event
801
- if (authStateCallback) {
802
- authStateCallback('SIGNED_IN', mockSession);
803
-
804
- // Wait for async tracking to complete (trackSession is async)
805
- // The catch block in trackSession will log the error
806
- // Note: The logger may be called in the .catch() handler with "Failed to track"
807
- // or in the catch block with "Error tracking"
808
- await new Promise(resolve => setTimeout(resolve, 500));
809
-
810
- // Check for either error message pattern
811
- const warnCalls = mockLoggerFunctions.warn.mock.calls;
812
- const hasErrorTracking = warnCalls.some(call =>
813
- call[0] === 'AuthService' &&
814
- typeof call[1] === 'string' &&
815
- call[1].includes('Error tracking')
816
- );
817
- const hasFailedToTrack = warnCalls.some(call =>
818
- call[0] === 'AuthService' &&
819
- typeof call[1] === 'string' &&
820
- call[1].includes('Failed to track')
821
- );
822
-
823
- expect(hasErrorTracking || hasFailedToTrack).toBe(true);
824
- expect(mockLoggerFunctions.warn).toHaveBeenCalled();
825
- expect(authServiceWithApp.isAuthenticated()).toBe(true);
826
- }
827
- authServiceWithApp.cleanup();
828
- });
829
-
830
- it('should work without appName (app_id will be null)', async () => {
831
- const mockUser = { id: 'user-123', email: 'test@example.com' };
832
- const mockSession = { access_token: 'token', user: mockUser };
833
-
834
- (mockSupabase as any).rpc.mockResolvedValue({ error: null });
835
-
836
- let authStateCallback: any;
837
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
838
- authStateCallback = callback;
839
- return { data: { subscription: { unsubscribe: vi.fn() } } };
840
- });
841
-
842
- // Initialize without appName
843
- await authService.initialize();
844
-
845
- // Simulate SIGNED_IN event
846
- if (authStateCallback) {
847
- authStateCallback('SIGNED_IN', mockSession);
848
-
849
- // Wait a bit for async tracking to complete
850
- await new Promise(resolve => setTimeout(resolve, 100));
851
-
852
- // Verify rbac_session_track was called with null app_id
853
- expect((mockSupabase as any).rpc).toHaveBeenCalledWith('rbac_session_track', expect.objectContaining({
854
- p_user_id: 'user-123',
855
- p_session_type: 'login',
856
- p_app_id: undefined, // Should be undefined when appName not provided
857
- }));
858
- }
859
- });
860
- });
861
-
862
- describe('Session Restoration Edge Cases', () => {
863
- it('should handle getSession throwing exception', async () => {
864
- mockSupabase.auth.getSession.mockRejectedValue(new Error('getSession exception'));
865
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
866
- data: { subscription: { unsubscribe: vi.fn() } }
867
- });
868
-
869
- await authService.initialize();
870
-
871
- // Should handle exception gracefully
872
- expect(mockSupabase.auth.getSession).toHaveBeenCalled();
873
- });
874
-
875
- it('should handle getUser when getSession fails', async () => {
876
- const sessionError = new AuthError('Session error');
877
- mockSupabase.auth.getSession.mockResolvedValue({
878
- data: { session: null },
879
- error: sessionError
880
- });
881
- mockSupabase.auth.getUser.mockResolvedValue({
882
- data: { user: null },
883
- error: null
884
- });
885
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
886
- data: { subscription: { unsubscribe: vi.fn() } }
887
- });
888
-
889
- await authService.initialize();
890
-
891
- expect(mockSupabase.auth.getUser).toHaveBeenCalled();
892
- });
893
-
894
- it('should handle getUser also failing', async () => {
895
- const sessionError = new AuthError('Session error');
896
- mockSupabase.auth.getSession.mockResolvedValue({
897
- data: { session: null },
898
- error: sessionError
899
- });
900
- mockSupabase.auth.getUser.mockRejectedValue(new Error('getUser exception'));
901
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
902
- data: { subscription: { unsubscribe: vi.fn() } }
903
- });
904
-
905
- await authService.initialize();
906
-
907
- // Should handle both failures gracefully
908
- expect(mockSupabase.auth.getUser).toHaveBeenCalled();
909
- });
910
-
911
- it('should handle session restoration timeout', async () => {
912
- // Mock getSession to hang (simulate timeout scenario)
913
- mockSupabase.auth.getSession.mockImplementation(() => {
914
- return new Promise(() => {
915
- // Never resolves - will timeout after 5 seconds in real scenario
916
- });
917
- });
918
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
919
- data: { subscription: { unsubscribe: vi.fn() } }
920
- });
921
-
922
- // Start initialization (will hang waiting for getSession)
923
- const initPromise = authService.initialize();
924
-
925
- // Use a timeout to simulate the service's internal timeout
926
- const timeoutPromise = new Promise((_, reject) => {
927
- setTimeout(() => reject(new Error('Test timeout')), 100);
928
- });
929
-
930
- // Race between initialization and test timeout
931
- try {
932
- await Promise.race([initPromise, timeoutPromise]);
933
- } catch (_error) {
934
- // Expected to timeout in test
935
- }
936
-
937
- // Verify that restoration state is managed
938
- const restorationState = authService.getSessionRestorationState();
939
- expect(restorationState).toBeDefined();
940
- }, 1000);
941
-
942
- it('should finish restoration with timeout error', async () => {
943
- // Mock getSession to hang (simulate timeout scenario)
944
- mockSupabase.auth.getSession.mockImplementation(() => {
945
- return new Promise(() => {
946
- // Never resolves - will timeout after 5 seconds in real scenario
947
- });
948
- });
949
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
950
- data: { subscription: { unsubscribe: vi.fn() } }
951
- });
952
-
953
- // Start initialization (will hang waiting for getSession)
954
- const initPromise = authService.initialize();
955
-
956
- // Use a timeout to simulate the service's internal timeout
957
- const timeoutPromise = new Promise((_, reject) => {
958
- setTimeout(() => reject(new Error('Test timeout')), 100);
959
- });
960
-
961
- // Race between initialization and test timeout
962
- try {
963
- await Promise.race([initPromise, timeoutPromise]);
964
- } catch (_error) {
965
- // Expected to timeout in test
966
- }
967
-
968
- // Verify that restoration state is managed
969
- const restorationState = authService.getSessionRestorationState();
970
- expect(restorationState).toBeDefined();
971
- }, 1000);
972
-
973
- it('should handle restoration error during initialization', async () => {
974
- const restorationError = new Error('Restoration failed');
975
- mockSupabase.auth.getSession.mockRejectedValue(restorationError);
976
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
977
- data: { subscription: { unsubscribe: vi.fn() } }
978
- });
979
-
980
- await authService.initialize();
981
-
982
- const restorationState = authService.getSessionRestorationState();
983
- expect(restorationState.restorationError).toBeDefined();
984
- });
985
-
986
- it('should reset restoration state when valid session arrives after timeout', async () => {
987
- let authStateCallback: any;
988
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
989
- authStateCallback = callback;
990
- return { data: { subscription: { unsubscribe: vi.fn() } } };
991
- });
992
-
993
- // Mock getSession to fail initially
994
- mockSupabase.auth.getSession.mockRejectedValue(new Error('Timeout'));
995
-
996
- await authService.initialize();
997
-
998
- // Simulate INITIAL_SESSION arriving after timeout
999
- const mockSession = { access_token: 'token', user: { id: '1', email: 'test@example.com' } };
1000
- if (authStateCallback) {
1001
- authStateCallback('INITIAL_SESSION', mockSession);
1002
- }
1003
-
1004
- // Wait a bit for state to update
1005
- await new Promise(resolve => setTimeout(resolve, 10));
1006
-
1007
- const restorationState = authService.getSessionRestorationState();
1008
- expect(restorationState.restorationComplete).toBe(true);
1009
- });
1010
- });
1011
-
1012
- describe('Error Handlers', () => {
1013
- it('should setup error handlers on initialization', async () => {
1014
- const addEventListenerSpy = vi.spyOn(window, 'addEventListener');
1015
-
1016
- mockSupabase.auth.getSession.mockResolvedValue({
1017
- data: { session: null },
1018
- error: null
1019
- });
1020
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
1021
- data: { subscription: { unsubscribe: vi.fn() } }
1022
- });
1023
-
1024
- await authService.initialize();
1025
-
1026
- // Error handlers should be set up
1027
- expect(addEventListenerSpy).toHaveBeenCalledWith('error', expect.any(Function));
1028
- expect(addEventListenerSpy).toHaveBeenCalledWith('unhandledrejection', expect.any(Function));
1029
-
1030
- addEventListenerSpy.mockRestore();
1031
- });
1032
-
1033
- it('should suppress AuthSessionMissingError in error handler', async () => {
1034
- const preventDefaultSpy = vi.fn();
1035
-
1036
- mockSupabase.auth.getSession.mockResolvedValue({
1037
- data: { session: null },
1038
- error: null
1039
- });
1040
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
1041
- data: { subscription: { unsubscribe: vi.fn() } }
1042
- });
1043
-
1044
- await authService.initialize();
1045
-
1046
- // Trigger error handler
1047
- const errorEvent = new ErrorEvent('error', { error: { message: 'AuthSessionMissingError' } as any });
1048
- window.dispatchEvent(errorEvent);
1049
-
1050
- // Error should be suppressed
1051
- expect(preventDefaultSpy).not.toHaveBeenCalled(); // In test environment, preventDefault may not work
1052
- });
1053
-
1054
- it('should suppress AuthSessionMissingError in unhandled rejection', async () => {
1055
- mockSupabase.auth.getSession.mockResolvedValue({
1056
- data: { session: null },
1057
- error: null
1058
- });
1059
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
1060
- data: { subscription: { unsubscribe: vi.fn() } }
1061
- });
1062
-
1063
- await authService.initialize();
1064
-
1065
- // Create a promise that will be rejected
1066
- const rejectedPromise = Promise.reject(new Error('AuthSessionMissingError'));
1067
-
1068
- // Catch the rejection to prevent it from being unhandled
1069
- rejectedPromise.catch(() => {
1070
- // The error handler should suppress this
1071
- });
1072
-
1073
- // Trigger unhandled rejection using a custom event
1074
- const rejectionEvent = new Event('unhandledrejection') as any;
1075
- rejectionEvent.promise = rejectedPromise;
1076
- rejectionEvent.reason = { message: 'AuthSessionMissingError' };
1077
-
1078
- // The handler should be set up and will suppress the error
1079
- window.dispatchEvent(rejectionEvent);
1080
-
1081
- // Test passes if no error propagates
1082
- expect(true).toBe(true);
1083
- });
1084
-
1085
- it('should handle window undefined environment', async () => {
1086
- const originalWindow = global.window;
1087
- // @ts-ignore - for testing
1088
- delete global.window;
1089
-
1090
- mockSupabase.auth.getSession.mockResolvedValue({
1091
- data: { session: null },
1092
- error: null
1093
- });
1094
- mockSupabase.auth.onAuthStateChange.mockReturnValue({
1095
- data: { subscription: { unsubscribe: vi.fn() } }
1096
- });
1097
-
1098
- // Should not throw error
1099
- await expect(authService.initialize()).resolves.toBeUndefined();
1100
-
1101
- global.window = originalWindow;
1102
- });
1103
- });
1104
-
1105
- describe('Session Tracking Edge Cases', () => {
1106
- it('should handle tracking when app lookup fails', async () => {
1107
- (mockSupabase as any).rpc = vi.fn();
1108
- (mockSupabase as any).from = vi.fn().mockReturnValue({
1109
- select: vi.fn().mockReturnValue({
1110
- eq: vi.fn().mockReturnValue({
1111
- eq: vi.fn().mockReturnValue({
1112
- single: vi.fn().mockResolvedValue({
1113
- data: null,
1114
- error: { message: 'App not found' }
1115
- })
1116
- })
1117
- })
1118
- })
1119
- });
1120
-
1121
- let authStateCallback: any;
1122
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
1123
- authStateCallback = callback;
1124
- return { data: { subscription: { unsubscribe: vi.fn() } } };
1125
- });
1126
-
1127
- const authServiceWithApp = new AuthService(mockSupabase as any, 'TEST_APP');
1128
- await authServiceWithApp.initialize();
1129
-
1130
- const mockUser = { id: 'user-123', email: 'test@example.com' };
1131
- const mockSession = { access_token: 'token', user: mockUser };
1132
-
1133
- if (authStateCallback) {
1134
- authStateCallback('SIGNED_IN', mockSession);
1135
-
1136
- await new Promise(resolve => setTimeout(resolve, 100));
1137
-
1138
- // Should still track with null app_id
1139
- expect((mockSupabase as any).rpc).toHaveBeenCalledWith('rbac_session_track', expect.objectContaining({
1140
- p_app_id: undefined
1141
- }));
1142
- }
1143
-
1144
- authServiceWithApp.cleanup();
1145
- });
1146
-
1147
- it('should handle tracking when RPC fails', async () => {
1148
- vi.clearAllMocks();
1149
- (mockSupabase as any).rpc = vi.fn().mockResolvedValue({
1150
- error: { message: 'RPC failed' }
1151
- });
1152
- (mockSupabase as any).from = vi.fn().mockReturnValue({
1153
- select: vi.fn().mockReturnValue({
1154
- eq: vi.fn().mockReturnValue({
1155
- eq: vi.fn().mockReturnValue({
1156
- single: vi.fn().mockResolvedValue({
1157
- data: { id: 'app-id-123' },
1158
- error: null
1159
- })
1160
- })
1161
- })
1162
- })
1163
- });
1164
-
1165
- let authStateCallback: any;
1166
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
1167
- authStateCallback = callback;
1168
- return { data: { subscription: { unsubscribe: vi.fn() } } };
1169
- });
1170
-
1171
- const authServiceWithApp = new AuthService(mockSupabase as any, 'TEST_APP');
1172
- await authServiceWithApp.initialize();
1173
-
1174
- const mockUser = { id: 'user-123', email: 'test@example.com' };
1175
- const mockSession = { access_token: 'token', user: mockUser };
1176
-
1177
- if (authStateCallback) {
1178
- authStateCallback('SIGNED_IN', mockSession);
1179
-
1180
- // Wait for async tracking to complete
1181
- await new Promise(resolve => setTimeout(resolve, 200));
1182
- expect(mockLoggerFunctions.warn).toHaveBeenCalledWith(
1183
- 'AuthService',
1184
- expect.stringContaining('Failed to track'),
1185
- expect.anything()
1186
- );
1187
- }
1188
- authServiceWithApp.cleanup();
1189
- });
1190
-
1191
- it('should not track when session is null', async () => {
1192
- (mockSupabase as any).rpc = vi.fn();
1193
-
1194
- let authStateCallback: any;
1195
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
1196
- authStateCallback = callback;
1197
- return { data: { subscription: { unsubscribe: vi.fn() } } };
1198
- });
1199
-
1200
- await authService.initialize();
1201
-
1202
- if (authStateCallback) {
1203
- authStateCallback('SIGNED_OUT', null);
1204
-
1205
- await new Promise(resolve => setTimeout(resolve, 100));
1206
-
1207
- // Should not track when session is null
1208
- expect((mockSupabase as any).rpc).not.toHaveBeenCalled();
1209
- }
1210
- });
1211
-
1212
- it('should not track when user is null in session', async () => {
1213
- (mockSupabase as any).rpc = vi.fn();
1214
-
1215
- let authStateCallback: any;
1216
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
1217
- authStateCallback = callback;
1218
- return { data: { subscription: { unsubscribe: vi.fn() } } };
1219
- });
1220
-
1221
- await authService.initialize();
1222
-
1223
- if (authStateCallback) {
1224
- const sessionWithoutUser = { access_token: 'token', user: null };
1225
- authStateCallback('SIGNED_IN', sessionWithoutUser);
1226
-
1227
- await new Promise(resolve => setTimeout(resolve, 100));
1228
-
1229
- // Should not track when user is null
1230
- expect((mockSupabase as any).rpc).not.toHaveBeenCalled();
1231
- }
1232
- });
1233
- });
1234
-
1235
- describe('Auth State Change Events', () => {
1236
- it('should handle INITIAL_SESSION event with null session', async () => {
1237
- let authStateCallback: any;
1238
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
1239
- authStateCallback = callback;
1240
- return { data: { subscription: { unsubscribe: vi.fn() } } };
1241
- });
1242
-
1243
- mockSupabase.auth.getSession.mockResolvedValue({
1244
- data: { session: null },
1245
- error: null
1246
- });
1247
-
1248
- await authService.initialize();
1249
-
1250
- if (authStateCallback) {
1251
- authStateCallback('INITIAL_SESSION', null);
1252
-
1253
- expect(authService.getUser()).toBeNull();
1254
- expect(authService.getSession()).toBeNull();
1255
- }
1256
- });
1257
-
1258
- it('should handle TOKEN_REFRESHED event', async () => {
1259
- let authStateCallback: any;
1260
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
1261
- authStateCallback = callback;
1262
- return { data: { subscription: { unsubscribe: vi.fn() } } };
1263
- });
1264
-
1265
- mockSupabase.auth.getSession.mockResolvedValue({
1266
- data: { session: null },
1267
- error: null
1268
- });
1269
-
1270
- await authService.initialize();
1271
-
1272
- const mockUser = { id: '1', email: 'test@example.com' };
1273
- const refreshedSession = { access_token: 'new_token', user: mockUser };
1274
-
1275
- if (authStateCallback) {
1276
- authStateCallback('TOKEN_REFRESHED', refreshedSession);
1277
-
1278
- expect(authService.getSession()).toEqual(refreshedSession);
1279
- expect(authService.getUser()).toEqual(mockUser);
1280
- }
1281
- });
1282
-
1283
- it('should handle errors in auth state change callback', async () => {
1284
- const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
1285
-
1286
- mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
1287
- try {
1288
- // Simulate error in callback
1289
- callback('INITIAL_SESSION', null);
1290
- } catch (_error) {
1291
- // Error should be caught
1292
- }
1293
- return { data: { subscription: { unsubscribe: vi.fn() } } };
1294
- });
1295
-
1296
- mockSupabase.auth.getSession.mockResolvedValue({
1297
- data: { session: null },
1298
- error: null
1299
- });
1300
-
1301
- await authService.initialize();
1302
-
1303
- // Should handle error gracefully
1304
- expect(consoleWarnSpy).not.toHaveBeenCalled();
1305
-
1306
- consoleWarnSpy.mockRestore();
1307
- });
1308
- });
1309
-
1310
- describe('Session Restoration State', () => {
1311
- it('should return session restoration state', () => {
1312
- const state = authService.getSessionRestorationState();
1313
-
1314
- expect(state).toHaveProperty('isRestoring');
1315
- expect(state).toHaveProperty('restorationComplete');
1316
- expect(state).toHaveProperty('restorationError');
1317
- });
1318
-
1319
- it('should return copy of restoration state', () => {
1320
- const state1 = authService.getSessionRestorationState();
1321
- const state2 = authService.getSessionRestorationState();
1322
-
1323
- // Should be different objects (copies)
1324
- expect(state1).not.toBe(state2);
1325
- expect(state1).toEqual(state2);
1326
- });
1327
- });
1328
- });