@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,33 +1,14 @@
1
- import {
2
- archiveFile,
3
- deleteFile,
4
- downloadFile,
5
- extractFileMetadata,
6
- generateFilePath,
7
- generateUniqueFileName,
8
- getPublicUrl,
9
- getSignedUrl,
10
- listFiles,
11
- uploadFile
12
- } from "./chunk-UPPMRMYG.js";
13
- import {
14
- useOrganisationSecurity,
15
- usePublicPageContext
16
- } from "./chunk-NTM7ZSB6.js";
17
- import {
18
- useOrganisations
19
- } from "./chunk-IHB5DR3H.js";
20
- import {
21
- assertOrganisationId
22
- } from "./chunk-QXHPKYJV.js";
23
- import {
24
- createLogger,
25
- logger
26
- } from "./chunk-PWLANIRT.js";
1
+ import { generateFilePath, generateUniqueFileName, extractFileMetadata, uploadFile, getPublicUrl, getSignedUrl, deleteFile, downloadFile, listFiles, archiveFile } from './chunk-5X4QLXRG.js';
2
+ import { useOrganisationSecurity, usePublicPageContext } from './chunk-VBCS3DUA.js';
3
+ import { useOrganisations } from './chunk-FTCRZOG2.js';
4
+ import { assertOrganisationId } from './chunk-4SXLQIZO.js';
5
+ import { createLogger, logger } from './chunk-TTRFSOKR.js';
6
+ import { useForm } from 'react-hook-form';
7
+ import { zodResolver } from '@hookform/resolvers/zod';
8
+ import { useState, useMemo, useCallback, useEffect } from 'react';
9
+ import { createClient } from '@supabase/supabase-js';
10
+ import { useParams, useLocation } from 'react-router-dom';
27
11
 
28
- // src/hooks/useZodForm.ts
29
- import { useForm } from "react-hook-form";
30
- import { zodResolver } from "@hookform/resolvers/zod";
31
12
  function useZodForm({
32
13
  schema,
33
14
  defaultValues,
@@ -39,9 +20,6 @@ function useZodForm({
39
20
  mode
40
21
  });
41
22
  }
42
-
43
- // src/hooks/useFormDialog.ts
44
- import { useState } from "react";
45
23
  function useFormDialog({
46
24
  onOpenChange,
47
25
  resetOnClose = true
@@ -75,9 +53,6 @@ function useFormDialog({
75
53
  handleOpenChange
76
54
  };
77
55
  }
78
-
79
- // src/hooks/useOrganisationPermissions.ts
80
- import { useMemo } from "react";
81
56
  function useOrganisationPermissions(orgId) {
82
57
  const {
83
58
  selectedOrganisation,
@@ -85,11 +60,8 @@ function useOrganisationPermissions(orgId) {
85
60
  validateOrganisationAccess,
86
61
  ensureOrganisationContext
87
62
  } = useOrganisations();
88
- let superAdminContext = { isSuperAdmin: false };
89
- try {
90
- superAdminContext = useOrganisationSecurity().superAdminContext;
91
- } catch {
92
- }
63
+ const organisationSecurity = useOrganisationSecurity();
64
+ const superAdminContext = organisationSecurity.superAdminContext;
93
65
  const organisationId = useMemo(() => {
94
66
  if (orgId) {
95
67
  return orgId;
@@ -127,8 +99,6 @@ function useOrganisationPermissions(orgId) {
127
99
  }
128
100
  const isOrgAdmin = userRole === "org_admin";
129
101
  const isLeader = userRole === "leader";
130
- const isMember = userRole === "member";
131
- const isSupporter = userRole === "supporter";
132
102
  const isSuperAdmin = superAdminContext.isSuperAdmin;
133
103
  return {
134
104
  isOrgAdmin,
@@ -197,10 +167,6 @@ StorageUtils.deleteFile = deleteFile;
197
167
  StorageUtils.downloadFile = downloadFile;
198
168
  StorageUtils.listFiles = listFiles;
199
169
  StorageUtils.archiveFile = archiveFile;
200
-
201
- // src/hooks/public/usePublicEvent.ts
202
- import { useState as useState2, useEffect, useCallback, useMemo as useMemo2 } from "react";
203
- import { createClient } from "@supabase/supabase-js";
204
170
  var publicDataCache = /* @__PURE__ */ new Map();
205
171
  function usePublicEvent(eventCode, options = {}) {
206
172
  const {
@@ -208,19 +174,12 @@ function usePublicEvent(eventCode, options = {}) {
208
174
  // 5 minutes
209
175
  enableCache = true
210
176
  } = options;
211
- const [event, setEvent] = useState2(null);
212
- const [isLoading, setIsLoading] = useState2(true);
213
- const [error, setError] = useState2(null);
214
- let environment;
215
- try {
216
- environment = usePublicPageContext().environment;
217
- } catch {
218
- environment = {
219
- supabaseUrl: import.meta.env?.VITE_SUPABASE_URL || import.meta.env?.NEXT_PUBLIC_SUPABASE_URL || null,
220
- supabaseKey: import.meta.env?.VITE_SUPABASE_PUBLISHABLE_KEY || import.meta.env?.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || null
221
- };
222
- }
223
- const supabase = useMemo2(() => {
177
+ const [event, setEvent] = useState(null);
178
+ const [isLoading, setIsLoading] = useState(true);
179
+ const [error, setError] = useState(null);
180
+ const publicPageContext = usePublicPageContext();
181
+ const environment = publicPageContext.environment;
182
+ const supabase = useMemo(() => {
224
183
  if (typeof window === "undefined") return null;
225
184
  if (!environment.supabaseUrl || !environment.supabaseKey) {
226
185
  logger.warn("usePublicEvent", "Missing Supabase environment variables. Please ensure VITE_SUPABASE_URL and VITE_SUPABASE_PUBLISHABLE_KEY are set in your environment.");
@@ -228,13 +187,6 @@ function usePublicEvent(eventCode, options = {}) {
228
187
  }
229
188
  return createClient(environment.supabaseUrl, environment.supabaseKey);
230
189
  }, [environment.supabaseUrl, environment.supabaseKey]);
231
- const refreshSchemaCache = useCallback(async () => {
232
- try {
233
- await supabase.from("information_schema.routines").select("routine_name").limit(1);
234
- } catch (error2) {
235
- logger.debug("usePublicEvent", "Schema cache refresh attempt failed:", error2);
236
- }
237
- }, [supabase]);
238
190
  const fetchEvent = useCallback(async () => {
239
191
  if (!eventCode || !supabase) {
240
192
  setError(new Error("Invalid event code or Supabase client not available"));
@@ -254,115 +206,40 @@ function usePublicEvent(eventCode, options = {}) {
254
206
  try {
255
207
  setIsLoading(true);
256
208
  setError(null);
257
- let eventData = null;
258
- try {
259
- const response = await supabase.rpc("get_public_event_by_code", {
260
- event_code_param: eventCode
261
- });
262
- const data = response?.data;
263
- const rpcError = response?.error;
264
- if (rpcError) {
265
- if (rpcError.message?.includes("Could not find the function") || rpcError.message?.includes("does not exist") || rpcError.message?.includes("schema cache")) {
266
- logger.warn("usePublicEvent", "RPC function not found or schema cache issue, attempting refresh:", rpcError.message);
267
- await refreshSchemaCache();
268
- try {
269
- const retryResponse = await supabase.rpc("get_public_event_by_code", {
270
- event_code_param: eventCode
271
- });
272
- const retryData = retryResponse?.data;
273
- const retryError = retryResponse?.error;
274
- if (!retryError && retryData && retryData.length > 0) {
275
- eventData = retryData[0];
276
- } else {
277
- throw new Error("RPC still failing after cache refresh");
278
- }
279
- } catch (retryError) {
280
- logger.warn("usePublicEvent", "RPC still failing after cache refresh, falling back to direct table access");
281
- const tableResponse2 = await supabase.from("core_events").select(`
282
- event_id,
283
- event_name,
284
- event_date,
285
- event_venue,
286
- event_participants,
287
- event_colours,
288
- organisation_id,
289
- event_days,
290
- event_typicalunit,
291
- event_rounddown,
292
- event_youthmultiplier,
293
- event_catering_email,
294
- event_news,
295
- event_billing,
296
- event_email
297
- `).eq("event_code", eventCode).eq("is_visible", true).not("organisation_id", "is", null).limit(1).single();
298
- const tableData = tableResponse2?.data;
299
- const tableError = tableResponse2?.error;
300
- if (tableError) {
301
- throw new Error(tableError?.message || "Failed to fetch event from table");
302
- }
303
- if (!tableData) {
304
- setEvent(null);
305
- setError(new Error("Event not found"));
306
- return;
307
- }
308
- const logoResponse = await supabase.from("core_file_references").select("file_path").eq("table_name", "core_events").eq("record_id", tableData.event_id).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
309
- const logoData = logoResponse?.data;
310
- eventData = {
311
- ...tableData,
312
- event_logo: logoData?.file_path || null
313
- };
314
- }
315
- } else {
316
- const errorMessage = rpcError?.message || rpcError?.toString() || "Failed to fetch event";
317
- setEvent(null);
318
- setError(new Error(errorMessage));
319
- setIsLoading(false);
320
- return;
321
- }
322
- } else {
323
- if (!data || data.length === 0 || !data[0]) {
324
- setEvent(null);
325
- setError(new Error("Event not found"));
326
- return;
327
- }
328
- eventData = data[0];
329
- }
330
- } catch (rpcError) {
331
- logger.warn("usePublicEvent", "RPC call failed, falling back to direct table access:", rpcError);
332
- const tableResponse = await supabase.from("core_events").select(`
333
- event_id,
334
- event_name,
335
- event_date,
336
- event_venue,
337
- event_participants,
338
- event_colours,
339
- organisation_id,
340
- event_days,
341
- event_typicalunit,
342
- event_rounddown,
343
- event_youthmultiplier,
344
- event_catering_email,
345
- event_news,
346
- event_billing,
347
- event_email
348
- `).eq("event_code", eventCode).eq("is_visible", true).not("organisation_id", "is", null).limit(1).single();
349
- const tableData = tableResponse?.data;
350
- const tableError = tableResponse?.error;
351
- if (tableError) {
352
- throw new Error(tableError?.message || "Failed to fetch event from table");
353
- }
354
- if (!tableData) {
355
- setEvent(null);
356
- setError(new Error("Event not found"));
357
- return;
358
- }
359
- const logoResponse = await supabase.from("core_file_references").select("file_path").eq("table_name", "core_events").eq("record_id", tableData.event_id).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
360
- const logoData = logoResponse?.data;
361
- eventData = {
362
- ...tableData,
363
- event_logo: logoData?.file_path || null
364
- };
209
+ const tableResponse = await supabase.from("core_events").select(`
210
+ event_id,
211
+ event_name,
212
+ event_date,
213
+ event_venue,
214
+ event_participants,
215
+ event_colours,
216
+ organisation_id,
217
+ event_days,
218
+ event_typicalunit,
219
+ event_rounddown,
220
+ event_youthmultiplier,
221
+ event_catering_email,
222
+ event_news,
223
+ event_billing,
224
+ event_email
225
+ `).eq("event_code", eventCode).eq("is_visible", true).not("organisation_id", "is", null).limit(1).single();
226
+ const tableData = tableResponse?.data;
227
+ const tableError = tableResponse?.error;
228
+ if (tableError) {
229
+ const errorMessage = tableError.message === "No rows found" || tableError.code === "PGRST116" ? "Event not found" : tableError?.message || "Failed to fetch event from table";
230
+ throw new Error(errorMessage);
231
+ }
232
+ if (!tableData) {
233
+ setEvent(null);
234
+ setError(new Error("Event not found"));
235
+ return;
365
236
  }
237
+ const logoResponse = await supabase.from("core_file_references").select("file_path").eq("table_name", "core_events").eq("record_id", tableData.event_id).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
238
+ const logoData = logoResponse?.data;
239
+ const eventData = {
240
+ ...tableData,
241
+ event_logo: logoData?.file_path || null
242
+ };
366
243
  const transformedEvent = {
367
244
  id: eventData.event_id,
368
245
  event_id: eventData.event_id,
@@ -426,9 +303,6 @@ function getPublicEventCacheStats() {
426
303
  keys
427
304
  };
428
305
  }
429
-
430
- // src/hooks/public/usePublicEventLogo.ts
431
- import { useState as useState3, useEffect as useEffect2, useCallback as useCallback2, useMemo as useMemo3 } from "react";
432
306
  var log = createLogger("usePublicEventLogo");
433
307
  var publicDataCache2 = /* @__PURE__ */ new Map();
434
308
  function defaultGenerateFallbackText(eventName) {
@@ -444,13 +318,13 @@ function usePublicEventLogo(eventId, eventName, organisationId, options) {
444
318
  generateFallbackText = defaultGenerateFallbackText,
445
319
  supabase
446
320
  } = options;
447
- const [logoUrl, setLogoUrl] = useState3(null);
448
- const [isLoading, setIsLoading] = useState3(false);
449
- const [error, setError] = useState3(null);
450
- const fallbackText = useMemo3(() => {
321
+ const [logoUrl, setLogoUrl] = useState(null);
322
+ const [isLoading, setIsLoading] = useState(false);
323
+ const [error, setError] = useState(null);
324
+ const fallbackText = useMemo(() => {
451
325
  return eventName ? generateFallbackText(eventName) : "EV";
452
326
  }, [eventName, generateFallbackText]);
453
- const fetchLogo = useCallback2(async () => {
327
+ const fetchLogo = useCallback(async () => {
454
328
  if (!eventId || !organisationId || !supabase) {
455
329
  setLogoUrl(null);
456
330
  setIsLoading(false);
@@ -473,18 +347,19 @@ function usePublicEventLogo(eventId, eventName, organisationId, options) {
473
347
  try {
474
348
  setIsLoading(true);
475
349
  setError(null);
476
- const { data, error: rpcError } = await supabase.rpc("get_public_event_logo", {
477
- event_id_param: eventId,
478
- organisation_id_param: organisationId
479
- });
480
- if (rpcError) {
481
- throw new Error(rpcError.message || "Failed to fetch logo");
350
+ const { data: logoData, error: queryError } = await supabase.from("core_file_references").select("file_path").eq("table_name", "core_events").eq("record_id", eventId).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
351
+ if (queryError) {
352
+ if (queryError.code === "PGRST116") {
353
+ setLogoUrl(null);
354
+ return;
355
+ }
356
+ throw new Error(queryError.message || "Failed to fetch logo");
482
357
  }
483
- if (!data || data.length === 0 || !data[0] || !data[0].logo_url) {
358
+ if (!logoData || !logoData.file_path) {
484
359
  setLogoUrl(null);
485
360
  return;
486
361
  }
487
- const logoUrl2 = data[0].logo_url;
362
+ const logoUrl2 = logoData.file_path;
488
363
  if (validateImage) {
489
364
  try {
490
365
  const response = await fetch(logoUrl2, { method: "HEAD" });
@@ -516,7 +391,7 @@ function usePublicEventLogo(eventId, eventName, organisationId, options) {
516
391
  setIsLoading(false);
517
392
  }
518
393
  }, [eventId, organisationId, supabase, cacheTtl, enableCache, validateImage]);
519
- useEffect2(() => {
394
+ useEffect(() => {
520
395
  if (eventId && organisationId) {
521
396
  fetchLogo();
522
397
  } else {
@@ -525,7 +400,7 @@ function usePublicEventLogo(eventId, eventName, organisationId, options) {
525
400
  setError(null);
526
401
  }
527
402
  }, [fetchLogo, eventId, organisationId]);
528
- const refetch = useCallback2(async () => {
403
+ const refetch = useCallback(async () => {
529
404
  if (!eventId || !organisationId) return;
530
405
  if (enableCache) {
531
406
  const cacheKey = `public_logo_${eventId}_${organisationId}`;
@@ -555,10 +430,6 @@ function getPublicLogoCacheStats() {
555
430
  keys
556
431
  };
557
432
  }
558
-
559
- // src/hooks/public/usePublicRouteParams.ts
560
- import { useState as useState4, useCallback as useCallback3, useMemo as useMemo4 } from "react";
561
- import { useParams, useLocation } from "react-router-dom";
562
433
  function validateEventCodeFormat(eventCode) {
563
434
  if (!eventCode || typeof eventCode !== "string") return false;
564
435
  if (eventCode.length < 2 || eventCode.length > 50) return false;
@@ -580,9 +451,9 @@ function usePublicRouteParams(options = {}) {
580
451
  validateEventCode = true
581
452
  } = options;
582
453
  const params = useParams();
583
- const location = useLocation();
584
- const [error, setError] = useState4(null);
585
- const eventCode = useMemo4(() => {
454
+ useLocation();
455
+ const [error, setError] = useState(null);
456
+ const eventCode = useMemo(() => {
586
457
  const code = params[eventCodeParam];
587
458
  if (!code) {
588
459
  return null;
@@ -604,20 +475,20 @@ function usePublicRouteParams(options = {}) {
604
475
  cacheTtl: 5 * 60 * 1e3
605
476
  // 5 minutes
606
477
  });
607
- const isLoading = useMemo4(() => {
478
+ const isLoading = useMemo(() => {
608
479
  if (!fetchEventData) return false;
609
480
  return eventLoading;
610
481
  }, [fetchEventData, eventLoading]);
611
- const finalError = useMemo4(() => {
482
+ const finalError = useMemo(() => {
612
483
  if (error) return error;
613
484
  if (eventError) return eventError;
614
485
  return null;
615
486
  }, [error, eventError]);
616
- const eventId = useMemo4(() => {
487
+ const eventId = useMemo(() => {
617
488
  if (!event) return null;
618
489
  return event.event_id || event.id;
619
490
  }, [event]);
620
- const refetch = useCallback3(async () => {
491
+ const refetch = useCallback(async () => {
621
492
  if (!fetchEventData) return;
622
493
  await refetchEvent();
623
494
  }, [fetchEventData, refetchEvent]);
@@ -632,7 +503,7 @@ function usePublicRouteParams(options = {}) {
632
503
  }
633
504
  function usePublicEventCode(eventCodeParam = "eventCode") {
634
505
  const params = useParams();
635
- const eventCode = useMemo4(() => {
506
+ const eventCode = useMemo(() => {
636
507
  const code = params[eventCodeParam];
637
508
  if (!code) {
638
509
  return null;
@@ -642,7 +513,7 @@ function usePublicEventCode(eventCodeParam = "eventCode") {
642
513
  }
643
514
  return code;
644
515
  }, [params, eventCodeParam]);
645
- const error = useMemo4(() => {
516
+ const error = useMemo(() => {
646
517
  if (!eventCode) {
647
518
  return new Error(`Event code parameter '${eventCodeParam}' not found or invalid`);
648
519
  }
@@ -669,20 +540,4 @@ function extractEventCodeFromPath(path) {
669
540
  return eventCode;
670
541
  }
671
542
 
672
- export {
673
- useZodForm,
674
- useFormDialog,
675
- useOrganisationPermissions,
676
- StorageUtils,
677
- usePublicEvent,
678
- clearPublicEventCache,
679
- getPublicEventCacheStats,
680
- usePublicEventLogo,
681
- clearPublicLogoCache,
682
- getPublicLogoCacheStats,
683
- usePublicRouteParams,
684
- usePublicEventCode,
685
- generatePublicRoutePath,
686
- extractEventCodeFromPath
687
- };
688
- //# sourceMappingURL=chunk-RGAWHO7N.js.map
543
+ export { StorageUtils, clearPublicEventCache, clearPublicLogoCache, extractEventCodeFromPath, generatePublicRoutePath, getPublicEventCacheStats, getPublicLogoCacheStats, useFormDialog, useOrganisationPermissions, usePublicEvent, usePublicEventCode, usePublicEventLogo, usePublicRouteParams, useZodForm };
@@ -0,0 +1,64 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/utils/validation/schema.ts
4
+ function pickSchema(schema, keys) {
5
+ const shape = Object.entries(schema.shape).filter(([key]) => keys.includes(key)).reduce((acc, [key, value]) => {
6
+ acc[key] = value;
7
+ return acc;
8
+ }, {});
9
+ return z.object(shape);
10
+ }
11
+ function combineSchemas(schemas) {
12
+ return schemas.reduce(
13
+ (merged, schema) => merged.merge(schema),
14
+ z.object({})
15
+ );
16
+ }
17
+ var emailSchema = z.string().email("Please enter a valid email address");
18
+ var nameSchema = z.string().min(1, "Name is required").max(100, "Name must be less than 100 characters");
19
+ var phoneSchema = z.string().regex(/^\+?[\d\s\-\(\)]+$/, "Please enter a valid phone number");
20
+ var urlSchema = z.string().url("Please enter a valid URL");
21
+ var dateSchema = z.string().refine((date) => !isNaN(Date.parse(date)), "Please enter a valid date");
22
+ var passwordSchema = z.string().min(8, "Password must be at least 8 characters").regex(/[A-Z]/, "Password must contain at least one uppercase letter").regex(/[a-z]/, "Password must contain at least one lowercase letter").regex(/[0-9]/, "Password must contain at least one number");
23
+ var securePasswordSchema = passwordSchema.regex(/[!@#$%^&*(),.?":{}|<>]/, "Password must contain at least one special character");
24
+ var loginSchema = z.object({
25
+ email: emailSchema,
26
+ password: z.string().min(1, "Password is required")
27
+ });
28
+ var registrationSchema = z.object({
29
+ email: emailSchema,
30
+ password: passwordSchema,
31
+ confirmPassword: z.string()
32
+ }).refine((data) => data.password === data.confirmPassword, {
33
+ message: "Passwords don't match",
34
+ path: ["confirmPassword"]
35
+ });
36
+ var secureLoginSchema = z.object({
37
+ email: emailSchema,
38
+ password: securePasswordSchema
39
+ });
40
+ var passwordResetSchema = z.object({
41
+ email: emailSchema
42
+ });
43
+ var changePasswordSchema = z.object({
44
+ currentPassword: z.string().min(1, "Current password is required"),
45
+ newPassword: securePasswordSchema,
46
+ confirmPassword: z.string()
47
+ }).refine((data) => data.newPassword === data.confirmPassword, {
48
+ message: "Passwords don't match",
49
+ path: ["confirmPassword"]
50
+ });
51
+ var userProfileSchema = z.object({
52
+ name: nameSchema,
53
+ email: emailSchema,
54
+ phone: phoneSchema.optional(),
55
+ website: urlSchema.optional(),
56
+ bio: z.string().max(500).optional()
57
+ });
58
+ var contactFormSchema = z.object({
59
+ name: nameSchema,
60
+ email: emailSchema,
61
+ message: z.string().min(1, "Message is required").max(1e3, "Message must be less than 1000 characters")
62
+ });
63
+
64
+ export { changePasswordSchema, combineSchemas, contactFormSchema, dateSchema, emailSchema, loginSchema, nameSchema, passwordResetSchema, passwordSchema, phoneSchema, pickSchema, registrationSchema, secureLoginSchema, securePasswordSchema, urlSchema, userProfileSchema };
@@ -1,9 +1,5 @@
1
- import {
2
- createLogger
3
- } from "./chunk-PWLANIRT.js";
4
- import {
5
- __require
6
- } from "./chunk-DGUM43GV.js";
1
+ import { createLogger } from './chunk-TTRFSOKR.js';
2
+ import { __require } from './chunk-3RG5ZIWI.js';
7
3
 
8
4
  // src/utils/app/appNameResolver.ts
9
5
  var log = createLogger("AppNameResolver");
@@ -106,13 +102,4 @@ function getCurrentAppNameWithFallback(fallback = "default-app") {
106
102
  return getCurrentAppName() || fallback;
107
103
  }
108
104
 
109
- export {
110
- getAppNameFromPackageJson,
111
- getAppNameFromBuildTime,
112
- getAppNameFromGlobal,
113
- getAppNameFromEnvironment,
114
- getCurrentAppName,
115
- setRBACAppName,
116
- getCurrentAppNameWithFallback
117
- };
118
- //# sourceMappingURL=chunk-M7MPQISP.js.map
105
+ export { getAppNameFromBuildTime, getAppNameFromEnvironment, getAppNameFromGlobal, getAppNameFromPackageJson, getCurrentAppName, getCurrentAppNameWithFallback, setRBACAppName };