@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,20 +1,71 @@
1
- import {
2
- createAuditManager,
3
- emitAuditEvent,
4
- setGlobalAuditManager
5
- } from "./chunk-63FOKYGO.js";
6
- import {
7
- ContextValidator,
8
- InvalidScopeError,
9
- MissingUserContextError,
10
- OrganisationContextRequiredError,
11
- PermissionDeniedError,
12
- RBACError,
13
- RBACNotInitializedError
14
- } from "./chunk-AFVQODI2.js";
15
- import {
16
- createLogger
17
- } from "./chunk-PWLANIRT.js";
1
+ import { emitAuditEvent, createAuditManager, setGlobalAuditManager } from './chunk-AHU7G2R5.js';
2
+ import { createLogger } from './chunk-TTRFSOKR.js';
3
+
4
+ // src/rbac/types.ts
5
+ var RBACError = class extends Error {
6
+ constructor(message, code, context) {
7
+ super(message);
8
+ this.code = code;
9
+ this.context = context;
10
+ this.name = "RBACError";
11
+ }
12
+ };
13
+ var PermissionDeniedError = class extends RBACError {
14
+ constructor(permission, context) {
15
+ super(
16
+ `Permission denied: ${permission}`,
17
+ "PERMISSION_DENIED",
18
+ { permission, ...context }
19
+ );
20
+ this.name = "PermissionDeniedError";
21
+ }
22
+ };
23
+ var OrganisationContextRequiredError = class extends RBACError {
24
+ constructor() {
25
+ super(
26
+ "Organisation context is required for this operation",
27
+ "ORGANISATION_CONTEXT_REQUIRED"
28
+ );
29
+ this.name = "OrganisationContextRequiredError";
30
+ }
31
+ };
32
+ var EventContextRequiredError = class extends RBACError {
33
+ constructor() {
34
+ super(
35
+ "Event context is required for this operation",
36
+ "EVENT_CONTEXT_REQUIRED"
37
+ );
38
+ this.name = "EventContextRequiredError";
39
+ }
40
+ };
41
+ var RBACNotInitializedError = class extends RBACError {
42
+ constructor() {
43
+ super(
44
+ "RBAC system not initialized. Please call setupRBAC(supabase) before using any RBAC components or hooks. See: https://docs.pace-core.dev/rbac/setup",
45
+ "RBAC_NOT_INITIALIZED"
46
+ );
47
+ this.name = "RBACNotInitializedError";
48
+ }
49
+ };
50
+ var InvalidScopeError = class extends RBACError {
51
+ constructor(scope, reason) {
52
+ super(
53
+ `Invalid scope provided: ${JSON.stringify(scope)}. ${reason}`,
54
+ "INVALID_SCOPE",
55
+ { scope, reason }
56
+ );
57
+ this.name = "InvalidScopeError";
58
+ }
59
+ };
60
+ var MissingUserContextError = class extends RBACError {
61
+ constructor() {
62
+ super(
63
+ "User context is required but not available. Make sure to wrap your app with an auth provider.",
64
+ "MISSING_USER_CONTEXT"
65
+ );
66
+ this.name = "MissingUserContextError";
67
+ }
68
+ };
18
69
 
19
70
  // src/rbac/cache.ts
20
71
  var RBACCache = class {
@@ -512,7 +563,6 @@ var RBACCacheInvalidationManager = class {
512
563
  var globalCacheInvalidationManager = null;
513
564
  function initializeCacheInvalidation(supabase) {
514
565
  if (globalCacheInvalidationManager) {
515
- log.debug("Cleaning up existing cache invalidation manager before creating new one");
516
566
  globalCacheInvalidationManager.cleanup();
517
567
  }
518
568
  globalCacheInvalidationManager = new RBACCacheInvalidationManager(supabase);
@@ -554,8 +604,6 @@ function categorizeError(error) {
554
604
  return "validation_error" /* VALIDATION */;
555
605
  case "MISSING_USER_CONTEXT":
556
606
  return "authentication_error" /* AUTHENTICATION */;
557
- default:
558
- break;
559
607
  }
560
608
  }
561
609
  if (error && typeof error === "object") {
@@ -1141,27 +1189,27 @@ var RBACEngine = class {
1141
1189
  });
1142
1190
  return false;
1143
1191
  }
1144
- const hasPermission2 = data === true;
1145
- rbacCache.set(cacheKey, hasPermission2, 6e4);
1192
+ const hasPermission = data === true;
1193
+ rbacCache.set(cacheKey, hasPermission, 6e4);
1146
1194
  const duration = Date.now() - startTime;
1147
1195
  if (scope.organisationId) {
1148
1196
  const resolvedPageId = await this.resolvePageId(pageId, scope.appId);
1149
1197
  await emitAuditEvent({
1150
- type: hasPermission2 ? "permission_check" : "permission_denied",
1198
+ type: hasPermission ? "permission_check" : "permission_denied",
1151
1199
  userId,
1152
1200
  organisationId: scope.organisationId,
1153
1201
  eventId: scope.eventId,
1154
1202
  appId: scope.appId,
1155
1203
  pageId: resolvedPageId,
1156
1204
  permission,
1157
- decision: hasPermission2,
1205
+ decision: hasPermission,
1158
1206
  source: "api",
1159
1207
  duration_ms: duration,
1160
1208
  cache_hit: cacheHit,
1161
1209
  cache_source: cacheSource
1162
1210
  });
1163
1211
  }
1164
- return hasPermission2;
1212
+ return hasPermission;
1165
1213
  } catch (error) {
1166
1214
  const category = categorizeError(error);
1167
1215
  const eventType = mapErrorCategoryToSecurityEventType(category);
@@ -1280,7 +1328,7 @@ var RBACEngine = class {
1280
1328
  for (const page of pages) {
1281
1329
  for (const operation of ["read", "create", "update", "delete"]) {
1282
1330
  const permissionString = `${operation}:page.${page.page_name}`;
1283
- const hasPermission2 = await this.isPermitted(
1331
+ const hasPermission = await this.isPermitted(
1284
1332
  {
1285
1333
  userId,
1286
1334
  scope,
@@ -1290,7 +1338,7 @@ var RBACEngine = class {
1290
1338
  securityContext
1291
1339
  );
1292
1340
  const permissionKey = permissionString;
1293
- permissionMap[permissionKey] = hasPermission2;
1341
+ permissionMap[permissionKey] = hasPermission;
1294
1342
  }
1295
1343
  }
1296
1344
  }
@@ -1607,11 +1655,194 @@ function getInFlightRequestCount() {
1607
1655
  return inFlightRequests.size;
1608
1656
  }
1609
1657
 
1658
+ // src/rbac/utils/eventContext.ts
1659
+ var orgDerivationCache = /* @__PURE__ */ new Map();
1660
+ var MAX_CACHE_SIZE = 100;
1661
+ async function getOrganisationFromEvent(supabase, eventId) {
1662
+ if (orgDerivationCache.has(eventId)) {
1663
+ return orgDerivationCache.get(eventId) ?? null;
1664
+ }
1665
+ const { data, error } = await supabase.from("core_events").select("organisation_id").eq("event_id", eventId).single();
1666
+ let organisationId = null;
1667
+ if (error || !data) {
1668
+ organisationId = null;
1669
+ } else if (data.organisation_id) {
1670
+ organisationId = data.organisation_id;
1671
+ } else {
1672
+ organisationId = null;
1673
+ }
1674
+ if (orgDerivationCache.size >= MAX_CACHE_SIZE) {
1675
+ const firstKey = orgDerivationCache.keys().next().value;
1676
+ if (firstKey) {
1677
+ orgDerivationCache.delete(firstKey);
1678
+ }
1679
+ }
1680
+ orgDerivationCache.set(eventId, organisationId);
1681
+ return organisationId;
1682
+ }
1683
+
1684
+ // src/rbac/utils/contextValidator.ts
1685
+ var log3 = createLogger("ContextValidator");
1686
+ function allowsOptionalContexts(appName) {
1687
+ return appName === "PORTAL" || appName === "ADMIN";
1688
+ }
1689
+ var ContextValidator = class {
1690
+ /**
1691
+ * Derive organisation ID from event ID
1692
+ *
1693
+ * @param supabase - Supabase client
1694
+ * @param eventId - Event ID
1695
+ * @returns Organisation ID or null
1696
+ */
1697
+ static async deriveOrgFromEvent(supabase, eventId) {
1698
+ return getOrganisationFromEvent(supabase, eventId);
1699
+ }
1700
+ /**
1701
+ * Resolve scope based on page-level scope_type
1702
+ *
1703
+ * This method handles page-level scoping. All pages have explicit scope_type set.
1704
+ * Used for hybrid apps that have both event and organisation pages.
1705
+ *
1706
+ * @param scope - Current scope
1707
+ * @param pageScopeType - Page scope type ('event', 'organisation', or 'both')
1708
+ * @param appName - App name (for PORTAL/ADMIN special case)
1709
+ * @param supabase - Supabase client (for deriving org from event, only if not already provided)
1710
+ * @param immediateOrganisationId - Optional immediate organisation ID (from selectedEvent.organisation_id) - avoids querying
1711
+ * @returns Resolved scope with all required context
1712
+ */
1713
+ static async resolveScopeForPage(scope, pageScopeType, appName, supabase, immediateOrganisationId) {
1714
+ const effectiveScopeType = pageScopeType;
1715
+ if (effectiveScopeType === "both") {
1716
+ if (!scope.organisationId && !scope.eventId) {
1717
+ if (allowsOptionalContexts(appName)) {
1718
+ return {
1719
+ isValid: true,
1720
+ resolvedScope: {
1721
+ organisationId: void 0,
1722
+ eventId: void 0,
1723
+ appId: scope.appId
1724
+ },
1725
+ error: null
1726
+ };
1727
+ }
1728
+ return {
1729
+ isValid: false,
1730
+ resolvedScope: null,
1731
+ error: new Error("Page requires either organisation or event context")
1732
+ };
1733
+ }
1734
+ let organisationId = scope.organisationId || immediateOrganisationId || void 0;
1735
+ if (!organisationId && scope.eventId && supabase) {
1736
+ try {
1737
+ const derivedOrgId = await this.deriveOrgFromEvent(supabase, scope.eventId);
1738
+ organisationId = derivedOrgId || void 0;
1739
+ } catch (error) {
1740
+ log3.warn("Failed to derive org from event for both-scope page:", error);
1741
+ }
1742
+ }
1743
+ return {
1744
+ isValid: true,
1745
+ resolvedScope: {
1746
+ organisationId,
1747
+ eventId: scope.eventId,
1748
+ appId: scope.appId
1749
+ },
1750
+ error: null
1751
+ };
1752
+ }
1753
+ if (effectiveScopeType === "event") {
1754
+ if (!scope.eventId) {
1755
+ if (allowsOptionalContexts(appName)) {
1756
+ return {
1757
+ isValid: true,
1758
+ resolvedScope: {
1759
+ organisationId: scope.organisationId,
1760
+ eventId: void 0,
1761
+ appId: scope.appId
1762
+ },
1763
+ error: null
1764
+ };
1765
+ }
1766
+ return {
1767
+ isValid: false,
1768
+ resolvedScope: null,
1769
+ error: new EventContextRequiredError()
1770
+ };
1771
+ }
1772
+ let organisationId = scope.organisationId || immediateOrganisationId || void 0;
1773
+ if (!organisationId && supabase && scope.eventId) {
1774
+ try {
1775
+ const derivedOrgId = await this.deriveOrgFromEvent(supabase, scope.eventId);
1776
+ organisationId = derivedOrgId || void 0;
1777
+ if (!organisationId) {
1778
+ return {
1779
+ isValid: false,
1780
+ resolvedScope: null,
1781
+ error: new Error("Could not resolve organisation from event context")
1782
+ };
1783
+ }
1784
+ } catch (error) {
1785
+ log3.error("Failed to derive org from event:", error);
1786
+ return {
1787
+ isValid: false,
1788
+ resolvedScope: null,
1789
+ error: error instanceof Error ? error : new Error("Failed to derive organisation from event")
1790
+ };
1791
+ }
1792
+ }
1793
+ return {
1794
+ isValid: true,
1795
+ resolvedScope: {
1796
+ organisationId,
1797
+ eventId: scope.eventId,
1798
+ appId: scope.appId
1799
+ },
1800
+ error: null
1801
+ };
1802
+ }
1803
+ if (effectiveScopeType === "organisation") {
1804
+ if (!scope.organisationId) {
1805
+ if (allowsOptionalContexts(appName)) {
1806
+ return {
1807
+ isValid: true,
1808
+ resolvedScope: {
1809
+ organisationId: void 0,
1810
+ eventId: scope.eventId,
1811
+ appId: scope.appId
1812
+ },
1813
+ error: null
1814
+ };
1815
+ }
1816
+ return {
1817
+ isValid: false,
1818
+ resolvedScope: null,
1819
+ error: new OrganisationContextRequiredError()
1820
+ };
1821
+ }
1822
+ return {
1823
+ isValid: true,
1824
+ resolvedScope: {
1825
+ organisationId: scope.organisationId,
1826
+ eventId: scope.eventId,
1827
+ // Event is optional for org-scoped pages
1828
+ appId: scope.appId
1829
+ },
1830
+ error: null
1831
+ };
1832
+ }
1833
+ return {
1834
+ isValid: false,
1835
+ resolvedScope: null,
1836
+ error: new Error("Invalid scope type")
1837
+ };
1838
+ }
1839
+ };
1840
+
1610
1841
  // src/rbac/api.ts
1611
- var log3 = createLogger("RBACAPI");
1842
+ var log4 = createLogger("RBACAPI");
1612
1843
  var globalEngine = null;
1613
1844
  function setupRBAC(supabase, config) {
1614
- const logger = getRBACLogger();
1845
+ getRBACLogger();
1615
1846
  const isDevelopment = import.meta.env.MODE === "development";
1616
1847
  const fullConfig = {
1617
1848
  supabase,
@@ -1753,7 +1984,7 @@ async function isPermitted(input, appName, precomputedSuperAdmin = null) {
1753
1984
  }
1754
1985
  pageScopeType = scopeType;
1755
1986
  } catch (err) {
1756
- log3.error("Failed to get page scope type:", err);
1987
+ log4.error("Failed to get page scope type:", err);
1757
1988
  throw new Error(`Failed to determine page scope type: ${err instanceof Error ? err.message : String(err)}`);
1758
1989
  }
1759
1990
  } else {
@@ -1840,17 +2071,14 @@ async function isPermittedCached(input, appName) {
1840
2071
  return result;
1841
2072
  });
1842
2073
  }
1843
- async function hasPermission(input) {
1844
- return isPermitted(input);
1845
- }
1846
2074
  async function hasAnyPermission(input) {
1847
2075
  const { permissions, ...baseInput } = input;
1848
2076
  for (const permission of permissions) {
1849
- const hasPermission2 = await isPermitted({
2077
+ const hasPermission = await isPermitted({
1850
2078
  ...baseInput,
1851
2079
  permission
1852
2080
  });
1853
- if (hasPermission2) {
2081
+ if (hasPermission) {
1854
2082
  return true;
1855
2083
  }
1856
2084
  }
@@ -1859,11 +2087,11 @@ async function hasAnyPermission(input) {
1859
2087
  async function hasAllPermissions(input) {
1860
2088
  const { permissions, ...baseInput } = input;
1861
2089
  for (const permission of permissions) {
1862
- const hasPermission2 = await isPermitted({
2090
+ const hasPermission = await isPermitted({
1863
2091
  ...baseInput,
1864
2092
  permission
1865
2093
  });
1866
- if (!hasPermission2) {
2094
+ if (!hasPermission) {
1867
2095
  return false;
1868
2096
  }
1869
2097
  }
@@ -1893,19 +2121,17 @@ async function getPageScopeType(pageId, appId, appName) {
1893
2121
  if (!uuidRegex.test(resolvedPageId)) {
1894
2122
  throw new Error(`Could not resolve pageId ${pageId} to a valid UUID`);
1895
2123
  }
1896
- const { data, error } = await engine["supabase"].rpc("get_page_scope_type", {
1897
- p_page_id: resolvedPageId
1898
- });
2124
+ const { data: pageData, error } = await engine["supabase"].from("rbac_app_pages").select("scope_type").eq("id", resolvedPageId).single();
1899
2125
  if (error) {
1900
- log3.error("Error fetching page scope type:", { pageId, appId, error });
2126
+ log4.error("Error fetching page scope type:", { pageId, appId, error });
1901
2127
  throw new Error(`Failed to get page scope type: ${error.message}`);
1902
2128
  }
1903
- if (!data) {
2129
+ if (!pageData || !pageData.scope_type) {
1904
2130
  throw new Error(`Page ${resolvedPageId} does not have scope_type set`);
1905
2131
  }
1906
- return data;
2132
+ return pageData.scope_type;
1907
2133
  } catch (err) {
1908
- log3.error("Error fetching page scope type:", err);
2134
+ log4.error("Error fetching page scope type:", err);
1909
2135
  throw err instanceof Error ? err : new Error(`Failed to get page scope type: ${String(err)}`);
1910
2136
  }
1911
2137
  }
@@ -1948,46 +2174,4 @@ function clearCache() {
1948
2174
  rbacCache.clear();
1949
2175
  }
1950
2176
 
1951
- export {
1952
- RBACCache,
1953
- rbacCache,
1954
- CACHE_PATTERNS,
1955
- createRBACConfig,
1956
- getRBACConfig,
1957
- getRBACLogger,
1958
- isDebugMode,
1959
- isDevelopmentMode,
1960
- RBACEngine,
1961
- createRBACEngine,
1962
- enablePerformanceMonitoring,
1963
- disablePerformanceMonitoring,
1964
- isPerformanceMonitoringEnabled,
1965
- recordPermissionCheck,
1966
- recordAuditEvent,
1967
- getPerformanceMetrics,
1968
- resetPerformanceMetrics,
1969
- getPerformanceSummary,
1970
- clearInFlightRequests,
1971
- getInFlightRequestCount,
1972
- setupRBAC,
1973
- isRBACInitialized,
1974
- getAccessLevel,
1975
- getPermissionMap,
1976
- resolveAppContext,
1977
- getRoleContext,
1978
- isPermitted,
1979
- isPermittedCached,
1980
- hasPermission,
1981
- hasAnyPermission,
1982
- hasAllPermissions,
1983
- isSuperAdmin,
1984
- getPageScopeType,
1985
- isOrganisationAdmin,
1986
- isEventAdmin,
1987
- invalidateUserCache,
1988
- invalidateOrganisationCache,
1989
- invalidateEventCache,
1990
- invalidateAppCache,
1991
- clearCache
1992
- };
1993
- //# sourceMappingURL=chunk-EFN2EIMK.js.map
2177
+ export { CACHE_PATTERNS, ContextValidator, EventContextRequiredError, OrganisationContextRequiredError, RBACCache, RBACEngine, RBACNotInitializedError, clearCache, clearInFlightRequests, createRBACConfig, createRBACEngine, disablePerformanceMonitoring, enablePerformanceMonitoring, getAccessLevel, getInFlightRequestCount, getPageScopeType, getPerformanceMetrics, getPerformanceSummary, getPermissionMap, getRBACConfig, getRBACLogger, getRoleContext, hasAllPermissions, hasAnyPermission, invalidateAppCache, invalidateEventCache, invalidateOrganisationCache, invalidateUserCache, isDebugMode, isDevelopmentMode, isEventAdmin, isOrganisationAdmin, isPerformanceMonitoringEnabled, isPermitted, isPermittedCached, isRBACInitialized, isSuperAdmin, rbacCache, recordAuditEvent, recordPermissionCheck, resetPerformanceMetrics, resolveAppContext, setupRBAC };
@@ -1,9 +1,6 @@
1
- import {
2
- createLogger
3
- } from "./chunk-PWLANIRT.js";
1
+ import { createLogger } from './chunk-TTRFSOKR.js';
4
2
 
5
3
  // src/theming/parseEventColours.ts
6
- var log = createLogger("ParseEventColours");
7
4
  function parseAndNormalizeEventColours(input) {
8
5
  try {
9
6
  if (!input) return null;
@@ -17,10 +14,12 @@ function parseAndNormalizeEventColours(input) {
17
14
  } else if (typeof input !== "object") {
18
15
  return null;
19
16
  }
20
- const main = obj?.main || null;
21
- const sec = obj?.sec || null;
22
- const acc = obj?.acc || null;
23
- if (!main && !sec && !acc) return null;
17
+ const main = obj?.main || obj?.["ev-main"] || null;
18
+ const sec = obj?.sec || obj?.["ev-sec"] || null;
19
+ const acc = obj?.acc || obj?.["ev-acc"] || null;
20
+ if (!main && !sec && !acc) {
21
+ return null;
22
+ }
24
23
  const fill = (p) => {
25
24
  if (!p || typeof p !== "object") return {};
26
25
  const out = {};
@@ -38,19 +37,18 @@ function parseAndNormalizeEventColours(input) {
38
37
  acc: fill(acc)
39
38
  };
40
39
  } catch (error) {
41
- log.warn("Failed to parse/normalize event colours:", error);
42
40
  return null;
43
41
  }
44
42
  }
45
43
 
46
44
  // src/theming/runtime.ts
47
- var log2 = createLogger("ThemingRuntime");
45
+ var log = createLogger("ThemingRuntime");
48
46
  function formatOklchCss(color) {
49
47
  return `oklch(${color.L} ${color.C} ${color.H})`;
50
48
  }
51
49
  function applyPalette(palette) {
52
50
  if (typeof document === "undefined" || document === null) {
53
- log2.warn("Document not available (SSR) - palette not applied");
51
+ log.warn("Document not available (SSR) - palette not applied");
54
52
  return;
55
53
  }
56
54
  const root = document.documentElement;
@@ -159,19 +157,7 @@ function getCurrentThemeData() {
159
157
  if (typeof document === "undefined" || document === null) {
160
158
  return null;
161
159
  }
162
- const root = document.documentElement;
163
- const main = {};
164
- const sec = {};
165
- const acc = {};
166
160
  return null;
167
161
  }
168
162
 
169
- export {
170
- parseAndNormalizeEventColours,
171
- applyPalette,
172
- clearPalette,
173
- generateSSRThemeCSS,
174
- isDynamicThemingActive,
175
- getCurrentThemeData
176
- };
177
- //# sourceMappingURL=chunk-L4OXEN46.js.map
163
+ export { applyPalette, clearPalette, generateSSRThemeCSS, getCurrentThemeData, isDynamicThemingActive, parseAndNormalizeEventColours };
@@ -1,10 +1,11 @@
1
1
  export { a as UnifiedAuthContextType, d as UnifiedAuthProvider, c as UnifiedAuthProviderProps, u as useUnifiedAuth } from './UnifiedAuthProvider-CKvHP1MK.js';
2
- export { A as AddressField, k as AddressFieldProps, l as AddressFieldRef, o as Alert, q as AlertDescription, p as AlertTitle, r as Avatar, s as AvatarProps, t as Badge, u as BadgeProps, v as BadgeVariant, B as Button, a as ButtonProps, am as Calendar, an as CalendarProps, C as Card, g as CardActions, i as CardActionsProps, f as CardContent, e as CardDescription, c as CardFooter, b as CardHeader, h as CardProps, d as CardTitle, w as Checkbox, aR as ContextSelector, aS as ContextSelectorProps, M as Dialog, V as DialogBody, a4 as DialogBodyProps, Q as DialogClose, a1 as DialogCloseProps, R as DialogContent, $ as DialogContentProps, Y as DialogDescription, W as DialogFooter, a3 as DialogFooterProps, U as DialogHeader, a2 as DialogHeaderProps, N as DialogPortal, a0 as DialogPortalProps, Z as DialogProps, a5 as DialogSize, X as DialogTitle, O as DialogTrigger, _ as DialogTriggerProps, aU as ErrorBoundary, aW as ErrorBoundaryProps, aV as ErrorBoundaryProvider, aY as ErrorBoundaryProviderProps, aX as ErrorBoundaryState, b3 as FileDisplay, b4 as FileDisplayProps, b1 as FileUpload, b2 as FileUploadProps, aK as Footer, aL as FooterProps, aD as Form, aE as FormField, aG as FormFieldProps, aF as FormProps, aZ as GlobalErrorHandler, aJ as Header, I as Input, j as InputProps, L as Label, m as LabelProps, a_ as LoadingSpinner, aH as LoginForm, aI as LoginFormProps, aQ as NavigationItem, aO as NavigationMenu, aP as NavigationMenuProps, bm as PaceAppLayout, bl as PaceAppLayoutProps, bo as PaceLoginPage, bn as PaceLoginPageProps, P as Progress, y as ProgressProps, aM as ProtectedRoute, aN as ProtectedRouteProps, be as PublicPageFooter, bk as PublicPageFooterProps, bd as PublicPageHeader, bj as PublicPageHeaderProps, bc as PublicPageLayout, bi as PublicPageLayoutProps, bf as PublicPageProvider, a6 as Select, aa as SelectContent, a7 as SelectGroup, ac as SelectItem, ab as SelectLabel, ad as SelectSeparator, a9 as SelectTrigger, a8 as SelectValue, a$ as SessionRestorationLoader, b0 as SessionRestorationLoaderProps, S as Switch, x as SwitchProps, z as Table, E as TableBody, F as TableCaption, G as TableCell, H as TableFooter, J as TableHead, D as TableHeader, K as TableRow, ae as Tabs, ah as TabsContent, al as TabsContentProps, af as TabsList, aj as TabsListProps, ai as TabsProps, ag as TabsTrigger, ak as TabsTriggerProps, T as Textarea, n as TextareaProps, ao as Toast, aq as ToastAction, aw as ToastActionElement, av as ToastClose, au as ToastDescription, ax as ToastProps, ar as ToastProvider, at as ToastTitle, as as ToastViewport, ap as Toaster, ay as Tooltip, aA as TooltipContent, aB as TooltipProvider, aC as TooltipRoot, az as TooltipTrigger, bb as UseFileReferenceForRecordReturn, b9 as UseFileReferenceOptions, ba as UseFileReferenceReturn, aT as UserMenu, b5 as useFileReference, b7 as useFileReferenceById, b6 as useFileReferenceForRecord, b8 as useFilesByCategory, bh as useIsPublicPage, bg as usePublicPageContext } from './PublicPageProvider-QTFVrL-Z.js';
2
+ export { A as AddressField, k as AddressFieldProps, l as AddressFieldRef, o as Alert, q as AlertDescription, p as AlertTitle, r as Avatar, s as AvatarProps, t as Badge, u as BadgeProps, v as BadgeVariant, B as Button, a as ButtonProps, am as Calendar, an as CalendarProps, C as Card, g as CardActions, i as CardActionsProps, f as CardContent, e as CardDescription, c as CardFooter, b as CardHeader, h as CardProps, d as CardTitle, w as Checkbox, aP as ContextSelector, aQ as ContextSelectorProps, M as Dialog, V as DialogBody, a4 as DialogBodyProps, Q as DialogClose, a1 as DialogCloseProps, R as DialogContent, $ as DialogContentProps, Y as DialogDescription, W as DialogFooter, a3 as DialogFooterProps, U as DialogHeader, a2 as DialogHeaderProps, N as DialogPortal, a0 as DialogPortalProps, Z as DialogProps, a5 as DialogSize, X as DialogTitle, O as DialogTrigger, _ as DialogTriggerProps, aS as ErrorBoundary, aU as ErrorBoundaryProps, aT as ErrorBoundaryProvider, aW as ErrorBoundaryProviderProps, aV as ErrorBoundaryState, b1 as FileDisplay, b2 as FileDisplayProps, a$ as FileUpload, b0 as FileUploadProps, aK as Footer, aL as FooterProps, aD as Form, aE as FormField, aG as FormFieldProps, aF as FormProps, aX as GlobalErrorHandler, aJ as Header, I as Input, j as InputProps, L as Label, m as LabelProps, aY as LoadingSpinner, aH as LoginForm, aI as LoginFormProps, aO as NavigationMenu, bk as PaceAppLayout, bj as PaceAppLayoutProps, bm as PaceLoginPage, bl as PaceLoginPageProps, P as Progress, y as ProgressProps, aM as ProtectedRoute, aN as ProtectedRouteProps, bc as PublicPageFooter, bi as PublicPageFooterProps, bb as PublicPageHeader, bh as PublicPageHeaderProps, ba as PublicPageLayout, bg as PublicPageLayoutProps, bd as PublicPageProvider, a6 as Select, aa as SelectContent, a7 as SelectGroup, ac as SelectItem, ab as SelectLabel, ad as SelectSeparator, a9 as SelectTrigger, a8 as SelectValue, aZ as SessionRestorationLoader, a_ as SessionRestorationLoaderProps, S as Switch, x as SwitchProps, z as Table, E as TableBody, F as TableCaption, G as TableCell, H as TableFooter, J as TableHead, D as TableHeader, K as TableRow, ae as Tabs, ah as TabsContent, al as TabsContentProps, af as TabsList, aj as TabsListProps, ai as TabsProps, ag as TabsTrigger, ak as TabsTriggerProps, T as Textarea, n as TextareaProps, ao as Toast, aq as ToastAction, aw as ToastActionElement, av as ToastClose, au as ToastDescription, ax as ToastProps, ar as ToastProvider, at as ToastTitle, as as ToastViewport, ap as Toaster, ay as Tooltip, aA as TooltipContent, aB as TooltipProvider, aC as TooltipRoot, az as TooltipTrigger, b9 as UseFileReferenceForRecordReturn, b7 as UseFileReferenceOptions, b8 as UseFileReferenceReturn, aR as UserMenu, b3 as useFileReference, b5 as useFileReferenceById, b4 as useFileReferenceForRecord, b6 as useFilesByCategory, bf as useIsPublicPage, be as usePublicPageContext } from './PublicPageProvider-DlsCaR5v.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  export { u as useToast } from './useToast-AyaT-x7p.js';
5
- export { D as DataTable, a as DataTableProps } from './DataTable-BMRU8a1j.js';
6
- export { c as AggregateConfig, A as AutocompleteOptions, d as DataRecord, a as DataTableAction, D as DataTableColumn, b as DataTableToolbarButton, E as EmptyStateConfig, G as GetRowId, P as ParsedAddress } from './types-CkbwOr4Y.js';
5
+ export { D as DataTable, a as DataTableProps } from './DataTable-DRUIgtUH.js';
6
+ export { c as AggregateConfig, A as AutocompleteOptions, d as DataRecord, a as DataTableAction, D as DataTableColumn, b as DataTableToolbarButton, E as EmptyStateConfig, G as GetRowId, P as ParsedAddress } from './types-DXstZpNI.js';
7
7
  export { F as FileCategory, b as FileMetadata, a as FileReference, c as FileUploadOptions } from './file-reference-BavO2eQj.js';
8
+ export { a as NavigationItem, N as NavigationMenuProps } from './types-t9H8qKRw.js';
8
9
  import 'react';
9
10
  import '@supabase/supabase-js';
10
11
  import './event-CW5YB_2p.js';
@@ -19,8 +20,8 @@ import '@radix-ui/react-toast';
19
20
  import '@radix-ui/react-tooltip';
20
21
  import 'react-hook-form';
21
22
  import 'zod';
22
- import './types-BeoeWV5I.js';
23
23
  import '@tanstack/react-table';
24
+ import './types-BeoeWV5I.js';
24
25
 
25
26
  /**
26
27
  * @file DateTimeField Component
@@ -130,11 +131,12 @@ declare function DateTimeField({ label, value, onChange, timezone, required, cla
130
131
  * Provides a calendar interface with timezone context for date selection.
131
132
  *
132
133
  * Features:
133
- * - Calendar date selection
134
+ * - Calendar date selection with dropdown month/year navigation
134
135
  * - Timezone display (shows "Local" when matches user timezone)
135
136
  * - Optional "Done" button
136
137
  * - Accessible date selection
137
138
  * - Keyboard navigation support
139
+ * - Wide date range support (1900-2100) via dropdown selectors
138
140
  *
139
141
  * @example
140
142
  * ```tsx