@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,309 +0,0 @@
1
- ---
2
- description: Enforce code quality standards including TypeScript, ESLint, formatting, performance, and accessibility
3
- globs: ["src/**/*.{ts,tsx,js,jsx}"]
4
- alwaysApply: false
5
- paceCoreVersion: "0.6.x"
6
- rulesVersion: "2025-01-28"
7
- ---
8
- # Code Quality Guide
9
-
10
- This guide enforces code quality standards to ensure maintainable, performant, and accessible code.
11
-
12
- ## TypeScript Standards
13
-
14
- ### MUST: Use Strict Mode
15
-
16
- **TypeScript MUST use strict mode:**
17
-
18
- ```json
19
- // tsconfig.json
20
- {
21
- "compilerOptions": {
22
- "strict": true,
23
- "noImplicitAny": true,
24
- "strictNullChecks": true,
25
- "strictFunctionTypes": true,
26
- "strictBindCallApply": true,
27
- "strictPropertyInitialization": true,
28
- "noImplicitThis": true,
29
- "alwaysStrict": true
30
- }
31
- }
32
- ```
33
-
34
- ### MUST NOT: Use `any`
35
-
36
- **MUST NOT use `any` type. Use `unknown` if type is truly unknown:**
37
-
38
- ```tsx
39
- // ❌ WRONG: Using any
40
- function processData(data: any) { return data.value; }
41
-
42
- // ✅ CORRECT: Using unknown with type guard or proper types
43
- function processData(data: unknown) {
44
- if (typeof data === 'object' && data !== null && 'value' in data) {
45
- return (data as { value: string }).value;
46
- }
47
- throw new Error('Invalid data');
48
- }
49
- // Or: interface Data { value: string; } function processData(data: Data) { return data.value; }
50
- ```
51
-
52
- ### MUST: Use Discriminated Unions
53
-
54
- **MUST use discriminated unions instead of boolean flags:**
55
-
56
- ```tsx
57
- // ❌ WRONG: Boolean flags (confusing: what if both are true?)
58
- interface User { isAdmin: boolean; isGuest: boolean; }
59
-
60
- // ✅ CORRECT: Discriminated union
61
- type User = { type: 'admin'; permissions: Permission[] } | { type: 'guest'; limitedAccess: boolean } | { type: 'user'; role: UserRole };
62
- ```
63
-
64
- ### SHOULD: Use ReadonlyArray
65
-
66
- **SHOULD use ReadonlyArray for immutable arrays:**
67
-
68
- ```tsx
69
- // ✅ CORRECT - ReadonlyArray
70
- function processItems(items: ReadonlyArray<Item>) {
71
- // Can't mutate items
72
- return items.map(item => transform(item));
73
- }
74
- ```
75
-
76
- ## ESLint Configuration
77
-
78
- ### MUST: Use pace-core ESLint Config
79
-
80
- **MUST extend pace-core ESLint configuration:**
81
-
82
- ```javascript
83
- // eslint.config.js
84
- import paceCoreConfig from '@jmruthers/pace-core/eslint-config';
85
-
86
- export default [
87
- ...paceCoreConfig,
88
- // Your additional config
89
- ];
90
- ```
91
-
92
- ### MUST: Fix ESLint Errors
93
-
94
- **MUST fix all ESLint errors before committing:**
95
-
96
- ```bash
97
- npm run lint
98
- npm run lint:fix # Auto-fix where possible
99
- ```
100
-
101
- ## Code Formatting
102
-
103
- ### MUST: Use Consistent Formatting
104
-
105
- **MUST use Prettier or equivalent for consistent formatting:**
106
-
107
- ```json
108
- // .prettierrc
109
- {
110
- "semi": true,
111
- "singleQuote": true,
112
- "tabWidth": 2,
113
- "trailingComma": "es5",
114
- "printWidth": 100
115
- }
116
- ```
117
-
118
- ### MUST: Format Before Committing
119
-
120
- **MUST format code before committing:**
121
-
122
- ```bash
123
- npm run format
124
- # Or use pre-commit hook
125
- ```
126
-
127
- ## Performance Considerations
128
-
129
- ### SHOULD: Optimize Re-renders
130
-
131
- **SHOULD use React.memo, useMemo, useCallback appropriately:**
132
-
133
- ```tsx
134
- // ✅ CORRECT: Memoize expensive computations, callbacks, and components
135
- const expensiveValue = useMemo(() => computeExpensiveValue(data), [data]);
136
- const handleClick = useCallback(() => doSomething(id), [id]);
137
- const ExpensiveComponent = React.memo(({ data }) => <div>{/* ... */}</div>);
138
- ```
139
-
140
- ### SHOULD: Avoid Unnecessary Re-renders
141
-
142
- **SHOULD avoid causing unnecessary re-renders:**
143
-
144
- ```tsx
145
- // ❌ WRONG: New object on every render (causes unnecessary re-renders)
146
- function Component({ items }) { const config = { items, enabled: true }; return <Child config={config} />; }
147
-
148
- // ✅ CORRECT: Memoize object
149
- function Component({ items }) {
150
- const config = useMemo(() => ({ items, enabled: true }), [items]);
151
- return <Child config={config} />;
152
- }
153
- ```
154
-
155
- ### SHOULD: Lazy Load Heavy Components
156
-
157
- **SHOULD lazy load heavy components:**
158
-
159
- ```tsx
160
- // ✅ CORRECT: Lazy load heavy components
161
- import { lazy, Suspense } from 'react';
162
- const HeavyComponent = lazy(() => import('./HeavyComponent'));
163
- function App() {
164
- return <Suspense fallback={<Loading />}><HeavyComponent /></Suspense>;
165
- }
166
- ```
167
-
168
- ## Accessibility Requirements
169
-
170
- ### MUST: Use Semantic HTML
171
-
172
- **MUST use semantic HTML elements:**
173
-
174
- ```tsx
175
- // ❌ WRONG: Non-semantic (<div onClick={...}>)
176
- // ✅ CORRECT: Semantic HTML (<button onClick={...}>)
177
- ```
178
-
179
- ### MUST: Provide ARIA Labels
180
-
181
- **MUST provide ARIA labels for interactive elements:**
182
-
183
- ```tsx
184
- // ✅ CORRECT: Provide ARIA labels for interactive elements
185
- <button aria-label="Close dialog">×</button>
186
- <input aria-label="Search" type="search" />
187
- ```
188
-
189
- ### MUST: Ensure Keyboard Navigation
190
-
191
- **MUST ensure all interactive elements are keyboard accessible:**
192
-
193
- ```tsx
194
- // ✅ CORRECT: Ensure keyboard navigation (Enter or Space key)
195
- <button onClick={handleClick} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleClick(); }}>Click me</button>
196
- ```
197
-
198
- ### MUST: Provide Focus Indicators
199
-
200
- **MUST provide visible focus indicators:**
201
-
202
- ```tsx
203
- // ✅ CORRECT: Provide visible focus indicators
204
- <button className="focus:outline-none focus:ring-2 focus:ring-main-500">Click me</button>
205
- ```
206
-
207
- ## Code Review Checklist
208
-
209
- **Before submitting code for review, verify:**
210
-
211
- - [ ] TypeScript strict mode enabled
212
- - [ ] No `any` types used
213
- - [ ] ESLint passes with no errors
214
- - [ ] Code is formatted consistently
215
- - [ ] Performance optimizations applied where needed
216
- - [ ] Accessibility requirements met
217
- - [ ] Semantic HTML used
218
- - [ ] ARIA labels provided
219
- - [ ] Keyboard navigation works
220
- - [ ] Focus indicators visible
221
- - [ ] Code is readable and maintainable
222
- - [ ] Comments explain "why", not "what"
223
-
224
- ## Code Complexity
225
-
226
- ### SHOULD: Keep Functions Small
227
-
228
- **Functions SHOULD be small and focused:**
229
-
230
- ```tsx
231
- // ❌ WRONG: Large function (100+ lines, multiple responsibilities)
232
- function processUserData(user) { /* 100+ lines of logic */ }
233
-
234
- // ✅ CORRECT: Small, focused functions
235
- function validateUser(user: User): ValidationResult { /* Validation logic */ }
236
- function transformUser(user: User): TransformedUser { /* Transformation logic */ }
237
- function processUserData(user: User) {
238
- const validation = validateUser(user);
239
- if (!validation.valid) return validation;
240
- return transformUser(user);
241
- }
242
- ```
243
-
244
- ### SHOULD: Limit Cyclomatic Complexity
245
-
246
- **Functions SHOULD have low cyclomatic complexity (< 10):**
247
-
248
- ```tsx
249
- // ❌ WRONG: High complexity (many nested conditions)
250
- function processData(data) { if (condition1) { if (condition2) { if (condition3) { /* ... */ } } } }
251
-
252
- // ✅ CORRECT: Lower complexity (early returns)
253
- function processData(data) { if (!condition1) return; if (!condition2) return; if (!condition3) return; /* Process */ }
254
- ```
255
-
256
- ## Error Handling
257
-
258
- ### MUST: Handle Errors Gracefully
259
-
260
- **MUST handle errors and provide user feedback:**
261
-
262
- ```tsx
263
- // ✅ CORRECT: Handle errors gracefully with user feedback
264
- try {
265
- const data = await fetchData();
266
- setData(data);
267
- } catch (error) {
268
- logger.error('Failed to fetch data', error);
269
- toast.error('Failed to load data. Please try again.');
270
- }
271
- ```
272
-
273
- ### MUST: Use Type-Safe Error Handling
274
-
275
- **MUST use type-safe error handling:**
276
-
277
- ```tsx
278
- // ✅ CORRECT: Type-safe error handling
279
- function isApiError(error: unknown): error is ApiError {
280
- return typeof error === 'object' && error !== null && 'code' in error && 'message' in error;
281
- }
282
- try {
283
- await apiCall();
284
- } catch (error) {
285
- if (isApiError(error)) handleApiError(error);
286
- else handleUnknownError(error);
287
- }
288
- ```
289
-
290
- ## Code Quality Checklist
291
-
292
- Before committing, verify:
293
- - [ ] TypeScript strict mode enabled
294
- - [ ] No `any` types
295
- - [ ] ESLint passes
296
- - [ ] Code formatted
297
- - [ ] Performance optimized
298
- - [ ] Accessible (semantic HTML, ARIA, keyboard)
299
- - [ ] Functions are small and focused
300
- - [ ] Error handling in place
301
- - [ ] Code is readable
302
- - [ ] Comments explain "why"
303
-
304
- ## Reference
305
-
306
- - TypeScript Handbook: https://www.typescriptlang.org/docs/
307
- - ESLint Rules: pace-core eslint-config
308
- - React Performance: https://react.dev/learn/render-and-commit
309
- - Web Accessibility: https://www.w3.org/WAI/
@@ -1,214 +0,0 @@
1
- ---
2
- description: Enforce tech stack compliance including Tailwind v4, React 19+, Supabase, and other required technologies
3
- globs: ["src/**/*.{ts,tsx,js,jsx,css}", "*.config.{ts,js}"]
4
- alwaysApply: false
5
- paceCoreVersion: "0.6.x"
6
- rulesVersion: "2025-01-28"
7
- ---
8
- # Tech Stack Compliance Guide
9
-
10
- This guide ensures consuming apps use the correct versions and patterns for all technologies in the PACE stack.
11
-
12
- ## Tailwind CSS v4
13
-
14
- ### MUST: Use Tailwind v4 CSS-First Approach
15
-
16
- **MUST use Tailwind v4 CSS-first syntax, NOT v3 patterns:**
17
-
18
- ```css
19
- /* ✅ CORRECT: Tailwind v4 CSS-first (@import 'tailwindcss'; @theme { ... }) */
20
- /* ❌ WRONG: Tailwind v3 (@tailwind base/components/utilities directives) */
21
- ```
22
-
23
- ### MUST NOT: Use Bracket Syntax
24
-
25
- **MUST NOT use bracket syntax like `bg-[oklch(...)]`. Map everything through theme variables:**
26
-
27
- ```tsx
28
- // ❌ WRONG: Bracket syntax (bg-[oklch(...)])
29
- // ✅ CORRECT: Theme variable (bg-main-500)
30
- ```
31
-
32
- ### MUST: Use Custom Color Namespaces
33
-
34
- **MUST use custom color namespaces:**
35
- - `main-*` for primary colors (green, emerald, teal, cyan, sky, blue)
36
- - `sec-*` for secondary colors (indigo, violet, purple, fuchsia, slate, gray, zinc, neutral, stone)
37
- - `acc-*` for accent colors (red, orange, amber, yellow, lime, pink, rose)
38
-
39
- ```tsx
40
- // ✅ CORRECT: Custom namespaces (main-*, sec-*, acc-*)
41
- // ❌ WRONG: Standard Tailwind colors (blue-*, gray-*, red-*)
42
- ```
43
-
44
- ### MUST: Use Semantic Classes
45
-
46
- **MUST use semantic classes mapped in index.css:**
47
-
48
- ```tsx
49
- // ✅ CORRECT - Semantic classes
50
- <div className="bg-background text-foreground">
51
-
52
- // ❌ WRONG - Direct color classes (unless necessary)
53
- <div className="bg-main-50 text-main-950">
54
- ```
55
-
56
- ## React 19+
57
-
58
- ### MUST: Use React 19+ Features
59
-
60
- **MUST use React 19+ patterns:**
61
-
62
- ```tsx
63
- // ✅ CORRECT: React 19+ features (Suspense, useTransition, etc.)
64
- import { Suspense, useTransition } from 'react';
65
- function App() {
66
- const [isPending, startTransition] = useTransition();
67
- return <Suspense fallback={<Loading />}><Component /></Suspense>;
68
- }
69
- ```
70
-
71
- ### MUST: Use Functional Components
72
-
73
- **MUST use functional components with hooks exclusively:**
74
-
75
- ```tsx
76
- // ✅ CORRECT: Functional components with hooks
77
- function MyComponent() { const [state, setState] = useState(); return <div>...</div>; }
78
-
79
- // ❌ WRONG: Class components
80
- ```
81
-
82
- ## Supabase
83
-
84
- ### MUST: Use Secure Supabase Client
85
-
86
- **MUST use `useSecureSupabase()` for all database operations:**
87
-
88
- ```tsx
89
- // ✅ CORRECT: useSecureSupabase() from '@jmruthers/pace-core/rbac'
90
- // ❌ WRONG: createClient() from '@supabase/supabase-js' (base client)
91
- ```
92
-
93
- ### MUST: Enforce RLS
94
-
95
- **MUST ensure RLS is enabled on all tables. Never bypass RLS.**
96
-
97
- ### SHOULD: Use RPC Functions
98
-
99
- **SHOULD use RPC functions for complex queries:**
100
-
101
- ```tsx
102
- // ✅ CORRECT: RPC functions for complex queries
103
- const { data } = await secureSupabase.rpc('data_events_list', { organisation_id: orgId });
104
-
105
- // ❌ AVOID: Complex client-side queries with many joins
106
- ```
107
-
108
- ## TanStack Query
109
-
110
- ### MUST: Use TanStack Query for Server State
111
-
112
- **MUST use TanStack Query for all server state management:**
113
-
114
- ```tsx
115
- // ✅ CORRECT: TanStack Query for server state
116
- import { useQuery, useMutation } from '@tanstack/react-query';
117
- const { data, isLoading } = useQuery({ queryKey: ['events', orgId], queryFn: () => fetchEvents(orgId) });
118
-
119
- // ❌ WRONG: useState + useEffect for server state
120
- ```
121
-
122
- ### SHOULD: Configure Query Client
123
-
124
- **SHOULD configure QueryClient with appropriate defaults:**
125
-
126
- ```tsx
127
- // ✅ CORRECT: Configure QueryClient with appropriate defaults (staleTime, cacheTime, retry)
128
- const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5 * 60 * 1000, cacheTime: 10 * 60 * 1000, retry: 1 } } });
129
- ```
130
-
131
- ## React Hook Form + Zod
132
-
133
- ### MUST: Use React Hook Form with Zod
134
-
135
- **MUST use React Hook Form with Zod for all forms:**
136
-
137
- ```tsx
138
- // ✅ CORRECT: React Hook Form + Zod (useZodForm from pace-core)
139
- import { useZodForm } from '@jmruthers/pace-core';
140
- const schema = z.object({ email: z.string().email(), name: z.string().min(1) });
141
- const form = useZodForm(schema);
142
-
143
- // ❌ WRONG: Manual form handling (useState for form state)
144
- ```
145
-
146
- ## Vite
147
-
148
- ### MUST: Use Vite for Build Tooling
149
-
150
- **MUST use Vite for all build tooling:**
151
-
152
- ```typescript
153
- // ✅ CORRECT: Vite for build tooling
154
- import { defineConfig } from 'vite';
155
- import react from '@vitejs/plugin-react';
156
- export default defineConfig({ plugins: [react()] });
157
- ```
158
-
159
- ### MUST: Use Environment Variables Correctly
160
-
161
- **MUST use `import.meta.env` for environment variables:**
162
-
163
- ```tsx
164
- // ✅ CORRECT: import.meta.env.VITE_API_URL (Vite env vars)
165
- // ❌ WRONG: process.env.VITE_API_URL (Node.js env vars)
166
- ```
167
-
168
- ## TypeScript
169
-
170
- ### MUST: Use TypeScript 5+
171
-
172
- **MUST use TypeScript 5+ with strict mode:**
173
-
174
- ```json
175
- // ✅ CORRECT: TypeScript 5+ with strict mode
176
- { "compilerOptions": { "target": "ES2022", "module": "ESNext", "strict": true } }
177
- ```
178
-
179
- ## Version Requirements
180
-
181
- ### MUST: Use Required Versions
182
-
183
- **MUST use compatible versions:**
184
-
185
- - React: `^19.0.0`
186
- - TypeScript: `^5.0.0`
187
- - Tailwind CSS: `^4.0.0`
188
- - Vite: `^6.0.0`
189
- - Supabase: `^2.49.0+`
190
-
191
- **Check `package.json` for exact versions required by pace-core.**
192
-
193
- ## Tech Stack Checklist
194
-
195
- Before committing, verify:
196
- - [ ] Tailwind v4 CSS-first syntax (no @tailwind directives)
197
- - [ ] No bracket syntax for colors (use theme variables)
198
- - [ ] Custom color namespaces (main-*, sec-*, acc-*)
199
- - [ ] React 19+ functional components
200
- - [ ] Secure Supabase client (useSecureSupabase)
201
- - [ ] TanStack Query for server state
202
- - [ ] React Hook Form + Zod for forms
203
- - [ ] Vite for build tooling
204
- - [ ] TypeScript 5+ with strict mode
205
- - [ ] All versions compatible with pace-core
206
-
207
- ## Reference
208
-
209
- - Tailwind v4: https://tailwindcss.com/blog/tailwindcss-v4
210
- - React 19: https://react.dev/blog/2024/04/25/react-19-upgrade-guide
211
- - Supabase: https://supabase.com/docs
212
- - TanStack Query: https://tanstack.com/query
213
- - React Hook Form: https://react-hook-form.com
214
- - Vite: https://vitejs.dev
@@ -1,119 +0,0 @@
1
- # Cursor Rules Changelog
2
-
3
- All notable changes to pace-core cursor rules will be documented in this file.
4
-
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
- and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
-
8
- ## [Unreleased]
9
-
10
- ### Added
11
- - **08-markup-quality.mdc** - Enforces clean markup standards, semantic HTML usage, and pace-core component patterns
12
-
13
- ## [1.1.0] - 2025-01-28
14
-
15
- ### Added
16
- - **08-markup-quality.mdc** - Comprehensive guide for markup quality, semantic HTML, and pace-core component usage patterns
17
- - Enforces pace-core component usage over custom solutions
18
- - Prohibits `<div>` elements (except first child of `<body>` in `index.html`)
19
- - Requires semantic HTML elements (`<main>`, `<section>`, `<article>`, etc.)
20
- - Prohibits typography styling (relies on pace-core core.css)
21
- - Requires React Fragments for grouping without semantic meaning
22
- - Enforces minimal element nesting and clear semantic purpose
23
- - Includes decision tree and comprehensive checklist
24
-
25
- ## [1.0.0] - 2025-01-15
26
-
27
- ### Added
28
- - Initial release of cursor rules system
29
- - 8 comprehensive rule files covering compliance, standards, structure, SOLID, testing, bug reports, code quality, and tech stack
30
- - Installation script with safety guards
31
- - Comprehensive audit tool with Phase 1 (deterministic) and Phase 2 (heuristic) checks
32
- - Markdown report generation with timestamps
33
-
34
- ## [1.0.0] - 2025-01-15
35
-
36
- ### Added
37
- - **00-pace-core-compliance.mdc** - Enforces pace-core usage patterns
38
- - **01-standards-compliance.mdc** - Maps to all pace-core standards
39
- - **02-project-structure.mdc** - Defines standard folder structure
40
- - **03-solid-principles.mdc** - Enforces SOLID architecture principles
41
- - **04-testing-standards.mdc** - Enforces testing framework consistency
42
- - **05-bug-reports-and-features.mdc** - Templates for bug reports and feature requests
43
- - **06-code-quality.mdc** - Enforces code quality standards
44
- - **07-tech-stack-compliance.mdc** - Enforces tech stack versions and patterns
45
-
46
- ### Features
47
- - Opt-in installation script (not automatic postinstall)
48
- - Safety guards (environment variable, git check)
49
- - Version tracking in rule files
50
- - Rule numbering system (pace-core: 00-09, apps: 50+)
51
- - Targeted globs for efficient rule application
52
- - MUST/SHOULD/MAY semantics for clear guidance
53
- - Comprehensive audit tool with markdown reports
54
- - Phase-based audit approach (deterministic vs heuristic)
55
-
56
- ### Documentation
57
- - README.md with installation and usage guide
58
- - Getting started guide in docs
59
- - Updated standards README with cursor rules section
60
-
61
- ## Migration Guide
62
-
63
- ### From No Rules to Cursor Rules
64
-
65
- 1. Install pace-core (if not already installed):
66
- ```bash
67
- npm install @jmruthers/pace-core
68
- ```
69
-
70
- 2. Install cursor rules:
71
- ```bash
72
- node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
73
- ```
74
-
75
- 3. Restart Cursor to load rules
76
-
77
- 4. Run audit to check compliance:
78
- ```bash
79
- node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs
80
- ```
81
-
82
- ### Updating Rules
83
-
84
- When pace-core is updated:
85
-
86
- 1. Update pace-core:
87
- ```bash
88
- npm update @jmruthers/pace-core
89
- ```
90
-
91
- 2. Update rules:
92
- ```bash
93
- npm run setup:cursor-rules
94
- ```
95
-
96
- 3. Review any changes in rule files
97
-
98
- ### Custom Rules
99
-
100
- If you have custom rules, number them starting at 50:
101
- - `50-my-custom-rule.mdc`
102
- - `51-another-rule.mdc`
103
- - etc.
104
-
105
- This ensures pace-core rules (00-09) load first.
106
-
107
- ## Version History
108
-
109
- - **1.1.0** (2025-01-28) - Added markup quality rule (08-markup-quality.mdc)
110
- - **1.0.0** (2025-01-15) - Initial release
111
-
112
- ## Future Enhancements
113
-
114
- Potential future enhancements:
115
- - CLI for rule validation
116
- - GitHub Action template for PR audits
117
- - Rule update notification system
118
- - Interactive rule configuration
119
- - Rule effectiveness metrics