@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
@@ -0,0 +1,949 @@
1
+ # Project Structure Standards
2
+
3
+ **🤖 Cursor Rule**: See [02-project-structure.mdc](../../cursor-rules/02-project-structure.mdc) for AI-optimized directives that automatically enforce this structure.
4
+
5
+ ## Purpose
6
+
7
+ This guide defines the standard project structure and file organization patterns that all apps consuming `@jmruthers/pace-core` **MUST** follow. Adhering to this structure ensures:
8
+
9
+ - **Consistency** across all PACE suite applications
10
+ - **Maintainability** through predictable organization
11
+ - **Developer Experience** with clear patterns and conventions
12
+ - **Compatibility** with pace-core tooling and automation
13
+ - **Scalability** as your app grows
14
+
15
+ ## Table of Contents
16
+
17
+ 1. [Standard Directory Structure](#standard-directory-structure)
18
+ 2. [File Organization Patterns](#file-organization-patterns)
19
+ 3. [Naming Conventions](#naming-conventions)
20
+ 4. [Import Path Configuration](#import-path-configuration)
21
+ 5. [Component Organization](#component-organization)
22
+ 6. [Testing Structure](#testing-structure)
23
+ 7. [Database & Supabase Structure](#database--supabase-structure)
24
+ 8. [Configuration Files](#configuration-files)
25
+ 9. [Migration from Existing Projects](#migration-from-existing-projects)
26
+ 10. [Structure Checklist](#structure-checklist)
27
+
28
+ ---
29
+
30
+ ## Standard Directory Structure
31
+
32
+ ### Complete Project Structure
33
+
34
+ Every consuming app **MUST** follow this base structure:
35
+
36
+ ```
37
+ your-app/
38
+ ├── .cursor/
39
+ │ └── rules/ # Cursor rules (pace-core + local)
40
+ │ ├── 00-standards-overview.mdc
41
+ │ ├── 01-pace-core-compliance.mdc
42
+ │ ├── 02-project-structure.mdc
43
+ │ └── [local-rules].mdc
44
+
45
+ ├── .vscode/ # VS Code settings (optional)
46
+ │ └── settings.json
47
+
48
+ ├── public/ # Static assets
49
+ │ ├── favicon.ico
50
+ │ ├── robots.txt
51
+ │ └── [other-static-assets]/
52
+
53
+ ├── src/ # Source code
54
+ │ ├── components/ # App-specific components
55
+ │ │ ├── [feature-name]/ # Organized by feature
56
+ │ │ └── shared/ # Shared app components
57
+ │ │
58
+ │ ├── hooks/ # App-specific hooks
59
+ │ │ ├── [feature-name]/ # Feature-specific hooks
60
+ │ │ └── [hook-name].ts
61
+ │ │
62
+ │ ├── services/ # App-specific services (if using service pattern)
63
+ │ │ └── [service-name].ts
64
+ │ │
65
+ │ ├── pages/ # Page components (route components)
66
+ │ │ ├── [PageName].tsx
67
+ │ │ └── [feature]/ # Feature-based pages
68
+ │ │
69
+ │ ├── types/ # TypeScript type definitions
70
+ │ │ ├── [domain].ts # Domain-specific types
71
+ │ │ └── index.ts # Re-export barrel file
72
+ │ │
73
+ │ ├── utils/ # App-specific utilities
74
+ │ │ ├── [utility-name].ts
75
+ │ │ └── index.ts # Re-export barrel file
76
+ │ │
77
+ │ ├── lib/ # Third-party library configurations
78
+ │ │ └── supabase.ts # Supabase client setup
79
+ │ │
80
+ │ ├── App.tsx # Main app component
81
+ │ ├── main.tsx # Application entry point
82
+ │ └── app.css # Global styles (MUST follow 5-styling-standards.md)
83
+
84
+ ├── supabase/ # Supabase configuration
85
+ │ ├── migrations/ # Database migrations
86
+ │ │ └── YYYYMMDDHHMMSS_description.sql
87
+ │ ├── functions/ # Edge functions (if used)
88
+ │ │ └── [function-name]/
89
+ │ └── config.toml # Supabase config
90
+
91
+ ├── tests/ # Integration/E2E tests (optional)
92
+ │ └── [test-files].test.ts
93
+
94
+ ├── audit/ # Audit reports (generated, gitignored)
95
+ │ └── audit-*.md
96
+
97
+ ├── .gitignore
98
+ ├── .eslintrc.js # ESLint config (or eslint.config.js)
99
+ ├── package.json
100
+ ├── tsconfig.json # TypeScript config
101
+ ├── tsconfig.app.json # App-specific TS config (if needed)
102
+ ├── vite.config.ts # Vite configuration
103
+ ├── vitest.config.ts # Vitest configuration
104
+ ├── README.md
105
+ └── CHANGELOG.md # (optional but recommended)
106
+ ```
107
+
108
+ ### Directory Purpose Reference
109
+
110
+ | Directory | Purpose | Required? |
111
+ |-----------|---------|-----------|
112
+ | `.cursor/rules/` | Cursor AI rules for code generation | ✅ Yes |
113
+ | `public/` | Static assets served directly | ✅ Yes |
114
+ | `src/` | All source code | ✅ Yes |
115
+ | `src/components/` | App-specific React components | ✅ Yes |
116
+ | `src/hooks/` | Custom React hooks | ✅ Yes |
117
+ | `src/pages/` | Route/page components | ✅ Yes |
118
+ | `src/types/` | TypeScript type definitions | ✅ Yes |
119
+ | `src/utils/` | Utility functions | ✅ Yes |
120
+ | `src/lib/` | Library configurations | ✅ Yes |
121
+ | `supabase/` | Supabase config and migrations | ✅ Yes |
122
+ | `supabase/migrations/` | Database migration files | ✅ Yes |
123
+ | `tests/` | Integration/E2E tests | ⚠️ Optional |
124
+ | `audit/` | Generated audit reports | ✅ Yes (gitignored) |
125
+
126
+ ---
127
+
128
+ ## File Organization Patterns
129
+
130
+ ### Pattern 1: Feature-Based Organization (Recommended for Small-Medium Apps)
131
+
132
+ Organize components, hooks, and related code by feature/domain:
133
+
134
+ ```
135
+ src/
136
+ ├── components/
137
+ │ ├── events/
138
+ │ │ ├── EventCard.tsx
139
+ │ │ ├── EventList.tsx
140
+ │ │ └── EventForm.tsx
141
+ │ ├── users/
142
+ │ │ ├── UserProfile.tsx
143
+ │ │ └── UserList.tsx
144
+ │ └── shared/
145
+ │ ├── AppLayout.tsx
146
+ │ └── Navigation.tsx
147
+
148
+ ├── hooks/
149
+ │ ├── events/
150
+ │ │ ├── useEventData.ts
151
+ │ │ └── useEventForm.ts
152
+ │ └── users/
153
+ │ └── useUserData.ts
154
+
155
+ ├── pages/
156
+ │ ├── EventsPage.tsx
157
+ │ ├── EventDetailPage.tsx
158
+ │ ├── UsersPage.tsx
159
+ │ └── UserProfilePage.tsx
160
+
161
+ └── types/
162
+ ├── events.ts
163
+ └── users.ts
164
+ ```
165
+
166
+ **When to use:** Small to medium-sized apps (< 20 features)
167
+
168
+ ### Pattern 2: Domain-Driven Organization (Recommended for Large Apps)
169
+
170
+ For larger applications, organize by domain with internal structure:
171
+
172
+ ```
173
+ src/
174
+ ├── domains/
175
+ │ ├── events/
176
+ │ │ ├── components/
177
+ │ │ │ ├── EventCard.tsx
178
+ │ │ │ └── EventList.tsx
179
+ │ │ ├── hooks/
180
+ │ │ │ └── useEventData.ts
181
+ │ │ ├── services/
182
+ │ │ │ └── EventService.ts
183
+ │ │ ├── types.ts
184
+ │ │ └── index.ts # Domain barrel export
185
+ │ │
186
+ │ └── users/
187
+ │ ├── components/
188
+ │ ├── hooks/
189
+ │ ├── services/
190
+ │ ├── types.ts
191
+ │ └── index.ts
192
+
193
+ ├── shared/ # Shared across domains
194
+ │ ├── components/
195
+ │ │ ├── Layout.tsx
196
+ │ │ └── Navigation.tsx
197
+ │ ├── hooks/
198
+ │ │ └── useAppConfig.ts
199
+ │ └── utils/
200
+ │ └── formatDate.ts
201
+
202
+ └── pages/
203
+ ├── events/
204
+ │ ├── EventsListPage.tsx
205
+ │ └── EventDetailPage.tsx
206
+ └── users/
207
+ └── UsersPage.tsx
208
+ ```
209
+
210
+ **When to use:** Large apps with multiple distinct domains (> 20 features, clear domain boundaries)
211
+
212
+ ### Pattern 3: Hybrid Organization
213
+
214
+ Combine feature-based and domain-based as needed:
215
+
216
+ ```
217
+ src/
218
+ ├── components/
219
+ │ ├── events/ # Feature-based (simple features)
220
+ │ └── shared/ # Shared components
221
+
222
+ ├── domains/
223
+ │ └── complex-feature/ # Domain-based (complex features)
224
+ │ ├── components/
225
+ │ ├── hooks/
226
+ │ └── services/
227
+
228
+ └── pages/
229
+ └── [pages organized by route]
230
+ ```
231
+
232
+ **When to use:** Apps with mixed complexity levels
233
+
234
+ ---
235
+
236
+ ## Naming Conventions
237
+
238
+ ### Files
239
+
240
+ | Type | Convention | Example | Notes |
241
+ |------|------------|---------|-------|
242
+ | **Components** | `PascalCase.tsx` | `EventCard.tsx` | React components |
243
+ | **Hooks** | `camelCase.ts` with `use` prefix | `useEventData.ts` | Custom hooks |
244
+ | **Utilities** | `camelCase.ts` | `formatEvent.ts` | Helper functions |
245
+ | **Types** | `camelCase.ts` or `types.ts` | `eventTypes.ts` | Type definitions |
246
+ | **Services** | `PascalCase.ts` | `EventService.ts` | Service classes |
247
+ | **Tests** | `*.test.ts` or `*.test.tsx` | `EventCard.test.tsx` | Test files |
248
+ | **Config** | `kebab-case.config.js` | `vite.config.ts` | Config files |
249
+ | **Pages** | `PascalCase.tsx` with `Page` suffix | `EventsPage.tsx` | Route components |
250
+
251
+ ### Directories
252
+
253
+ | Type | Convention | Example | Notes |
254
+ |------|------------|---------|-------|
255
+ | **Feature directories** | `kebab-case` | `event-management/` | Feature/domain names |
256
+ | **Component directories** | `kebab-case` | `event-card/` | When component has multiple files |
257
+ | **Shared directories** | `kebab-case` | `shared/` | Shared across features |
258
+
259
+ ### Code Naming
260
+
261
+ ```typescript
262
+ // ✅ CORRECT - Components
263
+ export function EventCard() { }
264
+ export const UserProfile = () => { };
265
+
266
+ // ✅ CORRECT - Hooks
267
+ export function useEventData() { }
268
+ export function useUserProfile() { }
269
+
270
+ // ✅ CORRECT - Utilities
271
+ export function formatEvent() { }
272
+ export function validateUserInput() { }
273
+
274
+ // ✅ CORRECT - Types
275
+ export type Event = { };
276
+ export interface UserProfile { }
277
+
278
+ // ✅ CORRECT - Services
279
+ export class EventService { }
280
+ ```
281
+
282
+ ---
283
+
284
+ ## Import Path Configuration
285
+
286
+ ### Path Aliases Setup
287
+
288
+ **MUST** configure path aliases in `tsconfig.json`:
289
+
290
+ ```json
291
+ {
292
+ "compilerOptions": {
293
+ "baseUrl": ".",
294
+ "paths": {
295
+ "@/*": ["./src/*"],
296
+ "@/components/*": ["./src/components/*"],
297
+ "@/hooks/*": ["./src/hooks/*"],
298
+ "@/pages/*": ["./src/pages/*"],
299
+ "@/types/*": ["./src/types/*"],
300
+ "@/utils/*": ["./src/utils/*"],
301
+ "@/lib/*": ["./src/lib/*"]
302
+ }
303
+ }
304
+ }
305
+ ```
306
+
307
+ **MUST** also configure in `vite.config.ts`:
308
+
309
+ ```typescript
310
+ import { defineConfig } from 'vite';
311
+ import react from '@vitejs/plugin-react';
312
+ import path from 'path';
313
+
314
+ export default defineConfig({
315
+ plugins: [react()],
316
+ resolve: {
317
+ alias: {
318
+ '@': path.resolve(__dirname, './src'),
319
+ '@/components': path.resolve(__dirname, './src/components'),
320
+ '@/hooks': path.resolve(__dirname, './src/hooks'),
321
+ '@/pages': path.resolve(__dirname, './src/pages'),
322
+ '@/types': path.resolve(__dirname, './src/types'),
323
+ '@/utils': path.resolve(__dirname, './src/utils'),
324
+ '@/lib': path.resolve(__dirname, './src/lib'),
325
+ },
326
+ },
327
+ });
328
+ ```
329
+
330
+ ### Import Patterns
331
+
332
+ ```tsx
333
+ // ✅ CORRECT - Absolute imports from src
334
+ import { EventCard } from '@/components/events/EventCard';
335
+ import { useEventData } from '@/hooks/events/useEventData';
336
+ import { formatEvent } from '@/utils/formatEvent';
337
+ import type { Event } from '@/types/events';
338
+
339
+ // ✅ CORRECT - pace-core imports
340
+ import { Button, Card, DataTable } from '@jmruthers/pace-core';
341
+ import { useUnifiedAuth, usePermissions } from '@jmruthers/pace-core';
342
+ import { formatDate, formatCurrency } from '@jmruthers/pace-core';
343
+
344
+ // ✅ CORRECT - Relative imports for nearby files (same directory)
345
+ import { EventCardHeader } from './EventCardHeader';
346
+ import { EventCardFooter } from './EventCardFooter';
347
+
348
+ // ❌ WRONG - Deep relative imports
349
+ import { EventCard } from '../../../components/events/EventCard';
350
+
351
+ // ❌ WRONG - Importing from pace-core source
352
+ import { Button } from '@jmruthers/pace-core/src/components/Button';
353
+ ```
354
+
355
+ ---
356
+
357
+ ## Component Organization
358
+
359
+ ### Component Structure
360
+
361
+ **MUST** organize components by feature, not by type:
362
+
363
+ ```
364
+ src/components/
365
+ ├── events/ # ✅ Feature-based
366
+ │ ├── EventCard.tsx
367
+ │ ├── EventList.tsx
368
+ │ └── EventForm.tsx
369
+
370
+ └── shared/ # ✅ Shared app components
371
+ ├── AppLayout.tsx
372
+ └── Navigation.tsx
373
+ ```
374
+
375
+ ```
376
+ src/components/
377
+ ├── buttons/ # ❌ WRONG - Type-based
378
+ ├── inputs/ # ❌ WRONG - Type-based
379
+ └── cards/ # ❌ WRONG - Type-based
380
+ ```
381
+
382
+ **Why?** Use pace-core components for UI primitives (Button, Input, Card, etc.). Your components should be feature-specific compositions.
383
+
384
+ ### Component File Structure
385
+
386
+ For simple components (single file):
387
+
388
+ ```
389
+ src/components/events/EventCard.tsx
390
+ ```
391
+
392
+ For complex components (multiple related files):
393
+
394
+ ```
395
+ src/components/events/EventCard/
396
+ ├── EventCard.tsx # Main component
397
+ ├── EventCardHeader.tsx # Sub-components
398
+ ├── EventCardFooter.tsx
399
+ ├── EventCard.test.tsx # Tests (colocated)
400
+ ├── EventCard.types.ts # Component-specific types
401
+ └── index.ts # Barrel export
402
+ ```
403
+
404
+ ### Component Composition Example
405
+
406
+ ```tsx
407
+ // ✅ CORRECT - Use pace-core components
408
+ import { Button, Card, Input } from '@jmruthers/pace-core';
409
+ import { useEventData } from '@/hooks/events/useEventData';
410
+
411
+ export function EventCard({ eventId }: { eventId: string }) {
412
+ const { event } = useEventData(eventId);
413
+
414
+ return (
415
+ <Card>
416
+ <h2>{event.title}</h2>
417
+ <p>{event.description}</p>
418
+ <Button>View Details</Button>
419
+ </Card>
420
+ );
421
+ }
422
+ ```
423
+
424
+ ---
425
+
426
+ ## Testing Structure
427
+
428
+ ### Test Colocation
429
+
430
+ **MUST** colocate tests with source files:
431
+
432
+ ```
433
+ src/
434
+ ├── components/
435
+ │ └── events/
436
+ │ ├── EventCard.tsx
437
+ │ └── EventCard.test.tsx # ✅ Colocated
438
+
439
+ ├── hooks/
440
+ │ ├── useEventData.ts
441
+ │ └── useEventData.test.ts # ✅ Colocated
442
+
443
+ └── utils/
444
+ ├── formatEvent.ts
445
+ └── formatEvent.test.ts # ✅ Colocated
446
+ ```
447
+
448
+ ### Test File Naming
449
+
450
+ - Unit tests: `*.test.ts` or `*.test.tsx`
451
+ - Integration tests: `*.integration.test.ts`
452
+ - E2E tests: Place in `tests/` directory
453
+
454
+ ### Test Organization Example
455
+
456
+ ```typescript
457
+ // src/components/events/EventCard.test.tsx
458
+ import { render, screen } from '@testing-library/react';
459
+ import { EventCard } from './EventCard';
460
+
461
+ describe('EventCard', () => {
462
+ it('renders event title', () => {
463
+ // Test implementation
464
+ });
465
+ });
466
+ ```
467
+
468
+ ---
469
+
470
+ ## Database & Supabase Structure
471
+
472
+ ### Migration Files
473
+
474
+ **MUST** place all migrations in `supabase/migrations/`:
475
+
476
+ ```
477
+ supabase/
478
+ └── migrations/
479
+ ├── 20250115143022_add_user_preferences.sql
480
+ ├── 20250116120000_create_events_table.sql
481
+ └── 20250117150000_add_rls_policies.sql
482
+ ```
483
+
484
+ **MUST** follow naming convention: `YYYYMMDDHHMMSS_description.sql`
485
+
486
+ ### Edge Functions (if used)
487
+
488
+ ```
489
+ supabase/
490
+ └── functions/
491
+ ├── send-email/
492
+ │ ├── index.ts
493
+ │ └── package.json
494
+ └── process-payment/
495
+ ├── index.ts
496
+ └── package.json
497
+ ```
498
+
499
+ ### Supabase Client Setup
500
+
501
+ **MUST** place Supabase client in `src/lib/supabase.ts`:
502
+
503
+ ```typescript
504
+ // src/lib/supabase.ts
505
+ import { createClient } from '@supabase/supabase-js';
506
+ import type { Database } from '@/types/database';
507
+
508
+ const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
509
+ const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY;
510
+
511
+ export const supabaseClient = createClient<Database>(
512
+ supabaseUrl,
513
+ supabaseAnonKey
514
+ );
515
+ ```
516
+
517
+ ---
518
+
519
+ ## Configuration Files
520
+
521
+ ### Required Configuration Files
522
+
523
+ **MUST** have these configuration files in the root:
524
+
525
+ | File | Purpose | Required? |
526
+ |------|---------|-----------|
527
+ | `package.json` | Dependencies and scripts | ✅ Yes |
528
+ | `tsconfig.json` | TypeScript configuration | ✅ Yes |
529
+ | `vite.config.ts` | Vite build configuration | ✅ Yes |
530
+ | `vitest.config.ts` | Vitest test configuration | ✅ Yes |
531
+ | `.gitignore` | Git ignore patterns | ✅ Yes |
532
+ | `.eslintrc.js` or `eslint.config.js` | ESLint configuration | ✅ Yes |
533
+
534
+ ### Root Directory Rules
535
+
536
+ **MUST** keep root directory clean:
537
+
538
+ ✅ **Allowed in root:**
539
+ - Configuration files (`package.json`, `tsconfig.json`, etc.)
540
+ - Documentation (`README.md`, `CHANGELOG.md`)
541
+ - Build tool configs (`vite.config.ts`, etc.)
542
+ - `.cursor/` directory
543
+ - `.gitignore`, `.env.example`, etc.
544
+
545
+ ❌ **NOT allowed in root:**
546
+ - Source files (`*.ts`, `*.tsx`)
547
+ - Component files
548
+ - Test files
549
+ - Utility files
550
+
551
+ ---
552
+
553
+ ## Migration from Existing Projects
554
+
555
+ ### Common Migration Scenarios
556
+
557
+ This section provides patterns for migrating common project structures to the standard pace-core structure.
558
+
559
+ ### Scenario 1: Flat Component Structure
560
+
561
+ **Before:**
562
+ ```
563
+ src/
564
+ ├── Button.tsx
565
+ ├── Card.tsx
566
+ ├── EventCard.tsx
567
+ ├── UserCard.tsx
568
+ └── utils.ts
569
+ ```
570
+
571
+ **After:**
572
+ ```
573
+ src/
574
+ ├── components/
575
+ │ ├── events/
576
+ │ │ └── EventCard.tsx
577
+ │ ├── users/
578
+ │ │ └── UserCard.tsx
579
+ │ └── shared/ # If Button/Card are app-specific (otherwise use pace-core)
580
+ ├── utils/
581
+ │ └── index.ts
582
+ ```
583
+
584
+ **Migration Steps:**
585
+ 1. Group components by feature/domain
586
+ 2. Move to `src/components/[feature]/`
587
+ 3. Remove duplicate pace-core components (use pace-core instead)
588
+ 4. Update imports to use path aliases
589
+
590
+ ### Scenario 2: Type-Based Organization
591
+
592
+ **Before:**
593
+ ```
594
+ src/
595
+ ├── components/
596
+ │ ├── buttons/
597
+ │ ├── inputs/
598
+ │ └── cards/
599
+ └── hooks/
600
+ ├── useButton.ts
601
+ └── useInput.ts
602
+ ```
603
+
604
+ **After:**
605
+ ```
606
+ src/
607
+ ├── components/
608
+ │ ├── events/ # Feature-based
609
+ │ └── users/ # Feature-based
610
+ └── hooks/
611
+ ├── events/
612
+ └── users/
613
+ ```
614
+
615
+ **Migration Steps:**
616
+ 1. Identify features/domains in your app
617
+ 2. Reorganize by feature, not type
618
+ 3. Use pace-core for UI primitives (Button, Input, Card)
619
+ 4. Keep only feature-specific components
620
+
621
+ ### Scenario 3: Monolithic File Structure
622
+
623
+ **Before:**
624
+ ```
625
+ src/
626
+ ├── App.tsx
627
+ ├── components.tsx # All components in one file
628
+ ├── hooks.ts # All hooks in one file
629
+ └── utils.ts # All utilities in one file
630
+ ```
631
+
632
+ **After:**
633
+ ```
634
+ src/
635
+ ├── App.tsx
636
+ ├── components/
637
+ │ ├── events/
638
+ │ └── users/
639
+ ├── hooks/
640
+ │ ├── events/
641
+ │ └── users/
642
+ └── utils/
643
+ └── index.ts
644
+ ```
645
+
646
+ **Migration Steps:**
647
+ 1. Split monolithic files by feature
648
+ 2. Create feature directories
649
+ 3. Move related code together
650
+ 4. Update imports
651
+
652
+ ### Scenario 4: Mixed Root/Src Structure
653
+
654
+ **Before:**
655
+ ```
656
+ your-app/
657
+ ├── components/ # In root
658
+ ├── src/
659
+ │ └── pages/
660
+ └── utils.ts # In root
661
+ ```
662
+
663
+ **After:**
664
+ ```
665
+ your-app/
666
+ └── src/
667
+ ├── components/
668
+ ├── pages/
669
+ └── utils/
670
+ ```
671
+
672
+ **Migration Steps:**
673
+ 1. Move all source files to `src/`
674
+ 2. Consolidate into standard structure
675
+ 3. Update all import paths
676
+ 4. Update configuration files
677
+
678
+ ### Step-by-Step Migration Process
679
+
680
+ #### Phase 1: Preparation
681
+
682
+ 1. **Audit Current Structure**
683
+ ```bash
684
+ # Review your current structure
685
+ tree -L 3 -I 'node_modules' src/
686
+
687
+ # Find all imports
688
+ grep -r "import.*from" src/ | grep -E "\.\./|\.\.\/\.\." | head -20
689
+ ```
690
+
691
+ 2. **Create Backup Branch**
692
+ ```bash
693
+ git checkout -b migrate-project-structure
694
+ git commit -am "Backup before structure migration"
695
+ ```
696
+
697
+ 3. **Identify Features/Domains**
698
+ - List all features in your app
699
+ - Group related components/hooks/utils
700
+ - Identify pace-core duplicates
701
+
702
+ #### Phase 2: Structure Creation
703
+
704
+ 1. **Create New Structure**
705
+ ```bash
706
+ mkdir -p src/{components,hooks,pages,types,utils,lib}
707
+ mkdir -p src/components/{events,users,shared} # Your features
708
+ mkdir -p supabase/migrations
709
+ mkdir -p .cursor/rules
710
+ mkdir -p audit
711
+ ```
712
+
713
+ 2. **Move Files Incrementally**
714
+ - Start with one feature at a time
715
+ - Move components → `src/components/[feature]/`
716
+ - Move hooks → `src/hooks/[feature]/`
717
+ - Move pages → `src/pages/`
718
+ - Move types → `src/types/`
719
+ - Move utils → `src/utils/`
720
+
721
+ #### Phase 3: Import Updates
722
+
723
+ 1. **Configure Path Aliases**
724
+
725
+ Update `tsconfig.json`:
726
+ ```json
727
+ {
728
+ "compilerOptions": {
729
+ "baseUrl": ".",
730
+ "paths": {
731
+ "@/*": ["./src/*"],
732
+ "@/components/*": ["./src/components/*"],
733
+ "@/hooks/*": ["./src/hooks/*"],
734
+ "@/pages/*": ["./src/pages/*"],
735
+ "@/types/*": ["./src/types/*"],
736
+ "@/utils/*": ["./src/utils/*"]
737
+ }
738
+ }
739
+ }
740
+ ```
741
+
742
+ Update `vite.config.ts`:
743
+ ```typescript
744
+ import path from 'path';
745
+
746
+ export default defineConfig({
747
+ resolve: {
748
+ alias: {
749
+ '@': path.resolve(__dirname, './src'),
750
+ '@/components': path.resolve(__dirname, './src/components'),
751
+ // ... other aliases
752
+ },
753
+ },
754
+ });
755
+ ```
756
+
757
+ 2. **Update Imports**
758
+
759
+ Use find-and-replace (one feature at a time):
760
+ ```bash
761
+ # Example: Update EventCard imports
762
+ find src -type f -name "*.tsx" -exec sed -i '' 's|from.*EventCard|from "@/components/events/EventCard"|g' {} +
763
+ ```
764
+
765
+ #### Phase 4: Cleanup
766
+
767
+ 1. **Remove Duplicate pace-core Components**
768
+ ```bash
769
+ # Check for pace-core duplicates
770
+ node node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs
771
+ ```
772
+
773
+ 2. **Remove Empty Directories**
774
+ ```bash
775
+ find src -type d -empty -delete
776
+ ```
777
+
778
+ 3. **Update Tests**
779
+ - Update test imports to match new structure
780
+ - Ensure tests still pass
781
+
782
+ #### Phase 5: Verification
783
+
784
+ 1. **Install Cursor Rules**
785
+ ```bash
786
+ node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
787
+ ```
788
+
789
+ 2. **Run Compliance Checks**
790
+ ```bash
791
+ # Check pace-core compliance
792
+ node node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs
793
+ ```
794
+
795
+ 3. **Verify Build**
796
+ ```bash
797
+ npm run build
798
+ npm run test
799
+ ```
800
+
801
+ ### Migration Checklist
802
+
803
+ - [ ] Current structure audited
804
+ - [ ] Backup branch created
805
+ - [ ] Features/domains identified
806
+ - [ ] New structure created
807
+ - [ ] Files moved incrementally
808
+ - [ ] Path aliases configured
809
+ - [ ] Imports updated
810
+ - [ ] Duplicate pace-core components removed
811
+ - [ ] Tests updated and passing
812
+ - [ ] Cursor rules installed
813
+ - [ ] Compliance checks passing
814
+ - [ ] Build successful
815
+
816
+ ### Common Migration Issues
817
+
818
+ #### Issue: Circular Dependencies
819
+
820
+ **Problem:** Moving files creates circular imports
821
+
822
+ **Solution:**
823
+ - Identify circular dependencies
824
+ - Extract shared code to `src/utils/` or `src/types/`
825
+ - Use barrel exports carefully
826
+
827
+ #### Issue: Deep Relative Imports
828
+
829
+ **Problem:** Many `../../../` imports
830
+
831
+ **Solution:**
832
+ - Use path aliases (`@/components/...`)
833
+ - Update imports systematically
834
+ - Use find-and-replace or script
835
+
836
+ #### Issue: Test Failures
837
+
838
+ **Problem:** Tests fail after moving files
839
+
840
+ **Solution:**
841
+ - Update test imports
842
+ - Ensure path aliases work in test environment
843
+ - Update test setup files
844
+
845
+ ---
846
+
847
+ ## Structure Checklist
848
+
849
+ Before committing code, verify your project structure:
850
+
851
+ ### Directory Structure
852
+ - [ ] Standard directory structure followed
853
+ - [ ] Root directory contains only config files
854
+ - [ ] All source code in `src/`
855
+ - [ ] Migrations in `supabase/migrations/`
856
+ - [ ] Cursor rules installed in `.cursor/rules/`
857
+
858
+ ### File Organization
859
+ - [ ] Components organized by feature, not type
860
+ - [ ] Tests colocated with source files
861
+ - [ ] Naming conventions followed
862
+ - [ ] No duplicate pace-core components
863
+
864
+ ### Imports
865
+ - [ ] Path aliases configured (`@/` prefix)
866
+ - [ ] Absolute imports used (no deep relative paths)
867
+ - [ ] pace-core imported from package, not source
868
+ - [ ] No restricted imports (e.g., `@radix-ui/*`)
869
+
870
+ ### Configuration
871
+ - [ ] `tsconfig.json` has path aliases
872
+ - [ ] `vite.config.ts` has path aliases
873
+ - [ ] ESLint configured with pace-core rules
874
+ - [ ] All required config files present
875
+
876
+ ### Documentation
877
+ - [ ] `README.md` documents project structure
878
+ - [ ] Non-standard decisions documented
879
+ - [ ] Migration notes (if applicable)
880
+
881
+ ---
882
+
883
+ ## Common Mistakes to Avoid
884
+
885
+ ### ❌ Don't: Organize by Component Type
886
+
887
+ ```
888
+ src/components/
889
+ ├── buttons/ # ❌ Use pace-core Button instead
890
+ ├── inputs/ # ❌ Use pace-core Input instead
891
+ └── cards/ # ❌ Use pace-core Card instead
892
+ ```
893
+
894
+ ### ❌ Don't: Create Duplicate Components
895
+
896
+ ```tsx
897
+ // ❌ WRONG - Don't create local Button
898
+ // src/components/Button.tsx
899
+ export function Button() { }
900
+
901
+ // ✅ CORRECT - Use pace-core
902
+ import { Button } from '@jmruthers/pace-core';
903
+ ```
904
+
905
+ ### ❌ Don't: Use Deep Relative Imports
906
+
907
+ ```tsx
908
+ // ❌ WRONG
909
+ import { EventCard } from '../../../components/events/EventCard';
910
+
911
+ // ✅ CORRECT
912
+ import { EventCard } from '@/components/events/EventCard';
913
+ ```
914
+
915
+ ### ❌ Don't: Place Source Files in Root
916
+
917
+ ```
918
+ your-app/
919
+ ├── App.tsx # ❌ WRONG - Should be in src/
920
+ ├── components/ # ❌ WRONG - Should be in src/components/
921
+ └── utils.ts # ❌ WRONG - Should be in src/utils/
922
+ ```
923
+
924
+ ### ❌ Don't: Modify pace-core Code
925
+
926
+ ```tsx
927
+ // ❌ WRONG - Don't import from pace-core source
928
+ import { Button } from '@jmruthers/pace-core/src/components/Button';
929
+
930
+ // ✅ CORRECT - Import from package
931
+ import { Button } from '@jmruthers/pace-core';
932
+ ```
933
+
934
+ ---
935
+
936
+ ## Related Documentation
937
+
938
+ - [Standards Overview](./0-standards-overview.md) - Standards system overview
939
+ - [pace-core Compliance](./1-pace-core-compliance-standards.md) - pace-core usage patterns
940
+ - [Styling Standards](./5-styling-standards.md) - **CRITICAL: Required CSS configuration**
941
+ - [Code Quality](./4-code-quality-standards.md) - Code style and TypeScript standards
942
+ - [API & Tech Stack](./7-api-tech-stack-standards.md) - Tech stack requirements
943
+ - [Architecture](./3-architecture-standards.md) - Architecture principles
944
+
945
+ ---
946
+
947
+ **Last Updated:** 2025-01-28
948
+ **Version:** 2.0.0
949
+ **Applies to:** All consuming apps using `@jmruthers/pace-core`