@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
@@ -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-YKRAFF5K.js";
13
- import {
14
- useOrganisationSecurity,
15
- usePublicPageContext
16
- } from "./chunk-OEWDTMG7.js";
17
- import {
18
- useOrganisations
19
- } from "./chunk-AVMLPIM7.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-FENMYN2U.js';
2
+ import { useOrganisationSecurity, usePublicPageContext } from './chunk-3O3WHILE.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-5EC5MEWX.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 };