@jmruthers/pace-core 0.6.5 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -1,75 +1,203 @@
1
- # 📚 PACE Standards — Master README
1
+ # Pace Standards
2
2
 
3
- ## Purpose
4
- This document is the single source of truth for all engineering standards for pace-core and consuming apps.
3
+ This repository defines the **canonical development standards** for **pace-core** and **all consuming applications** in the pace-suite.
5
4
 
6
- ## pace-core Standards
7
- - 01-architecture-standard.md
8
- - 02-api-and-rpc-standard.md
9
- - 03-component-standard.md
10
- - 04-code-style-standard.md
11
- - 05-security-standard.md
12
- - 06-testing-and-docs-standard.md
5
+ These standards are **human-readable first**, but are deliberately structured so they can be **enforced by automation**, including Cursor rules, ESLint, and custom audit tooling.
13
6
 
14
- ## Consuming App Standards
15
- - 01-app-architecture.md
16
- - 02-pace-core-integration.md
17
- - 03-domain-model.md
18
- - 04-app-security-and-rbac.md
19
- - 05-testing-strategy.md
20
- - 06-ai-collaboration.md
7
+ They are the **single source of truth**.
8
+ All other quality tools must align *to these standards*, not reinterpret them.
21
9
 
22
- ## Precedence
23
- 1. Security
24
- 2. API/RPC
25
- 3. Components
26
- 4. Code Style
27
- 5. Testing
28
- 6. Documentation
29
- 7. Consuming App Standards
10
+ ---
30
11
 
31
- ## AI Rules
32
- - Read relevant standards
33
- - Apply Cursor Checklists
34
- - Prefer pace-core for reusable logic
35
- - Update docs on API changes
12
+ ## How to use these standards
36
13
 
37
- ## Cursor Rules
14
+ ### pace-core
15
+ - Treat these standards as **hard constraints**
16
+ - pace-core sets the bar and defines the contracts
17
+ - Any deviation must be explicitly documented here
38
18
 
39
- pace-core provides comprehensive Cursor rules that automatically enforce these standards in consuming apps.
19
+ ### Consuming applications
20
+ - Inherit these standards by default
21
+ - Only diverge where a documented exception exists
22
+ - Consuming apps should never weaken standards silently
40
23
 
41
- ### Installation
24
+ ### AI agents (Cursor, Codex, etc.)
25
+ - Follow these standards **strictly**
26
+ - Do **not** silence rules to "make things pass"
27
+ - If compliance is unclear, stop and report rather than guessing
42
28
 
43
- Install cursor rules in your consuming app:
29
+ ---
44
30
 
45
- ```bash
46
- node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
47
- ```
31
+ ## The Four Layers of Quality Enforcement
48
32
 
49
- ### Rule Files
33
+ The pace-suite uses **four complementary quality layers**, each with a distinct responsibility.
34
+ They are intentionally overlapping in *coverage*, but **not duplicative in purpose**.
50
35
 
51
- The cursor rules cover:
52
- - **00-pace-core-compliance** - Enforce pace-core usage patterns
53
- - **01-standards-compliance** - Enforce all standards (this document)
54
- - **02-project-structure** - Define standard folder structure
55
- - **03-solid-principles** - Enforce SOLID architecture
56
- - **04-testing-standards** - Enforce testing consistency
57
- - **05-bug-reports-and-features** - Templates for issue reporting
58
- - **06-code-quality** - Enforce code quality standards
59
- - **07-tech-stack-compliance** - Enforce tech stack versions
60
- - **08-markup-quality** - Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
36
+ Think of this as *defence in depth*, not redundancy.
61
37
 
62
- ### Audit Tool
38
+ ---
63
39
 
64
- Run comprehensive audits to check compliance:
40
+ ### 1. Standards Documents (Source of Truth)
65
41
 
66
- ```bash
67
- node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs
68
- ```
42
+ **What they are**
43
+ - Human-readable `.md` documents
44
+ - Describe *intent*, *principles*, and *expectations*
45
+ - Technology-agnostic where possible
69
46
 
70
- This generates timestamped markdown reports in `audit/` directory.
47
+ **What they are used for**
48
+ - Defining *what "good" looks like*
49
+ - Onboarding humans and AI agents
50
+ - Resolving ambiguity when tools disagree
51
+ - Designing new rules, lint checks, and audits
71
52
 
72
- ### Documentation
53
+ **What they are NOT**
54
+ - They are not executable
55
+ - They do not enforce anything by themselves
56
+ - They should not contain implementation hacks
73
57
 
74
- - [Cursor Rules Quick Start](../getting-started/cursor-rules.md)
75
- - [Cursor Rules README](../../cursor-rules/README.md)
58
+ ➡️ **If there is a conflict, the standards win.**
59
+
60
+ ---
61
+
62
+ ### 2. Cursor Rules (Real-time Guidance)
63
+
64
+ **What they are**
65
+ - AI-optimised interpretations of the standards
66
+ - Applied while code is being written or modified
67
+ - Prevent mistakes *before* they land
68
+
69
+ **What they are used for**
70
+ - Steering AI agents toward correct patterns
71
+ - Enforcing architectural intent during development
72
+ - Reducing rework later in linting or audits
73
+
74
+ **What they are NOT**
75
+ - They are not a replacement for lint or audits
76
+ - They should not invent new standards
77
+ - They should not silence problems "to move on"
78
+
79
+ ➡️ Cursor rules **translate standards into behaviour**, but do not redefine them.
80
+
81
+ ---
82
+
83
+ ### 3. ESLint (Fast, Local Static Analysis)
84
+
85
+ **What it is**
86
+ - Deterministic, file-level static analysis
87
+ - Runs locally and in CI
88
+ - Focused on correctness, safety, and consistency
89
+
90
+ **What it is used for**
91
+ - Catching obvious issues early (types, hooks, imports, patterns)
92
+ - Enforcing mechanically checkable rules
93
+ - Preventing regressions during refactors
94
+
95
+ **What it is NOT**
96
+ - ESLint should not encode complex business rules
97
+ - It should not contain subjective or architectural debates
98
+ - It should not be silenced to "get green builds"
99
+
100
+ ➡️ ESLint enforces *how code is written*, not *whether the system is correct*.
101
+
102
+ ---
103
+
104
+ ### 4. Audit Tool (Deep, System-Level Analysis)
105
+
106
+ **What it is**
107
+ - A custom static analysis tool
108
+ - Operates across files, folders, and systems
109
+ - Understands pace-core contracts and invariants
110
+
111
+ **What it is used for**
112
+ - Validating architectural compliance (RBAC, data access, boundaries)
113
+ - Catching issues ESLint cannot see
114
+ - Providing actionable remediation plans
115
+
116
+ **What it is NOT**
117
+ - It is not a linter replacement
118
+ - It should not report stylistic issues
119
+ - It should not contradict the standards
120
+
121
+ ➡️ The audit tool answers: *"Is this system actually compliant?"*
122
+
123
+ ---
124
+
125
+ ## How the layers work together
126
+
127
+ | Layer | Strength | Timing |
128
+ |--------------|----------------------------------|-----------------|
129
+ | Standards | Intent & clarity | Design time |
130
+ | Cursor rules | Preventive guidance | Write time |
131
+ | ESLint | Fast mechanical enforcement | Dev / CI |
132
+ | Audit tool | Deep architectural verification | Review / CI |
133
+
134
+ No single layer is sufficient on its own.
135
+ Together, they create a **repeatable, scalable quality system** for both humans and AI.
136
+
137
+ ---
138
+
139
+ ## Standards Documents
140
+
141
+ The standards are organized into **10 files**, each covering a specific domain:
142
+
143
+ ### 0. [Standards Overview](./0-standards-overview.md)
144
+ Entry point, precedence, how standards work, and the four layers of quality enforcement.
145
+
146
+ ### 1. [pace-core Compliance](./1-pace-core-compliance-standards.md)
147
+ pace-core usage patterns, ESLint rules, secure Supabase client requirements, and compliance enforcement.
148
+
149
+ ### 2. [Project Structure](./2-project-structure-standards.md)
150
+ Standard directory structure, file organization patterns, naming conventions, and migration guides.
151
+
152
+ ### 3. [Architecture](./3-architecture-standards.md)
153
+ SOLID principles, component design, API design, and architectural patterns.
154
+
155
+ ### 4. [Code Quality](./4-code-quality-standards.md)
156
+ TypeScript rules, naming conventions, code style patterns, and React patterns.
157
+
158
+ ### 5. [Styling](./5-styling-standards.md)
159
+ **CRITICAL:** Required CSS configuration, Tailwind v4 setup, markup quality, and styling patterns.
160
+
161
+ ### 6. [Security & RBAC](./6-security-rbac-standards.md)
162
+ RLS policy patterns, RBAC integration, helper functions, and security requirements.
163
+
164
+ ### 7. [API & Tech Stack](./7-api-tech-stack-standards.md)
165
+ Required tech stack, API/RPC naming conventions, result shapes, and deprecation policy.
166
+
167
+ ### 8. [Testing & Documentation](./8-testing-documentation-standards.md)
168
+ Testing strategy, documentation requirements, bug report templates, and feature request templates.
169
+
170
+ ### 9. [Operations](./9-operations-standards.md)
171
+ Error handling patterns, performance optimization, caching strategies, and CI/CD integration.
172
+
173
+ ---
174
+
175
+ ## Key Principles
176
+
177
+ - **Do not silence tools** — fix the underlying issue
178
+ - **Do not duplicate rules** — each layer has a purpose
179
+ - **Do not diverge silently** — document exceptions explicitly
180
+ - **Standards always win** — tools must align to them
181
+
182
+ ---
183
+
184
+ ## Getting Started
185
+
186
+ 1. **Read the Overview** - Start with [0-standards-overview.md](./0-standards-overview.md) to understand the system
187
+ 2. **Review Critical Standards** - Pay special attention to:
188
+ - [5-styling-standards.md](./5-styling-standards.md) - **CRITICAL CSS configuration**
189
+ - [1-pace-core-compliance-standards.md](./1-pace-core-compliance-standards.md) - pace-core usage
190
+ - [6-security-rbac-standards.md](./6-security-rbac-standards.md) - Security and RBAC
191
+ 3. **Set Up Quality Enforcement** - Install Cursor rules and ESLint config:
192
+ - `npm run setup:cursor-rules` - Install Cursor rules for AI-assisted enforcement
193
+ - `npm run setup:eslint` - Install ESLint config for real-time linting
194
+ 4. **Run Audits** - Use the audit tool to validate compliance:
195
+ - `npm run audit:pace-core` - Run comprehensive audit organized by standards
196
+ 5. **Follow the Standards** - Use the standards as your guide for all development work
197
+ 6. **Reference When Needed** - Use the standards to resolve conflicts and answer questions
198
+
199
+ ---
200
+
201
+ **Last Updated:** 2025-01-28
202
+ **Version:** 2.0.0
203
+ **Applies to:** All pace-core and consuming apps
@@ -84,7 +84,7 @@ import '@jmruthers/pace-core/src/styles/core.css';
84
84
  ```tsx
85
85
  // ✅ Check if user has proper context
86
86
  const { hasPermission, isLoading } = useCan();
87
- if (isLoading) return <div>Loading permissions...</div>;
87
+ if (isLoading) return <p>Loading permissions...</p>;
88
88
 
89
89
  // ✅ Ensure proper scope
90
90
  <PermissionGuard
@@ -525,8 +525,8 @@ function useDebugRender(componentName: string, props?: any) {
525
525
  function MyComponent({ data, loading }) {
526
526
  useDebugRender('MyComponent', { data, loading });
527
527
 
528
- if (loading) return <div>Loading...</div>;
529
- return <div>{data}</div>;
528
+ if (loading) return <p>Loading...</p>;
529
+ return <p>{data}</p>;
530
530
  }
531
531
  ```
532
532
 
@@ -922,5 +922,5 @@ When issues occur intermittently:
922
922
  - [Common Issues](./common-issues.md) - Specific problem solutions
923
923
  - [Styling Issues](./styling-issues.md) - Component styling problems
924
924
  - [Authentication Guide](../implementation-guides/authentication.md) - Auth troubleshooting
925
- - [Performance Guide](../best-practices/performance.md) - Performance debugging
925
+ - [Performance Optimization](../standards/9-operations-standards.md#performance-optimization) - Performance debugging
926
926
  - [API Reference](../api-reference/) - Component documentation
@@ -142,7 +142,7 @@ import { useUnifiedAuth } from '@jmruthers/pace-core'
142
142
  function DebugComponent() {
143
143
  const auth = useUnifiedAuth()
144
144
  console.log('Auth context:', auth)
145
- return <div>Check console for auth context</div>
145
+ return <p>Check console for auth context</p>
146
146
  }
147
147
  ```
148
148
 
@@ -154,7 +154,7 @@ import { useRBAC } from '@jmruthers/pace-core'
154
154
  function DebugRBAC() {
155
155
  const rbac = useRBAC()
156
156
  console.log('RBAC context:', rbac)
157
- return <div>Check console for RBAC context</div>
157
+ return <p>Check console for RBAC context</p>
158
158
  }
159
159
  ```
160
160
 
@@ -46,8 +46,8 @@ function useDebugRender(componentName: string, props?: any) {
46
46
  function MyComponent({ data, loading }) {
47
47
  useDebugRender('MyComponent', { data, loading });
48
48
 
49
- if (loading) return <div>Loading...</div>;
50
- return <div>{data}</div>;
49
+ if (loading) return <p>Loading...</p>;
50
+ return <p>{data}</p>;
51
51
  }
52
52
  ```
53
53
 
@@ -205,7 +205,7 @@ function MyComponent() {
205
205
  prevState.current = state;
206
206
  }, [state]);
207
207
 
208
- return <div>{state.count}</div>;
208
+ return <p>{state.count}</p>;
209
209
  }
210
210
  ```
211
211
 
@@ -273,7 +273,7 @@ function ExpensiveComponent() {
273
273
  useRenderDebug('ExpensiveComponent');
274
274
 
275
275
  // Component logic here
276
- return <div>Expensive content</div>;
276
+ return <p>Expensive content</p>;
277
277
  }
278
278
  ```
279
279
 
@@ -320,11 +320,11 @@ export function useAuthDebug() {
320
320
  function AuthDebugger() {
321
321
  const auth = useAuthDebug();
322
322
 
323
- if (auth.loading) return <div>Loading auth...</div>;
324
- if (auth.error) return <div>Auth error: {auth.error}</div>;
325
- if (!auth.user) return <div>Not authenticated</div>;
323
+ if (auth.loading) return <p>Loading auth...</p>;
324
+ if (auth.error) return <p>Auth error: {auth.error}</p>;
325
+ if (!auth.user) return <p>Not authenticated</p>;
326
326
 
327
- return <div>Authenticated as: {auth.user.email}</div>;
327
+ return <p>Authenticated as: {auth.user.email}</p>;
328
328
  }
329
329
  ```
330
330
 
@@ -589,7 +589,7 @@ function MyComponent() {
589
589
  useMemoryLeakDetection('MyComponent');
590
590
 
591
591
  // Component logic
592
- return <div>Content</div>;
592
+ return <p>Content</p>;
593
593
  }
594
594
  ```
595
595
 
@@ -31,10 +31,10 @@ function MyComponent() {
31
31
  const { hasPermission } = usePermissions();
32
32
 
33
33
  return (
34
- <div>
34
+ <section>
35
35
  {user && <p>Welcome, {user.email}</p>}
36
36
  {hasPermission('read:users') && <UserList />}
37
- </div>
37
+ </section>
38
38
  );
39
39
  }
40
40
 
@@ -47,10 +47,10 @@ function MyComponent() {
47
47
  const { hasPermission } = useCan();
48
48
 
49
49
  return (
50
- <div>
50
+ <section>
51
51
  {user && <p>Welcome, {user.email}</p>}
52
52
  {hasPermission('read:users') && <UserList />}
53
- </div>
53
+ </section>
54
54
  );
55
55
  }
56
56
  ```
@@ -1,37 +1,51 @@
1
1
  ---
2
- lastUpdated: 2025-11-18T15:00:00+11:00
3
- version: 0.5.181
2
+ lastUpdated: 2026-01-06T15:00:00+11:00
3
+ version: 0.6.x
4
4
  reviewedBy: documentation-standards-audit
5
5
  ---
6
6
 
7
7
  # Organisation Context Setup Troubleshooting
8
8
 
9
- This guide helps you resolve the `unrecognized configuration parameter "app.organisation_id"` error that occurs when using PACE Core with Supabase.
9
+ > **⚠️ IMPORTANT UPDATE (v0.6.x)**: The `set_organisation_context` and `get_organisation_context` functions have been **removed** in pace-core v0.6.x. Organisation context is now handled automatically via secure Supabase client headers.
10
10
 
11
- ## 🚨 The Error
11
+ ## Current Implementation (v0.6.x+)
12
+
13
+ Organisation context is now handled automatically:
14
+
15
+ 1. **Secure Supabase Client**: The `useSecureSupabase()` hook automatically injects organisation context headers
16
+ 2. **Explicit Parameters**: RPC functions receive `p_organisation_id` as explicit parameters
17
+ 3. **RLS Policies**: Row Level Security policies use `auth.uid()` and `organisation_id` columns directly
18
+
19
+ **No manual context setting is required.** The secure client handles this automatically.
20
+
21
+ ## 🚨 Legacy Error (v0.5.x and earlier)
22
+
23
+ If you're seeing this error, you may be using an older version of pace-core:
12
24
 
13
25
  ```
14
26
  Error loading units: unrecognized configuration parameter "app.organisation_id"
15
27
  ```
16
28
 
17
- **Console Error:**
18
- ```
19
- Supabase error fetching units: Object {
20
- code: "42704",
21
- details: null,
22
- hint: null,
23
- message: 'unrecognized configuration parameter "app.organisation_id"'
24
- }
25
- ```
29
+ **This error should not occur in v0.6.x+** as the functions have been removed.
26
30
 
27
- ## 🔍 Root Cause
31
+ ## 🔍 If You Still See Errors
28
32
 
29
- This error occurs when:
30
- 1. The Supabase database doesn't have the `set_organisation_context` function
31
- 2. The `app.organisation_id` configuration parameter isn't available
32
- 3. The organisation context isn't being set before making database queries
33
+ If you're using pace-core v0.6.x+ and still seeing context-related errors:
33
34
 
34
- ## Solution: Database Setup
35
+ 1. **Verify you're using `useSecureSupabase()`**: Always use the secure client from the hook, not the base client
36
+ 2. **Check RPC parameters**: Ensure RPC functions receive `p_organisation_id` as explicit parameters
37
+ 3. **Verify RLS policies**: RLS policies should use `auth.uid()` and `organisation_id` columns, not session variables
38
+
39
+ ## 📚 Legacy Documentation (v0.5.x)
40
+
41
+ The following information is for reference only (v0.5.x and earlier):
42
+
43
+ ### Legacy Solution: Database Setup
44
+
45
+ **Note**: These functions are no longer needed in v0.6.x+. This section is for historical reference only.
46
+
47
+ <details>
48
+ <summary>Click to view legacy setup (v0.5.x)</summary>
35
49
 
36
50
  ### Step 1: Create the Organisation Context Functions
37
51
 
@@ -282,6 +296,15 @@ If you're still experiencing problems:
282
296
 
283
297
  The key is making sure the database has the organisation context functions and your RLS policies use them correctly.
284
298
 
299
+ </details>
300
+
301
+ ## ✅ Current Best Practices (v0.6.x+)
302
+
303
+ 1. **Always use `useSecureSupabase()`**: This hook automatically handles organisation context
304
+ 2. **Pass explicit parameters**: RPC functions should receive `p_organisation_id` as explicit parameters
305
+ 3. **Use RLS policies correctly**: Policies should use `auth.uid()` and `organisation_id` columns directly
306
+ 4. **No manual context setting**: The secure client handles everything automatically
307
+
285
308
  ## ♿ Accessibility
286
309
 
287
310
  Organisation context setup doesn't directly impact accessibility, but ensure:
@@ -31,21 +31,21 @@ try {
31
31
  console.warn('Warning: Could not load core-usage-manifest.json for ESLint config');
32
32
  }
33
33
 
34
- // Load pace-core compliance rules
34
+ // Load pace-core ESLint rules
35
35
  let paceCoreRules = {};
36
36
  try {
37
- // Try source path first (for development)
38
- const sourceRulesPath = path.resolve(__dirname, 'src/eslint-rules/pace-core-compliance.cjs');
37
+ // Try source path first (for development) - new location at package root
38
+ const sourceRulesPath = path.resolve(__dirname, 'eslint-rules/index.cjs');
39
39
  if (fs.existsSync(sourceRulesPath)) {
40
40
  paceCoreRules = require(sourceRulesPath).rules;
41
41
  } else {
42
42
  // Try dist path (for published package)
43
- const distRulesPath = path.resolve(__dirname, 'dist/eslint-rules/pace-core-compliance.cjs');
43
+ const distRulesPath = path.resolve(__dirname, 'dist/eslint-rules/index.cjs');
44
44
  if (fs.existsSync(distRulesPath)) {
45
45
  paceCoreRules = require(distRulesPath).rules;
46
46
  } else {
47
47
  // Try relative to current working directory (for consuming apps)
48
- const cwdRulesPath = path.resolve(process.cwd(), 'node_modules/@jmruthers/pace-core/dist/eslint-rules/pace-core-compliance.cjs');
48
+ const cwdRulesPath = path.resolve(process.cwd(), 'node_modules/@jmruthers/pace-core/dist/eslint-rules/index.cjs');
49
49
  if (fs.existsSync(cwdRulesPath)) {
50
50
  paceCoreRules = require(cwdRulesPath).rules;
51
51
  }
@@ -77,12 +77,39 @@ module.exports = [
77
77
  }
78
78
  },
79
79
  rules: {
80
- // Use pace-core compliance rules
80
+ // Standard 1: pace-core Compliance
81
81
  'pace-core-compliance/no-restricted-imports': 'error',
82
82
  'pace-core-compliance/prefer-pace-core-components': 'warn',
83
83
  'pace-core-compliance/prefer-pace-core-hooks': 'warn',
84
84
  'pace-core-compliance/prefer-pace-core-utils': 'warn',
85
85
  'pace-core-compliance/no-local-component-duplication': 'error',
86
+ 'pace-core-compliance/prefer-pace-core-form': 'error',
87
+
88
+ // Standard 4: Code Quality
89
+ 'pace-core-compliance/naming-convention': 'warn',
90
+ 'pace-core-compliance/component-naming': 'warn',
91
+ 'pace-core-compliance/type-naming': 'warn',
92
+
93
+ // Standard 5: Styling
94
+ 'pace-core-compliance/no-inline-styles': 'error',
95
+
96
+ // Standard 6: Security & RBAC
97
+ 'pace-core-compliance/no-direct-supabase-client': 'error',
98
+ 'pace-core-compliance/rbac-permission-loading': 'error',
99
+ 'pace-core-compliance/no-direct-rbac-rpc': 'error',
100
+ 'pace-core-compliance/no-direct-rbac-table': 'error',
101
+ 'pace-core-compliance/no-hardcoded-role-checks': 'error',
102
+ 'pace-core-compliance/rbac-use-resource-names-constants': 'error',
103
+ 'pace-core-compliance/no-rbac-wrapper-components': 'error',
104
+ 'pace-core-compliance/no-rbac-wrapper-functions': 'error',
105
+
106
+ // Standard 7: API & Tech Stack
107
+ 'pace-core-compliance/rpc-naming-pattern': 'warn',
108
+ 'pace-core-compliance/no-class-components': 'error',
109
+ 'pace-core-compliance/prefer-import-meta-env': 'error',
110
+
111
+ // Standard 8: Testing
112
+ 'pace-core-compliance/test-file-naming': 'warn',
86
113
 
87
114
  // Also use standard no-restricted-imports (ESLint 9 flat config format)
88
115
  // Note: ESLint 9 uses a simpler array format
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jmruthers/pace-core",
3
- "version": "0.6.5",
4
- "description": "Clean, modern React component library with Tailwind v4 styling and native utilities",
3
+ "version": "0.6.7",
4
+ "description": "React component library with Tailwind v4",
5
5
  "private": false,
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -42,6 +42,11 @@
42
42
  "import": "./dist/utils.js",
43
43
  "default": "./dist/utils.js"
44
44
  },
45
+ "./icons": {
46
+ "types": "./dist/icons/index.d.ts",
47
+ "import": "./dist/icons/index.js",
48
+ "default": "./dist/icons/index.js"
49
+ },
45
50
  "./rbac": {
46
51
  "types": "./dist/rbac/index.d.ts",
47
52
  "import": "./dist/rbac/index.js",
@@ -53,9 +58,9 @@
53
58
  "default": "./dist/rbac/eslint-rules.js"
54
59
  },
55
60
  "./eslint-rules": {
56
- "require": "./dist/eslint-rules/pace-core-compliance.cjs",
57
- "import": "./dist/eslint-rules/pace-core-compliance.cjs",
58
- "default": "./dist/eslint-rules/pace-core-compliance.cjs"
61
+ "require": "./dist/eslint-rules/index.cjs",
62
+ "import": "./dist/eslint-rules/index.cjs",
63
+ "default": "./dist/eslint-rules/index.cjs"
59
64
  },
60
65
  "./eslint-config": "./eslint-config-pace-core.cjs",
61
66
  "./styles/core.css": "./src/styles/core.css",
@@ -69,12 +74,11 @@
69
74
  "default": "./vite-plugin-tailwind-v4.js"
70
75
  },
71
76
  "./docs": "./docs/README.md",
77
+ "./docs/dependencies": "./docs/getting-started/dependencies.md",
72
78
  "./package.json": "./package.json",
73
79
  "./core-usage-manifest.json": "./core-usage-manifest.json",
74
80
  "./cursor-rules": "./cursor-rules",
75
81
  "./scripts/install-cursor-rules": "./scripts/install-cursor-rules.cjs",
76
- "./scripts/audit": "./scripts/audit/index.cjs",
77
- "./scripts/audit-consuming-app": "./scripts/audit-consuming-app.cjs",
78
82
  "./source": {
79
83
  "import": "./src/index.ts",
80
84
  "default": "./src/index.ts"
@@ -95,6 +99,10 @@
95
99
  "import": "./src/utils/index.ts",
96
100
  "default": "./src/utils/index.ts"
97
101
  },
102
+ "./source/icons": {
103
+ "import": "./src/icons/index.ts",
104
+ "default": "./src/icons/index.ts"
105
+ },
98
106
  "./source/types": {
99
107
  "import": "./src/types/index.ts",
100
108
  "default": "./src/types/index.ts"
@@ -143,11 +151,13 @@
143
151
  "core-usage-manifest.json",
144
152
  "eslint-config-pace-core.cjs",
145
153
  "scripts",
146
- "cursor-rules"
154
+ "cursor-rules",
155
+ "audit-tool"
147
156
  ],
148
157
  "scripts": {
149
158
  "_comment_build": "Build package and documentation",
150
159
  "build": "tsup && node scripts/build-css.js",
160
+ "build:fast": "SKIP_CLEAN=true NODE_ENV=development tsup && node scripts/build-css.js",
151
161
  "build:watch": "tsup --watch",
152
162
  "build:docs": "node scripts/build-docs-incremental.js",
153
163
  "build:docs:force": "node scripts/build-docs-incremental.js --force",
@@ -187,7 +197,9 @@
187
197
  "docs:generate": "node scripts/generate-docs.js generate",
188
198
  "docs:update-index": "node scripts/generate-docs.js update-index",
189
199
  "docs:generate-api": "node scripts/generate-docs.js generate-api",
190
- "docs:all": "node scripts/generate-docs.js all"
200
+ "docs:all": "node scripts/generate-docs.js all",
201
+ "_comment_audit": "Audit tool for consuming apps",
202
+ "audit:pace-core": "node packages/core/audit-tool/index.cjs"
191
203
  },
192
204
  "keywords": [
193
205
  "react",
@@ -201,16 +213,11 @@
201
213
  "author": "PACE Team",
202
214
  "license": "MIT",
203
215
  "peerDependencies": {
204
- "@radix-ui/react-checkbox": "^1.0.0",
205
- "@radix-ui/react-label": "^2.0.0",
206
- "@radix-ui/react-slot": "^1.0.0",
207
- "@radix-ui/react-switch": "^1.1.0",
208
- "@radix-ui/react-tabs": "^1.0.0",
209
- "@radix-ui/react-toast": "^1.0.0",
210
- "@radix-ui/react-tooltip": "^1.0.0",
216
+ "@tanstack/react-query": "^5.90.0",
211
217
  "@tanstack/react-table": "^8.0.0",
212
218
  "clsx": "^2.0.0",
213
- "lucide-react": "^0.400.0",
219
+ "date-fns": "^3.0.0",
220
+ "date-fns-tz": "^3.0.0",
214
221
  "react": "^19.0.0",
215
222
  "react-day-picker": "^9.0.0",
216
223
  "react-dom": "^19.0.0",
@@ -246,14 +253,19 @@
246
253
  },
247
254
  "dependencies": {
248
255
  "@hookform/resolvers": "^3.9.0",
249
- "@supabase/supabase-js": "^2.49.10",
250
- "@tanstack/react-query": "^5.56.2",
251
- "@tanstack/react-virtual": "^3.13.12",
252
- "date-fns": "^3.0.0",
253
- "date-fns-tz": "^3.0.0",
256
+ "@radix-ui/react-checkbox": "^1.0.0",
257
+ "@radix-ui/react-label": "^2.0.0",
258
+ "@radix-ui/react-slot": "^1.0.0",
259
+ "@radix-ui/react-switch": "^1.1.0",
260
+ "@radix-ui/react-tabs": "^1.0.0",
261
+ "@radix-ui/react-toast": "^1.0.0",
262
+ "@radix-ui/react-tooltip": "^1.0.0",
263
+ "@supabase/supabase-js": "^2.89.0",
264
+ "@tanstack/react-virtual": "^3.13.16",
254
265
  "lodash.debounce": "^4.0.8",
255
266
  "lodash.throttle": "^4.1.1",
267
+ "lucide-react": "^0.400.0",
256
268
  "papaparse": "^5.5.3",
257
- "react-is": "^19.2.0"
269
+ "react-is": "^19.2.3"
258
270
  }
259
271
  }