@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
@@ -85,29 +85,4 @@ var PermissionErrorCode = /* @__PURE__ */ ((PermissionErrorCode2) => {
85
85
  return PermissionErrorCode2;
86
86
  })(PermissionErrorCode || {});
87
87
 
88
- export {
89
- createUserId,
90
- createSessionToken,
91
- createPermissionString,
92
- createRequestId,
93
- createOrganisationId,
94
- createEventId,
95
- createAppId,
96
- createPageId,
97
- isUserId,
98
- isSessionToken,
99
- isPermissionString,
100
- isRequestId,
101
- isOrganisationId,
102
- isEventId,
103
- isAppId,
104
- isPageId,
105
- assertUserId,
106
- assertOrganisationId,
107
- assertEventId,
108
- assertAppId,
109
- assertPageId,
110
- AuthErrorCode,
111
- PermissionErrorCode
112
- };
113
- //# sourceMappingURL=chunk-QXHPKYJV.js.map
88
+ export { AuthErrorCode, PermissionErrorCode, assertAppId, assertEventId, assertOrganisationId, assertPageId, assertUserId, createAppId, createEventId, createOrganisationId, createPageId, createPermissionString, createRequestId, createSessionToken, createUserId, isAppId, isEventId, isOrganisationId, isPageId, isPermissionString, isRequestId, isSessionToken, isUserId };
@@ -1,33 +1,11 @@
1
- import {
2
- useEvents
3
- } from "./chunk-NTM7ZSB6.js";
4
- import {
5
- isSuperAdmin
6
- } from "./chunk-EFN2EIMK.js";
7
- import {
8
- assertAppId
9
- } from "./chunk-QXHPKYJV.js";
10
- import {
11
- createAddressFromPlaceResult,
12
- fetchPlaceAutocomplete,
13
- fetchPlaceDetails,
14
- getAddressByPlaceId
15
- } from "./chunk-G37KK66H.js";
16
- import {
17
- setOrganisationContext
18
- } from "./chunk-VBXEHIUJ.js";
19
- import {
20
- applyPalette,
21
- clearPalette,
22
- parseAndNormalizeEventColours
23
- } from "./chunk-L4OXEN46.js";
24
- import {
25
- createLogger,
26
- logger
27
- } from "./chunk-PWLANIRT.js";
1
+ import { clearPalette, parseAndNormalizeEventColours, applyPalette } from './chunk-ZKAWKYT4.js';
2
+ import { EventServiceContext } from './chunk-FTCRZOG2.js';
3
+ import { assertAppId } from './chunk-4SXLQIZO.js';
4
+ import { fetchPlaceDetails, createAddressFromPlaceResult, getAddressByPlaceId, fetchPlaceAutocomplete, setOrganisationContext } from './chunk-FYHN4DD5.js';
5
+ import { createLogger, logger } from './chunk-TTRFSOKR.js';
6
+ import { useState, useEffect, useCallback, useRef, useMemo, useContext } from 'react';
7
+ import { useLocation } from 'react-router-dom';
28
8
 
29
- // src/hooks/useDebounce.ts
30
- import { useState, useEffect } from "react";
31
9
  function useDebounce(value, delay) {
32
10
  const [debouncedValue, setDebouncedValue] = useState(value);
33
11
  useEffect(() => {
@@ -40,9 +18,6 @@ function useDebounce(value, delay) {
40
18
  }, [value, delay]);
41
19
  return debouncedValue;
42
20
  }
43
-
44
- // src/hooks/useQueryCache.ts
45
- import { useCallback } from "react";
46
21
  var log = createLogger("useQueryCache");
47
22
  var queryCache = /* @__PURE__ */ new Map();
48
23
  var CLEANUP_INTERVAL_MS = 5 * 60 * 1e3;
@@ -62,7 +37,6 @@ function runCacheCleanup() {
62
37
  }
63
38
  if (typeof window !== "undefined" && !cleanupTimer) {
64
39
  cleanupTimer = setInterval(runCacheCleanup, CLEANUP_INTERVAL_MS);
65
- log.debug("Query cache cleanup initialized.");
66
40
  window.addEventListener("beforeunload", () => {
67
41
  if (cleanupTimer) {
68
42
  clearInterval(cleanupTimer);
@@ -226,9 +200,6 @@ var queryCacheHelpers = {
226
200
  return promise;
227
201
  }
228
202
  };
229
-
230
- // src/hooks/useAddressAutocomplete.ts
231
- import { useState as useState2, useEffect as useEffect3, useCallback as useCallback2, useRef as useRef2, useMemo } from "react";
232
203
  function useAddressAutocomplete(apiKey, inputValue, options = {}) {
233
204
  const {
234
205
  debounceDelay = 300,
@@ -241,18 +212,18 @@ function useAddressAutocomplete(apiKey, inputValue, options = {}) {
241
212
  },
242
213
  autocompleteOptions
243
214
  } = options;
244
- const [suggestions, setSuggestions] = useState2([]);
245
- const [isLoading, setIsLoading] = useState2(false);
246
- const [error, setError] = useState2(null);
215
+ const [suggestions, setSuggestions] = useState([]);
216
+ const [isLoading, setIsLoading] = useState(false);
217
+ const [error, setError] = useState(null);
247
218
  const debouncedInput = useDebounce(inputValue, debounceDelay);
248
219
  const { getCachedQuery } = useQueryCache();
249
- const abortControllerRef = useRef2(null);
220
+ const abortControllerRef = useRef(null);
250
221
  const memoizedAutocompleteOptions = useMemo(
251
222
  () => autocompleteOptions,
252
223
  // eslint-disable-next-line react-hooks/exhaustive-deps
253
224
  [JSON.stringify(autocompleteOptions)]
254
225
  );
255
- useEffect3(() => {
226
+ useEffect(() => {
256
227
  if (abortControllerRef.current) {
257
228
  abortControllerRef.current.abort();
258
229
  }
@@ -303,7 +274,7 @@ function useAddressAutocomplete(apiKey, inputValue, options = {}) {
303
274
  }
304
275
  };
305
276
  }, [debouncedInput, apiKey, cacheEnabled, cacheTTL.autocomplete]);
306
- const selectAddress = useCallback2(
277
+ const selectAddress = useCallback(
307
278
  async (placeId) => {
308
279
  if (!placeId || !apiKey) {
309
280
  return null;
@@ -338,7 +309,7 @@ function useAddressAutocomplete(apiKey, inputValue, options = {}) {
338
309
  // eslint-disable-next-line react-hooks/exhaustive-deps
339
310
  [apiKey, cacheEnabled, cacheTTL.placeDetails]
340
311
  );
341
- const getAddressByPlaceIdFn = useCallback2(
312
+ const getAddressByPlaceIdFn = useCallback(
342
313
  async (placeId) => {
343
314
  if (!placeId || !apiKey) {
344
315
  return null;
@@ -370,7 +341,7 @@ function useAddressAutocomplete(apiKey, inputValue, options = {}) {
370
341
  // eslint-disable-next-line react-hooks/exhaustive-deps
371
342
  [apiKey, cacheEnabled, cacheTTL.placeDetails]
372
343
  );
373
- const clearSuggestions = useCallback2(() => {
344
+ const clearSuggestions = useCallback(() => {
374
345
  setSuggestions([]);
375
346
  setError(null);
376
347
  }, []);
@@ -502,12 +473,12 @@ async function extractFileMetadata(file, options, uploadedBy) {
502
473
  const dimensions = await getImageDimensions(file);
503
474
  metadata.width = dimensions.width;
504
475
  metadata.height = dimensions.height;
505
- } catch (error) {
476
+ } catch (_error) {
506
477
  }
507
478
  }
508
479
  try {
509
480
  metadata.hash = await generateFileHash(file);
510
- } catch (error) {
481
+ } catch (_error) {
511
482
  }
512
483
  return metadata;
513
484
  }
@@ -614,7 +585,7 @@ function getPublicUrl(supabase, path, isPublic = true) {
614
585
  if (/^https?:\/\//i.test(path)) {
615
586
  return path;
616
587
  }
617
- let normalisedPath = path.trim().replace(/^\/+/, "");
588
+ const normalisedPath = path.trim().replace(/^\/+/, "");
618
589
  if (!normalisedPath) {
619
590
  throw new Error("Storage path cannot be empty after normalisation");
620
591
  }
@@ -677,7 +648,6 @@ async function getSignedUrl(supabase, path, options) {
677
648
  }
678
649
  var globalUrlCache = /* @__PURE__ */ new Map();
679
650
  var MAX_CACHE_SIZE = 500;
680
- var DEFAULT_TTL_MS = 3600 * 1e3;
681
651
  function getCacheKey(fileId, filePath, isPublic) {
682
652
  return `file-url:${fileId}:${isPublic ? "public" : "private"}`;
683
653
  }
@@ -892,9 +862,6 @@ async function archiveFile(supabase, path, options) {
892
862
  };
893
863
  }
894
864
  }
895
-
896
- // src/hooks/public/usePublicFileDisplay.ts
897
- import { useState as useState3, useEffect as useEffect4, useCallback as useCallback3 } from "react";
898
865
  var publicFileCache = /* @__PURE__ */ new Map();
899
866
  function usePublicFileDisplay(table_name, record_id, organisation_id, category, options) {
900
867
  const {
@@ -903,14 +870,14 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
903
870
  enableCache = true,
904
871
  supabase
905
872
  } = options;
906
- const [fileUrl, setFileUrl] = useState3(null);
907
- const [fileReference, setFileReference] = useState3(null);
908
- const [fileReferences, setFileReferences] = useState3([]);
909
- const [fileUrls, setFileUrls] = useState3(/* @__PURE__ */ new Map());
910
- const [fileCount, setFileCount] = useState3(0);
911
- const [isLoading, setIsLoading] = useState3(false);
912
- const [error, setError] = useState3(null);
913
- const fetchFiles = useCallback3(async () => {
873
+ const [fileUrl, setFileUrl] = useState(null);
874
+ const [fileReference, setFileReference] = useState(null);
875
+ const [fileReferences, setFileReferences] = useState([]);
876
+ const [fileUrls, setFileUrls] = useState(/* @__PURE__ */ new Map());
877
+ const [fileCount, setFileCount] = useState(0);
878
+ const [isLoading, setIsLoading] = useState(false);
879
+ const [error, setError] = useState(null);
880
+ const fetchFiles = useCallback(async () => {
914
881
  if (!table_name || !record_id || !supabase) {
915
882
  setFileUrl(null);
916
883
  setFileReference(null);
@@ -1162,7 +1129,7 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
1162
1129
  setIsLoading(false);
1163
1130
  }
1164
1131
  }, [table_name, record_id, organisation_id, category, supabase, cacheTtl, enableCache]);
1165
- useEffect4(() => {
1132
+ useEffect(() => {
1166
1133
  if (table_name && record_id) {
1167
1134
  fetchFiles();
1168
1135
  } else {
@@ -1175,7 +1142,7 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
1175
1142
  setError(null);
1176
1143
  }
1177
1144
  }, [fetchFiles, table_name, record_id, organisation_id]);
1178
- const refetch = useCallback3(async () => {
1145
+ const refetch = useCallback(async () => {
1179
1146
  if (!table_name || !record_id) return;
1180
1147
  if (enableCache) {
1181
1148
  const cacheKey = `public_file_${table_name}_${record_id}_${organisation_id === void 0 ? "undefined" : organisation_id ?? "null"}_${category || "all"}`;
@@ -1209,9 +1176,6 @@ function getPublicFileDisplayCacheStats() {
1209
1176
  };
1210
1177
  }
1211
1178
 
1212
- // src/hooks/useFileDisplay.ts
1213
- import { useState as useState4, useEffect as useEffect5, useCallback as useCallback4, useRef as useRef3 } from "react";
1214
-
1215
1179
  // src/utils/file-reference/index.ts
1216
1180
  var log3 = createLogger("FileReferenceService");
1217
1181
  var FileReferenceServiceImpl = class {
@@ -1270,6 +1234,19 @@ var FileReferenceServiceImpl = class {
1270
1234
  authenticatedUserId = authUser.id;
1271
1235
  log3.debug("Using authenticated user ID for user-scoped file upload", { userId: authenticatedUserId });
1272
1236
  }
1237
+ let isSuperAdminUser = false;
1238
+ const userIdForCheck = authenticatedUserId || options.userId;
1239
+ if (userIdForCheck) {
1240
+ try {
1241
+ const { isSuperAdmin } = await import('./api-Y4MQWOFW.js');
1242
+ isSuperAdminUser = await isSuperAdmin(userIdForCheck);
1243
+ if (isSuperAdminUser) {
1244
+ log3.debug("Super admin detected - bypassing permission checks", { userId: userIdForCheck });
1245
+ }
1246
+ } catch (superAdminCheckError) {
1247
+ log3.warn("Failed to check super-admin status, proceeding with normal permission checks", superAdminCheckError);
1248
+ }
1249
+ }
1273
1250
  const uploadResult = await uploadFile(this.supabase, file, {
1274
1251
  appName: "file-reference",
1275
1252
  orgId: options.organisation_id || void 0,
@@ -1296,6 +1273,17 @@ var FileReferenceServiceImpl = class {
1296
1273
  if (!isUserScoped && options.organisation_id) {
1297
1274
  await setOrganisationContext(this.supabase, options.organisation_id);
1298
1275
  }
1276
+ let rpcUserId = null;
1277
+ if (authenticatedUserId) {
1278
+ rpcUserId = authenticatedUserId;
1279
+ } else if (options.userId) {
1280
+ rpcUserId = options.userId;
1281
+ } else {
1282
+ const { data: { user: authUser } } = await this.supabase.auth.getUser();
1283
+ if (authUser) {
1284
+ rpcUserId = authUser.id;
1285
+ }
1286
+ }
1299
1287
  const { data, error } = await this.supabase.rpc("data_file_reference_create", {
1300
1288
  p_table_name: options.table_name,
1301
1289
  p_record_id: options.record_id,
@@ -1315,23 +1303,14 @@ var FileReferenceServiceImpl = class {
1315
1303
  ...options.custom_metadata
1316
1304
  },
1317
1305
  p_is_public: options.is_public || false,
1318
- p_user_id: authenticatedUserId || options.userId || null
1319
- // Pass authenticated user ID for user-scoped files
1306
+ p_user_id: rpcUserId
1307
+ // Always pass authenticated user ID for SECURITY DEFINER functions
1320
1308
  });
1321
1309
  if (error) {
1322
1310
  await deleteFile(this.supabase, filePath, options.is_public || false);
1323
1311
  throw new Error(`Failed to create file reference: ${error.message}`);
1324
1312
  }
1325
1313
  if (!data || data === null) {
1326
- let isSuperAdminUser = false;
1327
- try {
1328
- const { data: { user: authUser } } = await this.supabase.auth.getUser();
1329
- if (authUser) {
1330
- isSuperAdminUser = await isSuperAdmin(authUser.id);
1331
- }
1332
- } catch (superAdminCheckError) {
1333
- log3.warn("Failed to check super-admin status", superAdminCheckError);
1334
- }
1335
1314
  await deleteFile(this.supabase, filePath, options.is_public || false);
1336
1315
  const appName = await this.getAppName(options.app_id).catch(() => "unknown");
1337
1316
  const pageContextDisplay = options.pageContext || "undefined";
@@ -1684,20 +1663,20 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
1684
1663
  enableCache = true,
1685
1664
  supabase
1686
1665
  } = options;
1687
- const [fileUrl, setFileUrl] = useState4(null);
1688
- const [fileReference, setFileReference] = useState4(null);
1689
- const [fileReferences, setFileReferences] = useState4([]);
1690
- const [fileUrls, setFileUrls] = useState4(/* @__PURE__ */ new Map());
1691
- const [fileCount, setFileCount] = useState4(0);
1692
- const [isLoading, setIsLoading] = useState4(false);
1693
- const [error, setError] = useState4(null);
1694
- const isMountedRef = useRef3(true);
1666
+ const [fileUrl, setFileUrl] = useState(null);
1667
+ const [fileReference, setFileReference] = useState(null);
1668
+ const [fileReferences, setFileReferences] = useState([]);
1669
+ const [fileUrls, setFileUrls] = useState(/* @__PURE__ */ new Map());
1670
+ const [fileCount, setFileCount] = useState(0);
1671
+ const [isLoading, setIsLoading] = useState(false);
1672
+ const [error, setError] = useState(null);
1673
+ const isMountedRef = useRef(true);
1695
1674
  const safeSetState = (setter, value) => {
1696
1675
  if (isMountedRef.current) {
1697
1676
  setter(value);
1698
1677
  }
1699
1678
  };
1700
- const fetchFiles = useCallback4(async () => {
1679
+ const fetchFiles = useCallback(async () => {
1701
1680
  if (!table_name || !record_id || !supabase) {
1702
1681
  safeSetState(setFileUrl, null);
1703
1682
  safeSetState(setFileReference, null);
@@ -2046,7 +2025,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
2046
2025
  safeSetState(setIsLoading, false);
2047
2026
  }
2048
2027
  }, [table_name, record_id, organisation_id, category, supabase, cacheTtl, enableCache]);
2049
- useEffect5(() => {
2028
+ useEffect(() => {
2050
2029
  isMountedRef.current = true;
2051
2030
  if (table_name && record_id && supabase) {
2052
2031
  fetchFiles().catch((err) => {
@@ -2067,7 +2046,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
2067
2046
  isMountedRef.current = false;
2068
2047
  };
2069
2048
  }, [table_name, record_id, organisation_id, supabase]);
2070
- const refetch = useCallback4(async () => {
2049
+ const refetch = useCallback(async () => {
2071
2050
  if (!table_name || !record_id || !supabase) return;
2072
2051
  if (enableCache) {
2073
2052
  const cacheKey = `file_${table_name}_${record_id}_${organisation_id === void 0 ? "undefined" : organisation_id ?? "null"}_${category || "all"}`;
@@ -2108,29 +2087,12 @@ function invalidateFileDisplayCache(table_name, record_id, organisation_id, cate
2108
2087
  authenticatedFileCache.delete(allCategoryKey);
2109
2088
  }
2110
2089
  }
2111
-
2112
- // src/hooks/useEventTheme.ts
2113
- import { useEffect as useEffect6 } from "react";
2114
- import { useLocation } from "react-router-dom";
2115
- var log4 = createLogger("useEventTheme");
2116
2090
  function useEventTheme(event) {
2117
2091
  const location = useLocation();
2118
- let selectedEvent;
2119
- try {
2120
- if (event === void 0) {
2121
- const eventsContext = useEvents();
2122
- selectedEvent = eventsContext.selectedEvent;
2123
- } else {
2124
- selectedEvent = event;
2125
- }
2126
- } catch (error) {
2127
- if (event !== void 0) {
2128
- selectedEvent = event;
2129
- } else {
2130
- selectedEvent = null;
2131
- }
2132
- }
2133
- useEffect6(() => {
2092
+ const eventServiceContext = useContext(EventServiceContext);
2093
+ const eventsContextSelectedEvent = eventServiceContext?.eventService?.getSelectedEvent() ?? null;
2094
+ const selectedEvent = event !== void 0 ? event : eventsContextSelectedEvent;
2095
+ useEffect(() => {
2134
2096
  const isOnLoginRoute = location.pathname === "/login" || location.pathname.startsWith("/login");
2135
2097
  if (isOnLoginRoute) {
2136
2098
  clearPalette();
@@ -2149,20 +2111,16 @@ function useEventTheme(event) {
2149
2111
  try {
2150
2112
  applyPalette(normalized);
2151
2113
  } catch (error) {
2152
- log4.error("Failed to apply event palette:", error);
2153
2114
  }
2154
2115
  return () => {
2155
2116
  };
2156
2117
  }, [selectedEvent, location.pathname]);
2157
2118
  }
2158
-
2159
- // src/hooks/usePreventTabReload.ts
2160
- import { useEffect as useEffect7, useRef as useRef4 } from "react";
2161
2119
  function usePreventTabReload(options = {}) {
2162
2120
  const { enabled = true, gracePeriodMs = 2e3 } = options;
2163
- const isRestoringFromCacheRef = useRef4(false);
2164
- const gracePeriodTimeoutRef = useRef4(null);
2165
- useEffect7(() => {
2121
+ const isRestoringFromCacheRef = useRef(false);
2122
+ const gracePeriodTimeoutRef = useRef(null);
2123
+ useEffect(() => {
2166
2124
  if (!enabled || typeof window === "undefined") return;
2167
2125
  const handlePageShow = (event) => {
2168
2126
  if (event.persisted) {
@@ -2198,40 +2156,4 @@ function usePreventTabReload(options = {}) {
2198
2156
  }, [enabled, gracePeriodMs]);
2199
2157
  }
2200
2158
 
2201
- export {
2202
- useDebounce,
2203
- cleanupQueryCache,
2204
- useQueryCache,
2205
- queryCacheHelpers,
2206
- useAddressAutocomplete,
2207
- FILE_SIZE_LIMITS,
2208
- DEFAULT_FILE_SIZE_LIMIT,
2209
- APP_PATH_MAPPING,
2210
- STORAGE_CONFIG,
2211
- getFileSizeLimit,
2212
- getBucketName,
2213
- validateFileSize,
2214
- generateFilePath,
2215
- generateUniqueFileName,
2216
- extractFileMetadata,
2217
- uploadFile,
2218
- getPublicUrl,
2219
- getSignedUrl,
2220
- generateFileUrlsBatch,
2221
- deleteFile,
2222
- listFiles,
2223
- downloadFile,
2224
- archiveFile,
2225
- usePublicFileDisplay,
2226
- clearPublicFileDisplayCache,
2227
- getPublicFileDisplayCacheStats,
2228
- createFileReferenceService,
2229
- uploadFileWithReference,
2230
- useFileDisplay,
2231
- clearFileDisplayCache,
2232
- getFileDisplayCacheStats,
2233
- invalidateFileDisplayCache,
2234
- useEventTheme,
2235
- usePreventTabReload
2236
- };
2237
- //# sourceMappingURL=chunk-UPPMRMYG.js.map
2159
+ export { APP_PATH_MAPPING, DEFAULT_FILE_SIZE_LIMIT, FILE_SIZE_LIMITS, STORAGE_CONFIG, archiveFile, cleanupQueryCache, clearFileDisplayCache, clearPublicFileDisplayCache, createFileReferenceService, deleteFile, downloadFile, extractFileMetadata, generateFilePath, generateFileUrlsBatch, generateUniqueFileName, getBucketName, getFileDisplayCacheStats, getFileSizeLimit, getPublicFileDisplayCacheStats, getPublicUrl, getSignedUrl, invalidateFileDisplayCache, listFiles, queryCacheHelpers, uploadFile, uploadFileWithReference, useAddressAutocomplete, useDebounce, useEventTheme, useFileDisplay, usePreventTabReload, usePublicFileDisplay, useQueryCache, validateFileSize };
@@ -0,0 +1,62 @@
1
+ import { Button } from './chunk-BM4CQ5P3.js';
2
+ import { ShieldX } from 'lucide-react';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ function AccessDenied({
6
+ message,
7
+ resource,
8
+ operation,
9
+ onGoBack,
10
+ onSignOut,
11
+ className = "",
12
+ showSignOut = false
13
+ }) {
14
+ const defaultMessage = message || (resource && operation ? `You don't have permission to ${operation} ${resource}.` : "You don't have permission to access this page.");
15
+ const handleGoBack = () => {
16
+ if (onGoBack) {
17
+ onGoBack();
18
+ } else {
19
+ window.history.back();
20
+ }
21
+ };
22
+ const handleSignOut = () => {
23
+ if (onSignOut) {
24
+ onSignOut();
25
+ }
26
+ };
27
+ return /* @__PURE__ */ jsx(
28
+ "main",
29
+ {
30
+ className: `flex flex-col items-center justify-center min-h-[400px] p-8 text-center ${className}`,
31
+ role: "alert",
32
+ "aria-live": "polite",
33
+ children: /* @__PURE__ */ jsxs("section", { className: "max-w-md", children: [
34
+ /* @__PURE__ */ jsx("div", { className: "mb-6 flex justify-center", children: /* @__PURE__ */ jsx(ShieldX, { className: "size-16 text-acc-500", "aria-hidden": "true" }) }),
35
+ /* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold text-sec-900 mb-3", children: "Access Denied" }),
36
+ /* @__PURE__ */ jsx("p", { className: "text-sec-600 mb-6", children: defaultMessage }),
37
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row gap-3 justify-center", children: [
38
+ /* @__PURE__ */ jsx(
39
+ Button,
40
+ {
41
+ onClick: handleGoBack,
42
+ variant: "default",
43
+ "aria-label": "Go back to previous page",
44
+ children: "Go Back"
45
+ }
46
+ ),
47
+ showSignOut && onSignOut && /* @__PURE__ */ jsx(
48
+ Button,
49
+ {
50
+ onClick: handleSignOut,
51
+ variant: "outline",
52
+ "aria-label": "Sign out of your account",
53
+ children: "Sign Out"
54
+ }
55
+ )
56
+ ] })
57
+ ] })
58
+ }
59
+ );
60
+ }
61
+
62
+ export { AccessDenied };
@@ -1,9 +1,6 @@
1
- import {
2
- createLogger
3
- } from "./chunk-PWLANIRT.js";
1
+ import { createLogger } from './chunk-TTRFSOKR.js';
2
+ import { useRef, useEffect } from 'react';
4
3
 
5
- // src/hooks/useComponentPerformance.ts
6
- import { useEffect, useRef } from "react";
7
4
  var log = createLogger("useComponentPerformance");
8
5
  function useComponentPerformance({
9
6
  componentName,
@@ -31,7 +28,4 @@ function useComponentPerformance({
31
28
  };
32
29
  }
33
30
 
34
- export {
35
- useComponentPerformance
36
- };
37
- //# sourceMappingURL=chunk-E66EQZE6.js.map
31
+ export { useComponentPerformance };
@@ -19,7 +19,4 @@ var FileCategory = /* @__PURE__ */ ((FileCategory2) => {
19
19
  return FileCategory2;
20
20
  })(FileCategory || {});
21
21
 
22
- export {
23
- FileCategory
24
- };
25
- //# sourceMappingURL=chunk-ZSAAAMVR.js.map
22
+ export { FileCategory };
@@ -1,3 +1,11 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ // src/utils/core/cn.ts
5
+ function cn(...inputs) {
6
+ return twMerge(clsx(inputs));
7
+ }
8
+
1
9
  // src/utils/performance/performanceBudgets.ts
2
10
  var PERFORMANCE_BUDGETS = {
3
11
  COMPONENT_RENDER: { threshold: 50 },
@@ -69,8 +77,4 @@ performanceBudgetMonitor.setBudget("CHUNK_COUNT", 10, "warning");
69
77
  performanceBudgetMonitor.setBudget("TREESHAKING_SCORE", 70, "warning");
70
78
  performanceBudgetMonitor.setBudget("ERROR_BOUNDARY_TRIGGER", 5, "error");
71
79
 
72
- export {
73
- PERFORMANCE_BUDGETS,
74
- performanceBudgetMonitor
75
- };
76
- //# sourceMappingURL=chunk-FMUCXFII.js.map
80
+ export { PERFORMANCE_BUDGETS, cn, performanceBudgetMonitor };
@@ -1,9 +1,4 @@
1
- // src/utils/core/cn.ts
2
- import { clsx } from "clsx";
3
- import { twMerge } from "tailwind-merge";
4
- function cn(...inputs) {
5
- return twMerge(clsx(inputs));
6
- }
1
+ import { jsx } from 'react/jsx-runtime';
7
2
 
8
3
  // src/utils/validation/htmlSanitization.ts
9
4
  function sanitizeHtml(html) {
@@ -58,11 +53,18 @@ function renderSafeHtml(html, options = {}) {
58
53
  warnings: validation.warnings
59
54
  };
60
55
  }
61
-
62
- export {
63
- cn,
64
- sanitizeHtml,
65
- validateHtml,
66
- renderSafeHtml
56
+ var LoadingSpinner = ({
57
+ size = "md",
58
+ className = ""
59
+ }) => {
60
+ const sizeClasses = {
61
+ sm: "size-4",
62
+ md: "size-6",
63
+ lg: "size-8"
64
+ };
65
+ const validSize = size && size in sizeClasses ? size : "md";
66
+ const sizeClass = sizeClasses[validSize];
67
+ return /* @__PURE__ */ jsx("canvas", { className: `inline-block animate-spin rounded-full border-2 border-solid border-current border-r-transparent motion-reduce:animate-[spin_1.5s_linear_infinite] ${sizeClass} ${className}`.trim(), role: "status", children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Loading..." }) });
67
68
  };
68
- //# sourceMappingURL=chunk-M43Y4SSO.js.map
69
+
70
+ export { LoadingSpinner, renderSafeHtml, sanitizeHtml, validateHtml };
@@ -1,6 +1,4 @@
1
- import {
2
- logger
3
- } from "./chunk-PWLANIRT.js";
1
+ import { logger } from './chunk-TTRFSOKR.js';
4
2
 
5
3
  // src/rbac/audit-batched.ts
6
4
  var DEFAULT_CONFIG = {
@@ -422,11 +420,4 @@ async function emitAuditEvent(event) {
422
420
  }
423
421
  }
424
422
 
425
- export {
426
- RBACAuditManager,
427
- createAuditManager,
428
- setGlobalAuditManager,
429
- getGlobalAuditManager,
430
- emitAuditEvent
431
- };
432
- //# sourceMappingURL=chunk-63FOKYGO.js.map
423
+ export { RBACAuditManager, createAuditManager, emitAuditEvent, getGlobalAuditManager, setGlobalAuditManager };