@jmruthers/pace-core 0.6.4 → 0.6.6

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 (387) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/core-usage-manifest.json +93 -0
  4. package/cursor-rules/00-pace-core-compliance.mdc +128 -26
  5. package/cursor-rules/01-standards-compliance.mdc +49 -8
  6. package/cursor-rules/02-project-structure.mdc +6 -0
  7. package/cursor-rules/03-solid-principles.mdc +2 -0
  8. package/cursor-rules/04-testing-standards.mdc +2 -0
  9. package/cursor-rules/05-bug-reports-and-features.mdc +2 -0
  10. package/cursor-rules/06-code-quality.mdc +2 -0
  11. package/cursor-rules/07-tech-stack-compliance.mdc +2 -0
  12. package/cursor-rules/08-markup-quality.mdc +52 -27
  13. package/cursor-rules/09-rbac-compliance.mdc +462 -0
  14. package/cursor-rules/10-error-handling-patterns.mdc +179 -0
  15. package/cursor-rules/11-performance-optimization.mdc +169 -0
  16. package/cursor-rules/12-ci-cd-integration.mdc +150 -0
  17. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  18. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-2N_tqbfq.d.ts} +1 -1
  19. package/dist/DataTable-LRJL4IRV.js +15 -0
  20. package/dist/{PublicPageProvider-DEMpysFR.d.ts → PublicPageProvider-BBH6Vqg7.d.ts} +72 -139
  21. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  22. package/dist/api-Y4MQWOFW.js +4 -0
  23. package/dist/audit-MYQXYZFU.js +3 -0
  24. package/dist/{chunk-J36DSWQK.js → chunk-2HGJFNAH.js} +8 -28
  25. package/dist/{chunk-OEWDTMG7.js → chunk-3O3WHILE.js} +38 -121
  26. package/dist/{chunk-M43Y4SSO.js → chunk-3QC3KRHK.js} +1 -14
  27. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  28. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  29. package/dist/chunk-4T7OBVTU.js +62 -0
  30. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  31. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  32. package/dist/{chunk-NN6WWZ5U.js → chunk-7TYHROIV.js} +579 -563
  33. package/dist/{chunk-M7MPQISP.js → chunk-A55DK444.js} +9 -16
  34. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  35. package/dist/{chunk-L4OXEN46.js → chunk-BVP2BCJF.js} +2 -16
  36. package/dist/chunk-C7NSAPTL.js +1 -0
  37. package/dist/{chunk-YKRAFF5K.js → chunk-FENMYN2U.js} +73 -149
  38. package/dist/{chunk-AVMLPIM7.js → chunk-FTCRZOG2.js} +284 -432
  39. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  40. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  41. package/dist/{chunk-I6DAQMWX.js → chunk-LAZMKTTF.js} +930 -891
  42. package/dist/{chunk-5EC5MEWX.js → chunk-MAGBIDNS.js} +77 -222
  43. package/dist/chunk-MBADTM7L.js +64 -0
  44. package/dist/chunk-OHIK3MIO.js +994 -0
  45. package/dist/{chunk-6SOIHG6Z.js → chunk-S7DKJPLT.js} +115 -44
  46. package/dist/{chunk-FMUCXFII.js → chunk-SD6WQY43.js} +1 -5
  47. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  48. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  49. package/dist/{chunk-FFQEQTNW.js → chunk-UIYSCEV7.js} +134 -45
  50. package/dist/{chunk-3LPHPB62.js → chunk-ZFYPMX46.js} +271 -87
  51. package/dist/{chunk-7JPAB3T5.js → chunk-ZS5VO5JB.js} +1989 -1283
  52. package/dist/components.d.ts +6 -6
  53. package/dist/components.js +57 -267
  54. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  55. package/dist/eslint-rules/index.cjs +22 -0
  56. package/dist/eslint-rules/rules/compliance.cjs +348 -0
  57. package/dist/eslint-rules/rules/components.cjs +113 -0
  58. package/dist/eslint-rules/rules/imports.cjs +102 -0
  59. package/dist/eslint-rules/rules/rbac.cjs +790 -0
  60. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  61. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  62. package/dist/hooks.d.ts +5 -5
  63. package/dist/hooks.js +62 -270
  64. package/dist/icons/index.d.ts +1 -0
  65. package/dist/icons/index.js +1 -0
  66. package/dist/index.d.ts +36 -26
  67. package/dist/index.js +87 -690
  68. package/dist/providers.d.ts +2 -2
  69. package/dist/providers.js +8 -35
  70. package/dist/rbac/eslint-rules.d.ts +46 -44
  71. package/dist/rbac/eslint-rules.js +7 -4
  72. package/dist/rbac/index.d.ts +124 -594
  73. package/dist/rbac/index.js +14 -207
  74. package/dist/styles/index.js +2 -12
  75. package/dist/theming/runtime.js +3 -19
  76. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  77. package/dist/{types-CkbwOr4Y.d.ts → types-B-K_5VnO.d.ts} +4 -0
  78. package/dist/types-t9H8qKRw.d.ts +55 -0
  79. package/dist/types.d.ts +1 -1
  80. package/dist/types.js +7 -94
  81. package/dist/{usePublicRouteParams-i3qtoBgg.d.ts → usePublicRouteParams-COZ28Mvq.d.ts} +9 -9
  82. package/dist/utils.d.ts +24 -117
  83. package/dist/utils.js +54 -392
  84. package/docs/README.md +16 -6
  85. package/docs/api/README.md +4 -402
  86. package/docs/api/modules.md +454 -930
  87. package/docs/api-reference/components.md +3 -1
  88. package/docs/api-reference/deprecated.md +31 -6
  89. package/docs/api-reference/rpc-functions.md +78 -3
  90. package/docs/best-practices/accessibility.md +6 -3
  91. package/docs/getting-started/cursor-rules.md +3 -23
  92. package/docs/getting-started/dependencies.md +650 -0
  93. package/docs/getting-started/installation-guide.md +20 -7
  94. package/docs/getting-started/quick-start.md +23 -12
  95. package/docs/implementation-guides/permission-enforcement.md +4 -0
  96. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  97. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  98. package/docs/rbac/README.md +12 -3
  99. package/docs/rbac/edge-functions-guide.md +376 -0
  100. package/docs/rbac/secure-client-protection.md +0 -34
  101. package/docs/standards/00-pace-core-compliance.md +967 -0
  102. package/docs/standards/01-standards-compliance.md +188 -0
  103. package/docs/standards/02-project-structure.md +985 -0
  104. package/docs/standards/03-solid-principles.md +39 -0
  105. package/docs/standards/04-testing-standards.md +36 -0
  106. package/docs/standards/05-bug-reports-and-features.md +27 -0
  107. package/docs/standards/{04-code-style-standard.md → 06-code-quality.md} +2 -0
  108. package/docs/standards/07-tech-stack-compliance.md +30 -0
  109. package/docs/standards/08-markup-quality.md +345 -0
  110. package/docs/standards/{07-rbac-and-rls-standard.md → 09-rbac-compliance.md} +149 -54
  111. package/docs/standards/10-error-handling-patterns.md +401 -0
  112. package/docs/standards/11-performance-optimization.md +348 -0
  113. package/docs/standards/12-ci-cd-integration.md +370 -0
  114. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +192 -0
  115. package/docs/standards/README.md +62 -33
  116. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  117. package/eslint-config-pace-core.cjs +20 -4
  118. package/package.json +31 -21
  119. package/scripts/audit/audit-compliance.cjs +1295 -0
  120. package/scripts/audit/audit-components.cjs +260 -0
  121. package/scripts/audit/audit-dependencies.cjs +395 -0
  122. package/scripts/audit/audit-rbac.cjs +954 -0
  123. package/scripts/audit/audit-standards.cjs +1268 -0
  124. package/scripts/audit/index.cjs +1898 -194
  125. package/scripts/install-cursor-rules.cjs +259 -8
  126. package/scripts/validate-master.js +1 -1
  127. package/src/__tests__/fixtures/supabase.ts +1 -1
  128. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +1 -1
  129. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  130. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  131. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +3 -3
  132. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  133. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  134. package/src/__tests__/public-recipe-view.test.ts +38 -9
  135. package/src/components/Button/Button.tsx +5 -1
  136. package/src/components/ContextSelector/ContextSelector.tsx +42 -39
  137. package/src/components/DataTable/__tests__/keyboard.test.tsx +15 -2
  138. package/src/components/DataTable/components/DataTableBody.tsx +55 -31
  139. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  140. package/src/components/DataTable/components/DataTableLayout.tsx +30 -5
  141. package/src/components/DataTable/components/EditFields.tsx +23 -3
  142. package/src/components/DataTable/components/EditableRow.tsx +7 -2
  143. package/src/components/DataTable/components/ImportModal.tsx +4 -6
  144. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  145. package/src/components/DataTable/components/ViewRowModal.tsx +4 -4
  146. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +455 -96
  147. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +122 -58
  148. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  149. package/src/components/DataTable/core/DataTableContext.tsx +1 -1
  150. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  151. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  152. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  153. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  154. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  155. package/src/components/DataTable/types.ts +5 -0
  156. package/src/components/DateTimeField/DateTimeField.tsx +20 -20
  157. package/src/components/DateTimeField/README.md +5 -2
  158. package/src/components/Dialog/Dialog.test.tsx +361 -318
  159. package/src/components/Dialog/Dialog.tsx +1154 -323
  160. package/src/components/Dialog/index.ts +3 -3
  161. package/src/components/FileDisplay/FileDisplay.test.tsx +45 -2
  162. package/src/components/FileDisplay/FileDisplay.tsx +28 -22
  163. package/src/components/Form/Form.test.tsx +9 -10
  164. package/src/components/Form/Form.tsx +369 -9
  165. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +28 -28
  166. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +40 -54
  167. package/src/components/LoginForm/LoginForm.tsx +2 -2
  168. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  169. package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
  170. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  171. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  172. package/src/components/PaceAppLayout/PaceAppLayout.tsx +30 -41
  173. package/src/components/PaceAppLayout/README.md +10 -9
  174. package/src/components/PaceAppLayout/test-setup.tsx +40 -31
  175. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  176. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  177. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +61 -0
  178. package/src/components/PasswordChange/PasswordChangeForm.tsx +20 -13
  179. package/src/components/PublicLayout/PublicLayout.test.tsx +7 -3
  180. package/src/components/PublicLayout/PublicPageLayout.tsx +5 -8
  181. package/src/components/Select/Select.tsx +23 -21
  182. package/src/components/Select/types.ts +1 -1
  183. package/src/components/UserMenu/UserMenu.test.tsx +38 -6
  184. package/src/components/UserMenu/UserMenu.tsx +39 -34
  185. package/src/components/index.ts +3 -4
  186. package/src/eslint-rules/index.cjs +22 -0
  187. package/src/eslint-rules/rules/compliance.cjs +348 -0
  188. package/src/eslint-rules/rules/components.cjs +113 -0
  189. package/src/eslint-rules/rules/imports.cjs +102 -0
  190. package/src/eslint-rules/rules/rbac.cjs +790 -0
  191. package/src/eslint-rules/utils/helpers.cjs +42 -0
  192. package/src/eslint-rules/utils/manifest-loader.cjs +75 -0
  193. package/src/hooks/__tests__/hooks.integration.test.tsx +6 -8
  194. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  195. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  196. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  197. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  198. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  199. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  200. package/src/hooks/public/usePublicEvent.ts +62 -190
  201. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  202. package/src/hooks/public/usePublicEventLogo.ts +19 -9
  203. package/src/hooks/useAppConfig.ts +26 -24
  204. package/src/hooks/useEventTheme.test.ts +211 -233
  205. package/src/hooks/useEventTheme.ts +19 -28
  206. package/src/hooks/useEvents.ts +11 -7
  207. package/src/hooks/useKeyboardShortcuts.ts +1 -1
  208. package/src/hooks/useOrganisationPermissions.ts +9 -11
  209. package/src/hooks/useOrganisations.ts +13 -7
  210. package/src/hooks/useQueryCache.ts +0 -1
  211. package/src/hooks/useSessionDraft.ts +380 -0
  212. package/src/hooks/useSessionRestoration.ts +3 -1
  213. package/src/icons/index.ts +27 -0
  214. package/src/index.ts +16 -1
  215. package/src/providers/OrganisationProvider.tsx +23 -14
  216. package/src/providers/services/EventServiceProvider.tsx +1 -24
  217. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  218. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -0
  219. package/src/rbac/README.md +20 -20
  220. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  221. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  222. package/src/rbac/adapters.tsx +7 -295
  223. package/src/rbac/api.test.ts +44 -56
  224. package/src/rbac/api.ts +10 -17
  225. package/src/rbac/cache-invalidation.ts +0 -1
  226. package/src/rbac/compliance/index.ts +10 -0
  227. package/src/rbac/compliance/pattern-detector.ts +553 -0
  228. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  229. package/src/rbac/components/AccessDenied.tsx +150 -0
  230. package/src/rbac/components/NavigationGuard.tsx +12 -20
  231. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  232. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  233. package/src/rbac/components/index.ts +3 -41
  234. package/src/rbac/eslint-rules.js +1 -1
  235. package/src/rbac/hooks/index.ts +0 -3
  236. package/src/rbac/hooks/permissions/index.ts +0 -3
  237. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  238. package/src/rbac/hooks/usePermissions.ts +0 -3
  239. package/src/rbac/hooks/useRBAC.test.ts +21 -3
  240. package/src/rbac/hooks/useRBAC.ts +4 -3
  241. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  242. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  243. package/src/rbac/hooks/useResourcePermissions.test.ts +241 -60
  244. package/src/rbac/hooks/useResourcePermissions.ts +182 -63
  245. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  246. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  247. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  248. package/src/rbac/index.ts +7 -9
  249. package/src/rbac/permissions.ts +17 -17
  250. package/src/rbac/utils/contextValidator.ts +45 -7
  251. package/src/services/AuthService.ts +132 -23
  252. package/src/services/EventService.ts +4 -97
  253. package/src/services/InactivityService.ts +155 -58
  254. package/src/services/OrganisationService.ts +7 -44
  255. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  256. package/src/services/base/BaseService.ts +0 -3
  257. package/src/styles/core.css +4 -0
  258. package/src/types/database.generated.ts +4733 -3809
  259. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  260. package/src/utils/context/organisationContext.test.ts +13 -28
  261. package/src/utils/context/organisationContext.ts +21 -52
  262. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  263. package/src/utils/file-reference/index.ts +39 -15
  264. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  265. package/src/utils/formatting/formatTime.test.ts +3 -2
  266. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  267. package/src/utils/index.ts +4 -1
  268. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  269. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  270. package/src/utils/persistence/keyDerivation.ts +304 -0
  271. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  272. package/src/utils/security/secureStorage.ts +5 -5
  273. package/src/utils/storage/helpers.ts +3 -3
  274. package/src/utils/supabase/createBaseClient.ts +147 -0
  275. package/src/utils/timezone/timezone.test.ts +1 -2
  276. package/src/utils/timezone/timezone.ts +1 -1
  277. package/src/utils/validation/csrf.ts +4 -4
  278. package/cursor-rules/CHANGELOG.md +0 -119
  279. package/cursor-rules/README.md +0 -192
  280. package/dist/DataTable-E7YQZD7D.js +0 -175
  281. package/dist/DataTable-E7YQZD7D.js.map +0 -1
  282. package/dist/UnifiedAuthProvider-QPXO24B4.js +0 -18
  283. package/dist/UnifiedAuthProvider-QPXO24B4.js.map +0 -1
  284. package/dist/api-6LVZTHDS.js +0 -52
  285. package/dist/api-6LVZTHDS.js.map +0 -1
  286. package/dist/audit-V53FV5AG.js +0 -17
  287. package/dist/audit-V53FV5AG.js.map +0 -1
  288. package/dist/chunk-36LVWXB2.js +0 -227
  289. package/dist/chunk-36LVWXB2.js.map +0 -1
  290. package/dist/chunk-3LPHPB62.js.map +0 -1
  291. package/dist/chunk-5DRSZLL2.js.map +0 -1
  292. package/dist/chunk-5EC5MEWX.js.map +0 -1
  293. package/dist/chunk-63FOKYGO.js.map +0 -1
  294. package/dist/chunk-6SOIHG6Z.js.map +0 -1
  295. package/dist/chunk-7JPAB3T5.js.map +0 -1
  296. package/dist/chunk-ATKZM7RX.js +0 -2053
  297. package/dist/chunk-ATKZM7RX.js.map +0 -1
  298. package/dist/chunk-AVMLPIM7.js.map +0 -1
  299. package/dist/chunk-DGUM43GV.js.map +0 -1
  300. package/dist/chunk-E66EQZE6.js.map +0 -1
  301. package/dist/chunk-FFQEQTNW.js.map +0 -1
  302. package/dist/chunk-FMUCXFII.js.map +0 -1
  303. package/dist/chunk-G37KK66H.js.map +0 -1
  304. package/dist/chunk-I6DAQMWX.js.map +0 -1
  305. package/dist/chunk-J36DSWQK.js.map +0 -1
  306. package/dist/chunk-KQCRWDSA.js +0 -1
  307. package/dist/chunk-KQCRWDSA.js.map +0 -1
  308. package/dist/chunk-L4OXEN46.js.map +0 -1
  309. package/dist/chunk-LMC26NLJ.js +0 -84
  310. package/dist/chunk-LMC26NLJ.js.map +0 -1
  311. package/dist/chunk-M43Y4SSO.js.map +0 -1
  312. package/dist/chunk-M7MPQISP.js.map +0 -1
  313. package/dist/chunk-NN6WWZ5U.js.map +0 -1
  314. package/dist/chunk-OEWDTMG7.js.map +0 -1
  315. package/dist/chunk-PWLANIRT.js.map +0 -1
  316. package/dist/chunk-QXHPKYJV.js.map +0 -1
  317. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  318. package/dist/chunk-YKRAFF5K.js.map +0 -1
  319. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  320. package/dist/components.js.map +0 -1
  321. package/dist/contextValidator-OOPCLPZW.js +0 -9
  322. package/dist/contextValidator-OOPCLPZW.js.map +0 -1
  323. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  324. package/dist/hooks.js.map +0 -1
  325. package/dist/index.js.map +0 -1
  326. package/dist/providers.js.map +0 -1
  327. package/dist/rbac/eslint-rules.js.map +0 -1
  328. package/dist/rbac/index.js.map +0 -1
  329. package/dist/styles/index.js.map +0 -1
  330. package/dist/theming/runtime.js.map +0 -1
  331. package/dist/types.js.map +0 -1
  332. package/dist/utils.js.map +0 -1
  333. package/docs/standards/01-architecture-standard.md +0 -44
  334. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  335. package/docs/standards/03-component-standard.md +0 -32
  336. package/docs/standards/05-security-standard.md +0 -44
  337. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  338. package/docs/standards/pace-core-compliance.md +0 -432
  339. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  340. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  341. package/scripts/audit/core/checks/bundle.cjs +0 -142
  342. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  343. package/scripts/audit/core/checks/config.cjs +0 -54
  344. package/scripts/audit/core/checks/coverage.cjs +0 -84
  345. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  346. package/scripts/audit/core/checks/documentation.cjs +0 -268
  347. package/scripts/audit/core/checks/environment.cjs +0 -116
  348. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  349. package/scripts/audit/core/checks/forms.cjs +0 -172
  350. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  351. package/scripts/audit/core/checks/hooks.cjs +0 -334
  352. package/scripts/audit/core/checks/imports.cjs +0 -244
  353. package/scripts/audit/core/checks/performance.cjs +0 -325
  354. package/scripts/audit/core/checks/routes.cjs +0 -117
  355. package/scripts/audit/core/checks/state.cjs +0 -130
  356. package/scripts/audit/core/checks/structure.cjs +0 -65
  357. package/scripts/audit/core/checks/style.cjs +0 -584
  358. package/scripts/audit/core/checks/testing.cjs +0 -122
  359. package/scripts/audit/core/checks/typescript.cjs +0 -61
  360. package/scripts/audit/core/scanner.cjs +0 -199
  361. package/scripts/audit/core/utils.cjs +0 -137
  362. package/scripts/audit/reporters/console.cjs +0 -151
  363. package/scripts/audit/reporters/json.cjs +0 -54
  364. package/scripts/audit/reporters/markdown.cjs +0 -124
  365. package/scripts/audit-consuming-app.cjs +0 -86
  366. package/src/eslint-rules/pace-core-compliance.cjs +0 -510
  367. package/src/eslint-rules/pace-core-compliance.js +0 -638
  368. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  369. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  370. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  371. package/src/rbac/components/NavigationProvider.tsx +0 -345
  372. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  373. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  374. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  375. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  376. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  377. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  378. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  379. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  380. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  381. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  382. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  383. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  384. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  385. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  386. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  387. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Shared helper functions for ESLint rules
3
+ * @package @jmruthers/pace-core
4
+ * @module ESLintRules/utils/helpers
5
+ */
6
+
7
+ // Helper function to get pace-core alternative for restricted imports
8
+ function getPaceCoreAlternative(importSource) {
9
+ const alternatives = {
10
+ '@radix-ui/react-avatar': '/components',
11
+ '@radix-ui/react-checkbox': '/components',
12
+ '@radix-ui/react-dialog': '/components',
13
+ '@radix-ui/react-label': '/components',
14
+ '@radix-ui/react-switch': '/components',
15
+ '@radix-ui/react-tabs': '/components',
16
+ '@radix-ui/react-toast': '/components',
17
+ '@radix-ui/react-tooltip': '/components',
18
+ 'react-day-picker': '/components',
19
+ '@tanstack/react-table': '/components',
20
+ 'react-hook-form': '/components',
21
+ 'zod': '/utils',
22
+ 'lucide-react': '/icons'
23
+ };
24
+
25
+ return alternatives[importSource] || '';
26
+ }
27
+
28
+ /**
29
+ * Check if a file is in the pace-core source directory
30
+ * @param {string} filename - The file path to check
31
+ * @returns {boolean} - True if the file is in packages/core/src
32
+ */
33
+ function isPaceCoreSourceFile(filename) {
34
+ // Check for both Unix and Windows path separators
35
+ return filename.includes('packages/core/src') || filename.includes('packages\\core\\src');
36
+ }
37
+
38
+ module.exports = {
39
+ getPaceCoreAlternative,
40
+ isPaceCoreSourceFile,
41
+ };
42
+
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Shared utility for loading core-usage-manifest.json
3
+ * @package @jmruthers/pace-core
4
+ * @module ESLintRules/utils/manifest-loader
5
+ */
6
+
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+
10
+ // Load manifest data
11
+ let manifestData = null;
12
+ try {
13
+ const manifestPath = path.join(__dirname, '../../../core-usage-manifest.json');
14
+ if (fs.existsSync(manifestPath)) {
15
+ manifestData = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
16
+ }
17
+ } catch (error) {
18
+ // If manifest can't be loaded, rules will use hardcoded defaults
19
+ console.warn('Warning: Could not load core-usage-manifest.json, using defaults');
20
+ }
21
+
22
+ // Get restricted imports from manifest or use defaults
23
+ const getRestrictedImports = () => {
24
+ if (manifestData && manifestData.restrictedImports) {
25
+ return manifestData.restrictedImports;
26
+ }
27
+ // Fallback defaults
28
+ return [
29
+ { module: '@radix-ui/react-avatar', reason: 'Use Avatar component from pace-core instead' },
30
+ { module: '@radix-ui/react-checkbox', reason: 'Use Checkbox component from pace-core instead' },
31
+ { module: '@radix-ui/react-dialog', reason: 'Use Dialog component from pace-core instead' },
32
+ { module: '@radix-ui/react-label', reason: 'Use Label component from pace-core instead' },
33
+ { module: '@radix-ui/react-slot', reason: 'Use Button component from pace-core which handles slot composition' },
34
+ { module: '@radix-ui/react-switch', reason: 'Use Switch component from pace-core instead' },
35
+ { module: '@radix-ui/react-tabs', reason: 'Use Tabs component from pace-core instead' },
36
+ { module: '@radix-ui/react-toast', reason: 'Use Toast component and useToast hook from pace-core instead' },
37
+ { module: '@radix-ui/react-tooltip', reason: 'Use Tooltip component from pace-core instead' },
38
+ { module: 'react-day-picker', reason: 'Use Calendar component from pace-core instead' },
39
+ { module: '@tanstack/react-table', reason: 'Use DataTable component and related hooks from pace-core instead. DataTable wraps and standardizes table functionality' },
40
+ { module: 'react-hook-form', reason: 'Use Form component and useZodForm hook from pace-core instead' },
41
+ { module: 'zod', reason: 'Use validation utilities and schemas from pace-core instead. pace-core provides standardized validation helpers' }
42
+ ];
43
+ };
44
+
45
+ // Get pace-core components from manifest or use defaults
46
+ const getPaceCoreComponents = () => {
47
+ if (manifestData && manifestData.components) {
48
+ return manifestData.components;
49
+ }
50
+ return ['Button', 'Card', 'Dialog', 'Input', 'Form', 'Select', 'Alert', 'Badge', 'Checkbox', 'Switch', 'Textarea', 'Label', 'Table', 'DataTable', 'Toast', 'Tooltip', 'Tabs', 'Calendar', 'Avatar', 'Progress'];
51
+ };
52
+
53
+ // Get pace-core hooks from manifest or use defaults
54
+ const getPaceCoreHooks = () => {
55
+ if (manifestData && manifestData.hooks) {
56
+ return manifestData.hooks;
57
+ }
58
+ return ['useToast', 'useDebounce', 'useUnifiedAuth', 'useEvents', 'useOrganisations', 'useFileReference', 'useStorage', 'useZodForm', 'useRBAC', 'usePermissions'];
59
+ };
60
+
61
+ // Get pace-core utils from manifest or use defaults
62
+ const getPaceCoreUtils = () => {
63
+ if (manifestData && manifestData.utils) {
64
+ return manifestData.utils;
65
+ }
66
+ return ['formatDate', 'formatCurrency', 'formatNumber', 'formatTime', 'formatDateTime', 'cn', 'validateUserInput', 'sanitizeUserInput', 'hasPermission', 'getAppConfig'];
67
+ };
68
+
69
+ module.exports = {
70
+ getRestrictedImports,
71
+ getPaceCoreComponents,
72
+ getPaceCoreHooks,
73
+ getPaceCoreUtils,
74
+ };
75
+
package/dist/hooks.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  export { u as useToast } from './useToast-AyaT-x7p.js';
2
- import { S as StorageUploadOptions, a as StorageUploadResult, b as StorageListOptions, c as StorageListResult, d as StorageFileInfo } from './usePublicRouteParams-i3qtoBgg.js';
3
- export { O as OrganisationSecurityHook, l as UseAppConfigReturn, i as UseFormDialogOptions, j as UseFormDialogReturn, U as UseOrganisationPermissionsReturn, F as UsePublicEventLogoOptions, E as UsePublicEventLogoReturn, B as UsePublicEventOptions, A as UsePublicEventReturn, D as UsePublicFileDisplayOptions, C as UsePublicFileDisplayReturn, G as UsePublicRouteParamsReturn, n as clearPublicEventCache, q as clearPublicFileDisplayCache, t as clearPublicLogoCache, z as extractEventCodeFromPath, y as generatePublicRoutePath, o as getPublicEventCacheStats, r as getPublicFileDisplayCacheStats, v as getPublicLogoCacheStats, k as useAppConfig, u as useEventTheme, h as useFormDialog, e as useOrganisationPermissions, f as useOrganisationSecurity, m as usePublicEvent, x as usePublicEventCode, s as usePublicEventLogo, p as usePublicFileDisplay, w as usePublicRouteParams, g as useZodForm } from './usePublicRouteParams-i3qtoBgg.js';
2
+ import { S as StorageUploadOptions, a as StorageUploadResult, b as StorageListOptions, c as StorageListResult, d as StorageFileInfo } from './usePublicRouteParams-COZ28Mvq.js';
3
+ export { O as OrganisationSecurityHook, l as UseAppConfigReturn, i as UseFormDialogOptions, j as UseFormDialogReturn, U as UseOrganisationPermissionsReturn, F as UsePublicEventLogoOptions, E as UsePublicEventLogoReturn, B as UsePublicEventOptions, A as UsePublicEventReturn, D as UsePublicFileDisplayOptions, C as UsePublicFileDisplayReturn, G as UsePublicRouteParamsReturn, n as clearPublicEventCache, q as clearPublicFileDisplayCache, t as clearPublicLogoCache, z as extractEventCodeFromPath, y as generatePublicRoutePath, o as getPublicEventCacheStats, r as getPublicFileDisplayCacheStats, v as getPublicLogoCacheStats, k as useAppConfig, u as useEventTheme, h as useFormDialog, e as useOrganisationPermissions, f as useOrganisationSecurity, m as usePublicEvent, x as usePublicEventCode, s as usePublicEventLogo, p as usePublicFileDisplay, w as usePublicRouteParams, g as useZodForm } from './usePublicRouteParams-COZ28Mvq.js';
4
4
  import * as React$1 from 'react';
5
5
  import { SortingState, ColumnFiltersState, ExpandedState } from '@tanstack/react-table';
6
- import { d as DataRecord, g as PerformanceConfig, S as ServerSideConfig, C as ChunkingConfig, i as SearchIndexConfig, h as PaginationMode, k as ServerSideParams, l as ServerSideResponse, A as AutocompleteOptions, m as GooglePlaceAutocompletePrediction, P as ParsedAddress } from './types-CkbwOr4Y.js';
6
+ import { d as DataRecord, g as PerformanceConfig, S as ServerSideConfig, C as ChunkingConfig, i as SearchIndexConfig, h as PaginationMode, k as ServerSideParams, l as ServerSideResponse, A as AutocompleteOptions, m as GooglePlaceAutocompletePrediction, P as ParsedAddress } from './types-B-K_5VnO.js';
7
7
  export { u as useComponentPerformance } from './useComponentPerformance-DE9l5RkL.js';
8
8
  import { SupabaseClient } from '@supabase/supabase-js';
9
- import { D as Database } from './database.generated-CzIvgcPu.js';
9
+ import { D as Database } from './database.generated-CcnC_DRc.js';
10
10
  import { F as FileCategory, a as FileReference } from './file-reference-BavO2eQj.js';
11
11
  import 'react-hook-form';
12
12
  import 'zod';
@@ -198,7 +198,7 @@ interface KeyboardShortcutsOptions {
198
198
  *
199
199
  * useKeyboardShortcuts(shortcuts);
200
200
  *
201
- * return <div>Content</div>;
201
+ * return <main>Content</main>;
202
202
  * }
203
203
  * ```
204
204
  */
package/dist/hooks.js CHANGED
@@ -1,72 +1,23 @@
1
- import {
2
- clearPublicEventCache,
3
- clearPublicLogoCache,
4
- extractEventCodeFromPath,
5
- generatePublicRoutePath,
6
- getPublicEventCacheStats,
7
- getPublicLogoCacheStats,
8
- useFormDialog,
9
- useOrganisationPermissions,
10
- usePublicEvent,
11
- usePublicEventCode,
12
- usePublicEventLogo,
13
- usePublicRouteParams,
14
- useZodForm
15
- } from "./chunk-5EC5MEWX.js";
16
- import {
17
- archiveFile,
18
- cleanupQueryCache,
19
- clearFileDisplayCache,
20
- clearPublicFileDisplayCache,
21
- deleteFile,
22
- getFileDisplayCacheStats,
23
- getPublicFileDisplayCacheStats,
24
- getPublicUrl,
25
- getSignedUrl,
26
- invalidateFileDisplayCache,
27
- listFiles,
28
- queryCacheHelpers,
29
- uploadFile,
30
- useAddressAutocomplete,
31
- useDebounce,
32
- useEventTheme,
33
- useFileDisplay,
34
- usePreventTabReload,
35
- usePublicFileDisplay,
36
- useQueryCache
37
- } from "./chunk-YKRAFF5K.js";
38
- import {
39
- useDataTablePerformance,
40
- useToast
41
- } from "./chunk-6SOIHG6Z.js";
42
- import {
43
- useAppConfig,
44
- useOrganisationSecurity
45
- } from "./chunk-OEWDTMG7.js";
46
- import "./chunk-KQCRWDSA.js";
47
- import "./chunk-AVMLPIM7.js";
48
- import "./chunk-3LPHPB62.js";
49
- import "./chunk-63FOKYGO.js";
50
- import "./chunk-36LVWXB2.js";
51
- import "./chunk-ZSAAAMVR.js";
52
- import "./chunk-QXHPKYJV.js";
53
- import {
54
- useComponentPerformance
55
- } from "./chunk-E66EQZE6.js";
56
- import "./chunk-G37KK66H.js";
57
- import {
58
- PERFORMANCE_BUDGETS,
59
- performanceBudgetMonitor
60
- } from "./chunk-FMUCXFII.js";
61
- import "./chunk-VBXEHIUJ.js";
62
- import "./chunk-L4OXEN46.js";
63
- import {
64
- createLogger
65
- } from "./chunk-PWLANIRT.js";
66
- import "./chunk-DGUM43GV.js";
1
+ export { clearPublicEventCache, clearPublicLogoCache, extractEventCodeFromPath, generatePublicRoutePath, getPublicEventCacheStats, getPublicLogoCacheStats, useFormDialog, useOrganisationPermissions, usePublicEvent, usePublicEventCode, usePublicEventLogo, usePublicRouteParams, useZodForm } from './chunk-MAGBIDNS.js';
2
+ import { getPublicUrl, getSignedUrl, uploadFile, deleteFile, archiveFile, listFiles } from './chunk-FENMYN2U.js';
3
+ export { cleanupQueryCache, clearFileDisplayCache, clearPublicFileDisplayCache, getFileDisplayCacheStats, getPublicFileDisplayCacheStats, invalidateFileDisplayCache, queryCacheHelpers, useAddressAutocomplete, useDebounce, useEventTheme, useFileDisplay, usePreventTabReload, usePublicFileDisplay, useQueryCache } from './chunk-FENMYN2U.js';
4
+ import './chunk-BVP2BCJF.js';
5
+ export { useDataTablePerformance, useFocusTrap, useToast } from './chunk-S7DKJPLT.js';
6
+ export { useAppConfig, useOrganisationSecurity } from './chunk-3O3WHILE.js';
7
+ import './chunk-C7NSAPTL.js';
8
+ import './chunk-FTCRZOG2.js';
9
+ import './chunk-ZFYPMX46.js';
10
+ import './chunk-AHU7G2R5.js';
11
+ import './chunk-6QYDGKQY.js';
12
+ import './chunk-4SXLQIZO.js';
13
+ export { useComponentPerformance } from './chunk-6GLLNA6U.js';
14
+ import './chunk-FYHN4DD5.js';
15
+ import { performanceBudgetMonitor, PERFORMANCE_BUDGETS } from './chunk-SD6WQY43.js';
16
+ import './chunk-HF6O3O37.js';
17
+ import { createLogger } from './chunk-TTRFSOKR.js';
18
+ import './chunk-3RG5ZIWI.js';
19
+ import { useRef, useCallback, useEffect, useState } from 'react';
67
20
 
68
- // src/hooks/useFocusManagement.ts
69
- import { useRef, useCallback, useEffect } from "react";
70
21
  function useFocusManagement(options = {}) {
71
22
  const {
72
23
  trapFocus = false,
@@ -179,108 +130,6 @@ function useFocusManagement(options = {}) {
179
130
  handleEscape
180
131
  };
181
132
  }
182
-
183
- // src/hooks/useFocusTrap.ts
184
- import { useRef as useRef2, useEffect as useEffect2, useCallback as useCallback2 } from "react";
185
- var DEFAULT_FOCUSABLE_SELECTOR = [
186
- "button:not([disabled])",
187
- "[href]",
188
- "input:not([disabled])",
189
- "select:not([disabled])",
190
- "textarea:not([disabled])",
191
- '[tabindex]:not([tabindex="-1"])',
192
- '[contenteditable="true"]'
193
- ].join(", ");
194
- function useFocusTrap(options = {}) {
195
- const {
196
- isActive = false,
197
- autoFocus = false,
198
- restoreFocus = false,
199
- onEscape,
200
- focusableSelector = DEFAULT_FOCUSABLE_SELECTOR
201
- } = options;
202
- const containerRef = useRef2(null);
203
- const previouslyFocusedElement = useRef2(null);
204
- const getFocusableElements = useCallback2(() => {
205
- if (!containerRef.current) return [];
206
- return Array.from(
207
- containerRef.current.querySelectorAll(focusableSelector)
208
- ).filter((element) => {
209
- return (
210
- // visible check
211
- !element.hasAttribute("disabled") && !element.hasAttribute("hidden") && element.offsetParent !== null
212
- );
213
- });
214
- }, [focusableSelector]);
215
- const focusFirst = useCallback2(() => {
216
- const elements = getFocusableElements();
217
- if (elements.length > 0) {
218
- elements[0].focus();
219
- }
220
- }, [getFocusableElements]);
221
- const focusLast = useCallback2(() => {
222
- const elements = getFocusableElements();
223
- if (elements.length > 0) {
224
- elements[elements.length - 1].focus();
225
- }
226
- }, [getFocusableElements]);
227
- useEffect2(() => {
228
- if (!isActive || !containerRef.current) return;
229
- const handleKeyDown = (event) => {
230
- if (event.key === "Escape" && onEscape) {
231
- onEscape();
232
- return;
233
- }
234
- if (event.key === "Tab") {
235
- const focusableElements = getFocusableElements();
236
- if (focusableElements.length === 0) return;
237
- const firstElement = focusableElements[0];
238
- const lastElement = focusableElements[focusableElements.length - 1];
239
- if (event.shiftKey) {
240
- if (document.activeElement === firstElement) {
241
- event.preventDefault();
242
- lastElement.focus();
243
- }
244
- } else {
245
- if (document.activeElement === lastElement) {
246
- event.preventDefault();
247
- firstElement.focus();
248
- }
249
- }
250
- }
251
- };
252
- const container = containerRef.current;
253
- container.addEventListener("keydown", handleKeyDown);
254
- return () => {
255
- container.removeEventListener("keydown", handleKeyDown);
256
- };
257
- }, [isActive, onEscape, getFocusableElements]);
258
- useEffect2(() => {
259
- if (!isActive) return;
260
- if (restoreFocus) {
261
- previouslyFocusedElement.current = document.activeElement;
262
- }
263
- if (autoFocus) {
264
- const timer = setTimeout(focusFirst, 0);
265
- return () => clearTimeout(timer);
266
- }
267
- return () => {
268
- if (restoreFocus && previouslyFocusedElement.current) {
269
- previouslyFocusedElement.current.focus();
270
- previouslyFocusedElement.current = null;
271
- }
272
- };
273
- }, [isActive, autoFocus, restoreFocus, focusFirst]);
274
- return {
275
- containerRef,
276
- focusFirst,
277
- focusLast,
278
- getFocusableElements
279
- };
280
- }
281
-
282
- // src/hooks/useKeyboardShortcuts.ts
283
- import { useEffect as useEffect3, useCallback as useCallback3 } from "react";
284
133
  function parseKeyCombo(combo) {
285
134
  const parts = combo.toLowerCase().split("+");
286
135
  const key = parts.pop();
@@ -303,7 +152,7 @@ function matchesKeyCombo(event, combo) {
303
152
  }
304
153
  function useKeyboardShortcuts(shortcuts, options = {}) {
305
154
  const { element = document, enabled = true } = options;
306
- const handleKeyDown = useCallback3((event) => {
155
+ const handleKeyDown = useCallback((event) => {
307
156
  if (!enabled) return;
308
157
  for (const shortcut of shortcuts) {
309
158
  if (shortcut.enabled === false) continue;
@@ -319,19 +168,16 @@ function useKeyboardShortcuts(shortcuts, options = {}) {
319
168
  }
320
169
  }
321
170
  }, [shortcuts, enabled]);
322
- useEffect3(() => {
171
+ useEffect(() => {
323
172
  if (!enabled) return;
324
173
  element.addEventListener("keydown", handleKeyDown);
325
174
  return () => element.removeEventListener("keydown", handleKeyDown);
326
175
  }, [element, enabled, handleKeyDown]);
327
176
  }
328
-
329
- // src/hooks/useIsMobile.ts
330
- import { useState, useEffect as useEffect4 } from "react";
331
177
  var MOBILE_BREAKPOINT = 768;
332
178
  function useIsMobile() {
333
179
  const [isMobile, setIsMobile] = useState(void 0);
334
- useEffect4(() => {
180
+ useEffect(() => {
335
181
  if (typeof window === "undefined") {
336
182
  setIsMobile(false);
337
183
  return;
@@ -346,18 +192,15 @@ function useIsMobile() {
346
192
  }, []);
347
193
  return !!isMobile;
348
194
  }
349
-
350
- // src/hooks/useDataTableState.ts
351
- import { useState as useState2, useCallback as useCallback4 } from "react";
352
195
  function useDataTableState(options) {
353
196
  const { initialPageSize = 10, data } = options;
354
- const [sorting, setSorting] = useState2([]);
355
- const [columnFilters, setColumnFilters] = useState2([]);
356
- const [expanded, setExpanded] = useState2({});
357
- const [pageSize, setPageSize] = useState2(initialPageSize);
358
- const [pageIndex, setPageIndex] = useState2(0);
359
- const [selectedRows, setSelectedRows] = useState2([]);
360
- const resetState = useCallback4(() => {
197
+ const [sorting, setSorting] = useState([]);
198
+ const [columnFilters, setColumnFilters] = useState([]);
199
+ const [expanded, setExpanded] = useState({});
200
+ const [pageSize, setPageSize] = useState(initialPageSize);
201
+ const [pageIndex, setPageIndex] = useState(0);
202
+ const [selectedRows, setSelectedRows] = useState([]);
203
+ const resetState = useCallback(() => {
361
204
  setSorting([]);
362
205
  setColumnFilters([]);
363
206
  setExpanded({});
@@ -397,18 +240,15 @@ function useDataTableState(options) {
397
240
  }
398
241
  };
399
242
  }
400
-
401
- // src/hooks/usePerformanceMonitor.ts
402
- import { useEffect as useEffect5, useRef as useRef3, useCallback as useCallback5 } from "react";
403
243
  var log = createLogger("usePerformanceMonitor");
404
244
  function usePerformanceMonitor(componentName, enabled = import.meta.env.MODE === "development", budgetName = "COMPONENT_RENDER") {
405
- const renderStartTime = useRef3(0);
406
- const metrics = useRef3([]);
407
- const startMeasurement = useCallback5(() => {
245
+ const renderStartTime = useRef(0);
246
+ const metrics = useRef([]);
247
+ const startMeasurement = useCallback(() => {
408
248
  if (!enabled) return;
409
249
  renderStartTime.current = performance.now();
410
250
  }, [enabled]);
411
- const endMeasurement = useCallback5(() => {
251
+ const endMeasurement = useCallback(() => {
412
252
  if (!enabled || renderStartTime.current === 0) return;
413
253
  const renderTime = performance.now() - renderStartTime.current;
414
254
  const metric = {
@@ -431,15 +271,15 @@ function usePerformanceMonitor(componentName, enabled = import.meta.env.MODE ===
431
271
  }
432
272
  renderStartTime.current = 0;
433
273
  }, [enabled, componentName, budgetName]);
434
- const getMetrics = useCallback5(() => {
274
+ const getMetrics = useCallback(() => {
435
275
  return metrics.current.slice();
436
276
  }, []);
437
- const getAverageRenderTime = useCallback5(() => {
277
+ const getAverageRenderTime = useCallback(() => {
438
278
  if (metrics.current.length === 0) return 0;
439
279
  const total = metrics.current.reduce((sum, metric) => sum + metric.renderTime, 0);
440
280
  return total / metrics.current.length;
441
281
  }, []);
442
- const getBudgetStatus = useCallback5(() => {
282
+ const getBudgetStatus = useCallback(() => {
443
283
  const budget = PERFORMANCE_BUDGETS[budgetName];
444
284
  if (!budget) return null;
445
285
  const averageTime = getAverageRenderTime();
@@ -450,7 +290,7 @@ function usePerformanceMonitor(componentName, enabled = import.meta.env.MODE ===
450
290
  efficiency: budget.threshold > 0 ? (budget.threshold - averageTime) / budget.threshold : 0
451
291
  };
452
292
  }, [budgetName, getAverageRenderTime]);
453
- useEffect5(() => {
293
+ useEffect(() => {
454
294
  startMeasurement();
455
295
  return endMeasurement;
456
296
  });
@@ -462,9 +302,6 @@ function usePerformanceMonitor(componentName, enabled = import.meta.env.MODE ===
462
302
  endMeasurement
463
303
  };
464
304
  }
465
-
466
- // src/hooks/useFileUrlCache.ts
467
- import { useRef as useRef4, useCallback as useCallback6 } from "react";
468
305
  var globalUrlCache = /* @__PURE__ */ new Map();
469
306
  var MAX_CACHE_SIZE = 500;
470
307
  var DEFAULT_TTL_MS = 3600 * 1e3;
@@ -488,13 +325,13 @@ function cleanupCache() {
488
325
  }
489
326
  }
490
327
  function useFileUrlCache() {
491
- const cleanupIntervalRef = useRef4(null);
328
+ const cleanupIntervalRef = useRef(null);
492
329
  if (cleanupIntervalRef.current === null && typeof window !== "undefined") {
493
330
  cleanupIntervalRef.current = window.setInterval(() => {
494
331
  cleanupCache();
495
332
  }, 5 * 60 * 1e3);
496
333
  }
497
- const getUrl = useCallback6(async (fileReference, supabase, organisationId, ttl = DEFAULT_TTL_MS) => {
334
+ const getUrl = useCallback(async (fileReference, supabase, organisationId, ttl = DEFAULT_TTL_MS) => {
498
335
  const cacheKey = getCacheKey(fileReference);
499
336
  const cached = globalUrlCache.get(cacheKey);
500
337
  const now = Date.now();
@@ -527,7 +364,7 @@ function useFileUrlCache() {
527
364
  return null;
528
365
  }
529
366
  }, []);
530
- const setUrl = useCallback6((fileReference, url, ttl = DEFAULT_TTL_MS) => {
367
+ const setUrl = useCallback((fileReference, url, ttl = DEFAULT_TTL_MS) => {
531
368
  const cacheKey = getCacheKey(fileReference);
532
369
  globalUrlCache.set(cacheKey, {
533
370
  url,
@@ -535,7 +372,7 @@ function useFileUrlCache() {
535
372
  });
536
373
  cleanupCache();
537
374
  }, []);
538
- const getCachedUrl = useCallback6((fileReference) => {
375
+ const getCachedUrl = useCallback((fileReference) => {
539
376
  const cacheKey = getCacheKey(fileReference);
540
377
  const cached = globalUrlCache.get(cacheKey);
541
378
  const now = Date.now();
@@ -544,14 +381,14 @@ function useFileUrlCache() {
544
381
  }
545
382
  return null;
546
383
  }, []);
547
- const clearFile = useCallback6((fileReference) => {
384
+ const clearFile = useCallback((fileReference) => {
548
385
  const cacheKey = getCacheKey(fileReference);
549
386
  globalUrlCache.delete(cacheKey);
550
387
  }, []);
551
- const clearCache = useCallback6(() => {
388
+ const clearCache = useCallback(() => {
552
389
  globalUrlCache.clear();
553
390
  }, []);
554
- const getCacheStats = useCallback6(() => {
391
+ const getCacheStats = useCallback(() => {
555
392
  return {
556
393
  size: globalUrlCache.size,
557
394
  maxSize: MAX_CACHE_SIZE
@@ -566,17 +403,14 @@ function useFileUrlCache() {
566
403
  getCacheStats
567
404
  };
568
405
  }
569
-
570
- // src/hooks/useStorage.ts
571
- import { useState as useState3, useCallback as useCallback7 } from "react";
572
406
  var log2 = createLogger("useStorage");
573
407
  function useStorage({ supabase, appName, orgId }) {
574
- const [isUploading, setIsUploading] = useState3(false);
575
- const [uploadError, setUploadError] = useState3(null);
576
- const [isListing, setIsListing] = useState3(false);
577
- const [listError, setListError] = useState3(null);
578
- const [files, setFiles] = useState3([]);
579
- const handleUploadFile = useCallback7(async (file, options = {}) => {
408
+ const [isUploading, setIsUploading] = useState(false);
409
+ const [uploadError, setUploadError] = useState(null);
410
+ const [isListing, setIsListing] = useState(false);
411
+ const [listError, setListError] = useState(null);
412
+ const [files, setFiles] = useState([]);
413
+ const handleUploadFile = useCallback(async (file, options = {}) => {
580
414
  setIsUploading(true);
581
415
  setUploadError(null);
582
416
  try {
@@ -604,10 +438,10 @@ function useStorage({ supabase, appName, orgId }) {
604
438
  setIsUploading(false);
605
439
  }
606
440
  }, [supabase, appName, orgId]);
607
- const handleGetPublicUrl = useCallback7((path) => {
441
+ const handleGetPublicUrl = useCallback((path) => {
608
442
  return getPublicUrl(supabase, path);
609
443
  }, [supabase]);
610
- const handleGetSignedUrl = useCallback7(async (path, expiresIn) => {
444
+ const handleGetSignedUrl = useCallback(async (path, expiresIn) => {
611
445
  try {
612
446
  const result = await getSignedUrl(supabase, path, {
613
447
  appName,
@@ -620,7 +454,7 @@ function useStorage({ supabase, appName, orgId }) {
620
454
  return null;
621
455
  }
622
456
  }, [supabase, appName, orgId]);
623
- const handleDeleteFile = useCallback7(async (path) => {
457
+ const handleDeleteFile = useCallback(async (path) => {
624
458
  try {
625
459
  const result = await deleteFile(supabase, path);
626
460
  if (result.success) {
@@ -634,7 +468,7 @@ function useStorage({ supabase, appName, orgId }) {
634
468
  };
635
469
  }
636
470
  }, [supabase]);
637
- const handleArchiveFile = useCallback7(async (path) => {
471
+ const handleArchiveFile = useCallback(async (path) => {
638
472
  try {
639
473
  const result = await archiveFile(supabase, path, { appName, orgId });
640
474
  if (result.success) {
@@ -648,7 +482,7 @@ function useStorage({ supabase, appName, orgId }) {
648
482
  };
649
483
  }
650
484
  }, [supabase, appName, orgId]);
651
- const handleListFiles = useCallback7(async (options = {}) => {
485
+ const handleListFiles = useCallback(async (options = {}) => {
652
486
  setIsListing(true);
653
487
  setListError(null);
654
488
  try {
@@ -668,7 +502,7 @@ function useStorage({ supabase, appName, orgId }) {
668
502
  setIsListing(false);
669
503
  }
670
504
  }, [supabase, appName, orgId]);
671
- const refreshFiles = useCallback7(async () => {
505
+ const refreshFiles = useCallback(async () => {
672
506
  await handleListFiles();
673
507
  }, [handleListFiles]);
674
508
  return {
@@ -698,10 +532,10 @@ function useStorage({ supabase, appName, orgId }) {
698
532
  };
699
533
  }
700
534
  function useFileUpload({ supabase, appName, orgId }) {
701
- const [uploadProgress, setUploadProgress] = useState3(0);
702
- const [isUploading, setIsUploading] = useState3(false);
703
- const [uploadError, setUploadError] = useState3(null);
704
- const uploadWithProgress = useCallback7(async (file, options = {}) => {
535
+ const [uploadProgress, setUploadProgress] = useState(0);
536
+ const [isUploading, setIsUploading] = useState(false);
537
+ const [uploadError, setUploadError] = useState(null);
538
+ const uploadWithProgress = useCallback(async (file, options = {}) => {
705
539
  setIsUploading(true);
706
540
  setUploadProgress(0);
707
541
  setUploadError(null);
@@ -741,47 +575,5 @@ function useFileUpload({ supabase, appName, orgId }) {
741
575
  uploadError
742
576
  };
743
577
  }
744
- export {
745
- cleanupQueryCache,
746
- clearFileDisplayCache,
747
- clearPublicEventCache,
748
- clearPublicFileDisplayCache,
749
- clearPublicLogoCache,
750
- extractEventCodeFromPath,
751
- generatePublicRoutePath,
752
- getFileDisplayCacheStats,
753
- getPublicEventCacheStats,
754
- getPublicFileDisplayCacheStats,
755
- getPublicLogoCacheStats,
756
- invalidateFileDisplayCache,
757
- queryCacheHelpers,
758
- useAddressAutocomplete,
759
- useAppConfig,
760
- useComponentPerformance,
761
- useDataTablePerformance,
762
- useDataTableState,
763
- useDebounce,
764
- useEventTheme,
765
- useFileDisplay,
766
- useFileUpload,
767
- useFileUrlCache,
768
- useFocusManagement,
769
- useFocusTrap,
770
- useFormDialog,
771
- useIsMobile,
772
- useKeyboardShortcuts,
773
- useOrganisationPermissions,
774
- useOrganisationSecurity,
775
- usePerformanceMonitor,
776
- usePreventTabReload,
777
- usePublicEvent,
778
- usePublicEventCode,
779
- usePublicEventLogo,
780
- usePublicFileDisplay,
781
- usePublicRouteParams,
782
- useQueryCache,
783
- useStorage,
784
- useToast,
785
- useZodForm
786
- };
787
- //# sourceMappingURL=hooks.js.map
578
+
579
+ export { useDataTableState, useFileUpload, useFileUrlCache, useFocusManagement, useIsMobile, useKeyboardShortcuts, usePerformanceMonitor, useStorage };
@@ -0,0 +1 @@
1
+ export * from 'lucide-react';
@@ -0,0 +1 @@
1
+ export * from 'lucide-react';