@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
@@ -1,268 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Documentation Check Module
5
- * @package @jmruthers/pace-core
6
- * @module Audit/Checks/Documentation
7
- *
8
- * Checks for:
9
- * - Missing JSDoc on exported functions/components
10
- * - Missing README updates
11
- * - Outdated comments
12
- */
13
-
14
- const fs = require('fs');
15
- const path = require('path');
16
- const { getRelativePath, getLineNumber } = require('../utils.cjs');
17
-
18
- const documentationCheck = {
19
- name: 'documentation',
20
- description: 'Documentation coverage (JSDoc, README)',
21
- severity: 'suggestion',
22
-
23
- async run(context) {
24
- const { projectRoot, files } = context;
25
- const issues = [];
26
- const warnings = [];
27
- const suggestions = [];
28
-
29
- if (!files || files.length === 0) {
30
- return { issues, warnings, suggestions };
31
- }
32
-
33
- // Detect if this is the pace-core repository itself
34
- const packagesCorePath = path.join(projectRoot, 'packages', 'core');
35
- const isPaceCoreRepository = fs.existsSync(packagesCorePath);
36
-
37
- // Check for README
38
- const readmePath = path.join(projectRoot, 'README.md');
39
- if (!fs.existsSync(readmePath)) {
40
- suggestions.push({
41
- type: 'missing-readme',
42
- file: 'README.md',
43
- message: 'README.md file is missing',
44
- recommendation: 'Create a README.md with project description, setup instructions, and usage examples'
45
- });
46
- }
47
-
48
- // Check for JSDoc on exported functions/components
49
- for (const filePath of files) {
50
- try {
51
- const content = fs.readFileSync(filePath, 'utf8');
52
- const relativePath = getRelativePath(filePath, projectRoot);
53
- const normalizedPath = relativePath.replace(/\\/g, '/');
54
-
55
- // Skip test files
56
- if (normalizedPath.includes('.test.') || normalizedPath.includes('.spec.')) {
57
- continue;
58
- }
59
-
60
- // Skip test directories
61
- if (normalizedPath.includes('/__tests__/') || normalizedPath.includes('__tests__/')) {
62
- continue;
63
- }
64
-
65
- // Skip scripts directory (build/test scripts, not public API)
66
- if (normalizedPath.includes('/scripts/') || normalizedPath.startsWith('scripts/')) {
67
- continue;
68
- }
69
-
70
- // Skip generated files
71
- if (normalizedPath.includes('.generated.') || normalizedPath.includes('.gen.')) {
72
- continue;
73
- }
74
-
75
- // When running in pace-core repository, skip non-public API files
76
- if (isPaceCoreRepository) {
77
- // Skip examples - these are demonstration code, not public API
78
- if (normalizedPath.includes('packages/core/examples/') ||
79
- normalizedPath.startsWith('packages/core/examples/')) {
80
- continue;
81
- }
82
-
83
- // Skip root-level src directory - in pace-core repository, this is a demo/showcase app
84
- if (normalizedPath.startsWith('src/') && !normalizedPath.startsWith('packages/core/src/')) {
85
- continue;
86
- }
87
-
88
- // Skip test setup files
89
- if (normalizedPath.includes('test-setup.') || normalizedPath.includes('test-setup/')) {
90
- continue;
91
- }
92
-
93
- // Skip database.generated.ts - this is a generated file
94
- if (normalizedPath.includes('database.generated.ts')) {
95
- continue;
96
- }
97
- }
98
-
99
- // Find exported functions/components
100
- // Match various export patterns:
101
- // - export function Name
102
- // - export const Name = ...
103
- // - export class Name
104
- // - export interface Name
105
- // - export type Name
106
- // - export default function Name
107
- // - export default const Name = ...
108
- const exportPattern = /export\s+(?:default\s+)?(?:async\s+)?(function|const|class|interface|type)\s+(\w+)/g;
109
- let match;
110
- while ((match = exportPattern.exec(content)) !== null) {
111
- const exportName = match[2];
112
- const exportType = match[1];
113
- const exportIndex = match.index;
114
-
115
- // Check if there's JSDoc before this export
116
- // Search backwards up to 2000 characters, but stop at:
117
- // - Previous export statement
118
- // - Previous function/class/interface/type declaration (non-exported)
119
- // - File start
120
- const searchStart = Math.max(0, exportIndex - 2000);
121
- const beforeExport = content.substring(searchStart, exportIndex);
122
-
123
- // Find the last export/declaration before this one to avoid false positives
124
- // from JSDoc comments that belong to previous exports
125
- const previousExportMatch = beforeExport.match(/export\s+(?:default\s+)?(?:async\s+)?(function|const|class|interface|type)\s+\w+/);
126
- const previousDeclMatch = beforeExport.match(/(?:^|\n)\s*(?:async\s+)?(function|const|class|interface|type)\s+\w+/);
127
-
128
- let searchWindow = beforeExport;
129
- if (previousExportMatch && previousExportMatch.index !== undefined) {
130
- // Start search after the previous export
131
- const prevExportEnd = previousExportMatch.index + previousExportMatch[0].length;
132
- searchWindow = beforeExport.substring(prevExportEnd);
133
- } else if (previousDeclMatch && previousDeclMatch.index !== undefined) {
134
- // Start search after the previous declaration (but be more lenient)
135
- const prevDeclEnd = previousDeclMatch.index + previousDeclMatch[0].length;
136
- // Only use this if it's close to our export (within 500 chars)
137
- if (prevDeclEnd > beforeExport.length - 500) {
138
- searchWindow = beforeExport.substring(prevDeclEnd);
139
- }
140
- }
141
-
142
- // Check for JSDoc in the search window
143
- // Look for standard JSDoc block comments /** ... */
144
- // Also check for TypeScript triple-slash reference comments /// <
145
- // Check if JSDoc ends close to our export (within last 100 chars of search window)
146
- const jsdocBlockMatch = searchWindow.match(/\/\*\*[\s\S]*?\*\//g);
147
- const jsdocRefMatch = searchWindow.match(/\/\/\/\s*</g);
148
-
149
- let hasJSDoc = false;
150
-
151
- // Check if JSDoc block comment ends close to our export
152
- if (jsdocBlockMatch && jsdocBlockMatch.length > 0) {
153
- const lastJSDoc = jsdocBlockMatch[jsdocBlockMatch.length - 1];
154
- const lastJSDocEnd = searchWindow.lastIndexOf(lastJSDoc) + lastJSDoc.length;
155
- // JSDoc is considered associated if it ends within 200 characters of the export
156
- // or if there's only whitespace/comments between JSDoc and export
157
- const distanceToExport = searchWindow.length - lastJSDocEnd;
158
- const betweenJSDocAndExport = searchWindow.substring(lastJSDocEnd);
159
- // Check if there's only whitespace, comments, or newlines between JSDoc and export
160
- // Remove all whitespace and single-line comments, then check if anything remains
161
- const cleanedBetween = betweenJSDocAndExport
162
- .replace(/\/\/.*$/gm, '') // Remove single-line comments
163
- .replace(/\/\*[\s\S]*?\*\//g, '') // Remove block comments (shouldn't be here, but just in case)
164
- .replace(/[\s\n\r]/g, ''); // Remove all whitespace
165
- const onlyWhitespaceBetween = cleanedBetween.length === 0;
166
- hasJSDoc = distanceToExport <= 200 || onlyWhitespaceBetween;
167
- }
168
-
169
- // Also check for TypeScript reference comments
170
- if (!hasJSDoc && jsdocRefMatch && jsdocRefMatch.length > 0) {
171
- const lastRef = jsdocRefMatch[jsdocRefMatch.length - 1];
172
- const lastRefEnd = searchWindow.lastIndexOf(lastRef) + lastRef.length;
173
- const distanceToExport = searchWindow.length - lastRefEnd;
174
- hasJSDoc = distanceToExport <= 200;
175
- }
176
-
177
- // Only check public exports (not internal utilities)
178
- const isPublic = match[0].includes('export') &&
179
- !normalizedPath.includes('/internal/') &&
180
- !normalizedPath.includes('/private/');
181
-
182
- if (!isPublic || hasJSDoc) {
183
- continue;
184
- }
185
-
186
- // Get the content after the export to analyze what it is
187
- const afterExport = content.substring(exportIndex, Math.min(content.length, exportIndex + 200));
188
-
189
- // Skip simple type aliases (e.g., `type UUID = string`, `type X = 'a' | 'b'`)
190
- if (exportType === 'type') {
191
- // Check if it's a simple type alias (not a complex type)
192
- const simpleTypePattern = /type\s+\w+\s*=\s*(?:string|number|boolean|'[^']+'|"[^"]+"|`[^`]+`|[\w.]+(?:\s*\|\s*[\w.]+)*)\s*[;=]/;
193
- if (simpleTypePattern.test(afterExport)) {
194
- continue; // Skip simple type aliases - they're self-documenting
195
- }
196
- }
197
-
198
- // Skip Props interfaces that have inline JSDoc on properties
199
- if (exportType === 'interface' && exportName.endsWith('Props')) {
200
- // Check if the interface has inline JSDoc comments on its properties
201
- const interfaceContent = content.substring(exportIndex, Math.min(content.length, exportIndex + 2000));
202
- const hasInlineJSDoc = /\/\*\*[\s\S]*?\*\//.test(interfaceContent) ||
203
- /\/\/\/\s*</.test(interfaceContent);
204
- // If it has inline JSDoc on properties, the interface itself doesn't need a block comment
205
- if (hasInlineJSDoc) {
206
- continue;
207
- }
208
- }
209
-
210
- // Skip simple Props type aliases that just extend React types
211
- if (exportType === 'type' && exportName.endsWith('Props')) {
212
- // Check if it's a simple type alias extending React types
213
- const simplePropsPattern = /type\s+\w+Props\s*=\s*React\.\w+Attributes/;
214
- if (simplePropsPattern.test(afterExport)) {
215
- continue; // Skip simple Props type aliases - they're self-documenting
216
- }
217
- }
218
-
219
- // Skip simple constants that are self-explanatory
220
- if (exportType === 'const') {
221
- // Check if it's a simple constant assignment (not a function/component)
222
- const simpleConstPattern = /const\s+\w+\s*=\s*(?:['"`][^'"`]+['"`]|\d+|true|false|null|undefined|\[\]|\{\})\s*[;=]/;
223
- if (simpleConstPattern.test(afterExport)) {
224
- // Skip very simple constants - they're self-documenting
225
- continue;
226
- }
227
- }
228
-
229
- // All other exports should have JSDoc
230
- suggestions.push({
231
- type: 'missing-jsdoc',
232
- file: relativePath,
233
- line: getLineNumber(content, exportIndex),
234
- message: `Exported ${exportType} '${exportName}' missing JSDoc documentation`,
235
- recommendation: 'Add JSDoc comments to document the function/component purpose, parameters, and return value'
236
- });
237
- }
238
-
239
- // Check for TODO/FIXME comments that might be outdated
240
- const todoPattern = /(?:TODO|FIXME|XXX|HACK|NOTE):\s*(.+)/gi;
241
- let todoMatch;
242
- const todos = [];
243
- while ((todoMatch = todoPattern.exec(content)) !== null) {
244
- todos.push({
245
- text: todoMatch[1],
246
- line: getLineNumber(content, todoMatch.index)
247
- });
248
- }
249
-
250
- if (todos.length > 5) {
251
- suggestions.push({
252
- type: 'many-todos',
253
- file: relativePath,
254
- message: `File has ${todos.length} TODO/FIXME comments`,
255
- recommendation: 'Review and address TODO comments, or remove outdated ones'
256
- });
257
- }
258
-
259
- } catch (error) {
260
- // Skip files with errors
261
- }
262
- }
263
-
264
- return { issues, warnings, suggestions };
265
- }
266
- };
267
-
268
- module.exports = documentationCheck;
@@ -1,116 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Environment Variables Check Module
5
- * @package @jmruthers/pace-core
6
- * @module Audit/Checks/Environment
7
- *
8
- * Checks for:
9
- * - Missing required environment variables
10
- * - Hardcoded secrets/API keys
11
- * - Incorrect environment variable usage
12
- */
13
-
14
- const fs = require('fs');
15
- const path = require('path');
16
-
17
- const environmentCheck = {
18
- name: 'environment',
19
- description: 'Environment variable usage (secrets, required vars)',
20
- severity: 'warning',
21
-
22
- async run(context) {
23
- const { projectRoot, files } = context;
24
- const issues = [];
25
- const warnings = [];
26
- const suggestions = [];
27
-
28
- // Required environment variables for pace-core apps
29
- const requiredEnvVars = [
30
- 'VITE_SUPABASE_URL',
31
- 'VITE_SUPABASE_PUBLISHABLE_KEY'
32
- ];
33
-
34
- // Check .env.example for required vars (if file exists)
35
- if (fs.existsSync(envExamplePath)) {
36
- try {
37
- const envExampleContent = fs.readFileSync(envExamplePath, 'utf8');
38
- requiredEnvVars.forEach(envVar => {
39
- if (!envExampleContent.includes(envVar)) {
40
- warnings.push({
41
- type: 'missing-env-var',
42
- file: '.env.example',
43
- message: `Required environment variable '${envVar}' missing from .env.example`,
44
- recommendation: `Add ${envVar} to .env.example file`
45
- });
46
- }
47
- });
48
- } catch (error) {
49
- // Skip if can't read
50
- }
51
- }
52
-
53
- // Check source files for hardcoded secrets
54
- if (files && files.length > 0) {
55
- const secretPatterns = [
56
- /(?:api[_-]?key|secret|password|token)\s*[:=]\s*['"]([^'"]{10,})['"]/gi,
57
- /(?:supabase[_-]?url|supabase[_-]?key)\s*[:=]\s*['"]https?:\/\/[^'"]+['"]/gi
58
- ];
59
-
60
- for (const filePath of files) {
61
- try {
62
- // Skip test files and config files (they may have example values)
63
- const relativePath = getRelativePath(filePath, projectRoot);
64
- if (relativePath.includes('.test.') ||
65
- relativePath.includes('.spec.') ||
66
- relativePath.includes('.example.') ||
67
- relativePath.includes('config')) {
68
- continue;
69
- }
70
-
71
- const content = fs.readFileSync(filePath, 'utf8');
72
-
73
- secretPatterns.forEach(pattern => {
74
- let match;
75
- while ((match = pattern.exec(content)) !== null) {
76
- // Check if it's in a comment
77
- const beforeMatch = content.substring(Math.max(0, match.index - 100), match.index);
78
- const isInComment = beforeMatch.includes('//') || beforeMatch.includes('/*');
79
-
80
- if (!isInComment) {
81
- issues.push({
82
- type: 'hardcoded-secret',
83
- file: relativePath,
84
- line: content.substring(0, match.index).split('\n').length,
85
- message: 'Potential hardcoded secret or API key detected',
86
- recommendation: 'Move secrets to environment variables and use import.meta.env or process.env'
87
- });
88
- }
89
- }
90
- });
91
-
92
- // Check for direct Supabase URL/key usage (should use env vars)
93
- if (content.includes('supabase') &&
94
- (content.includes('https://') || content.includes('eyJ'))) {
95
- const hasEnvVar = /import\.meta\.env|process\.env/.test(content);
96
- if (!hasEnvVar) {
97
- warnings.push({
98
- type: 'hardcoded-config',
99
- file: relativePath,
100
- message: 'Supabase configuration may be hardcoded',
101
- recommendation: 'Use environment variables: import.meta.env.VITE_SUPABASE_URL'
102
- });
103
- }
104
- }
105
-
106
- } catch (error) {
107
- // Skip files with errors
108
- }
109
- }
110
- }
111
-
112
- return { issues, warnings, suggestions };
113
- }
114
- };
115
-
116
- module.exports = environmentCheck;