@jmruthers/pace-core 0.6.4 → 0.6.6

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 (387) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/core-usage-manifest.json +93 -0
  4. package/cursor-rules/00-pace-core-compliance.mdc +128 -26
  5. package/cursor-rules/01-standards-compliance.mdc +49 -8
  6. package/cursor-rules/02-project-structure.mdc +6 -0
  7. package/cursor-rules/03-solid-principles.mdc +2 -0
  8. package/cursor-rules/04-testing-standards.mdc +2 -0
  9. package/cursor-rules/05-bug-reports-and-features.mdc +2 -0
  10. package/cursor-rules/06-code-quality.mdc +2 -0
  11. package/cursor-rules/07-tech-stack-compliance.mdc +2 -0
  12. package/cursor-rules/08-markup-quality.mdc +52 -27
  13. package/cursor-rules/09-rbac-compliance.mdc +462 -0
  14. package/cursor-rules/10-error-handling-patterns.mdc +179 -0
  15. package/cursor-rules/11-performance-optimization.mdc +169 -0
  16. package/cursor-rules/12-ci-cd-integration.mdc +150 -0
  17. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  18. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-2N_tqbfq.d.ts} +1 -1
  19. package/dist/DataTable-LRJL4IRV.js +15 -0
  20. package/dist/{PublicPageProvider-DEMpysFR.d.ts → PublicPageProvider-BBH6Vqg7.d.ts} +72 -139
  21. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  22. package/dist/api-Y4MQWOFW.js +4 -0
  23. package/dist/audit-MYQXYZFU.js +3 -0
  24. package/dist/{chunk-J36DSWQK.js → chunk-2HGJFNAH.js} +8 -28
  25. package/dist/{chunk-OEWDTMG7.js → chunk-3O3WHILE.js} +38 -121
  26. package/dist/{chunk-M43Y4SSO.js → chunk-3QC3KRHK.js} +1 -14
  27. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  28. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  29. package/dist/chunk-4T7OBVTU.js +62 -0
  30. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  31. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  32. package/dist/{chunk-NN6WWZ5U.js → chunk-7TYHROIV.js} +579 -563
  33. package/dist/{chunk-M7MPQISP.js → chunk-A55DK444.js} +9 -16
  34. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  35. package/dist/{chunk-L4OXEN46.js → chunk-BVP2BCJF.js} +2 -16
  36. package/dist/chunk-C7NSAPTL.js +1 -0
  37. package/dist/{chunk-YKRAFF5K.js → chunk-FENMYN2U.js} +73 -149
  38. package/dist/{chunk-AVMLPIM7.js → chunk-FTCRZOG2.js} +284 -432
  39. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  40. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  41. package/dist/{chunk-I6DAQMWX.js → chunk-LAZMKTTF.js} +930 -891
  42. package/dist/{chunk-5EC5MEWX.js → chunk-MAGBIDNS.js} +77 -222
  43. package/dist/chunk-MBADTM7L.js +64 -0
  44. package/dist/chunk-OHIK3MIO.js +994 -0
  45. package/dist/{chunk-6SOIHG6Z.js → chunk-S7DKJPLT.js} +115 -44
  46. package/dist/{chunk-FMUCXFII.js → chunk-SD6WQY43.js} +1 -5
  47. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  48. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  49. package/dist/{chunk-FFQEQTNW.js → chunk-UIYSCEV7.js} +134 -45
  50. package/dist/{chunk-3LPHPB62.js → chunk-ZFYPMX46.js} +271 -87
  51. package/dist/{chunk-7JPAB3T5.js → chunk-ZS5VO5JB.js} +1989 -1283
  52. package/dist/components.d.ts +6 -6
  53. package/dist/components.js +57 -267
  54. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  55. package/dist/eslint-rules/index.cjs +22 -0
  56. package/dist/eslint-rules/rules/compliance.cjs +348 -0
  57. package/dist/eslint-rules/rules/components.cjs +113 -0
  58. package/dist/eslint-rules/rules/imports.cjs +102 -0
  59. package/dist/eslint-rules/rules/rbac.cjs +790 -0
  60. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  61. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  62. package/dist/hooks.d.ts +5 -5
  63. package/dist/hooks.js +62 -270
  64. package/dist/icons/index.d.ts +1 -0
  65. package/dist/icons/index.js +1 -0
  66. package/dist/index.d.ts +36 -26
  67. package/dist/index.js +87 -690
  68. package/dist/providers.d.ts +2 -2
  69. package/dist/providers.js +8 -35
  70. package/dist/rbac/eslint-rules.d.ts +46 -44
  71. package/dist/rbac/eslint-rules.js +7 -4
  72. package/dist/rbac/index.d.ts +124 -594
  73. package/dist/rbac/index.js +14 -207
  74. package/dist/styles/index.js +2 -12
  75. package/dist/theming/runtime.js +3 -19
  76. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  77. package/dist/{types-CkbwOr4Y.d.ts → types-B-K_5VnO.d.ts} +4 -0
  78. package/dist/types-t9H8qKRw.d.ts +55 -0
  79. package/dist/types.d.ts +1 -1
  80. package/dist/types.js +7 -94
  81. package/dist/{usePublicRouteParams-i3qtoBgg.d.ts → usePublicRouteParams-COZ28Mvq.d.ts} +9 -9
  82. package/dist/utils.d.ts +24 -117
  83. package/dist/utils.js +54 -392
  84. package/docs/README.md +16 -6
  85. package/docs/api/README.md +4 -402
  86. package/docs/api/modules.md +454 -930
  87. package/docs/api-reference/components.md +3 -1
  88. package/docs/api-reference/deprecated.md +31 -6
  89. package/docs/api-reference/rpc-functions.md +78 -3
  90. package/docs/best-practices/accessibility.md +6 -3
  91. package/docs/getting-started/cursor-rules.md +3 -23
  92. package/docs/getting-started/dependencies.md +650 -0
  93. package/docs/getting-started/installation-guide.md +20 -7
  94. package/docs/getting-started/quick-start.md +23 -12
  95. package/docs/implementation-guides/permission-enforcement.md +4 -0
  96. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  97. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  98. package/docs/rbac/README.md +12 -3
  99. package/docs/rbac/edge-functions-guide.md +376 -0
  100. package/docs/rbac/secure-client-protection.md +0 -34
  101. package/docs/standards/00-pace-core-compliance.md +967 -0
  102. package/docs/standards/01-standards-compliance.md +188 -0
  103. package/docs/standards/02-project-structure.md +985 -0
  104. package/docs/standards/03-solid-principles.md +39 -0
  105. package/docs/standards/04-testing-standards.md +36 -0
  106. package/docs/standards/05-bug-reports-and-features.md +27 -0
  107. package/docs/standards/{04-code-style-standard.md → 06-code-quality.md} +2 -0
  108. package/docs/standards/07-tech-stack-compliance.md +30 -0
  109. package/docs/standards/08-markup-quality.md +345 -0
  110. package/docs/standards/{07-rbac-and-rls-standard.md → 09-rbac-compliance.md} +149 -54
  111. package/docs/standards/10-error-handling-patterns.md +401 -0
  112. package/docs/standards/11-performance-optimization.md +348 -0
  113. package/docs/standards/12-ci-cd-integration.md +370 -0
  114. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +192 -0
  115. package/docs/standards/README.md +62 -33
  116. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  117. package/eslint-config-pace-core.cjs +20 -4
  118. package/package.json +31 -21
  119. package/scripts/audit/audit-compliance.cjs +1295 -0
  120. package/scripts/audit/audit-components.cjs +260 -0
  121. package/scripts/audit/audit-dependencies.cjs +395 -0
  122. package/scripts/audit/audit-rbac.cjs +954 -0
  123. package/scripts/audit/audit-standards.cjs +1268 -0
  124. package/scripts/audit/index.cjs +1898 -194
  125. package/scripts/install-cursor-rules.cjs +259 -8
  126. package/scripts/validate-master.js +1 -1
  127. package/src/__tests__/fixtures/supabase.ts +1 -1
  128. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +1 -1
  129. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  130. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  131. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +3 -3
  132. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  133. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  134. package/src/__tests__/public-recipe-view.test.ts +38 -9
  135. package/src/components/Button/Button.tsx +5 -1
  136. package/src/components/ContextSelector/ContextSelector.tsx +42 -39
  137. package/src/components/DataTable/__tests__/keyboard.test.tsx +15 -2
  138. package/src/components/DataTable/components/DataTableBody.tsx +55 -31
  139. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  140. package/src/components/DataTable/components/DataTableLayout.tsx +30 -5
  141. package/src/components/DataTable/components/EditFields.tsx +23 -3
  142. package/src/components/DataTable/components/EditableRow.tsx +7 -2
  143. package/src/components/DataTable/components/ImportModal.tsx +4 -6
  144. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  145. package/src/components/DataTable/components/ViewRowModal.tsx +4 -4
  146. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +455 -96
  147. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +122 -58
  148. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  149. package/src/components/DataTable/core/DataTableContext.tsx +1 -1
  150. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  151. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  152. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  153. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  154. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  155. package/src/components/DataTable/types.ts +5 -0
  156. package/src/components/DateTimeField/DateTimeField.tsx +20 -20
  157. package/src/components/DateTimeField/README.md +5 -2
  158. package/src/components/Dialog/Dialog.test.tsx +361 -318
  159. package/src/components/Dialog/Dialog.tsx +1154 -323
  160. package/src/components/Dialog/index.ts +3 -3
  161. package/src/components/FileDisplay/FileDisplay.test.tsx +45 -2
  162. package/src/components/FileDisplay/FileDisplay.tsx +28 -22
  163. package/src/components/Form/Form.test.tsx +9 -10
  164. package/src/components/Form/Form.tsx +369 -9
  165. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +28 -28
  166. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +40 -54
  167. package/src/components/LoginForm/LoginForm.tsx +2 -2
  168. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  169. package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
  170. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  171. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  172. package/src/components/PaceAppLayout/PaceAppLayout.tsx +30 -41
  173. package/src/components/PaceAppLayout/README.md +10 -9
  174. package/src/components/PaceAppLayout/test-setup.tsx +40 -31
  175. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  176. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  177. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +61 -0
  178. package/src/components/PasswordChange/PasswordChangeForm.tsx +20 -13
  179. package/src/components/PublicLayout/PublicLayout.test.tsx +7 -3
  180. package/src/components/PublicLayout/PublicPageLayout.tsx +5 -8
  181. package/src/components/Select/Select.tsx +23 -21
  182. package/src/components/Select/types.ts +1 -1
  183. package/src/components/UserMenu/UserMenu.test.tsx +38 -6
  184. package/src/components/UserMenu/UserMenu.tsx +39 -34
  185. package/src/components/index.ts +3 -4
  186. package/src/eslint-rules/index.cjs +22 -0
  187. package/src/eslint-rules/rules/compliance.cjs +348 -0
  188. package/src/eslint-rules/rules/components.cjs +113 -0
  189. package/src/eslint-rules/rules/imports.cjs +102 -0
  190. package/src/eslint-rules/rules/rbac.cjs +790 -0
  191. package/src/eslint-rules/utils/helpers.cjs +42 -0
  192. package/src/eslint-rules/utils/manifest-loader.cjs +75 -0
  193. package/src/hooks/__tests__/hooks.integration.test.tsx +6 -8
  194. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  195. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  196. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  197. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  198. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  199. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  200. package/src/hooks/public/usePublicEvent.ts +62 -190
  201. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  202. package/src/hooks/public/usePublicEventLogo.ts +19 -9
  203. package/src/hooks/useAppConfig.ts +26 -24
  204. package/src/hooks/useEventTheme.test.ts +211 -233
  205. package/src/hooks/useEventTheme.ts +19 -28
  206. package/src/hooks/useEvents.ts +11 -7
  207. package/src/hooks/useKeyboardShortcuts.ts +1 -1
  208. package/src/hooks/useOrganisationPermissions.ts +9 -11
  209. package/src/hooks/useOrganisations.ts +13 -7
  210. package/src/hooks/useQueryCache.ts +0 -1
  211. package/src/hooks/useSessionDraft.ts +380 -0
  212. package/src/hooks/useSessionRestoration.ts +3 -1
  213. package/src/icons/index.ts +27 -0
  214. package/src/index.ts +16 -1
  215. package/src/providers/OrganisationProvider.tsx +23 -14
  216. package/src/providers/services/EventServiceProvider.tsx +1 -24
  217. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  218. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -0
  219. package/src/rbac/README.md +20 -20
  220. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  221. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  222. package/src/rbac/adapters.tsx +7 -295
  223. package/src/rbac/api.test.ts +44 -56
  224. package/src/rbac/api.ts +10 -17
  225. package/src/rbac/cache-invalidation.ts +0 -1
  226. package/src/rbac/compliance/index.ts +10 -0
  227. package/src/rbac/compliance/pattern-detector.ts +553 -0
  228. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  229. package/src/rbac/components/AccessDenied.tsx +150 -0
  230. package/src/rbac/components/NavigationGuard.tsx +12 -20
  231. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  232. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  233. package/src/rbac/components/index.ts +3 -41
  234. package/src/rbac/eslint-rules.js +1 -1
  235. package/src/rbac/hooks/index.ts +0 -3
  236. package/src/rbac/hooks/permissions/index.ts +0 -3
  237. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  238. package/src/rbac/hooks/usePermissions.ts +0 -3
  239. package/src/rbac/hooks/useRBAC.test.ts +21 -3
  240. package/src/rbac/hooks/useRBAC.ts +4 -3
  241. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  242. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  243. package/src/rbac/hooks/useResourcePermissions.test.ts +241 -60
  244. package/src/rbac/hooks/useResourcePermissions.ts +182 -63
  245. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  246. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  247. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  248. package/src/rbac/index.ts +7 -9
  249. package/src/rbac/permissions.ts +17 -17
  250. package/src/rbac/utils/contextValidator.ts +45 -7
  251. package/src/services/AuthService.ts +132 -23
  252. package/src/services/EventService.ts +4 -97
  253. package/src/services/InactivityService.ts +155 -58
  254. package/src/services/OrganisationService.ts +7 -44
  255. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  256. package/src/services/base/BaseService.ts +0 -3
  257. package/src/styles/core.css +4 -0
  258. package/src/types/database.generated.ts +4733 -3809
  259. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  260. package/src/utils/context/organisationContext.test.ts +13 -28
  261. package/src/utils/context/organisationContext.ts +21 -52
  262. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  263. package/src/utils/file-reference/index.ts +39 -15
  264. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  265. package/src/utils/formatting/formatTime.test.ts +3 -2
  266. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  267. package/src/utils/index.ts +4 -1
  268. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  269. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  270. package/src/utils/persistence/keyDerivation.ts +304 -0
  271. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  272. package/src/utils/security/secureStorage.ts +5 -5
  273. package/src/utils/storage/helpers.ts +3 -3
  274. package/src/utils/supabase/createBaseClient.ts +147 -0
  275. package/src/utils/timezone/timezone.test.ts +1 -2
  276. package/src/utils/timezone/timezone.ts +1 -1
  277. package/src/utils/validation/csrf.ts +4 -4
  278. package/cursor-rules/CHANGELOG.md +0 -119
  279. package/cursor-rules/README.md +0 -192
  280. package/dist/DataTable-E7YQZD7D.js +0 -175
  281. package/dist/DataTable-E7YQZD7D.js.map +0 -1
  282. package/dist/UnifiedAuthProvider-QPXO24B4.js +0 -18
  283. package/dist/UnifiedAuthProvider-QPXO24B4.js.map +0 -1
  284. package/dist/api-6LVZTHDS.js +0 -52
  285. package/dist/api-6LVZTHDS.js.map +0 -1
  286. package/dist/audit-V53FV5AG.js +0 -17
  287. package/dist/audit-V53FV5AG.js.map +0 -1
  288. package/dist/chunk-36LVWXB2.js +0 -227
  289. package/dist/chunk-36LVWXB2.js.map +0 -1
  290. package/dist/chunk-3LPHPB62.js.map +0 -1
  291. package/dist/chunk-5DRSZLL2.js.map +0 -1
  292. package/dist/chunk-5EC5MEWX.js.map +0 -1
  293. package/dist/chunk-63FOKYGO.js.map +0 -1
  294. package/dist/chunk-6SOIHG6Z.js.map +0 -1
  295. package/dist/chunk-7JPAB3T5.js.map +0 -1
  296. package/dist/chunk-ATKZM7RX.js +0 -2053
  297. package/dist/chunk-ATKZM7RX.js.map +0 -1
  298. package/dist/chunk-AVMLPIM7.js.map +0 -1
  299. package/dist/chunk-DGUM43GV.js.map +0 -1
  300. package/dist/chunk-E66EQZE6.js.map +0 -1
  301. package/dist/chunk-FFQEQTNW.js.map +0 -1
  302. package/dist/chunk-FMUCXFII.js.map +0 -1
  303. package/dist/chunk-G37KK66H.js.map +0 -1
  304. package/dist/chunk-I6DAQMWX.js.map +0 -1
  305. package/dist/chunk-J36DSWQK.js.map +0 -1
  306. package/dist/chunk-KQCRWDSA.js +0 -1
  307. package/dist/chunk-KQCRWDSA.js.map +0 -1
  308. package/dist/chunk-L4OXEN46.js.map +0 -1
  309. package/dist/chunk-LMC26NLJ.js +0 -84
  310. package/dist/chunk-LMC26NLJ.js.map +0 -1
  311. package/dist/chunk-M43Y4SSO.js.map +0 -1
  312. package/dist/chunk-M7MPQISP.js.map +0 -1
  313. package/dist/chunk-NN6WWZ5U.js.map +0 -1
  314. package/dist/chunk-OEWDTMG7.js.map +0 -1
  315. package/dist/chunk-PWLANIRT.js.map +0 -1
  316. package/dist/chunk-QXHPKYJV.js.map +0 -1
  317. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  318. package/dist/chunk-YKRAFF5K.js.map +0 -1
  319. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  320. package/dist/components.js.map +0 -1
  321. package/dist/contextValidator-OOPCLPZW.js +0 -9
  322. package/dist/contextValidator-OOPCLPZW.js.map +0 -1
  323. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  324. package/dist/hooks.js.map +0 -1
  325. package/dist/index.js.map +0 -1
  326. package/dist/providers.js.map +0 -1
  327. package/dist/rbac/eslint-rules.js.map +0 -1
  328. package/dist/rbac/index.js.map +0 -1
  329. package/dist/styles/index.js.map +0 -1
  330. package/dist/theming/runtime.js.map +0 -1
  331. package/dist/types.js.map +0 -1
  332. package/dist/utils.js.map +0 -1
  333. package/docs/standards/01-architecture-standard.md +0 -44
  334. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  335. package/docs/standards/03-component-standard.md +0 -32
  336. package/docs/standards/05-security-standard.md +0 -44
  337. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  338. package/docs/standards/pace-core-compliance.md +0 -432
  339. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  340. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  341. package/scripts/audit/core/checks/bundle.cjs +0 -142
  342. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  343. package/scripts/audit/core/checks/config.cjs +0 -54
  344. package/scripts/audit/core/checks/coverage.cjs +0 -84
  345. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  346. package/scripts/audit/core/checks/documentation.cjs +0 -268
  347. package/scripts/audit/core/checks/environment.cjs +0 -116
  348. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  349. package/scripts/audit/core/checks/forms.cjs +0 -172
  350. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  351. package/scripts/audit/core/checks/hooks.cjs +0 -334
  352. package/scripts/audit/core/checks/imports.cjs +0 -244
  353. package/scripts/audit/core/checks/performance.cjs +0 -325
  354. package/scripts/audit/core/checks/routes.cjs +0 -117
  355. package/scripts/audit/core/checks/state.cjs +0 -130
  356. package/scripts/audit/core/checks/structure.cjs +0 -65
  357. package/scripts/audit/core/checks/style.cjs +0 -584
  358. package/scripts/audit/core/checks/testing.cjs +0 -122
  359. package/scripts/audit/core/checks/typescript.cjs +0 -61
  360. package/scripts/audit/core/scanner.cjs +0 -199
  361. package/scripts/audit/core/utils.cjs +0 -137
  362. package/scripts/audit/reporters/console.cjs +0 -151
  363. package/scripts/audit/reporters/json.cjs +0 -54
  364. package/scripts/audit/reporters/markdown.cjs +0 -124
  365. package/scripts/audit-consuming-app.cjs +0 -86
  366. package/src/eslint-rules/pace-core-compliance.cjs +0 -510
  367. package/src/eslint-rules/pace-core-compliance.js +0 -638
  368. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  369. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  370. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  371. package/src/rbac/components/NavigationProvider.tsx +0 -345
  372. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  373. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  374. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  375. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  376. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  377. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  378. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  379. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  380. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  381. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  382. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  383. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  384. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  385. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  386. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  387. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -0,0 +1,985 @@
1
+ # Project Structure Guide for Consuming Apps
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-pace-core-compliance.mdc
41
+ │ ├── 01-standards-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 08-markup-quality.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
+ Or use a script:
766
+ ```typescript
767
+ // scripts/update-imports.ts
768
+ // Update imports programmatically
769
+ ```
770
+
771
+ #### Phase 4: Cleanup
772
+
773
+ 1. **Remove Duplicate pace-core Components**
774
+ ```bash
775
+ # Check for pace-core duplicates
776
+ node node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs
777
+ ```
778
+
779
+ 2. **Remove Empty Directories**
780
+ ```bash
781
+ find src -type d -empty -delete
782
+ ```
783
+
784
+ 3. **Update Tests**
785
+ - Update test imports to match new structure
786
+ - Ensure tests still pass
787
+
788
+ #### Phase 5: Verification
789
+
790
+ 1. **Install Cursor Rules**
791
+ ```bash
792
+ node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
793
+ ```
794
+
795
+ 2. **Run Compliance Checks**
796
+ ```bash
797
+ # Check pace-core compliance
798
+ node node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs
799
+
800
+ ```
801
+
802
+ 3. **Verify Build**
803
+ ```bash
804
+ npm run build
805
+ npm run test
806
+ ```
807
+
808
+ ### Migration Checklist
809
+
810
+ - [ ] Current structure audited
811
+ - [ ] Backup branch created
812
+ - [ ] Features/domains identified
813
+ - [ ] New structure created
814
+ - [ ] Files moved incrementally
815
+ - [ ] Path aliases configured
816
+ - [ ] Imports updated
817
+ - [ ] Duplicate pace-core components removed
818
+ - [ ] Tests updated and passing
819
+ - [ ] Cursor rules installed
820
+ - [ ] Compliance checks passing
821
+ - [ ] Build successful
822
+
823
+ ### Common Migration Issues
824
+
825
+ #### Issue: Circular Dependencies
826
+
827
+ **Problem:** Moving files creates circular imports
828
+
829
+ **Solution:**
830
+ - Identify circular dependencies
831
+ - Extract shared code to `src/utils/` or `src/types/`
832
+ - Use barrel exports carefully
833
+
834
+ #### Issue: Deep Relative Imports
835
+
836
+ **Problem:** Many `../../../` imports
837
+
838
+ **Solution:**
839
+ - Use path aliases (`@/components/...`)
840
+ - Update imports systematically
841
+ - Use find-and-replace or script
842
+
843
+ #### Issue: Test Failures
844
+
845
+ **Problem:** Tests fail after moving files
846
+
847
+ **Solution:**
848
+ - Update test imports
849
+ - Ensure path aliases work in test environment
850
+ - Update test setup files
851
+
852
+ ### Migration Tools
853
+
854
+ **Automated Import Updates:**
855
+ ```bash
856
+ # Using jscodeshift (if available)
857
+ npx jscodeshift -t transform-imports src/
858
+ ```
859
+
860
+ **Manual Find-and-Replace:**
861
+ ```bash
862
+ # Update specific import patterns
863
+ find src -type f -name "*.tsx" -exec sed -i '' 's|old/path|new/path|g' {} +
864
+ ```
865
+
866
+ **TypeScript Compiler:**
867
+ ```bash
868
+ # Check for import errors
869
+ npx tsc --noEmit
870
+ ```
871
+
872
+ ---
873
+
874
+ ## Structure Checklist
875
+
876
+ Before committing code, verify your project structure:
877
+
878
+ ### Directory Structure
879
+ - [ ] Standard directory structure followed
880
+ - [ ] Root directory contains only config files
881
+ - [ ] All source code in `src/`
882
+ - [ ] Migrations in `supabase/migrations/`
883
+ - [ ] Cursor rules installed in `.cursor/rules/`
884
+
885
+ ### File Organization
886
+ - [ ] Components organized by feature, not type
887
+ - [ ] Tests colocated with source files
888
+ - [ ] Naming conventions followed
889
+ - [ ] No duplicate pace-core components
890
+
891
+ ### Imports
892
+ - [ ] Path aliases configured (`@/` prefix)
893
+ - [ ] Absolute imports used (no deep relative paths)
894
+ - [ ] pace-core imported from package, not source
895
+ - [ ] No restricted imports (e.g., `@radix-ui/*`)
896
+
897
+ ### Configuration
898
+ - [ ] `tsconfig.json` has path aliases
899
+ - [ ] `vite.config.ts` has path aliases
900
+ - [ ] ESLint configured with pace-core rules
901
+ - [ ] All required config files present
902
+
903
+ ### Documentation
904
+ - [ ] `README.md` documents project structure
905
+ - [ ] Non-standard decisions documented
906
+ - [ ] Migration notes (if applicable)
907
+
908
+ ---
909
+
910
+ ## Common Mistakes to Avoid
911
+
912
+ ### ❌ Don't: Organize by Component Type
913
+
914
+ ```
915
+ src/components/
916
+ ├── buttons/ # ❌ Use pace-core Button instead
917
+ ├── inputs/ # ❌ Use pace-core Input instead
918
+ └── cards/ # ❌ Use pace-core Card instead
919
+ ```
920
+
921
+ ### ❌ Don't: Create Duplicate Components
922
+
923
+ ```tsx
924
+ // ❌ WRONG - Don't create local Button
925
+ // src/components/Button.tsx
926
+ export function Button() { }
927
+
928
+ // ✅ CORRECT - Use pace-core
929
+ import { Button } from '@jmruthers/pace-core';
930
+ ```
931
+
932
+ ### ❌ Don't: Use Deep Relative Imports
933
+
934
+ ```tsx
935
+ // ❌ WRONG
936
+ import { EventCard } from '../../../components/events/EventCard';
937
+
938
+ // ✅ CORRECT
939
+ import { EventCard } from '@/components/events/EventCard';
940
+ ```
941
+
942
+ ### ❌ Don't: Place Source Files in Root
943
+
944
+ ```
945
+ your-app/
946
+ ├── App.tsx # ❌ WRONG - Should be in src/
947
+ ├── components/ # ❌ WRONG - Should be in src/components/
948
+ └── utils.ts # ❌ WRONG - Should be in src/utils/
949
+ ```
950
+
951
+ ### ❌ Don't: Modify pace-core Code
952
+
953
+ ```tsx
954
+ // ❌ WRONG - Don't import from pace-core source
955
+ import { Button } from '@jmruthers/pace-core/src/components/Button';
956
+
957
+ // ✅ CORRECT - Import from package
958
+ import { Button } from '@jmruthers/pace-core';
959
+ ```
960
+
961
+ ---
962
+
963
+ ## Getting Help
964
+
965
+ - **Documentation**: See [pace-core documentation](../../README.md)
966
+ - **Standards**: Review other standards in this directory
967
+ - **Cursor Rules**: Check `.cursor/rules/` for automated enforcement
968
+
969
+ ---
970
+
971
+ ## Related Documentation
972
+
973
+ - [pace-core Compliance](./00-pace-core-compliance.md) - pace-core usage patterns
974
+ - [Markup Quality](./08-markup-quality.md) - **CRITICAL: Required CSS configuration**
975
+ - [Code Quality](./06-code-quality.md) - Code style and TypeScript standards
976
+ - [Tech Stack](./07-tech-stack-compliance.md) - Tech stack requirements
977
+ - [SOLID Principles](./03-solid-principles.md) - Architecture principles
978
+ - [Cursor Rules Documentation](../../getting-started/cursor-rules.md)
979
+
980
+ ---
981
+
982
+ **Last Updated:** 2025-01-28
983
+ **Version:** 1.0.0
984
+ **Applies to:** All consuming apps using `@jmruthers/pace-core`
985
+