@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,788 +0,0 @@
1
- /**
2
- * @file File Reference Service Tests
3
- * @description Comprehensive tests for the file reference service utilities following TEST_STANDARD.md
4
- */
5
-
6
- import { vi } from 'vitest';
7
- import { FileReferenceServiceImpl, createFileReferenceService, uploadFileWithReference } from './file-reference';
8
- import { FileCategory } from '../types/file-reference';
9
- import { createMockSupabaseClient } from '../__tests__/helpers/test-utils';
10
-
11
- // Mock dependencies
12
- import * as organisationContext from './organisationContext';
13
- import * as storageHelpers from './storage/helpers';
14
-
15
- const mockSetOrganisationContext = vi.fn();
16
- const mockUploadFile = vi.fn();
17
- const mockDeleteFile = vi.fn();
18
- const mockGenerateFilePath = vi.fn();
19
-
20
- // Setup mocks
21
- beforeEach(() => {
22
- vi.clearAllMocks();
23
-
24
- // Default mock implementations
25
- mockSetOrganisationContext.mockResolvedValue(undefined);
26
- mockUploadFile.mockResolvedValue({
27
- success: true,
28
- path: 'org-123/documents/test.pdf',
29
- metadata: { size: 1024 }
30
- });
31
- mockDeleteFile.mockResolvedValue({ success: true });
32
- mockGenerateFilePath.mockReturnValue('org-123/documents/test.pdf');
33
-
34
- // Apply mocks
35
- vi.spyOn(organisationContext, 'setOrganisationContext').mockImplementation(mockSetOrganisationContext as any);
36
- vi.spyOn(storageHelpers, 'uploadFile').mockImplementation(mockUploadFile as any);
37
- vi.spyOn(storageHelpers, 'deleteFile').mockImplementation(mockDeleteFile as any);
38
- vi.spyOn(storageHelpers, 'generateFilePath').mockImplementation(mockGenerateFilePath as any);
39
- });
40
-
41
- afterEach(() => {
42
- vi.restoreAllMocks();
43
- });
44
-
45
- // Test data
46
- const mockSupabase = createMockSupabaseClient();
47
- const mockFileUploadOptions = {
48
- table_name: 'test_table',
49
- record_id: 'test-record-123',
50
- organisation_id: 'test-org-123',
51
- app_id: 'test-app-123',
52
- category: FileCategory.GENERAL_DOCUMENTS,
53
- is_public: false
54
- };
55
-
56
- const mockFileReference = {
57
- id: 'file-ref-123',
58
- table_name: 'test_table',
59
- record_id: 'test-record-123',
60
- file_path: 'org-123/documents/test.pdf',
61
- file_metadata: {
62
- fileName: 'test-document.pdf',
63
- fileType: 'application/pdf',
64
- fileSize: 1024000,
65
- category: FileCategory.GENERAL_DOCUMENTS
66
- },
67
- organisation_id: 'test-org-123',
68
- app_id: 'test-app-123',
69
- is_public: false,
70
- created_at: '2023-01-01T00:00:00Z',
71
- updated_at: '2023-01-01T00:00:00Z'
72
- };
73
-
74
- const createTestFile = (name = 'test.pdf', type = 'application/pdf', size = 1024) => {
75
- return new File(['test content'], name, { type, size });
76
- };
77
-
78
- describe('[service] FileReferenceServiceImpl', () => {
79
- let service: FileReferenceServiceImpl;
80
-
81
- beforeEach(() => {
82
- service = new FileReferenceServiceImpl(mockSupabase);
83
- });
84
-
85
- describe('File Upload', () => {
86
- it('creates file reference successfully', async () => {
87
- const testFile = createTestFile();
88
-
89
- // Mock successful RPC call
90
- mockSupabase.rpc.mockResolvedValue({
91
- data: 'file-ref-123',
92
- error: null
93
- });
94
-
95
- const result = await service.createFileReference(mockFileUploadOptions, testFile);
96
-
97
- expect(mockSetOrganisationContext).toHaveBeenCalledWith(
98
- mockSupabase,
99
- mockFileUploadOptions.organisation_id
100
- );
101
-
102
- expect(mockUploadFile).toHaveBeenCalledWith(
103
- mockSupabase,
104
- testFile,
105
- expect.objectContaining({
106
- orgId: mockFileUploadOptions.organisation_id,
107
- customPath: mockFileUploadOptions.category,
108
- isPublic: mockFileUploadOptions.is_public
109
- })
110
- );
111
-
112
- expect(mockSupabase.rpc).toHaveBeenCalledWith(
113
- 'data_file_reference_create',
114
- expect.objectContaining({
115
- p_table_name: mockFileUploadOptions.table_name,
116
- p_record_id: mockFileUploadOptions.record_id,
117
- p_organisation_id: mockFileUploadOptions.organisation_id,
118
- p_app_id: mockFileUploadOptions.app_id,
119
- p_file_metadata: expect.objectContaining({
120
- fileName: testFile.name,
121
- fileType: testFile.type,
122
- fileSize: testFile.size,
123
- category: mockFileUploadOptions.category
124
- }),
125
- p_is_public: mockFileUploadOptions.is_public
126
- })
127
- );
128
-
129
- expect(result && typeof result === 'object').toBe(true);
130
- expect((result as any).id).toBeTruthy();
131
- });
132
-
133
- it('validates required options before upload', async () => {
134
- const testFile = createTestFile();
135
- const invalidOptions = {
136
- ...mockFileUploadOptions,
137
- organisation_id: ''
138
- };
139
-
140
- await expect(service.createFileReference(invalidOptions, testFile))
141
- .rejects.toThrow();
142
- });
143
-
144
- it('validates file before upload', async () => {
145
- const invalidFile = null as any;
146
-
147
- await expect(service.createFileReference(mockFileUploadOptions, invalidFile))
148
- .rejects.toThrow();
149
- });
150
-
151
- it('handles upload errors gracefully', async () => {
152
- const testFile = createTestFile();
153
-
154
- mockUploadFile.mockResolvedValue({
155
- success: false,
156
- error: 'Upload failed'
157
- });
158
-
159
- await expect(service.createFileReference(mockFileUploadOptions, testFile))
160
- .rejects.toThrow('Upload failed');
161
- });
162
-
163
- it('handles RPC errors gracefully', async () => {
164
- const testFile = createTestFile();
165
-
166
- mockSupabase.rpc.mockResolvedValue({
167
- data: null,
168
- error: { message: 'Database error' }
169
- });
170
-
171
- await expect(service.createFileReference(mockFileUploadOptions, testFile))
172
- .rejects.toThrow('Database error');
173
- });
174
-
175
- it('includes custom metadata when provided', async () => {
176
- const testFile = createTestFile();
177
- const customMetadata = { uploadedBy: 'user-123', tags: ['important'] };
178
- const optionsWithMetadata = {
179
- ...mockFileUploadOptions,
180
- custom_metadata: customMetadata
181
- };
182
-
183
- mockSupabase.rpc.mockResolvedValue({
184
- data: 'file-ref-123',
185
- error: null
186
- });
187
-
188
- await service.createFileReference(optionsWithMetadata, testFile);
189
-
190
- expect(mockSupabase.rpc).toHaveBeenCalledWith(
191
- 'data_file_reference_create',
192
- expect.objectContaining({
193
- p_file_metadata: expect.objectContaining(customMetadata)
194
- })
195
- );
196
- });
197
- });
198
-
199
- describe('File Retrieval', () => {
200
- it('gets file reference by table and record', async () => {
201
- mockSupabase.rpc.mockResolvedValue({
202
- data: [mockFileReference],
203
- error: null
204
- });
205
-
206
- const result = await service.getFileReference(
207
- 'test_table',
208
- 'test-record-123',
209
- 'test-org-123'
210
- );
211
-
212
- expect(mockSupabase.from).toHaveBeenCalled();
213
- expect(result && typeof result === 'object').toBe(true);
214
- });
215
-
216
- it('returns null when no file reference found', async () => {
217
- mockSupabase.rpc.mockResolvedValue({
218
- data: [],
219
- error: null
220
- });
221
-
222
- const result = await service.getFileReference(
223
- 'test_table',
224
- 'test-record-123',
225
- 'test-org-123'
226
- );
227
-
228
- expect(result === null || typeof result === 'object').toBe(true);
229
- });
230
-
231
- it('gets file reference by ID', async () => {
232
- mockSupabase.rpc.mockResolvedValue({
233
- data: mockFileReference,
234
- error: null
235
- });
236
-
237
- const result = await service.getFileReferenceById('file-ref-123', 'test-org-123');
238
-
239
- expect(mockSupabase.rpc).toHaveBeenCalledWith(
240
- 'data_file_reference_get',
241
- {
242
- p_file_reference_id: 'file-ref-123',
243
- p_organisation_id: 'test-org-123'
244
- }
245
- );
246
-
247
- expect(result == null || typeof result === 'object').toBe(true);
248
- });
249
-
250
- it('gets files by category', async () => {
251
- // RPC returns partial data: id, file_path, file_metadata, is_public, created_at
252
- // The method constructs full FileReference objects from this data
253
- const rpcResponse = [{
254
- id: 'file-ref-123',
255
- file_path: 'org-123/documents/test.pdf',
256
- file_metadata: {
257
- fileName: 'test-document.pdf',
258
- fileType: 'application/pdf',
259
- fileSize: 1024000,
260
- category: FileCategory.GENERAL_DOCUMENTS
261
- },
262
- is_public: false,
263
- created_at: '2023-01-01T00:00:00Z'
264
- }];
265
-
266
- mockSupabase.rpc.mockResolvedValue({ data: rpcResponse, error: null });
267
-
268
- const result = await service.getFilesByCategory(
269
- 'test_table',
270
- 'test-record-123',
271
- FileCategory.GENERAL_DOCUMENTS,
272
- 'test-org-123'
273
- );
274
-
275
- expect(mockSupabase.rpc).toHaveBeenCalledWith(
276
- 'data_file_reference_by_category_list',
277
- expect.objectContaining({
278
- p_table_name: 'test_table',
279
- p_record_id: 'test-record-123',
280
- p_category: FileCategory.GENERAL_DOCUMENTS,
281
- p_organisation_id: 'test-org-123'
282
- })
283
- );
284
-
285
- // The method constructs FileReference from RPC response
286
- expect(result).toHaveLength(1);
287
- expect(result[0]).toEqual({
288
- id: 'file-ref-123',
289
- table_name: 'test_table',
290
- record_id: 'test-record-123',
291
- file_path: 'org-123/documents/test.pdf',
292
- file_metadata: {
293
- fileName: 'test-document.pdf',
294
- fileType: 'application/pdf',
295
- fileSize: 1024000,
296
- category: FileCategory.GENERAL_DOCUMENTS
297
- },
298
- organisation_id: 'test-org-123',
299
- app_id: '',
300
- is_public: false,
301
- created_at: '2023-01-01T00:00:00Z',
302
- updated_at: '2023-01-01T00:00:00Z'
303
- });
304
- });
305
-
306
- it('gets file count for record', async () => {
307
- mockSupabase.rpc.mockResolvedValue({
308
- data: 5,
309
- error: null
310
- });
311
-
312
- const result = await service.getFileCount(
313
- 'test_table',
314
- 'test-record-123',
315
- 'test-org-123'
316
- );
317
-
318
- expect(mockSupabase.rpc).toHaveBeenCalledWith(
319
- 'data_file_reference_count_get',
320
- {
321
- p_table_name: 'test_table',
322
- p_record_id: 'test-record-123',
323
- p_organisation_id: 'test-org-123'
324
- }
325
- );
326
-
327
- expect(result).toBe(5);
328
- });
329
- });
330
-
331
- describe('URL Generation', () => {
332
- it('gets file URL for public file', async () => {
333
- const publicFileRef = { ...mockFileReference, is_public: true };
334
-
335
- mockSupabase.rpc.mockResolvedValue({
336
- data: [publicFileRef],
337
- error: null
338
- });
339
-
340
- const result = await service.getFileUrl(
341
- 'test_table',
342
- 'test-record-123',
343
- 'test-org-123'
344
- );
345
-
346
- expect(result === null || typeof result === 'string').toBe(true);
347
- });
348
-
349
- it('returns null for private file URL (requires signed URL)', async () => {
350
- const privateFileRef = { ...mockFileReference, is_public: false };
351
-
352
- mockSupabase.rpc.mockResolvedValue({
353
- data: [privateFileRef],
354
- error: null
355
- });
356
-
357
- const result = await service.getFileUrl(
358
- 'test_table',
359
- 'test-record-123',
360
- 'test-org-123'
361
- );
362
-
363
- expect(result).toBe(null);
364
- });
365
-
366
- it('gets signed URL for private file', async () => {
367
- const privateFileRef = { ...mockFileReference, is_public: false };
368
-
369
- mockSupabase.rpc.mockResolvedValue({
370
- data: [privateFileRef],
371
- error: null
372
- });
373
-
374
- const result = await service.getSignedUrl(
375
- 'test_table',
376
- 'test-record-123',
377
- 'test-org-123',
378
- 3600
379
- );
380
-
381
- expect(result === null || typeof result === 'string').toBe(true);
382
- });
383
-
384
- it('returns null for signed URL of public file', async () => {
385
- const publicFileRef = { ...mockFileReference, is_public: true };
386
-
387
- mockSupabase.rpc.mockResolvedValue({
388
- data: [publicFileRef],
389
- error: null
390
- });
391
-
392
- const result = await service.getSignedUrl(
393
- 'test_table',
394
- 'test-record-123',
395
- 'test-org-123'
396
- );
397
-
398
- expect(result).toBe(null);
399
- });
400
- });
401
-
402
- describe('File Management', () => {
403
- it('updates file reference successfully', async () => {
404
- const updates = {
405
- file_metadata: {
406
- ...mockFileReference.file_metadata,
407
- tags: ['updated']
408
- }
409
- };
410
-
411
- // Simulate update chain resolving via shared query builder
412
- (mockSupabase.from() as any).single.mockResolvedValue({
413
- data: { ...mockFileReference, ...updates },
414
- error: null
415
- });
416
-
417
- const result = await service.updateFileReference('file-ref-123', updates);
418
-
419
- expect(result).toEqual(expect.objectContaining(updates));
420
- });
421
-
422
- it('deletes file reference successfully', async () => {
423
- mockSupabase.rpc.mockResolvedValue({
424
- data: true,
425
- error: null
426
- });
427
-
428
- const result = await service.deleteFileReference(
429
- 'test_table',
430
- 'test-record-123',
431
- 'test-org-123',
432
- true
433
- );
434
-
435
- expect(mockSupabase.rpc).toHaveBeenCalledWith(
436
- 'data_file_reference_delete',
437
- {
438
- p_table_name: 'test_table',
439
- p_record_id: 'test-record-123',
440
- p_organisation_id: 'test-org-123',
441
- p_delete_file: true
442
- }
443
- );
444
-
445
- expect(result).toBe(true);
446
- });
447
-
448
- it('lists all file references for record', async () => {
449
- const mockFiles = [mockFileReference];
450
- mockSupabase.rpc.mockResolvedValue({ data: [{ id: 'file-ref-123' }], error: null });
451
- (mockSupabase.from() as any).in.mockResolvedValue({ data: mockFiles, error: null });
452
-
453
- const result = await service.listFileReferences(
454
- 'test_table',
455
- 'test-record-123',
456
- 'test-org-123'
457
- );
458
-
459
- expect(result).toEqual(mockFiles);
460
- });
461
- });
462
-
463
- describe('Bulk Operations', () => {
464
- it('uploads multiple files successfully', async () => {
465
- const files = [
466
- createTestFile('file1.pdf'),
467
- createTestFile('file2.pdf')
468
- ];
469
-
470
- // Mock successful uploads
471
- mockSupabase.rpc
472
- .mockResolvedValueOnce({ data: 'file-ref-1', error: null })
473
- .mockResolvedValueOnce({ data: 'file-ref-2', error: null });
474
-
475
- const result = await service.uploadMultipleFiles(mockFileUploadOptions, files);
476
-
477
- expect(result.success).toHaveLength(2);
478
- expect(result.failed).toHaveLength(0);
479
- });
480
-
481
- it('handles partial failures in bulk upload', async () => {
482
- const files = [
483
- createTestFile('file1.pdf'),
484
- createTestFile('file2.pdf')
485
- ];
486
-
487
- // Mock one success, one failure
488
- mockUploadFile
489
- .mockResolvedValueOnce({ success: true, path: 'path1' })
490
- .mockResolvedValueOnce({ success: false, error: 'Upload failed' });
491
-
492
- mockSupabase.rpc
493
- .mockResolvedValueOnce({ data: 'file-ref-1', error: null })
494
- .mockResolvedValueOnce({ data: null, error: { message: 'Database error' } });
495
-
496
- const result = await service.uploadMultipleFiles(mockFileUploadOptions, files);
497
-
498
- expect(result.success).toHaveLength(1);
499
- expect(result.failed).toHaveLength(1);
500
- expect(result.failed[0]).toEqual({
501
- file: files[1],
502
- error: 'Failed to upload file: Upload failed'
503
- });
504
- });
505
- });
506
-
507
- describe('Error Handling', () => {
508
- it('handles RPC errors gracefully', async () => {
509
- (mockSupabase.from() as any).single.mockResolvedValue({ data: null, error: { message: 'Permission denied', code: 'ERR' } });
510
- await expect(service.getFileReference('test_table', 'test-record-123', 'test-org-123')).rejects.toThrow();
511
- });
512
-
513
- it('handles network errors gracefully', async () => {
514
- (mockSupabase.from() as any).single.mockRejectedValue(new Error('Network error'));
515
- await expect(service.getFileReference('test_table', 'test-record-123', 'test-org-123')).rejects.toThrow();
516
- });
517
-
518
- it('validates input parameters', async () => {
519
- const result1 = await service.getFileReference('', 'test-record-123', 'test-org-123');
520
- expect(result1 === null || typeof result1 === 'object').toBe(true);
521
- const result2 = await service.getFileReference('test_table', '', 'test-org-123');
522
- expect(result2 === null || typeof result2 === 'object').toBe(true);
523
- const result3 = await service.getFileReference('test_table', 'test-record-123', '');
524
- expect(result3 === null || typeof result3 === 'object').toBe(true);
525
- });
526
-
527
- it('handles rollback when RPC fails after upload', async () => {
528
- const testFile = createTestFile();
529
-
530
- mockUploadFile.mockResolvedValue({
531
- success: true,
532
- path: 'org-123/documents/test.pdf'
533
- });
534
-
535
- mockSupabase.rpc.mockResolvedValue({
536
- data: null,
537
- error: { message: 'Database error' }
538
- });
539
-
540
- await expect(service.createFileReference(mockFileUploadOptions, testFile))
541
- .rejects.toThrow('Database error');
542
-
543
- // Verify rollback was attempted
544
- expect(mockDeleteFile).toHaveBeenCalledWith(
545
- mockSupabase,
546
- 'org-123/documents/test.pdf',
547
- false
548
- );
549
- });
550
-
551
- it('handles rollback failure gracefully', async () => {
552
- const testFile = createTestFile();
553
-
554
- mockUploadFile.mockResolvedValue({
555
- success: true,
556
- path: 'org-123/documents/test.pdf'
557
- });
558
-
559
- mockSupabase.rpc.mockResolvedValue({
560
- data: null,
561
- error: { message: 'Database error' }
562
- });
563
-
564
- mockDeleteFile.mockRejectedValue(new Error('Delete failed'));
565
-
566
- // When rollback fails, the deleteFile error might be thrown, or the original error
567
- // The implementation throws the database error, but if deleteFile throws synchronously,
568
- // it might propagate. Let's check what actually happens.
569
- await expect(service.createFileReference(mockFileUploadOptions, testFile))
570
- .rejects.toThrow();
571
-
572
- // Verify rollback was attempted
573
- expect(mockDeleteFile).toHaveBeenCalled();
574
- });
575
-
576
- it('handles getFileUrl when RPC returns null path', async () => {
577
- const publicFileRef = { ...mockFileReference, is_public: true };
578
-
579
- mockSupabase.from().select().eq().eq().eq().single.mockResolvedValue({
580
- data: publicFileRef,
581
- error: null
582
- });
583
-
584
- mockSupabase.rpc.mockResolvedValue({
585
- data: null,
586
- error: null
587
- });
588
-
589
- const result = await service.getFileUrl(
590
- 'test_table',
591
- 'test-record-123',
592
- 'test-org-123'
593
- );
594
-
595
- expect(result).toBeNull();
596
- });
597
-
598
- it('handles getFilesByCategory with category mismatch', async () => {
599
- const rpcResponse = [{
600
- id: 'file-ref-123',
601
- file_path: 'org-123/documents/test.pdf',
602
- file_metadata: {
603
- fileName: 'test-document.pdf',
604
- fileType: 'application/pdf',
605
- fileSize: 1024000,
606
- category: FileCategory.IMAGES // Different category
607
- },
608
- is_public: false,
609
- created_at: '2023-01-01T00:00:00Z'
610
- }];
611
-
612
- mockSupabase.rpc.mockResolvedValue({ data: rpcResponse, error: null });
613
-
614
- const result = await service.getFilesByCategory(
615
- 'test_table',
616
- 'test-record-123',
617
- FileCategory.GENERAL_DOCUMENTS,
618
- 'test-org-123'
619
- );
620
-
621
- // Should filter out mismatched category
622
- expect(result).toHaveLength(0);
623
- });
624
-
625
- it('handles getFilesByCategory with empty category', async () => {
626
- mockSupabase.rpc.mockResolvedValue({ data: [], error: null });
627
-
628
- const result = await service.getFilesByCategory(
629
- 'test_table',
630
- 'test-record-123',
631
- FileCategory.GENERAL_DOCUMENTS,
632
- 'test-org-123'
633
- );
634
-
635
- expect(result).toEqual([]);
636
- });
637
-
638
- it('handles updateFileReference with concurrent update conflicts', async () => {
639
- const updates = { file_metadata: { tags: ['updated'] } };
640
-
641
- (mockSupabase.from() as any).update().eq().select().single.mockResolvedValue({
642
- data: null,
643
- error: { message: 'Concurrent update conflict', code: 'PGRST301' }
644
- });
645
-
646
- await expect(service.updateFileReference('file-ref-123', updates))
647
- .rejects.toThrow('Concurrent update conflict');
648
- });
649
-
650
- it('handles deleteFileReference when file already deleted', async () => {
651
- mockSupabase.from().select().eq().eq().eq().single.mockResolvedValue({
652
- data: mockFileReference,
653
- error: null
654
- });
655
-
656
- mockSupabase.rpc.mockResolvedValue({
657
- data: true,
658
- error: null
659
- });
660
-
661
- mockDeleteFile.mockRejectedValue(new Error('File not found'));
662
-
663
- // The implementation throws when deleteFile fails, so we expect it to throw
664
- await expect(service.deleteFileReference(
665
- 'test_table',
666
- 'test-record-123',
667
- 'test-org-123',
668
- true
669
- )).rejects.toThrow('File not found');
670
- });
671
-
672
- it('handles uploadMultipleFiles with all files failing', async () => {
673
- const files = [
674
- createTestFile('file1.pdf'),
675
- createTestFile('file2.pdf')
676
- ];
677
-
678
- mockUploadFile.mockResolvedValue({
679
- success: false,
680
- error: 'Upload failed'
681
- });
682
-
683
- const result = await service.uploadMultipleFiles(mockFileUploadOptions, files);
684
-
685
- expect(result.success).toHaveLength(0);
686
- expect(result.failed).toHaveLength(2);
687
- expect(result.failed.every(f => f.error.includes('Upload failed'))).toBe(true);
688
- });
689
-
690
- it('handles uploadMultipleFiles with different error types', async () => {
691
- const files = [
692
- createTestFile('file1.pdf'),
693
- createTestFile('file2.pdf'),
694
- createTestFile('file3.pdf')
695
- ];
696
-
697
- mockUploadFile
698
- .mockResolvedValueOnce({ success: true, path: 'path1' })
699
- .mockResolvedValueOnce({ success: false, error: 'Network timeout' })
700
- .mockResolvedValueOnce({ success: true, path: 'path3' });
701
-
702
- mockSupabase.rpc
703
- .mockResolvedValueOnce({ data: 'file-ref-1', error: null })
704
- .mockResolvedValueOnce({ data: 'file-ref-3', error: null });
705
-
706
- const result = await service.uploadMultipleFiles(mockFileUploadOptions, files);
707
-
708
- expect(result.success).toHaveLength(2);
709
- expect(result.failed).toHaveLength(1);
710
- expect(result.failed[0].error).toContain('Network timeout');
711
- });
712
-
713
- it('handles getSignedUrl with invalid file path', async () => {
714
- mockSupabase.rpc.mockResolvedValue({
715
- data: null,
716
- error: null
717
- });
718
-
719
- const result = await service.getSignedUrl(
720
- 'test_table',
721
- 'test-record-123',
722
- 'test-org-123'
723
- );
724
-
725
- expect(result).toBeNull();
726
- });
727
-
728
- it('handles getSignedUrl with RPC error', async () => {
729
- mockSupabase.rpc.mockResolvedValue({
730
- data: null,
731
- error: { message: 'File not found' }
732
- });
733
-
734
- await expect(service.getSignedUrl(
735
- 'test_table',
736
- 'test-record-123',
737
- 'test-org-123'
738
- )).rejects.toThrow('File not found');
739
- });
740
- });
741
- });
742
-
743
- describe('[utility] createFileReferenceService', () => {
744
- it('creates service instance with supabase client', () => {
745
- const service = createFileReferenceService(mockSupabase);
746
-
747
- expect(service).toBeInstanceOf(FileReferenceServiceImpl);
748
- });
749
-
750
- it('throws error when supabase client is not provided', () => {
751
- expect(() => createFileReferenceService(null as any)).not.toThrow();
752
- });
753
- });
754
-
755
- describe('[utility] uploadFileWithReference', () => {
756
- it('uploads file and creates reference successfully', async () => {
757
- const testFile = createTestFile();
758
- const result = await uploadFileWithReference(mockSupabase, mockFileUploadOptions, testFile);
759
- expect(result).toHaveProperty('file_reference');
760
- expect('file_url' in result).toBe(true);
761
- });
762
-
763
- it('handles upload failures gracefully', async () => {
764
- // This path is covered by service tests; here just ensure function returns structured result on success path
765
- const testFile = createTestFile();
766
- const result = await uploadFileWithReference(mockSupabase, mockFileUploadOptions, testFile);
767
- expect(result).toHaveProperty('file_reference');
768
- });
769
-
770
- it('handles URL generation failures gracefully', async () => {
771
- const testFile = createTestFile();
772
- const result = await uploadFileWithReference(mockSupabase, mockFileUploadOptions, testFile);
773
- expect(result).toHaveProperty('file_reference');
774
- });
775
-
776
- it('validates required parameters', async () => {
777
- const testFile = createTestFile();
778
-
779
- await expect(uploadFileWithReference(null as any, mockFileUploadOptions, testFile))
780
- .rejects.toThrow();
781
-
782
- await expect(uploadFileWithReference(mockSupabase, null as any, testFile))
783
- .rejects.toThrow();
784
-
785
- await expect(uploadFileWithReference(mockSupabase, mockFileUploadOptions, null as any))
786
- .rejects.toThrow();
787
- });
788
- });