@jmruthers/pace-core 0.6.5 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -1,544 +0,0 @@
1
- # RBAC/Auth Compliance Guide
2
-
3
- > **📚 RBAC Compliance** | [← Back to RBAC Documentation](../README.md) | [Troubleshooting](./troubleshooting-compliance.md) | [Migrating Custom Auth](./migrating-custom-auth.md)
4
-
5
- This guide explains how to achieve RBAC/auth compliance in your pace app to ensure proper security and consistent usage of pace-core.
6
-
7
- ## Overview
8
-
9
- The RBAC/auth compliance system ensures that:
10
- - All auth/rbac/permission functionality uses pace-core exclusively
11
- - RBAC system is properly initialized
12
- - All pages are protected with PagePermissionGuard
13
- - Supabase configuration is centralized
14
- - No custom auth/rbac code exists
15
-
16
- ## Compliance Checks
17
-
18
- The compliance system checks for:
19
-
20
- ### 1. Custom Auth/RBAC Code
21
-
22
- **What it checks:**
23
- - Custom auth hooks (useAuth, useLogin, useLogout, etc.)
24
- - Custom RBAC components (PermissionGuard, AuthGuard, etc.)
25
- - Custom permission utilities (checkPermission, hasAccess, etc.)
26
-
27
- **How to fix:**
28
- - Remove custom implementations
29
- - Import equivalent from `@jmruthers/pace-core` or `@jmruthers/pace-core/rbac`
30
- - Update all usages
31
-
32
- See [Migrating Custom Auth](./migrating-custom-auth.md) for detailed migration steps.
33
-
34
- ### 2. Duplicate Supabase Configuration
35
-
36
- **What it checks:**
37
- - Multiple `createClient` calls
38
- - Supabase environment variables in multiple files
39
-
40
- **How to fix:**
41
- - Create a single `supabase.ts` file
42
- - Export the client instance
43
- - Import from the shared location everywhere
44
-
45
- ### 3. Unprotected Pages
46
-
47
- **What it checks:**
48
- - Routes without PagePermissionGuard
49
- - Pages without permission checks
50
-
51
- **How to fix:**
52
- - Wrap all routes with PagePermissionGuard
53
- - Set `pageName` and `operation` props
54
- - Ensure pages exist in `rbac_app_pages` table
55
-
56
- ### 4. Direct Supabase Auth Usage
57
-
58
- **What it checks:**
59
- - Direct calls to `supabase.auth.signIn`, `supabase.auth.signUp`, etc.
60
-
61
- **How to fix:**
62
- - Use `useUnifiedAuth` hook from pace-core
63
- - Use `UnifiedAuthProvider` to wrap your app
64
- - Replace all direct auth calls with pace-core methods
65
-
66
- ### 5. Provider Setup Issues
67
-
68
- **What it checks:**
69
- - Missing `UnifiedAuthProvider` or `OrganisationProvider`
70
- - Incorrect provider nesting order
71
- - Providers placed in wrong locations
72
-
73
- **How to fix:**
74
- - Ensure correct nesting: `QueryClientProvider` → `BrowserRouter` → `UnifiedAuthProvider` → `OrganisationProvider` → `App`
75
- - Place providers in `main.tsx` or `App.tsx` entry file
76
- - See [Provider Setup](#provider-setup) section below
77
-
78
- ### 6. Vite Configuration Issues
79
-
80
- **What it checks:**
81
- - `@jmruthers/pace-core` in `optimizeDeps.include` (should be excluded)
82
- - Missing `@jmruthers/pace-core` in `optimizeDeps.exclude`
83
- - Missing `react-router-dom` in `resolve.dedupe`
84
-
85
- **How to fix:**
86
- - Add `@jmruthers/pace-core` to `optimizeDeps.exclude`
87
- - Remove `@jmruthers/pace-core` from `optimizeDeps.include`
88
- - Add `react-router-dom` to `resolve.dedupe`
89
- - See [Vite Configuration](#vite-configuration) section below
90
-
91
- ### 7. Router Setup Issues
92
-
93
- **What it checks:**
94
- - Missing `BrowserRouter`
95
- - `BrowserRouter` placed incorrectly (inside `UnifiedAuthProvider` instead of wrapping it)
96
- - `Routes` used without `BrowserRouter`
97
-
98
- **How to fix:**
99
- - Wrap app with `BrowserRouter` from `react-router-dom`
100
- - Ensure `BrowserRouter` wraps `UnifiedAuthProvider` (not the other way around)
101
- - See [Router Setup](#router-setup) section below
102
-
103
- ## Running Compliance Checks
104
-
105
- ### Static Analysis
106
-
107
- Run the compliance check script:
108
-
109
- ```bash
110
- npm run check:pace-core
111
- ```
112
-
113
- This will scan your codebase and report:
114
- - Custom auth/rbac code
115
- - Duplicate configurations
116
- - Unprotected pages
117
- - Direct Supabase auth usage
118
- - Provider setup issues
119
- - Vite configuration problems
120
- - Router setup issues
121
-
122
- ### ESLint Rules
123
-
124
- The compliance system includes ESLint rules that run during development:
125
-
126
- - `no-custom-auth-code` - Disallows custom auth/rbac implementations
127
- - `no-duplicate-supabase-config` - Disallows multiple Supabase configurations
128
- - `require-page-permission-guard` - Requires PagePermissionGuard on routes
129
- - `no-direct-supabase-auth` - Disallows direct Supabase auth usage
130
-
131
- ### Runtime Validation
132
-
133
- Check runtime compliance programmatically:
134
-
135
- ```typescript
136
- import { checkRuntimeCompliance } from '@jmruthers/pace-core/rbac';
137
-
138
- const result = checkRuntimeCompliance();
139
- if (!result.setup.isCompliant) {
140
- console.warn('RBAC setup issues:', result.setup.issues);
141
- }
142
- ```
143
-
144
- ## Achieving Compliance
145
-
146
- ### Step 1: Initialize RBAC
147
-
148
- ```typescript
149
- // main.tsx or App.tsx
150
- import { setupRBAC } from '@jmruthers/pace-core/rbac';
151
- import { createClient } from '@supabase/supabase-js';
152
-
153
- const supabase = createClient(
154
- import.meta.env.VITE_SUPABASE_URL,
155
- import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
156
- );
157
-
158
- // ⚠️ REQUIRED: Call setupRBAC before rendering
159
- setupRBAC(supabase);
160
- ```
161
-
162
- ### Step 2: Set Up Providers
163
-
164
- **⚠️ CRITICAL: Provider nesting order matters!**
165
-
166
- The correct nesting order is:
167
- 1. `QueryClientProvider` (outermost)
168
- 2. `BrowserRouter`
169
- 3. `UnifiedAuthProvider`
170
- 4. `OrganisationProvider`
171
- 5. `App` (innermost)
172
-
173
- ```tsx
174
- // main.tsx - Correct setup
175
- import { BrowserRouter } from 'react-router-dom';
176
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
177
- import { UnifiedAuthProvider, OrganisationProvider } from '@jmruthers/pace-core';
178
-
179
- const queryClient = new QueryClient();
180
-
181
- createRoot(document.getElementById("root")!).render(
182
- <QueryClientProvider client={queryClient}>
183
- <BrowserRouter>
184
- <UnifiedAuthProvider supabaseClient={supabase} appName={APP_NAME}>
185
- <OrganisationProvider>
186
- <App />
187
- </OrganisationProvider>
188
- </UnifiedAuthProvider>
189
- </BrowserRouter>
190
- </QueryClientProvider>
191
- );
192
- ```
193
-
194
- **Common mistakes to avoid:**
195
- - ❌ `BrowserRouter` inside `UnifiedAuthProvider` (causes Router context errors)
196
- - ❌ `UnifiedAuthProvider` wrapping `BrowserRouter` (causes context errors)
197
- - ❌ Missing `BrowserRouter` (causes `useNavigate` errors)
198
-
199
- ### Step 3: Protect All Pages
200
-
201
- ```tsx
202
- // pages/Dashboard.tsx
203
- import { PagePermissionGuard } from '@jmruthers/pace-core/rbac';
204
-
205
- function Dashboard() {
206
- return (
207
- <PagePermissionGuard pageName="dashboard" operation="read">
208
- <DashboardContent />
209
- </PagePermissionGuard>
210
- );
211
- }
212
- ```
213
-
214
- ### Step 4: Use pace-core Auth
215
-
216
- ```tsx
217
- // components/Login.tsx
218
- import { useUnifiedAuth } from '@jmruthers/pace-core';
219
-
220
- function Login() {
221
- const { signIn } = useUnifiedAuth();
222
-
223
- const handleLogin = async () => {
224
- await signIn({ email, password });
225
- };
226
-
227
- return <button onClick={handleLogin}>Login</button>;
228
- }
229
- ```
230
-
231
- ### Step 5: Configure Vite
232
-
233
- **⚠️ CRITICAL: Vite configuration prevents React context mismatches!**
234
-
235
- Add to your `vite.config.ts`:
236
-
237
- ```typescript
238
- import { defineConfig } from 'vite';
239
-
240
- export default defineConfig({
241
- resolve: {
242
- dedupe: ['react', 'react-dom', 'react-router-dom']
243
- },
244
- optimizeDeps: {
245
- include: [
246
- 'react',
247
- 'react-dom',
248
- 'react/jsx-runtime'
249
- ],
250
- // CRITICAL: Exclude pace-core to prevent React context mismatches
251
- exclude: ['@jmruthers/pace-core', 'react-router-dom']
252
- }
253
- });
254
- ```
255
-
256
- **Why this matters:**
257
- - Pre-bundling `@jmruthers/pace-core` creates separate React instances
258
- - This causes "useUnifiedAuth must be used within a UnifiedAuthProvider" errors
259
- - Excluding it ensures pace-core uses the same React instance as your app
260
-
261
- ### Step 6: Centralize Supabase Config
262
-
263
- ```typescript
264
- // src/lib/supabase.ts
265
- import { createClient } from '@supabase/supabase-js';
266
-
267
- export const supabase = createClient(
268
- import.meta.env.VITE_SUPABASE_URL,
269
- import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
270
- );
271
- ```
272
-
273
- ## Database Configuration
274
-
275
- Ensure your database is properly configured:
276
-
277
- 1. **App Registration**: App must exist in `rbac_apps` table
278
- 2. **Pages**: All pages must be registered in `rbac_app_pages` table
279
- 3. **Permissions**: Permissions must be configured in `rbac_page_permissions` table
280
- 4. **User Roles**: Users must have roles in `rbac_organisation_roles` table
281
-
282
- See [RBAC Quick Start](../quick-start.md) for database setup instructions.
283
-
284
- ## Quick Fixes
285
-
286
- The compliance system provides quick fix suggestions:
287
-
288
- ```typescript
289
- import { getQuickFixes } from '@jmruthers/pace-core/rbac';
290
-
291
- const fixes = getQuickFixes('custom-auth-code', { name: 'useAuth', type: 'hook' });
292
- fixes.forEach(fix => {
293
- console.log(fix.suggestion);
294
- console.log(fix.codeExample);
295
- });
296
- ```
297
-
298
- ## CI/CD Integration
299
-
300
- Add compliance checks to your CI/CD pipeline:
301
-
302
- ```yaml
303
- # .github/workflows/compliance.yml
304
- - name: Check pace-core compliance
305
- run: npm run check:pace-core
306
- ```
307
-
308
- The script exits with code 1 if compliance issues are found, causing the build to fail.
309
-
310
- ## Troubleshooting Common Issues
311
-
312
- ### Provider Setup Issues
313
-
314
- **Issue:** "useUnifiedAuth must be used within a UnifiedAuthProvider" error
315
-
316
- **Possible causes:**
317
- 1. `UnifiedAuthProvider` is missing or not wrapping your app
318
- 2. `BrowserRouter` is inside `UnifiedAuthProvider` (wrong nesting)
319
- 3. Vite is pre-bundling `@jmruthers/pace-core` (React context mismatch)
320
-
321
- **Solution:**
322
- 1. **Check provider nesting** in `main.tsx`:
323
- ```tsx
324
- // ✅ CORRECT
325
- <QueryClientProvider>
326
- <BrowserRouter>
327
- <UnifiedAuthProvider>
328
- <OrganisationProvider>
329
- <App />
330
- </OrganisationProvider>
331
- </UnifiedAuthProvider>
332
- </BrowserRouter>
333
- </QueryClientProvider>
334
-
335
- // ❌ WRONG - BrowserRouter inside UnifiedAuthProvider
336
- <UnifiedAuthProvider>
337
- <BrowserRouter>
338
- <App />
339
- </BrowserRouter>
340
- </UnifiedAuthProvider>
341
- ```
342
-
343
- 2. **Check Vite config** - ensure `@jmruthers/pace-core` is in `optimizeDeps.exclude`:
344
- ```typescript
345
- optimizeDeps: {
346
- exclude: ['@jmruthers/pace-core', 'react-router-dom']
347
- }
348
- ```
349
-
350
- 3. **Clear Vite cache** and restart dev server:
351
- ```bash
352
- rm -rf node_modules/.vite
353
- npm run dev
354
- ```
355
-
356
- ### Router Context Issues
357
-
358
- **Issue:** "useNavigate() may be used only in the context of a <Router> component" error
359
-
360
- **Possible causes:**
361
- 1. Missing `BrowserRouter`
362
- 2. `BrowserRouter` placed incorrectly
363
- 3. `react-router-dom` being pre-bundled by Vite
364
-
365
- **Solution:**
366
- 1. **Add BrowserRouter** wrapping your app:
367
- ```tsx
368
- import { BrowserRouter } from 'react-router-dom';
369
-
370
- <BrowserRouter>
371
- <UnifiedAuthProvider>
372
- <App />
373
- </UnifiedAuthProvider>
374
- </BrowserRouter>
375
- ```
376
-
377
- 2. **Update Vite config**:
378
- ```typescript
379
- resolve: {
380
- dedupe: ['react', 'react-dom', 'react-router-dom']
381
- },
382
- optimizeDeps: {
383
- exclude: ['react-router-dom']
384
- }
385
- ```
386
-
387
- 3. **Clear Vite cache** and restart
388
-
389
- ### Vite Configuration Issues
390
-
391
- **Issue:** React context mismatch errors, components can't find providers
392
-
393
- **Possible causes:**
394
- 1. `@jmruthers/pace-core` is being pre-bundled by Vite
395
- 2. Multiple React instances in the bundle
396
-
397
- **Solution:**
398
- 1. **Exclude pace-core from pre-bundling**:
399
- ```typescript
400
- optimizeDeps: {
401
- exclude: ['@jmruthers/pace-core']
402
- }
403
- ```
404
-
405
- 2. **Dedupe React dependencies**:
406
- ```typescript
407
- resolve: {
408
- dedupe: ['react', 'react-dom', 'react-router-dom']
409
- }
410
- ```
411
-
412
- 3. **Clear Vite cache**:
413
- ```bash
414
- rm -rf node_modules/.vite
415
- ```
416
-
417
- ### Custom Auth/RBAC Code Detected
418
-
419
- **Issue:** Custom `useAuth` hook or `PermissionGuard` component found
420
-
421
- **Solution:**
422
- 1. Remove your custom implementation
423
- 2. Import from pace-core:
424
- ```typescript
425
- import { useUnifiedAuth } from '@jmruthers/pace-core';
426
- import { PagePermissionGuard } from '@jmruthers/pace-core/rbac';
427
- ```
428
- 3. Update all usages - see [Migration Examples](#migrating-from-custom-code) below
429
-
430
- ### Duplicate Supabase Configuration
431
-
432
- **Issue:** Multiple `createClient` calls found
433
-
434
- **Solution:**
435
- 1. Create a single `supabase.ts` file:
436
- ```typescript
437
- // src/lib/supabase.ts
438
- export const supabase = createClient(url, key);
439
- ```
440
- 2. Remove all other `createClient` calls
441
- 3. Import from the shared location everywhere
442
-
443
- ### Unprotected Pages
444
-
445
- **Issue:** Route without PagePermissionGuard
446
-
447
- **Solution:**
448
- 1. Wrap all routes with PagePermissionGuard:
449
- ```tsx
450
- <PagePermissionGuard pageName="dashboard" operation="read">
451
- <Dashboard />
452
- </PagePermissionGuard>
453
- ```
454
- 2. Ensure pages exist in `rbac_app_pages` table
455
-
456
- ### Direct Supabase Auth Usage
457
-
458
- **Issue:** Direct `supabase.auth` calls detected
459
-
460
- **Solution:**
461
- 1. Use `useUnifiedAuth` hook instead:
462
- ```typescript
463
- const { signIn } = useUnifiedAuth();
464
- await signIn({ email, password });
465
- ```
466
- 2. Ensure `UnifiedAuthProvider` wraps your app
467
-
468
- ### RBAC Not Initialized
469
-
470
- **Issue:** `setupRBAC()` not called
471
-
472
- **Solution:**
473
- ```typescript
474
- // main.tsx - Must be called before rendering
475
- import { setupRBAC } from '@jmruthers/pace-core/rbac';
476
- setupRBAC(supabase);
477
- ```
478
-
479
- ## Migrating from Custom Code
480
-
481
- ### Migrating `useAuth` Hook
482
-
483
- **Before:**
484
- ```typescript
485
- // src/hooks/useAuth.ts
486
- export function useAuth() {
487
- const [user, setUser] = useState(null);
488
- // ... custom logic
489
- }
490
- ```
491
-
492
- **After:**
493
- ```typescript
494
- import { useUnifiedAuth } from '@jmruthers/pace-core';
495
- const { user } = useUnifiedAuth();
496
- ```
497
-
498
- ### Migrating `PermissionGuard` Component
499
-
500
- **Before:**
501
- ```tsx
502
- <PermissionGuard permission="read:users">
503
- <UsersPage />
504
- </PermissionGuard>
505
- ```
506
-
507
- **After:**
508
- ```tsx
509
- <PagePermissionGuard pageName="users" operation="read">
510
- <UsersPage />
511
- </PagePermissionGuard>
512
- ```
513
-
514
- ### Migrating `checkPermission` Utility
515
-
516
- **Before:**
517
- ```typescript
518
- const hasAccess = checkPermission(user, 'read:users');
519
- ```
520
-
521
- **After:**
522
- ```typescript
523
- import { isPermitted } from '@jmruthers/pace-core/rbac';
524
- const hasAccess = await isPermitted({
525
- userId: user.id,
526
- scope: { organisationId: org.id },
527
- permission: 'read:page.users'
528
- });
529
- ```
530
-
531
- ### Step-by-Step Migration Process
532
-
533
- 1. **Audit:** Run `npm run check:pace-core` to find all custom code
534
- 2. **Setup:** Ensure `setupRBAC()` is called and providers are configured
535
- 3. **Migrate:** Replace custom code with pace-core equivalents one component at a time
536
- 4. **Test:** Verify all auth flows and permission checks work
537
- 5. **Clean:** Remove custom files and update all imports
538
-
539
- ## Next Steps
540
-
541
- - [RBAC Troubleshooting](../troubleshooting.md) - General RBAC issues
542
- - [RBAC Quick Start](../quick-start.md) - Getting started with RBAC
543
- - [RBAC API Reference](../api-reference.md) - Complete API documentation
544
-
@@ -1,44 +0,0 @@
1
- # Architecture Standard
2
-
3
- ## Purpose
4
- Define the core architectural principles for pace-core so that components, APIs, RPCs, utilities, and documentation evolve consistently and sustainably.
5
-
6
- ## Principles
7
- - Composition over complexity
8
- - Separation of concerns
9
- - Domain-agnostic
10
- - Extensible, stable APIs
11
- - Secure by default
12
- - Performance-conscious
13
-
14
- ## Performance Requirements
15
- - **RLS policies must use helper functions** - Never use subqueries in RLS policies as they cause N+1 query patterns
16
- - **Database migrations must be tested** - Verify migrations don't cause query timeouts or performance degradation
17
- - **Monitor query performance** - Use EXPLAIN ANALYZE to verify RLS policies don't create expensive execution plans
18
-
19
- ## Boundaries
20
- ### In scope
21
- - UI primitives
22
- - Generic hooks
23
- - Shared API patterns
24
- - Error-handling conventions
25
- - RPC shape conventions
26
-
27
- ### Out of scope
28
- - App-specific domain logic
29
- - App-specific styling
30
- - Business workflows
31
-
32
- ## Precedence
33
- 1. Security Standard
34
- 2. API & RPC Standard
35
- 3. Component Standard
36
- 4. Code Style Standard
37
- 5. Testing Standard
38
- 6. Documentation Standard
39
-
40
- ## Cursor Checklist
41
- - Ensure changes fit boundaries
42
- - Do not introduce domain logic
43
- - Follow precedence ordering
44
- - Prefer additive changes
@@ -1,39 +0,0 @@
1
- # API & RPC Standard
2
-
3
- ## Naming
4
- - `<family>_<domain>_<verb>` pattern (e.g., `data_cake_dishes_list`, `app_cake_dish_create`)
5
- - `data_*` prefix for read operations (e.g., `data_file_reference_list`)
6
- - `app_*` prefix for write operations (e.g., `app_cake_dish_create`)
7
- - CRUD verbs only: create, read, update, delete, list, get
8
- - Bulk operations use `_bulk` suffix (e.g., `app_cake_dish_create_bulk`)
9
-
10
- ## Result Shape
11
- ```ts
12
- type ApiResult<T> =
13
- | { ok: true; data: T }
14
- | { ok: false; error: ApiError };
15
-
16
- type ApiError = {
17
- code: string;
18
- message: string;
19
- details?: object;
20
- };
21
- ```
22
-
23
- ## RPC Rules
24
- - Read RPCs never mutate
25
- - Write RPCs should be idempotent when possible
26
- - Never accept dynamic SQL
27
- - Must enforce RLS + tenant boundaries
28
- - Errors must be user-safe
29
-
30
- ## Deprecation Rules
31
- - Mark outdated RPCs with @deprecated
32
- - Retirement window: 2 stable releases
33
-
34
- ## Cursor Checklist
35
- - Enforce ApiResult shape
36
- - Follow naming rules
37
- - Do not bypass RLS
38
- - Avoid overlapping or redundant RPCs
39
- - Ensure idempotency for writes
@@ -1,32 +0,0 @@
1
- # Component Development Standard
2
-
3
- ## Principles
4
- - Stateless when possible
5
- - Composable structure
6
- - Accessible by default
7
- - Fully typed
8
- - Small surface area
9
-
10
- ## Architecture
11
- - UI primitives only
12
- - Never add domain logic
13
- - No data fetching inside components
14
- - Support controlled + uncontrolled usage
15
-
16
- ## Accessibility Checklist
17
- - Keyboard operable
18
- - Correct ARIA roles
19
- - Visible focus states
20
- - No inaccessible interactions
21
-
22
- ## Testing Requirements
23
- - Use React Testing Library
24
- - Test key interactions
25
- - Snapshot tests only for simple components
26
-
27
- ## Cursor Checklist
28
- - Do not add domain logic
29
- - Validate accessibility rules
30
- - Keep components small
31
- - Move non-UI logic to hooks
32
- - Enforce strict typings
@@ -1,32 +0,0 @@
1
- # TypeScript & Code Style Standard
2
-
3
- ## TypeScript Rules
4
- - No any
5
- - Prefer discriminated unions
6
- - Avoid assertions unless in escape hatches
7
- - Use ReadonlyArray where possible
8
- - Avoid boolean mode flags
9
-
10
- ## Naming Conventions
11
- - Hooks: useSomething
12
- - Providers: SomethingProvider
13
- - Utilities: camelCase
14
- - Components: PascalCase
15
-
16
- ## Preferred Patterns
17
- - Pure functions
18
- - Composition over inheritance
19
- - Early returns
20
- - Small private helpers
21
-
22
- ## Forbidden
23
- - Implicit any
24
- - Bloated components
25
- - Domain-specific types in pace-core
26
-
27
- ## Cursor Checklist
28
- - No any / unknown / unnecessary assertions
29
- - Convert flags into unions
30
- - Enforce naming rules
31
- - Extract large functions into helpers
32
- - Prevent domain types from leaking in