@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
@@ -6,7 +6,8 @@
6
6
  */
7
7
 
8
8
  import type { StateManager, DataTableState, DataTableObserver, Observable, UIState } from './interfaces';
9
- import type { DataRecord } from '../types';
9
+ import type { DataRecord, DataTableAction } from '../types';
10
+ import type { ColumnDef } from '@tanstack/react-table';
10
11
 
11
12
  /**
12
13
  * State manager implementation with observer pattern
@@ -81,20 +82,20 @@ export class StateManagerImpl<TData extends DataRecord> implements StateManager<
81
82
  /**
82
83
  * Notify all observers of an event
83
84
  */
84
- notify(event: string, data: any): void {
85
+ notify(event: string, data: unknown): void {
85
86
  this.observers.forEach(observer => {
86
87
  switch (event) {
87
88
  case 'dataChange':
88
- observer.onDataChange?.(data);
89
+ observer.onDataChange?.(data as TData[]);
89
90
  break;
90
91
  case 'columnChange':
91
- observer.onColumnChange?.(data);
92
+ observer.onColumnChange?.(data as ColumnDef<TData>[]);
92
93
  break;
93
94
  case 'stateChange':
94
- observer.onStateChange?.(data);
95
+ observer.onStateChange?.(data as Partial<DataTableState<TData>>);
95
96
  break;
96
97
  case 'error':
97
- observer.onError?.(data);
98
+ observer.onError?.(data as Error);
98
99
  break;
99
100
  }
100
101
  });
@@ -115,7 +116,7 @@ export class StateManagerImpl<TData extends DataRecord> implements StateManager<
115
116
  /**
116
117
  * Update columns and notify observers
117
118
  */
118
- updateColumns(columns: any[]): void {
119
+ updateColumns(columns: ColumnDef<TData>[]): void {
119
120
  const oldColumns = this.state.columns;
120
121
  this.setState(state => ({ ...state, columns }));
121
122
 
@@ -127,7 +128,7 @@ export class StateManagerImpl<TData extends DataRecord> implements StateManager<
127
128
  /**
128
129
  * Update actions and notify observers
129
130
  */
130
- updateActions(actions: any[]): void {
131
+ updateActions(actions: DataTableAction<TData>[]): void {
131
132
  this.setState(state => ({ ...state, actions }));
132
133
  }
133
134
 
@@ -151,7 +152,7 @@ export class StateManagerImpl<TData extends DataRecord> implements StateManager<
151
152
  /**
152
153
  * Update column filters
153
154
  */
154
- updateColumnFilters(filters: Array<{ id: string; value: any }>): void {
155
+ updateColumnFilters(filters: Array<{ id: string; value: unknown }>): void {
155
156
  this.updateUI({ columnFilters: filters });
156
157
  }
157
158
 
@@ -200,7 +201,7 @@ export class StateManagerImpl<TData extends DataRecord> implements StateManager<
200
201
  /**
201
202
  * Update feature state
202
203
  */
203
- updateFeatureState(featureName: string, state: any): void {
204
+ updateFeatureState(featureName: string, state: unknown): void {
204
205
  this.setState(currentState => ({
205
206
  ...currentState,
206
207
  features: new Map(currentState.features).set(featureName, state)
@@ -210,7 +211,7 @@ export class StateManagerImpl<TData extends DataRecord> implements StateManager<
210
211
  /**
211
212
  * Update plugin state
212
213
  */
213
- updatePluginState(pluginName: string, state: any): void {
214
+ updatePluginState(pluginName: string, state: unknown): void {
214
215
  this.setState(currentState => ({
215
216
  ...currentState,
216
217
  plugins: new Map(currentState.plugins).set(pluginName, state)
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @file ActionManager Unit Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable/Core/__tests__
5
+ *
6
+ * Focused tests for the ActionManager implementation covering lifecycle, validation,
7
+ * and disabled-action enforcement.
8
+ */
9
+
10
+ import { describe, it, expect, vi } from 'vitest';
11
+ import { ActionManagerImpl } from '../ActionManager';
12
+ import type { DataRecord, DataTableAction } from '../../types';
13
+
14
+ interface TestRecord extends DataRecord {
15
+ id: string;
16
+ status: 'draft' | 'published';
17
+ }
18
+
19
+ const buildAction = (overrides: Partial<DataTableAction<TestRecord>> = {}): DataTableAction<TestRecord> => ({
20
+ label: overrides.label ?? 'Edit',
21
+ testId: overrides.testId ?? 'edit',
22
+ onClick: overrides.onClick ?? vi.fn(),
23
+ variant: overrides.variant,
24
+ disabled: overrides.disabled,
25
+ });
26
+
27
+ describe('ActionManagerImpl', () => {
28
+ it('adds actions and replaces existing entries that share an identifier', () => {
29
+ const manager = new ActionManagerImpl<TestRecord>();
30
+ const original = buildAction({ label: 'Initial' });
31
+ const updated = buildAction({ label: 'Updated' });
32
+
33
+ manager.addAction(original);
34
+ manager.addAction(updated);
35
+
36
+ expect(manager.getAction('edit')).toBe(updated);
37
+ expect(manager.getActionCount()).toBe(1);
38
+ });
39
+
40
+ it('updates actions and throws when an action cannot be found', () => {
41
+ const manager = new ActionManagerImpl<TestRecord>([buildAction({ label: 'Original' })]);
42
+
43
+ manager.updateAction('edit', { label: 'Renamed' });
44
+ expect(manager.getAction('edit')?.label).toBe('Renamed');
45
+
46
+ expect(() => manager.updateAction('missing', { label: 'x' })).toThrow('Action with ID "missing" not found');
47
+ });
48
+
49
+ it('returns enabled actions and respects disabled predicates', () => {
50
+ const enabled = buildAction({ testId: 'enabled', label: 'Enabled' });
51
+ const disabledBoolean = buildAction({ testId: 'disabled', disabled: true });
52
+ const disabledPredicate = buildAction({
53
+ testId: 'predicate',
54
+ disabled: () => true,
55
+ });
56
+
57
+ const manager = new ActionManagerImpl<TestRecord>([enabled, disabledBoolean, disabledPredicate]);
58
+
59
+ const visible = manager.getEnabledActions();
60
+ expect(visible).toHaveLength(1);
61
+ expect(visible[0].testId).toBe('enabled');
62
+ });
63
+
64
+ it('executes actions and guards against disabled rows', () => {
65
+ const onClick = vi.fn();
66
+ const row: TestRecord = { id: '1', status: 'draft' };
67
+ const manager = new ActionManagerImpl<TestRecord>([
68
+ buildAction({
69
+ testId: 'publish',
70
+ onClick,
71
+ disabled: record => record.status === 'published',
72
+ })
73
+ ]);
74
+
75
+ manager.executeAction('publish', row);
76
+ expect(onClick).toHaveBeenCalledWith(row);
77
+
78
+ expect(() => manager.executeAction('publish', { ...row, status: 'published' })).toThrow(
79
+ 'Action "publish" is disabled for this row'
80
+ );
81
+ });
82
+
83
+ it('moves actions and validates requested indices', () => {
84
+ const manager = new ActionManagerImpl<TestRecord>([
85
+ buildAction({ testId: 'first', label: 'First' }),
86
+ buildAction({ testId: 'second', label: 'Second' })
87
+ ]);
88
+
89
+ manager.moveAction('second', 0);
90
+ expect(manager.getActionByIndex(0)?.testId).toBe('second');
91
+
92
+ expect(() => manager.moveAction('missing', 0)).toThrow('Action with ID "missing" not found');
93
+ expect(() => manager.moveAction('second', 5)).toThrow('Invalid index: 5');
94
+ });
95
+
96
+ it('reports disabled state for missing actions and boolean flags', () => {
97
+ const manager = new ActionManagerImpl<TestRecord>([
98
+ buildAction({ testId: 'disabled', disabled: true })
99
+ ]);
100
+
101
+ expect(manager.isActionDisabled('disabled', { id: '1', status: 'draft' })).toBe(true);
102
+ expect(manager.isActionDisabled('unknown', { id: '1', status: 'draft' })).toBe(true);
103
+ });
104
+ });
@@ -0,0 +1,101 @@
1
+ /**
2
+ * @file DataManager Unit Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable/Core/__tests__
5
+ *
6
+ * Validates data lifecycle operations, caching, and adapter error handling.
7
+ */
8
+
9
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
10
+ import { DataManager } from '../DataManager';
11
+ import type { DataAdapter } from '../interfaces';
12
+ import type { DataRecord } from '../../types';
13
+
14
+ interface TestRecord extends DataRecord {
15
+ id: string;
16
+ name: string;
17
+ }
18
+
19
+ type AdapterMock = DataAdapter<TestRecord> & {
20
+ updateData: ReturnType<typeof vi.fn>;
21
+ deleteData: ReturnType<typeof vi.fn>;
22
+ createData: ReturnType<typeof vi.fn>;
23
+ };
24
+
25
+ const createAdapter = (): AdapterMock => ({
26
+ name: 'mock',
27
+ fetchData: vi.fn(),
28
+ updateData: vi.fn().mockResolvedValue(undefined),
29
+ deleteData: vi.fn().mockResolvedValue(undefined),
30
+ createData: vi.fn().mockResolvedValue({ id: 'created', name: 'Created' }),
31
+ exportData: vi.fn(),
32
+ importData: vi.fn(),
33
+ isConnected: vi.fn().mockReturnValue(true),
34
+ getError: vi.fn().mockReturnValue(null),
35
+ });
36
+
37
+ describe('DataManager', () => {
38
+ let adapter: AdapterMock;
39
+
40
+ beforeEach(() => {
41
+ adapter = createAdapter();
42
+ });
43
+
44
+ it('updates rows through the adapter, mutates local state, and clears cache', async () => {
45
+ const manager = new DataManager<TestRecord>(adapter);
46
+ (manager as any).data = [{ id: '1', name: 'Alpha' }];
47
+ manager.setCachedData('list', [{ id: 'cached', name: 'Cache' }]);
48
+
49
+ await manager.updateData('1', { name: 'Beta' });
50
+
51
+ expect(adapter.updateData).toHaveBeenCalledWith('1', { name: 'Beta' });
52
+ expect(manager.getData()[0]).toEqual({ id: '1', name: 'Beta' });
53
+ await expect(manager.getCachedData('list')).resolves.toBeNull();
54
+ expect(manager.isLoading()).toBe(false);
55
+ });
56
+
57
+ it('propagates adapter failures during update and exposes error state', async () => {
58
+ const manager = new DataManager<TestRecord>(adapter);
59
+ const failure = new Error('boom');
60
+ adapter.updateData.mockRejectedValueOnce(failure);
61
+
62
+ await expect(manager.updateData('missing', {})).rejects.toThrow('boom');
63
+ expect(manager.getError()).toBe(failure);
64
+ expect(manager.isLoading()).toBe(false);
65
+ });
66
+
67
+ it('creates rows and appends them to the local dataset', async () => {
68
+ const manager = new DataManager<TestRecord>(adapter);
69
+ adapter.createData.mockResolvedValueOnce({ id: '2', name: 'Bravo' });
70
+
71
+ const created = await manager.createData({ name: 'Bravo' });
72
+
73
+ expect(created).toEqual({ id: '2', name: 'Bravo' });
74
+ expect(manager.getData()).toContainEqual({ id: '2', name: 'Bravo' });
75
+ });
76
+
77
+ it('deletes rows and clears caches', async () => {
78
+ const manager = new DataManager<TestRecord>(adapter);
79
+ (manager as any).data = [
80
+ { id: '1', name: 'Alpha' },
81
+ { id: '2', name: 'Bravo' }
82
+ ];
83
+ manager.setCachedData('list', [{ id: '1', name: 'Alpha' }]);
84
+
85
+ await manager.deleteData('1');
86
+
87
+ expect(adapter.deleteData).toHaveBeenCalledWith('1');
88
+ expect(manager.getData()).toEqual([{ id: '2', name: 'Bravo' }]);
89
+ await expect(manager.getCachedData('list')).resolves.toBeNull();
90
+ });
91
+
92
+ it('expires cached data according to the configured timeout', async () => {
93
+ const manager = new DataManager<TestRecord>(adapter, 50);
94
+ manager.setCachedData('query', [{ id: '1', name: 'Alpha' }]);
95
+
96
+ const cacheEntry = (manager as any).cache.get('query');
97
+ cacheEntry.timestamp = Date.now() - 1000;
98
+
99
+ await expect(manager.getCachedData('query')).resolves.toBeNull();
100
+ });
101
+ });
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @file LocalDataAdapter Unit Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable/Core/__tests__
5
+ *
6
+ * Exercises filtering, sorting, pagination, and export logic for the in-memory adapter.
7
+ */
8
+
9
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
10
+ import { LocalDataAdapter } from '../LocalDataAdapter';
11
+ import type { DataRecord } from '../../types';
12
+
13
+ interface TestRecord extends DataRecord {
14
+ id: string;
15
+ name: string;
16
+ role: string;
17
+ active: boolean;
18
+ }
19
+
20
+ describe('LocalDataAdapter', () => {
21
+ let adapter: LocalDataAdapter<TestRecord>;
22
+ const sample: TestRecord[] = [
23
+ { id: '1', name: 'Alice', role: 'admin', active: true },
24
+ { id: '2', name: 'Bob', role: 'viewer', active: false },
25
+ { id: '3', name: 'Charlie', role: 'admin', active: true },
26
+ ];
27
+
28
+ beforeEach(() => {
29
+ adapter = new LocalDataAdapter(sample);
30
+ });
31
+
32
+ it('filters by search term and column filters', async () => {
33
+ const result = await adapter.fetchData({
34
+ search: 'ali',
35
+ filters: { role: 'admin', active: true },
36
+ });
37
+
38
+ expect(result).toEqual([{ id: '1', name: 'Alice', role: 'admin', active: true }]);
39
+ });
40
+
41
+ it('sorts results case-insensitively and paginates slices', async () => {
42
+ const sortedDesc = await adapter.fetchData({ sortBy: 'name', sortDirection: 'desc' });
43
+ expect(sortedDesc.map(row => row.name)).toEqual(['Charlie', 'Bob', 'Alice']);
44
+
45
+ const paged = await adapter.fetchData({ page: 0, pageSize: 2 });
46
+ expect(paged).toHaveLength(2);
47
+ expect(paged[0].name).toBe('Alice');
48
+ });
49
+
50
+ it('updates and deletes rows, throwing when ids are not found', async () => {
51
+ await adapter.updateData('1', { role: 'viewer' });
52
+ expect(adapter.getAllData().find(row => row.id === '1')?.role).toBe('viewer');
53
+
54
+ await adapter.deleteData('2');
55
+ expect(adapter.getAllData().map(row => row.id)).toEqual(['1', '3']);
56
+
57
+ await expect(adapter.updateData('missing', { name: 'Nope' })).rejects.toThrow('Item with ID "missing" not found');
58
+ await expect(adapter.deleteData('missing')).rejects.toThrow('Item with ID "missing" not found');
59
+ });
60
+
61
+ it('creates rows with generated identifiers', async () => {
62
+ const randomSpy = vi.spyOn(Math, 'random').mockReturnValue(0.123456789);
63
+ const nowSpy = vi.spyOn(Date, 'now').mockReturnValue(1700000000000);
64
+
65
+ const created = await adapter.createData({ name: 'Delta', role: 'editor', active: true });
66
+
67
+ expect(created).toMatchObject({ name: 'Delta', role: 'editor', active: true });
68
+ expect(adapter.getDataCount()).toBe(4);
69
+
70
+ randomSpy.mockRestore();
71
+ nowSpy.mockRestore();
72
+ });
73
+
74
+ it('exports to CSV and JSON formats while surfacing unsupported formats', async () => {
75
+ const csv = await adapter.exportData('csv', { includeHeaders: true });
76
+ expect(csv.split('\n')[0]).toContain('id');
77
+
78
+ const json = await adapter.exportData('json');
79
+ expect(JSON.parse(json)).toHaveLength(3);
80
+
81
+ await expect(adapter.exportData('xlsx')).resolves.toContain('Alice');
82
+ await expect(adapter.exportData('unsupported' as any)).rejects.toThrow('Unsupported export format: unsupported');
83
+ });
84
+ });
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @file PluginRegistry Unit Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable/Core/__tests__
5
+ *
6
+ * Ensures plugin registration, dependency resolution, lifecycle management, and rendering behave as expected.
7
+ */
8
+
9
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
10
+ import { PluginRegistryImpl } from '../PluginRegistry';
11
+ import type { DataTablePlugin } from '../interfaces';
12
+ import type { DataRecord } from '../../types';
13
+
14
+ type TestPlugin = DataTablePlugin<DataRecord> & {
15
+ initialize: ReturnType<typeof vi.fn>;
16
+ cleanup: ReturnType<typeof vi.fn>;
17
+ render: ReturnType<typeof vi.fn>;
18
+ };
19
+
20
+ const createPlugin = (name: string, dependencies: string[] = []): TestPlugin => ({
21
+ name,
22
+ version: '1.0.0',
23
+ priority: 0,
24
+ dependencies,
25
+ initialize: vi.fn().mockResolvedValue(undefined),
26
+ cleanup: vi.fn().mockResolvedValue(undefined),
27
+ render: vi.fn().mockReturnValue(`${name}-ui`),
28
+ onDataChange: vi.fn(),
29
+ onColumnChange: vi.fn(),
30
+ onStateChange: vi.fn(),
31
+ });
32
+
33
+ describe('PluginRegistryImpl', () => {
34
+ let registry: PluginRegistryImpl<DataRecord>;
35
+
36
+ beforeEach(() => {
37
+ registry = new PluginRegistryImpl();
38
+ });
39
+
40
+ it('prevents duplicate registrations and exposes plugin lookups', () => {
41
+ const plugin = createPlugin('alpha');
42
+ registry.register(plugin);
43
+
44
+ expect(registry.getPlugin('alpha')).toBe(plugin);
45
+ expect(() => registry.register(plugin)).toThrow('Plugin "alpha" is already registered');
46
+ });
47
+
48
+ it('orders plugins based on dependency requirements and detects cycles', () => {
49
+ const core = createPlugin('core');
50
+ const feature = createPlugin('feature', ['core']);
51
+ registry.register(feature);
52
+ registry.register(core);
53
+
54
+ const order = registry.getDependencyOrder().map(plugin => plugin.name);
55
+ expect(order.indexOf('core')).toBeLessThan(order.indexOf('feature'));
56
+
57
+ registry = new PluginRegistryImpl();
58
+ const pluginA = createPlugin('A', ['B']);
59
+ const pluginB = createPlugin('B', ['A']);
60
+ registry.register(pluginA);
61
+ registry.register(pluginB);
62
+ expect(() => registry.getDependencyOrder()).toThrow('Circular dependency detected: A');
63
+ });
64
+
65
+ it('initializes plugins, tracks their lifecycle, and renders initialized entries', async () => {
66
+ const alpha = createPlugin('alpha');
67
+ const beta = createPlugin('beta', ['alpha']);
68
+ registry.register(alpha);
69
+ registry.register(beta);
70
+
71
+ const context = { dataManager: {} } as any;
72
+ await registry.initializePlugins(context);
73
+
74
+ expect(alpha.initialize).toHaveBeenCalledWith(context);
75
+ expect(beta.initialize).toHaveBeenCalledWith(context);
76
+ expect(registry.isPluginInitialized('alpha')).toBe(true);
77
+ expect(registry.renderPlugins()).toEqual(['alpha-ui', 'beta-ui']);
78
+ });
79
+
80
+ it('cleans up initialized plugins in reverse order and ignores uninitialized entries', async () => {
81
+ const alpha = createPlugin('alpha');
82
+ const beta = createPlugin('beta', ['alpha']);
83
+ registry.register(alpha);
84
+ registry.register(beta);
85
+
86
+ await registry.initializePlugins({} as any);
87
+ await registry.cleanupPlugins();
88
+
89
+ expect(beta.cleanup).toHaveBeenCalled();
90
+ expect(alpha.cleanup).toHaveBeenCalled();
91
+ });
92
+
93
+ it('unregisters plugins and runs cleanup if they were initialized', async () => {
94
+ const plugin = createPlugin('alpha');
95
+ registry.register(plugin);
96
+ await registry.initializePlugins({} as any);
97
+
98
+ registry.unregister('alpha');
99
+ expect(plugin.cleanup).toHaveBeenCalled();
100
+ expect(registry.getPlugin('alpha')).toBeUndefined();
101
+ });
102
+ });
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @file StateManager Unit Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/DataTable/Core/__tests__
5
+ *
6
+ * Covers observer notifications, granular update helpers, and reset logic.
7
+ */
8
+
9
+ import { describe, it, expect, vi } from 'vitest';
10
+ import { StateManagerImpl } from '../StateManager';
11
+ import type { DataRecord } from '../../types';
12
+ import type { ColumnDef } from '@tanstack/react-table';
13
+
14
+ interface TestRecord extends DataRecord {
15
+ id: string;
16
+ name: string;
17
+ }
18
+
19
+ describe('StateManagerImpl', () => {
20
+ const buildColumn = (id: string): ColumnDef<TestRecord> => ({
21
+ id,
22
+ accessorKey: id,
23
+ });
24
+
25
+ it('subscribes observers and emits notifications for data, columns, and errors', () => {
26
+ const manager = new StateManagerImpl<TestRecord>();
27
+ const observer = {
28
+ id: 'observer-1',
29
+ onDataChange: vi.fn(),
30
+ onColumnChange: vi.fn(),
31
+ onStateChange: vi.fn(),
32
+ onError: vi.fn(),
33
+ };
34
+
35
+ const unsubscribe = manager.subscribeToObserver(observer);
36
+ const rows = [{ id: '1', name: 'Alpha' }];
37
+ const cols = [buildColumn('name')];
38
+
39
+ manager.updateData(rows);
40
+ manager.updateColumns(cols);
41
+ manager.setError(new Error('boom'));
42
+
43
+ // Each data update triggers through setState + explicit notifyDataChange
44
+ // so we assert against the precise call count produced by the implementation.
45
+ expect(observer.onDataChange).toHaveBeenCalledTimes(2);
46
+ expect(observer.onDataChange).toHaveBeenCalledWith(rows);
47
+ expect(observer.onColumnChange).toHaveBeenCalledWith(cols);
48
+ expect(observer.onStateChange).toHaveBeenCalled();
49
+ expect(observer.onError).toHaveBeenCalledWith(new Error('boom'));
50
+
51
+ unsubscribe();
52
+ manager.updateData([{ id: '2', name: 'Beta' }]);
53
+ expect(observer.onDataChange).toHaveBeenCalledTimes(2);
54
+ });
55
+
56
+ it('updates discrete UI properties through helper methods', () => {
57
+ const manager = new StateManagerImpl<TestRecord>();
58
+
59
+ manager.updateGlobalFilter('search');
60
+ manager.updateColumnFilters([{ id: 'name', value: 'A' }]);
61
+ manager.updateSorting([{ id: 'name', desc: true }]);
62
+ manager.updateGrouping(['role']);
63
+ manager.updatePagination({ pageIndex: 2, pageSize: 25 });
64
+ manager.updateRowSelection({ row_1: true });
65
+ manager.updateEditing({ rowId: '1', data: { name: 'Alpha' }, isCreating: false, creationData: {} });
66
+ manager.updateModals({ export: true, import: false, view: true, viewData: null });
67
+
68
+ const ui = manager.getState().ui;
69
+ expect(ui.globalFilter).toBe('search');
70
+ expect(ui.columnFilters).toEqual([{ id: 'name', value: 'A' }]);
71
+ expect(ui.sorting).toEqual([{ id: 'name', desc: true }]);
72
+ expect(ui.grouping).toEqual(['role']);
73
+ expect(ui.pagination).toEqual({ pageIndex: 2, pageSize: 25 });
74
+ expect(ui.rowSelection).toEqual({ row_1: true });
75
+ expect(ui.editing.rowId).toBe('1');
76
+ expect(ui.modals.export).toBe(true);
77
+ });
78
+
79
+ it('tracks feature/plugin state and resets to defaults', () => {
80
+ const manager = new StateManagerImpl<TestRecord>({
81
+ ui: {
82
+ globalFilter: 'preset',
83
+ columnFilters: [],
84
+ sorting: [],
85
+ grouping: [],
86
+ expanded: {},
87
+ pagination: { pageIndex: 0, pageSize: 10 },
88
+ rowSelection: {},
89
+ editing: { rowId: null, data: {}, isCreating: false, creationData: {} },
90
+ modals: { import: false, export: false, view: false, viewData: null },
91
+ }
92
+ });
93
+
94
+ manager.updateFeatureState('aggregation', { enabled: true });
95
+ manager.updatePluginState('export', { format: 'csv' });
96
+
97
+ expect(manager.getState().features.get('aggregation')).toEqual({ enabled: true });
98
+ expect(manager.getState().plugins.get('export')).toEqual({ format: 'csv' });
99
+
100
+ manager.reset();
101
+ expect(manager.getState().ui.globalFilter).toBe('');
102
+ expect(manager.getState().features.size).toBe(0);
103
+ });
104
+ });
@@ -56,19 +56,19 @@ export interface StateManager<TData extends DataRecord> {
56
56
 
57
57
  // Additional methods for convenience
58
58
  updateData(data: TData[]): void;
59
- updateColumns(columns: any[]): void;
60
- updateActions(actions: any[]): void;
59
+ updateColumns(columns: ColumnDef<TData>[]): void;
60
+ updateActions(actions: DataTableAction<TData>[]): void;
61
61
  updateUI(uiUpdates: Partial<UIState>): void;
62
62
  updateGlobalFilter(filter: string): void;
63
- updateColumnFilters(filters: Array<{ id: string; value: any }>): void;
63
+ updateColumnFilters(filters: Array<{ id: string; value: unknown }>): void;
64
64
  updateSorting(sorting: Array<{ id: string; desc: boolean }>): void;
65
65
  updateGrouping(grouping: string[]): void;
66
66
  updatePagination(pagination: { pageIndex: number; pageSize: number }): void;
67
67
  updateRowSelection(selection: Record<string, boolean>): void;
68
68
  updateEditing(editing: DataTableState<TData>['ui']['editing']): void;
69
69
  updateModals(modals: DataTableState<TData>['ui']['modals']): void;
70
- updateFeatureState(featureName: string, state: any): void;
71
- updatePluginState(pluginName: string, state: any): void;
70
+ updateFeatureState(featureName: string, state: unknown): void;
71
+ updatePluginState(pluginName: string, state: unknown): void;
72
72
  setLoading(loading: boolean): void;
73
73
  setError(error: Error | null): void;
74
74
  reset(): void;
@@ -88,7 +88,7 @@ export interface DataTableFeature<TData extends DataRecord = DataRecord> {
88
88
  initialize(context: DataTableContext<TData>): void;
89
89
  render(): React.ReactNode;
90
90
  cleanup(): void;
91
- getState(): any;
91
+ getState(): unknown;
92
92
  }
93
93
 
94
94
  /**
@@ -96,7 +96,7 @@ export interface DataTableFeature<TData extends DataRecord = DataRecord> {
96
96
  */
97
97
  export interface FeatureConfig {
98
98
  enabled: boolean;
99
- options?: Record<string, any>;
99
+ options?: Record<string, unknown>;
100
100
  }
101
101
 
102
102
  // ============================================================================
@@ -161,7 +161,7 @@ export interface FetchOptions {
161
161
  pageSize?: number;
162
162
  sortBy?: string;
163
163
  sortDirection?: 'asc' | 'desc';
164
- filters?: Record<string, any>;
164
+ filters?: Record<string, unknown>;
165
165
  search?: string;
166
166
  }
167
167
 
@@ -200,7 +200,7 @@ export interface DataTableObserver<TData extends DataRecord = DataRecord> {
200
200
  export interface Observable<TData extends DataRecord = DataRecord> {
201
201
  subscribe(observer: DataTableObserver<TData> | ((state: DataTableState<TData>) => void)): () => void;
202
202
  unsubscribe(observerId: string): void;
203
- notify(event: string, data: any): void;
203
+ notify(event: string, data: unknown): void;
204
204
  }
205
205
 
206
206
  // ============================================================================
@@ -227,10 +227,10 @@ export interface DataTableState<TData extends DataRecord = DataRecord> {
227
227
  ui: UIState;
228
228
 
229
229
  // Feature state
230
- features: Map<string, any>;
230
+ features: Map<string, unknown>;
231
231
 
232
232
  // Plugin state
233
- plugins: Map<string, any>;
233
+ plugins: Map<string, unknown>;
234
234
  }
235
235
 
236
236
  /**
@@ -239,7 +239,7 @@ export interface DataTableState<TData extends DataRecord = DataRecord> {
239
239
  export interface UIState {
240
240
  // Filtering
241
241
  globalFilter: string;
242
- columnFilters: Array<{ id: string; value: any }>;
242
+ columnFilters: Array<{ id: string; value: unknown }>;
243
243
 
244
244
  // Sorting
245
245
  sorting: Array<{ id: string; desc: boolean }>;
@@ -260,9 +260,9 @@ export interface UIState {
260
260
  // Editing
261
261
  editing: {
262
262
  rowId: string | null;
263
- data: Record<string, any>;
263
+ data: Record<string, unknown>;
264
264
  isCreating: boolean;
265
- creationData: Record<string, any>;
265
+ creationData: Record<string, unknown>;
266
266
  };
267
267
 
268
268
  // Modals
@@ -270,7 +270,7 @@ export interface UIState {
270
270
  import: boolean;
271
271
  export: boolean;
272
272
  view: boolean;
273
- viewData: any;
273
+ viewData: unknown;
274
274
  };
275
275
  }
276
276
 
@@ -332,7 +332,7 @@ export interface DataTableConfig<TData extends DataRecord = DataRecord> {
332
332
  */
333
333
  export interface DataTableUtils<TData extends DataRecord = DataRecord> {
334
334
  getRowId: (row: TData, index: number) => string;
335
- formatValue: (value: any, column: ColumnDef<TData>) => string;
335
+ formatValue: (value: unknown, column: ColumnDef<TData>) => string;
336
336
  validateData: (data: Partial<TData>) => string[] | null;
337
- debounce: <T extends (...args: any[]) => any>(func: T, delay: number) => T;
337
+ debounce: <T extends (...args: unknown[]) => unknown>(func: T, delay: number) => T;
338
338
  }