@jmruthers/pace-core 0.6.5 → 0.6.7

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 (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -1,207 +1,14 @@
1
- import {
2
- ALL_PERMISSIONS,
3
- AccessLevelGuard,
4
- EVENT_APP_PERMISSIONS,
5
- EnhancedNavigationMenu,
6
- GLOBAL_PERMISSIONS,
7
- NavigationGuard,
8
- NavigationProvider,
9
- ORGANISATION_PERMISSIONS,
10
- PAGE_PERMISSIONS,
11
- PagePermissionGuard,
12
- PagePermissionProvider,
13
- PermissionEnforcer,
14
- PermissionGuard,
15
- RBACErrorCode,
16
- RPCFunction,
17
- RoleBasedRouter,
18
- SecureDataProvider,
19
- checkRuntimeCompliance,
20
- createRBACExpressMiddleware,
21
- createRBACMiddleware,
22
- getCustomAuthCodeFixes,
23
- getDirectSupabaseAuthFixes,
24
- getDuplicateConfigFixes,
25
- getQuickFixes,
26
- getSetupIssues,
27
- getUnprotectedPageFixes,
28
- hasAnyPermissionCached,
29
- hasPermissionCached,
30
- isRBACInitialized,
31
- isValidPermission,
32
- useNavigationPermissions,
33
- usePagePermissions,
34
- useRoleBasedRouter,
35
- useSecureData,
36
- validateAndWarn,
37
- validateDatabaseConfiguration,
38
- validateRBACSetup,
39
- withAccessLevelGuard,
40
- withPermissionGuard,
41
- withRoleGuard
42
- } from "../chunk-G7QEZTYQ.js";
43
- import {
44
- SECURE_CLIENT_SYMBOL,
45
- SecureSupabaseClient,
46
- createSecureClient,
47
- fromSupabaseClient,
48
- isSecureClient,
49
- useAccessLevel,
50
- useCachedPermissions,
51
- useCan,
52
- useHasAllPermissions,
53
- useHasAnyPermission,
54
- useMultiplePermissions,
55
- usePermissions,
56
- useRBAC,
57
- useResolvedScope,
58
- useResourcePermissions,
59
- useRoleManagement,
60
- useSecureSupabase,
61
- warnIfInsecureClient
62
- } from "../chunk-HU2C6SSC.js";
63
- import "../chunk-NTM7ZSB6.js";
64
- import "../chunk-KQCRWDSA.js";
65
- import "../chunk-IHB5DR3H.js";
66
- import {
67
- CACHE_PATTERNS,
68
- RBACCache,
69
- RBACEngine,
70
- clearInFlightRequests,
71
- createRBACConfig,
72
- createRBACEngine,
73
- disablePerformanceMonitoring,
74
- enablePerformanceMonitoring,
75
- getAccessLevel,
76
- getInFlightRequestCount,
77
- getPerformanceMetrics,
78
- getPerformanceSummary,
79
- getPermissionMap,
80
- getRBACConfig,
81
- getRBACLogger,
82
- getRoleContext,
83
- hasAllPermissions,
84
- hasAnyPermission,
85
- hasPermission,
86
- isDebugMode,
87
- isDevelopmentMode,
88
- isPerformanceMonitoringEnabled,
89
- isPermitted,
90
- isPermittedCached,
91
- rbacCache,
92
- recordAuditEvent,
93
- recordPermissionCheck,
94
- resetPerformanceMetrics,
95
- resolveAppContext,
96
- setupRBAC
97
- } from "../chunk-EFN2EIMK.js";
98
- import {
99
- RBACAuditManager,
100
- createAuditManager,
101
- emitAuditEvent,
102
- getGlobalAuditManager,
103
- setGlobalAuditManager
104
- } from "../chunk-63FOKYGO.js";
105
- import "../chunk-AFVQODI2.js";
106
- import "../chunk-QXHPKYJV.js";
107
- import "../chunk-M7MPQISP.js";
108
- import "../chunk-FMUCXFII.js";
109
- import "../chunk-VBXEHIUJ.js";
110
- import "../chunk-PWLANIRT.js";
111
- import "../chunk-DGUM43GV.js";
112
- export {
113
- ALL_PERMISSIONS,
114
- AccessLevelGuard,
115
- CACHE_PATTERNS,
116
- EVENT_APP_PERMISSIONS,
117
- EnhancedNavigationMenu,
118
- GLOBAL_PERMISSIONS,
119
- NavigationGuard,
120
- NavigationProvider,
121
- ORGANISATION_PERMISSIONS,
122
- PAGE_PERMISSIONS,
123
- PagePermissionGuard,
124
- PagePermissionProvider,
125
- PermissionEnforcer,
126
- PermissionGuard,
127
- RBACAuditManager,
128
- RBACCache,
129
- RBACEngine,
130
- RBACErrorCode,
131
- RPCFunction,
132
- RoleBasedRouter,
133
- SECURE_CLIENT_SYMBOL,
134
- SecureDataProvider,
135
- SecureSupabaseClient,
136
- checkRuntimeCompliance,
137
- clearInFlightRequests,
138
- createAuditManager,
139
- createRBACConfig,
140
- createRBACEngine,
141
- createRBACExpressMiddleware,
142
- createRBACMiddleware,
143
- createSecureClient,
144
- disablePerformanceMonitoring,
145
- emitAuditEvent,
146
- enablePerformanceMonitoring,
147
- fromSupabaseClient,
148
- getAccessLevel,
149
- getCustomAuthCodeFixes,
150
- getDirectSupabaseAuthFixes,
151
- getDuplicateConfigFixes,
152
- getGlobalAuditManager,
153
- getInFlightRequestCount,
154
- getPerformanceMetrics,
155
- getPerformanceSummary,
156
- getPermissionMap,
157
- getQuickFixes,
158
- getRBACConfig,
159
- getRBACLogger,
160
- getRoleContext,
161
- getSetupIssues,
162
- getUnprotectedPageFixes,
163
- hasAllPermissions,
164
- hasAnyPermission,
165
- hasAnyPermissionCached,
166
- hasPermission,
167
- hasPermissionCached,
168
- isDebugMode,
169
- isDevelopmentMode,
170
- isPerformanceMonitoringEnabled,
171
- isPermitted,
172
- isPermittedCached,
173
- isRBACInitialized,
174
- isSecureClient,
175
- isValidPermission,
176
- rbacCache,
177
- recordAuditEvent,
178
- recordPermissionCheck,
179
- resetPerformanceMetrics,
180
- resolveAppContext,
181
- setGlobalAuditManager,
182
- setupRBAC,
183
- useAccessLevel,
184
- useCachedPermissions,
185
- useCan,
186
- useHasAllPermissions,
187
- useHasAnyPermission,
188
- useMultiplePermissions,
189
- useNavigationPermissions,
190
- usePagePermissions,
191
- usePermissions,
192
- useRBAC,
193
- useResolvedScope,
194
- useResourcePermissions,
195
- useRoleBasedRouter,
196
- useRoleManagement,
197
- useSecureData,
198
- useSecureSupabase,
199
- validateAndWarn,
200
- validateDatabaseConfiguration,
201
- validateRBACSetup,
202
- warnIfInsecureClient,
203
- withAccessLevelGuard,
204
- withPermissionGuard,
205
- withRoleGuard
206
- };
207
- //# sourceMappingURL=index.js.map
1
+ export { ALL_PERMISSIONS, EVENT_APP_PERMISSIONS, GLOBAL_PERMISSIONS, NavigationGuard, ORGANISATION_PERMISSIONS, PAGE_PERMISSIONS, PagePermissionGuard, RBACErrorCode, RPCFunction, checkRuntimeCompliance, createRBACExpressMiddleware, createRBACMiddleware, getCustomAuthCodeFixes, getDirectSupabaseAuthFixes, getDuplicateConfigFixes, getQuickFixes, getSetupIssues, getUnprotectedPageFixes, isRBACInitialized, isValidPermission, validateAndWarn, validateDatabaseConfiguration, validateRBACSetup, withAccessLevelGuard, withPermissionGuard, withRoleGuard } from '../chunk-GHYHJTYV.js';
2
+ export { AccessDenied } from '../chunk-6F3IILHI.js';
3
+ export { SECURE_CLIENT_SYMBOL, SecureSupabaseClient, createSecureClient, fromSupabaseClient, isSecureClient, useAccessLevel, useCan, useMultiplePermissions, usePermissions, useRBAC, useResolvedScope, useResourcePermissions, useRoleManagement, useSecureSupabase, warnIfInsecureClient } from '../chunk-BM4CQ5P3.js';
4
+ import '../chunk-VBCS3DUA.js';
5
+ import '../chunk-C7NSAPTL.js';
6
+ import '../chunk-FTCRZOG2.js';
7
+ export { CACHE_PATTERNS, RBACCache, RBACEngine, clearInFlightRequests, createRBACConfig, createRBACEngine, disablePerformanceMonitoring, enablePerformanceMonitoring, getAccessLevel, getInFlightRequestCount, getPerformanceMetrics, getPerformanceSummary, getPermissionMap, getRBACConfig, getRBACLogger, getRoleContext, hasAllPermissions, hasAnyPermission, isDebugMode, isDevelopmentMode, isPerformanceMonitoringEnabled, isPermitted, isPermittedCached, rbacCache, recordAuditEvent, recordPermissionCheck, resetPerformanceMetrics, resolveAppContext, setupRBAC } from '../chunk-ZFYPMX46.js';
8
+ export { RBACAuditManager, createAuditManager, emitAuditEvent, getGlobalAuditManager, setGlobalAuditManager } from '../chunk-AHU7G2R5.js';
9
+ import '../chunk-4SXLQIZO.js';
10
+ import '../chunk-OJ4SKRSV.js';
11
+ import '../chunk-7ILTDCL2.js';
12
+ import '../chunk-HF6O3O37.js';
13
+ import '../chunk-TTRFSOKR.js';
14
+ import '../chunk-3RG5ZIWI.js';
@@ -1,12 +1,2 @@
1
- import {
2
- getAllStylePaths,
3
- getStylePath,
4
- styleConfig
5
- } from "../chunk-5DRSZLL2.js";
6
- import "../chunk-DGUM43GV.js";
7
- export {
8
- getAllStylePaths,
9
- getStylePath,
10
- styleConfig
11
- };
12
- //# sourceMappingURL=index.js.map
1
+ export { getAllStylePaths, getStylePath, styleConfig } from '../chunk-UH3NTO3F.js';
2
+ import '../chunk-3RG5ZIWI.js';
@@ -11,7 +11,8 @@
11
11
  * Parse and normalize event_colours to PaletteData
12
12
  *
13
13
  * Supports input formats:
14
- * - Object with 'main', 'sec', 'acc' keys
14
+ * - Object with 'main', 'sec', 'acc' keys (standard format)
15
+ * - Object with 'ev-main', 'ev-sec', 'ev-acc' keys (database format with prefix)
15
16
  * - JSON string that will be parsed
16
17
  *
17
18
  * Only includes explicitly defined color values. Does not fill
@@ -33,6 +34,18 @@
33
34
  * // Returns: { main: { 500: {...}, raw: {...} }, sec: { 500: {...} }, acc: { 500: {...} } }
34
35
  * ```
35
36
  *
37
+ * @example
38
+ * ```ts
39
+ * // Database format with ev- prefix
40
+ * const colours = {
41
+ * 'ev-main': { 500: { L: 0.5, C: 0.2, H: 0 } },
42
+ * 'ev-sec': { 500: { L: 0.5, C: 0.2, H: 120 } },
43
+ * 'ev-acc': { 500: { L: 0.5, C: 0.2, H: 240 } }
44
+ * };
45
+ * const palette = parseAndNormalizeEventColours(colours);
46
+ * // Returns: { main: { 500: {...} }, sec: { 500: {...} }, acc: { 500: {...} } }
47
+ * ```
48
+ *
36
49
  */
37
50
  declare function parseAndNormalizeEventColours(input: unknown): {
38
51
  main: any;
@@ -1,19 +1,3 @@
1
- import {
2
- applyPalette,
3
- clearPalette,
4
- generateSSRThemeCSS,
5
- getCurrentThemeData,
6
- isDynamicThemingActive,
7
- parseAndNormalizeEventColours
8
- } from "../chunk-L4OXEN46.js";
9
- import "../chunk-PWLANIRT.js";
10
- import "../chunk-DGUM43GV.js";
11
- export {
12
- applyPalette,
13
- clearPalette,
14
- generateSSRThemeCSS,
15
- getCurrentThemeData,
16
- isDynamicThemingActive,
17
- parseAndNormalizeEventColours
18
- };
19
- //# sourceMappingURL=runtime.js.map
1
+ export { applyPalette, clearPalette, generateSSRThemeCSS, getCurrentThemeData, isDynamicThemingActive, parseAndNormalizeEventColours } from '../chunk-ZKAWKYT4.js';
2
+ import '../chunk-TTRFSOKR.js';
3
+ import '../chunk-3RG5ZIWI.js';
@@ -1,6 +1,7 @@
1
1
  import { SupabaseClient } from '@supabase/supabase-js';
2
2
  import { z } from 'zod';
3
3
  import { ClassValue } from 'clsx';
4
+ import { D as Database } from './database.generated-CcnC_DRc.js';
4
5
 
5
6
  /**
6
7
  * Hook for manual session tracking (event switches and session expiration).
@@ -61,6 +62,107 @@ declare function calculatePasswordStrength(password: string): {
61
62
  level: 'very-weak' | 'weak' | 'fair' | 'good' | 'strong';
62
63
  };
63
64
 
65
+ /**
66
+ * @file HTML Sanitization Utilities
67
+ * @package @jmruthers/pace-core
68
+ * @module Utils/Validation/HTMLSanitization
69
+ * @since 0.4.36
70
+ *
71
+ * Utilities for safely rendering HTML content.
72
+ * Provides sanitization and validation for basic HTML elements.
73
+ */
74
+ /**
75
+ * Basic HTML sanitization function using regex-based approach
76
+ * Removes potentially dangerous elements and attributes while preserving basic formatting
77
+ * This approach is more reliable in SSR environments and doesn't require DOM manipulation
78
+ *
79
+ * @param html - The HTML string to sanitize
80
+ * @returns Sanitized HTML string safe for rendering
81
+ *
82
+ * @example
83
+ * ```tsx
84
+ * const safeHtml = sanitizeHtml('<p>Hello <strong>world</strong>!</p>');
85
+ * // Returns: '<p>Hello <strong>world</strong>!</p>'
86
+ *
87
+ * const dangerousHtml = sanitizeHtml('<script>alert("xss")</script><p>Safe content</p>');
88
+ * // Returns: '<p>Safe content</p>'
89
+ * ```
90
+ */
91
+ declare function sanitizeHtml(html: string): string;
92
+ /**
93
+ * Validates if HTML content is safe for rendering
94
+ *
95
+ * @param html - The HTML string to validate
96
+ * @returns Object with validation result and any warnings
97
+ *
98
+ * @example
99
+ * ```tsx
100
+ * const validation = validateHtml('<p>Safe content</p>');
101
+ * console.log(validation.isValid); // true
102
+ * console.log(validation.warnings); // []
103
+ * ```
104
+ */
105
+ declare function validateHtml(html: string): {
106
+ isValid: boolean;
107
+ warnings: string[];
108
+ };
109
+ /**
110
+ * Safely renders HTML content with sanitization
111
+ *
112
+ * @param html - The HTML string to render
113
+ * @param options - Rendering options
114
+ * @returns Object with sanitized HTML and validation info
115
+ *
116
+ * @example
117
+ * ```tsx
118
+ * const result = renderSafeHtml('<p>Hello <strong>world</strong>!</p>');
119
+ * console.log(result.html); // Sanitized HTML
120
+ * console.log(result.isValid); // true
121
+ * ```
122
+ */
123
+ declare function renderSafeHtml(html: string, options?: {
124
+ strict?: boolean;
125
+ logWarnings?: boolean;
126
+ }): {
127
+ html: string;
128
+ isValid: boolean;
129
+ warnings: string[];
130
+ };
131
+
132
+ /**
133
+ * @file Input Sanitization Layer
134
+ * @package @jmruthers/pace-core
135
+ * @module Utils/Validation/Sanitization
136
+ * @since 0.1.0
137
+ *
138
+ * Comprehensive input sanitization utilities to prevent XSS, injection attacks,
139
+ * and other security vulnerabilities.
140
+ */
141
+
142
+ /**
143
+ * Sanitization options for different contexts
144
+ */
145
+ interface SanitizationOptions {
146
+ allowHtml?: boolean;
147
+ allowedTags?: string[];
148
+ maxLength?: number;
149
+ trim?: boolean;
150
+ removeScripts?: boolean;
151
+ removeEvents?: boolean;
152
+ }
153
+ /**
154
+ * Sanitizes user input by removing potentially dangerous characters and patterns
155
+ */
156
+ declare function sanitizeUserInput(input: string, options?: SanitizationOptions): string;
157
+ /**
158
+ * Validates and sanitizes form data using Zod schemas
159
+ */
160
+ declare function sanitizeFormData<T>(data: unknown, schema: z.ZodSchema<T>, sanitizationRules?: Record<string, SanitizationOptions>): {
161
+ success: boolean;
162
+ data?: T;
163
+ error?: string;
164
+ };
165
+
64
166
  /**
65
167
  * @file Secure Data Access Utility
66
168
  * @package @jmruthers/pace-core
@@ -136,6 +238,78 @@ declare function getCurrentAppName(): string;
136
238
  */
137
239
  declare function getCurrentAppId(): string;
138
240
 
241
+ /**
242
+ * @file Base Supabase Client Creation Utility
243
+ * @package @jmruthers/pace-core
244
+ * @module Utils/Supabase
245
+ * @since 0.6.6
246
+ *
247
+ * Restricted wrapper for creating the base Supabase client for UnifiedAuthProvider.
248
+ * This is the ONLY acceptable way to create a Supabase client in consuming apps.
249
+ *
250
+ * @example
251
+ * ```tsx
252
+ * // ✅ CORRECT: In main.tsx, App.tsx, or lib/supabase.ts
253
+ * import { createBaseClient } from '@jmruthers/pace-core';
254
+ *
255
+ * const supabase = createBaseClient(
256
+ * import.meta.env.VITE_SUPABASE_URL,
257
+ * import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
258
+ * );
259
+ *
260
+ * // Pass to UnifiedAuthProvider
261
+ * <UnifiedAuthProvider supabaseClient={supabase} ... />
262
+ * ```
263
+ */
264
+
265
+ /**
266
+ * Create a base Supabase client for UnifiedAuthProvider
267
+ *
268
+ * **CRITICAL**: This function can ONLY be called from:
269
+ * - `src/main.tsx` (or `main.jsx`)
270
+ * - `src/App.tsx` (or `App.jsx`)
271
+ * - `src/lib/supabase.ts` (or `supabase.js`)
272
+ * - `src/supabase.ts` (or `supabase.js`)
273
+ *
274
+ * **DO NOT** use this client directly for queries. Always use `useSecureSupabase()` hook instead.
275
+ *
276
+ * The client is configured with explicit auth options to ensure consistent session persistence:
277
+ * - `persistSession: true` - Sessions are saved to localStorage and restored on page load/refresh
278
+ * - `autoRefreshToken: true` - Tokens are automatically refreshed before expiry
279
+ * - `detectSessionInUrl: true` - Detects and handles OAuth callback URLs
280
+ * - `flowType: 'pkce'` - Uses PKCE flow for enhanced security
281
+ *
282
+ * This configuration ensures that users remain logged in after hard refresh (Cmd+Shift+R)
283
+ * and other browser navigation scenarios across all consuming apps.
284
+ *
285
+ * @param supabaseUrl - Supabase project URL
286
+ * @param supabaseKey - Supabase publishable key or anon key (accepts both legacy anon keys and modern publishable keys)
287
+ * @returns Supabase client instance with auth configuration
288
+ *
289
+ * @throws {Error} If called from an unauthorized file location (development only)
290
+ *
291
+ * @example
292
+ * ```tsx
293
+ * // main.tsx
294
+ * import { createBaseClient } from '@jmruthers/pace-core';
295
+ * import { UnifiedAuthProvider } from '@jmruthers/pace-core';
296
+ *
297
+ * const supabase = createBaseClient(
298
+ * import.meta.env.VITE_SUPABASE_URL,
299
+ * import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
300
+ * );
301
+ *
302
+ * function App() {
303
+ * return (
304
+ * <UnifiedAuthProvider supabaseClient={supabase} appName="MyApp">
305
+ * <YourApp />
306
+ * </UnifiedAuthProvider>
307
+ * );
308
+ * }
309
+ * ```
310
+ */
311
+ declare function createBaseClient(supabaseUrl: string, supabaseKey: string): SupabaseClient<Database>;
312
+
139
313
  /**
140
314
  * @file Production-Safe Logger Utility
141
315
  * @package @jmruthers/pace-core
@@ -520,4 +694,4 @@ declare function roundToNearestMinutes(date: Date, minutesStep?: number): Date;
520
694
  */
521
695
  declare function getTimeZoneDifference(fromTimeZone: string, toTimeZone: string): number;
522
696
 
523
- export { formatTimeInTimeZone as A, getUserTimeZone as B, toZonedTime as C, fromZonedTime as D, roundToNearestMinutes as E, getTimeZoneDifference as F, formatDateTimeForDisplay as G, formatDateOnlyForDisplay as H, formatDateTimeForTable as I, formatDateTimeForMap as J, type DateTimeFormatOptions as K, Logger as L, dateSchema as M, calculatePasswordStrength as N, type SecureDataAccess as S, urlSchema as a, passwordSchema as b, createSecureDataAccess as c, cn as d, emailSchema as e, getCurrentAppName as f, getAppConfig as g, getCurrentAppId as h, createLogger as i, LogLevel as j, type LoggerConfig as k, logger as l, formatDate as m, nameSchema as n, formatTime as o, phoneSchema as p, formatDateTime as q, formatCurrency as r, setAppConfig as s, formatNumber as t, useSessionTracking as u, formatPercent as v, formatCompactNumber as w, formatFileSize as x, formatInTimeZone as y, getTimezoneAbbreviation as z };
697
+ export { formatCompactNumber as A, formatFileSize as B, formatInTimeZone as C, getTimezoneAbbreviation as D, formatTimeInTimeZone as E, getUserTimeZone as F, toZonedTime as G, fromZonedTime as H, roundToNearestMinutes as I, getTimeZoneDifference as J, type SecureDataAccess as K, Logger as L, formatDateTimeForDisplay as M, formatDateOnlyForDisplay as N, formatDateTimeForTable as O, formatDateTimeForMap as P, type DateTimeFormatOptions as Q, validateHtml as R, type SanitizationOptions as S, renderSafeHtml as T, dateSchema as U, calculatePasswordStrength as V, urlSchema as a, passwordSchema as b, sanitizeFormData as c, sanitizeHtml as d, emailSchema as e, createSecureDataAccess as f, cn as g, setAppConfig as h, getAppConfig as i, getCurrentAppName as j, getCurrentAppId as k, createBaseClient as l, logger as m, nameSchema as n, createLogger as o, phoneSchema as p, LogLevel as q, type LoggerConfig as r, sanitizeUserInput as s, formatDate as t, useSessionTracking as u, formatTime as v, formatDateTime as w, formatCurrency as x, formatNumber as y, formatPercent as z };
@@ -176,6 +176,10 @@ declare module '@tanstack/react-table' {
176
176
  /** Column type for styling purposes */
177
177
  type?: 'text' | 'number' | 'date' | 'boolean' | 'custom';
178
178
  }
179
+ interface ColumnDefBase<TData, TValue> {
180
+ /** Alternative accessor key used while editing */
181
+ editAccessorKey?: string;
182
+ }
179
183
  }
180
184
  /**
181
185
  * Base data record type - all DataTable data must extend this
@@ -203,8 +207,6 @@ interface HierarchicalConfig {
203
207
  defaultExpanded?: boolean | string[];
204
208
  /** Callback when expanded state changes */
205
209
  onExpandedChange?: (expandedIds: string[]) => void;
206
- /** Custom expand/collapse button component */
207
- expandButton?: React__default.ComponentType<ExpandButtonProps>;
208
210
  /** Visual indentation for child rows (in pixels) */
209
211
  indentSize?: number;
210
212
  /** Custom styling for parent rows */
@@ -212,21 +214,6 @@ interface HierarchicalConfig {
212
214
  /** Custom styling for child rows */
213
215
  childRowClassName?: string;
214
216
  }
215
- /**
216
- * Props for the expand/collapse button component
217
- */
218
- interface ExpandButtonProps {
219
- /** Row ID */
220
- rowId: string;
221
- /** Whether the row is currently expanded */
222
- isExpanded: boolean;
223
- /** Whether this row has children */
224
- hasChildren: boolean;
225
- /** Click handler */
226
- onClick: () => void;
227
- /** Additional CSS classes */
228
- className?: string;
229
- }
230
217
  /**
231
218
  * Pagination mode determines how data is handled
232
219
  */
@@ -0,0 +1,55 @@
1
+ import * as React from 'react';
2
+ import { P as Permission, A as AccessLevel } from './types-BeoeWV5I.js';
3
+
4
+ /**
5
+ * Navigation mode type
6
+ */
7
+ type NavigationMode = "dropdown" | "hierarchical";
8
+ /**
9
+ * Navigation item metadata
10
+ */
11
+ interface NavigationItemMeta {
12
+ hidden?: boolean;
13
+ [key: string]: unknown;
14
+ }
15
+ /**
16
+ * Navigation item interface
17
+ */
18
+ interface NavigationItem {
19
+ id: string;
20
+ label: string;
21
+ href?: string;
22
+ icon?: string;
23
+ children?: NavigationItem[];
24
+ permissions?: (Permission | string)[];
25
+ roles?: string[];
26
+ accessLevel?: AccessLevel | string;
27
+ meta?: NavigationItemMeta;
28
+ pageId?: string;
29
+ }
30
+ /**
31
+ * Navigation menu component props
32
+ */
33
+ interface NavigationMenuProps extends React.HTMLAttributes<HTMLDivElement> {
34
+ items: NavigationItem[];
35
+ mode?: NavigationMode;
36
+ currentPath?: string;
37
+ onNavigate?: (item: NavigationItem) => void;
38
+ className?: string;
39
+ disabled?: boolean;
40
+ buttonText?: string;
41
+ showIcons?: boolean;
42
+ navigationLabel?: string;
43
+ strictMode?: boolean;
44
+ auditLog?: boolean;
45
+ onNavigationAccessDenied?: (item: NavigationItem) => void;
46
+ onStrictModeViolation?: (item: NavigationItem, reason: string) => void;
47
+ /**
48
+ * If true, indicates that items have already been filtered by the parent component (e.g., PaceAppLayout).
49
+ * When true, NavigationMenu will skip expensive permission checks and trust the provided items.
50
+ * This significantly improves performance when items are pre-filtered.
51
+ */
52
+ itemsPreFiltered?: boolean;
53
+ }
54
+
55
+ export type { NavigationMenuProps as N, NavigationItem as a, NavigationMode as b };
package/dist/types.d.ts CHANGED
@@ -6,7 +6,7 @@ export { E as Event, c as EventContextType, b as EventTheme, k as ORGANISATION_R
6
6
  export { g as BucketInfo, B as BulkUploadResult, F as FileCategory, b as FileMetadata, a as FileReference, d as FileReferenceService, f as FileReferenceWithUrl, c as FileUploadOptions, e as FileUploadResult, h as FileUrlInfo, S as StorageUploadOptions, U as UploadProgress } from './file-reference-BavO2eQj.js';
7
7
  export { C as ChangePasswordFormValues, o as ContactFormData, F as FormData, k as LoginFormData, L as LoginFormValues, P as ProfileFormData, m as RegistrationFormData, R as RegistrationFormValues, S as SecureLoginFormValues, j as SecureRegistrationFormValues, U as UserProfileFormValues, V as ValidationError, a as ValidationResult, g as changePasswordSchema, t as combineSchemas, i as contactFormSchema, d as dateSchema, e as emailSchema, l as loginSchema, n as nameSchema, f as passwordResetSchema, b as passwordSchema, p as phoneSchema, q as pickSchema, r as registrationSchema, c as secureLoginSchema, s as securePasswordSchema, u as urlSchema, h as userProfileSchema } from './validation-643vUDZW.js';
8
8
  import { SupabaseClient } from '@supabase/supabase-js';
9
- export { D as Database, J as Json } from './database.generated-CzIvgcPu.js';
9
+ export { D as Database, J as Json } from './database.generated-CcnC_DRc.js';
10
10
  export { A as AccessLevelContext, s as AuditEventType, P as PermissionSource, d as RBACAccessValidateParams, e as RBACAccessValidateResult, q as RBACAuditLogParams, r as RBACAuditLogResult, t as RBACContext, w as RBACErrorCode, v as RBACFunctionResponse, f as RBACPageAccessCheckParams, R as RBACPermissionCheckParams, a as RBACPermissionCheckResult, b as RBACPermissionsGetParams, c as RBACPermissionsGetResult, u as RBACResult, g as RBACRoleGrantParams, h as RBACRoleGrantResult, i as RBACRoleRevokeParams, j as RBACRoleRevokeResult, m as RBACRoleValidateParams, n as RBACRoleValidateResult, k as RBACRolesListParams, l as RBACRolesListResult, o as RBACSessionTrackParams, p as RBACSessionTrackResult, S as SessionType } from './functions-DHebl8-F.js';
11
11
  import 'zod';
12
12
  import './types-BeoeWV5I.js';