@jmruthers/pace-core 0.5.193 → 0.6.2

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 (577) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +7 -1
  3. package/cursor-rules/00-pace-core-compliance.mdc +299 -0
  4. package/cursor-rules/01-standards-compliance.mdc +244 -0
  5. package/cursor-rules/02-project-structure.mdc +200 -0
  6. package/cursor-rules/03-solid-principles.mdc +222 -0
  7. package/cursor-rules/04-testing-standards.mdc +268 -0
  8. package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
  9. package/cursor-rules/06-code-quality.mdc +309 -0
  10. package/cursor-rules/07-tech-stack-compliance.mdc +214 -0
  11. package/cursor-rules/08-markup-quality.mdc +452 -0
  12. package/cursor-rules/CHANGELOG.md +119 -0
  13. package/cursor-rules/README.md +192 -0
  14. package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
  15. package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-BMRU8a1j.d.ts} +34 -2
  16. package/dist/{DataTable-5FU7IESH.js → DataTable-TPTKCX4D.js} +10 -9
  17. package/dist/{PublicPageProvider-C0Sm_e5k.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +385 -261
  18. package/dist/{UnifiedAuthProvider-RGJTDE2C.js → UnifiedAuthProvider-CH6Z342H.js} +3 -3
  19. package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CVcTjx-d.d.ts} +29 -0
  20. package/dist/{api-N774RPUA.js → api-MVVQZLJI.js} +2 -2
  21. package/dist/{chunk-KNC55RTG.js → chunk-24UVZUZG.js} +90 -54
  22. package/dist/chunk-24UVZUZG.js.map +1 -0
  23. package/dist/{chunk-HWIIPPNI.js → chunk-2UOI2FG5.js} +20 -20
  24. package/dist/chunk-2UOI2FG5.js.map +1 -0
  25. package/dist/{chunk-E3SPN4VZ 5.js → chunk-3XC4CPTD.js} +4345 -3986
  26. package/dist/chunk-3XC4CPTD.js.map +1 -0
  27. package/dist/{chunk-7EQTDTTJ.js → chunk-6J4GEEJR.js} +172 -45
  28. package/dist/chunk-6J4GEEJR.js.map +1 -0
  29. package/dist/{chunk-6C4YBBJM 5.js → chunk-6SOIHG6Z.js} +1 -1
  30. package/dist/chunk-6SOIHG6Z.js.map +1 -0
  31. package/dist/{chunk-7FLMSG37.js → chunk-EHMR7VYL.js} +25 -25
  32. package/dist/chunk-EHMR7VYL.js.map +1 -0
  33. package/dist/{chunk-I7PSE6JW.js → chunk-F2IMUDXZ.js} +2 -75
  34. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  35. package/dist/{chunk-QWWZ5CAQ.js → chunk-FFQEQTNW.js} +7 -9
  36. package/dist/chunk-FFQEQTNW.js.map +1 -0
  37. package/dist/chunk-FMUCXFII.js +76 -0
  38. package/dist/chunk-FMUCXFII.js.map +1 -0
  39. package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
  40. package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
  41. package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
  42. package/dist/chunk-L4OXEN46.js.map +1 -0
  43. package/dist/{chunk-R77UEZ4E 3.js → chunk-M43Y4SSO.js} +1 -1
  44. package/dist/chunk-M43Y4SSO.js.map +1 -0
  45. package/dist/{chunk-IIELH4DL.js → chunk-MMZ7JXPU.js} +60 -223
  46. package/dist/chunk-MMZ7JXPU.js.map +1 -0
  47. package/dist/{chunk-NOAYCWCX 5.js → chunk-NECFR5MM.js} +394 -312
  48. package/dist/chunk-NECFR5MM.js.map +1 -0
  49. package/dist/{chunk-BC4IJKSL.js → chunk-SFZUDBL5.js} +40 -4
  50. package/dist/chunk-SFZUDBL5.js.map +1 -0
  51. package/dist/{chunk-XNXXZ43G.js → chunk-XWQCNGTQ.js} +748 -364
  52. package/dist/chunk-XWQCNGTQ.js.map +1 -0
  53. package/dist/components.d.ts +6 -6
  54. package/dist/components.js +15 -12
  55. package/dist/components.js.map +1 -1
  56. package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
  57. package/dist/hooks.d.ts +59 -126
  58. package/dist/hooks.js +19 -28
  59. package/dist/hooks.js.map +1 -1
  60. package/dist/index.d.ts +63 -16
  61. package/dist/index.js +23 -24
  62. package/dist/index.js.map +1 -1
  63. package/dist/providers.d.ts +21 -3
  64. package/dist/providers.js +2 -2
  65. package/dist/rbac/index.d.ts +146 -115
  66. package/dist/rbac/index.js +8 -11
  67. package/dist/theming/runtime.d.ts +1 -13
  68. package/dist/theming/runtime.js +1 -1
  69. package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
  70. package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
  71. package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
  72. package/dist/types.d.ts +2 -2
  73. package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +34 -4
  74. package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
  75. package/dist/utils.d.ts +4 -5
  76. package/dist/utils.js +15 -15
  77. package/dist/utils.js.map +1 -1
  78. package/docs/api/README.md +7 -1
  79. package/docs/api/classes/ColumnFactory.md +8 -8
  80. package/docs/api/classes/InvalidScopeError.md +4 -4
  81. package/docs/api/classes/Logger.md +1 -1
  82. package/docs/api/classes/MissingUserContextError.md +4 -4
  83. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  84. package/docs/api/classes/PermissionDeniedError.md +4 -4
  85. package/docs/api/classes/RBACAuditManager.md +1 -1
  86. package/docs/api/classes/RBACCache.md +1 -1
  87. package/docs/api/classes/RBACEngine.md +1 -1
  88. package/docs/api/classes/RBACError.md +4 -4
  89. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  90. package/docs/api/classes/SecureSupabaseClient.md +18 -15
  91. package/docs/api/classes/StorageUtils.md +1 -1
  92. package/docs/api/enums/FileCategory.md +1 -1
  93. package/docs/api/enums/LogLevel.md +1 -1
  94. package/docs/api/enums/RBACErrorCode.md +1 -1
  95. package/docs/api/enums/RPCFunction.md +1 -1
  96. package/docs/api/interfaces/AddressFieldProps.md +1 -1
  97. package/docs/api/interfaces/AddressFieldRef.md +1 -1
  98. package/docs/api/interfaces/AggregateConfig.md +4 -4
  99. package/docs/api/interfaces/AutocompleteOptions.md +1 -1
  100. package/docs/api/interfaces/AvatarProps.md +1 -1
  101. package/docs/api/interfaces/BadgeProps.md +9 -2
  102. package/docs/api/interfaces/ButtonProps.md +7 -4
  103. package/docs/api/interfaces/CalendarProps.md +8 -5
  104. package/docs/api/interfaces/CardProps.md +8 -5
  105. package/docs/api/interfaces/ColorPalette.md +1 -1
  106. package/docs/api/interfaces/ColorShade.md +1 -1
  107. package/docs/api/interfaces/ComplianceResult.md +1 -1
  108. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  109. package/docs/api/interfaces/DataRecord.md +1 -1
  110. package/docs/api/interfaces/DataTableAction.md +24 -21
  111. package/docs/api/interfaces/DataTableColumn.md +31 -31
  112. package/docs/api/interfaces/DataTableProps.md +1 -1
  113. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  114. package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
  115. package/docs/api/interfaces/DatabaseIssue.md +1 -1
  116. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  117. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  118. package/docs/api/interfaces/ErrorBoundaryProps.md +147 -0
  119. package/docs/api/interfaces/ErrorBoundaryProviderProps.md +36 -0
  120. package/docs/api/interfaces/ErrorBoundaryState.md +75 -0
  121. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  122. package/docs/api/interfaces/ExportColumn.md +1 -1
  123. package/docs/api/interfaces/ExportOptions.md +8 -8
  124. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  125. package/docs/api/interfaces/FileMetadata.md +1 -1
  126. package/docs/api/interfaces/FileReference.md +1 -1
  127. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  128. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  129. package/docs/api/interfaces/FileUploadProps.md +26 -23
  130. package/docs/api/interfaces/FooterProps.md +10 -8
  131. package/docs/api/interfaces/FormFieldProps.md +10 -10
  132. package/docs/api/interfaces/FormProps.md +1 -1
  133. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  134. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  135. package/docs/api/interfaces/InputProps.md +7 -4
  136. package/docs/api/interfaces/LabelProps.md +1 -1
  137. package/docs/api/interfaces/LoggerConfig.md +1 -1
  138. package/docs/api/interfaces/LoginFormProps.md +14 -11
  139. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  140. package/docs/api/interfaces/NavigationContextType.md +1 -1
  141. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  142. package/docs/api/interfaces/NavigationItem.md +11 -11
  143. package/docs/api/interfaces/NavigationMenuProps.md +15 -15
  144. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  145. package/docs/api/interfaces/Organisation.md +1 -1
  146. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  147. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  148. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  149. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  150. package/docs/api/interfaces/PaceAppLayoutProps.md +30 -27
  151. package/docs/api/interfaces/PaceLoginPageProps.md +6 -4
  152. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  153. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  154. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  155. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  156. package/docs/api/interfaces/PaletteData.md +1 -1
  157. package/docs/api/interfaces/ParsedAddress.md +1 -1
  158. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  159. package/docs/api/interfaces/ProgressProps.md +1 -1
  160. package/docs/api/interfaces/ProtectedRouteProps.md +7 -26
  161. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  162. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  163. package/docs/api/interfaces/PublicPageLayoutProps.md +7 -20
  164. package/docs/api/interfaces/QuickFix.md +1 -1
  165. package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
  166. package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
  167. package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
  168. package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
  169. package/docs/api/interfaces/RBACConfig.md +1 -1
  170. package/docs/api/interfaces/RBACContext.md +1 -1
  171. package/docs/api/interfaces/RBACLogger.md +1 -1
  172. package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
  173. package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
  174. package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
  175. package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
  176. package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
  177. package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
  178. package/docs/api/interfaces/RBACResult.md +1 -1
  179. package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
  180. package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
  181. package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
  182. package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
  183. package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
  184. package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
  185. package/docs/api/interfaces/RBACRolesListParams.md +1 -1
  186. package/docs/api/interfaces/RBACRolesListResult.md +1 -1
  187. package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
  188. package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
  189. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  190. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  191. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  192. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  193. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  194. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  195. package/docs/api/interfaces/RouteConfig.md +1 -1
  196. package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
  197. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  198. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  199. package/docs/api/interfaces/SessionRestorationLoaderProps.md +3 -3
  200. package/docs/api/interfaces/SetupIssue.md +1 -1
  201. package/docs/api/interfaces/StorageConfig.md +1 -1
  202. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  203. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  204. package/docs/api/interfaces/StorageListOptions.md +1 -1
  205. package/docs/api/interfaces/StorageListResult.md +1 -1
  206. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  207. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  208. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  209. package/docs/api/interfaces/StyleImport.md +1 -1
  210. package/docs/api/interfaces/SwitchProps.md +1 -1
  211. package/docs/api/interfaces/TabsContentProps.md +1 -1
  212. package/docs/api/interfaces/TabsListProps.md +1 -1
  213. package/docs/api/interfaces/TabsProps.md +1 -1
  214. package/docs/api/interfaces/TabsTriggerProps.md +3 -3
  215. package/docs/api/interfaces/TextareaProps.md +1 -1
  216. package/docs/api/interfaces/ToastActionElement.md +4 -1
  217. package/docs/api/interfaces/ToastProps.md +1 -1
  218. package/docs/api/interfaces/UnifiedAuthContextType.md +58 -55
  219. package/docs/api/interfaces/UnifiedAuthProviderProps.md +15 -13
  220. package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
  221. package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
  222. package/docs/api/interfaces/UseInactivityTrackerOptions.md +11 -9
  223. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  224. package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
  225. package/docs/api/interfaces/UsePublicEventLogoReturn.md +9 -6
  226. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  227. package/docs/api/interfaces/UsePublicEventReturn.md +8 -5
  228. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  229. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +12 -9
  230. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +10 -7
  231. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  232. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  233. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  234. package/docs/api/interfaces/UserEventAccess.md +14 -11
  235. package/docs/api/interfaces/UserMenuProps.md +8 -6
  236. package/docs/api/interfaces/UserProfile.md +1 -1
  237. package/docs/api/modules.md +575 -634
  238. package/docs/architecture/database-schema-requirements.md +161 -0
  239. package/docs/core-concepts/rbac-system.md +3 -3
  240. package/docs/documentation-index.md +2 -4
  241. package/docs/getting-started/cursor-rules.md +263 -0
  242. package/docs/getting-started/installation-guide.md +6 -1
  243. package/docs/getting-started/quick-start.md +6 -1
  244. package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
  245. package/docs/migration/MIGRATION_GUIDE.md +6 -28
  246. package/docs/migration/README.md +52 -6
  247. package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
  248. package/docs/migration/V0.6.0_REACT_19_MIGRATION.md +227 -0
  249. package/docs/migration/database-changes-december-2025.md +3 -3
  250. package/docs/rbac/event-based-apps.md +1 -1
  251. package/docs/rbac/getting-started.md +1 -1
  252. package/docs/rbac/quick-start.md +1 -1
  253. package/docs/standards/README.md +40 -0
  254. package/docs/troubleshooting/migration.md +4 -4
  255. package/examples/PublicPages/PublicEventPage.tsx +1 -1
  256. package/package.json +12 -6
  257. package/scripts/audit/core/checks/accessibility.cjs +197 -0
  258. package/scripts/audit/core/checks/api-usage.cjs +191 -0
  259. package/scripts/audit/core/checks/bundle.cjs +142 -0
  260. package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +737 -691
  261. package/scripts/audit/core/checks/config.cjs +54 -0
  262. package/scripts/audit/core/checks/coverage.cjs +84 -0
  263. package/scripts/audit/core/checks/dependencies.cjs +454 -0
  264. package/scripts/audit/core/checks/documentation.cjs +203 -0
  265. package/scripts/audit/core/checks/environment.cjs +128 -0
  266. package/scripts/audit/core/checks/error-handling.cjs +299 -0
  267. package/scripts/audit/core/checks/forms.cjs +172 -0
  268. package/scripts/audit/core/checks/heuristics.cjs +68 -0
  269. package/scripts/audit/core/checks/hooks.cjs +334 -0
  270. package/scripts/audit/core/checks/imports.cjs +244 -0
  271. package/scripts/audit/core/checks/performance.cjs +325 -0
  272. package/scripts/audit/core/checks/routes.cjs +117 -0
  273. package/scripts/audit/core/checks/state.cjs +130 -0
  274. package/scripts/audit/core/checks/structure.cjs +65 -0
  275. package/scripts/audit/core/checks/style.cjs +584 -0
  276. package/scripts/audit/core/checks/testing.cjs +122 -0
  277. package/scripts/audit/core/checks/typescript.cjs +61 -0
  278. package/scripts/audit/core/scanner.cjs +199 -0
  279. package/scripts/audit/core/utils.cjs +137 -0
  280. package/scripts/audit/index.cjs +223 -0
  281. package/scripts/audit/reporters/console.cjs +151 -0
  282. package/scripts/audit/reporters/json.cjs +54 -0
  283. package/scripts/audit/reporters/markdown.cjs +124 -0
  284. package/scripts/audit-consuming-app.cjs +86 -0
  285. package/scripts/build-docs/build-decision.js +240 -0
  286. package/scripts/build-docs/cache-utils.js +105 -0
  287. package/scripts/build-docs/content-normalization.js +150 -0
  288. package/scripts/build-docs/file-utils.js +105 -0
  289. package/scripts/build-docs/git-utils.js +86 -0
  290. package/scripts/build-docs/hash-utils.js +116 -0
  291. package/scripts/build-docs/typedoc-runner.js +220 -0
  292. package/scripts/build-docs-incremental.js +77 -913
  293. package/scripts/install-cursor-rules.cjs +236 -0
  294. package/scripts/utils/command-runner.js +16 -11
  295. package/scripts/validate-formats.js +61 -56
  296. package/scripts/validate-master.js +74 -69
  297. package/scripts/validate-pre-publish.js +70 -65
  298. package/src/__tests__/helpers/test-providers.tsx +1 -1
  299. package/src/__tests__/helpers/test-utils.tsx +1 -1
  300. package/src/__tests__/hooks/usePermissions.test.ts +2 -2
  301. package/src/components/Alert/Alert.test.tsx +12 -18
  302. package/src/components/Alert/Alert.tsx +5 -7
  303. package/src/components/Avatar/Avatar.test.tsx +4 -4
  304. package/src/components/Badge/Badge.tsx +16 -4
  305. package/src/components/Button/Button.tsx +27 -4
  306. package/src/components/Calendar/Calendar.tsx +9 -3
  307. package/src/components/Card/Card.tsx +4 -0
  308. package/src/components/Checkbox/Checkbox.test.tsx +12 -12
  309. package/src/components/Checkbox/Checkbox.tsx +2 -2
  310. package/src/components/DataTable/DataTable.test.tsx +57 -93
  311. package/src/components/DataTable/DataTable.tsx +40 -6
  312. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
  313. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +29 -7
  314. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
  315. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
  316. package/src/components/DataTable/components/AccessDeniedPage.tsx +17 -26
  317. package/src/components/DataTable/components/ActionButtons.tsx +10 -7
  318. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
  319. package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
  320. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
  321. package/src/components/DataTable/components/DataTableBody.tsx +8 -0
  322. package/src/components/DataTable/components/DataTableCore.tsx +200 -561
  323. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
  324. package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
  325. package/src/components/DataTable/components/DataTableModals.tsx +9 -1
  326. package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
  327. package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
  328. package/src/components/DataTable/components/EditFields.tsx +307 -0
  329. package/src/components/DataTable/components/EditableRow.tsx +9 -1
  330. package/src/components/DataTable/components/EmptyState.tsx +10 -0
  331. package/src/components/DataTable/components/FilterRow.tsx +12 -0
  332. package/src/components/DataTable/components/GroupHeader.tsx +12 -0
  333. package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
  334. package/src/components/DataTable/components/ImportModal.tsx +7 -0
  335. package/src/components/DataTable/components/LoadingState.tsx +6 -0
  336. package/src/components/DataTable/components/PaginationControls.tsx +16 -1
  337. package/src/components/DataTable/components/RowComponent.tsx +391 -0
  338. package/src/components/DataTable/components/UnifiedTableBody.tsx +62 -852
  339. package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
  340. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
  341. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
  342. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
  343. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
  344. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
  345. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
  346. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
  347. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
  348. package/src/components/DataTable/components/cellValueUtils.ts +40 -0
  349. package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
  350. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
  351. package/src/components/DataTable/context/DataTableContext.tsx +50 -0
  352. package/src/components/DataTable/core/ColumnFactory.ts +31 -0
  353. package/src/components/DataTable/core/DataTableContext.tsx +32 -1
  354. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
  355. package/src/components/DataTable/hooks/useColumnReordering.ts +14 -2
  356. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
  357. package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
  358. package/src/components/DataTable/hooks/useDataTablePermissions.ts +124 -32
  359. package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
  360. package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
  361. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
  362. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
  363. package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
  364. package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
  365. package/src/components/DataTable/styles.ts +6 -6
  366. package/src/components/DataTable/types.ts +6 -10
  367. package/src/components/DataTable/utils/a11yUtils.ts +7 -0
  368. package/src/components/DataTable/utils/debugTools.ts +18 -113
  369. package/src/components/DataTable/utils/errorHandling.ts +12 -0
  370. package/src/components/DataTable/utils/exportUtils.ts +9 -0
  371. package/src/components/DataTable/utils/flexibleImport.ts +12 -48
  372. package/src/components/DataTable/utils/paginationUtils.ts +8 -0
  373. package/src/components/DataTable/utils/performanceUtils.ts +5 -1
  374. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
  375. package/src/components/Dialog/Dialog.tsx +8 -7
  376. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
  377. package/src/components/ErrorBoundary/ErrorBoundary.tsx +46 -6
  378. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
  379. package/src/components/ErrorBoundary/index.ts +27 -2
  380. package/src/components/EventSelector/EventSelector.tsx +4 -1
  381. package/src/components/FileDisplay/FileDisplay.test.tsx +2 -2
  382. package/src/components/FileDisplay/FileDisplay.tsx +32 -18
  383. package/src/components/FileUpload/FileUpload.tsx +22 -2
  384. package/src/components/Footer/Footer.test.tsx +16 -16
  385. package/src/components/Footer/Footer.tsx +15 -12
  386. package/src/components/Form/Form.test.tsx +36 -15
  387. package/src/components/Form/Form.tsx +31 -26
  388. package/src/components/Header/Header.tsx +22 -11
  389. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
  390. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
  391. package/src/components/Input/Input.test.tsx +2 -2
  392. package/src/components/Input/Input.tsx +36 -34
  393. package/src/components/Label/Label.tsx +1 -1
  394. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
  395. package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
  396. package/src/components/LoginForm/LoginForm.test.tsx +42 -42
  397. package/src/components/LoginForm/LoginForm.tsx +12 -8
  398. package/src/components/NavigationMenu/NavigationMenu.tsx +15 -514
  399. package/src/components/NavigationMenu/types.ts +56 -0
  400. package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
  401. package/src/components/OrganisationSelector/OrganisationSelector.tsx +3 -0
  402. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
  403. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +54 -52
  404. package/src/components/PaceAppLayout/PaceAppLayout.tsx +33 -12
  405. package/src/components/PaceAppLayout/README.md +1 -1
  406. package/src/components/PaceAppLayout/test-setup.tsx +1 -2
  407. package/src/components/PaceLoginPage/PaceLoginPage.tsx +4 -1
  408. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
  409. package/src/components/PasswordChange/PasswordChangeForm.tsx +10 -1
  410. package/src/components/Progress/Progress.tsx +1 -1
  411. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
  412. package/src/components/PublicLayout/PublicPageLayout.tsx +3 -6
  413. package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
  414. package/src/components/Select/Select.tsx +95 -438
  415. package/src/components/Select/context.ts +23 -0
  416. package/src/components/Select/hooks/useSelectEvents.ts +87 -0
  417. package/src/components/Select/hooks/useSelectSearch.ts +91 -0
  418. package/src/components/Select/hooks/useSelectState.ts +104 -0
  419. package/src/components/Select/index.ts +9 -1
  420. package/src/components/Select/types.ts +123 -0
  421. package/src/components/Select/utils/text.ts +26 -0
  422. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +5 -6
  423. package/src/components/Switch/Switch.tsx +4 -4
  424. package/src/components/Table/Table.tsx +1 -1
  425. package/src/components/Tabs/Tabs.tsx +1 -1
  426. package/src/components/Textarea/Textarea.tsx +27 -29
  427. package/src/components/Toast/Toast.tsx +5 -1
  428. package/src/components/Tooltip/Tooltip.tsx +3 -3
  429. package/src/components/UserMenu/UserMenu.test.tsx +24 -11
  430. package/src/components/UserMenu/UserMenu.tsx +22 -19
  431. package/src/components/index.ts +2 -2
  432. package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
  433. package/src/hooks/__tests__/index.unit.test.ts +2 -5
  434. package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
  435. package/src/hooks/index.ts +1 -2
  436. package/src/hooks/public/usePublicEvent.ts +5 -1
  437. package/src/hooks/public/usePublicEventLogo.ts +5 -1
  438. package/src/hooks/public/usePublicFileDisplay.ts +4 -0
  439. package/src/hooks/public/usePublicRouteParams.ts +5 -1
  440. package/src/hooks/services/useAuth.ts +32 -0
  441. package/src/hooks/services/useCurrentEvent.ts +6 -0
  442. package/src/hooks/services/useCurrentOrganisation.ts +6 -0
  443. package/src/hooks/useDataTableState.ts +8 -18
  444. package/src/hooks/useDebounce.ts +9 -0
  445. package/src/hooks/useEventTheme.ts +6 -0
  446. package/src/hooks/useFileDisplay.ts +4 -0
  447. package/src/hooks/useFileReference.ts +25 -7
  448. package/src/hooks/useFileUrl.ts +11 -1
  449. package/src/hooks/useFocusManagement.ts +16 -2
  450. package/src/hooks/useFocusTrap.ts +7 -4
  451. package/src/hooks/useFormDialog.ts +8 -7
  452. package/src/hooks/useInactivityTracker.ts +4 -1
  453. package/src/hooks/useKeyboardShortcuts.ts +4 -0
  454. package/src/hooks/useOrganisationPermissions.ts +4 -0
  455. package/src/hooks/useOrganisationSecurity.ts +4 -0
  456. package/src/hooks/usePerformanceMonitor.ts +4 -0
  457. package/src/hooks/usePermissionCache.ts +8 -1
  458. package/src/hooks/useQueryCache.ts +12 -1
  459. package/src/hooks/useSessionRestoration.ts +4 -0
  460. package/src/hooks/useStorage.ts +4 -0
  461. package/src/hooks/useToast.ts +3 -3
  462. package/src/index.ts +2 -1
  463. package/src/providers/__tests__/OrganisationProvider.test.tsx +115 -49
  464. package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
  465. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
  466. package/src/providers/services/AuthServiceProvider.tsx +18 -0
  467. package/src/providers/services/EventServiceProvider.tsx +18 -0
  468. package/src/providers/services/InactivityServiceProvider.tsx +18 -0
  469. package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
  470. package/src/providers/services/UnifiedAuthProvider.tsx +58 -22
  471. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +33 -7
  472. package/src/rbac/README.md +1 -1
  473. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +26 -26
  474. package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
  475. package/src/rbac/adapters.tsx +14 -5
  476. package/src/rbac/api.ts +100 -67
  477. package/src/rbac/components/EnhancedNavigationMenu.tsx +1 -1
  478. package/src/rbac/components/NavigationGuard.tsx +1 -1
  479. package/src/rbac/components/NavigationProvider.tsx +5 -2
  480. package/src/rbac/components/PagePermissionGuard.tsx +158 -18
  481. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  482. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  483. package/src/rbac/components/RoleBasedRouter.tsx +6 -2
  484. package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
  485. package/src/rbac/components/SecureDataProvider.tsx +21 -6
  486. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
  487. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
  488. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
  489. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
  490. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
  491. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
  492. package/src/rbac/engine.ts +38 -14
  493. package/src/rbac/hooks/permissions/index.ts +7 -0
  494. package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
  495. package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
  496. package/src/rbac/hooks/permissions/useCan.ts +347 -0
  497. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
  498. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
  499. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
  500. package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
  501. package/src/rbac/hooks/useCan.test.ts +71 -64
  502. package/src/rbac/hooks/usePermissions.ts +14 -995
  503. package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
  504. package/src/rbac/hooks/useResourcePermissions.ts +14 -4
  505. package/src/rbac/hooks/useSecureSupabase.ts +33 -13
  506. package/src/rbac/permissions.ts +0 -30
  507. package/src/rbac/secureClient.ts +212 -61
  508. package/src/rbac/types.ts +8 -0
  509. package/src/theming/__tests__/parseEventColours.test.ts +6 -9
  510. package/src/theming/parseEventColours.ts +5 -19
  511. package/src/types/vitest-globals.d.ts +51 -26
  512. package/src/utils/__mocks__/supabaseMock.ts +1 -3
  513. package/src/utils/__tests__/formatting.unit.test.ts +4 -4
  514. package/src/utils/__tests__/index.unit.test.ts +2 -2
  515. package/src/utils/audit/audit.ts +0 -3
  516. package/src/utils/core/cn.ts +1 -1
  517. package/src/utils/file-reference/index.ts +53 -1
  518. package/src/utils/formatting/formatting.ts +8 -18
  519. package/src/utils/index.ts +0 -1
  520. package/src/utils/security/secureDataAccess.test.ts +31 -20
  521. package/src/utils/security/secureDataAccess.ts +4 -3
  522. package/dist/chunk-6C4YBBJM.js +0 -628
  523. package/dist/chunk-6C4YBBJM.js.map +0 -1
  524. package/dist/chunk-7D4SUZUM.js 2.map +0 -1
  525. package/dist/chunk-7EQTDTTJ.js 2.map +0 -1
  526. package/dist/chunk-7EQTDTTJ.js.map +0 -1
  527. package/dist/chunk-7FLMSG37.js 2.map +0 -1
  528. package/dist/chunk-7FLMSG37.js.map +0 -1
  529. package/dist/chunk-BC4IJKSL.js.map +0 -1
  530. package/dist/chunk-E3SPN4VZ.js +0 -12917
  531. package/dist/chunk-E3SPN4VZ.js.map +0 -1
  532. package/dist/chunk-E66EQZE6 5.js +0 -37
  533. package/dist/chunk-E66EQZE6.js 2.map +0 -1
  534. package/dist/chunk-HWIIPPNI.js.map +0 -1
  535. package/dist/chunk-I7PSE6JW 5.js +0 -191
  536. package/dist/chunk-I7PSE6JW.js 2.map +0 -1
  537. package/dist/chunk-I7PSE6JW.js.map +0 -1
  538. package/dist/chunk-IIELH4DL.js.map +0 -1
  539. package/dist/chunk-KNC55RTG.js 5.map +0 -1
  540. package/dist/chunk-KNC55RTG.js.map +0 -1
  541. package/dist/chunk-KQCRWDSA.js 5.map +0 -1
  542. package/dist/chunk-LFNCN2SP.js +0 -412
  543. package/dist/chunk-LFNCN2SP.js 2.map +0 -1
  544. package/dist/chunk-LFNCN2SP.js.map +0 -1
  545. package/dist/chunk-LMC26NLJ 2.js +0 -84
  546. package/dist/chunk-NOAYCWCX.js +0 -4993
  547. package/dist/chunk-NOAYCWCX.js.map +0 -1
  548. package/dist/chunk-QWWZ5CAQ.js 3.map +0 -1
  549. package/dist/chunk-QWWZ5CAQ.js.map +0 -1
  550. package/dist/chunk-QXHPKYJV 3.js +0 -113
  551. package/dist/chunk-R77UEZ4E.js +0 -68
  552. package/dist/chunk-R77UEZ4E.js.map +0 -1
  553. package/dist/chunk-SQGMNID3.js.map +0 -1
  554. package/dist/chunk-VBXEHIUJ.js 6.map +0 -1
  555. package/dist/chunk-XNXXZ43G.js.map +0 -1
  556. package/dist/chunk-ZSAAAMVR 6.js +0 -25
  557. package/dist/components.js 5.map +0 -1
  558. package/dist/styles/index 2.js +0 -12
  559. package/dist/styles/index.js 5.map +0 -1
  560. package/dist/theming/runtime 5.js +0 -19
  561. package/dist/theming/runtime.js 5.map +0 -1
  562. package/docs/api/classes/ErrorBoundary.md +0 -144
  563. package/docs/migration/quick-migration-guide.md +0 -356
  564. package/docs/migration/service-architecture.md +0 -281
  565. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
  566. package/src/hooks/useSecureDataAccess.test.ts +0 -559
  567. package/src/hooks/useSecureDataAccess.ts +0 -666
  568. /package/dist/{DataTable-5FU7IESH.js.map → DataTable-TPTKCX4D.js.map} +0 -0
  569. /package/dist/{UnifiedAuthProvider-RGJTDE2C.js.map → UnifiedAuthProvider-CH6Z342H.js.map} +0 -0
  570. /package/dist/{api-N774RPUA.js.map → api-MVVQZLJI.js.map} +0 -0
  571. /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
  572. /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
  573. /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
  574. /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
  575. /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
  576. /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
  577. /package/examples/{rbac → RBAC}/index.ts +0 -0
@@ -0,0 +1,584 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Code Style Check Module
5
+ * @package @jmruthers/pace-core
6
+ * @module Audit/Checks/Style
7
+ *
8
+ * Checks for:
9
+ * - Inline styles usage
10
+ * - Inconsistent naming conventions
11
+ * - Missing TypeScript types
12
+ * - any type usage
13
+ * - Console.log statements
14
+ */
15
+
16
+ const fs = require('fs');
17
+ const path = require('path');
18
+ const { getRelativePath, getLineNumber } = require('../utils.cjs');
19
+
20
+ const styleCheck = {
21
+ name: 'style',
22
+ description: 'Code style issues (inline styles, any types, console.log)',
23
+ severity: 'warning',
24
+
25
+ async run(context) {
26
+ const { projectRoot, files } = context;
27
+ const issues = [];
28
+ const warnings = [];
29
+ const suggestions = [];
30
+
31
+ if (!files || files.length === 0) {
32
+ return { issues, warnings, suggestions };
33
+ }
34
+
35
+ for (const filePath of files) {
36
+ try {
37
+ const content = fs.readFileSync(filePath, 'utf8');
38
+ const relativePath = getRelativePath(filePath, projectRoot);
39
+ const normalizedPath = relativePath.replace(/\\/g, '/');
40
+
41
+ // Skip root-level src directory - in pace-core repository, this is a demo/showcase app
42
+ // Note: We DO check packages/core/ files because style issues (any types, console.log, inline styles) are real issues that should be fixed
43
+ const isRootSrc = normalizedPath.startsWith('src/') && !normalizedPath.includes('packages/');
44
+ if (isRootSrc) {
45
+ continue; // Skip demo app files
46
+ }
47
+
48
+ // Skip scripts directory - utility scripts don't need style validation
49
+ const isScript = normalizedPath.startsWith('scripts/') || normalizedPath.includes('/scripts/');
50
+ if (isScript) {
51
+ continue; // Skip script files
52
+ }
53
+
54
+ // Skip test setup, teardown, and configuration files - these are test infrastructure
55
+ // Test setup/teardown files legitimately use 'any' types for mocking and may have simpler type annotations
56
+ const fileName = path.basename(normalizedPath);
57
+ const isTestInfrastructure = normalizedPath.includes('.setup.') ||
58
+ normalizedPath.includes('.teardown.') ||
59
+ normalizedPath.includes('.config.') ||
60
+ normalizedPath.includes('setupTests') ||
61
+ normalizedPath.includes('test-setup') ||
62
+ normalizedPath.includes('test-setup.') ||
63
+ fileName.match(/^(vitest|jest|setupTests)\.(setup|teardown)\.(ts|js|tsx|jsx)$/i) ||
64
+ fileName.match(/\.(setup|teardown)\.(ts|js|tsx|jsx)$/i) ||
65
+ fileName.match(/^test-setup\.(ts|js|tsx|jsx)$/i);
66
+ if (isTestInfrastructure) {
67
+ continue; // Skip test infrastructure files
68
+ }
69
+
70
+ // Skip example files - these are demo/showcase code, not production code
71
+ const isExample = normalizedPath.includes('/examples/') ||
72
+ normalizedPath.includes('/example/') ||
73
+ fileName.includes('Example');
74
+ if (isExample) {
75
+ continue; // Skip example files
76
+ }
77
+
78
+ // Skip logger utility files - they intentionally use console.* and any[] for variadic arguments
79
+ const isLogger = normalizedPath.includes('/utils/core/logger') ||
80
+ normalizedPath.includes('/utils/core/debugLogger') ||
81
+ (normalizedPath.includes('/rbac/config') && content.includes('createLogger') && content.includes('RBACLogger'));
82
+ if (isLogger) {
83
+ continue; // Skip logger utilities
84
+ }
85
+
86
+ // Skip development utility files - these are meant to log to console for development/debugging
87
+ const isDevUtility = normalizedPath.includes('/utils/performance/') ||
88
+ normalizedPath.includes('/utils/debug/') ||
89
+ normalizedPath.includes('/utils/development/');
90
+ if (isDevUtility) {
91
+ continue; // Skip development utilities
92
+ }
93
+
94
+ // Check for inline styles
95
+ const inlineStylePattern = /style\s*=\s*\{\{/g;
96
+ let styleMatch;
97
+ while ((styleMatch = inlineStylePattern.exec(content)) !== null) {
98
+ // Get context around the inline style to check if it's necessary
99
+ const contextStart = Math.max(0, styleMatch.index - 100);
100
+ const contextEnd = Math.min(content.length, styleMatch.index + 300);
101
+ const context = content.substring(contextStart, contextEnd);
102
+
103
+ // Skip empty style objects - these are harmless placeholders
104
+ // Check if the style attribute contains only empty braces: style={{}}
105
+ // Look ahead from the match position to find the closing braces
106
+ const afterMatch = content.substring(styleMatch.index, Math.min(content.length, styleMatch.index + 50));
107
+ // Match patterns like: style={{}} or style={{ }} or style={{ }}
108
+ const isEmptyStyle = /style\s*=\s*\{\s*\{\s*\}\s*\}/.test(afterMatch);
109
+ if (isEmptyStyle) {
110
+ continue; // Skip empty style objects
111
+ }
112
+
113
+ // Skip legitimate inline styles that can't be replaced with Tailwind:
114
+ // 1. Dynamic positioning (top/bottom based on direction)
115
+ // 2. Dynamic maxHeight/maxWidth from props
116
+ // 3. Virtual scrolling styles (transform, position: absolute with dynamic values)
117
+ // 4. Dynamic height/width from props or calculations
118
+ // 5. Dynamic indentation/padding for hierarchical data
119
+ const isDynamicPositioning = context.includes('[opensUpward') ||
120
+ context.includes('direction') ||
121
+ context.includes('opensUpward ?') ||
122
+ context.includes('direction ===');
123
+
124
+ const isVirtualization = context.includes('transform') &&
125
+ (context.includes('translateY') || context.includes('translateX')) &&
126
+ (context.includes('virtualRow') || context.includes('virtualItem') || context.includes('virtualizer'));
127
+
128
+ const isDynamicSize = (context.includes('maxHeight') || context.includes('maxWidth') ||
129
+ context.includes('minHeight') || context.includes('minWidth') ||
130
+ context.includes('height:') || context.includes('width:') ||
131
+ context.includes('totalSize') || context.includes('virtualRow.size')) &&
132
+ !context.includes('style={{}}'); // But not empty objects
133
+
134
+ // Skip dynamic indentation/padding for hierarchical rows
135
+ const isDynamicIndentation = (context.includes('paddingLeft') || context.includes('paddingRight') ||
136
+ context.includes('indentation') || context.includes('indent')) &&
137
+ (context.includes('px') || context.includes('${'));
138
+
139
+ // Skip if it's just pointerEvents and className already has pointer-events-none
140
+ const isRedundantPointerEvents = context.includes('pointerEvents') &&
141
+ context.includes('pointer-events-none');
142
+
143
+ // Skip text overflow styles that are necessary for ellipsis
144
+ const isTextOverflow = context.includes('textOverflow') ||
145
+ context.includes('whiteSpace') ||
146
+ context.includes('overflow:') && context.includes('hidden');
147
+
148
+ if (isDynamicPositioning || isVirtualization || (isDynamicSize && !isEmptyStyle) || isTextOverflow || isDynamicIndentation) {
149
+ continue; // Skip dynamic styles that require runtime values
150
+ }
151
+
152
+ if (isRedundantPointerEvents) {
153
+ continue; // Skip redundant pointer events
154
+ }
155
+
156
+ warnings.push({
157
+ type: 'inline-style',
158
+ file: relativePath,
159
+ line: getLineNumber(content, styleMatch.index),
160
+ message: 'Inline style detected',
161
+ recommendation: 'Use Tailwind classes or pace-core component props instead of inline styles'
162
+ });
163
+ }
164
+
165
+ // Check for console.log in non-test files, but exclude CLI scripts and development utilities
166
+ if (!relativePath.includes('.test.') && !relativePath.includes('.spec.')) {
167
+ // Check if this is a CLI script (has shebang or is in scripts/ directory)
168
+ const isCLIScript = content.startsWith('#!/usr/bin/env node') ||
169
+ content.startsWith('#!/bin/node') ||
170
+ content.startsWith('#!/bin/env node') ||
171
+ relativePath.includes('/scripts/') ||
172
+ relativePath.startsWith('scripts/');
173
+
174
+ // Skip RBAC config - it's a logger utility that intentionally uses console methods
175
+ const isRBACConfig = normalizedPath.includes('/rbac/config');
176
+
177
+ // Skip development utilities - these are meant to log to console
178
+ const isDevUtility = normalizedPath.includes('/utils/performance/') ||
179
+ normalizedPath.includes('/utils/debug/') ||
180
+ normalizedPath.includes('/utils/development/');
181
+
182
+ if (!isCLIScript && !isRBACConfig && !isDevUtility) {
183
+ const consoleLogPattern = /console\.(log|debug|info)\s*\(/g;
184
+ let consoleMatch;
185
+ while ((consoleMatch = consoleLogPattern.exec(content)) !== null) {
186
+ // Skip if it's in a comment (JSDoc examples, etc.)
187
+ const beforeMatch = content.substring(Math.max(0, consoleMatch.index - 150), consoleMatch.index);
188
+ const afterMatch = content.substring(consoleMatch.index, Math.min(content.length, consoleMatch.index + 50));
189
+
190
+ // Check if it's in a comment block (JSDoc, regular comments)
191
+ // Look for JSDoc comment markers (* at start of line) or regular comment markers
192
+ const isInJSDocComment = beforeMatch.match(/\n\s*\*\s/) || beforeMatch.match(/\/\*\*/);
193
+ const isInRegularComment = beforeMatch.includes('//') || beforeMatch.includes('/*');
194
+ const isInComment = isInJSDocComment || isInRegularComment;
195
+
196
+ // Check if it's in a code example within JSDoc (between ``` markers or in @example blocks)
197
+ const beforeCode = content.substring(Math.max(0, consoleMatch.index - 500), consoleMatch.index);
198
+ const isInCodeBlock = beforeCode.includes('```') &&
199
+ (beforeCode.match(/```/g) || []).length % 2 === 1; // Odd number of ``` means we're inside a code block
200
+ const isInJSDocExample = beforeMatch.match(/\*\s*@example/) ||
201
+ beforeMatch.match(/\*\s*```/) ||
202
+ beforeMatch.match(/\*\s*</); // JSX in JSDoc examples
203
+ const isInCodeExample = isInCodeBlock || isInJSDocExample;
204
+
205
+ // Check if it's wrapped in a development check (process.env.NODE_ENV === 'development')
206
+ const contextForDevCheck = content.substring(Math.max(0, consoleMatch.index - 200), Math.min(content.length, consoleMatch.index + 200));
207
+ const isInDevCheck = contextForDevCheck.includes('process.env.NODE_ENV') &&
208
+ (contextForDevCheck.includes("=== 'development'") ||
209
+ contextForDevCheck.includes('=== "development"') ||
210
+ contextForDevCheck.includes("== 'development'") ||
211
+ contextForDevCheck.includes('== "development"'));
212
+
213
+ if (isInComment || isInCodeExample || isInDevCheck) {
214
+ continue; // Skip console.log in comments/documentation/code examples or development checks
215
+ }
216
+
217
+ warnings.push({
218
+ type: 'console-log',
219
+ file: relativePath,
220
+ line: getLineNumber(content, consoleMatch.index),
221
+ message: `console.${consoleMatch[1]} found in production code`,
222
+ recommendation: 'Remove console.log statements or use a proper logging utility. CLI scripts in scripts/ directory are allowed to use console output.'
223
+ });
224
+ }
225
+ }
226
+ }
227
+
228
+ // Check for 'any' type usage in TypeScript files
229
+ if (filePath.match(/\.(ts|tsx)$/)) {
230
+ const anyTypePattern = /:\s*any\b|<\s*any\s*>|any\[\]/g;
231
+ let anyMatch;
232
+ while ((anyMatch = anyTypePattern.exec(content)) !== null) {
233
+ // Skip if it's in a comment or string
234
+ const beforeMatch = content.substring(Math.max(0, anyMatch.index - 50), anyMatch.index);
235
+ const isInComment = beforeMatch.includes('//') || beforeMatch.includes('/*');
236
+
237
+ if (isInComment) {
238
+ continue;
239
+ }
240
+
241
+ // Skip legitimate any[] usage in variadic function arguments (e.g., logger utilities)
242
+ const contextMatch = content.substring(Math.max(0, anyMatch.index - 100), Math.min(content.length, anyMatch.index + 50));
243
+ const isVariadicArg = contextMatch.match(/\.\.\.\s*args?\s*:\s*any\[\]/) ||
244
+ contextMatch.match(/\.\.\.\s*args?\s*:\s*any\b/);
245
+ if (isVariadicArg) {
246
+ continue; // Skip variadic arguments - these are legitimate uses of any[]
247
+ }
248
+
249
+ // Skip generic cache implementations where any is used for value types
250
+ const isCacheGeneric = contextMatch.includes('CacheEntry<any>') ||
251
+ contextMatch.includes('Map<string, any>') ||
252
+ (contextMatch.includes('Map<') && contextMatch.includes('any>')) ||
253
+ (contextMatch.includes('Map<') && contextMatch.includes('any')) ||
254
+ (contextMatch.includes('cache') && (contextMatch.includes('data: any') || contextMatch.includes('{ data: any'))) ||
255
+ (contextMatch.includes('Cache') && contextMatch.includes('any')) ||
256
+ (contextMatch.includes('new Map') && contextMatch.includes('any'));
257
+ if (isCacheGeneric) {
258
+ continue; // Skip generic cache types - these are legitimate
259
+ }
260
+
261
+ // Skip generic component types (React.ComponentType<any>, etc.)
262
+ const isGenericComponentType = contextMatch.includes('ComponentType<any>') ||
263
+ contextMatch.includes('React.ComponentType<any>') ||
264
+ (contextMatch.includes('ComponentType') && contextMatch.includes('<any>'));
265
+ if (isGenericComponentType) {
266
+ continue; // Skip generic component types - necessary for dynamic components
267
+ }
268
+
269
+ // Skip generic Promise callbacks
270
+ const isPromiseCallback = contextMatch.includes('Promise<any>') ||
271
+ contextMatch.includes('Promise<') && contextMatch.includes('any>') ||
272
+ (contextMatch.includes('Promise') && contextMatch.includes('() => Promise<any>'));
273
+ if (isPromiseCallback) {
274
+ continue; // Skip Promise callbacks with any - necessary for generic async operations
275
+ }
276
+
277
+ // Skip props: any in generic wrapper components
278
+ const isGenericProps = (contextMatch.includes('props: any') || contextMatch.includes('props?: any')) &&
279
+ (normalizedPath.includes('/utils/') || normalizedPath.includes('/components/'));
280
+ if (isGenericProps) {
281
+ continue; // Skip generic props - necessary for wrapper components
282
+ }
283
+
284
+ // Skip this: any in utility functions (throttle, debounce, etc.) - necessary for preserving context
285
+ const isThisContext = contextMatch.includes('this: any') &&
286
+ (normalizedPath.includes('/hooks/') || normalizedPath.includes('/utils/'));
287
+ if (isThisContext) {
288
+ continue; // Skip this: any - necessary for function binding utilities
289
+ }
290
+
291
+ // Skip any types in generic library components (DataTable, RBAC, etc.)
292
+ // These are necessary for flexibility when working with unknown data structures
293
+ const isGenericLibraryCode =
294
+ // DataTable components - any is necessary for row data flexibility and generic components
295
+ (normalizedPath.includes('/DataTable/') || normalizedPath.includes('/DataTable.tsx')) ||
296
+ // RBAC code - needs any to work with Supabase's dynamic types and unknown data structures
297
+ (normalizedPath.includes('/rbac/')) ||
298
+ // Generic utility functions that need to work with unknown types
299
+ (normalizedPath.includes('/utils/') && (
300
+ contextMatch.includes('unknown') ||
301
+ contextMatch.includes('Record<string') ||
302
+ contextMatch.includes('lazyLoad') ||
303
+ contextMatch.includes('dynamic')
304
+ )) ||
305
+ // Form components that work with generic form data
306
+ (normalizedPath.includes('/Form/') && (
307
+ contextMatch.includes('formData') ||
308
+ contextMatch.includes('values:')
309
+ )) ||
310
+ // React.ReactElement<any> - common React pattern for generic elements
311
+ contextMatch.includes('React.ReactElement<any>') ||
312
+ contextMatch.includes('ReactElement<any>') ||
313
+ // Icon props - common pattern for icon components (can be any icon type)
314
+ (contextMatch.includes('icon') && (contextMatch.includes('?: any') || contextMatch.includes(': any'))) ||
315
+ // Callback functions with generic row/data parameters
316
+ (contextMatch.includes('onClick') && contextMatch.includes('(row: any)')) ||
317
+ (contextMatch.includes('onClick') && contextMatch.includes('(data: any)')) ||
318
+ (contextMatch.includes('callback') && contextMatch.includes(': any')) ||
319
+ // Generic hooks that work with unknown data - exclude all hooks in /hooks/public/ and specific hook files
320
+ (normalizedPath.includes('/hooks/public/')) ||
321
+ (normalizedPath.includes('/hooks/useDataTable')) ||
322
+ (normalizedPath.includes('/hooks/useFileDisplay')) ||
323
+ (normalizedPath.includes('/hooks/useQueryCache')) ||
324
+ (normalizedPath.includes('/hooks/useDataTablePerformance')) ||
325
+ (normalizedPath.includes('/hooks/useDataTableState')) ||
326
+ (normalizedPath.includes('/hooks/useInactivityTracker')) ||
327
+ (normalizedPath.includes('/hooks/') && (
328
+ contextMatch.includes('useDataTable') ||
329
+ contextMatch.includes('useFileDisplay') ||
330
+ contextMatch.includes('usePublic') ||
331
+ contextMatch.includes('useQueryCache') ||
332
+ contextMatch.includes('useInactivityTracker')
333
+ )) ||
334
+ // Calendar component - works with generic event data
335
+ (normalizedPath.includes('/Calendar/')) ||
336
+ // Select component - works with generic option values
337
+ (normalizedPath.includes('/Select/') && (
338
+ contextMatch.includes('value:') ||
339
+ contextMatch.includes('option')
340
+ )) ||
341
+ // OrganisationProvider - works with dynamic organisation data
342
+ (normalizedPath.includes('OrganisationProvider')) ||
343
+ // Theming utilities - work with dynamic color data
344
+ (normalizedPath.includes('/theming/')) ||
345
+ // Services that work with Supabase data - exclude all services working with dynamic data
346
+ (normalizedPath.includes('/services/') && (
347
+ contextMatch.includes('Supabase') ||
348
+ contextMatch.includes('Database') ||
349
+ contextMatch.includes('forEach') ||
350
+ contextMatch.includes('role: any') ||
351
+ contextMatch.includes('data: any') ||
352
+ contextMatch.includes(': any)')
353
+ )) ||
354
+ // Utils directory - many generic utilities, exclude dynamic and request utilities
355
+ (normalizedPath.includes('/utils/dynamic/')) ||
356
+ (normalizedPath.includes('/utils/request-')) ||
357
+ (normalizedPath.includes('/utils/') && (
358
+ contextMatch.includes('lazyLoad') ||
359
+ contextMatch.includes('createLazyComponent') ||
360
+ contextMatch.includes('request-deduplication')
361
+ ));
362
+
363
+ if (isGenericLibraryCode) {
364
+ continue; // Skip legitimate any usage in generic library code
365
+ }
366
+
367
+ warnings.push({
368
+ type: 'any-type',
369
+ file: relativePath,
370
+ line: getLineNumber(content, anyMatch.index),
371
+ message: 'TypeScript any type usage detected',
372
+ recommendation: 'Replace any with proper types for better type safety'
373
+ });
374
+ }
375
+
376
+ // Check for missing return types on exported functions
377
+ // Skip React components and hooks where TypeScript inference is sufficient
378
+ const exportedFunctionPattern = /export\s+(?:default\s+)?(?:async\s+)?(function|const)\s+(\w+)\s*[=\(]/g;
379
+ let funcMatch;
380
+ while ((funcMatch = exportedFunctionPattern.exec(content)) !== null) {
381
+ const funcName = funcMatch[2];
382
+ // Get more context to handle multi-line function signatures
383
+ const startPos = funcMatch.index;
384
+ const afterMatch = content.substring(startPos, Math.min(content.length, startPos + 800));
385
+
386
+ // For const declarations, check if it's actually a function (arrow function)
387
+ // Skip const declarations that are just values (zod schemas, objects, etc.)
388
+ if (funcMatch[1] === 'const') {
389
+ // Extract the part after the equals sign to check what follows
390
+ const equalsIndex = afterMatch.indexOf('=');
391
+ if (equalsIndex === -1) {
392
+ continue; // No equals sign found, skip
393
+ }
394
+
395
+ const afterEquals = afterMatch.substring(equalsIndex + 1).trim();
396
+
397
+ // Check if it's an arrow function: const name = (...) => ... or const name = async (...) => ...
398
+ const isArrowFunction = /^\s*(?:async\s+)?\([^)]*\)\s*=>/.test(afterEquals) ||
399
+ /^\s*(?:async\s+)?\w+\s*=>/.test(afterEquals) ||
400
+ /^\s*\([^)]*\)\s*:\s*\w+\s*=>/.test(afterEquals);
401
+
402
+ // If it's not an arrow function, it's a const value (zod schema, object, etc.)
403
+ if (!isArrowFunction) {
404
+ continue; // Skip const values - not functions
405
+ }
406
+
407
+ // Additional check: if it looks like a value assignment before the arrow function
408
+ // Pattern: const name = z.string()... or const name = new Class()... or const name = {...}
409
+ // But only if there's no arrow function syntax
410
+ const looksLikeValueBeforeArrow = /=\s*(z\.|new\s+\w+\(|\[|{|\d+|'|"|`|true|false|null)/.test(afterMatch);
411
+ if (looksLikeValueBeforeArrow && !isArrowFunction) {
412
+ continue; // Skip const values
413
+ }
414
+ }
415
+
416
+ // Skip React hooks - TypeScript infers return types well for hooks
417
+ if (funcName.startsWith('use') && funcName.length > 3) {
418
+ continue; // Skip hooks - inference is sufficient
419
+ }
420
+
421
+ // Skip React components - TypeScript infers JSX.Element well
422
+ // Check if function returns JSX (has return statement with JSX or is a component pattern)
423
+ const hasJSXReturn = afterMatch.includes('return (') ||
424
+ afterMatch.includes('return <') ||
425
+ afterMatch.includes('return React') ||
426
+ (afterMatch.includes('React.') && afterMatch.includes('createElement'));
427
+
428
+ // Check if it's a React component by name pattern (PascalCase, ends with Provider, etc.)
429
+ const isComponentName = /^[A-Z]/.test(funcName) ||
430
+ funcName.endsWith('Provider') ||
431
+ funcName.endsWith('Layout') ||
432
+ funcName.endsWith('Modal') ||
433
+ funcName.endsWith('Form') ||
434
+ funcName.endsWith('Button') ||
435
+ funcName.endsWith('Input') ||
436
+ funcName.endsWith('Select');
437
+
438
+ if (hasJSXReturn || isComponentName) {
439
+ continue; // Skip React components - inference is sufficient
440
+ }
441
+
442
+ // Skip simple utility functions where return type is obvious
443
+ // (e.g., getX, isX, hasX, createX, parseX, validateX, etc.)
444
+ const isSimpleUtility = /^(get|is|has|create|parse|validate|format|to|from|can|should|will|do|make|build|generate|find|search|filter|map|reduce|sort|compare|check|test|verify|ensure|normalize|sanitize|escape|unescape|encode|decode)/i.test(funcName);
445
+ if (isSimpleUtility && afterMatch.length < 150) {
446
+ // Only skip if function is relatively simple (short context)
447
+ continue; // Skip simple utilities - inference is usually sufficient
448
+ }
449
+
450
+ // Check if function has explicit return type
451
+ if (funcMatch[1] === 'function') {
452
+ // function name(...): returnType
453
+ // Look for closing paren followed by colon and then any type annotation
454
+ // This matches: ): Type, ): Promise<Type>, ): 'type' | 'type', ): { ... }, etc.
455
+ // Handle both single-line and multi-line function signatures
456
+
457
+ // Find the function body opening brace
458
+ const braceIndex = afterMatch.indexOf('{');
459
+ if (braceIndex === -1) {
460
+ continue; // No function body found, might be a type declaration
461
+ }
462
+
463
+ // Get everything before the opening brace (the function signature)
464
+ const funcSignature = afterMatch.substring(0, braceIndex);
465
+
466
+ // Check if there's a return type annotation
467
+ // Look for closing paren followed by colon (allowing whitespace/newlines)
468
+ // Then check for any non-whitespace character (start of return type)
469
+ // This handles:
470
+ // - ): Type
471
+ // - ): Promise<void>
472
+ // - ): 'type' | 'type'
473
+ // - ): { ... }
474
+ // - Multi-line: )\n: Type
475
+ // - Multi-line async: )\n: Promise<Type>
476
+
477
+ // Find the last closing paren (end of parameter list)
478
+ // Then check if there's a colon after it (return type annotation)
479
+ let lastParenIndex = -1;
480
+ let depth = 0;
481
+ let inString = false;
482
+ let stringChar = '';
483
+
484
+ // Find the last closing paren that's not inside nested parens (parameter list end)
485
+ // Start from the function name position to find the opening paren of the parameter list
486
+ const funcNameMatch = funcSignature.match(new RegExp(`\\b${funcName}\\s*\\(`));
487
+ const startSearchIndex = funcNameMatch ? funcNameMatch.index + funcNameMatch[0].length - 1 : 0;
488
+
489
+ for (let i = startSearchIndex; i < funcSignature.length; i++) {
490
+ const char = funcSignature[i];
491
+
492
+ // Handle string literals
493
+ if ((char === '"' || char === "'" || char === '`') && (i === 0 || funcSignature[i - 1] !== '\\')) {
494
+ if (!inString) {
495
+ inString = true;
496
+ stringChar = char;
497
+ } else if (char === stringChar) {
498
+ inString = false;
499
+ stringChar = '';
500
+ }
501
+ }
502
+
503
+ if (!inString) {
504
+ if (char === '(') depth++;
505
+ else if (char === ')') {
506
+ depth--;
507
+ if (depth === 0) {
508
+ lastParenIndex = i; // This is the end of the parameter list
509
+ }
510
+ }
511
+ }
512
+ }
513
+
514
+ // Check if there's a return type after the last closing paren
515
+ let hasReturnType = false;
516
+ if (lastParenIndex >= 0) {
517
+ const afterLastParen = funcSignature.substring(lastParenIndex);
518
+ // Look for colon followed by non-whitespace (return type)
519
+ // Normalize whitespace to handle multi-line signatures
520
+ const normalizedAfterParen = afterLastParen.replace(/\s+/g, ' ');
521
+ hasReturnType = /\)\s*:\s*\S/.test(normalizedAfterParen);
522
+ } else {
523
+ // Fallback: check if there's a colon anywhere in the signature (might be a return type)
524
+ // This handles edge cases where paren tracking might fail
525
+ const hasColonBeforeBrace = funcSignature.includes(':') &&
526
+ funcSignature.lastIndexOf(':') < braceIndex &&
527
+ funcSignature.lastIndexOf(':') > funcSignature.indexOf('(');
528
+ if (hasColonBeforeBrace) {
529
+ // Check if the colon is followed by a type (not a default value)
530
+ const colonIndex = funcSignature.lastIndexOf(':');
531
+ const afterColon = funcSignature.substring(colonIndex + 1, braceIndex).trim();
532
+ // If after colon we see a type-like pattern (starts with letter, Promise, {, [, etc.)
533
+ hasReturnType = /^[A-Za-z_$]|^Promise|^\{|^\[|^'|^"/.test(afterColon);
534
+ }
535
+ }
536
+
537
+ if (!hasReturnType) {
538
+ suggestions.push({
539
+ type: 'missing-return-type',
540
+ file: relativePath,
541
+ line: getLineNumber(content, funcMatch.index),
542
+ message: `Exported function '${funcName}' missing explicit return type`,
543
+ recommendation: 'Add explicit return type annotation for better type safety'
544
+ });
545
+ }
546
+ } else {
547
+ // const name = (...) => ...
548
+ // Check if arrow function has return type
549
+ // Match: const name = (...): ReturnType => ...
550
+ // Look for ): before the => arrow
551
+ const arrowIndex = afterMatch.indexOf('=>');
552
+ if (arrowIndex > 0) {
553
+ const beforeArrow = afterMatch.substring(0, arrowIndex);
554
+ // Check if there's a return type annotation (): Type) before the arrow
555
+ // Normalize newlines to spaces for matching
556
+ const hasArrowReturnType = /\)\s*:\s*\S/.test(beforeArrow.replace(/\n/g, ' '));
557
+
558
+ if (!hasArrowReturnType) {
559
+ suggestions.push({
560
+ type: 'missing-return-type',
561
+ file: relativePath,
562
+ line: getLineNumber(content, funcMatch.index),
563
+ message: `Exported function '${funcName}' missing explicit return type`,
564
+ recommendation: 'Add explicit return type annotation: const name = (...): ReturnType => ...'
565
+ });
566
+ }
567
+ }
568
+ }
569
+ }
570
+ }
571
+
572
+ // Check for inconsistent naming (simplified)
573
+ // This would need more sophisticated analysis
574
+
575
+ } catch (error) {
576
+ // Skip files with errors
577
+ }
578
+ }
579
+
580
+ return { issues, warnings, suggestions };
581
+ }
582
+ };
583
+
584
+ module.exports = styleCheck;