@jmruthers/pace-core 0.6.1 → 0.6.3

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 (549) hide show
  1. package/CHANGELOG.md +88 -10
  2. package/cursor-rules/00-pace-core-compliance.mdc +46 -87
  3. package/cursor-rules/01-standards-compliance.mdc +16 -47
  4. package/cursor-rules/02-project-structure.mdc +4 -4
  5. package/cursor-rules/03-solid-principles.mdc +45 -164
  6. package/cursor-rules/04-testing-standards.mdc +22 -69
  7. package/cursor-rules/05-bug-reports-and-features.mdc +2 -2
  8. package/cursor-rules/06-code-quality.mdc +42 -125
  9. package/cursor-rules/07-tech-stack-compliance.mdc +33 -128
  10. package/cursor-rules/08-markup-quality.mdc +452 -0
  11. package/cursor-rules/CHANGELOG.md +18 -0
  12. package/cursor-rules/README.md +2 -1
  13. package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-Cb34EQs3.d.ts} +63 -1
  14. package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
  15. package/dist/{DataTable-DQ7RSOHE.js → DataTable-THFPBKTP.js} +12 -10
  16. package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DEMpysFR.d.ts} +394 -171
  17. package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CKvHP1MK.d.ts} +30 -8
  18. package/dist/{UnifiedAuthProvider-ATAP5UTR.js → UnifiedAuthProvider-KAGUYQ4J.js} +5 -4
  19. package/dist/{api-N774RPUA.js → api-IAGWF3ZG.js} +10 -10
  20. package/dist/{audit-B5P6FFIR.js → audit-V53FV5AG.js} +2 -2
  21. package/dist/{chunk-JBKQ3SAO.js → chunk-2T2IG7T7.js} +107 -57
  22. package/dist/chunk-2T2IG7T7.js.map +1 -0
  23. package/dist/{chunk-3QRJFVBR.js → chunk-6SOIHG6Z.js} +1 -1
  24. package/dist/chunk-6SOIHG6Z.js.map +1 -0
  25. package/dist/{chunk-3XTALGJF.js → chunk-6Z7LTB3D.js} +69 -240
  26. package/dist/chunk-6Z7LTB3D.js.map +1 -0
  27. package/dist/{chunk-4ZC4GX36.js → chunk-CNCQDFLN.js} +199 -46
  28. package/dist/chunk-CNCQDFLN.js.map +1 -0
  29. package/dist/chunk-DGUM43GV.js +11 -0
  30. package/dist/{chunk-BYFSK72L.js → chunk-DWUBLJJM.js} +361 -187
  31. package/dist/chunk-DWUBLJJM.js.map +1 -0
  32. package/dist/{chunk-LXQLPRQ2.js → chunk-FFQEQTNW.js} +6 -8
  33. package/dist/chunk-FFQEQTNW.js.map +1 -0
  34. package/dist/chunk-FMUCXFII.js +76 -0
  35. package/dist/chunk-FMUCXFII.js.map +1 -0
  36. package/dist/{chunk-4N5C5XZU.js → chunk-HFZBI76P.js} +4 -4
  37. package/dist/chunk-HFZBI76P.js.map +1 -0
  38. package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
  39. package/dist/chunk-L4OXEN46.js.map +1 -0
  40. package/dist/{chunk-R77UEZ4E.js → chunk-M43Y4SSO.js} +1 -1
  41. package/dist/chunk-M43Y4SSO.js.map +1 -0
  42. package/dist/{chunk-I7PSE6JW.js → chunk-M7MPQISP.js} +3 -76
  43. package/dist/chunk-M7MPQISP.js.map +1 -0
  44. package/dist/chunk-PQBSKX33.js +7793 -0
  45. package/dist/chunk-PQBSKX33.js.map +1 -0
  46. package/dist/chunk-QRPVRXYT.js +226 -0
  47. package/dist/chunk-QRPVRXYT.js.map +1 -0
  48. package/dist/{chunk-KNC55RTG.js → chunk-RWEBCB47.js} +194 -416
  49. package/dist/chunk-RWEBCB47.js.map +1 -0
  50. package/dist/{chunk-XM25TVIE.js → chunk-YDQHOZNA.js} +843 -388
  51. package/dist/chunk-YDQHOZNA.js.map +1 -0
  52. package/dist/{chunk-GLK6VM3F.js → chunk-ZNIWI3UC.js} +739 -737
  53. package/dist/chunk-ZNIWI3UC.js.map +1 -0
  54. package/dist/components.d.ts +5 -5
  55. package/dist/components.js +18 -16
  56. package/dist/components.js.map +1 -1
  57. package/dist/contextValidator-3JNZKUTX.js +9 -0
  58. package/dist/contextValidator-3JNZKUTX.js.map +1 -0
  59. package/dist/eslint-rules/pace-core-compliance.cjs +106 -0
  60. package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
  61. package/dist/hooks.d.ts +55 -122
  62. package/dist/hooks.js +10 -13
  63. package/dist/hooks.js.map +1 -1
  64. package/dist/index.d.ts +60 -13
  65. package/dist/index.js +30 -25
  66. package/dist/index.js.map +1 -1
  67. package/dist/providers.d.ts +21 -3
  68. package/dist/providers.js +4 -3
  69. package/dist/rbac/index.d.ts +210 -139
  70. package/dist/rbac/index.js +17 -13
  71. package/dist/styles/index.js +1 -1
  72. package/dist/theming/runtime.d.ts +1 -13
  73. package/dist/theming/runtime.js +2 -2
  74. package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
  75. package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
  76. package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
  77. package/dist/types.d.ts +2 -2
  78. package/dist/types.js +1 -1
  79. package/dist/{usePublicRouteParams-BJAlWfuJ.d.ts → usePublicRouteParams-i3qtoBgg.d.ts} +38 -17
  80. package/dist/utils.d.ts +4 -5
  81. package/dist/utils.js +17 -19
  82. package/dist/utils.js.map +1 -1
  83. package/docs/api/README.md +21 -17
  84. package/docs/api/modules.md +4191 -2967
  85. package/docs/architecture/database-schema-requirements.md +161 -0
  86. package/docs/components/context-selector.md +126 -0
  87. package/docs/core-concepts/rbac-system.md +3 -3
  88. package/docs/documentation-index.md +2 -4
  89. package/docs/getting-started/cursor-rules.md +2 -1
  90. package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
  91. package/docs/migration/MIGRATION_GUIDE.md +2 -24
  92. package/docs/migration/RBAC_SCOPE_MIGRATION.md +385 -0
  93. package/docs/migration/README.md +52 -6
  94. package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
  95. package/docs/migration/database-changes-december-2025.md +3 -3
  96. package/docs/pace-mint-fix-auto-selection.md +218 -0
  97. package/docs/pace-mint-rbac-setup.md +391 -0
  98. package/docs/rbac/event-based-apps.md +1 -1
  99. package/docs/rbac/getting-started.md +1 -1
  100. package/docs/rbac/quick-start.md +1 -1
  101. package/docs/rbac/secure-client-protection.md +330 -0
  102. package/docs/standards/README.md +1 -0
  103. package/package.json +4 -3
  104. package/scripts/audit/core/checks/accessibility.cjs +197 -0
  105. package/scripts/audit/core/checks/api-usage.cjs +191 -0
  106. package/scripts/audit/core/checks/bundle.cjs +142 -0
  107. package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +784 -685
  108. package/scripts/audit/core/checks/config.cjs +54 -0
  109. package/scripts/audit/core/checks/coverage.cjs +84 -0
  110. package/scripts/audit/core/checks/dependencies.cjs +985 -0
  111. package/scripts/audit/core/checks/documentation.cjs +268 -0
  112. package/scripts/audit/core/checks/environment.cjs +116 -0
  113. package/scripts/audit/core/checks/error-handling.cjs +340 -0
  114. package/scripts/audit/core/checks/forms.cjs +172 -0
  115. package/scripts/audit/core/checks/heuristics.cjs +68 -0
  116. package/scripts/audit/core/checks/hooks.cjs +334 -0
  117. package/scripts/audit/core/checks/imports.cjs +244 -0
  118. package/scripts/audit/core/checks/performance.cjs +325 -0
  119. package/scripts/audit/core/checks/routes.cjs +117 -0
  120. package/scripts/audit/core/checks/state.cjs +130 -0
  121. package/scripts/audit/core/checks/structure.cjs +65 -0
  122. package/scripts/audit/core/checks/style.cjs +584 -0
  123. package/scripts/audit/core/checks/testing.cjs +122 -0
  124. package/scripts/audit/core/checks/typescript.cjs +61 -0
  125. package/scripts/audit/core/scanner.cjs +199 -0
  126. package/scripts/audit/core/utils.cjs +137 -0
  127. package/scripts/audit/index.cjs +223 -0
  128. package/scripts/audit/reporters/console.cjs +151 -0
  129. package/scripts/audit/reporters/json.cjs +54 -0
  130. package/scripts/audit/reporters/markdown.cjs +124 -0
  131. package/scripts/audit-consuming-app.cjs +61 -936
  132. package/scripts/build-docs/build-decision.js +240 -0
  133. package/scripts/build-docs/cache-utils.js +105 -0
  134. package/scripts/build-docs/content-normalization.js +150 -0
  135. package/scripts/build-docs/file-utils.js +105 -0
  136. package/scripts/build-docs/git-utils.js +86 -0
  137. package/scripts/build-docs/hash-utils.js +116 -0
  138. package/scripts/build-docs/typedoc-runner.js +220 -0
  139. package/scripts/build-docs-incremental.js +77 -913
  140. package/scripts/utils/command-runner.js +16 -11
  141. package/scripts/validate-formats.js +61 -56
  142. package/scripts/validate-master.js +74 -69
  143. package/scripts/validate-pre-publish.js +70 -65
  144. package/src/__tests__/hooks/usePermissions.test.ts +2 -2
  145. package/src/components/Alert/Alert.test.tsx +12 -18
  146. package/src/components/Alert/Alert.tsx +5 -7
  147. package/src/components/Avatar/Avatar.test.tsx +4 -4
  148. package/src/components/Badge/Badge.tsx +14 -0
  149. package/src/components/Button/Button.tsx +22 -0
  150. package/src/components/Calendar/Calendar.tsx +8 -2
  151. package/src/components/Card/Card.tsx +4 -0
  152. package/src/components/Checkbox/Checkbox.test.tsx +12 -12
  153. package/src/components/Checkbox/Checkbox.tsx +2 -2
  154. package/src/components/ContextSelector/ContextSelector.tsx +384 -0
  155. package/src/components/ContextSelector/index.ts +3 -0
  156. package/src/components/DataTable/DataTable.tsx +38 -4
  157. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
  158. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +18 -4
  159. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
  160. package/src/components/DataTable/components/AccessDeniedPage.tsx +16 -25
  161. package/src/components/DataTable/components/ActionButtons.tsx +10 -7
  162. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
  163. package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
  164. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
  165. package/src/components/DataTable/components/DataTableBody.tsx +8 -0
  166. package/src/components/DataTable/components/DataTableCore.tsx +196 -554
  167. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
  168. package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
  169. package/src/components/DataTable/components/DataTableModals.tsx +8 -0
  170. package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
  171. package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
  172. package/src/components/DataTable/components/EditFields.tsx +307 -0
  173. package/src/components/DataTable/components/EditableRow.tsx +8 -0
  174. package/src/components/DataTable/components/EmptyState.tsx +10 -0
  175. package/src/components/DataTable/components/FilterRow.tsx +12 -0
  176. package/src/components/DataTable/components/GroupHeader.tsx +12 -0
  177. package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
  178. package/src/components/DataTable/components/ImportModal.tsx +7 -0
  179. package/src/components/DataTable/components/LoadingState.tsx +6 -0
  180. package/src/components/DataTable/components/PaginationControls.tsx +16 -1
  181. package/src/components/DataTable/components/RowComponent.tsx +391 -0
  182. package/src/components/DataTable/components/UnifiedTableBody.tsx +63 -851
  183. package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
  184. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
  185. package/src/components/DataTable/components/cellValueUtils.ts +40 -0
  186. package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
  187. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
  188. package/src/components/DataTable/context/DataTableContext.tsx +50 -0
  189. package/src/components/DataTable/core/ColumnFactory.ts +31 -0
  190. package/src/components/DataTable/core/DataTableContext.tsx +32 -1
  191. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
  192. package/src/components/DataTable/hooks/useColumnReordering.ts +12 -0
  193. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
  194. package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
  195. package/src/components/DataTable/hooks/useDataTablePermissions.ts +127 -33
  196. package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
  197. package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
  198. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
  199. package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
  200. package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
  201. package/src/components/DataTable/styles.ts +6 -6
  202. package/src/components/DataTable/types.ts +6 -10
  203. package/src/components/DataTable/utils/a11yUtils.ts +7 -0
  204. package/src/components/DataTable/utils/debugTools.ts +18 -113
  205. package/src/components/DataTable/utils/errorHandling.ts +12 -0
  206. package/src/components/DataTable/utils/exportUtils.ts +9 -0
  207. package/src/components/DataTable/utils/flexibleImport.ts +12 -48
  208. package/src/components/DataTable/utils/paginationUtils.ts +8 -0
  209. package/src/components/DataTable/utils/performanceUtils.ts +5 -1
  210. package/src/components/Dialog/Dialog.tsx +31 -3
  211. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
  212. package/src/components/ErrorBoundary/ErrorBoundary.tsx +45 -5
  213. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
  214. package/src/components/ErrorBoundary/index.ts +27 -2
  215. package/src/components/FileDisplay/FileDisplay.tsx +74 -28
  216. package/src/components/FileUpload/FileUpload.tsx +22 -2
  217. package/src/components/Footer/Footer.test.tsx +16 -16
  218. package/src/components/Footer/Footer.tsx +14 -11
  219. package/src/components/Form/Form.tsx +1 -0
  220. package/src/components/Header/Header.test.tsx +43 -73
  221. package/src/components/Header/Header.tsx +59 -49
  222. package/src/components/Input/Input.test.tsx +2 -2
  223. package/src/components/Input/Input.tsx +8 -4
  224. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
  225. package/src/components/LoginForm/LoginForm.tsx +4 -0
  226. package/src/components/NavigationMenu/NavigationMenu.tsx +14 -513
  227. package/src/components/NavigationMenu/types.ts +56 -0
  228. package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
  229. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +10 -19
  230. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +2 -2
  231. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +5 -5
  232. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +13 -11
  233. package/src/components/PaceAppLayout/PaceAppLayout.tsx +167 -44
  234. package/src/components/PaceAppLayout/README.md +14 -17
  235. package/src/components/PaceAppLayout/test-setup.tsx +3 -4
  236. package/src/components/PaceLoginPage/PaceLoginPage.tsx +3 -0
  237. package/src/components/PasswordChange/PasswordChangeForm.tsx +9 -0
  238. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
  239. package/src/components/PublicLayout/PublicPageLayout.tsx +2 -5
  240. package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
  241. package/src/components/Select/Select.tsx +80 -434
  242. package/src/components/Select/context.ts +23 -0
  243. package/src/components/Select/hooks/useSelectEvents.ts +87 -0
  244. package/src/components/Select/hooks/useSelectSearch.ts +91 -0
  245. package/src/components/Select/hooks/useSelectState.ts +104 -0
  246. package/src/components/Select/index.ts +9 -1
  247. package/src/components/Select/types.ts +123 -0
  248. package/src/components/Select/utils/text.ts +26 -0
  249. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +4 -5
  250. package/src/components/Switch/Switch.tsx +4 -4
  251. package/src/components/Tabs/Tabs.tsx +1 -1
  252. package/src/components/Toast/Toast.tsx +4 -0
  253. package/src/components/Tooltip/Tooltip.tsx +2 -2
  254. package/src/components/UserMenu/UserMenu.test.tsx +24 -11
  255. package/src/components/UserMenu/UserMenu.tsx +21 -18
  256. package/src/components/index.ts +7 -7
  257. package/src/eslint-rules/pace-core-compliance.cjs +106 -0
  258. package/src/hooks/__tests__/index.unit.test.ts +2 -5
  259. package/src/hooks/__tests__/useAppConfig.unit.test.ts +4 -98
  260. package/src/hooks/index.ts +1 -2
  261. package/src/hooks/public/usePublicEvent.ts +4 -0
  262. package/src/hooks/public/usePublicEventLogo.ts +4 -0
  263. package/src/hooks/public/usePublicFileDisplay.ts +4 -0
  264. package/src/hooks/public/usePublicRouteParams.ts +4 -0
  265. package/src/hooks/services/useAuth.ts +32 -0
  266. package/src/hooks/services/useCurrentEvent.ts +6 -0
  267. package/src/hooks/services/useCurrentOrganisation.ts +6 -0
  268. package/src/hooks/useAppConfig.ts +15 -30
  269. package/src/hooks/useDebounce.ts +9 -0
  270. package/src/hooks/useEventTheme.ts +6 -0
  271. package/src/hooks/useFileDisplay.ts +81 -50
  272. package/src/hooks/useFileReference.ts +25 -7
  273. package/src/hooks/useFileUrl.ts +11 -1
  274. package/src/hooks/useFocusManagement.ts +14 -0
  275. package/src/hooks/useFocusTrap.ts +3 -0
  276. package/src/hooks/useInactivityTracker.ts +3 -0
  277. package/src/hooks/useKeyboardShortcuts.ts +4 -0
  278. package/src/hooks/useOrganisationPermissions.ts +4 -0
  279. package/src/hooks/useOrganisationSecurity.ts +4 -0
  280. package/src/hooks/usePerformanceMonitor.ts +4 -0
  281. package/src/hooks/usePermissionCache.ts +7 -0
  282. package/src/hooks/useQueryCache.ts +12 -1
  283. package/src/hooks/useSessionRestoration.ts +4 -0
  284. package/src/hooks/useStorage.ts +4 -0
  285. package/src/hooks/useToast.ts +1 -1
  286. package/src/index.ts +6 -6
  287. package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
  288. package/src/providers/services/AuthServiceProvider.tsx +35 -7
  289. package/src/providers/services/EventServiceProvider.tsx +51 -5
  290. package/src/providers/services/InactivityServiceProvider.tsx +18 -0
  291. package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
  292. package/src/providers/services/UnifiedAuthProvider.tsx +126 -134
  293. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +29 -13
  294. package/src/rbac/README.md +1 -1
  295. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +1 -1
  296. package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
  297. package/src/rbac/adapters.tsx +12 -3
  298. package/src/rbac/api.test.ts +59 -51
  299. package/src/rbac/api.ts +246 -167
  300. package/src/rbac/components/NavigationProvider.tsx +4 -1
  301. package/src/rbac/components/PagePermissionGuard.tsx +185 -17
  302. package/src/rbac/components/RoleBasedRouter.tsx +5 -1
  303. package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
  304. package/src/rbac/components/SecureDataProvider.tsx +20 -5
  305. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
  306. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
  307. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
  308. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
  309. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
  310. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
  311. package/src/rbac/engine.ts +38 -14
  312. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +32 -21
  313. package/src/rbac/hooks/permissions/index.ts +7 -0
  314. package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
  315. package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
  316. package/src/rbac/hooks/permissions/useCan.ts +377 -0
  317. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
  318. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
  319. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
  320. package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
  321. package/src/rbac/hooks/useCan.test.ts +64 -66
  322. package/src/rbac/hooks/usePermissions.ts +14 -995
  323. package/src/rbac/hooks/useRBAC.test.ts +1 -5
  324. package/src/rbac/hooks/useRBAC.ts +36 -37
  325. package/src/rbac/hooks/useResolvedScope.test.ts +120 -35
  326. package/src/rbac/hooks/useResolvedScope.ts +35 -40
  327. package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
  328. package/src/rbac/hooks/useResourcePermissions.ts +14 -4
  329. package/src/rbac/hooks/useSecureSupabase.ts +27 -7
  330. package/src/rbac/index.ts +7 -0
  331. package/src/rbac/permissions.ts +0 -30
  332. package/src/rbac/secureClient.test.ts +22 -18
  333. package/src/rbac/secureClient.ts +294 -68
  334. package/src/rbac/security.ts +0 -17
  335. package/src/rbac/types.ts +9 -0
  336. package/src/rbac/utils/__tests__/contextValidator.test.ts +64 -86
  337. package/src/rbac/utils/clientSecurity.ts +93 -0
  338. package/src/rbac/utils/contextValidator.ts +77 -168
  339. package/src/services/AuthService.ts +39 -7
  340. package/src/services/EventService.ts +186 -54
  341. package/src/services/OrganisationService.ts +81 -14
  342. package/src/services/__tests__/EventService.test.ts +1 -2
  343. package/src/services/base/BaseService.ts +3 -0
  344. package/src/theming/__tests__/parseEventColours.test.ts +6 -9
  345. package/src/theming/parseEventColours.ts +5 -19
  346. package/src/types/vitest-globals.d.ts +51 -26
  347. package/src/utils/__mocks__/supabaseMock.ts +1 -3
  348. package/src/utils/__tests__/formatting.unit.test.ts +4 -4
  349. package/src/utils/__tests__/index.unit.test.ts +2 -2
  350. package/src/utils/audit/audit.ts +0 -3
  351. package/src/utils/core/cn.ts +1 -1
  352. package/src/utils/dynamic/dynamicUtils.ts +7 -4
  353. package/src/utils/file-reference/index.ts +53 -1
  354. package/src/utils/formatting/formatting.ts +8 -18
  355. package/src/utils/index.ts +0 -1
  356. package/dist/chunk-3QRJFVBR.js.map +0 -1
  357. package/dist/chunk-3XTALGJF.js.map +0 -1
  358. package/dist/chunk-4N5C5XZU.js.map +0 -1
  359. package/dist/chunk-4ZC4GX36.js.map +0 -1
  360. package/dist/chunk-7D4SUZUM.js +0 -38
  361. package/dist/chunk-BYFSK72L.js.map +0 -1
  362. package/dist/chunk-EXUD6RNJ.js +0 -451
  363. package/dist/chunk-EXUD6RNJ.js.map +0 -1
  364. package/dist/chunk-GLK6VM3F.js.map +0 -1
  365. package/dist/chunk-I7PSE6JW.js.map +0 -1
  366. package/dist/chunk-JBKQ3SAO.js.map +0 -1
  367. package/dist/chunk-KNC55RTG.js.map +0 -1
  368. package/dist/chunk-LXQLPRQ2.js.map +0 -1
  369. package/dist/chunk-R77UEZ4E.js.map +0 -1
  370. package/dist/chunk-SQGMNID3.js.map +0 -1
  371. package/dist/chunk-T33XF5ZC.js +0 -12922
  372. package/dist/chunk-T33XF5ZC.js.map +0 -1
  373. package/dist/chunk-XM25TVIE.js.map +0 -1
  374. package/docs/api/classes/ColumnFactory.md +0 -243
  375. package/docs/api/classes/ErrorBoundary.md +0 -144
  376. package/docs/api/classes/InvalidScopeError.md +0 -73
  377. package/docs/api/classes/Logger.md +0 -178
  378. package/docs/api/classes/MissingUserContextError.md +0 -66
  379. package/docs/api/classes/OrganisationContextRequiredError.md +0 -66
  380. package/docs/api/classes/PermissionDeniedError.md +0 -73
  381. package/docs/api/classes/RBACAuditManager.md +0 -297
  382. package/docs/api/classes/RBACCache.md +0 -322
  383. package/docs/api/classes/RBACEngine.md +0 -171
  384. package/docs/api/classes/RBACError.md +0 -76
  385. package/docs/api/classes/RBACNotInitializedError.md +0 -66
  386. package/docs/api/classes/SecureSupabaseClient.md +0 -160
  387. package/docs/api/classes/StorageUtils.md +0 -328
  388. package/docs/api/enums/FileCategory.md +0 -184
  389. package/docs/api/enums/LogLevel.md +0 -54
  390. package/docs/api/enums/RBACErrorCode.md +0 -228
  391. package/docs/api/enums/RPCFunction.md +0 -118
  392. package/docs/api/interfaces/AddressFieldProps.md +0 -241
  393. package/docs/api/interfaces/AddressFieldRef.md +0 -94
  394. package/docs/api/interfaces/AggregateConfig.md +0 -43
  395. package/docs/api/interfaces/AutocompleteOptions.md +0 -75
  396. package/docs/api/interfaces/AvatarProps.md +0 -128
  397. package/docs/api/interfaces/BadgeProps.md +0 -27
  398. package/docs/api/interfaces/ButtonProps.md +0 -53
  399. package/docs/api/interfaces/CalendarProps.md +0 -70
  400. package/docs/api/interfaces/CardProps.md +0 -66
  401. package/docs/api/interfaces/ColorPalette.md +0 -7
  402. package/docs/api/interfaces/ColorShade.md +0 -66
  403. package/docs/api/interfaces/ComplianceResult.md +0 -30
  404. package/docs/api/interfaces/DataAccessRecord.md +0 -96
  405. package/docs/api/interfaces/DataRecord.md +0 -11
  406. package/docs/api/interfaces/DataTableAction.md +0 -249
  407. package/docs/api/interfaces/DataTableColumn.md +0 -504
  408. package/docs/api/interfaces/DataTableProps.md +0 -625
  409. package/docs/api/interfaces/DataTableToolbarButton.md +0 -96
  410. package/docs/api/interfaces/DatabaseComplianceResult.md +0 -85
  411. package/docs/api/interfaces/DatabaseIssue.md +0 -41
  412. package/docs/api/interfaces/EmptyStateConfig.md +0 -61
  413. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +0 -235
  414. package/docs/api/interfaces/EventAppRoleData.md +0 -71
  415. package/docs/api/interfaces/ExportColumn.md +0 -90
  416. package/docs/api/interfaces/ExportOptions.md +0 -126
  417. package/docs/api/interfaces/FileDisplayProps.md +0 -249
  418. package/docs/api/interfaces/FileMetadata.md +0 -129
  419. package/docs/api/interfaces/FileReference.md +0 -118
  420. package/docs/api/interfaces/FileSizeLimits.md +0 -7
  421. package/docs/api/interfaces/FileUploadOptions.md +0 -139
  422. package/docs/api/interfaces/FileUploadProps.md +0 -293
  423. package/docs/api/interfaces/FooterProps.md +0 -105
  424. package/docs/api/interfaces/FormFieldProps.md +0 -166
  425. package/docs/api/interfaces/FormProps.md +0 -113
  426. package/docs/api/interfaces/GrantEventAppRoleParams.md +0 -122
  427. package/docs/api/interfaces/InactivityWarningModalProps.md +0 -115
  428. package/docs/api/interfaces/InputProps.md +0 -53
  429. package/docs/api/interfaces/LabelProps.md +0 -107
  430. package/docs/api/interfaces/LoggerConfig.md +0 -62
  431. package/docs/api/interfaces/LoginFormProps.md +0 -184
  432. package/docs/api/interfaces/NavigationAccessRecord.md +0 -107
  433. package/docs/api/interfaces/NavigationContextType.md +0 -164
  434. package/docs/api/interfaces/NavigationGuardProps.md +0 -139
  435. package/docs/api/interfaces/NavigationItem.md +0 -120
  436. package/docs/api/interfaces/NavigationMenuProps.md +0 -221
  437. package/docs/api/interfaces/NavigationProviderProps.md +0 -117
  438. package/docs/api/interfaces/Organisation.md +0 -140
  439. package/docs/api/interfaces/OrganisationContextType.md +0 -388
  440. package/docs/api/interfaces/OrganisationMembership.md +0 -140
  441. package/docs/api/interfaces/OrganisationProviderProps.md +0 -76
  442. package/docs/api/interfaces/OrganisationSecurityError.md +0 -62
  443. package/docs/api/interfaces/PaceAppLayoutProps.md +0 -406
  444. package/docs/api/interfaces/PaceLoginPageProps.md +0 -47
  445. package/docs/api/interfaces/PageAccessRecord.md +0 -85
  446. package/docs/api/interfaces/PagePermissionContextType.md +0 -140
  447. package/docs/api/interfaces/PagePermissionGuardProps.md +0 -153
  448. package/docs/api/interfaces/PagePermissionProviderProps.md +0 -119
  449. package/docs/api/interfaces/PaletteData.md +0 -41
  450. package/docs/api/interfaces/ParsedAddress.md +0 -120
  451. package/docs/api/interfaces/PermissionEnforcerProps.md +0 -153
  452. package/docs/api/interfaces/ProgressProps.md +0 -42
  453. package/docs/api/interfaces/ProtectedRouteProps.md +0 -97
  454. package/docs/api/interfaces/PublicPageFooterProps.md +0 -112
  455. package/docs/api/interfaces/PublicPageHeaderProps.md +0 -125
  456. package/docs/api/interfaces/PublicPageLayoutProps.md +0 -198
  457. package/docs/api/interfaces/QuickFix.md +0 -52
  458. package/docs/api/interfaces/RBACAccessValidateParams.md +0 -52
  459. package/docs/api/interfaces/RBACAccessValidateResult.md +0 -41
  460. package/docs/api/interfaces/RBACAuditLogParams.md +0 -85
  461. package/docs/api/interfaces/RBACAuditLogResult.md +0 -52
  462. package/docs/api/interfaces/RBACConfig.md +0 -133
  463. package/docs/api/interfaces/RBACContext.md +0 -52
  464. package/docs/api/interfaces/RBACLogger.md +0 -112
  465. package/docs/api/interfaces/RBACPageAccessCheckParams.md +0 -74
  466. package/docs/api/interfaces/RBACPerformanceMetrics.md +0 -138
  467. package/docs/api/interfaces/RBACPermissionCheckParams.md +0 -74
  468. package/docs/api/interfaces/RBACPermissionCheckResult.md +0 -52
  469. package/docs/api/interfaces/RBACPermissionsGetParams.md +0 -63
  470. package/docs/api/interfaces/RBACPermissionsGetResult.md +0 -63
  471. package/docs/api/interfaces/RBACResult.md +0 -58
  472. package/docs/api/interfaces/RBACRoleGrantParams.md +0 -63
  473. package/docs/api/interfaces/RBACRoleGrantResult.md +0 -52
  474. package/docs/api/interfaces/RBACRoleRevokeParams.md +0 -63
  475. package/docs/api/interfaces/RBACRoleRevokeResult.md +0 -52
  476. package/docs/api/interfaces/RBACRoleValidateParams.md +0 -52
  477. package/docs/api/interfaces/RBACRoleValidateResult.md +0 -63
  478. package/docs/api/interfaces/RBACRolesListParams.md +0 -52
  479. package/docs/api/interfaces/RBACRolesListResult.md +0 -74
  480. package/docs/api/interfaces/RBACSessionTrackParams.md +0 -74
  481. package/docs/api/interfaces/RBACSessionTrackResult.md +0 -52
  482. package/docs/api/interfaces/ResourcePermissions.md +0 -155
  483. package/docs/api/interfaces/RevokeEventAppRoleParams.md +0 -100
  484. package/docs/api/interfaces/RoleBasedRouterContextType.md +0 -151
  485. package/docs/api/interfaces/RoleBasedRouterProps.md +0 -156
  486. package/docs/api/interfaces/RoleManagementResult.md +0 -52
  487. package/docs/api/interfaces/RouteAccessRecord.md +0 -107
  488. package/docs/api/interfaces/RouteConfig.md +0 -134
  489. package/docs/api/interfaces/RuntimeComplianceResult.md +0 -55
  490. package/docs/api/interfaces/SecureDataContextType.md +0 -168
  491. package/docs/api/interfaces/SecureDataProviderProps.md +0 -132
  492. package/docs/api/interfaces/SessionRestorationLoaderProps.md +0 -34
  493. package/docs/api/interfaces/SetupIssue.md +0 -41
  494. package/docs/api/interfaces/StorageConfig.md +0 -41
  495. package/docs/api/interfaces/StorageFileInfo.md +0 -74
  496. package/docs/api/interfaces/StorageFileMetadata.md +0 -151
  497. package/docs/api/interfaces/StorageListOptions.md +0 -99
  498. package/docs/api/interfaces/StorageListResult.md +0 -41
  499. package/docs/api/interfaces/StorageUploadOptions.md +0 -101
  500. package/docs/api/interfaces/StorageUploadResult.md +0 -63
  501. package/docs/api/interfaces/StorageUrlOptions.md +0 -60
  502. package/docs/api/interfaces/StyleImport.md +0 -19
  503. package/docs/api/interfaces/SwitchProps.md +0 -34
  504. package/docs/api/interfaces/TabsContentProps.md +0 -9
  505. package/docs/api/interfaces/TabsListProps.md +0 -9
  506. package/docs/api/interfaces/TabsProps.md +0 -9
  507. package/docs/api/interfaces/TabsTriggerProps.md +0 -50
  508. package/docs/api/interfaces/TextareaProps.md +0 -53
  509. package/docs/api/interfaces/ToastActionElement.md +0 -9
  510. package/docs/api/interfaces/ToastProps.md +0 -9
  511. package/docs/api/interfaces/UnifiedAuthContextType.md +0 -820
  512. package/docs/api/interfaces/UnifiedAuthProviderProps.md +0 -171
  513. package/docs/api/interfaces/UseFormDialogOptions.md +0 -62
  514. package/docs/api/interfaces/UseFormDialogReturn.md +0 -117
  515. package/docs/api/interfaces/UseInactivityTrackerOptions.md +0 -136
  516. package/docs/api/interfaces/UseInactivityTrackerReturn.md +0 -123
  517. package/docs/api/interfaces/UsePublicEventLogoOptions.md +0 -87
  518. package/docs/api/interfaces/UsePublicEventLogoReturn.md +0 -81
  519. package/docs/api/interfaces/UsePublicEventOptions.md +0 -34
  520. package/docs/api/interfaces/UsePublicEventReturn.md +0 -68
  521. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +0 -47
  522. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +0 -120
  523. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +0 -94
  524. package/docs/api/interfaces/UseResolvedScopeOptions.md +0 -47
  525. package/docs/api/interfaces/UseResolvedScopeReturn.md +0 -47
  526. package/docs/api/interfaces/UseResourcePermissionsOptions.md +0 -34
  527. package/docs/api/interfaces/UserEventAccess.md +0 -118
  528. package/docs/api/interfaces/UserMenuProps.md +0 -86
  529. package/docs/api/interfaces/UserProfile.md +0 -63
  530. package/docs/migration/quick-migration-guide.md +0 -356
  531. package/docs/migration/service-architecture.md +0 -281
  532. package/src/components/EventSelector/EventSelector.test.tsx +0 -720
  533. package/src/components/EventSelector/EventSelector.tsx +0 -420
  534. package/src/components/EventSelector/index.ts +0 -3
  535. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +0 -784
  536. package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -324
  537. package/src/components/OrganisationSelector/index.ts +0 -9
  538. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
  539. package/src/hooks/useSecureDataAccess.test.ts +0 -559
  540. package/src/hooks/useSecureDataAccess.ts +0 -681
  541. /package/dist/{DataTable-DQ7RSOHE.js.map → DataTable-THFPBKTP.js.map} +0 -0
  542. /package/dist/{UnifiedAuthProvider-ATAP5UTR.js.map → UnifiedAuthProvider-KAGUYQ4J.js.map} +0 -0
  543. /package/dist/{api-N774RPUA.js.map → api-IAGWF3ZG.js.map} +0 -0
  544. /package/dist/{audit-B5P6FFIR.js.map → audit-V53FV5AG.js.map} +0 -0
  545. /package/dist/{chunk-7D4SUZUM.js.map → chunk-DGUM43GV.js.map} +0 -0
  546. /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
  547. /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
  548. /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
  549. /package/docs/migration/{REACT_19_MIGRATION.md → V0.6.0_REACT_19_MIGRATION.md} +0 -0
@@ -112,19 +112,24 @@ export async function runCommand(command, args = [], options = {}) {
112
112
  * @returns {Promise<{success: boolean}>} Test execution result
113
113
  */
114
114
  export async function runStandardizedTests(packageRoot, repoRoot, timeout) {
115
- logger.step('Running test suite from root (matching npm run test behavior)...');
115
+ try {
116
+ logger.step('Running test suite from root (matching npm run test behavior)...');
116
117
 
117
- const result = await runCommand('npm', ['run', 'test'], {
118
- cwd: repoRoot,
119
- timeout,
120
- showLiveOutput: true, // Show test output in CI
121
- });
118
+ const result = await runCommand('npm', ['run', 'test'], {
119
+ cwd: repoRoot,
120
+ timeout,
121
+ showLiveOutput: true, // Show test output in CI
122
+ });
122
123
 
123
- if (result.success) {
124
- logger.success('All tests passed successfully');
125
- return { success: true };
126
- } else {
127
- logger.error('Tests failed');
124
+ if (result.success) {
125
+ logger.success('All tests passed successfully');
126
+ return { success: true };
127
+ } else {
128
+ logger.error('Tests failed');
129
+ return { success: false };
130
+ }
131
+ } catch (error) {
132
+ logger.error(`Test execution error: ${error.message}`);
128
133
  return { success: false };
129
134
  }
130
135
  }
@@ -58,70 +58,75 @@ async function validateESMFormat(filePath) {
58
58
  }
59
59
 
60
60
  async function validateFormats() {
61
- let allValid = true;
62
- const results = [];
63
-
64
- console.log('📋 ESM Format Compliance Report:');
65
- console.log('─'.repeat(80));
66
-
67
- for (const module of modules) {
68
- const esmPath = join(distDir, module.esm);
61
+ try {
62
+ let allValid = true;
63
+ const results = [];
69
64
 
70
- console.log(`\n📦 Module: ${module.name}`);
65
+ console.log('📋 ESM Format Compliance Report:');
66
+ console.log('─'.repeat(80));
71
67
 
72
- // Validate ESM format
73
- if (existsSync(esmPath)) {
74
- const esmValidation = await validateESMFormat(esmPath);
75
- const esmStatus = esmValidation.valid ? '✅' : '❌';
76
- console.log(` ESM (${module.esm}): ${esmStatus} ${(esmValidation.score * 100).toFixed(0)}% compliant`);
68
+ for (const module of modules) {
69
+ const esmPath = join(distDir, module.esm);
70
+
71
+ console.log(`\n📦 Module: ${module.name}`);
77
72
 
78
- if (!esmValidation.valid) {
79
- console.log(` Issues: ${esmValidation.issues.join(', ')}`);
73
+ // Validate ESM format
74
+ if (existsSync(esmPath)) {
75
+ const esmValidation = await validateESMFormat(esmPath);
76
+ const esmStatus = esmValidation.valid ? '✅' : '❌';
77
+ console.log(` ESM (${module.esm}): ${esmStatus} ${(esmValidation.score * 100).toFixed(0)}% compliant`);
78
+
79
+ if (!esmValidation.valid) {
80
+ console.log(` Issues: ${esmValidation.issues.join(', ')}`);
81
+ allValid = false;
82
+ }
83
+
84
+ results.push({ module: module.name, format: 'esm', ...esmValidation });
85
+ } else {
86
+ console.log(` ESM (${module.esm}): ❌ File not found`);
80
87
  allValid = false;
81
88
  }
82
-
83
- results.push({ module: module.name, format: 'esm', ...esmValidation });
89
+ }
90
+
91
+ // Summary
92
+ console.log('\n' + '='.repeat(80));
93
+ console.log('📊 ESM FORMAT VALIDATION SUMMARY');
94
+ console.log('='.repeat(80));
95
+
96
+ const totalModules = modules.length;
97
+ const validESM = results.filter(r => r.format === 'esm' && r.valid).length;
98
+
99
+ console.log(`ESM Format Compliance: ${validESM}/${totalModules} modules ✓`);
100
+
101
+ const averageESMScore = results
102
+ .filter(r => r.format === 'esm')
103
+ .reduce((sum, r) => sum + r.score, 0) / totalModules;
104
+
105
+ console.log(`Average ESM Compliance: ${(averageESMScore * 100).toFixed(1)}%`);
106
+
107
+ if (allValid) {
108
+ console.log('✅ All ESM format validations passed!');
109
+ console.log('\n🎯 ESM Quality Indicators:');
110
+ console.log(' ✅ Proper "use client" directives in all modules');
111
+ console.log(' ✅ Clean ESM export syntax');
112
+ console.log(' ✅ No CommonJS patterns detected');
113
+ console.log(' ✅ Optimal for modern bundlers and tree-shaking');
84
114
  } else {
85
- console.log(` ESM (${module.esm}): File not found`);
86
- allValid = false;
115
+ console.log('❌ Some ESM format validations failed!');
116
+ console.log('\n🔧 Common fixes:');
117
+ console.log(' - Ensure "use client" directive is present');
118
+ console.log(' - Use proper ESM export syntax');
119
+ console.log(' - Remove any CommonJS patterns (require, module.exports)');
120
+ console.log(' - Check tsup configuration for proper ESM output');
87
121
  }
122
+
123
+ console.log('='.repeat(80));
124
+
125
+ return allValid;
126
+ } catch (error) {
127
+ console.error('❌ Validation error:', error.message);
128
+ return false;
88
129
  }
89
-
90
- // Summary
91
- console.log('\n' + '='.repeat(80));
92
- console.log('📊 ESM FORMAT VALIDATION SUMMARY');
93
- console.log('='.repeat(80));
94
-
95
- const totalModules = modules.length;
96
- const validESM = results.filter(r => r.format === 'esm' && r.valid).length;
97
-
98
- console.log(`ESM Format Compliance: ${validESM}/${totalModules} modules ✓`);
99
-
100
- const averageESMScore = results
101
- .filter(r => r.format === 'esm')
102
- .reduce((sum, r) => sum + r.score, 0) / totalModules;
103
-
104
- console.log(`Average ESM Compliance: ${(averageESMScore * 100).toFixed(1)}%`);
105
-
106
- if (allValid) {
107
- console.log('✅ All ESM format validations passed!');
108
- console.log('\n🎯 ESM Quality Indicators:');
109
- console.log(' ✅ Proper "use client" directives in all modules');
110
- console.log(' ✅ Clean ESM export syntax');
111
- console.log(' ✅ No CommonJS patterns detected');
112
- console.log(' ✅ Optimal for modern bundlers and tree-shaking');
113
- } else {
114
- console.log('❌ Some ESM format validations failed!');
115
- console.log('\n🔧 Common fixes:');
116
- console.log(' - Ensure "use client" directive is present');
117
- console.log(' - Use proper ESM export syntax');
118
- console.log(' - Remove any CommonJS patterns (require, module.exports)');
119
- console.log(' - Check tsup configuration for proper ESM output');
120
- }
121
-
122
- console.log('='.repeat(80));
123
-
124
- return allValid;
125
130
  }
126
131
 
127
132
  // Run validation
@@ -49,87 +49,92 @@ async function runStandardizedTestsWrapper() {
49
49
 
50
50
  // Main validation orchestrator
51
51
  async function runValidation(mode = 'standard') {
52
- logger.header(`Running ${mode} validation`);
53
- if (isCI()) {
54
- logger.info('CI environment detected - using extended timeouts and live output');
55
- logger.newline();
56
- }
57
-
58
- const results = [];
59
- const startTime = Date.now();
60
- let criticalFailures = 0;
61
-
62
- for (const [stepKey, step] of Object.entries(validationSteps)) {
63
- // Skip tests in pre-publish mode if configured to do so
64
- if (mode === 'pre-publish' && step.skipInPrePublish) {
65
- logger.skipped(`Skipping: ${step.name} (skipped in pre-publish mode)...`);
52
+ try {
53
+ logger.header(`Running ${mode} validation`);
54
+ if (isCI()) {
55
+ logger.info('CI environment detected - using extended timeouts and live output');
56
+ logger.newline();
57
+ }
58
+
59
+ const results = [];
60
+ const startTime = Date.now();
61
+ let criticalFailures = 0;
62
+
63
+ for (const [stepKey, step] of Object.entries(validationSteps)) {
64
+ // Skip tests in pre-publish mode if configured to do so
65
+ if (mode === 'pre-publish' && step.skipInPrePublish) {
66
+ logger.skipped(`Skipping: ${step.name} (skipped in pre-publish mode)...`);
67
+ results.push({
68
+ step: stepKey,
69
+ name: step.name,
70
+ success: true,
71
+ duration: 0,
72
+ skipped: true
73
+ });
74
+ continue;
75
+ }
76
+
77
+ const stepStartTime = Date.now();
78
+ logger.step(`Running: ${step.name}...`);
79
+
80
+ const result = step.customHandler
81
+ ? await step.customHandler()
82
+ : await runCommand(step.command[0], step.command.slice(1), {
83
+ cwd: step.cwd || packageRoot,
84
+ timeout: step.timeout || DEFAULT_TIMEOUT,
85
+ });
86
+
87
+ const stepDuration = Date.now() - stepStartTime;
88
+ const status = result.success ? '✅' : '❌';
89
+
90
+ logger.info(`${status} ${step.name} - ${stepDuration}ms`);
91
+ logger.newline();
92
+
66
93
  results.push({
67
94
  step: stepKey,
68
95
  name: step.name,
69
- success: true,
70
- duration: 0,
71
- skipped: true
96
+ success: result.success,
97
+ duration: stepDuration,
98
+ skipped: false
72
99
  });
73
- continue;
100
+
101
+ if (!result.success) {
102
+ criticalFailures++;
103
+ }
74
104
  }
75
105
 
76
- const stepStartTime = Date.now();
77
- logger.step(`Running: ${step.name}...`);
106
+ const totalDuration = Date.now() - startTime;
107
+ const passedSteps = results.filter(r => r.success).length;
108
+ const skippedSteps = results.filter(r => r.skipped).length;
78
109
 
79
- const result = step.customHandler
80
- ? await step.customHandler()
81
- : await runCommand(step.command[0], step.command.slice(1), {
82
- cwd: step.cwd || packageRoot,
83
- timeout: step.timeout || DEFAULT_TIMEOUT,
84
- });
85
-
86
- const stepDuration = Date.now() - stepStartTime;
87
- const status = result.success ? '✅' : '❌';
88
-
89
- logger.info(`${status} ${step.name} - ${stepDuration}ms`);
110
+ // Summary
111
+ logger.header('VALIDATION SUMMARY');
112
+ logger.info(`Total steps: ${results.length}`);
113
+ logger.info(`Passed: ${passedSteps}`);
114
+ logger.info(`Skipped: ${skippedSteps}`);
115
+ logger.info(`Failed: ${criticalFailures}`);
116
+ logger.info(`Total duration: ${totalDuration}ms`);
90
117
  logger.newline();
91
118
 
92
- results.push({
93
- step: stepKey,
94
- name: step.name,
95
- success: result.success,
96
- duration: stepDuration,
97
- skipped: false
119
+ logger.info('Step Results:');
120
+ results.forEach(result => {
121
+ const status = result.skipped ? '⏭️' : (result.success ? '✅' : '❌');
122
+ const statusText = result.skipped ? 'skipped' : `${result.duration}ms`;
123
+ logger.info(` ${status} ${result.step} - ${statusText}`);
98
124
  });
99
125
 
100
- if (!result.success) {
101
- criticalFailures++;
126
+ logger.newline();
127
+ logger.separator();
128
+
129
+ if (criticalFailures === 0) {
130
+ logger.success('All validations passed!');
131
+ return true;
132
+ } else {
133
+ logger.error(`Validation failed! ${criticalFailures} validations failed`);
134
+ return false;
102
135
  }
103
- }
104
-
105
- const totalDuration = Date.now() - startTime;
106
- const passedSteps = results.filter(r => r.success).length;
107
- const skippedSteps = results.filter(r => r.skipped).length;
108
-
109
- // Summary
110
- logger.header('VALIDATION SUMMARY');
111
- logger.info(`Total steps: ${results.length}`);
112
- logger.info(`Passed: ${passedSteps}`);
113
- logger.info(`Skipped: ${skippedSteps}`);
114
- logger.info(`Failed: ${criticalFailures}`);
115
- logger.info(`Total duration: ${totalDuration}ms`);
116
- logger.newline();
117
-
118
- logger.info('Step Results:');
119
- results.forEach(result => {
120
- const status = result.skipped ? '⏭️' : (result.success ? '✅' : '❌');
121
- const statusText = result.skipped ? 'skipped' : `${result.duration}ms`;
122
- logger.info(` ${status} ${result.step} - ${statusText}`);
123
- });
124
-
125
- logger.newline();
126
- logger.separator();
127
-
128
- if (criticalFailures === 0) {
129
- logger.success('All validations passed!');
130
- return true;
131
- } else {
132
- logger.error(`Validation failed! ${criticalFailures} validations failed`);
136
+ } catch (error) {
137
+ logger.error(`Validation error: ${error.message}`);
133
138
  return false;
134
139
  }
135
140
  }
@@ -51,75 +51,80 @@ function checkTypedocInstallation() {
51
51
 
52
52
  // Main validation function
53
53
  async function runPrePublishValidation() {
54
- logger.info('Running validation steps...');
55
- logger.newline();
56
-
57
- // Step 1: Type check
58
- logger.step('Step 1: Type check');
59
- const typeCheck = await runCommand('npm', ['run', 'type-check'], {
60
- cwd: packageRoot,
61
- timeout: DEFAULT_TIMEOUT,
62
- });
63
- if (!typeCheck.success) {
64
- logger.error('Type check failed');
65
- return false;
66
- }
67
-
68
- // Step 2: Build validation
69
- logger.newline();
70
- logger.step('Step 2: Build validation');
71
- const build = await runCommand('npm', ['run', 'build'], {
72
- cwd: packageRoot,
73
- timeout: getDefaultTimeout(60000, 180000),
74
- });
75
- if (!build.success) {
76
- logger.error('Build failed');
77
- return false;
78
- }
79
-
80
- // Step 3: Test validation - now uses standardized test execution
81
- logger.newline();
82
- logger.step('Step 3: Test validation');
83
- const tests = await runStandardizedTests(packageRoot, repoRoot, TEST_TIMEOUT);
84
- if (!tests.success) {
85
- logger.error('Tests failed');
86
- return false;
87
- }
88
-
89
- // Step 4: Documentation generation
90
- logger.newline();
91
- logger.step('Step 4: Documentation generation');
92
- if (!checkTypedocInstallation()) {
93
- logger.error('TypeDoc validation failed');
94
- return false;
95
- }
54
+ try {
55
+ logger.info('Running validation steps...');
56
+ logger.newline();
96
57
 
97
- const docs = await runCommand('npm', ['run', 'build:docs'], {
98
- cwd: packageRoot,
99
- timeout: getDefaultTimeout(120000, 240000),
100
- });
101
- if (!docs.success) {
102
- logger.error('Documentation generation failed');
103
- return false;
104
- }
58
+ // Step 1: Type check
59
+ logger.step('Step 1: Type check');
60
+ const typeCheck = await runCommand('npm', ['run', 'type-check'], {
61
+ cwd: packageRoot,
62
+ timeout: DEFAULT_TIMEOUT,
63
+ });
64
+ if (!typeCheck.success) {
65
+ logger.error('Type check failed');
66
+ return false;
67
+ }
68
+
69
+ // Step 2: Build validation
70
+ logger.newline();
71
+ logger.step('Step 2: Build validation');
72
+ const build = await runCommand('npm', ['run', 'build'], {
73
+ cwd: packageRoot,
74
+ timeout: getDefaultTimeout(60000, 180000),
75
+ });
76
+ if (!build.success) {
77
+ logger.error('Build failed');
78
+ return false;
79
+ }
80
+
81
+ // Step 3: Test validation - now uses standardized test execution
82
+ logger.newline();
83
+ logger.step('Step 3: Test validation');
84
+ const tests = await runStandardizedTests(packageRoot, repoRoot, TEST_TIMEOUT);
85
+ if (!tests.success) {
86
+ logger.error('Tests failed');
87
+ return false;
88
+ }
89
+
90
+ // Step 4: Documentation generation
91
+ logger.newline();
92
+ logger.step('Step 4: Documentation generation');
93
+ if (!checkTypedocInstallation()) {
94
+ logger.error('TypeDoc validation failed');
95
+ return false;
96
+ }
97
+
98
+ const docs = await runCommand('npm', ['run', 'build:docs'], {
99
+ cwd: packageRoot,
100
+ timeout: getDefaultTimeout(120000, 240000),
101
+ });
102
+ if (!docs.success) {
103
+ logger.error('Documentation generation failed');
104
+ return false;
105
+ }
106
+
107
+ // Step 5: Format validation
108
+ logger.newline();
109
+ logger.step('Step 5: Format validation');
110
+ const format = await runCommand('npm', ['run', 'format:check'], {
111
+ cwd: packageRoot,
112
+ timeout: DEFAULT_TIMEOUT,
113
+ });
114
+ if (!format.success) {
115
+ logger.error('Format validation failed');
116
+ return false;
117
+ }
105
118
 
106
- // Step 5: Format validation
107
- logger.newline();
108
- logger.step('Step 5: Format validation');
109
- const format = await runCommand('npm', ['run', 'format:check'], {
110
- cwd: packageRoot,
111
- timeout: DEFAULT_TIMEOUT,
112
- });
113
- if (!format.success) {
114
- logger.error('Format validation failed');
119
+ logger.newline();
120
+ logger.header('PRE-PUBLISH VALIDATION SUMMARY');
121
+ logger.success('All validation steps passed successfully!');
122
+ logger.success('Package meets publication requirements');
123
+ return true;
124
+ } catch (error) {
125
+ logger.error(`Pre-publish validation error: ${error.message}`);
115
126
  return false;
116
127
  }
117
-
118
- logger.newline();
119
- logger.header('PRE-PUBLISH VALIDATION SUMMARY');
120
- logger.success('All validation steps passed successfully!');
121
- logger.success('Package meets publication requirements');
122
- return true;
123
128
  }
124
129
 
125
130
  // Run the validation
@@ -143,7 +143,7 @@ describe('usePermissions Hook Stability', () => {
143
143
  mockIsPermittedCached.mockResolvedValue(true);
144
144
 
145
145
  const { result, rerender } = renderHook(() =>
146
- useCan(mockUserId, mockScope, 'read:users', 'page-123', true)
146
+ useCan(mockUserId, mockScope, 'read:users', 'page-123', true, false)
147
147
  );
148
148
 
149
149
  // Wait for initial load
@@ -171,7 +171,7 @@ describe('usePermissions Hook Stability', () => {
171
171
  .mockResolvedValueOnce(true);
172
172
 
173
173
  const { result, rerender } = renderHook(() =>
174
- useCan(mockUserId, mockScope, 'read:users', 'page-123', true)
174
+ useCan(mockUserId, mockScope, 'read:users', 'page-123', true, false)
175
175
  );
176
176
 
177
177
  // Wait for initial load
@@ -80,7 +80,7 @@ describe('Alert Component', () => {
80
80
  it('renders with children content', () => {
81
81
  renderWithProviders(
82
82
  <Alert>
83
- <div data-testid="custom-content">Custom content</div>
83
+ <span data-testid="custom-content">Custom content</span>
84
84
  </Alert>
85
85
  );
86
86
 
@@ -330,14 +330,10 @@ describe('Alert Component', () => {
330
330
  it('works with icons and actions', () => {
331
331
  renderWithProviders(
332
332
  <Alert>
333
- <div className="flex items-center gap-2">
334
- <span>⚠️</span>
335
- <div>
336
- <AlertTitle>Warning</AlertTitle>
337
- <AlertDescription>Please check your input</AlertDescription>
338
- </div>
339
- <button>Dismiss</button>
340
- </div>
333
+ <span>⚠️</span>
334
+ <AlertTitle>Warning</AlertTitle>
335
+ <AlertDescription>Please check your input</AlertDescription>
336
+ <button>Dismiss</button>
341
337
  </Alert>
342
338
  );
343
339
 
@@ -484,7 +480,7 @@ describe('Alert Component', () => {
484
480
 
485
481
  it('works with multiple alerts', () => {
486
482
  renderWithProviders(
487
- <div>
483
+ <>
488
484
  <Alert variant="default">
489
485
  <AlertTitle>Info</AlertTitle>
490
486
  <AlertDescription>Information message</AlertDescription>
@@ -493,7 +489,7 @@ describe('Alert Component', () => {
493
489
  <AlertTitle>Error</AlertTitle>
494
490
  <AlertDescription>Error message</AlertDescription>
495
491
  </Alert>
496
- </div>
492
+ </>
497
493
  );
498
494
 
499
495
  const alerts = screen.getAllByRole('alert');
@@ -509,13 +505,11 @@ describe('Alert Component', () => {
509
505
  <Alert>
510
506
  <AlertTitle>Complex Alert</AlertTitle>
511
507
  <AlertDescription>
512
- <div>
513
- <p>This is a complex description with</p>
514
- <ul>
515
- <li>Multiple elements</li>
516
- <li>Nested content</li>
517
- </ul>
518
- </div>
508
+ This is a complex description with
509
+ <ul>
510
+ <li>Multiple elements</li>
511
+ <li>Nested content</li>
512
+ </ul>
519
513
  </AlertDescription>
520
514
  </Alert>
521
515
  );
@@ -18,22 +18,20 @@
18
18
  *
19
19
  * @example
20
20
  * ```tsx
21
- * // Basic alert
21
+ * // Basic alert (renders as <aside> with <h5> title and <p> description)
22
22
  * <Alert>
23
23
  * <AlertTitle>Success</AlertTitle>
24
24
  * <AlertDescription>Your changes have been saved.</AlertDescription>
25
25
  * </Alert>
26
26
  *
27
- * // Destructive alert with icon
27
+ * // Destructive alert with icon (renders as <aside> with <h5> title and <p> description)
28
28
  * <Alert variant="destructive">
29
29
  * <ErrorIcon />
30
- * <div>
31
- * <AlertTitle>Error</AlertTitle>
32
- * <AlertDescription>Something went wrong.</AlertDescription>
33
- * </div>
30
+ * <AlertTitle>Error</AlertTitle>
31
+ * <AlertDescription>Something went wrong.</AlertDescription>
34
32
  * </Alert>
35
33
  *
36
- * // Inline alert (renders as fragment with strong/span)
34
+ * // Inline alert (renders as React.Fragment with <strong> title and <span> description)
37
35
  * <Alert variant="inline">
38
36
  * <AlertTitle>Note:</AlertTitle>
39
37
  * <AlertDescription>This is an inline message.</AlertDescription>
@@ -409,13 +409,13 @@ describe('Avatar Component', () => {
409
409
  describe('Integration', () => {
410
410
  it('works within user profile components', () => {
411
411
  renderWithProviders(
412
- <div className="user-profile">
412
+ <section className="user-profile">
413
413
  <Avatar src="/user.jpg" alt="Profile" fallback="UP" />
414
- <div>
414
+ <section>
415
415
  <h3>User Name</h3>
416
416
  <p>User description</p>
417
- </div>
418
- </div>
417
+ </section>
418
+ </section>
419
419
  );
420
420
 
421
421
  expect(screen.getByAltText('Profile')).toBeInTheDocument();
@@ -49,6 +49,14 @@ import { cn } from '../../utils/core/cn';
49
49
  // TYPE DEFINITIONS
50
50
  // ============================================================================
51
51
 
52
+ /**
53
+ * Badge variant type
54
+ * Defines the visual style, color palette, and shade intensity of the badge.
55
+ * Format: {style}-{color}-{shade}
56
+ * - style: 'solid' | 'outline' | 'soft'
57
+ * - color: 'main' | 'sec' | 'acc'
58
+ * - shade: 'muted' | 'normal' | 'strong'
59
+ */
52
60
  export type BadgeVariant =
53
61
  | 'solid-main-muted' | 'solid-main-normal' | 'solid-main-strong'
54
62
  | 'solid-sec-muted' | 'solid-sec-normal' | 'solid-sec-strong'
@@ -60,6 +68,12 @@ export type BadgeVariant =
60
68
  | 'soft-sec-muted' | 'soft-sec-normal' | 'soft-sec-strong'
61
69
  | 'soft-acc-muted' | 'soft-acc-normal' | 'soft-acc-strong';
62
70
 
71
+ /**
72
+ * Badge component props
73
+ * Extends standard HTML span attributes with badge-specific styling options.
74
+ *
75
+ * @interface BadgeProps
76
+ */
63
77
  export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
64
78
  /** Visual variant of the badge (style-color-shade) */
65
79
  variant?: BadgeVariant;