@jmruthers/pace-core 0.5.181 → 0.5.182

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 (750) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +16 -2
  3. package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
  4. package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
  5. package/dist/{DataTable-UA6CL4JI.js → DataTable-QAB34V6K.js} +14 -15
  6. package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
  7. package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
  8. package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
  9. package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
  10. package/dist/auth-BZOJqrdd.d.ts +49 -0
  11. package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
  12. package/dist/chunk-5DRSZLL2.js.map +1 -0
  13. package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
  14. package/dist/chunk-6C4YBBJM.js.map +1 -0
  15. package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
  16. package/dist/{chunk-HRO5HWN2.js → chunk-CSOFYHAG.js} +55 -162
  17. package/dist/chunk-CSOFYHAG.js.map +1 -0
  18. package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
  19. package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
  20. package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
  21. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  22. package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
  23. package/dist/chunk-FSFQFJCU.js.map +1 -0
  24. package/dist/chunk-FUEYYMX5.js +2296 -0
  25. package/dist/chunk-FUEYYMX5.js.map +1 -0
  26. package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
  27. package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
  28. package/dist/chunk-KQCRWDSA.js +1 -0
  29. package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
  30. package/dist/chunk-KUEN3HFB.js.map +1 -0
  31. package/dist/chunk-LMC26NLJ.js +84 -0
  32. package/dist/chunk-LMC26NLJ.js.map +1 -0
  33. package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
  34. package/dist/chunk-M7W4CP3M.js.map +1 -0
  35. package/dist/{chunk-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
  36. package/dist/chunk-MI7HBHN3.js.map +1 -0
  37. package/dist/{chunk-PPMP5J6T.js → chunk-PWAHJW4G.js} +180 -29
  38. package/dist/chunk-PWAHJW4G.js.map +1 -0
  39. package/dist/chunk-PWLANIRT.js +127 -0
  40. package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
  41. package/dist/chunk-QCDXODCA.js +75 -0
  42. package/dist/chunk-QCDXODCA.js.map +1 -0
  43. package/dist/{chunk-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
  44. package/dist/chunk-QETLRQI6.js.map +1 -0
  45. package/dist/{chunk-5MT24GKJ.js → chunk-QUVSNGIP.js} +264 -262
  46. package/dist/chunk-QUVSNGIP.js.map +1 -0
  47. package/dist/chunk-QXHPKYJV.js +113 -0
  48. package/dist/chunk-QXHPKYJV.js.map +1 -0
  49. package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
  50. package/dist/chunk-R77UEZ4E.js.map +1 -0
  51. package/dist/{chunk-ZYTYSTO5.js → chunk-RA3JUFMW.js} +314 -161
  52. package/dist/chunk-RA3JUFMW.js.map +1 -0
  53. package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
  54. package/dist/chunk-SQGMNID3.js.map +1 -0
  55. package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
  56. package/dist/chunk-UHNYIBXL.js.map +1 -0
  57. package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
  58. package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
  59. package/dist/{chunk-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
  60. package/dist/{chunk-VZ4VDGTB.js.map → chunk-W22JP75J.js.map} +1 -1
  61. package/dist/components.d.ts +12 -93
  62. package/dist/components.js +23 -106
  63. package/dist/components.js.map +1 -1
  64. package/dist/core-CUElvH_C.d.ts +164 -0
  65. package/dist/database.generated-CBmg2950.d.ts +8284 -0
  66. package/dist/event-CW5YB_2p.d.ts +239 -0
  67. package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
  68. package/dist/functions-D_kgHktt.d.ts +208 -0
  69. package/dist/hooks.d.ts +54 -7
  70. package/dist/hooks.js +204 -17
  71. package/dist/hooks.js.map +1 -1
  72. package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
  73. package/dist/index.d.ts +94 -261
  74. package/dist/index.js +314 -126
  75. package/dist/index.js.map +1 -1
  76. package/dist/providers.d.ts +7 -8
  77. package/dist/providers.js +6 -13
  78. package/dist/rbac/index.d.ts +171 -101
  79. package/dist/rbac/index.js +23 -17
  80. package/dist/styles/index.d.ts +1 -3
  81. package/dist/styles/index.js +2 -17
  82. package/dist/theming/runtime.js +3 -3
  83. package/dist/types-UU913iLA.d.ts +102 -0
  84. package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
  85. package/dist/types.d.ts +88 -227
  86. package/dist/types.js +64 -112
  87. package/dist/types.js.map +1 -1
  88. package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
  89. package/dist/utils.d.ts +299 -13
  90. package/dist/utils.js +481 -55
  91. package/dist/utils.js.map +1 -1
  92. package/dist/validation-643vUDZW.d.ts +177 -0
  93. package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
  94. package/docs/README.md +9 -8
  95. package/docs/api/README.md +16 -2
  96. package/docs/api/classes/ColumnFactory.md +1 -1
  97. package/docs/api/classes/ErrorBoundary.md +1 -1
  98. package/docs/api/classes/InvalidScopeError.md +4 -4
  99. package/docs/api/classes/MissingUserContextError.md +4 -4
  100. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  101. package/docs/api/classes/PermissionDeniedError.md +4 -4
  102. package/docs/api/classes/RBACAuditManager.md +14 -14
  103. package/docs/api/classes/RBACCache.md +1 -1
  104. package/docs/api/classes/RBACEngine.md +2 -2
  105. package/docs/api/classes/RBACError.md +4 -4
  106. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  107. package/docs/api/classes/SecureSupabaseClient.md +29 -9
  108. package/docs/api/classes/StorageUtils.md +1 -1
  109. package/docs/api/enums/FileCategory.md +17 -17
  110. package/docs/api/enums/RBACErrorCode.md +228 -0
  111. package/docs/api/enums/RPCFunction.md +118 -0
  112. package/docs/api/interfaces/AggregateConfig.md +1 -1
  113. package/docs/api/interfaces/BadgeProps.md +1 -1
  114. package/docs/api/interfaces/ButtonProps.md +2 -2
  115. package/docs/api/interfaces/CalendarProps.md +1 -1
  116. package/docs/api/interfaces/CardProps.md +29 -3
  117. package/docs/api/interfaces/ColorPalette.md +1 -1
  118. package/docs/api/interfaces/ColorShade.md +1 -1
  119. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  120. package/docs/api/interfaces/DataRecord.md +1 -1
  121. package/docs/api/interfaces/DataTableAction.md +2 -2
  122. package/docs/api/interfaces/DataTableColumn.md +6 -6
  123. package/docs/api/interfaces/DataTableProps.md +1 -1
  124. package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
  125. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  126. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  127. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  128. package/docs/api/interfaces/ExportColumn.md +5 -5
  129. package/docs/api/interfaces/ExportOptions.md +4 -4
  130. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  131. package/docs/api/interfaces/FileMetadata.md +13 -13
  132. package/docs/api/interfaces/FileReference.md +12 -12
  133. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  134. package/docs/api/interfaces/FileUploadOptions.md +10 -10
  135. package/docs/api/interfaces/FileUploadProps.md +19 -19
  136. package/docs/api/interfaces/FooterProps.md +1 -1
  137. package/docs/api/interfaces/FormFieldProps.md +166 -0
  138. package/docs/api/interfaces/FormProps.md +113 -0
  139. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  140. package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
  141. package/docs/api/interfaces/InputProps.md +2 -2
  142. package/docs/api/interfaces/LabelProps.md +8 -8
  143. package/docs/api/interfaces/LoginFormProps.md +1 -1
  144. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  145. package/docs/api/interfaces/NavigationContextType.md +1 -1
  146. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  147. package/docs/api/interfaces/NavigationItem.md +17 -73
  148. package/docs/api/interfaces/NavigationMenuProps.md +38 -53
  149. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  150. package/docs/api/interfaces/Organisation.md +13 -13
  151. package/docs/api/interfaces/OrganisationContextType.md +21 -21
  152. package/docs/api/interfaces/OrganisationMembership.md +15 -15
  153. package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
  154. package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
  155. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
  156. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  157. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  158. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  159. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  160. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  161. package/docs/api/interfaces/PaletteData.md +1 -1
  162. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  163. package/docs/api/interfaces/ProgressProps.md +50 -0
  164. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  165. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  166. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  167. package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
  168. package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
  169. package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
  170. package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
  171. package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
  172. package/docs/api/interfaces/RBACConfig.md +2 -2
  173. package/docs/api/interfaces/RBACContext.md +52 -0
  174. package/docs/api/interfaces/RBACLogger.md +1 -1
  175. package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
  176. package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
  177. package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
  178. package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
  179. package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
  180. package/docs/api/interfaces/RBACResult.md +58 -0
  181. package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
  182. package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
  183. package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
  184. package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
  185. package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
  186. package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
  187. package/docs/api/interfaces/RBACRolesListParams.md +52 -0
  188. package/docs/api/interfaces/RBACRolesListResult.md +74 -0
  189. package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
  190. package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
  191. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  192. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  193. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  194. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  195. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  196. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  197. package/docs/api/interfaces/RouteConfig.md +1 -1
  198. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  199. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  200. package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
  201. package/docs/api/interfaces/StorageConfig.md +1 -1
  202. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  203. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  204. package/docs/api/interfaces/StorageListOptions.md +1 -1
  205. package/docs/api/interfaces/StorageListResult.md +1 -1
  206. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  207. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  208. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  209. package/docs/api/interfaces/StyleImport.md +1 -1
  210. package/docs/api/interfaces/SwitchProps.md +1 -1
  211. package/docs/api/interfaces/TabsContentProps.md +1 -1
  212. package/docs/api/interfaces/TabsListProps.md +1 -1
  213. package/docs/api/interfaces/TabsProps.md +1 -1
  214. package/docs/api/interfaces/TabsTriggerProps.md +43 -2
  215. package/docs/api/interfaces/TextareaProps.md +2 -2
  216. package/docs/api/interfaces/ToastActionElement.md +1 -1
  217. package/docs/api/interfaces/ToastProps.md +1 -1
  218. package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
  219. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  220. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  221. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  222. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  223. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  224. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  225. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  226. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
  227. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  228. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  229. package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
  230. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  231. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  232. package/docs/api/interfaces/UserEventAccess.md +1 -1
  233. package/docs/api/interfaces/UserMenuProps.md +4 -4
  234. package/docs/api/interfaces/UserProfile.md +7 -7
  235. package/docs/api/modules.md +484 -462
  236. package/docs/api-reference/components.md +186 -15
  237. package/docs/api-reference/deprecated.md +376 -0
  238. package/docs/api-reference/hooks.md +149 -19
  239. package/docs/api-reference/providers.md +61 -6
  240. package/docs/api-reference/rpc-functions.md +397 -0
  241. package/docs/api-reference/types.md +135 -78
  242. package/docs/api-reference/utilities.md +51 -380
  243. package/docs/architecture/README.md +49 -3
  244. package/docs/architecture/database-schema-requirements.md +40 -3
  245. package/docs/architecture/rbac-security-architecture.md +41 -4
  246. package/docs/architecture/services.md +127 -42
  247. package/docs/best-practices/README.md +51 -5
  248. package/docs/best-practices/accessibility.md +32 -3
  249. package/docs/best-practices/common-patterns.md +50 -3
  250. package/docs/best-practices/deployment.md +50 -4
  251. package/docs/best-practices/performance.md +50 -3
  252. package/docs/best-practices/security.md +94 -41
  253. package/docs/best-practices/testing.md +33 -4
  254. package/docs/core-concepts/authentication.md +5 -5
  255. package/docs/core-concepts/events.md +3 -3
  256. package/docs/core-concepts/organisations.md +3 -3
  257. package/docs/core-concepts/permissions.md +3 -3
  258. package/docs/core-concepts/rbac-system.md +5 -5
  259. package/docs/documentation-index.md +30 -8
  260. package/docs/getting-started/documentation-index.md +1 -1
  261. package/docs/getting-started/examples/README.md +7 -5
  262. package/docs/getting-started/examples/basic-auth-app.md +3 -0
  263. package/docs/getting-started/examples/full-featured-app.md +5 -3
  264. package/docs/getting-started/faq.md +6 -6
  265. package/docs/getting-started/installation-guide.md +192 -13
  266. package/docs/getting-started/local-development.md +303 -0
  267. package/docs/getting-started/quick-reference.md +3 -3
  268. package/docs/getting-started/quick-start.md +517 -0
  269. package/docs/implementation-guides/app-layout.md +45 -3
  270. package/docs/implementation-guides/authentication.md +66 -7
  271. package/docs/implementation-guides/component-styling.md +53 -3
  272. package/docs/implementation-guides/data-tables.md +76 -7
  273. package/docs/implementation-guides/datatable-filtering.md +1 -2
  274. package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
  275. package/docs/implementation-guides/dynamic-colors.md +155 -4
  276. package/docs/implementation-guides/file-reference-system.md +72 -3
  277. package/docs/implementation-guides/file-upload-storage.md +72 -3
  278. package/docs/implementation-guides/forms.md +53 -3
  279. package/docs/implementation-guides/inactivity-tracking.md +53 -3
  280. package/docs/implementation-guides/large-datasets.md +1 -1
  281. package/docs/implementation-guides/navigation.md +55 -5
  282. package/docs/implementation-guides/organisation-security.md +72 -3
  283. package/docs/implementation-guides/performance.md +57 -1
  284. package/docs/implementation-guides/permission-enforcement.md +81 -8
  285. package/docs/implementation-guides/public-pages.md +560 -14
  286. package/docs/migration/MIGRATION_GUIDE.md +409 -50
  287. package/docs/migration/README.md +37 -3
  288. package/docs/migration/organisation-context-timing-fix.md +39 -4
  289. package/docs/migration/quick-migration-guide.md +41 -5
  290. package/docs/migration/rbac-migration.md +59 -3
  291. package/docs/migration/service-architecture.md +77 -14
  292. package/docs/rbac/README.md +79 -3
  293. package/docs/rbac/advanced-patterns.md +47 -3
  294. package/docs/rbac/api-reference.md +77 -8
  295. package/docs/rbac/event-based-apps.md +50 -5
  296. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  297. package/docs/rbac/examples.md +39 -3
  298. package/docs/rbac/getting-started.md +63 -4
  299. package/docs/rbac/quick-start.md +57 -5
  300. package/docs/rbac/rbac-rls-integration.md +68 -6
  301. package/docs/rbac/super-admin-guide.md +47 -3
  302. package/docs/rbac/troubleshooting.md +3 -3
  303. package/docs/security/README.md +68 -3
  304. package/docs/security/checklist.md +50 -3
  305. package/docs/standards/01-architecture-standard.md +39 -0
  306. package/docs/standards/02-api-and-rpc-standard.md +39 -0
  307. package/docs/standards/03-component-standard.md +32 -0
  308. package/docs/standards/04-code-style-standard.md +32 -0
  309. package/docs/standards/05-security-standard.md +30 -0
  310. package/docs/standards/06-testing-and-docs-standard.md +29 -0
  311. package/docs/standards/README.md +35 -0
  312. package/docs/styles/README.md +89 -8
  313. package/docs/testing/README.md +175 -24
  314. package/docs/troubleshooting/README.md +50 -3
  315. package/docs/troubleshooting/common-issues.md +271 -5
  316. package/docs/troubleshooting/debugging.md +54 -1
  317. package/docs/troubleshooting/migration.md +54 -1
  318. package/docs/troubleshooting/organisation-context-setup.md +29 -3
  319. package/docs/troubleshooting/styling-issues.md +246 -4
  320. package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
  321. package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
  322. package/{src/components/DataTable/examples → examples/DataTable}/HierarchicalExample.tsx +8 -6
  323. package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
  324. package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
  325. package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
  326. package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
  327. package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
  328. package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
  329. package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
  330. package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
  331. package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
  332. package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
  333. package/examples/README.md +81 -33
  334. package/examples/index.ts +14 -12
  335. package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
  336. package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
  337. package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
  338. package/package.json +21 -27
  339. package/src/__tests__/helpers/test-utils.tsx +29 -3
  340. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
  341. package/src/components/Alert/Alert.test.tsx +2 -2
  342. package/src/components/Alert/Alert.tsx +4 -4
  343. package/src/components/Avatar/Avatar.test.tsx +17 -6
  344. package/src/components/Badge/Badge.test.tsx +1 -1
  345. package/src/components/Badge/Badge.tsx +2 -2
  346. package/src/components/Button/Button.test.tsx +2 -2
  347. package/src/components/Button/Button.tsx +11 -7
  348. package/src/components/Calendar/Calendar.test.tsx +41 -8
  349. package/src/components/Calendar/Calendar.tsx +39 -36
  350. package/src/components/Card/Card.tsx +51 -13
  351. package/src/components/Checkbox/Checkbox.test.tsx +36 -12
  352. package/src/components/DataTable/DataTable.test.tsx +1 -1
  353. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
  354. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
  355. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
  356. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
  357. package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
  358. package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
  359. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
  360. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
  361. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
  362. package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
  363. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
  364. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
  365. package/src/components/DataTable/components/DataTableBody.tsx +10 -25
  366. package/src/components/DataTable/components/DataTableCore.tsx +1 -1
  367. package/src/components/DataTable/components/FilterRow.tsx +3 -1
  368. package/src/components/DataTable/components/ImportModal.tsx +1 -1
  369. package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
  370. package/src/components/DataTable/core/ColumnFactory.ts +6 -6
  371. package/src/components/DataTable/core/DataTableContext.tsx +14 -10
  372. package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
  373. package/src/components/DataTable/core/PluginRegistry.ts +3 -3
  374. package/src/components/DataTable/core/StateManager.ts +12 -11
  375. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
  376. package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
  377. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
  378. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
  379. package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
  380. package/src/components/DataTable/core/interfaces.ts +17 -17
  381. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
  382. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
  383. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
  384. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
  385. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
  386. package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
  387. package/src/components/DataTable/types.ts +5 -5
  388. package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
  389. package/src/components/DataTable/utils/columnUtils.ts +3 -2
  390. package/src/components/DataTable/utils/debugTools.ts +1 -1
  391. package/src/components/DataTable/utils/exportUtils.ts +6 -6
  392. package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
  393. package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
  394. package/src/components/DataTable/utils/index.ts +0 -1
  395. package/src/components/DataTable/utils/performanceUtils.ts +9 -4
  396. package/src/components/Dialog/Dialog.test.tsx +49 -27
  397. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
  398. package/src/components/EventSelector/EventSelector.test.tsx +60 -12
  399. package/src/components/EventSelector/EventSelector.tsx +38 -15
  400. package/src/components/EventSelector/index.ts +2 -2
  401. package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
  402. package/src/components/FileDisplay/FileDisplay.tsx +1 -0
  403. package/src/components/FileUpload/FileUpload.test.tsx +532 -152
  404. package/src/components/FileUpload/FileUpload.tsx +43 -8
  405. package/src/components/Footer/Footer.test.tsx +19 -14
  406. package/src/components/Form/Form.test.tsx +96 -14
  407. package/src/components/Form/Form.tsx +210 -1
  408. package/src/components/Form/index.ts +3 -7
  409. package/src/components/Header/Header.test.tsx +24 -17
  410. package/src/components/Header/Header.tsx +3 -1
  411. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
  412. package/src/components/Input/Input.test.tsx +61 -36
  413. package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
  414. package/src/components/Label/Label.tsx +2 -3
  415. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
  416. package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
  417. package/src/components/LoginForm/LoginForm.test.tsx +14 -13
  418. package/src/components/LoginForm/LoginForm.tsx +1 -1
  419. package/src/components/LoginForm/index.ts +7 -0
  420. package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
  421. package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
  422. package/src/components/NavigationMenu/index.ts +1 -1
  423. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
  424. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  425. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
  426. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
  427. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
  428. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
  429. package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
  430. package/src/components/PaceAppLayout/test-setup.tsx +192 -0
  431. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
  432. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
  433. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
  434. package/src/components/PasswordChange/index.ts +2 -0
  435. package/src/components/Progress/Progress.test.tsx +11 -0
  436. package/src/components/Progress/Progress.tsx +1 -1
  437. package/src/components/Progress/index.ts +10 -0
  438. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
  439. package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
  440. package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
  441. package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
  442. package/src/components/PublicLayout/index.ts +10 -28
  443. package/src/components/Select/Select.test.tsx +7 -7
  444. package/src/components/Select/Select.tsx +277 -11
  445. package/src/components/Select/index.ts +1 -2
  446. package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
  447. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
  448. package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
  449. package/src/components/Tabs/Tabs.test.tsx +10 -9
  450. package/src/components/Tabs/Tabs.tsx +61 -33
  451. package/src/components/Textarea/Textarea.test.tsx +31 -18
  452. package/src/components/Toast/Toast.tsx +2 -2
  453. package/src/components/Tooltip/Tooltip.test.tsx +1 -1
  454. package/src/components/UserMenu/UserMenu.test.tsx +7 -6
  455. package/src/components/UserMenu/UserMenu.tsx +2 -2
  456. package/src/components/index.ts +5 -4
  457. package/src/constants/performance.ts +19 -8
  458. package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
  459. package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
  460. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  461. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
  462. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
  463. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
  464. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
  465. package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
  466. package/src/hooks/index.ts +4 -0
  467. package/src/hooks/public/index.ts +2 -0
  468. package/src/hooks/public/usePublicEvent.ts +4 -6
  469. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  470. package/src/hooks/services/useAuth.ts +2 -4
  471. package/src/hooks/services/useCurrentEvent.ts +1 -1
  472. package/src/hooks/useAppConfig.ts +1 -1
  473. package/src/hooks/useDataTablePerformance.ts +2 -2
  474. package/src/hooks/useEventTheme.ts +1 -1
  475. package/src/hooks/useEvents.ts +51 -10
  476. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  477. package/src/hooks/useOrganisationPermissions.ts +1 -1
  478. package/src/hooks/useOrganisationSecurity.ts +2 -2
  479. package/src/hooks/usePermissionCache.test.ts +9 -9
  480. package/src/hooks/usePermissionCache.ts +2 -2
  481. package/src/index.ts +19 -12
  482. package/src/providers/OrganisationProvider.tsx +73 -9
  483. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  484. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  485. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  486. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  487. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  488. package/src/providers/index.ts +0 -3
  489. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  490. package/src/providers/services/EventServiceProvider.tsx +11 -16
  491. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  492. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  493. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  494. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  495. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  496. package/src/rbac/adapters.tsx +1 -1
  497. package/src/rbac/api.ts +20 -4
  498. package/src/rbac/audit-enhanced.ts +47 -2
  499. package/src/rbac/audit.ts +47 -2
  500. package/src/rbac/components/NavigationGuard.tsx +1 -1
  501. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  502. package/src/rbac/components/NavigationProvider.tsx +1 -1
  503. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  504. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  505. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  506. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  507. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  508. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  509. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  510. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  511. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  512. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  513. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  514. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  515. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  516. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  517. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  518. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  519. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  520. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  521. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  522. package/src/rbac/hooks/index.ts +3 -0
  523. package/src/rbac/hooks/usePermissions.ts +31 -85
  524. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  525. package/src/rbac/hooks/useRBAC.ts +13 -67
  526. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  527. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  528. package/src/rbac/index.ts +3 -0
  529. package/src/rbac/secureClient.ts +53 -6
  530. package/src/rbac/security.ts +37 -1
  531. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  532. package/src/rbac/types.ts +3 -2
  533. package/src/services/AuthService.ts +33 -25
  534. package/src/services/EventService.ts +56 -44
  535. package/src/services/InactivityService.ts +33 -53
  536. package/src/services/OrganisationService.ts +36 -40
  537. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  538. package/src/services/__tests__/EventService.test.ts +67 -33
  539. package/src/services/interfaces/IEventService.ts +1 -1
  540. package/src/styles/core.css +2 -2
  541. package/src/styles/index.ts +1 -5
  542. package/src/types/__tests__/guards.test.ts +1 -1
  543. package/src/types/__tests__/type-validation.test.ts +0 -1
  544. package/src/types/auth.ts +42 -2
  545. package/src/types/core.ts +251 -0
  546. package/src/types/database.ts +11 -496
  547. package/src/types/event.ts +102 -0
  548. package/src/types/file-reference.ts +6 -4
  549. package/src/types/guards.ts +2 -1
  550. package/src/types/index.ts +48 -14
  551. package/src/types/lodash.debounce.d.ts +15 -0
  552. package/src/types/organisation.ts +14 -10
  553. package/src/types/supabase.ts +15 -17
  554. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  555. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  556. package/src/utils/app/appNameResolver.ts +1 -1
  557. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  558. package/src/utils/file-reference/index.ts +25 -6
  559. package/src/utils/security/secureErrors.ts +1 -1
  560. package/src/utils/validation/index.ts +6 -12
  561. package/src/utils/validation/validationUtils.ts +0 -13
  562. package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
  563. package/dist/auth-DReDSLq9.d.ts +0 -16
  564. package/dist/chunk-3JI76CYK.js +0 -2444
  565. package/dist/chunk-3JI76CYK.js.map +0 -1
  566. package/dist/chunk-56XJ3TU6.js +0 -11
  567. package/dist/chunk-56XJ3TU6.js.map +0 -1
  568. package/dist/chunk-5MT24GKJ.js.map +0 -1
  569. package/dist/chunk-7QCC6MCP.js +0 -288
  570. package/dist/chunk-BESYRHQM.js.map +0 -1
  571. package/dist/chunk-BJPBT3CU.js +0 -21
  572. package/dist/chunk-BJPBT3CU.js.map +0 -1
  573. package/dist/chunk-BVYWGZVV.js.map +0 -1
  574. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  575. package/dist/chunk-D7LCGMVS.js.map +0 -1
  576. package/dist/chunk-EGI6MUL6.js +0 -27
  577. package/dist/chunk-EGI6MUL6.js.map +0 -1
  578. package/dist/chunk-ERISIBYU.js.map +0 -1
  579. package/dist/chunk-HRO5HWN2.js.map +0 -1
  580. package/dist/chunk-HZLDFOE4.js.map +0 -1
  581. package/dist/chunk-JISYG63F.js +0 -70
  582. package/dist/chunk-JISYG63F.js.map +0 -1
  583. package/dist/chunk-LIMSTKYD.js +0 -61
  584. package/dist/chunk-LIMSTKYD.js.map +0 -1
  585. package/dist/chunk-OWAG3GSU.js.map +0 -1
  586. package/dist/chunk-PPMP5J6T.js.map +0 -1
  587. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  588. package/dist/chunk-S5OFRT4M.js.map +0 -1
  589. package/dist/chunk-SBVILCCA.js.map +0 -1
  590. package/dist/chunk-TUMEWN34.js +0 -15
  591. package/dist/chunk-TUMEWN34.js.map +0 -1
  592. package/dist/chunk-XDNLUEXI.js +0 -138
  593. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  594. package/dist/chunk-ZYTYSTO5.js.map +0 -1
  595. package/dist/chunk-ZZ2SS7NI.js +0 -237
  596. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  597. package/dist/database-C6jy7EOu.d.ts +0 -500
  598. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  599. package/dist/schema-DTDZQe2u.d.ts +0 -28
  600. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  601. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  602. package/dist/validation.d.ts +0 -47
  603. package/dist/validation.js +0 -24
  604. package/dist/validation.js.map +0 -1
  605. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  606. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  607. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  608. package/docs/api/interfaces/EventLogoProps.md +0 -152
  609. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  610. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  611. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  612. package/docs/architecture/rpc-function-standards.md +0 -1106
  613. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  614. package/docs/implementation-guides/event-theming-summary.md +0 -226
  615. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  616. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  617. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  618. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  619. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  620. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  621. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  622. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  623. package/docs/styles/usage.md +0 -227
  624. package/docs/testing/visual-testing.md +0 -120
  625. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  626. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  627. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  628. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  629. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  630. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  631. package/examples/RBAC/EventBasedApp.tsx +0 -239
  632. package/examples/RBAC/PermissionExample.tsx +0 -151
  633. package/examples/STRUCTURE.md +0 -125
  634. package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
  635. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  636. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  637. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  638. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  639. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  640. package/examples/components 2/index.ts +0 -11
  641. package/examples/features/index.ts +0 -12
  642. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  643. package/examples/features/rbac/index.ts +0 -13
  644. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  645. package/examples/public-pages/PublicEventPage.tsx +0 -274
  646. package/examples/public-pages/PublicPageApp.tsx +0 -308
  647. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  648. package/examples/public-pages/index.ts +0 -14
  649. package/src/__tests__/TEST_STANDARD.md +0 -1008
  650. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  651. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  652. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  653. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  654. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  655. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  656. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  657. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  658. package/src/components/Dialog/README.md +0 -804
  659. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  660. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  661. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  662. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  663. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  664. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  665. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  666. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  667. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  668. package/src/components/EventSelector/types.ts +0 -79
  669. package/src/components/Form/FormErrorSummary.tsx +0 -113
  670. package/src/components/Form/FormField.tsx +0 -249
  671. package/src/components/Form/FormFieldset.tsx +0 -127
  672. package/src/components/Form/FormLiveRegion.tsx +0 -198
  673. package/src/components/Input/__mocks__/Input.tsx +0 -2
  674. package/src/components/NavigationMenu/types.ts +0 -85
  675. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  676. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  677. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  678. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  679. package/src/components/PasswordReset/index.ts +0 -2
  680. package/src/components/ProtectedRoute/README.md +0 -164
  681. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  682. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  683. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  684. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  685. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  686. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  687. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  688. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  689. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  690. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  691. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  692. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  693. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  694. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  695. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  696. package/src/components/Select/hooks.ts +0 -289
  697. package/src/hooks/useCounter.test.ts +0 -131
  698. package/src/hooks/useDebounce.test.ts +0 -375
  699. package/src/providers/AuthProvider.tsx +0 -15
  700. package/src/providers/EventProvider.tsx +0 -16
  701. package/src/providers/InactivityProvider.tsx +0 -15
  702. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  703. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  704. package/src/types/theme.ts +0 -6
  705. package/src/types/unified.ts +0 -265
  706. package/src/utils/appConfig.ts +0 -47
  707. package/src/utils/appIdResolver.test.ts +0 -499
  708. package/src/utils/appIdResolver.ts +0 -130
  709. package/src/utils/appNameResolver.simple.test.ts +0 -212
  710. package/src/utils/appNameResolver.test.ts +0 -121
  711. package/src/utils/appNameResolver.ts +0 -191
  712. package/src/utils/audit.ts +0 -127
  713. package/src/utils/auth-utils.ts +0 -96
  714. package/src/utils/bundleAnalysis.ts +0 -129
  715. package/src/utils/debugLogger.ts +0 -67
  716. package/src/utils/deviceFingerprint.ts +0 -215
  717. package/src/utils/dynamicUtils.ts +0 -105
  718. package/src/utils/file-reference.test.ts +0 -788
  719. package/src/utils/file-reference.ts +0 -519
  720. package/src/utils/formatDate.test.ts +0 -237
  721. package/src/utils/formatting.ts +0 -170
  722. package/src/utils/lazyLoad.tsx +0 -44
  723. package/src/utils/logger.ts +0 -179
  724. package/src/utils/organisationContext.test.ts +0 -322
  725. package/src/utils/organisationContext.ts +0 -153
  726. package/src/utils/performanceBenchmark.ts +0 -64
  727. package/src/utils/performanceBudgets.ts +0 -110
  728. package/src/utils/permissionTypes.ts +0 -37
  729. package/src/utils/permissionUtils.test.ts +0 -393
  730. package/src/utils/permissionUtils.ts +0 -34
  731. package/src/utils/sanitization.ts +0 -264
  732. package/src/utils/schemaUtils.ts +0 -37
  733. package/src/utils/secureDataAccess.test.ts +0 -711
  734. package/src/utils/secureDataAccess.ts +0 -377
  735. package/src/utils/secureErrors.ts +0 -79
  736. package/src/utils/security.ts +0 -156
  737. package/src/utils/securityMonitor.ts +0 -45
  738. package/src/utils/sessionTracking.ts +0 -126
  739. package/src/utils/validation.ts +0 -111
  740. package/src/utils/validationUtils.ts +0 -120
  741. package/src/validation/index.ts +0 -12
  742. /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
  743. /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  744. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  745. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  746. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  747. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  748. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  749. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  750. /package/examples/{RBAC → rbac}/index.ts +0 -0
@@ -1,711 +0,0 @@
1
- /**
2
- * @file Secure Data Access Utility Tests
3
- * @package @jmruthers/pace-core
4
- * @module Utils/SecureDataAccess
5
- * @since 0.4.0
6
- *
7
- * Comprehensive tests for secure data access utilities that enforce organisation context.
8
- */
9
-
10
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
11
- import type { SupabaseClient } from '@supabase/supabase-js';
12
- import { createSecureDataAccess, useSecureDataAccess } from './secureDataAccess';
13
- import type { DatabaseRecord, DatabaseData, DatabaseFilters, SecureQueryOptions } from './secureDataAccess';
14
-
15
- // Mock Supabase client
16
- const mockSupabaseClient = {
17
- from: vi.fn(),
18
- } as unknown as SupabaseClient;
19
-
20
- // Mock query builder with proper Promise-like behavior
21
- let mockQueryBuilder: any;
22
-
23
- const createMockQueryBuilder = (customData?: any, customError?: any) => {
24
- const builder: any = {
25
- select: vi.fn(function(this: any) { return this; }),
26
- eq: vi.fn(function(this: any) { return this; }),
27
- order: vi.fn(function(this: any) { return this; }),
28
- limit: vi.fn(function(this: any) { return this; }),
29
- range: vi.fn(function(this: any) { return this; }),
30
- insert: vi.fn(function(this: any) { return this; }),
31
- update: vi.fn(function(this: any) { return this; }),
32
- delete: vi.fn(function(this: any) { return this; }),
33
- single: vi.fn().mockImplementation(() => {
34
- const data = customData !== undefined ? customData : { id: 'test-123' };
35
- const error = customError !== undefined ? customError : null;
36
-
37
- // For single queries, return { data, error } structure, don't reject
38
- return Promise.resolve({ data, error });
39
- }),
40
- };
41
-
42
- // Make it thenable (awaitable) with custom data/error support
43
- builder.then = function(resolve: any, reject: any) {
44
- const data = customData !== undefined ? customData : [{ id: 'test-123' }];
45
- const error = customError !== undefined ? customError : null;
46
-
47
- if (error) {
48
- return Promise.reject(error).then(resolve, reject);
49
- }
50
- return Promise.resolve({ data, error }).then(resolve, reject);
51
- };
52
-
53
- return builder;
54
- };
55
-
56
- describe('secureDataAccess', () => {
57
- let secureDataAccess: ReturnType<typeof createSecureDataAccess>;
58
- const mockOrganisationId = 'org-123';
59
- const mockTable = 'pace_person'; // Use a table that has organisation_id column
60
- const mockSelect = 'id, name, organisation_id';
61
-
62
- beforeEach(() => {
63
- vi.clearAllMocks();
64
- // Create a fresh mock query builder for each test
65
- mockQueryBuilder = createMockQueryBuilder();
66
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
67
- });
68
-
69
- describe('createSecureDataAccess', () => {
70
- describe('Regular User (Non-Super Admin)', () => {
71
- beforeEach(() => {
72
- secureDataAccess = createSecureDataAccess(mockSupabaseClient, mockOrganisationId, false);
73
- });
74
-
75
- describe('validateOrganisationContext', () => {
76
- it('should throw error when organisation ID is empty', () => {
77
- expect(() => {
78
- secureDataAccess.validateOrganisationContext('');
79
- }).toThrow('Organisation context is required for secure data access');
80
- });
81
-
82
- it('should throw error when organisation ID is null', () => {
83
- expect(() => {
84
- secureDataAccess.validateOrganisationContext(null as any);
85
- }).toThrow('Organisation context is required for secure data access');
86
- });
87
-
88
- it('should throw error when organisation ID is undefined', () => {
89
- expect(() => {
90
- secureDataAccess.validateOrganisationContext(undefined as any);
91
- }).toThrow('Organisation context is required for secure data access');
92
- });
93
-
94
- it('should not throw error when organisation ID is valid', () => {
95
- expect(() => {
96
- secureDataAccess.validateOrganisationContext(mockOrganisationId);
97
- }).not.toThrow();
98
- });
99
- });
100
-
101
- describe('ensureOrganisationColumn', () => {
102
- it('should return true for tables with organisation_id column', () => {
103
- expect(secureDataAccess.ensureOrganisationColumn('event')).toBe(true);
104
- expect(secureDataAccess.ensureOrganisationColumn('organisation_settings')).toBe(true);
105
- expect(secureDataAccess.ensureOrganisationColumn('rbac_event_app_roles')).toBe(true);
106
- });
107
-
108
- it('should return false for tables without organisation_id column', () => {
109
- expect(secureDataAccess.ensureOrganisationColumn('unknown_table')).toBe(false);
110
- expect(secureDataAccess.ensureOrganisationColumn('system_table')).toBe(false);
111
- });
112
- });
113
-
114
- describe('secureQuery', () => {
115
- it('should execute query with organisation filter', async () => {
116
- const mockData = [
117
- { id: '1', name: 'Test 1', organisation_id: mockOrganisationId },
118
- { id: '2', name: 'Test 2', organisation_id: mockOrganisationId }
119
- ];
120
-
121
- // Create a new mock with the expected data
122
- mockQueryBuilder = createMockQueryBuilder(mockData);
123
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
124
-
125
- const options: SecureQueryOptions = {
126
- table: mockTable,
127
- select: mockSelect,
128
- organisationId: mockOrganisationId
129
- };
130
-
131
- const result = await secureDataAccess.secureQuery(options);
132
-
133
- expect(mockSupabaseClient.from).toHaveBeenCalledWith(mockTable);
134
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('organisation_id', mockOrganisationId);
135
- expect(result).toEqual(mockData);
136
- });
137
-
138
- it('should handle query errors', async () => {
139
- const mockError = new Error('Database error');
140
- // Create a new mock with the error
141
- mockQueryBuilder = createMockQueryBuilder(null, mockError);
142
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
143
-
144
- const options: SecureQueryOptions = {
145
- table: mockTable,
146
- select: mockSelect,
147
- organisationId: mockOrganisationId
148
- };
149
-
150
- await expect(secureDataAccess.secureQuery(options)).rejects.toThrow('Database error');
151
- });
152
-
153
- it('should return empty array when data is not an array', async () => {
154
- // Create a new mock with null data (not an array)
155
- mockQueryBuilder = createMockQueryBuilder(null);
156
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
157
-
158
- const options: SecureQueryOptions = {
159
- table: mockTable,
160
- select: mockSelect,
161
- organisationId: mockOrganisationId
162
- };
163
-
164
- const result = await secureDataAccess.secureQuery(options);
165
- expect(result).toEqual([]);
166
- });
167
-
168
- it('should apply additional filters', async () => {
169
- const mockData = [{ id: '1', name: 'Test', organisation_id: mockOrganisationId }];
170
- // Create a new mock with the expected data
171
- mockQueryBuilder = createMockQueryBuilder(mockData);
172
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
173
-
174
- const options: SecureQueryOptions = {
175
- table: mockTable,
176
- select: mockSelect,
177
- organisationId: mockOrganisationId,
178
- filters: { name: 'Test', status: 'active' }
179
- };
180
-
181
- await secureDataAccess.secureQuery(options);
182
-
183
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('organisation_id', mockOrganisationId);
184
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('name', 'Test');
185
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('status', 'active');
186
- });
187
-
188
- it('should handle qualified column names in filters', async () => {
189
- const mockData = [{ id: '1', name: 'Test', organisation_id: mockOrganisationId }];
190
- // Create a new mock with the expected data
191
- mockQueryBuilder = createMockQueryBuilder(mockData);
192
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
193
-
194
- const options: SecureQueryOptions = {
195
- table: mockTable,
196
- select: mockSelect,
197
- organisationId: mockOrganisationId,
198
- filters: { 'users.role': 'admin' }
199
- };
200
-
201
- await secureDataAccess.secureQuery(options);
202
-
203
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('role', 'admin');
204
- });
205
-
206
- it('should skip undefined and null filter values', async () => {
207
- const mockData = [{ id: '1', name: 'Test', organisation_id: mockOrganisationId }];
208
- // Create a new mock with the expected data
209
- mockQueryBuilder = createMockQueryBuilder(mockData);
210
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
211
-
212
- const options: SecureQueryOptions = {
213
- table: mockTable,
214
- select: mockSelect,
215
- organisationId: mockOrganisationId,
216
- filters: { name: 'Test', status: undefined, active: null }
217
- };
218
-
219
- await secureDataAccess.secureQuery(options);
220
-
221
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('organisation_id', mockOrganisationId);
222
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('name', 'Test');
223
- expect(mockQueryBuilder.eq).not.toHaveBeenCalledWith('status', undefined);
224
- expect(mockQueryBuilder.eq).not.toHaveBeenCalledWith('active', null);
225
- });
226
- });
227
-
228
- describe('secureSingleQuery', () => {
229
- it('should execute single query with organisation filter', async () => {
230
- const mockData = { id: '1', name: 'Test', organisation_id: mockOrganisationId };
231
- // Create a new mock with the expected data
232
- mockQueryBuilder = createMockQueryBuilder(mockData);
233
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
234
-
235
- const options: SecureQueryOptions = {
236
- table: mockTable,
237
- select: mockSelect,
238
- organisationId: mockOrganisationId
239
- };
240
-
241
- const result = await secureDataAccess.secureSingleQuery(options);
242
-
243
- expect(mockSupabaseClient.from).toHaveBeenCalledWith(mockTable);
244
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('organisation_id', mockOrganisationId);
245
- expect(result).toEqual(mockData);
246
- });
247
-
248
- it('should return null when no rows found', async () => {
249
- const mockError = { code: 'PGRST116', message: 'No rows returned' };
250
- // Create a new mock with the error
251
- mockQueryBuilder = createMockQueryBuilder(null, mockError);
252
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
253
-
254
- const options: SecureQueryOptions = {
255
- table: mockTable,
256
- select: mockSelect,
257
- organisationId: mockOrganisationId
258
- };
259
-
260
- const result = await secureDataAccess.secureSingleQuery(options);
261
- expect(result).toBeNull();
262
- });
263
-
264
- it('should handle query errors', async () => {
265
- const mockError = new Error('Database error');
266
- // Create a new mock with the error
267
- mockQueryBuilder = createMockQueryBuilder(null, mockError);
268
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
269
-
270
- const options: SecureQueryOptions = {
271
- table: mockTable,
272
- select: mockSelect,
273
- organisationId: mockOrganisationId
274
- };
275
-
276
- await expect(secureDataAccess.secureSingleQuery(options)).rejects.toThrow('Database error');
277
- });
278
-
279
- it('should return null when data is error type', async () => {
280
- const mockData = { code: 'ERROR', message: 'Invalid data' };
281
- // Create a new mock with the expected data
282
- mockQueryBuilder = createMockQueryBuilder(mockData);
283
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
284
-
285
- const options: SecureQueryOptions = {
286
- table: mockTable,
287
- select: mockSelect,
288
- organisationId: mockOrganisationId
289
- };
290
-
291
- const result = await secureDataAccess.secureSingleQuery(options);
292
- expect(result).toBeNull();
293
- });
294
- });
295
-
296
- describe('secureInsert', () => {
297
- it('should insert data with organisation context', async () => {
298
- const mockData = { name: 'Test Item' };
299
- const mockResult = { id: '1', name: 'Test Item', organisation_id: mockOrganisationId };
300
-
301
- mockQueryBuilder.insert = vi.fn().mockReturnThis();
302
- mockQueryBuilder.select = vi.fn().mockReturnThis();
303
- mockQueryBuilder.single = vi.fn().mockResolvedValue({ data: mockResult, error: null });
304
-
305
- const result = await secureDataAccess.secureInsert(mockTable, mockData, mockOrganisationId);
306
-
307
- expect(mockQueryBuilder.insert).toHaveBeenCalledWith({
308
- ...mockData,
309
- organisation_id: mockOrganisationId
310
- });
311
- expect(result).toEqual(mockResult);
312
- });
313
-
314
- it('should handle insert errors', async () => {
315
- const mockData = { name: 'Test Item' };
316
- const mockError = new Error('Insert failed');
317
-
318
- mockQueryBuilder.insert = vi.fn().mockReturnThis();
319
- mockQueryBuilder.select = vi.fn().mockReturnThis();
320
- // Create a new mock with the error
321
- mockQueryBuilder = createMockQueryBuilder(null, mockError);
322
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
323
-
324
- await expect(secureDataAccess.secureInsert(mockTable, mockData, mockOrganisationId))
325
- .rejects.toThrow('Insert failed');
326
- });
327
- });
328
-
329
- describe('secureUpdate', () => {
330
- it('should update data with organisation filter', async () => {
331
- const mockData = { name: 'Updated Item' };
332
- const mockFilters = { id: '1' };
333
- const mockResult = { id: '1', name: 'Updated Item', organisation_id: mockOrganisationId };
334
-
335
- mockQueryBuilder.update = vi.fn().mockReturnThis();
336
- mockQueryBuilder.eq = vi.fn().mockReturnThis();
337
- mockQueryBuilder.select = vi.fn().mockReturnThis();
338
- mockQueryBuilder.single = vi.fn().mockResolvedValue({ data: mockResult, error: null });
339
-
340
- const result = await secureDataAccess.secureUpdate(mockTable, mockData, mockFilters, mockOrganisationId);
341
-
342
- expect(mockQueryBuilder.update).toHaveBeenCalledWith(mockData);
343
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('organisation_id', mockOrganisationId);
344
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('id', '1');
345
- expect(result).toEqual(mockResult);
346
- });
347
-
348
- it('should handle update errors', async () => {
349
- const mockData = { name: 'Updated Item' };
350
- const mockFilters = { id: '1' };
351
- const mockError = new Error('Update failed');
352
-
353
- mockQueryBuilder.update = vi.fn().mockReturnThis();
354
- mockQueryBuilder.eq = vi.fn().mockReturnThis();
355
- mockQueryBuilder.select = vi.fn().mockReturnThis();
356
- // Create a new mock with the error
357
- mockQueryBuilder = createMockQueryBuilder(null, mockError);
358
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
359
-
360
- await expect(secureDataAccess.secureUpdate(mockTable, mockData, mockFilters, mockOrganisationId))
361
- .rejects.toThrow('Update failed');
362
- });
363
- });
364
-
365
- describe('secureDelete', () => {
366
- it('should delete data with organisation filter', async () => {
367
- const mockFilters = { id: '1' };
368
-
369
- mockQueryBuilder.delete = vi.fn().mockReturnThis();
370
- mockQueryBuilder.eq = vi.fn().mockReturnThis();
371
- mockQueryBuilder.single = vi.fn().mockResolvedValue({ data: null, error: null });
372
-
373
- const result = await secureDataAccess.secureDelete(mockTable, mockFilters, mockOrganisationId);
374
-
375
- expect(mockQueryBuilder.delete).toHaveBeenCalled();
376
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('organisation_id', mockOrganisationId);
377
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('id', '1');
378
- expect(result).toBe(true);
379
- });
380
-
381
- it('should handle delete errors', async () => {
382
- const mockFilters = { id: '1' };
383
- const mockError = new Error('Delete failed');
384
-
385
- mockQueryBuilder.delete = vi.fn().mockReturnThis();
386
- mockQueryBuilder.eq = vi.fn().mockReturnThis();
387
- // Create a new mock with the error
388
- mockQueryBuilder = createMockQueryBuilder(null, mockError);
389
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
390
-
391
- await expect(secureDataAccess.secureDelete(mockTable, mockFilters, mockOrganisationId))
392
- .rejects.toThrow('Delete failed');
393
- });
394
- });
395
-
396
- describe('queryByOrganisation', () => {
397
- it('should query by organisation using secureQuery', async () => {
398
- const mockData = [{ id: '1', name: 'Test', organisation_id: mockOrganisationId }];
399
- // Create a new mock with the expected data
400
- mockQueryBuilder = createMockQueryBuilder(mockData);
401
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
402
-
403
- const result = await secureDataAccess.queryByOrganisation(mockTable, mockSelect, mockOrganisationId);
404
-
405
- expect(mockSupabaseClient.from).toHaveBeenCalledWith(mockTable);
406
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('organisation_id', mockOrganisationId);
407
- expect(result).toEqual(mockData);
408
- });
409
-
410
- it('should apply additional filters when provided', async () => {
411
- const mockData = [{ id: '1', name: 'Test', organisation_id: mockOrganisationId }];
412
- // Create a new mock with the expected data
413
- mockQueryBuilder = createMockQueryBuilder(mockData);
414
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
415
- const filters = { status: 'active' };
416
- // Create a new mock with the expected data
417
- mockQueryBuilder = createMockQueryBuilder(mockData);
418
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
419
-
420
- await secureDataAccess.queryByOrganisation(mockTable, mockSelect, mockOrganisationId, filters);
421
-
422
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('organisation_id', mockOrganisationId);
423
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('status', 'active');
424
- });
425
- });
426
- });
427
-
428
- describe('Super Admin User', () => {
429
- beforeEach(() => {
430
- secureDataAccess = createSecureDataAccess(mockSupabaseClient, mockOrganisationId, true);
431
- });
432
-
433
- it('should not apply organisation filter for super admin', async () => {
434
- const mockData = [{ id: '1', name: 'Test', organisation_id: 'other-org' }];
435
- // Create a new mock with the expected data
436
- mockQueryBuilder = createMockQueryBuilder(mockData);
437
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
438
-
439
- const options: SecureQueryOptions = {
440
- table: mockTable,
441
- select: mockSelect,
442
- organisationId: mockOrganisationId
443
- };
444
-
445
- await secureDataAccess.secureQuery(options);
446
-
447
- expect(mockQueryBuilder.eq).not.toHaveBeenCalledWith('organisation_id', mockOrganisationId);
448
- });
449
-
450
- it('should not apply organisation filter for super admin updates', async () => {
451
- const mockData = { name: 'Updated Item' };
452
- const mockFilters = { id: '1' };
453
- const mockResult = { id: '1', name: 'Updated Item', organisation_id: 'other-org' };
454
-
455
- mockQueryBuilder.update = vi.fn().mockReturnThis();
456
- mockQueryBuilder.eq = vi.fn().mockReturnThis();
457
- mockQueryBuilder.select = vi.fn().mockReturnThis();
458
- mockQueryBuilder.single = vi.fn().mockResolvedValue({ data: mockResult, error: null });
459
-
460
- await secureDataAccess.secureUpdate(mockTable, mockData, mockFilters, mockOrganisationId);
461
-
462
- expect(mockQueryBuilder.eq).not.toHaveBeenCalledWith('organisation_id', mockOrganisationId);
463
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('id', '1');
464
- });
465
-
466
- it('should not apply organisation filter for super admin deletes', async () => {
467
- const mockFilters = { id: '1' };
468
-
469
- mockQueryBuilder.delete = vi.fn().mockReturnThis();
470
- mockQueryBuilder.eq = vi.fn().mockReturnThis();
471
- mockQueryBuilder.single = vi.fn().mockResolvedValue({ data: null, error: null });
472
-
473
- await secureDataAccess.secureDelete(mockTable, mockFilters, mockOrganisationId);
474
-
475
- expect(mockQueryBuilder.eq).not.toHaveBeenCalledWith('organisation_id', mockOrganisationId);
476
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('id', '1');
477
- });
478
- });
479
-
480
- describe('Query Building Features', () => {
481
- beforeEach(() => {
482
- secureDataAccess = createSecureDataAccess(mockSupabaseClient, mockOrganisationId, false);
483
- });
484
-
485
- it('should handle ordering with qualified column names', async () => {
486
- const mockData = [{ id: '1', name: 'Test', organisation_id: mockOrganisationId }];
487
- // Create a new mock with the expected data
488
- mockQueryBuilder = createMockQueryBuilder(mockData);
489
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
490
- // Create a new mock with the expected data
491
- mockQueryBuilder = createMockQueryBuilder(mockData);
492
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
493
-
494
- const options: SecureQueryOptions = {
495
- table: mockTable,
496
- select: mockSelect,
497
- organisationId: mockOrganisationId,
498
- orderBy: 'users.created_at'
499
- };
500
-
501
- await secureDataAccess.secureQuery(options);
502
-
503
- expect(mockQueryBuilder.order).toHaveBeenCalledWith('created_at');
504
- });
505
-
506
- it('should handle pagination with limit and offset', async () => {
507
- const mockData = [{ id: '1', name: 'Test', organisation_id: mockOrganisationId }];
508
- // Create a new mock with the expected data
509
- mockQueryBuilder = createMockQueryBuilder(mockData);
510
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
511
- // Create a new mock with the expected data
512
- mockQueryBuilder = createMockQueryBuilder(mockData);
513
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
514
-
515
- const options: SecureQueryOptions = {
516
- table: mockTable,
517
- select: mockSelect,
518
- organisationId: mockOrganisationId,
519
- limit: 10,
520
- offset: 20
521
- };
522
-
523
- await secureDataAccess.secureQuery(options);
524
-
525
- expect(mockQueryBuilder.limit).toHaveBeenCalledWith(10);
526
- expect(mockQueryBuilder.range).toHaveBeenCalledWith(20, 29);
527
- });
528
-
529
- it('should handle pagination with limit only', async () => {
530
- const mockData = [{ id: '1', name: 'Test', organisation_id: mockOrganisationId }];
531
- // Create a new mock with the expected data
532
- mockQueryBuilder = createMockQueryBuilder(mockData);
533
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
534
- // Create a new mock with the expected data
535
- mockQueryBuilder = createMockQueryBuilder(mockData);
536
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
537
-
538
- const options: SecureQueryOptions = {
539
- table: mockTable,
540
- select: mockSelect,
541
- organisationId: mockOrganisationId,
542
- limit: 5
543
- };
544
-
545
- await secureDataAccess.secureQuery(options);
546
-
547
- expect(mockQueryBuilder.limit).toHaveBeenCalledWith(5);
548
- expect(mockQueryBuilder.range).not.toHaveBeenCalled();
549
- });
550
- });
551
- });
552
-
553
- describe('useSecureDataAccess', () => {
554
- it('should throw error when used without explicit parameters', () => {
555
- expect(() => {
556
- useSecureDataAccess();
557
- }).toThrow('useSecureDataAccess must be used with explicit parameters. Use createSecureDataAccess instead.');
558
- });
559
- });
560
-
561
- describe('Error Handling', () => {
562
- beforeEach(() => {
563
- secureDataAccess = createSecureDataAccess(mockSupabaseClient, mockOrganisationId, false);
564
- });
565
-
566
- it('should propagate errors from secureQuery', async () => {
567
- const mockError = new Error('Network error');
568
- // Create a new mock with the error for the main query (not single)
569
- mockQueryBuilder = createMockQueryBuilder(null, mockError);
570
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
571
-
572
- const options: SecureQueryOptions = {
573
- table: mockTable,
574
- select: mockSelect,
575
- organisationId: mockOrganisationId
576
- };
577
-
578
- await expect(secureDataAccess.secureQuery(options)).rejects.toThrow('Network error');
579
- });
580
-
581
- it('should propagate errors from secureSingleQuery', async () => {
582
- const mockError = new Error('Database connection failed');
583
- mockQueryBuilder.single = vi.fn().mockRejectedValue(mockError);
584
-
585
- const options: SecureQueryOptions = {
586
- table: mockTable,
587
- select: mockSelect,
588
- organisationId: mockOrganisationId
589
- };
590
-
591
- await expect(secureDataAccess.secureSingleQuery(options)).rejects.toThrow('Database connection failed');
592
- });
593
-
594
- it('should propagate errors from secureInsert', async () => {
595
- const mockData = { name: 'Test Item' };
596
- const mockError = new Error('Insert constraint violation');
597
- mockQueryBuilder.insert = vi.fn().mockReturnThis();
598
- mockQueryBuilder.select = vi.fn().mockReturnThis();
599
- mockQueryBuilder.single = vi.fn().mockRejectedValue(mockError);
600
-
601
- await expect(secureDataAccess.secureInsert(mockTable, mockData, mockOrganisationId))
602
- .rejects.toThrow('Insert constraint violation');
603
- });
604
-
605
- it('should propagate errors from secureUpdate', async () => {
606
- const mockData = { name: 'Updated Item' };
607
- const mockFilters = { id: '1' };
608
- const mockError = new Error('Update constraint violation');
609
- mockQueryBuilder.update = vi.fn().mockReturnThis();
610
- mockQueryBuilder.eq = vi.fn().mockReturnThis();
611
- mockQueryBuilder.select = vi.fn().mockReturnThis();
612
- mockQueryBuilder.single = vi.fn().mockRejectedValue(mockError);
613
-
614
- await expect(secureDataAccess.secureUpdate(mockTable, mockData, mockFilters, mockOrganisationId))
615
- .rejects.toThrow('Update constraint violation');
616
- });
617
-
618
- it('should propagate errors from secureDelete', async () => {
619
- const mockFilters = { id: '1' };
620
- const mockError = new Error('Delete constraint violation');
621
- // Create a new mock with the error for the single query
622
- mockQueryBuilder = createMockQueryBuilder(null, mockError);
623
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
624
-
625
- await expect(secureDataAccess.secureDelete(mockTable, mockFilters, mockOrganisationId))
626
- .rejects.toThrow('Delete constraint violation');
627
- });
628
- });
629
-
630
- describe('Type Safety', () => {
631
- beforeEach(() => {
632
- secureDataAccess = createSecureDataAccess(mockSupabaseClient, mockOrganisationId, false);
633
- });
634
-
635
- it('should maintain type safety for DatabaseRecord', async () => {
636
- interface TestRecord extends DatabaseRecord {
637
- name: string;
638
- status: string;
639
- }
640
-
641
- const mockData: TestRecord[] = [
642
- { id: '1', name: 'Test 1', status: 'active', organisation_id: mockOrganisationId },
643
- { id: '2', name: 'Test 2', status: 'inactive', organisation_id: mockOrganisationId }
644
- ];
645
-
646
- // Create a new mock with the expected data
647
- mockQueryBuilder = createMockQueryBuilder(mockData);
648
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
649
-
650
- const options: SecureQueryOptions = {
651
- table: mockTable,
652
- select: mockSelect,
653
- organisationId: mockOrganisationId
654
- };
655
-
656
- const result = await secureDataAccess.secureQuery<TestRecord>(options);
657
-
658
- expect(result).toEqual(mockData);
659
- expect(result[0]).toHaveProperty('name');
660
- expect(result[0]).toHaveProperty('status');
661
- expect(result[0]).toHaveProperty('organisation_id');
662
- });
663
-
664
- it('should maintain type safety for DatabaseData', async () => {
665
- const mockData: DatabaseData = {
666
- name: 'Test Item',
667
- status: 'active',
668
- metadata: { key: 'value' }
669
- };
670
-
671
- const mockResult = { id: '1', ...mockData, organisation_id: mockOrganisationId };
672
-
673
- mockQueryBuilder.insert = vi.fn().mockReturnThis();
674
- mockQueryBuilder.select = vi.fn().mockReturnThis();
675
- mockQueryBuilder.single = vi.fn().mockResolvedValue({ data: mockResult, error: null });
676
-
677
- const result = await secureDataAccess.secureInsert(mockTable, mockData, mockOrganisationId);
678
-
679
- expect(result).toEqual(mockResult);
680
- });
681
-
682
- it('should maintain type safety for DatabaseFilters', async () => {
683
- const mockFilters: DatabaseFilters = {
684
- status: 'active',
685
- category: 'test',
686
- metadata: { key: 'value' }
687
- };
688
-
689
- const mockData = [{ id: '1', name: 'Test', organisation_id: mockOrganisationId }];
690
- // Create a new mock with the expected data
691
- mockQueryBuilder = createMockQueryBuilder(mockData);
692
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
693
- // Create a new mock with the expected data
694
- mockQueryBuilder = createMockQueryBuilder(mockData);
695
- mockSupabaseClient.from = vi.fn().mockReturnValue(mockQueryBuilder);
696
-
697
- const options: SecureQueryOptions = {
698
- table: mockTable,
699
- select: mockSelect,
700
- organisationId: mockOrganisationId,
701
- filters: mockFilters
702
- };
703
-
704
- await secureDataAccess.secureQuery(options);
705
-
706
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('organisation_id', mockOrganisationId);
707
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('status', 'active');
708
- expect(mockQueryBuilder.eq).toHaveBeenCalledWith('category', 'test');
709
- });
710
- });
711
- });