@jmruthers/pace-core 0.5.181 → 0.5.183

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 (756) 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/usePublicEventLogo.test.ts +147 -0
  470. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  471. package/src/hooks/services/useAuth.ts +2 -4
  472. package/src/hooks/services/useCurrentEvent.ts +1 -1
  473. package/src/hooks/useAppConfig.ts +1 -1
  474. package/src/hooks/useDataTablePerformance.ts +2 -2
  475. package/src/hooks/useEventTheme.ts +1 -1
  476. package/src/hooks/useEvents.ts +51 -10
  477. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  478. package/src/hooks/useOrganisationPermissions.ts +1 -1
  479. package/src/hooks/useOrganisationSecurity.ts +2 -2
  480. package/src/hooks/usePermissionCache.test.ts +9 -9
  481. package/src/hooks/usePermissionCache.ts +2 -2
  482. package/src/index.ts +19 -12
  483. package/src/providers/OrganisationProvider.tsx +73 -9
  484. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  485. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  486. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  487. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  488. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  489. package/src/providers/index.ts +0 -3
  490. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  491. package/src/providers/services/EventServiceProvider.tsx +11 -16
  492. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  493. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  494. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  495. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  496. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  497. package/src/rbac/adapters.tsx +1 -1
  498. package/src/rbac/api.ts +20 -4
  499. package/src/rbac/audit-enhanced.ts +47 -2
  500. package/src/rbac/audit.ts +47 -2
  501. package/src/rbac/components/NavigationGuard.tsx +1 -1
  502. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  503. package/src/rbac/components/NavigationProvider.tsx +1 -1
  504. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  505. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  506. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  507. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  508. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  509. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  510. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  511. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  512. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  513. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  514. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  515. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  516. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  517. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  518. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  519. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  520. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  521. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  522. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  523. package/src/rbac/hooks/index.ts +3 -0
  524. package/src/rbac/hooks/usePermissions.ts +31 -85
  525. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  526. package/src/rbac/hooks/useRBAC.ts +13 -67
  527. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  528. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  529. package/src/rbac/index.ts +3 -0
  530. package/src/rbac/secureClient.ts +53 -6
  531. package/src/rbac/security.ts +37 -1
  532. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  533. package/src/rbac/types.ts +3 -2
  534. package/src/services/AuthService.ts +33 -25
  535. package/src/services/EventService.ts +56 -44
  536. package/src/services/InactivityService.ts +33 -53
  537. package/src/services/OrganisationService.ts +36 -40
  538. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  539. package/src/services/__tests__/EventService.test.ts +67 -33
  540. package/src/services/interfaces/IEventService.ts +1 -1
  541. package/src/styles/core.css +2 -2
  542. package/src/styles/index.test.ts +21 -0
  543. package/src/styles/index.ts +1 -5
  544. package/src/types/__tests__/guards.test.ts +1 -1
  545. package/src/types/__tests__/organisation.roles.test.ts +55 -0
  546. package/src/types/__tests__/type-validation.test.ts +0 -1
  547. package/src/types/auth.ts +42 -2
  548. package/src/types/core.ts +251 -0
  549. package/src/types/database.ts +11 -496
  550. package/src/types/event.ts +102 -0
  551. package/src/types/file-reference.ts +6 -4
  552. package/src/types/guards.ts +2 -1
  553. package/src/types/index.ts +48 -14
  554. package/src/types/lodash.debounce.d.ts +15 -0
  555. package/src/types/organisation.ts +14 -10
  556. package/src/types/supabase.ts +15 -17
  557. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  558. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  559. package/src/utils/app/appNameResolver.ts +1 -1
  560. package/src/utils/audit/audit.test.ts +65 -0
  561. package/src/utils/device/deviceFingerprint.test.ts +171 -0
  562. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  563. package/src/utils/file-reference/index.ts +25 -6
  564. package/src/utils/security/secureErrors.ts +1 -1
  565. package/src/utils/validation/__tests__/validationUtils.test.ts +72 -0
  566. package/src/utils/validation/index.ts +6 -12
  567. package/src/utils/validation/validationUtils.ts +0 -13
  568. package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
  569. package/dist/auth-DReDSLq9.d.ts +0 -16
  570. package/dist/chunk-3JI76CYK.js +0 -2444
  571. package/dist/chunk-3JI76CYK.js.map +0 -1
  572. package/dist/chunk-56XJ3TU6.js +0 -11
  573. package/dist/chunk-56XJ3TU6.js.map +0 -1
  574. package/dist/chunk-5MT24GKJ.js.map +0 -1
  575. package/dist/chunk-7QCC6MCP.js +0 -288
  576. package/dist/chunk-BESYRHQM.js.map +0 -1
  577. package/dist/chunk-BJPBT3CU.js +0 -21
  578. package/dist/chunk-BJPBT3CU.js.map +0 -1
  579. package/dist/chunk-BVYWGZVV.js.map +0 -1
  580. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  581. package/dist/chunk-D7LCGMVS.js.map +0 -1
  582. package/dist/chunk-EGI6MUL6.js +0 -27
  583. package/dist/chunk-EGI6MUL6.js.map +0 -1
  584. package/dist/chunk-ERISIBYU.js.map +0 -1
  585. package/dist/chunk-HRO5HWN2.js.map +0 -1
  586. package/dist/chunk-HZLDFOE4.js.map +0 -1
  587. package/dist/chunk-JISYG63F.js +0 -70
  588. package/dist/chunk-JISYG63F.js.map +0 -1
  589. package/dist/chunk-LIMSTKYD.js +0 -61
  590. package/dist/chunk-LIMSTKYD.js.map +0 -1
  591. package/dist/chunk-OWAG3GSU.js.map +0 -1
  592. package/dist/chunk-PPMP5J6T.js.map +0 -1
  593. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  594. package/dist/chunk-S5OFRT4M.js.map +0 -1
  595. package/dist/chunk-SBVILCCA.js.map +0 -1
  596. package/dist/chunk-TUMEWN34.js +0 -15
  597. package/dist/chunk-TUMEWN34.js.map +0 -1
  598. package/dist/chunk-XDNLUEXI.js +0 -138
  599. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  600. package/dist/chunk-ZYTYSTO5.js.map +0 -1
  601. package/dist/chunk-ZZ2SS7NI.js +0 -237
  602. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  603. package/dist/database-C6jy7EOu.d.ts +0 -500
  604. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  605. package/dist/schema-DTDZQe2u.d.ts +0 -28
  606. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  607. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  608. package/dist/validation.d.ts +0 -47
  609. package/dist/validation.js +0 -24
  610. package/dist/validation.js.map +0 -1
  611. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  612. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  613. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  614. package/docs/api/interfaces/EventLogoProps.md +0 -152
  615. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  616. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  617. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  618. package/docs/architecture/rpc-function-standards.md +0 -1106
  619. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  620. package/docs/implementation-guides/event-theming-summary.md +0 -226
  621. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  622. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  623. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  624. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  625. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  626. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  627. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  628. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  629. package/docs/styles/usage.md +0 -227
  630. package/docs/testing/visual-testing.md +0 -120
  631. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  632. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  633. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  634. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  635. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  636. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  637. package/examples/RBAC/EventBasedApp.tsx +0 -239
  638. package/examples/RBAC/PermissionExample.tsx +0 -151
  639. package/examples/STRUCTURE.md +0 -125
  640. package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
  641. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  642. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  643. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  644. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  645. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  646. package/examples/components 2/index.ts +0 -11
  647. package/examples/features/index.ts +0 -12
  648. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  649. package/examples/features/rbac/index.ts +0 -13
  650. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  651. package/examples/public-pages/PublicEventPage.tsx +0 -274
  652. package/examples/public-pages/PublicPageApp.tsx +0 -308
  653. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  654. package/examples/public-pages/index.ts +0 -14
  655. package/src/__tests__/TEST_STANDARD.md +0 -1008
  656. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  657. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  658. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  659. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  660. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  661. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  662. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  663. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  664. package/src/components/Dialog/README.md +0 -804
  665. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  666. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  667. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  668. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  669. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  670. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  671. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  672. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  673. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  674. package/src/components/EventSelector/types.ts +0 -79
  675. package/src/components/Form/FormErrorSummary.tsx +0 -113
  676. package/src/components/Form/FormField.tsx +0 -249
  677. package/src/components/Form/FormFieldset.tsx +0 -127
  678. package/src/components/Form/FormLiveRegion.tsx +0 -198
  679. package/src/components/Input/__mocks__/Input.tsx +0 -2
  680. package/src/components/NavigationMenu/types.ts +0 -85
  681. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  682. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  683. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  684. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  685. package/src/components/PasswordReset/index.ts +0 -2
  686. package/src/components/ProtectedRoute/README.md +0 -164
  687. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  688. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  689. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  690. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  691. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  692. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  693. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  694. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  695. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  696. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  697. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  698. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  699. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  700. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  701. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  702. package/src/components/Select/hooks.ts +0 -289
  703. package/src/hooks/useCounter.test.ts +0 -131
  704. package/src/hooks/useDebounce.test.ts +0 -375
  705. package/src/providers/AuthProvider.tsx +0 -15
  706. package/src/providers/EventProvider.tsx +0 -16
  707. package/src/providers/InactivityProvider.tsx +0 -15
  708. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  709. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  710. package/src/types/theme.ts +0 -6
  711. package/src/types/unified.ts +0 -265
  712. package/src/utils/appConfig.ts +0 -47
  713. package/src/utils/appIdResolver.test.ts +0 -499
  714. package/src/utils/appIdResolver.ts +0 -130
  715. package/src/utils/appNameResolver.simple.test.ts +0 -212
  716. package/src/utils/appNameResolver.test.ts +0 -121
  717. package/src/utils/appNameResolver.ts +0 -191
  718. package/src/utils/audit.ts +0 -127
  719. package/src/utils/auth-utils.ts +0 -96
  720. package/src/utils/bundleAnalysis.ts +0 -129
  721. package/src/utils/debugLogger.ts +0 -67
  722. package/src/utils/deviceFingerprint.ts +0 -215
  723. package/src/utils/dynamicUtils.ts +0 -105
  724. package/src/utils/file-reference.test.ts +0 -788
  725. package/src/utils/file-reference.ts +0 -519
  726. package/src/utils/formatDate.test.ts +0 -237
  727. package/src/utils/formatting.ts +0 -170
  728. package/src/utils/lazyLoad.tsx +0 -44
  729. package/src/utils/logger.ts +0 -179
  730. package/src/utils/organisationContext.test.ts +0 -322
  731. package/src/utils/organisationContext.ts +0 -153
  732. package/src/utils/performanceBenchmark.ts +0 -64
  733. package/src/utils/performanceBudgets.ts +0 -110
  734. package/src/utils/permissionTypes.ts +0 -37
  735. package/src/utils/permissionUtils.test.ts +0 -393
  736. package/src/utils/permissionUtils.ts +0 -34
  737. package/src/utils/sanitization.ts +0 -264
  738. package/src/utils/schemaUtils.ts +0 -37
  739. package/src/utils/secureDataAccess.test.ts +0 -711
  740. package/src/utils/secureDataAccess.ts +0 -377
  741. package/src/utils/secureErrors.ts +0 -79
  742. package/src/utils/security.ts +0 -156
  743. package/src/utils/securityMonitor.ts +0 -45
  744. package/src/utils/sessionTracking.ts +0 -126
  745. package/src/utils/validation.ts +0 -111
  746. package/src/utils/validationUtils.ts +0 -120
  747. package/src/validation/index.ts +0 -12
  748. /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
  749. /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  750. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  751. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  752. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  753. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  754. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  755. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  756. /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
- });