@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,192 +0,0 @@
1
- # pace-core Cursor Rules
2
-
3
- This directory contains Cursor rules that ensure consuming apps maintain quality, consistency, and compliance with pace-core standards.
4
-
5
- ## What are Cursor Rules?
6
-
7
- Cursor rules are `.mdc` (Markdown Cursor) files that guide AI assistants (like Cursor) to follow specific patterns and standards when writing code. These rules are automatically loaded by Cursor when present in `.cursor/rules/` directory.
8
-
9
- ## Installation
10
-
11
- ### Automatic Installation (Recommended)
12
-
13
- Run the installation script from your consuming app root:
14
-
15
- ```bash
16
- node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
17
- ```
18
-
19
- Or add to your `package.json`:
20
-
21
- ```json
22
- {
23
- "scripts": {
24
- "setup:cursor-rules": "node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs"
25
- }
26
- }
27
- ```
28
-
29
- Then run:
30
-
31
- ```bash
32
- npm run setup:cursor-rules
33
- ```
34
-
35
- ### Manual Installation
36
-
37
- Copy all `.mdc` files from `node_modules/@jmruthers/pace-core/cursor-rules/` to your `.cursor/rules/` directory.
38
-
39
- ## Rule Files
40
-
41
- The rules are numbered for ordering (00-08):
42
-
43
- - **00-pace-core-compliance.mdc** - Enforce pace-core usage patterns
44
- - **01-standards-compliance.mdc** - Enforce all pace-core standards
45
- - **02-project-structure.mdc** - Define standard folder structure
46
- - **03-solid-principles.mdc** - Enforce SOLID architecture principles
47
- - **04-testing-standards.mdc** - Enforce testing framework consistency
48
- - **05-bug-reports-and-features.mdc** - Templates for bug reports and feature requests (guidance-only)
49
- - **06-code-quality.mdc** - Enforce code quality standards
50
- - **07-tech-stack-compliance.mdc** - Enforce tech stack versions and patterns
51
- - **08-markup-quality.mdc** - Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
52
-
53
- ## Rule Numbering System
54
-
55
- - **pace-core rules**: `00-09` (reserved for pace-core)
56
- - **Your app rules**: `50+` (create your own rules starting at 50)
57
-
58
- This ensures pace-core rules load first, and your custom rules load after.
59
-
60
- ## Customization
61
-
62
- ### Adding Your Own Rules
63
-
64
- Create your own rules in `.cursor/rules/` with numbers starting at `50`:
65
-
66
- ```
67
- .cursor/rules/
68
- ├── 00-pace-core-compliance.mdc # pace-core rule
69
- ├── 01-standards-compliance.mdc # pace-core rule
70
- ├── ...
71
- ├── 50-my-custom-rule.mdc # Your custom rule
72
- └── 51-another-custom-rule.mdc # Your custom rule
73
- ```
74
-
75
- ### Updating Rules
76
-
77
- When pace-core is updated, run the installation script again. The script will:
78
- - **Automatically update** pace-core rules (00-09) if they've changed (version or content differs)
79
- - Preserve your custom rules (50+)
80
- - Skip files that are already up to date
81
-
82
- ### Force Update
83
-
84
- To force update all rules (even when versions match):
85
-
86
- ```bash
87
- node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs --force
88
- ```
89
-
90
- **Note**: Normally, pace-core rules (00-09) are automatically updated when they change. The `--force` flag forces an update even when versions match (useful if content changed but version metadata wasn't updated).
91
-
92
- ## How Cursor Uses Rules
93
-
94
- Cursor automatically loads all `.mdc` files from `.cursor/rules/` when:
95
- - You open a file that matches the rule's `globs` pattern
96
- - You ask Cursor to write or modify code
97
- - Cursor needs context for code generation
98
-
99
- Rules with `alwaysApply: true` are always considered, while rules with `alwaysApply: false` are only referenced when relevant.
100
-
101
- ## Explicitly Referencing Rules
102
-
103
- When working with Cursor, you can explicitly reference rules:
104
-
105
- > "Use pace-core components and follow rules 00–04."
106
-
107
- This helps Cursor focus on specific rule sets.
108
-
109
- ## Rule Format
110
-
111
- Each rule file follows this format:
112
-
113
- ```markdown
114
- ---
115
- description: Brief description
116
- globs: ["targeted/path/**/*.{ts,tsx}"] # Files this rule applies to
117
- alwaysApply: true # or false
118
- paceCoreVersion: "0.5.x" # pace-core version
119
- rulesVersion: "2025-01-15" # Rule update date
120
- ---
121
-
122
- # Rule Title
123
-
124
- Content with examples and guidelines.
125
- ```
126
-
127
- ## Safety Guards
128
-
129
- The installation script includes safety guards:
130
-
131
- - **Environment variable**: Set `PACE_CURSOR_RULES_DISABLED=1` to skip installation
132
- - **Git check**: Skips if no `.git` folder exists (CI/safety)
133
- - **Auto-update**: Automatically updates pace-core rules (00-09) when they change
134
- - **Protection**: Never overwrites custom app rules (50+)
135
-
136
- ## Monorepo Support
137
-
138
- For monorepos, run the installation script from each app's root directory. Each app maintains its own `.cursor/rules/` directory.
139
-
140
- ## Troubleshooting
141
-
142
- ### Rules Not Loading
143
-
144
- 1. Verify rules are in `.cursor/rules/` directory
145
- 2. Check file extensions are `.mdc`
146
- 3. Restart Cursor if rules were just installed
147
- 4. Check rule frontmatter is valid YAML
148
-
149
- ### Rules Conflicting
150
-
151
- 1. Check rule numbering (pace-core: 00-09, yours: 50+)
152
- 2. Verify `globs` patterns don't overlap unnecessarily
153
- 3. Review rule priorities in frontmatter
154
-
155
- ### Installation Fails
156
-
157
- 1. Check you're in the app root directory
158
- 2. Verify `node_modules/@jmruthers/pace-core/` exists
159
- 3. Check file permissions
160
- 4. Try with `--force` flag if needed
161
-
162
- ## Audit Tool
163
-
164
- Run the audit tool to check compliance:
165
-
166
- ```bash
167
- node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs
168
- ```
169
-
170
- This generates a timestamped markdown report in `audit/` directory.
171
-
172
- ## Version Tracking
173
-
174
- Each rule file includes version metadata:
175
- - `paceCoreVersion`: pace-core version these rules target
176
- - `rulesVersion`: Date when rules were last updated
177
-
178
- Check these to see if rules need updating.
179
-
180
- ## Related Documentation
181
-
182
- - [pace-core Standards](../docs/standards/README.md)
183
- - [Getting Started Guide](../docs/getting-started/cursor-rules.md)
184
- - [pace-core Exports](../docs/api-reference/README.md)
185
-
186
- ## Support
187
-
188
- For issues with cursor rules:
189
- 1. Check this README
190
- 2. Review rule files for guidance
191
- 3. File an issue in pace-core repository
192
- 4. Check pace-core documentation
@@ -1,175 +0,0 @@
1
- import {
2
- ActionButtons,
3
- BulkOperationsDropdown,
4
- ColumnFactory,
5
- ColumnVisibilityDropdown,
6
- DataTable,
7
- DataTableCore,
8
- DataTableErrorBoundary,
9
- DataTableModals,
10
- DataTableToolbar,
11
- EditableRow,
12
- EmptyState,
13
- EnhancedPaginationControls,
14
- GroupHeader,
15
- GroupingDropdown,
16
- ImportModal,
17
- LoadingState,
18
- PaginationControls,
19
- UnifiedTableBody,
20
- announce,
21
- announceBulkOperation,
22
- announceFilterChange,
23
- announceLoadingState,
24
- announcePaginationChange,
25
- announceSearchResults,
26
- announceSelectionChange,
27
- announceSortChange,
28
- average,
29
- calculateAllDepths,
30
- calculateAllIndentation,
31
- calculateIndentation,
32
- calculateOptimalPageSize,
33
- cleanupLiveRegion,
34
- count,
35
- createHierarchicalStructure,
36
- defaultDataTableFeatures,
37
- exportToCSV,
38
- exportToCSVWithTableRows,
39
- generateCSVContent,
40
- getAriaSortValue,
41
- getCellRenderer,
42
- getColumnHeaderText,
43
- getHierarchicalSortConfig,
44
- getPageSizeOptions,
45
- getPaginationBinding,
46
- getRowDepth,
47
- getRowDescription,
48
- getRowIdSafe,
49
- getSortButtonLabel,
50
- groupHierarchicalData,
51
- hasValidRowId,
52
- initializeLiveRegion,
53
- isHierarchicalSortableColumn,
54
- max,
55
- min,
56
- normalizeDataTableFeatures,
57
- shouldShowColumnForRow,
58
- sortHierarchicalDataByStructure,
59
- sortHierarchicalDataWithSorting,
60
- sum,
61
- validateHierarchicalData,
62
- validatePaginationConfig
63
- } from "./chunk-IVOFDYWT.js";
64
- import "./chunk-HU2C6SSC.js";
65
- import {
66
- CircuitBreaker,
67
- DEFAULT_FALLBACK_CONFIG,
68
- DataChunkManager,
69
- DataTableError,
70
- DataTableErrorType,
71
- ErrorRecoveryManager,
72
- MemoryMonitor,
73
- SearchIndex,
74
- VisibilityTracker,
75
- chunkData,
76
- debounce,
77
- determinePaginationMode,
78
- getOptimalPageSizeOptions,
79
- safeExecute,
80
- throttle,
81
- useDataTablePerformance
82
- } from "./chunk-JGRYX5UX.js";
83
- import "./chunk-NTM7ZSB6.js";
84
- import "./chunk-KQCRWDSA.js";
85
- import "./chunk-IHB5DR3H.js";
86
- import "./chunk-EFN2EIMK.js";
87
- import "./chunk-63FOKYGO.js";
88
- import "./chunk-AFVQODI2.js";
89
- import "./chunk-QXHPKYJV.js";
90
- import "./chunk-M43Y4SSO.js";
91
- import "./chunk-M7MPQISP.js";
92
- import "./chunk-FMUCXFII.js";
93
- import "./chunk-VBXEHIUJ.js";
94
- import "./chunk-PWLANIRT.js";
95
- import "./chunk-DGUM43GV.js";
96
- export {
97
- ActionButtons,
98
- BulkOperationsDropdown,
99
- CircuitBreaker,
100
- ColumnFactory,
101
- ColumnVisibilityDropdown,
102
- DEFAULT_FALLBACK_CONFIG,
103
- DataChunkManager,
104
- DataTable,
105
- DataTableCore,
106
- DataTableError,
107
- DataTableErrorBoundary,
108
- DataTableErrorType,
109
- DataTableModals,
110
- DataTableToolbar,
111
- EditableRow,
112
- EmptyState,
113
- EnhancedPaginationControls,
114
- ErrorRecoveryManager,
115
- GroupHeader,
116
- GroupingDropdown,
117
- ImportModal,
118
- LoadingState,
119
- MemoryMonitor,
120
- PaginationControls,
121
- SearchIndex,
122
- UnifiedTableBody,
123
- VisibilityTracker,
124
- announce,
125
- announceBulkOperation,
126
- announceFilterChange,
127
- announceLoadingState,
128
- announcePaginationChange,
129
- announceSearchResults,
130
- announceSelectionChange,
131
- announceSortChange,
132
- average,
133
- calculateAllDepths,
134
- calculateAllIndentation,
135
- calculateIndentation,
136
- calculateOptimalPageSize,
137
- chunkData,
138
- cleanupLiveRegion,
139
- count,
140
- createHierarchicalStructure,
141
- debounce,
142
- defaultDataTableFeatures,
143
- determinePaginationMode,
144
- exportToCSV,
145
- exportToCSVWithTableRows,
146
- generateCSVContent,
147
- getAriaSortValue,
148
- getCellRenderer,
149
- getColumnHeaderText,
150
- getHierarchicalSortConfig,
151
- getOptimalPageSizeOptions,
152
- getPageSizeOptions,
153
- getPaginationBinding,
154
- getRowDepth,
155
- getRowDescription,
156
- getRowIdSafe,
157
- getSortButtonLabel,
158
- groupHierarchicalData,
159
- hasValidRowId,
160
- initializeLiveRegion,
161
- isHierarchicalSortableColumn,
162
- max,
163
- min,
164
- normalizeDataTableFeatures,
165
- safeExecute,
166
- shouldShowColumnForRow,
167
- sortHierarchicalDataByStructure,
168
- sortHierarchicalDataWithSorting,
169
- sum,
170
- throttle,
171
- useDataTablePerformance,
172
- validateHierarchicalData,
173
- validatePaginationConfig
174
- };
175
- //# sourceMappingURL=DataTable-AOVNCPTX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,18 +0,0 @@
1
- import {
2
- UnifiedAuthContext,
3
- UnifiedAuthProvider,
4
- useUnifiedAuth
5
- } from "./chunk-IHB5DR3H.js";
6
- import "./chunk-EFN2EIMK.js";
7
- import "./chunk-63FOKYGO.js";
8
- import "./chunk-AFVQODI2.js";
9
- import "./chunk-QXHPKYJV.js";
10
- import "./chunk-VBXEHIUJ.js";
11
- import "./chunk-PWLANIRT.js";
12
- import "./chunk-DGUM43GV.js";
13
- export {
14
- UnifiedAuthContext,
15
- UnifiedAuthProvider,
16
- useUnifiedAuth
17
- };
18
- //# sourceMappingURL=UnifiedAuthProvider-4SBX4LU5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,52 +0,0 @@
1
- import {
2
- clearCache,
3
- getAccessLevel,
4
- getPageScopeType,
5
- getPermissionMap,
6
- getRoleContext,
7
- hasAllPermissions,
8
- hasAnyPermission,
9
- hasPermission,
10
- invalidateAppCache,
11
- invalidateEventCache,
12
- invalidateOrganisationCache,
13
- invalidateUserCache,
14
- isEventAdmin,
15
- isOrganisationAdmin,
16
- isPermitted,
17
- isPermittedCached,
18
- isRBACInitialized,
19
- isSuperAdmin,
20
- resolveAppContext,
21
- setupRBAC
22
- } from "./chunk-EFN2EIMK.js";
23
- import "./chunk-63FOKYGO.js";
24
- import {
25
- OrganisationContextRequiredError
26
- } from "./chunk-AFVQODI2.js";
27
- import "./chunk-PWLANIRT.js";
28
- import "./chunk-DGUM43GV.js";
29
- export {
30
- OrganisationContextRequiredError,
31
- clearCache,
32
- getAccessLevel,
33
- getPageScopeType,
34
- getPermissionMap,
35
- getRoleContext,
36
- hasAllPermissions,
37
- hasAnyPermission,
38
- hasPermission,
39
- invalidateAppCache,
40
- invalidateEventCache,
41
- invalidateOrganisationCache,
42
- invalidateUserCache,
43
- isEventAdmin,
44
- isOrganisationAdmin,
45
- isPermitted,
46
- isPermittedCached,
47
- isRBACInitialized,
48
- isSuperAdmin,
49
- resolveAppContext,
50
- setupRBAC
51
- };
52
- //# sourceMappingURL=api-O6HTBX5Y.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,17 +0,0 @@
1
- import {
2
- RBACAuditManager,
3
- createAuditManager,
4
- emitAuditEvent,
5
- getGlobalAuditManager,
6
- setGlobalAuditManager
7
- } from "./chunk-63FOKYGO.js";
8
- import "./chunk-PWLANIRT.js";
9
- import "./chunk-DGUM43GV.js";
10
- export {
11
- RBACAuditManager,
12
- createAuditManager,
13
- emitAuditEvent,
14
- getGlobalAuditManager,
15
- setGlobalAuditManager
16
- };
17
- //# sourceMappingURL=audit-V53FV5AG.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/styles/index.ts"],"sourcesContent":["/**\n * @file Styles Index\n * @package @jmruthers/pace-core\n * @module Styles\n * @since 2.0.0\n * \n * Central export for all pace-core styles.\n * This file provides easy access to all CSS files for consuming applications.\n * \n * @example\n * ```tsx\n * // Import the core CSS file\n * import '@jmruthers/pace-core/src/styles/core.css';\n * ```\n * \n * @example\n * ```tsx\n * // For dynamic theming, import from theming/runtime\n * import { applyPalette, clearPalette } from '@jmruthers/pace-core/theming/runtime';\n * ```\n */\n\n// Note: CSS files are available at runtime via package exports\n// Import them using the individual file paths\n\n// Type definitions for style imports\nexport interface StyleImport {\n default: string;\n}\n\n// Style configuration\nexport const styleConfig = {\n core: {\n path: './core.css',\n description: 'Complete CSS foundation including base styles, theme mappings, fonts, resets, and neutral tokens'\n }\n} as const;\n\n// Helper function to get style paths\nexport function getStylePath(style: keyof typeof styleConfig): string {\n return styleConfig[style].path;\n}\n\n// Helper function to get all style paths\nexport function getAllStylePaths(): string[] {\n return Object.values(styleConfig).map(config => config.path);\n}\n"],"mappings":";AA+BO,IAAM,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACF;AAGO,SAAS,aAAa,OAAyC;AACpE,SAAO,YAAY,KAAK,EAAE;AAC5B;AAGO,SAAS,mBAA6B;AAC3C,SAAO,OAAO,OAAO,WAAW,EAAE,IAAI,YAAU,OAAO,IAAI;AAC7D;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rbac/audit-batched.ts","../src/rbac/audit.ts"],"sourcesContent":["/**\n * Batched Audit Manager for RBAC\n * @package @jmruthers/pace-core\n * @module RBAC/AuditBatched\n * @since 2.0.0\n * \n * This module provides batched audit logging to reduce network requests\n * by queuing events and sending them in batches.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { Database } from '../types/database';\nimport { RBACAuditEvent, UUID } from './types';\nimport { AuditEventPayload } from './audit';\nimport { logger } from '../utils/core/logger';\n\nexport interface BatchedAuditConfig {\n /** Enable batched audit logging (default: true) */\n enabled: boolean;\n /** Time window in milliseconds to wait before sending batch (default: 100ms) */\n batchWindow: number;\n /** Maximum batch size before forcing send (default: 10) */\n batchSize: number;\n}\n\nconst DEFAULT_CONFIG: BatchedAuditConfig = {\n enabled: true,\n batchWindow: 500, // 500ms - increased for better batching\n batchSize: 20, // Increased from 10 to 20 for better efficiency\n};\n\n/**\n * Batched Audit Manager\n * \n * Queues audit events and sends them in batches to reduce network requests.\n */\nexport class BatchedAuditManager {\n private supabase: SupabaseClient<Database>;\n private config: BatchedAuditConfig;\n private eventQueue: Array<Omit<RBACAuditEvent, 'id' | 'created_at'>> = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private isFlushing: boolean = false;\n\n constructor(supabase: SupabaseClient<Database>, config: Partial<BatchedAuditConfig> = {}) {\n this.supabase = supabase;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<BatchedAuditConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Queue an audit event for batching\n * \n * @param event - Audit event payload\n */\n async queueEvent(event: AuditEventPayload): Promise<void> {\n if (!this.config.enabled) {\n // If batching is disabled, send immediately\n await this.sendEventImmediately(event);\n return;\n }\n\n // Skip audit logging for cached checks (only log on cache miss)\n if ('cache_hit' in event && event.cache_hit === true) {\n return;\n }\n\n // Convert event payload to database format\n const auditEvent = this.convertToAuditEvent(event);\n if (!auditEvent) {\n return;\n }\n\n // Add to queue\n this.eventQueue.push(auditEvent);\n\n // Check if we should flush immediately\n if (this.eventQueue.length >= this.config.batchSize) {\n await this.flush();\n } else {\n // Schedule flush after batch window\n this.scheduleFlush();\n }\n }\n\n /**\n * Convert audit event payload to database format\n */\n private convertToAuditEvent(event: AuditEventPayload): Omit<RBACAuditEvent, 'id' | 'created_at'> | null {\n // Validate required fields\n if (!event.userId) {\n logger.error('RBAC Audit', 'Cannot queue audit event without userId:', {\n eventType: event.type,\n organisationId: event.organisationId\n });\n return null;\n }\n\n // Validate pageId: only include in page_id column if it's a valid UUID\n const rawPageId = 'pageId' in event ? event.pageId : undefined;\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n const isValidPageIdUuid = rawPageId && uuidRegex.test(rawPageId);\n const pageIdUuid: UUID | undefined = isValidPageIdUuid ? (rawPageId as UUID) : undefined;\n const pageIdName: string | undefined = rawPageId && !isValidPageIdUuid ? rawPageId : undefined;\n\n return {\n event_type: event.type,\n user_id: event.userId,\n organisation_id: event.organisationId || null,\n event_id: 'eventId' in event ? event.eventId : undefined,\n app_id: 'appId' in event ? event.appId : undefined,\n page_id: pageIdUuid,\n permission: 'permission' in event ? event.permission : undefined,\n decision: 'decision' in event ? event.decision : undefined,\n source: 'source' in event ? event.source : 'api',\n bypass: 'bypass' in event ? event.bypass : undefined,\n duration_ms: 'duration_ms' in event ? event.duration_ms : undefined,\n metadata: {\n ...event.metadata,\n cache_hit: 'cache_hit' in event ? event.cache_hit : undefined,\n cache_source: 'cache_source' in event ? event.cache_source : undefined,\n no_organisation_context: !event.organisationId,\n page_name: pageIdName,\n },\n };\n }\n\n /**\n * Schedule a flush after the batch window\n */\n private scheduleFlush(): void {\n if (this.flushTimer) {\n return; // Already scheduled\n }\n\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.flush();\n }, this.config.batchWindow);\n }\n\n /**\n * Flush all queued events\n */\n async flush(): Promise<void> {\n if (this.isFlushing || this.eventQueue.length === 0) {\n return;\n }\n\n // Clear any pending timer\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n this.isFlushing = true;\n\n try {\n // Get all events from queue\n const eventsToSend = [...this.eventQueue];\n this.eventQueue = [];\n\n if (eventsToSend.length === 0) {\n return;\n }\n\n // Send batch to database\n const { error } = await (this.supabase as any)\n .from('rbac_audit_events')\n .insert(eventsToSend);\n\n if (error) {\n logger.warn('RBAC Audit', 'Failed to insert batched audit events:', {\n error: error.message,\n code: error.code,\n batchSize: eventsToSend.length,\n });\n }\n } catch (error) {\n logger.error('RBAC Audit', 'Unexpected error during batched audit logging:', error);\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Send event immediately (bypass batching)\n */\n private async sendEventImmediately(event: AuditEventPayload): Promise<void> {\n const auditEvent = this.convertToAuditEvent(event);\n if (!auditEvent) {\n return;\n }\n\n try {\n const { error } = await (this.supabase as any)\n .from('rbac_audit_events')\n .insert([auditEvent]);\n\n if (error) {\n logger.warn('RBAC Audit', 'Failed to insert audit event:', {\n error: error.message,\n code: error.code,\n });\n }\n } catch (error) {\n logger.error('RBAC Audit', 'Unexpected error during audit logging:', error);\n }\n }\n\n /**\n * Force flush and wait for completion\n */\n async forceFlush(): Promise<void> {\n await this.flush();\n }\n}\n\n","/**\n * RBAC Audit Events System\n * @package @jmruthers/pace-core\n * @module RBAC/Audit\n * @since 1.0.0\n * \n * This module provides structured audit event emission for all RBAC operations.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { Database } from '../types/database';\nimport { \n UUID, \n AuditEventSource, \n RBACAuditEvent \n} from './types';\nimport type { AuditEventType } from './types/functions';\nimport { logger } from '../utils/core/logger';\nimport { BatchedAuditManager } from './audit-batched';\n\n/**\n * Audit event payload for permission checks\n */\nexport interface PermissionCheckAuditEvent {\n type: 'permission_check';\n userId: UUID;\n organisationId: UUID;\n eventId?: string;\n appId?: UUID;\n pageId?: UUID;\n permission: string;\n decision: boolean;\n source: AuditEventSource;\n bypass?: boolean;\n duration_ms: number;\n cache_hit?: boolean;\n cache_source?: 'memory' | 'database' | 'rpc';\n metadata?: Record<string, any>;\n}\n\n/**\n * Audit event payload for permission denied\n */\nexport interface PermissionDeniedAuditEvent {\n type: 'permission_denied';\n userId: UUID;\n organisationId: UUID;\n eventId?: string;\n appId?: UUID;\n pageId?: UUID;\n permission: string;\n source: AuditEventSource;\n metadata?: Record<string, any>;\n}\n\n/**\n * Audit event payload for role granted\n */\nexport interface RoleGrantedAuditEvent {\n type: 'role_granted';\n userId: UUID;\n organisationId: UUID;\n eventId?: string;\n appId?: UUID;\n role: string;\n grantedBy: UUID;\n metadata?: Record<string, any>;\n}\n\n/**\n * Audit event payload for role revoked\n */\nexport interface RoleRevokedAuditEvent {\n type: 'role_denied';\n userId: UUID;\n organisationId: UUID;\n eventId?: string;\n appId?: UUID;\n role: string;\n revokedBy: UUID;\n metadata?: Record<string, any>;\n}\n\n/**\n * Audit event payload for RLS denied\n */\nexport interface RLSDeniedAuditEvent {\n type: 'rls_denied';\n userId: UUID;\n organisationId: UUID;\n table: string;\n operation: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * Union type for all audit events\n */\nexport type AuditEventPayload = \n | PermissionCheckAuditEvent\n | PermissionDeniedAuditEvent\n | RoleGrantedAuditEvent\n | RoleRevokedAuditEvent\n | RLSDeniedAuditEvent;\n\n/**\n * RBAC Audit Manager\n * \n * Handles emission of structured audit events for all RBAC operations.\n */\nexport class RBACAuditManager {\n private supabase: SupabaseClient<Database>;\n private enabled: boolean = true;\n private fallbackEnabled: boolean = true;\n private batchedManager: BatchedAuditManager | null = null;\n private useBatching: boolean = true;\n\n constructor(\n supabase: SupabaseClient<Database>, \n useBatching: boolean = true,\n batchConfig?: { batchWindow?: number; batchSize?: number }\n ) {\n this.supabase = supabase;\n this.useBatching = useBatching;\n if (useBatching) {\n this.batchedManager = new BatchedAuditManager(supabase, batchConfig);\n }\n }\n\n /**\n * Enable or disable audit logging\n * \n * @param enabled - Whether to enable audit logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n /**\n * Check if audit logging is enabled\n * \n * @returns True if audit logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Enable or disable fallback logging (console logging when database fails)\n * \n * @param enabled - Whether to enable fallback logging\n */\n setFallbackEnabled(enabled: boolean): void {\n this.fallbackEnabled = enabled;\n }\n\n /**\n * Emit an audit event\n * \n * @param event - Audit event payload\n * @returns Promise that resolves when event is logged\n */\n async emitEvent(event: AuditEventPayload): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n // Skip audit logging for cached checks (only log on cache miss)\n if ('cache_hit' in event && event.cache_hit === true) {\n return;\n }\n\n // Use batched manager if enabled\n if (this.useBatching && this.batchedManager) {\n await this.batchedManager.queueEvent(event);\n return;\n }\n\n // Validate required fields before attempting to insert\n // MANDATORY: All audit events must have userId\n if (!event.userId) {\n logger.error('RBAC Audit', 'CRITICAL: Cannot log audit event without userId:', {\n eventType: event.type,\n organisationId: event.organisationId\n });\n return;\n }\n\n // WARNING: Some audit events may not have organisationId (e.g., global admin operations)\n // Log these for security monitoring even if organisationId is missing\n if (!event.organisationId) {\n logger.warn('RBAC Audit', 'Audit event without organisation context:', {\n userId: event.userId,\n eventType: event.type,\n note: 'This should be investigated for security compliance'\n });\n }\n\n try {\n // Since organisationId is now required in SecurityContext, this should rarely happen\n // But we still handle the edge case properly without masking it\n if (!event.organisationId) {\n logger.warn('RBAC Audit', 'Audit event without organisation context - this should be investigated:', {\n userId: event.userId,\n eventType: event.type,\n note: 'Organisation context is required for RBAC operations. This may indicate a security issue or missing context derivation.'\n });\n }\n\n // Validate pageId: only include in page_id column if it's a valid UUID\n // Otherwise, store it in metadata to avoid database errors\n const rawPageId = 'pageId' in event ? event.pageId : undefined;\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n const isValidPageIdUuid = rawPageId && uuidRegex.test(rawPageId);\n const pageIdUuid: UUID | undefined = isValidPageIdUuid ? (rawPageId as UUID) : undefined;\n const pageIdName: string | undefined = rawPageId && !isValidPageIdUuid ? rawPageId : undefined;\n\n const auditEvent: Omit<RBACAuditEvent, 'id' | 'created_at'> = {\n event_type: event.type,\n user_id: event.userId,\n // Store organisationId - nullable to properly track missing context cases\n // Do NOT use fallback UUID as it masks security issues\n organisation_id: event.organisationId || null, // Explicitly null if missing\n event_id: 'eventId' in event ? event.eventId : undefined,\n app_id: 'appId' in event ? event.appId : undefined,\n page_id: pageIdUuid, // Only set if it's a valid UUID\n permission: 'permission' in event ? event.permission : undefined,\n decision: 'decision' in event ? event.decision : undefined,\n source: 'source' in event ? event.source : 'api', // Default to 'api' if not provided\n bypass: 'bypass' in event ? event.bypass : undefined,\n duration_ms: 'duration_ms' in event ? event.duration_ms : undefined,\n metadata: {\n ...event.metadata,\n cache_hit: 'cache_hit' in event ? event.cache_hit : undefined,\n cache_source: 'cache_source' in event ? event.cache_source : undefined,\n // Explicit flag indicating this event had no organisation context\n no_organisation_context: !event.organisationId,\n // Store page name/identifier in metadata if it's not a UUID\n page_name: pageIdName,\n },\n };\n\n const { error } = await (this.supabase as any)\n .from('rbac_audit_events')\n .insert([auditEvent]);\n\n if (error) {\n // Log the error for debugging\n logger.warn('RBAC Audit', 'Failed to insert audit event:', {\n error: error.message,\n code: error.code,\n details: error.details,\n hint: error.hint,\n event: auditEvent\n });\n\n // Use fallback logging if enabled\n if (this.fallbackEnabled) {\n this.logFallbackEvent(event, error);\n }\n }\n } catch (error) {\n // Log unexpected errors\n logger.error('RBAC Audit', 'Unexpected error during audit logging:', error);\n \n // Use fallback logging if enabled\n if (this.fallbackEnabled) {\n this.logFallbackEvent(event, error);\n }\n }\n }\n\n /**\n * Log event to console as fallback when database logging fails\n * \n * @param event - Audit event payload\n * @param error - The error that occurred\n */\n private logFallbackEvent(event: AuditEventPayload, error: any): void {\n logger.debug('RBAC Audit Fallback', 'Database audit logging failed, using console fallback', {\n timestamp: new Date().toISOString(),\n event,\n error: error?.message || error\n });\n }\n\n /**\n * Emit a permission check audit event\n * \n * @param event - Permission check event data\n */\n async emitPermissionCheck(event: Omit<PermissionCheckAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'permission_check',\n ...event,\n });\n }\n\n /**\n * Emit a permission denied audit event\n * \n * @param event - Permission denied event data\n */\n async emitPermissionDenied(event: Omit<PermissionDeniedAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'permission_denied',\n ...event,\n });\n }\n\n /**\n * Emit a role granted audit event\n * \n * @param event - Role granted event data\n */\n async emitRoleGranted(event: Omit<RoleGrantedAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'role_granted',\n ...event,\n });\n }\n\n /**\n * Emit a role revoked audit event\n * \n * @param event - Role revoked event data\n */\n async emitRoleRevoked(event: Omit<RoleRevokedAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'role_denied',\n ...event,\n });\n }\n\n /**\n * Emit an RLS denied audit event\n * \n * @param event - RLS denied event data\n */\n async emitRLSDenied(event: Omit<RLSDeniedAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'rls_denied',\n ...event,\n });\n }\n\n /**\n * Get audit events for a user\n * \n * @param userId - User ID\n * @param limit - Maximum number of events to return\n * @returns Promise resolving to audit events\n */\n async getUserAuditEvents(userId: UUID, limit: number = 100): Promise<RBACAuditEvent[]> {\n const { data, error } = await this.supabase\n .from('rbac_audit_events')\n .select('id, event_type, user_id, organisation_id, event_id, app_id, page_id, permission, decision, source, bypass, duration_ms, metadata, created_at')\n .eq('user_id', userId)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n if (error) {\n // Detect CORS errors (they typically have null status or specific error codes)\n const isCorsError = \n error.message?.toLowerCase().includes('cors') ||\n error.message?.toLowerCase().includes('cross-origin') ||\n error.code === null ||\n (error as any).status === null;\n \n if (isCorsError) {\n const corsError = new Error(\n `CORS error when querying audit events. This is a Supabase configuration issue. ` +\n `Please configure CORS in your Supabase Dashboard: Settings → API → CORS. ` +\n `Add your app's origin (e.g., http://localhost:8087) to the allowed origins list. ` +\n `Original error: ${error.message || 'CORS request did not succeed'}`\n );\n (corsError as any).isCorsError = true;\n (corsError as any).originalError = error;\n throw corsError;\n }\n \n throw new Error(`Failed to get audit events: ${error.message}`);\n }\n\n return (data || []).map(event => ({\n ...event,\n event_type: event.event_type as AuditEventType\n })) as RBACAuditEvent[];\n }\n\n /**\n * Get audit events for an organisation\n * \n * @param organisationId - Organisation ID\n * @param limit - Maximum number of events to return\n * @returns Promise resolving to audit events\n */\n async getOrganisationAuditEvents(organisationId: UUID, limit: number = 100): Promise<RBACAuditEvent[]> {\n const { data, error } = await this.supabase\n .from('rbac_audit_events')\n .select('id, event_type, user_id, organisation_id, event_id, app_id, page_id, permission, decision, source, bypass, duration_ms, metadata, created_at')\n .eq('organisation_id', organisationId)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n if (error) {\n // Detect CORS errors (they typically have null status or specific error codes)\n const isCorsError = \n error.message?.toLowerCase().includes('cors') ||\n error.message?.toLowerCase().includes('cross-origin') ||\n error.code === null ||\n (error as any).status === null;\n \n if (isCorsError) {\n const corsError = new Error(\n `CORS error when querying audit events. This is a Supabase configuration issue. ` +\n `Please configure CORS in your Supabase Dashboard: Settings → API → CORS. ` +\n `Add your app's origin (e.g., http://localhost:8087) to the allowed origins list. ` +\n `Original error: ${error.message || 'CORS request did not succeed'}`\n );\n (corsError as any).isCorsError = true;\n (corsError as any).originalError = error;\n throw corsError;\n }\n \n throw new Error(`Failed to get audit events: ${error.message}`);\n }\n\n return (data || []).map(event => ({\n ...event,\n event_type: event.event_type as AuditEventType\n })) as RBACAuditEvent[];\n }\n}\n\n/**\n * Create an audit manager instance\n * \n * @param supabase - Supabase client\n * @param useBatching - Whether to use batched audit logging (default: true)\n * @param batchConfig - Optional batch configuration\n * @returns RBACAuditManager instance\n */\nexport function createAuditManager(\n supabase: SupabaseClient<Database>, \n useBatching: boolean = true,\n batchConfig?: { batchWindow?: number; batchSize?: number }\n): RBACAuditManager {\n return new RBACAuditManager(supabase, useBatching, batchConfig);\n}\n\n/**\n * Global audit manager instance\n * \n * This is set by the RBAC engine when it initializes.\n */\nlet globalAuditManager: RBACAuditManager | null = null;\n\n/**\n * Set the global audit manager\n * \n * @param manager - Audit manager instance\n */\nexport function setGlobalAuditManager(manager: RBACAuditManager): void {\n globalAuditManager = manager;\n}\n\n/**\n * Get the global audit manager\n * \n * @returns Global audit manager or null if not set\n */\nexport function getGlobalAuditManager(): RBACAuditManager | null {\n return globalAuditManager;\n}\n\n/**\n * Emit an audit event using the global audit manager\n * \n * @param event - Audit event payload\n */\nexport async function emitAuditEvent(event: AuditEventPayload): Promise<void> {\n if (globalAuditManager) {\n await globalAuditManager.emitEvent(event);\n }\n}\n"],"mappings":"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","names":[]}