@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,9 +1,103 @@
1
- import {
2
- logger
3
- } from "./chunk-PWLANIRT.js";
1
+ import { logger } from './chunk-TTRFSOKR.js';
2
+ import * as React from 'react';
3
+ import { useRef, useCallback, useEffect, useState, useMemo } from 'react';
4
4
 
5
- // src/hooks/useToast.ts
6
- import * as React from "react";
5
+ var DEFAULT_FOCUSABLE_SELECTOR = [
6
+ "button:not([disabled])",
7
+ "[href]",
8
+ "input:not([disabled])",
9
+ "select:not([disabled])",
10
+ "textarea:not([disabled])",
11
+ '[tabindex]:not([tabindex="-1"])',
12
+ '[contenteditable="true"]'
13
+ ].join(", ");
14
+ function useFocusTrap(options = {}) {
15
+ const {
16
+ isActive = false,
17
+ autoFocus = false,
18
+ restoreFocus = false,
19
+ onEscape,
20
+ focusableSelector = DEFAULT_FOCUSABLE_SELECTOR
21
+ } = options;
22
+ const containerRef = useRef(null);
23
+ const previouslyFocusedElement = useRef(null);
24
+ const getFocusableElements = useCallback(() => {
25
+ if (!containerRef.current) return [];
26
+ return Array.from(
27
+ containerRef.current.querySelectorAll(focusableSelector)
28
+ ).filter((element) => {
29
+ return (
30
+ // visible check
31
+ !element.hasAttribute("disabled") && !element.hasAttribute("hidden") && element.offsetParent !== null
32
+ );
33
+ });
34
+ }, [focusableSelector]);
35
+ const focusFirst = useCallback(() => {
36
+ const elements = getFocusableElements();
37
+ if (elements.length > 0) {
38
+ elements[0].focus();
39
+ }
40
+ }, [getFocusableElements]);
41
+ const focusLast = useCallback(() => {
42
+ const elements = getFocusableElements();
43
+ if (elements.length > 0) {
44
+ elements[elements.length - 1].focus();
45
+ }
46
+ }, [getFocusableElements]);
47
+ useEffect(() => {
48
+ if (!isActive || !containerRef.current) return;
49
+ const handleKeyDown = (event) => {
50
+ if (event.key === "Escape" && onEscape) {
51
+ onEscape();
52
+ return;
53
+ }
54
+ if (event.key === "Tab") {
55
+ const focusableElements = getFocusableElements();
56
+ if (focusableElements.length === 0) return;
57
+ const firstElement = focusableElements[0];
58
+ const lastElement = focusableElements[focusableElements.length - 1];
59
+ if (event.shiftKey) {
60
+ if (document.activeElement === firstElement) {
61
+ event.preventDefault();
62
+ lastElement.focus();
63
+ }
64
+ } else {
65
+ if (document.activeElement === lastElement) {
66
+ event.preventDefault();
67
+ firstElement.focus();
68
+ }
69
+ }
70
+ }
71
+ };
72
+ const container = containerRef.current;
73
+ container.addEventListener("keydown", handleKeyDown);
74
+ return () => {
75
+ container.removeEventListener("keydown", handleKeyDown);
76
+ };
77
+ }, [isActive, onEscape, getFocusableElements]);
78
+ useEffect(() => {
79
+ if (!isActive) return;
80
+ if (restoreFocus) {
81
+ previouslyFocusedElement.current = document.activeElement;
82
+ }
83
+ if (autoFocus) {
84
+ const timer = setTimeout(focusFirst, 0);
85
+ return () => clearTimeout(timer);
86
+ }
87
+ return () => {
88
+ if (restoreFocus && previouslyFocusedElement.current) {
89
+ previouslyFocusedElement.current.focus();
90
+ previouslyFocusedElement.current = null;
91
+ }
92
+ };
93
+ }, [isActive, autoFocus, restoreFocus, focusFirst]);
94
+ return {
95
+ containerRef,
96
+ focusFirst,
97
+ focusLast,
98
+ getFocusableElements
99
+ };
100
+ }
7
101
  var TOAST_LIMIT = 5;
8
102
  var TOAST_REMOVE_DELAY = 1e3;
9
103
  var DEFAULT_TOAST_DURATION = 5e3;
@@ -407,9 +501,6 @@ function safeExecute(fn, fallback) {
407
501
  return fallback;
408
502
  }
409
503
  }
410
-
411
- // src/hooks/useDataTablePerformance.ts
412
- import { useState as useState2, useEffect as useEffect2, useCallback, useMemo, useRef } from "react";
413
504
  function useDataTablePerformance({
414
505
  data,
415
506
  performance = {},
@@ -420,24 +511,24 @@ function useDataTablePerformance({
420
511
  onError,
421
512
  enableErrorRecovery = true
422
513
  }) {
423
- const [isLoading, setIsLoading] = useState2(false);
424
- const [searchQuery, setSearchQuery] = useState2("");
425
- const [searchResults, setSearchResults] = useState2([]);
426
- const [serverData, setServerData] = useState2(null);
427
- const [memoryUsage, setMemoryUsage] = useState2(0);
428
- const [errorState, setErrorState] = useState2({
514
+ const [isLoading, setIsLoading] = useState(false);
515
+ const [searchQuery, setSearchQuery] = useState("");
516
+ const [searchResults, setSearchResults] = useState([]);
517
+ const [serverData, setServerData] = useState(null);
518
+ const [memoryUsage, setMemoryUsage] = useState(0);
519
+ const [errorState, setErrorState] = useState({
429
520
  hasErrors: false,
430
521
  errorCount: 0,
431
522
  lastError: null,
432
523
  fallbacksActive: []
433
524
  });
434
- const [lastFailedOperation, setLastFailedOperation] = useState2(null);
525
+ const [lastFailedOperation, setLastFailedOperation] = useState(null);
435
526
  const chunkManagerRef = useRef(null);
436
527
  const searchIndexRef = useRef(null);
437
528
  const visibilityTrackerRef = useRef(null);
438
529
  const errorRecoveryManagerRef = useRef(new ErrorRecoveryManager(fallbackConfig));
439
530
  const memoryMonitorRef = useRef(null);
440
- const circuitBreakerRef = useRef(new CircuitBreaker());
531
+ useRef(new CircuitBreaker());
441
532
  const paginationMode = useMemo(() => {
442
533
  if (serverSide) return "server";
443
534
  return determinePaginationMode(data?.length || 0, performance.serverSideThreshold);
@@ -462,12 +553,12 @@ function useDataTablePerformance({
462
553
  }
463
554
  return processedData?.length || 0;
464
555
  }, [serverData, processedData?.length, serverSide]);
465
- useEffect2(() => {
556
+ useEffect(() => {
466
557
  if (chunking && !chunkManagerRef.current) {
467
558
  chunkManagerRef.current = new DataChunkManager(chunking);
468
559
  }
469
560
  }, [chunking]);
470
- useEffect2(() => {
561
+ useEffect(() => {
471
562
  if (searchIndex && !searchIndexRef.current) {
472
563
  searchIndexRef.current = new SearchIndex(searchIndex);
473
564
  }
@@ -487,7 +578,7 @@ function useDataTablePerformance({
487
578
  }), performance.debounceSearch ?? 300),
488
579
  [performance.debounceSearch]
489
580
  );
490
- useEffect2(() => {
581
+ useEffect(() => {
491
582
  debouncedSearch(searchQuery);
492
583
  }, [searchQuery, debouncedSearch]);
493
584
  const fetchServerData = useCallback(async (params) => {
@@ -502,7 +593,7 @@ function useDataTablePerformance({
502
593
  setIsLoading(false);
503
594
  }
504
595
  }, [serverSide]);
505
- useEffect2(() => {
596
+ useEffect(() => {
506
597
  if (!visibilityTrackerRef.current) {
507
598
  visibilityTrackerRef.current = new VisibilityTracker();
508
599
  }
@@ -511,7 +602,7 @@ function useDataTablePerformance({
511
602
  });
512
603
  return unsubscribe;
513
604
  }, [totalCount, isVirtualized, paginationMode]);
514
- useEffect2(() => {
605
+ useEffect(() => {
515
606
  const updateMemoryUsage = () => {
516
607
  let usage = 0;
517
608
  if (chunkManagerRef.current) {
@@ -528,7 +619,7 @@ function useDataTablePerformance({
528
619
  }
529
620
  };
530
621
  }, [processedData]);
531
- const handleError = useCallback(async (error, operation) => {
622
+ useCallback(async (error, operation) => {
532
623
  if (enableErrorRecovery) {
533
624
  try {
534
625
  const recovery = await errorRecoveryManagerRef.current.handleError(error);
@@ -575,7 +666,7 @@ function useDataTablePerformance({
575
666
  visibilityTrackerRef.current?.destroy();
576
667
  memoryMonitorRef.current?.stopMonitoring();
577
668
  }, []);
578
- useEffect2(() => {
669
+ useEffect(() => {
579
670
  return cleanup;
580
671
  }, [cleanup]);
581
672
  return {
@@ -605,24 +696,4 @@ function useDataTablePerformance({
605
696
  };
606
697
  }
607
698
 
608
- export {
609
- toast,
610
- useToast,
611
- determinePaginationMode,
612
- getOptimalPageSizeOptions,
613
- chunkData,
614
- DataChunkManager,
615
- SearchIndex,
616
- debounce,
617
- throttle,
618
- VisibilityTracker,
619
- DEFAULT_FALLBACK_CONFIG,
620
- DataTableErrorType,
621
- DataTableError,
622
- ErrorRecoveryManager,
623
- MemoryMonitor,
624
- CircuitBreaker,
625
- safeExecute,
626
- useDataTablePerformance
627
- };
628
- //# sourceMappingURL=chunk-6SOIHG6Z.js.map
699
+ export { CircuitBreaker, DEFAULT_FALLBACK_CONFIG, DataChunkManager, DataTableError, DataTableErrorType, ErrorRecoveryManager, MemoryMonitor, SearchIndex, VisibilityTracker, chunkData, debounce, determinePaginationMode, getOptimalPageSizeOptions, safeExecute, throttle, toast, useDataTablePerformance, useFocusTrap, useToast };
@@ -69,8 +69,4 @@ performanceBudgetMonitor.setBudget("CHUNK_COUNT", 10, "warning");
69
69
  performanceBudgetMonitor.setBudget("TREESHAKING_SCORE", 70, "warning");
70
70
  performanceBudgetMonitor.setBudget("ERROR_BOUNDARY_TRIGGER", 5, "error");
71
71
 
72
- export {
73
- PERFORMANCE_BUDGETS,
74
- performanceBudgetMonitor
75
- };
76
- //# sourceMappingURL=chunk-FMUCXFII.js.map
72
+ export { PERFORMANCE_BUDGETS, performanceBudgetMonitor };
@@ -118,10 +118,4 @@ function createLogger(component) {
118
118
  return Logger.createScopedLogger(component);
119
119
  }
120
120
 
121
- export {
122
- LogLevel,
123
- Logger,
124
- logger,
125
- createLogger
126
- };
127
- //# sourceMappingURL=chunk-PWLANIRT.js.map
121
+ export { LogLevel, Logger, createLogger, logger };
@@ -12,9 +12,4 @@ function getAllStylePaths() {
12
12
  return Object.values(styleConfig).map((config) => config.path);
13
13
  }
14
14
 
15
- export {
16
- styleConfig,
17
- getStylePath,
18
- getAllStylePaths
19
- };
20
- //# sourceMappingURL=chunk-5DRSZLL2.js.map
15
+ export { getAllStylePaths, getStylePath, styleConfig };
@@ -1,10 +1,8 @@
1
- import {
2
- formatInTimeZone,
3
- getTimezoneAbbreviation
4
- } from "./chunk-J36DSWQK.js";
5
- import {
6
- createLogger
7
- } from "./chunk-PWLANIRT.js";
1
+ import { formatInTimeZone, getTimezoneAbbreviation } from './chunk-2HGJFNAH.js';
2
+ import { createLogger } from './chunk-TTRFSOKR.js';
3
+ import { z } from 'zod';
4
+ import { createClient } from '@supabase/supabase-js';
5
+ import { parseISO, isValid } from 'date-fns';
8
6
 
9
7
  // src/utils/context/sessionTracking.ts
10
8
  var log = createLogger("SessionTracking");
@@ -83,9 +81,6 @@ function useSessionTracking(supabaseClient, appName) {
83
81
  trackSessionExpired
84
82
  };
85
83
  }
86
-
87
- // src/utils/validation/common.ts
88
- import { z } from "zod";
89
84
  var emailSchema = z.string().min(1, "Email is required").email("Invalid email format").max(254, "Email too long");
90
85
  var nameSchema = z.string().min(1, "Name is required").max(100, "Name too long").regex(/^[a-zA-Z\s'-]+$/, "Name contains invalid characters");
91
86
  var phoneSchema = z.string().regex(/^\+?[\d\s\-\(\)]+$/, "Invalid phone number format").min(10, "Phone number too short").max(20, "Phone number too long");
@@ -94,9 +89,6 @@ var dateSchema = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-M
94
89
  const parsed = new Date(date);
95
90
  return !isNaN(parsed.getTime());
96
91
  }, "Invalid date");
97
-
98
- // src/utils/validation/passwordSchema.ts
99
- import { z as z2 } from "zod";
100
92
  var COMMON_PASSWORDS = /* @__PURE__ */ new Set([
101
93
  "password",
102
94
  "123456",
@@ -119,7 +111,7 @@ var WEAK_PATTERNS = [
119
111
  /^(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz)+/i
120
112
  // Sequential letters
121
113
  ];
122
- var securePasswordSchema = z2.string().min(8, "Password must be at least 8 characters long").max(128, "Password must not exceed 128 characters").refine(
114
+ z.string().min(8, "Password must be at least 8 characters long").max(128, "Password must not exceed 128 characters").refine(
123
115
  (password) => /[a-z]/.test(password),
124
116
  "Password must contain at least one lowercase letter"
125
117
  ).refine(
@@ -146,7 +138,7 @@ var securePasswordSchema = z2.string().min(8, "Password must be at least 8 chara
146
138
  },
147
139
  "Password contains keyboard patterns. Please choose a more secure password"
148
140
  );
149
- var passwordSchema = z2.string().min(6, "Password must be at least 6 characters long").max(128, "Password must not exceed 128 characters");
141
+ var passwordSchema = z.string().min(6, "Password must be at least 6 characters long").max(128, "Password must not exceed 128 characters");
150
142
  function calculatePasswordStrength(password) {
151
143
  let score = 0;
152
144
  const feedback = [];
@@ -179,6 +171,89 @@ function calculatePasswordStrength(password) {
179
171
  else level = "strong";
180
172
  return { score: Math.max(0, Math.min(100, score)), feedback, level };
181
173
  }
174
+ var DEFAULT_OPTIONS = {
175
+ allowHtml: false,
176
+ allowedTags: [],
177
+ maxLength: 1e3,
178
+ trim: true,
179
+ removeScripts: true,
180
+ removeEvents: true
181
+ };
182
+ function sanitizeUserInput(input, options = {}) {
183
+ if (typeof input !== "string") {
184
+ return "";
185
+ }
186
+ const opts = { ...DEFAULT_OPTIONS, ...options };
187
+ let sanitized = input;
188
+ if (opts.trim) {
189
+ sanitized = sanitized.trim();
190
+ }
191
+ if (opts.maxLength && sanitized.length > opts.maxLength) {
192
+ sanitized = sanitized.substring(0, opts.maxLength);
193
+ }
194
+ if (!opts.allowHtml) {
195
+ sanitized = sanitized.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#x27;").replace(/\//g, "&#x2F;");
196
+ } else if (opts.allowedTags && opts.allowedTags.length > 0) {
197
+ const allowedTagsRegex = new RegExp(`<(?!/?(?:${opts.allowedTags.join("|")})s*/?>)[^>]+>`, "gi");
198
+ sanitized = sanitized.replace(allowedTagsRegex, "");
199
+ }
200
+ if (opts.removeScripts) {
201
+ sanitized = sanitized.replace(/<script[^>]*>.*?<\/script>/gi, "").replace(/javascript:/gi, "").replace(/vbscript:/gi, "").replace(/data:/gi, "");
202
+ }
203
+ if (opts.removeEvents) {
204
+ sanitized = sanitized.replace(/on\w+\s*=/gi, "");
205
+ }
206
+ return sanitized;
207
+ }
208
+ function sanitizeEmail(email) {
209
+ if (typeof email !== "string") {
210
+ return "";
211
+ }
212
+ return email.trim().toLowerCase().replace(/[^\w@.-]/g, "");
213
+ }
214
+ function sanitizeFormData(data, schema, sanitizationRules) {
215
+ try {
216
+ if (sanitizationRules && typeof data === "object" && data !== null) {
217
+ const sanitizedData = { ...data };
218
+ Object.entries(sanitizationRules).forEach(([field, options]) => {
219
+ if (typeof sanitizedData[field] === "string") {
220
+ sanitizedData[field] = sanitizeUserInput(sanitizedData[field], options);
221
+ }
222
+ });
223
+ data = sanitizedData;
224
+ }
225
+ const result = schema.parse(data);
226
+ return { success: true, data: result };
227
+ } catch (error) {
228
+ if (error instanceof z.ZodError) {
229
+ return {
230
+ success: false,
231
+ error: error.errors.map((e) => e.message).join(", ")
232
+ };
233
+ }
234
+ return {
235
+ success: false,
236
+ error: "Validation failed"
237
+ };
238
+ }
239
+ }
240
+ var secureEmailSchema = z.string().min(1, "Email is required").email("Invalid email format").max(254, "Email too long").refine(
241
+ (email) => {
242
+ if (!email || typeof email !== "string") return false;
243
+ const domain = email.split("@")[1];
244
+ return domain && domain.includes(".") && domain.length > 3;
245
+ },
246
+ "Invalid email domain"
247
+ ).transform((email) => sanitizeEmail(email));
248
+ z.string().min(1, "Email is required").email("Invalid email format");
249
+ z.string().min(1, "Name is required").max(100, "Name too long").regex(/^[a-zA-Z\s'-]+$/, "Name contains invalid characters");
250
+ z.string().regex(/^[\+]?[1-9][\d]{0,15}$/, "Invalid phone number format");
251
+ z.string().url("Invalid URL format");
252
+ z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid date format (YYYY-MM-DD)");
253
+ z.object({
254
+ email: secureEmailSchema,
255
+ password: z.string().min(1, "Password is required")
256
+ });
182
257
 
183
258
  // src/utils/app/appConfig.ts
184
259
  var currentAppConfig = null;
@@ -201,9 +276,49 @@ function getCurrentAppName() {
201
276
  function getCurrentAppId() {
202
277
  return getAppConfig().appId;
203
278
  }
204
-
205
- // src/utils/formatting/formatting.ts
206
- import { parseISO, isValid } from "date-fns";
279
+ var ALLOWED_FILE_PATTERNS = [
280
+ /[\/\\]main\.(tsx?|jsx?)(\?|:|\s|$)/i,
281
+ /[\/\\]App\.(tsx?|jsx?)(\?|:|\s|$)/i,
282
+ /[\/\\]lib[\/\\]supabase\.(tsx?|jsx?)(\?|:|\s|$)/i,
283
+ /[\/\\]src[\/\\]supabase\.(tsx?|jsx?)(\?|:|\s|$)/i
284
+ ];
285
+ function isAllowedContext() {
286
+ if (typeof process !== "undefined" && true) {
287
+ return true;
288
+ }
289
+ try {
290
+ const stack = new Error().stack;
291
+ if (!stack) return false;
292
+ const stackLines = stack.split("\n");
293
+ for (const line of stackLines) {
294
+ for (const pattern of ALLOWED_FILE_PATTERNS) {
295
+ if (pattern.test(line)) {
296
+ return true;
297
+ }
298
+ }
299
+ }
300
+ return false;
301
+ } catch {
302
+ return true;
303
+ }
304
+ }
305
+ function createBaseClient(supabaseUrl, supabaseKey) {
306
+ if (!isAllowedContext()) {
307
+ const error = new Error(
308
+ "createBaseClient() can only be called from main.tsx, App.tsx, or lib/supabase.ts.\nThis is a security requirement to ensure the base client is only created once and passed to UnifiedAuthProvider.\nSee: https://github.com/jmruthers/pace-core/blob/main/packages/core/docs/standards/00-pace-core-compliance.md"
309
+ );
310
+ console.error("[pace-core Security Error]", error);
311
+ throw error;
312
+ }
313
+ return createClient(supabaseUrl, supabaseKey, {
314
+ auth: {
315
+ autoRefreshToken: true,
316
+ persistSession: true,
317
+ detectSessionInUrl: true,
318
+ flowType: "pkce"
319
+ }
320
+ });
321
+ }
207
322
  function formatDate(date) {
208
323
  const dateObj = typeof date === "string" || typeof date === "number" ? new Date(date) : date;
209
324
  return dateObj.toLocaleDateString("en-GB", {
@@ -357,30 +472,4 @@ function formatDateTimeForMap(utcDate, timezone) {
357
472
  }
358
473
  }
359
474
 
360
- export {
361
- useSessionTracking,
362
- emailSchema,
363
- nameSchema,
364
- phoneSchema,
365
- urlSchema,
366
- dateSchema,
367
- passwordSchema,
368
- calculatePasswordStrength,
369
- setAppConfig,
370
- getAppConfig,
371
- getCurrentAppName,
372
- getCurrentAppId,
373
- formatDate,
374
- formatTime,
375
- formatDateTime,
376
- formatCurrency,
377
- formatNumber,
378
- formatPercent,
379
- formatCompactNumber,
380
- formatFileSize,
381
- formatDateTimeForDisplay,
382
- formatDateOnlyForDisplay,
383
- formatDateTimeForTable,
384
- formatDateTimeForMap
385
- };
386
- //# sourceMappingURL=chunk-FFQEQTNW.js.map
475
+ export { calculatePasswordStrength, createBaseClient, dateSchema, emailSchema, formatCompactNumber, formatCurrency, formatDate, formatDateOnlyForDisplay, formatDateTime, formatDateTimeForDisplay, formatDateTimeForMap, formatDateTimeForTable, formatFileSize, formatNumber, formatPercent, formatTime, getAppConfig, getCurrentAppId, getCurrentAppName, nameSchema, passwordSchema, phoneSchema, sanitizeFormData, sanitizeUserInput, setAppConfig, urlSchema, useSessionTracking };