@jmruthers/pace-core 0.6.6 → 0.6.8

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 (292) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +240 -0
  4. package/audit-tool/audits/03-architecture.cjs +224 -0
  5. package/audit-tool/audits/04-code-quality.cjs +149 -0
  6. package/audit-tool/audits/05-styling.cjs +224 -0
  7. package/audit-tool/audits/06-security-rbac.cjs +554 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +355 -0
  9. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  10. package/audit-tool/audits/09-operations.cjs +208 -0
  11. package/audit-tool/index.cjs +295 -0
  12. package/audit-tool/utils/code-utils.cjs +218 -0
  13. package/audit-tool/utils/file-utils.cjs +230 -0
  14. package/audit-tool/utils/report-utils.cjs +380 -0
  15. package/cursor-rules/00-standards-overview.mdc +156 -0
  16. package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
  17. package/cursor-rules/02-project-structure.mdc +37 -5
  18. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
  19. package/cursor-rules/04-code-quality.mdc +419 -0
  20. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
  21. package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
  22. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  23. package/cursor-rules/08-testing-documentation.mdc +324 -0
  24. package/cursor-rules/09-operations.mdc +365 -0
  25. package/dist/DataTable-6RMSCQJ6.js +15 -0
  26. package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  27. package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
  28. package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
  29. package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
  30. package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
  31. package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
  32. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  33. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  34. package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
  35. package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
  36. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  37. package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
  38. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  39. package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
  40. package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
  41. package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
  42. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  43. package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
  44. package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
  45. package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
  46. package/dist/components.d.ts +5 -4
  47. package/dist/components.js +29 -34
  48. package/dist/eslint-rules/index.cjs +22 -9
  49. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  50. package/dist/eslint-rules/rules/04-code-quality.cjs +346 -0
  51. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  52. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
  53. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
  54. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  55. package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
  56. package/dist/hooks.d.ts +5 -5
  57. package/dist/hooks.js +8 -8
  58. package/dist/index.d.ts +7 -7
  59. package/dist/index.js +21 -20
  60. package/dist/providers.js +2 -2
  61. package/dist/rbac/index.d.ts +1 -1
  62. package/dist/rbac/index.js +8 -8
  63. package/dist/theming/runtime.d.ts +61 -1
  64. package/dist/theming/runtime.js +1 -1
  65. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  66. package/dist/types.d.ts +2 -2
  67. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  68. package/dist/utils.d.ts +2 -2
  69. package/dist/utils.js +8 -8
  70. package/docs/README.md +1 -1
  71. package/docs/api/modules.md +106 -41
  72. package/docs/api-reference/components.md +18 -20
  73. package/docs/api-reference/hooks.md +80 -80
  74. package/docs/api-reference/types.md +1 -1
  75. package/docs/api-reference/utilities.md +1 -1
  76. package/docs/architecture/README.md +1 -1
  77. package/docs/core-concepts/events.md +3 -3
  78. package/docs/core-concepts/organisations.md +6 -6
  79. package/docs/core-concepts/permissions.md +6 -6
  80. package/docs/documentation-index.md +12 -18
  81. package/docs/getting-started/dependencies.md +23 -0
  82. package/docs/getting-started/documentation-index.md +1 -1
  83. package/docs/getting-started/examples/README.md +4 -4
  84. package/docs/getting-started/examples/full-featured-app.md +1 -1
  85. package/docs/getting-started/faq.md +2 -2
  86. package/docs/getting-started/quick-reference.md +4 -4
  87. package/docs/implementation-guides/app-layout.md +1 -1
  88. package/docs/implementation-guides/authentication.md +15 -15
  89. package/docs/implementation-guides/component-styling.md +1 -1
  90. package/docs/implementation-guides/data-tables.md +127 -34
  91. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  92. package/docs/implementation-guides/dynamic-colors.md +3 -3
  93. package/docs/implementation-guides/file-upload-storage.md +2 -2
  94. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  95. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  96. package/docs/implementation-guides/large-datasets.md +3 -2
  97. package/docs/implementation-guides/organisation-security.md +2 -2
  98. package/docs/implementation-guides/performance.md +2 -2
  99. package/docs/implementation-guides/permission-enforcement.md +1 -1
  100. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  101. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  102. package/docs/rbac/README.md +5 -5
  103. package/docs/rbac/advanced-patterns.md +6 -6
  104. package/docs/rbac/api-reference.md +20 -20
  105. package/docs/rbac/event-based-apps.md +3 -3
  106. package/docs/rbac/examples.md +41 -41
  107. package/docs/rbac/getting-started.md +37 -37
  108. package/docs/rbac/performance.md +1 -1
  109. package/docs/rbac/quick-start.md +52 -52
  110. package/docs/rbac/secure-client-protection.md +1 -1
  111. package/docs/rbac/troubleshooting.md +1 -1
  112. package/docs/security/README.md +5 -5
  113. package/docs/standards/0-standards-overview.md +220 -0
  114. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +241 -185
  115. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  116. package/docs/standards/3-architecture-standards.md +606 -0
  117. package/docs/standards/4-code-quality-standards.md +728 -0
  118. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  119. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  120. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  121. package/docs/standards/8-testing-documentation-standards.md +401 -0
  122. package/docs/standards/9-operations-standards.md +1102 -0
  123. package/docs/standards/README.md +203 -104
  124. package/docs/troubleshooting/README.md +4 -4
  125. package/docs/troubleshooting/common-issues.md +2 -2
  126. package/docs/troubleshooting/debugging.md +9 -9
  127. package/docs/troubleshooting/migration.md +4 -4
  128. package/eslint-config-pace-core.cjs +50 -20
  129. package/package.json +50 -19
  130. package/scripts/eslint-audit.cjs +123 -0
  131. package/scripts/install-cursor-rules.cjs +11 -243
  132. package/scripts/install-eslint-config.cjs +349 -0
  133. package/scripts/validate-dependencies.cjs +248 -0
  134. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  135. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  136. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +30 -18
  137. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  138. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  139. package/src/__tests__/templates/accessibility.test.template.tsx +10 -9
  140. package/src/__tests__/templates/component.test.template.tsx +18 -15
  141. package/src/components/AddressField/AddressField.tsx +26 -1
  142. package/src/components/Alert/Alert.test.tsx +86 -22
  143. package/src/components/Alert/Alert.tsx +19 -11
  144. package/src/components/Badge/Badge.tsx +1 -1
  145. package/src/components/Calendar/Calendar.tsx +201 -47
  146. package/src/components/Checkbox/Checkbox.test.tsx +2 -1
  147. package/src/components/ContextSelector/ContextSelector.tsx +108 -126
  148. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  149. package/src/components/DataTable/DataTable.tsx +1 -19
  150. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
  151. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
  152. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
  153. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  154. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  155. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  156. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  157. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  158. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  159. package/src/components/DataTable/components/EmptyState.tsx +11 -10
  160. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  161. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  162. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  163. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  164. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  165. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  166. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  167. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  168. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  169. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +45 -27
  170. package/src/components/DataTable/components/index.ts +2 -1
  171. package/src/components/DataTable/types.ts +0 -18
  172. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  173. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
  174. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  175. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  176. package/src/components/Dialog/Dialog.test.tsx +1 -0
  177. package/src/components/Dialog/Dialog.tsx +25 -8
  178. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  179. package/src/components/FileUpload/FileUpload.test.tsx +45 -16
  180. package/src/components/FileUpload/FileUpload.tsx +141 -130
  181. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
  182. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
  183. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
  184. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
  185. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
  186. package/src/components/Progress/Progress.tsx +2 -4
  187. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  188. package/src/components/Select/Select.tsx +86 -77
  189. package/src/components/Select/types.ts +3 -0
  190. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  191. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  192. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +8 -5
  193. package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
  194. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
  195. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
  196. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
  197. package/src/hooks/public/usePublicEvent.ts +5 -5
  198. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  199. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  200. package/src/hooks/public/usePublicRouteParams.ts +13 -9
  201. package/src/hooks/useAddressAutocomplete.test.ts +18 -18
  202. package/src/hooks/useAppConfig.ts +2 -2
  203. package/src/hooks/useEventTheme.test.ts +7 -7
  204. package/src/hooks/useEventTheme.ts +2 -1
  205. package/src/hooks/useFileDisplay.ts +2 -2
  206. package/src/hooks/useFileUrl.ts +52 -8
  207. package/src/hooks/useOrganisationSecurity.test.ts +2 -1
  208. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  209. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  210. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  211. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  212. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  213. package/src/providers/__tests__/ProviderLifecycle.test.tsx +38 -38
  214. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  215. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  216. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  217. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
  218. package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
  219. package/src/rbac/api.test.ts +104 -0
  220. package/src/rbac/engine.ts +1 -1
  221. package/src/rbac/hooks/useCan.test.ts +2 -2
  222. package/src/rbac/secureClient.ts +1 -1
  223. package/src/rbac/types/functions.ts +1 -1
  224. package/src/styles/core.css +7 -0
  225. package/src/theming/__tests__/parseEventColours.test.ts +118 -3
  226. package/src/theming/parseEventColours.ts +77 -11
  227. package/src/types/supabase.ts +2 -3
  228. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
  229. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  230. package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
  231. package/src/utils/formatting/formatDate.test.ts +3 -2
  232. package/src/utils/formatting/formatDateTime.test.ts +2 -2
  233. package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
  234. package/src/utils/storage/README.md +1 -1
  235. package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
  236. package/src/utils/storage/helpers.test.ts +69 -3
  237. package/cursor-rules/01-standards-compliance.mdc +0 -285
  238. package/cursor-rules/04-testing-standards.mdc +0 -270
  239. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  240. package/cursor-rules/06-code-quality.mdc +0 -311
  241. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  242. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  243. package/cursor-rules/11-performance-optimization.mdc +0 -169
  244. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  245. package/dist/DataTable-LRJL4IRV.js +0 -15
  246. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  247. package/dist/eslint-rules/rules/components.cjs +0 -113
  248. package/dist/eslint-rules/rules/imports.cjs +0 -102
  249. package/docs/best-practices/README.md +0 -472
  250. package/docs/best-practices/accessibility.md +0 -604
  251. package/docs/best-practices/common-patterns.md +0 -516
  252. package/docs/best-practices/deployment.md +0 -1103
  253. package/docs/best-practices/performance.md +0 -1328
  254. package/docs/best-practices/security.md +0 -940
  255. package/docs/best-practices/testing.md +0 -1034
  256. package/docs/rbac/compliance/compliance-guide.md +0 -544
  257. package/docs/standards/01-standards-compliance.md +0 -188
  258. package/docs/standards/03-solid-principles.md +0 -39
  259. package/docs/standards/04-testing-standards.md +0 -36
  260. package/docs/standards/05-bug-reports-and-features.md +0 -27
  261. package/docs/standards/06-code-quality.md +0 -34
  262. package/docs/standards/07-tech-stack-compliance.md +0 -30
  263. package/docs/standards/10-error-handling-patterns.md +0 -401
  264. package/docs/standards/11-performance-optimization.md +0 -348
  265. package/docs/standards/12-ci-cd-integration.md +0 -370
  266. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  267. package/scripts/audit/audit-compliance.cjs +0 -1295
  268. package/scripts/audit/audit-components.cjs +0 -260
  269. package/scripts/audit/audit-rbac.cjs +0 -954
  270. package/scripts/audit/audit-standards.cjs +0 -1268
  271. package/scripts/audit/index.cjs +0 -1927
  272. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  273. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  274. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  275. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  276. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  277. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  278. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  279. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  280. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  281. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  282. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  283. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  284. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  285. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  286. package/src/components/DataTable/utils/debugTools.ts +0 -514
  287. package/src/eslint-rules/index.cjs +0 -22
  288. package/src/eslint-rules/rules/components.cjs +0 -113
  289. package/src/eslint-rules/rules/imports.cjs +0 -102
  290. package/src/eslint-rules/rules/rbac.cjs +0 -790
  291. package/src/eslint-rules/utils/helpers.cjs +0 -42
  292. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -1,348 +0,0 @@
1
- # Performance Optimization Guide
2
-
3
- **🤖 Cursor Rule**: See [11-performance-optimization.mdc](../../cursor-rules/11-performance-optimization.mdc) for AI-optimized directives that automatically enforce performance best practices.
4
-
5
- ## Purpose
6
-
7
- This standard defines performance optimization patterns and best practices to ensure:
8
- - **Fast page loads** and responsive user interfaces
9
- - **Efficient database queries** with proper RLS optimization
10
- - **Optimized React rendering** with proper memoization
11
- - **Effective caching strategies** for server state
12
- - **Minimal bundle sizes** and code splitting
13
-
14
- ## Principles
15
-
16
- 1. **Measure before optimizing** - Profile and identify bottlenecks
17
- 2. **Optimize critical paths first** - Focus on user-facing performance
18
- 3. **Use appropriate caching** - Balance freshness with performance
19
- 4. **Minimize re-renders** - Use React optimization techniques
20
- 5. **Optimize database queries** - Use helper functions, avoid N+1 queries
21
-
22
- ## React Performance
23
-
24
- ### Memoization
25
-
26
- **Use `useMemo` for expensive computations:**
27
-
28
- ```tsx
29
- // ✅ CORRECT - Memoize expensive computation
30
- const expensiveValue = useMemo(() => {
31
- return computeExpensiveValue(data);
32
- }, [data]);
33
-
34
- // ❌ WRONG - Recomputes on every render
35
- const expensiveValue = computeExpensiveValue(data);
36
- ```
37
-
38
- **Use `useCallback` for stable function references:**
39
-
40
- ```tsx
41
- // ✅ CORRECT - Stable callback reference
42
- const handleClick = useCallback(() => {
43
- doSomething(id);
44
- }, [id]);
45
-
46
- // ❌ WRONG - New function on every render
47
- const handleClick = () => {
48
- doSomething(id);
49
- };
50
- ```
51
-
52
- **Use `React.memo` for expensive components:**
53
-
54
- ```tsx
55
- // ✅ CORRECT - Memoize component
56
- const ExpensiveComponent = React.memo(({ data }) => {
57
- return <div>{/* expensive rendering */}</div>;
58
- });
59
-
60
- // ❌ WRONG - Re-renders unnecessarily
61
- function ExpensiveComponent({ data }) {
62
- return <div>{/* expensive rendering */}</div>;
63
- }
64
- ```
65
-
66
- ### Avoiding Unnecessary Re-renders
67
-
68
- **Don't create new objects/arrays in render:**
69
-
70
- ```tsx
71
- // ❌ WRONG - New object on every render
72
- function Component({ items }) {
73
- const config = { items, enabled: true };
74
- return <Child config={config} />;
75
- }
76
-
77
- // ✅ CORRECT - Memoize object
78
- function Component({ items }) {
79
- const config = useMemo(() => ({ items, enabled: true }), [items]);
80
- return <Child config={config} />;
81
- }
82
- ```
83
-
84
- ### Code Splitting
85
-
86
- **Lazy load heavy components:**
87
-
88
- ```tsx
89
- // ✅ CORRECT - Lazy load
90
- import { lazy, Suspense } from 'react';
91
- const HeavyComponent = lazy(() => import('./HeavyComponent'));
92
-
93
- function App() {
94
- return (
95
- <Suspense fallback={<Loading />}>
96
- <HeavyComponent />
97
- </Suspense>
98
- );
99
- }
100
- ```
101
-
102
- ## Database Performance
103
-
104
- ### RLS Policy Optimization
105
-
106
- **MUST use helper functions (STABLE SECURITY DEFINER):**
107
-
108
- ```sql
109
- -- ✅ CORRECT - Helper function (evaluated once)
110
- CREATE POLICY "rbac_select_users" ON users FOR SELECT USING (
111
- check_user_organisation_access(organisation_id)
112
- );
113
-
114
- -- ❌ WRONG - Subquery (evaluated per row)
115
- CREATE POLICY "rbac_select_users" ON users FOR SELECT USING (
116
- organisation_id IN (SELECT organisation_id FROM organisation_memberships WHERE user_id = auth.uid())
117
- );
118
- ```
119
-
120
- **MUST avoid InitPlan nodes:**
121
-
122
- ```sql
123
- -- ❌ WRONG - Causes InitPlan (severe performance degradation)
124
- CREATE POLICY "bad_policy" ON table_name FOR SELECT USING (
125
- user_id = auth.uid() -- Called for every row!
126
- );
127
-
128
- -- ✅ CORRECT - Helper function
129
- CREATE POLICY "good_policy" ON table_name FOR SELECT USING (
130
- get_effective_user_id() = user_id -- Evaluated once
131
- );
132
- ```
133
-
134
- ### Query Optimization
135
-
136
- **Use indexes for frequently queried columns:**
137
-
138
- ```sql
139
- -- ✅ CORRECT - Index on frequently queried column
140
- CREATE INDEX idx_users_organisation_id ON users(organisation_id);
141
- CREATE INDEX idx_events_organisation_id_event_id ON events(organisation_id, event_id);
142
- ```
143
-
144
- **Avoid N+1 queries:**
145
-
146
- ```tsx
147
- // ❌ WRONG - N+1 queries
148
- const events = await fetchEvents();
149
- for (const event of events) {
150
- const users = await fetchEventUsers(event.id); // N queries!
151
- }
152
-
153
- // ✅ CORRECT - Single query with join
154
- const eventsWithUsers = await fetchEventsWithUsers(); // 1 query
155
- ```
156
-
157
- **Use RPC functions for complex queries:**
158
-
159
- ```tsx
160
- // ✅ CORRECT - RPC for complex query
161
- const { data } = await supabase.rpc('data_events_list', {
162
- organisation_id: orgId
163
- });
164
-
165
- // ❌ AVOID - Complex client-side query
166
- const { data } = await supabase
167
- .from('events')
168
- .select('*, users(*), organisations(*)')
169
- .eq('organisation_id', orgId);
170
- ```
171
-
172
- ## Caching Strategies
173
-
174
- ### TanStack Query Configuration
175
-
176
- **Configure appropriate cache times:**
177
-
178
- ```tsx
179
- // ✅ CORRECT - Configure cache
180
- const queryClient = new QueryClient({
181
- defaultOptions: {
182
- queries: {
183
- staleTime: 5 * 60 * 1000, // 5 minutes
184
- cacheTime: 10 * 60 * 1000, // 10 minutes
185
- retry: 1,
186
- refetchOnWindowFocus: false, // Prevent unnecessary refetches
187
- },
188
- },
189
- });
190
- ```
191
-
192
- **Use query keys effectively:**
193
-
194
- ```tsx
195
- // ✅ CORRECT - Specific query keys
196
- const { data } = useQuery({
197
- queryKey: ['events', organisationId, eventId],
198
- queryFn: () => fetchEvent(organisationId, eventId),
199
- });
200
-
201
- // ❌ WRONG - Too generic
202
- const { data } = useQuery({
203
- queryKey: ['events'],
204
- queryFn: () => fetchEvent(organisationId, eventId),
205
- });
206
- ```
207
-
208
- ### React Query Optimizations
209
-
210
- **Use `keepPreviousData` for pagination:**
211
-
212
- ```tsx
213
- // ✅ CORRECT - Keep previous data during pagination
214
- const { data } = useQuery({
215
- queryKey: ['events', page],
216
- queryFn: () => fetchEvents(page),
217
- keepPreviousData: true,
218
- });
219
- ```
220
-
221
- **Use `select` to transform data efficiently:**
222
-
223
- ```tsx
224
- // ✅ CORRECT - Transform in select (only runs when data changes)
225
- const { data: eventCount } = useQuery({
226
- queryKey: ['events'],
227
- queryFn: fetchEvents,
228
- select: (data) => data.length,
229
- });
230
- ```
231
-
232
- ## Bundle Size Optimization
233
-
234
- ### Tree Shaking
235
-
236
- **Use named imports:**
237
-
238
- ```tsx
239
- // ✅ CORRECT - Tree-shakeable
240
- import { Button, Card } from '@jmruthers/pace-core';
241
-
242
- // ❌ WRONG - Imports entire library
243
- import * as PaceCore from '@jmruthers/pace-core';
244
- ```
245
-
246
- ### Dynamic Imports
247
-
248
- **Lazy load heavy dependencies:**
249
-
250
- ```tsx
251
- // ✅ CORRECT - Dynamic import
252
- const HeavyLibrary = lazy(() => import('heavy-library'));
253
-
254
- // ❌ WRONG - Eager import
255
- import HeavyLibrary from 'heavy-library';
256
- ```
257
-
258
- ## Performance Monitoring
259
-
260
- ### Measuring Performance
261
-
262
- **Use React DevTools Profiler:**
263
-
264
- 1. Open React DevTools
265
- 2. Go to Profiler tab
266
- 3. Record a session
267
- 4. Identify slow components
268
- 5. Optimize based on findings
269
-
270
- **Use browser DevTools:**
271
-
272
- 1. Open Performance tab
273
- 2. Record page load
274
- 3. Identify bottlenecks
275
- 4. Optimize critical rendering path
276
-
277
- ### Performance Metrics
278
-
279
- **Track these metrics:**
280
-
281
- - **Time to First Byte (TTFB)** - < 200ms
282
- - **First Contentful Paint (FCP)** - < 1.8s
283
- - **Largest Contentful Paint (LCP)** - < 2.5s
284
- - **Time to Interactive (TTI)** - < 3.8s
285
- - **Cumulative Layout Shift (CLS)** - < 0.1
286
-
287
- ## Performance Checklist
288
-
289
- Before committing performance-sensitive code, verify:
290
-
291
- - [ ] Expensive computations memoized with `useMemo`
292
- - [ ] Callbacks stable with `useCallback`
293
- - [ ] Components memoized with `React.memo` when appropriate
294
- - [ ] No new objects/arrays created in render
295
- - [ ] Heavy components lazy loaded
296
- - [ ] RLS policies use helper functions (no subqueries)
297
- - [ ] Queries use indexes appropriately
298
- - [ ] No N+1 query patterns
299
- - [ ] TanStack Query configured with appropriate cache times
300
- - [ ] Bundle size optimized (tree shaking, code splitting)
301
- - [ ] Performance metrics measured and acceptable
302
-
303
- ## Common Performance Pitfalls
304
-
305
- ### ❌ Don't: Create New Objects in Render
306
-
307
- ```tsx
308
- // ❌ WRONG
309
- function Component({ items }) {
310
- return <Child config={{ items, enabled: true }} />; // New object every render
311
- }
312
- ```
313
-
314
- ### ❌ Don't: Use Inline Functions
315
-
316
- ```tsx
317
- // ❌ WRONG
318
- <Button onClick={() => handleClick(id)}>Click</Button> // New function every render
319
- ```
320
-
321
- ### ❌ Don't: Over-Memoize
322
-
323
- ```tsx
324
- // ❌ WRONG - Memoizing simple computation
325
- const simpleValue = useMemo(() => items.length, [items]); // Unnecessary
326
- ```
327
-
328
- ### ❌ Don't: Use Subqueries in RLS
329
-
330
- ```sql
331
- -- ❌ WRONG - N+1 performance issue
332
- CREATE POLICY "bad" ON table FOR SELECT USING (
333
- organisation_id IN (SELECT ... FROM ... WHERE user_id = auth.uid())
334
- );
335
- ```
336
-
337
- ## Related Documentation
338
-
339
- - [RLS Standard](./09-rbac-compliance.md) - RLS performance requirements
340
- - [Code Quality Standard](./06-code-quality.md) - React performance patterns
341
- - [Tech Stack Standard](./07-tech-stack-compliance.md) - TanStack Query configuration
342
-
343
- ---
344
-
345
- **Last Updated:** 2025-01-28
346
- **Version:** 1.0.0
347
- **Applies to:** All pace-core and consuming apps
348
-
@@ -1,370 +0,0 @@
1
- # CI/CD Integration Guide
2
-
3
- **🤖 Cursor Rule**: See [12-ci-cd-integration.mdc](../../cursor-rules/12-ci-cd-integration.mdc) for AI-optimized directives that automatically enforce CI/CD best practices.
4
-
5
- ## Purpose
6
-
7
- This standard defines CI/CD integration patterns and best practices to ensure:
8
- - **Automated quality checks** on every commit
9
- - **Consistent deployment processes** across environments
10
- - **Proper testing** before deployment
11
- - **Security scanning** and compliance checks
12
- - **Efficient build and deployment** pipelines
13
-
14
- ## Principles
15
-
16
- 1. **Automate everything** - Manual steps are error-prone
17
- 2. **Fail fast** - Catch issues early in the pipeline
18
- 3. **Test before deploy** - Never deploy untested code
19
- 4. **Security first** - Scan for vulnerabilities
20
- 5. **Consistent environments** - Dev, staging, production parity
21
-
22
- ## CI/CD Pipeline Structure
23
-
24
- ### Standard Pipeline Stages
25
-
26
- ```
27
- 1. Lint & Format Check
28
- 2. Type Check
29
- 3. Unit Tests
30
- 4. Integration Tests
31
- 5. Build
32
- 6. Security Scan
33
- 7. Deploy (staging/production)
34
- ```
35
-
36
- ## GitHub Actions Example
37
-
38
- ### Basic Workflow
39
-
40
- ```yaml
41
- # .github/workflows/ci.yml
42
- name: CI
43
-
44
- on:
45
- push:
46
- branches: [main, develop]
47
- pull_request:
48
- branches: [main, develop]
49
-
50
- jobs:
51
- quality-checks:
52
- runs-on: ubuntu-latest
53
- steps:
54
- - uses: actions/checkout@v4
55
-
56
- - name: Setup Node.js
57
- uses: actions/setup-node@v4
58
- with:
59
- node-version: '20'
60
- cache: 'npm'
61
-
62
- - name: Install dependencies
63
- run: npm ci
64
-
65
- - name: Lint
66
- run: npm run lint
67
-
68
- - name: Type check
69
- run: npm run type-check
70
-
71
- - name: Format check
72
- run: npm run format:check
73
-
74
- - name: Run tests
75
- run: npm run test
76
-
77
- - name: Build
78
- run: npm run build
79
-
80
- - name: Security scan
81
- run: npm audit --audit-level=moderate
82
- ```
83
-
84
- ### Advanced Workflow with Deployment
85
-
86
- ```yaml
87
- # .github/workflows/deploy.yml
88
- name: Deploy
89
-
90
- on:
91
- push:
92
- branches: [main]
93
- workflow_dispatch:
94
-
95
- jobs:
96
- test:
97
- runs-on: ubuntu-latest
98
- steps:
99
- - uses: actions/checkout@v4
100
- - uses: actions/setup-node@v4
101
- with:
102
- node-version: '20'
103
- cache: 'npm'
104
- - run: npm ci
105
- - run: npm run test
106
- - run: npm run build
107
-
108
- deploy-staging:
109
- needs: test
110
- runs-on: ubuntu-latest
111
- environment: staging
112
- steps:
113
- - uses: actions/checkout@v4
114
- - uses: actions/setup-node@v4
115
- with:
116
- node-version: '20'
117
- - run: npm ci
118
- - run: npm run build
119
- - name: Deploy to Staging
120
- run: |
121
- # Your deployment script
122
- echo "Deploying to staging..."
123
-
124
- deploy-production:
125
- needs: test
126
- runs-on: ubuntu-latest
127
- environment: production
128
- if: github.ref == 'refs/heads/main'
129
- steps:
130
- - uses: actions/checkout@v4
131
- - uses: actions/setup-node@v4
132
- with:
133
- node-version: '20'
134
- - run: npm ci
135
- - run: npm run build
136
- - name: Deploy to Production
137
- run: |
138
- # Your deployment script
139
- echo "Deploying to production..."
140
- ```
141
-
142
- ## Required CI Checks
143
-
144
- ### MUST: Run These Checks
145
-
146
- **Every CI pipeline MUST include:**
147
-
148
- 1. **Linting** - ESLint with pace-core rules
149
- ```yaml
150
- - name: Lint
151
- run: npm run lint
152
- ```
153
-
154
- 2. **Type Checking** - TypeScript compilation
155
- ```yaml
156
- - name: Type check
157
- run: npx tsc --noEmit
158
- ```
159
-
160
- 3. **Testing** - Unit and integration tests
161
- ```yaml
162
- - name: Run tests
163
- run: npm run test
164
- ```
165
-
166
- 4. **Build** - Verify build succeeds
167
- ```yaml
168
- - name: Build
169
- run: npm run build
170
- ```
171
-
172
-
173
- ### SHOULD: Run These Checks
174
-
175
- **Recommended additional checks:**
176
-
177
- 1. **Format Check** - Prettier or similar
178
- ```yaml
179
- - name: Format check
180
- run: npm run format:check
181
- ```
182
-
183
- 2. **Security Scan** - npm audit or Snyk
184
- ```yaml
185
- - name: Security scan
186
- run: npm audit --audit-level=moderate
187
- ```
188
-
189
- 3. **Coverage Check** - Test coverage thresholds
190
- ```yaml
191
- - name: Coverage check
192
- run: npm run test:coverage
193
- ```
194
-
195
- ## Package.json Scripts
196
-
197
- ### Required Scripts
198
-
199
- **MUST have these scripts in `package.json`:**
200
-
201
- ```json
202
- {
203
- "scripts": {
204
- "lint": "eslint .",
205
- "lint:fix": "eslint . --fix",
206
- "type-check": "tsc --noEmit",
207
- "test": "vitest run",
208
- "test:watch": "vitest",
209
- "test:coverage": "vitest run --coverage",
210
- "build": "vite build",
211
- "format": "prettier --write .",
212
- "format:check": "prettier --check ."
213
- }
214
- }
215
- ```
216
-
217
- ## Environment Variables
218
-
219
- ### CI/CD Secrets
220
-
221
- **Store sensitive values as secrets:**
222
-
223
- ```yaml
224
- # .github/workflows/deploy.yml
225
- env:
226
- SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
227
- SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
228
- VITE_SUPABASE_URL: ${{ secrets.VITE_SUPABASE_URL }}
229
- VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }}
230
- ```
231
-
232
- **Never commit secrets to repository:**
233
- - Use GitHub Secrets
234
- - Use environment-specific config files
235
- - Use `.env.example` for documentation
236
-
237
- ## Database Migrations in CI/CD
238
-
239
- ### Migration Strategy
240
-
241
- **For Supabase migrations:**
242
-
243
- ```yaml
244
- - name: Run migrations
245
- run: |
246
- npx supabase db push
247
- # Or use Supabase CLI
248
- supabase migration up
249
- ```
250
-
251
- **Best Practices:**
252
- - Run migrations in staging first
253
- - Test migrations in CI
254
- - Never run destructive migrations automatically
255
- - Use migration review process
256
-
257
- ## Deployment Strategies
258
-
259
- ### Staging Deployment
260
-
261
- **Deploy to staging on every merge to `develop`:**
262
-
263
- ```yaml
264
- deploy-staging:
265
- if: github.ref == 'refs/heads/develop'
266
- environment: staging
267
- steps:
268
- - name: Deploy to Staging
269
- run: |
270
- # Deploy to staging environment
271
- ```
272
-
273
- ### Production Deployment
274
-
275
- **Deploy to production only from `main` branch:**
276
-
277
- ```yaml
278
- deploy-production:
279
- if: github.ref == 'refs/heads/main'
280
- environment: production
281
- steps:
282
- - name: Deploy to Production
283
- run: |
284
- # Deploy to production environment
285
- ```
286
-
287
- ### Manual Deployment
288
-
289
- **Allow manual deployment via workflow_dispatch:**
290
-
291
- ```yaml
292
- on:
293
- workflow_dispatch:
294
- inputs:
295
- environment:
296
- description: 'Environment to deploy to'
297
- required: true
298
- type: choice
299
- options:
300
- - staging
301
- - production
302
- ```
303
-
304
- ## CI/CD Checklist
305
-
306
- Before setting up CI/CD, verify:
307
-
308
- - [ ] Lint check configured
309
- - [ ] Type check configured
310
- - [ ] Tests run in CI
311
- - [ ] Build succeeds in CI
312
- - [ ] Security scan configured
313
- - [ ] Environment variables set as secrets
314
- - [ ] Staging deployment configured
315
- - [ ] Production deployment configured
316
- - [ ] Migration strategy defined
317
- - [ ] Rollback plan documented
318
-
319
- ## Common CI/CD Issues
320
-
321
- ### Issue: Tests Fail in CI but Pass Locally
322
-
323
- **Causes:**
324
- - Environment differences
325
- - Missing environment variables
326
- - Timezone issues
327
- - File path differences
328
-
329
- **Solutions:**
330
- - Use same Node.js version
331
- - Set all required environment variables
332
- - Use consistent timezone (UTC)
333
- - Use absolute paths or path aliases
334
-
335
- ### Issue: Build Fails in CI
336
-
337
- **Causes:**
338
- - Missing dependencies
339
- - Different Node.js version
340
- - Platform-specific code
341
-
342
- **Solutions:**
343
- - Use `npm ci` (not `npm install`)
344
- - Pin Node.js version
345
- - Test on same platform as CI
346
-
347
- ### Issue: Slow CI Pipeline
348
-
349
- **Causes:**
350
- - Running unnecessary checks
351
- - Not caching dependencies
352
- - Sequential jobs
353
-
354
- **Solutions:**
355
- - Cache node_modules
356
- - Run jobs in parallel
357
- - Only run necessary checks per branch
358
-
359
- ## Related Documentation
360
-
361
- - [Testing Standard](./04-testing-standards.md) - Test configuration
362
- - [Code Quality Standard](./06-code-quality.md) - Linting and formatting
363
- - [pace-core Compliance](./00-pace-core-compliance.md) - Compliance checks
364
-
365
- ---
366
-
367
- **Last Updated:** 2025-01-28
368
- **Version:** 1.0.0
369
- **Applies to:** All consuming apps using `@jmruthers/pace-core`
370
-