@jmruthers/pace-core 0.6.5 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -0,0 +1,263 @@
1
+ /**
2
+ * API & Tech Stack Rules (Standard 7)
3
+ * @package @jmruthers/pace-core
4
+ * @module ESLintRules/rules/api-tech-stack
5
+ *
6
+ * Enforces API and tech stack patterns from Standard 7:
7
+ * - RPC naming conventions (data_*, app_*)
8
+ * - React 19+ patterns (no class components)
9
+ * - import.meta.env usage (Vite) instead of process.env
10
+ *
11
+ * Reference: packages/core/docs/standards/7-api-tech-stack-standards.md
12
+ */
13
+
14
+ const { isPaceCoreSourceFile } = require('../utils/helpers.cjs');
15
+
16
+ module.exports = {
17
+ rules: {
18
+ /**
19
+ * Enforce RPC naming pattern: data_* for reads, app_* for writes
20
+ */
21
+ 'rpc-naming-pattern': {
22
+ meta: {
23
+ type: 'problem',
24
+ docs: {
25
+ description: 'Enforce RPC naming pattern: data_* for read operations, app_* for write operations',
26
+ category: 'Best Practices',
27
+ recommended: true,
28
+ url: 'https://github.com/jmruthers/pace-core/blob/main/packages/core/docs/standards/7-api-tech-stack-standards.md'
29
+ },
30
+ messages: {
31
+ invalidRpcNaming: "RPC '{{rpcName}}' does not follow naming pattern. Read operations must start with 'data_', write operations must start with 'app_' (e.g., data_events_list, app_event_create)",
32
+ invalidRpcVerb: "RPC '{{rpcName}}' uses invalid verb '{{verb}}'. Use only: list, get, create, update, delete, read"
33
+ },
34
+ hasSuggestions: true
35
+ },
36
+ create(context) {
37
+ const filename = context.getFilename();
38
+
39
+ // Exclude pace-core source files - these rules are for consuming apps
40
+ if (isPaceCoreSourceFile(filename)) {
41
+ return {};
42
+ }
43
+
44
+ const validVerbs = ['list', 'get', 'create', 'update', 'delete', 'read'];
45
+ const readVerbs = ['list', 'get', 'read'];
46
+ const writeVerbs = ['create', 'update', 'delete', 'bulk_create', 'bulk_update'];
47
+ const rpcPattern = /^(data_|app_)[a-z0-9_]+_(list|get|create|update|delete|read|bulk_create|bulk_update)$/;
48
+
49
+ return {
50
+ CallExpression(node) {
51
+ // Check for supabase.rpc('rpc_name', ...)
52
+ if (node.callee.type === 'MemberExpression' &&
53
+ node.callee.property &&
54
+ node.callee.property.name === 'rpc' &&
55
+ node.arguments.length > 0) {
56
+
57
+ const firstArg = node.arguments[0];
58
+ if (firstArg.type === 'Literal' && typeof firstArg.value === 'string') {
59
+ const rpcName = firstArg.value;
60
+
61
+ // Skip if it's a variable (can't validate at lint time)
62
+ if (firstArg.type !== 'Literal') {
63
+ return;
64
+ }
65
+
66
+ // Check if it matches the pattern
67
+ if (!rpcPattern.test(rpcName)) {
68
+ // Extract verb if possible
69
+ const parts = rpcName.split('_');
70
+ const verb = parts[parts.length - 1];
71
+
72
+ if (validVerbs.includes(verb) || verb.startsWith('bulk_')) {
73
+ // Has valid verb but wrong prefix
74
+ const isReadOperation = readVerbs.includes(verb);
75
+ const isWriteOperation = writeVerbs.includes(verb) || verb.startsWith('bulk_');
76
+
77
+ let suggestedPrefix = 'data_';
78
+ if (isWriteOperation) {
79
+ suggestedPrefix = 'app_';
80
+ }
81
+
82
+ context.report({
83
+ node: firstArg,
84
+ messageId: 'invalidRpcNaming',
85
+ data: { rpcName },
86
+ suggest: [{
87
+ desc: `Use '${suggestedPrefix}' prefix for ${isReadOperation ? 'read' : 'write'} operations`,
88
+ fix(fixer) {
89
+ return null; // Complex fix
90
+ }
91
+ }]
92
+ });
93
+ } else {
94
+ // Invalid verb
95
+ context.report({
96
+ node: firstArg,
97
+ messageId: 'invalidRpcVerb',
98
+ data: { rpcName, verb },
99
+ suggest: [{
100
+ desc: `Use valid verb: ${validVerbs.join(', ')}`,
101
+ fix(fixer) {
102
+ return null; // Complex fix
103
+ }
104
+ }]
105
+ });
106
+ }
107
+ } else {
108
+ // Check if prefix matches verb type
109
+ const hasDataPrefix = rpcName.startsWith('data_');
110
+ const hasAppPrefix = rpcName.startsWith('app_');
111
+ const parts = rpcName.split('_');
112
+ const verb = parts[parts.length - 1];
113
+
114
+ const isReadOperation = readVerbs.includes(verb);
115
+ const isWriteOperation = writeVerbs.includes(verb) || verb.startsWith('bulk_');
116
+
117
+ if (hasDataPrefix && isWriteOperation) {
118
+ context.report({
119
+ node: firstArg,
120
+ messageId: 'invalidRpcNaming',
121
+ data: { rpcName },
122
+ suggest: [{
123
+ desc: `Use 'app_' prefix for write operations (${verb})`,
124
+ fix(fixer) {
125
+ return null; // Complex fix
126
+ }
127
+ }]
128
+ });
129
+ } else if (hasAppPrefix && isReadOperation) {
130
+ context.report({
131
+ node: firstArg,
132
+ messageId: 'invalidRpcNaming',
133
+ data: { rpcName },
134
+ suggest: [{
135
+ desc: `Use 'data_' prefix for read operations (${verb})`,
136
+ fix(fixer) {
137
+ return null; // Complex fix
138
+ }
139
+ }]
140
+ });
141
+ }
142
+ }
143
+ }
144
+ }
145
+ }
146
+ };
147
+ }
148
+ },
149
+
150
+ /**
151
+ * Enforce React 19+ patterns: no class components
152
+ */
153
+ 'no-class-components': {
154
+ meta: {
155
+ type: 'problem',
156
+ docs: {
157
+ description: 'Disallow React class components. Use functional components with hooks (React 19+).',
158
+ category: 'Best Practices',
159
+ recommended: true,
160
+ url: 'https://github.com/jmruthers/pace-core/blob/main/packages/core/docs/standards/7-api-tech-stack-standards.md'
161
+ },
162
+ messages: {
163
+ classComponent: "Class components are not allowed. Use functional components with hooks instead (React 19+)."
164
+ },
165
+ hasSuggestions: true
166
+ },
167
+ create(context) {
168
+ const filename = context.getFilename();
169
+
170
+ // Exclude pace-core source files - these rules are for consuming apps
171
+ if (isPaceCoreSourceFile(filename)) {
172
+ return {};
173
+ }
174
+
175
+ return {
176
+ ClassDeclaration(node) {
177
+ // Check if class extends React.Component or Component
178
+ const hasReactExtends = node.superClass && (
179
+ (node.superClass.type === 'MemberExpression' &&
180
+ node.superClass.object?.name === 'React' &&
181
+ node.superClass.property?.name === 'Component') ||
182
+ (node.superClass.type === 'Identifier' &&
183
+ node.superClass.name === 'Component')
184
+ );
185
+
186
+ if (hasReactExtends) {
187
+ context.report({
188
+ node,
189
+ messageId: 'classComponent',
190
+ suggest: [{
191
+ desc: 'Convert to functional component with hooks',
192
+ fix(fixer) {
193
+ return null; // Complex conversion
194
+ }
195
+ }]
196
+ });
197
+ }
198
+ }
199
+ };
200
+ }
201
+ },
202
+
203
+ /**
204
+ * Enforce import.meta.env usage instead of process.env in client code
205
+ */
206
+ 'prefer-import-meta-env': {
207
+ meta: {
208
+ type: 'problem',
209
+ docs: {
210
+ description: 'Enforce import.meta.env (Vite) instead of process.env in client code',
211
+ category: 'Best Practices',
212
+ recommended: true,
213
+ url: 'https://github.com/jmruthers/pace-core/blob/main/packages/core/docs/standards/7-api-tech-stack-standards.md'
214
+ },
215
+ messages: {
216
+ processEnvUsage: "Use 'import.meta.env' (Vite) instead of 'process.env' in client code. process.env is Node.js and won't work in browser."
217
+ },
218
+ hasSuggestions: true
219
+ },
220
+ create(context) {
221
+ const filename = context.getFilename();
222
+
223
+ // Exclude pace-core source files - these rules are for consuming apps
224
+ if (isPaceCoreSourceFile(filename)) {
225
+ return {};
226
+ }
227
+
228
+ // Only check client code (not server/Node.js files)
229
+ const isClientCode = filename.match(/\.(tsx|jsx|ts|js)$/) &&
230
+ !filename.includes('server') &&
231
+ !filename.includes('node') &&
232
+ !filename.includes('config') &&
233
+ !filename.match(/\.(config|server)\./);
234
+
235
+ if (!isClientCode) {
236
+ return {};
237
+ }
238
+
239
+ return {
240
+ MemberExpression(node) {
241
+ // Check for process.env usage
242
+ if (node.object?.type === 'Identifier' &&
243
+ node.object.name === 'process' &&
244
+ node.property?.type === 'Identifier' &&
245
+ node.property.name === 'env') {
246
+ context.report({
247
+ node,
248
+ messageId: 'processEnvUsage',
249
+ suggest: [{
250
+ desc: 'Replace with import.meta.env',
251
+ fix(fixer) {
252
+ // Replace process.env with import.meta.env
253
+ return fixer.replaceText(node, 'import.meta.env');
254
+ }
255
+ }]
256
+ });
257
+ }
258
+ }
259
+ };
260
+ }
261
+ }
262
+ }
263
+ };
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Testing Rules (Standard 8)
3
+ * @package @jmruthers/pace-core
4
+ * @module ESLintRules/rules/testing
5
+ *
6
+ * Enforces testing patterns from Standard 8:
7
+ * - Test file naming conventions (*.test.ts, *.test.tsx)
8
+ *
9
+ * Reference: packages/core/docs/standards/8-testing-documentation-standards.md
10
+ */
11
+
12
+ const path = require('path');
13
+ const fs = require('fs');
14
+ const { isPaceCoreSourceFile } = require('../utils/helpers.cjs');
15
+
16
+ module.exports = {
17
+ rules: {
18
+ /**
19
+ * Enforce test file naming: *.test.ts or *.test.tsx
20
+ */
21
+ 'test-file-naming': {
22
+ meta: {
23
+ type: 'suggestion',
24
+ docs: {
25
+ description: 'Enforce test file naming: *.test.ts or *.test.tsx (not *.spec.ts)',
26
+ category: 'Best Practices',
27
+ recommended: false,
28
+ url: 'https://github.com/jmruthers/pace-core/blob/main/packages/core/docs/standards/8-testing-documentation-standards.md'
29
+ },
30
+ messages: {
31
+ invalidTestFileName: "Test file '{{filename}}' should be named '{{expectedName}}.test.{{ext}}' instead of '{{currentName}}'"
32
+ },
33
+ hasSuggestions: true
34
+ },
35
+ create(context) {
36
+ const filename = context.getFilename();
37
+
38
+ // Exclude pace-core source files - these rules are for consuming apps
39
+ if (isPaceCoreSourceFile(filename)) {
40
+ return {};
41
+ }
42
+
43
+ // Only check test files
44
+ const isTestFile = filename.match(/\.(test|spec)\.(ts|tsx|js|jsx)$/);
45
+ if (!isTestFile) {
46
+ return {};
47
+ }
48
+
49
+ const basename = path.basename(filename);
50
+ const ext = path.extname(filename);
51
+ const nameWithoutExt = basename.replace(ext, '');
52
+
53
+ // Check if it uses .spec instead of .test
54
+ if (nameWithoutExt.endsWith('.spec')) {
55
+ const sourceName = nameWithoutExt.replace('.spec', '');
56
+ const expectedName = `${sourceName}.test${ext}`;
57
+
58
+ return {
59
+ Program(node) {
60
+ context.report({
61
+ node,
62
+ messageId: 'invalidTestFileName',
63
+ data: {
64
+ filename: basename,
65
+ expectedName,
66
+ currentName: basename
67
+ },
68
+ suggest: [{
69
+ desc: `Rename to ${expectedName}`,
70
+ fix(fixer) {
71
+ return null; // File rename requires filesystem operation
72
+ }
73
+ }]
74
+ });
75
+ }
76
+ };
77
+ }
78
+
79
+ // Check if test file is colocated with source file
80
+ // This is a suggestion, not an error
81
+ const sourceFile = filename.replace(/\.(test|spec)\.(ts|tsx|js|jsx)$/, '.$2');
82
+ const sourceExists = fs.existsSync(sourceFile);
83
+ const isInTestDir = filename.includes('/__tests__/') || filename.includes('/tests/');
84
+
85
+ if (!sourceExists && !isInTestDir) {
86
+ // Test file exists but source file doesn't - might be misnamed or in wrong location
87
+ // This is just informational, not an error
88
+ }
89
+
90
+ return {};
91
+ }
92
+ }
93
+ }
94
+ };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Shared helper functions for ESLint rules
3
+ * @package @jmruthers/pace-core
4
+ * @module ESLintRules/utils/helpers
5
+ */
6
+
7
+ // Helper function to get pace-core alternative for restricted imports
8
+ function getPaceCoreAlternative(importSource) {
9
+ const alternatives = {
10
+ '@radix-ui/react-avatar': '/components',
11
+ '@radix-ui/react-checkbox': '/components',
12
+ '@radix-ui/react-dialog': '/components',
13
+ '@radix-ui/react-label': '/components',
14
+ '@radix-ui/react-switch': '/components',
15
+ '@radix-ui/react-tabs': '/components',
16
+ '@radix-ui/react-toast': '/components',
17
+ '@radix-ui/react-tooltip': '/components',
18
+ 'react-day-picker': '/components',
19
+ '@tanstack/react-table': '/components',
20
+ 'react-hook-form': '/components',
21
+ 'zod': '/utils',
22
+ 'lucide-react': '/icons'
23
+ };
24
+
25
+ return alternatives[importSource] || '';
26
+ }
27
+
28
+ /**
29
+ * Check if a file is in the pace-core source directory
30
+ * @param {string} filename - The file path to check
31
+ * @returns {boolean} - True if the file is in packages/core/src
32
+ */
33
+ function isPaceCoreSourceFile(filename) {
34
+ // Check for both Unix and Windows path separators
35
+ return filename.includes('packages/core/src') || filename.includes('packages\\core\\src');
36
+ }
37
+
38
+ module.exports = {
39
+ getPaceCoreAlternative,
40
+ isPaceCoreSourceFile,
41
+ };
42
+
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Shared utility for loading core-usage-manifest.json
3
+ * @package @jmruthers/pace-core
4
+ * @module ESLintRules/utils/manifest-loader
5
+ */
6
+
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+
10
+ // Load manifest data
11
+ let manifestData = null;
12
+ try {
13
+ const manifestPath = path.join(__dirname, '../../../core-usage-manifest.json');
14
+ if (fs.existsSync(manifestPath)) {
15
+ manifestData = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
16
+ }
17
+ } catch (error) {
18
+ // If manifest can't be loaded, rules will use hardcoded defaults
19
+ console.warn('Warning: Could not load core-usage-manifest.json, using defaults');
20
+ }
21
+
22
+ // Get restricted imports from manifest or use defaults
23
+ const getRestrictedImports = () => {
24
+ if (manifestData && manifestData.restrictedImports) {
25
+ return manifestData.restrictedImports;
26
+ }
27
+ // Fallback defaults
28
+ return [
29
+ { module: '@radix-ui/react-avatar', reason: 'Use Avatar component from pace-core instead' },
30
+ { module: '@radix-ui/react-checkbox', reason: 'Use Checkbox component from pace-core instead' },
31
+ { module: '@radix-ui/react-dialog', reason: 'Use Dialog component from pace-core instead' },
32
+ { module: '@radix-ui/react-label', reason: 'Use Label component from pace-core instead' },
33
+ { module: '@radix-ui/react-slot', reason: 'Use Button component from pace-core which handles slot composition' },
34
+ { module: '@radix-ui/react-switch', reason: 'Use Switch component from pace-core instead' },
35
+ { module: '@radix-ui/react-tabs', reason: 'Use Tabs component from pace-core instead' },
36
+ { module: '@radix-ui/react-toast', reason: 'Use Toast component and useToast hook from pace-core instead' },
37
+ { module: '@radix-ui/react-tooltip', reason: 'Use Tooltip component from pace-core instead' },
38
+ { module: 'react-day-picker', reason: 'Use Calendar component from pace-core instead' },
39
+ { module: '@tanstack/react-table', reason: 'Use DataTable component and related hooks from pace-core instead. DataTable wraps and standardizes table functionality' },
40
+ { module: 'react-hook-form', reason: 'Use Form component and useZodForm hook from pace-core instead' },
41
+ { module: 'zod', reason: 'Use validation utilities and schemas from pace-core instead. pace-core provides standardized validation helpers' }
42
+ ];
43
+ };
44
+
45
+ // Get pace-core components from manifest or use defaults
46
+ const getPaceCoreComponents = () => {
47
+ if (manifestData && manifestData.components) {
48
+ return manifestData.components;
49
+ }
50
+ return ['Button', 'Card', 'Dialog', 'Input', 'Form', 'Select', 'Alert', 'Badge', 'Checkbox', 'Switch', 'Textarea', 'Label', 'Table', 'DataTable', 'Toast', 'Tooltip', 'Tabs', 'Calendar', 'Avatar', 'Progress'];
51
+ };
52
+
53
+ // Get pace-core hooks from manifest or use defaults
54
+ const getPaceCoreHooks = () => {
55
+ if (manifestData && manifestData.hooks) {
56
+ return manifestData.hooks;
57
+ }
58
+ return ['useToast', 'useDebounce', 'useUnifiedAuth', 'useEvents', 'useOrganisations', 'useFileReference', 'useStorage', 'useZodForm', 'useRBAC', 'usePermissions'];
59
+ };
60
+
61
+ // Get pace-core utils from manifest or use defaults
62
+ const getPaceCoreUtils = () => {
63
+ if (manifestData && manifestData.utils) {
64
+ return manifestData.utils;
65
+ }
66
+ return ['formatDate', 'formatCurrency', 'formatNumber', 'formatTime', 'formatDateTime', 'cn', 'validateUserInput', 'sanitizeUserInput', 'hasPermission', 'getAppConfig'];
67
+ };
68
+
69
+ module.exports = {
70
+ getRestrictedImports,
71
+ getPaceCoreComponents,
72
+ getPaceCoreHooks,
73
+ getPaceCoreUtils,
74
+ };
75
+
package/dist/hooks.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  export { u as useToast } from './useToast-AyaT-x7p.js';
2
- import { S as StorageUploadOptions, a as StorageUploadResult, b as StorageListOptions, c as StorageListResult, d as StorageFileInfo } from './usePublicRouteParams-ClnV4tnv.js';
3
- export { O as OrganisationSecurityHook, l as UseAppConfigReturn, i as UseFormDialogOptions, j as UseFormDialogReturn, U as UseOrganisationPermissionsReturn, F as UsePublicEventLogoOptions, E as UsePublicEventLogoReturn, B as UsePublicEventOptions, A as UsePublicEventReturn, D as UsePublicFileDisplayOptions, C as UsePublicFileDisplayReturn, G as UsePublicRouteParamsReturn, n as clearPublicEventCache, q as clearPublicFileDisplayCache, t as clearPublicLogoCache, z as extractEventCodeFromPath, y as generatePublicRoutePath, o as getPublicEventCacheStats, r as getPublicFileDisplayCacheStats, v as getPublicLogoCacheStats, k as useAppConfig, u as useEventTheme, h as useFormDialog, e as useOrganisationPermissions, f as useOrganisationSecurity, m as usePublicEvent, x as usePublicEventCode, s as usePublicEventLogo, p as usePublicFileDisplay, w as usePublicRouteParams, g as useZodForm } from './usePublicRouteParams-ClnV4tnv.js';
2
+ import { S as StorageUploadOptions, a as StorageUploadResult, b as StorageListOptions, c as StorageListResult, d as StorageFileInfo } from './usePublicRouteParams-MamNgwqe.js';
3
+ export { O as OrganisationSecurityHook, l as UseAppConfigReturn, i as UseFormDialogOptions, j as UseFormDialogReturn, U as UseOrganisationPermissionsReturn, F as UsePublicEventLogoOptions, E as UsePublicEventLogoReturn, B as UsePublicEventOptions, A as UsePublicEventReturn, D as UsePublicFileDisplayOptions, C as UsePublicFileDisplayReturn, G as UsePublicRouteParamsReturn, n as clearPublicEventCache, q as clearPublicFileDisplayCache, t as clearPublicLogoCache, z as extractEventCodeFromPath, y as generatePublicRoutePath, o as getPublicEventCacheStats, r as getPublicFileDisplayCacheStats, v as getPublicLogoCacheStats, k as useAppConfig, u as useEventTheme, h as useFormDialog, e as useOrganisationPermissions, f as useOrganisationSecurity, m as usePublicEvent, x as usePublicEventCode, s as usePublicEventLogo, p as usePublicFileDisplay, w as usePublicRouteParams, g as useZodForm } from './usePublicRouteParams-MamNgwqe.js';
4
4
  import * as React$1 from 'react';
5
5
  import { SortingState, ColumnFiltersState, ExpandedState } from '@tanstack/react-table';
6
- import { d as DataRecord, g as PerformanceConfig, S as ServerSideConfig, C as ChunkingConfig, i as SearchIndexConfig, h as PaginationMode, k as ServerSideParams, l as ServerSideResponse, A as AutocompleteOptions, m as GooglePlaceAutocompletePrediction, P as ParsedAddress } from './types-CkbwOr4Y.js';
6
+ import { d as DataRecord, g as PerformanceConfig, S as ServerSideConfig, C as ChunkingConfig, i as SearchIndexConfig, h as PaginationMode, k as ServerSideParams, l as ServerSideResponse, A as AutocompleteOptions, m as GooglePlaceAutocompletePrediction, P as ParsedAddress } from './types-DXstZpNI.js';
7
7
  export { u as useComponentPerformance } from './useComponentPerformance-DE9l5RkL.js';
8
8
  import { SupabaseClient } from '@supabase/supabase-js';
9
- import { D as Database } from './database.generated-CzIvgcPu.js';
9
+ import { D as Database } from './database.generated-CcnC_DRc.js';
10
10
  import { F as FileCategory, a as FileReference } from './file-reference-BavO2eQj.js';
11
11
  import 'react-hook-form';
12
12
  import 'zod';
@@ -455,8 +455,8 @@ declare const queryCacheHelpers: {
455
455
  * FileCategory.EVENT_LOGOS
456
456
  * );
457
457
  *
458
- * if (isLoading) return <div>Loading...</div>;
459
- * if (error) return <div>Error: {error.message}</div>;
458
+ * if (isLoading) return <p>Loading...</p>;
459
+ * if (error) return <p>Error: {error.message}</p>;
460
460
  *
461
461
  * return fileUrl ? <img src={fileUrl} alt="File" /> : null;
462
462
  * }