@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,331 +0,0 @@
1
- ---
2
- description: Enforce pace-core usage patterns and prevent custom solutions when pace-core provides functionality
3
- globs: ["src/**/*.{ts,tsx,js,jsx}"]
4
- alwaysApply: false
5
- paceCoreVersion: "0.6.x"
6
- rulesVersion: "2025-01-28"
7
- ---
8
- # pace-core Compliance Guide
9
-
10
- This guide ensures consuming apps use pace-core components, hooks, and utilities correctly, preventing duplication and maintaining consistency across the PACE suite.
11
-
12
- ## MUST: Use pace-core Instead of Custom Solutions
13
-
14
- **You MUST use pace-core components, hooks, and utilities when they exist.** Creating custom solutions duplicates functionality and breaks consistency.
15
-
16
- ### Components
17
-
18
- **MUST use pace-core components:**
19
- - `Button`, `Card`, `Input`, `Label`, `Textarea` - Basic UI components
20
- - `Dialog`, `Select`, `Tabs`, `Calendar`, `Toast`, `Tooltip` - Advanced UI components
21
- - `DataTable` - Complex data tables with RBAC integration
22
- - `Form`, `FormField`, `LoginForm` - Form components
23
- - `Header`, `Footer`, `PaceAppLayout` - Layout components
24
- - `FileUpload`, `FileDisplay` - Storage components
25
-
26
- **MUST NOT:**
27
- - Create custom button components when `Button` from pace-core exists
28
- - Use native HTML elements (`<button>`, `<input>`) when pace-core provides components
29
- - Import directly from `@radix-ui/*` - Use pace-core wrappers instead
30
- - Import directly from `lucide-react` - Use pace-core components that include icons
31
-
32
- **Example:**
33
- ```tsx
34
- // ❌ WRONG: <button className="btn">Click me</button>
35
- // ✅ CORRECT: import { Button } from '@jmruthers/pace-core'; <Button>Click me</Button>
36
- ```
37
-
38
- ### Hooks
39
-
40
- **MUST use pace-core hooks:**
41
- - `useUnifiedAuth`, `useEvents`, `useOrganisations` - Authentication and data
42
- - `usePermissions`, `useCan`, `useSecureSupabase` - RBAC hooks
43
- - `useToast`, `useDebounce`, `useZodForm` - Utility hooks
44
- - `useFileReference`, `useFileUpload` - File management hooks
45
-
46
- **MUST NOT:**
47
- - Create custom `useAuth` when `useUnifiedAuth` exists
48
- - Create custom `useToast` when pace-core provides it
49
- - Create custom `useDebounce` when pace-core provides it
50
- - Create custom form hooks when `useZodForm` exists
51
-
52
- **Example:**
53
- ```tsx
54
- // ❌ WRONG: Custom useDebounce hook implementation
55
- // ✅ CORRECT: import { useDebounce } from '@jmruthers/pace-core'; const debouncedValue = useDebounce(value, 500);
56
- ```
57
-
58
- ### Utilities
59
-
60
- **MUST use pace-core utilities:**
61
- - `cn` - Class name utility (replaces clsx/tailwind-merge)
62
- - `formatDate`, `formatTime`, `formatDateTime` - Date formatting
63
- - `formatCurrency`, `formatNumber`, `formatPercent` - Number formatting
64
- - `emailSchema`, `nameSchema`, `passwordSchema` - Validation schemas
65
- - `validateUserInput`, `sanitizeUserInput` - Input validation
66
-
67
- **MUST NOT:**
68
- - Create custom `formatDate` when pace-core provides it
69
- - Use `clsx` directly - Use `cn` from pace-core
70
- - Create custom validation when pace-core schemas exist
71
-
72
- **Example:**
73
- ```tsx
74
- // ❌ WRONG: Custom formatDate implementation
75
- // ✅ CORRECT: import { formatDate } from '@jmruthers/pace-core'; const formatted = formatDate(date);
76
- ```
77
-
78
- ## MUST: Use Secure Supabase Client
79
-
80
- **You MUST use `useSecureSupabase()` for all database operations.** Never use the base Supabase client directly.
81
-
82
- **CRITICAL SECURITY REQUIREMENT:** Using `createClient()` from `@supabase/supabase-js` directly bypasses organisation context enforcement and RLS policies, which can lead to:
83
- - Cross-organisation data access
84
- - Security vulnerabilities
85
- - Data leakage between organisations
86
-
87
- ```tsx
88
- // ❌ WRONG: Direct Supabase client creation
89
- import { createClient } from '@supabase/supabase-js';
90
- const supabase = createClient(url, key);
91
- // This bypasses organisation context and RLS policies!
92
-
93
- // ✅ CORRECT: Use secure Supabase client
94
- import { useSecureSupabase } from '@jmruthers/pace-core/rbac';
95
- const secureSupabase = useSecureSupabase();
96
- // Organisation context is automatically enforced
97
- ```
98
-
99
- ### Detection and Enforcement
100
-
101
- pace-core provides multiple layers of protection:
102
-
103
- 1. **ESLint Rule**: The `no-direct-supabase-client` rule detects `createClient` calls and reports errors
104
- 2. **Runtime Warnings**: Development mode warnings when insecure clients are detected
105
- 3. **Type Safety**: Use `isSecureClient()` to verify clients are secure
106
-
107
- ```tsx
108
- // Verify client is secure (optional, but recommended)
109
- import { isSecureClient, warnIfInsecureClient } from '@jmruthers/pace-core/rbac/utils/clientSecurity';
110
-
111
- const supabase = useSecureSupabase();
112
- warnIfInsecureClient(supabase, 'MyComponent'); // Warns in dev if insecure
113
-
114
- if (isSecureClient(supabase)) {
115
- // Client is secure, safe to use
116
- }
117
- ```
118
-
119
- ## MUST: Setup RBAC Before Use
120
-
121
- **You MUST call `setupRBAC()` before any RBAC usage.** This is non-negotiable.
122
-
123
- ```tsx
124
- // main.tsx - MUST be first
125
- import { setupRBAC } from '@jmruthers/pace-core/rbac';
126
- setupRBAC(supabase);
127
- // Then render app
128
- ```
129
-
130
- ## MUST: Read Documentation Before Using Components
131
-
132
- **You MUST read pace-core component documentation before using any component.** Never guess about props, usage patterns, or behavior.
133
-
134
- ### Where to Find Documentation
135
-
136
- **Component API Reference:**
137
- - Location: `node_modules/@jmruthers/pace-core/docs/api-reference/components.md`
138
- - Or: Check pace-core repository `packages/core/docs/api-reference/components.md`
139
- - Contains: Complete prop definitions, type information, usage examples
140
-
141
- **Implementation Guides:**
142
- - Location: `node_modules/@jmruthers/pace-core/docs/implementation-guides/`
143
- - Contains: Detailed guides for complex components like DataTable, Forms, etc.
144
- - Examples:
145
- - `data-tables.md` - DataTable component guide
146
- - `forms.md` - Form components guide
147
- - `file-upload-storage.md` - FileUpload/FileDisplay guide
148
-
149
- **Detailed API Documentation:**
150
- - Location: `node_modules/@jmruthers/pace-core/docs/api/`
151
- - Contains: In-depth API documentation for all exports
152
-
153
- **Quick Reference:**
154
- - Location: `node_modules/@jmruthers/pace-core/docs/getting-started/quick-reference.md`
155
- - Contains: Quick lookup for common patterns
156
-
157
- ### How to Find Component-Specific Docs
158
-
159
- 1. **Check API Reference First:**
160
- ```bash
161
- # In your consuming app
162
- cat node_modules/@jmruthers/pace-core/docs/api-reference/components.md
163
- ```
164
-
165
- 2. **Search Implementation Guides:**
166
- - Look for component name in `implementation-guides/` directory
167
- - Complex components have dedicated guides
168
-
169
- 3. **Check Type Definitions:**
170
- ```tsx
171
- // Import and check TypeScript types
172
- import type { DataTableProps } from '@jmruthers/pace-core';
173
- // Hover over type to see prop definitions
174
- ```
175
-
176
- 4. **Use IDE IntelliSense:**
177
- - TypeScript types provide inline documentation
178
- - Hover over component name to see prop types
179
- - Use autocomplete to discover available props
180
-
181
- ### MUST NOT: Guess About Props or Usage
182
-
183
- **❌ WRONG - Guessing props:**
184
- ```tsx
185
- <DataTable data={data} columns={columns} /> // Missing required rbac prop
186
- ```
187
-
188
- **✅ CORRECT - Read documentation first:**
189
- ```tsx
190
- import { DataTable } from '@jmruthers/pace-core';
191
- <DataTable data={data} columns={columns} rbac={{ pageName: 'users' }} features={{ search: true }} />
192
- ```
193
-
194
- ### Documentation Checklist
195
-
196
- Before using any pace-core component:
197
- - [ ] Read component API reference
198
- - [ ] Check for implementation guide if component is complex
199
- - [ ] Review TypeScript types for prop definitions
200
- - [ ] Check examples in documentation
201
- - [ ] Verify required vs optional props
202
- - [ ] Understand component behavior and limitations
203
-
204
- ### Common Documentation Locations
205
-
206
- | Component Type | Documentation Location |
207
- |----------------|----------------------|
208
- | Basic UI (Button, Card, etc.) | `api-reference/components.md` |
209
- | DataTable | `implementation-guides/data-tables.md` |
210
- | Forms | `implementation-guides/forms.md` |
211
- | RBAC Components | `rbac/getting-started.md` |
212
- | File Upload/Display | `implementation-guides/file-upload-storage.md` |
213
- | Hooks | `api-reference/hooks.md` |
214
- | Utilities | `api-reference/utilities.md` |
215
-
216
- ## SHOULD: Check pace-core Before Creating New Components
217
-
218
- **Before creating a new component, hook, or utility:**
219
-
220
- 1. Check pace-core exports: `@jmruthers/pace-core`
221
- 2. Review pace-core documentation
222
- 3. Check `core-usage-manifest.json` for available exports
223
- 4. Search pace-core source if needed
224
-
225
- **If pace-core doesn't provide what you need:**
226
- - Consider if it should be added to pace-core (for shared use)
227
- - Document why custom solution is needed
228
- - Follow pace-core patterns for consistency
229
-
230
- ## MUST: Use pace-core Providers
231
-
232
- **You MUST wrap your app with required providers:**
233
-
234
- ```tsx
235
- import { UnifiedAuthProvider, OrganisationProvider } from '@jmruthers/pace-core';
236
- <UnifiedAuthProvider supabaseClient={supabase} appName="Your App">
237
- <OrganisationProvider>{/* Your app */}</OrganisationProvider>
238
- </UnifiedAuthProvider>
239
- ```
240
-
241
- ## MUST: Import Core Styles
242
-
243
- **You MUST import pace-core styles:**
244
-
245
- ```tsx
246
- // main.tsx or App.tsx
247
- import '@jmruthers/pace-core/styles/core.css';
248
- ```
249
-
250
- ## MUST NOT: Use Inline Styles
251
-
252
- **You MUST NOT use inline styles (`style={{...}}`).** All styling MUST come from pace-core components and Tailwind classes.
253
-
254
- ### Why No Inline Styles
255
-
256
- - Inline styles override pace-core component styles
257
- - Inline styles break consistency across the PACE suite
258
- - Inline styles are harder to maintain and update
259
- - Inline styles don't benefit from theme variables and design system
260
-
261
- ### Use pace-core Components for Styling
262
-
263
- **All styling MUST come from:**
264
- 1. **pace-core components** - Components already have correct styling
265
- 2. **Tailwind utility classes** - Use Tailwind classes for layout and spacing
266
- 3. **Semantic classes** - Use semantic classes from pace-core (e.g., `bg-background`, `text-foreground`)
267
-
268
- **MUST NOT:**
269
- - Use `style={{...}}` prop
270
- - Use inline CSS strings
271
- - Override component styles with inline styles
272
- - Create custom CSS for styling that pace-core provides
273
-
274
- **Example:**
275
- ```tsx
276
- // ❌ WRONG: <div style={{ backgroundColor: 'blue' }}> or <Button style={{...}}>
277
- // ✅ CORRECT: <Card className="bg-main-500 p-4"> or <Button variant="default"> or <div className="flex gap-4">
278
- ```
279
-
280
- ### When Tailwind Classes Are Acceptable
281
-
282
- **Tailwind classes are acceptable for:**
283
- - Layout (flex, grid, positioning)
284
- - Spacing (margin, padding, gap)
285
- - Responsive design (breakpoints)
286
- - Layout-specific styling not provided by pace-core components
287
-
288
- **Tailwind classes MUST NOT:**
289
- - Override pace-core component internal styles
290
- - Duplicate styling that pace-core components already provide
291
- - Use standard Tailwind colors (use `main-*`, `sec-*`, `acc-*` namespaces)
292
-
293
- ### Styling Checklist
294
-
295
- Before adding any styling:
296
- - [ ] Check if pace-core component provides the styling you need
297
- - [ ] Use pace-core component variants/props for styling
298
- - [ ] Use Tailwind classes only for layout/spacing
299
- - [ ] Never use inline `style={{...}}` prop
300
- - [ ] Never override component styles with inline styles
301
- - [ ] Use semantic classes (`bg-background`, `text-foreground`) when available
302
-
303
- ## SHOULD: Use pace-core Patterns
304
-
305
- **Follow pace-core patterns for consistency:**
306
- - Component structure and composition
307
- - Error handling patterns
308
- - Loading state patterns
309
- - Form validation patterns
310
- - RBAC permission checking patterns
311
-
312
- ## Common Mistakes to Avoid
313
-
314
- 1. **Using inline styles** - Never use `style={{...}}`, use pace-core components and Tailwind classes
315
- 2. **Guessing component props** - Always read documentation first
316
- 3. **Creating duplicate components** - Always check pace-core first
317
- 4. **Using base Supabase client** - Always use `useSecureSupabase()`
318
- 5. **Missing RBAC setup** - Always call `setupRBAC()` first
319
- 6. **Missing providers** - Always wrap with required providers
320
- 7. **Missing styles** - Always import core.css
321
- 8. **Direct library imports** - Use pace-core wrappers instead
322
-
323
- ## Reference
324
-
325
- - **pace-core Exports**: See `pace-core-exports.mdc` for complete export reference
326
- - **RBAC Implementation**: See `rbac-implementation.mdc` for RBAC patterns
327
- - **Component Documentation**:
328
- - API Reference: `node_modules/@jmruthers/pace-core/docs/api-reference/components.md`
329
- - Implementation Guides: `node_modules/@jmruthers/pace-core/docs/implementation-guides/`
330
- - Detailed API: `node_modules/@jmruthers/pace-core/docs/api/`
331
- - **Always read documentation before using components** - Never guess about props or usage
@@ -1,244 +0,0 @@
1
- ---
2
- description: Enforce compliance with all pace-core standards across architecture, API, components, code style, security, testing, and RBAC/RLS
3
- globs: ["src/**/*.{ts,tsx,js,jsx}", "supabase/migrations/**/*.sql"]
4
- alwaysApply: false
5
- paceCoreVersion: "0.6.x"
6
- rulesVersion: "2025-01-28"
7
- ---
8
- # Standards Compliance Guide
9
-
10
- This guide ensures consuming apps comply with all pace-core standards. Follow these standards to maintain quality, security, and consistency.
11
-
12
- ## Architecture Standard
13
-
14
- ### MUST: Follow Architecture Principles
15
-
16
- **MUST adhere to:**
17
- - Composition over complexity
18
- - Separation of concerns
19
- - Domain-agnostic design
20
- - Extensible, stable APIs
21
- - Secure by default
22
- - Performance-conscious
23
-
24
- ### MUST: Use Helper Functions in RLS Policies
25
-
26
- **RLS policies MUST use helper functions, NEVER subqueries.**
27
-
28
- ```sql
29
- -- ❌ WRONG: Subquery in RLS policy (causes N+1 queries)
30
- CREATE POLICY rbac_select_users ON users FOR SELECT USING (
31
- organisation_id IN (SELECT organisation_id FROM organisation_memberships WHERE user_id = auth.uid())
32
- );
33
-
34
- -- ✅ CORRECT: Helper function with STABLE SECURITY DEFINER
35
- CREATE OR REPLACE FUNCTION get_user_organisation_ids() RETURNS uuid[] LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO public AS $$
36
- BEGIN RETURN ARRAY(SELECT organisation_id FROM organisation_memberships WHERE user_id = get_effective_user_id()); END;
37
- $$;
38
- CREATE POLICY rbac_select_users ON users FOR SELECT USING (organisation_id = ANY(get_user_organisation_ids()));
39
- ```
40
-
41
- ### MUST: Test Database Migrations
42
-
43
- **MUST verify migrations don't cause query timeouts or performance degradation.**
44
-
45
- ## API & RPC Standard
46
-
47
- ### MUST: Follow RPC Naming Convention
48
-
49
- **RPCs MUST follow pattern: `<family>_<domain>_<verb>`**
50
-
51
- - `data_*` prefix for read operations: `data_cake_dishes_list`, `data_file_reference_list`
52
- - `app_*` prefix for write operations: `app_cake_dish_create`, `app_cake_dish_update`
53
- - CRUD verbs only: `create`, `read`, `update`, `delete`, `list`, `get`
54
- - Bulk operations: `_bulk` suffix (e.g., `app_cake_dish_create_bulk`)
55
-
56
- ```sql
57
- -- ✅ CORRECT: data_cake_dishes_list, app_cake_dish_create, app_cake_dish_create_bulk
58
- -- ❌ WRONG: getDishes, create_dish (wrong naming pattern)
59
- ```
60
-
61
- ### MUST: Use ApiResult Shape
62
-
63
- **All RPCs MUST return ApiResult shape:**
64
-
65
- ```typescript
66
- type ApiResult<T> = { ok: true; data: T } | { ok: false; error: ApiError };
67
- type ApiError = { code: string; message: string; details?: object };
68
- ```
69
-
70
- ### MUST: Enforce RLS in RPCs
71
-
72
- **RPCs MUST enforce RLS and tenant boundaries.** Never bypass RLS.
73
-
74
- ### SHOULD: Make Write RPCs Idempotent
75
-
76
- **Write RPCs SHOULD be idempotent when possible.**
77
-
78
- ## Component Standard
79
-
80
- ### MUST: Follow Component Principles
81
-
82
- **Components MUST:**
83
- - Be stateless when possible
84
- - Use composable structure
85
- - Be accessible by default
86
- - Be fully typed
87
- - Have small surface area
88
-
89
- ### MUST NOT: Add Domain Logic to Components
90
-
91
- **Components MUST NOT:**
92
- - Include domain-specific logic
93
- - Fetch data directly (use hooks/services)
94
- - Include business workflows
95
-
96
- ### MUST: Ensure Accessibility
97
-
98
- **Components MUST:**
99
- - Be keyboard operable
100
- - Have correct ARIA roles
101
- - Have visible focus states
102
- - Avoid inaccessible interactions
103
-
104
- ## Code Style Standard
105
-
106
- ### MUST: Follow TypeScript Rules
107
-
108
- **MUST:**
109
- - Use strict mode (`strict: true` in tsconfig)
110
- - Prefer discriminated unions
111
- - Use ReadonlyArray where possible
112
- - Avoid boolean mode flags (use unions instead)
113
-
114
- **MUST NOT:**
115
- - Use `any` (use `unknown` if type is truly unknown)
116
- - Use implicit any
117
- - Use unnecessary type assertions
118
-
119
- ### MUST: Follow Naming Conventions
120
-
121
- - Hooks: `useSomething`
122
- - Providers: `SomethingProvider`
123
- - Utilities: `camelCase`
124
- - Components: `PascalCase`
125
-
126
- ### SHOULD: Use Preferred Patterns
127
-
128
- **SHOULD:**
129
- - Use pure functions
130
- - Prefer composition over inheritance
131
- - Use early returns
132
- - Extract large functions into small helpers
133
-
134
- ## Security Standard
135
-
136
- ### MUST: Never Bypass RLS
137
-
138
- **MUST enforce RLS on all tables.** Never bypass RLS policies.
139
-
140
- ### MUST: Validate All Inputs
141
-
142
- **MUST validate all inputs using Zod schemas or similar.**
143
-
144
- ### MUST: Sanitize Logs
145
-
146
- **MUST NOT log:**
147
- - Passwords
148
- - Tokens
149
- - Sensitive data (PII)
150
-
151
- **MAY log:**
152
- - IDs
153
- - Non-PII metadata
154
-
155
- ### MUST: Use Safe Error Messaging
156
-
157
- **MUST NOT expose internal details in error messages.**
158
-
159
- ### MUST: Use Helper Functions in RLS
160
-
161
- **RLS policies MUST use STABLE SECURITY DEFINER helper functions:**
162
- - `STABLE` - Results consistent within transaction
163
- - `SECURITY DEFINER` - Bypass RLS to avoid recursion
164
- - `SET search_path TO 'public'` - Prevent search path injection
165
-
166
- ## Testing Standard
167
-
168
- ### MUST: Meet Coverage Requirements
169
-
170
- **MUST achieve:**
171
- - ≥90% coverage for utils & hooks
172
- - ≥70% coverage for components
173
-
174
- ### MUST: Use React Testing Library
175
-
176
- **MUST use React Testing Library + userEvent for component tests.**
177
-
178
- ### SHOULD: Colocate Tests
179
-
180
- **Tests SHOULD be colocated: `*.test.ts` or `*.test.tsx`**
181
-
182
- ### SHOULD: Test Critical Paths
183
-
184
- **SHOULD test:**
185
- - Key user interactions
186
- - Error handling
187
- - Edge cases
188
- - Critical business logic
189
-
190
- ## RBAC & RLS Standard
191
-
192
- ### MUST: Use Helper Functions
193
-
194
- **All RLS policies MUST use helper functions with:**
195
- - `STABLE` attribute
196
- - `SECURITY DEFINER` attribute
197
- - `SET search_path TO 'public'`
198
-
199
- ### MUST: Follow Policy Naming
200
-
201
- **RLS policies MUST follow pattern: `rbac_{operation}_{table_name}_{scope}`**
202
-
203
- Example: `rbac_select_users_organisation`
204
-
205
- ### MUST: Include Organisation Context
206
-
207
- **RLS policies MUST include `organisation_id` for multi-tenant isolation.**
208
-
209
- ### MUST: Include Super Admin Checks
210
-
211
- **RLS policies SHOULD include super admin checks where appropriate.**
212
-
213
- ## Standards Precedence
214
-
215
- When standards conflict, follow this order:
216
- 1. Security Standard (highest priority)
217
- 2. API & RPC Standard
218
- 3. Component Standard
219
- 4. Code Style Standard
220
- 5. Testing Standard
221
- 6. Documentation Standard
222
-
223
- ## Compliance Checklist
224
-
225
- Before committing code, verify:
226
- - [ ] RLS policies use helper functions (no subqueries)
227
- - [ ] RPCs follow naming convention
228
- - [ ] Components are accessible and typed
229
- - [ ] No `any` types used
230
- - [ ] Inputs are validated
231
- - [ ] Tests meet coverage requirements
232
- - [ ] No sensitive data in logs
233
- - [ ] Error messages are safe
234
-
235
- ## Reference
236
-
237
- See `packages/core/docs/standards/` for complete standards documentation:
238
- - 01-architecture-standard.md
239
- - 02-api-and-rpc-standard.md
240
- - 03-component-standard.md
241
- - 04-code-style-standard.md
242
- - 05-security-standard.md
243
- - 06-testing-and-docs-standard.md
244
- - 07-rbac-and-rls-standard.md