@jmruthers/pace-core 0.5.53 → 0.5.55

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 (398) hide show
  1. package/README.md +0 -4
  2. package/dist/{DataTable-7FMFXA7A.js → DataTable-4T627QFJ.js} +11 -11
  3. package/dist/{PublicLoadingSpinner-Bq_-BeK-.d.ts → PublicLoadingSpinner-SL8WaQN7.d.ts} +2 -21
  4. package/dist/{api-H5A3H4IR.js → api-LUNF5O6M.js} +3 -3
  5. package/dist/{appConfig-BVGyuvI7.d.ts → appConfig-DjpeG6P-.d.ts} +9 -1
  6. package/dist/{appNameResolver-7GHF5ED2.js → appNameResolver-UURKN7NF.js} +2 -2
  7. package/dist/{audit-BUW3LMJB.js → audit-6TOCAMKO.js} +2 -2
  8. package/dist/{chunk-MZBUOP4P.js → chunk-5BSLGBYI.js} +4 -3
  9. package/dist/chunk-5BSLGBYI.js.map +1 -0
  10. package/dist/{chunk-I5Z3QH5X.js → chunk-66C4BSAY.js} +2 -2
  11. package/dist/{chunk-I5Z3QH5X.js.map → chunk-66C4BSAY.js.map} +1 -1
  12. package/dist/{chunk-MYP2EGHX.js → chunk-AJ2KMES7.js} +21 -14
  13. package/dist/chunk-AJ2KMES7.js.map +1 -0
  14. package/dist/{chunk-EL2O4IUX.js → chunk-AQFRLC7K.js} +16 -24
  15. package/dist/{chunk-EL2O4IUX.js.map → chunk-AQFRLC7K.js.map} +1 -1
  16. package/dist/{chunk-7BNPOCLL.js → chunk-B2WTCLCV.js} +6 -2
  17. package/dist/chunk-B2WTCLCV.js.map +1 -0
  18. package/dist/{chunk-WJARTBCT.js → chunk-D7ARGIA3.js} +16 -7
  19. package/dist/chunk-D7ARGIA3.js.map +1 -0
  20. package/dist/{chunk-NRK4AIHQ.js → chunk-KBRACSJI.js} +3 -3
  21. package/dist/{chunk-NYUJ4FJR.js → chunk-KJDPSM64.js} +7 -7
  22. package/dist/chunk-KJDPSM64.js.map +1 -0
  23. package/dist/{chunk-GWSBHC4J.js → chunk-KLPVOPRI.js} +261 -38
  24. package/dist/chunk-KLPVOPRI.js.map +1 -0
  25. package/dist/{chunk-TRIZ7IB7.js → chunk-MPQDF75X.js} +148 -288
  26. package/dist/chunk-MPQDF75X.js.map +1 -0
  27. package/dist/{chunk-MSFACPQQ.js → chunk-PAEM3OWN.js} +11 -11
  28. package/dist/{chunk-MSFACPQQ.js.map → chunk-PAEM3OWN.js.map} +1 -1
  29. package/dist/{chunk-GIO7BFE7.js → chunk-RQD3D2CO.js} +66 -169
  30. package/dist/{chunk-GIO7BFE7.js.map → chunk-RQD3D2CO.js.map} +1 -1
  31. package/dist/{chunk-YDJW5XTN.js → chunk-STT7INZR.js} +25 -1
  32. package/dist/chunk-STT7INZR.js.map +1 -0
  33. package/dist/{chunk-6MTY77WU.js → chunk-TNMXZLDR.js} +3 -3
  34. package/dist/{chunk-BC3S53OZ.js → chunk-UQE2Y64H.js} +30 -14
  35. package/dist/chunk-UQE2Y64H.js.map +1 -0
  36. package/dist/{chunk-22KLBHPS.js → chunk-W66AZIOH.js} +2 -2
  37. package/dist/chunk-W66AZIOH.js.map +1 -0
  38. package/dist/{chunk-SS3E6QLB.js → chunk-YNUBMSMV.js} +2 -2
  39. package/dist/chunk-YNUBMSMV.js.map +1 -0
  40. package/dist/{chunk-NZ655MWE.js → chunk-ZOD2ZY6X.js} +5 -4
  41. package/dist/chunk-ZOD2ZY6X.js.map +1 -0
  42. package/dist/{chunk-74C6SNEC.js → chunk-ZPK5656W.js} +3 -3
  43. package/dist/{chunk-74C6SNEC.js.map → chunk-ZPK5656W.js.map} +1 -1
  44. package/dist/components.d.ts +22 -899
  45. package/dist/components.js +436 -3118
  46. package/dist/components.js.map +1 -1
  47. package/dist/file-reference-9xUOnwyt.d.ts +70 -0
  48. package/dist/hooks.d.ts +2 -2
  49. package/dist/hooks.js +10 -10
  50. package/dist/hooks.js.map +1 -1
  51. package/dist/index.d.ts +49 -9
  52. package/dist/index.js +190 -25
  53. package/dist/index.js.map +1 -1
  54. package/dist/{organisation-CO3Sh3_D.d.ts → organisation-t-vvQC3g.d.ts} +1 -8
  55. package/dist/providers.d.ts +2 -2
  56. package/dist/providers.js +5 -5
  57. package/dist/rbac/index.d.ts +65 -46
  58. package/dist/rbac/index.js +10 -12
  59. package/dist/styles/core.css +0 -125
  60. package/dist/types.d.ts +2 -1
  61. package/dist/types.js +3 -1
  62. package/dist/types.js.map +1 -1
  63. package/dist/{usePublicRouteParams-B2OcAsur.d.ts → usePublicRouteParams-CdoFxnJK.d.ts} +1 -1
  64. package/dist/utils.d.ts +3 -4
  65. package/dist/utils.js +44 -13
  66. package/dist/utils.js.map +1 -1
  67. package/docs/FILE_REFERENCE_SYSTEM.md +440 -0
  68. package/docs/INDEX.md +7 -5
  69. package/docs/README.md +0 -1
  70. package/docs/api/README.md +0 -4
  71. package/docs/api/classes/ErrorBoundary.md +1 -1
  72. package/docs/api/classes/InvalidScopeError.md +1 -1
  73. package/docs/api/classes/MissingUserContextError.md +1 -1
  74. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  75. package/docs/api/classes/PermissionDeniedError.md +2 -2
  76. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  77. package/docs/api/classes/RBACAuditManager.md +12 -12
  78. package/docs/api/classes/RBACCache.md +1 -1
  79. package/docs/api/classes/RBACEngine.md +6 -6
  80. package/docs/api/classes/RBACError.md +1 -1
  81. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  82. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  83. package/docs/api/classes/StorageUtils.md +281 -0
  84. package/docs/api/interfaces/AggregateConfig.md +1 -1
  85. package/docs/api/interfaces/ButtonProps.md +1 -1
  86. package/docs/api/interfaces/CardProps.md +1 -1
  87. package/docs/api/interfaces/ColorPalette.md +1 -1
  88. package/docs/api/interfaces/ColorShade.md +1 -1
  89. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  90. package/docs/api/interfaces/DataTableAction.md +1 -1
  91. package/docs/api/interfaces/DataTableColumn.md +1 -1
  92. package/docs/api/interfaces/DataTableProps.md +1 -1
  93. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  94. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  95. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  96. package/docs/api/interfaces/EventContextType.md +1 -1
  97. package/docs/api/interfaces/EventLogoProps.md +1 -1
  98. package/docs/api/interfaces/EventProviderProps.md +1 -1
  99. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  100. package/docs/api/interfaces/FileUploadProps.md +1 -1
  101. package/docs/api/interfaces/FooterProps.md +1 -1
  102. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  103. package/docs/api/interfaces/InputProps.md +1 -1
  104. package/docs/api/interfaces/LabelProps.md +1 -1
  105. package/docs/api/interfaces/LoginFormProps.md +1 -1
  106. package/docs/api/interfaces/NavigationAccessRecord.md +2 -2
  107. package/docs/api/interfaces/NavigationContextType.md +1 -1
  108. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  109. package/docs/api/interfaces/NavigationItem.md +1 -1
  110. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  111. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  112. package/docs/api/interfaces/Organisation.md +1 -1
  113. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  114. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  115. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  116. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  117. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  118. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  119. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  120. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  121. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  122. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  123. package/docs/api/interfaces/PaletteData.md +1 -1
  124. package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
  125. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  126. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  127. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  128. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  129. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  130. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  131. package/docs/api/interfaces/RBACConfig.md +1 -1
  132. package/docs/api/interfaces/RBACContextType.md +1 -1
  133. package/docs/api/interfaces/RBACLogger.md +1 -1
  134. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  135. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  136. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  137. package/docs/api/interfaces/RouteAccessRecord.md +2 -2
  138. package/docs/api/interfaces/RouteConfig.md +2 -2
  139. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  140. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  141. package/docs/api/interfaces/StorageConfig.md +1 -1
  142. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  143. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  144. package/docs/api/interfaces/StorageListOptions.md +1 -1
  145. package/docs/api/interfaces/StorageListResult.md +1 -1
  146. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  147. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  148. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  149. package/docs/api/interfaces/StyleImport.md +1 -1
  150. package/docs/api/interfaces/ToastActionElement.md +1 -1
  151. package/docs/api/interfaces/ToastProps.md +1 -1
  152. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  153. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  154. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  155. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  156. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  157. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  158. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  159. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  160. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  161. package/docs/api/interfaces/UserEventAccess.md +1 -1
  162. package/docs/api/interfaces/UserMenuProps.md +1 -1
  163. package/docs/api/interfaces/UserProfile.md +1 -1
  164. package/docs/api/modules.md +204 -200
  165. package/docs/api-reference/components.md +141 -163
  166. package/docs/api-reference/hooks.md +347 -0
  167. package/docs/core-concepts/rbac-system.md +69 -16
  168. package/docs/getting-started/examples/basic-auth-app.md +0 -1
  169. package/docs/implementation-guides/datatable-rbac-usage.md +12 -11
  170. package/docs/implementation-guides/file-upload-storage.md +733 -0
  171. package/docs/implementation-guides/inactivity-tracking.md +779 -0
  172. package/docs/implementation-guides/organisation-security.md +748 -0
  173. package/docs/implementation-guides/public-pages-advanced.md +1022 -0
  174. package/docs/migration/MIGRATION_GUIDE.md +684 -0
  175. package/docs/migration/README.md +13 -2
  176. package/docs/migration/rbac-migration.md +73 -0
  177. package/docs/rbac/examples/rbac-rls-integration-example.md +11 -13
  178. package/docs/style-guide.md +269 -1
  179. package/package.json +1 -1
  180. package/src/__tests__/TESTING_GUIDELINES.md +331 -18
  181. package/src/__tests__/helpers/supabaseMock.ts +99 -0
  182. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +10 -7
  183. package/src/__tests__/shared.ts +6 -0
  184. package/src/components/DataTable/components/ActionButtons.tsx +2 -2
  185. package/src/components/DataTable/components/DataTableCore.tsx +2 -2
  186. package/src/components/DataTable/components/UnifiedTableBody.tsx +1 -1
  187. package/src/components/DataTable/utils/debugTools.ts +2 -2
  188. package/src/components/Dialog/Dialog.test.tsx +12 -2
  189. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +6 -6
  190. package/src/components/ErrorBoundary/ErrorBoundary.tsx +2 -2
  191. package/src/components/FileDisplay.tsx +233 -0
  192. package/src/components/FileUpload.tsx +176 -0
  193. package/src/components/Footer/Footer.test.tsx +7 -7
  194. package/src/components/NavigationMenu/NavigationMenu.test.tsx +13 -6
  195. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +30 -3
  196. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  197. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +558 -0
  198. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  199. package/src/components/PublicLayout/PublicPageDebugger.tsx +2 -2
  200. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +2 -2
  201. package/src/components/PublicLayout/PublicPageProvider.tsx +2 -2
  202. package/src/components/Select/Select.test.tsx +50 -15
  203. package/src/components/SuperAdminGuard.tsx +2 -2
  204. package/src/components/__tests__/SuperAdminGuard.test.tsx +559 -0
  205. package/src/components/index.ts +0 -183
  206. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  207. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +1 -1
  208. package/src/hooks/__tests__/useRBAC.unit.test.ts +191 -138
  209. package/src/hooks/public/usePublicEvent.ts +2 -2
  210. package/src/hooks/useAppConfig.ts +3 -3
  211. package/src/hooks/useComponentPerformance.ts +1 -1
  212. package/src/hooks/useDataTablePerformance.ts +1 -1
  213. package/src/hooks/useFileReference.ts +232 -0
  214. package/src/hooks/useOrganisationPermissions.test.ts +254 -344
  215. package/src/hooks/useOrganisationPermissions.ts +15 -7
  216. package/src/hooks/useOrganisationSecurity.test.ts +390 -402
  217. package/src/hooks/usePerformanceMonitor.ts +1 -1
  218. package/src/hooks/usePermissionCache.test.ts +264 -395
  219. package/src/hooks/usePermissionCache.ts +34 -4
  220. package/src/hooks/useSecureDataAccess.test.ts +486 -0
  221. package/src/hooks/useSecureDataAccess.ts +4 -1
  222. package/src/providers/InactivityProvider.tsx +2 -2
  223. package/src/providers/OrganisationProvider.test.simple.tsx +168 -0
  224. package/src/providers/OrganisationProvider.test.tsx +168 -0
  225. package/src/providers/OrganisationProvider.tsx +18 -31
  226. package/src/providers/UnifiedAuthProvider.test.simple.tsx +205 -0
  227. package/src/providers/UnifiedAuthProvider.test.tsx +128 -0
  228. package/src/providers/__tests__/InactivityProvider.test.tsx +3 -4
  229. package/src/providers/__tests__/OrganisationProvider.test.tsx +19 -14
  230. package/src/rbac/__tests__/integration.authflow.test.tsx +123 -0
  231. package/src/rbac/__tests__/integration.navigation.test.tsx +72 -0
  232. package/src/rbac/__tests__/integration.securedata.test.tsx +92 -0
  233. package/src/rbac/__tests__/integration.smoke.test.tsx +73 -0
  234. package/src/rbac/__tests__/rbac-core.test.tsx +26 -22
  235. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +411 -0
  236. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +285 -0
  237. package/src/rbac/__tests__/rbac-functions.test.ts +655 -0
  238. package/src/rbac/__tests__/rbac-integration.test.ts +532 -0
  239. package/src/rbac/__tests__/scenarios.user-role.test.tsx +196 -0
  240. package/src/rbac/api.test.ts +6 -6
  241. package/src/rbac/api.ts +2 -2
  242. package/src/rbac/audit.test.ts +485 -0
  243. package/src/rbac/audit.ts +7 -1
  244. package/src/rbac/cache-invalidation.ts +318 -0
  245. package/src/rbac/cache.test.ts +286 -0
  246. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +559 -0
  247. package/src/rbac/components/EnhancedNavigationMenu.tsx +29 -23
  248. package/src/rbac/components/NavigationProvider.test.tsx +449 -0
  249. package/src/rbac/components/PagePermissionGuard.tsx +4 -4
  250. package/src/rbac/components/PagePermissionProvider.test.tsx +479 -0
  251. package/src/rbac/components/SecureDataProvider.test.tsx +511 -0
  252. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +159 -430
  253. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +4 -5
  254. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +112 -118
  255. package/src/rbac/config.test.ts +410 -0
  256. package/src/rbac/engine.test.simple.ts +237 -0
  257. package/src/rbac/engine.test.ts +233 -0
  258. package/src/rbac/engine.ts +37 -41
  259. package/src/rbac/examples/CompleteRBACExample.tsx +3 -3
  260. package/src/rbac/examples/EventBasedApp.tsx +4 -4
  261. package/src/rbac/hooks/useRBAC.simple.test.ts +16 -0
  262. package/src/rbac/hooks/useRBAC.test.ts +207 -455
  263. package/src/rbac/hooks/useRBAC.ts +30 -22
  264. package/src/rbac/permissions.test.ts +128 -0
  265. package/src/rbac/permissions.ts +56 -141
  266. package/src/rbac/providers/RBACProvider.tsx +1 -1
  267. package/src/rbac/secureClient.test.ts +444 -0
  268. package/src/rbac/security.test.ts +390 -0
  269. package/src/rbac/security.ts +1 -1
  270. package/src/rbac/types.test.ts +382 -0
  271. package/src/rbac/types.ts +2 -2
  272. package/src/styles/base.css +208 -0
  273. package/src/styles/core.css +0 -125
  274. package/src/styles/semantic.css +24 -0
  275. package/src/types/file-reference.ts +77 -0
  276. package/src/types/rbac-functions.ts +290 -0
  277. package/src/types/supabase.ts +10 -28
  278. package/src/types/unified.ts +4 -1
  279. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +81 -55
  280. package/src/utils/__tests__/lazyLoad.unit.test.tsx +21 -12
  281. package/src/utils/__tests__/organisationContext.unit.test.ts +13 -7
  282. package/src/utils/__tests__/performanceBudgets.unit.test.ts +3 -3
  283. package/src/utils/__tests__/sessionTracking.unit.test.ts +32 -12
  284. package/src/utils/appConfig.ts +1 -1
  285. package/src/utils/appIdResolver.test.ts +503 -0
  286. package/src/utils/appIdResolver.ts +1 -1
  287. package/src/utils/appNameResolver.test.ts +494 -0
  288. package/src/utils/appNameResolver.ts +3 -2
  289. package/src/utils/bundleAnalysis.ts +3 -3
  290. package/src/utils/debugLogger.ts +1 -1
  291. package/src/utils/file-reference.ts +263 -0
  292. package/src/utils/formatDate.test.ts +2 -2
  293. package/src/utils/organisationContext.test.ts +340 -0
  294. package/src/utils/organisationContext.ts +19 -6
  295. package/src/utils/performanceBudgets.ts +2 -2
  296. package/src/utils/permissionUtils.test.ts +393 -0
  297. package/src/utils/permissionUtils.ts +5 -2
  298. package/src/utils/secureDataAccess.test.ts +715 -0
  299. package/src/utils/secureDataAccess.ts +21 -5
  300. package/src/utils/sessionTracking.ts +34 -4
  301. package/src/utils/storage/__tests__/helpers.unit.test.ts +328 -0
  302. package/src/utils/storage/__tests__/index.unit.test.ts +16 -0
  303. package/src/utils/storage/helpers.ts +20 -25
  304. package/src/utils/storage/index.ts +29 -1
  305. package/src/vite-env.d.ts +17 -0
  306. package/dist/chunk-22KLBHPS.js.map +0 -1
  307. package/dist/chunk-7BNPOCLL.js.map +0 -1
  308. package/dist/chunk-BC3S53OZ.js.map +0 -1
  309. package/dist/chunk-GWSBHC4J.js.map +0 -1
  310. package/dist/chunk-MYP2EGHX.js.map +0 -1
  311. package/dist/chunk-MZBUOP4P.js.map +0 -1
  312. package/dist/chunk-NYUJ4FJR.js.map +0 -1
  313. package/dist/chunk-NZ655MWE.js.map +0 -1
  314. package/dist/chunk-SS3E6QLB.js.map +0 -1
  315. package/dist/chunk-TRIZ7IB7.js.map +0 -1
  316. package/dist/chunk-WJARTBCT.js.map +0 -1
  317. package/dist/chunk-YDJW5XTN.js.map +0 -1
  318. package/docs/print-components/README.md +0 -258
  319. package/docs/print-components/api-reference.md +0 -636
  320. package/docs/print-components/examples/README.md +0 -204
  321. package/docs/print-components/examples/basic-report.tsx +0 -92
  322. package/docs/print-components/examples/card-catalog.tsx +0 -149
  323. package/docs/print-components/examples/cover-page-report.tsx +0 -163
  324. package/docs/print-components/quick-start.md +0 -363
  325. package/src/components/PrintButton/PrintButton.tsx +0 -321
  326. package/src/components/PrintButton/PrintButtonGroup.tsx +0 -84
  327. package/src/components/PrintButton/PrintToolbar.tsx +0 -94
  328. package/src/components/PrintButton/__tests__/PrintButton.test.tsx +0 -271
  329. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +0 -438
  330. package/src/components/PrintButton/index.ts +0 -33
  331. package/src/components/PrintButton/types.ts +0 -173
  332. package/src/components/PrintCard/PrintCard.tsx +0 -154
  333. package/src/components/PrintCard/PrintCardContent.tsx +0 -57
  334. package/src/components/PrintCard/PrintCardFooter.tsx +0 -60
  335. package/src/components/PrintCard/PrintCardGrid.tsx +0 -91
  336. package/src/components/PrintCard/PrintCardHeader.tsx +0 -78
  337. package/src/components/PrintCard/PrintCardImage.tsx +0 -81
  338. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +0 -239
  339. package/src/components/PrintCard/index.ts +0 -34
  340. package/src/components/PrintCard/types.ts +0 -171
  341. package/src/components/PrintDataTable/PrintDataTable.tsx +0 -215
  342. package/src/components/PrintDataTable/PrintTableGroup.tsx +0 -90
  343. package/src/components/PrintDataTable/PrintTableRow.tsx +0 -76
  344. package/src/components/PrintDataTable/index.ts +0 -25
  345. package/src/components/PrintDataTable/types.ts +0 -67
  346. package/src/components/PrintFooter/PrintFooter.tsx +0 -183
  347. package/src/components/PrintFooter/PrintFooterContent.tsx +0 -71
  348. package/src/components/PrintFooter/PrintFooterInfo.tsx +0 -86
  349. package/src/components/PrintFooter/PrintPageNumber.tsx +0 -90
  350. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +0 -390
  351. package/src/components/PrintFooter/index.ts +0 -30
  352. package/src/components/PrintFooter/types.ts +0 -149
  353. package/src/components/PrintGrid/PrintGrid.tsx +0 -180
  354. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +0 -109
  355. package/src/components/PrintGrid/PrintGridContainer.tsx +0 -128
  356. package/src/components/PrintGrid/PrintGridItem.tsx +0 -220
  357. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +0 -359
  358. package/src/components/PrintGrid/index.ts +0 -31
  359. package/src/components/PrintGrid/types.ts +0 -159
  360. package/src/components/PrintHeader/PrintCoverHeader.tsx +0 -230
  361. package/src/components/PrintHeader/PrintHeader.tsx +0 -150
  362. package/src/components/PrintHeader/index.ts +0 -17
  363. package/src/components/PrintHeader/types.ts +0 -42
  364. package/src/components/PrintLayout/PrintLayout.tsx +0 -122
  365. package/src/components/PrintLayout/PrintLayoutContext.tsx +0 -66
  366. package/src/components/PrintLayout/PrintPageBreak.tsx +0 -52
  367. package/src/components/PrintLayout/examples/PrintShowcase.tsx +0 -230
  368. package/src/components/PrintLayout/index.ts +0 -19
  369. package/src/components/PrintLayout/types.ts +0 -37
  370. package/src/components/PrintPageBreak/PrintPageBreak.tsx +0 -120
  371. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +0 -90
  372. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +0 -112
  373. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +0 -279
  374. package/src/components/PrintPageBreak/index.ts +0 -23
  375. package/src/components/PrintPageBreak/types.ts +0 -94
  376. package/src/components/PrintSection/PrintColumn.tsx +0 -104
  377. package/src/components/PrintSection/PrintDivider.tsx +0 -101
  378. package/src/components/PrintSection/PrintSection.tsx +0 -129
  379. package/src/components/PrintSection/PrintSectionContent.tsx +0 -75
  380. package/src/components/PrintSection/PrintSectionHeader.tsx +0 -97
  381. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +0 -258
  382. package/src/components/PrintSection/index.ts +0 -33
  383. package/src/components/PrintSection/types.ts +0 -155
  384. package/src/components/PrintText/PrintText.tsx +0 -116
  385. package/src/components/PrintText/index.ts +0 -16
  386. package/src/components/PrintText/types.ts +0 -24
  387. package/src/rbac/__tests__/integration.test.tsx +0 -218
  388. package/src/utils/print/PrintDataProcessor.ts +0 -390
  389. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +0 -397
  390. package/src/utils/print/index.ts +0 -29
  391. package/src/utils/print/types.ts +0 -196
  392. package/src/utils/print/usePrintOptimization.ts +0 -272
  393. /package/dist/{DataTable-7FMFXA7A.js.map → DataTable-4T627QFJ.js.map} +0 -0
  394. /package/dist/{api-H5A3H4IR.js.map → api-LUNF5O6M.js.map} +0 -0
  395. /package/dist/{appNameResolver-7GHF5ED2.js.map → appNameResolver-UURKN7NF.js.map} +0 -0
  396. /package/dist/{audit-BUW3LMJB.js.map → audit-6TOCAMKO.js.map} +0 -0
  397. /package/dist/{chunk-NRK4AIHQ.js.map → chunk-KBRACSJI.js.map} +0 -0
  398. /package/dist/{chunk-6MTY77WU.js.map → chunk-TNMXZLDR.js.map} +0 -0
@@ -0,0 +1,393 @@
1
+ /**
2
+ * @file Permission Utils Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Utils/PermissionUtils
5
+ * @since 1.0.0
6
+ *
7
+ * Comprehensive tests for permission utility functions covering all critical functionality.
8
+ */
9
+
10
+ import { describe, it, expect } from 'vitest';
11
+ import {
12
+ transformPermissionMapToBoolean,
13
+ hasPermission,
14
+ hasAnyPermission,
15
+ hasAllPermissions
16
+ } from './permissionUtils';
17
+
18
+ describe('Permission Utils', () => {
19
+ describe('transformPermissionMapToBoolean', () => {
20
+ it('transforms string values correctly', () => {
21
+ const permissions = {
22
+ 'read:users': 'true',
23
+ 'write:users': 'false',
24
+ 'delete:users': '',
25
+ 'manage:users': 'yes',
26
+ 'view:users': 'no'
27
+ };
28
+
29
+ const result = transformPermissionMapToBoolean(permissions);
30
+
31
+ expect(result).toEqual({
32
+ 'read:users': true,
33
+ 'write:users': false,
34
+ 'delete:users': false,
35
+ 'manage:users': true,
36
+ 'view:users': true
37
+ });
38
+ });
39
+
40
+ it('transforms boolean values correctly', () => {
41
+ const permissions = {
42
+ 'read:users': true,
43
+ 'write:users': false,
44
+ 'delete:users': true,
45
+ 'manage:users': false
46
+ };
47
+
48
+ const result = transformPermissionMapToBoolean(permissions);
49
+
50
+ expect(result).toEqual({
51
+ 'read:users': true,
52
+ 'write:users': false,
53
+ 'delete:users': true,
54
+ 'manage:users': false
55
+ });
56
+ });
57
+
58
+ it('transforms mixed types correctly', () => {
59
+ const permissions = {
60
+ 'read:users': 'true',
61
+ 'write:users': false,
62
+ 'delete:users': 1,
63
+ 'manage:users': 0,
64
+ 'view:users': null,
65
+ 'edit:users': undefined
66
+ };
67
+
68
+ const result = transformPermissionMapToBoolean(permissions);
69
+
70
+ expect(result).toEqual({
71
+ 'read:users': true,
72
+ 'write:users': false,
73
+ 'delete:users': true,
74
+ 'manage:users': false,
75
+ 'view:users': false,
76
+ 'edit:users': false
77
+ });
78
+ });
79
+
80
+ it('handles empty object', () => {
81
+ const permissions = {};
82
+
83
+ const result = transformPermissionMapToBoolean(permissions);
84
+
85
+ expect(result).toEqual({});
86
+ });
87
+
88
+ it('handles null and undefined values', () => {
89
+ const permissions = {
90
+ 'read:users': null,
91
+ 'write:users': undefined,
92
+ 'delete:users': false,
93
+ 'manage:users': true
94
+ };
95
+
96
+ const result = transformPermissionMapToBoolean(permissions);
97
+
98
+ expect(result).toEqual({
99
+ 'read:users': false,
100
+ 'write:users': false,
101
+ 'delete:users': false,
102
+ 'manage:users': true
103
+ });
104
+ });
105
+
106
+ it('handles numeric values', () => {
107
+ const permissions = {
108
+ 'read:users': 1,
109
+ 'write:users': 0,
110
+ 'delete:users': -1,
111
+ 'manage:users': 42
112
+ };
113
+
114
+ const result = transformPermissionMapToBoolean(permissions);
115
+
116
+ expect(result).toEqual({
117
+ 'read:users': true,
118
+ 'write:users': false,
119
+ 'delete:users': true,
120
+ 'manage:users': true
121
+ });
122
+ });
123
+
124
+ it('handles case-insensitive string values', () => {
125
+ const permissions = {
126
+ 'read:users': 'TRUE',
127
+ 'write:users': 'FALSE',
128
+ 'delete:users': 'True',
129
+ 'manage:users': 'False'
130
+ };
131
+
132
+ const result = transformPermissionMapToBoolean(permissions);
133
+
134
+ expect(result).toEqual({
135
+ 'read:users': true,
136
+ 'write:users': false,
137
+ 'delete:users': true,
138
+ 'manage:users': false
139
+ });
140
+ });
141
+ });
142
+
143
+ describe('hasPermission', () => {
144
+ it('returns true for granted permission', () => {
145
+ const permissions = {
146
+ 'read:users': true,
147
+ 'write:users': false,
148
+ 'delete:users': true
149
+ };
150
+
151
+ expect(hasPermission(permissions, 'read:users')).toBe(true);
152
+ expect(hasPermission(permissions, 'delete:users')).toBe(true);
153
+ });
154
+
155
+ it('returns false for denied permission', () => {
156
+ const permissions = {
157
+ 'read:users': true,
158
+ 'write:users': false,
159
+ 'delete:users': true
160
+ };
161
+
162
+ expect(hasPermission(permissions, 'write:users')).toBe(false);
163
+ });
164
+
165
+ it('returns false for non-existent permission', () => {
166
+ const permissions = {
167
+ 'read:users': true,
168
+ 'write:users': false
169
+ };
170
+
171
+ expect(hasPermission(permissions, 'manage:users')).toBe(false);
172
+ });
173
+
174
+ it('handles empty permissions object', () => {
175
+ const permissions = {};
176
+
177
+ expect(hasPermission(permissions, 'read:users')).toBe(false);
178
+ });
179
+
180
+ it('handles null/undefined permission', () => {
181
+ const permissions = {
182
+ 'read:users': true,
183
+ 'write:users': false
184
+ };
185
+
186
+ expect(hasPermission(permissions, null as any)).toBe(false);
187
+ expect(hasPermission(permissions, undefined as any)).toBe(false);
188
+ });
189
+ });
190
+
191
+ describe('hasAnyPermission', () => {
192
+ it('returns true when at least one permission is granted', () => {
193
+ const permissions = {
194
+ 'read:users': true,
195
+ 'write:users': false,
196
+ 'delete:users': false
197
+ };
198
+
199
+ expect(hasAnyPermission(permissions, ['read:users', 'write:users'])).toBe(true);
200
+ expect(hasAnyPermission(permissions, ['write:users', 'delete:users', 'read:users'])).toBe(true);
201
+ });
202
+
203
+ it('returns false when no permissions are granted', () => {
204
+ const permissions = {
205
+ 'read:users': false,
206
+ 'write:users': false,
207
+ 'delete:users': false
208
+ };
209
+
210
+ expect(hasAnyPermission(permissions, ['read:users', 'write:users'])).toBe(false);
211
+ });
212
+
213
+ it('returns false for empty permission list', () => {
214
+ const permissions = {
215
+ 'read:users': true,
216
+ 'write:users': false
217
+ };
218
+
219
+ expect(hasAnyPermission(permissions, [])).toBe(false);
220
+ });
221
+
222
+ it('returns false when permission list contains non-existent permissions', () => {
223
+ const permissions = {
224
+ 'read:users': true,
225
+ 'write:users': false
226
+ };
227
+
228
+ expect(hasAnyPermission(permissions, ['manage:users', 'admin:users'])).toBe(false);
229
+ });
230
+
231
+ it('handles mixed permission states', () => {
232
+ const permissions = {
233
+ 'read:users': true,
234
+ 'write:users': false,
235
+ 'delete:users': true,
236
+ 'manage:users': false
237
+ };
238
+
239
+ expect(hasAnyPermission(permissions, ['read:users', 'write:users'])).toBe(true);
240
+ expect(hasAnyPermission(permissions, ['write:users', 'manage:users'])).toBe(false);
241
+ expect(hasAnyPermission(permissions, ['delete:users', 'manage:users'])).toBe(true);
242
+ });
243
+
244
+ it('handles null/undefined permission list', () => {
245
+ const permissions = {
246
+ 'read:users': true,
247
+ 'write:users': false
248
+ };
249
+
250
+ expect(hasAnyPermission(permissions, null as any)).toBe(false);
251
+ expect(hasAnyPermission(permissions, undefined as any)).toBe(false);
252
+ });
253
+ });
254
+
255
+ describe('hasAllPermissions', () => {
256
+ it('returns true when all permissions are granted', () => {
257
+ const permissions = {
258
+ 'read:users': true,
259
+ 'write:users': true,
260
+ 'delete:users': true
261
+ };
262
+
263
+ expect(hasAllPermissions(permissions, ['read:users', 'write:users', 'delete:users'])).toBe(true);
264
+ });
265
+
266
+ it('returns false when at least one permission is denied', () => {
267
+ const permissions = {
268
+ 'read:users': true,
269
+ 'write:users': false,
270
+ 'delete:users': true
271
+ };
272
+
273
+ expect(hasAllPermissions(permissions, ['read:users', 'write:users'])).toBe(false);
274
+ expect(hasAllPermissions(permissions, ['read:users', 'write:users', 'delete:users'])).toBe(false);
275
+ });
276
+
277
+ it('returns true for empty permission list', () => {
278
+ const permissions = {
279
+ 'read:users': true,
280
+ 'write:users': false
281
+ };
282
+
283
+ expect(hasAllPermissions(permissions, [])).toBe(true);
284
+ });
285
+
286
+ it('returns false when permission list contains non-existent permissions', () => {
287
+ const permissions = {
288
+ 'read:users': true,
289
+ 'write:users': true
290
+ };
291
+
292
+ expect(hasAllPermissions(permissions, ['read:users', 'manage:users'])).toBe(false);
293
+ });
294
+
295
+ it('handles mixed permission states', () => {
296
+ const permissions = {
297
+ 'read:users': true,
298
+ 'write:users': true,
299
+ 'delete:users': false,
300
+ 'manage:users': true
301
+ };
302
+
303
+ expect(hasAllPermissions(permissions, ['read:users', 'write:users'])).toBe(true);
304
+ expect(hasAllPermissions(permissions, ['read:users', 'write:users', 'delete:users'])).toBe(false);
305
+ expect(hasAllPermissions(permissions, ['read:users', 'manage:users'])).toBe(true);
306
+ });
307
+
308
+ it('handles null/undefined permission list', () => {
309
+ const permissions = {
310
+ 'read:users': true,
311
+ 'write:users': false
312
+ };
313
+
314
+ expect(hasAllPermissions(permissions, null as any)).toBe(false);
315
+ expect(hasAllPermissions(permissions, undefined as any)).toBe(false);
316
+ });
317
+ });
318
+
319
+ describe('Edge Cases', () => {
320
+ it('handles very large permission objects', () => {
321
+ const permissions: Record<string, boolean> = {};
322
+ for (let i = 0; i < 1000; i++) {
323
+ permissions[`permission:${i}`] = i % 2 === 0;
324
+ }
325
+
326
+ const result = transformPermissionMapToBoolean(permissions);
327
+ expect(Object.keys(result)).toHaveLength(1000);
328
+ expect(result['permission:0']).toBe(true);
329
+ expect(result['permission:1']).toBe(false);
330
+ });
331
+
332
+ it('handles special characters in permission names', () => {
333
+ const permissions = {
334
+ 'read:users@domain.com': true,
335
+ 'write:users#special': false,
336
+ 'delete:users$with$symbols': true,
337
+ 'manage:users.with.dots': false
338
+ };
339
+
340
+ const result = transformPermissionMapToBoolean(permissions);
341
+ expect(result['read:users@domain.com']).toBe(true);
342
+ expect(result['write:users#special']).toBe(false);
343
+ expect(result['delete:users$with$symbols']).toBe(true);
344
+ expect(result['manage:users.with.dots']).toBe(false);
345
+ });
346
+
347
+ it('handles unicode characters in permission names', () => {
348
+ const permissions = {
349
+ 'read:用户': true,
350
+ 'write:ユーザー': false,
351
+ 'delete:مستخدم': true
352
+ };
353
+
354
+ const result = transformPermissionMapToBoolean(permissions);
355
+ expect(result['read:用户']).toBe(true);
356
+ expect(result['write:ユーザー']).toBe(false);
357
+ expect(result['delete:مستخدم']).toBe(true);
358
+ });
359
+ });
360
+
361
+ describe('Type Safety', () => {
362
+ it('maintains type safety with TypeScript', () => {
363
+ const permissions: Record<string, boolean> = {
364
+ 'read:users': true,
365
+ 'write:users': false
366
+ };
367
+
368
+ // These should compile without errors
369
+ const hasRead = hasPermission(permissions, 'read:users');
370
+ const hasAny = hasAnyPermission(permissions, ['read:users', 'write:users']);
371
+ const hasAll = hasAllPermissions(permissions, ['read:users']);
372
+
373
+ expect(typeof hasRead).toBe('boolean');
374
+ expect(typeof hasAny).toBe('boolean');
375
+ expect(typeof hasAll).toBe('boolean');
376
+ });
377
+
378
+ it('handles mixed input types gracefully', () => {
379
+ const permissions = {
380
+ 'read:users': 'true',
381
+ 'write:users': 1,
382
+ 'delete:users': false,
383
+ 'manage:users': null
384
+ };
385
+
386
+ const result = transformPermissionMapToBoolean(permissions);
387
+ expect(typeof result['read:users']).toBe('boolean');
388
+ expect(typeof result['write:users']).toBe('boolean');
389
+ expect(typeof result['delete:users']).toBe('boolean');
390
+ expect(typeof result['manage:users']).toBe('boolean');
391
+ });
392
+ });
393
+ });
@@ -22,10 +22,13 @@ export function hasPermission(permissions: Record<string, boolean>, permission:
22
22
  return Boolean(permissions[permission]);
23
23
  }
24
24
 
25
- export function hasAnyPermission(permissions: Record<string, boolean>, permissionList: string[]): boolean {
25
+ export function hasAnyPermission(permissions: Record<string, boolean>, permissionList: string[] | null | undefined): boolean {
26
+ if (!permissionList || permissionList.length === 0) return false;
26
27
  return permissionList.some(permission => hasPermission(permissions, permission));
27
28
  }
28
29
 
29
- export function hasAllPermissions(permissions: Record<string, boolean>, permissionList: string[]): boolean {
30
+ export function hasAllPermissions(permissions: Record<string, boolean>, permissionList: string[] | null | undefined): boolean {
31
+ if (!permissionList) return false;
32
+ if (permissionList.length === 0) return true;
30
33
  return permissionList.every(permission => hasPermission(permissions, permission));
31
34
  }